навыки которыми должен обладать программист
Семь навыков профессионального программиста
Каждый год мы обучаем под свои проекты и набираем в команду студентов. Хантим, конечно, не всех. «Мы на работу ходим, а нам деньги плотют» — это точно не к нам. За «звездами» тоже не охотимся. Ищем в первую очередь тех, кто хочет расти, развиваться, становиться «звездой», а мы можем им в этом помочь.
Одна из проблем нашего высшего образования в том, что в вузах учат много чему, и алгоритмам, и языкам программирования, и ООП, и даже паттернам проектирования. Но я еще ни разу не встречал, чтобы в вузах учили работать работу. Лабораторки не в счет. Спихнул – и забыл! Возможно, просто не везло.
В свое время, я сформулировал набор навыков, которыми, по моему мнению, должен владеть каждый профессиональный программист. Не только Мастер с большой буквы, но и студент, который претендует на то, чтобы за его работу ему платили деньги. И, если мы не смогли научить студента этим навыкам за три месяца его испытательного срока, то или мы взяли не того, или назначили никудышного наставника.
Итак, про семь навыков…
1. Проводит декомпозицию задачи и проектирует ее решение
Получив задачу, программист не должен сразу бежать писать код. Правильный программист 80% времени работает головой, и только 20% времени — руками. Даже создание не очень сложной программы требует анализа и проектирования: декомпозиции задачи на боле простые подзадачи и последующего синтеза общего решения из частных. Например, выбор длины переменной целого типа есть элемент проектирования.
2. Адекватно оценивает затраты на выполнение
Ответ «Для решения этой задачи мне потребуется 8 часов», — неправильный. Оценка всегда величина вероятностная. Правильный ответ, например, «от 4 (быстрее точно не смогу) до 16 часов (скорее всего, точно сделаю)». Большой разброс не должен смущать руководителя, он отражает высокий уровень неопределенности при решении программистских задач.
3. Планирует свою работу и составляет график
При составлении план-графика решения задачи, программист должен расставлять приоритеты своих работ таким образом, чтобы максимально быстро снизить имеющиеся риски, а не добиться быстрого прогресса в решении. Отложенные «мутные» подзадачи могут выявить тупик в принятом проектном решении, и все придется начинать сначала.
4. Соблюдает принятые стандарты
Ну, тут все просто. «Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете». (с) Стив Макконнелл.
5. Обеспечивает требуемое качество, минимизируя затраты и риски
Это, наверное, самый сложный навык. Надо научиться находить золотую середину между запрограммировал, «как получится», и написал «самый совершенный код».
6. Выполняет тестирование и отладку кода
«Откомпилировалось – отправляем в тестирование!» — подход неверный. Программист обязан найти максимум ошибок в своем коде. Он может сделать это намного эффективнее, поскольку для него программа – «прозрачный ящик». Большинство ошибок лежит на границах областей определения и изменения переменных алгоритма. Тестировщик же будет тестировать код, как «черный ящик», бомбя по площадям перебором большого количества наборов данных.
7. Анализирует найденные дефекты и отклонения от графика
Ну и последнее, как любая самоуправляемая система программист должен обеспечивать обратную связь. Обязан анализировать фактические отклонения от планов по срокам и качеству и выявлять их причины для того чтобы скорректировать свой рабочий процесс и минимизировать подобные отклонения в будущем.
Основные знания и навыки, которые нужны каждому программисту
Какие навыки и личностные качества нужны программисту? Что включают в себя soft и hard skills разработчика? Рассказываем в статье.
Soft Skills
Аналитическое мышление
Без аналитического навыка сложно представить успешного программиста: именно с таким мышлением выбирают ИТ-сферу. Как оно проявляется в работе разработчика? Ему необходимо регулярно изучать, систематизировать информацию и делать по ней выводы. Перед тем, как написать код, программист подробно изучает проект, пишет план, составляет структура продукта, выбирает инструменты и способы реализации. Системный подход помогает представить готовый продукт, определить его интерфейс и внутреннюю логику.
Разработчик ежедневно взаимодействует с командой, а также со смежными отделами разработки, тестировщиками и аналитиками. Для успешной работы в проекте нужно взаимодействовать с коллегами, обмениваться идеями и помогать друг другу. Кроме того, программисты общаются с заказчиком, а здесь нужно аргументировать свое решение и уметь адекватно воспринимать критику.
Способность к обучению и развитию
В ИТ каждый год появляются новые технологии. Любому программисту необходимо владеть актуальными инструментами разработки и регулярно саморазвиваться. Рекрутер должен обращать внимание на пройденные курсы, мастер-классы, хакатоны и ИТ-конференции: они показывают профессионализм и интерес к сфере.
Написать идеальный код с первого раза получается не всегда. Программист должен быть готов к поиску других стек-технологий и улучшению кода. В этом проявляется вариативность и экспертность, без которых невозможно создать качественный продукт.
Проактивность
Компетентный разработчик думает не только о способах решения задачи, но и о том, как они повлияют на проект в целом. Такой сотрудник умеет принимать решения и ответственен за свой выбор. Этот навык тесно связан с ответственностью и целеустремленностью. В спорных моментах проактивный разработчик анализирует в первую очередь свои ошибки, не перекладывает их на других и готов переделать работу. Проактивность особенно важна для тимлида и руководителя: продуманность их решений влияет на продвижение бизнеса.
Hard Skills
C личными качествами разобрались, а какие профессиональные компетенции нужны программисту?
Умение писать понятный код
Длинный и сложный код показывает прокаченность программиста — частое заблуждение в ИТ-рекрутменте. Опытный разработчик пишет простой код, который прочитает и он, и коллеги. Это навык, которым выделяются сильные разработчики.
Структура данных и алгоритмы
Эти знания также важны, как и язык программирования. К структуре данных относятся связанные списки, массивы и стеки — с ними разработчик создает приложение.
Без них не обойтись ни одному программисту. Он должен разбираться в основной логике, уметь проектировать таблицы и управлять данными. Основная база данных — SQL, кроме нее существует PostgreSQL, NoSQL и другие.
Библиотеки
Представляют комплекс готовых функций, классов и объектов, которые помогают держать фокус на главном — реализовать логику приложения.
Несколько языков программирования
Основной язык может быть один, но знание нескольких расширяет выбор инструментов. К тому же некоторые из них со временем устаревают. Например, ActionScript или Perl.
Математические знания
Как минимум программисту необходимы знания простых формул и операций для
сложных алгоритмов, аналитики, систематизации и машинного обучения.
Кроме этого, программисту важно знать:
По всем вопросам свяжитесь с нами любым удобным способом:
Навыки опытного программиста: Самые популярные советы начинающим
Быть программистом — это призвание? Возможно. Мы в 1cloud решили выяснить, как сами программисты оценивают свои достижения, какие качества считают неотъемлемыми в своей работе (вне зависимости от выбранного языка и специализации) и какие советы дают начинающим разработчикам.
1. Измерение кода в строках
Каждый опытный программист знает, что качество кода не определяется его длиной или временем, которое было затрачено на его написание, считает Джордж Майна (George Maina), сотрудник компании-разработчика ПО Kopo Koop.
Более того, в идеале следует стремиться к тому, чтобы код был написан как можно понятнее, что должно привести к его упрощению и в результате к сокращению его объема. Если две программы функционируют одинаково, то лучшей будет та, код которой содержит меньше строк.
Способность писать короткий код часто воспринимается как показатель высокого уровня работы. Так считал и Стив Возняк, который в одном из своих интервью (см. его 14-ый ответ) отметил способность команды Макинтош писать короткий и качественный код как одну из черт их высокого профессионализма. Ему также приписывается фраза о том, что он мог сделать код из 10 строк, равный по функциональности коду из 100 строк.
Мэттью Фехер (Matthew Fecher), разработчик большого количества приложений на iOS, технический редактор книжной серии «iPhone for Dummies» и «Mac for Dummies», один из основных членов команды AudioKit, также говорит, что его намного больше впечатлит максимально простое решение, а усложнение кода приводит только к увеличению затраченного времени и конечной стоимости проекта.
2. Желание учиться и умение признавать ошибки
Одно из главных качеств, необходимых в программировании — стремление узнавать что-то новое. Речь идет не только о начальной стадии, когда необходимо учиться на своих ошибках и задавать как можно больше вопросов.
Потребность в развитии должна быть свойственна программисту на протяжении всей деятельности, говорит основатель сервиса по подбору разработчиков Scalable Path Дэмьен Филиатро (Damien Filiatrault).
Но в обучении можно использовать не только стандартные техники. Например, в чешском Университете Градец-Кралове для повышения и развития навыка программирования в обязательную программу был введен предмет компьютерной графики (разработчики учебной программы считают, что обучение компьютерной графике позволяет серьезно углубить знания программирования и тем, кто впоследствии не будет связывать карьеру с этим направлением).
Мэтт Милз (Matt Mills), художник, дизайнер и веб-разработчик, подтверждает на собственном опыте, что комбинирование графического дизайна и программирования может здорово расширить область профессиональной деятельности. При этом, по его словам, развитие творческого мышления через изобразительное искусство подталкивает на поиск креативных решений в программировании. А самым юным кодерам доступно даже офлайн-обучение программированию через танец. Малыши познают основные концепции новой для них науки, сравнивая их с последовательностью движений.
Программирование не зря преподается через искусство, еще Дональд Кнут в предисловии к своей книге «Искусство программирования» писал: «Наша дискуссия показывает, что программирование является сейчас и наукой, и искусством, и что обе эти стороны прекрасно дополняют друг друга… Программирование это искусство, потому что в нем применяются накопленные в мире знания, потому что оно требует умения и изобретательности, и особенно потому, что оно создает прекрасное. Программист, который подсознательно чувствует себя художником, будет наслаждаться тем, что он делает и будет делать это всё лучше».
Постоянное расширение горизонтов помогает специалистам легче признавать свои ошибки. Разработчик, работавший на ВМФ США, Мэтт Пикеринг (Matt Pickering), уверен, что растущее количество краткосрочных курсов, обещающих быстро научить человека кодить с нуля, не всегда идет на пользу начинающим специалистам. У них возникает ощущение, что после такого «введения в тему» они знают все, и углублять свои навыки им больше не требуется — налицо эффект Даннинга Крюгера, когда недостаток квалификации приводит к завышенной оценке своих профессиональных качеств.
3. Упор на результат, а не затраченное время
Быстро написать код — далеко не всегда значит успешно справиться с поставленной задачей, учитывая, что эта работа состоит из многих этапов: начиная от изучения требований и заканчивая исправлением багов. Поэтому главным все же остается качество окончательного продукта.
Петер Нироп (Peter Nierop), сотрудник студии разработки Compudivision, считает, что если уж говорить о времени, то гораздо важнее то, сколько времени вы сможете сэкономить пользователям со всего мира. И если благодаря вам они будут делать на три клика меньше, то это вполне стоит трех дней вашей работы (разумеется, ваше время важно, но перенос фокуса со своих усилий на конечный результат здорово помогает начинающим специалистам легче справляться со сложными и комплексными задачами).
Разработчик архитектуры приложений в компании Imagine Communications Скотт Палмер (Scott Palmer) объясняет, что популярные сегодня онлайн-тесты не могут адекватно оценивать качество кода и профессионализм программиста. Конечно, существуют временные рамки и дедлайны проектов, но задаваться целью тратить на создание кода как можно меньше времени — не самая хорошая и совершенно не оправданная (с точки зрения результата) идея.
Этот принцип лучше всего иллюстрирует индустрия видеоигр (разумеется, создание игры не сводится к работе программистов и гейм-дизайнеров, однако их труд в данном случае — ключевой). Например, выпуск Team Fortress 2 был анонсирован еще в 1998 году, а на прилавках игра появилась лишь 9 лет спустя. Ожидание явно стоило этого, учитывая тот факт, что в нее продолжают играть даже в 2016 году. Разработка Diablo III заняла еще больше, целых 11 лет. При этом в год выпуска (2012) игра побила все рекорды по предзаказу. А в 2015 году игра оказалась на 10 месте в рейтинге самых продаваемых игр (30 млн копий).
4. Необходимость предварительной работы
Разработчик интернет-провайдера EarthLink Telecommunication Ашиш Чандра (Ashish Chandra), описывая свой опыт, говорит, что большую часть рабочего времени и даже часть личного тратит на обдумывание кода и поиск оптимальных решений, которые можно внедрить. И даже 50 строк кода в день приобретают совсем другую ценность, когда к их написанию подошли очень вдумчиво.
Джо Армстронг (Joe Armstrong), создавший язык Erlang, при разработке ПО, например, предпочитал очень тщательно документировать все, что только возможно, перед тем, как приступать к непосредственному написанию кода. Очень часто предварительная подготовка играет достаточно большую роль и облегчает работу: Рави Шанкар (Ravi Sankar), инженер-программист в Microsoft, уверен, что так можно сократить или вовсе избежать последующих преобразований и исправлений.
Согласно опросу на Hacker News, многие программисты до сих пор делают записи в блокнотах и даже используют карточки, чтобы привести мысли в порядок и продумать код до начала самой работы. У некоторых заведен отдельный блокнот для каждого проекта, другие пишут или зарисовывают идеи в одном месте, а затем переводят записи в печатный вид. Но все они уверены, что это сокращает время, затраченное на сам процесс написания кода и помогает избежать большого количества ошибок.
5. Коммуникабельность
У коммуникабельности есть две важных стороны — умение работать в команде и понимать клиентов. Но для Криса Кемпа (Chris Kemp), генерального директора консалтинговой компании в сфере информационных технологий и бизнес-систем Paladin Consultants, клиент тоже является частью команды, поэтому услышать его и понять, согласовать план и цели проекта — залог создания успешного продукта (хотя, конечно, далеко не во всех компаниях эта задача лежит на плечах самих разработчиков).
Уже известный нам Мэтт Пикеринг считает, что для развития профессионализма поможет и более активное общение с коллегами-непрограммистами (про то, как объяснять им некоторые концепции, популярные в программировании, мы рассказывали здесь).
Поэтому Дамьен Филиатро включает (под пунктом 2) хорошие коммуникативные навыки в список отличительных черт высококлассного специалиста. Стивен Уайатт Буш (Stephen Wyatt Bush) поделился в своем блоге 10 заповедями программиста, которым его научил отец, работающий в Технологическом университете Тенесси. Согласно 5 заповеди, особое терпение следует проявлять в общении с людьми нетехнических специальностей, чтобы не поддерживать сложившийся у них стереотип о программистах.
Майкл Лайонс (Michael Lyons) и Роб Томсетт (Rob Thomsett) провели психологическое исследование на основе системы типологии личности Майерс — Бриггс (созданной на базе идей Карла Юнга). Они пришли к выводу, что половина или две трети всех программистов по ориентации сознания является интровертами, то есть нам больше интересен внутренний мир идей и ментальных процессов, чем внешний мир людей и предметов.
Две трети больше ориентированы на результат, чем на процесс, поэтому предпочитают иметь четкий план действий. 80% программистов более рациональны, нежели эмоциональны (в стандартной выборке из разных профессий эти качества распределяются 50 на 50), что помогает нам принимать решения, руководствуясь логикой, и писать хороший код.
Кевин О’Шоннесси (Kevin O’Shaughnessy), веб-разработчик из Британии, уверен, что определение своего типа личности способствует пониманию себя и даже анализу своих ошибок в работе. Поэтому он предлагает программистам пройти сам тест и ознакомиться с описанием всех типов личности – иногда это может помочь в споре или общении с коллегами и клиентами.
Джон Олспоу (John Allspaw), технический директор торговой площадки Etsy, пишет в своей статье о том, что чем выше вы поднимаетесь по карьерной лестнице, тем больше к вам предъявляется требований – поэтому универсальные практики для начинающих порой могут пригодиться и опытным разработчикам.