Написать пост

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

Аватар Типичный программист

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Следите за новыми постами
Следите за новыми постами по любимым темам
50К открытий50К показов