Tanshaydar'ın Mekânı
Başka bir şey yok
Kategori: Oyun Geliştirme, Yazılım

Yazılım Geliştirmek Zordur!

Feragatname: Medium blog sisteminde yazılım dünyası ile ilgili birçok güzel makale mevcut, İngilizce biliyorsanız takip etmenizi tavsiye ederim. Bu makaleyi özellikle seçme sebebim ise diğerlerinden biraz daha fazla hoşuma gitmesi ve önemli bulduğum kısımlara değinmesi. Makalenin orjinali şöyle: Writing software is hard. Benim yazım ise bu makalenin çevirisi olmakla beraber kendi yorumlarımı ve tecrübelerimi kattığım, nispeten daha değişik bir yazı olacak.
[bd_separator]

Yazılım dediğimiz şey günlük hayatta sıklıkla karşımıza çıkan ve bilerek veya bilmeyerek her yerde kullandığımız bir olgu. Bazılarımız kullanıcı olarak kalmayıp bir tık ötede geliştirici olmayı da kafaya koydu veya koyuyor. Ama bu işin zorluğu konusunda yıllanmış geliştiricilerin bile açıklamadığı bir şey var, o da genellikle kimsenin dile getirmediği yazılım geliştirmenin gerçekten zor olduğu gerçeği.

İyi yazılım diye tabir ettiğimiz ürün her gün çıkmaz karşımıza çünkü iyi yazılım geliştirmek zordur. Özünde, biraz tecrübesi olan tüm yazılım geliştiricileri bunun zor olduğunu bilir, ve hatta bir kısmı iş yaparken bunun zorluğunu da konuşur. Yine de, en olası sonucu aldığımızda, yani kullandığımız veya geliştirdiğimiz yazılım kötü çıktığında “niye böyle oldu ya” deriz.

Bu da, bilişsel çelişkinin (cognitive dissonance) en bariz örneğidir zaten: Yazılım geliştirmenin zor olduğunu kabul ederiz, ama yine de hep iyi olmasını bekleriz.

Bu, aynı zamanda, verdiğiniz emeğin karşılığında aldığınız sonucu gösteren, kısaca ne ekerseniz onu biçersiniz sözünün gerçek hayattaki karşılığıdır. Ama biraz iyi niyetli bir insansanız, düşündüğünüz şey tam olarak şöyle: Tüm olumsuzluklara karşın, herkesin kalbinde iyi niyetler ve ümitler vardır, ve bunu işine aktaran herkes başarılı olacaktır. Yok öyle bir dünya. Hayal âleminde yaşamaktan başka bir şey değil bu.

Böyle bir hayal âleminde yaşamak elbette ki zararsızdır. Ama gerçek dünyaya geri döndüğümüzde, sırf geliştirme sürecinin zorluğuna bakarak sonucun mutlaka iyi bir yazılım olacağını beklediğimiz zaman, kendimizi kaçınılmaz bir hayal kırıklığına hazırlıyoruz demektir. Hatta daha da kötüsü, kusurlu ve eksik eforlarımızın sonucunda iyi bir yazılımı ortaya çıkarmayı hak ettiğimizi hissediyorsak, bu kaçınılmaz hayal kırıklığını da kendimiz dışında herkesin üzerine atacağız demektir (kol bozuk).

Beklenti dâhilinde olduğu halde yine de şaşırtıcı olan bu sonucun en muhtemel faili olarak da kullandığımız araçları seçiyoruz. En kolay çıkış yolu bu çünkü. Eğer kendi programlama ortamınıza küfrediyorsanız (programming environment), size dönüp de cevap vermeyecek, asılsız iddialarınızı çürütmek için hiçbir çaba sarfetmeyecektir. İş arkadaşlarınız veya iş dışındaki arkadaşlarınızla bu durumu paylaştığınızda, onlar da arkadaş olan iyi niyetli insanların yaptığını yapacak: sizinle hemfikir olacaklardır. Asıl hata sizde olsa bile…

İşte tam burada yanıltıcı bir yeterlilik balonu (veya içi boş bir ego mu desek?), iyi niyet ve özsaygı ile şişmeye başlıyor. Arkadaşlarınız sizi şımartırken kullandığınız araçlar kendilerini savunmayacak, o yüzden bu balonu patlatmanın bir yolu yok. (Kendinizi internete açmadığınız sürece bu tabi. Yabancılar her zaman size ne kadar yeteneksiz ve yetersiz olduğunuzu söylemek için can atar, tabi eğer önce siz saldırmazsanız.)

Neyse, bütün bunlar çok basit olan; ama bir o kadar da rahatsız edici gerçeğe gelmek için bir girizgâh niteliğindeydi: Yazılımlar sıklıkla kötü olurlar çünkü geliştiricileri yeterince iyi yazılım geliştiricileri değildir. İğne çuvaldız metaforuna girmeyeceğim; çünkü bunun sonuçlarından öyle ya da böyle hepimiz etkileniyoruz (su faturası yatırırken sistemin geri gelmesini beklemeyeniniz yoktur). Yine de, bunun tanımını yapabilmek için, en azından böyle bir ölçüt için birçok nitelik, çok daha az ortam değişkeni, ve çok geniş bir “yetenekli yazılım geliştirici” tanımı gereklidir. Ama en azından sorumluluk kabul etmek için de iyi bir başlangıçtır. Ve sorumluluğu kabul etmek, ilerlemeye giden ilk adımdır.

Aksi durumu için şöyle bir örnek düşünün: Eğer kullandığım araçları, veya süreçleri, veya hissedarları, veya dolunayı, veya mevcut hükümeti suçlarsam, kendimi ve egomu temize çıkarmış olacağım; ama kendimi geliştirebilmek için çok az bir motivasyon ve bunu nasıl yapacağıma dair daha da az bilgi ile kalacağım. Lâkin onun yerine, en azından kısmî bir sorumluluk alırsam, kendimi geliştirmek için belli bir yol da önümde açılmış olacaktır.

Bu duruma nasıl düştüğümüzü de çok iyi anlıyorum. Tabi ki iyi niyetle! (Cehenneme giden yol iyi niyet taşları ile döşelidir). Programlama gibi bir şeyi öğrenmek göz korkutucudur. Göz korkusunu aşsanız bile, benim de muzdarip olduğum Impostor Sendromu denen bizi kör kötürüm bırakan bir salgın var. Ama yine de, bu suratsız bilgisayarları ikna edip dans ettirmeyi denemesi için herkesi desteklemek ve cesaretlendirmek için herkesin farklı bir motivasyonu var. Kimisi öğretmeyi sever, kimisinin işi budur, kimisi benim gibi yalnız başına öğrenmek zorunda kaldığı için başkaları bu zorluğu çekmesin ister.
Birçok insan da bu motivasyonları inanılmaz büyük başarılara ulaştırdı zaten. Bugün programlama öğrenmek, oturup sözgelimi Photoshop öğrenmekten çok daha kolay. Açık kaynak okyanusundan harika anlatımı olan kitaplara, tutorial’lardan workshop’lara kadar her şey mevcut. İhtiyaç duyduğumda tüm dillere, framework’lere, ve kütüphanelere dair tutorial’lar, dokümantasyonlar, açıklamalar, örnekler dolusuyla mevcut.

Ama ironik bir şekilde öğrenmenin kolaylığı çok keskin bir tezat ile programlamada enine boyuna ustalaşmayı da çok zor hale getirdi. O kadar çok programlama dili, konsepti, framework’ü, kütüphanesi, geliştirme aracı var ki; bırakın hepsini anlamayı, hepsinin varlığını bilmek bile imkânsız. Ne güzel bir ihtilaf değil mi? (İlgili konuda bir başka yazı: 2016’da JavaScript Yazıyor Olmak Gerçekte Nasıl Hissettiriyor)

Ama bu ihtilaf, programlamaya yeni başlayanlar için dile getirilen bir mesele değildir. Hemen herkes, programlamaya başlamanın ne kadar kolay olduğunu methetmek ve insanları bunun için cesaretlendirmek konusunda o kadar istekli ki, birçok kişi programlama konusunda yeterliliği eksik kalıp sonunda başarısız olduğunda suçu kendini destekleyenlerde buluyor. E eninde sonunda da herkes bir günah keçisi arıyor, bu da ya kötü geliştirme araçları ya da eksik dokümantasyon oluyor.

Bu da soruyu, programlamaya başlamanın ne kadar kolay olduğunu öve öve bitiremeyen bizlere, bu insanlara ne tür bir kötülük yapmış olabileceğimizi sorgulamaya getiriyor. Evet, programlamaya başlamayı daha kolay ve daha az göz korkutucu yaptık. Bu gerçek bir süreç. Ama işe başlamak, tanım olarak, bitirmenin yarısı filan değil; bilâkis, sadece ilk adımdır.
Sanırım artık ikinci, üçüncü, ve hatta beş yüzüncü adım hakkında konuşmanın da vakti geldi. Hele ki sıra yazılım geliştiriciliği serüvenine çıkan herkesin güzel kodlar ve sürdürülebilir yapılar çıkarmasının kaçınılmaz bir sonuç olduğu inancını da ortadan kaldırmaya gelsin. Çünkü maalesef öyle bir şey olmuyor.

Yazılmış kodların büyük çoğunluğu sadece kod olmaktan öteye gidemiyor. Bırakın internetten rasgele birinin gözüne, hemen yanıbaşınızdaki ikinci göze bile hiçbir şey ifade etmeyecek kodlar çıkıyor ortaya, çünkü orjinal yazarına bile bir süre içinde bir şey ifade etmeyi bırakıyor bu kodlar. Bu konuda münakaşaya girmek, meşrulaştırma çabası göstermek de ayrı bir zorluk çünkü meşru olan şey “piyasaya sürülecek kadar iyi olması” ve onun ardında kalan gerçek meşruiyet çok uzakta kalıyor. Bu meşruiyeti elle göstermek de çok zor çünkü günümüzdeki sistemlerin dağılımı model olarak bir balçık topundan farksız.

Bazı durumlarda bu meşruiyet göze çarpar, bazılarında ise hiç görünmez. Tıpkı bir basketbol topunun diğerlerinden daha iyi sekmesi, bazı arabaların virajları daha hızlı alabilmesi, ve bazı klavyelerin tuşlarına bastığınızda daha güzel ses çıkarması gibi. Kullandığınız araçlar mutlaka, kesin olarak etkilidir. Yeni başlayanların inanmasını istediğimizden çok daha fazla hem de.
Doğru aracı bulmanın asıl amacı yazılım geliştiricinin ustalığa giden yolda ona ne kadar yardımcı olduğu ile ölçülür
Asıl yazarın yola çıkış noktası yirmi yıllık tecrübe ve gözlemden geliyor. Hem kendisi, hem etrafındakiler yazılım geliştiriyor. Haliyle, kimin ilerlemeye devam edip kimin programalama ortamına küfrederek neden bir şeyin çalışmadığına açıklama getirirken oldukları noktada tıkanıp kaldığını gösteriyor.

Aynı meseleyi oyun geliştirmeye çekmek istiyorum ben.

Çok güzel başlangıç videoları ve dersleri mevcut internette. Unreal, CryEngine, Unity… farketmiyor. Basit bir sprite’ı nasıl sağa sola hareket ettireceğinizi, double jump dediğimiz çift sıçramayı nasıl yapacağınızı anlatan onlarca YouTube videosu var. Unity Double Jump diye arayın, 12.000 (Onikibin) adet video bulacaksınız.

Ama bunlar hakikaten bir oyunu yapıp bitirmeye yeterli değil. Hele hele iyi bir oyun yapmaya hiç yeterli değil.

GameJam’lerin, Hackathon’ların bu kadar popüler olup bu kadar çok ürünü ortaya çıkarması; (çoğunun işe yaramaz olmasından mütevellit) prototipi geçemeyen yüzlerce kod, çöp klasöründe tozlanmaya yüz tutan projeler ile sonuçlanıyor. GameJam gibi günlerde ortaya çıkıp tam oyun haline gelen çok az proje, hakikaten güzel ve oynanabilir oyun haline gelen ise parmakla sayılacak kadar az proje var.

İşin kötüsü, örnek verdiğim videolarda bile güzel kod yazan az insan var. Haliyle bir başka problem daha çıkıyor ortaya: İyi programcı olmaya götürecek bir yolların bir kısmı yanıltıcı.

Bir başka örnek vermek istiyorum burada.
Yıllar önce, ben daha Bilkent’te iken, lisede bilgisayar programlama okuyan bir kişi ile muhabbet etmiştik. O zamanlar bu sitede de bildiğim programlama dillerini sıralama gibi bir ahmaklığa girmiştim ben (ondan bir iki yıl önce de yazdığım satır sayısıyla ölçüyordum programın kalitesini :)). O kişi benden daha fazla programlama dili bildiğini iddia etmişti ve az dil bildiğim için eğitimimin iyi olmadığını düşünmüştü. Bugün programlama dili bilmenin benim için hiçbir önemi yok, çünkü “Hello World” yazabildiğiniz bütün diller için biliyorum diyebilir; ama karmaşık bir projeye kalkıştığınızda hiçbir dille ilerleme katedemeyebilirsiniz.

Peki ne değişti bunca zaman zarfında?

Basit şeyleri ararken internette, onlarca çözüm bulmama rağmen; yaptığım işler karmaşıklaştıkça stackoverflow üzerinde sorduğum sorular bile cevapsız kaldı. İşin başlangıç kısmında herkes yardımcı oluyordu; ama ilerledikçe yardımcı olanların sayısı ciddi oranda azaldı ve bir noktada artık yalnız kalmaya başlıyor, kendi problemleriniz kendiniz çözmek ve tecrübe ede ede iyi kod yazmak durumunda kalıyorsunuz. Haliyle gerçek anlamda biliyorum diyebilmek için, ilk birkaç adımdan çok çok daha ilerisine gitmeniz gerekiyor ve bu noktaya gelene kadar yazdığınız her şey kötü kod potasına gidiyor.

Bunun elbette ki cesaret kırıcı olmaması gerekir, çünkü ilk başlarda herkes kötü kod yazacaktır. Ama her bir adımda, önceden yazdığınız kodlara bakarak ne kadar kötü yazdığınızı gördüğünüzde aslında ilerlemiş, daha iyi kod yazmaya başlamış olduğunuzu anlayacaksınız.

Orjinal yazar, kendi deyimiyle, daha az insanın başlangıç adımlarında kısılı kalmasını istiyor. Hayat ilerledikçe daha ilgi çekici hale gelir, ve olumsuzlukları baştan kabul ederseniz bunu yapmanız daha da kolaylaşır: Uzun süre boyunca kötü kod yazacaksınız. Eğer bu sorumluluğu kabullenebiliyorsanız, hemen kaliteli kod yazmaya başlayamasanız bile, yazdığınız kötü kod bir şekilde sadece kötü değil de, enteresan bir şekilde kötü olacak (bu dilde böyle şeyler yapılabiliyormuymuş ya? veya burada buna nasıl izin vermiş? veya oha burada böyle bir hata mı veriyormuş? gibi öğreten ve muhabbeti eğlenceli olan) ve zamanla gerçekten daha iyi hale gelmeye başlayacak.

Bu süreci atlamanızı sağlayacak hiçbir framework veya programlama dili mevcut değildir. Sadece anlayışınıza ve algınıza daha uygun olanları vardır. Yapabileceğiniz en iyi şey bunları bulup motivasyonunuzu ayakta tutmak olacaktır. Bir sonraki yazımda da bunları yaparken sizin derdiniz olmayan şeylerden bahsedeceğim.

2 şey demişler
  1. Not your problem’ı bir adım daha öteye taşıyarak verdiğin kaynak sitedi herşeyi okudum. Sonra gerçek hayata dönüp vay kaynatasını dedim.

    Amor Vincit Omnia 17 Ocak '17 tarihinde | Cevapla
    • Güzel kardeşim onca yıllık tecrübeye rağmen ben asıl profesyonellerin yazısını her okuduğumda vay anasını diyorum, çok da sıkıntı yok yani o kısımda 😀

      Tanshaydar 17 Ocak '17 tarihinde |

Söz uçar yazı kalır