Ви вирішуєте проблеми з програмуванням чи виконуєте вправи? (Різниця має значення.)

Люди, як правило, використовують терміни «проблеми» та «вправи» як взаємозамінні. Але є різниця - і вона має значення.

Професор Пол Цайтц робить розрізнення.

Візьміть 5 × 5. Це легко, і це вправа. Так само 5490900 × 496. Це трохи складніше, і вам знадобиться більше часу для вирішення, але ви знаєте, що робити. Це ключовий момент.

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

З проблемами не так. Проблема, на думку Цайца, "- це математичне запитання, на яке ви не знаєте, як відповісти, принаймні спочатку".

Він визначає проблеми та вправи через приціл математичного розв'язування задач, але вони застосовуються і до програмування.

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

Вправа з вправами

Є два способи отримати користь від вправ. По-перше, вони корисні при вивченні нової теми.

Зараз я вивчаю JavaScript і використовую для цього поєднання вправ та проблем. Вправи допомагають мені бачити закономірності та влаштовувати поняття та синтаксис.

Ось приклад вправи з проекту, який попросив мене написати функцію, яка взяла безліч автомобілів.

const cars = [ { id: 1, car_make: "Lincoln", car_model: "Navigator", car_year: 2009 }, { id: 2, car_make: "Mazda", car_model: "Miata MX-5", car_year: 2001 }, { id: 3, car_make: "Land Rover", car_model: "Defender Ice Edition", car_year: 2010 }, ... ] 

Мені довелося сортувати масив об’єктів за car_modelключем, у порядку зростання.

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

Однак це кваліфікується як вправа, тому що я з самого початку знав, що мені потрібно робити.

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

Але концепції все ще були новими. Мені потрібна була практика їх складання, саме тому ця вправа була цінною. Повторення породжує звичність, і поняття почали твердіти в моїй свідомості.

Зберігайте те, що отримали

Вправи також допомагають підтримувати свіжу інформацію.

Навчаючись JavaScript, я не хочу забувати все, що дізнався про першу мову, яку вивчив, Python. Тому я використовую програму флеш-карт Anki кілька разів на день.

У цьому контексті вправи допомагають вам тримати гору матеріалу прямо, нагадувати вам про важливі поняття та почувати себе зручніше за допомогою певної структури даних або підходу. Це робота з технічного обслуговування сукупності знань, які ви отримали до цього часу.

У мене є понад 1000 карток, наповнених матеріалом, який я бачив неодноразово раніше. Деякі картки мають запитання щодо синтаксису. Інші просять мене писати запити SQL або командного рядка або команд Git. Багато інших наповнені вправами, як-от "повернути список чисел праворуч на одне значення".

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

Вправи - це слизький схил. З одного боку, вони корисні для навчальних цілей. З іншого боку, легко почуватись комфортно, дотримуючись виключно вправ.

Це мінус: перебування в зоні комфорту.

Боротьба з двозначністю

Програмування - це вирішення проблем. І вирішення проблем виведе вас за межі зони комфорту. Це добре.

Для мене проблеми мають дві характерні якості. Перший - двозначність. Вирішення проблем багато в чому полягає в тому, як ефективно боротися з двозначністю.

  • Повідомлення про помилку з'являється кожного разу, коли програма запускається. Чому? Що відбувається? Де помилка? Як ви можете це виправити?
  • Ви піднімаєте нове твердження про проблему. Ви читаєте його і перечитуєте. На перший погляд, ви навіть не уявляєте, що відбувається, не кажучи вже про те, що вам потрібно зробити, щоб це вирішити. Ви навіть можете відчути відчуття «оленя у фарах», яке супроводжується ямкою на дні живота. (Ви вибрали хорошу проблему!)
  • Вам потрібно дізнатись про реляційні бази даних. Це досить широко. Як ви збираєтеся це робити? На чому сфокусуватись спочатку? Що найважливіше? Що вам насправді потрібно знати прямо зараз ?

Усі ці приклади передбачають неоднозначність. І всі вони вимагають вирішення проблем , будь то пошук та виправлення помилок, вирішення фактичної проблеми чи вивчення нової теми.  

Щоб досягти успіху, ви досліджуєте, експериментуєте, витягуєте факти, створюєте план та застосовуєте різноманітні тактики вирішення проблем. Одним словом, ви навчитесь розбиратися. Чим більше часу ви витрачаєте на проблему та різні перспективи ви отримуєте, тим більше шарів вона розкриває і чим ближче ви наближаєтесь до моменту "ага".

Обійміть боротьбу

Інша відмінність від проблем - боротьба. Це насправді.

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

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

Але це зовсім інше, коли ви з самого початку не уявляєте, що робити, що може траплятися кілька разів при вирішенні проблеми. Для мене проблеми - це боротьба.

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

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

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

Це все одно, що перетнути фінішну пряму напівмарафону. Без сумніву, останні 13,1 милі були виснажливими, але перетин фінішу був вартий того, і я б зробив це знову. Вирішення проблеми відчувається так само.

Що це: проблеми чи вправи?

Коли ви зламаєте свій ноутбук, чи збираєтеся ви вирішувати проблеми або виконувати вправи?  

Вправи мають переваги, і чудово включити їх у свої сеанси програмування. Я використовую вправи як розминку перед сеансом програмування. Я погортаю колоду картки Анкі протягом десяти-п’ятнадцяти хвилин і попрацюю кілька вправ. Якщо я вивчаю щось нове, наприклад JavaScript, у мене може бути цілий сеанс програмування, присвячений вправам.

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

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

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

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

I write about learning to program, and the best ways to go about it (amymhaddad.com).