Kuidas mõelda nagu programmeerija - õppetunnid probleemide lahendamisel

Kui olete programmeerimisest huvitatud, olete seda tsitaati juba varem näinud:

"Kõik selles riigis peaksid õppima arvutit programmeerima, sest see õpetab teid mõtlema." - Steve Jobs

Ilmselt mõtlesite ka, mida tähendab täpselt programmeerijana mõtlemine? Ja kuidas sa seda teed ??

Sisuliseltsee kõik on tõhusam viis probleemide lahendamiseks .

Selles postituses on minu eesmärk teid nii õpetada.

Selle lõpuks saate täpselt teada, milliseid samme peate paremaks probleemide lahendajaks võtma.

Miks see oluline on?

Probleemide lahendamine on metaoskus.

Meil kõigil on probleeme. Suured ja väikesed. Kuidas me nendega hakkama saame, on mõnikord, noh ... päris juhuslik.

Kui teil pole süsteemi, siis tõenäoliselt „lahendate” probleeme (mida tegin siis, kui kodeerimist alustasin):

  1. Proovige lahendust.
  2. Kui see ei aita, proovige mõnda muud.
  3. Kui see ei aita, korrake 2. sammu, kuni teil õnnestub.

Vaadake, mõnikord on teil õnne. Kuid see on halvim viis probleemide lahendamiseks! Ja see on tohutu tohutu aja raiskamine.

Parim viis hõlmab a) raamistiku olemasolu ja b) selle harjutamist.

"Peaaegu kõik tööandjad eelistavad kõigepealt probleemide lahendamise oskusi. Probleemide lahendamise oskused on peaaegu ühehäälselt kõige olulisem kvalifikatsioon, mida tööandjad otsivad…. Rohkem kui programmeerimiskeelte oskus, silumine ja süsteemikujundus. Arvutusliku mõtlemise või võime lagundada võime demonstreerimine , on keerulised probleemid sama väärtuslikud (kui mitte rohkem) kui tööks vajalikud tehnilised põhioskused. " - Häkkeriasetus (2018. aasta arendajate oskuste aruanne)

Kas teil on raamistik

Õige raamistiku leidmiseks järgisin Tim Ferriss’i õppimisraamatu “The 4-Hour Chef” nõuandeid.

See viis mind intervjueerima kahte tõeliselt muljetavaldavat inimest: C. Jordan Ball (Coderbyte'i kasutajate 65 000 kasutajast 1. või 2. kohal) ja V. Anton Spraul (raamatu "Mõtle nagu programmeerija: sissejuhatus loovasse probleemilahendusse" autor ”).

Ma küsisin neilt samu küsimusi ja arvake ära? Nende vastused olid üsna sarnased!

Varsti tunned ka nemad neid.

Sidenote: see ei tähenda, et nad tegid kõike ühtemoodi. Kõik on erinevad. Sa oled erinev. Kuid kui alustate põhimõtetega, mille kohta me kõik nõustume, on head, saate palju kiiremini ja palju edasi.

"Suurim viga, mida uued programmeerijad näevad, on probleemide lahendamise õppimise asemel keskendumine süntaksi õppimisele." - V. Anton Spraul

Mida peaksite siis tegema uue probleemi ilmnemisel?

Siin on sammud:

1. Mõista

Tea täpselt, mida küsitakse. Enamik rasketest probleemidest on rasked, sest te ei saa neist aru (seetõttu on see esimene samm).

Kuidas teada saada, kui saate probleemist aru? Kui saate seda selgitada lihtsas inglise keeles.

Kas mäletate, et olete mõne probleemi külge jäänud, hakkate seda selgitama ja näete koheselt auke loogikas, mida varem ei näinud?

Enamik programmeerijaid teab seda tunnet.

Sellepärast peaksite oma probleemi üles kirjutama, joonistama skeemi või rääkima sellest kellelegi teisele (või asjale ... mõned inimesed kasutavad kummiparti).

"Kui te ei oska midagi lihtsate sõnadega selgitada, ei saa te sellest aru." - Richard Feynman

2. Plaan

Ärge sukelduge kohe ilma plaanita lahendamisse (ja mingil moel loodan, et saate end läbi segada). Planeerige oma lahendus!

Miski ei saa teid aidata, kui te ei suuda täpseid samme üles kirjutada.

Programmeerimisel tähendab see seda, et ära hakka kohe häkkima. Andke oma ajule aega probleemi analüüsimiseks ja teabe töötlemiseks.

Hea plaani saamiseks vastake sellele küsimusele:

"Millised on väljundi Y tagastamiseks vajalikud sisendid X?"

Sidenote: Programmeerijatel on suurepärane abivahend, mis aitab neil seda teha ... Kommentaarid!

3. Jaga

Pane tähele. See on kõige olulisem samm kõigist.

Ärge proovige lahendada ühte suurt probleemi. Sa nutad.

Selle asemel jagage see alamprobleemideks. Neid alamprobleeme on palju lihtsam lahendada.

Seejärel lahendage iga alamprobleem ükshaaval. Alustage kõige lihtsamast. Lihtsaim tähendab seda, et teate vastust (või olete sellele vastusele lähemal).

Pärast seda tähendab lihtsaim, et see lahendatav alamprobleem ei sõltu teistest lahendustest.

Kui olete lahendanud kõik alamprobleemid, ühendage punktid.

Kõigi oma "alamlahenduste" ühendamine annab teile lahenduse algsele probleemile. Palju õnne!

See tehnika on probleemide lahendamise nurgakivi. Pidage seda meeles (lugege seda sammu uuesti, kui peate).

"Kui ma saaksin õpetada igale alustavale programmeerijale üht probleemide lahendamise oskust, oleks see" probleemi vähendamise tehnika vähendamine ". Näiteks oletame, et olete uus programmeerija ja teil palutakse kirjutada programm, mis loeb kümmet numbrit ja numbrit milline number on suuruselt kolmas. Uhiuue programmeerija jaoks võib see olla raske ülesanne, kuigi see nõuab ainult programmeerimise põhisüntaksi. Kui olete ummikus, peaksite probleemi vähendama millekski lihtsamaks. Kolmanda suurima numbri asemel, mis saab üldise suurima leidmisest? Ikka liiga karm? Aga kui leiad kõigist kolmest numbrist suurima? Või suurem neist kahest? Vähendage probleemi nii palju, et teaksite, kuidas seda lahendada, ja kirjutage lahendus. Seejärel laiendage probleemi veidi ja kirjutage lahendus ümber, et see sobiks, ja jätkake, kuni olete tagasi seal, kus alustasite. " - V. Anton Spraul

4. Kinni jäänud?

Nüüdseks olete ilmselt seal istunud ja mõtlete: "Kuule Richard ... See on lahe ja kõik, aga mis siis, kui ma olen ummikus ja ei suuda isegi alamprobleemi lahendada?"

Kõigepealt hinga sügavalt sisse. Teiseks, see on aus.

Ära muretse, sõber. Seda juhtub kõigil!

Erinevus seisneb selles, et parimad programmeerijad / probleemide lahendajad on vigade / vigade vastu pigem uudishimulikud kui ärritunud.

Tegelikult on siin kolm asja, mida proovida, kui näoga kokku puutuda:

  • Silumine: minge samm-sammult läbi oma lahenduse ja proovige leida, kuhu te valesti läksite. Programmeerijad nimetavad seda silumiseks (tegelikult teeb seda vaid silur).
"Silumisekunst on välja selgitada, mida te tegelikult oma programmil käskisin teha, mitte seda, mida arvasite end käskinud teha." "- Andrew Singer
  • Hinnake uuesti:Astuge samm tagasi. Vaadake probleemi teisest vaatenurgast. Kas on midagi, mida saab üldisema lähenemisviisi jaoks abstraktseks muuta?
„Mõnikord eksime probleemi üksikasjadesse nii ära, et jätame kahe silma vahele üldised põhimõtted, mis lahendaksid probleemi üldisemal tasandil. […] Selle klassikaline näide on muidugi järjestikuste täisarvude pika loendi 1 + 2 + 3 +… + n liitmine, mille väga noor Gauss kiiresti ära tundis, lihtsalt n (n + 1) / 2 , vältides seega vaeva, et peaksite lisamist tegema. " - C. Jordan Ball

Sidenote: Teine ümberhindamise viis on uuesti alustamine. Kustutage kõik ja alustage uuesti värskete silmadega. Ma olen tõsine. Sa oled jahmunud, kui tõhus see on.

  • Uuringud:Ahh, hea Google'ist. Sa lugesid seda õigesti. Pole tähtis, mis probleem teil on, keegi on selle tõenäoliselt lahendanud. Leidke see inimene / lahendus. Tegelikult tehke seda isegi siis, kui olete probleemi lahendanud! (Teiste lahendustest saate palju õppida).

Hoiatus: ärge otsige suurele probleemile lahendust. Otsige lahendusi ainult alaküsimustele. Miks? Sest kui sa ei rabele (isegi natuke), ei õpi sa midagi. Kui te midagi ei õpi, raiskasite oma aega.

Harjuta

Ärge oodake, et olete juba nädala pärast suurepärane. Kui soovite olla hea probleemide lahendaja, lahendage palju probleeme!

Harjuta. Harjuta. Harjuta. On vaid aja küsimus, kui mõistate, et „selle probleemi saab hõlpsasti lahendada”.

Kuidas harjutada? Wazoo kaudu on võimalusi!

Malemõistatused, matemaatikaülesanded, Sudoku, Go, monopol, videomängud, cryptokitties, bla ... bla ... bla ...

Tegelikult on edukate inimeste seas levinud muster harjumus praktiseerida mikroprobleeme. Näiteks mängib malet Peter Thiel ja videomänge Elon Musk.

"Byron Reeves ütles:" Kui soovite näha, kuidas ärijuhtimine võib kolme kuni viie aasta pärast välja näha, vaadake, mis online-mängudes toimub. "Edasi juba täna. Elon [Musk], Reid [Hoffman], Mark Zuckerberg ja paljud teised ütlevad, et mängud on olnud ettevõtete edu saavutamisel nende edu aluseks. " - Mary Meeker (2017. aasta Interneti-trendide aruanne)

Kas see tähendab, et peaksite lihtsalt videomänge mängima? Üldse mitte.

Aga mis on videomängud? Täpselt nii, probleemide lahendamine!

Niisiis peaksite leidma praktika väljundi. Midagi, mis võimaldab teil lahendada paljusid mikroprobleeme (ideaalis midagi, mis teile meeldib).

Näiteks naudin väljakutsete kodeerimist. Iga päev üritan lahendada vähemalt ühe väljakutse (tavaliselt Coderbyte'is).

Nagu ma ütlesin, on kõigil probleemidel sarnane muster.

Järeldus

See on kõik!

Nüüd teate paremini, mida tähendab mõelda nagu programmeerija.

Samuti teate, et probleemide lahendamine on uskumatu oskus (metaoskus).

Nagu sellest veel vähe oleks, pange tähele, kuidas teate ka, mida oma probleemide lahendamise oskuste harjutamiseks teha!

Phew ... Päris lahe eks?

Lõpuks soovin, et teil tekiks palju probleeme.

Sa lugesid seda õigesti. Vähemalt teate nüüd, kuidas neid lahendada! (lisaks saate teada, et iga lahenduse korral parandate ennast).

„Just siis, kui arvate, et olete ühel takistusel edukalt navigeerinud, tuleb välja teine. Kuid see hoiab elu huvitavana. […] Elu on protsess, kuidas neist takistustest läbi lüüa - rida kindlustatud jooni, millest peame läbi murda. Iga kord õpite midagi. Iga kord arendate jõudu, tarkust ja perspektiiv. Iga kord langeb natuke rohkem konkurentsi. Kuni pole jäänud muud kui teie: teie parim versioon. " - Ryan Holiday (Takistus on tee)

Minge, lahendage mõned probleemid!

Ja õnne?

Eriline tänu C. Jordan Ballile ja V. Anton Spraulile. Kõik head nõuanded tulid neilt.

Täname lugemast! Kui teile meeldis, proovige, mitu korda võite 5 sekundi jooksul lüüa. See on suurepärane kardio teie sõrmedele JA aitab teistel inimestel seda lugu näha.