Yazılım neden vardır sorusu sorulduğunda, benim aklıma gelen ve benim için en anlamlı cevap yazılımın müşterinin gereksinimlerini tatmin etmek için var olduğudur. Müşteri piyasa ihtiyaçlarından doğan gereksinimlerini tatmin etmek ya da piyasa rekabetinde avantaj sağlamak için yazılıma yönelir. Yazılım müşterinin piyasa şartlarında ayakta kalkmak için kullanacağı en kıymetli araç haline gelebilir. Sektörüne göre yazılım olmadan bir firmanın piyasa işlevini yerine getiremediğini, rakiplerine yenik düştüğünü ve yök olduğunu ya da yetersiz yazılım yüzünden yok olma riski ile karşılaştığına tanık olmak mümkündür.
Yazılımın artık çok kıymetli bir konumda olduğu konusunda hemfikir olduğumuzu düşünüyorum. Böyle bir ihtiyacın olması yazılım sektörünün temelini oluşturuyor. Firmalar ihtiyaçları doğrultusunda ya kendi yazılım takımlarını oluşturuyorlar ya da mevcut yazılım ürünlerini satın olarak bu konudaki ihiyaçlarını tatmin etmeye çalışıyorlar.
Burada yapı olarak çok değişik iki dünyanın karşı karşıya geldiğini görmekteyiz. Bir tarafta çok hızlı değişen piyasa koşulları neticesinde oluşan yeni müşteri gereksinimleri, diğer tarafta o kadar çok da hızlı müşteri gereksinimlerine adapte olmayan yazılım ürün/ürünleri. Müşteri bulunduğu piyasada önde gidebilmek için kullandığı yazılım ürününde hızlıca değişiklik yapılmasını talep edecektir. Lakin yazılımdaki en büyük problemlerden birinin bu noktada oluştuğuna tanık olmaktayız. Ne yazık ki kurumsal çerçevede geliştirilen yazılım ürünlerde istenilen değişikliklerin rekabetin önünü açacak hızda yapılamadığını görmekteyiz. Bunun başlıca sebebi yazılımda silolaşmaya gidilmesidir.
Günümüzde yazılım değişik vasıflara sahip grupların birlikte çalışarak yerine getirilen bir aktivitedir. Yazılımcılar kod yazmaktan, testçiler bu kodu test etmekten, oplar yazılan ve test edilen kodu canlıya almaktan sorumludur. Sadece bir önceki cümle içinde bile üç değişik meslek gurubunun adı geçti. Bunlara analizcileri, proje yöneticilerini ve ürün sahiplerini de eklersek, aslında çok değişik nitelikteki insanların bir araya gelerek, yazılım oluşturduklarını görmekteyiz. Ama bu gerçekten böyle olmak zorunda mıdır? Asıl sıkıntılar buradan kaynaklanıyor olabilir mi? Neden yazılım silolardan oluşan değişik ekiplerin elinden geçerek, oluşmak zorunda?
Yazılımla uğraşan herkes bilir. Yazılımcı ekibi yazdıkları kodun canlıya alınmasından, canlıyı (production) koruyup, kollayan op ya da admin ekibi de yazılımdan bihaberdir. Op ya da adminler her zaman canlının canlı kalması için ellerinden gelen her türlü işlemi yaparlar ve yeni yazılım ürünleri ya da mevcut yazılım ürünlerinin yeni sürümlerini canlıya almak için kırk dereden su getirirler. Onların uzun checklisteleri vardır. Bu listeler canlıyı korumak amacılıdır lakin hem yazılımcıları canlarından bezdirirler hem de değişikliklerin hızlıca canlıya alınmasını engellerler. Bu sadece op ya da adminlerle sınırlı bir durum değildir. Yazılıma yeni bir özelliğin eklenip, canlıya alınması aylar sürebilmektedir. İş ne yazık ki değişik silolarda çalışan değişik nitelikteki çalışanların tüm resmi göremeyerek, sadece kendi siloları bünyesindeki çalışmalara odaklanmalarından dolayı uzayaip gider.
Durumu kısaca özetleyecek olursak… Bir tarafta hzli değişeçen piyasa koşullarına adapta olmak isteyen müşteri ve yazılımdan olan beklentileri, diğer tarafta değişik silolarda organize olmaya çalışan ve yeterli hızda müşteri isteklerine cevap veremeyen yazılım ekipleri. Burada kaybeden kimdir? Her iki taraf da!
Yazılım sektörü ve camiası uzun bir süredir problemin farkında ve yer yer çözüm üretmeye çalışıyor. Bu çözümlerden birisi DevOps olarak bilinen akım. DevOps benim tanımıma göre yazılımı yapan, canlıda işleten ve her türlü yetki ve sorumluluğa sahip yazılımcıdır. Lakin yine bu konuda da işin sulandırılması sağlanmış ve yazılımcı ekibine gerekli tüm yetki ve sorumluluk verileceği yerde, op ve adminlerin biraz yazılımdan anlayacak ve gidişata destek olacak şekilde yeniden konuşlandırılması sağlanmış ve silo düşüncesine sağdık kalınması yeğlenmiştir. Hala hazırda birçok kurumsal altyapıda devopsları, testçileri ve yazılımcıları beraber çalışır durumda görmek mümkündür. Bir şekilde, yazılım sistemini oluşturan yazılımcıların aynı zamanda canlı için sorumluluk taşıyabilecekleri ve bu görevi yerine getirebilecekleri inancı hala oluşmamıştır. Bunun sebebi nedir?
Bunun başlıca sebebi yöneticilerin yazılımın nasıl işlediğinden bihaber olmaları ve yazılım için gerekli organizasyonel yapıyı oluştururken klasik kurumsal kadrolaşma ve iş yapma şablonlarından faydalanmalarıdır. Klasik organizasyonel yapılarda birileri bir ürünü oluşturur, birileri gerekli tasarımı yapar, birileri kalite konotrulünden sorumludur ve birileri de bu ürünleri pazarlar. Roller ve iş tanımları birbirlerinden keskin bir şekilde ayrıdır ve herkesin görevi detaylı olarak tanımlıdır. Lakin bir yazılım ürünü söz konusu olduğunda, ürünün pazarlanması haricinde gerekli tüm işlerin yazılımcılar tarafından yapılabileceğini söyleyebiliriz. Bunun en güzel örneğini Extreme Programming gibi gerçek çevik yazılım metotlarının uygulandığı projelerde görmek mümkündür. Böyle birçok projede yazılımcı olarak çalışmış birisi olarak söyleyebilirim ki gerçek bir çevik süreç içinde yazılımcılar her türlü sorumluluğu üstlenebilirler ve doğru olan zaten budur.
Klasik iş ayrımı verimliliği artırmak ve vasıf bazlı ücretlendirmeyi mümkün kılmak için kapitalizmin oluşturduğu bir prensiptir. Örneğin klasik bir fabrika üretiminde bant üzerinde oluşan ürün kademeli olarak değişik ellerden geçer. Ürünün oluşumuna katkı sağlayan her el belli bir vasfa sahiptir ve çok hızlı bir şekilde kendi üzerine düşen görevi yerine getirir. Eğer ürüne dokunan el gerekli vasfa sahip değilse, ürünün oluşturulma süreci uzar ve bu maliyeti artırır. Bu yüzden vasıflar silolar bünyesinde gruplaştırılır ve ürün üzerinde iş gücü olarak uygulanır. Seri şekilde üretim yapıldığı sürece bu tarz bir iş gücü organizasyonunun faydalı olduğunu söyleyebiliriz. Lakin nasıl bir ürünün ortaya çıkacağı belli olmayan durumlarda, bu silolaşma ne yazık ki iş koordinasyonu, bilgi ve vasıf yetersizliği ve tüm resmi görememe gibi durumlardan ötürü istenilen sonucun sağlanması konusunda yetersiz kalmaktadırlar. Bunun ispatını günümüzde uygulanan bilimum yazılım projelerinde görmek mümkündür.
Yazılım endüstrisinin yaptığı işten verim almak için ihtiyaç duyduduğu tüm araç, gereç ve metodolojiler gözünün önünde durmaktadır, lakin bunları kullanmak yerine nedendir bilinmez, iş gücünü silolaşmaya götürmekte inat etmektedir. Extreme Programming gibi çevik süreçler yazılımın nasıl yapılması gerektiği konusunda gerekli tüm metotları ihtiva etmektedirler lakin sahip oldukları inovasyon gücü göz ardı edilmektedir.
Çevik süreçlerde bilimum sorumluluk yazılım ekibindedir. Yazılım ekibi müşteriye kulak verir, gerekli yazılımı yapar ve çok kısa aralıklarla oluşan yazılım ürününü müşteriye gösterek, geri bildirim sağlar. Bu geri bildirim ile istikametini belirler. Kendisi yazar, kendisi test eder, kendisi canlıya alır ve kendisi hataları giderir. Google Site Reliability Engineering ismi altında bu prensibi uygulamaktadır. Google yazılım ürünlerinde bütün işi çekip, çeviren yazılımcılardan oluşan takımlardır.
Yazılım endüstrisi kör değil. O da gidişatın doğru olmadığının farkında ve DevOps gibi yerinde ama uygulanışı absürd olan yöntemler geliştirilmekte. Yazılımdan anlamayan sistem adminlerini birkaç günlük bulut eğitimlerine göndererek, onların DevOps olması sağlanamaz. DevOps ile kasıt, canlı ile arasında hiçbir engel kalmamış ve canlının sorumluluğnu da üstlenmiş, yani bu işi a dan z ye yapabilen yazılımcılardır. Bunu anlaması neden bu kadar zordur? Karşımızda bu işin üniversitede eğitimini almış ve her türlü mühendislik çözümü üretebilen yüksek vasıflı yazılım ve bilgisayar mühendisleri durmaktadır. Onları bir kenara koyup, “siz sadece kod yazın” demek, yaşadığımız sorumların başlıca nedenidir.
Özcan Acar
EOF (End Of Fun)