Для меня очень важно иметь возможность ответить на этот вопрос. Я хочу знать, где я нахожусь как программист, знать, чего мне не хватает и что у меня есть.

Есть много статей, пытающихся ответить на этот вопрос.

Большинство результатов поиска, которые я встречал (здесь, здесь, здесь, здесь), подчеркивают такие вещи, как отношение, общение, понимание бизнеса и личные интересы.

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

Программисты, по сути, просто решают проблемы, основным инструментом которых является написание кода.

Имея это в виду, вот четыре основных качества, которыми должен обладать хороший программист:

4. Предпочитает абстракции деталям, но может эффективно превращать абстрактные идеи в конкретную реализацию кода.

Указывает на способность сосредоточиться на том, что необходимо. Указывает на глубокое понимание.

Хороший программист может легко переключаться между схожими технологиями.

Маловероятно, что хороший программист, знающий Java, не сможет быстро переключиться на C# или наоборот. Точно так же разработчик, работающий в AWS, сможет переключиться на Google Cloud. Это ситуации типа potAYto/potAHto. И это только самый очевидный пример.

Хороший программист полагается на понимание, а не на память.

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

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

Знания программиста компактны, но путем рассуждений, поиска и игры он может вывести необходимые детали.

Хороший программист может отфильтровать шум и сосредоточиться на сигнале. Шум — это детали, а сигнал — основа.

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

Хорошему программисту не нужны подробные инструкции о том, как что-то построить, ему нужны только спецификации конечного результата.

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

Хороший программист хорош в тестировании черного ящика

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

Как можно проверить это качество?

Так как же убедиться, что человек хорошо разбирается в абстракциях и рассуждениях? Это именно те качества, на которые сегодня тестируется ИИ. Умение обобщать заданный текст. Возможность завершить последовательность. Возможность создать что-то на основе желаемых атрибутов. У вас может быть даже открытый вопрос, который в значительной степени зависит от рассуждений. Что касается «контроля» или системы отсчета, одним из способов может быть реальное соревнование с обобщателями ИИ.

3. Может работать независимо, но при этом быстро получать необходимую обратную связь.

Указывает на гибкость, приспособляемость, решительность и сосредоточенность.

Хороший программист изо всех сил старается сделать все самостоятельно, прежде чем обратиться за помощью.

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

Хороший программист знает, как не потеряться в море информации.

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

Хороший программист знает, как экспериментировать.

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

Как можно проверить это качество?

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

2. Может добиться цели. Может исправить вещи. В разумные сроки. Даже среди хаоса.

Указывает на способность концентрироваться, решать проблемы и работать.

Хороший программист добирается из точки А в точку Б.

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

Хороший программист не позволяет перфекционизму мешать.

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

Хороший программист избавит вас от отвлекающих факторов и препятствий.

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

Как можно проверить это качество?

Это качество можно проверить, попросив человека закончить задачу в заданные сроки, пытаясь отвлечь его.

1. Может сохранять концентрацию и мотивацию в течение очень долгого времени.

Указывает на возможность фокусировки.

Хороший программист должен понимать, почему он что-то делает.

Эффективный программист делает вещи в порядке их необходимости. Если вещи не нужны или не стимулируют, они просто не будут этого делать. И это здорово.

Хороший программист умеет оставаться сосредоточенным.

СДВГ — враг хорошего программиста, как и многозадачность. Умение делать что-то непрерывно, даже в течение 15–20 минут — фантастическое качество.

Хороший программист хорош в целенаправленной деятельности.

JIRA и Agile хороши в этом отношении. У вас есть задача с критериями приемлемости, вы проверяете ветку и решаете эту конкретную задачу. Это очень похоже на то, как работают квесты в ролевых играх. Как только вы закончите свой квест, вы получите небольшой прилив дофамина.

Хороший программист хорош в долгосрочной, а не в краткосрочной перспективе.

Доведение дела до конца — это скорее марафон, чем спринт, речь идет не о том, чтобы крутить колеса на максимальной скорости, а о том, чтобы выполнять задачу до тех пор, пока она не будет завершена.

Как можно проверить это качество?

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

Заключение

Я считаю, что перечисленные выше качества являются необходимыми атрибутами хорошего программиста. Я мог что-то упустить, но я считаю, что не ошибся, сделав ставку на те, которые я выбрал.

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