Перевод статьи «5 Unexpected Skills to Master as a Beginner Software Engineer».
Путь становления разработчика-самоучки долог и труден. Иногда, вспоминая все препятствия и разочарования, с которыми мне довелось столкнуться на этом пути, я спрашиваю себя, а стоило ли вставать на него. И конечно, отвечаю себе, что дело того стоило.
Для людей вроде меня, т.е. начинающих с нуля, кривая обучения очень крутая. Но я уверена, что в долгосрочной перспективе выгоды перевешивают усилия, которые нужно затратить для покорения этой горы. Конечно, это касается только тех случаев, когда вам в принципе нравится то, что вы изучаете.
Мне потребовалось несколько лет, чтобы понять: хороший разработчик должен уметь не только быстро и легко писать код. Многие новички не осознают, что освоение основ разработки предполагает нечто большее, чем умение написать и запустить программу.
Итак, вот еще пять навыков в дополнение к кодингу, которые точно понадобятся каждому начинающему разработчику!
1. Умение пользоваться инструментами для совместной работы
Многие популярные платформы для самостоятельного изучения программирования фокусируются на синтаксисе языка и структурах данных. Некоторые из них позволяют учащимся создавать базовые проекты с нуля. Скажем, игру в крестики-нолики или простое приложение для составления списка задач. Эти уроки неоценимы для начала овладения навыками программирования, но они не имитируют среду, в которой вы реально будете работать.
Над крупными проектами разработчики работают совместно, причем порой разработчик может участвовать в работе над несколькими кодовыми базами одновременно. В командной работе часто используют специальные инструменты, например таблицы Google или Invision. У команд разработчиков есть свой собственный стандартный набор инструментов для совместной работы. В моей компании, как и в десятках тысяч других компаний США, используется GitHub.
Я никогда не забуду день, когда мои коллеги познакомили меня с GitHub. Сначала мне сказали открыть терминал моего компьютера (а я даже не подозревала, что у меня в компьютере есть что-то подобное). Затем коллеги начали набирать какую-то абракадабру в этом загадочном окне на моем экране. Эта абракадабра казалась мне каким-то страшным «колдунством». В моем компьютере внезапно возникло несколько папок со всевозможными файлами, полными кода. Коллеги говорили о «ветках» и «пушах», о чем-то «удаленном». И казалось, что буквально все слова начинаются с приставки «git». Я знала, что они говорят по-английски, но смысл их слов от меня ускользал.
Если вы начинающий разработчик, которому при работе над проектами никогда не приходилось сотрудничать с другими людьми, вам придется изучить язык и инструменты для совместной работы. Это может показаться сложным, особенно если вы никогда не имели дела с командной строкой на своем компьютере. Но со временем все это войдет в привычку.
2. Ведение логов и обработка ошибок
Допустим, вы уже научились сотрудничать с другими программистами, и ваш код отправляется в продакшен. Когда то, что вы написали, используется тысячами или даже миллионами пользователей, это вызывает поистине потрясающие чувства. Но, дойдя до этой стадии, вы на собственном опыте узнаете, что непредвиденные ошибки в коде случаются постоянно.
Скажем, созданная вами переменная так и не получила значение. Теперь вы вызываете метод со значением «nil», а ваша программа не знает, что с этим делать. Она ломается, и теперь пользователь больше не имеет доступа к той потрясающей странице, которую вы создали. Когда вы проверяете работу программы, все кажется правильным, поэтому проблему вы можете даже не заметить. Возможно, эта конкретная ошибка возникает только в 5% случаев, но 5% от 100 000 пользователей это существенно.
Вам нужно научиться логировать, обрабатывать и предвидеть ошибки в вашем коде: это совершенно необходимые навыки для разработчика. Да, умение предвидеть проблемы — это чутье, которое развивается со временем и опытом. Но новичку важно помнить о том, что ошибки — это практически неотъемлемая составляющая разработки. Умение окружать свой код различными логами может избавить вас от головной боли в будущем, особенно когда у вас возникнет какая-то проблема и вам придется заняться отладкой. Кроме того, логирование может помочь выявить проблемы, о которых вы даже не подозревали.
Сегодня нам доступны различные инструменты для ведения логов, позволяющие легко отслеживать ошибки в кодовой базе. Один из моих любимых — Sentry, при помощи которого можно увидеть, когда проблема возникла впервые и как часто она возникает. Также стоит упомянуть Logentries, Rollbar и Instabug. Есть программы, отслеживающие скорее общесистемные данные и проблемы, например New Relic и Datadog. Скорее всего, в своей карьере разработчика вы столкнетесь с некоторыми комбинациями подобных программ, и стоит научиться пользоваться ими.
3. Покрытие тестами
Как я уже говорила, оттачивание навыков программиста — это больше, чем выдача кода на-гора. Вы должны следить за качеством. Ваш код должен быть понятен другим разработчикам, и когда кто-то откроет его спустя два года, этот человек должен иметь возможность быстро вникнуть в суть дела и приступить к своим правкам. Логика, которую вы пишете, должна быть понятной и пригодной для повторного использования в течение нескольких лет.
Но иногда ваша логика будет сложной, и упростить ее не удастся. Возможно, из-за сложности бизнес-логики. Возможно, из-за нехватки времени. Реальность работы разработчика такова, что у вас будут дедлайны, вы порой будете вынуждены принимать далеко не идеальные технические решения и к тому же на момент начала работ у вас не всегда будут четко определенные use cases.
Один из способов подстраховать свой код — писать не только нужные изменения, но и тесты для них. Для тестирования вы можете установить специальные пакеты (они доступны для большинства языков). Например, для Ruby мы используем Rspec, а для React часто используется Jasmine. Существуют различные типы тестов, включая модульные (для тестирования небольших участков логики) и интеграционные (для сквозного тестирования потоков). Зачастую для того, чтобы ваш код был отправлен в общую кодовую базу, он должен пройти весь набор тестов. Научившись их писать, вы сможете создавать своеобразные «предохранители», которые не дадут случайно перезаписать написанные вами функции при будущих изменениях.
Покрытие тестами также помогает определить ожидаемое поведение, поскольку многие тестовые случаи пишутся простым английским языком. Не могу передать, сколько раз я заходила в какой-нибудь файл, написанный несколько лет назад, вносила изменение — и оказывалось, что из-за него проваливается с десяток тестов, хотя мне казалось, что я хорошо поняла ожидаемое поведение. Однажды я даже сломала функционал, который сама же и написала несколько месяцев назад. К счастью, это сразу выявили мои модульные тесты.
Просматривая пул-реквесты, я замечаю, что разработчики часто не уделяют должного внимания покрытию тестами, причем это касается как простых, так и сложных изменений. Я сама грешу подобным, особенно когда сроки поджимают. Но я могу сходу припомнить несколько проектов, в которых внесение правок в одном месте привело к поломкам в четырех других местах. Это увеличило уровень стресса и добавило нам работы, а ведь мы и так спешили, чтобы успеть к дедлайну. Подобных ситуаций можно было бы избежать, если бы мы в свое время нашли время на написание модульных тестов. Научиться их писать может быть утомительной задачей, особенно для начинающего разработчика, а их написание определенно замедляет общий процесс разработки. Но чем раньше вы начнете писать тесты, тем меньше головной боли ожидает вас и вашу команду в будущем.
4. Ревью кода
Этот пункт связан с самым первым — о совместной работе над кодовыми базами. Часто процесс внесения изменений в кодовую базу выглядит следующим образом. Вы локально пишете какой-то код. Чтобы отправить его в основную ветку вашей кодовой базы, вы создаете «пул-реквест» или визуальную сводку своих изменений, а другие разработчики в вашей команде просматривают ваш код, прежде чем дать добро на слияние. У разных команд разные требования к одобрению пул-реквеста, но в целом стоит ожидать, что ваши изменения будет запускать хотя бы один другой разработчик в вашей команде.
Стоит отметить, что вы будете не только свой код отправлять на проверку, но и чужой просматривать. Научиться читать чужой код — важный навык для разработчика, его нужно развивать на протяжении всей вашей карьеры. Когда я только начинала и меня просили просмотреть чужие пул-реквесты, я не совсем понимала, что нужно искать. Сначала я думала, что должна искать баги. Прошло несколько лет, и теперь я считаю код-ревью скорее проверкой работоспособности, чем тщательным исследованием. В конечном итоге именно разработчик, приславший пул-реквест, ответственен за проверку своего кода, добавление нужных тестов и безопасное внесение этого кода в общую базу. Выявление скрытых проблем не является непременной обязанностью ревьюера.
Сегодня, проводя ревью кода, я обращаю внимание на читаемость (например, являются ли эти имена переменных и методов описательными), организацию и структуру (можно ли лучше организовать код, чтобы он был понятнее для того, кто увидит его впервые). Конечно, чем лучше вы познакомитесь с кодовой базой, тем легче вам будет выявить любые потенциальные проблемы. Но начать приобретать навыки проверки кода вы можете, даже будучи джуниором. Помимо всего прочего это также хороший способ познакомиться с шаблонами кода, которые используют ваши старшие и более опытные коллеги.
5. Правильный поиск в Google
Ни один разработчик не знает всего о программировании, своем языке программирования или даже о своей кодовой базе. На старте своей карьеры я была уверена, что все, кроме меня, сразу могут понять, какие методы, запросы и стратегии нужно использовать в том или ином случае.
Но с чем большим числом людей мне случалось программировать в паре, тем больше я понимала, насколько часто разработчики ищут ответы на свои вопросы в Google. Даже опытные! В нашей сфере деятельности слишком много деталей, чтобы их можно было удержать в уме. Вскоре мне стало ясно, что от меня требуется не выучить все наизусть, а научиться правильно задавать вопросы.
Stackoverflow станет вашим лучшим другом. Скорее всего, если вы в чем-то застряли, кто-то еще уже застревал там раньше. Когда дело доходит до решения проблем, постарайтесь точно определить, что именно идет не так, выразить это словами и ввести эти слова в поисковике. Умение формулировать проблемы, с которыми вы сталкиваетесь, поможет вам в разы больше, чем заучивание.
Заключение
Рано или поздно на своем пути в сфере разработке программ вы непременно переживете ряд огорчений. От этого никуда не деться. Но чем активнее вы будете использовать инструменты и стратегии, созданные для облегчения неприятностей, тем лучшим разработчиком вы станете и тем более плодотворной будет ваша карьера. Не сворачивайте с выбранного курса и не сдавайтесь.
[customscript]techrocks_custom_after_post_html[/customscript]
[customscript]techrocks_custom_script[/customscript]