Всем привет! Сегодня я хочу поделиться своими размышлениями в виде эдакой краткой заметки о том, каким должен быть идеальный новичок-программист с точки зрения такого ментора, как я.
Введение
На берегу хочу сделать пару небольших уточнений:
- В данной заметке затрагиваю только ключевые (с моей скромной точки зрения) софт- и хард-скиллы, если новичок соответствует половине (или больше) из них, то в целом работать с таким начинающим специалистам в разы проще и приятнее.
- Всё, что описано ниже, сказано с точки зрения моей профессиональной деформации. В основном, мне приходится работать с разработкой и сопровождением бэкенд-приложений, контейнеризацией и нейронными сетями (имея при этом за плечами опыт сетевой инженерии и системного администрирования). Поэтому возможно, не всё из того, что я написал, будет актуально, например, для фронтенд-разработчиков или системных администраторов.
И так, продолжим.
Каждый ментор мечтает о новичке, который быстро адаптируется, учится на своих ошибках и активно участвует в процессе разработки. Но какие навыки и качества должен иметь такой новичок?
1. Умение искать информацию
Первое и, возможно, самое важное - это умение читать документацию, гуглить и уточнять у таких инструментов, как GigaChat, ChatGPT и т.д. Ведь информация - это ключ к решению большинства проблем.
Вспомнилась забавная история, во времена когда я ещё учился в ростовском колледже связи и информатики, мой дипломный руководитель как-то сказал (в ответ на вопрос почему нас обучают устаревшим технологиям) на одной из лекций, что учебные заведения учат студентов не столько технологиям сколько навыку искать информацию об этих технологиях.
Поэтому если я и соглашаюсь менторить с джуна, то как минимум ожидаю от него наличие навыка искать информацию и ответы на свои вопросы самостоятельно и приходить ко мне за помощью только если ничего подходящего найти не удалось.
2. Работа с Git и его интерфейсами
Безусловно, новичок в ИТ должен уметь работать с git (желательно консольной его версией, но есть и графически версии типа GitHub Desktop, GitKraken и прочие интерфейсы, например встроенные в IDE), понимать основы веб-интерфейса GitHub/GitLab или других графических систем контроля версий.
Как минимум нужно уметь пользоваться всего несколькими командами:
- git pull - подтянуть изменения из репозитория
- git branch - отображение всех локальных веток
- git branch название_ветки - создание ветки
- git checkout название_ветки или git switch название_ветки - переключением между ветками (вместо ветки можно указать тег или хеш-сумму коммита)
- git add название.файла - добавление файла в очередь на коммит
- git commit -m 'описание коммита' - зафиксировать (закоммитить) изменения и описать их неким текстом
- git push - отправить коммиты на сервер
- git push -u origin название_ветки - отправить коммиты на сервер в указанную ветку (например если отдельная ветка проекта была создана локально и в ней локально закоммичени правки)
Это минимальный набор команд Git который нужно знать, чтобы эффективно выполнять работы связанные с сопровождением некоей кодовой базы.
Желательно также иметь представление о том что такое GitFlow и как в мире ИТ принято организовывать процедуры связанные с управлением кодовой базы проекта в больших командах, само собой если над проектом работает 1-2 человека это не суть важно, но если в команде 10 или даже больше человек, то без процедур связанных с GitFlow обойтись крайне сложно или даже почти невозможно.
3. Docker и CI/CD
Современная разработка немыслима без Docker, Docker Compose и самое главное описания и понимания того как работают Dockerfiles, желательно понимание того что такое Docker Registry. Кстати, про основы Docker у меня в блоге есть соответствующая публикация. Не обязательно уметь в совершенстве владеть этими технологиями, но хотя бы иметь базовое понимание и уметь найти решение нужной проблемы в официальной документации проекта.
Также новичку желательно уметь разобираться в основах CI/CD, пощупать какие-нибудь популярные системы наподобие Jenkins или GoCD, чтобы понимать, как происходит процесс развертывания и тестирования кода.
4. Паттерны, парадигмы и принципы разработки
Понимание основ организации процессов разработки и опыт их применения, даже в хобби-проектах на GitHub, будет большим плюсом для ментора. Это позволяет ментору лучше понимать, как объяснить новичку, как организован (или должен быть организован) проект, над которым новичку предстоит работать.
Под основными парадигмами имею ввиду конечно же ООП, ФОП, а под основными принципами разработки: KISS, DRY и SOLID, желательно запомнить расшифровку этих акронимов и хотя бы раз в жизни написать пару строчек используя один из этих принципов. Ещё полезно знать про такие методологии разработки, как TDD и Agile, хотя бы в виде теоретической части.
Лично я ради забавы в OpenSource периодически практикуюсь в разработке используя те или иные методологии, парадигмы и принципы, это позволяет оттачивать навык на практике и не забывать основы.
5. Самостоятельность в решении проблем
В первом пункте этой заметки я вскользь затронул тему самостоятельности, но сейчас хочу чуть более развёрнуто расписать.
Менторы ценят новичков, которые пытаются решить проблему самостоятельно, прежде чем задать вопрос. Но при этом, вопросы должны быть грамотными и продуманными.
Хороший джун (с моей скромной точки зрения), если сталкивается с некоторой проблемой в проекте, прежде всего пытается провести некоего рода аналитическое исследование и попробовать найти решение (или несколько), пусть даже не самое подходящее, но самостоятельно.
В случае если найти решение не удалось, хороший новичок пишет мне сообщение, например содержащее в себе проблему и место где она возникла, кратко описывает как воспроизвести и описывает решение (решения), которые он попытался реализовать, но не достиг желаемого результата.
Почему это важно, очень часто, новички в процессе поиска решения, находят решения проблемы с которой они столкнулись, задача ментора в таком случае сводится к тому чтобы прокоментировать насколько данное решение подходит с точки зрения особенностей проекта.
6. Умение принимать критику (обратная связь)
Конструктивная критика - это инструмент роста. Новичок должен уметь анализировать замечания и работать над их устранением. Это особенно важно, когда джун только-только приходит в команду и ещё не понимает многих тонкостей работы с кодовой базы и иерархии в команде.
Допустим возникает какая-то ошибка, но решение, которое новичок предложил приводит к ещё большим проблемам проекта, хотя первоначальную задачу и решает. Ментор проверяет полученное решение и комментирует ситуацию, мол так и так, решение в целом нормальное, но тут и тут желательно выполнить улучшение. Часто бывает что это превращается в feedback loop (повторяющаяся петля улучшения, ревью и обратной связи), иными словами новичок не понимает, что от него хотят, либо же невнимательно читает документацию, или не задаёт уточняющих вопросов, что лично мне не очень нравится.
7. Понимание сложности кода
Хотя бы базовое понимание того что такое Big O нотации (а тут в контексте программирования), того как происходит оценка сложности алгоритмов и стремление к тому, чтобы код был простым и понятным, безусловно, важно, но пожалуй это не стоит прямо таки требовать это от начинающих программистов, однако, всегда приятно общаться с новичком который как минимум читал литературу на эту тему.
8. Простота и четкость PR
Хороший PR - это PR, который решает одну конкретную задачу. Название и описание такого PR должны быть понятными и информативными. Когда вы создаете PR, рекомендуется указывать номер задачи из Jira или другой системы учета задач, а также предоставлять заголовок, который напрямую связан с этой задачей.
В описании PR стоит кратко перечислить основные изменения и места их применения, а также объяснить, каким образом эти изменения решают поставленную задачу. Да, со временем вы станете более опытным и такие детали могут казаться избыточными, но для новичков такой подход поможет лучше структурировать свою работу и понимать ее значение.
9. Основы для успешного старта
Особняком хочу заметить, что для любого начинающего программиста желательно иметь базовые навыки работы с операционными системами семейства Linux и понимание принципов работы сетевого стека, а также ключевых сетевых сервисов, таких как DNS, iptables, CIRD и того как работает роутинг, это своего рода почва из которой произрастает вся ИТ флора.
Кроме того, знание английского языка играет важную роль. Однако, если у новичка возникают трудности с английским, существуют инструменты, такие как Yandex.Браузер, который предлагает автоматический перевод веб-страниц, облегчая доступ к мировым знаниям.
Заключение
Быть новичком - это не просто. Но если вы освоите эти навыки и качества, ваш путь в профессиональном мире разработки будет гораздо проще и приятнее. Надеюсь, моя статья поможет вам в этом!
Ну а я буду закругляться, благодарю за прочтение этой маленькой заметки, подписывайтесь на мой Telegram-канал, жмите кнопки, задавайте вопросы.
К тому же, если вы хотите поддержать мои усилия и вклад в развитие общества знаний, вы можете сделать пожертвование на CloudTips. Ваша поддержка поможет мне продолжать свою работу и делиться новыми открытиями с вами.
До встречи в следующей публикации!