Yukarıdan aşağıya ve aşağıdan yukarıya tasarım

Yazılım, hümanistik (insani), bilimsel teoriler, yönetim ve organizasyon gibi çeşitli alanlarda kullanılan, yukarıdan aşağıya ve aşağıdan yukarıyanın her ikisi de bilgi işleme ve bilgi sıralama stratejisidir. Pratikte, bir düşünce, öğretim veya liderlik biçimi olarak görülebilirler.Basamaklı (aşamalı) tasarım olarak da bilinen ve bazı durumlarda dekompozisyonun eşanlamlısı olarak kullanılan yukarıdan aşağıya doğru yaklaşım,  temel olarak bir sistem hakkında fikir edinmek için sistemin ters mühendislik tarzına uygun olarak bilişimsel (düzensel) alt sistemlere parçalanmasıdır (ayrılmasıdır).Yukarıdan aşağıya doğru bir yaklaşımda, birinci seviye alt sistemler detayına girmeden belirtilerek sisteme genel bir bakış oluşturulur. Ardından, tüm belirtimler temel öğelerine indirilinceye kadar her alt sistem daha ayrıntılı olarak ve bazen daha çok ek alt sistem seviyesinde işlenir.Yukarıdan aşağıya bir model genellikle "kara kutular" yardımıyla belirtilir ve bu da daha kolay işlenmesini sağlar. Bununla birlikte, kara kutular temel mekanizmaları açıklığa kavuşturmada başarısız olabilir veya modeli gerçekçi bir şekilde doğrulamak için yeterince detaylı olmayabilir. Yukarıdan aşağıya yaklaşımı, büyük resimle başlar, buradan daha küçük parçalara bölünür.Aşağıdan yukarıya doğru yaklaşım, sistemlerin birbirine eklenmesiyle daha karmaşık sistemlerin ortaya çıkmasını sağlar. Aşağıdan yukarıya işleme, bir algı oluşturması için ortamdan gelen verilere dayanan bir bilgi işleme türüdür. Bilişsel psikoloji perspektifinden bakıldığında, bilgiler bir yönden göze girer (duyusal girdi ve aşağı) ve daha sonra beyin tarafından yorumlanır ve algılanabilen bir görüntü haline dönüşür (işlemeden nihai kavramaya kadar oluşturulmuş çıktı).Aşağıdan yukarıya doğru bir yaklaşımda, sistemin temel unsurları ilk önce ayrıntılı olarak belirtilir. Daha sonra bu elemanlar, büyük alt sistemler oluşturmak üzere bir araya getirilir ve bu alt sistemler tam bir üst düzey sistem oluşturulana kadar, bazen birçok seviyede bağlanır. Bu strateji, genellikle başlangıçların küçük olduğu ancak sonunda karmaşıklık ve bütünlük içinde büyüyen bir tohum modelini andırıyor. Bununla birlikte, organik stratejiler, global bir amacı karşılamak yerine yalıtılmış olarak geliştirilen ve yerel optimizasyona tabi tutulan öğelerin ve alt sistemlerin birbirine karışmasına neden olabilir.Yazılım geliştirme sürecinde yukarıdan aşağıya ve aşağıdan yukarıya yaklaşımları önemli bir rol oynamaktadır.Yukarıdan aşağıya yaklaşımlar, planlamayı ve sistemin tam bir anlayışını vurgular. Sistemin en azından bir bölümünün tasarımında yeterli bir detay seviyesine ulaşılıncaya dek hiçbir kodlamanın başlamaması doğası gereğidir. Yukarıdan aşağıya yaklaşımlar, modül yerine koçanlar eklenerek gerçekleştirilir. Ancak bu, kayda değer tasarım tamamlanıncaya kadar bir sistemin nihai işlevsel birimlerinin testini geciktirir.Aşağıdan yukarıya yaklaşımda, kodlama ve ilk modül belirtilir belirtilmez başlanabilecek erken testi vurgular. Bununla birlikte, bu yaklaşım, modüllerin, modüllerin sistemin diğer bölümlerine nasıl bağlanacağı hakkında net bir fikir olmadan kodlanabilme ve bu bağlantıların ilk düşünüldüğü kadar kolay olmama riskini taşır. Kodun yeniden kullanılabilirliği, aşağıdan yukarıya yaklaşımın en önemli yararlarından biridir.Yukarıdan aşağıya tasarım, 1970'lerde IBM araştırmacıları Harlan Mills ve Niklaus Wirth tarafından duyuruldu (yaygınlaştırıldı). Mills, pratik kullanım için yapılandırılmış programlama kavramları geliştirdi ve bunları New York Times morg indeksini otomatikleştiren 1969'daki bir projede test etti. Bu projenin mühendislik ve yönetim başarısı, yukarıdan aşağıya doğru yaklaşımın IBM ve bilgisayar endüstrisinin geri kalanı aracılığıyla yayılmasına yol açtı. Diğer başarılar arasında, Pascal programlama dilinin geliştiricisi Niklaus Wirth'in yazdığı etkili makale Program Development by Stepwise Refinement yazması gösterilebilir. Niklaus Wirth, (programın tüm özelliklerini bilmeden bir modül tanımlayabilmesine izin veren) Modula ve Oberon gibi dilleri geliştirme yoluna gittiği için tam olarak desteklediği şeyin yukarıdan aşağıya programlama olduğu söylenemez. Yukarıdan aşağıya yöntemler, 1980'lerin sonuna kadar yazılım mühendisliğinde tercih edilmiştir ve nesneye dayalı programlama, yukarıdan aşağıya ve aşağıdan yukarıya programlama bakış açılarının her ikisinin de kullanılabileceği fikrini göstermeye yardımcı olmuştur.Modern yazılım tasarımı yaklaşımları genellikle yukarıdan aşağıya ve aşağıdan yukarıya yaklaşımlarını birleştirir. İyi bir tasarım için komple sistemin anlaşılması genellikle gerekli olmakla birlikte ve bu da teorik olarak yukarıdan aşağıya doğru bir yaklaşıma yönlendirse de çoğu yazılım projesi mevcut kodu bir dereceye kadar kullanmaya çalışır. Önceden var olan modüller, tasarımlara aşağıdan yukarıya bir tat katar. Bazı tasarım yaklaşımlarıysa kısmen işlevsel bir sistemin tamamlanması için tasarlanmış ve kodlanmış bir yaklaşım kullanıyor ve bu sistem daha sonra projenin tüm gereksinimlerini karşılayacak şekilde genişletiliyor.Yukarıdan aşağıya, tasarımın karmaşık parçaların belirlenip daha sonra daha küçük parçalara bölünerek başladığı geleneksel prosedürel dillerin temelini oluşturan bir programlama stilidir. Yukarıdan aşağıya yöntemini kullanarak bir program yazmak, ihtiyaç duyulan tüm önemli işlevleri tanımlayan bir ana yordam yazmaktır. Daha sonra programlama ekibi bu işlevlerin her birinin gereksinimlerine bakar ve süreç tekrarlanır. Kolayca ve öz bir şekilde kodlanmış bu bölümlendirilmiş alt rutinler sonunda basitçe işlemleri gerçekleştirecektir. Tüm alt rutinler kodlandığında program test için hazırdır. Uygulamanın yüksek seviyede nasıl bir araya geldiği tanımlanarak alt seviye işin kendi kendine yeterli olması sağlanabilir. Alt seviye soyutlamaların daha üst seviyedeki soyutlamalara nasıl entegre edileceği tanımlanarak arayüzler net bir şekilde belirtilir.Aşağıdan yukarıya doğru bir yaklaşımda, sistemin temel unsurları ilk önce ayrıntılı olarak belirtilir. Daha sonra bu öğeler, daha büyük alt sistemler oluşturmak üzere bir araya getirilir ve alt sistemler tam bir üst düzey sistem oluşturulana kadar birçok seviyede bağlanır. Nesne yönelimli programlama, uygulama ve bilgisayar programlarını tasarlamak için nesneler kullanan bir paradigmadır. Makine mühendisliğinde Pro/ENGINEER, Solidworks ve Autodesk Inventor gibi yazılımlarla kullanıcılar ürünlerin tamamını bir seferde değil parça parça tasarlayabilir ve daha sonra bu parçaları bir araya getirerek LEGO'larla inşa eder gibi montajlarını oluşturabilir. Mühendisler buna küçük parça tasarımı der.Aşağıdan yukarıya doğru yaklaşımda, modül tarafından sağlanacak işlevselliği belirlemek için iyi sezgiler gereklidir. Eğer bir sistem mevcut bir sistemden kurulacaksa bazı var olan modüllerden yola çıkıldığı için bu yaklaşım daha uygundur.Ayrıştırma, gramer yapısını belirlemek için (dosyadan veya klavyeden okunan) bir girdi sırasını çözümleme sürecidir. Bu yöntem, bir derleyicide olduğu gibi hem doğal dillerin hem de bilgisayar dillerinin analizinde kullanılır. Aşağıdan yukarıya ayrıştırma, ilk önce en temel birimleri tanımlamaya ve daha sonra üst düzey yapıları onlardan çıkarmaya çalışan bilinmeyen veri ilişkilerini analiz etme stratejisidir. Diğer taraftan yukarıdan aşağıya doğru ayrıştırıcılar, genel ayrıştırma ağacı yapılarını varsayar ve ardından bilinen temel yapıların hipotezle uyumlu olup olmadığını değerlendirir.