- PVSM.RU - https://www.pvsm.ru -
Примечание переводчика: данная статья была опубликована [1] Питером Норвигом [2] в 2001 году. По варианту 2001 года был выполнен перевод на русский язык [3]. В 2014 году статья была обновлена, но перевод не был обновлен. Поэтому я выполнил свой перевод статьи по ее современному варианту 2014 года. Считаю, что статья не потеряла своей актуальности, хоть и несколько устарела. Если найдете какие-то ошибки в переводе, пишите в личку.
Зайдите в любой книжный магазин и вы тут же увидите книгу, как выучить Java за 24 часа, а также бесконечные варианты, как выучить C, SQL, Ruby, алгоритмы и так далее за несколько дней или часов. Расширенный поиск на Amazon [title: teach, yourself, hours, since: 2000 [4]] выдает список из 512 книг. Из первой десятки девять – книги по программированию (лишь одна – о бухгалтерском учете). Такие же результаты вы получите, заменив "teach yourself" на "learn", а "hours" – на "days".
Отсюда следует вывод: либо люди очень торопятся обучиться программированию, либо каким-то сказочным образом программированию выучиться легче, чем чему-либо другому. Felleisen et al. упомнули об этом в своей книге How to Design Programs [5], когда писали «Плохо программировать – проще простого. Идиоты могут научиться этому за 21 день, даже если они полные кретины». Сайт комисов Abtruse Goose тоже прошелся по этой теме (вот ссылка [6]).
Давайте разберемся, что может означать название книги Teach Yourself C++ in 24 Hours [7]:
Исследования (Bloom (1985) [9], Bryan & Harter (1899) [10], Hayes (1989) [11], Simmon & Chase (1973) [12]) показали, что требуется примерно десять лет, для того, чтобы овладеть навыками в какой-то определенной области, например, в игре в шахматы, музыкальной композиции, работе с телеграфом, рисовании, игре на пианино, плавании, теннисе, нейрофизиологии и топологии. Секрет заключается в обдуманной практике: не просто механическое повторение, но поиск задач, которые выше вашего нынешнего уровня, решение их, анализ ваших действий во время их решения и после того, как они решены, исправление сделанных ошибок. И опять. И снова. Более короткого пути нет: даже Моцарту, в 4 года ставшему музыкальным чудо-ребенком, понадобилось 13 лет, прежде чем он стал создавать музыку мирового класса. Битлз в 1964 году ворвались на сцену с кучей хитов и выступили в шоу Эда Салливана. Но до этого они играли в маленьких клубах Ливерпуля и Гамбурга с 1957 года. И несмотря на свою мировую славу среди фанатов, их первый успех среди музкальных критиков пришел с выходом «Сержанта Пеппера» в 1967 году.
Эту мысль популяризировал Malcolm Gladwell [13] в своей книге, хотя там он говорит о 10.000 часах, а не о 10 годах. Знаменитый фотограф Анри Картье-Брессон [14] (1908-2004) выразил эту мысль так: «Первые 10.000 фотографий будут вашими наихудшими» (Он тогда и не подозревал, что с помощью цифровой камеры некоторым удается достичь этой цифры за неделю). Реальный опыт приходит с жизнью: Сэмюэль Джонсон [15] (1709-1784) писал «Опыт в любой сфере может быть получен только трудом целой жизни; меньшей цены не бывает»; Чосер [16] (1340-1400) жаловался: «Столь мало жить, столь многому учиться». Гиппократ [17] (400 г. д.н.э ) известен своим высказыванием «жизнь коротка, наука обширна [18]», которое полностью звучит так: "Ars longa, vita brevis, occasio praeceps, experimentum periculosum, iudicium difficile", а в русском переводе «Жизнь коротка, наука обширна, случай шаток, опыт обманчив, суждение затруднительно». Конечно, ни одно число не может являться точным ответом: нет никаких оснований предполагать, что все навыки (программирование, игра в шахматы, в шашки, на музыкально инструменте) требуют в точности одинакового времени на их освоение, как и то, что разным людям требуется в точности одинаковое время. Как сказал профессор K. Anders Ericsson [19]: «В большинстве сфер просто удивительно, сколько времени требуется даже самым талантливым, чтобы овладеть мастерствов. Число ‘10.000 часов’ просто помогает вам понять, что речь идет о нескольких годах упорных трудов по 10-20 часов в неделю для достижения высочайшего уровня даже для самых природно одаренных с рождения талантов»
Вот вам мой рецепт успеха в программировании:
При всем вышесказанном одно лишь чтение книг даст вам не так уж и много. До рождения моего первого ребенка, я прочитал все книги об уходе за малышами, и все равно совершенно не понимал, что нужно делать. 30 месяцев спустя, когда готовился появиться на свет мой второй ребенок, думаете я заглядывал в книги, чтобы освежить память? Нет. Я полагался на свой собственный опыт, который оказался намного полезнее и качественнее, чем тысячи страниц, написаных экспертами.
Фред Брукс в своей статье «Серебряной пули не существует [29]» обозначил три шага в поиске отличных программистов:
Получается, некоторые люди уже имеют качества, позволяющие им стать великими программистами; надо их только направить по правильному пути. Алан Перилс (Alan Perlis [8]) выразил это более кратко: «Каждого можно научить лепить скульптуры; Микельанджело бы пришлось учить, как их не лепить. Точно также и с великим программистами». Перлис хотел сказать, что у великих есть некоторые внутренние качества, которые не приобретаются путем обучения. Но откуда эти качества появляются? Это врожденное? Или они вырабатываются усердием? Как сказал Агюст Густо (персонаж мультфильма Ratatouille) «готовить может всякий, но только бесстрашный может стать великим». Я считаю, что в нашем случае речь идет о жгучем желании посвятить большую часть своей жизни целенаправленному самообучению программированию. Но может быть бесстрашный более подходящее слово. Или, как сказал Антон Его (критик Агюста Густо): «не всякий может стать великим художником, но великий художник может появиться отовсюду».
Так что, вперед, покупайте книгу по Java/Ruby/JavaScript/PHP; возможно вы извлечете из нее какую-то пользу. Но вы не сможете поменять свою жизнь и не станете экспертом в программировании за 24 часа или за 21 день. Как насчет того, чтобы потратить 24 месяца упорного труда на непрерывное овладение предметом? Вот теперь мы уже ведём серьезный разговор…
Примерное время на выполнение различных операций в типичном ПК:
| выполнение типичной инструкции | 1/1,000,000,000 sec = 1 nanosec |
| чтение из кеша L1 | 0.5 nanosec |
| ошибка в предсказании перехода | 5 nanosec |
| чтение из кэша L2 | 7 nanosec |
| захват/освобождение мутекса | 25 nanosec |
| чтение из основной памяти | 100 nanosec |
| послать 2K по 1Gbps сети | 20,000 nanosec |
| чтение 1MB последовательно из памяти | 250,000 nanosec |
| чтение с диска с поиском (seek) | 8,000,000 nanosec |
| чтение 1MB последовательно с диска | 20,000,000 nanosec |
| отправка пакета данных из США в Европу и обратно | 150 milliseconds = 150,000,000 nanosec |
Некоторые читатели задавали мне вопрос, какой язык программированяи им стоит учить первым. Однозначного ответа на этот вопрос не существует, но учтите следующие моменты:
С учетом всех этих критериев, я рекомендую в качестве первого языка программирования Python или Scheme. Или же JavaScript, но не потому что он идеально создан для начинающих, а потому что по этому языку очень много учебников, например, в Академии Кана [30]. Но ваш конкретный случай может быть особенным, так что есть множество и других языков на выбор. Если вам до десяти лет, вам может понравится язык Alice [31] или Squeak [32] или Blockly [33] (ученикам по-старше они тоже могут понравиться). Главное – сделать выбор и начать учиться.
Меня спрашивают, какие книги и веб-сайты лучше всего подходят для обучения. Я повторю еще раз: «чтения одних только книг не достаточно», но порекомендую следующее:
Автор: webmascon
Источник [42]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/285045
Ссылки в тексте:
[1] данная статья была опубликована: http://norvig.com/21-days.html
[2] Питером Норвигом: https://ru.wikipedia.org/wiki/%25D0%259D%25D0%25BE%25D1%2580%25D0%25B2%25D0%25B8%25D0%25B3,_%25D0%259F%25D0%25B8%25D1%2582%25D0%25B5%25D1%2580
[3] перевод на русский язык: http://www.williamspublishing.com/21-days.html
[4] title: teach, yourself, hours, since: 2000: https://www.amazon.com/s/ref=nb_sb_noss_2?url=search-alias=aps&field-keywords=teach+yourself+hours&rh=i:aps,k:teach+yourself+hours
[5] How to Design Programs: http://www.ccs.neu.edu/home/matthias/HtDP2e/index.html
[6] вот ссылка: http://abstrusegoose.com/249
[7] Teach Yourself C++ in 24 Hours: http://www.amazon.com/Sams-Teach-Yourself-Hours-5th/dp/0672333317/ref=sr_1_6?s=books&ie=UTF8&qid=1412708443&sr=1-6&keywords=learn+c%2B%2B+days
[8] Alan Perlis: http://www-pu.informatik.uni-tuebingen.de/users/klaeren/epigrams.html
[9] Bloom (1985): http://www.amazon.com/exec/obidos/ASIN/034531509X/
[10] Bryan & Harter (1899): http://norvig.com/21-days.html#bh
[11] Hayes (1989): http://www.amazon.com/exec/obidos/ASIN/0805803092
[12] Simmon & Chase (1973): http://norvig.com/21-days.html#sc
[13] Malcolm Gladwell: http://www.amazon.com/Outliers-Story-Success-Malcolm-Gladwell/dp/0316017922
[14] Анри Картье-Брессон: https://ru.wikipedia.org/wiki/%25D0%259A%25D0%25B0%25D1%2580%25D1%2582%25D1%258C%25D0%25B5-%25D0%2591%25D1%2580%25D0%25B5%25D1%2581%25D1%2581%25D0%25BE%25D0%25BD,_%25D0%2590%25D0%25BD%25D1%2580%25D0%25B8
[15] Сэмюэль Джонсон: https://ru.wikipedia.org/wiki/%25D0%2594%25D0%25B6%25D0%25BE%25D0%25BD%25D1%2581%25D0%25BE%25D0%25BD,_%25D0%25A1%25D1%258D%25D0%25BC%25D1%258E%25D1%258D%25D0%25BB
[16] Чосер: https://ru.wikipedia.org/wiki/%25D0%25A7%25D0%25BE%25D1%2581%25D0%25B5%25D1%2580,_%25D0%2594%25D0%25B6%25D0%25B5%25D1%2584%25D1%2580%25D0%25B8
[17] Гиппократ: https://ru.wikipedia.org/wiki/%25D0%2593%25D0%25B8%25D0%25BF%25D0%25BF%25D0%25BE%25D0%25BA%25D1%2580%25D0%25B0%25D1%2582
[18] жизнь коротка, наука обширна: https://ru.wikipedia.org/wiki/Vita_brevis_ars_longa
[19] K. Anders Ericsson: http://www.amazon.com/K.-Anders-Ericsson/e/B000APB8AQ/ref=dp_byline_cont_book_1
[20] это практика: http://www.engines4ed.org/hyperbook/nodes/NODE-120-pg.html
[21] стр.366: http://www2.umassd.edu/swpi/DesignInCS/expertise.html
[22] Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life: http://www.amazon.com/exec/obidos/ASIN/0521357349
[23] Эрик Реймонд: https://ru.wikipedia.org/wiki/%25D0%25A0%25D1%258D%25D0%25B9%25D0%25BC%25D0%25BE%25D0%25BD%25D0%25B4,_%25D0%25AD%25D1%2580%25D0%25B8%25D0%25BA
[24] прекрасные: http://www.xemacs.org/
[25] программы: http://www.mozilla.org/
[26] мейл-лист собственных фанатов: http://groups.google.com/groups?q=alt.fan.jwz&meta=site=groups
[27] ночной клуб: http://en.wikipedia.org/wiki/DNA_Lounge
[28] Ответы здесь: #answers
[29] Серебряной пули не существует: https://ru.wikipedia.org/wiki/%25D0%25A1%25D0%25B5%25D1%2580%25D0%25B5%25D0%25B1%25D1%2580%25D1%258F%25D0%25BD%25D0%25BE%25D0%25B9_%25D0%25BF%25D1%2583%25D0%25BB%25D0%25B8_%25D0%25BD%25D0%25B5%25D1%2582
[30] Академии Кана: https://www.khanacademy.org/computing/cs/programming
[31] Alice: http://alice.org
[32] Squeak: http://www.squeak.org/
[33] Blockly: https://blockly-demo.appspot.com/static/apps/index.html
[34] Structure and Interpretation of Computer Programs (Abelson & Sussman): http://www.amazon.com/gp/product/0262011530
[35] есть в сети видео: http://www.swiss.ai.mit.edu/classes/6.001/abelson-sussman-lectures/
[36] текст в электронном виде: http://mitpress.mit.edu/sicp/full-text/book/book.html
[37] How to Design Programs (Felleisen et al.): http://www.amazon.com/gp/product/0262062186
[38] Python Programming: An Intro to CS (Zelle): http://www.amazon.com/gp/product/1887902996
[39] учебников: http://wiki.python.org/moin/BeginnersGuide
[40] Python.org: http://python.org
[41] Concepts, Techniques, and Models of Computer Programming (Van Roy & Haridi): http://www.amazon.com/gp/product/0262220695
[42] Источник: https://habr.com/post/416167/?utm_campaign=416167
Нажмите здесь для печати.