Yukarıdan aşağıya, bildiğiniz şeyleri tanımlamanın veya önceden oluşturduğunuz şeyleri yeniden oluşturmanın harika bir yoludur.
Yukarıdan aşağıya en büyük sorun, çoğunlukla basitçe "üst" olmamasıdır. Sistemi geliştirirken ve etki alanını araştırırken sistemin ne yapması gerektiği konusundaki fikrinizi değiştireceksiniz. Başlangıç noktanız bilmediğiniz bir şey (örneğin, sistemin ne yapmasını istiyorsunuz) olabilir?
Bir "yerel" tepeden aşağıya iyi bir şey ... kodlamadan önce düşünmek açıkça iyi. Ancak çok fazla düşünmek ve planlama yapmak değildir, çünkü düşündüğünüz gerçek senaryo değildir (daha önce orada bulunmadığınız sürece, yani eğer inşa etmiyorsanız, ancak yeniden inşa ediyorsanız). Yeni şeyler inşa ederken Global yukarıdan aşağıya sadece saçma.
Aşağıdan yukarıya doğru (global olarak) yaklaşım olmalıdır, sorunun% 100'ünü bilmiyorsanız, kodlanması için bilinen bir çözüme ihtiyacınız var ve olası alternatif çözümler aramayı umursamıyorsunuz.
Lisp yaklaşımı damıtılmış aşağıdan yukarıya doğrudur. Sadece aşağıdan yukarıya doğru değil, aynı zamanda tuğlaları da ihtiyacınız olan şekilde şekillendirebilirsiniz. Hiçbir şey sabit değil, özgürlük tam. Elbette özgürlük sorumluluk alır ve bu gücü kötüye kullanarak korkunç şeyler yapabilirsiniz.
Ancak korkunç kod herhangi bir dilde yazılabilir. Zihin için kafes şeklinde olan dillerde bile, bu dillerle maymunların bile iyi programlar hazırlayıp çalışmaya başlayabilecekleri umuduyla tasarlandı (o kadar çok konuda yanlış düşünen bile bir fikir).
Örnek, bir web sunucusu hakkında. Şimdi 2012'de bu iyi tanımlanmış bir sorundur, izlenecek özelliklere sahipsiniz. Bir web sunucusu sadece bir uygulama problemidir. Özellikle, orada bulunan diğer gajilyonlarca web sunucusu ile büyük ölçüde özdeş bir web sunucusu yazmayı hedefliyorsanız, bazı minutialar dışında hiçbir şey net değildir. RSA hakkındaki yorumunuz bile hala resmi spesifikasyonlarla açıkça tanımlanmış bir problemden bahsediyor.
İyi tanımlanmış bir problemle, biçimsel spesifikasyonlarla ve zaten bilinen çözümlerle kodlama sadece noktalara bağlanır. Yukarıdan aşağıya bunun için uygun. Bu proje yöneticisi cennetidir.
Bununla birlikte, çoğu durumda, noktaları birleştirmek için kullanıldığı kanıtlanmış bir yaklaşım yoktur. Aslında çok sık noktaların ne olduğunu söylemek bile zor.
Örneğin, kesilecek parçaları, teorik olarak tekrarlayan logoya tam olarak uymayan bir basılı malzemeye hizalamak için otomatik bir kesme makinesinden talimat almanız istendiğini varsayalım. Makinenin çektiği malzemenin parçalarını ve resimlerini alırsınız.
Hizalama kuralı nedir? Sen karar ver. Bir kalıp nedir, nasıl temsil edilir? Sen karar ver. Parçaları hizalamak nasıl? Sen karar ver. Parçalar "bükülebilir" mi? Bazıları değil, bazıları evet, fakat elbette fazla değil. Malzeme bir parçayı kabul edilebilir bir şekilde kesemeyecek kadar deforme olmuşsa ne yapmalı? Sen karar ver. Bütün malzeme ruloları aynı mı? Tabii ki değil, ama kullanıcının her rulo için hizalama kurallarını uyarlamasına izin veremezsiniz ... bu pratik olmaz. Hangi resimler kameraları görüyor? Materyal, her ne demek olursa olsun ... renk olabilir, sadece ışık refleksinin deseni belirginleştirdiği yerde siyah üzerine siyah olabilir. Bir kalıbı tanımak ne demektir ? Sen karar ver.
Şimdi bu problem için bir çözümün genel yapısını tasarlamaya çalışın ve para ve zaman içinde bir fiyat teklifi verin. Bahse girerim ki sistem mimariniz bile (evet, mimarlık) yanlış olacak. Maliyet ve zaman tahmini rastgele sayılar olacaktır.
Uyguladık ve şimdi çalışan bir sistem, ancak sistemin şekli hakkındaki fikrimizi birçok kez değiştirdik. Artık menülerden bile erişilemeyen tüm alt sistemleri ekledik. Protokollerde master / slave rollerini bir kereden fazla değiştirdik. Muhtemelen şimdi daha iyi bir şekilde yeniden inşa etmeye çalışmak için yeterli bilgiye sahibiz.
Elbette diğer şirketler de aynı sorunu çözdü ... ama bu şirketlerden birinde değilseniz büyük olasılıkla yukarıdan aşağıya ayrıntılı projeniz bir şaka olacaktır. Yukarıdan aşağıya doğru tasarlayabiliriz. Bunu yapamazsınız çünkü daha önce hiç yapmadınız.
Muhtemelen aynı sorunu da çözebilirsiniz. Ancak aşağıdan yukarıya çalışmak. Bildiklerinizden başlayarak, bilmediğiniz şeyleri öğrenme ve ekleme.
Yeni karmaşık yazılım sistemleri tasarlanmamıştır, yetiştirilir. Her şimdi ve sonra birisi sıfırdan başlayarak yeni ve karmaşık bir şekilde tanımlanmamış büyük bir yazılım sistemi tasarlamaya başlar (büyük bir karmaşık yazılım projesiyle sadece üç olasılık olduğunu unutmayın: a) şartname bulanık, b] şartname yanlış veya c] hem ... hem de çoğu zaman [c] durum böyledir).
Bunlar, yalnızca powerpoint slaytlarına ve UML diyagramlarına atılan binlerce ve binlerce saatlik tipik büyük şirket projeleridir. Utanç verici miktarda kaynak yaktıktan sonra tamamen başarısız olurlar ... ya da çok istisnai bir durumda, nihayetinde ilk özelliklerin sadece küçük bir kısmını uygulayan overpriced bir yazılım sunarlar. Ve bu yazılım kaçınılmaz olarak kullanıcılar tarafından çok nefret ediliyor ... satın alacağınız türden bir yazılım değil, kullandığınız türden bir yazılım.
Bu sadece kodlamayı düşünmeniz gerektiğini düşündüğüm anlamına mı geliyor? Tabii ki değil. Fakat bence yapı alttan başlamalı (tuğlalar, beton kodlar) ve yukarı çıkmalı ... ve detaylara odaklanmanız ve dikkatiniz, bir anlamda sahip olduğunuzdan uzaklaştıkça “solmalı” olmalıdır. Yukarıdan aşağıya, çoğu zaman tüm sisteme aynı seviyede ayrıntıyı bir kerede koymanız gerekiyormuşçasına sunulur: her şeyi açıklığa kavuşana kadar her düğümü ayırmaya devam edin ... gerçeklik modüllerinde, alt sistemler alt yordamlardan "büyütülür". Belirli bir problemde daha önce bir deneyiminiz yoksa, bir alt sistem, modül veya kütüphanenin yukarıdan aşağıya tasarımınız korkunç olacaktır. Hangi işlevleri yerine koyacağınızı öğrendikten sonra iyi bir kütüphane tasarlayabilirsiniz.
Lisp fikirlerinin çoğu daha popüler hale geliyor (birinci sınıf fonksiyonlar, kapanmalar, varsayılan olarak dinamik yazma, çöp toplama, metaprogramlama, etkileşimli gelişim) ancak Lisp hala kodları şekillendirmenin ne kadar kolay olduğu konusunda bugün hala (bildiğim diller arasında) ihtiyacın olan şey için.
Örneğin, anahtar sözcük parametreleri zaten var, ancak mevcut değilse, eklenebilirler. Denemekte olduğum bir oyuncak Lisp derleyicisi için (derleme zamanında anahtar kelime doğrulaması dahil) yaptım ve çok fazla kod almıyor.
Bunun yerine, C ++ ile elde edebileceğiniz en fazla şey, anahtar kelime parametrelerinin bu kadar kullanışlı olmadığını ya da inanılmaz derecede karmaşık, kırılmış, yarı destekli bir şablon uygulamasının gerçekten de yararlı olmadığını söyleyen bir grup C ++ uzmanıdır. C ++ sınıfları birinci sınıf nesneler midir? Hayır ve bu konuda yapabileceğiniz hiçbir şey yok. Çalışma zamanında veya derleme zamanında inceleme yapabilir misiniz? Hayır ve bu konuda yapabileceğiniz hiçbir şey yok.
Lisp'in bu dil esnekliği, aşağıdan yukarıya bina için harika kılan şeydir. Sadece alt yordamları değil, aynı zamanda dilin sözdizimini ve anlamını da oluşturabilirsiniz. Ve bir bakıma Lisp'in kendisi aşağıdan yukarıya doğru.