Выработка терпимости к глубокому, мучительному разочарованию — ключевая часть обучения программированию.

Когда я был ребенком, у меня была копия Mattel Auto Race, одной из первых портативных светодиодных игр. Чтобы играть в нее, вы ведете машину — яркую светодиодную вспышку — вверх по экрану четыре раза, пытаясь избежать других машин, приближающихся к вам. Ужасно просто, но в конце 70-х это было вершиной цифровых развлечений.
По какой-то причине я вспомнил об этом в эти выходные, и по прихоти субботним вечером я решил создать его версию, используя P5, среду Javascript для создания интерактивных безделушек.
Поначалу дела шли как по маслу. Я потратил час на создание игрового холста, класса для представления встречных автомобилей и логики для создания и удаления автомобилей. Затем я решил немного усложнить игру, заставив несколько автомобилей появляться в разнесенное, но слегка рандомизированное время.
Вот когда я столкнулся с проблемами. Что-то было не так с тем, как я управлял таймингом. Машины будут появляться по две одновременно, а не в шахматном порядке. После некоторого времени возни с несколькими разными гамбитами я не мог понять, что не так. Я начал разочаровываться и отодвинул его в сторону.
Это было два дня назад, и я не вернулся к этому, потому что я немного колеблюсь. Я всего лишь программист-любитель, поэтому часто довольно быстро достигаю предела своих возможностей. Всякий раз, когда я работаю над проектом, у меня всегда возникает смутное ощущение, что, черт возьми, я могу наткнуться на загвоздку, в которой яникогдане разберусь. Поэтому я начинаю избегать этого проекта. я его не открываю. Я не хочу сталкиваться с разочарованием, чувством поражения.
Время от времени, когда кто-то узнает, что я писатель и увлекаюсь программированием, меня спрашивают: Ну что, программировать сложно?
И я обычно отвечаю тем же.
«Трудно» — неправильное слово, — скажу я. «Не то чтобы это было сложно.
«Дело в том, что это разочаровывает».

Я подумал об этом, когда читал эссе в Communications of the ACM, которое ставит под сомнение само предположение о том, что «программирование — это сложно.»
Как отмечает автор Бретт А. Беккер, вы часто слышите — от преподавателей, технических фирм и самих разработчиков программного обеспечения — что кодирование невероятно сложно. Тем не менее, как отмечает Беккер, нет убедительных доказательств того, что программирование сложнее, чем другие трудные занятия. У нас нет достоверных данных, свидетельствующих о том, что хорошо разбираться в программировании сложнее, чем, скажем, хорошо работать медсестрой скорой помощи, судебным адвокатом или шеф-поваром — отчасти потому, что слово «сложно» — странно двусмысленное.
Беккер подозревает, что репутация программирования как требующего интеллекта короля черепов — это в равной степени нарциссическое павлинье и культурное привратничество:
Программировать сложно или нет? Имеющиеся данные недостаточно убедительны и разнообразны, чтобы ответить на этот вопрос в целом. Более обоснованные (и, вероятно, честные) ответы: «это зависит» и «и то, и другое». Почему же так часто говорят, что это тяжело? Часто ли об этом говорят анекдотично, потому что не так много доказательств, подтверждающих это? Потому что доказательства, которые существуют, трудно понять? Может быть, это слишком удобно для мотивации и оправдания работы? Неужели многие хотят, чтобы программирование казалось трудным, сознательно или бессознательно? Зависят ли технологические компании и менеджеры по найму от имиджа программирования как жесткого и элитного?
Я согласен. Я взял интервью у более чем 200 программистов, когда писал свою книгу Coders, и часто все они говорили мне одно и то же:
По их словам, программирование не было особенно сложным. Но это требовало дотошности мысли, предельного внимания к деталям, что было более жестоко, чем во многих других дисциплинах.
Больше всего они отметили, что для кодирования требуется одна особая психологическая установка:
Очень высокая терпимость к ежедневным мучительным разочарованиям.
Это связано с тем, что большая часть программирования заключается не столько в создании кода, сколько в его отладке. Вы пишете функцию, тестируете ее, и очень часто она не работает. Вы допустили какую-то ошибку, начиная от тривиальной (забытая точка с запятой) и заканчивая более существенной (ошибка на единицу). Или, может быть, ваша функция взаимодействует с библиотекой чужого кода, и вы не совсем понимаете, как на самом деле работает эта куча софта. Или, может быть, вы пытаетесь работать с огромной кодовой базой, которую легионы предыдущих разработчиков писали плохо и хреново в течение многих лет, и это беспорядок спагетти.
В любом случае, огромное количество времени программисты проводят за клавиатурой, а не пишут новый код. Они смотрят на код, полный ошибок, запускают руки в волосы и пытаются придумать следующий гамбит, который может заставить все работать.
Программисты боролись с разочарованием с тех пор, как существует кодирование. Как я писал в своей книге Кодеры…
В июне 1949 года ученый-компьютерщик Морис Уилкс собирался подняться по лестнице, когда его внезапно озарило, что «значительная часть оставшейся части моей жизни будет потрачена на поиск ошибок в моих собственных программах».

Что делает разочарование в коде особенно невыносимым, так это то, что вы не знаете, как долго это продлится. Может быть, вы поймете ошибку через несколько минут. Возможно, это займет час или два. Или, может быть, пройдут недели или месяцы, а вы все еще не разберетесь с ошибкой, так что вы просто прыгаете- свяжите его гнездом обработчиков исключений и молитесь Богу, чтобы он не удивил вас новым.
В любом случае, это то, что я говорю людям, которые спрашивают: «Эй, могу я научиться программировать?»
Конечно, говорю я. Почти каждый может.
Пока вас устраивает непрекращающееся сизифово разочарование.
Теперь очевидно, что программирование — не единственное разочаровывающее занятие в жизни! Куча заданий утомляет.
Работа с людьми — в сфере продаж, здравоохранения, гостиничного бизнеса или политики — разочаровывает, потому что люди могут быть невероятно сложными и противоречивыми. Все, что требует физической ловкости и мастерства, может вызывать разочарование. Освоение техники игры на валторне или в баскетболе может быть разочаровывающим, так как вы можете практиковать что-то снова и снова, и все равно не получится. Я лично испытываю все это, потому что я работаю в индустрии, связанной с людьми (журналистика), и я музыкант, который часто пытается отточить новую технику игры на гитаре.
Но разочарование в кодировании имеет уникальную горечь, потому что компьютеры и языки программирования — во всяком случае, в теории — детерминированы. Это часовые механизмы. Если вы можете просто понять, как функционируют различные части программы, которую вы пишете, вы должны уметь мысленно представить поток и выяснить, что вы делаете неправильно.
Именно поэтому разочарование от программирования кажется более экзистенциально тревожным, более душераздирающим, чем разочарование, которое я испытываю в журналистике или музыке. Если у меня возникают проблемы с продвижением тематической статьи, я могу утешать себя тем, что «исследования сложны, споры с источниками сложны, написание — беспорядочно органичный процесс, а понимание не всегда приходит по требованию». То же самое происходит и с изучением новой техники игры на гитаре: ваше тело, ваша проприоцепция прогрессируют урывками.
Но когда вы застряли на проблеме с программированием, это больше похоже на глубоко личную неудачу: моя неспособность следовать логической последовательности.
Конечно, я знаю, что это не обязательно так. Кодирование — это не только сырая логика. Это дисциплина, основанная на инсайтах, и, как и во всех дисциплинах, основанных на инсайтах, моменты «ага» в программировании часто происходят странным образом органично. Вы решаете проблему, делая перерыв, позволяя чему-то размышлять в своем заднем мозгу, болтая с кем-то еще, уклоняясь от нее. Разум странный и нелинейный, поэтому программирование может быть странным и нелинейным.
Но тем не менее, столкновение со стеной в программировании ощущается как провал чистого разума. Это может вызвать некий мрачный туман уныния, оседающий на душу.
Итак: программирование не обязательно сложно.
Но это чертовски неприятно.
(Понравилось это произведение? Взгляните на кнопку «хлопать» ниже и ее глубокий секрет: вы можете нажимать ее до 50 раз!)
(Кроме того, я написал целую книгу о странной психологии и умственном потоке кодирования, которую можно купить здесь в различных форматах. Если вы разработчик, это очень хороший подарок для любимого человека. те, кто понятия не имеет, что, черт возьми, ты делаешь целыми днями.)
Клайв Томпсон публикуется на Medium три раза в неделю; подпишитесь на него здесь, чтобы получать каждое сообщение на свою электронную почту — и, если вы не являетесь участником Medium, вы можете присоединиться здесь!
Клайв является автором статей для журналаNew York Times Magazine, обозревателем журналовWiredиSmithsonian, а также постоянным автором Мама Джонс. Он является автором книгКодеры: создание нового племени и переделка мираиУмнее, чем вы думаете: как технологии меняют наше мышление к лучшему. Он @pomeranian99 в Твиттере и Инстаграме.