Bir karmaşıklık sıçramasını nasıl yönetiyorsunuz?


13

Bazen bir proje üzerinde çalışıyorsunuz ve aniden bir şey beklenmedik bir şekilde ortaya çıkıyor, işlerde büyük bir anahtar atıyor ve karmaşıklığı bir hayli artırıyor.

Örneğin, diğer çeşitli makinelerde SOAP servisleriyle konuşan bir uygulama üzerinde çalışıyordum. İyi çalışan bir prototip çırptım, sonra düzenli bir ön uç geliştirmeye devam ettim ve genellikle her şeyi güzel ve oldukça basit ve takip etmesi kolay bir şekilde çalıştırıyorum. Daha geniş bir ağda test etmeye başlayana ve aniden sayfaların bağlantıların gecikmesi ve uzak makinelerde hesaplamalar yapmak için gereken süre sabun hizmetlerine zaman aşımına uğramasıyla sonuçlanan zaman aşımına uğrayana kadar harika çalıştı. İstekleri kendi iş parçacıklarına döndürmek ve döndürülen verileri önbelleğe almak için mimariyi değiştirmemiz gerektiği ortaya çıktı.

Bu senaryonun detayları çok önemli değil - aslında oldukça öngörülebilir olduğu için harika bir örnek değil ve bu tür bir ortam için bu tür birçok uygulama yazan insanlar bunu tahmin etmiş olabilir - ancak kişi basit bir öncül ve model ile başlayabilir ve birdenbire projenin gelişimine karmaşıklığın artmasına neden olabilir.

İhtiyaçları ortaya çıkan - genellikle spesifikasyon değişikliğinden ziyade çevresel faktörlerin bir sonucu olarak - daha sonra geliştirme sürecinde veya test sonucunda ortaya çıkan bu tür fonksiyonel değişikliklerle başa çıkmak için hangi stratejileriniz var? Nasıl / prematüre optimizasyon / YAGNI kaçınarak çözüm tasarlarken risklerini overengineering arasında denge yok olması mümkün ancak mutlaka değil karşı azaltır muhtemel etkili olarak olması muhtemeldir fakat için değil anonim hazırlık yapar daha basit ve daha kolay çözüm geliştirirken aksine sorunlar olası her ihtimal?

Düzenleme: Crazy Eddie'nin cevabı "emmek ve yeni karmaşıklığı uygulamak için en ucuz yolu bulmak" içerir. Bu bana soruda örtük olan bir şey hakkında düşündürdü ama ben özel olarak dile getirmedim.

Bir kez o çarpma vurmak ve gerekli değişiklikleri dahil. Projeyi planlamaya olabildiğince yakın tutacak ancak sürdürülebilirliği etkileyebilecek bir şey mi yapıyorsunuz yoksa mimarinize geri dönüyor ve daha sürdürülebilir olabilecek ancak geliştirme sırasında her şeyi geri itecek daha ayrıntılı bir düzeyde mi yeniden çalışıyorsunuz?

Yanıtlar:


8

Bunu okurken aklıma gelen çevik atasözü: ilk önce proje yaşam döngüsü içinde en riskli ve / veya en az anlaşılmış görevleri yerine getirmek . Kavramın işe yaradığını kanıtlamak için projenin çalışan bir iskeletini mümkün olduğunca erken bir araya getirmeye çalışıyorum. Bu da mimarinin gerçek yaşam koşullarında gerçekten vaadini yerine getirip getirmediğini tespit etmek için herhangi bir zalim test yapmasını sağlar. Ayrıca, çözüme dahil edilen yeni, bilinmeyen bir teknoloji / platform / araç varsa, bunu plaka üzerinde de erken alın.

Çekirdek mimari uygunsa, bireysel işlevler kademeli olarak eklenebilir ve test edilebilir ve gerektiğinde nispeten daha az maliyetle yeniden düzenlenebilir. Mimariyi değiştirmeye ihtiyaç duyulması, kişinin başa çıkması gereken büyük risktir. Bu hızlı geri bildirim sağlar: en kötü durumda, eğer tüm kavram parçalanırsa, bunu erken biliyoruz ve projeyi en az kayıpla iptal edebiliriz.


6

Örneğiniz , daha yaygın olarak kullanılan ve programcıları daha da zorlaştıran programlamanın en zorlayıcı yönlerine, yani dağıtılmış bilgi işlem ve eşzamanlı programlamaya dokundu .

"Normal" programlama (bir makinede tek iplik) bile, herhangi bir trvial olmayan program için o kadar karmaşıktır ki, herhangi bir iyi olmak için büyük beceri ve yıllarca deneyim gerektirir - ancak yine de "çözüldü". Bu düzeyde bile, çoğunlukla kombinatoryal patlama nedeniyle , insan beyninin tamamen kavrama ve anlama kapasitesini çok aşmaktadır. Aksini düşünmek aptalca.

Dağıtılmış bilgi işlem ve eşzamanlı programlama, "normal" programlamaya kıyasla en azından kübik (sp?) (N ^ 3) boyutta büyüyen "karmaşıklık" alanının boyutuna iki boyut daha ekler. Örneğin, başa çıkmamız gereken bazı yeni sorunlar ve yanlışlıklar üzerine düşünün . Bir fikirle bile oynamak için, bu ölçekte yan bağları ve yan etkileri kavrayabileceğiniz gülünçtür.

Açıkçası gümüş mermilerim yok, ama birinin yapabileceği en büyük hatanın hepsini anladığınızı ve çözdüğünüzü düşünmekten oldukça eminim .

Diğer yanıtların daha önce neler kapsadığına ek olarak, bununla nasıl başa çıkılacağı hakkında bazı fikirler:

  • Mükemmel tevazu
  • Sisteminizin / programınızın eksik, kalıcı ve eksik olduğunu kabul edin .
  • Hatalara hazırlanın
  • Değişikliği benimse
  • Fazlalık planı
  • Gelecekteki provaları düşünün
  • Karmaşık sistemlerin nasıl davrandığı biyolojisine veya sosyolojisine bakın (veya çalışın)
  • Değişken durumdan kaçınmak için elinizden gelenin en iyisini yapın. Durum bilgisi olmayan protokolleri tercih edin (REST ve HTTP gibi).
  • Fonksiyonel programlama ağrıyı hafifletebilir

Sanırım devam edebilirim. Çok ilginç bir konu :)


Biyoloji veya sosyolojiye karmaşık sistemlerin nasıl davrandığına bakın (veya çalışın) - Hadi. Cevabınızın geri kalanı sağlamdı, ancak bunun açıklanan sorun için böyle bir çevresel uygulaması var.
Jim G.10

1
@Jim G. Belki. Biyoloji, döngülerinizi optimize etmeye yardımcı olmaz, ancak yeni perspektifler, içgörüler veya etkili soyutlamalar (yazılım geliştirmede) bulmak istiyorsanız, kişinin sanal alanından çıkmanıza yardımcı olur. Biyolojinin (veya sosyolojinin) programlama ile hiçbir ilgisi olmadığını savunmak, OOP veya tasarım modellerinin programlama ile ilgisi olmadığını tartışmaktan sadece birkaç adım uzaktadır . Örneğin: OOP : biyoloji -> Alan Kay -> OOP / Smalltalk. Veya Tasarım Desenleri : sosyoloji -> kentsel tasarım -> Christopher Alexander -> Bir Desen Dili -> Tasarım Desenleri.
Maglob

@Jim G. Cont. Bazı alıntılar Alan Kay: "Nesnelerin bir ağdaki biyolojik hücreler ve / veya bireysel bilgisayarlar gibi olduğunu düşündüm, sadece mesajlarla iletişim kurabiliyordum" ve Wikipedia: "[Tasarım Deseni] Fikir mimar Christopher Alexander tarafından tanıtıldı mimarlık alanı [1] ve bilgisayar bilimi de dahil olmak üzere çeşitli diğer disiplinler için uyarlanmıştır "
Maglob

Peki. Değişken durumdan ve diğer külçelerden kaçınmak için elinizden gelenin en iyisini yapın . Demek istediğim, menajeriniz karmaşıklığı azaltmakla görevlendirilirse, kesinlikle Occam'ın tıraş makinesini probleme uygular ve işe başlarsınız. Sizin ya da bir başkasının acil sorunla ilgili yardım için "biyolojiye bakacağınızı" sanmıyorum.
Jim G.

2

@ Péter Török'ün cevabının ruhuna katılmıyorum, çünkü bir takımın (veya bireyin) proje yaşam döngüsünün başlarında en riskli öğeleri mutlaka öngörebileceğini varsayıyor. Örneğin, OP'ın durumda, takım olamazdı sırtlarını duvara karşı olana kadar çok dişli çözüme bağlı tırmanan karmaşıklığı öngörülüyor.

OP'nin sorusu iyi bir sorudur ve birçok yazılım geliştirme mağazasının sahip olduğu bir soruna işaret eder.

Sorunla nasıl başa çıkacağım:

  1. Fred Brooks'un tavsiyelerine uyun ve geliştiricilerinizi bir ameliyat ekibi gibi düzenleyin .
  2. Her ikisini de yapabilen bilge ve "hayırsever" bir usta cerrah seçin: A) Akranlarının güvenini ve saygısını toplayın; ve B) Zor kararları zamanında almak.
  3. Usta cerrahın geliştirme sürecinin ön ucunda ve arka ucunda karmaşıklığı azaltmasını bekleyin.

3. noktadan daha fazlası:

  1. Usta cerrah işe yarayacak en basit çözümü önermek için bilinçli bir çaba göstermelidir. Yıllarca süren anlamlı deneyim, usta cerrahı böyle bir konuma getirmelidir.
  2. Daha büyük organizasyon, yani usta cerrahın amirleri, ekibe gemi tarihinden sonra karmaşıklığı azaltmak için yeterli zaman ve kaynak sağlamalıdır. Bu, geliştirme ekibinin hem kodu zamanında göndermesine hem de karmaşıklığı sürekli olarak azaltmak için kaizen gerçekleştirmesine izin verecektir .

OP'nin durumunda IMHO, mimarilerinin gerçek yaşam koşullarında nasıl çalıştığını (ve olup olmadığını) ortaya çıkarmak için daha önce test etmeye başlamış olmalılardı. Btw bir "ana cerrahı" olması önererek, temelde var olduğunu ima görünmektedir olan Doğru bulmadığınız iddia tam noktayı - projenin teknik riskleri öngörmek olabilir insanlar.
Péter Török

@ Péter Török: ... Bir "usta cerrah" olmasını önererek, temelde projenin teknik risklerini öngörebilen insanlar olduğunu ima ediyorsunuz : Hayır, değilim. Bu insanların ikisinin de olduğunu söylüyorum: A) İlk etapta karmaşıklıktan tamamen kaçınmak için en uygun olanı; ve B) Kod gönderildikten sonra bir takımı karmaşıklıktan çıkarmaya en uygun olanı.
Jim G.

IMHO aynı şeyden bahsediyoruz. “Usta cerrahınıza” muhtemelen işe yarayabilecek en basit çözümü seçmesine yardımcı olan deneyim, geçmiş proje ve çözümlerin anılarından ve hangi çözümün hangi durumda işe yarayıp yaramadığını (ya da yapmadığını) bilmektir. Başka bir deyişle, belirli bir sorun için uygulanabilir çözümleri inceler ve her birinin potansiyel faydalarını ve risklerini değerlendirir . Mevcut durum için doğru olanı seçmesine yardımcı olan, böylece daha riskli yollardan kaçınan şey budur .
Péter Török

1
Bu bana geç, harika, at eğitmeni Ray Hunt'tan bir alıntı hatırlatıyor: "Nasıl iyi bir yargıya varırsın? Deneyim. Nasıl deneyim kazanırsın? Kötü yargı."
glenatron

1

Arayüzlere kodlama

Diğer işlevlerle arabirim oluşturan yeni işlevler yazarken, içinden geçtiği bir arabirim (Java türü) şeklinde bir sınır oluşturun. Bu irade

  1. hangi işlevlerin kullanıldığını tam olarak kontrol ettiğinizden emin olun
  2. aynı işlevselliğe sahip birden çok uygulamaya sahip olmanıza olanak tanır.
  3. modülleri tamamen birbirine bağlamak yerine sadece ince bir şekilde bağlı olduğu için genel karmaşıklığı düşük tutun.

0

basit bir öncül ve model ile başlayabilir ve birdenbire projenin gelişimine karmaşıklığın yükselmesi

Şaşırtıcı değil.

Bu yazılım geliştirmedir. Yeni bir şey icat etmiyorsanız, mevcut, kanıtlanmış bir çözümü indiriyorsunuz.

Çok az orta yol var.

Yeni bir şey icat ediyorsanız, tam olarak anlamadığınız en az bir özellik olması gerekir. (Bunu tam olarak anlamak için, sadece kullanacağınız çalışan bir uygulamaya sahip olmanız gerekir.)

Bu nasıl yönetilir?

  1. Gerçekçi beklentilere sahip olun. Yeni bir şey icat ediyorsun. Orada gerekir anlamadığınız kısımlar olmak.

  2. Gerçekçi beklentilere sahip olun. İlk seferde doğru çalışıyor gibi görünüyorsa, bir şeyi göz ardı ettiniz.

  3. Gerçekçi beklentilere sahip olun. Basit olsaydı, ilk önce başka biri yapardı ve bu çözümü indirebilirsiniz.

  4. Gerçekçi beklentilere sahip olun. Geleceği çok iyi tahmin edemezsiniz.


2
Bekle, diyorsun ki: Gerçekçi beklentilerin mi var?
glenatron

0

Eskimeyi göz önünde bulundurarak tasarım ve kodlama. Bugün kodladığınız şeyin yarın kesilmesi ve değiştirilmesi gerektiğini varsayalım.


0

Ortam şartnamenin bir parçası olmalıdır. Dolayısıyla, çevrede yapılan bir değişiklik, şartnamedeki bir değişikliktir. Öte yandan, prototipinizi ve tasarımınızı teknik özelliklerin dışında bir ortama dayandırdıysanız, aptalca bir hata yaptınız. Her iki durumda da, emer ve yeni karmaşıklığı uygulamak için en ucuz yolu bulursunuz.


0

Çoğu programlama probleminde olduğu gibi , bence de değişir . Bu sorun yaratıcı çalışmaya çok özgüdür, başarısızlıkların olacağını unutmamalısınız ve sorun değil . Programlama kötü bir sorundur ve genellikle sorunu çözene kadar sorunun doğru çözümünü bilmezsiniz.

Bununla birlikte, burada devreye girebilecek bir dizi yerel, spesifik faktör vardır, örneğin:

  • Bu sistemin hedefleri. Tek seferlik bir şey mi? Bu sistemi orta ve uzun vadede çalışır halde tutmak istiyor musunuz?

Kısa vadeli şeyler için, sadece çalışmasını sağlamak için fazlasıyla düşünmeye değmeyebilir. Yeniden düzenleme pahalıdır ve kullanıcı için anında son değer yaratmayan bir şeydir. ancak, tasarımınızı geliştirmeye değmeyecek kadar kısa vadede mutlak fırlatma yazılımı dışında düşünemediğim hemen hemen hiçbir durum yok. Yaptıklarınızı anlayabilmek ve hızlı bir şekilde düzeltmek, şu anda bitirmek yerine çok daha önemlidir. Eğer daha uzun vadede, o zaman muhtemelen (ve muhtemelen dahil olan herkesin düşündüğünden çok daha erken) ya da tersi (bunu yapmamak, "düzeltmek zorunda olduğumuz zaman" yerine çok yakında acıya neden olacaktır). "Her zaman daha iyisini yapmak için zaman ayırın" demeye cazip geliyorum, ancak bunun mümkün olmadığı bazı durumlar var.

  • Takımın hedefleri. Daha çok "şimdi, her ne pahasına olursa olsun" veya "hadi doğru yapalım" türünden bir şey mi?

Bu, kararlarınızı büyük ölçüde etkilemelidir. Ekibiniz bu kararı ya size yeniden tasarlamanız için kaynaklar vererek destekleyecektir ya da şimdi hızlı çözümün yapılmasını talep edecektir. Bence, takımın sizi sürekli olarak yanlış yöne ittiğini görürseniz, bu büyük bir kırmızı bayrak. Bu tür şeylerin sürekli yangın söndürme yapılan bir senaryoda bittiğini gördüm, yeniden tasarlamaya asla zaman kalmadı çünkü kötü tasarımınızın yarattığı sorunları her zaman düzeltiyorsunuz. Yine de bir orta yol da olabilir: şimdi "koli bandı", ASAP'yi düzeltin (ama aslında yapın).

  • Sorunu anlamanız. Önceki çözüm neden çalışmadı?

Gerçekten önemli. Hatanın veya sorunun ne olduğunu ve neden olduğunu düşünün. Bu tür bir durum, hatalı (veya eksik) varsayımlar, kısıtlamalar ve etkileşimler bulmak için harika bir fırsattır. Genel olarak, mevcut sorunu çözmek yerine her zaman probleminizi daha iyi anlamayı tercih edin. Bu muhtemelen YAGNI / aşırı mühendisliğe karşı en büyük savunmanızdır. Eğer yeterince iyi Sorununuzu anlıyorum, o zaman çözecek bunu başka sorunlar değil.

Son olarak, işleri doğru şekilde oluşturmaya çalışın . Sorun hakkında ya da insan kaynaklı hatanız hakkında daha fazla bilgi sahibi olduğunuzda karşılaştığınız hatalar ve problemlerden bahsetmiyorum. "Hata yapma ve ilk seferde mükemmel hale getirme" demek istemiyorum - bu imkansız. Yani, günlük işlerinizde karmaşıklığı iyi yönetmeyi deneyin, kırık pencereleri düzeltin, olabildiğince basit tutun, kodunuzu ve düşüncelerinizi her zaman geliştirin. Bu arada bu zaman (değilse) kapıda değişim çarpmalara, açık kollar yerine bir av tüfeği ile ağırlayabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.