Son zamanlarda programcılara sıkça verilen bir öğüt var: Bol, bol başkalarının yazdıkları kodları okuyun. Bu sizin daha iyi programcı olmanızı sağlayacaktır.
Başkalarının kodunu okumamız söylenir, ama bu okumanın bizi programcı olarak neden ileri götürdüğüne açıklık getirilmez.
Benim savım: Başkalarının kodunu okumak bizi daha iyi bir programcı yapmak için yeterli bir aktivite değildir. Ben bir noktadan sonra başkalarının kodunu okumanın zaman kaybı olduğunu düşünüyorum. Bunun neden olduğunu bu yazımda açıklamaya çalışacağım.
Ben çok nadir programcının kodu başka programcılar okuyabilsin diye yazdığına şahit oldum. Çoğu programcı kodu doğrudan mikro işlemci için yazar. Sadece bu sebepten dolayı bile başkasının kodunu okumak anlamlı değildir, çünkü okunmak için yazılmamış kodun içinde olup, bitenleri kavramak imkansız ya da zordur. O kod karmaşasını okumaya çalışmak programcıya bir şey katmaz, daha ziyade boşuna kafa patlatarak, yorulmasına sebep olur ve demotive eder.
Zaman içinde bazı kod bölümleri optimize edilir. Bu işlemin sonucunda kullanılan algoritmalar optimizasyon kurbanı olur ve botokslanmış bir surat gibi tanınmaz hale gelirler. Programcı olarak kodun bazı şartlarda gerekli davranışı sergileyebilsin diye optimize edildiğini ilk bakışta göremeyebiliriz. Şekil değiştirmiş olan algoritmaları da tanımamız artık mümkün değildir. Optimizasyon neticesinde tanınmaz hale gelen algoritmaları anlamak ve nasıl kullanıldıklarını kavramak mümkün değildir. Bu yüzden ne olduğunu bile kavrayamadığımız bir algoritmanın nasıl kullanıldığını anlamaya çalışmak beyhude bir iş olabilir.
Aynı şey deneme, yanılma usulüyle ortaya çıkmış algoritma-vari yapılar için de geçerlidir. Programcı büyük bir ihtimalle kendisinin de bir zaman sonra anlamakta zorluk çektiği bir yapıyı deneme, yanılma usulüyle oluşturmuş olabilir. Kodun çalışıyor olması, ortada bir algoritmanın olduğu anlamına gelmez. Geliştiricisinin bile büyük bir ihtimalle bir zaman sonra anlamakta güçlük çektiği bir kod birimini bizim okumaya çalışmamız, bize ne kadar fayda sağlayabilir?
Uygulamanın nasıl çalıştığını anlamanın en kolay yolu, önce birim/entegrasyon/onay-kabul testlerini incelemek ve bu testleri koşturmaktır. Bu şekilde kullanıcı gözüyle uygulamanın nasıl işlediğini anlamak mümkün olacaktır. Testler programcının uygulamanın belli noktalarından giriş yaparak, uygulamanın nasıl çalıştığını anlamasını kolaylaştırır. Birçok projede bir can simidi değil de, lüks olarak görülen testlere rastlamak neredeyse mümkün değildir. Testler olmadan kodu okuyup, anlamaya çalışmak, rastgele birkaç kod dosyasını açıp, içine bakmadan öteye gidemez. Kod okurken nihai amacımız if, while, switchlerin nasıl kullanıldığını görmek değil, belli bir problemin hangi modele dayandırılarak çözüldüğünü anlamaya çalışmak olmalıdır. Testler bu genel resmi görmemizi sağlarken, testleri olmayan bir uygulamayı incelemeye çalışmak, programlama dilinin nasıl kullanıldığını anlamaktan öteye gitmeyecektir.
Kodun okunamaz hale gelmesinin bir başka nedeni de, zaman içinde değişik türdeki hataların (bug) değişik programcılar tarafından yamalanmasıdır (bugfix). Kod bünyesinde olup, bitenleri anlamayı engellemenin en emin yolu bu yamaların oluşturulmasıdır.
Kod okuyarak daha iyi programcı olma konusuna bu kadar olumsuz baktığımı düşünmeyin. Bu aktivitenin yapılış tarzına göre programcıya katkıda bulunması mümkün. Buraya kadar verdiğim örnekler pasif kod okumayla ilgiliydi.
Kod okuma seanslarından kazanç sağlayabilmek için kodun aktif bir şekilde okunması gerekmektedir. Aktif kod okuma seanslarında testler çalıştırılır ve uygulamanın giriş noktaları keşfedilir. Bu giriş noktalarını uygulamanın temelinde yatan prensipleri anlamak için kullanabiliriz. Büyük bir ihtimalle gördüklerimizi ilk etapta anlamamız mümkün olmayacaktır. Gördüklerimize anlam verebilmek için kodu sahip olduğumuz tarza göre yeniden yapılandırabiliriz (refactoring). Örneğin değişken ve metot isimlerini o anki düşündüklerimizi yansıtacak şekilde değiştirebiliriz. Uzun metotları da parçalara bölmeye çalışmak (extract method) kodun bizim açımızdan daha anlaşılır hale gelmesini kolaylaştıracaktır. Gönül rahatlığı ile kodu yeniden yapılandırabiliriz, çünkü testler bu süreci destekleyici nitelikte olacaktır. Bu şekilde yeniden yoğurmaya başladığımız kodu anlamamız daha kolaylaşacaktır. Kendi tarzımızı yansıtan kodu anlamak daha kolay olacaktır.
Aktif kod okuma seansları için testlerin olması bir gereklilik değildir. Kod üzerinde istediğimiz türde değişiklikleri yaparak, kodu adım, adım daha iyi anlamaya çalışabiliriz. Yeterince kod okuduğumuzu, değiştirdiğimizi ve anladığımızı düşündüğümüz noktada, edindiğimiz tecrübeler bizde kalacak şekilde kodu çöpe atabiliriz.
Kod ne yazık ki okunmak için yazılmış bir roman değildir. Ne kadar okunabilir kod yazmaya da gayret etsek, kodu konuşulan bir dilin kelimeleri kullanılarak oluşturulmuş bir roman gibi yazmamız ve okumamız mümkün olmayacaktır. Okuduğumuz kodu anlayabilmek için onu bakış açımızı yansıtacak şekilde değiştirmemiz zaruridir. Aktif kod okuma olarak isimlendirdiğim bu aktivite programcının kodu yeniden yapılandırma yetilerini geliştirici niteliktedir. Aktif kod okuma seanslarinda programcı hem kodu anlayarak hem de kodu yeniden yapilandirma tecrübesi edinerek, bir taşla iki kuş vurulmuş olur.
EOF (End Of Fun)
Özcan Acar
Yorumlar
“Başkalarının Kodu Okunarak Daha İyi Programcı Olunabilir mi?” için 4 yanıt
Bir kaç ay sonra kendi yazdığım bazı yerleri ne amaçla yaptığımı unuttuğum oluyor buradaki en büyük yardımcımız commentler.Genelde bir konu hakkında yazılan tutoriallerde bu commentler çok iş görüyor
Mümkün olduğunca dökümantasyona önem veririm ama kodlarımı okumak için mimariyi tam olarak anlamak ve ne nerede niçin yapıldığını iyi anlayabilmek gerekiyor.Dolayısıyla salt kod okumayla değil en azından amaçlarında neler olduğunu bilebilmek önemlidir.Tabi iş eğitim projesi olmayacağı için okuyan kişi haliyle zorlanacaktır.
http://www.kodadiyazilimci.com
Özcan Bey öncelikle makalelerinizi severek takip ettiğimi belirtmek isterim. Birçok konuya değişik -hatta bazen ezber bozan- bakış açıları getirmeniz gerçekten çok faydalı. Bu yazıdaki görüşlerinize katılmakla beraber, bir noktaya değinmeyi gerekli görüyorum. Benim de okuduğum bazı makalelerde başkalarının kodlarını okumanın faydalı olduğu belirtiliyordu. Ancak bu makalelerde “başkaları” ile kastedilen iş arkadaşlarından ziyade JUnit, Apache vb. başarılı açık kaynak kodlu projeler idi. Ben de bu tür projelerin kaynak kodlarını incelemenin tasarım kalıplarının nasıl uygulandığını canlı canlı görmek ve bazı hazır veri yapılarının farkında olmak açısından faydalı olduğunu düşünüyorum.
Ben de başkalarının kodlarını okumanın faydalı olduğunu düşünüyorum tabi ki bir yere kadar. Kafamda mantığını iyice oturttuktan sonra kod yazmaya geçerim. Böylece yazdığım her kod bana özgü olur. Ben açıklamadan blok olarak anlaşılması imkansıza yakındır. Her programcı için de bu böyledir. Php html css jquery javascriptten oluşan iç içe geçmiş şiştikçe şişmiş kod enflasyonuna sahip olan bir siteyi al ve incele, vakit kaybetmekten başka bir işe yaramaz. Otur düşün tasarla ve yaz.