Yazılım projelerinde kazara karmaşıklık nasıl yönetilir?


74

Murray Gell-Mann, Richard Feynman'ın bu kadar zor problemi nasıl çözebildiğini sorduğunda, Gell-Mann, Feynman'ın bir algoritmasına sahip olduğunu söyledi:

  1. Sorunu yaz.
  2. Çok zor düşün.
  3. Çözümü yazın.

Gell-Mann, Feynman'ın farklı bir problem çözücü olduğunu açıklamaya çalışıyordu ve metotlarını inceleyerek elde edilebilecek bir fikir yoktu. Orta / büyük yazılım projelerinde karmaşıklığı yönetmek konusunda aynı şekilde hissediyorum. İyi olan insanlar bu konuda kendi içlerinde iyidirler ve bir şekilde, herhangi bir yabancı kabarıklık yaratmadan her şeyi yönetilebilir hale getirmek için çeşitli soyutlamaları katmanlamayı ve istiflemeyi başarırlar.

Öyleyse, Feynman algoritması, kazara karmaşıklığı yönetmenin tek yolu mu, yoksa yazılım mühendislerinin kazayla karmaşıklığı gidermek için tutarlı bir şekilde uygulayabilecekleri gerçek yöntemler var mı?


32
Sorunu yazma eylemi (ve bunu başkalarına yeterince açıklayabilmeniz için canlandırmak) bir çözümü belirlemenize yardımcı olsaydı şaşırmam.
Rory Hunter,

@RoryHunter - Kabul etti. Sorunu yazmanın ve birisiyle paylaşmanın bir kısmı, henüz bir çözümünüz olmadığını kabul ettiğiniz anlamına gelir.
JeffO

38
@RoryHunter: Bu. Neredeyse haftalık olarak, çözemediğim bir sorunla karşılaşıyorum, bunu açıklamak için birisine bir e-posta yazdım. Sonra neyi düşünmediğimin farkına varın, sorunu çözün ve e-postayı silin. Ayrıca bu sitede hiç gönderilmemiş bir düzine soru hakkında yazdım.
pdr

Öğrendiğim en temel şey, bir geliştiriciden tam olarak erişemeyeceği bir problemi ele almasını istememek. Bu problemler heyecan verici olsa da, bilinmeyen yerlere uzanan geliştiriciyi de içerir ve bu da çoğu zaman "anında" büyümeye yol açar. Spiral geliştirme gibi bazı araçlar, nihai bir çözüme ulaşmadan önce küçük bir izlenebilir problemde geliştirme ekiplerini topraklamak için iyidir
Cort Ammon

2
@CortAmmon Kasten değil ama bu oldukça aptalca bir fikir gibi geliyor. Geliştiricilerin bildiklerinin% 99'u “anında büyümeniz” denilen bir noktada öğrenildi. İyi bir programcı yapmak için iyi bir problem çözücü gerekir. Sorunları çözmek doğal olarak kendimize çizdiğimiz bir şey. Geliştiricileriniz büyümiyorsa, muhtemelen çok sıkıcı tekrarlayan işler yapıyorlar. Makul yetenekli geliştiricileri mutsuz ve moralsiz kılacak iş türü. Ve ... 'Spiral Gelişim', temel yinelemeli gelişme kavramını şelale kilometre taşları ile yeniden birleştirmekten başka bir şey değildir.
Evan Plaice

Yanıtlar:


104

İyi bir hamle gördüğünüzde daha iyisini bekleyin.
—Emanuel Lasker, 27 yıllık dünya satranç şampiyonu

Tecrübelerime göre, kazara karmaşıklığın en büyük itici gücü, programcıların işe yaraması nedeniyle ilk taslaklara bağlı kalmalarıdır. Bu, İngilizce kompozisyon derslerimizden öğrenebileceğimiz bir şey. Öğretmen geri bildirimlerini içerecek şekilde, ödevlerinde birkaç taslaktan geçecekleri zaman içinde inşa ederler. Programlama sınıfları, nedense, yapmazlar.

Suboptimal kodu tanımak, ifade etmek ve düzeltmek için somut ve nesnel yollarla dolu kitaplar var: Temiz Kod , Eski Kod ile Etkili Çalışma ve diğerleri. Birçok programcı bu teknikleri bilir, ancak bunları uygulamak için her zaman zaman ayırmayın. Kazara karmaşıklığı azaltma konusunda mükemmel yetenekleri var, denemek için bir alışkanlık haline getirmediler .

Sorunun bir kısmı, akran incelemesinden erken bir aşamada geçmediği sürece, başkalarının kurallarının ara karmaşıklığını genellikle görmüyoruz. Temiz kod, aslında birkaç taslak içerdiği zaman yazılması kolay gibi görünüyor. Önce aklınıza gelen en iyi yolu yazarsınız, ortaya çıkardığı gereksiz karmaşıklıkları fark eder, daha sonra "daha iyi bir hamle arayın" ve bu karmaşıklıkları gidermek için yeniden düşünürsünüz. Sonra bir tane bulamadığınıza kadar "daha iyi bir hamle aramaya" devam edersiniz.

Ancak, tüm bu çalkantılardan sonra kodu gözden geçirmek için koymuyorsunuz, bu yüzden dışarıdan görünüşe göre Feynman benzeri bir süreç olmuş gibi görünüyor. Her şeyi böyle yapamayacağınızı düşünme eğilimindesiniz, bu yüzden denemeyi zahmet etmiyorsunuz, ama gerçek şu ki okuduğunuz güzel basit kodun yazarı, genellikle hepsini bir yığın halinde yazamıyor. Bunun gibi, ya da yapabiliyorsa, bunun nedeni, yalnızca daha önce birçok kez benzer kod yazmayı deneyimlemiş olmaları ve şimdi ara aşamalar olmadan deseni görebilmeleri. Her iki durumda da, taslaklardan kaçınamazsınız.


1
Ahh, ama ilk denemede bu soruya temiz bir cevap yazabildin. (Ve bu konuda cogent cogent). Belki de sadece kılık değiştirmiş Feynman'sınız.
kmote

1
tl; dr; refactor, korkma.
ocodo

1
Kusurları kucaklamak için +1. Dostum, bu herkesin hakkında konuştuğu bir şey , ama çok az insan var. Beynimi, kendimi bir makine öğrenme algoritması gibi, hataların gerçekten iyi olduğu ve nasıl geliştirileceği gibi öğrettiği gibi yeniden düşünmeye çalışıyorum . "Taslaklar" metaforunuzla ifade etmenin güzel yolu.
Juan Carlos Coto

46

"Yazılım mimarisi becerileri öğretilemez" yaygın bir yanılgıdır.

Neden birçok insanın buna inandığını anlamak kolaydır (bu konuda iyi olanlar mistik olarak özel olduklarına inanmak ister ve inanmak istemeyenler onların olmadıkları onların suçu olmadıklarına inanmak isterler.) yine de yanlıştır; Beceri, diğer yazılım becerilerinden biraz daha fazla pratik yoğundur (örn. döngüleri anlama, işaretçilerle ilgilenme vb.)

Büyük sistemler inşa etmenin tekrarlanan uygulamalara ve deneyimden ders almanın büyük bir müzisyen ya da kamu konuşmacısı olmakla aynı şekilde öğrenmeye yatkın olduğuna inanıyorum: asgari miktarda bir yetenek bir önkoşuldur, ancak bunun dışlayıcı olan asgari derecede büyük bir asli değil çoğu uygulayıcıya ulaşma.

Karmaşıklıkla başa çıkmak, çoğunlukla birkaç kez deneyerek ve başararak edindiğiniz bir beceridir. Sadece toplumun geniş bir alanda programlama için keşfettiği birçok genel rehberin (katmanları kullanın, çoğaldığı yerde çoğaltma ile mücadele edin, dini inançlı bir şekilde 0/1 / sonsuzluğa uyun…) onlar gerçekten büyük bir şeyi programlayana kadar acemi. Sadece aylar sonra sorunlara neden olan çoğaltma ile ısırılmadan, bu ilkelerin önemini 'alamıyorsunuz'.


11
Son cümleni gerçekten beğendim. Olumluyum İlk işimde çok şey öğrendim çünkü hatalarımın beni yakalayabileceği kadar uzun süredir oradaydım. Bu değerli bir deneyim.
MetaFight

26
“İyi karar deneyimden gelir. Deneyim kötü karardan gelir.” --Mulla Nasrudin
Jonas Kölker

9
Yazılım mimarisini öğretememenin bir yanlışlık olduğunu nasıl iddia edebileceğinizi anlamıyorum, ancak tekrarlanan uygulamaların, deneyimlerden öğrenmenin ve hata yapmanın (doğuştan gelen yeteneklerle birleştiğinde) bunu öğrenmenin tek yolu olduğunu söylemeye devam edin . Öğretilebilecek bir şey tanımım, almak için yoğun olarak pratik yapmak zorunda olmadığınız, ancak izleyerek, dinleyerek ve okuyarak öğrenebileceğiniz bir şey. Geri kalan her şeyle çelişkili olduğu için ilk satır dışında bu cevaptaki her şeye katılıyorum.
Thomas Owens

4
Mesele şu ki, birçok insan, kesinlikle, hiçbir koşulda iyi mimarlar olmayı öğrenemez (bir konferans odasında veya sektörde olsun), çünkü “ne alacaksa” alamazlar. Yaygın olarak kabul ediyorum ama yanlış.
Kilian Foth

5
@ Tomolar: Genel konuşma benzetmesine geri dönüyoruz. Kaç kitap okuduğunuz, konuyu incelemek için kaç saat harcadığınız ya da kaç öğretmenin size halka açık konuşmada iyi olmak için öğretmeye çalıştığı önemli değil, tekrarlanan alıştırmalar, deneyimden öğrenme yoluyla yapmazsanız, bu konuda iyi edemezsiniz. ve hata yapmak. Beni asla birisinin beceriyi sadece izleyerek, dinleyerek ve okuyarak öğrenebileceğine ikna edemezsiniz. Aynı yazılım mimarisi de dahil olmak üzere çoğu beceri için de geçerlidir. Aslında sadece izleyerek, dinleyerek ve okuyarak öğrenebileceğiniz herhangi bir maddenin yeteneğini düşünemiyorum.
Dunk

22

Andy Hunt'ın pragmatik düşüncesi bu konuyu ele alıyor. Dreyfus modeline atıfta bulunur, buna göre çeşitli becerilerde 5 yeterlilik aşaması vardır. Acemiler (aşama 1) bir şeyi doğru şekilde yapabilmek için kesin talimatlara ihtiyaç duyarlar. Uzmanlar (5. aşama) aksine, belirli bir soruna genel kalıpları uygulayabilir. Kitabı alıntı yaparak,

Uzmanların eylemlerini iyi bir detay düzeyinde açıklamaları genellikle zordur; Cevaplarının birçoğu o kadar iyi uygulanmaktadır ki, bilinçaltı eylemler haline gelirler. Onların engin deneyimleri beynin sözsüz, bilinçdışı bölgeleri tarafından keşfedilir, bu da gözlemlememizi ve eklemlenmelerini zorlaştırır.

Uzmanlar kendi işlerini yaptığında, geri kalanımız için neredeyse büyülü gözüküyor - garip gelişmeler, hiçbir yerden çıkmamış gibi görünen içgörüler ve geri kalanımız o kadar da emin olmadıkça, doğru cevabı bilme gibi görünüşte esrarengiz bir yetenek soru hakkında. Elbette sihir değil, fakat uzmanların dünyayı algılama şekli, problemin nasıl çözüldüğü, kullandıkları zihinsel modeller ve diğerleri, uzman olmayanlardan çok farklı.

Bu genel görme kuralı (ve sonuç olarak bunlardan kaçınılması) özel olarak yanlışlıkla karmaşıklık sorununa uygulanabilir. Belirli bir kurallar kümesine sahip olmak bu sorunu önlemek için yeterli değildir. Her zaman bu kurallara uymayan bir durum olacaktır. Sorunları önceden görebilmek veya çözümleri tanımlayabilmek için deneyim kazanmamız gerekiyor. Tecrübe, öğretilemeyen bir şeydir, ancak sürekli denemek, başarısız olmak veya başarılı olmak ve hatalardan ders almakla elde edilebilir.

İşyerinden gelen bu soru ilgili ve IMHO bu bağlamda okumak için ilginç olurdu.


3
Uzmanların nasıl düşündüğünün harika bir açıklaması. Gerçekten sihir değil, tüm ayrık ve mantıklı adımları açıklamak zor.
MetaFight


Bu, "seçkin" sporcuların yaptıklarını nasıl yapabildiklerini sihir olarak görmemek gibi bir şey, sadece doğal olarak en yüksek seviyelerde performans için gereken ayrık ve mantıksal adımları gerçekleştirebilmeleri meselesi. Yani, eğer bu sporcular bu ayrık ve mantıklı adımları bize ifade edebilirlerse, hepimiz seçkin sporcular olabiliriz. Elit bir sporcu olabileceğimiz kavramı, edindiğimiz bilgi seviyesi ne olursa olsun, o beceri alanındaki yetenek ne olursa olsun, ne kadar yetenekli olursa olsun, öğrenmeye çalıştığımız her beceride uzman olabileceğimiz kadar tuhaf olur.
Dunk

1
@Dunk, Magic, bu "elit" sporcuların, hiç bir antrenman olmadan aynı şeyi yapabileceği zaman olurdu. Ana fikir, gümüş merminin olmadığıdır. Ne kadar yetenekli olursa olsun, tecrübe sadece “ayrı ve mantıklı adımlar” inceleyerek elde edilemez. Bu arada, aynı kitaba göre, insanların sadece% 1-5'i uzman.
superM

@ Süper: İnsanların sadece% 1-5'i uzman olduğu kadar saçma bir iddiada bulunan herhangi bir kitabı / araştırmayı sorgularım. Bir numarayı # & # & $ # numarasından çekme hakkında konuşun. Neye uzmanlar? İddiaya girerim nefes alma, yürüme, yemek yeme konusunda uzman olan çok daha fazla insan var. Uzman seviyesinin ne olduğuna kim karar veriyor? % 1-5 gibi bir iddia, başka yazarların taleplerini ve analizlerini reddeder.
Dunk

4

Heceleyemezsiniz, ancak “kazayla karmaşıklık”, “temel” karmaşıklıkla karşılaştırıldığında, probleme özgü olmayan bir karmaşıklık olarak tanımlanır. "Taming" için gereken teknikler nereden başladığınıza bağlı olacaktır. Aşağıdaki, çoğunlukla gereksiz karmaşıklık kazanmış sistemleri ifade eder.

Çok sayıda çok yıllı projede deneyimim var, “temel” yönden ağır basan “tesadüf” bileşeni ve ayrıca olmadığı yerlerdi.

Aslında, Feynman algoritması bir dereceye kadar geçerlidir, ancak bu “çok zor düşünün” ün sadece kodlanamayan bir sihir olduğu anlamına gelmez.

Alınması gereken iki yaklaşım var. İkisini de alın - alternatif değiller. Bunlardan biri parça parçaya değinmek, diğeri ise büyük bir yeniden işleme yapmak. Bu yüzden kesinlikle, “sorunu yaz”. Bu, sistemin denetlenmesi şeklinde olabilir - kod modülleri, durumları (koku, otomatik test düzeyi, ne kadar personelin bunu anlama iddiası), genel mimari ("sorunları olsa bile" bir tane var) ), şartların durumu vb.

“Yanlışlıkla” karmaşıklığın niteliği, sadece çözülmesi gereken tek bir sorun bulunmamasıdır. Yani triyaj yapmanız gerekiyor. Sistemi sürdürme ve gelişimini ilerletme kabiliyeti açısından nerelere zarar veriyor? Belki bazı kodlar çok kötü kokar, ancak öncelikli değildir ve beklemek için düzeltme yapılabilir. Diğer taraftan, yeniden yapılanmaya harcanan zamanı hızlı bir şekilde döndürecek bazı kodlar olabilir.

Daha iyi bir mimarinin ne olacağına ilişkin bir plan belirleyin ve yeni çalışmanın bu plana uygun olduğundan emin olmaya çalışın - bu artan yaklaşımdır.

Ayrıca, sorunların maliyetini de belirtin ve bunu bir refaktörü haklı çıkarmak için bir iş vakası oluşturmak için kullanın. Buradaki en önemli şey, iyi tasarlanmış bir sistemin, değişimi uygulamak için çok daha kısa bir süre (maliyet ve program) ile sonuçlanan çok daha sağlam ve test edilebilir olabileceğidir - bunun gerçek değeri vardır.

Büyük bir yeniden işleme “çok zor düşün” kategorisine giriyor - doğru yapmalısınız. Burası "Feynman" a sahip olmak (ki, birinin küçük bir kesimi iyi olur) büyük ölçüde karşılığını verir. Daha iyi bir mimariyle sonuçlanmayan önemli bir çalışma felaket olabilir. Tam sistem yeniden yazmaları bunun için ünlüdür.

Herhangi bir yaklaşımda örtük olan, “tesadüf” ü “temel” den nasıl ayırt edeceğinizi bilmek - yani sistemi ve amacını gerçekten anlayan harika bir mimara (veya mimarlar ekibine) ihtiyacınız olduğunu söylemek demektir.

Bunları söyledikten sonra, benim için en önemli şey otomatik test . Yeterince varsa, sistem kontrol altında. Eğer yapmazsan. . .


Otomatik testlerin yanlışlıkla ve temel karmaşıklığı ayırt etmek için nasıl bir hizmet olduğunu açıklayabilir misiniz?
ryscl

1
@RyanSmith. Kısacası, Hayır. Aslında, bunları ayırt etmenin özel bir yolu ("zor düşünmek" dışında) olduğunu düşünmüyorum . Ancak soru, onu "yönetmek" ile ilgilidir. Gereksinimleri, tasarımı, test durumlarını sistem mimarisinin bir parçası olarak görürseniz, o zaman otomatikleştirilmiş testlerin eksikliği başlı başına tesadüfi bir karmaşıklıktır, bu nedenle eksik olduğu yerlerde otomatikleştirilmiş testler eklemek bunu ele almanıza ve daha yönetilebilir bir şey yapmanıza yardımcı olur . Ama kesinlikle hepsini çözmüyor.
Keith

3

" Her şey mümkün olduğunca basit yapılmalı, ancak daha basit olmamalı "
- Albert Einstein'a atfedilen

Yanlışlıkla karmaşıklıkla başa çıkmak için kişisel algoritmamı çizeyim.

  1. Bir kullanıcı hikayesi yazın veya bir vaka kullanın. Ürün sahibiyle görüşün.
  2. Özelliği olmadığı için başarısız olan bir entegrasyon testi yazın. Takımınızda böyle bir şey varsa QA ile ya da baş mühendisle birlikte gözden geçirin.
  3. Entegrasyon testini geçebilecek bazı sınıflar için birim testleri yazınız.
  4. Ünite testlerini geçen sınıflar için asgari uygulamayı yazınız .
  5. Bir geliştirici ile birim testlerini ve uygulanmasını gözden geçirin. Adım 3'e gidin.

Tüm tasarım büyüsü 3. Adımda olacaktı: Bu sınıfları nasıl kurarsınız? Bu, aynı soruya dönüşüyor: Probleminize bir çözüm bulmadan önce probleminiz için bir çözümünüz olduğunu nasıl düşünüyorsunuz ?

Dikkat çekici bir şekilde, sadece çözümün sizde olduğunu hayal etmek , bilgisayar programlarının Yapısı ve Yorumlanmasında Abelson ve Sussman'ın "dilekçe düşünen" olarak adlandırılan ve Bilgisayar Programlarının Yapılışı ve Yorumlanmasında ve Polya'da "geriye doğru çalışmanın" temel çözümlerinden biri gibi görünüyor . Çöz )

Öte yandan, herkes aynı " hayali çözümler için tadı " na sahip değil : yalnızca sizin zarif bulduğunuz çözümler var ve daha geniş bir kitle tarafından daha anlaşılabilir başkaları da var. Bu nedenle, kodunuzu diğer geliştiricilerle birlikte gözden geçirmeniz gerekir: performansı ayarlamak için değil, anlaşılan çözümler konusunda hemfikir olmanız. Genellikle bu, yeniden tasarlamaya ve bazı yinelemelerden sonra çok daha iyi bir koda yol açar.

Testlerinizi geçmek için minimal uygulamalar yazmakla ve birçok kişi tarafından anlaşılan testleri yazmakla kalırsanız, yalnızca indirgenemez karmaşıklığın kaldığı bir kod tabanı ile sonlandırmanız gerekir .


2

Kazara Karmaşıklık

Asıl soru (tekrar ifade edildi):

Mimarlar yazılım projelerindeki kazara karmaşıklığı nasıl yönetiyor?

Kaza sonucu karmaşıklık, bir projeye yönelimi olanların tek bir teknolojiyi eklemeyi seçmeleri ve projenin orijinal mimarlarının genel stratejisinin projeye dahil etme niyetinde olmadıkları durumlarda ortaya çıkar. Bu sebepten ötürü, stratejideki seçimin arkasındaki mantığı kaydetmek önemlidir.

Kaza sonucu karmaşıklık, bu stratejiden kasıtlı bir şekilde ayrılana kadar gerekli olana kadar orijinal stratejilerine sadık kalan liderlikle önlenebilir.

Gereksiz Karmaşıklığı Önlemek

Sorunun gövdesine dayanarak, şu şekilde tekrar yazardım:

Mimarlar yazılım projelerindeki karmaşıklığı nasıl yönetir?

Bu yeniden ifade etme, Feynman algoritmasının daha sonra getirildiği, en iyi mimarlar için, bir sorunla karşılaştığında, daha sonra ustaca bir çözüm inşa ettikleri bir gebeliğe sahip olduklarını öneren bir bağlam sunan, sorunun gövdesine daha da apropolardır. geri kalanımızın bunu öğrenmeyi ümit edemeyiz. Anlayış zekasına sahip olmak, konunun zekasına ve onların kapsamı içinde olabilecek mimari seçeneklerin özelliklerini öğrenmeye istekli olmalarına bağlıdır.

Projenin planlama süreci, projenin gereksinimlerinin bir listesini yapmak için organizasyonun öğrenmesini kullanır ve ardından olası tüm seçeneklerin bir listesini oluşturmaya çalışır ve ardından seçenekleri gereksinimlerle birleştirir. Uzmanın gebeliği, bunu hızlıca ve belki de çok az belirgin bir çalışma ile kolayca yapabileceği bir hale getirmesini sağlar.

Hazırlıklarından dolayı kendisine geldiğini size sunarım. Uzmanın gestaltına sahip olmak, tüm seçenekleriniz hakkında bilgi sahibi olmayı ve öngörülen gelecekteki ihtiyaçlara, projenin sağlaması gereken kararları ve değişen ihtiyaçlara uyum sağlama esnekliğini sağlayan basit bir çözüm sunma öngörüsünü gerektirir. proje. Feynman'ın hazırlığı hem teorik hem de uygulamalı matematik ve fizikteki çeşitli yaklaşımlar hakkında derin bir anlayışa sahip olmasıydı. Doğası gereği meraklıydı ve etrafındaki doğal dünya hakkında keşfettiği şeyleri anlayabilecek kadar parlaktı.

Uzman teknoloji mimarı, temelde derinlemesine bir anlayışa ve çok çeşitli teknolojilere maruz kalmaya dayanan benzer bir merakı olacaktır. Kendisi ( Unix Programlama Prensipleri gibi ) ve belirli alanlarda ( tasarım desenleri ve stil rehberleri gibi ) geçerli olan alanlarda başarılı olan stratejilerden faydalanma bilgisine sahip olacaktır . Her kaynak hakkında yakından bilgi sahibi olmayabilir, ancak kaynağı nerede bulacağını bilir.

Çözüm Kurma

Bu bilgi seviyesi, anlayış ve bilgelik, deneyim ve eğitimden çıkarılabilir, ancak yanlışlıkla ve gereksiz karmaşıklıktan kaçınacak şekilde bir arada çalışan bir genel stratejik çözümü bir araya getirmek için istihbarat ve zihinsel faaliyet gerektirir. Bu temelleri bir araya getirmek için uzmana ihtiyaç duyuyor; Bunlar, Drucker'in terimi ilk kez kullandığında öngördüğü bilgi çalışanlarıydı.

Belirli son sorulara dönelim:

Kazara karmaşıklığı gidermek için özel yöntemler aşağıdaki kaynaklarda bulunabilir.

Unix Programlama Prensiplerine uyarak, size iyi çalışan ve ortak arayüzlerle sağlam olan basit modüler programlar oluşturmanızı sağlayacaktır. Tasarım Desenlerini izlemeniz gerekenden daha karmaşık olmayan karmaşık algoritmalar oluşturmanıza yardımcı olur. Stil Kılavuzlarını izleyerek, kodunuzun yazıldığı dil için kodunuzun okunabilir, bakımı yapılabilir ve en uygun durumda olmasını sağlayabilirsiniz. Uzmanlar, bu kaynaklarda bulunan ilkelerin çoğunu içselleştirecek ve bunları tutarlı bir şekilde bir araya getirebileceklerdir.


"Gestalt" ile ne demek istiyorsun? Bunun "paradigma" gibi bir şey olduğunu öğrendim - genellikle yanlış kullanılmış ya da bir akademinin havasını vermek için kullanılmış.


0

Bu birkaç yıl önce zor bir soru olabilirdi, ancak günümüzde IMO artık tesadüfi karmaşıklığı ortadan kaldırmak için zor değil.

Kent Becksa'nın kendisi hakkında ne düşündüğü, bir noktada: "Ben iyi bir programcı değilim; sadece büyük alışkanlıkları olan iyi bir programcıyım."

İki şey vurgulanmaya değer, IMO: kendini bir mimar olarak değil, bir programcı olarak görüyor ve odağı bilgi değil, alışkanlıklar üzerine.

Feynman'ın zor problemleri çözme yolu bunu yapmanın tek yoludur. Tanımlamanın mutlaka anlaşılması çok kolay değil, bu yüzden disekte edeceğim. Feynman'ın kafası sadece bilgi dolu değildi, aynı zamanda bu bilgiyi uygulama becerisiyle de doluydu. Bunu kullanmak için hem bilgi hem de beceriye sahip olduğunuzda, zor bir problemi çözmek ne zor ne de kolaydır. Tek olası sonuç bu.

Kazara karmaşıklık içermeyen, temiz bir kod yazmanın tamamen sihirli bir yolu var ve Feynman’ın yaptıklarına çok benziyor: tüm gerekli bilgileri edinme, işe koyulmak için alışmak için gerekli tüm bilgileri edin. Beyninin bir köşesine temiz kod yaz.

Artık birçok programcı, temiz kod yazmak için gereken tüm bilgilerin farkında bile değil. Genç programcılar algoritmalar ve veri yapıları hakkındaki bilgiyi atma eğilimindedir ve çoğu eski programcı bunu unutmaya meyillidir. Ya da büyük O gösterim ve karmaşıklık analizi. Daha eski programcılar modelleri ya da kod kokularını yok etme eğilimindedirler - ya da var olduklarını bile bilmiyorlar. Herhangi bir neslin programcılarının çoğu, kalıpları bilseler bile, parçaları ne zaman ve ne zaman kullanacaklarını asla hatırlamıyor. Herhangi bir neslin birkaç programcısı kodlarını SOLID ilkelerine göre sürekli olarak değerlendirir. Birçok programcı tüm olası soyutlama seviyelerini her yere karıştırır. Bir programcıdan beri, kodunu Fowler tarafından yeniden düzenleme kitabında tarif edilen pis kokulara karşı sürekli olarak değerlendirmek için farkında değilim. Bazı projeler bazı metrikler aracını kullanmasına rağmen, en çok kullanılan metrik, bir tür veya diğerinin karmaşıklığıdır; diğer iki ölçümün (kuplaj ve uyum) temiz kod için çok önemli olsalar bile, büyük ölçüde göz ardı edilmesi gerekir. Neredeyse herkesin görmezden geldiği bir başka yön bilişsel yüktür. Çok az sayıda programcı ünite testlerini dokümantasyon olarak kabul eder ve daha azı ünite testlerinin yazılmasının veya isimlendirilmesinin zor olduğunu, bunun genellikle kötü faktoringi belirttiğinin bir başka kod kokusu olduğunu bilmektedir. Küçük bir azınlık, kod modelini ve iş alanı modelini birbirine mümkün olduğu kadar yakın tutmak için etki alanına dayalı tasarımın mantığının farkındadır, çünkü yoldaki sorunları yaratacak şekilde tutarsızlıklar vardır. Kodunuzun temiz olmasını istiyorsanız, bunların hepsinin her zaman göz önünde bulundurulması gerekir. Ve şu an hatırlayamadığım birçok şey. en çok kullanılan metrik, bir tür veya başka bir karmaşıklıktır, diğer iki ölçüm - eşleştirme ve uyum - temiz kod için çok önemli olsalar bile, büyük ölçüde göz ardı edilir. Neredeyse herkesin görmezden geldiği bir başka yön bilişsel yüktür. Çok az sayıda programcı ünite testlerini dokümantasyon olarak kabul eder ve daha azı ünite testlerinin yazılmasının veya isimlendirilmesinin zor olduğunu, bunun genellikle kötü faktoringi belirttiğinin bir başka kod kokusu olduğunu bilmektedir. Küçük bir azınlık, kod modelini ve iş alanı modelini birbirine mümkün olduğu kadar yakın tutmak için etki alanına dayalı tasarımın mantığının farkındadır, çünkü yoldaki sorunları yaratacak şekilde tutarsızlıklar vardır. Kodunuzun temiz olmasını istiyorsanız, bunların hepsinin her zaman göz önünde bulundurulması gerekir. Ve şu an hatırlayamadığım birçok şey. en çok kullanılan metrik, bir tür veya başka bir karmaşıklıktır, diğer iki ölçüm - eşleştirme ve uyum - temiz kod için çok önemli olsalar bile, büyük ölçüde göz ardı edilir. Neredeyse herkesin görmezden geldiği bir başka yön bilişsel yüktür. Çok az sayıda programcı ünite testlerini dokümantasyon olarak kabul eder ve daha azı ünite testlerinin yazılmasının veya isimlendirilmesinin zor olduğunu, bunun genellikle kötü faktoringi belirttiğinin bir başka kod kokusu olduğunu bilmektedir. Küçük bir azınlık, kod modelini ve iş alanı modelini birbirine mümkün olduğu kadar yakın tutmak için etki alanına dayalı tasarımın mantığının farkındadır, çünkü yoldaki sorunları yaratacak şekilde tutarsızlıklar vardır. Kodunuzun temiz olmasını istiyorsanız, bunların hepsinin her zaman göz önünde bulundurulması gerekir. Ve şu an hatırlayamadığım birçok şey. Diğer iki ölçüm - birleştirme ve uyum - temiz kod için çok önemli olsalar bile, büyük ölçüde göz ardı edilir. Neredeyse herkesin görmezden geldiği bir başka yön bilişsel yüktür. Çok az sayıda programcı ünite testlerini dokümantasyon olarak kabul eder ve daha azı ünite testlerinin yazılmasının veya isimlendirilmesinin zor olduğunu, bunun genellikle kötü faktoringi belirttiğinin bir başka kod kokusu olduğunu bilmektedir. Küçük bir azınlık, kod modelini ve iş alanı modelini birbirine mümkün olduğu kadar yakın tutmak için etki alanına dayalı tasarımın mantığının farkındadır, çünkü yoldaki sorunları yaratacak şekilde tutarsızlıklar vardır. Kodunuzun temiz olmasını istiyorsanız, bunların hepsinin her zaman göz önünde bulundurulması gerekir. Ve şu an hatırlayamadığım birçok şey. Diğer iki ölçüm - birleştirme ve uyum - temiz kod için çok önemli olsalar bile, büyük ölçüde göz ardı edilir. Neredeyse herkesin görmezden geldiği bir başka yön bilişsel yüktür. Çok az sayıda programcı ünite testlerini dokümantasyon olarak kabul eder ve daha azı ünite testlerinin yazılmasının veya isimlendirilmesinin zor olduğunu, bunun genellikle kötü faktoringi belirttiğinin bir başka kod kokusu olduğunu bilmektedir. Küçük bir azınlık, kod modelini ve iş alanı modelini birbirine mümkün olduğu kadar yakın tutmak için etki alanına dayalı tasarımın mantığının farkındadır, çünkü yoldaki sorunları yaratacak şekilde tutarsızlıklar vardır. Kodunuzun temiz olmasını istiyorsanız, bunların hepsinin her zaman göz önünde bulundurulması gerekir. Ve şu an hatırlayamadığım birçok şey. Neredeyse herkesin görmezden geldiği bir başka yön bilişsel yüktür. Çok az sayıda programcı ünite testlerini dokümantasyon olarak kabul eder ve daha azı ünite testlerinin yazılmasının veya isimlendirilmesinin zor olduğunu, bunun genellikle kötü faktoringi belirttiğinin bir başka kod kokusu olduğunu bilmektedir. Küçük bir azınlık, kod modelini ve iş alanı modelini birbirine mümkün olduğu kadar yakın tutmak için etki alanına dayalı tasarımın mantığının farkındadır, çünkü yoldaki sorunları yaratacak şekilde tutarsızlıklar vardır. Kodunuzun temiz olmasını istiyorsanız, bunların hepsinin her zaman göz önünde bulundurulması gerekir. Ve şu an hatırlayamadığım birçok şey. Neredeyse herkesin görmezden geldiği bir başka yön bilişsel yüktür. Çok az sayıda programcı ünite testlerini dokümantasyon olarak kabul eder ve daha azı ünite testlerinin yazılmasının veya isimlendirilmesinin zor olduğunu, bunun genellikle kötü faktoringi belirttiğinin bir başka kod kokusu olduğunu bilmektedir. Küçük bir azınlık, kod modelini ve iş alanı modelini birbirine mümkün olduğu kadar yakın tutmak için etki alanına dayalı tasarımın mantığının farkındadır, çünkü yoldaki sorunları yaratacak şekilde tutarsızlıklar vardır. Kodunuzun temiz olmasını istiyorsanız, bunların hepsinin her zaman göz önünde bulundurulması gerekir. Ve şu an hatırlayamadığım birçok şey. Kod modelini ve iş alanı modelini birbirine mümkün olduğunca yakın tutma mantığı, çünkü yoldaki problemleri yaratma konusunda farklılıklar vardır. Kodunuzun temiz olmasını istiyorsanız, bunların hepsinin her zaman göz önünde bulundurulması gerekir. Ve şu an hatırlayamadığım birçok şey. Kod modelini ve iş alanı modelini birbirine mümkün olduğunca yakın tutma mantığı, çünkü yoldaki problemleri yaratma konusunda farklılıklar vardır. Kodunuzun temiz olmasını istiyorsanız, bunların hepsinin her zaman göz önünde bulundurulması gerekir. Ve şu an hatırlayamadığım birçok şey.

Temiz kod yazmak ister misin? Sihir gerekli değil. Tek yapmanız gereken gerekenleri öğrenmek. Daha sonra, kodunuzun temizliğini değerlendirmek için kullanın ve mutlu olana kadar refactor kullanın. Ve öğrenmeye devam edin - yazılımlar hala genç bir alandır ve yeni bakış açıları ve bilgiler hızlı bir şekilde edinilmektedir.

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.