Problem çözme yeteneğimi nasıl geliştirebilirim?


50

Herkes aynı şeyi söylüyor: "gerçek bir programcı gerçek sorunların nasıl çözüleceğini bilir." Fakat bu yeteneği nasıl öğrendiklerini ya da nerede öğrendiklerini unutuyorlar: okullarda öğretilmedi.

Karmaşık programlama problemleriyle başa çıkma yeteneğimi geliştirmek için ne yapabilirim? Hangi stratejiler sizin için işe yaradı? Algoritmalar veya tasarım desenleri gibi odaklanmam gereken belirli alanlar var mı?


3
Code Complete'te belirtilen iki faydalı kitap : James Adams'ın Kavramsal Engellemesi ve Edward De Bono'nun Lateral Düşüncesi .
mctylr

1
AH! Sadece birkaç cevabı olduğunda buraya geri göndermeyi unuttum.
Mark C,

Yanıtlar:


25

İşe ya da çalışmayacak birkaç teknik:

  • Tasarım kalıpları gibi ortak sorunların var olan çözümlerine bakın. Belki de en azından kısmen probleminize benzeyen benzer bir şey bulursunuz. İnternette ara.
  • Sorun zaten çözülmüş gibi davranın ve çözüme geri kalanı izleyerek izleyin. Örneğin, API'yi bir sınıf için tasarlamak yerine, yalnızca sınıftan yararlanan kodu, istediğiniz gibi yöntem çağrılarıyla yazıp ardından bu API'yi uygulayın.
  • Başka bir şey yapın, örneğin internette dolaşın veya solitaire oynayın ve ilhamın gelmesini bekleyin.
  • En sevdiğiniz kişiyi düşünün ve onu problem çözme becerilerinizle etkilemek istiyormuş gibi yapın. Son derece etkileyici bir çözüm ne olurdu?
  • Problemi doğal çelişkiler veya çelişkili şartlar açısından kontrol edin ve tam olarak ne olduklarını ve hangi uzlaşma sağlanabileceğini belirtin. Genelde, bu tür çatışmalar olduğunda, ancak farkında olmadığınız zaman, olası bir çözümü birbiri ardına atma eğilimindedir, çünkü tüm gereklilikleri tam olarak karşılayamazsınız.
  • Zaten olası bir çözümünüz varsa, ancak "kirli" (kopyala-yapıştır, global değişkenler, spagetti kodu vb.) Hissediyorsa, yine de kullanın ve sonradan daha iyi hale getirin

Son nokta mükemmel. Bazen soruna çözüm bulmak, çoğu durumda sadece çalışmasını sağlamak ve daha sonra nerede iyileştirilmesi gerektiğini görmektir.
JeffO

4
Ancak, "daha sonra düzelteceğim" sayısının "düzeltdim" in (en azından benim deneyimimde) fraksiyonel olarak küçük olduğunu unutmayın.
Gareth

3
Gareth: Doğru, ancak fikir gelecek hafta, gelecek ay veya ne zaman olursa olsun daha iyi hale getirmek değil, işe koyulduktan hemen sonra. Sert fındık kırma yöntemi olarak ifade edildi.
user281377

3
İlhamın olmasını beklemenin bir yolu olarak internette sörf yapmıyorum. Olmak için ilham almak için boşta beyin çevrimlerine ihtiyacınız var ve internette gezinmek bu boşta beyin çevrimlerini boşa harcamanın bir yoludur. Bunun yerine alışverişe çıkın, yürüyüş yapın ya da bisiklet sürün, dairenizi temizleyin - çok fazla beyin gücü gerektirmeyen bir şey yapın. İlham bu koşullar altında daha çabuk gelecektir.
Ken Bloom,

1
Geek: # 4'ün biraz paradoksal geldiğini biliyorum, ama bazen gerçekten benim için işe yarıyor; özellikle birden fazla yaklaşımın mümkün olduğu durumlarda ve sorun bu yaklaşımlardan birinin seçimidir. # 6, mesleğimizdeki olağan bağışlar ile sınırlı olmamak anlamına gelir. Bazen, "küresel değişkenlerden kaçın" gibi kurallar, bu tür kullanımdan kaldırılmış tekniği kullanan her çözümü bilinçli bir şekilde reddettiğimiz noktaya göre içselleştirdik.
user281377

20

Gerektiği gibi R modu veya L modu düşünmesini kullanın

R-mode, bilinçaltı ile sıklıkla ilişkilendirdiğimiz yaratıcı, sözsüz yaklaşımdır. L modu, "iç sesiniz" ile ilişkili doğrusal, mantıksal, sözel yaklaşımdır.

Eğer bir problemin anlaşılmaz olduğu görülüyorsa, bunun nedeni muhtemelen yanlış düşünme modunu kullanarak çözmeye çalıştığınızdır. Programcılar için varsayılan düşünme modu L modu olma eğilimindedir, bu nedenle geçici olarak kapatmanız ve R moduna erişmeniz için çalışabilir.

R-mode düşünmeye nasıl erişilir

Pek çok yol var, ancak belki de Poincare yöntemini (ünlü matematikçi ismiyle) deneyin.

Sorun hakkında bildiğiniz her şeyi yazın. Hemen tüm kolay yönlerini (varsa) hemen çözün. Kalan "zor sorunlar" listesinden tek bir öğe seçin ve sonra rahatsız edilmeyeceğiniz veya rahatsız edilmeyeceğiniz bir yürüyüşe çıkın.

Yürüyüş sırasında problemi analiz etmeyi denemeyin, zihninizin dolaşmasına ve problemle ilgili olabilecek ilginç görüntüleri veya duyumları gözlemlemesine izin verin. Birleşmelerini sağlayın. İlham grevi olursa derhal yürüyüşü durdurun ve kazandığınız içgörüyü yazın.

Tüm problemlerin iç görüsü elde edinceye kadar durulayın ve tekrarlayın. Ardından öngörüleri keşfetmeye başlayın.

Kitap önerisi

Ayrıca, Pragmatik Düşünme ve Öğrenme de daha iyi bir problem çözücü olmanıza yardımcı olabilir. (Bu kitaba son zamanlarda çok gönderme yapıyor gibiyim ...)


4
Pragmatik Düşünme ve Öğrenme mükemmeldi
Brad Cupit

Referanslar: drawright.com/theory.htm (R modu ve L modu nedir)
mctylr

17

Bir başkasına sor...

Yok gerçekten. En büyük kaynağınız, yanınızda oturan kişi olabilir. Sorunun cevabını bile sorma, onların yanına oturmalarını ve sorunu açıklamana izin verme.

Genellikle, onu sözlü olarak halledersiniz.

Bazen diğer kişi bir soru sorabilir veya zihinsel taşkın kilidini açacak bir ayrıntıya işaret edebilir.

Sonunda kafanızdaki şeyleri kukla kullanmadan dile getirmeyi ve sorunun ayrıntılarını daha hızlı tespit etmeyi öğreneceksiniz.

Ve eğer diğerleri başarısız olursa, size kullanmayı düşünemeyeceğiniz bir tekniği gösterebilirler.


Başkalarına sormak veya çalışma grupları oluşturmak öğrenmek için mükemmel bir yoldur.
Gary Rowe

Aynısını yapıyorum, sadece benden fikir edinmek için ve bu en iyi yollardan biri.
Viswa

Bu teknik Kauçuk ıslanma olarak bilinen, korku kodlama bu konuda mükemmel bir makale codinghorror.com/blog/2012/03/rubber-duck-problem-solving.html & wiki de yararlıdır en.wikipedia.org/wiki/Rubber_duck_debugging
tozluk

9

Aslında benim kısa cevabım "daha fazla problem çözme" dir. Fakat mesele şu ki: Gerçekten problemlere yoğunlaşın ve pes etmeyin. StackOverflow ya da her neyse yardım istemeyin. (Okuma StackOverflow elbette tamam!) Neredeyse çalışan bir çözüm elde edene kadar sıkı çalışın, sonra neredeyse hedefinize ulaştınız. Tatmin edici bir çözüm elde edene kadar devam edin.

Benim için problem çözme iki şeydir:

  • problem çözme stratejisi
  • sebat ve hayal kırıklığı toleransı

2. Nokta benim görüşüme göre çok önemlidir, çünkü sizi bir sorunla daha uzun süre yaşadıkça düşüncenizi değiştirmeye zorlar. Ayrıca, becerilerinizi daha da geliştirmenize olanak tanıyan problem çözme ile daha fazla zaman geçirmenizi sağlar. ;-)

Bu arada, Edward de Bono'yu okumanı tavsiye ederim. Problem çözme becerilerimi temel olarak Fizik eğitimi alarak edinmeme rağmen, yazması gerçekten ilginç.

Benim problem çözme takımım şöyle:

  • rastgele bir şey dene
  • ilgilendiğim konu hakkında rastgele yazılar / bloglar / yayınlar oku (veya yakından bağlı bir konu)
  • güzel çizim yapmak
  • problemi çoklu fakat daha basit problemlere bölmek
  • başka bir şey yap
  • Google, bir şekilde sorunla ilgili olan bir şey
  • başkalarıyla problem hakkında konuş
  • TODO listesi yapmak
  • Problemin etkisi hakkında bildiğiniz şeyleri yazın, böylece kalıpları daha kolay bulabilirsiniz

Lütfen bu araçların çoğunun tekrar tekrar uygulanabileceğini unutmayın.

Algoritmam şudur:

  1. Problem çözme araç setimin hangi aracı şu anda en anlamlı?
  2. Sorun çözülmedi mi? 1 ile devam edin ;-)

1. Adım zor bir karardır, ancak ne kadar çok pratik yaparsanız o kadar iyi kararlar alırsınız.

Oh ve ben en önemli malzemeyi neredeyse unutuyoruz:

Tüm süreç hakkında olumlu düşünün. "XYZ'nin şimdi sorunu çözeceğini umuyorum" deme. Oldukça düşün: "XYZ işe yaramazsa, YZX'in sorun kaynağı olamayacağını ve ZYX'in çalışıp çalışmadığını kontrol edeceğimi biliyorum." Problem çözme bazen, özellikle de problem bulma sürecinizin zarif ve bilgilendirici bir sonuç alması halinde eğlenceli olabilir.


Bu sayfayı "Fizik" sözcüğü için araştırdım, birisinin daha önce yazmış olup olmadığını görmek için. Matematik diğeridir.
Mark C,

Problem çözme yeteneğinizle ilgili fizik okumanın değerini abartmak zor sanırım.
Mark C,

Olumlu düşünmek için +1. Kendinizi iyi bulursanız sorun çözme kabiliyetiniz bozulur. Soruna size bilgi verirken bakın.
Gary Rowe

7

Problemleri belirleme becerisi üzerinde çalışmaya başlayın. Bazen, sorunu çözmeden önce bir sorun olduğunu kabul etmeniz gerekir. Okulda çok fazla cevap gerektirir ve öğrencilerden yeterince soru sormazlar.

Etrafınızdaki sorunları çözecek insanları bulun ve nasıl çözeceklerini sorun.

Yanlış olmaya hazır olun. Hepsini kendine saklarsan ve hiç bir işe yaramazsan, iyileşmeyeceksin.


+1 "Okulda çok fazla cevap istiyorlar ve öğrencilerden yeterince soru sormuyorlar." bu çok doğru ve doğru soruları sormayı öğrenmek için zaman ayırın ... her yerde kontrol edin çok kötü soru örnekleri var
Rémi

4

Bir bilgisayar bilimi eğitiminin yazılım mühendisleri için en büyük yararı, soyutlamaları yaratma ve anlama yeteneğidir. Soyutlamalar, String sınıfı yöntemleri gibi ortak işlevleri, daha büyük soruna odaklanmamızı sağlayan sıkı, yeniden kullanılabilir paketler içine almak için kullanılır.

Soyutlamaları tanımayı ve yaratmayı öğrenin :

Fakat en önemlisi, soyutlamalar bize bir problemi nasıl daha küçük ve daha yönetilebilir parçalara ayıracağımızı öğretiyor . Bir bilim geçmişiyle birleştirildiğinde, bu becerilerin birleşimi gürültüyü kesebilecek ve sorunun kalbine ulaşabilecek bir mühendis yaratabilir.

Bilimsel Yöntemi kullanarak problem çözmeyi öğrenin :

Bulunması zor bir sorunun olduğu bir üretim uygulamasında sorun giderirken, bazen birini izole etmek ve ortadan kaldırmak amacıyla birkaç değişkenin ortadan kaldırılması için uygulamanın daha fazla (üretim dışı bir ortamda) parçalanmasına yardımcı olur.

Özetle, bir bilgisayar bilimi derecesi için gerekli olan tüm Fizik seçmeli dersleri ve diğer bilim seçmeli derslerini alarak öğrenilen bilimsel yöntem, bir dizi gönüllü üzerinde yeni bir ilaç denemesi gibi bir plasebo ve yeni bir ilaç denemesi yapıyormuş gibi çözülmesine yardımcı oluyor. Daha iyisini yapmak için bazen daha kötü bir şey yapmak zorunda olan bilim insanları gibi, bazen biz de mühendisler gibi yapmalıyız.

Bilimsel olarak bu şekilde düşünmek - genel olarak - yalnızca bilim geçmişinde deneyime sahip olmaktan kaynaklanabilir. Bazen bir problemi çözmek, A'dan B'ye kadar lineer bir yol olarak algılanamaz.

Kısacası, bilgisayar bilimleri çalışın, diğer bilimsel alanları inceleyin, fonksiyonel programlamayı öğrenin. Bunlar bir bilim adamı gibi düşünmenize ve kutunun dışında düşünmenize yardımcı olacaktır.


Kesinlikle. Büyük sorunları daha küçük sorunlara bölün.
Bill Michell

3

Tamamen ne tür problemleri çözmeyi hedeflediğinize bağlı, ama zaten yapmadığınız takdirde mantıklı düşünmeyi öğrenmek iyi bir şey.

Sonuçta, ve bunu söylediğim için benden nefret edeceksin, ama pratik mükemmel. Annemin rahminden çıkarılmadım, nasıl iyi bir problem çözücü olacağımı bildim ve kimsenin yapmadığını. Bir şeyleri kendi başınıza nasıl yapacağınızı pratik etmeniz ve öğrenmeniz gerekir. Hala okuldaysanız ve programlama / bilgisayar bilimi tipi dersleri yoksa, matematik ve bilim de bu becerilerin gelişimini desteklemek için oldukça iyidir.


3

Sanırım aradığınız şey bilgisayar bilimi sezgiselliği.

Siperlerde% 99'umuzun yaptığı şeylere gelince, gerçekten güneşin altında yeni bir şey yok. Böylece bir problemi görebilir ve bunu DP problemi olarak görebilir, başka bir problemi de ezberden vb. Fayda sağlayabilecek bir problem olarak görebilirsin.

Bu bilgiyi nasıl elde edersiniz? Uygun bir CS derecesi başlamak için iyi bir yer ... Yazılım Mühendisliği veya Bilgi Sistemleri Değil, ancak çoğu öğrencinin "pratik olmama" den şikayet ettiği şeyler.

Bunu kendi başınıza yapabilirsiniz, ancak muhtemelen daha zor olacaktır. Bu iki kursa başlayacağım:

Algoritmalara Giriş

Teorik CS'de Harika Fikirler


2

Cevaplarım özellikle kodlama ile ilgilidir, ancak her şeye uygulanabilir.

  1. Klavyeden uzak durun. Yürüyüşe çıkın, koşuya gidin, kahve içerken bir meslektaşı ile konuşun
  2. 10 yaş daha yaşlı ol! Tecrübelerim bana çok yardımcı oldu.
  3. İkili pirzola kullanın. Sorunu ikiye bölün ve sorunu daraltın: tekrarlayın.
  4. Sherlock Holmes'ü hatırlayın: Mümkün olanı ortadan kaldırdığınızda, cevap ne olursa olsun (ne kadar garip olursa olsun)
  5. Test verilerinizi kontrol edin. Gerçekten zor sorunlarımın yarısından fazlası hatalı verilerden ve hatalı kodlardan veya algoritmalardan kaynaklanıyor.

1

Uygulama açısından size ne yaptığımı söyleyebilirim. Programlama yerine uygulamalı matematiğe daha çok ilgi duyuyorum, ancak uygulamalı matematiğe uygulamalı matematik türlerin programlanması. Etrafında sorunlar ve çözümler görüyorum. Önce (ya da bazen sonra, eğer işim zamanında bir çözüm gerektiriyorsa) bilinen bir çözüme bağlanır - ya da mevcut kod kitaplığına bağlı olarak, kendime sormayı severim: "Bu bakire bir sorunsa, bulamıyorsunuz konserve bir çözüm, nasıl devam edersiniz? Cevap biraz basitse, bir çözüm yazmayı düşünün (analitik veya çözmek için bir bilgisayar programı). Karmaşık vakaları görmezden gelin, - mevcut bir kütüphaneyi yeniden icat etmemek için yaklaşımları ve algoritmaları araştırmakla ilgileniyorsunuz. Çözüm çok fazla çaba gerektiriyorsa, tüm çözümü programlamayın, ancak en azından kullanmak isteyeceğiniz veri yapıları ve yöntemleri hakkında düşünün. Alternatif yöntemler hakkında da düşünün.


1

Bu konuda harika bir SO sorusu var.

Cevabım şuydu:

Geliştirmenin en iyi yolu pratik yapmaktır!

Http://www.mensa.org.uk/puzzles/ adresindeki RSS beslemesine abone olun ve ortaya çıktıkça bunları tamamlamak için zaman ayırın.

Günde bir yapboz masası takvimi (örneğin, http://www.calendars.com/product.asp?PID=1&MGID=-1&IID=46387&cm_mmc=Affiliate_Program--performics--k137666-_-DDI%20Link ) iyi bir şeydir size düzenli, ısırık büyüklüğünde ve çözülecek çeşitli problemler verecek olan fikir.

Bunlar kaçınılmaz olarak, kendinizle yüzleşeceğiniz problemlerden konu dışı kalsa da, çeşitlilik sizin daha önce yapmadığınız şekilde düşünmeye zorlayacağı için önemlidir;

Düzenleme: Ayrıca şunları kontrol edin: http://www.mindtools.com/pages/main/newMN_TMC.htm iyi problem çözme ipuçları için.


1

Satranç oynamak

Satranç oynamak, programlama problemlerini çözmek için mükemmel bir antrenördür. Sorunların katmanları ve mantık ağaçları çok güzel bir şekilde ilişkilidir. Ayrıca, derin düşünmeden ve zaman kaybetmeden önce düşünmenize ve plan yapmanıza yardımcı olur.

Satranç ayrıca sol ve sağ “düşünme modları” arasında bir denge gerektirir. Eğer çok analitik olursanız, imkansız olan her şeyi hesaplamaya çalışırken tıkanabilirsiniz. Bununla birlikte, her yaratıcı ilham, durumun somut gerçeğine uyduğundan emin olmak için bir hesaplama ile kontrol edilmelidir. Zor problemler aynen böyle.

Satranç, çalışma ve uygulamanın çok doğrusal bir şekilde nasıl sağlam bir iyileşmeye yol açtığını göstermektedir. Bu, program problem çözme için de geçerlidir.

Satranç oynamak aynı zamanda ne kadar öğreneceğinizi iyi anlamanıza yardımcı olabilir. 10 yıldır programlama yapıyorsanız (veya satranç oynuyorsanız), henüz bir usta değilsiniz.


Aklımı düzenli satranç oynamakla keskinleştirdiğimi gördüm.
Paul Nathan

1

Son zamanlarda Proje Euler'deki problemleri çözüyorum . Sorunlar çeşitli zorluklarda. Çözümler genellikle büyük miktarda kod gerektirmez, ancak algoritmanızın çalışma süresi gibi birçok faktörü göz önünde bulundurmanız gerekir. Sadece bir cevap girerken, istediğiniz herhangi bir dili kullanabilirsiniz. Birçok problem için optimal bir çözüm ve her problem hakkında çok fazla tartışma vardır. Her gün bir sorunu çözmeye çalışın ve problem çözme ve analizinizin ne kadar geliştiğini görünce şaşıracaksınız. Ekstra kredi için, bir prosedür dili (belki C ++), bir betik dili (python gibi) ve işlevsel bir dil (F # gibi) gibi birçok dilde aynı sorunu çözmeye çalışın.


1

Ben bir bilim geçmişinden geliyorum, bu yüzden bir probleme baktığımda, Bilimsel Yöntemden taktikleri kullanmaya meyilliyim . Özellikle hipotezlere dayanan "deneyler" kurmayı ve "kontroller" kullanmayı seviyorum, bu yüzden bir şey inşa edeceğim ve sonra sadece 1 şeyi değiştireceğim / ekleyeceğim ve bu değişimin / eklemenin sonucunun ne olduğunu göreceğim. İhtiyacım olan sonucu alamıyorum, geri değiştireceğim ve başka bir şeyi değiştireceğim. Bu sorun giderme / hata ayıklama kodu için iyi çalışıyor. Bazen aradığınız cevabı alırsınız, ancak başarısız olsanız bile, bunu yaparken her zaman yeni bir şeyler öğrenirsiniz. Ayrıca indirgemecilik yoluyla öğrenmeyi seviyorum- zaten var olan bir şeyi almak (her zaman anlayamayacağınız bir şeyle başlamak iyidir, ama işe yaradığını biliyorsunuz) ve bana karmaşık görünüyor ve onu bileşen parçalarına ayırabilir miyim ve ilk nasıl çalıştıklarını öğrenebilirim. Beynimin bir soruna bütünsel olarak yaklaşmak yerine bu şekilde öğrenmesi bazen daha kolay ve bu bilgiyi kendimden başka karmaşık şeyler yapmak için kullanabilirim. Ayrıca hem klasik hem de modern düşünürlerden mantık ve akıl yürütme seçimi yapmaları için kitaplar okumanızı öneririm (Aristoteles ile başlayın ve yukarı çıkın). Bilgisayarlarda problem çözmede yardımcı olmak için kullanabileceğiniz temel mantığın bazılarını size verebilirler. Ve tabii ki, eğer bir sorunu çözemezseniz ve bir süredir bunun üzerinde çalışıyorsanız, beyin kırması yapın. Bir meselenin belirli bir yönüne değinmek bazen zararlıdır. Herkesin ara vermeye ihtiyacı var :)


0

Problem çözmenin en zor kısmı "Algısal Daralma" dır.

Problem gibi görünen bir şeyi seçiyorsunuz ve yorulup ilerleme kaydetmedene kadar peşinden gidiyorsunuz.

Bunu yapmanın yolu, kesinlikle - kesinlikle - sorunu gerçekten anlıyor olmanızdır. “Doğru Sorunu Çözmek”, problem çözmenin en önemli parçasıdır.

Bazen buna "kutunun dışında düşünmek" diyorlar. "Kutu" gerçek, temel sorunu içermeyen dar bir bakış açısıdır. Kutunun dışında düşünmek, çözülecek doğru sorunu aramaktır.

Daha önce yanlış soruna odaklanan daralmayı önlemeye yönelik stratejiler hakkında çok sayıda kitap vardır.

Çoğunlukla hile, gerçek sonucun ne olması gerektiğini tanımlamaktır. Ardından, istenen sonucu hangi blokların oluşturduğunu öğrenin.


0

Açıkçası herkesin farklı olduğunu düşünüyorum, bu yüzden herkesin daha iyi bir problem haline gelmesi için yol haritası farklıdır. Başkalarının deneyimlerinden öğrenebilirsiniz, fakat sonunda kendi yolunuzu oluşturmalısınız. Bu aslında "zor yoldan" bir şey öğrenmek, ancak bu durumda etkilidir.

Sorun çözme sürecimi geliştirmeye başladım, ancak henüz büyük bir sorun çözücü olmasam da geçen yıl olduğumdan daha iyi bir problem çözdüm. İşyerinde, yönetim için üç yeni rapor ekleyerek bir parça açık kaynaklı zaman takip yazılımı geliştirmeyi içeren yeni bir proje verildi. Bu yazılım hiç kullanmadığım bir dilde yazılmış ve çok iyi belgelenmiş ve oldukça karışıktı. Bir sürü araştırma yaptım ve yaptım ve daha sonra bebek adımlarındaki raporlar üzerinde çalıştım.

Yani, başka bir deyişle, üzerinde çalışman gereken bir tür lavabo bulmanızı veya yüzmenizi öneririm. Halen bir programcı olarak çalışıyorsanız, bir proje bulun veya patronunuzdan bir tane isteyin. Bu senaryo mümkün değilse, iş dışında bir tane bulabilirsin, belki sözleşmeli / serbest çalışmalı ya da başka bir şey. Zorunda olduğumda problemleri çok iyi ve çok hızlı çözüyorum ve projenin yoğunluğundan dolayı bu bilgiyi saklıyorum. Bu sizin için işe yaramazsa, o zaman bu konudaki herkesin önerdiği şeyi yapın :).


0

Cevap, farklı çözümlerle ortaya çıkarak Sorunun kendisidir . Her zaman birden fazla çözüm vardır (örneğin, Sıralama farklı şekillerde yapılabilir. Kabarcık Sıralaması, Seçimler sıralaması vb.), Yalnızca etkili bir şekilde yapabileceğiniz bir yolu seçmeniz gerekir (Sıralama). Bir dahaki sefere farklı deneyelim… Ve Problem çözme kitapları… Yok Kitaplardan Problem çözme becerilerini öğrenemezsiniz, daha fazla kod kazanırsınız daha fazla bilgi uygulayacaksınız. İyi şanslar


0

Bir programcının problemi en sevdikleri programlama diliyle nasıl çözeceğini görselleştirerek bir probleme zihinsel olarak saldırması kolaydır. Tıpkı en sevdiği alet çekiç olduğu zaman tüm sorunları çivi olarak gören klasik marangoz gibi.

Bence en iyi problem çözme alıştırmaları pratik seviyenin üzerine çıkınca gelir ve sadece “en iyi şekilde çözmek için ihtiyacım olan şey bu” diye düşünürsünüz. Bazı durumlarda, çözümü uygulamak için yeni şeyler öğrenmeniz gerekebilir, ancak kilit nokta, bir çözüm bulma yeteneğinizin tarihsel ve mevcut tekniklerinizle sınırlı kalmaması gerektiğidir.

Benim için eski pratik bir örnek, sorunumun aslında önleyici dişlere ihtiyaç duymadığımı fark ettiğimde verimli kooperatif çoklu görev yapmanın nasıl uygulanacağını öğrendim, genelde tüm bu muteksileri (rahatlık bölgelerine çarparak rahatladım). Sonunda her zaman bir noktada rahat olmayı bırakmak gibi görünüyor ..).


0

Uygulama geliştirmede karşılaştığımız sorunların birçoğu ya kendi buluşumuzdur ya da kodlanmış temel kod tabanını devraldığımız salakların icadıdır. Bir problemi çözmek, çoğu zaman kaynağı bulmaktan kaynaklanır . Genelde, nerede olduğunu bir kez bulduğumuzda , sadece yetkinlik onu çözmek için gereken şeydir.

Bu amaçla:

  1. Platformunu öğren.
  2. Aletlerini öğren.
  3. Platformunuz için henüz karşılaşmadığınız hangi araçların mevcut olduğunu öğrenin.

Dünyadaki tüm beyin jimnastiği, beynin kullanması için hiçbir bilgi olmadan işe yaramaz. Bir problemi çözmek için önce olasılıkların ne olduğunu bilmelisin ! O zaman bile, sorunun açıklanması yerine iyi bilgiyle çalışmak çok daha hızlı.

İneklerin eve gelip bir şeyin neden bu kadar uzun sürdüğüne kadar tahmin edebilirim. Ancak "önce biraz veri alalım" dersem, bir çok istisna atıldığını görebilir ve bunun yerine if ifadesini değiştirebileceğimi fark edebilirim. Bilginin nasıl toplanacağını bilmeden, platformumdaki istisnaların biraz fazla yük aldığını ve denemeden önce kontrol etmenin daha hızlı bir yolu olduğunu bilmek, daha hızlı, sorunu asla çözemezdim.


0

Cevabınızın iki kısmı var:

a) Gerçek problem çözme tekniği

b) Düşünce ve problem çözmede beyninizi doğal olarak "daha iyi" yapmak

Her zaman teknikle ilgili bazı büyük cevaplar oldu (sorunu bildiğinizi varsayalım vb.) Bu yüzden bu kadar fazla örtmeyeceğim. Beyninizi eğitmeye gelince, bu sinapsları aşmak ve daha fazla bağlantı kurmak için yapabileceğiniz birkaç şey var.

1) Yeni bir dil, gerçek bir dil (fransızca veya çince gibi bugünlerde iyi bir bahis olabilir) öğrenin

2) Yeni bir enstrüman çalmayı öğrenin

3) Boya, çizim veya heykel gibi sanatsal şeyler yapın

4) Scrabble oynayın veya bulmaca yapın

5) Demek istediğin gibi dans et. Hayır, şaka yapmıyorum. Dansın beyniniz ve düşünceniz üzerinde bir etkisi olduğu gösterilmiştir

6) Tecrübelerinizi genişletin, yenilikçi çözümler bir alanda bir teoriye başka bir alanda uygulamaktan geldi, bu yüzden ilginç bulduğunuz farklı alanları ve alanları inceleyin

7) Egzersiz yapmak, egzersizi düşünme sürecini geliştirmek için çok önemlidir

Sonunda zor problemleri çözmek için elimden geleni yapacağım: uzun bir yürüyüşe çıkın. Başınızı temizlemek ve bir problemi düşünmesine izin vermek için mucizeler yarattığını öğrendim.



0

Benim tavsiyem kitabı atmak olur !

Kelimenin tam anlamıyla değil elbette. Demek istediğim, çok az deneyime sahip olduğunuz bir konu alanına girin ve buradaki zor problemleri mevcut çözümleri öğrenmeden çözün. Yaratıcılığınızdan ve eleştirel düşüncenizden ve belki de bir referans kılavuzundan başka hiçbir şeye güvenmeyin.

Bir görüntü formatı tasarlayabilirsiniz. Veya bir web sunucusu. Veya bir sıkıştırma şeması. Dosya sistemi. Çekirdek. Yapay zeka. Programlama dili. Vizyon sistemi.

İlginç bulduğunuz, oldukça karmaşık olan ve hiç öğrenemediğiniz bir şey. Bunu okuma: sadece doğruca gir. Deney. Hata yapmak. Tekerleği yeniden icat et.

Yardım istemeyin. Öğreticilerden uzak durun. Teoriden uzak dur. Bir çözümü raftan çekmeyin.

Neden?

  • Hatalardan en iyisini öğreniriz.
  • Eski çözümleri yerine getirmek ve uyarlamak yerine, yaratıcı çözümler üretme pratiği yapma fırsatı sunar.
  • Fikirlerinizi değerlendirmek zorundasınız. Araçlarınızı, çözdüğünüz problemi ve değerlendirmek istediğiniz fikri iyi anlamadan bunları değerlendiremezsiniz. Bu, konuyu başka türlü geliştireceğinizden daha derinlemesine anlamanızı sağlar. (Kullanmakta olduğunuz araçlar hakkında okumaktan çekinmeyin, sadece çözmeye çalıştığınız sorunu okumayın.)

Birkaç deneme yapın ve elde ettiğiniz şeyden memnun kaldıktan sonra, birkaç ay bekleyin. Sonra tekrar taze gel ve yeni bir bakış açısı bulabilecek misin bir bak. Bundan sonra, problem hakkında ve başkalarının sorunu nasıl çözdüğü (veya insanlarla konuşması) hakkında okumaya başlamanın zamanı geldi. Bu noktada, okurken kendinize "evet, bu mantıklı" demek yerine "evet, tam olarak " veya "bir dereceye kadar" veya "vay, zekice" diyeceksiniz .

Başka bir deyişle, okuduklarınız hakkında çok daha eleştirel düşüneceksiniz ve bunu daha kolay anlayacaksınız. Bağımsız olarak keşfettiğiniz şeyler hakkında iyi hissedeceksiniz ve bir yığın yeni bilgi ile yürüyüp gideceksiniz.

Çözümünüzü mükemmelleştirmeye çalışmayın. Sadece kendinize kanıtlamak olabilir sorunu çözmek. "Yapabilirim" tutumunu benimseyin ve eğer sorundan korktuysanız, ilk önce çözen kişinin muhtemelen sizin kadar bildiğini anlayın (aslında bir çözümü olduğunu bilmiyorlardı!).


0

Problem çözme, okunarak öğretilebilecek veya hatta öğrenilebilecek bir şey değildir. Problem çözmede daha iyi olmanın tek yolu problemleri çözmektir.

Hakkında okuyabileceğiniz problem çözmenin farklı teknikleri ve metodolojileri vardır ve belirli bir alandaki sorunları çözmek için kullanabileceğiniz araçlar ve teknolojiler hakkında bilgi edinebilirsiniz. Sorunları sürekli olarak düşünmüyorsanız, çözümler bulmaya çalışın (her sorun için birden fazla çözüm bulun ve bunları birbirleriyle kıyaslayın) ve sonra çözümlerinizi başkaları tarafından geliştirilen çözümlere karşı değerlendirin, sorun yaşamayacaksınız çözme.

Andy Hunt tarafından Pragmatik Düşünme ve Öğrenme: Suya Dayanıklı Ürününüzün Refactor bir kopyasını almanızı öneririm . Nasıl düşündüğünüzü, tepki verdiğinizi ve öğrendiğinizi anlatan bir kitap. Davranış teorisi ve diğer bilişsel bilimlerden ilgili teorileri getirir. Özellikle yazılım geliştiricilere yöneliktir, ancak herhangi bir bilgi çalışanı için geçerlidir.


0

Kendim gibi programlamada yeni başlayanlar için "Bir Programcı Gibi Düşün" kitabını öneririm. Birinci bölümde, problemi yeniden düzenleme ve bölme, bildiklerinizden başlayarak, azaltma, analojiler yapma ve deney yapma gibi problem çözme teknikleri ele alınmaktadır.

O zaman C ++ 'da örneklerle daha ileri teknikler var: diziler, işaretçiler ve dinamik bellek ile problem çözme, sınıflar, özyineleme, kodların yeniden kullanımı. Bu kısım hakkında yorum yapamam çünkü benim için henüz çok zor.


-1

Mümkün olduğunca çok problem çözüyorum. Ben de gibi bazı bulmaca kitapları gibi bu bir . Ayrıca, asal sayıları içeren bir şey gibi matematik oyunları gibi problem çözme oyunlarıyla, sudoku, Hanoi Kulesi gibi şeyleri de çözüyorum. Ayrıca, mümkün olduğunda kodlayın.


-1

Hoşçakal, bir sürü problemi çözüyorum!

kolay problemlerle başlar ve kolay problemler yerine rutin hale geldiğinde daha zor problemlere gidersiniz.


-4

Kendinizi teoriye saklamayın, daha fazla pratik yapın. Uygulama ile tecrübe gelir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.