The Joy of Programming

The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:

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

Много лет назад я был на собеседовании в качестве кандидата. Им требовался веб-архитектор, и я разговаривал с их техническим директором. Он попросил меня объяснить, что происходит за кулисами, когда мы вводим новый URL в веб-браузер и нажимаем “Ввод”. Я нарисовал ему небольшую диаграмму с регистратором доменов, несколькими DNS-серверами, балансировщиком нагрузки, несколькими HTTP-серверами, несколькими базами данных и несколькими IP-ретрансляторами посередине. Я верю, что его ответ впечатлил (хотя они меня тогда не наняли), и он сказал мне, что большинство веб-разработчиков не понимают большую часть этой картины. По его словам, они знают только, как работают HTTP-серверы, мало заботясь о всем остальном. Большинство из них даже не знают, что такое HTTP, пока PHP-код работает так, как задумано.

Я вспомнил это интервью и начал задавать подобные вопросы людям, которых я интервьюировал позже, будучи техническим директором своей собственной компании и архитектором на нескольких других проектах. Его выводы подтвердились. Действительно, большинство программистов не понимают, например, как работает DNS и для чего он нужен. Более того, им совершенно нормально без этой информации. Это значит, что они плохие программисты?

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

  • Угадывание. Я начинаю вносить изменения в простой код, который только что скопировал и вставил, и делаю некоторые предположения о логике, лежащей в его основе. Я не знаю, как разработаны продукты, которые я использую, но мне нужно полагаться на что-то. Итак, я полагаюсь на то, что могу угадать.

  • Разочарование. Очевидно, большинство моих предположений ошибочны. Я начинаю искать в Google и на Stack Overflow. Получаемые мной ответы (если я их получаю вообще) не особо помогают, поскольку я все еще не представляю общую картину, и лучшее, что я могу сделать, это исправить свой код, исходя из советов, которые я получаю из случайных источников. Но я все еще нахожусь в темноте и общая концепция дизайна все еще не ясна. И я все еще надеюсь решить все это, не читая полный руководство разработчика.

  • Депрессия. Очень скоро понимаю, что я всего лишь обезьяна, пытающаяся запустить самолет. Может быть, он полетит, и, возможно, мне удастся даже приземлиться. Но я все равно остаюсь обезьяной, и это очень депрессивно. Мне не приносит радости то, что я делаю. Я ненавижу себя за свою глупость. Я ненавижу создателей библиотеки за то, что они сделали ее использование неочевидным. И я ненавижу свою работу.

Я считаю, что эти четыре фазы очень распространены для всех нас, программистов. Однако то, что происходит после, отличает хороших программистов от плохих. Честно говоря, я принадлежу и к одной, и к другой категории, в зависимости от ситуации. Что я делаю, когда я плохой программист? Я заставляю все работать и называю это концом рабочего дня, все еще не имея представления о том, что происходит внутри и почему это работает так, а не так, как я пытался раньше. Моя депрессия никуда не исчезает. Она только усиливается. Я все еще ненавижу себя, но мое программное обеспечение работает. Я перехожу к следующей проблеме, ожидая наступления выходных.

Что я делаю, когда я хороший программист? Я погружаюсь глубже в проблему, изучаю используемое мной программное обеспечение, загружаю его исходный код, читаю его документацию, пока не пойму, что происходит. Затем я возвращаюсь к своей части кода, исправляю его с полным пониманием и заканчиваю рабочий день. Иногда я даже пишу блоговую запись об этом, например, об этом для Nutch, об этом о Liquibase или об этом о CasperJS. Моя депрессия полностью исчезает. Я больше не ненавижу себя, не ненавижу свою работу и не ненавижу разработчиков этих “глупых” библиотек. Я даже помогаю их проектам своими блоговыми записями.

Как я решаю, каким путем идти: вести себя как плохой программист или как хороший? Вы можете подумать, что это зависит от времени/бюджета, которые у меня есть на текущую задачу, но вы ошибаетесь. Это полностью зависит от моей готовности жить в депрессии.

Некоторое время назад я сказал себе, что больше не буду так делать. Я не хочу быть обезьяной, управляющей самолетом. Я хочу быть пилотом. Конечно, кривая обучения будет длиннее, но результат - радость. Мне нравится моя работа, когда я ясно и прозрачно вижу логику каждой строки кода, которую пишу. Я точно знаю, почему пишу их, что они делают и что произойдет, если я их изменю. Конечно, я не знаю всех деталей, но я знаю, где щелкнуть, чтобы найти эти детали. Именно это делает мою работу интересной для меня: прозрачность моей логики кодирования.

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

Теперь вернемся к моему выступлению на конференции. Я собираюсь показать этот код на одном из своих слайдов (так Spring Framework предполагается использовать):

Затем я задам вопрос: знаете ли вы, кто создает экземпляр класса HelloController и как этот экземпляр используется? Кто вызывает его методы, почему и когда? Кроме того, вы знаете, как изменить это поведение? Моя точка зрения на конференции будет в том, что хороший фреймворк должен упростить понимание его внутренностей пользователям. Потому что хорошие программисты хотят знать, что находится внутри. Плохие программисты, с другой стороны, удовлетворяются тем, что являются обезьянами, управляющими самолетами.

Translated by ChatGPT gpt-3.5-turbo/42 on 2023-12-17 at 15:48

sixnines availability badge   GitHub stars