Недавно я прочитал много статей Стива Йегге. Одна из них, под названием «Practicing Programming» (практика программирования), была написана в 2005 году, и после её прочтения я был поражён:
Вопреки вашему убеждению, если вы просто с головой уходите в работу каждый день, это не настоящая практика: посещение совещаний не тренирует навыки межличностного общения; ответы на письма не улучшают навыки набора текста. Чтобы делать что-то лучше, нужно регулярно выделять время для целенаправленной практики.Это важное различие: я каждый день езжу на работу за рулём, но моё мастерство вождения намного уступает уровню профессионального водителя; точно так же ежедневное программирование может не сделать вас профессиональным программистом. Так что же может превратить обычного человека в профессионального водителя или профессионального программиста? Что нужно практиковать?
Я знаю многих выдающихся программистов — это один из лучших дополнительных «бонусов» работы в Amazon. Если внимательно за ними наблюдать, вы обнаружите, что они всегда практикуются. Они уже превосходны, но всё равно практикуются. Их способы практики разнообразны, и в этой статье я расскажу лишь о некоторых из них.
Насколько я понимаю, эти выдающиеся программисты добиваются такого успеха потому, что практикуются постоянно. Идеальное тело можно обрести только благодаря регулярным тренировкам, и нужно продолжать тренироваться, чтобы поддерживать его, иначе оно потеряет форму. То же самое верно для программирования и разработки программного обеспечения.
Ответ — в статье в Scientific American под названием «The Expert Mind» (экспертное мышление):
Эрикссон предположил, что значение имеет не сам опыт, а «целенаправленная практика», то есть постоянный вызов вещам за пределами ваших текущих способностей. Некоторые увлечённые любители тратят много времени на шахматы, гольф или игру на музыкальных инструментах, но могут оставаться на любительском уровне, и поэтому хорошо обученный ученик способен превзойти их за относительно короткое время. Примечательно, что с точки зрения повышения своего уровня большое количество времени, проведённое за шахматами (даже в различных соревнованиях), всё ещё кажется менее эффективным, чем специальная тренировка. Основная ценность тренировки — обнаруживать слабые места и целенаправленно их улучшать.«Целенаправленная практика» означает частое решение задач, находящихся как раз на пределе ваших способностей, то есть таких, где высока вероятность неудачи. Если вы не сталкиваетесь с некоторыми неудачами, вы можете не расти. Нужно постоянно бросать себе вызов и выходить за свои пределы.
Такие вызовы иногда возникают на работе, но не обязательно. Отделение практики от профессиональной работы в программировании часто называют «Code Kata».
Концепцию Code Kata предложил Дэвид Томас, один из авторов книги «Программист-прагматик: от подмастерья к мастеру». Эта концепция в основном подразумевает повторяющуюся практику конкретной техники или навыка, чтобы овладеть им. — Примечание переводчика.

Так называемая ката — это серия движений. Это понятие заимствовано из боевых искусств.
Если вы хотите увидеть несколько примеров Code Kata (то есть способов усердно учиться и оттачивать навыки программирования), статья Стива Йегге действительно предлагает несколько хороших идей. Он называет их «тренировочными упражнениями»:
1. Напишите своё резюме. Перечислите все свои релевантные навыки, затем отметьте те, которые всё ещё будут полезны через 100 лет. Оцените каждый навык по 10-балльной шкале.
2. Составьте список программистов, которыми вы восхищаетесь. Постарайтесь включить тех, с кем вы работаете, потому что вы приобретёте некоторые навыки от них на работе. Запишите 1–2 сильные стороны каждого из них, то есть те аспекты, которые вы хотите улучшить в себе.
3. Посмотрите раздел «Информатика» в Википедии, найдите категорию «Пионеры информатики», выберите человека из списка, прочитайте его историю и открывайте любые ссылки, которые заинтересуют вас во время чтения.
4. Потратьте 20 минут на чтение чужого кода. Чтение отличного кода и чтение плохого кода одинаково полезно; читайте и то и другое, чередуя. Если вы не можете отличить одно от другого, попросите уважаемого вами программиста показать вам, как выглядят отличный и плохой код. Покажите другим прочитанный вами код и спросите их мнение.
5. Составьте список 10 ваших любимых инструментов программирования — тех, которые, как вам кажется, вы используете чаще всего и без которых не можете обойтись. Выберите один наугад и потратьте час на чтение его документации. В течение этого часа постарайтесь узнать о функции этого инструмента, о существовании которой вы не знали, или откройте новый способ его использования.
6. Подумайте о том, в чем вы наиболее сильны помимо программирования. Затем подумайте, какая практика сделала вас таким умелым и профессиональным. Какое вдохновение это приносит вашей работе по программированию? (Как вы можете применить этот опыт в программировании?)
7. Возьмите стопку резюме и проведите час в комнате с группой интервьюеров. Убедитесь, что каждое резюме прочитано как минимум 3 интервьюерами и оценено по шкале от 1 до 3. Обсудите резюме, которые получили очень разные оценки от разных интервьюеров.
8. Примите участие в телефонном интервью. После этого запишите свою обратную связь, поделитесь своими мнениями, а затем поговорите с человеком, проводившим телефонное интервью, чтобы понять, сходитесь ли вы в выводах.
9. Проведите техническое интервью, причём интервьюируемый должен быть экспертом в области, в которой вы мало разбираетесь. Попросите его исходить из того, что аудитория ничего не знает об этой области, поэтому пусть он начнёт с основ. Постарайтесь понять то, что он говорит, и при необходимости задавайте вопросы.
10. Воспользуйтесь возможностью поприсутствовать на чужом техническом собеседовании. Во время процесса просто внимательно слушайте и учитесь. Пока кандидат усердно решает технические задачи, вы тоже должны попытаться решить эти задачи в уме.
11. Найдите человека, с которым вы можете обмениваться практическими задачами, и раз в две недели делитесь друг с другом задачами по программированию. Потратьте 10–15 минут на попытку их решения, затем 10–15 минут на их обсуждение (решены они или нет).
12. Когда вы услышите любой вопрос с собеседования, который не можете решить сразу, быстро вернитесь на своё место и отправьте этот вопрос себе по электронной почте как напоминание на будущее. Найдите немного времени на этой неделе, чтобы решить его на вашем любимом языке программирования.
Причина, по которой мне нравится список Стива, в том, что он выглядит всеобъемлющим. Некоторые программисты считают «практику» просто сложными головоломками по программированию. Но, на мой взгляд,программирование — это в большей степени о людях, чем о коде.Поэтому, решая все заумные вопросы с собеседований по программированию со всего мира, этот подход ограничен в улучшении ваших личных способностей.
Что касается «сознательной практики», мне также нравятся«Teach Yourself Programming in Ten Years» («Научи себя программированию за десять лет»)многие советы, предложенные в статье Питера Норвига:
1. Общайтесь с другими программистами. Читайте чужой код. Это важнее любой книги или учебного курса.
2. Пишите программы сами! Лучший способ учиться — учиться на практике.
3. Посещайте курсы по программированию в рамках бакалавриата или магистратуры.
4. Найдите несколько проектов, которые можно сделать, и сформируйте команду с другими программистами. В ходе проекта научитесь определять, кто лучшие программисты, а кто худшие.
5. Работайте с другими программистами над проектами, учитесь поддерживать код, который вы не писали, и учитесь писать код, который легко поддерживать другим.
6. Изучите много разных языков программирования, особенно те, у которых иное мировоззрение и модель программирования, чем у языков, знакомых вам сейчас.
7. Понимайте влияние аппаратного обеспечения на программное обеспечение. Знайте, сколько времени требуется вашему компьютеру, чтобы выполнить инструкцию, сколько времени требуется, чтобы извлечь слово из памяти (с кэшем или без него), сколько времени требуется, чтобы передать данные по Ethernet (или через Интернет), сколько времени требуется, чтобы прочитать последовательные данные с диска или перейти в другое место на диске, и так далее.
Вы также можете почерпнуть вдохновение из 21 практической ката по программированию Дэйва Томаса (CodeKata.com) или, возможно, предпочтёте присоединиться к местному «додзё программирования» (CodingDojo.org).
Что касается «целенаправленной практики», я не могу привести длинный список рекомендаций, как Стив, Питер или Дэйв. Я гораздо менее терпелив, чем они. На самом деле, по моему мнению, «кодинг-ката» требует всего двух движений:
1. Ведите блог. Я основал блог CodingHorror.com в начале 2004 года как форму моей собственной целенаправленной практики. Сначала он был очень малоизвестным, но позже стал самым важным делом в моей карьере. Поэтому вам тоже следует вести блог. Те, кто в конце концов «становятся известны миру», часто оказываются теми, кто умеет эффективно писать и общаться. Их голоса звучат громче всех; именно они устанавливают правила и задают мировые тенденции.
2. Активно участвуйте в известных проектах с открытым исходным кодом. Все громкие слова звучат красиво, но вы болтун или деятель? Не просто говорите, не делая. Это очень важно, потому что люди будут судить вас по вашим поступкам, а не по словам. Старайтесь оставить что-то реальное и полезное в открытом доступе, и тогда вы сможете сказать: «Я внёс вклад в этот проект».
Когда вы сможете писать блестящий код и объяснять этот код миру блестящими словами, тогда я буду считать, что вы освоили самую крутую ката по программированию!
Источник: http://www.topthink.com/topic/11711.html