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

Original on http://www.norvig.com/21-days.html

Петро Норвіг

Чому все в такому поспіху?

Зайдіть в будь-який книжковий магазин, і ви побачите, як Самовчитель Java 7 днів разом з нескінченними варіаціями пропонують вчити Visual Basic, Windows, Інтернет і так далі протягом декількох днів або годин. Я зробив наступне пошуку влада на Amazon.com :

дата опублікування: після 1992 року, і назва: днів 
(назва: вчитися або назва: навчити себе)

і повернулися 248 хітів. Перші 78 чоловік, комп'ютерних книг (№ 79 був бенгальський ЖЖ протягом 30 днів ). Я замінив "днів" з "годин" і отримав дивно схожі результати: 253 більше книг, 77 комп'ютерних книг слід Самоучитель Граматика і стиль в 24 годин на число 78. З топ-200 цілому 96% комп'ютерних книг.

Зроблено висновок, що або люди у великому поспіху, щоб дізнатися про комп'ютери або комп'ютерах, що якось неправдоподібно легше вчитися, ніж що-небудь інше. Є немає книг про те, як дізнатися Бетховена, або квантової фізики, і навіть собака стрижка протягом декількох днів. Felleisen співавт. дати добро на цю тенденцію в своїй книзі Як розробляти програми , коли вони кажуть, "Bad програмування легко. Ідіоти можете дізнатися його в 21 днів , навіть якщо вони манекени .

Давайте проаналізуємо, що назва, як Learn C + + в три дні може означати:

  • ЖЖ: Через 3 дні у вас не буде часу, щоб написати кілька важливих програм, і вчитися на своїх успіхах і невдачах з ними. У вас не буде часу, щоб працювати з досвідченим програмістом і зрозуміти, яке це жити в C + + середу. Коротше кажучи, у вас не буде часу, щоб дізнатися більше. Таким чином, книга може тільки говорити про поверхневі знайомство, а не глибоке розуміння. Як сказав Олександр Поуп, трохи навчання небезпечна річ.
  • C + +: У 3-х днів ви зможете дізнатися деякі синтаксис C + + (якщо ви вже знаєте іншу мову), але ви не можете багато чого дізнатися про те, як використовувати мову. Коротше кажучи, якщо ви, скажімо, основні програміст, ви могли б навчитися писати програми в стилі Basic, використовуючи C + + синтаксис, але ви не могли дізнатися, що C + + насправді хороші (і погані) для. Ну і що з того Алан Перліс одного разу сказав: "мова, яка не впливає на те, як ви думаєте, про програмування, не варто знати». Одним з можливих Справа в тому, що ви повинні навчитися трохи C + + (або, скоріше, щось на зразок JavaScript або Flash-Flex), тому що вам потрібно для взаємодії з існуючими інструмент для виконання конкретного завдання. Але тоді ви не навчитися програмувати, ви вчитеся, щоб виконати це завдання.
  • за три дні: На жаль, цього не достатньо, як показує наступний розділ.

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

Дослідники ( Блум (1985) , Брайан і Хартер (1899) , Хейес (1989) , Simmon і Чейз (1973) ) показали, що це займає близько десяти років, щоб розвинути експертизу в одному з самих різних областях, включаючи шахи, музика Склад, телеграфних операцій, живопис, гра на фортепіано, плавання, теніс, і дослідження в області нейропсихології і топології. Ключовим є дорадчим практика: не тільки робити це знову і знову, але складною себе задачу, яка є як раз за поточну спроможність, намагаючись, проаналізувати Вашу роботу під час і після це робити, і виправлення помилок. Потім повторіть. І повторюю ще раз. Там, як видається, немає реальної посилання: навіть Моцарту, який був музично обдарованим у віці 4 років, за 13 років, перш ніж він почав виробляти світового класу, музиці. В іншому жанрі, Beatles, здавалося, увірвався на сцену з рядком # 1 хітів і поява на шоу Еда Саллівана в 1964 році. Але вони грали в маленьких клубах Ліверпуля і Гамбурга з 1957 року, і хоча вони були масовий призов на ранній стадії, їх перший великий критичний успіх, Sgt. Peppers , був випущений в 1967 році. Малкольм Гладуелл про те, що дослідження студентів Берлінської академії музики в порівнянні верхньої, середньої та нижньої третини класу і запитав, скільки вони практикували:

Кожна людина, з усіх трьох груп, почав грати приблизно в той же час - близько п'яти років. У ті перші роки, все практикують приблизно стільки ж - близько двох-трьох годин на тиждень. Але близько восьми років реальні відмінності почали з'являтися. Студенти, які виявляться кращими в своєму класі почав займатися більше, ніж всі інші: 6:00 на тиждень на дев'ять років, вісім у віці 12, 16 на тиждень, 14 років, і все вище і вище, поки у віці 20, вони займалися більше 30 годин на тиждень. У віці 20 років, еліта виконавці були всі році склав 10 000 годин практики протягом свого життя. Просто хороші студенти склали, за контрастом, 8000 годин, а також майбутніх вчителів музики трохи більше 4000 годин.

Так що, може бути, що 10000 годин, а не 10 років, є магічним числом. (Анрі Картьє-Брессон (1908-2004) сказав: "Ваша перша 10000 фотографії ваших гірших", але він зняв більше однієї години). Семюель Джонсон (1709-1784) вважав, він взяв ще більше: "Перевага в будь-який відділ може досягається лише працею всього свого життя, він не буде придбати за меншою ціною ». І Чосера (1340-1400) скаржився на «LYF таке коротке, ремесло так довго lerne". Гіппократ (бл. 400BC) відомий уривок "ARS Longa, Vita Brevis", яка є частиною більш довгою цитаті "Ars Longa, Vita Brevis, occasio praeceps, experimentum periculosum, iudicium незговірливий", яке надає англійською мовою як "Життя коротка, [] ремесло давно, можливість швидкоплинного, експеримент підступний, рішення важких ". Незважаючи на латинській мові, АРС може означати або мистецтвом або ремеслом, в грецькому оригіналі слово "техне" може означати тільки "майстерність", а не "мистецтво".

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

Ось мій рецепт успіху для програмування:

  • Отримати зацікавлені в програмуванні, і зробити деякі, тому що це весело. Переконайтеся, що він продовжує залишатися досить весело, так що ви будете готові поставити в свої десять years/10, 000 годин.
  • Програми . Кращий вид навчання навчання в процесі роботи . Висловлюючись більш технічно, "максимальний рівень продуктивності для фізичних осіб у цій галузі не досягається автоматично в залежності від великий досвід, але і рівень продуктивності може бути збільшена навіть дуже досвідчених людей в результаті цілеспрямованих зусиль для поліпшення . " (с. 366) і "найбільш ефективно навчання вимагає чітко визначених завдань з відповідним рівнем складності для конкретної людини, інформаційні зворотного зв'язку, і можливості для повторення та виправлення помилок." (Стор. 20-21) Книга пізнання на практиці: Розум, математики та культури в повсякденному житті є цікаві посилання на цю точку зору.
  • Поговоріть з іншими програмістами, читайте інші програми. Це важливіше, ніж будь-які книги або навчального курсу.
  • Якщо ви хочете, покласти в чотири роки в коледжі (або більше в аспірантурі). Це дасть вам доступ до деяких робочих місць, що вимагають повноважень, і це дасть вам більш глибоке розуміння на полі, але якщо вам не подобається школа, можна (з деякою посвячення) отримати подібний досвід на свій розсуд або на робочому місці . У кожному разі, книга навчання саме по собі не буде достатньо. "Комп'ютерні науки освіти не може ніхто досвідченим програмістом більше, ніж вивчення кистей і пігменту може зробити хтось експерт художник", говорить Ерік Реймонд, автор словника нового хакера . Один з кращих програмістів, які я коли-небудь найняв було тільки середню освіту, він справив багато великихпрограмних , є своя група новин , і зробив достатньо в опціони на акції, щоб купити свій власний нічний клуб .
  • Робота над проектами з іншими програмістами. Будьте кращим програмістом в деяких проектах, бути гіршим на деяких інших. Коли ти кращий, ви отримуєте можливість перевірити свої здібності вести проект, і щоб надихнути інших своїм баченням. Коли ти худий кінець, ви дізнаєтеся, що майстри роблять, і ви дізнаєтеся, що вони не люблять робити (бо вони змушують вас робити це за них).
  • Робота над проектами після інших програмістів. Зрозумійте, це програма, написана кимось іншим. Подивіться, що потрібно, щоб зрозуміти і виправити її, коли первісний програмісти не навколо. Подумайте про те, як проектувати свої програми, щоб зробити його простіше для тих, хто буде вести їх за вами.
  • Дізнайтеся, принаймні, півтора десятка мов програмування . Увімкніть одну мову, який підтримує клас абстракції (наприклад, Java або C + +), яка підтримує функціональну абстракцію (як Lisp або ML), яка підтримує синтаксичну абстракцію (наприклад, Lisp), яка підтримує декларативні специфікації (наприклад, Prolog або шаблони С + +), один який підтримує співпрограми (як іконка або Scheme), і той, який підтримує паралелізм (наприклад, сизаль).
  • Пам'ятайте, що є " комп'ютер "в" комп'ютерні науки ". Знати, скільки часу буде потрібно комп'ютер для виконання інструкції, отримати слово з пам'яті (з урахуванням і без кеша), читання послідовних слів з ​​диска, і звернутися в інше місце на диску. ( Відповіді тут. )
  • Візьміть участь у мовній стандартизації зусиль. Це може бути ANSI C + + комітету, або це може бути рішення, якщо ваш місцевий стиль кодування буде мати 2 або 4 рівнів простору відступу. У будь-якому випадку, ви дізнаєтеся про те, що інші люди, як і в мові, як глибоко вони відчувають себе так, а може бути навіть трохи про те, чому вони вважають так.
  • Є здоровий глузд, щоб вийти зусилля стандартизації мови як можна швидше.

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

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

  1. Систематичне виявлення провідних дизайнерів як можна раніше.
  2. Призначити кар'єру наставника на себе відповідальність за розвиток на перспективу і дбайливо зберігають кар'єру файл.
  3. Забезпечення можливостей для зростання дизайнерам взаємодіяти і стимулювати один одного.

Це припускає, що деякі люди вже володіють якостями, необхідними для будучи великим конструктором, робота належним чином умовити їх разом. Алан Перліс висловився більш коротко: "Все можна навчити ліпити: Мікеланджело довелося б вчити, як не . Так само і з великими програмістами ". Перліс кажуть, що великих людей є внутрішнє якість, яка виходить за рамки їхньої професійної підготовки. Але там, де це якість взялося? Це вроджене? Або ж вони розвиваються через працьовитість? Як Огюст Gusteau (finctional шеф-кухарем в Ratatouille ) висловився, "кожен може приготувати, але тільки безстрашний може бути великим". Я думаю про нього як про бажання присвятити більшу частину свого життя в нарадчій практиці. Але, можливо, безстрашний спосіб підвести підсумок цього. Або, як критик Gusteau, Антон Его, каже: "Не кожен може стати великим художником, але великий художник може прийти звідки завгодно".

Так що вперед і купити, що Java / Ruby / Javascript / PHP книги, вам, ймовірно, деякі використовують з неї. Але ви не зміните своє життя, або ваш реальний загальний досвід в якості програміста протягом 24 годин, днів або навіть тижнів. Як щодо зусиль, щоб постійно вдосконалювати протягом 24 місяців? Ну, тепер ви починаєте отримувати десь ...


Посилання

Блум, Бенджамін (ред.) Розвиток талантів молодих людей , Ballantine, 1985.

Брукс, Фред, немає срібної кулі , IEEE Computer, Vol. 20, вип. 4, 1987, с. 10-19.

Брайан, WL і Хартер, Н. "Дослідження з телеграфним мовою: придбання ієрархії звички. психології огляд , 1899, 8, 345-375

Хейс, Джон Р., повна Problem Solver Лоуренс Erlbaum 1989 року.

Чейз, Вільям Г. і Саймон, Герберт А. "Сприйняття в шахи" когнітивної психології , 1973, 4, 55-81.

Lave, Jean, пізнання на практиці: Розум, математики та культури в повсякденному житті , Cambridge University Press, 1988.


Відповіді

Приблизний час для різних операцій на типовому ПК:

виконувати типові інструкції 1/1, 000 000 000 секунд = 1 nanosec
одержувати з L1 кеш-пам'яті 0,5 nanosec
Філія неправильного передбачення 5 nanosec
вибірка з кеш-пам'яті L2 7 nanosec
Mutex блокування / розблокування 25 nanosec
вибірка з основної пам'яті 100 nanosec
відправити 2К байтів на 1 Гбіт мережі 20000 nanosec
читати послідовно, починаючи з 1 Мб пам'яті 250000 nanosec
отримати від нового місця на диску (шукати) 8000000 nanosec
читати послідовно, починаючи з 1 МБ диска 20000000 nanosec
надіслати пакет США до Європи і назад 150 мілісекунд = 150000000 nanosec

Програма: Вибір мови

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

  • Використовуйте свої друзі . На питання "яку операційну систему слід використовувати, Windows, Unix, Mac або?", Я відповідаю завжди: «використовувати всі ваші друзі використовують". Перевага ви отримаєте від навчання з друзями буде компенсувати будь-які внутрішні розбіжності між ОС, або між мовами програмування. Також враховувати ваші майбутні друзі: спільнота програмістів, що ви будете частиною, якщо ви продовжите. Чи є на обраному мові є велика зростаюче співтовариство або невелика вмираючого? Є книги, веб-сайти і онлайн-форумах, щоб отримати відповіді? Чи подобається вам люди на цих форумах?
  • Будьте простіше . Мови програмування, таких як C + + і Java, призначені для професійного розвитку, великі команди досвідчених програмістів, які турбують під час ефективність їх код. В результаті ці мови мають складних деталей, призначених для таких обставин. Ви пов'язано з навчанням в програмі. Вам не потрібно, що ускладнення. Ви хочете, щоб на мові, який був розроблений, щоб можна було легко дізнатися і запам'ятати на одного нового програміста.
  • Грати. Куди б ви віддали перевагу вчитися грати на фортепіано: нормальний, інтерактивний спосіб, в якому ви чуєте кожну ноту, як тільки ви натиснете клавішу, або "пакетному" режимі, в якому Ви чуєте тільки примітки після закінчення всю пісню? Очевидно, що інтерактивний режим робить навчання простіше для фортепіано, а також для програмування. Наполягайте на тій мові інтерактивному режимі і використовувати його.

Враховуючи ці критерії, мої рекомендації для першої мови програмування був би Python або схеми . Але ваші обставини можуть змінюватися, є й інші хороші вибори. Якщо ваш вік однієї цифри, ви можете віддати перевагу Alice або Squeak(старіші учні також можуть користуватися цим). Важливо те, що ви обираєте і почати роботу.


Додаток: книги та інші ресурси

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

  • Схема: Структура та інтерпретація комп'ютерних програм (Абельсон і Суссман) , ймовірно, є кращим введенням в комп'ютерні науки, і він навчить програмування як спосіб розуміння інформатики. Ви можете подивитися онлайн відео лекцій на цю книгу, а також повний текст онлайн . Книга є складним завданням і буде відсіяти людей, які, можливо, може бути успішним з іншим підходом.
  • Схема: Як розробляти програми (Felleisen . та ін ) є однією з кращих книг про те, як насправді розробляти програми в елегантний і функціональний спосіб.
  • Python: Python Програмування: Введення в CS (Целле) є хорошим введенням за допомогою Python.
  • Python: Кілька онлайн- підручники доступні на Python.org .
  • Оз: концепції, методи та моделі програмування (Van Roy & Haridi) розглядається деякими як сучасний наступник Абельсон і Суссман. Ця подорож по великій ідеї програми, що охоплюють більш широкий діапазон, ніж Абельсон і Суссман в той же час, можливо, легше читати і слідувати. Він використовує мову, Оз, який не дуже широко відомі, але служить основою для вивчення інших мов. <

Примітки

Т. Capey зазначає, що повна Solver Проблема сторінку Amazon тепер "Самовчитель бенгальський в 21 днів" і "Самоучитель граматики і стилю" Книги в розділі "Клієнти, які купував на цей товар, також купували на ці питання" розділу. Я думаю, що більша частина людей, які дивляться на цю книгу приходять з цієї сторінки. Завдяки Росс Коен за допомогою Гіппократа.

          

Переклади

Завдяки наступних авторів, переклади цій сторінці доступні:


Арабська 
(Мохамед А. Яхья)


Болгарська 
(Boyko Bantchev)


Китайський 
(Сяоган Guo)


Хорватська 
(Tvrtko Bedekovic)


Французький 
(Etienne Beauchesne)


Німецький 
(Stefan Ram)


Єврейська 
(Eric McCain)


Хінді 
(Vikash Tiwari) 


Угорський 
(Marton Mestyan)


Індонезійські 
(Tridjito Santoso)


Італійський 
(Fabio Z. Tessitore)


Японський 
(yomoyomo) 


Корейська (Джон Хван) 


Перська 
(Mehdi Asgari)


Польський 
(Kuba Nowak)


Португальська 
(Augusto Radtke)


Румунська 
(Штефан Лазер) 


Російський 
(Костянтин Птіцин) 


Сербська 
(Лазар Ковачевич) 


Іспанська 
(Карлос Руеда) 


Словацька 
(Jan Waclawek) 


Турецька 
(Çağıl Uluşahin) 


 
Гаджети на базі Google

Петро Норвіг (Copyright 2001)

Add new comment

Filtered HTML

  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd> <p> <b> <img> <style>
  • Lines and paragraphs break automatically.

Plain text

  • No HTML tags allowed.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Lines and paragraphs break automatically.