вторник, 17 декабря 2024 г.

[prog.thoughts] Программист: хороший, плохой, крутой. Что под этим вообще понимается?

Пост, можно сказать, в догонку к предыдущему. Решил порассуждать на вынесенную в заголовок тему, т.к. есть ощущение, что понятие "крутой программист" вряд ли как-то строго определено и каждый может понимать под этим что-то свое.

Но начну с определения "хороший программист". Хотя, полагаю, оно также нестрогое и допускает разные трактовки. Как по мне, хорошим можно считать программиста, который:

  • решает поставленную перед ним задачу (хотя и не обязательно "в лоб");
  • пишет работающий код;
  • этот работающий код оказывается протестированным;
  • этот работающий код содержит полезные комментарии;
  • этот работающий код не вызывает проблем при отладке, исправлениях и сопровождении;
  • этот работающий код был получен в приемлемые сроки, желательно в заранее оговоренные ;)
  • сделано это было по большей части самостоятельно, с минимально необходимыми обращениями за помощью/разъяснениями.

Соответственно, с плохим программистом все просто: это противоположность "хорошего программиста".

Плохой программист, решает вообще не ту задачу, написанный им код толком не работает (а то и не работает вовсе), в коде хрен разберешься, а изменить этот код сложнее, чем переписать. При этом плохой программист успевает задолбать всех вопросами "а как сделать вот это?" или "а правильно ли я делаю вот это?"

Так что, думаю, что с "хороший" и "плохой" все более-менее просто (хотя, т.к. это не количественные оценки, а качественные, то всегда остается вопрос того "а где же грань между хорошим и плохим?"). А вот что такое "крутой"?

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

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

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


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

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


И еще одно важное дополнение: иногда для понимания красоты и качества кода требуется хорошие знания как самого языка программирования, так и предметной области. Грубо говоря, в C++ несколько десятков строк с хардкорными шаблонами могут успешно заменять сотни строк "Си с классами", но чтобы разобраться с этой парой десятков строк могут потребоваться знания и навыки, которые приобретаются годами. Так что степень "хорошести", "плохости" и "крутизны" может зависеть от профессионального уровня оценивающего.

4 комментария:

OAV комментирует...

ИМХО, "крутой" - это кто умеет писать сложный код. Например, компилятор С++. Несмотря на то, что код gcc, читать невозможно.

eao197 комментирует...

@OAV: ну вот в том-то и дело, что уметь писать код (сложный или простой) недостаточно. Тут важно как быстро этот код появляется на свет, что он в итоге из себя представляет, насколько просто затем с ним работать... Ну или же понятие "уметь писать код" становится гораздо более объемным, чем я привык.

OAV комментирует...

"Уметь писать код" - набор навыков. Это уметь выполнять требования тз. Человек который это умеет - хороший программист. А человек который пишет "крутой код", но не укладывается в сроки - не очень. Это очень упрощено, с точки зрения руководителя. А еще есть "уметь писать код" в команде, тоже характеристика программиста, очень важная.
Это как определить, "уметь лечить", и что такое "хороший врач"?

eao197 комментирует...

@OAV: для меня "уметь писать код" -- это очень узкий набор навыков. Он точно не про выполнять требования тз или тестировать написанное. Это именно что про "писать код", т.е. из букв формировать слова (идентификаторы), из слов формировать текст (описание классов, тела функций/методов). К сожалению, даже это уже не всем дано.