понедельник, мая 07, 2007

Русский код

Ужас просто ужас я постю так как пришло +) отличный текст...
Русский код, бессмысленный и беспощадный.
Написанное является никакой не провокацией, а наблюдениями натуралиста. Не бросайтесь скороспелыми выводами.

Встречаются профессиональные термины (программистские, психиатрические и матерные).

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

Оказалось, я ошибался, может быть куда хуже, я всегда в таких случаях ошибаюсь.

Вот скажем, индус. Ему дали задание - напиши код, который проведет, допустим, прямую от А до Б. И что вы думаете - прямая будет проведена. С использованием всех известных индусу технологий, которых больше, чем позиций в Камасутре. Например, на последней работе данные читались и писались в базу с использованием JDBC, JDO, EJB и Hibernate, иногда одновременно. Что поразительно, все это работало - из точки А в точку Б. Иное дело, если бы вдруг потребовалось провести еще одну прямую, допустим, еще и в точку Ц, тут весь продукт пришлось бы переписывать. Как мосты и тоннели никто не проектирует на многофункциональность, так же и индусский код, сплошная железная дорога без стрелок. Нужно - прокладывай новую, семью всем кормить надо, проектов мало, индусов много.

Хуже индусского кода может быть только код европейский, особенно голландцев или датчан. Это тоже объяснимо, у них источники вдохновения легализованы. Из точки А в точку Б никто никуда не едет, зато есть framework. В котором можно задать plug-in, который конфигурирует другой plug-in, который читает третий plug-in и посылает event четвертому, а тот уже знает, что делать. Через Inversion of Control, так интереснее. Я как-то цитировал одно европейское творчество, и, по-моему, это достойно повторения:

Before describing the configuration aspects of components (...), component types and implementations are described, since it is aspects of the component type that are configured by components – and the configurable aspects are defined by the component type.

И это только документация, а исполнение, поверьте моему горькому опыту, еще затейливее.

Но все это - ничто в сравнении с отечественным кодом. В нем из точки А в точку Б прямую, конечно, проведут. Квадратно-гнездовым методом. Я не очень понимаю, что такое квадратно-гнездовой метод, но будет использован именно он. Врагу достанется выжженная земля с одной стороны, и ни пяди ее - с другой. Из А в Б будет проведено столько прямых, что Лобачевский отдыхает. Еще большее количество прямых будет проведено из Б в А, на всякий случай, как в анекдоте - строительство туннеля под Ла Маншем начнется одновременно из Англии и Франции, и продлится пять или десять лет, в зависимости от того, встретятся ли строители посередине. Зато комментариев в коде не будет, потому, что код - лучше любого комментария. С этой же целью всем переменным будут даны имена из учебника по шахматам, из раздела "цугцванг". Кстати, о шахматах, помните ли вы притчу про их изобретателя, индуса (хе-хе), который в качестве вознаграждения попросил 264-1 зернышек рису? Это индийский подход, он же ламерский, отечественный программист знает, что есть функции стремительнее экспоненты. Если вы подумали "домкрат", то не угадали, домкрат только падает. Зато есть факториал, помните про такое?

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

OutOfMemoryError, говорит компутер. Памяти у него - два гига, и даже Билла Гейтса не приплетешь, сплошной Линукс. Шо за фигня, все посмотрели на сисадмина, строго так, со значением. Сисадмин вздохнул, ударился оземь, обернулся птицей и добавил серверу еще два гигабайта памяти. OutOfMemoryError, повторил компьютер, только теперь уже не сразу, а немного подумав. Тогда все посмотрели на Ди-Би-Эя, еще строже, DBA тоже вздохнул, и урезал базу напополам, до сорока тысяч, от плеча до седла. Потом еще раз. Двадцать тысяч строк в память влезли, им там было уютно, но работать не собирались.

К этому моменту индивидуальные эмоции сложились в одно большое коллективное "бля". Потому как, в production базе данных записей под миллион, а арифметику все учили еще в колледже. И я пошел смотреть в код.

То, что я там увидел, словами не описать, ибо слова есть продолжение мыслей, но я все же попытаюсь. Есть такое понятие, сложность алгоритма. Если есть N объектов, а алгоритм работает независимо от их числа, сложность такого алгоритма - константа, и это очень хороший алгоритм. Но все задачи так не решить, поэтому есть алгоритмы, работающие за время, пропорциональное логарифму N, и это тоже хорошо. Хуже, если время работы алгоритма пропорционально N, совсем плохо, если N2, и хуже некуда, если время работы растет, как экспонента от показателя N. М.-ские труженики умудрились преодолеть и этот барьер, в погоне за константной скоростью работы алгоритма они умудрились добиться факториального, N!, потребления памяти.

Идея чрезвычайно проста. Если известно заранее, что будет искаться фраза "мама мыла раму", эти орлы создавали в памяти все возможные пермутации, как то, "мама раму мыла", "мыла раму мама" и так далее. Все эти варианты засовывались в хеш-таблицу, со всеми сопутствующими объектами. Ожидалось, что время поиска в такой таблице - константа, потому, как ищется квадратно-гнездовым методом. Фразы были и по пять, и по восемь слов. Факториал восьми никто не брал? Если брали, положите на место. Тут и двадцать тысяч фраз - достижение, удивительно, что столько влезло.

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

Я хочу другой глобус.
П.С. Унес к себе, ибо потом может пропасть +)