Üniversiteye ilk başladığım yıllarda – ki programlama ile tanışmam bu senelere denk geliyor – programlamanın kolay olduğunu düşünüyordum. Neden zor olduğunu düşünmeliydim ki? Bir insanın ürettiği makinaya input’ları gönderip, makinın bu inputları işlemesi ve insanların anlayabileceği output’lar üretmesi bana hep kolay görünüyordu.
Programcı’nın Wikipedia’daki tanımına bakarsak şöyle yazıyor;
A programmer, computer programmer, developer, coder, or software engineer is a person who writes computer software. The term computer programmer can refer to a specialist in one area of computer programming or to a generalist who writes code for many kinds of software.
Bu yüzden bence programlamayı zorlaştıran nedenlerin başında Software development process’in bir derya deniz olması geliyor;
- Harika bir input iletme
- Harika bir output oluşturma
- Input’ların açık ve sade bir şekilde dokümantasyonu
- Programın dokümantasyonu
- Programın test edilmesi
- Problemin iyi belirlenmesi
- Problemin çözümünün iyi belirlenmesi
- Ve dahası..
Bu maddelerin hepsi daha derinden incelendiğinde programlama’nın temelinde şunun olduğuna inanıyorum;
Programlama problem çözmektir!
Aslında bir program, bilgisayara bir problemi nasıl çözeceğini anlatır. Zira üzerinde yaşadığımız dünya problemlerle dolu ve bilgisayar biliminde bile çözülemeyen birçok problem var hala.
Fakat bilgisayardan büyük bir problemi çözmesini istediğinizde, genellikle ona bu problemi oluşturan birden fazla küçük problemlerin çözümünü anlatmak zorundasınız. Daha basit problemleri çözdüğünüzde, bilgisayara nasıl çalışması gerektiğini anlatan programları yazmak her zaman daha kolay olacaktır.
Bir macar matematikçi olan George Pólya, How to Solve It: A New Aspect of Mathematical Method isimli kitabında problem çözmeyi şöyle özetlemiş;
- Problemi anla.
- Problemi kendi sözcüklerinizle tanımayabilir misin?
- Problemi daha iyi anlamak için bir resim veya diagram çizebilir misin?
- Çözümü bulmak için yeterli bilgi mevcut mu?
- Problemin içerisindeki tüm kelimeleri anladınız mı?
- Cevap almak için soru sormaya ihtiyacınız var mı?
- Bir plan yap.
- Tahmin et.
- Sıralı bir liste yap.
- Olasılıkları ele.
- Özel durumları değerlendir.
- Denklemleri çöz.
- Planı uygula.
- Çalışmanı gözden geçir.
Peki ya bir problem için plan yapmak problemin kendisiyse? O probleme nasıl hamle yapacaksınız?
Pólya bu konuda şunu belirtmiş;
If you can’t solve a problem then there is an easier problem you can solve. Find it.
Peki bu ne işe yarar?
- Daha basit problemlerin çözümü sizi daha zor problemlerin çözümüne teşvik edebilir.
- Basit problemlerin çözümü özgüveni arttırmak için iyi bir pratiktir. Böylece basit problemlerin çözümünü içeren bir kod ile çalışmaya başlamanız size başarıya ulaştırmada yardımcı olacaktır.
- Zor problemleri çözmede başarısız olsanız bile daha basit problemleri çözmek size kredi kazandırır.
Hemen bir örnek verelim. Bilgisayarda konsol üzerinden ardı ardına celsius ölçeğinde girilen 10 sıcaklığın Kelvin cinsinde karşılıklarını bulan bir program yazalım. Bu problemin çözümünde şu şekilde bir yol izleyebiliriz mesela;
- Bilgisayarda konsol üzerinden girilen sadece bir değerin Kelvin değerindeki karşılığını bulmayı öğrenin.
- Belki de bu çok zordur. O zaman bilgisayarda girilen değerlere matematiksel işlemleri uygulamayı öğrenin.
- Belki de bu çok zordur. O zaman bilgisyara konsol üzerinden girilen sayısal değerin saklamnasını öğrenin.
- Belki bu da çok zordur. O zaman bilgisayara konsol üzerinden sayısal değer girilmesini öğrenin.
- Belki bu da çok zordur. O zaman bir konsol uygulaması oluşturmayı öğrenin.
- Belki bu da çok zordur. O zaman kullandığınız dil ile Hello World yazmayı öğrenin.
- Belki bu da çok zordur. O zaman kullandığınız IDE’yi açmayı öğrenin.
Kodlama problemlerinde de şu şekilde yollar vardır;
- Eğer dikdörtgen çizmede bir sorununuz varsa, bunun yerine problemi çizgiler çizmeye indirgeyebilir misiniz? Peki ya noktalar oluşturmaya?
- Eğer diskte bulunan bir text dosyasının içini okumada sorununuz varsa, bunun yerine problemi kendi yazdığınız string’leri okumaya indirgeyebilir misiniz?
Programlama için kötü koşullar
Eğer buraya kadar okuduysanız, programlamanın zorluğu hakkında bilgi sahibi olmuşsunuzdur. Neyseki, bu yüzden çalışma ortamları da programlamayı daha zor hale getirmek için tasarlanıyor. Muhtemelen birçoğumuz konsantrasyonumuzu bozacak gürültülere, konuşmalara, cep telefonu seslerine aşikar ortamlarda çalışıyoruz. Jeff Atwood – ki kendisi Stack Overflow kurucularından biridir – The Programmer’s Bill of Rights isimli yazısında bir programcıya sağlanması gereken tüm fiziksel ve çevresel gereksinimleri anlatıyor;
It’s unbelievable to me that a company would pay a developer $60-$100k in salary, yet cripple him or her with terrible working conditions and crusty hand-me-down hardware. This makes no business sense whatsoever. And yet I see it all the time. It’s shocking how many companies still don’t provide software developers with the essential things they need to succeed.
Programlama zor değil, sadece zaman alır
Hayatımda okuduğum en iyi yazılardan biri kesinlikle Peter Norvig’in yazdığı Teach Yourself Programming in Ten Years isimli makalesi.
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.
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.
İlk olarak 7 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”.
Bu yazıyı ne zaman okusam, hemen aklına üniversiteden mezun olup 2-3 yıl bir şirkette tecrübe edindikten sonra “Senior Developer” olan arkadaşlarım gelir. Biraz üzücü buluyorum bu durumu doğruyu söylemek gerekirse zira onlar muhtemelen “yarı bilgili” konumundalar. Bir kısmının artık işyerinde verilen işleri yerine getirmekten başka uğraşı yoktur. Kitap okumazlar, blog yazmazlar, blog okumazlar, kod okumazlar, open source projelere katkıda bulunmazlar, başka programcılarla iletişim kurmazlar, programlama konusunda insanlara yardımcı olmazlar vs vs..
Fakat bu bir yarış değil. Kendinizi başka programcılarla karşılaştırmayın. Jeff Atwood Why I’m The Best Programmer In The World isimli yazısında şöyle diyor;
But it’s not our job to be better than anyone else; we just need to be better than we were a year ago.