9 Aralık 2018 Pazar

Code Simplicity ( Kod Basitliği - 8.2)

    S.a. Arkadaşlar,
    İyiden iyi sona yaklaşıyoruz artık. Tatlı bir heyecan sarmaya başladı beni. Bu yazımızı da tamamladığımızda sadece bir bölüm kalacak, onu da yıl bitmeden tamamlamaya çalışacağım. Bildiğiniz üzere 8.bölümü 2 kısma ayırmıştık. İlk bölümde karmaşıklık ve kötü teknoloji seçiminden bahsetmiştik. Şimdi ise geri kalan konuları işlemeye çalışacağız. Hazırsanız başlayalım.
    Karmaşıklık ve Yanlış Çözüm
    Bir teknoloji fazla karmaşıklaşmaya başlıyorsa, bir yerlerde yanlış giden şeyler var demektir. Mesela araba tekerleğinin kare olduğunu varsayın. Araba yeterince hızlanmayacaktır. Motoru ile ilgili değişikler fayda vermeyecektir. Burada yanlış geliştirilen bir çözüm mevcuttur. Tekerliği tekrardan yuvarlak bir şekilde tasarlamak zorundasınızdır.

    Yazılımınızda "çözülemeyen karmaşıklık" problemi olmamalıdır. Eğer öyle bir problem varsa işin alt yapısına bakmalısınız. İşi baştan itibaren sıkı tutmanız gerekli diye de düşünebilirsiniz. Bazen yanlış kodlar, sistemler tasarlanır daha sonra gel bizi kurtar denilir danışmanlara. Sistem baştan düzgün de tasarlanmadığı için, çoğu zaman da projeyi tekrardan yazalım fikrine geçilir ve deli gibi maliyetler akıp gider. Bu da ülkemizin yazılımdaki büyük problemlerinden biridir.

     Yazılımcıların yakındığı bir sorun da, sistem çok karmaşık, buraya yeni özellik eklemek çok zor. Burada öncelikle var olan sistemin gözden geçirilip mümkün olduğu kadar sadeleştirilmesi ve daha sonra da yeni özelliğin eklenmesi doğru olacaktır. Dün server'imizde bu konunun üzerine bir muhabbet açılmıştı. Kamil Ünsal arkadaşımız da bir problemle karşılaşınca önce gerekli düzenlemeleri yaptıktan sonra istenen özelliği eklediğini söylemişti. Burada bunu okuyunca nasıl doğru bir iş yaptığını görmüş de olduk :)

       Hangi Problemi Çözmeye Çalışıyorsun?
       Size gelen bir istekte öncelikle tam olarak ne istediklerini anlayın. Müşteri, bu aracı uzaya nasıl fırlatabilirim diye sorabilir size. Ona ne istediğini sorun. Gri taşlar aradığını söylediğinde bunun için uzaya aracıyla gitmesine gerek olmadığını söyleyin ve ona daha basit bir yol önerin. Çık ve doğruca yürü. Gri taşlar bulman için bunu yapman yeterlidir diyin ve problemi kolayca çözün. Kulağı tersten göstermenin abartılmış bir versiyonuna ne kadar da benziyor değil mi ...

      Varsayımlarınızı bir kenara bırakın ve gerçekten probleme odaklanın. Problemi iyice anladığınızdan emin olun. Şu kod yapısıyla bunu nasıl çözerim veya filanca kişi şu probleme nasıl bir çözüm getirmişti gibi soruları bir kenara bırakın, asıl odaklanmanız gereken şey kendinize ben bu problemi yeni koşullar göz önüne alındığında en iyi çözümü nasıl sağlarım olmalı. Böylece bu kod yapısı için neler yapabileceğinizi gördükten sonra çözümünüzü geliştirebilirsiniz.

     Karmaşık Problemler
     Bazen büyük problemleri çözmek için işin başına getirilebilirsiniz, fakat bu karmaşık çözümler üretmek zorunda olduğunuzu göstermez. Bu çözümler üzerinde daha çok çalışmanız gerektiğini gösterir. Eğer gerçekten büyük bir problem ile karşılaşırsanız bunu bir kağıda şema veya düz yazı ile çözmeye çalışın. Bilgisayara geçirmek ise kolay olandır. Geçenlerde karmaşık olduğunu düşündüğüm bir şeyler tasarlamaya çalışıyorum. Kafamda resmi o an çizmedim. Not defterim zaten masanın üstündeydi. Hangi tablolarda ne gibi değişikler yapmam gerektiğini ve bana nelerin gerektiğini yazdım. Aralardaki bağlantıları da düzelttim. Bunun doğru çözüm olduğunu da ikna olduğumda (senaryoyu kendi çapımda oynatıyordum:) artık kağıdı kalemi bırakıp kodlamaya başladım. Yukarıda da belirtildiği gibi bunu kod geçirmek o kadar da zor olmadı.
     En zorlu işler dahi kağıda çizim veya yazıyla çözülebilir.

     Bakım Karmaşıklığı
     Yazılımcılar olarak çok zor işlere girişeceksiniz. Meslektaşlarınız karmaşık kodlar yazacak ve siz onlarla uğraşacaksınız. Bu da yetmeyecek tasarımcılar ve diğerleri de işlerinizi daha da zorlaştıracak. Eğer işler içinden çıkılması zor hale geldiyse işlemleri küçük parçalara ayırarak adım adım gidip yapıyı tasarlamak güzel bir iş olacaktır.

    Eğer tüm kodu içeren bir dosya varsa bunu küçük parçalara bölebilirsiniz. Her dosyayı daha küçük dosyalara ayırarak parçalayabilirsiniz. Parçalayıp tasarımınızı tekrardan gözden geçirin. Böyle böyle daha okunabilir, baş edilebilir bir kod parçası elde etmiş olursunuz. Şu aklıma geldi, büyük devletlerin böl parçala yönet taktiğine ne kadar da benziyor değil mi ? Neyse daha fazla irdeleyip konudan uzaklaşmayalım.

     Sisteminiz çok karmaşıksa bunu çözmek biraz zaman alabilir. O yüzden biraz sabırlı olmalısınız. Önce basit bir sistemi nasıl oluşturacağınızı düşünün, daha sonra adım adım bunu elde etmek için ilerleyin.  Belirli bir seviyeye getirdiyseniz şimdi tekrar üzerinde düşünün. Acaba daha sadesini tasarlayabilir miyiz diye, mükemmelini aramayın, öyle bir şey de yoktur zaten, fakat yaptığınız işin daha basiti olabilir. Bu şekilde ilerlemeye devam ederseniz en nihayetinde yönetilebilir bir yapıya kavuşacaksınız.

     Bununla birlikte, yeni özelliklerin eklenmesini durduramazsınız. Değişim yasasını hatırlarsanız yazılımınız her daim  değişmeye muhtaç olacaktır. O yüzden siz değişikliğe karşı gelmek yerine, değişikliğe en iyi şekilde nasıl adapte olunur diye düşünmek zorundasınız. Ayrıca kullanıcınızı da yeni özellik ve değişikliklere adapte etmek zorundasınız. Aksi takdirde kullanıcı tabanınızı kaybedeceksiniz.

    Neyse ki bu iki konuyu denge tutmak lazım. Bunu yapabilmenin en iyi yollardan biri de tasarımınızı belirli bir özellik için ekleme yapmaktır. Bu şekilde yaptığınız işler arasında kontrollü geçiş yaparsınız kontrolün sizde kalmasını sağlayabilirsiniz. Ayrıca bu tasarımla ilgili ihtiyaçları daha iyi yönetmenize olanak sağlamaktadır. Böylece sisteminiz zamanla daha az karmaşık olmaya devam edecek ve kullanıcılarınızın isteklerine daha hızlı cevap verebileceksiniz. Her zaman belirttiğimiz gibi kodu düzeltmeden önce tasarımı düzeltin. Bu kitabı okuduğum zamandan beri yazarın üzerinde en sık durduğu konu, kodu düzenlemeden önce tasarımınızı kafanızda tasarlayın, gerekirse öncesinde düzenlemeler yapın, her şeyin hazır olduğunu inanıyorsanız kodu yazmaya başlayın. Ben bunu şunu benzetiyorum. Arabaya binen şoförün sağına soluna, ışıklara, benzin durumuna bakmadan direk gaza basıp gitmeye çalışması gibidir.

      Tek Parçayı Daha Basit Yapma
       Yukarıdaki her şey iyi güzel de daha basit parçalara bölme işlemini nasıl yapacağız. Tüm yazılım prensip ve tasarımları bunu çözmek için vardır. Ayrıca birden fazla programlama dilini bilmek, kullanmasanız bile, işinize yarayacaktır. Farklı pencerelerden bakmanıza olanak sağlayacaktır. Tüm bunlar bir problemle karşılaştığında problemi çözmen için bir sürü seçenek verecektir. Yazılım prensipleri önüne bir çok seçenek koyacaktır, ama bundan sonrası senin bilgi ve tecrübene bağlı olacaktır. Robot gibi seçim yapamazsınız çünkü bir aracı, bir çözümü her şeye uygulayamazsın. Bununla ilgili yine aklıma hangi programlama dilini kullanayım prensibi gelir. Özellikle dil fanatiklerinin bazen kavgalar yaptığı bu dil en iyi hayır bu dil daha iyi konusuna atıfta bulunmak istiyorum. Bilindiği üzere yapacağınız işe göre programlama dili veya araç seçilmelidir. Küçük bir çivi çakmak için büyük bir çekiç kullanmak gereksiz olacağı gibi, daha büyük bir iş için de küçük çekiç kullanmak o kadar saçma olacaktır. Yazarın da burada bahsetmek istediği budur diye düşünüyorum. Her prensibi her yönteme uygulayamazsınız. Burada bizlerin bilgi ve tecrübesi ön plana çıkacaktır.

       
Bazen de yeterli tecrübede olmayabilirsiniz veyahut bu yöntemlerin tümünü bilmiyor olabilirsiniz. O halde yapacağınız şey, kendinize şunu sormak olacaktır. "Bu kodu daha basit hale indirgeyebilir miyim ?" Bu her basitleştirme sorusunun ardındaki cevaptır. Her hangi bir yöntem sizi doğruya götürebilir. Buradaki araç ve teknikler ise işinizi bir nebze daha kolay yapmanızı sağlayacaktır.

      Çözülemeyen Karmaşıklık
       Sisteminizi basitleştirirken bazı problemleri basitleştirmek gerçekten zor olabilir. Bu gibi durumlarda sistemdeki karmaşıklığı gizlemek en doğru iş olacaktır. Abstraction yapısı gibi düşünelim bunu da. Yani motorun kendisi çok karmaşıktır. Belki motoru anlayamayız ama o karmaşıklığı gizleyerek onun kullanımını kolaylaştırabiliriz. 

       Yeniden Yazma
       Bazı tasarımcılar, karmaşıklığın çok yoğun olduğu yerlerde pes edip projeyi yeniden tasarlamak isteyeceklerdir. Aslında bu başarısız olduk demenin farklı bir versiyonudur. Çünkü karmaşıklığı yönetemeyip başarısız olmuşlardır.
          Bazı yazılım tasarımcıları tüm sistemi yeniden yazmayı savunurlar. Tüm sistemin yeniden yazılmazsa başarısız olacağını savunurlar. Bu da bir inşaat mühendisinin bu gökdelen yıkılacak demesine benzer. Eğer baştan işi sağlam tutsaydınız gökdelen neden yıkılsın ki ?

     Şimdi tüm sistemin yeniden yazılabileceği bir kaç durumdan bahsedelim.

  •  Sistemi yeniden tasarlamanın, mevcut sistemi tasarlamaktan daha kolay olduğu durum bunlardan biridir. Bundan emin olabilmek için farklı deney ve mekanizmalar da yürütmek zorundasınız. Bu çok ciddi bir karardır ve o yüzden bu kararınızdan iyice emin olun.
  • Yeni sistem tasarlamak için oldukça geniş bir zamanın varsa da bunu düşünebilirsiniz.
  • Sistemi basit adımlardan oluşturup bunun için kullanıcılardan her defa geri bildirim alacağınıza inanıyorsanız da sistemi yeniden tasarlayabilirsiniz 
     Tüm bu durumları göze alıp kararınızı ona göre verebilirsiniz. Aksi durumda mevcut projedeki karmaşıklığı idare etmeye çalışmanız sizin yararınıza olacaktır.

     Karmaşık olmayan, yönetilebilir sistemler tasarlamak dileğiyle. Hoşça kalın. 

Hiç yorum yok:

Yorum Gönder