На ум сразу приходит ответ — хороший программист тот, который пишет хороший код. Это так, но лишь отчасти. Дело в том, что «хороший программист» — комплексное понятие и код — лишь одна из составных частей. Что же действительно важно? Умение коммуницировать, умение принимать/передавать информацию от других людей (другим программистам, заказчикам, подчиненным и т.д.). И никакие hard skill, никакие фреймворки вам не помогут, если вы не умеете нормально донести свою мысль, объяснить.
Как оценивают?
Оценивать вас будут не только по хорошему коду. Но и по умению работать в команде, соответственно — коммуницировать. Прошло то время, когда можно было закрыться в гараже и пилить гениальную программу. Сейчас так не работает. Даже если вы допускаете оплошности в коде, но умеете работать в команде — вас будут ценить гораздо больше, чем если бы вы просто писали отличный код.
Сколько раз была ситуация, когда код был прекрасным, но не соответствовал требованиям заказчика. Да, конечно, код хороший, но заказчик то хотел по-другому. А вы это не услышали. Или не спросили. Или не смогли объяснить, как это должно работать.
Да, у программистов есть такое представление, что всеми вопросами по проекту занимается PM. Отчасти это верно, но не все так просто. Часто PM выступает со стороны заказчика. В аутсорсе это очень распространенная история. В этом случае вы или ваша команда оказываетесь в прямом подчинении заказчика, без буфера в виде PM. Соответственно, вы напрямую отвечаете перед клиентом. Даже в том случае, если PM с вашей стороны, очень велика вероятность, что обращаться к вам будут напрямую, или что вы будете докладывать о результатах работы на общих митингах команды с заказчиком.
Поэтому все сводится к одному — хороший программист тот, который умеет хорошо коммуницировать и выполнять задачу так, как этого хочет клиент.