Програмування чи під силу кожному, Стаття
Питання, пов'язані з демократичністю програмування і з тим, як можна вважати цю галузь «справою для всіх і кожного», порушувалися вже не раз. Продовжуємо цю традицію сьогоднішнім матеріалом: Марк Чу-Керролл висловлюється на цю ж тему і розповідає про те, що у програмуванні складно, а що елементарно, пропонує замислитися про межі цього виду діяльності та переконливо доводить, що легкість програмування сильно перебільшена.
Одягаємо рукавички, гумові чоботи, спецівку.
Моя професія розуміти, як люди пишуть програми. Мови програмування, середовища розробки, інструменти для керування кодом і спільної розробки і т. д. — це мій хліб насущний. Не дивно, що одного разу опус, який потрапив мені на очі в твіттері, викликав моє крайнє обурення.
Стаття починається із заяви про те, що більшість посібників з програмування, які є в інтернеті, нікуди не годиться. Я не можу з цим повністю погодитись, мені здається, що це якраз така тема, яку важливо обговорювати. Але наступний фрагмент здається мені зовсім невірним:
«Але це лише один бік проблеми. Віктор вважає, що саме програмування зіпсоване. Вважається, що для написання хорошого коду потрібно вміти "думати як комп'ютер". Він вважає цю думку до абсурду застарілою — але саме через цю помилку програмування вважається дуже складним видом діяльності. Комп'ютер – це інструмент; чому ж ми не можемо його контролювати, керувати ним так, як це зручно та природно для всіх нас?»
Бабах! Мені виносить мозок.
З якоїсь причини багато людей поділяють надуману ідею про те, що програмування - це насправді дуже легка штука.що самі програмісти лише навмисно ускладнюють її — зі зла, щоб залишатися елітою, просто від безглуздя або вже не знаю чому. За довгі роки, які я пропрацював у цій сфері, цілий хор голосів повторює, що насправді програмувати легко, що ми просто змушуємо людину думати, «як машина».
Нам лише потрібно переробити програмування, щоб воно було орієнтоване на людський мозок, а не на мікросхеми. І все, програмування стане простою справою, всі почнуть їм займатися, і світ перетвориться на ідеальну комп'ютерну утопію.
По-перше, «машинне мислення» — це штамп, ярлик, мета якого — виставити нинішнє програмування в похмурому світлі. Мовляв, мало того, що програмувати складно, то ще ці прокляті технарі вимагають від вас стати якимись роботами, інакше ви цій справі ніколи не навчитеся!
Щоб бути програмістом, не потрібно думати як машина. Але треба розуміти, як працюють машини. Щоб успішно програмувати, розуміти це просто необхідно, тому що при написанні програми ми по суті збираємо машину! Коли ми розробляємо програму теоретично, ми проектуємо машину, яка виконуватиме певне механічне завдання. Дійсно, програма – це просто опис машини. А мова програмування, по суті - спеціалізована форма нотації, що описує певний різновид машини.
Ніхто ж не піде до інженера-конструктора і не критикуватиме його, що якось неправильно він проектує передачі — адже для роботи з ними доводиться розбиратися в принципах роботи шестерень. Але саме такі закиди часом доводиться чути програмістам.
Тільки так. Цього принципу не оминути, він є основою всієї природи програмування.
Мені частодоводиться стикатися з аргументом такого змісту: «Програмування — це сантехніка. Будь-кому має бути під силу освоїти програмування». І я відповім: так, саме так. Будь-який господар повинен вміти поміняти вдома кран. Здається, що це страшно банальна річ, але ось я якось спробував своїми руками полагодити мийку на кухні і наробив збитків на пару тисяч доларів.
Але сантехніка — це не тільки ремонт кранів, а й ціла багатогранна галузь:
- є інженери, що проектують сантехнічні системи, що регулюють роботу водопроводів та каналізації у величезному місті. Так, це також сантехніка. І це дуже складна річ. Навіть якщо ви дуже розумні, ви не зможете займатися ним з нуля — спочатку доведеться вивчити цілу гору матеріалів про сантехнічну справу;
- є майстри, які облаштовують каналізацію у приватному будинку. Це також сантехніка. Складна професія, якій потрібно довго вчитися, нехай вона й не порівняти з розробкою водопровідних систем для великого міста;
- є люди, які взагалі не проектують сантехнічні системи, але можуть з нуля зібрати систему подачі води для цілого будинку на основі креслень, підготовлених інженером. І це сантехніка. Що вимагає ще одного спеціального набору знань та навичок;
- бувають просто комунальники, які приходять до вас додому і навіть не бачачи жодних креслень швидко розуміють, що у вас зламалося і як це полагодити. Ще одна грань сантехніки, зі своїм набором знань та умінь;
- зовсім не будучи сантехніками, деякі умільці здатні закласти поточні труби або замінити коліно, що схудло. Трохи старанності — і цьому може навчитися практично будь-хто. Теж сантехніка. Зрештою, міняти крани самостійно доводилося багатьом читачам;
- є, нарешті,громадяни на кшталт мене, які можуть озброїтися сантехнічним тросом та вантузом та прочистити засмічення у туалеті. Це теж сантехніка, але вона не потребує жодного досвіду та абсолютно ніякого навчання. Безперечно, будь-яка доросла людина має вміти робити це сама.
Отже, для різних видів сантехнічних робіт потрібні принципово різні навички та абсолютно непорівнянні обсяги навчання та досвіду.
Програмування — така сама справа. Існують різновиди програмування, що потребують різних знань та навичок. Використовувані в конкретних випадках інструменти та методи навчання докорінно відрізняються настільки, що в багатьох випадках люди навіть не усвідомлюють, що займаються програмуванням. Але практично будь-якому пересічному користувачеві комп'ютера доводиться щось програмувати:
- якщо ви створюєте презентацію в PowerPoint, де якісь елементи з'являються, крутяться і зникають з екрану вашою командою — це програмування;
- якщо ви записуєте формулу до електронної таблиці — це програмування;
- якщо ви створюєте сайт, навіть найпростіший, або користуєтеся при цьому конструктором сайтів, або просто пишете сторінку на HTML / CSS - це програмування;
- якщо ви пишете макрос у Word чи Excel – це програмування;
- якщо налаштовуєте автовідповідач, який реагуватиме на вхідну електронну пошту, поки ви у відпустці – це програмування.
З іншого боку, погодьтеся: ідея про те, що ви повинні вміти програмувати, не розуміючи машини, за допомогою якої це робите або машини, яку створюєте, не витримує жодної критики.
Якщо копнути глибше і почати вирішувати порівняно складні завдання, то програмування, як і будь-яка інша сфера діяльності, стане набагатоскладніше. Продовжуючи аналогію з сантехнікою, доводиться вивчити, як зчленовуються труби, які властивості різних матеріалів, у тому числі вони виготовляються, як із них течуть різні рідини. Не можна бути програмістом, зовсім не розбираючись у машині. Чим складнішу завдання доводиться вирішувати, тим більше впевнено потрібно розумітися на предметній області.
Чесно кажучи, я й не думаю підозрювати Віктора у нечесності. Але він нечесно уявляє речі, що ще гірше. Наприклад, він порівнює навчання програмування з навчанням кухарській справі. Він описує, як би ми вчили когось готувати суфле. На вході Віктор демонструє нам набір кулінарних інгредієнтів, на виході десерт, і стверджує: «Ось так ми і вчимо людей програмувати. Даємо їм продукти і пропонуємо возитися з ними доти, доки не вийде суфле».
Так, люди вчаться готувати, але ця аналогія зовсім не годиться в нашому контексті. Якщо ми хочемо, щоб учень умів готувати рівно одну страву, то даємо їй повний та докладний покроковий рецепт. Але як тільки людина розбереться з основами, ми діємо інакше і пропонуємо їй поекспериментувати. «Так, смачне суфле вийшло. Але що якщо додати трохи кардамону до вершків? А якщо прибрати ваніль? Теж вийде добре? Або навіть краще? Якщо не займатися такими експериментами, то чудового суфле у вас ніколи не вийде! Адже інгредієнти у вас під рукою завжди будуть трохи відрізнятися, а якість десерту залежатиме і від того, яка у вас духовка, який десяток яєць ви купили, скільки клейковини в борошні і т.д.
Писати складні програми складно. Щоб писати програми, що оперують символьними даними, необхідно розуміти, як будується символічне уявлення реальних даних. Щоб створити обчислювальну програму,Необхідно знати закони математики і принципи, якими комп'ютер обробляє числа. Щоб створити машину, потрібно розуміти яку машину ви хочете побудувати. От і все.