суббота, 13 марта 2010 г.

[prog.thoughts] Как же знание разных языков программирования делает нас лучшими программистами?

Существует такое старое изречение: “Хотите программировать лучше? Изучайте разные языки программирования!” Т.е. чем больше я знаю языков программирования, тем лучшим программистом я становлюсь.

Лично для меня это изречение до вчерашнего дня оставалось загадочным. Не понимал я до сих пор, как знание, например, Prolog-а, OCaml-а, С++ и Java может сделать меня лучшим программистом, чем знание только C++ и Java. Поскольку, в моем представлении, способности к программированию проявляются в таких вещах, как умение представлять задачу в виде последовательности элементарных действий, как умение выделять общие понятия, как умение устранять повторяющиеся последовательности одинаковых операций и т.д. Языки программирования к этим умениям имеют очень и очень далекое отношение.

Но вот вчера до меня, похоже, начал доходить смысл этой фразы. Вчера мои молодые коллеги устроили серьезный спор на тему (бес)полезности множественного наследования. Сам факт этого спора меня очень порадовал – это показатель того, что люди увлечены программированием, в таких условиях приятно работать. Хотя забавно наблюдать за спорщиками, которые о множественном наследовании имеют представление только из C++, имхо, нельзя рассуждать о (бес)полезности такого наследования не попрограммировав на Eiffel. Поэтому я старался в споре не принимать активного участия, а просто мастерски набрасывал очередную порцию дерьма на вентилятор… ;)

Да, так вот ближе к теме. Наблюдая за спорщиками я понял интересную штуку. Знание разных языков программирования полезно вовсе не тем, что у программиста расширяется кругозор и он может применять, скажем, в C++ подходы из OCaml или наоборот (кстати говоря, такие вещи могут быть как раз вредны). Полезность такого знания в том, чтобы считать принятые в каждом из языков решения и устоявшиеся идиомы нормальными. Т.е., нормально то, что в Java нет множественного наследования классов, и нормально то, что в C++ такое наследование есть. Так же нормально то, что в Ruby динамическая типизация, и так же нормально то, что в Haskell она статическая…

Вот именно эта способность, переключившись с C++ на Java, забыть об C++ных привычках, а перейдя с Java на Ruby забыть о Java-вских заморочках, и есть самое ценное. Ведь давно известно, что плохую программу на Fortran-е можно написать на любом языке. Поэтому плохой программист перейдя с C++ на Java будет писать плохие C++ные программы на Java или плохие Java программы на Ruby. А вот хороший программист, знакомый с разными языками программирования, будет писать плохие Java программы на Java и плохие Ruby программы на Ruby. Что уже значительно лучше ;)

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

Отправить комментарий