Yazılım, Matematik ve Problem Çözme Algoritması Üzerine

rubiks_cube

rubiks_cube

Problemler İtinayla Çözülür !

Okul yıllarında çözdüğümüz matematik problemlerinden bahsetmiyorum. Günlük yaşamımızda ve iş hayatımızda karşılaştığımız hayat problemleri bunlar. Bunları çözmek için ezberlenecek formül de yok. Hatta defter kitabın açık olması da fayda etmiyor. Ancak kafamızı kıra kıra, tecrübe ederek öğrenebiliyoruz.

Bu yazıda bir yazılımcının (şahsım olur kendisi ) yıllar içinde evrimleşen problem çözme yaklaşımlarına, bu yöntemlerin hayata izdüşümüne, biraz pratik biraz da felsefik bir açıdan yaklaşacağım. Nereden çıktı derseniz: Bu aralar biraz fazla problem çözüyorum da, oradan.

Teoriden Pratiğe Yumuşak Bir Geçiş

Yıldız Teknik Üniversitesi – Matematik Bölümünden 1998 yılında, yazılıma meraklı genç bir matematikçi olarak mezun olduğum yıllarda, neredeyse çocukluğumdan beri süren problem çözme merakım sayesinde, çözüm sistematiğini (biz Matematikçiler Algoritma da deriz) oldukça rafine etmiştim. Bir problem üç aşamada çözülür:

  • 1 ) Problemi anlama ve tanımlama,
  • 2 ) Çözüm yöntemini bulma, 
  • 3 ) Sonuca ulaşma.

Devamında gelen, yazılım sektöründeki 10 yıllık iş tecrübemde, problem çözme yaklaşımımda bazı eklemeler ve evrimleşmeler oldu. Ancak meselenin özü her zaman korundu.

Yazılım problemlerinin çözümüyle, matematik problemlerinin çözümü birçok açıdan birbirine çok benzer. Bu anlamda yazılım sektöründe sadece yazılım yaptığım ilk yılların oldukça keyifli geçtiğini söylemeliyim. Ancak ilk birkaç yıldan sonra müşteriler ile temasın başlaması, problem çözme algoritmamda bazı eklemeler yapma ihtiyacını doğurdu. Yazılım projelerindeki insan faktörü, ilk aşama olan “Problemi anlama ve tanımlama” adımını oldukça güçleştiriyordu. 

ış hayatının problemleriyle baş edebilmek için; iş dünyasının kurallarını öğrenmek,  iletişim, ekonomi ve organizasyonel davranış konularında bilgi ve tecrübe sahibi olmak gerekiyordu. Bu dönemi teorik olarak da desteklemek üzere 2000 – 2003 yılları arasında ıstanbul Üniversitesi MBA (ışletme Yöneticiliği)  programını tamamladım. Bir taraftan da öğrendiklerimi iş hayatında uygulama fırsatım oldu. Bu dönemde klasik problem çözme algoritmamı,  üç yeni adımla geliştirdim. Son hali şöyle oldu:

  1. Var olmayan problemi eleme
  2. Problemi anlama ve tanımlama
  3. Alternatif çözümleri (veya çözümsüzlüğü) tartma 
  4. Çözüm yöntemini bulma, 
  5. Sonuca ulaşma.
  6. Başarıyı pazarlama

Bu maddeleri biraz açıklayayım. Örnek olarak, müşteriden bize iletilen 10 maddelik bir problem listesiyle yola çıktığımızı düşünelim. şahsi tecrübeme göre bu problemlerden en az 3 tanesi gerçekte var olmayan problemlerdir ve doğru bir analiz ile ilk adımda elenebilirler. ış hayatında çoğu zaman; kişisel kapris ve hesaplar (ingilizceden apartma tabirle gizli ajanda -hidden agenda- da deniyor), bütünsel bakış eksikliği ve yanlış konumlandırma gibi sebeplerle problem olarak sunulan şeyler aslında problem değildir ve en baştan elenmesi gerekir.

İkinci olarak, problemlerin çözüm yöntemlerini, özellikle maliyet bazlı olarak karşılaştırmak, çoğu zaman çözümsüzlüğün veya alternatif çözümlerin, yazılımsal çözümden daha ekonomik olması sonucuyla sonuçlanır.  Bu durumda işletme, daha ekonomik olan çözüm yöntemi tercih edecektir.   10 maddelik listemizden en az 2 madde, yazılım dışı alternatif yöntemlerle daha ekonomik olarak çözülebilmektedir.

“Gözün gördüğü aklın bildiği kadardır” diye bir deyiş vardır. ış tecrübesi olmayan bir yazılımcıyı, bu 10 maddelik listeyle başbaşa bırakırsak, 10 una da yazılımsal çözüm uygulayarak işi bitirmeye çalışacaktır. Bu da gayet doğaldır. Halbuki listenin en az yarısı, yazılım dışı çözümü gerektirmektedir. Sık düşülen bu hata, yazılım projelerinde; kodları sürekli ve kontrolsüz büyümesi (bir nevi kanser gibi düşünülebilir), bir tarafı yaparken başka yeri bozma, ve uzun vadede tüm çözüm ve sorumluluğun yazılım sisteminde aranması sonuçlarını doğurmaktadır. Doğru bir çözüm ne bir kelime eksik, ne de  fazla olmalıdır.

Son olarak, yapılan işi reklam etmenin, alkışlamak ve alkışlatmanın, en az işi yapmak kadar önemli olduğu gerçeğini öğrendim. ış hayatı, emeğinin takdirini göremeyen nice cevherler ve hiç emek sarfetmediği halde pastadan pay kapmak isteyen kolaycı uyanıklarla dolu. 

Einstein, Türkler ve Zaman kullanımı

Einstein'ın en sevdiğim pozu :)Araştırma fırsatım olmadı, biraz kulaktan dolma bir bilgi olacak ama, rivayet olunur ki Einstein’a zaman kullanımı konusunda şöyle bir soru sorulmuş: Size hayati önemde bir problem verilse ve çözmeniz için de bir saat süre verilse, bu süreyi nasıl kullanırsınız ? Einstein’ın bu soruya verdiği cevap : ılk 50 dakikada problemi anlarım, 9 dakikada nasıl çözeceğime karar veririm, 1 dakikada da çözerim. Einstein’ın cevabı başta uçuk gelse bile tecrübelerim hep Einstein’ı haklı çıkardı ve zaman içinde ben de bu planına yaklaştığımı gördüm.

Başka bir örnek, biraz geyik olmakla birlikte, Amerika’lıların ve Japonların iş yapma biçimiyle ilgili olarak verilir. Söylenir ki Amerika’da bir işin yapılması için 60 dakika düşünülür 600 dakika çalışılırmış. Aynı iş için Japonlar 600 dakika düşünür 60 dakika çalışırmış. Bu işi biz Türkler yapsak, büyük ihtimalle resim şöyle olurdu: Hiç düşünmeden ilk 60 dakika işe bodoslama dalar ve çakılırdık. Sonraki 600 dakikada da sil baştan düzgün bir şekilde yapardık. Bunu yermek amaçlı olarak söylemiyorum, üç yönteminde kendine göre avantajları/dezavantajları var. Hatta her yöntem, kendisini uygulayanda en iyi sonucu veriyor ama bu başka bir yazının konusu.

Aşk Yeniden 

Gel gelelim bu yazıyı kaleme alma sebebime. Diyeceksiniz ki böyle ciddi bir yazı üstüne aşk ne alaka ? şöyle ki, problem çözme algoritmamda son dönemde yeni bir ekleme daha oluştu. 

Bu sitenin müdavimlerini takip ettiği üzere, açık kaynak kodlu Openbravo yazılımının Türkiye yerelleştirmesiyle bir süredir haşır neşir oluyorum. Bu süreçte de birçok problemlerle karşılaşıyorum ve algoritmamı kullanarak çözmeye çalışıyorum.  Problemlerin beni bir hayli uğraştırdığını da itiraf edeyim.

Çalıştığım firmada bir destek departmanı var. Bu departmanda çalışan arkadaşlarım profil olarak yazılımcı olmayan ancak yazılımlara destek veren kişiler. Yaşadığım bazı problemlerden onlara da bahsettim. Önerdikleri çözüm şu oldu : Yazılımı baştan kur ! . ( Ne yani bir sürü emek verdiğim ve bu noktaya getirdiğim sistemi baştan mı kurayım. ! ) Biraz sakin kafayla düşününce şu sonuca vardım. Uğraştığım bir problemi çözmek için harcadığım zaman bazen bir-iki günü buluyordu. Halbuki tüm sistemi baştan kurmak bir günden biraz az bir zaman alıyordu. Kısaca her durumda baştan kurmak daha ekonomikti. ( Ekonomiyi severim ) Böylelikle her yaşadığım problemde, çözüm için uğraşmak, aynı problemleri yaşayan başkalarının tecrübelerin araştırmak vs. gibi uğraşları bıraktım. Tüm sistemi baştan temiz bir şekilde, doğru parametrelerle baştan kurmaya başladım. Böylece bu güne kadar Openbravo yu toplamda 10 kereden fazla, baştan kurdum (reinstall) ve şu anda kararlı bir yapıya oturttum sanırım.

Sonuç inanılmaz. (Sizi seviyorum destek insanları ! ) Problemler çok daha kolay ve hızlı çözülüyor. Her yeni kurulumda, kulağıma kulaklığı takıp Yeni Türkü’den “Aşk Yeniden” i mırıldanarak  problemi aşmaya bayıldım.   Bu pratiği hayatın diğer alanlarına da uygulayabilir miyim bilmiyorum ama sonuç olarak yazıyı bir sloganla noktalıyorum.

– Eğer iyi bir başlangıç yapmamışsanız, hiç üşenmeden ve zaman kaybetmeden:  “Aşk Yeniden”