bash.im ithappens.me zadolba.li

Индийский код

2324

Истинный фейл

Кодеры под Новый год порадовали. Есть требования на дизайн некой функции, которые звучат примерно так: «The %function()% shall perform %action% when its %parameter% is true...» Автор документа опечатывается и пишет: «its %parameter% os true». Понятно, буковки „i“ и „о“ рядом. Доблестный вордовый спеллчекер не согласен с вариантом и заменяет на «its %parameter% or true».

Умница. Так лёгким движением электронов по кремнию условие превращается в чёрт знает что, оставаясь при этом вполне понимаемым. Верификаторы — люди непривередливые, на логичность им ругаться запрещено, не их ума дело, кода (якобы) не видят. Пишут пару тест-кейсов на покрытие этого условия, получают фейл и тут уже с чистой совестью открывают issue на requirement/code mismatch — всё по процедуре.

На носу католическое Рождество. Прекрасно понимая, что америкосовый интегратор скоро уйдёт на каникулы, индусский кодер торопится исправить баг, втыкает в требования, втыкает в код, видит там if(param) {}, говорит «угу, непорядок» и приводит код в соответствие с требованиями: if(param || TRUE) {}. Код по требованиям, фейлов нет, придраться не к чему.

2233

Индийская маршрутизация

Вы говорите, индийскому коду в институтах учат? Надо зрить в корень, господа. Сегодня мне довелось побывать на уроке восьмого класса по информатике. Темой были маршрутизация и веб. Тема вроде важная, но содержание — сплошной LOL. Итак:

«На сервере установлена специальная программа под названием TCP/IP. Причём первая часть, то есть TCP, занимается разделением сообщения на части, а вторая — маршрутизацией».

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

«На сайте стоит специальная программка HTTP, которая хранит и ищет в интернете веб-странички. Если искать информацию на одном сервере и на другом, то результат будет разный. Поэтому результат поиска на Яндексе и Mail.ru отличается».

Без комментариев. Если у нас так будут учить основам компьютерной техники в школе, то в институтах ещё долго будут писать индийский код.

2097

Коротко и ясно

Дело было на первом курсе, когда вместо давно и хорошо знакомого Паскаля мне пришлось заняться С/С++. Язык этот показался мне довольно странным, однако, наскоро выучив синтаксис, я сумел-таки написать необходимые для зачёта программы. Нюанс был в том, что в одной из них, касавшейся обработки массива, я сумел посадить маленькую и весьма неочевидную багу: не выдавая никаких ошибок на этапе компиляции и не влияя на правильность вычислений, она зверским образом пожирала память. На школьном Паскале с его искусственно ограниченными размерами массивов такое построение программы прокатывало, как говорится, на «ура» — но всякому овощу своё место...

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

Увидев мой индийский код, дедок переменился в лице, вскочил из-за стола и на всю аудиторию возопил: «Это ещё что за х@#ня?!»

Гробовая тишина. Преподаватель, осознав, что он не один, тоном значительно пониже добавил: «Вы уж простите мою терминологию».

Больше такой ошибки я никогда не допускал.

2020

Метафоры 2.0

Работаю на одного известного в узких кругах производителя WiMax-оборудования. Недавно апгрейдили немаленькую сеть на новую версию софта, и при этом родилась пара фраз, отражающих процесс:

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

А надеяться на то, что всё пройдет безглючно — это делить на ноль шкуру неубитого медведя.

2008

Дитя человеческое

Несколько лет назад наша контора внедряла большую ERP-систему в большой конторе. Всё было настроено, отлажено, проверено, данные загружены. Наступило замечательное время, которое у консультантов называется UAT. Восхищённые/раздражённые юзеры полезли грязными руками тыкать в кнопочки. Одним из юзеров был важный дядя (не Сам, но почти).

Итак, модуль по работе с кадрами. Дядя, не мудрствуя лукаво, запрашивает свои собственные данные и выпадает в осадок. Мало того, что он отображается в системе как женщина, так он (она?) ещё и беременный! Так как кодят систему в основном индусы, огрехи всплывают часто. Как оказалось, забеременеть можно не только по естественным причинам, но и в результате неправильного использования nvl и decode.

Ведь обещали миллион условных енотов первому мужчине, который родит. Можно сказать, дядя шел к успеху, но не подфартило. Исправленный код выпустили через неделю. А какая была мечта!

1801

Фабрика индусов

И снова к теме преподавания индусских технологий в наших вузах.

Есть у нас замечательный предмет — ТОИ (теоретические основы информатики). Принимает лабораторные молодая женщина, упорно желающая казаться беспристрастным и разбирающимся в предмете преподавателем. Задания простенькие, однако некоторые доучившиеся до третьего курса будущие учителя информатики всё еще искренне верят, что единственный целочисленный тип — integer, и не понимают, почему при целочисленном делении оных integer'ов (45273 — чем не целое число?) результаты получаются отрицательными. К слову, программы те тоже не ими писаны: «В школе у нас программирования не было, как я буду писать?»

Так вот, для разогрева после года без Паскаля надо было написать программулю, которая выводит цифры введённого числа в порядке старшинства разрядов, начиная с наименьшего. mod, div, вывод, перезапись переменной — делов-то, десять строк по одной команде на каждой и одна переменная longint. Сдаю. «Суровый» преподаватель интересуется: «Как ты проверишь, сколько там цифр в числе?» Показываю цикл с постусловием. Ей что-то не понравилось — попросила переделать так, чтобы пользователь сначала вводил количество цифр в числе, а потом уже само число В случае несовпадения вообще не надо было производить никаких подсчётов, зацикливаясь на операторах ввода данных до образумления пользователя.

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

Вот вам и практика по ТОИ, «теоретическому обучению индусов».

1718

С чувством, с толком, с расстановкой

Обучение индийскому коду? Судя по всему, это нормальная практика во всех российских вузах, не полностью направленных на IT — исключения можно пересчитать по пальцам.

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

Один из предметов назывался «Моделирование экономических процессов». О чём шла речь на лекциях, не понимал никто (по-моему, и преподаватель в том числе). Курс должен был закончиться написанием программы (естественно, на краденом Delphi 7). Смысл программы примерно следующий: придумывается какой-то процесс, связанный с обслуживанием случайного потока клиентов, задаются характеристики этого самого потока и возможностей персонала, клиентов обслуживающего. Нужно посчитать, сколько людей уйдут, не дождавшись обслуживания, сколько персонала действительно нужно, и так далее. В принципе, не очень сложно, но поработать пришлось на славу.

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

Я сдавал программу третьим или четвёртым. Преподаватель нажимает кнопку — программа выдает результат. Меняет параметры, нажимает кнопку — снова результат. Начинает возмущаться, я берусь переделать спорные моменты.

Во-первых, оказалось, что вычислять посетителей на каждую минуту неправильно, надо на каждую секунду. Во-вторых, надо было совершить 20 прогонов для точности. Программа чуть затормозилась, но положенный результат за 120–150 мс вычисляла. Преподаватель опять недоволен.

— Скажите, почему вы не хотите принимать работу?
— Она у вас неправильно работает.
— Почему? Вот код, если не верите результатам, посмотрите сами.
— Вот мне делать больше нечего, кроме как код ваш смотреть! Я и так знаю, что там ошибка — она слишком быстро работает. Так быть не должно, переделывайте.

Sleep(1) в цикле вычислений и прогресс-бар в отдельном окошке спасли отца русской демократии, но после получения зачёта я начал догадываться, что в этом вузе ничему хорошему меня больше не научат.

1708

Обфускация: вводный курс

На первом курсе мы занимались моделированием простеньких физических систем. Очередным заданием было смоделировать колебание маятника и получить петлю гистерезиса. Задание я выполнил за пару, все работало в моём понимании как нужно — понёс сдавать. Преподаватель посмотрел на работу программки, открыл код и, быстренько прокрутив колёсиком, заявил, что у меня не хватает зависимости от массы. Моё разочарование было настолько сильным, что я и не подумал расспросить более конкретно, о чём идет речь.

В течение недели я пыхтел над кодом, всматриваясь в каждую строку и пытаясь понять, о чём шла речь и что не так. На очередном занятии я всё же решил спросить препода, что имелось в виду? Он мне рассказал о том, как нужно писать код: оказывается, «зависимость от массы» — некий кусок той математической формулы, которую я использовал; от меня требовалось добавить комментарий и выписать этот кусок на отдельной строке.

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

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

Каждую неделю до конца семестра я дописывал по «болванке». Код финального варианта программы увеличился раз в пять по сравнению с начальным и оброс густыми ненужными комментариями. Преподаватель, окинув взглядом объём, наконец заявил, что теперь программу примет. Так меня учили индийскому программированию.

1636

Обезьянья CMS

Говорят, что если усадить миллион обезьян за печатные машинки, то с ненулевой вероятностью одна из них наберет «Войну и мир». У одной обезьяны, похоже, получился CMS.

Отдел поддержки клиентских серверов датацентра. Приходит клиентское письмо с жалобой: «После обновлений базы товаров нашего интернет-магазина сайт перестаёт работать и вообще». Сайт вольготно размещён в одиночку на сервере с двухъядерным процессором и 2 ГБ памяти — проблем с производительностью быть не должно. Прошу пнуть нас именно в момент обновлений.

Дожидаюсь ответа «вот сейчас не работает!» Смотрю — на машине оба ядра под завязку нагрузил MySQL. Логинюсь в «мускуль», даю запрос show full processlist. Изумляюсь — терминал виснет наглухо. Передёрнув терминал и залогинившись обратно на машину, запускаю тот же запрос с выводом в файл. Смотрю в результаты: сервер отрабатывает два запроса общей длиной в 1,2 с копейками мегабайта.

Как выяснилось, чудо-фронтэнд магазина выгребал какие-то данные запросом вида «Select * from Таблица where productID='такой-то' and enabled=1 or productID='еще_какойто' and enabled=1 or...», и так до упора. Несчастный MySQL вдумчиво проверял каждую строку немаленькой таблицы на соответствие десяткам тысяч логических условий.

Клиенту отписал, приложив результаты show full processlist. Молчит уже сутки. Видимо, проникается идеей...