Вивчіть програмування за десять років

Пітер Норвіг

Original article: https://norvig.com/21-days.html

Чому всі так поспішають

Зайдіть у будь який книжковий магазин, і ви побачите книгу на кшталт «Вивчіть Java за 24 години» поруч із нескінченними варіаціями, які обіцяють навчити C, SQL, Ruby, алгоритмів тощо за кілька днів або годин. Розширений пошук Amazon за запитом «title: teach, yourself, hours, since: 2000» знайшов 512 таких книжок. У першій десятці дев’ять є книжками з програмування, а десята про бухгалтерський облік. Подібні результати виходять, якщо замінити «teach yourself» на «learn» або «hours» на «days».

Висновок такий, або люди страшенно поспішають вивчити програмування, або програмування якимось дивом набагато легше опанувати, ніж будь що інше. Феллейзен та співавтори натякають на цю моду у своїй книжці «How to Design Programs», коли пишуть, «Погане програмування це легко. Ідіоти можуть навчитися цьому за 21 день, навіть якщо вони цілковиті недотепи». Комікс Abstruse Goose також висловився на цю тему.

Розберімося, що може означати назва на кшталт «Вивчіть C++ за 24 години».

«Вивчіть самостійно»

За 24 години у вас не буде часу написати кілька справді важливих програм і повчитися на успіхах та помилках. У вас не буде часу попрацювати з досвідченим програмістом і зрозуміти, що означає жити в середовищі C++. Коротко кажучи, ви не матимете часу навчитися багато чого. Отже, така книжка може говорити лише про поверхове ознайомлення, а не про глибоке розуміння. Як казав Александер Поуп, трохи знань це небезпечна річ.

«C++»

За 24 години ви, можливо, зможете вивчити частину синтаксису C++ якщо вже знаєте іншу мову, але ви не зможете багато дізнатися про те, як цією мовою користуватися. Коротко кажучи, якщо ви, наприклад, програміст Basic, то зможете навчитися писати програми у стилі Basic, використовуючи синтаксис C++, але не зможете зрозуміти, для чого C++ насправді добрий, і для чого поганий. То який сенс. Алан Перліс якось сказав, «Мова, яка не впливає на те, як ви думаєте про програмування, не варта того, щоб її знати». Один можливий сенс у тому, що вам потрібно вивчити крихту C++ або, ймовірніше, щось на кшталт JavaScript чи Processing, бо вам треба з’єднатися з уже наявним інструментом, щоб виконати конкретне завдання. Але тоді ви не вчитеся програмувати, ви вчитеся виконувати це завдання.

«За 24 години»

На жаль, цього замало, як показує наступний розділ.

Вивчіть програмування за десять років

Дослідники, зокрема Блум, 1985, Браян і Хартер, 1899, Гейз, 1989, Сіммон і Чейз, 1973, показали, що для формування майстерності у найрізноманітніших сферах потрібно приблизно десять років. Сюди входять гра в шахи, написання музики, робота телеграфіста, живопис, гра на піаніно, плавання, теніс, а також дослідження в нейропсихології та топології. Ключем є цілеспрямована практика, не просто робити знову і знову, а ставити собі завдання, яке трохи перевищує ваш поточний рівень, пробувати його виконати, аналізувати свою роботу під час виконання і після, виправляти помилки. Потім повторювати. І повторювати знову.

Справжніх коротких шляхів, схоже, не існує. Навіть Моцарту, який був музичним вундеркіндом у 4 роки, знадобилося ще 13 років, перш ніж він почав створювати музику світового рівня. В іншому жанрі, The Beatles наче вибухнули на сцені серією хітів номер один і появою на шоу Еда Саллівана у 1964 році. Але вони грали в маленьких клубах Ліверпуля і Гамбурга ще з 1957 року, і хоча масова популярність прийшла рано, їхній перший справді великий успіх у критиків, «Sgt. Peppers», вийшов у 1967 році.

Малкольм Гладуелл популяризував цю ідею, хоча він говорить про 10 000 годин, а не про 10 років. Анрі Картьє Брессон, 1908–2004, мав іншу міру, «Ваші перші 10 000 фотографій найгірші». Він не передбачив, що з цифровими камерами дехто може досягти цієї позначки за тиждень.

Справжня майстерність може вимагати всього життя. Семюел Джонсон, 1709–1784, сказав, «Досконалість у будь якій сфері досягається лише працею всього життя, її не можна купити за меншу ціну». А Чосер, 1340–1400, нарікав, «життя таке коротке, а ремесло таке довге для навчання». Гіппократ, близько 400 року до н е, відомий висловом «ars longa, vita brevis», який є частиною довшої цитати «Ars longa, vita brevis, occasio praeceps, experimentum periculosum, iudicium difficile», що англійською передають як «Життя коротке, ремесло довге, нагода швидкоплинна, досвід небезпечний, судження важке».

Звісно, жодне число не може бути остаточною відповіддю. Нерозумно припускати, що всі навички, наприклад програмування, шахи, шашки і музика, потребують рівно однакової кількості часу для опанування, так само як нерозумно припускати, що всі люди витратять рівно однакову кількість часу. Як каже професор К. Андерс Ерікссон, «У більшості сфер вражає те, скільки часу навіть найталановитішим людям потрібно, щоб досягти найвищих рівнів виконання. Число 10 000 годин лише дає відчуття того, що йдеться про роки занять по 10–20 годин на тиждень, і навіть ті, кого дехто вважає найбільш природно обдарованими, все одно потребують цього, щоб вийти на найвищий рівень».

Отже, ви хочете бути програмістом

Ось мій рецепт успіху в програмуванні.

  1. Зацікавтеся програмуванням і зробіть щось просто тому, що це цікаво. Подбайте, щоб це залишалося достатньо цікавим, аби ви були готові вкласти свої десять років або 10 000 годин.

  2. Програмуйте. Найкращий різновид навчання це навчання через дію. Якщо висловитися технічніше, «максимальний рівень виконання людей у певній сфері не досягається автоматично як функція тривалого досвіду, але рівень виконання може зростати навіть у дуже досвідчених людей унаслідок цілеспрямованих зусиль з покращення». Сторінка 366. І «найефективніше навчання потребує чітко визначеного завдання з відповідним рівнем складності для конкретної людини, інформативного зворотного зв’язку і можливостей для повторення та виправлення помилок». Сторінки 20 і 21. Книжка «Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life» є цікавою довідкою для цього погляду.

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

  4. Якщо хочете, проведіть чотири роки в коледжі або більше в аспірантурі. Це дасть вам доступ до деяких робіт, де потрібні документи про освіту, і дасть глибше розуміння сфери, але якщо вам не подобається навчання, ви можете, доклавши зусиль, здобути подібний досвід самостійно або на роботі. У будь якому разі одного лише навчання з книжок буде недостатньо. «Освіта з комп’ютерних наук не може зробити нікого програмістом експертом так само, як вивчення пензлів і пігментів не може зробити когось художником експертом», каже Ерік Реймонд, автор «The New Hacker’s Dictionary». Один із найкращих програмістів, яких я коли небудь наймав, мав лише диплом середньої школи. Він створив багато чудового програмного забезпечення, має власну групу новин і заробив стільки на опціонах, що купив собі власний нічний клуб.

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

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

  7. Вивчіть щонайменше шість мов програмування. Додайте одну мову, що підкреслює абстракції класів, на кшталт Java або C++. Додайте одну, що підкреслює функціональну абстракцію, на кшталт Lisp або ML або Haskell. Додайте одну, що підтримує синтаксичну абстракцію, як Lisp. Додайте одну, що підтримує декларативні специфікації, як Prolog або шаблони C++. Додайте одну, що підкреслює паралельність, як Clojure або Go.

  8. Пам’ятайте, що в «computer science» є слово «computer». Знайте, скільки часу ваш комп’ютер витрачає на виконання інструкції, вибірку слова з пам’яті з промахом кешу і без промаху, читання послідовних слів із диска, і переміщення головки диска на нове місце.

  9. Долучіться до зусиль зі стандартизації мови. Це може бути комітет ANSI C++, або це може бути рішення, чи буде локальний стиль коду мати відступи в 2 або 4 пробіли. У будь якому разі ви дізнаєтеся, що подобається іншим людям у мовах, наскільки сильно їм це важливо, і, можливо, трішки про те, чому їм це так важливо.

  10. Майте здоровий глузд якнайшвидше вийти з роботи зі стандартизації мови.

З огляду на все це, сумнівно, як далеко можна зайти лише завдяки навчанню з книжок. Перед народженням моєї першої дитини я прочитав усі книжки серії «How To» і все одно почувався безпорадним новачком. Через 30 місяців, коли мала народитися друга дитина, чи повернувся я до книжок, щоб освіжити пам’ять. Ні. Натомість я спирався на власний досвід, який виявився для мене значно кориснішим і заспокійливішим, ніж тисячі сторінок, написаних експертами.

Фред Брукс у своєму есе «No Silver Bullet» описав трикомпонентний план пошуку чудових проєктувальників програмного забезпечення.

  1. Систематично виявляти найкращих проєктувальників якомога раніше.

  2. Призначати наставника з кар’єри, відповідального за розвиток кандидата, і ретельно вести його кар’єрну справу.

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

Це припускає, що деякі люди вже мають якості, потрібні для того, щоб бути великим проєктувальником, а завдання полягає в тому, щоб правильно підштовхувати їх уперед. Алан Перліс сказав це коротше, «Кожного можна навчити ліпити, Мікеланджело треба було б навчити, як не ліпити. Так само і з великими програмістами». Перліс має на увазі, що великі майстри мають внутрішню якість, яка виходить за межі їхнього навчання. Але звідки береться ця якість. Вона вроджена. Чи вона розвивається завдяки старанності. Як каже Огюст Гюсто, вигаданий кухар із «Ratatouille», «готувати може кожен, але великим може бути лише безстрашний». Я радше бачу це як готовність присвятити значну частину життя цілеспрямованій практиці. Можливо, «безстрашний» це спосіб коротко сказати саме про це. Або, як каже критик Гюсто Антон Его, «не кожен може стати великим митцем, але великий митець може прийти звідки завгодно».

Тож купуйте ту книжку про Java, Ruby, JavaScript або PHP, імовірно, ви матимете з неї користь. Але ви не зміните своє життя і не зміните свою реальну загальну майстерність як програміста за 24 години або 21 день. А як щодо того, щоб наполегливо і постійно вдосконалюватися протягом 24 місяців. Ось тоді ви вже починаєте кудись рухатися.


Посилання та джерела

Блум, Бенджамін, редактор. «Developing Talent in Young People». Ballantine, 1985.

Брукс, Фред. «No Silver Bullets». IEEE Computer, том 20, номер 4, 1987, сторінки 10–19.

Браян, В. Л., Хартер, Н. «Studies on the telegraphic language: The acquisition of a hierarchy of habits». Psychology Review, 1899, 8, 345–375.

Гейз, Джон Р. «Complete Problem Solver». Lawrence Erlbaum, 1989.

Чейз, Вільям Г., Саймон, Герберт А. «Perception in Chess». Cognitive Psychology, 1973, 4, 55–81.

Лейв, Джин. «Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life». Cambridge University Press, 1988.


Відповіді

Приблизні затрати часу на різні операції на типовому ПК.

виконати типову інструкцію1 з 1 000 000 000 секунди, це 1 наносекунда
вибірка з кешу L10,5 наносекунди
помилка передбачення переходу5 наносекунд
вибірка з кешу L27 наносекунд
блокування і розблокування mutex25 наносекунд
вибірка з основної пам’яті100 наносекунд
передати 2 кілобайти мережею 1 Гбіт за секунду20 000 наносекунд
прочитати 1 мегабайт послідовно з пам’яті250 000 наносекунд
вибірка з нового місця на диску, пошук8 000 000 наносекунд
прочитати 1 мегабайт послідовно з диска20 000 000 наносекунд
пакет зі США до Європи і назад150 мілісекунд, це 150 000 000 наносекунд

Додаток, вибір мови

Кілька людей запитували, яку мову програмування варто вивчати першою. Єдиної відповіді немає, але врахуйте такі думки.

  1. Користуйтеся друзями. Коли мене запитують, яку операційну систему обрати, Windows, Unix чи Mac, я зазвичай відповідаю, користуйтеся тим, чим користуються ваші друзі. Перевага, яку ви отримуєте від навчання з допомогою друзів, перекриє будь які внутрішні відмінності між операційними системами або між мовами програмування. Думайте і про майбутніх друзів, про спільноту програмістів, частиною якої ви станете, якщо продовжите. Чи має обрана мова велику зростаючу спільноту, чи малу, що занепадає. Чи є книжки, сайти та онлайн форуми, де можна отримати відповіді. Чи подобаються вам люди на цих форумах.

  2. Тримайте простоту. Мови на кшталт C++ і Java створені для професійної розробки великими командами досвідчених програмістів, які дбають про ефективність виконання коду. Через це вони мають складні частини, розраховані на такі умови. А ви зосереджені на тому, щоб навчитися програмувати. Вам не потрібна ця складність. Вам потрібна мова, яку спроєктували так, щоб її було легко вивчити і запам’ятати одному новому програмісту.

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

За цими критеріями мої рекомендації для першої мови програмування це Python або Scheme. Інший варіант це JavaScript, не тому, що він ідеально спроєктований для початківців, а тому, що для нього є дуже багато онлайн підручників, наприклад підручник Khan Academy. Але ваші обставини можуть відрізнятися, і є інші хороші варіанти. Якщо вам дуже мало років, вам можуть більше підійти Alice або Squeak або Blockly, а старшим учням ці інструменти теж інколи заходять. Головне це обрати і почати.


Додаток, книжки та інші ресурси

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

  1. Scheme. «Structure and Interpretation of Computer Programs» Абельсон і Сассман, це, ймовірно, найкращий вступ до комп’ютерних наук, і він справді навчає програмуванню як способу розуміти комп’ютерні науки. Можна знайти записи лекцій, а також повний текст онлайн. Книга складна і відсіює частину людей, які, можливо, могли б бути успішними з іншим підходом.

  2. Scheme. «How to Design Programs» Феллейзен та співавтори, це одна з найкращих книжок про те, як насправді проєктувати програми елегантно і функціонально.

  3. Python. «Python Programming: An Intro to CS» Зелле, це хороший вступ із використанням Python.

  4. Python. На Python.org доступно кілька онлайн підручників.

  5. Oz. «Concepts, Techniques, and Models of Computer Programming» Ван Рой і Харіді, дехто сприймає цю книгу як сучасного наступника Абельсона і Сассмана. Це подорож великими ідеями програмування, яка охоплює ширший діапазон, ніж Абельсон і Сассман, і водночас її часто легше читати та відстежувати думку. Вона використовує мову Oz, яка не є широко відомою, але добре підходить як база для вивчення інших мов.


Нотатки

Т. Кейпі зауважує, що на сторінці «Complete Problem Solver» на Amazon тепер показуються книги «Вивчіть бенгальську за 21 день» і «Вивчіть граматику та стиль» у блоці «Покупці, які купували цей товар, також купували». Схоже, значна частина людей, які дивляться ту сторінку, переходить туди саме з цієї статті. Дякую Россу Коену за допомогу з Гіппократом.

Home

Free resources from Clipart Library

Browse all free cliparts and images →