Оригінальна публікація: How to think like a programmer — lessons in problem solving
Автор: Річард Рейс
Якщо ви зацікавлені в програмуванні, то, можливо, вже бачили цю цитату:
«Кожен повинен навчитися програмувати, тому що це вчить мислити», — Стів Джобс
Ви, мабуть, також замислювалися, що саме означає «мислити, як програміст»? І як це робити??
Суть полягає в ефективнішому способі розв’язання проблем.
Мета цієї статті — навчити вас цього способу.
Наприкінці ви точно знатимете, які кроки потрібно зробити, щоб краще розв’язувати проблеми.
Чому це важливо?
Розв’язання проблем — це метанавичка.
У нас всіх є проблеми: в когось більші, в когось менші. Деколи ми справляємось з ними дуже… непродумано.
Якщо у вас немає системи, то ви, ймовірно, «розв’язуєте» проблеми наступним чином (я також так робив, коли починав програмувати):
- знаходите розв’язок;
- якщо він не працює, знаходите інший розв’язок;
- якщо він теж не працює, повторюєте крок №2, доки не пощастить.
Дивіться, іноді може пощастити. Але це найгірший спосіб розв’язання проблем! І це просто величезна трата часу.
Найкращий спосіб включає а) наявність системи та б) її використання.
«Майже всі роботодавці в першу чергу надають перевагу навичкам розв’язання проблем.
Навички розв’язання проблем майже одностайно вважаються найважливішою характеристикою, яку шукають роботодавці... Навіть важливішою, ніж знання мов програмування, налагодження та проєктування систем.
Обчислювальне мислення та здатність розбивати великі, складні проблеми так само цінні (якщо не більше), як базові технічні навички, необхідні для роботи», — Hacker Rank (звіт про навички розробників за 2018 рік)
Дотримуйтесь системи
Щоб знайти правильну систему, я скористався порадою з книги Тіма Ферріса «Шеф-кухар за 4 години».
Це привело мене до інтерв’ю з двома справді дивовижними людьми: С. Джорданом Баллом (займає 1-ше або 2-ге місце серед 65 000+ користувачів на Coderbyte) і В. Антоном Спраулом (автор книги «Думай як програміст: вступ до творчого розв’язання проблем»).
Я поставив їм однакові запитання, і знаєте що? Їхні відповіді були досить схожими!
Зовсім скоро ви також дізнаєтесь про них.
Примітка: це не означає, що вони все робили однаково. Усі ми різні. Ви також відрізняєтесь. Але якщо ви почнете з принципів, з якими ми всі згодні, ваші досягнення будуть швидшими.
«Найбільша помилка, яку роблять початківці, — вони фокусуються на вивченні синтаксису замість того, як розв’язувати проблеми», — В. Антон Спраул
Отже, що робити, коли стикнулись з новою проблемою?
Ось покрокова інструкція:
1. Зрозумійте проблему
Точно зрозумійте, що від вас вимагається. Більшість важких проблем важкі через те, що їх не розуміють (саме тому це перший крок).
Як зрозуміти, що ви зрозуміли проблему? Ви можете пояснити її простими словами.
Пам’ятаєте, як застрягли на якійсь проблемі, почали її пояснювати і миттєво побачили прогалини в логіці, яких не помічали раніше?
Більшості програмістів знайоме це відчуття.
Ось чому варто записати свою проблему, намалювати діаграму або розповісти про неї іншій людині (або предмету… Дехто використовує метод каченяти).
«Якщо ви не можете пояснити щось простими словами, ви цього не розумієте», — Річард Фейнман
2. Складіть план
Не кидайтеся одразу розв’язувати проблему без плану (і сподіватись, що зможете впоратись). Складіть план розв’язку!
Вам ніщо не допоможе, якщо ви не можете записати точні кроки.
У програмуванні це означає не починати одразу писати код. Дайте своєму мозку час проаналізувати проблему та обробити інформацію.
Щоб скласти хороший план, дайте відповідь на це запитання:
«Маючи вхідні дані X, які кроки необхідно виконати, щоб отримати вихідні дані Y?»
Примітка: програмісти мають чудовий інструмент, який допоможе з цим… Коментарі!
3. Поділіть проблему
Зверніть увагу. Це найважливіший крок.
Не намагайтеся розв’язати одну велику проблему. Ви будете плакати.
Натомість розбийте її на менші проблеми. Ці проблемки набагато простіше розв’язати.
Потім розв’яжіть ці проблемки по черзі. Почніть з найпростішої. «Найпростіша» означає, що ви знаєте відповідь (або близькі до неї).
Розв’язок наступних «найпростіших» проблемок не залежить від інших.
Як тільки розв’яжете всі проблемки, з’єднайте точки.
Об’єднавши розв’язки всіх проблемок, ви знайдете розв’язок початкової проблеми. Мої вітання!
Ця техніка — основа розв’язання проблем. Запам’ятайте її (якщо потрібно, прочитайте цей крок ще раз).
«Якби я міг навчити кожного програміста-початківця одній навичці розв’язання проблем, це була б «техніка зменшення проблеми».
Припустимо, ви програміст-початківець, і вам доручили написати програму, яка читає десять чисел і визначає, яке з них є третім за величиною. Для зовсім початківця це може бути складне завдання, навіть якщо воно вимагає лише базового синтаксису.
Якщо ви застрягли, потрібно зменшити проблему до чогось простішого. Замість того, щоб знаходити третє за величиною число, як щодо того, щоб знайти найбільше загалом? Все одно складно? А якщо знайти найбільше з трьох чисел? Або більше з двох?
Зменшуйте проблему до того моменту, коли знаєте, як її розв’язати, і напишіть розв’язок. Потім трохи розширте проблему та відповідно перепишіть розв’язок, і продовжуйте, поки не повернетеся до початкового завдання», — В. Антон Спраул
4. Застрягли?
Ви вже, мабуть, думаєте: «Ей, Річарде... Це все класно, але що робити, якщо я застряг(-ла) і навіть не можу розв’язати проблемку??»
По-перше, глибоко вдихніть. По-друге, це справедливо.
Але не переживайте, друзі. Так буває!
Різниця в тому, що хороші програмісти цікавляться помилками, а не дратуються через них.
Ось що можна спробувати, якщо натрапите на труднощі:
- Виконайте налагодження: уважно перегляньте свій розв’язок, намагаючись знайти помилку. Програмісти називають це налагодженням (власне, це все, що робить налагоджувач).
«Мистецтво налагодження полягає в тому, щоб зрозуміти, що ви насправді наказали робити програмі, а не те, що думали», — Ендрю Сінгер
- Проведіть переоцінку: зробіть крок назад. Подивіться на проблему з іншого боку. Чи є щось, що можна абстрагувати до більш загального підходу?
«Іноді ми настільки заглиблюємося в деталі проблеми, що не помічаємо загальних принципів, які розв’язують проблему на більш загальному рівні. [...]
Класичний приклад цього, звісно, це сума довгого списку послідовних цілих чисел, 1 + 2 + 3 + ... + n, яку дуже молодий Гаусс швидко розпізнав як просто n(n+1)/2, тим самим уникаючи необхідності виконувати додавання», — С. Джордан Балл
Примітка: ще один спосіб провести переоцінку — почати спочатку. Видаліть усе і почніть на свіжу голову. Я серйозно. Ви будете здивовані, наскільки це ефективно.
- Займіться дослідженням: ах, старий добрий Google. Ви правильно прочитали. Незалежно від того, яка у вас проблема, хтось, ймовірно, вже її розв’язав. Знайдіть цю людину/розв’язок. Робіть це навіть якщо ви вже розв’язали проблему! (Ви можете багато чому навчитися з розв’язків інших людей).
Застереження: не шукайте розв’язки великої проблеми. Шукайте лише розв’язки проблемок. Чому? Якщо ви не будете боротися (навіть трохи), ви нічого не навчитеся. А якщо ви нічого не навчитеся, ви даремно витратите час.
Практикуйтесь
Не очікуйте, що будете професіоналом за один тиждень. Якщо ви хочете добре розв’язувати проблеми, розв’язуйте багато проблем!
Практика. Практика. Практика. Пройде зовсім небагато часу, і ви почнете розуміти, що «цю проблему можна легко розв’язати за допомогою <вставте сюди якесь поняття>».
Як практикуватися? Варіантів повно!
Шахи, математичні задачі, судоку, го, монополія, відеоігри, CryptoKitties, бла... бла... бла....
Насправді загальна риса серед успішних людей — їхня звичка практикувати розв’язок мікропроблем. Наприклад, Пітер Тіль грає в шахи, а Ілон Маск грає у відеоігри.
«Байрон Рівз сказав: «Якщо ви хочете побачити, як може виглядати бізнес-лідерство через три-п’ять років, подивіться, що відбувається в онлайн-іграх.»
Перенесемося до сьогодення. Ілон [Маск], Рейд [Гоффман], Марк Цукерберг та багато інших кажуть, що ігри стали основою їхнього успіху у побудові своїх компаній», — Мері Мікер (звіт про інтернет-тенденції за 2017 рік)
Чи означає це, що вам потрібно просто грати у відеоігри? Зовсім ні.
Але яка мета відеоігор? Правильно, розв’язок проблем!
Тому потрібно знайти спосіб практики. Щось, що дозволяє розв’язувати багато мікропроблем (бажано, щоб вам це подобалося).
Наприклад, мені подобаються завдання з програмування. Кожного дня я намагаюся виконати хоча б одне завдання (зазвичай на Coderbyte).
Як я вже сказав, усі проблеми мають схожі шаблони.
Висновок
Це все, друзі!
Тепер ви краще розумієте, що означає «мислити, як програміст».
Ви також знаєте, що розв’язок проблем — це неймовірна навичка, яку варто розвивати (метанавичка).
А якщо цього недостатньо, то ви також знаєте, як практикувати навички розв’язку проблем!
Фух... Досить круто, правда?
Зрештою, я бажаю вам стикатися з багатьма проблемами.
Ви правильно прочитали. Принаймні тепер ви знаєте, як їх розв’язувати! (і пам’ятайте, що з кожним розв’язком ви стаєте кращими).
«Як тільки ви думаєте, що успішно пройшли одну перешкоду, з’являється інша. Але саме це робить життя цікавим. [...]
Життя — це процес подолання перешкод; це укріплені рубежі, через які ми повинні прорватися.
Кожен раз ви чогось навчаєтесь.
Кожен раз ви розвиваєте силу, мудрість і перспективу.
Кожен раз відступає частина конкуренції, допоки залишитесь лише ви: найкраща версія себе», — Раян Голідей («Перешкода як шлях»)
А тепер до розв’язку проблем!
Бажаю удачі?
Окрема подяка С. Джордану Баллу та В. Антону Спраулу. Усі корисні поради — від них.
Дякую, що прочитали! Якщо вам сподобалося, спробуйте, скільки разів ви зможете натиснути на кнопку миші за 5 секунд. Це чудове кардіо для пальців ТА допоможе іншим побачити цю історію.