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

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

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. Молчит уже сутки. Видимо, проникается идеей...

1430

Индийская гигиена

Фиксили как-то баг в одной программе. Делали ее какие-то индусы для забугорного заказчика, а нам досталась поддержка.

Структура программы была такова: имелось несколько форм, каждая с меню. По выбору пункта меню пользователь переходил на новую форму или возвращался на предыдущую. Прототип формы имел четыре основных метода: конструктор/деструктор и колбеки входа/выхода. Когда пользователь уходил «вглубь», формы не удалялись, а складывались в линейный стек, поскольку по задумке юзеру всё равно придётся через них возвращаться. Удаление форм и их ресурсов происходило при возврате назад по удалению из стека.

Баг заключался в том, что на одной из форм, если ее пройти несколько раз, меню увеличивалось, наполняясь дублирующимися пунктами. Оказалось, наполнение этого меню происходило не единожды, в конструкторе (как и везде по проекту), а каждый раз при заходе в форму. Я перенёс несколько строк — заработало на ура.

Решил позвать старшего по отделу, сурового программера, чтобы он тоже подивился индийской мудрости. Он полистал код, позадавал много общих вопросов и молвил:

— Возвращаем как было, а по событию выхода просто очищаем меню.

— Да тут во всём проекте именно так! Меню по-любому очистится, когда форма из стека уйдет.

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

Это окончательно развеяло сомнения о вариантах фикса и означало многодневную переделку всех форм по проекту. В итоге заказчик сказал отдельное спасибо нашей команде за проделанную оптимизацию.

1052

Диктуйте по буквам

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

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

965

В Советской России Гугл ищет вас!

Работаю веб-программером — делаем разнообразные сайтики и интернет-магазины. Очередной клиент попросил, чтобы к сайту была прикручена статистика от Google. Я прикрутил, а до кучи поставил сайт в очередь на индексирование.

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

Прошло некоторое время. В аську стучится админ сервера компании-заказчика: «Твой проект грузит на 103% процессор MySQL-сервера!»

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

Поиск после этого доработали, бота от страницы выдачи отвадили и даже морфологию прикрутили. Вспомнили и бессмертную фразу Стива Макконнелла: «Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете».

696

Действительно простые числа

Учился я тогда в восьмом классе, однако ещё в шесть лет родители купили мне «букашку» (БК-0010-01) со встроенным Бейсиком, на котором по тоненькой брошюрке я учился ваять простенькие программы.

На контрольной по ИВТ дали задание вывести на экран простые числа от 1 до 100 через запятую. Предполагалось, что надо задать массив, а потом в цикле выкидывать из него составные числа. На выполнение задания давалось два часа.

Через 10 минут подзываю преподавателя, показываю вывод программы, получаю пять и у всех на глазах с гордостью покидаю класс. Листинг выглядел следующим образом:

10 CLS

20 PRINT "2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97"

30 END

554

Инициализируй это

Был у нас в универе один вредный препод. Не любили его, так как предмет свой он преподавал просто отвратно. И вот однажды надо было сдать ему на зачет какую-то программу. Мой друг написал ее. Сдал. Со второго раза получил допуск к экзамену. Мне стало интересно. Запускаю - работает. Обрадованный беру код, смотрю. Спустя пару секунд падаю под стол от такой строчки:

for (int i=0; i

- Что это? - спрашиваю.

- Инициализация - отвечает мне друг.

Да, конечно, инициализация. Прогрев памяти перед работой...

Загадка - как препод пропустил все это? Наверное, код не открывал даже. Работает, и ладно.

491

Клиент-серверная модель по-государственному

#482 навеяло...

Некоторая конторка подвизалась для одного из округов большого города сваять систему расчета коммунальных услуг населению. Умолчим про то, что она была написана на MS Visual Basic for Applications., а потому требовала на машинах Клиентов в обязательном порядке MS Office. Сама база лежала на MS SQL, клиенты цеплялись к базе напрямую. И как-то в том округе сложилось, что сервер был несколько слабее рабочих станций, и потому были написаны гениальные перлы. Загружаем, например, все на рабочую машину в память (SELECT * FROM) - потом считаем. Распечатать квитанции за месяц - да пожалуйста, тем же SELECT * FROM надергали из массива в шаблон отчета - печатайте!

Все это не смотря ни на что прекрасно работало с парой-другой тысяч клиентов и понравилось какому то чиновнику из области и стал он продвигать это на места в города, городишки и прочая. Одного только не учли, что в среднем таком городке лицевых счетов - несколько десятков тысяч. И понеслось - бесконечные оптимизации, доработки, исправления, решения проблем. Постоянное зависание рабочих станций ввиду того, что нету там свободной памяти в гигабайтах, а если и есть, то ворочать такие объемы - мрак.

А сервер с четырьмя гигами оперативами и двумя Xeona`ми по 3ГГц стоял в сторонке и спокойно отдыхал...

Русский деревенский код.