Kako razmišljati poput programera - lekcije u rješavanju problema

Ako vas zanima programiranje, možda ste i prije vidjeli ovaj citat:

"Svi u ovoj zemlji trebali bi naučiti programirati računalo, jer vas ono uči razmišljati." - Steve Jobs

Vjerojatno ste se i zapitali što zapravo znači razmišljati poput programera? A kako se to radi ??

U suštini,sve je u vezi s učinkovitijim načinom rješavanja problema .

U ovom postu cilj mi je naučiti vas na taj način.

Na kraju ćete točno znati koje korake treba poduzeti da biste bili bolji rješivač problema.

Zašto je ovo važno?

Rješavanje problema je meta-vještina.

Svi imamo problema. Veliki i mali. Kako se nosimo s njima ponekad je, pa ... prilično slučajno.

Ako nemate sustav, vjerojatno ovako "rješavate" probleme (što sam i učinio kad sam počeo kodirati):

  1. Pokušajte s rješenjem.
  2. Ako to ne uspije, pokušajte s drugim.
  3. Ako to ne uspije, ponovite korak 2 dok vam ne uspije.

Gledaj, ponekad imaš sreće. Ali to je najgori način rješavanja problema! I to je ogromno, ogromno gubljenje vremena.

Najbolji način uključuje a) posjedovanje okvira i b) prakticiranje.

"Gotovo svi poslodavci prvo daju prednost vještinama rješavanja problema. Vještine rješavanja problema gotovo su jednoglasno najvažnija kvalifikacija koju poslodavci traže .... Više od znanja programskog jezika, otklanjanja pogrešaka i dizajna sustava. Demonstriranje računalnog razmišljanja ili sposobnosti razbijanja velikih problema , složeni problemi jednako su vrijedni (ako ne i više) od osnovnih tehničkih vještina potrebnih za posao. " - Hacker Rank (Izvješće o vještinama programera za 2018.)

Imajte okvir

Kako bih pronašao pravi okvir, slijedio sam savjete iz knjige Tima Ferrissa o učenju, "4-satni kuhar".

Navelo me da intervjuiram dvoje zaista impresivnih ljudi: C. Jordana Ball (na 1. ili 2. mjestu od 65 000+ korisnika na Coderbyteu) i V. Antona Spraula (autor knjige „Misli kao programer: Uvod u kreativno rješavanje problema“ ”).

Pitao sam ih ista pitanja, i pogodite što? Njihovi su odgovori bili prilično slični!

Uskoro ćete ih i vi znati.

Sidenote: to ne znači da su sve radili na isti način. Svi su različiti. Bit ćete drugačiji. Ali ako započnete s načelima za koje se svi slažemo da su dobri, puno ćete dalje ići puno brže.

"Najveća pogreška koju vidim da novi programeri čine je fokusiranje na učenje sintakse umjesto na učenje načina rješavanja problema." - V. Anton Špraul

Pa, što biste trebali učiniti kada naiđete na novi problem?

Evo koraka:

1. Razumjeti

Znajte točno što se traži. Većina teških problema su teški jer ih ne razumijete (stoga je ovo prvi korak).

Kako znati kada razumijete problem? Kad to možete objasniti jednostavnim engleskim jezikom.

Sjećate li se da ste ostali u problemu, počnete ga objašnjavati i odmah vidite rupe u logici koje prije niste vidjeli?

Većina programera zna taj osjećaj.

Zbog toga biste trebali zapisivati ​​svoj problem, crtati dijagram ili reći nekome drugom o tome (ili nešto ... neki ljudi koriste gumenu patku).

"Ako nešto ne možete objasniti jednostavnim riječima, to ne razumijete." - Richard Feynman

2. Planirajte

Ne uronite pravo u rješavanje bez plana (i nekako se nadam da ćete se uspjeti zbuniti). Planirajte svoje rješenje!

Ništa vam ne može pomoći ako ne možete zapisati točne korake.

U programiranju to znači da nemojte odmah početi hakirati. Dajte mozgu vremena da analizira problem i obradi informacije.

Da biste dobili dobar plan, odgovorite na ovo pitanje:

"S obzirom na ulaz X, koji su koraci potrebni za vraćanje izlaza Y?"

Sidenote: Programeri imaju sjajan alat koji će im pomoći u tome ... Komentari!

3. Podijelite

Obratiti pažnju. Ovo je najvažniji korak od svih.

Ne pokušavajte riješiti jedan veliki problem. Plakat ćete.

Umjesto toga, podijelite ga na pod-probleme. Te je potprobleme mnogo lakše riješiti.

Zatim riješite svaki pod-problem jedan po jedan. Započnite s najjednostavnijim. Najjednostavnije znači da znate odgovor (ili ste bliži tom odgovoru).

Nakon toga, najjednostavnije znači da ovaj pod-problem koji se rješava ne ovisi o drugima koji se rješavaju.

Kad riješite svaki pod-problem, spojite točkice.

Povezivanjem svih vaših "pod-rješenja" dobit ćete rješenje izvornog problema. Čestitamo!

Ova je tehnika temelj rješavanja problema. Zapamtite ga (ako morate, ponovno pročitajte ovaj korak).

„Kad bih mogao svakog početnika programera naučiti jednoj vještini rješavanja problema, to bi bila tehnika„ smanjivanje problema “. Na primjer, pretpostavimo da ste novi programer i od vas se traži da napišete program koji čita deset brojeva i brojki koji je broj treći po veličini. Za potpuno novog programera to može biti težak zadatak, iako zahtijeva samo osnovnu sintaksu programiranja. Ako ste zapeli, trebali biste problem svesti na nešto jednostavnije. Umjesto trećeg najvišeg broja, što je s pronalaženjem najvišeg ukupnog broja? Još uvijek previše žilav? Što je s pronalaženjem najvećeg od samo tri broja? Ili veće od dva? Smanjite problem na točku na koju znate kako ga riješiti i napišite rješenje. Zatim malo proširite problem i prepišite rješenje da se podudara i nastavite dok se ne vratite tamo gdje ste započeli. " - V. Anton Špraul

4. Zapeli?

Dosad već sjediš tamo i misliš "Hej Richarde ... To je u redu, ali što ako sam zaglavio i ne uspijem riješiti ni pod-problem ??"

Prvo duboko udahnite. Drugo, to je pošteno.

Ne brini se, prijatelju. To se događa svima!

Razlika je u tome što su najbolji programeri / rješavači problema znatiželjniji zbog grešaka / pogrešaka nego što su iritirani.

Zapravo, evo tri stvari koje biste trebali isprobati kad se suočite s udarom:

  • Otklanjanje pogrešaka: korak po korak prođite kroz svoje rješenje pokušavajući pronaći mjesto gdje ste pogriješili. Programeri to nazivaju otklanjanjem pogrešaka (zapravo to je sve što program za ispravljanje pogrešaka čini).
"Umjetnost ispravljanja pogrešaka je otkrivanje onoga što ste doista rekli svom programu, a ne onoga što ste mislili da ste mu rekli." - Andrew Singer
  • Preispitati:Odmaknite se. Pogledajte problem iz druge perspektive. Postoji li nešto što se može apstrahirati na općenitiji pristup?
“Ponekad se toliko izgubimo u pojedinostima problema da previdimo opća načela koja bi problem riješila na općenitijoj razini. [...] Klasični primjer toga je, naravno, zbrajanje dugog popisa uzastopnih cijelih brojeva, 1 + 2 + 3 + ... + n, za koji je vrlo mladi Gauss brzo prepoznao da je jednostavno n (n + 1) / 2 , izbjegavajući tako napor da se izvrši dodatak. " - C. Jordan Ball

Sidenote: Drugi način ponovne procjene započinje iznova. Izbrišite sve i započnite iznova sa svježim očima. Ozbiljan sam. Zanijemit ćete koliko je to učinkovito.

  • Istraživanje:Ah, dobri stari Google. Dobro ste pročitali. Bez obzira na problem koji imate, netko ga je vjerojatno riješio. Pronađite tu osobu / rješenje. Zapravo, učinite to čak i ako ste riješili problem! (Možete puno naučiti iz tuđih rješenja).

Upozorenje: Ne tražite rješenje velikog problema. Tražite samo rješenja za potprobleme. Zašto? Jer ako se ne borite (čak i malo), nećete ništa naučiti. Ako ništa ne naučite, izgubili ste vrijeme.

Praksa

Ne očekujte da ćete biti izvrsni već nakon jednog tjedna. Ako želite biti dobar rješavač problema, riješite puno problema!

Praksa. Praksa. Praksa. Samo će biti pitanje vremena kad ćete prepoznati da se "s tim problemom lako može riješiti".

Kako vježbati? Postoje mogućnosti za wazoo!

Šahovske zagonetke, matematički problemi, Sudoku, Go, Monopoly, video igre, kriptotoke, bla ... bla ... bla ....

Zapravo je uobičajen obrazac među uspješnim ljudima njihova navika vježbanja „mikro rješavanja problema“. Primjerice, Peter Thiel igra šah, a Elon Musk videoigre.

"Byron Reeves rekao je:" Ako želite vidjeti kako poslovno vodstvo može izgledati za tri do pet godina, pogledajte što se događa u mrežnim igrama. "Brzo unaprijed do danas. Elon [Musk], Reid [Hoffman], Mark Zuckerberg i mnogi drugi kažu da su igre temelj njihovog uspjeha u izgradnji njihovih tvrtki. " - Mary Meeker (izvještaj o internetskim trendovima za 2017. godinu)

Znači li to da biste trebali samo igrati video igre? Nikako.

Ali što su uopće video igre? Točno, rješavanje problema!

Dakle, ono što biste trebali učiniti je pronaći mjesto za vježbanje. Nešto što vam omogućuje rješavanje mnogih mikro problema (idealno je nešto u čemu uživate).

Na primjer, uživam u izazovima kodiranja. Svaki dan pokušavam riješiti barem jedan izazov (obično na Coderbyteu).

Kao što sam rekao, svi problemi imaju slične obrasce.

Zaključak

To je sve narode!

Sada znate bolje što znači "razmišljati poput programera".

Također znate da je rješavanje problema nevjerojatna vještina za kultiviranje (meta-vještina).

Kao da to nije dovoljno, primijetite kako i vi znate što trebate učiniti da biste vježbali svoje vještine rješavanja problema!

Phew ... Prilično cool zar ne?

Napokon, želim vam da naiđete na mnogo problema.

Dobro ste pročitali. Sad barem znate kako ih riješiti! (također, naučit ćete da se sa svakim rješenjem poboljšavate).

„Taman kad pomislite da ste uspješno prešli jednu prepreku, pojavljuje se druga. Ali to je ono što život čini zanimljivim. [...] Život je proces probijanja ovih prepreka - niz utvrđenih linija kroz koje moramo proći. Svaki put ćete nešto naučiti. Svaki put ćete razviti snagu, mudrost , i perspektiva. Svaki put malo više konkurencije otpada. Dok ne ostaneš samo ti: najbolja verzija tebe. " - Ryan Holiday (prepreka je put)

Idite riješiti neke probleme!

I puno sreće?

Posebna zahvala C. Jordanu Ballu i V. Antonu Spraulu. Svi dobri savjeti ovdje stigli su od njih.

Hvala na čitanju! Ako ste uživali, testirajte koliko puta možete pogoditi za 5 sekundi. Izvrstan je kardio za prste I pomoći će drugima da vide priču.