Kuinka ajatella ohjelmoijan tavoin - oppitunteja ongelmanratkaisussa

Jos olet kiinnostunut ohjelmoinnista, olet ehkä nähnyt tämän lainauksen aiemmin:

"Kaikkien tässä maassa tulisi oppia ohjelmoimaan tietokone, koska se opettaa ajattelemaan." - Steve Jobs

Luultavasti mietit myös, mitä tarkalleen tarkoittaa ajatella ohjelmoijana? Ja miten teet sen?

Pohjimmiltaankyse on tehokkaammasta tavasta ongelmanratkaisuun .

Tässä viestissä tavoitteenani on opettaa sinua sillä tavalla.

Loppuun mennessä tiedät tarkalleen, mitkä vaiheet on tehtävä paremmaksi ongelmanratkaisijaksi.

Miksi tämä on tärkeää?

Ongelmanratkaisu on meta-taito.

Meillä kaikilla on ongelmia. Iso ja pieni. Kuinka suhtaudumme heihin on joskus, hyvin ... melko satunnaista.

Ellei sinulla ole järjestelmää, luultavasti näin "ratkaiset" ongelmia (mitä tein, kun aloitin koodaamisen):

  1. Kokeile ratkaisua.
  2. Jos se ei auta, kokeile toista.
  3. Jos se ei auta, toista vaihe 2, kunnes onnistu.

Katso, joskus onneasi. Mutta se on pahin tapa ratkaista ongelmia! Ja se on valtava, valtava ajanhukka.

Paras tapa on a) kehyksen omistaminen ja b) sen harjoittelu.

"Lähes kaikki työnantajat asettavat etusijalle ongelmanratkaisutaidot. Ongelmanratkaisutaidot ovat melkein yksimielisesti tärkein pätevyys, jonka työnantajat etsivät ... enemmän kuin ohjelmointikielien taito, virheenkorjaus ja järjestelmäsuunnittelu. , monimutkaiset ongelmat ovat yhtä arvokkaita (ellei enempää) kuin työpaikan edellyttämät perustekniset taidot. " - Hakkeri-sijoitus (2018 Developer Skills Report)

Onko sinulla kehys

Löysin oikeat puitteet noudattamalla Tim Ferrissin oppimisen kirjan "Neljän tunnin kokki" neuvoja.

Se sai minut haastattelemaan kahta todella vaikuttavaa ihmistä: C. Jordan Ball (sijoittui 1. tai 2. sijalle yli 65 000 käyttäjälle Coderbyte-ohjelmassa) ja V. Anton Spraul (kirjan "Ajattele kuin ohjelmoija: Johdatus luovaan ongelmanratkaisuun" kirjoittaja ”).

Esitin heille samat kysymykset, ja arvaa mitä? Heidän vastauksensa olivat melko samanlaisia!

Pian sinäkin tunnet heidät.

Sidenote: tämä ei tarkoita, että he tekivät kaiken samalla tavalla. Kaikki ovat erilaisia. Olet erilainen. Mutta jos aloitat periaatteista, jotka olemme kaikki samaa mieltä, ovat hyviä, saat paljon eteenpäin paljon nopeammin.

"Suurin virhe, jonka näen uusien ohjelmoijien tekevän, on keskittyminen syntaksin oppimiseen ongelmien ratkaisemisen sijaan." - V. Anton Spraul

Joten mitä sinun pitäisi tehdä, kun kohtaat uuden ongelman?

Tässä ovat vaiheet:

1. Ymmärrä

Tiedä tarkalleen, mitä pyydetään. Useimmat vaikeista ongelmista ovat vaikeita, koska et ymmärrä niitä (miksi tämä on ensimmäinen askel).

Kuinka tietää, kun ymmärrät ongelman? Kun voit selittää sen yksinkertaisella englannilla.

Muistatko juuttuneen ongelmaan, aloitat sen selittämisen ja näet heti aukkoja logiikassa, jota et aiemmin nähnyt?

Useimmat ohjelmoijat tietävät tämän tunteen.

Siksi sinun pitäisi kirjoittaa ongelmaasi, piirtää kaavio tai kertoa siitä jollekin muulle (tai asia ... jotkut ihmiset käyttävät kumiankkaa).

"Jos et pysty selittämään jotain yksinkertaisella tavalla, et ymmärrä sitä." - Richard Feynman

2. Suunnittele

Älä sukella suoraan ratkaisuun ilman suunnitelmaa (ja toivon jotenkin, että pystyt sekoittamaan itsesi läpi). Suunnittele ratkaisusi!

Mikään ei voi auttaa sinua, jos et pysty kirjoittamaan tarkkoja vaiheita.

Ohjelmoinnissa tämä tarkoittaa, että älä aloita hakkerointia heti. Anna aivoillesi aikaa analysoida ongelma ja käsitellä tietoja.

Saadaksesi hyvän suunnitelman, vastaa tähän kysymykseen:

"Mitkä ovat tulon X palauttamiseen tarvittavat vaiheet?"

Sidenote: Ohjelmoijilla on loistava työkalu auttamaan heitä tässä… Kommentit!

3. Jaa

Kiinnittää huomiota. Tämä on kaikkien tärkein askel.

Älä yritä ratkaista yhtä suurta ongelmaa. Itket.

Sen sijaan jaa se alaongelmiin. Nämä alaongelmat on paljon helpompi ratkaista.

Ratkaise sitten kukin alaongelma yksitellen. Aloita yksinkertaisimmalla. Yksinkertaisin tarkoittaa, että tiedät vastauksen (tai olet lähempänä sitä vastausta).

Sen jälkeen yksinkertaisin tarkoittaa, että tämä ratkaistava alaongelma ei riipu muiden ratkaisemisesta.

Kun olet ratkaissut kaikki alaongelmat, liitä pisteet.

Kaikkien "alaratkaisujen" yhdistäminen antaa sinulle ratkaisun alkuperäiseen ongelmaan. Onnittelut!

Tämä tekniikka on ongelmanratkaisun kulmakivi. Muista se (lue tämä vaihe uudelleen, jos sinun täytyy).

"Jos voisin opettaa jokaiselle aloittavalle ohjelmoijalle yhden ongelmanratkaisutaidon, se olisi" vähennä ongelmatekniikkaa ". Oletetaan esimerkiksi, että olet uusi ohjelmoija ja sinua pyydetään kirjoittamaan ohjelma, joka lukee kymmenen lukua ja lukua mikä luku on kolmanneksi suurin. Upouudelle ohjelmoijalle se voi olla vaikea tehtävä, vaikka se vaatii vain perusohjelmointisyntaksin. Jos olet jumissa, sinun pitäisi vähentää ongelma yksinkertaisemmaksi. Entä kolmanneksi suurimman luvun sijasta korkeimman kokonaismäärän löytäminen? Edelleen liian kova? Entä löytää suurin vain kolmesta numerosta? Tai pienempi kahdesta? Vähennä ongelma siihen pisteeseen, jossa osaat ratkaista sen ja kirjoittaa ratkaisun. Laajenna sitten ongelmaa hieman ja kirjoita ratkaisu uudelleen vastaamaan sitä ja jatka, kunnes olet takaisin siellä, missä aloitit. " - V. Anton Spraul

4. jumissa?

Tähän mennessä olet todennäköisesti istunut siellä ajattelemalla "Hei Richard ... Se on hienoa ja kaikki, mutta entä jos olen jumissa eikä pysty edes ratkaisemaan alaongelmaa?"

Hengitä ensin. Toiseksi, se on reilua.

Älä huoli, ystävä. Tämä tapahtuu kaikille!

Erona on se, että parhaat ohjelmoijat / ongelmanratkaisijat ovat enemmän uteliaita virheistä kuin ärtyneistä.

Itse asiassa tässä on kolme asiaa, jotka on kokeiltava kohdattaessa pahoinpitelyä:

  • Virheenkorjaus: Käy läpi vaihe vaiheelta ratkaisusi ja yritä löytää missä olet mennyt pieleen. Ohjelmoijat kutsuvat tätä virheenkorjausta (itse asiassa tämä on vain virheenkorjaaja).
"Virheenkorjauksen taito on selvittää, mitä sinä itse käskit ohjelmallesi tehdä, eikä sitä mitä luulit käskevänsi tekemään." - Andrew Singer
  • Arvioi uudelleen:Ota askel taaksepäin. Tarkastele ongelmaa toisesta näkökulmasta. Onko jotain, mitä voidaan abstraktoida yleisempään lähestymistapaan?
”Joskus eksymme ongelman yksityiskohtiin niin paljon, että unohdamme yleiset periaatteet, jotka ratkaisisivat ongelman yleisemmällä tasolla. […] Klassinen esimerkki tästä on tietysti pitkä peräkkäisten kokonaislukujen 1 + 2 + 3 +… + n summa, jonka hyvin nuori Gauss tunnisti nopeasti yksinkertaisesti n (n + 1) / 2 välttäen näin lisäyksen tekemisen vaivaa. " - C.Jordan Ball

Sidenote: Toinen tapa arvioida uudelleen on alkamassa uudestaan. Poista kaikki ja aloita uudestaan ​​tuoreilla silmillä. Olen tosissani. Sinua hämmästyttää kuinka tehokas tämä on.

  • Tutkimus:Ahh, hyvä Google. Luit sen oikein. Ei ole väliä mitä ongelmaa sinulla on, joku on todennäköisesti ratkaissut sen. Etsi kyseinen henkilö / ratkaisu. Tee itse asiassa, vaikka oletkin ratkaissut ongelman! (Voit oppia paljon muiden ratkaisuista).

Varoitus: Älä etsi ratkaisua isoon ongelmaan. Etsi vain ratkaisuja alaongelmiin. Miksi? Koska ellet taistele (edes vähän), et opi mitään. Jos et opi mitään, hukkaat aikaa.

Harjoitella

Älä odota olevan hieno vain viikon kuluttua. Jos haluat olla hyvä ongelmanratkaisija, ratkaise paljon ongelmia!

Harjoitella. Harjoitella. Harjoitella. On vain ajan kysymys, ennen kuin tunnistat, että "tämä ongelma voidaan helposti ratkaista".

Kuinka harjoitella? Wazoo tarjoaa vaihtoehtoja!

Shakkipulmat, matemaattiset ongelmat, Sudoku, Go, Monopoly, videopelit, cryptokitties, bla… bla… bla…

Itse asiassa yleinen malli menestyvien ihmisten keskuudessa on heidän tapansa harjoittaa "mikro-ongelmanratkaisua". Esimerkiksi Peter Thiel pelaa shakkia ja Elon Musk pelaa videopelejä.

"Byron Reeves sanoi:" Jos haluat nähdä, miltä yritysjohtajuus voi näyttää kolmesta viiteen vuoteen, katso mitä online-peleissä tapahtuu. "Nopeasti eteenpäin tänään. Elon [Musk], Reid [Hoffman], Mark Zuckerberg ja monet muut sanovat, että pelit ovat olleet heidän menestymisensä perustana yrityksen rakentamisessa. " - Mary Meeker (Internet-trendiraportti 2017)

Tarkoittaako tämä, että sinun pitäisi vain pelata videopelejä? Ei lainkaan.

Mutta mistä videopelit ovat kyse? Aivan oikein, ongelmanratkaisu!

Joten, mitä sinun pitäisi tehdä, on löytää lähtökohta harjoitteluun. Jotain, jonka avulla voit ratkaista monia mikro-ongelmia (mieluiten jotain, josta nautit).

Esimerkiksi nautin koodauksen haasteista. Yritän ratkaista joka päivä ainakin yhden haasteen (yleensä Coderbytellä).

Kuten sanoin, kaikilla ongelmilla on samanlainen malli.

Johtopäätös

Siinä kaikki ihmiset!

Nyt tiedät paremmin, mitä tarkoittaa "ajattelu kuin ohjelmoija".

Tiedät myös, että ongelmanratkaisu on uskomaton taito kehittää (meta-taito).

Ikään kuin se ei olisi tarpeeksi, huomaa, kuinka tiedät myös mitä tehdä ongelmanratkaisutaitosi harjoittamiseksi!

Phew ... Melko siistiä, eikö?

Lopuksi toivon, että kohtaat monia ongelmia.

Luit sen oikein. Ainakin nyt osaat ratkaista ne! (opit myös, että jokaisella ratkaisulla parannat).

"Juuri kun luulet, että olet onnistuneesti ohjannut yhden esteen, syntyy toinen. Mutta se pitää elämän mielenkiintoisena. […] Elämä on prosessi näiden esteiden läpimurtoon - sarja väkevöityjä viivoja, jotka meidän on murrettava. Joka kerta opit jotain. Joka kerta kehität voimaa, viisautta Joka kerta hieman enemmän kilpailua putoaa. Kunnes jäljellä on vain sinä: paras versio sinusta. " - Ryan Holiday (Este on tie)

Mene nyt ratkaisemaan joitain ongelmia!

Ja onnea?

Erityiset kiitokset C. Jordan Ballille ja V. Anton Spraulille. Kaikki hyvät neuvot tulivat heiltä.

Kiitos lukemisesta! Jos pidit siitä, testaa kuinka monta kertaa voit lyödä 5 sekunnissa. Se on hieno sydän sormillesi JA auttaa muita ihmisiä näkemään tarinan.