14 Nisan 2015 Salı

Farklı bir çok teknoloji, programlama dili bilmek, öğrenmek üzerine

Yazılıma gönül vermiş, programlamayı seven yazılımcılar yeni programlama dilleri, yeni çatılar ( frameworks ) öğrenme konusunda çok heveslidirler. Doğaları gereği yenilikçi, araştırmacı oldukları için zaten bu mesleği sevmişlerdir. Yeniliklerle karşılaştıklarında onlara yeni dünyaların kapıları açılır. "İşte tam da aradığım buydu" diye haykırdıklarını duyabilirsiniz. Çünkü zaten denedikleri, onlar gibi önceden bazı sorunlarla karşılaşmış girişimci, yaratıcı kişilerin bunlara buldukları çözüm üzerine geliştirdikleri yeniliklerdir. Örneğin 80'lı yılların sonlarına kadar, yani C++ dilinin yaygınlaşmasına kadar yazılımcılar, C, Pascal gibi prosedürel programlama dilleri ile çalışıyorlardı. Bu dillerin eksiklerini gidermek üzere nesneye dayalı programlama metodolojisi geniş bir kabul gördü. C++ programlama dili, 90 yılların sonlarına kadar en yaygın kullanılan dil olma özelliğine sahipti. Java programlama dili ise, C++ dilinin bazı eksik ve yanlışlarını düzelterek, bu dilin syntaxını alarak oluştu. Bu eksiklikler konumuz dışı, fakat örneğin bir örnek vermek gerekirse, Java otomatik garbage collection özelliği ile, nesnelerin bellekten silinmesi görevini programcıdan alıp kendi üstlenerek bir gelişim getirdi. Yine son zamanlarda, eski yıllarda pek fazla önem verilmeyen fonksiyon programlama metodolojisi yükselişe geçti. Java dilinde multi-threading kod yazmak ve bu nedenle oluşan hataları önlemek, çok zordur. Fonksiyon programlamanın, değeri değişmeyen nesneler ( immutable objects ) özelliği sayesinde, multi-thread programlama yapmak çok daha basit ve hatasızdır. Büyük verileri işlemek, fonksiyon programlamanın paralel işleme özelliği sayesinde daha basittir. Bu gibi nedenlerden dolayı fonksiyonel programlama ve buna bağlı Scala, Clojure, Python gibi dillerin kullanım oranları gün geçtikçe artmaktadır.

Java şu anda dünyanın en yaygın kullanılan programlama dilidir. Arkasında çok büyük bir topluluk ve destek bulunmaktadır. Yaklaşık 20 yıldır, büyük bir gelişim ve olgunlaşma göstermiştir. Java ile yazılmış ve yaygın kullanılan bir çok çatı bulunmaktadır. Canlı ortamda yer alan ve insanlara hizmet eden milyarlarca satır kod vardır. Eclipse, IntelliJ gibi çok güçlü ve programcıların işlerini çok kolaylaştıran IDE desteği vardır. Java konusunda yüzlerce kitap, makale, kod örnekleri her yerde bulunabilir. Karşılaşılan sorulara yanıtlar çok kolayca internette bulunabilir. Büyük ihtimalle, bunlar çoktan StackOverflow'da yantılanmıştır. Böylesine büyük bir yaygınlık, güç, ister istemez Java'yı bir numara yapmaktadır.

Yeni bir programlama diline yaklaşım yukarıda saydığım nedenlerden dolayı şirketler, yöneticiler tarafından çok hoş karşılanmayabilir. Tecrübe eksikliği, ne ile karşılaşılacağının bilinmemesi, döküman eksikliği, internetteki kaynak eksikliği, bu konuda bilgi ve tecrübesi olan yazılımcıların fazla bulunamaması gibi nedenlerden dolayı haklı olabilirler. Yenilikçi programcılar, yeni bir dil, yeni bir çatı konusunda proje başlarında genelde ısrarcı olabilirler. Fakat ne yazık ki, bu desteği fazla bulamazlar, hatta çok ısrarcı olurlarsa, kendilerine şu söylenebilir: "Burası okul değil, işlerin hızlı ve kaliteli çıkması için para alıyorsunuz." İşte bu acı, katı ve bir o kadar da haklı gerçek karşısında yapacak bir şey yoktur. İş veren, iş ekipleri sizin ne teknolojileri kullandığınız, neler öğrenebileceğiniz gibi konulardan daha çok, iş ne kadar zamanda, hangi kalitede çıkacak? İsteklerimi tam olarak ( Genelde daha fazla olması da istenir ) karşılayacak mı? buna bakar.

Fakat diğer bir tezat ise, işe alınacak yazılımcılardan gerekli olsun, olmasın bir çok konuyu, dili, çatıyı bilmesi beklenir. Öz geçmiş belgenize ne kadar çok farklı madde yazarsanız, o kadar saygı görürsünüz. Buradaki bakış açısı da şudur: Demek ki, bu yazılımcı çok farklı konuları merak etmiş, bunları öğrenmek için zaman ve çaba harcamış. Bu gayretiniz takdir görür. Bu da bence haklı bir sebeptir. İş yerinizde kullansanız da, kullanmasanız da farklı şeyler öğrenmek sizi her zaman geliştirecektir, size farklı bakış açıları, farklı yaklaşımlar kazandıracaktır. Kısacası işinizi yaparken, alet çantanızı zenginleştirecektir.

Bu gelişi güzel, bir anda aklıma gelen konuyu özetleyecek olursam: Öğrebildiğinizi öğrenin derim. Bu sizi güçlü kılacaktır, ufkunuzu açacaktır. Fakat öğrendiklerinizi iş yerinizde aktif olarak hemen kullanmaya başlayabilir misiniz? Bence çok zor. Belli bir zaman, olgunluk ve çevredekilerden daha fazla kabul gerektiriyor.

Sağlıçakla kalın.

10 Eylül 2013 Salı

İyi Kod Nedir? Neden İhtiyaç Duyarız

GİRİŞ


Analiz, tasarım, geliştirme, test ve bakım olarak bilinen yazılım evrelerinden en fazla zaman alan, en maliyetli olan kısmı Bakım evresidir. Yazılım bir mühendislik ürünü olarak, bir ihtiyaca, bir soruna çözüm bulmak, insanların hayatlarını kolaylaştırmak üzere düşünülür ve geliştirilir. Yazılım gerçekten böyle bir ihtiyaca karşılık veriyorsa, beğenilirliği, kullanımı her geçen gün artar. Buna bağlı olarak insanlar yazılımın daha çok iş yapmasını, daha fazla özelliğe sahip olmasını isterler. Ayrıca yazılım kullanımı arttıkça, yazılımdaki hatalar fark edilmeye, bazen de bunlar kullanıcıların işlerini zorlaştırmaya başlar. Böylece yazılım bakım aşaması devreye girer. Bakım kod içinde bir hata düzeltmesi veya yazılıma yeni özelliklerin kazandırılması için yapılır.

Bakım evresinde ise, kod değişir ve genişler. Yazılım kaliteli, iyi yazılmış, tasarımı iyi yapılmış olursa, değişmesi ve yeni özellikler eklenmesi çok daha kolay olur. Değişiklik yapıldığında yazılımdaki her bir parça bundan etkilenmez. Mümkün olduğunda az bir kod parçasının etkilenmesi, yazılımın o denli iyi tasarlanmış olduğunu gösterir. Yazılımın yaşamı boyunca, hep aynı kişilerin yazılım üzerinde çalışacağının garantisi yoktur. Yazılım ekiplerindeki insanlar sürekli değişebilir. Yazılım iyi formatlanmış, anlaşılır ve temiz olursa, ekibe yeni katılan insanların projeye alışmaları ve onun üzerinde iş yapmaya başlamaları kolaylaşır.

Kötü yazılmış, anlaşılmayan, arap saçına dönmüş kodlardan oluşan projelerde bakım maliyeti yüksektir. Bu yazılımlara yeni bir kod eklemek veya var olanı değiştirmek zor olduğu gibi, bu tip girişimler yazılımdaki hata sayısını yükseltir. Hatta bazen yeni özellik eklerken, doğru çalışan yerlerin de bozulması muhtemeldir. Böyle kodlar bilgisizlikten, özensizlikten oluşabileceği gibi, şirketlerin işler üzerindeki zaman baskılarından da oluşabilir. Zaman baskısını fazlasıyla üzerinde hisseden geliştiricinin dikkati, özeni dağılır. Tasarımı düşünmeye çok zaman ayırmak istemez. Çalışsın bir an önce yeter. Hemen çalıştığını görüp teste göndereyim gibi hissiyatlara kapılır. Nedeni ne olursa olsun, kötü kodla yazılmış bir yazılım, ilk başlarda çok faydalı olduysa da, yeni istekler gelmeye başladığında kalitesi ve üretkenliği giderek düşer. Hatalar yeni hataları doğurur. Şirketler bu tür kodla yazılmış yazılımlara daha fazla yatırım yapmak isteyip, proje ekibindeki kişi sayısını arttırabilirler. Fakat belirli bir süre sonra yeni gelen kişiler de kötü kodlar üretmeye katkıda bulunmaya başlarlar. Yazılımcılarda bir sıkıntı, bir bıkkınlık, projeye karşı bir isteksizlik sürekli artar. Sonuçta da yazılımın başarısız olması kaçınılmazdır. Ya çöpe atılmalı ya da baştan tasarlanıp yazılmalıdır.

Sonuç olarak: İyi ve kaliteli kod yazmak, bir mecburiyettir.


İYİ KOD NEDİR?
  • İyi kod açık ve net olmalıdır. Kod güzel, açıkça ve anlaşılır bir biçimde okunaklı olmalıdır. Böylece içinde hataların saklanması zor olur. 
  • Kod içindeki her birim odaklanmış olup, amacı belirli olmalıdır. Bir kod yazayım her işi yapsın mantığı yanlıştır. Kod birimlerinin amaçları tek olmalıdır. Kod okunduğunda, programcının yapmaya niyet ettiği şey açıkça anlaşılmalıdır.
  • Kod birimlerinin, birbirleriyle olan bağımlılıkları mümkün olan en az düzeyde olmalıdır. Bir kod parçasının değişmesi, başka birimlerin çok az değişmesine neden olmalıdır.
  • Kod içinde, kod tekrarlarının olmaması gerekir. Yalnızca belirli bir işi başaran kod parçası, uygulama içinde tek olmalıdır.
  • Kodun iyi yazılmış olması yetmez. Kodun sürekli temiz tutulması, zaman içinde bu özelliğinin bozulmaması gerekir. Hatta kod genişlerken, önceki kod parçalarındaki aksaklıkların da giderilmesi, kodun daha sade ve anlaşılır bir duruma gelmesi sürekli sağlanmalıdır.
  • Unutulmamalıdır ki, kodu yazan yazılımcı, aynı zamanda başka kod parçalarının okuyucusu durumundadır. Kendi yazdığı kodu da bir gün mutlaka başka yazılımcılar okuyacak, üzerinde çalışacaktır. Nasıl bulmak istiyorsa, öyle bırak tarzı bir kural ile ilerlemek gerekmektedir. Yapılan araştırmalara göre, mevcut bir kod üzerinde değişiklik yapılmak isteniyorsa veya mevcut koda yeni özellikler eklenmek isteniyorsa, yazmanın okumaya oranı 1/10 dur. Yani kod yazmak için, yazmaya harcadığımız zamanın 10 katı zamanı okumaya ayırmalıyız. Bu nedenle iyi okunabilir kod bırakmak önemlidir.