Всё ли в программировании сводится к знанию языков? — Эксперты дают советы новичкам

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

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

Павел Егоров

Павел Егоров, заместитель руководителя управления разработки СКБ Контур

Тут такое дело. Опытные разработчики, которые сами потратили на развитие 5‒10 лет напряженного труда, действительно любят щеголять перед молодыми: «Ха, программирование — это просто, главное — научиться правильно мыслить, остальное суета». К сожалению, мир чуть сложнее 😉

Людям, умеющим структурировать информацию и мыслить абстрактно, проще дается программирование (которое во многом и есть структурирование и абстракции). Но только одного этого категорически недостаточно.

Есть разные парадигмы программирования и философии, как следствие, разные языки программирования, каждый со своими языковыми возможностями. Переход с одного языка на другой сопровождается переосмыслением взглядов на методы решения задачи — пары недель на этот сдвиг сознания недостаточно. Поэтому развивайте кругозор и осваивайте разные языки — объектно-ориентированные (C# / Java), функциональные (F#, Clojure, Haskell, …), динамически типизированные (Python, JavaScript, …), ориентированные на математику (Octave, R). До кучи поглядите на чудные и нестандартные. При этом недостаточно учить синтаксис — поймите философию языка. С этим кругозором проще осваивать новые языки и технологии по аналогии с уже известными. Но даже это не гарантирует вам, что послезавтра вы справитесь с освоением какого-нибудь инновационного нано-языка аспектно-квантового мета-программирования, непохожего на то, с чем вы имели дело раньше.

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

Есть еще тонкие материи проектирования и организации кода. Программисты постоянно экспериментируют с разными подходами, делятся результатами, и уж точно нельзя сказать, что мы поняли, как именно нужно проектировать код. Тут есть куда расти даже опытным разработчикам!

И, наконец, что значит «программирование в общем» и «правильно мыслить»? Мы в компании 6 лет занимаемся образовательными программами для студентов, я сам 10 лет учу программировать на матмехе УрФУ, но никто из нас не знает, как научить «программировать в общем» так, чтобы хоп — и готово! И на все случаи жизни! В программировании есть множество концепций и паттернов принятия решений. Чем больше из них знает программист и чем больше у него опыта их применения, тем проще ему работать. Маленького волшебного подмножества, после которого наступает просветление, к сожалению, просто нет.

Стас Павлов

Стас Павлов, руководитель направления маркетинга для технических аудиторий в Microsoft Россия

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

Михаил Адигеев

Михаил Адигеев, начальник отдела проектов ГК «ГЭНДАЛЬФ», доцент ЮФУ, эксперт международной олимпиады «IT-Планета»

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

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

Дмитрий Щербаков, разработчик мобильного поискового приложения «Яндекс»

Важно научиться учиться — пробовать новые идеи, осваивать новые технологии, применять их в нужном месте и в нужное время. То же самое можно и применить к языку — это действительно только инструмент, но инструмент, который направляет мысли и помогает решать определенный круг задач. Мне пришлось несколько раз поменять язык и инструментарий — сначала core java/idea, затем ssh/vim/c++/python, теперь — android studio и эмуляторы. И на каждом витке во главу угла ставятся разные проблемы и разные решения. Самый грубый пример: программируя в vim-е на с++, больше думаешь о миллисекундах в производительности, а под android — о рефакторингах, выделениях абстракций и гибкости модифицирования бизнес-логики.

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

И еще: не стоит думать, что знание языка программирования — это всё, что нужно изучить для того, чтобы успешно набирать код. Существует множество факторов, о которых никто особо не задумывается в процессе обучения, например: удобство, уровень освоения и «технологичность» IDE, навыки работы с системой контроля версий (например, во время использования git-а можно, с одной стороны, быстро переключаться между задачами, а с другой — погрязнуть в перемещении веточек и бесконечном merge самим с собой), правильность построенного процесса разработки, организация тестирования (как написания тестов, так и прогона их) и прочее, прочее.

Но с другой стороны, нельзя сказать, что это очень хорошо — уметь написать «Hello, world!» на всех языках и не более того. Ведь у каждого языка есть своя специфика и область применимости. Поэтому нельзя не знать конкретных технологий. У каждой технологии есть свои сильные и слабые стороны, которые за две недели не прочувствуешь. Учиться стоит ради двух целей — расширения кругозора (новые инструменты, новые возможности) и для решения конкретной задачи (доскональное изучение конкретного языка). И обязательно нужно поддерживать баланс между этими целями.

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

Артём Кудзев

Артём Кудзев, руководитель направления маркетинга технологий 2ГИС

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

Дмитрий Сошников

Дмитрий Сошников, технологический евангелист Microsoft, доцент МФТИ, МАИ, преподаватель детского лагеря JUNIO-R

Абсолютно правильно утверждение. Тем не менее, стоит сразу начинать изучать «хороший» язык программирования, чтобы вырабатывать в себе правильный вкус и чтобы процесс был более занимательным. Из традиционных языков мне всегда был близок C# — для него есть хорошая среда разработки, а программировать можно всё: от игр в Unity до веб-сайтов на ASP.NET или электроники. Для обучения можно посмотреть видеоуроки или почитать книжку C# для школьников.

Также сейчас становится все более популярным функциональное программирование, поэтому хорошему специалисту стоит также изучить какой-нибудь из функциональных языков, например, F# или Haskell.

Денис Кудинов

Денис Кудинов, ведущий ios-разработчик Trinity Digital

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

Цюй Цян

Цюй Цян, руководитель Лаборатории Больших Данных и Информационных систем Университета Иннополис

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

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

Иван Бибилов

Иван Бибилов, руководитель направления программирования в GoTo

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

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

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

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

Все сказанное не отменяет тот факт, что в каждом из языков программирования есть своя философия, особенности, история развития и сфера применения. И всем этим можно восторгаться, делиться, вдохновляться, а также, естественно, спорить об этом.

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