Mezun olmamın üzerinden beş sene geçmişken daha geçen gün diplomamı almak için lisans okulum olan İstanbul Üniversitesi Bilgisayar Mühendisliğinin Avcılar Kampüsüne gittim. Gencecik dimağlar kampüste oturmuş sabahın dokuzunda patsolarını yerken arkadaşımla gittiğim kampüsü gezip bir de bölümümüz hocalarının yanına gidip konuşunca o günler gözümde daha iyi canlandı ve bu konuyla ilgili bir blog yazısı yazmaya karar verdim. (Bu satırları yazmamın üzerinden uzun bir süre geçti ) Filmlerdeki geriye dönüş sahneleri gibi şu ana kadar yaşadıklarımdan edindiğim tecrübelerle o senelere gitsem neyi daha farklı yapmaya çalışırım sorusuna cevap niteliğinde bir yazı haline getirmeye niyetlendim. Yazı taslağı ve değineceğim konuları belirleyince bunun çokça anlatılan genel iletişim, sosyallik, proje yapma gibi klişeleşmiş konuların olacağı bir yazı olacağı için yazıyı yazmaktan vazgeçmiştim. Blog okurken şu yazıya denk gelince yazmaktan vazgeçtiğim konu ve bu yazıyı toparlayarak bir yazı hazırlamaya karar verdim. Bu uzun girizgahtan sonra hazırsanız yazıya geçiyoruz.
Kendimize yazılım geliştirici, yazılım uzmanı, geliştirici ya da yazılımcı her ne dersek diyelim günün sonunda yaptığımız iş bir yazılım üretmek oluyor. Kimi zaman var olan bir yazılıma küçük eklemeler yapıp; kimi zaman sıfırdan başlayarak bir yazılım ortaya çıkarabiliyoruz. Kimi zaman da doğrudan kod yazmasak da sistem, altyapı, donanımsal ya da teknik konularda çalışarak yazılımımızın daha iyi bir noktaya taşınması için çalışıyoruz. Eğer freelance bir çalışan değilseniz bu aşamaların çoğunda da bir takımın parçası, bir hiyerarşinin basamağı olarak çalışıyoruz. Bu yüzden yaptığımız tek işi kodlama olarak nitelemek eksik bir tanımlama olacaktır. Bu yazıda, yazılımcı eşittir kodlama şeklindeki eksik gördüğüm tanımlamayı başka hangi yetkinliklerle besleyebiliriz sorusuna kendimce cevaplar vermeye çalışacağım. Bu konuda yazılımcılar başta olmak üzere yazılım ile bir şekilde ilişkisi olan herkesin söyleyecekleri vardır mutlaka. Fikrini paylaşmak isteyenler yorumlar yazının daha iyi bir noktaya gelmesini sağlayabilirler. İyi bir yazılımcı olmak için teknik donanımın iyi olması gerektiğini ön kabul olarak bu yazıya devam edeceğim
Haydi maddelendirmeye başlayalım
Algoritmik Düşünme
Yazılım geliştiren bireyler olarak çoğu zaman en hızlı çözümü düşünerek sonuç odaklı çalışmalar yapmamız gerekebiliyor. Kısa vadede istenen çözüm bu olabilir ancak hızlı çözümlerin ya da kısa yolların başımıza iş açma ve sürprizleri sever bir yanı olduğunu da unutmayalım. Murphy’e selamlarımızı iletelim bu noktada. Ancak büyük sistemlerde ya da etki analizi büyük, kullanıcısı çok olan yani yazılım ekosistemindeki bir çok ürün için istenen şey ürünün stabil, oluşabilecek problemlerin ön görülerek önlemlerin alınması istenir. Bu sebeple yazılım geliştirirken yaptığımız değişikliklerin neleri etkileyeceği performanstan, sistemsel etkisine kadar her adımını tek tek düşünerek işlemlerimizi yapmalıyız. Algoritmik düşünme bir yazılım geliştirici için yazılım geliştirmeyi sadece kodlamanın ötesine taşıyan önemli özelliklerden birisi. Çok basit olacak ama indexleme ya da ilişkilendirme yapılmadan, zamanla tablonun tutacağı data düşünülmeden, veri tabanı mimarisine kafa yorulmadan hazırlanmış bir tablolar bütünü er geç sizi zorlayacak belki de başta kurgulamış olmaktan daha fazla vaktinizi alacaktır.
Kod okuma becerisi
Zamanla gelişecek olan bu beceri problem çözümü, önceden yazılmış olan kodların nasıl çalıştığını kavrama açısından oldukça önemlidir. Kimi zaman devraldığınız bir projenin önceki yazılımcısı gitmiş olabilir ya da tam aktarım almadan siz projeye dahil olmuş olabilirsiniz. Bu noktada kodun çalışma sürecini uçtan uca anlayabilmek için debug, Find All Reference vs. desteği ile beraber kodun nasıl bir süreç izlediğini anlayabilmek hayatımızı oldukça kolaylaştıracaktır. Önceki yazılımcının temiz kod yazmış olması sonraki yazılımcılara güzel bir miras olacaktır. Sektör içi dayanışma için temiz kod yazmaya çalışalım
Problem Çözme
Yazılım geliştiriciler olarak işimiz her zaman yeni bir yazılım üretmek olmuyor elbette. Yazıp üretim ortamına aldığımız projelerde problemler ortaya çıkabilir ya da var olan projelerde çıkan problemlere bakmamız gerekebilir. Problem çözme süreci başlı başına anlatılacak, üzerine çalışılacak bir konu bence. Süreci yönetme, problemin tespiti, problemin kritiklik ve aciliyeti, problemin düzeltilmesi ve üretim ortamına alınması.
Süreç Yönetimi
Aslında süreç yönetimine problem çözme alt başlığı altında değinmiştim. Ancak ayrı bir başlık olarak da eklemem gerektiğini düşünüyorum. Çoğunlukla yaşayan bir yazılım ürünü ya da yeni yeni yeşeren, yeni başlanmış projelerde çalışıyoruz. Bu projelerle ilgili yöneticilerinizin hedefleri, müşterilerin beklentileri, -büyük ölçekli bir proje ise – şirket planları, proje yönetimi ekiplerinin planlamaya uygun ilerlemesi ve kendinizin yazılımcı olarak tatmin olma beklentileriniz oluyor. Tüm ürün oluşturma sürecindeki yazılımcı dışındaki analist, testi yapan, Önyüz geliştirici, kabul testlerini yapan müşteri tarafını da düşündüğümüzde yazılım geliştirme sürecinin çok fazla paydaşı oluyor. İyi günlerde zaten bir problem olmuyor ama kötü günde bu paydaşların büyük bir kısmı ile olan iletişimi iyi yönetmeniz gerekiyor. Bu biraz da zamanla ve tecrübe edinmeyle gelişen bir beceri olsa da bu yetkinliğin farkında olmak ve kendimizi bu konuda geliştirmenin önemli olduğunu düşünüyorum. Önceki cümlelerde kötü zamanlarda süreç yönetimi ve iletişim oldukça önemli olduğundan bahsetmiştim. Bir ekleme daha yapayım: İyi yaptığınız işleri de bu profesyonellikte ifade edip, farkındalık yaratmanız da oldukça önemli.
Empati
Yazılımını gerçekleştirdiğimiz ürünleri kimi zaman biz de kullanıyor olabiliriz ama çoğunlukla müşteri/kullanıcı diye isimlendirdiğimiz başka insanlar geliştirdiğimiz ürünleri kullanıyor. Bunun dışında geliştirme sürecinde beraber çalıştığımız başka insanlar da olabiliyor. Onlarla empati yapabilme, ihtiyaç ve varmak istedikleri noktayı anlamak açısından empati önemli. Bu başlık eleştirilmeye müsait; daha fazla uzatmadan bir sonraki başlığa geçeyim
İşbirlikçilik
Yazıyı yazarken farkediyorum ki aslında başlıkların bir çoğu birbiriyle ilişkili. İletişimi sağlıklı kurmanız ve süreç yönetimi iyi yönetmeniz doğal olarak sizi işbirlikçi bir çalışan yapacaktır. Bununla beraber kimi zaman başka ekiplerle, başka firmalarla çalışmak zorunda kalabilirsiniz; ya da agile çalışıyor ve sprinte başlamışken sizden bir iş talebinde bulunan başka bir ekip olabilir. Bu durumlarda planlamanızı yapıp işbirliği içerisinde çalışmak da hem o gün için takdir edilmeyi hem de imajınızın iyi olarak anılmasını sağlar.
Çok Yönlülük
Bu başlık daha iyi programcı olmak için gerek olmayabilir. Ancak vizyon sahibi olma, farklı düşünme, farklı yönleri görebilme gibi önemli becerilere sahip olmanın önemli ve insanı bir adım öne çıkarabilecek özellikler olduğunu gözlemliyorum. (Öne çıkma derdi olmasa da güzel yetkinlikler bence 😀 ) Bu açıdan kendisini her açıdan geliştirmeye çalışmanın önemli olduğunu düşünüyorum. Buradaki maksadım her alanda iyi olun; her şeyi bilin demek değil elbette. Her konuda iyi olamazsınız ama mesleğiniz, hobileriniz ile ilişkili alanlarda biraz bilgi sahibi olup, bu bilgi neticesinde konuşabiliyor olmanın da bir yazılımcı açısından önemli bir özellik olabileceğiniz düşünüyorum. Başta dediğim gibi bu biraz daha genel bir özellik.
Başta söylediğim gibi bu konu, oldukça geniş ve saydığım özelliklerin dışında bir çok özelliği belirtebileceğimiz bir konu. Tabi kimisi de “ben yazılımcıyım; kodumu yazar gerisine karışmam diyebilir ” ki bunu küçük ve orta ölçekli firmalar da düşünmek bile mümkün değil ama büyük, iş tanımları net olan kurumsal firmalarda bile söylemek bana pek mümkün gelmiyor. Bu yazıyı yazmama sebep olan daha geniş yazının linkini tekrar buraya bırakıyorum. Bu yazıyı o yazının tercümesi olarak değil; tecrübelerim neticesinde yazmaya çalıştım. Umarım faydalı olur