Как да мислим като програмист - уроци по решаване на проблеми

Ако се интересувате от програмиране, може би сте виждали този цитат и преди:

„Всички в тази страна трябва да се научат да програмират компютър, защото той те учи да мислиш.“ - Стийв Джобс

Сигурно сте се чудили и какво всъщност означава да мислиш като програмист? И как го правиш ??

По същество,всичко е свързано с по-ефективен начин за решаване на проблеми .

В тази публикация целта ми е да ви науча по този начин.

В края на това ще знаете точно какви стъпки да предприемете, за да бъдете по-добър решаващ проблем.

Защо това е важно?

Решаването на проблеми е мета-умението.

Всички имаме проблеми. Големи и малки. Начинът, по който се справяме с тях, е понякога, ами ... доста произволен.

Освен ако нямате система, вероятно по този начин „решавате“ проблеми (което направих, когато започнах да кодирам):

  1. Опитайте решение.
  2. Ако това не помогне, опитайте друг.
  3. Ако това не помогне, повторете стъпка 2, докато успеете.

Вижте, понякога имате късмет. Но това е най-лошият начин за решаване на проблеми! И това е огромна, огромна загуба на време.

Най-добрият начин включва а) да има рамка и б) да я практикува.

"Почти всички работодатели отдават приоритет на уменията за решаване на проблеми. Уменията за решаване на проблеми са почти единодушно най-важната квалификация, която работодателите търсят .... Повече от владеенето на езици за програмиране, отстраняване на грешки и дизайн на системата. Демонстриране на изчислително мислене или способност за разбиване на големи , сложните проблеми са също толкова ценни (ако не и повече) от базовите технически умения, необходими за дадена работа. " - Ранг на хакерите (Отчет за уменията на разработчиците за 2018 г.)

Имайте рамка

За да намеря правилната рамка, последвах съвета в книгата на Тим Ферис за ученето „4-часовият готвач“.

Това ме накара да интервюирам двама наистина впечатляващи хора: C. Jordan Ball (класиран на 1-во или 2-ро място от 65 000+ потребители на Coderbyte) и V. Anton Spraul (автор на книгата „Мисли като програмист: Въведение в творческото решаване на проблеми“ ”).

Зададох им същите въпроси и познайте какво? Отговорите им бяха доста сходни!

Скоро и вие ще ги познаете.

Sidenote: това не означава, че са направили всичко по същия начин. Всеки е различен. Ще бъдете различни. Но ако започнете с принципи, за които всички сме съгласни, че са добри, ще получите много по-далеч много по-бързо.

„Най-голямата грешка, която виждам, че новите програмисти правят, е да се съсредоточат върху изучаването на синтаксиса, вместо да се научат как да решават проблеми.“ - В. Антон Шпраул

И така, какво трябва да направите, когато срещнете нов проблем?

Ето стъпките:

1. Разберете

Знаете точно какво се иска. Повечето трудни проблеми са трудни, защото не ги разбирате (следователно защо това е първата стъпка).

Как да разбера кога разбираш проблем? Когато можете да го обясните на обикновен английски.

Спомняте ли си, че сте останали на проблем, започвате да го обяснявате и веднага виждате дупки в логиката, които не сте виждали преди?

Повечето програмисти знаят това чувство.

Ето защо трябва да запишете проблема си, да нарисувате диаграма или да кажете на някой друг за това (или нещо ... някои хора използват гумена патица).

„Ако не можете да обясните нещо с прости думи, не го разбирате.“ - Ричард Файнман

2. План

Не се гмурвайте направо в решаването без план (и по някакъв начин се надявам да успеете да си объркате пътя). Планирайте своето решение!

Нищо не може да ви помогне, ако не можете да запишете точните стъпки.

При програмирането това означава, че не започвайте да хакнете веднага. Дайте на мозъка си време да анализира проблема и да обработи информацията.

За да получите добър план, отговорете на този въпрос:

„При даден вход X, какви са стъпките, необходими за връщане на изхода Y?“

Sidenote: Програмистите имат чудесен инструмент, който да им помогне с това ... Коментари!

3. Разделяне

Обърни внимание. Това е най-важната стъпка от всички.

Не се опитвайте да разрешите един голям проблем. Ще плачеш.

Вместо това го разбийте на подпроблеми. Тези подпроблеми са много по-лесни за решаване.

След това решете всеки подзадача един по един. Започнете с най-простото. Най-простото означава, че знаете отговора (или сте по-близо до този отговор).

След това най-простото означава, че този подпроблем, който се решава, не зависи от решаването на други.

След като решите всеки подзадача, свържете точките.

Свързването на всички ваши „под-решения“ ще ви даде решение на първоначалния проблем. Честито!

Тази техника е крайъгълен камък за решаване на проблеми. Запомнете го (прочетете отново тази стъпка, ако трябва).

„Ако можех да науча всеки начинаещ програмист на едно умение за решаване на проблеми, това би било„ техниката за намаляване на проблема “. Например, да предположим, че сте нов програмист и от вас се изисква да напишете програма, която чете десет числа и цифри кое число е третото по височина. За чисто нов програмист това може да е трудна задача, въпреки че изисква само основен синтаксис за програмиране. Ако сте останали, трябва да намалите проблема до нещо по-просто. Вместо третото най-високо число, какво ще кажете за намирането на най-високото общо? Все още твърде твърд? Какво ще кажете за намирането на най-голямото от само три числа? Или по-голямото от две? Намалете проблема до точката, в която знаете как да го разрешите и напишете решението. След това леко разширете проблема и пренапишете решението, за да съвпадне, и продължете, докато не се върнете там, откъдето сте започнали. " - В. Антон Шпраул

4. Заклещен?

Досега вероятно си седите там и си мислите „Хей, Ричард ... Това е страхотно и всичко, но какво ще стане, ако съм заседнал и дори не мога да реша подзадача ??“

Първо, поемете дълбоко въздух. Второ, честно.

Не се притеснявай обаче, приятелю. Това се случва на всички!

Разликата е, че най-добрите програмисти / решаващи проблеми са по-любопитни за грешки / грешки, отколкото раздразнени.

Всъщност, ето три неща, които трябва да опитате, когато се изправите пред удар:

  • Отстраняване на грешки: Преминете стъпка по стъпка през вашето решение, опитвайки се да намерите къде сте сгрешили. Програмистите наричат ​​това отстраняване на грешки (всъщност това е всичко, което прави дебъгерът).
„Изкуството на отстраняване на грешки е да разбереш какво наистина си казал на програмата си, а не това, което си мислел, че си казал.“ - Андрю Сингър
  • Преоцени:Направете крачка назад. Погледнете на проблема от друга гледна точка. Има ли нещо, което може да бъде абстрахирано от по-общ подход?
„Понякога толкова се губим в детайлите на даден проблем, че пренебрегваме общи принципи, които биха решили проблема на по-общо ниво. [...] Класическият пример за това, разбира се, е сумирането на дълъг списък от последователни цели числа, 1 + 2 + 3 + ... + n, което много млад Гаус бързо разпозна просто е n (n + 1) / 2 , като по този начин се избягва усилието да се наложи да се направи добавянето. " - C. Jordan Jordan

Sidenote: Друг начин за преоценка е започването отначало. Изтрийте всичко и започнете отново със свежи очи. Сериозен съм. Ще се озадачите колко е ефективно това.

  • Изследвания:Ааа, добре, Google. Правилно сте прочели. Без значение какъв проблем имате, вероятно някой го е решил. Намерете този човек / решение. Всъщност направете това, дори ако сте решили проблема! (Можете да научите много от решенията на други хора).

Предупреждение: Не търсете решение на големия проблем. Търсете само решения на подпроблеми. Защо? Защото, освен ако не се борите (дори малко), няма да научите нищо. Ако не научите нищо, сте си загубили времето.

Практика

Не очаквайте да бъдете страхотни само след една седмица. Ако искате да бъдете добър решаващ проблем, решете много проблеми!

Практика. Практика. Практика. Въпрос на време ще е да разберете, че „този проблем може лесно да бъде решен“.

Как да практикувате? Има опции за wazoo!

Шахматни пъзели, математически задачи, Судоку, Go, Monopoly, видеоигри, cryptokitties, бла ... бла ... бла ....

Всъщност често срещан модел сред успешните хора е навикът им да практикуват „микро решаване на проблеми“. Например, Питър Тийл играе шах, а Илон Мъск - ​​видеоигри.

„Байрън Рийвс каза:„ Ако искате да видите как може да изглежда бизнес лидерството след три до пет години, вижте какво се случва в онлайн игрите. “Бързо напред до днес. Илон [Мъск], Рийд [Хофман], Марк Зукърбърг и много други казват, че игрите са основополагащи за успеха им в изграждането на техните компании. " - Мери Мийкър (доклад за интернет тенденциите за 2017 г.)

Означава ли това, че трябва просто да играете видео игри? Въобще не.

Но какво са видеоигрите? Точно така, решаване на проблеми!

И така, това, което трябва да направите, е да намерите изход за практика. Нещо, което ви позволява да решавате много микро проблеми (в идеалния случай, нещо, което ви харесва).

Например, аз се наслаждавам на предизвикателствата за кодиране. Всеки ден се опитвам да реша поне едно предизвикателство (обикновено на Coderbyte).

Както казах, всички проблеми имат подобни модели.

Заключение

Това е всичко приятели!

Сега вече знаете по-добре какво означава „да мислиш като програмист“.

Също така знаете, че решаването на проблеми е невероятно умение за култивиране (мета-умението).

Сякаш това не беше достатъчно, забележете как знаете и какво да правите, за да практикувате уменията си за решаване на проблеми!

Фу ... Доста готино, нали?

И накрая, пожелавам ви да срещнете много проблеми.

Правилно сте прочели. Сега поне знаете как да ги решите! (също така ще научите, че с всяко решение се подобрявате).

„Точно когато си мислите, че сте се справили успешно с едно препятствие, се появява друго. Но това е, което прави живота интересен. [...] Животът е процес на пробиване през тези пречки - поредица от укрепени линии, които трябва да пробием. Всеки път ще научите нещо. Всеки път ще развивате сила, мъдрост , и перспектива. Всеки път малко повече от конкуренцията отпада. Докато не останете само вие: най-добрата версия на вас. " - Райън Холидей (Препятствието е пътят)

Сега отидете да решите някои проблеми!

И най-добър късмет?

Специални благодарности на C. Jordan Ball и V. Anton Spraul. Всички добри съвети тук дойдоха от тях.

Благодаря за четенето! Ако ви е харесало, тествайте колко пъти можете да ударите за 5 секунди. Това е чудесно кардио за пръстите ви и ще помогне на другите хора да видят историята.