Nedir?
XY problemi, asıl problem yerine denediğiniz çözüm hakkında soru sormaktır. Bu, hem yardım isteyen, hem de yardım sağlayanlar tarafında çok fazla zaman ve enerji harcanmasına sebep olmaktadır. Kısaca:
- Kullanıcı X yapmak istiyor.
- Kullanıcı X'i nasıl yapacağını bilmiyor ama Y'yi yapmayı başarabilirse bir çözüm yoluna girebileceğini düşünüyor.
- Kullanıcı Y'yi nasıl yapacağını da bilmiyor.
- Kullanıcı Y hakkında yardım istiyor.
- Başkaları kullanıcıya Y ile ilgili yardım etmeye çalışıyor ama kafaları karışmış çünkü Y çözmek istemek için garip bir sorun gibi görünüyor.
- Bir sürü etkileşim ve harcanan zamandan sonra kullanıcının aslında X için yardım istediği, Y'nin X için uygun bir çözüm bile olmadığı anlaşılıyor.
Bu sorun, insanların inandıkları şeyin çözüm olduğu konusunda takılıp kalmaları ve geri adım atıp konuyu tam olarak anlatamamaları halinde ortaya çıkar.
Bu konuda ne yapmalı?
- Denediğiniz çözüme ek olarak mutlaka aslında hangi problemi çözmeye çalıstığınıza dair bilgiyi de her zaman ekleyin.
- Eğer birileri daha fazla bilgi isterse detayları mutlaka sağlayın.
- Daha önce gözardı ettiğiniz başka çözümler varsa, neden onları gözardı ettiğinizi paylaşın. Bu, gereksinimleriniz hakkında daha fazla bilgi verir.
Unutmayın, çözüme dair teorileriniz doğru olsaydı zaten en baştan yardım istemeyecektiniz, değil mi?
Örnekler
Örnek 1
"acemi", aslında bir dosyanın adının son 3 karakterini istemiyor, dosya uzantılarını istiyor, peki neden son 3 karakteri soruyor?
<acemi> Bir dosya adındaki son üç karakteri nasıl ekrana basabilirim?
<feline> Bir değişkenin içindeyse: echo ${foo: -3}
<feline> Neden 3 karakter? GERÇEKTEN ne istiyorsun?
<feline> Dosya uzantısını mı istiyorsun?
<acemi> Evet.
<feline> O halde İSTEDİĞİN ŞEYİ SOR!
<feline> Her dosya isminin üç harfli bir uzantısının olacağının garantisi yok,
<feline> Körü körüne üç karakteri yakalamak sorunu çözmez.
<feline> echo ${foo##*.}
Örnek 2
Mert, işletim sistemininin başkaları tarafından algılamasını istemediğini açıklayarak başlasaydı, bu çok daha kısa ve üretken bir tartışma olabilirdi:
Mert: 'nmap -O -A 127.0.0.1' 'OS:' ile başlayan bazı satırlar döndürüyor. Nasıl değiştirebiliriz?
Ebru: nmap'in kaynak koduna bakın, Linux bölümünü nasıl çözdüğünü bulun ve sonra TCP/IP yığınınızı nmap'ın algılayacağı şekilde çalışmayacak şekilde yeniden yazın.
Mert: Evet, ama linux sistem api'sini bilmiyorum.
Ebru: nmap'ın parmak izi, TCP / IP yığınının çalışma şekline dayanır. Söz konusu yığının uygun bölümlerini yeniden yazmaktan başka bir yol yok.
Mert: Gerçekten bu mesajlardan kurtulmam gerekiyor. `iptables` bu işi yapabilir mi?
Ebru: O halde OS algılama veya sürüm tarama kullanmayın
Mert: Başkalarının benim OS tipimi bilmesini engellemek istiyorum.
Ayrıca bakınız "Doğru Düzgün Soru Sormanın Yolları"
Yukarıdaki Türkçe metin, http://xyproblem.info/ adresindeki yazının Türkçeye çevrilmis ve uyarlanmış halidir.
Anlatılan şey ilginç, ama ismi pek güzel değil. X ile Y tamamen rastgele iki şey değil, aralarında bağlantı var ama bu bağlantı opak jargonun arkasında kalıyor. Önemli değil bu pek, daha önemli kısmı aşağıda:
İçeriğin haklı olduğu, doğru sonuç çıkardığı senaryoları anlıyorum... Ancak soru soranı eleştirmek kolay, ve de soruyu soranın da birçok durumda daha iyisini yapması zor. Mesela dosya uzantısı/üç karakter örneğini alın, bunu soran kullanıcı ne kadar detay vermesi gerektiğini ne kadar bilecek? Mesela "arkadaşlar bakın ben mp3'lerimi düzenlemek için bir program yazıyorum, çünkü elimde bu ve bu formatta mp3'ler var ve şu şekilde isimleri olmasını istiyorum ... ... ... ... ... (3 paragraf sonra) ve de sonuç olarak dosya isminden uzantıyı atmak istiyorum ki dosya adını alıp işleyebileyim" dese olması gerekenden fazla bilgi verecek, sırf dosya uzantısı ile ilgili bir soru için çok alakasız birçok bilgi barındırıyor. Neyin ne kadar alakalı olduğunu nereden bilecek, bilecek olsa zaten belki de o soruyu sormaya ihtiyacı da olmazdı. Örneğin, dosya uzantılarının hep 3 harf olduğunu düşünmüş, çoğunluğunun da bu şekilde olduğunu düşününce hedeften çok da uzak bir genelleme değil. Dolayısıyla bu işi dosya uzantısı temizlemek için yaptığını gerekli görmemiş, bu genelleme altında gerekli gözükmüyor cidden. Bu örnekte okuyan herkesin (hemen her programcının) çok iyi anladığı bir problem var, bir de herkesin çok da iyi anlamadığı bir problemi hayal edin:
Diyelim ki bir programcının ders programı hazırlayan bir program yazması gerekti bir okuldaki yarı zamanlı öğretmenler için. Arada kısıtlar var, birini bir yere koysanız diğeri açıkta kalıyor, diğer ikisini başka yere koysanız diğeri. Kolay bir şey değil bunu yapmak. Sonra görüyor ki bu programcımız, 10 öğretmene kadar girdilerde yazdığı program iyi çalışıyor, sonra saatler, bazen günler almaya başlıyor. Açtı diyelim en sevdiği forumu, veya en sevdiği StackExchange sitesini sordu: "Arkadaşlar benim bir çizelgeleme problemim var, ama beklediğimden çok kaynak kullanıyor, onun için şu şekilde bir veri yapısı dizayn ettim, şöyle böyle bakın, kullandığım tree search bundan sonra çok daha iyi performans gösterecek ama şu ve bu konuyu çözemedim yardım eder misiniz?"
Soruyu dinleyenler bakar, absürd bir şeyler vardır. Kurcalarlar, ucunu çekerler, bakarlar ki programcı çok da iyi anladığını düşündüğü problemi çok da iyi anlamamış ve çok önemli bir detayı söylemeyi unutmuş: "Bu öğretmenler yarı zamanlı!" Yani haftada 2 gün geliyorlar okula, ve de çözdüğü problem için aslında üstel zaman gerekmiyor, lineer zamanda çözülebiliyor. 3 gün geliyor olsalar, veya 4 gün geliyor olsalar ama üstel zaman gerekecek. Dolayısıyla tree search'lere, çılgın veri yapılarına gerek yok. Ama bu programcı mesela "İSTEDİĞİN ŞEYİ SOR" diye bağırılmayı hakediyor mu? Bence haketmiyor, öğretmenlerin yarı zamanlı olması, hangi günlerinin boş olduğu, kısıtların sayısı ve çeşidi, bu kısıtların hangi nedenlerle oluştuğu vb. birçok şey var probleminde, ama bunlardan bir sürüsü çözümüyle alakasız, bir sürüsüyle alakalı. Hangisinin gerekli olduğunu nasıl bilecek? (Genele, retorik soru) Siz hangilerinin ne kadar alakalı ve önemli olduğunu biliyor musunuz? Ben mesela vaktimi harcayıp sonunda eksik bilgi bu çıksa saçımı başımı yolup bağırmaya başlayabilirim, ama cidden hakediyor mu? Ben kendi anladığım bir konuda böyle bir örnek oluşturdum, siz de kendi iyi anladığınız başka bir konuda böyle örnekler oluşturup hayal edebilirsiniz adil olan tepkinin ne olacağını.
Onun için belki dosya uzantısı örneğinde olduğu gibi "apaçık başlangıç seviyesi" sorularda soru sorana "tam olarak ne yapmaya çalıştığını anlat" demek belki daha doğru, ama sorunun zorluğu arttıkça bunu yapmak kolay değil, veya bunun sınırını belirlemek kolay bir iş değil. Bana kalırsa kimse ilk verdiğim mp3 düzenlemeli aşırı uç örnekte olduğu gibi tüm projesini baştan sona anlatmak zorunda da olmamalı, o da farklı açıdan verimsiz. En iyisi düzgün iletişim, anlaşılmayan yerlerin sorulması, şüpheli yerlerin niye şüphel gözüktüğünü anlamak için geri soru sormak, bağırmamak, sevgi, saygı ve dünya barışı.