суббота, 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. Что уже значительно лучше ;)

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

4 комментария:

bsivko комментирует...

1) Поэтому плохой программист перейдя с C++ на Java будет писать плохие C++ные программы на Java или плохие Java программы на Ruby.

2) А вот хороший программист, знакомый с разными языками программирования, будет писать плохие Java программы на Java и плохие Ruby программы на Ruby.

Что уже значительно лучше ;)


А в чем разница? (чем лучше?)

eao197 комментирует...

>чем лучше?

Ситуация #1 -- есть плохая программа на Java, написанная в стиле Fortran-а.

Ситуация #2 -- есть плохая программа на Java, написанная в стиле Java.

В ситуации #2 ты можешь просто продолжать развивать программу. В ситуации #1 ты вынужден ее прежде переписать и получить (спустя какое-то время и какое-то количество усилий) стартовые условия ситуации #2.

Еще добавлю: имхо, хорошими программами могут быть только маленькие программы. Любая работающая большая программа -- это целый комплекс компромисов и тугой узел очень плохих, просто плохих и хороших решений/фрагментов. Так что, чем больше программная система, тем меньше шансов у нее быть хорошей.

Quaker комментирует...

Любая работающая большая программа -- это целый комплекс компромиссов и тугой узел очень плохих, просто плохих и хороших решений/фрагментов. Так что, чем больше программная система, тем меньше шансов у нее быть хорошей.
Ядро последней версии SObjectizer - это более 40 тысяч строк C++ кода. ObjESSty это еще 50 тысяч строк. Написанный на Ruby Mxx_ru - 10 тысяч строк.
В общем-то немаленькие цифры для одного программиста. Считаете ли Вы свои проекты плохими? Часто ли Вам приходится идти на компромиссы при написании кода?
p.s. "компромиссы" пишется с двумя "с".

eao197 комментирует...

>Считаете ли Вы свои проекты плохими?

Поскольку я заинтересован в рекламе своих проектов, не стоит от меня ожидать плохой оценки для них ;)

Это хорошие проекты, стабильные, работающие.

Без серьезных просчетов не обошлось (в SO -- это многословность и низкая скорость, в ObjESSty -- избыточность двоичного представления, в Mxx_ru -- заточенность под C/C++).

>Часто ли Вам приходится идти на компромиссы при написании кода?

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

>p.s. "компромиссы" пишется с двумя "с".

Спасибо, но у меня патологическая неспособность к грамотному письму.