Jak mogę poprawić swoją zdolność rozwiązywania problemów?


50

Wszyscy mówią to samo: „prawdziwy programista wie, jak radzić sobie z prawdziwymi problemami”. Ale zapominają, jak nauczyli się tej umiejętności i gdzie: nie uczy się jej w szkołach.

Co mogę zrobić, aby poprawić swoją zdolność do rozwiązywania złożonych problemów programistycznych? Jakie strategie Ci się przydały? Czy są jakieś szczególne obszary, na których powinienem się skupić, takie jak algorytmy lub wzorce projektowe?


3
Dwie przydatne książki wspomniane w Code Complete to: Conceptual Blockbusting Jamesa Adamsa i Lateral Thinking Edwarda De Bono.
mctylr 17.01.11

1
AH! Zapomniałem opublikować tutaj, kiedy miał tylko kilka odpowiedzi.
Mark C

Odpowiedzi:


25

Kilka technik, które mogą działać lub nie:

  • Spójrz na istniejące rozwiązania typowych problemów, np. Wzorce projektowe. Może znajdziesz coś podobnego, co przynajmniej częściowo przypomina twój problem. Przeszukaj sieć.
  • Postępuj tak, jakby problem został już rozwiązany, i prześledzić, co wynika z rozwiązania. Na przykład zamiast projektować interfejs API dla klasy, po prostu napisz kod korzystający z klasy, używając wywołań metod, jakie chcesz, a następnie zaimplementuj ten interfejs API.
  • Rób coś innego, np. Surfuj po Internecie lub graj w pasjansa i czekaj na natchnienie.
  • Pomyśl o osobie, którą lubisz najbardziej i udawaj, że chcesz zaimponować jej umiejętnościami rozwiązywania problemów. Jakie byłoby niezwykle imponujące rozwiązanie?
  • Sprawdź problem pod kątem nieodłącznych sprzeczności lub sprzecznych wymagań i określ dokładnie, czym one są i jaki kompromis można osiągnąć. Często, gdy takie konflikty istnieją, ale nie jesteś tego świadomy, zwykle odrzucasz jedno możliwe rozwiązanie po drugim, ponieważ nie możesz idealnie spełnić wszystkich wymagań.
  • Jeśli masz już możliwe rozwiązanie, ale wydaje się „brudne” (kopiuj-wklej, zmienne globalne, kod spaghetti itp.), Skorzystaj z niego mimo to i popraw go później

Ostatni punkt jest doskonały. Czasami rozwiązaniem problemu jest po prostu uruchomienie go w większości przypadków, a następnie sprawdzenie, gdzie należy go poprawić.
JeffO

4
Należy jednak pamiętać, że liczba „Naprawię to później”, które zmieniają się w „Naprawiłem to” jest (przynajmniej z mojego doświadczenia) ułamkowo niewielka.
Gareth,

3
Gareth: To prawda, ale nie chodzi o to, aby poprawić to w przyszłym tygodniu, następnym miesiącu lub kiedykolwiek, ale natychmiast po uruchomieniu. Ma to na celu spędzenie twardych orzechów.
user281377,

3
Nie surfuję po sieci jako sposób oczekiwania na inspirację. Potrzebujesz bezczynnych cykli mózgowych, aby uzyskać inspirację, a surfowanie po sieci jest sposobem na marnowanie tych bezczynnych cykli mózgowych. Zamiast tego idź na zakupy lub na spacer, lub na rower, posprzątaj mieszkanie - zrób coś, co nie wymaga dużej mocy mózgu. W takich okolicznościach inspiracja przyjdzie szybciej.
Ken Bloom

1
Geek: Wiem, że # 4 brzmi trochę paradoksalnie, ale czasami naprawdę dla mnie działa; szczególnie w sytuacjach, gdy wydaje się, że możliwe jest więcej niż jedno podejście, a problemem jest wybór jednego z tych podejść. # 6 oznacza, że ​​nie należy zbytnio ograniczać się zwykłymi zakazami w naszym zawodzie. Czasami zinternalizowaliśmy reguły takie jak „unikaj zmiennych globalnych” do tego stopnia, że ​​nieświadomie odrzucamy każde rozwiązanie, które korzysta z tak przestarzałej techniki.
user281377,

20

Stosuj myślenie w trybie R lub L w zależności od potrzeb

Tryb R to kreatywne, niewerbalne podejście, które powszechnie kojarzymy z podświadomością. Tryb L to liniowe, logiczne, werbalne podejście związane z twoim „głosem wewnętrznym”.

Jeśli problem wydaje się nierozwiązywalny, to prawdopodobnie dlatego, że próbujesz go rozwiązać, używając niewłaściwego trybu myślenia. Dla programistów domyślnym trybem myślenia jest tryb L, więc może być czasowe wyłączenie go i uzyskanie dostępu do trybu R.

Jak uzyskać dostęp do myślenia w trybie R.

Istnieje wiele sposobów, ale być może spróbuj metody Poincare (nazwanej na cześć słynnego matematyka).

Zapisz wszystko, co wiesz o problemie. Natychmiast rozwiąż wszystkie jego łatwe aspekty (jeśli istnieją). Wybierz jeden element z listy „trudnych problemów”, a następnie wybierz się na spacer, na którym nie będziesz przeszkadzany ani rozpraszany.

Nie próbuj analizować problemu podczas spaceru, po prostu pozwól umysłowi wędrować i obserwuj wszelkie interesujące obrazy lub odczucia, które mogą się wiązać z problemem. Niech się łączą. Jeśli pojawi się natchnienie, natychmiast przerwij spacer i wróć, aby zapisać zdobytą wiedzę.

Płucz i powtarzaj, aż wszystkie problemy będą wnikliwe. Następnie zacznij odkrywać spostrzeżenia.

Rekomendacja książki

Również czytanie Pragmatycznego myślenia i uczenia się może pomóc ci stać się lepszym rozwiązaniem problemu. (Wydaje mi się, że ostatnio często odwołuje się do tej książki ...)


4
Pragmatyczne myślenie i uczenie się było doskonałe
Brad Cupit

Nr: drawright.com/theory.htm (co R-L-trybie tryb)
mctylr

17

Zapytaj kogoś innego...

Niepoważnie. Twoim największym zasobem może być osoba siedząca obok ciebie. Nawet nie pytaj ich o odpowiedź na problem, poproś, aby usiedli obok ciebie i pozwolili ci wyjaśnić problem.

Często rozwiążesz to podczas werbalizacji.

Czasami druga osoba zadaje pytanie lub wskazuje szczegół, który odblokuje mentalną bramę zalewową.

W końcu nauczysz się werbalizować rzeczy w głowie bez użycia marionetki i szybciej dostrzegasz kluczowe szczegóły problemu.

A jeśli wszystko inne zawiedzie, mogą być w stanie pokazać Ci technikę, której nie pomyślałbyś.


Zapytanie innych lub utworzenie grup analitycznych to doskonały sposób na naukę.
Gary Rowe,

robię to samo, tylko po to, aby uzyskać ode mnie pomysł i jest to jeden z najlepszych sposobów.
Viswa

Ta technika jest znana jako Rubber Ducking, doskonały artykuł na ten temat w kodowaniu horrorów codinghorror.com/blog/2012/03/rubber-duck-problem-solving.html i wiki jest również pomocna en.wikipedia.org/wiki/Rubber_duck_debugging
spats

9

Właściwie moja krótka odpowiedź brzmi „rozwiązywanie większej liczby problemów”. Ale chodzi o to: naprawdę skoncentruj się na problemach i nie poddawaj się. Nie proś o pomoc w StackOverflow lub czymkolwiek. (Czytanie StackOverflow jest oczywiście w porządku!) Staraj się, aż znajdziesz prawie działające rozwiązanie, a następnie prawie osiągniesz swój cel. I kontynuuj, aż znajdziesz satysfakcjonujące rozwiązanie.

Dla mnie rozwiązywanie problemów to dwie rzeczy:

  • strategia rozwiązywania problemów
  • upór i tolerancja na frustrację

Punkt 2 jest moim zdaniem naprawdę kluczowy, ponieważ zmusza cię do zmiany myślenia, im dłużej utkniesz z problemem. Pozwala także spędzać więcej czasu na rozwiązywaniu problemów, co pozwala jeszcze bardziej doskonalić swoje umiejętności. ;-)

Nawiasem mówiąc, polecam przeczytać Edwarda de Bono. Chociaż moje umiejętności rozwiązywania problemów nabyłem głównie studiując fizykę, jego pisanie jest naprawdę interesujące.

Mój zestaw narzędzi do rozwiązywania problemów jest następujący:

  • losowo spróbuj czegoś
  • czytaj losowe artykuły / blogi / posty na temat, który mnie interesuje (lub ściśle powiązany temat)
  • ładny rysunek
  • podzielić problem na wiele, ale prostszych problemów
  • Zrób coś innego
  • Google coś, co jest w jakiś sposób związane z problemem
  • porozmawiaj z innymi na temat problemu
  • zrobić listę rzeczy do zrobienia
  • zapisz rzeczy, które znasz na temat efektu problemu, aby łatwiej było znaleźć wzorce

Pamiętaj, że większość z tych narzędzi można stosować rekurencyjnie.

Mój algorytm jest taki:

  1. Które narzędzie mojego zestawu narzędzi do rozwiązywania problemów ma obecnie największy sens?
  2. Problem nie rozwiązany? Kontynuuj z 1. ;-)

Krok 1. to trudna decyzja, ale im więcej ćwiczysz, tym lepiej.

Aha i prawie zapomniałem najważniejszego składnika:

Pomyśl pozytywnie o całym procesie. Nie myśl „Mam nadzieję, że XYZ rozwiąże problem”. Pomyśl raczej: „Jeśli XYZ nie działa, to wiem, że YZX nie może być źródłem problemu i sprawdzę, czy ZYX działa”. Rozwiązywanie problemów może być czasem zabawne, szczególnie jeśli proces znajdowania problemu zakończy się eleganckim i pouczającym doświadczeniem.


Przeszukałem tę stronę pod kątem słowa „fizyka”, aby sprawdzić, czy ktoś już o tym napisał. Druga to matematyka.
Mark C

Uważam, że wartość studiowania fizyki w odniesieniu do umiejętności rozwiązywania problemów jest trudna do przecenienia.
Mark C

+1 za pozytywne myślenie. Jeśli zaczynasz się męczyć, twoja zdolność rozwiązywania problemów jest ograniczona. Spójrz na problem, ponieważ daje ci wiedzę.
Gary Rowe,

7

Zacznij pracę nad umiejętnością identyfikowania problemów. Czasami musisz rozpoznać problem, zanim go rozwiążesz. W szkole wymagają zbyt wielu odpowiedzi i niewystarczającej liczby pytań od uczniów.

Znajdź ludzi wokół ciebie, którzy rozwiązują problemy i zapytaj ich, jak sobie z tym radzą.

Przygotuj się na błąd. Nie poprawisz się, jeśli zatrzymasz je wszystkie dla siebie i nie przyda ci się żaden użytek.


+1 za „W szkole wymagają zbyt wielu odpowiedzi i niewystarczającej liczby pytań od uczniów”. soo to prawda i trochę czasu, aby nauczyć się zadawać właściwe pytania ... sprawdzić wszędzie istnieje tak wiele przykładów złego pytanie
Remi

4

Główną zaletą edukacji informatycznej dla inżynierów oprogramowania jest możliwość tworzenia i rozumienia abstrakcji. Abstrakcje służą do enkapsulacji powszechnej funkcjonalności, takiej jak metody klasy String, w ciasne pakiety wielokrotnego użytku, które pozwalają nam skupić się na większym problemie.

Naucz się rozpoznawać i tworzyć abstrakcje :

Ale co najważniejsze, abstrakcje uczą nas, jak podzielić problem na mniejsze, łatwiejsze do opanowania części . W połączeniu ze środowiskiem naukowym połączenie tych umiejętności może stworzyć inżyniera zdolnego do przecinania hałasu i dotarcia do sedna problemu.

Naucz się rozwiązywać problemy za pomocą metody naukowej :

Podczas rozwiązywania problemów z aplikacją produkcyjną, w której występuje trudny do znalezienia problem, czasami pomaga ona w dalszym stopniu przerwać aplikację (w środowisku nieprodukcyjnym) w celu wyeliminowania kilku zmiennych w celu wyizolowania i wyeliminowania jednej.

Podsumowując, metoda naukowa, wyciągnięta z wzięcia wszystkich przedmiotów fizyki i innych przedmiotów ścisłych wymaganych do uzyskania stopnia naukowego w dziedzinie informatyki, pomaga rozwiązać te problemy, tak jakbyśmy testowali placebo i nową próbę narkotykową na szeregu ochotników. Podobnie jak naukowcy, którzy czasami muszą coś pogorszyć, aby to poprawić, czasami my, inżynierowie, musimy zrobić to samo.

Myślenie naukowe w ten sposób może - generalnie - wynikać wyłącznie z doświadczenia w środowisku naukowym. Czasami rozwiązania problemu nie można postrzegać jako ścieżki liniowej od A do B.

Krótko mówiąc, studiuj informatykę, badaj inne dziedziny nauki, ucz się programowania funkcjonalnego. Pomogą ci myśleć jak naukowiec i myśleć nieszablonowo.


Dokładnie. Podziel duże problemy na mniejsze.
Bill Michell,

3

Wszystko zależy od tego, jakie problemy chcesz rozwiązać, ale nauka logicznego myślenia, jeśli już tego nie robisz, jest dobra.

Podsumowując, będziesz mnie nienawidzić za to, że to mówię, ale praktyka czyni mistrza. Nie wyciągnięto mnie z łona matki, wiedząc, jak być dobrym rozwiązaniem problemu i nikt inny tego nie zrobił. Musisz ćwiczyć i uczyć się, jak robić rzeczy samodzielnie. Jeśli nadal jesteś w szkole i nie masz klas programistycznych / informatycznych, matematyka i nauki ścisłe są również bardzo dobre dla wspierania rozwoju tych umiejętności.


3

Myślę, że szukasz heurystyki informatycznej.

Jeśli chodzi o to, co 99% z nas robi w okopach, naprawdę nie ma nic nowego pod słońcem. Możesz więc zobaczyć problem i rozpoznać go jako problem DP, lub inny jako problem, który mógłby skorzystać z zapamiętywania itp.

Jak zdobyć tę wiedzę? Odpowiedni stopień CS to dobre miejsce do rozpoczęcia ... Nie inżynierii oprogramowania lub systemów informatycznych, ale rzeczy, które większość studentów narzeka na „niepraktyczność”.

Możesz to zrobić samodzielnie, ale prawdopodobnie będzie to trudniejsze. Zacznę od tych dwóch kursów:

Wprowadzenie do algorytmów

Świetne pomysły w teorii CS


2

Moje odpowiedzi odnoszą się konkretnie do kodowania, ale można je zastosować do wszystkiego.

  1. Odsuń się od klawiatury. Porozmawiaj, idź pobiegać, porozmawiaj o tym z kolegą przy kawie
  2. Stań się 10 lat starszy! Moje doświadczenie bardzo mi pomogło.
  3. Użyj kotła binarnego. Podziel problem na dwa i zawęź problem: powtórz.
  4. Pamiętaj, Sherlock Holmes: kiedy wyeliminowałeś możliwe, cokolwiek pozostaje (nie ważne jak dziwne) jest odpowiedzią
  5. Sprawdź swoje dane testowe. Ponad połowa moich naprawdę trudnych problemów została spowodowana błędnymi danymi, a nie wadliwym kodem lub algorytmami.

1

Jeśli chodzi o praktykę, mogę ci powiedzieć, co robię. Bardziej interesuję się matematyką stosowaną niż programowaniem, ale matematyka stosowana w zastosowaniach komputerowych jest swego rodzaju programowaniem. Widzę problemy i rozwiązania. Przed (lub czasem po, jeśli powiedzmy, że moja praca wymaga szybkiego rozwiązania), łącząc się ze znanym rozwiązaniem - lub istniejącą biblioteką kodów, lubię zadawać sobie pytanie: „Gdyby to był dziewiczy problem - nie można go znaleźć rozwiązanie w puszce, jak byś postępował? ” Jeśli odpowiedź jest dość prosta, rozważ napisanie rozwiązania (analityczne lub program komputerowy do rozwiązania). Zignoruj ​​skomplikowane przypadki końcowe - jesteś zainteresowany ekscytującymi podejściami i algorytmami, nie wymyślając na nowo istniejącej biblioteki. Jeśli rozwiązanie będzie wymagało zbyt dużego wysiłku, nie programuj pełnego rozwiązania, ale przynajmniej pomyśl o rodzajach struktur danych i metodach, których chciałbyś użyć. Pomyśl także o metodach alternatywnych.


1

Jest na to świetne pytanie SO .

Moja odpowiedź brzmiała:

Najlepszym sposobem na poprawę jest ćwiczenie!

Subskrybuj kanał RSS pod adresem : http://www.mensa.org.uk/puzzles/ i poświęć trochę czasu na ich uzupełnienie w momencie ich pojawienia się.

Łamigłówny kalendarz biurkowy (np. Http://www.calendars.com/product.asp?PID=1&MGID=-1&IID=46387&cm_mmc=Affiliate_Program--performics--k137666-_-DDI%20Link ) jest dobry pomysł też, ponieważ da ci regularne, małe i różnorodne problemy do rozwiązania.

Chociaż zawsze będą one nie na temat problemów, z którymi się spotkasz, różnorodność jest ważna, ponieważ zmusi cię do myślenia w sposób, w jaki wcześniej nie miałeś, o to właśnie chodzi w rozwiązywaniu problemów.

Edycja: Sprawdź także: http://www.mindtools.com/pages/main/newMN_TMC.htm, aby uzyskać dobre wskazówki dotyczące rozwiązywania problemów.


1

Grać w szachy

Gra w szachy jest doskonałym trenerem do rozwiązywania problemów programistycznych. Warstwy problemów i drzewa logiczne są bardzo ładnie powiązane. Pomaga również myśleć z wyprzedzeniem i planować przed pójściem w dół optymalnej ścieżki i marnowaniem czasu.

Szachy wymagają również równowagi między lewym i prawym „trybem myślenia”. Jeśli staniesz się zbyt analityczny, możesz zaplątać się w próbie obliczenia wszystkiego, co jest niemożliwe. Jednak każdą twórczą inspirację należy sprawdzić za pomocą obliczeń, aby upewnić się, że pasuje ona do konkretnej rzeczywistości. Trudne problemy są właśnie takie.

Szachy pokazują, w jaki sposób nauka i praktyka prowadzą do stałej poprawy w bardzo liniowy sposób. Dotyczy to również rozwiązywania problemów z programem.

Gra w szachy może również pomóc ci dobrze zrozumieć, ile trzeba się nauczyć. Mimo że programujesz (lub grasz w szachy) od 10 lat, nie jesteś jeszcze arcymistrzem.


Zauważyłem, że mój umysł wyostrza się podczas regularnego grania w szachy.
Paul Nathan

1

Ostatnio rozwiązałem problemy w Project Euler . Problemy mają różną trudność. Rozwiązania zwykle nie wymagają dużej ilości kodu, ale trzeba wziąć pod uwagę wiele czynników, takich jak czas działania algorytmu. Możesz użyć dowolnego języka, który Ci się podoba, po prostu wpisując odpowiedź. Jest dobry opis optymalnego rozwiązania wielu problemów i dużo dyskusji na temat każdego problemu. Spróbuj rozwiązać jeden problem każdego dnia, a zdziwisz się, jak bardzo poprawia się rozwiązywanie problemów i analiza. Aby uzyskać dodatkowe uznanie, spróbuj rozwiązać ten sam problem w wielu językach, takich jak język proceduralny (może C ++), język skryptowy (jak python) i język funkcjonalny (jak F #).


1

Pochodzę ze środowiska naukowego, więc kiedy patrzę na problem, zwykle używam taktyk z metody naukowej . Szczególnie lubię konfigurować „eksperymenty” oparte na hipotezach i używać „kontroli”, więc zbuduję coś, a następnie zmienię / dodam tylko jedną rzecz na ten temat i zobaczę, jaki jest wynik tej jednej zmiany / dodania i jeśli „ Nie otrzymuję rezultatu, którego potrzebuję, przełączę go z powrotem i zmienię coś innego. Działa to dobrze w przypadku rozwiązywania problemów / debugowania kodu. Czasami dostajesz odpowiedź, której szukasz, ale zawsze uczysz się czegoś nowego, nawet jeśli ci się nie uda. Lubię też uczyć się poprzez redukcjonizm- branie czegoś, co już istnieje (zawsze dobrze jest zacząć od czegoś, czego możesz nie rozumieć, ale wiesz, że działa) i wygląda dla mnie na skomplikowane i sprawdzanie, czy mogę go rozbić na części składowe i dowiedzieć się, jak działają najpierw. Czasem mojemu mózgowi łatwiej jest uczyć się w ten sposób, zamiast podejść całościowo do problemu, i mogę wykorzystać tę wiedzę do zbudowania innych podobnych złożonych rzeczy. Polecam również czytanie książek na temat logiki i rozumowania, wybierając dzieła zarówno od klasycznych, jak i współczesnych myślicieli (zacznij od Arystotelesa i rozwijaj swoją drogę). Mogą dać ci podstawowe podstawy logiki, których możesz użyć, aby pomóc w rozwiązywaniu problemów na komputerach. I oczywiście, jeśli nie możesz rozwiązać problemu i pracujesz nad nim przez jakiś czas, zrób sobie przerwę mózgową. Zastanawianie się nad konkretnym aspektem problemu jest czasem szkodliwe. Każdy potrzebuje przerw :)


0

Najtrudniejszą częścią rozwiązywania problemów jest „Percepcyjne zwężenie”.

Wybierasz coś, co wydaje się być problemem, i uporczywie podążasz za nim, dopóki nie jesteś wyczerpany i nie robisz postępów.

Sposobem na to jest upewnienie się - absolutnie pewne - że naprawdę rozumiesz problem. „Rozwiązywanie właściwego problemu” jest najważniejszą częścią rozwiązywania problemów.

Czasami nazywają to „nieszablonowym myśleniem”. „Pudełko” to wąski punkt widzenia, który może nie obejmować prawdziwego, podstawowego problemu. Myślenie nieszablonowe polega na szukaniu właściwego problemu do rozwiązania.

Istnieje wiele książek na temat strategii unikania zwężenia, które wiąże się z przedwczesnym skupieniem się na niewłaściwym problemie.

Główną sztuczką jest określenie, jaki powinien być prawdziwy wynik. Następnie dowiedz się, jakie bloki blokują pożądany wynik.


0

Szczerze mówiąc, myślę, że każdy jest inny, więc każda mapa drogowa do lepszego rozwiązania problemu jest inna. Możesz uczyć się na doświadczeniach innych ludzi, ale ostatecznie musisz wykreować własną ścieżkę. Zasadniczo uczy się czegoś „na twardo”, ale w tym przypadku jest skuteczne.

Oto jak zacząłem ulepszać moje rozwiązywanie problemów, chociaż nie jestem jeszcze świetnym narzędziem do rozwiązywania problemów, tylko lepszy niż w zeszłym roku. Otrzymałem nowy projekt w pracy, który polegał na rozszerzeniu oprogramowania do śledzenia czasu open source, dodając trzy nowe raporty do zarządzania. To oprogramowanie zostało napisane w języku, którego nigdy nie używałem, i było słabo udokumentowane i bardzo zaciemnione. Wykopałem i przeprowadziłem mnóstwo badań, a potem po prostu pracowałem nad raportami krok po kroku, kiedy miałem podstawową funkcjonalność, ulepszyłem je, a potem dodałem więcej funkcji.

Innymi słowy, polecam znaleźć jakiś projekt prawdziwego świata do zlewu lub pływania. Jeśli jesteś obecnie zatrudniony jako programista, znajdź projekt lub poproś o niego szefa. Jeśli ten scenariusz nie jest możliwy, znajdź go poza pracą, być może na podstawie umowy o pracę / pracę na własny rachunek lub coś takiego. Rozwiązuję problemy bardzo dobrze i bardzo szybko, kiedy muszę i zachowuję tę wiedzę ze względu na intensywność projektu. Jeśli to nie zadziała, zrób to, co sugerują wszyscy inni w tym wątku :).


0

Odpowiedź na to pytanie zawiera się w różnych rozwiązaniach. Zawsze istnieje więcej niż jedno rozwiązanie (np. Sortowanie można wykonać na różne sposoby, np. Sortowanie w bąbelkach, Sortowanie według selekcji itp.), Po prostu musisz wybrać sposób, w jaki możesz to zrobić (Sortowanie) efektywnie. Spróbuj innym razem następnym razem i tak dalej ..... I książki do rozwiązywania problemów ..... Brak Nie możesz nauczyć się umiejętności rozwiązywania problemów z książek, więcej kodu wykonasz, więcej zdobędziesz wiedzy. Powodzenia


0

Programiście łatwo jest mentalnie zaatakować problem, wizualizując sposób rozwiązania problemu za pomocą ulubionego języka programowania. Podobnie jak klasyczny stolarz, który widzi wszystkie problemy jako gwoździe, gdy jego ulubionym narzędziem jest młotek.

Myślę, że najlepsze ćwiczenia w rozwiązywaniu problemów pojawiają się, gdy osiągniesz poziom praktyczny i po prostu pomyśl w kategoriach „tego potrzebowałbym, aby rozwiązać go w optymalny sposób”. W niektórych przypadkach może być konieczne nauczenie się (wielu) nowych rzeczy, aby w ogóle zastosować rozwiązanie, ale kluczową kwestią jest to, że twoja umiejętność wypracowania rozwiązania nie powinna ograniczać się do twoich historycznych i istniejących technik.

Starym praktycznym przykładem dla mnie jest to, że nauczyłem się, jak wdrażać wydajne wielozadaniowość kooperacyjną, kiedy zdałem sobie sprawę, że mój problem nie wymagał już wątków zapobiegawczych, mimo że zwykle szedłem prosto do mojej strefy komfortu, niszcząc wszystkie te muteksy (że ostatecznie zawsze wydaje się, że w pewnym momencie przestaje się czuć komfortowo ...).


0

Podczas opracowywania aplikacji wiele problemów, z którymi mamy do czynienia, to albo nasz własny wynalazek, albo wynalazek idioty, od którego odziedziczyliśmy tę zepsutą bazę kodu. Rozwiązanie problemu najczęściej sprowadza się do znalezienia źródła . Często, gdy dowiadujemy się, gdzie to się dzieje, do rozwiązania tego problemu potrzebne są jedynie kompetencje .

Do tego końca:

  1. Naucz się swojej platformy.
  2. Naucz się swoich narzędzi.
  3. Dowiedz się, jakie narzędzia są dostępne dla Twojej platformy, z którymi jeszcze się nie spotkałeś.

Cały trening mózgu na świecie jest bezużyteczny bez informacji do wykorzystania przez mózg. Aby rozwiązać problem, musisz wiedzieć, jakie są możliwości ! Nawet wtedy praca z dobrą informacją jest o wiele szybsza niż tylko opis problemu.

Mogę spekulować, aż krowy wrócą do domu, dlaczego wykonanie czegoś zajmuje zbyt długo. Ale jeśli powiem „najpierw zdobądźmy trochę danych”, mogę zauważyć, że zgłaszanych jest wiele wyjątków i zdać sobie sprawę, że zamiast tego mogę zmienić to na wyrażenie if. Nie wiedząc, jak zbierać informacje, wiedząc, że na mojej platformie wyjątki zajmują sporo miejsca i że istnieje sposób, aby sprawdzić, zanim próba będzie szybsza, nigdy nie rozwiążę problemu.


0

Twoja odpowiedź składa się z dwóch części:

a) Techniki rzeczywistego rozwiązywania problemów

b) Ulepszanie mózgu z natury „lepszego” myślenia i rozwiązywania problemów

Zawsze było kilka świetnych odpowiedzi na temat techniki (zakładając, że znasz problem itp.), Więc nie zamierzam o tym tyle mówić. Jeśli chodzi o trening mózgu, możesz zrobić kilka rzeczy, aby przekroczyć te synapsy i zbudować więcej połączeń

1) Naucz się nowego języka, prawdziwego języka (np. Francuski lub chiński może być dobrym wyborem w dzisiejszych czasach)

2) Naucz się grać na nowym instrumencie

3) Zrób coś artystycznego, jak malowanie, rysowanie lub rzeźbę

4) Graj w scrabble lub krzyżówki

5) Tańcz jak chcesz. Nie żartuję. Wykazano, że taniec ma wpływ na mózg i myślenie

6) Poszerz swoje doświadczenia, innowacyjne rozwiązania pochodzą z zastosowania teorii w jednej dziedzinie w innej, więc przestudiuj różne dziedziny i obszary, które uważasz za interesujące

7) Ćwiczenie, ćwiczenie jest niezwykle ważne dla poprawy procesu myślenia

Na koniec zamierzam zaoferować najlepszą wskazówkę dotyczącą rozwiązywania trudnych problemów: długi spacer. Przekonałem się, że to działa cuda, aby oczyścić głowę i pozwolić kontemplować problemy



0

Radzę wyrzucić książkę!

Oczywiście nie dosłownie. Chodzi mi o to, aby wejść do obszaru tematycznego, w którym masz niewielkie doświadczenie, i rozwiązać tam trudne problemy bez wiedzy o istniejących rozwiązaniach. Nie polegaj na niczym oprócz kreatywności i krytycznego myślenia oraz być może podręcznika.

Możesz zaprojektować format obrazu. Lub serwer WWW. Lub schemat kompresji. System plików. Jądro. Sztuczna inteligencja. Język programowania. Komputerowy system wizyjny.

Coś, co wydaje ci się interesujące, jest dość skomplikowane i o którym nigdy się nie nauczyłeś. Nie czytaj o tym: po prostu wskocz prosto. Eksperymentuj. Robić błędy. Wymyśl koło na nowo.

Nie proś o pomoc. Unikaj samouczków. Trzymaj się z dala od teorii. Nie ściągaj rozwiązania z półki.

Dlaczego?

  • Uczymy się najlepiej na błędach.
  • Daje to możliwość ćwiczenia kreatywnego wymyślania rozwiązań zamiast zwracania się i dostosowywania starych rozwiązań.
  • Jesteś zmuszony ocenić swoje pomysły. Nie możesz ich ocenić bez dobrego zrozumienia swoich narzędzi, rozwiązywanego problemu i pomysłu, który chcesz ocenić. Prowadzi to do głębszego zrozumienia tego tematu, niż można by się rozwijać. (Przeczytaj o narzędziach, których używasz, po prostu nie czytaj o problemie, który próbujesz rozwiązać.)

Podejmij kilka prób, a gdy będziesz zadowolony z tego, co osiągnąłeś, zostaw to na kilka miesięcy. Potem wróć świeżo i sprawdź, czy możesz znaleźć nową perspektywę. Potem nadszedł czas, aby zacząć czytać o problemie i jak inni go rozwiązali (lub rozmawiali z ludźmi). W tym momencie, zamiast mówić sobie „tak, to ma sens” podczas czytania, powiesz „tak, dokładnie ”, „w pewnym stopniu” lub „wow, to sprytne”.

Innymi słowy, znacznie bardziej krytycznie zastanowisz się nad tym, co czytasz, i łatwiej ci będzie je zrozumieć i zapamiętać, ponieważ masz już duży „mentalny szkielet”, do którego możesz go dołączyć. Będziesz czuł się dobrze z tymi rzeczami, które odkryłeś niezależnie, i odejdziesz z mnóstwem nowej wiedzy.

Nie staraj się, aby Twoje rozwiązanie było idealne. Po prostu udowodnij sobie, że możesz rozwiązać problem. Przyjmij postawę „da się zrobić”, a jeśli czujesz się zniechęcony tym problemem, pamiętaj, że osoba, która go rozwiązała, prawdopodobnie wiedziała tyle samo co ty (w rzeczywistości nie wiedziała, że ​​ma rozwiązanie!).


0

Rozwiązywanie problemów nie jest czymś, czego można się nauczyć, a nawet nauczyć poprzez czytanie. Jedynym sposobem na lepsze rozwiązywanie problemów jest rozwiązywanie problemów.

Istnieją różne techniki i metodologie rozwiązywania problemów, o których można przeczytać, a także o narzędziach i technologiach, których można użyć do rozwiązania problemów w określonej domenie. Jeśli nie będziesz ciągle myśleć o problemach, spróbuj wymyślić rozwiązania (wymyśl wiele rozwiązań dla każdego problemu i oceń je względem siebie), a następnie oceń swoje rozwiązania względem rozwiązań opracowanych przez innych, nie będziesz w stanie lepiej stawić czoła problemowi rozwiązywanie.

Polecam zabranie kopii Pragmatic Thinking and Learning: Refactor Your Wetware autorstwa Andy Hunt . To książka o zrozumieniu, jak myślisz, reagujesz i uczysz się. Przynosi odpowiednie teorie z teorii behawioralnej i innych nauk poznawczych. Jest specjalnie skierowany do twórców oprogramowania, ale dotyczy każdego pracownika wiedzy.


0

Osobom początkującym w programowaniu takim jak ja polecam książkę „Think Like a Programmer”. W pierwszym rozdziale omówiono takie techniki rozwiązywania problemów, jak odtworzenie i podzielenie problemu, zaczynając od tego, co wiesz, redukowanie, analogie i eksperymentowanie.

Następnie są bardziej zaawansowane techniki z przykładami w C ++: rozwiązywanie problemów z tablicami, wskaźnikami i pamięcią dynamiczną, klasami, rekurencją, ponownym użyciem kodu. Nie mogę komentować tej części, ponieważ jest to dla mnie zbyt trudne.


-1

Rozwiązuję jak najwięcej problemów. Lubię też takie puzzle, jak ta . Majstruję przy grach rozwiązywania problemów, takich jak gry matematyczne zawierające liczby pierwsze lub coś takiego, sudoku, Wieża Hanoi itp. Po prostu znajdź rzeczy do rozwiązania. Również, jeśli to możliwe, zakoduj to.


-1

Żegnaj, rozwiązujesz DUŻO problemów!

zaczynasz od łatwych problemów i przechodzisz do trudniejszych problemów, gdy proste stają się rutyną zamiast problemów.


-4

Nie trzymaj się teorii, ćwicz więcej. Wraz z praktyką przychodzi doświadczenie.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.