Bir Programcı Nasıl Düşünür- Problem Çözme Dersleri

Richard Reis

Aşağıdaki yazı tarafımca orjinalinden çevrilmiştir. Salih BALTALI

Eğer programlama ile ilgileniyorsanız, daha önce şu alıntıyı görmüş olabilirsiniz:

Bu ülkedeki herkes bilgisayar programlamayı öğrenmelidir, çünkü insana düşünmeyi öğretiyor.

Steve jobs

Bir programcı gibi düşünmenin ne anlama geldiğini sen de merak etmişsindir, bu nasıl yapılıyor?

Aslında konu, programlamanın, problem çözmenin daha verimli bir yolu olduğu hakkındadır.

Bu yazıda amacım bu yolu size göstermektir.

Sonunda, daha iyi bir problem çözücü olmak için neleri bilmen gerektiğini öğreneceksin.

Bu neden bu kadar önemli?

Problem çözme zihinsel bir aktivitedir. Büyüklü küçüklü hepimizin birçok problemi var. Bazen onlarla başa çıkarken bazen yapamıyoruz.

Eğer bir sisteminiz yoksa, büyük ihtimalle aşağıdaki gibi problemleri çözersiniz (benim yaptığım gibi)

  1. Bir çözüm üret.
  2. Çalışmıyorsa tekrar başka birşey dene.
  3. Yine çalışmıyorsa, şansın yaver gidene kadar 2. adımı tekrar uygula.

Kimi zaman şansın yaver gider, ancak bu yöntem en kötüsüdür. Daha da kötüsü bu şekilde çok büyük bir zaman kaybı yaşarsın.

En iyi yol a) bir sistemin olması b) pratik yapmak.

“Neredeyse bütün işverenler problem çözme becerisine ilk olarak öncelik vermektedirler.

Problem çözme becerileri neredeyse bütün işverenlerin herhangi bir programlama dilinde uzman olmak, hata ayıklamak, sistem tasarlamaktan daha çok aradığı en önemli özelliktir.

Bilişimsel düşünmek, karmaşık problemleri küçük parçalara ayırmak bir iş için temel teknik becerilerden daha değerlidir(daha fazla değilse bile).”
Hacker Rank 2018 Geliştirici Becerileri Raporu

Bir Sistem Kurun

Doğru sistemi kurmak için Tim Ferriss’in “The 4-Hour Chef(4 Saalik Şef)” isimli kitabındaki tavsiyelere uydum.

İki etkileyici insan beni mülakat yapmak için yönlendirdi: C. Jordan Ball ve V. Anton Spraul (CoderByte’ta 65,000+ fazla insanın oyladığı birinci ve ikinciler bunlar). Bunlar aynı zamanda Think Like a Programmer: An Introduction to Creative Problem Solving kitabının yazarlardır.

Aynı soruları onlara sordum, tahmin edin ne oldu? Verdikleri cevaplar çok benzerdi!

Birazdan onları öğreneceksin.

Not: Bu herşeyi aynı yaptıkları anlamına gelmiyor. Herkes farklıdır tabi ki. Sen de farklı olacaksın. Ancak hepimizin kabul ettiği temel ilkelerle başlarsak, daha hızlı yol alırız.

Programlamaya yeni başlayanlarda gördüğüm en büyük hata problemin nasıl çözüldüğünden çok yazım hatalarına odaklanmalarıdır.

V. anton spraul

Bir problemle karşılaştığımızda ne yapmalıyız peki?

Problemi Anlayın

Tam olarak ne sorulduğunu anlayın. En zor problemler zordur, çünkü onları tam olarak anlamıyoruz.

Bir problemi anladığınızı nasıl anlarsınız?

Bir problemde takılıp kaldığınızı hatırlıyor musunuz? Açıklamaya başlıyorsun ve bir anda daha önce görmediğin mantık hatalarını görüyorsunuz.

Birçok programcı bunu yaşıyor.

Bu yüzden problemi bir şekle dökmeli ya da başka birine anlatmalısınız (veya rubber duck kullanabilirsiniz)

Birşeyi basit terimlerle açıklayamıyorsanız, anlamamışsınız demektir.

Rıchard feynman

Plan Yapın

Bir planınız olmadan çözmeye çalışmayın. Çözümünüzü planlayın.

Adımları yazmazsanız, kimse size yardımcı olamaz.

Programlamada bu hemen atağa geçmemek anlamına geliyor. Beyninize bilgiyi işleme ve problemi analiz etmek için bir zaman tanıyın.

İyi bir plan yapmak için, şu soruya cevap verin:

Bir X girdisi veriliyor, Y çıktısını döndürmek için gerekli adımlar nelerdir?

Not: Programcıların kendilerine yardımcı olacak araçları vardır. Yorumları alalım!

Bölün

Dikkatinizi verin. En önemli adım budur.

Büyük problemi çözmeye çalışmayın. Bunun yerine problemi alt problemlere bölün. Bu alt problemleri çözmek daha kolay olacaktır.

Daha sonra, tek tek her alt problemi çözün. En basitinden başlayın. En basiti cevabını bildiğiniz ya da cevaba en yakın olandır.

En basit problem, çözümü, diğerlerinin çözülmesine bağlı olmayan problemdir.

Her alt problemi çözdüğünüzde noktaları birleştirin.

Bütün alt çözümleri birbirine bağlama sizi orjinal çözüme yaklaştırır.

Tebrikler!

Bu, teknik problem çözmenin köşe taşıdır. Hatırlayın (Eğer yaparsanız, bu adımı tekrar okuyun)

Eğer yeni başlayan bir programcıya bir problem çözme becerisini öğretseydim, bu “problem tekniğini azalt” olacaktır.

Örneğin, yeni bir programcısınız ve 10 sayıyı okuyan ve 3. en büyüğünü bulan bir program yazmak istiyorsunuz. Temel programlama teknikleriyle çözülebilmesine rağmen çömez bir programcı için zorlu bir problem olabilir.

Eğer zorlanırsanız, problemi daha basite indirgeyin. Üçüncü en büyük sayı yerine, en büyüğünü bulmayı deneyin. Hala zor geliyor mu? O zaman sadece 3 sayıdan en büyüğünü bulmaya çalışın. Ya da iki sayıdan?

Sorunu nasıl çözüleceğini bildiğiniz noktaya kadar indirgeyin/daraltın ve çözümü yazın. Ardından problemi genişletin ve çözümü eşleştirmek için yeniden yazın ve başladığınız yere geri dönene kadar devam edin.”- V. Anton Spraul

Sıkıştınız mı?

Şimdiye kadar, orada oturup “Hey Richard… herşey harika, ancak şayet sıkışırsam ve ve bir alt problemi çözemezsem?” diye düşünüyorsunuzdur.

İlk olarak derin bir nefes alın. İkincisi, bu makul bir durum.

Bu yüzden endişelenmeyin, herkesin başına bu gelir.

Fark şurada, en iyi programcılar/problem çözücüler hata ve sorunlar karşısında onlardan kaçmak yerine daha da merakla üzerine gider.

Aslında, sıkıştığınızda yapacağınız üç şey var:

Debug: Yanlış giden şeyleri bulmak için adım adım takip edin. Programcılar buna hata ayıklama (debugging) demektedir.

“Hata bulma sanatı, programınıza yapmasını istediğinizi düşündüğünüzden ziyade programınıza yapmasını söylediğiniz şeyi bulmaktır.” – Andrew Singer

Yazar burada sofistike bir cümle kurmuş, meali; “hata bulma sanatı programa ne yapması gerektiğini söylediğinle alakalıdır, ne düşündüğünle değil” demek istemiştir (S.B).

Tekrar Değerlendir: Bir adım geri at. Başka bir açıdan probleme bak. Daha genel bir yaklaşıma soyutlanabileceğiniz birşey var mı?

“Bazen bir sorunun detaylarında o kadar kayboluruz ki, sorunu daha genel bir düzeyde çözecek genel ilkeleri göz ardı ederiz.[…]

Klasik bir örnek vermek gerekirse, 1+2+3+..+n gibi ardışık tamsayıların toplamını her iterasyonda ekleme yapmak yerine genç Gauss çabucak n(n+1)/2 şeklinde çözdü”
– C. Jordan Ball

Tekrar değerlendirmenin diğer bir yolu da yeniden başlamaktır. Herşeyi silin ve taze gözlerle yeniden başlayın. Ciddiyim. Bunun ne kadar etkili olduğuna şaşıracaksınız.

Araştırın: İyi ki Google var. Doğrusunu bulun ve okuyun. Problem ne olursa olsun birisi büyük ihtimalle çözmüştür. Kişiyi/çözümü bulun. Aslında, problem çözsen bile bunu yap! (Diğer insanların çözümlerinden çok şeyler öğrenebilirsin- Buna katılıyorum, tecrübeyle sabit (S.B))

Uyarı: Büyük problemin çözümünü aramayın. Sadece alt problemlerin çözümünü arayın. Neden? Çünkü uğraşmadıkça hiçbirşey öğrenemezsin. Eğer hiçbirşey öğrenmiyorsan, vaktini tüketiyorsun demektir.

Pratik Yap

Bir hafta sonra harika birşeyler olmasını bekleme. İyi bir problem çözücü olmak istiyorsan çok fazla problem çözmelisin!

Pratik, pratik, pratik. “bir problemin bu yöntemle kolayca çözülebildiğini” farkına varmanız sadece bir an meselesi olacak.

Peki nasıl pratik yapalım?

Satranç, bulmaca, matematik problemleri, sudoku,Go, Monopoly, video oyunları, şifre çözme gibi alternatifler var.

Aslında başarılı insanların ortak bir özelliği vardır; onlar için pratik yapmanın bir alışkanlık olması. Örneğin Peter Thiel satranç oynar, Elon Musk ise video oyunları.

Byron Reeves “Üç-beş yıl içinde iş liderliğinin nasıl görünebileceğini görmek istiyorsanız, çevrimiçi oyunlarda neler olduğuna bakın.” dedi.

“Elon Musk, Reid Hoffman, Mark Zuckerberg şirketlerini kurmadaki başarılarının temelinde bilgisayar oyunlarının olduğunu söylüyorlar”- Mary Meeker (2017 internet raporları)

Bu sadece oyun oynayalım demek değil elbette!

Ancak bilgisayar oyunlarının konusu nedir? Evet, bildiniz: problem çözme!

Yapmanız gereken şey pratik yapmanın bir yolunu bulmaktır. Hoşunuza gidecek problemleri çözün.

Örneğin, ben programlama problemlerini çözmekten zevk alıyorum. Her gün, en az bir tane çözmeyi deniyorum. (genellikle Coderbyte‘a takılırım)

(Twitter adresimde böyle platformların tanıtımını yapıyorum, ara ara. S.B)

Söylediğim gibi, bütün problemler benzer özellikler taşır.

Sonuç

Hepsi bu kadar millet!

Şimdi, bir programcı gibi düşünmenin ne anlama geldiğini biliyorsunuz.

Problem çözmenin bilişsel yeteneklerinizi geliştirmek için inanılmaz beceri olduğunu da bilmelisiniz.

Bu yeterli gelmiyorsa, problem çözme becerilerinizi pratik yapmak için ne yapacağınızı nasıl bildiğinizi fark edin. (Nasıl öğrendiğinizi öğrenin diyor yazar S.B)

Vay be! Çok havalı değil mi?

Son olarak, birçok sorunla karşılaşmanızı dilerim.

Doğru okudun. En azdan onları nasıl çözeceğini şimdi biliyorsun. (aynı zamanda her çözümle de öğreneceksin)

“Başarılı bir şekilde bir engeli geçtiğinde bir diğeri ortaya çıkacaktır. Hayatı ilginç kılan şey de budur.

Her zaman birşey öğreneceksin.

Her zaman, kuvvetli, bilgili ve geniş bakış açısına sahip olacaksın.

Her seferinde rekabetten birşey azalır. Ancak, geriye senin en iyi versiyonun kalır.”
— Ryan Holiday (The Obstacle is the Way)

Şimdi, git ve biraz problem çöz.

İyi şanslar!