Category Archives: Programlama

Neden Programlama Bu Kadar Zor?

Ü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ş;

  1. 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ı?
  2. Bir plan yap.
    • Tahmin et.
    • Sıralı bir liste yap.
    • Olasılıkları ele.
    • Özel durumları değerlendir.
    • Denklemleri çöz.
  3. Planı uygula.
  4. Ç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.

Ne ki Tayland’ın derdi?

Johs Susser gerçekten çok geyik bir programcı. Aynı zamanda iyi de bir girişimcidir. Geçenlerde gönderdiği tweet ile uzun zamandır üzerinde düşündüğüm bir konuya değindi kendisi.

Eğer sizde şimdiye kadar en az bir defa değişik zaman dilimlerinde çalışan bir yazılım projesinde görev aldıysanız, muhtemelen siz de Josh’un bu fikrine katılıyorsunuzdur. Projenizdeki dosyaların server’lara yüklenme zamanlarını ve bunları farklı zaman diliminde yaşayan insanlara göstermekte zorluklar yaşayabilirsiniz. Özellikle .NET programcıları için DateTime sınıfının bazı sorunları olduğundan bu durum daha karmaşık hale gelebilir. Şöyle belirginleştirelim bu durumu. Aşağıdaki kod parçasını ele alalım;

 Console.WriteLine(DateTime.Now == DateTime.UtcNow); 

Aslına bakarsanız başlarda bu kodun ne yapması gerektiğini bir türlü kavrayamamıştım. Fakat biraz daha üzerinde kafa yormaya başlayınca önümde 3 seçenek belirmeye başladı;

  • Her zaman True yazdırır, ikisi de aynı zamanı gösterir, sadece biri local zamanı diğeri de evrensel zamanı.
  • Her zaman False yazdırır, bu iki değer farklı çeşit veriyi ifade eder, bu yüzden bunlar otomatik olarak eşit olamazlar.
  • Eğer yerel zamanınız UTC ile senkronize ise, zaman dilimine uyulmaksızın True döndürür ki bu iki değer eşittir.

Bu kod benim derlediğim 4 farklı yerdeki derleyicide de False sonucunu döndürdü. Kendi bilgisayarımdaki derleyicide False sonucunu döndürmesi çok doğal tabi ki, zira İstanbul UTC+02.00 zaman diliminde olduğundan bu iki değer hiçbir zaman aynı zamanı göstermezler. Herneyse, DateTime hakkında bu kadar dedikodu yeter. Şimdi asıl konumuza dönelim.

Tayland..

Bildiğiniz gibi dünya üzerinde kullanılan birden fazla takvim var. Bu takvimlerden birçoğu etkili bir insanın doğum günü ile başlar. Standart uluslararası takvim Hz. İsa’nın doğum yılını 1 olarak kabul eder, ondan önceki her yıl milattan önce kabul edilir. Budist takvimi Buddha’nın ölümü ile başlar.

Fakat Tayland takviminde göre Buddha’nın 2556 yıl önce vefat ettiğini, yani Hz. İsa’dan 543 sene önce vefat ettiğini belirtir. Bu yüzden eğer Miladi takvim ile Tayland’ta hangi yıl olduğuna bakmak isterseniz miladı yıla 543 yıl eklemeniz gerekir.

 2013 + 543 = 2556 

Peki kod ile bu yıla ulaşmaya çalışsak? Çok basit. Yeni bir ThaiBuddhistCalendar() nesnesi oluşturup bunun GetYear() methodunu şu anki local zaman parametresi ile çalıştırabilirz ;


Console.WriteLine(new ThaiBuddhistCalendar().GetYear(DateTime.Now)); // 2556

Peki bunu bir de DateTime nesnesi oluşturup ulaşmaya çalışsak?


DateTime d = new DateTime(2013, 1, 1, new ThaiBuddhistCalendar());
Console.WriteLine(d.Year); // 1470

Görüldüğü üzere, burada Budist takvimine göre bir DateTime nesnesini oluşturmamıza rağmen, Year özelliği 1470 değerini gösterir. Çünkü DateTime nesnesi, hangi takvimi kullanacağını yorumlayamaz. Varsayılan olarak her zaman Miladi Takvimi kullanır. Bu yüzden Budist takvimine göre 2013 yılı için oluşturduğumuz DateTime nesnesinin Year özelliği Budist takviminde 2013 yılının Miladi takvimde 1470 yılını gösterdiği için bu değeri alır.

Eğer günlük zaman kaydetme işlemlerinde ya da zaman dilimleri hakkında en iyi çözümleri öğrenmek isterseniz aşağıdaki konuya bir göz atmanızı tavsiye ederim;

Peki neden Tayland?

Aslında ThaiBuddhistCalendar()’ı kullanan en temel ülke olmasının yanı sıra asıl neden başka..

The Hangover Part II

Peki ya başlık?

Başlığın ilham kaynağı da Türk sinema tarihinin gülen adamı Kemal Sunal’dan gelsin:

feyzo : bismillahirahmanirahim. hoca efendi anam sana gelecek.
haco efendi : ne ki ananın derdi ?
feyzo : der bende deva sende. bismillahhhh.. ” taaaak ! biloya tokat. ”
bilo : ne itip duriysen ula ?
feyzo : sus günah abdest alıyosun eşşolu eşşek. neuzübillah.. beni okutacak sana, kara sevda olmuşam çünkim.
haco : heç öyle bi hal görmiyem sende.
feyzo : bi yüzlük var sana helalinden. çaremde şu güloyla evlenmek. anamı razı et.
haco : çok az. iki yüzlük bide horoz, hemide iri.
feyzo : nerden bulam horozu ?! 150 gayme verem sulf olak.
haco : kurtarmaz. bide tavuk.
feyzo : anlaştık.