Gümüş Kurşun Yok: Yazılım Mühendisliği’nin Asli ve Arızi Özellikleri – II

Gümüş Kurşun Yok: Yazılım Mühendisliği’nin Asli ve Arızi Özellikleri – II

Frederick P. Brooks, Jr.

(Bu yazı, Frederick Brooks’un No Silver Bullet: Essence and Accidents of Software Engineering başlıklı makalesinin ikinci kısmının Türkçe çevirisidir. İlk kısmı ilk yazıyla yayınlanmıştı. Geri kalan kısmı da çevrildikçe burada yayınlanacaktır. Çevirinin PDF dosyasına buradan ya da buradan ulaşabilirsiniz. Çevirideki her türlü hata benimdir. Öneri ve eleştirileriniz için akin@javaturk.org adresinden bana ulaşabilirsiniz.)

Geçmiş Yenilikler Arızi Zorlukları Çözdü

Yazılım teknolojisinin gelişmesinde geçmişte en verimli olmuş  üç adımı ele alsak, her birinin yazılımı inşa etmede farklı bir ana zorluğu çözmeye giriştiğini görürüz, ama bu güçlükler arızi güçlüklerdir, asli değil.  Aynı zamanda böyle her bir girişimin varacağı yerle ilgili doğal sınırları da görebiliriz.

Yüksek seviyeli diller. Pek tabi ki, yazılım üretkenliği, güvenirliği ve basitliği için en güçlü çaba,  programlama için yüksek seviyeli dillerin gittikçe artan şekilde kullanımıdır. Yüksek seviyeli dillerin, güvenilirlik, basitlik ve anlaşılırlıktaki kazanımlarla birlikte üretkenlikte en az 5 katlık bir ilerleme sağladığı, pek çok gözlemci tarafından teslim edilmiştir.

Yüksek seviyeli bir dil ne sağlar? Bir programı, arızi olan karmaşıklıklardan kurtarır. Soyut bir program, kavramsal yapılardan oluşur: işlemler, veri tipleri, programdaki adımlar ve haberleşme. Somut olan makina programı ise bitler, kütükler, dallar, kanallar, diskler vb. şeylerle ilgilidir. Yüksek seviyeli diller, bir soyut programda olması istenilen yapıları içerip, daha aşağı seviyeli olanlarından kaçındığı oranda, programlarda zaten hiçbir zaman doğal olmamış bir karmaşıklık seviyesini de ortadan kaldırırlar.

Bir yüksek seviyeli dilin yapabileceği, en çok, soyut bir programda, programcının hayal edebileceği yapıların hepsini sunmaktır. Veri yapıları, veri tipleri ve işlemler hakkındaki düşünce seviyemizin gittikçe yükselmekte olduğu kesindir, fakat bu yükselmenin hızı devamlı düşmektedir. Ve dil geliştirme yaklaşımları gittikçe, kullanıcıların sahip olduğu karmaşıklık seviyesine yaklaşmaktadır.

Dahası, bir noktada, yüksek seviyeli bir dilin sahip olduğu detayın yarattığı kullanım zorluğu, böylesi sadece ehlinin anlayabileceği yapıları nadiren kullanan kullanıcının zihni yükünü azaltmak yerine arttıracaktır.

Zaman paylaşımı. Zaman paylaşımı, programcıların üretkenliğine ve ürünlerinin kalitesine ciddi bir ilerleme getirmiştir ama bu ilerleme yüksek seviyeli dillerin kazandırdığı kadar büyük olmamıştır.

(Bu kısımın çevirisi sonra tamamlanacaktır.)

Birleşik programlama ortamları. Unix ve Interlisp, yaygın bir kullanım alanı bulan ilk entegre programlama ortamları olarak, üretkenliği çok küçük oranlarda ilerletmiş görünmektedirler. Neden?

Bunlar, entegre kütüphaneler,birleşik dosya formatları, programlar arasında haberleşme kanalları ve filtreler  sağlayarak, tek tek pek çok programı bir arada kullanmaktan kaynaklanan arizi zorlukları hedef edinmiştir. Sonuç olarak da, prensipte daima birbirini çağırıp, besleyip ve kullanabilecek olan kavramsal yapılar, pratikte de bunları kolayca yapabilir hale geldiler.

Bu yenilik de, bütün araçların geliştirilmesini tetikledi, çünkü her yeni araç standart formatları kullanan herhangi bir programa uygulanabiliyordu.

Bu başarılardan dolayı bu ortamlar günümüz yazılım mühendisliği araştırmalarının konusudur. Bu araçların vaad ettikleri şeylere ve kısıtlarına bir sonraki kısımda göz atacağız.

Gümüş İçin Umutlar

Şimdi de potensiyel gümüş kurşun olarak ileri sürülen teknik gelişmelere bakalım. Bunlar hangi problemleri ele aldılar – asli problemleri mi yoksa geride kalan arızi zorlukları mı? Bunlar devrim ya da iyileştirici nitelikle ilerlemeler mi sundular?

Ada ve diğer yüksek seviyeli dil ilerlemeleri. Yakın geçmişte en çok övülen gelişmelerden biri, 1980’lerin genel amaçlı yüksek seviyeli dili olan Ada’dır. Ada, sadece dil kavramlarındaki evrimsel gelişmeleri yansıtmakla kalmaz, aynı zamanda modern tasarım ve modularizasyonu öne çıkaran özellikleri de içerir. Belki de Ada felsefesi, Ada dilinden daha ileridedir çünkü o modularizasyonun, soyut veri yapılarının ve hiyerarşik yapılandırmanın felsefesidir. Ada, ihtiyaçların tasarımını belirlediği bir sürecin tabi sonucu olarak, aşırı zengindir. Bu ölümcül bir durum değildir, çünkü daha alt seviyede iş gören kavramlar öğrenme problemini çözebilirler ve donanımdaki ilerlemeler de bize, derleme maliyetlerini karşılamak üzere daha ucuz MIPS sağlarlar. Yazılım sistemlerinin yapılandırmada ilerleme sağlamak, paramızın satın alabileceği daha çok MIPS için iyi bir yöntemdir. 1960’larda bellek ve hız maliyetlerinden dolayı çok yerilen işletim sistemleri, geçmişdeki donanım dalgalarının MIPS ve ucuz belleğinin bir kısımını kullanmanın en mükemmel yolu olduklarını gösterdiler.

Yine de Ada, yazılım üretkenliğini engelleyen canavarı öldürecek gümüş kurşun olamayacaktır. Herşeyden önce Ada sadece bir diğer yüksek seviyeli dildir ve bu gibi dillerden elde edilen en büyük fayda ise ilk geçişte elde edilmektedir ki bu da, makinanın arızi karmaşıklığını, daha soyut olan ve adım adım komutlarla oluşturulan çözümlere dönüştürmedir. Bir kere bu arızi zorluklar ortadan kaldırıldı mı geriye kalanlar daha küçükleri kalacak ve bunları yok etmekle elde edilecek fayda da kesinlikle daha az olacaktır.

Ada’nın etkinliği değerlendirildiğinde, şu andan itibaren 10 yıllık bir zaman zarfında, Ada’nın çok temelden bir fark yaratmış olacağının görüleceğini tahmin ediyorum, ama bu ne herhangi bir dil özelliğinden dolayı ne de hepsinin bir arada toplanmış olmasından dolayı olacaktır. Ne de yeni Ada ortamları, ilerlemelerin sebebi olduklarını kanıtlayabilecektir. Ada’nın en büyük katkısı , onu kullanmaya geçişin, programcıları, modern yazılım tasarımı tekniklerinde eğitilmesine sağlamasında olacaktır.

Nesne-merkezli programlama. Pek çok sanat öğrencisi nesne-merkezli programlama için,  günümüzün teknik modalarından daha çok umut beslemektedir.[2] Ben de onlardan biriyim. Dartmouth’dan Mark Sherman’ın CSNet News’da belirttiği gibi aynı isimle bahsedilen iki farklı kavram ayırt edilmelidir: soyut veri tipleri ve hiyerarşik tipler. Soyut veri tipi kavramı, nesnenin tipinin, aslında saklı olması gereken bellekteki yapısıyla değil de bir isim, uygun bir değerler kümesi ve uygun bir işlemler kümesiyle tanımlanmasıdır. Örnekleri, Ada’nın  (private tipli) paketleri ile Modula’nın modulleridir.

Simula-67’nin sınıfları gibi hiyerarşik tipler ise, daha sonra sağlanacak alt tipler tarafından detaylandırılabilecek genel arayüzler tanımlamamıza izin verir. Bu iki kavram birbirinden bağımsızdır, saklama olmadan hiyerarşiler ya da hiyerarşiler olmadan saklama olabilir. İki kavram da, yazılım bina etme sanatında gerçek ilerlemeleri temsil etmektedirler.

Fakat yine de her biri, tasarımcıya, tasarımın aslını, hiç bir bilgi katkısı olmayan büyük miktarlarda sözdizimsel malzemeyi kullanmak zorunda olmadan ifade etmesine izin vererek, süreçten   bir diğer arızi zorluğu kaldırmaktadır. Hem soyut veri yapıları hem de hiyerarşik yapılar için sonuç, daha yüksek seviyeli bir arızi zorluğun kaldırılması ve tasarımın daha yüksek seviyeli ifadesine izin verilmesidir.

Yine de böyle ilerlemeler, tasarımın ifadesindeki bütün arızi zorlukları ortadan kaldırmadan daha fazlasını yapamaz. Tasarımın zorluğu aslidir ve böyle girişimler bunda hiçbir değişiklik yapamazlar. Eğer hala programlama dillimizde olan gereksiz tip tanımları, bir programı tasarlamada var olan işin onda dokuzunu oluşturuyorsa nesne-merkezli programlamayla on katlık bir ilerleme elde edilebilir. Ama bunda şüphem var.

Yapay Zeka. Pek çok kişi yapay zekadaki ilerlemelerin, yazılım üretiminde ve kalitesinde on katlık bir ilerleme sağlayacak bir gelişme çıkaracağını umuyor. Ben ise ummuyorum. Neden böyle olduğunu görmek için “yapay zeka”dan neyin kastedildiğini anlamamız lazım.

D. L. Parnas, yapay zeka konsundaki terminoloji karmaşasını giderdi: [4]

Günümüzde YZ’nin tamamen farklı iki tanımı yaygın kullanımdadır. YZ-1: Geçmişte sadece insan zekasını uygulayarak çözülebilen programların çözümü için bilgisayarların kullanılması. YZ-2: Deneysel ya da kural bazlı programlama olarak bilinen belli özel programlama tekniklerinin kullanılması. Bu yaklaşımda, uzmanların problem çözerken hangi başlıca deneysel yaklaşımları ya da kuralları kullandıkları incelenir… Program da insanların problemi çözdükleri gibi çözecek şekilde tasarlanır.

İlk tanımın kaygan bir anlamını vardır. Günümüzde bir şey YZ-1’in tanımı içerisine girebilir ama programın nasıl çalıştığını ve problemi anladığımızda onu artık YZ olarak düşünmeyiz. Malesef sadece bu alana has hiçbir teknoloji düşünemiyorum. İşin çoğu probleme özgüdür ve onu taşımak için bir miktar soyutlama  ve yaratıcılık gereklidir.

Yukarıdaki değerlendirmeye tamamen katılıyorum. Konuşma tanımadaki teknikler, resim tanımlamada kullanılanlarla çok az ortak noktaya sahiptir ve ikisi de uzman sistemlerde kullanılanlardan farklıdır. Resim tanımanın programlama pratiğinde nasıl bir fark yaratacağını görmede zorlanmaktayım. Aynı problem konuşma tanımada için de geçerlidir. Yazılım geliştirmede zor olan şey ne istediğine karar vermektir, onu söylemek değil. İfade etmeyi kolaylaştıran hiçbir şey önemsiz kazanımlardan fazla birşey veremez.

Uzman sistemler teknolojisi, YZ-2, kendisi için ayrı bir yeri haketmektedir.

Uzman sistemler. Yapayy zekanın en ileri ve en çok uygulanan kısmı, uzman sistemleri geliştirmedeki teknolojidir. Pek çok yazılım bilimcisi, bu teknolojiyi yazılım geliştirme ortamlarına uygulamada zorluk çekmektedir. [3,5] Kavram nedir ve ihtimaller nelerdir?

(Bu kısımın çevirisi sonra tamamlanacaktır.)

Otomatik programlama. 40 yıldır insanlar “otomatik programlama”, ya da problem tarifindeki bir ifadeden problemi çözmek için program üretilmesini beklemekte ve hakkında yazmaktadır. Bazıları bugünlerde, bu teknolojinin bir sonraki devrimi yaratacağını umarmış gibi yazmaktalar. [5]

(Bu kısımın çevirisi sonra tamamlanacaktır.)

İhtiyaçların detaylandırılması ve hızlı prototip geliştirme. Bir yazılım sistemi geliştirmenin en zor olan kısmı, ne geliştireceğinize kesin olarak karar vermektir. Kavramsal olan böyle bir işin diğer hiçbir kısmı, detaylı teknik ihtiyaçları, bütün kullanıcılara, makinalara ve diğer yazılım sistemlerine olan arayüzleri de dahil olacak şekilde, belirlemek kadar zor olamaz. Diğer hiçbir kısmı, yanlış yapıldığında, üretilen sisteme bu kadar zarar vermez. Diğer hiçbir kısmın daha sonradan düzeltilmesi, bu kadar zor olmaz.

(Geri kalanın çevirisi sonra tamamlanacaktır.)

Bu yazı toplam 1493 defa görüntülenmiştir.