Программирование: дар или опыт — отвечают эксперты

Нам в редакцию Tproger пришел вопрос от подписчика, которым мы хотим поделиться с вами:

«Как развить в себе навыки программирования как у ведущих программистов? Это должен быть дар или этому можно научиться?»

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

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

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

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

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

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

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

Усердие и только усердие. Да, бывают одаренные специалисты, которым все само собой легко дается, но таких немного. Решение ― постоянно экспериментировать, пробовать что-то новое, делать pet-projects, быть активным, не стесняться спрашивать. Навыки программирования от ведущих специалистов ― это не что-то дефицитное, они точно к вам придут. Все зависит от количества опробованных решений, информации, знаний которые вы получите в единицу времени. Чем плотнее будете заниматься, тем раньше и больше навыков сможете получить.

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

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

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

Ринат Хабибиев

Ринат Хабибиев, эксперт курса, университета digital-профессий «Нетология»

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

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

В качестве примера возьмем один из самых важных и сложных в получении навыков — «умение видеть абстракции». Чтобы его получить нужно в совершенстве освоить язык программирования и парадигму ООП и TDD, получить представление о предметной области, изучить паттерны проектирования, научиться применять принципы SOLID, KISS, DRY, YAGNI. Плюс, необходимо на практике ознакомиться с примерами реализованных абстракций, чтобы научиться создавать свои.

Вывод: Развить в себе навыки ведущего программиста возможно. Для этого не нужен особый дар. И в большей степени этому способствуют интересная и разнообразная работа, а также коллеги, готовые поделиться своим опытом и знаниями. А если повезет с хорошим наставником (тим-лидом), то тогда все будет зависеть только от вашего желания.

Александр Налобин

Александр Налобин, тим-лид, ведущий разработчик REG.RU

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

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

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

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

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

Павел Попов

Павел Попов, руководитель калининградского офиса компании «Первый БИТ»

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

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

Для начала нужно освоить логику и теорию функций. Подкрепить теорией архитектуры компьютера и добавить знания алгоритмов. Далее следует разобраться в технологии хранения и передачи данных. И напоследок изучить историю развития программирования: от лампочек и перфокарт до объектно-ориентированного программирования (ООП). Из базовой теории, пожалуй, все. Эти знания можно подчерпнуть из классических трудов таких авторов как, например, Черч, Вирт, Кнут, Дейкстра, Марков, Тоненбаум, Страуструп.

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

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

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

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

Талантливые создают, а гении творят.

Саттар Гюльмамедов

Саттар Гюльмамедов, руководитель отдела разработки новых программных продуктов IT-компании NEIRIKA

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

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

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

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

Будет очень здорово, если удастся следовать какому-то плану: например, проходить систематическое обучение, чтобы достичь уровня старшего разработчика или систематическое изучение методов, применяемых в определенной области, – например, ML.

Большим помощником был бы широкий кругозор – перенос опыта и знаний из других областей иногда позволяет «вписать» свое имя в историю развития области. Ярким примером этого является перенос «бандой четырех» концепции языка шаблонов из архитектуры в программирование.

Петр Смолович

Петр Смолович, ведущий разработчик, скрам-мастер REG.RU

Есть два аспекта, по которым узнаешь продвинутого программиста.

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

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

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

Роман Друзягин

Роман Друзягин, технический директор компании 404 Group

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

Все эти навыки вырабатываются сообща и только одним способом — длительной и экстенсивной работой в коммерческом и относительно большом продукте, который постоянно развивается и претерпевает какие-то функциональные доработки и изменения.

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

Это должен быть дар или этому можно научиться? В инженерной дисциплине не существует понятия дар. Всему можно научиться, если приложить достаточно усердия, усидчивости и желания профессионально развиваться.

Дмитрий Брытков

Дмитрий Брытков, технический директор Kokoc Group

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

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

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

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

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

Дмитрий Сергеев

Дмитрий Сергеев, тим-лид, ведущий разработчик, REG.RU

Я думаю, навыки — это не что иное, как практический опыт, вне зависимости от того, есть у вас талант к программированию или нет. А настоящий дар — это заниматься тем, что вам действительно интересно. Работа с кодом вполне может быть увлечением.

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

Учитесь у лучших. Есть вещи, которые не прочитаешь в книгах, и один из лучших способов научиться чему-то, это работать вместе с действительно сильными специалистами. Читайте код своих коллег. Анализируйте чужие решения. Делайте реверс-инжиниринг.

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

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

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