Yazının orjinali : Peter Norvig Teach Yourself Programming in 10 Years
Neden Herkes Altına Hücum Ediyor?
Herhangi bir kitabevine giderseniz "Kendinize 24 Saatte Java Öğretin" gibi kitapların çeşitli varyasyonlarının size C, SQL, Ruby, Algoritmalar gibi konuları bir kaç gün ya da saat içinde öğretmeyi önerdiğini görürsünüz. Amazon'da yapılacak kapsamlı bir arama [title: teach, yourself, hours, since: 2000] yaklaşık olarak 512 kitap getiriyor ve ilk 10 kitabın 9'u programlama ile ilgili. Aslında "teach yourself" (kendi kendinize öğretin ç.n.) yerine "öğrenin", "saatler", "günler" yazılsa da gelebilirdi.
Sonuç şu ki ya insanlar programlamayı öğrenmek için büyük bir acele içinde, ya da programlama mucizevi bir şekilde öğrenmeyi diğer herşeyden kolay hale geldi. Felleisen et al kitapları "How To Design Programs"de buna bir onay veriyor ve "Kötü programlama kolaydır. Aptallar bile bunu 21 gün içinde becerebilir, ne kadar salak olurlarsa olsunlar" diyor. The Abtruse Goose Comic de kendi karikatürize eleştirisini yapmış.
Hep birlikte Kendinize 24 Saat İçinde C++ Öğretin'in ne anlama geldiğini analiz edelim :
Kendinize öğretin : 24 saat içinde birden fazla önemli program yazacak vaktiniz olmayacak, haliyle onların içinde yapacacağınız hatalar veya başarılardan da öğrenme şansınız olmayacak. Deneyimli bir programcıyla birlikte zaman geçirip C++ ortamında yaşamanın neye benzediğini anlayamayacaksınız. Kısacası, çok fazla şey öğrenmeye zamanınız yok. Dolayısıyla kitap olsa olsa yüzeysel bir tanıdıklıktan bahsediyor olabilir, derin bir kavramadan değil. Alexdander Pope'un da dediği gibi, "biraz öğrenme" tehlikeli birşeydir.
C++ : 24 saat içinde C++ yazım kurallarının birazını öğrenebilirsiniz (eğer başka bir dili zaten biliyorsanız) ama bu size dili nasıl kullanmanız gerektiği ile ilgili yeterli bilgiyi vermez. Kısacası, mesela diyelim ki Basic programcısı iseniz, Basic stillerini kullanarak C++ programları yazabilirsiniz ama bu size C++'ın hangi alanlarda iyi ya da kötü olduğunu öğretmez. Dolayısıyla amaç nedir? Alan Perlis bir defasında şöyle demişti : "Sizin programlama hakkındaki düşünüş şeklinizi etkilemeyen bir dil öğrenmeye de değmez." Bir olasılık, C++'ın (ya da Javascript ya da İşlemci dilinin) küçük bir kısmını mevcut bir araç ile etkileşim için öğrenmeniz olabilir. Ancak bu durumda da o dili değil, o belirli işi nasıl yapacağınızı öğreniyorsunuz.
24 Saat İçinde : Ne yazık ki bu yeterli değil, bir sonraki kısımda da detayına gireceğiz.
Kendinize 10 Yılda Programlama Öğretin
Araştırmacılara göre (Bloom (1985), Bryan & Harter (1899), Hayes (1989), Simmon & Chase (1973)) herhangi bir alanda uzmanlık geliştirebilmek için on yıllık bir zamana ihtiyaç vardır : bu alanlar satranç oynamak, beste yapmak, telgraf operatörlüğü, resim, piyanı çalmak, yüzme, tenis ve nöropsikoloji ve topoloji konularında araştırma yapmak olabilir. Anahtar kavram bilinçli pratik yapmaktır : birşeyi yeniden ve yeniden yapmak değil, mevcut yetenek veya bilgilerinizin ötesinde olacak şekilde kendinizi zorlamak, denemek, performansınızı sonradan analiz etmek ve hatalarınızı düzeltmektir. Sonra tekrar etmek. Sonra bir daha tekrar etmek. Bunun pek kısayolu varmış gibi de görünmemektedir : Mozart bile, ki kendisi 4 yaşında bir müzik fenomeni idi, dünya standartlarında müzik yazabilmek için 13 yıl daha çalışmak zorunda kalmıştır. Başka bir türde, Beatles 1964 yılında müzik piyasasına arka arkaya hitlet ve Ed Sullivan Show'da yer alma ile adım atmıştı, ancak 1957'den beri Liverpool ve Hamburg'da çeşitli kulüplerde çalıyorlar ve her ne kadar kitlenin ilgisini çekmeleri daha erken de olsa, ciddiye alınan ilk albümleri Sgt.Peppers Club 1967 yılında piyasaya çıkmıştı. Malcolm Gladwell bu fikri daha sonra populer yaptı, gerçi o 10 yıl yerine 10,000 saatlik çalışmaya odaklanmıştı. Belki de sihirli sayı 10,000 saattir, 10 yıl değil. Başka bir ölçüt te söz konusu olabilir : Henri Cartier Bresson (1908-2004) "İlk 10,000 fotoğrafınız en kötüleridir" demişti. Gerçek uzmanlık bir ömür alabilir : Samuel Johnson (1340 - 1400) "hayatın çok kısa, zanaat öğrenmenin çok uzun sürdüğünden" yakınmıştı. Hipokrat (M.Ö.4000) "Hayat kısa, zanaat uzun" sözüyle bilinir, ancak o söz "Ars longa, vita brevis, occasio praeceps, experimentum periculosum, iudicium difficile" sözünün kısaltmasıdır (Hayat kısa, zanaat uzun, fırsatlar kaçıyor, deneyimler vefasız, yargılamak güç). Elbette hiçbir sayı son cevap olamaz : programlama, satranç ya da müziğin tümünün uzmanlaşmak için eşit süre alacağı ya da herkesin eşit süreye ihtiyaç duyacağını varsaymak mantıklı değil.
Demek Programcı Olmak İstiyorsunuz?
Benim başarılı programcı reçetem şöyle :
Programcılıkla ilgilenin ve eğlendiğiniz için biraz programlama yapın. Yeterince eğlenceli olduğundan emin olun ki önümüzdeki 10 yıl / 10.000 saati vermeyi isteyesiniz.
Program yazın. En iyi öğrenme şekli yapmaktır. Daha teknik olarak ifade etmek gerekirse, "herhangi bir alanda maksimum performansa uzatılmış deneyimin otomatik sonucu olarak erişilmez, ama performans yüksek deneyimli insanların gelişmek için harcadıkları bilinçli eforun sonucu olarak artırılabilir" ve "en etkili eğitim yeterli derecede zor ama iyi tanımlanmış bir görevi, bilgi veren geri bildirimleri, tekrar imkanlarını ve hata düzeltmelerini içerir." Cognition in Practice:Mind, Mathematics and Culture bu konuda ilginç referanslar içerir.
Başka programcılarla konuşun; diğer programları inceleyin. Bu her eğitim kursundan daha önemlidir.
Eğer istiyorsanız, 4 yılınızı üniversite eğitimine (veya lisansüstüne) ayırın. Bu özgeçmişinize eklemek için bazı iş pozisyonlarına erişmenizi kolaylaştıracaktır, konuya dair daha derin bir bilgi sahibi olmanızı sağlar ama eğer okuldan hoşlanmıyorsanız, (biraz çabayla) benzer bir deneyimi kendi kendinize veya işinizde çalışırken de edinebilirsiniz. Her durumda kitaplar tek başlarına yeterli olmayacaktır. "Bilgisayar bilimleri eğitimi hiçkimseyi uzman programcı yapmaz, tıpkı fırçalar ve boya analizleri bilgisinin kimseyi uzman ressam yapmadığı gibi" der Eric Raymond, New Hacker's Dictionary'nin yazarı. Şimdiye kadar işe aldığım en iyi programcılardan birinin sadece lise diploması vardı; harika yazılımlar üretmişti, kendi haber grubu vardı ve kendi gece kulübünü satın alacak kadar hisse biriktirmişti.
Diğer programcılarla projelerde çalışın. Bazı projelerdeki en iyi programcı olun, bazılarında da en kötüsü. En iyi olduğunz zaman, kendi yeteneklerinizi bir projeyi yönetebilme ve başkalarına kendi vizyonunuzla ilham verebilme noktasında test edersiniz. Kötü olduğunuzda da ustaların ne yaptığını ve ne yapmayı sevmediklerini (ve böylece size yaptırdıklarını) öğrenirsiniz.
Başka programcıların yazdıkları projeler üzerinde çalışın. Başkası tarafından yazılmış bir programı anlayın. Orjinal programcıları ortada yokken onu anlamak ve düzeltmek için neyin gerekli olduğunu farkedin. Kendi programlarınızı tasarlama şeklinizin, siz ortada yokken onların bakımını yapmakla yükümlü olan kişilerin hayatını nasıl kolaylaştıracağını düşünün.
En az yarım düzine dil öğrenin. Bunların içine, bir tane sınıf soyutlamaları içeren dili (Java veya C++ gibi), bir tane işlevsel soyutlama içeren dili (Lisp, ML veya Haskell gibi), bir tane sözdizimsel soyutlama içeren dili (Lisp gibi) bir tane bildirim özellikleri destekleyen dili (Prolog veya C++ Templates gibi) ve bir tane de paralleizm içeren dili (Clojure veya Go gibi) dahil edin.
Bilgisayar bilimlerinin içinde "bilgisayar" kelimesinin geçtiğini unutmayın. Bilgisayarınızın bir komutu yerine getirmek için, hafızadan bir kelimeyi getirmek için, ardışık kelimeleri diskten okumak için ne kadar süreye ihtiyaç duyduğunu bilin.
Dil standartlaştırma çabalarına katılın. ANSI C++ komitesi de olabilir, ya da kendi kodlama tarzınız 2 veya 4 boşluklu girdilerden (indent, ç.n.) oluşacağına karar vermek te olabilir. Her koşulda, diğer insanların dillerle ilgili neyi sevdiğini, bunu ne kadar derinden hissettiğiini ve belki de neden böyle hissetiklerini anlarsınız.
Dil standartlaştırma çabasından mümkün olabildiğince kolay kurtulabilecek kadar iyi sezgileriniz olsun.
Tüm bunları düşünecek olursanız, sadece kitap okuyarak ne kadar ilerleyebileceğiniz gerçekten soru işareti. İlk çocuğum doğmadan önce bütün How To kitaplarını okudum ve kendimi hala hiçbirşey bilmeyen bir acemi gibi hissediyordum. 30 Ay sonra, ikinci bebeğimizi beklerken bilgilerimi tazelemek için kitap raflarına geri mi döndüm? Hayır. Onun yerine kişisel deneyimlerime güvendim ve bu uzmanlar tarafından yazılmış olan pek çok kitaptan daha yararlı oldu.
Fred Brooks, No Silver Bullet adlı makalesinde harika yazılım tasarımcılarını bulmak ile ilgili 3 aşamalı bir plan sunar:
En üst düzey tasarımcıları sistematik olarak keşfedin.
Kendisine gelişiminden sorumlu bir mentör atayın ve kariyerini dikkatlice izleyin.
Gelişen tasarımcıların birbiriyle etkileşimi için fırsatlar yaratın.
Bu makale bazı insanların harika bir yazılımcı olabilmek için gerekli niteliklere zaten sahip olduklarını söyler. Alan Perlis bu konuda daha da belirginidir : "Herkese heykel yapmak öğretilebilir, Michalengelo'ya nasıl heykel yapılamaz'ı öğretmek gerekiyordu. Büyük programcılarda da durum böyledir." Perlis'in söylediği, büyüklerin her zaman içlerinde olan belli kalitelerinin eğitimlerinin ötesine geçtiğidir. Ama bu kalite nereden gelmektedir? İçsel midir? Bunu zaman içinde mi geliştirmektedirler? Auguste Gusteau'nun (Ratatouille'deki şef karakter) dediği gibi, "herkes yemek pişirebilir ama ancak korkusuzlar muhteşem olabilir." Ben bunu, insanın yaşamının büyük bir parçasını bilinçli pratiğe adamasına bağlıyorum. Belki korkusuz bu durumu özetleyecek kelimedir. Ya da, Gusteau'nun eleştirmeni, Anton Ego'nun dediği gibi; "Herkes büyük sanatçı olamaz, ama büyük sanatçılar her yerden çıkabilir."
Yani gidin ve o Java/Ruby/Javascript/PHP kitabını alın, muhtemelen ondan biraz yarar sağlayacaksınız. Ama hayatınızı ya da programcı olarak genel uzmanlık seviyenizi 21 gün ya da 24 saat içinde değiştirmeyeceksiniz. Peki 24 ay boyunca sürekli olarak gelişmek için sıkı çalışmaya ne dersiniz? Pekala, şimdi bir yere varmaya başlıyoruz...