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

**Навыки разработчиков программного обеспечения: различия между младшими и старшими специалистами**

Различие между старшими и младшими разработчиками программного обеспечения является неотъемлемой частью нашей работы и должностных обязанностей. Независимо от того, называем ли мы это начальным уровнем или как-то иначе, мы различаем людей, которые только начинают свою карьеру, и тех, кто уже имеет определённый опыт. Все мы продолжаем учиться (хотелось бы надеяться), но начинающие специалисты всё ещё осваивают основы, а старшие несут большую ответственность и имеют потенциал совершать более серьёзные ошибки.

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

**Навыки младших разработчиков программного обеспечения**

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

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

Конечно, индивидуальные различия также могут быть значительными: от самоучек, внёсших существенный вклад в проекты с открытым исходным кодом, до стажёров, которые могут не понимать разницы между JavaScript и React. Тем не менее, если мы будем честны в отношении навыков, которые мы ожидаем от младшего разработчика, этот список примерно отражает наши ожидания, не включая пятилетний опыт написания SQL.

**Навыки старших разработчиков программного обеспечения**

От старших разработчиков мы ожидаем:

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

**Языки программирования и алгоритмы**

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

Мы видим то же самое с человеческими языками: как только вы выучили один иностранный язык, выучить второй становится проще, а третий или четвёртый — ещё проще. Вы начинаете понимать, как работают языки. Сам язык не так важен, как умение быстро учиться. Опытные программисты также знают главную тайну языков программирования: они предназначены не только для общения с компьютерами, но и для общения с людьми. Компьютер не знает C++ и не заботится о том, на каком языке написано программное обеспечение — Java, Haskell или BASIC; независимо от того, как написано программное обеспечение, оно будет выполнять двоичный машинный код. Людям необходимо понимать, что их программы говорят компьютеру, потому что то, что вы напишете сейчас, позже потребуется поддерживать кому-то другому.

Что насчёт алгоритмов? Важно ли изучать различные алгоритмы сортировки, например? Сортировка важна, но не по тем причинам, которые могут показаться младшему разработчику; почти никому не потребуется реализовывать алгоритм сортировки, за исключением упражнений. Сортировка важна, потому что её легко описать и у неё есть множество различных решений, и каждое решение имеет разные свойства. Решения представляют различные подходы к решению проблем. Программистам может не понадобиться знать, как сортировать, но каждый программист должен понимать, как решать проблемы с помощью метода «разделяй и властвуй», как использовать рекурсию, как оценивать производительность, как работать с структурой данных без создания новой копии — есть множество техник и идей, заложенных в сортировке, которые программист действительно должен знать.

**Опыт и навыки старших разработчиков**

Языки и алгоритмы — это всего лишь стартовые ставки; они не являются отличительными чертами старшего разработчика. Мы ожидаем от старшего разработчика более широких и глубоких знаний, но то, что делает его старшим, — это всё остальное в списке: командная работа, способность работать над крупными проектами, понимание требований предприятия, наставничество и многое другое, чего мы не перечислили. Мы можем обобщить это, сказав «опыт», но это не совсем полезно. Чему учит опыт? Опыт начинается с признания того, что программирование не сводится к языкам программирования. Языки программирования необходимы, но старшие разработчики знают, что суть программирования — это решение проблем: понимание проблем и поиск способов их решения структурированными и повторяемыми способами.

Как сказал профессор информатики Стэнфордского университета Мехран Сахами в разговоре с Эндрю Нг: «Мы научили вас Python, но на самом деле мы пытались заставить вас понять, как брать проблемы и думать о них систематически».

Старшие разработчики также признают, что понимание проблем — это не просто разработка алгоритма. Это понимание того, кто хочет решить проблему, почему они хотят её решить, кто платит за решение проблемы, какие части проблемы уже решены, какие возможны различные решения, можно ли их масштабировать или расширить — и многое другое. У программных проектов всегда есть прошлое и будущее, и почти всегда есть политический компонент. Старший разработчик понимает, что текущий проект должен взаимодействовать с решениями прошлого и готовиться к проблемам и решениям будущего. Мы ожидаем, что младший разработчик будет выполнять полезную работу над небольшой частью крупного проекта; мы ожидаем, что старший разработчик будет понимать эти более широкие вопросы: борьба с историей проекта и обеспечение его поддерживаемости в будущем.

**Лидерство и наставничество**

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

**Заключение**

Младший разработчик становится старшим разработчиком со временем, опытом и руководством. Это требует перехода от выполнения заданий в классе и небольших групповых проектов к работе над программным обеспечением, которое разрабатывалось годами и будет разрабатываться ещё долго после вашего ухода. Профессиональная разработка программного обеспечения почти всегда включает в себя работу с унаследованным кодом; большая часть разработки программного обеспечения заключается не в создании чего-то нового, а в поддержке того, что уже существует. Вы должны думать о том, как любой написанный вами код вписывается в то, что уже есть, а также в то, что может быть в будущем; вы должны думать о более крупных проектах и архитектурах. И это приводит к ещё одному важному различию: в то время как младших разработчиков часто увлекают последние тенденции и новейшие фреймворки, старшие знают ценность «скучных технологий».

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

Таким образом, одним из следствий кодирования на основе ИИ является то, что младшие разработчики должны выполнять работу старшего, возможно, ещё до того, как они будут полностью готовы к этому. Им нужно иметь в виду более широкую картину, потому что они не просто оценивают качество своей собственной работы, что является необходимым навыком; они оценивают работу другого (которая может иметь большое значение), а это навык старшего.

Самая важная часть программирования — это не генерация кода. Это понимание проблемы в её полном контексте. Именно этим занимаются старшие разработчики. И это приводит нас к некоторым выводам.

Во-первых, мы слишком часто слышим, что компаниям больше не понадобятся младшие разработчики. Может быть, это правда, но им всё равно понадобятся старшие, а без младших, откуда возьмутся старшие? Они не растут на деревьях и не приходят к вам в дверь готовыми к работе. Все хотят «опытных» разработчиков; должен быть способ приобретения опыта.

Во-вторых, чему мы должны научить младших разработчиков, чтобы они могли стать старшими? Обучение — это не только языки программирования, библиотеки и алгоритмы. Нам нужно научить их умению смотреть на проблемы в более широком контексте, думать о том, как программное обеспечение развивается со временем, общаться с другими и делать это как неотъемлемую часть рабочего процесса, включающего AI-ассистентов. Как пишет Адди Османи, младшие разработчики должны «сосредоточиться на формировании критического оценочного мышления и понимании того, как эффективно использовать инструменты AI». По нашему опыту, младшие разработчики с энтузиазмом относятся к обучению эффективному использованию AI, но имейте в виду, что это дополнение к набору навыков, и это дополнение увеличивает разрыв между младшими и старшими. И старшие также работают над добавлением этих же новых навыков; AI так же нов для них, как и для недавних выпускников.

Наконец, кодирующие ассистенты хороши в кодировании, но разработчики кодирующих ассистентов уделяли относительно мало внимания остальной части работы. Неясно, что они не могут этого сделать — у нас уже есть некоторые инструменты. AI хорош в ведении заметок на встречах, создании транскриптов и обобщении. В будущем AI, безусловно, сможет делать больше: помогать согласовывать требования, решать политические вопросы — но ещё не сейчас. И да, AI постепенно приобретает способность ориентироваться в больших кодовых базах, но нам всё ещё нужны люди, которые знают, как всё работает и где спрятаны секреты.

Мы всегда будем нуждаться в старших разработчиках, поэтому мы всегда будем нуждаться в младших разработчиках, а также в путях, которые позволяют младшим стать старшими. По мере того как мы включаем AI в наши рабочие процессы, нам нужно тщательно продумать сохранение и поддержание этих путей. Как нам включить наставничество в должностные обязанности? Как мы можем побудить новых сотрудников смотреть на более широкую картину, когда большая часть нашей культуры (и нашей профессиональной среды) построена вокруг всё более коротких временных масштабов? Как мы учим людей становиться решателями проблем, а не генераторами кода? И как мы учим людей сотрудничать — как друг с другом, так и с AI? Вот проблемы, которые нам нужно решать.

Источник

Комментарии

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

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