Pull to refresh

Почему программисты — отстой

Reading time 6 min
Views 25K
Original author: Max Kanat-Alexander

Давным-давно я написал статью на тему «Почему компьютеры – отстой» (в итоге получившую названия «Компьютеры» и «Что не так с компьютерами» [в оригинале ссылка битая, поэтому копия из вэбархива — прим. переводчика] в двух других версиях, а оригинальное название так и не вышло в свет). Статья была достаточно длинной, но суть сводилась к идее, что компьютеры отстойны из-за того, что программисты создают дичайше сложные штуки, которые больше никто не в состоянии понять, и того, что сложность основана на еще большой сложности до тех пор, пока каждый аспект программы не станет неуправляемым.


image
КПДВ отсюда


Чего я не знал тогда, так это почему программисты делают это. Было очевидно, что они делают это; но почему индустрия разработки программного обеспечения создает так много дикого, сложного и нечитаемого кода? Почему это продолжается даже после того, как, казалось бы, разработчики должны были извлечь урок из первого негативного опыта? Что заставило программистов не просто написать плохой код, а продолжать делать это снова и снова?


Чтож, это было загадкой для меня, но я как-то не особенно волновался из-за этого по началу. Сама идея, что «плохие программы появляются из-за плохих программистов» настолько проста и очевидна, что послужила основой для целого исследования в области программирования, которое в итоге возымело неплохие результаты (которые, во основном, описаны в этом блоге, а также является предметом книги, которая сейчас в процессе написания). Проблема была определена (плохие программисты, которые создают сложности), и, на первый взгляд, у нее имелось решение (создать правила разработки ПО, которые предотвратят это), и мне этого было достаточно.


Но мне по-прежнему не давало покоя то, что университеты с мировым именем, технические школы и образовательные программы выпускают таких ужасных программистов, несмотря на десятки лет опыта в преподавании техник разработки ПО. Конечно, множество принципов дизайна программ никогда и не были конфиденциальными, и множество хороших советов просто находятся рядом, и многие из них имеют очень общий характер. Даже если люди не ходили в школу, неужели они не прочли ни одного такого совета?


Чтож, правда была за пределами моего воображения, и потребовалось почти пять лет работы в Bugzilla Project с участием огромного количества разработчиков для того, чтобы в один прекрасный день я вдруг осознал ужасающий факт:


Подавляющее большинство (90% или более) программистов не имеют ни малейшего представления о том, что они делают


Не то, чтобы они ничего не читали про разработку ПО (хотя скорее всего нет). Не то, чтобы языки программирования были слишком сложными (хотя это так). Дело в том, что большинство программистов не имеют ни малейшего понятия, что они на самом деле делают. Они просто подражают ошибкам других программистов – копируя код и печатая более-менее осмысленные заклинания на компьютере в надежде, что оно будет вести себя примерно так, как они ожидают, не имея при этом реального понимания ни механики компьютера, ни принципов разработки ПО, ни значения каждого отдельного слова и символа, которые они вводят в компьютер.


Это смелое, шокирующее и оскорбительное заявление, но мой опыт его подтверждает. Я лично просмотрел и оценил код десятков программистов. Я читал код многих других. Я говорил со многими и многими программистами о разработке ПО, и читал статьи сотен разработчиков. Количество тех, кто действительно понимает, что они делают, составляют лишь около 10% ото всех программистов, с которыми я когда-либо говорил, работал, или о ком слышал.


Разработчики open source – это лучшие из лучших; это люди, которые хотят программировать даже в свободное время. И даже тогда я бы сказал, что только примерно 20% из разработчиков open source действительно хорошо разбираются в том, что они делают.


Но почему же так? В чем же проблема? Как может быть так, что в этой отрасли работает так много людей, которые не имеют понятия, чем же они занимаются?


Чтож, похоже на то, что они в каком-то роде «глупые». Но что такое глупость? Люди не становятся глупыми только потому, что не знают чего-то. Есть много всего, что знает далеко не каждый. Но это не делает их глупыми. Это делает их невежественными касательно определенных вещей, но не глупыми. Нет, глупость, настоящая глупость – это значит не знать о том, что ты чего-то не знаешь. Глупые люди думают, что они знают что-то, хотя они этого не знают, или не догадываются о том, что область знания намного более широка, чем они думают.


Эта «глупость» — то, что можно обнаружить практически в любой области, и разработка ПО не исключение. Многие программисты просто не догадываются, что могут быть некие законы или общие принципы разработки ПО, поэтому они даже не пытаются найти их. Во многих софтверных компаниях не предпринимается никаких попыток улучшить понимание разработчиками языков программирования, которые те используют. Возможно, это происходит потому, что руководство считает, что программисты должны «и так знать все это, раз их наняли чтобы это делать».


К сожалению, такой взгляд вреден при разработке ПО, потому что, если ты хочешь быть действительно хорошим программистом, тебе нужно знать очень много. Любой, кто считает, что он знает все (или у кого есть «слепое пятно», из-за которого он не видит, что еще есть чему поучиться) – марает свой идеальный код в отсутствии знаний – знаний, о существовании которых они и не знают, и даже не догадываются о самом факте недостатка знаний.


Неважно, сколько ты знаешь, всегда есть что-то еще в любой области, и программирование – не исключение. Так что думать, что ты все знаешь – это всегда неверно.


Иногда сложно определить, что вообще нужно изучать. Данных так много, но с чего же начать? Чтобы помочь в этом, я придумал пару вопросов, которые нужно задать себе или другим, чтобы разобраться, какие области требуют дополнительного изучения:


  • Знаешь ли ты все, что можно, про каждое слово и каждый символ на каждой странице своего кода?
  • Прочел ли ты и полностью понял документацию к каждой функции, которую используешь?
  • Обладаешь ли ты превосходным представлением о базовых принципах разработки ПО – настолько хорошим, что ты мог бы объяснить его начинающим программистам в своей организации?
  • Понимаешь ли ты, как функционирует каждый компонент компьютера, и как они работают вместе?
  • Понимаешь ли ты историю развития компьютеров и то, как они будут развиваться дальше, чтобы понять, как твой код будет исполнен на компьютерах, созданных в будущем?
  • Знаешь ли ты историю языков программирования, чтобы понимать, как язык, который ты используешь развивался, и почему он работает именно так?
  • Понимаешь ли ты другие языки программирования, другие подходы к программированию и типы компьютеров, отличные от того, что ты используешь, чтобы понимать, какой инструмент лучше всего подходит для каждой задачи?
  • Сверху вниз перечислены наиболее важные для программиста вещи, чтобы понимать, какой код он пишет. Если ты можешь честно ответить «да» на все эти вопросы, то ты определенно прекрасный программист.

Возможно, длина списка выглядит угнетающе. «Ого, читать документацию к каждой функции? Да это займет кучу времени!». Окей, а вы знаете, что еще займет кучу времени? Стать хорошим программистом, не читая документации. И знаете сколько? Вечность, потому что этого никогда не произойдет.


Ты никогда не станешь хорошим программистом, просто копируя чужой код и молясь, что он заработает у тебя. Но что важнее – инвестировать время в обучение и значит становиться хорошим [программистом – прим. переводчика]. Время, потраченное сейчас, сделает тебя намного более быстрым программистом в будущем. Если ты потратишь много времени на чтение в течении первых трех месяцев изучения новой технологии, то, вероятно, ты будешь в 10 раз быстрее на протяжении следующих 10 лет, чем если бы ты просто бросился применять ее, ничего не читая.


Хочу сразу уточнить – конечно, не получится просто читать три месяца и стать хорошим программистом. Во-первых, это слишком скучно – никто не хочет зубрить теорию три месяца, не имея никакой практики. Мало кто сможет заниматься этим достаточно долго, чтобы вообще стать программистом, не говоря уже о том, чтобы сразу хорошим. Так что, хочу сразу отметить, что понимание появляется из практики, а не только из теории. Но без изучения теории понимание может вообще не появиться. Так что важно найти баланс между практическим программированием и изучением теории.


Я тут не нападаю на какого-либо программиста, с кем я работал лично, или на какого-то определенного программиста вообще. Я восхищаюсь почти каждым программистом, которого я когда-либо знал, как личностью, и я ожидаю, что буду восхищаться остальными, если повстречаюсь с ними. Вместо этого я призываю всех программистов открыть свой разум для нового, для того, что всегда есть какие-то новые знания, что теория и практика являются ключом к мастерству, и что нет ничего постыдного в том, чтобы чего-то не знать – если ты знаешь о том факте, что ты чего-то не знаешь. Просто найди время, чтобы узнать это, когда необходимо.


От переводчика: я старался переводить в литературном стиле, так что, возможно, какие-то высказывания или идеи из оригинала были искажены из-за стремления сделать перевод более читабельным. Если это так, просьба не гнать ссаными тряпками, а написать в личку.

Tags:
Hubs:
+3
Comments 60
Comments Comments 60

Articles