Какие навыки программирования появляются только с опытом — отвечают эксперты

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

«Какие навыки программирования появляются только с опытом?»

Мы обратились за разъяснением к нашим экспертам, а полученные ответы предоставляем вашему вниманию.

Ян Орещенков

Ян Орещенков, технический директор бельгийско-белорусской IT компании CactusSoft

Использование абстракций. Навык выбора подходящего инструмента для каждой задачи. Умение видеть бизнес-задачи за кодом. Умение читать чужой код. Способность к проектированию архитектуры.

Алексей Тимин

Алексей Тимин, PHP-разработчик, Badoo

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

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

Дмитрий Гацура

Дмитрий Гацура, руководитель отдела разработки компании «СёрчИнформ»

Про опыт программиста можно судить по его коду. С годами он становится более аккуратным. Переменные, классы, интерфейсы взаимодействия и контакты между отдельными частями приложения становятся более понятными, архитектура – прозрачной.

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

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

Еще один признак – расширяемость кода. Довольно часто «новичку» приходится почти полностью переписывать код, который он же сам написал. Но чем больше опыта у программиста, тем легче им модифицируется код, когда меняются требования.

Евгений Картавец

Евгений Картавец, руководитель отдела обучения GeekBrains, Mail.Ru Group

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

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

И третий навык — умение делать код быстрым, понимать, как он работает на самом деле, что физически происходит с компьютером в процессе. Новички иногда бездумно и не к месту используют конструкции и встроенные методы, могут, например, делать ресурсоемкие запросы к базе данных, без которых можно было обойтись.

Сергиус Офицеров

Сергиус Офицеров, преподаватель HackerU

(ответ подготовлен совместно с Михаилом Субботиным, преподавателем израильской высшей школы IT и безопасности HackerU)

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

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

Кирилл Новоселов

Кирилл Новоселов, руководитель направления серверной разработки интернет-холдинга Банки.ру

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

Например, умение писать «код, понятный для человека». Это значит — понимать как будет мыслить разработчик, который будет впоследствии вносить изменения в систему. Предугадывать его вопросы и видение задачи, заботливо оставлять комментарии и подбирать идеальные названия для классов и переменных.

Также стоит отметить, что для опытных программистов «не бывает простых задач». Вряд ли вы найдете бывалого разработчика, который рвется в бой едва получив требования. Лишь со временем приходит умение видеть подводные камни, управлять рисками и точнее прогнозировать сроки выполнения работы.

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

А еще с опытом лучше получается управляться с техническим долгом — накопленными проблемами, которые могут быть не только в коде или архитектурных решениях, но и в собственных знаниях.

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

Александр Пряхин

Александр Пряхин, декан факультета веб-разработки GeekUniversity, онлайн-университет Mail.Ru Group

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

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

С опытом наоборот уходит максимализм. Я вижу очень много молодых разработчиков, которые горящими глазами смотрят на систему, строя наполеоновские планы на сжатые сроки разработки.

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

Рустам Кильдиев

Рустам Кильдиев, руководитель отдела разработки BigData компании «Иннодата»

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

Андрей Коваленко

Андрей Коваленко, сооснователь и CTO Voximplant

Главный навык, который появляется только с опытом — это понимание, что «тут что-то может пойти не так». Думаю, это справедливо для любой специальности. И чем больше опыт, тем больше вариантов того, что именно может пойти не так, есть в голове у разработчика. Опыт — сын ошибок трудных, и разработка ПО — не исключение.

Дмитрий Сальников

Дмитрий Сальников, PHP-разработчик, Badoo

Вы можете наизусть знать язык программирования, устройство операционной системы и железа, плавать между уровнями OSI модели как рыба в воде, но без ̶н̶а̶б̶и̶т̶ы̶х̶ ̶ш̶и̶ш̶е̶к̶ реального опыта крайне тяжело работать в команде.

И речь не о навыках коммуникации, а об умении видеть будущий процесс своей же работы. Только опираясь на предыдущий опыт, можно ответить на вопрос, сколько времени займет у тебя вот эта задача? Прикинув в голове, расписав на листочке или в excel свои предыдущие результаты, уже можно что-то прогнозировать.

Навык прогнозирования сроков достаточно тесно связан с умением выбирать решение, а также с опытом ответов на вопросы типа «Стоит ли тут тратить время и заморачиваться с композицией классов или просто передать набор параметров?»

Как пример, задачу вывести на сайте фото одежды с надписью красным курсивом «РАСПРОДАЖА» можно сделать просто и быстро или сложно и долго.

Быстрое решение — это картинка с текстом, сделанная в фотошопе. Но заказчик/менеджер может попросить поиграть шрифтами, текстами и сделать цвет чуть более бордовым. В итоге задача сделана быстро, но множество раз переделана.

Долгое решение — полноценный html редактор (или даже редактор изображений), встроенный в админку сайта или подобный простейший инструмент.

Также поначалу может казаться не предсказуемым не только менеджер, но и темп потребления ресурсов. Можно написать вполне рабочий прототип кода, который в боевых условиях окажется совершенно не работоспособным, потому что им одновременно пытается воспользоваться множество процессов/пользователей.

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

Роман Китаев

Роман Китаев, ведущий программист REG.RU

В начале своего пути программист учится императивному программированию, изучает алгоритмы и структуры данных, паттерны проектирования. Обычно это происходит в ВУЗе. Единственное чему там не учат — что с этим всем делать. Начинающий программист не видит, где все это можно использовать. Его труды и знания можно назвать ценными только с академической точки зрения.

Программист растет как профессионал. Находит работу, где пишет императивный код. Главная задача — только бы работало. Потом в его жизни появляются тесты, которые программист с большой неохотой пишет. Затем возникает стокгольмский синдром, он проникается тестами и теперь главная задача — только бы проходили тесты. Ценность такой работы имеет вес только в данный момент времени. Завтра приходит менеджер с правками и идеями обновления и программист начинает по неопытности водружать костыли десятками поверх своего старого кода. И еще, и еще. Через два года проект приобретает настолько нестабильное состояние, что самые тривиальные изменения становятся невероятно сложными — даже для самого программиста. А после — часами дебаггер, отладочные принты, grep логов — вот это все вам наверняка знакомо (если нет, то вы [пока] счастливый человек). Кульминацией становится полное переписывание проекта на новую крутую архитектуру. И так несколько циклов.

Теперь программист вырос, набил шишек о свой опыт. Он уже умеет применять паттерны, а не старается натянуть сову на глобус. Попробовал разные парадигмы. Уже не использует переменные (в том смысле, что они изменяются) и почти не использует циклы. Знает, что изменение состояния обходится дорого. Умеет объяснить принцип Барбары Лисков, не заучивая формулировки. Но главное, он знает — то, что он пишет, очень скоро поменяется, умеет это предвидеть и строить архитектуру проекта так, чтобы изменения не были столь разрушительными. Также он умеет перестраивать эту архитектуру в процессе изменений и подстраивать под новые требования. Это не значит, что изначально его выбор был неверным. Просто под другие требования лучше подходит другая архитектура. Опытный программист умеет находить баланс между гибкостью и частными случаями.

Александр Басов

Александр Басов, эксперт курса «Основной курс по Java Script» университета digital-профессий «Нетология»

База полезных данных. В работе программист сталкивается с многообразием задач — от написания простого скрипта до проектирования больших систем. C опытом, вы начинаете их сортировать, и с каждой новой задачей приходит понимание того, что она вовсе не новая. Но иногда мы делаем что-то так редко, что наш навык не успевает закрепиться. К примеру, в моей практике такая задача, как настройка сложных рабочих окружений, встречается не часто, и поэтому она требует от меня большего времени и усилий. Для решения этой проблемы, я храню у себя различные заготовки с пояснениями «что? почему? зачем?». В этом процессе также полезны работа над ошибками и анализ проделанной работы. Иногда, торопясь, мы забываем пополнить нашу базу новым инструментом, задачей или навыком. Например, у новичка-программиста возникает какой-нибудь баг, он находит решение на стороннем ресурсе, применяет его и не задумывается о том, что произошло. Очень важно остановиться и понять “почему я это делаю и зачем”.

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

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

Андрей Григоров

Андрей Григоров, ведущий архитектор систем ДБО компании R-Style Softlab

Будучи руководителем и наставником студентов и недавних выпускников вузов, которые приходят на работу в компании, занимающиеся созданием программного обеспечения, я не раз наблюдал происходящие с молодыми программистами метаморфозы.

В начале своего профессионального пути они с огнем в глазах бросаются решать поставленные перед ними задачи. При этом зачастую все сводится к скорейшему началу написания кода на языке программирования. Получается «сначала делаем, потом думаем». На мой взгляд, это обусловлено тем, что в школе и университете обучающиеся обычно сталкиваются с решением небольших задач, имеющих четкие границы и ограниченный срок жизни. Это похоже на игру «Что? Где? Когда?», где каждый вопрос живет в умах игроков всего одну минуту: ответили и двинулись дальше, забыв про вопрос, который совсем недавно нас так волновал. При разработке сложных информационных систем, создаваемых руками десятков и сотен людей, такой подход неприменим, и молодой специалист сразу же начнет это замечать. Сделанные на скорую руку решения приводят к усложнению их дальнейшего сопровождения, ошибкам или необходимости переделки, так как обнаружатся факторы, которые не были учтены при разработке.

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

Сергей Шитиков

Сергей Шитиков, технический директор @ Суточно.ру

Когда говорят о навыках опытных разработчиков, имеют в виду, в первую очередь, не знания технологий или фреймворков, а способность решать различные архитектурные задачи. В разработке есть множество готовых реализаций и архитектурных паттернов под разные нужды. На мой взгляд, опытный разработчик — тот, кто держит руку на пульсе и знаком не понаслышке с такими решениями. Сталкиваясь с новой задачей, он не будет писать очередной «велосипед», а изучит вводные и подберет решение, которые максимально подходит под условие задачи. Тем более, что сейчас многие задачи, с которыми сталкивается разработка — типовые, и, скорее всего, уже существуют в том или ином виде (Opensource-проекты, различные облачные сервисы и т.п.). Подобная практика уменьшает сроки, стоимость разработки и повышает надежность, потому что их реализация оттачивалась совместными усилиями многих людей. Кроме того, с такими решениями проще работать другим специалистам благодаря наличию документации или коммьюнити. Не зря сейчас многие компании при собеседовании кандидатов спрашивают о его участии в Opensource-проектах.

Разработчику очень важно держать руку на пульсе и быть в курсе последних тенденций в разработке, постоянно обновляя свои профессиональные знания и навыки. В противном случае можно довольно быстро деградировать. Помню, как собеседовал одного разработчика, который называл себя «senior» и говорил, что может решить любую поставленную задачу. На практике оказалось, что человек последние 10 лет поддерживал на фрилансе один веб-проект, написанный на устаревших технологиях. Он действительно мог решить в том проекте любую задачу, но подходы к разработке этого «senior» были такими, что даже сегодняшний стажер-выпускник из университета дал бы ему фору.

Илья Мочалов

Илья Мочалов, технический директор, компания Роспартнер

С опытом, как бы это не парадоксально звучало, настоящий профессионал начинает осознавать, что он мало что знает =)
А если серьезно с опытом у хорошего разработчика появляются не только глубокие знания в своей области, он обрастает знаниями в смежных направлениях, программист начинает выходить за рамки узко поставленной задачи, становится full-stack разработчиком, уже работает не только со своим участком, но и все больше захватывает другие области, начинает мыслить более системно, анализирует и предлагает архитектурные решения, что несомненно повышает его ценность на рынке труда.

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

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

Не стоит забывать, что для спешного развития карьеры программиста помимо профессиональных навыков (hard skills) весьма важно развивать мягкие навыки (soft skills) взаимодействия в команде

Кирилл Меженцев

Кирилл Меженцев, программист группы разработки карты рассрочки «Совесть»

Нет никакой исключительной корреляции между навыками и опытом. Особенно, если под опытом подразумеваются годы в резюме. Это довольно распространённый миф, основанный на вакансиях, где требуют 1-3, 5+ лет в разработке. Главный навык программиста — это способность и желание изучать новое. Дай программисту стек технологий, и через 3-6 месяцев он будет не хуже всех остальных, даже если он им ни разу до этого не пользовался. А с выходом нового фреймворка шансы, что сеньор и джуниор окажутся на одном уровне, очень велики.

Я понял это, в том числе, и на своем опыте. Сразу после института я не писал на Java, а о Continuous Delivery или Agile даже не слышал. Но уже через три месяца деплоил свой первый сервис нового продукта в конце очередного спринта.

Постоянное обучение и готовность браться за новые задачи играют зачастую более важную роль, нежели конкретные технические навыки.

Вадим Кошелев

Вадим Кошелев, старший разработчик компании «Аэроклуб ИТ»

Это зависит от сферы работы – каждое направление кардинально отличается от других по предъявляемым к разработчикам требованиям и соответственно развиваемым навыкам. Например, в геймдеве требуется хороший математический аппарат, знание алгоритмов, соответственно, развиваются навыки оптимизации. Если говорить об enterprise-разработке, то здесь необходимы знания бизнес-процессов, инфраструктуры и т.д. С опытом развиваются навыки работы с большими объемами данных, видение, каким образом их можно использовать и применять, «нащупывание» новых инструментов и продуктов, требуемых для решения бизнес-задач.

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

Напоминаем, что вы можете задать свой вопрос экспертам, а мы соберем на него ответы, если он окажется интересным. Вопросы, которые уже задавались, можно найти в списке выпусков рубрики. Если вы хотите присоединиться к числу экспертов и прислать ответ от вашей компании или лично от вас, то пишите на experts@tproger.ru, мы расскажем, как это сделать.

Ещё интересное для вас:
— Биты, байты, Ада Лавлейс — тест на знание околоIT.
— Level Up — события и курсы, на которых можно поднять свой уровень.
— Работа мечты — лучшие IT-вакансии для вас.