Як мислити програмістом - уроки вирішення проблем

Якщо ви зацікавлені в програмуванні, ви, можливо, вже бачили цю цитату раніше:

"Кожен у цій країні повинен навчитися програмувати комп'ютер, тому що він вчить вас думати". - Стів Джобс

Ви, мабуть, також задавались питанням, що означає, власне, думати як програміст? І як ти це робиш ??

По суті,це все про більш ефективний спосіб вирішення проблем .

У цьому дописі моя мета - навчити вас цього шляху.

В кінці цього ви точно знатимете, які кроки потрібно зробити, щоб бути кращим вирішувачем проблем.

Чому це важливо?

Вирішення проблем - це мета-вміння.

У всіх нас є проблеми. Великий і малий. Те, як ми маємо справу з ними, буває, ну ... досить випадковим.

Якщо у вас немає системи, можливо, ви «вирішуєте» проблеми (саме це я зробив, коли почав кодувати):

  1. Спробуйте рішення.
  2. Якщо це не допомогло, спробуйте інший.
  3. Якщо це не допомогло, повторіть крок 2, поки вам не пощастить.

Подивіться, іноді вам везе. Але це найгірший спосіб вирішити проблеми! І це величезна, величезна втрата часу.

Найкращий спосіб передбачає а) наявність рамки та б) практикування її.

"Майже всі роботодавці надають першочергове значення навичкам вирішення проблем. Навички вирішення проблем - це майже одностайно найважливіша кваліфікація, яку шукають роботодавці ... більше, ніж володіння мовами програмування, налагодження та дизайн системи. Демонстрація обчислювального мислення або здатності розбити великі , складні проблеми настільки ж цінні (якщо не більше того), ніж базові технічні навички, необхідні для роботи ". - Рейтинг хакера (Звіт про навички розробника за 2018 рік)

Є рамки

Щоб знайти правильну структуру, я дотримувався порад у книзі Тіма Ферріса про навчання “4-годинний шеф-кухар”.

Це змусило мене взяти інтерв’ю у двох справді вражаючих людей: Ч. Джордана Болла (1-е або 2-е місце із 65 000+ користувачів на Coderbyte) та В. Антона Спраула (автора книги „Думай як програміст: вступ до вирішення творчих проблем“ ”).

Я задавав їм ті самі запитання, і вгадайте що? Їхні відповіді були досить схожі!

Незабаром ви їх теж будете знати.

Сіденоте: це не означає, що вони робили все однаково. Усі різні. Ви будете іншими. Але якщо ви почнете з принципів, які ми всі погоджуємось, хороші, ви набагато швидше пройдете далі.

"Найбільша помилка, яку, на мою думку, роблять нові програмісти - це зосередження на вивченні синтаксису замість того, щоб навчитися вирішувати проблеми". - В. Антон Шпраул

Отже, що робити, коли стикаєшся з новою проблемою?

Ось кроки:

1. Зрозумійте

Точно знати, про що просять. Більшість важких проблем важкі, бо ви їх не розумієте (отже, чому це перший крок).

Як дізнатися, коли ви розумієте проблему? Коли ви можете пояснити це простою англійською мовою.

Ви пам’ятаєте, як застрягли в проблемі, починаєте її пояснювати і миттєво бачите дірки в логіці, яких раніше не бачили?

Більшість програмістів знають це відчуття.

Ось чому вам слід записати свою проблему, намалювати схему або сказати комусь іншому про неї (або щось інше ... деякі люди використовують гумову качку).

"Якщо ви не можете щось пояснити простими словами, ви цього не розумієте". - Річард Фейнман

2. План

Не занурюйтесь прямо у вирішення справи без плану (і якимось чином сподіваюся, що ви зможете пробити собі шлях). Сплануйте своє рішення!

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

У програмуванні це означає, що не починайте злом відразу. Дайте мозку час проаналізувати проблему та обробити інформацію.

Щоб отримати хороший план, дайте відповідь на це запитання:

"Враховуючи вхід X, які кроки необхідні для повернення результату Y?"

Sidenote: Програмісти мають чудовий інструмент, який допоможе їм у цьому ... Коментарі!

3. Розділити

Звернути увагу. Це найважливіший крок з усіх.

Не намагайтеся вирішити одну велику проблему. Ви будете плакати.

Натомість розбийте його на підзадачі. Ці підзадачі вирішити набагато простіше.

Потім розв’яжіть кожну підзадачу по одному. Почніть з найпростішого. Найпростіший означає, що ви знаєте відповідь (або ближче до цієї відповіді).

Після цього найпростіший спосіб означає, що ця підзадача, що розв'язується, не залежить від інших, що розв'язуються.

Вирішивши кожну підзадачу, з’єднайте точки.

Підключення всіх ваших «допоміжних рішень» дасть вам рішення вихідної проблеми. Вітаємо!

Цей прийом є наріжним каменем вирішення проблем. Запам’ятайте це (якщо потрібно, ще раз прочитайте цей крок).

"Якби я міг навчити кожного починаючого програміста одному навикові вирішення проблем, це було б" методом зменшення проблеми ". Наприклад, припустимо, ви новий програміст і вас попросять написати програму, яка читає десять цифр і цифр яке число є третім за величиною. Для абсолютно нового програміста це може бути складним завданням, хоча воно вимагає лише базового синтаксису програмування. Якщо ви застрягли, вам слід звести проблему до чогось простішого. Замість третьої за величиною цифри, як щодо того, щоб знайти найвищу загальну цифру? Все ще занадто жорсткий? А як щодо знаходження найбільшого з трьох чисел? Або більший із двох? Зведіть задачу до точки, коли ви знаєте, як її вирішити, і напишіть рішення. Потім трохи розширте проблему та перепишіть рішення, щоб воно відповідало, і продовжуйте рухатися, поки не повернетесь до того, з чого почали ». - В. Антон Шпраул

4. Застряг?

На даний момент ти, напевно, сидиш там і думаєш: "Гей, Річарде ... Це круто, і все, але що, якщо я застрягну і навіть не можу вирішити проблему?"

Спочатку зробіть глибокий вдих. По-друге, це справедливо.

Не хвилюйся, друже. Це трапляється з усіма!

Різниця полягає в тому, що найкращі програмісти / вирішувачі проблем більше цікавляться помилками / помилками, ніж дратують.

Насправді, ось три речі, які потрібно спробувати, зіткнувшись з ударом:

  • Налагодження: крок за кроком проходьте своє рішення, намагаючись знайти, де ви помилилися. Програмісти називають це налагодженням (насправді це все, що робить налагоджувач).
"Мистецтво налагодження полягає в тому, щоб зрозуміти, що ви насправді наказали своїй програмі, а не те, що, на вашу думку, сказали зробити". - Ендрю Сінгер
  • Переоцінити:Зробіть крок назад. Подивіться на проблему з іншої точки зору. Чи є щось, що можна абстрагувати до більш загального підходу?
“Іноді ми настільки губимось у деталях проблеми, що не помічаємо загальних принципів, які могли б вирішити проблему на більш загальному рівні. [...] Класичним прикладом цього, звичайно, є підсумовування довгого списку послідовних цілих чисел, 1 + 2 + 3 + ... + n, який дуже молодий Гаус швидко визнав просто n (n + 1) / 2 тим самим уникаючи зусиль, що доводиться робити додавання ". - К. Джордан Бал

Sidenote: Інший спосіб переоцінки - почати заново. Видаліть все і починайте знову зі свіжих очей. Я серйозно. Ви будете здивовані тим, наскільки це ефективно.

  • Дослідження:Ах, добре, Google. Ви правильно прочитали. Незалежно від того, яка у вас проблема, напевно, хтось її вирішив. Знайдіть цю людину / рішення. Насправді, робіть це, навіть якщо вирішили проблему! (Ви можете багато чому навчитися з рішень інших людей).

Застереження: Не шукайте рішення великої проблеми. Шукайте лише рішення підзадач. Чому? Тому що, якщо ви не будете боротися (навіть трохи), ви нічого не навчитесь. Якщо ви нічого не дізнаєтесь, ви витратили свій час.

Практика

Не сподівайтесь стати чудовим вже через тиждень. Якщо ви хочете бути хорошим вирішувачем проблем, вирішуйте багато проблем!

Практика. Практика. Практика. Це лише питання часу, коли ви зрозумієте, що "цю проблему можна легко вирішити".

Як практикуватися? Є варіанти wazoo!

Шахові головоломки, математичні задачі, судоку, іди, монополія, відеоігри, криптотики, бла ... бла ... бла ....

Насправді поширеною схемою успішних людей є їхня звичка практикувати “мікро вирішення проблем”. Наприклад, Пітер Тіль грає в шахи, а Ілон Маск - у відеоігри.

"Байрон Рівз сказав:" Якщо ви хочете побачити, як може виглядати керівництво бізнесом через три-п'ять років, подивіться, що відбувається в онлайн-іграх ". Швидше вперед на сьогодні. Ілон [Маск], Рід [Хоффман], Марк Цукерберг та багато інших говорять, що ігри є фундаментальним фактором їхнього успіху у створенні своїх компаній ". - Мері Мікер (звіт про тенденції в Інтернеті за 2017 рік)

Чи означає це, що вам слід просто грати у відеоігри? Зовсім не.

Але що таке відеоігри? Правильно, вирішення проблем!

Отже, що вам слід зробити, це знайти вихід для практики. Щось, що дозволяє вирішити багато мікро-проблем (в ідеалі те, що вам подобається).

Наприклад, я насолоджуюсь проблемами кодування. Щодня я намагаюся вирішити принаймні одну проблему (як правило, на Coderbyte).

Як я вже сказав, усі проблеми мають подібні закономірності.

Висновок

Це все, шановні!

Тепер ви краще знаєте, що означає «думати програмістом».

Ви також знаєте, що вирішення проблем - це неймовірна навичка для розвитку (мета-навичка).

Як би цього було недостатньо, зауважте, як ви також знаєте, що робити, щоб відпрацювати свої навички вирішення проблем!

Фу ... Досить круто, правда?

Нарешті, я бажаю вам зіткнутися з багатьма проблемами.

Ви правильно прочитали. Принаймні тепер ви знаєте, як їх вирішити! (також ви дізнаєтесь, що з кожним рішенням ви вдосконалюєтесь).

«Просто коли ви думаєте, що успішно подолали одну перешкоду, з’являється інша. Але це те, що робить життя цікавим. [...] Життя - це процес пробиття цих перешкод - низка укріплених ліній, через які ми повинні прорватися. Кожного разу ви будете чомусь вчитися. Кожного разу ви розвиватимете силу, мудрість , та перспектива. Кожного разу трохи більше конкуренції відпадає. Поки не залишишся лише ти: найкраща твоя версія ». - Райан Холідей (перешкода - шлях)

А тепер ідіть вирішувати деякі проблеми!

А удачі?

Особлива подяка Ч. Джордану Болу та В. Антону Спраулу. Усі добрі поради тут прийшли від них.

Дякуємо за читання! Якщо вам сподобалось, протестуйте, скільки разів ви можете вдарити за 5 секунд. Це чудове кардіо для ваших пальців І допоможе іншим побачити історію.