İlk iki yazıda bu işin cefakar emekçileri sistemcilerin dünyasına hızlıca daldıktan sonra bugün sırada sektörün delileri yazılımcılar var. Bakalım bu amcalar-ablalar ne gibi şeylerle uğraşıyor, insanları delirtmek adına neler yapıyorlar.
YAZILIM
Yazılım alanında;
• Yazılım Mühendisi – Coder – Developer (Web, Mobil, Front-End, Back-End vb.)
• Yazılım Ekip Lideri
• Teknik Yazar
• Kalite – Test Mühendisi
ve
• Tasarımcı
olmak üzere toplam 5 ana rolden bahsedeceğim. Hemen hızlıca bunlardan ilki olan Yazılım Mühendisiyle başlayalım.
Yazılım Mühendisi
Öncelikle yazılım mühendisini anlatabilmek için yazılım nedir sorusuna cevap vermek gerekiyor. Bu kısmı direk Wikipedia’dan aldım. Wikipedia der ki;
Yazılım, değişik ve çeşitli görevler yapma amaçlı tasarlanmış elektronik aygıtların birbirleriyle haberleşebilmesini ve uyumunu sağlayarak görevlerini ya da kullanılabilirliklerini geliştirmeye yarayan makine komutlarıdır.
Yazılım, elektronik aygıtların belirli bir işi yapmasını sağlayan programların tümüne verilen isimdir. Bir başka deyişle, var olan bir problemi çözmek amacıyla bilgisayar dili kullanılarak oluşturulmuş anlamlı anlatımlar bütünüdür. Yazılım için çeşitli diller mevcuttur. Bunlardan bazıları Pascal, C++ ve Java’dır. Bilgisayar yazılımları genel olarak 3 ana grupta incelenebilir. Bunlar:
1- Sistem Yazılımları (System Software): Bilgisayarın kendisinin işletilmesini sağlayan, işletim sistemi, derleyiciler (compilers) (Yazılım programında, yazılan programı makine diline çeviren program), çeşitli donatılar (facility) gibi yazılımlardır.
2- Uygulama Yazılımları (Application Software): Bu kullanıcıların işlerine çözüm sağlayan örneğin çek, senet, stok kontrol, bordro, kütüphane kayıtlarını tutan programlar, bankalardaki müşterilerin para hesaplarını tutan programlar vs. gibi yazılımlardır.
Bütün sistem programları içinde en temel yazılım işletim sistemidir ki, bilgisayarın bütün donanım ve yazılım kaynaklarını kontrol ettiği gibi, kullanıcılara ait uygulama yazılımlarının da çalıştırılmalarını ve denetlenmelerini sağlar.
3- Çevirici Yazılımlar: Herhangi bir dilde yazılan programı makine diline çeviren yazılımlardır
Wikipedia yazılımı böyle tanımlıyor. Bu işin formel kısmı oldu. Biz insanların anlayacağı şekilde tercüme edersek yazılım dediğimiz şey üzerinde koştuğu makinenin anlamlı işler yapmasını sağlayan kod bütününe verilen isimdir. Bugün kullandığınız cep telefonundan, bilgisayara, bankadaki atm cihazından, televizyonunuza kadar her türlü elektronik cihaz, işlevini bu yazılımlar sayesinde gerçekleştirir. Örneğin televizyon kumandasıyla kanal değiştirmek için tuşa bastığınız zaman o cihaz içindeki yazılım sayesinde bunu başarırsınız. Bilgisayarınızı açtınız karşınıza çıkan işletim sistemi bir yazılımdır. O işletim sistemi içindeki hesap makinesi uygulaması bir yazılımdır. Cep telefonunuzda oynadığınız Candy Crush bir yazılımdır. Cnc tezgahlarını yöneten bir yazılımdır. İşte bu yazılımları oluşturan insanlara programcı, coder, developer ya da yazılım mühendisi diyoruz. Bu insanlar tek başlarına çalışıp bir uygulama geliştirebildikleri gibi toplu halde çalışarak daha karmaşık uygulamaları da kodlayabilirler. Karmaşık yapıları tasarlarken iş küçük parçalara bölünür ve her işi bir yazılımcı tarafından halledilir ve sonra kod bir arada derlenerek uygulama ortaya çıkar. Peki bu adamlar bu işi nasıl yaparlar? Öncelikle az önce Wikipedia’dan tanımını aktarırken yazılım için çeşitli diller mevcuttur cümlesini kurduk. Programlama dili olarak da bilinen yazılım dili programcının sistemde çalışacak uygulamasının neler yapabileceğini söyleme yönetimidir. Biraz karmaşık oldu ama aslında programla dili aynen dünya üzerinde gündelik hayatta kullandığımız Türkçe, İngilizce ya da Almanca gibidir. Dil nasıl ki insanlar arasında iletişim kurmayı sağlar, programlama dili de makine ile iletişim kurmamızı sağlar ve ona nasıl davranması gerektiğini söyler. İşte yazılımlar bu diller kullanılarak oluşturulur. Adı o yüzden yazılımdır, yazmaktan gelir. Çünkü bir uygulama oluşturmak demek aslında onun kodunu yazmaktır. Aynen bir roman yazar gibi alt alta bir sürü kod yazılır, makineye ne durumda nasıl davranması gerektiği söylenir ve daha sonra bu kod derlenerek uygulama haline getirilir. Şimdi basit bir örneğe göz atalım.
Bu üstteki Java dilinde yazılmış, adet olmuş şekilde programcıların ilk yazdığı program olan “Hello World” yani merhaba dünya programı. Toplam 6 satırdan oluşuyor ve bu kod derlenip bir uygulama haline getirilip çalıştırıldığında ekrana Hello World yazıyor. Yani bu uygulamanın amacı ekranda Hello World mesajının çıkması.
İkinci bir örneğe bakalım. Bu sefer dilimiz Scala. resim ikinci kısmındaki de üst kısımdaki uygulamanın aynısı. Ekrana Hello World yazıyor. Fakat bu sefer scala dilinde yazılmış. Gördüğünüz gibi aynen bizim kullandığımız diller gibi farklı farklı. Biz su diyoruz İngilizler water diyor alman wasser diyor ama hepimiz sonuçta aynı şeyi söylüyoruz. İşte yazılım dilleri de böyle. Hepsinin amacı sonuçta üstünde koştuğu makinenin anlayacağı şekliyle ona komutlar vermek.
Neden böyle ayrı ayrı diller var derseniz aslında hepsi aynı işi yapıyor olsa da farklı platformlar için tasarlanmıştır. Kimini Windows platformuna uygulama yazarken kullanırken, bir diğerini Apple iPhone telefonlara uygulama yazarken kullanabilirsiniz. Kimi diller bilimsel araştırmalar yaparken daha rahat kullanılabilirken, kimi sadece web uygulamaları yazmak için oluşturulmuştur. Peki bir yazılımcı bütün dilleri bilmeli midir? Tabi ki bu mümkün değil fakat yazılımcılar çalıştıkları platforma göre o platformda hangi uygulama yazacaklarsa onun dilini iyi bilmelidir. Daha sonra başka bir platformda yazılım geliştirecek ve başka bir dil öğrenmesi gerecekse bunu kolaylıkla yapabilir. Çünkü yazılımda esas olan dil değil yazılım terminolojisinin bilinmesi, algoritma mantığının ve süreçlerin içselleştirilmesi gerekir. Diller arası geçiş bu temele sahip insanlar için zor değildir. Son bir şey daha anlatıp yazılımcı ne işe yapara biraz değinecek ve sonraki role geçeceğim. Az önce yazılımı tanımlarken derlemek diye bir kelime kullandım. Peki nedir bu derlemek? Öz önce gördüğünüz üzere yazılım dediğimiz şey alt alta yazılan birçok kelimeden oluşan şiir gibi bir şey. Fakat bunu yazdık bitirdik diyelim, nasıl oluyor da bu Windows’ta çift tıkladığınızda çalışan bir uygulamaya ya da cep telefonunuzda tıklayıp açtığınız bir oyuna ya da bir web sayfasına dönüşüyor. Bu uygulamaların içine açsak alt alta bu yazıları mı göreceğiz? Hayır arkadaşlar. Bu yazılı kodun paketlenip bir uygulama haline getirilmesine derlemek deniliyor. Her kodun yazıldığı platforma göre çalıştırılabilir bir uygulama haline getirilmesi işlemine o kodun derlenmesi deniyor. Yazılımcılar bu uygulamayı bu şekilde yazıp daha sonra derleyici dediğimiz araçlarla platformda çalışacak şekilde uygulama haline getirirler. Bu derleme işlemi yazılan kodun platformun anlayacağı daha düşük seviye makine kodu haline getirilmesi işlemidir.
İşte arkadaşlar yazılım mühendisi dediğimiz insanlar uygulamaları fikir aşamasından son derlenmiş aşamaya kadar getiren ve onun kodunu yazan insanlardır. En azından bir programlama diline hâkim olmaları gerekir ama bundan da öte bir yazılımcı olabilmek için üzerine uygulama yazacağı platformun çalışma prensibini, neyin nasıl olduğunu bilmesi gereklidir. Ve hepsinden önemlisi yazılım mühendisinin dilden de ziyade yazılım temeline, kod yazmaktan çok o kodun algoritmasını oluşturabilme yeteneğine sahip olması gerekir. Karmaşık bir iştir ve açıkçası herkese göre değildir. Matematik zekâ gerektir. Uzun uğraşlar sonucu tecrübe kazanabileceğiniz bir alandır. Zahmetlidir, o nedenle az bulunur, talebi yüksek, görece getirisi de yüksek bir meslektir.
Evet böylece yazılım mühendisi rolünün de sonuna geldik fakat bitirmeden önce yazılım mühendisliği ile ilgili bir konudan daha bahsetmek istiyorum. Yazılım mühendisleri kullandıkları dillere göre alt kategorilere ayrılırlar fakat bundan da daha ziyade üzerine kod geliştirdikleri sistemlere göre alt kırılımları mevcuttur. Örneğin Android cep telefonlarına uygulama geliştiren bir yazılımcı mobile developer ya da android developer olarak anılırken, web servislerinin kullanıcının kullandığı ön yüzünü geliştiren developerlara front-end developer, arka tarafta çalışan servisleri geliştirenlere back-end developer denir. Artık en basitinden bir web sitesinin bile arkasında onlarca değişik kod dönmesinden ve yapının tek kişi tarafından oluşturulmasının mümkün olmamasından dolayı projeler birden fazla developer tarafından yazılır ve herkese çalıştığı sistemler üzerinde uzmanlaşma şansı çıkar. Bu nedenle sektörde artık direk developer şeklinde genel işler değil Windows developer, iphone developer, web developer gibi uzmanlaşmış işler bulunmaktadır. Ama özünde hepsi farklı sistemlerde aynı işi yapan developerlardır ve işin özü aynıdır. Yine lafı çok uzattık, hemen hızlıca yazılım ekip lideri rolüne geçelim.
Yazılım Ekip Lideri
Sistem kısmında sistem yöneticisini anlatırken sistem yöneticilerinin mühendislerden farkının işin mimari kısmına da dalan daha tecrübeli insanlar olması olduğunu söylemiştik. Aynı şekilde yazılım ekip liderleri de yazılım mühendislerinin mimariyle daha fazla haşır neşir olup daha tecrübeli olanına verilen isim. Ama burada yapının ve projenin büyüklüğüne göre yazılım ekip liderinin tanımı ve yaptığı işler değişmektedir. Hemen hızlıca bunu açıklayalım.
Yazılım mühendislerinin tek başlarına bir proje yapabilecekleri gibi daha karmaşık projelerde projenin küçük kısmıyla ilgilenip ekip halinde çalıştıklarından bahsetmiştik. Şimdi yeniden aytimenicir halı kilim tirevil şirketimize geri dönelim. Hatırlayacağınız üzere şirketi büyütmüş ve beraberinde birçok ihtiyacımız oluşmuştu. Bu ihtiyaçları hazır yazılmış paket programlar alıp sistemcilere altyapı kurdurup halletmiştik. Fakat şimdi web üzerinden satış yapmak için bir mağaza açmak istiyoruz ve hiçbir hazır çözüm bize uygun değil. Biz mevcut depo ve ödeme sistemlerimizle entegre çalışacak, satış ve muhasebe sistemlerimize de otomatik kayıt girecek bir web mağazası kurmak istiyoruz. Bu nedenle de sistemcilerin yanına bir de yazılım ekibi kuracağız. Bize, bu yazılım ekibinde ne gibi insanlar lazım? İlk olarak tabi ki de bu yazılımı yazacak, kodlayacak birileri lazım. Bunun için gidip bu işlerden anlayan yazılım mühendisleri bulduk. Fakat iş bununla bitmiyor. Bize bu işe öncü olacak biri daha lazım. Ne yapacak o biri? Öncelikle bizim ne istediğimizi anlayacak. Biz nasıl bir web mağazası istiyoruz? Daha sonra bizim bu isteğimizi nasıl kod haline getirebileceğimizin planını yapacak. Mimari olarak sistemin dizaynını yapıp temeli oluşturacak kodlamayı halledecek. Kullanacağımız yazılım altyapısını belirleyecek, ilişkili sistemlerle entegrasyon için gerekli altyapıyı sağlayacak. Diğer ekip üyelerine görevler atayacak ve onlara teknik liderlik yapacak. Peki biz bu insana yazılım ekip lideri mi diyoruz? Hayır. O zaman ben bir saattir ne anlatıyorum.
Arkadaşlar yapı ve kodlanan proje eğer büyük ise bu az önce saydığım işlerin hepsi için değişik insanlar var. Agile yani çevik yazılım yöntemlerinde “ki bugünün konusu değil”, bu dediğimiz işlere ayrı ayrı insanlar bakar. Product Owner dediğimiz adam gereksinimleri belirler, Scrum yönetimi çalışıyorsak görev dağıtımını ve önceliklendirmeyi Scrum Master dediğimiz adam çözer. Mimari bütün kararları Solution Architect dediğimiz insana emanet ederiz. Yazılım ekip lideri ise tüm bu adamlarla yazılım ekibi arasında tercüme görevini üstlenir, zor görevleri halleder, ekibe mentorluk yapar. Teknolojik olarak gidilmesi gereken yön konusunda söz sahibidir. Yeni ve ekip tarafından bilinmeyen teknolojileri araştırıp, uzmanlaşıp bilgi aktarımını sağlar. Fakat görece küçük projelerde yukarıda saydığımız tüm işleri de bu insan koordine eder. Tahmin edebileceğiniz üzere yazılım ekip lideri olabilmek için mimari ve teknolojik olarak tecrübeli olmak gerekir. Bu insanların işi çoğu zaman direk kod yazmak değildir fakat yine tahmin edebileceğiniz üzere kod kısmında da diğer tüm ekip üyelerinden iyi olmak durumundadır. Yeniliklere açık ve hızlı öğrenebilen bir insan olmalıdır. Ekiple işin teknik olmayan kısmında çalışan insanlar arasında koordinasyonu sağlaması gerekeceği için hem teknik olarak hem de işin iş kısmıyla ilgili tecrübeli ve bilgili olması gerekmektedir. Kısacası zor bir roldür ve mutlak tecrübe gerektirir diyelim ve vakit kaybetmeden bir sonraki rolümüze geçelim.
Kalite-Test Mühendisi
Kalite-Test mühendisi rolü aslında 2 tane birbirine oldukça benzeyen ama farklı roller. Bu benzerliklerinden dolayı ben bunları tek rol altında anlatacağım. Ayrıca birçok yapıda bu iki işe de ayrı ayrı insanlar tarafından değil de aynı ekip tarafından bakıldığı için birbirlerini ikame eden roller. Şimdi tekrar az önce başladığımız yazılım projesine geri dönelim. Firmaya bir web mağazası kuracaktık ve bunun için bir yazılım ekibi oluşturmuştuk. Bu yazılım ekibi ve diğer saydığım product owner, technical lead ve scrum master rolleri bir araya gelerek bu yazılımın nasıl olması gerektiğini belirleyerek yazmaya başlayacaklar. Sonunda ne istediğimiz belli. Bir web mağazası istiyoruz. Fakat biz bu projenin sonunda başarılı olup olmadığını nasıl anlayacağız? Yazılım ekibi bir web mağazası yaptı ama diyelim ki müşterinin ürün seçtikten sonra kredi kartıyla ödeme yapması için çıkacak ekran ortalama 3 dakika içerisinde geliyor. Bu projeyi başarılı sayabilir miyiz?
İşte bu tarz projenin sonunda projeden beklenmesi gereken belirli başlı yetenekleri belirleyip bunları bir standart haline getirerek proje boyunca bu standarda uyulmasını sağlayan insanlara kalite güvence mühendisleri diyoruz. Kaliteciler az önce örneklendirdiğim şekilde belirli başlı kalite standartları belirleyerek bu standardın tutturulup tutturulmadığını ölçerler. Bu ölçme işlemine de test diyoruz. Bu ölçme işi içinde birçok değişik araç kullanır ya da bu ölçme araçlarını kendileri yazarlar. Ve yazılım yaratım döngüsü içerisinde sürekli bu araçlarla kodun ve nihai ürünün belirlenen standartlara uyup uymadığını ölçerek kalitenin yakalanması sağlarlar. Test mühendisi bu ölçümleri yaparken, kalite mühendisi standartlarla ve ölçüm yapılacak altyapıyla uğraşır. Ama çoğu durumda bu iki iş de aynı kişiler tarafından gerçekleştirilir. Bunların dışında test mühendislerinin bir görevi daha vardır. İşin sadece performans olarak kalitesine değil aynı zamanda hatasızlığına da bakarlar. Projemize tekrar dönelim. Şirket için bir web mağazası açacaktık ve bunun arka planda tüm finans, ödeme, muhasebe ve depolama sistemlerine bağlantısını sağlayacaktık. Bu işin ne kadar karmaşık olabileceğini tahmin ediyorsunuzdur. Bu iş bir ekip tarafından yazılacak binlerce satır kod demek. İnsan hatasından planlama eksikliğine kadar sorun çıkartabilecek onlarca farklı durum olabilir. Proje adım adım üretilirken her adım sonunda o adımın düzgün çalışıp çalışmadığının ve istenilen işi yapıp yapmadığının da kontrol edilmesi, hata varsa düzeltilmesi gerekir. Test mühendislerinin bir görevi de projenin bu tarz hatalarını tespit ederek geri bildirim yapmak ve düzeltilmesini sağlamaktır.
Test ve kalite mühendisleri aslında az önce anlattığım işlerde uzmanlaşmış yazılım mühendisleridir. Yazılım mühendisleri gibi kodlamadan anlamaları gerekir çünkü uzun uzun anlattığım ama aslında koddan hataların ayıklanması ve düzeltilerek hatasız çalışan sistemler ortaya çıkartılması olarak özetleyebileceğim işi yaparlar. Bu da kodlama bilgisi olmadan mümkün değildir. Bunun yanında test ve kalite süreçlerinde kullanılan yöntem ve araçlara da hâkim olmalıdırlar. Hem yazılımcı hem de müşteri gibi düşünebilecek şekilde empati yetenekleri kuvvetli olmalıdır diyerek 3. Rolümüzün de sonuna geldik. Bir sonraki yazıda Tasarımcı rolüyle devam edeceğiz.