Как стать хорошим программистом?

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

how-people-see-programmers

 

1. РАЗЛОЖЕНИЕ ЗАДАЧИ НА СОСТАВЛЯЮЩИЕ

Суть программирования заключается в решении задач. Но перед тем, как начать писать какой-либо код, необходимо четко понять, как решать задачу. Одно из качеств, которым обладают хорошие программисты — это способность разбивать задачу на  меньшие составные части, пока для каждой из них не будет найдено простое решение. Но найти способ решения задачи недостаточно. Хороший программист находит способ смоделировать задачу таким образом, чтобы получившуюся программу было легко обсуждать, легко реализовать и легко тестировать.

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

Именно поэтому в их коде было тяжело разобраться. Когда задача грамотно смоделирована, нельзя не согласиться с Берни Коселлом (давшем интервью для непревзойденной книги Coders at Work):

…существует очень мало программ, сложных по своей природе. Если вы смотрите на фрагмент кода, и он выглядит очень сложным  – если вы не понимаете, что он должен делать – в большинстве случаев это будет знаком того, что он недостаточно продуман. И в этом случае вы не закатываете рукава и не садитесь за его исправление; вы делаете шаг назад и обдумываете его еще раз. И как только вы продумаете его достаточно тщательно, вы поймете, что на самом деле он прост“.

2. АНАЛИЗ СЦЕНАРИЕВ

Хорошие разработчики учитывают различные сценарии выполнения программы. Это касается как ее логики, так и внешних/внутренних событий, которые могут произойти. Чтобы обдумать различные пути  работы логики, они задают вопросы, вроде: Что произойдет, если этот аргумент будет иметь значение null’? Что, если ни одно из этих условий не будет верным? Является ли этот метод поточно-ориентированным? Чтобы понять, какие типы событий должно обрабатывать это ПО, они задают вопросы: Что, если эта очередь заполнится? Что, если на этот запрос не придет ответа? Что, если второй сервер перезапустится во время перезапуска этого сервера?

Хорошие программисты спрашивают себя: Как это может сломаться? Другими словами, они умеют мыслить, как тестеры. В свою очередь, неопытные программисты чаще всего обдумывают только «удачный путь» — типовой алгоритм управления, когда всё идет так, как задумано (что чаще всего и происходит). Но, конечно же, рано или поздно дело принимает неожиданный оборот, и программа должна быть в состоянии справиться с подобными трудностями. 

3. ПРИСВАИВАНИЕ ИМЕН

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

Но придумать подходящее имя не так легко, как кажется. Я всегда вспоминаю эту цитату (Фила Карлтона): В компьютерных науках есть всего 2 сложные задачи: инвалидация кэша и присваивание имен.”  Сложность, в частности, заключается в том, что необходимо четко представлять себе, что стоит за каждым из имен. Иногда представить это сразу невозможно, но всё проясняется по ходу разработки. И поэтому переименование так же важно, как и именование.

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

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

 4. ПОСЛЕДОВАТЕЛЬНОСТЬ

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

Последовательность должна быть повсеместной. Это касается имен переменных и их группирования, присваивания имен методам, разделения на модули, структуры директорий, GUI, обработки ошибок, протоколирования, документации и т.д. Например, если какие-то переменные связаны друг с другом и встречаются рядом (в объявлениях, вызовах методов или в виде полей в базе данных), всегда используйте их в одном и том же порядке. В этом случае будет проще обнаружить отсутствие одной из них или их случайную перестановку. Если речь о какой-либо операции, то назвав ее delete в одном месте, не называйте ее remove в другом – придерживайтесь одного имени. В своей книге «Code Complete» Стив МакКоннелл даёт хороший совет о педантичном использовании антонимов. Например, begin/end являются антонимами, как и start/stop. Не смешивайте имена из разных пар (к примеру, используя  begin/stop), если имеете дело с противоположными вещами.

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

5. ОБУЧЕНИЕ

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

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

ВЫВОД

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

Это были мои ответы на вопрос, как стать хорошим программистом. А что вы об этом думаете? Оставляйте своё мнение в комментариях.

 

Источник - Henrik Warne’s blog


Комментарии:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>