Не так уж редко доводится встречаться с утверждением о том, что знание/изучение разных языков программирования делает программиста лучше. Даже встречал мантру о том, что каждый год программист должен осваивать какой-нибудь новый язык. Лично я не склонен разделять такую точку зрения. Поскольку не понимаю механизма этого явления (если оно имеет место быть).
Для того, чтобы продолжать дальше нужно определиться, кто такой “хороший программист” и что означает “быть лучше”. Имхо, начинать нужно с того, что бы определить понятие “хорошая программа”. Хорошая программа – это программа, которая:
- делает то, что от нее требуется;
- разработка которой укладывается в приемлемый бюджет;
- содержит допустимое количество ошибок и недоделок;
- ее сопровождение и развитие обходится не слишком дорого.
Соответственно, хороший программист – это такой, который умеет делать хорошие программы. А из чего это умение складывается?
Я бы поставил на первые места следующие составляющие:
1. Умения понять (выяснить, вырвать клещами) цель программы или ее отдельного фрагмента. Неоднократно говорил об этом, но повторю еще раз – в программировании очень часто выясняется несовпадения в представлениях: заказчик хочет одно, на словах выражает другое, воспринимается третье, а реализуется четвертое. Так вот хороший программист умеет бороться с этим явлением.
2. Умением выбирать простые и удобные проектные решения.
3. Умение писать простой и понятный код.
Эти три умения непосредственно влияют на качество программы, т.к. позволяют делать именно то, что нужно, делать это простыми средствами и за счет простого кода (что сокращает количество ошибок и уменьшает стоимость сопровождения). К этим умениям добавлю еще два совершенно субъективных умения:
4. Умение связно и понятно излагать собственные мысли. Как в устной речи, так и (особенно) в письменном виде. Просто удивительно иногда, насколько тяжело бывает понять написанное умным человеком – вроде бы и правильно все, но чтобы разобраться нужно поломать голову. Из-за банальной причины – пишущий не может поставить себя на место читателя.
5. Умение поддерживать нормальные человеческие отношения с коллегами. Неприятно об этом говорить, но заносчивость, зазнайство, поведение в стиле “я-то знаю, а вы сами должны до всего додуматься”, скрытность (“как я реализую этот модуль – это моя проблема, никого больше это не касается”), некоммуникабельность, обидчивость и пр. встречаются. К счастью, не часто.
Так вот, я не понимаю, каким образом знание нескольких десятков языков способны развить вышеуказанные умения. Хотя бы первые три.
По первому умению. Тут языки программирования вообще не причем. Здравый смысл + опыт. Еще лучше, когда у человека есть врожденная способность разбираться в предмете досконально. А так же умение “примерить чужую шкуру” – поставить себя на место заказчика чтобы уяснить, зачем нужна какая-то фича программы.
По второму умению. Здесь языки постольку-поскольку. Намного больше здесь играет роль кругозор, опыт и, опять же, здравый смысл. Если человек понимает, что ему нужно обработать несколько десятков тысяч записей, то он не будет использовать для сортировки метод пузырька из-за того, что другого ничего не знает. Но кругозор не столько в языках программирования, сколько в подходах и способах решения тех или иных задач.
В данном случае я могу увидеть возможный способ влияния новых языков. Например, знакомство с функциональными языками вынуждает знакомиться с такими вещами, как иммутабельные структуры данных и ленивые вычисления. С которыми обычный программист может быть и не знаком. Если, конечно, ранее ему не приходилось заниматься задачами по параллельной обработке данных.
Точно можно утверждать, что человек с опытом в разных языках программирования способен более адекватно выбрать для конкретной задачи наиболее подходящий инструмент. Это да, с этим не поспоришь. Другое дело, что возможностей для такого выбора у очень большого процента программистов просто нет – все уже выбрано за нас.
По третьему умению. Во-первых, простой и понятный код – это, во многом, следствие опыта, чувства стиля и вкуса. Во-вторых, это следствие хорошего знания языка и, что чрезвычайно важно, знание best и worst practicies для этого языка.
И вот здесь я склонен считать, что знание разных языков программирования вовсе не способствует упрощению кода. А может даже и наоборот. Поскольку на каждом языке нужно писать именно так, как принято писать на этом языке. Можно на Ruby писать как на Java. Но лучше все-таки использовать Ruby way. И в Java не стоит тащить привычки из C++. А чтобы этого не происходило, требуется a) хорошее знание языка (которое приобретается за счет длительного опыта, набивания шишек и их переосмысления) и b) отсутствие жгучего желания воплотить в X вот эту классную фишку из Y. И я, честно говоря, не понимаю, как знание многих языков программирования помогает пунктам a) и b).
За сим, пожалуй, закончу растекаться мыслею по древу. Буду признателен, если кто-нибудь сможет мне объяснить на простых примерах, как знание разных языков программирования делает программиста лучше.
PS. Кстати говоря, я придерживаюсь мнения, что здесь имеет место путаница. Не изучение языков делает программистов хорошими. Это хорошие программисты зачастую имею желание изучать разные языки. Так что здесь скорее причина и следствие перепутаны ;)