Основні стовпи навчання програмуванню - і чому новачки повинні ними оволодіти.

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

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

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

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

Мета новачка - засвоїти основи програмування та зрозуміти важливість бібліотек та фреймворків.

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

Тож давайте розглянемо, з чого мають починати нові програмісти.

Тестова розробка (TDD)

TDD приносить багато переваг. На жаль, це просунута тема, до якої початківці не зовсім готові.

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

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

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

Наприклад: Якщо обраною технологією є Spring, я надаю вправи та тести в рамках проекту Spring. Студентам не потрібно нічого знати про Весну. Все, що їм потрібно знати, - це місце проведення вправ та кнопка для запуску тестів.

Крім того, студенти повинні знати, як користуватися налагоджувачем, і мати під рукою цикл Read-Eval-Print (REPL). Здатність аналізувати код під час виконання та мати майданчик для невеликих експериментів є важливою у TDD.

Головне - забезпечити, щоб студентам не потрібно було вивчати основні поведінки TDD після того, як вони набули основних навичок програмування. Змінити звички пізніше в кар’єрі студентів буде набагато складніше, ніж вивчити ці звички зараз. Ось чому їм слід жити та дихати одиничними тестами з самого початку.

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

Основи По-перше

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

Те саме стосується тих випадків, коли ми починаємо студентів з такою структурою, як Angular. Новачкам потрібно спочатку зрозуміти основи програмування. Вони повинні бути знайомі з основними елементами та тим, що означає писати код, перш ніж вони зможуть використовувати чужий.

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

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

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

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

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

Основи важливі. Не рухайтеся далі, поки вони не влаштуються.

Бібліотеки та основи

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

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

Щоб перехід цього мислення був успішним, приклади з «фази основ» мають бути вирішуваними за допомогою відомих бібліотек, таких як Moment.js, Jackson, Lodash або Apache Commons.

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

Подібно до TDD, студенти повинні ставати підозрілими, коли колеги хваляться власноруч створеною державною бібліотекою управління, що робить Redux непотрібним.

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

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

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

Майстер і учень

На початку 20-х років я хотів навчитися грати на фортепіано. Я не хотів вчителя, і думав, що можу навчитися цьому сам. Через п’ять років я проконсультувався з професійним репетитором. Ну, що я можу сказати? За 1 місяць я дізнався більше, ніж за п’ять років до цього.

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

Те саме в програмуванні. Якщо хтось не має досвіду програмування, то самонавчання може бути поганою ідеєю. Незважаючи на те, що є багато історій успіху, я сумніваюся в ефективності того, щоб робити це самостійно.

Натомість мають існувати стосунки «господар та підмайстер». На початку майстер дає правила, яких повинен дотримуватися учень - наосліп! Майстер може пояснити правила, але, як правило, міркування перебувають поза розумінням учня.

Ці внутрішні правила утворюють своєрідну мережу безпеки. Якщо хтось загубиться, у нього завжди є надійний ґрунт, до якого можна повернутися.

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

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

Виклик та мотивація

"Давайте створимо клон Facebook!" Це не від генерального директора, якого підтримує орда старших розробників програмного забезпечення та багатомільйонний бюджет. Це вправа з вступного курсу для програмістів. Таке починання практично неможливе. Навіть гірше, студентів потрапляють у країну чудес і обманюють віруючими, що вони мають навички, які справді не під силу їм.

Без сумніву, учитель це усвідомлює, але створює такі вправи з мотиваційних міркувань.

Головна мета вправи - не розважати. Він повинен бути створений навколо певної техніки і повинен допомогти студентам зрозуміти цю техніку.

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

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

Наприклад, багато бізнес-додатків зосереджуються на складних формах та сітках. Створення їх - важлива навичка, яку можуть надати вправи. Створення додатку, подібного до Facebook, може бути не найкращим уроком для студентів, щоб навчитися відразу.

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

Чому? Бо справа постійно йде не так. Ми витрачаємо нескінченні години, виправляючи надзвичайно дивні помилки, які виявляються простою друкарською помилкою. Деякий інструмент може не працювати лише тому, що бібліотека отримала незначне оновлення версії. Або система виходить з ладу, тому що хтось забув додати файл до git. Список можна продовжувати і продовжувати.

Студенти повинні насолоджуватися цим досвідом. Вправа, спрямована на невідому бібліотеку під тиском часу, може бути саме правильною справою. ;)

Сонце не завжди світить у реальному житті. Новачки повинні бути добре підготовлені до реальності програмування.

Остаточна порада

Останнє, але не менш важливе: не можна стати професійним програмістом за два тижні, два місяці або навіть рік. Потрібен час і терпіння.

Тренери не повинні поспішати або давати неправдиві обіцянки. Вони повинні зосередитись на тому, чи розуміють учні поняття, і не рухатись надто швидко.

Спочатку опубліковано на www.rainerhahnekamp.com 10 червня 2018 року.