Истории с тегом: индийский код

Всего историй: 192

8371

Франкенштейн учится программировать

Началась эта история в разгар кризиса 2009 года. Работы в нашей микрофирмочке становилось все меньше с каждым днём. И тут, как в сказке, к нам постучалась некая биохимическая лаборатория с заказом на разработку софта для лабораторного комплекса, ссылаясь на наше название, в котором был намёк на кроссплатформенную разработку. Ну да, у нас было три программиста: один начинал с линуксов/C++, второй с Win/Java, а третий ещё на КПК со времён «палмов» софт писать умел. В общем, честно сказать им, что мы абсолютно не то, что им нужно, я сразу не рискнул, а через пару минут понял, что им, в сущности, уже всё равно, с кем пропадать.

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

Я попросил посмотреть на софт и понял коллег. Была одна старая машина под Win’98, на которой всё работало, и несколько машин, на которых эту разработку пытались запустить, но даже тотальное копирование жёсткого диска не помогало.

Через полдня изучения скопированного диска вырисовался диагноз. Обработка собрана из восьми опенсорсных и не очень пакетов разных лет и языков, написанных на Fortran IV, Java, Аda'95 и JDBC, работающих с обновляющимися через интернет научными базами данных самых разных форматов, для полного счастья склеенных редкой версией Perl, в которой, кстати и велась финальная часть обсчёта. Работа с БД велась через CPAN/ODBC.

Собираясь попрощаться, спросил, сколько же денег предлагают за такую работу. Переспросил. В общем, взялись.

Знакомый сисадмин собирал на корпоративных свалках компы, идентичные рабочему, а мы пытались понять, почему не работают нормально инсталлированные копии.

Не прошло и месяца, как ларчик открылся. Версии компиляторов и библиотек к пакетам были не просто разные, но и несовместимые, поэтому модули ставились только в строго определённой последовательности. При этом периодически приходилось менять переменные PATH для обеспечения правильной последовательности вызова разных версий компиляторов. Конечно, найти версию библиотек 1991 года выпуска было непросто, но мы справились.

А самый весёлый секрет состоял в том, что PATH иногда надо было корректировать прямо во время сборки, работая клавишей Pause. Кстати, make тоже надо было иметь трёх видов.

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

Вскоре мы уже приготовили первую версию софта, не содержащую ничего пиратского, потому что в следующем году обещали купить около 15 систем. В фирме уже десять человек — может, даже на одном языке всё перепишем когда-нибудь…

8349

Индус — не национальность, а диагноз

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

Написал. Вношу тестовые данные, заведомо неправильные, чтобы посмотреть предупреждение. Позволяет вносить. Проверяю свой код. Всё верно. Немного меняю условие. Всё равно повторы вносятся. Проверяю ещё раз. Пауза. Перерыв на кофе. И ещё раз. Лезу в код функции.

შენ მოგიტყან ტრაკი! Спасибо товарищу, который научил ругаться по-грузински — окружающие не понимают смысла. Ну почему в функцию имя поля должно передаваться в виде (field_name), а не field_name — без скобок?

И пофиг, что автор этого кода британец. Всё равно он индус.

8328

В Индию со своим самоваром

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

Дальше — больше. Оказалось, о нормальных формах тоже никто не слышал. База данных предоставленного мне проекта имела чудовищную структуру, была не нормализована, во многом избыточна и нелогична. Выяснилось также, что самые основы — SQL — эти горе-разработчики не знают: везде и всюду я натыкался на чудовищные, громадные и неудобные запросы. Складывалось ощущение, что на словах SELECT, FROM и WHERE изучение разработчиками SQL закончилось.

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

Задолбали люди, которые не хотят прислушиваться к конструктивной критике. Достали те, которые считают себя специалистами, но категорически отказываются воспринимать новое. Устал я от тех, кто не старается сделать свою работу хорошо и качественно. Пугают такие конторы: когда к ним устраивается специалист без опыта, они могут научить его только плохому.

8262

На полпути выделялка сломалась

Найдено в коммерческом коде. Пишет бывший московский студент. Ну что, не только индусы получают деньги за объём программного кода.

if (isSelected) {

component.setBackground(Color.BLUE);

} else if (!isSelected) {

component.setBackground(Color.WHITE);

} else {

throw new IllegalStateException(

"Table row should be either selected, or not"

);

}

8203

+20% мозгов

Разбирался с одной невероятно тормозящей программой. Нашёл источник проблем — жирную библиотеку непонятного назначения. Морально подготовился к встрече с индусским кодом и долгим раскопкам. Открываю. Первый комментарий:

//TODO:

//include brains.h

//include hands.h

//exclude indian.h

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

//DONE!

//thank you, unknown developer!

8161

Под шелест выпадающих ячеек

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

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

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

8150

Маленькое чёрное платье.gif

Поступил заказ на модификацию дизайна юкозовского сайта под минимализм: чёрный, белый, серый. Без картинок. Вроде бы ничего сложного, одна халява.

Но не тут-то было: при изменении части кода, отвечающего за вывод информации, новости и всё остальное начинали выводиться в непонятном порядке, не поддающемся форматированию. Пришлось вернуть стандартный кусок кода и задуматься, что бы сделать.

Решение было найдено наше, русское: заменить все картинки, использующиеся в фоне и обводке контента, на простые однопиксельные чёрные гифки. Заказчик доволен, деньги у меня. Но если клиенту приспичит сменить цвет фона… В общем, это будет уже не моя забота.

8124

Никакого волюнтаризма

Как же достала эта святая вера в неизменность настроек по умолчанию!

Сделай диск С: размером в 3—5 ГБ, переназначь %TEMP% и %TMP% на раздел побольше, и… И фиг ты извлечёшь большой архив или поставишь новую игрушку. Почему? Правильно: потому что программы упорно продолжают использовать C:\Windows\Temp в качестве временного хранилища. И ладно бы там всякие поделки, но продукция компании NCsoft?

Задолбался. Сделал С: размером 15 ГБ.

7968

Ни дня без развлечений

Я до сих пор не понимаю, что это было, но оно скрасило бессонную ночь и научило меня иначе относиться к игровым конструкторам.

Было дело, писал скрипт по закачке игровых ресурсов в оперативную память по списку. В числе прочего в коде присутствовал скрипт по чтению списка ресурсов из INI-файла. В стандартной библиотеке конструктора функция, читающая переменные в секциях инишника, была, и я решил использовать её, дабы не писать лишний код.

Алгоритм протестирован, выдаёт верные результаты. Остаётся скромный допилинг до практически готового скрипта. Добавляю функцию из стандартной библиотеки, запускаю программу в режиме отладки… Окно «Unexpected error occured» вместо правильных результатов. Проверяю циклы, исключаю возможность бесконечной рекурсии, тестирую заново — то же самое.

Строчку кода, добавленную перед последним тестом, нафиг в комментарий:

// output = ini_read_string('res', string(global.resource_files[argument0]), '');

Та-дам! Алгоритм работает. Синтаксис верный, типы параметров совпадают — что неладно? Убираю комментарий, заменяю функцию, передающую в параметр строку, простой строкой вида:

output = ini_read_string('res', 'untitled.jpg', '');

Всё работает на ура. Думаю, вы уже догадались, в чём дело? Функция из стандартной библиотеки принимает в качестве параметра строку и работает с ней без проблем, а с функцией, передающей абсолютно идентичную строку в параметр, вылетает, выдавая неопознанную ошибку.

Спасибо вам, дорогие индусы-разработчики! Без вас было бы так скучно!

7778

Айтишники лома и кувалды

Работники железнодорожных депо в чём-то похожи на айтишников. И те, и те знают у себя каждый винтик; и тем, и тем нужно поддерживать в рабочем состоянии всё своё хозяйство; и те, и те должны как можно быстрее исправлять косяки; и те, и те в курилках рассказывают увлекательные истории.

* * *

Эффект присутствия, говорите? Было, знаем. Есть манёвровый тепловоз, который отказывался работать со всеми машинистами, кроме одного. Долго думали, но таки отыскали причину. Дело тут было вовсе не в присутствии, конечно, а в том, что машинист этот имел привычку работать стоя. При чём тут это, спросите? А всё просто: под сидением протёрлась проводка, и как только кто-то на него садился, получалось КЗ.

* * *

Баг на баг равно исправность, говорите? Тоже бывало. Стояли на запасных путях две секции от разных электровозов, списанные по причине полной неисправности: не работало абсолютно всё. Тут стоит сказать, что на таких электровозах секции равнозначны, то есть могут ездить по отдельности. Ну так вот, как-то взяли их и соединили. И что бы вы думали? Поехали! Правда, половина систем не работала, а те, что работали, ломались через раз, но важно, что они вообще сами стронулись с места.

* * *

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

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

* * *

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

Вот вам и айтишники лома и кувалды.