Yazılımın Mühendisliği: Şaşırtıcı Bir Çelişki
C. A. R. Hoare
The Queen's University of Belfast
Belfast, Kuzey İrlanda
"Bu kadar özensiz temeller üzerine bir yazılım mühendisliği disiplini kurma girişimi, kimya mühendisliğini flojiston kuramına ya da astronomiyi dünyanın düz olduğu varsayımına dayandırmaya çalışmak gibi, kuşkusuz başarısızlığa mahkûmdur."
İdeallerin Karşılaştırılması
Eğer sözcükler programlama mesleğimizin dertlerine çare olabilseydi, bugün ne kadar sağlıklı ve saygın bir meslek olurduk! “Modüler programlama”yı yaşadık; “yapılandırılmış programlama” çılgınlığı ticari kârlılığının zirvesine henüz ulaşmış sayılmaz; ve şimdiden listelere yeni bir girişimiz var — hepimizin uzun zamandır beklediği tema — evet, bu “YAZILIM MÜHENDİSLİĞİ”.
Deneyimli programcı bu sevindirici haberi bastırılmış bir esneme ile karşılayacak ve daha acil ve önemli işlere yönelecektir. Ancak belki de popülerlikten unutulmaya doğru yol alırken bu sloganlardan öğrenebileceği bir şeyler vardır. Kuşkusuz, yeni ama şimdiden parlaklığını yitirmiş “yazılım” sözcüğünün, eski ve saygın mühendislik mesleğiyle birleştirilmesi o kadar şaşırtıcı bir çelişkidir ki, bizi durup düşünmeye sevk etmelidir. Profesyonel mühendisin ideallerini, günümüzün bazı programcıları tarafından benimsenenlerle karşılaştıralım.
Yetenek ve Anlayış
Doktor, mimar ya da mühendis olsun, profesyonel kişinin öne çıkan bir özelliği, müşterisinin ya da işvereninin gerçek gereksinimlerini, çoğu zaman müşterinin kendisinden çok daha iyi anlamasıdır; ayrıca müşteriyi kendi çıkarlarını fark etmeye ve daha az yararlı hayal uçuşlarından vazgeçmeye ikna edecek yeteneğe ve statüye sahiptir.
Mesleki Dürüstlük
Bunun ardından, bilinen ve güvenilen teknikler arasından, verilen koşullarda gerekli etkiyi müşteriye en düşük maliyet ve rahatsızlıkla sağlayacak yöntemleri önerecek mesleki beceriye sahiptir. Ve son olarak, önerileri kabul edilmezse görevinden veya aldığı işten ayrılacak mesleki dürüstlüğe sahiptir.
Tavsiye Dikkate Alınmadığında İstifa
Ne yazık ki, bazı programcılarla bunun hüzünlü bir karşıtlığını görüyorum; onların tek isteği, müşterilerinin “ne istediğine karar vermesi”dir ve en ayrıntılı hayallerini bile programlama ustalıkları için bir meydan okuma olarak memnuniyetle karşılarlar. Kaçı, başkaları tarafından başarıyla kullanılan bilinen tekniklerden habersizdir ya da bunları görmezden gelmeyi tercih eder ve kendi kusurlu tasarımlarının alelacele uygulanmasına girişir? Ve teknik açıdan daha az yetkin yöneticisi tarafından tavsiyesi dikkate alınmadığında derhal istifa eden yalnızca bir programcı tanıyorum.
British Computer Society tarafından yayımlanan ve Aralık 1975 tarihli Computer Bulletin’de yer alan bir makaleye dayanarak, izinle yeniden basılmıştır.
Maliyetleri Azaltmak ve Güvenilirliği Artırmak
İyi mühendisin ikinci bir özelliği, ürününün maliyetlerini azaltmak ve güvenilirliğini artırmak için her fırsatı dikkatle kollamasıdır. Bu iki hedef arasındaki çatışmanın ancak kavramın, belirtimin, tasarımın ve uygulamanın en üst düzeyde sadeliği korunarak çözülebileceğini bilir. Her şeyden önce, projesinin her yönü üzerinde tam bir anlayış ve denetime sahip olmakta ısrar eder; projesi ne kadar zorsa, ne yaptığını anlayabilmesi için gerekli olan sadelik konusunda o kadar kararlı olur.
Burada da, bazı en iyi programcılarımızda bunun tam tersini görüyoruz; bunlar bilinçli olarak basitleştirilmiş çözümlerden kaçınırlar, tasarımlarının ve yöntemlerinin karmaşıklığından tatmin duyarlar ve anlama ve denetleme yeteneklerinin biraz ötesinde bir karmaşıklığa sahip projelere girişmekten heyecan duyarlar. Bir kez başarılı olabilirler; ancak bir sonraki seferde, neyin biraz, neyin tamamen kavrayışlarının ötesinde olduğunu (önceden) ayırt etmenin bir yolu olmadığını fark edebilirler.
Sağlam Kuramlar ve Teknikler …
Günümüz mühendisinin büyük bir avantajı, tasarımlarının, yıllar boyunca parlak öncülleri tarafından keşfedilmiş ve bugün ders kitaplarında ve lisans eğitiminde, matematik tablolarında ve standart uygulama kurallarında yerini almış sağlam matematiksel kuramlara ve hesaplama tekniklerine dayanmasıdır. Ancak kuramının sağlamlığına rağmen, soyutlamalarının (ve ürününün) arızalanabileceğine dair hâlâ pek çok endişe kaynağı vardır — hatalı bir döküm, kusurlu bir bileşen partisi, ihmalkâr bir işçi ya da öngörülemeyen bir doğal tehlike.
Bilgisayar programcısının bu türden kaygıları azdır: çalışma malzemesi bilgisayarın donanımının kendisidir ve bunun güvenilirliği genellikle varsayılabilir. Kuşkusuz, yazılımdaki arızaların en önemli nedeni, büyük farkla, programcının kendi hataları ve gözden kaçırmalarıdır. Ancak burada belki de bütünüyle suçlanamaz; çünkü yaygın olarak kabul edilmiş bir matematiksel ya da kuramsal temele sahip değildir.
(Lütfen sayfa 18’e bakınız.)
Araçlarda Ustalık
Son bir karşıtlık noktası, mesleğin çalışma araçlarında yatmaktadır. Bir mühendis, araçlarından doğal olarak en yüksek kalite ve hassasiyeti, güvenilirliği, kullanım kolaylığını ve kullanımda düşük maliyeti talep eder. Bazı mesleklerde araçlar oldukça basittir; bazılarında ise daha karmaşıktır. Ancak her iki durumda da mühendis, araçlarının doğru kullanımına ilişkin sezgisel bir anlayış ve yerleşmiş bir ustalık geliştirmiştir; bu da onun tüm zihinsel çabasını müşterilerinin sorunlarını anlamaya ve çözmeye ayırmasını sağlar.
Programcının temel araçları; programlama dilleri ve derleyiciler, iş denetim dilleri ve işletim sistemleri, yardımcı programlar ve bilgisayar üreticisi tarafından bol miktarda sağlanan diğer yazılımlardır. Ancak bunlar, diğer mesleklerin araçlarıyla karşılaştırıldığında ne kadar da içler acısıdır! Güvenilmez oldukları, bilgisayar zamanı ve depolama alanını savurganca tükettikleri, kullanımda elverişsiz oldukları—bunlar uzun zamandır bilinen ve yaygın biçimde katlanılan gerçeklerdir.
Karmaşıklık
Belki de en kötü belirti (ve aynı zamanda sorunun büyük bir bölümünün nedeni), kullanıcı ve tasarımcının kavrayışını bütünüyle aşan olağanüstü ve giderek artan karmaşıklıklarıdır. Üreticilerin yazılımları arasında, bilgisayar çağının en kötü mühendislik ürünü olması gereken şeylere rastlamak mümkündür. Bunların ücretsiz verilmesine şaşmamalı—ve alıcı için ne kadar pahalı bir armağan oldukları da açıktır!
Güç Kılığında
Buna rağmen, bazı deneyimli programcılar ve yöneticiler bu tür yazılımları gerçekten memnuniyetle karşılamakta, övmekte, daha fazlasını istemekte ve hatta bunlar için para ödemektedir. Burada belki de ölümcül çekicilik, herhangi bir mühendisin içgüdülerini isyan ettirecek olan karmaşıklığın ta kendisidir; ancak bu karmaşıklık, zeki programcıya güç ve incelik kılığında görünmektedir.
Daha da az takdire değer güdüleri olabilir: güvenilmez araçların kullanımı, hem programlarının güvenilmezliğini artırır hem de mazur gösterir; verimsiz araçların kullanımı, hem programlarının verimsizliğini artırır hem de mazur gösterir; araçlarının karmaşıklığı ise onu müşterisinin ya da işvereninin yakından incelemesinden veya denetiminden koruyabilir.
Sürekliliğe Yol Açması
Ve son olarak, belirli bir ürünle birkaç yıllık deneyimden sonra, programcı bu ürüne dair kısmi anlayışının bile yüksek bir maaş getirebildiğini fark eder; bu da ona yeni bir şey öğrenmeyi reddetmek ve bunun bir iyileştirme olabileceği fikrini geri çevirmek için en güçlü güdüyü sağlar. Yıllar önce o ürüne bağlanan yöneticisi ise, onun sürdürülmesinde daha da güçlü bir kişisel ve mali çıkara sahiptir.
Yazılım Mühendisliği Disiplini
Böylesine dayanıksız temeller üzerine bir yazılım mühendisliği disiplini kurma girişimi, kimya mühendisliğini flogiston kuramına ya da astronomiyi dünyanın düz olduğu varsayımına dayandırmaya çalışmak gibi, kuşkusuz başarısızlığa mahkûmdur. Ancak üretici yazılımlarının incelenmesi, yazılım mühendisliğinin ilkelerini anlamamızı keskinleştirmek için mükemmel bir yoldur; hem bu ilkeleri tutarlı biçimde ihlal etmeleri nedeniyle hem de yazılım mühendisinin çalışma araçlarını tanımlamak için ciddi ve takdire değer bir çaba göstermeleri nedeniyle.
İyimser, pratik ve geleceğe dönük bir yaklaşım benimsemek önemlidir. Mevcut araçların daha etkili biçimde kullanılabileceği pek çok yol vardır—ek yazılım paketlerinin benimsenmesiyle, ölçümleme ve ayarlama yoluyla, program editörleri ve önişlemcilerle, yapılandırılmış programlama yardımcılarıyla, eğitim kılavuzları ve kurslarla ve programlama uygulama standartlarıyla. Pratik kullanım için hemen erişilebilir yöntemler yelpazesini gözden geçirmek ve biraz daha ileriye bakarak, temel ve uygulamalı araştırmaların şimdi açmakta olduğu daha ileri iyileştirme olanaklarından bazılarını betimlemek arzu edilir.
Değişimin pratik güçlükleri yeni araştırma sonuçlarının yaygın uygulanmasını geciktirse bile, programcıların ve yöneticilerin bunların neler olduğunu şimdiden anlamaları önemlidir; böylece bir daha asla sofistikelik ve karmaşıklığın aldatıcı vaadiyle yanlış yola sürüklenmezler.
Kanıt?
Yazılım mühendisliği teması üzerine bu kısa vaazda, yazılımın kalitesine ve programcıların yetkinliğine, zekâsına ve dürüstlüğüne karşı birçok iddiada bulundum. Ancak tezimi destekleyecek tek bir örnek vermedim ve tek bir isim dahi anmadım. Bunu şimdi yapayım: Suçlu kişiyi adlandırıyorum: Kendimi adlandırıyorum.
Kendi içimde, genel olarak programcılara atfettiğim tüm kusurları keşfettim. Sözlerim herhangi bir inandırıcılık taşıyorsa, bu ancak okurumun da benzer bir keşif yapmış olmasındandır.