On Yılda Programlama Öğrenin (*)

Peter Norvig (**)


Neden herkes böyle bir telaş içinde?

Herhangi bir kitapçıya gittiğinizde Teach Yourself Java in 7 Days (7 Günde Java Öğrenin) benzeri, size birkaç günde veya birkaç saatte Visual Basic, Windows, Internet (vs.) öğretmeyi vadeden kitaplarla karşılaşırsınız. Amazon.com'da şöyle bir arama yapınca:
    pubdate: after 1992 and title: days and (title: learn or title: teach yourself)
	(1992'den sonra basılmış baslığında gün ve öğrenin kelimeleri geçen kitaplar)
karşıma 248 sonuç geldi. Bunların ilk 78 tanesi bilgisayar kitaplarıydı (79. ise, Learn Bengali in 30 Days (30 Günde Bengalice Öğrenin)). "Gün" anahtar sözcüğünü "saat" ile değiştirdiğimde ise sonuç benzerdi: ilk 77 bilgisayar kitabını 78. olarak Teach Yourself Grammar and Style in 24 Hours (24 Saatte Gramer ve Stil Öğrenin) takip ediyordu. Gelen toplam 253 sonucun ilk 200'ünün %96'sını bilgisayar kitapları oluşturuyordu.

Birkaç günde, Beethoven, Kuantum Fiziği ya da köpek eğitimi öğreten kitaplar yok. Bu sonuçlara bakılırsa, ya insanlar bilgisayar hakkında yeni şeyler öğrenmek için çok hevesli ve aceleci ya da bu iş bir şekilde inanılmaz derecede kolay.

Bakalım Learn Pascal in Three Days (3 günde Pascal Öğrenin) benzeri bir başlık ne anlama gelebilir:

  • Learn(öğrenin): İlk olarak 3 gün kayda değer programlar yazarak, yazdığınız programlardaki başarı ve başarısızlıklarınızdan ders almanıza yetecek bir süre değildir. Ne tecrübeli bir programcıyla çalışmaya, ne de o ortamın içinde yaşamanın nasıl bir şey olduğunu anlamaya zamanınız olmayacaktır. Bu durumda sadece yüzeysel bir aşinalıktan bahsedilebilir, derinlemesine bir kavramadan değil. Kısacası dili iyi öğrenmeye fırsatınız olmayacaktır. Alexander Pope'nin de söylediği gibi bir "yarı bilgili olmak çok tehlikelidir".

  • Pascal: 3 gün Pascal'ın sözdizimini öğrenmeye yetebilir (tabii eğer benzer sözdizimli bir dili önceden biliyorsanız), ama bu sözdizimini verimli bir şekilde kullanmayı öğrenemezsiniz. Kısacası, eğer bir Basic programcısıysanız, Pascal'da Basic mantığına dayanan programlar yazmayı öğrenebilirsiniz ama Pascal'ın hangi özellikler için iyi (ve nelerde kötü) olduğunu öğrenemezsiniz. O zaman ne anlamı kalır ki? Alan Perlis "Programla mantığınızı etkilemeyen bir dili öğrenmiş olmanın bir değeri yoktur." demis. Bir ihtimal, belirli bir işin üstesinden gelmek için biraz Pascal (yada muhtemelen Visual Basic ya da JavaScript) öğrenmeniz gerekiyordur. Bu durumda da nasıl programlama yapacağınızı değil, ancak o anki sorunun üstesinden nasıl geleceğinizi öğrenirsiniz.

  • in Three Days(üç günde): Malesef, ilerki bölümde de göreceğiniz gibi bu süre yetersiz.

On yılda Programlama Öğrenin

Araştırmacıların da (Hayes, Bloom) ortaya koyduğu üzere, satranç oynamaktan beste yapmaya, resimden piyanoya, yüzmeden tenise ya da nöropiskoloji ve topoloji alanlarında araştırma yapmaya kadar bir çok alanda uzman olmak, on yıl civarında bir zaman alıyor ve bunun bir kısayolu var gibi gözükmüyor. Daha 4 yaşında müzik dahisi olduğu anlaşılan Mozart bile, ancak 13 sene sonra dünya çapında ses getirecek bestelerini yapmaya başlamış. Diğer bir tarzda, Beatles, 1964'te sahnelere, ardarda hit olan şarkıları ve Ed Sullivan'ın programında çıkmalarıyla gelmiş gibi gözükseler de, aslında 1957'den beri Liverpool ve Hamburg'da küçük klüplerde çalıyorlardı. Başlangıçta kitleleri çabuk cezbetmelerine rağmen ilk kayda değer başarılarını 1967'de Sgt. Peppers ile yakaladılar. Samuel Johnson'a göre bu süreç on yıldan da fazla sürmekte: "Herhangi bir alanda kusursuzluğun, bir ömürboyu o iş için çalışmaktan daha hafif bir bedeli yoktur." Chaucer de, bir sanatı öğrenmenin çok uzun sürdüğünden, ama hayatın çok kısa olduğundan yakınır.

Benim programcılıkta başarı için tavsiyelerim şunlardır:
  • Sırf ne kadar eğlenceli olduğunu görmek için programcılıkla biraz uğraşın, programlar yazın. Programcılığın, on sene uğraşmak istemenizi sağlaycak kadar eğlenceli olan boyutunu kaybetmemesini sağlayın.

  • Diğer programcılarla konuşun, başka programları okuyun. Bu herhangi bir kitap veya kurstan daha önemli ve yararlıdır.

  • Programlar yazın. Öğrenmenin en iyi yolu pratiktir. Daha teknik bir şekilde ifade edecek olursak; "Bireylerin performanslarının en üst düzeyine, elde edilen tecrübelerle erişilemez, fakat çok deneyimli bireylerin bile gelişme yönündeki yoğun çabaları performanslaını yükseltmeye yeter." (s.366) ve "En verimli öğrenme şekli, bireyin seviyesine uygun bir konu üzerinde, bilgilendirici geri beslemeler, tekrarlama fırsatları ve hataların düzeltilmesi gibi çalışmalar gerektirir." (s.20-21) " Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life" isimli kitap bu bakış açısı için ilginç bir referans olabilir.

  • İsterseniz, üniversitede alacağınız dört yıllık bir eğitim ile (veya yüksek lisans için daha fazlası ile) bazı işler için gereken referansları elde edebilirsiniz. Ayrıca bu sayede konu üzerinde derinlemesine çalışmalar yapma şansı da bulabilirsiniz. Ama okuldan keyif almıyorsanız, biraz daha fazla çaba ile iş ortamında da bu tecrübeyi kazanabilirsiniz. Her iki durumda da kitaplardan öğrendikleriniz yetersiz kalacaktır. The New Hacker's Dictionary(Yeni Hacker Sözlüğü) yazarı Eric Raymond "Sadece boya ve fırça sizi iyi bir ressam yapmayacağı gibi bilgisayar bilimleri eğitimi de, hiçkimseyi uzman bir programcı haline getirmez" der. İşe aldığım en iyi programcılardan biri sadece lise mezunuydu. Çok güçlü ve çok iyi yazılımlar üretti, kendi USENET haber grubuna sahipti ve hiç şüphe yok ki hisse senetleri sayesinde şu anda benim hiçbir zaman olamayacağım kadar zengin.

  • Başka programcıların da katıldığı projelerde yer alın. Bazı projelerde en iyi, bazılarında en kötü programcı siz olun. Ekibin en iyisi siz olduğunuzda, bir projeyi yönetebilme becerinizi test edebilme imkanı ve vizyonunuzla takım arkadaşlarınızı etkileme fırsatı bulacaksınız. En kötü olduğunuz durumda ise, ustaların neler yaptıklarını ve neleri yapmaktan hoşlanmadıklarını (ki bu size yaptırdıklarıdır) gözlemleme şansı bulacaksınız.

  • Başka programcıların katıldığı projelerde onlardan sonra yer alın. Başka bir programcının yazdığı programı anlayabilecek seviyeye gelin. Yazılımın yazarı yokken onu anlamak ve düzeltmek neler gerektiriyor görün. Kendi yazdığınız programları da sizden sonra üzerinde çalışacakların işini kolaylaştıracak şekilde nasıl tasarlayacağınızı düşünün.

  • En az yarım düzine programlama dili öğrenin. Bunların içinde, sınıf soyutlamalarını içeren bir dil (Java veya C++ gibi), fonksiyonel soyutlamaları destekleyen bir dil (Lisp veya ML gibi), sözdizimi soyutlamalarını destekleyen bir dil (Lisp gibi), tanımlama özelleştirmelerini içeren bir dil (Prolog veya C++ kalıpları gibi), eşrutinleri destekleyen bir dil (Icon ve Scheme gibi) ve paralelliği destekleyen bir dil (Sisal gibi) mutlaka bulunsun.

  • "Bilgisayar bilimleri"nde "bilgisayar"ın da olduğunu unutmayın. Bilgisayarınızın bir komutu çalıştırmasının, ön ya da ana bellekten bir kelime yakalamasının, ardıl kelimeleri diskten okumasının ve disk üzerinde yeni bir yer bulmasının ne kadar zaman aldığını öğrenin. (Cevaplar aşağıda.)

  • Dil standartlaştırma çalışmalarından birinde yer alın. Bu ANSI C++ komitesi de olabilir, yerel programcılar olarak içe kaydırma standartlarınızın seviyesini belirleyecek bir çalışma da. Her iki durumda da diğer programcıların bir dilde neyi, ne kadar ve biraz da şanslıysanız neden sevdiklerini öğrenebilirsiniz.

  • Bu dil Standartlaştırma çalışmalarından bir an önce ayrılabilecek sağduyuya sahip olun.
Tüm bunları göz önünde bulundurunca, sadece kitaplardan öğrendiklerinizle ne kadar ilerleyebileceğiniz tartışılır. İlk çocuğum doğmadan önce, bütün How To (Nasıl) ... kitaplarını okumuştum ve buna rağmen kendimi hala bilgisiz bir çömez gibi hissediyordum. 30 ay sonra, ikinci çocuğum doğacakken, bir tekrar için kitaplara geri mi döndüm dersiniz? Hayır, bunun yerine kişisel tecrübelerime güvendim ve daha sonra gördüm ki bu, uzmanlar tarafından yazılmış binlerce sayfadan çok daha yararlı ve güven verici.

Fred Brooks (***), "No Silver Bullets" isimli eserinde iyi yazılım uzmanları bulmak için üç seviyelik bir plan tanımlamış:
  1. Sistematik olarak ve mümkün olduğunca erken iyi tasarımcıları belirleyin.

  2. Yeni başlayanların kariyer dosyalarını düzenlemesi için onların gelişiminden sorumlu bir kariyer yöneticisi görevlendirin.

  3. Yetişmekte olan tasarımcıların birbirlerinden etkilenip harekete geçecekleri imkanlar yaratın.
Bu gösteriyor ki bazı kişiler müthiş birer tasarımcı olmak için gerekli özelliklere zaten sahipler, iş onları ikna etmeye kalıyor. Alan Perlis bunu daha özlü bir biçimde "Herkese heykel yapmak öğretilebilir: Michelangelo'ya ise nasıl yapılamayacağı öğretilmeliydi. Bu çok iyi programcılar için de böyledir." şeklinde ifade etmiştir.

Hadi, şimdi gidip o Java kitabını satın alın; muhtemelen işinize yarayacaktır. Ama 24 saatte, günde hatta ayda, hayatınızın değişmesini veya programcı olarak gerçek yetenek ve deneyimlerinizin gelişmesini beklemeyin.


Referanslar

Bloom, Benjamin (ed.) Developing Talent in Young People, Ballantine, 1985.

Brooks, Fred, No Silver Bullets, IEEE Computer, vol. 20, no. 4, 1987, p. 10-19.

Hayes, John R., Complete Problem Solver, Lawrence Erlbaum, 1989.

Lave, Jean, Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life, Cambridge University Press, 1988.

Cevaplar

2001 yazında, 1 GHz bir bilgisayar üzerinde çeşitli operasyonların gerçekleştirilme süreleri:

tek komut çalıştırma: 1 ns (nanosaniye) = 1/1,000,000,000 saniye
L1 ön bellekten kelime yakalama: 2 ns
ana bellekten kelime yakalama: 10 ns
ardışık disk birimlerinden kelime yakalama: 200 ns
disk üzerinde boş yer arama: 8,000,000 ns = 8 ms (mikrosaniye)

Notlar

T. Capey, Amazon'daki
"Complete Problem Solver" isimli kitabın altındaki "Bu ürünü alanlar bunları da aldılar" bölümünde "Teach Yourself Bengali in 21 days" ve "Teach Yourself Grammar and Style" kitaplarının da bulunduğuna dikkatimizi çekiyor. Bence, bu ürünlere bakan kişilerin büyük bir çoğunluğunu bu sayfadan gidenler oluşturuyor.
Peter Norvig (Copyright 2001)


(*) Peter Norvig'in adresindeki Teach Yourself Programming in Ten Years isimli makalesinin Çağıl Uluşahin tarafından gerçekleştirilmiş çevirisidir.

(**)Peter Norvig Google'da Arama Kalitesi Geliştirme bölümünde çalışmakta olup Artificial Intelligence: A Modern Approach kitabının yazarlarındandır.

(***) Fred Brooks, IBM 360 projesinde yöneticilik de yapmış bir bilgisayar bilimcisi ve profesyonelidir. " The Mythical Man Month"ın yazarıdır. Burada Brooks IBM'deki adam seçme metodundan bahsediyor.