Я, усталый работник саппорта, поздней ночью грустно читаю IT happens — пожалуй, самые непонятные мне темы про индийский код и программизмы. Достаю из кармана смарт.
3:34
Вс, 3 апреля
Москва
Временами солнечно
Это оно?
Всего историй: 897
Я, усталый работник саппорта, поздней ночью грустно читаю IT happens — пожалуй, самые непонятные мне темы про индийский код и программизмы. Достаю из кармана смарт.
3:34
Вс, 3 апреля
Москва
Временами солнечно
Это оно?
Не так давно один из преподавателей рассказал поучительную историю из своей практики. По совместительству он является ещё и заведующим лабораторией робототехники, которая делает роботов для Росатома.
Как-то раз заказчики обратились с жалобой на изделие: когда робот едет на максимальных скоростях, вместо того чтобы разматывать за собой питающий кабель, он начинает его сматывать. Стали разбираться. Ошибка в итоге оказалась из числа классических, связанных со знаковыми величинами. Дело в том, что скорость сматывания-разматывания кабеля вычислялась из скорости движения робота, которая могла быть и отрицательной. На этом-то и погорели: на большой скорости старший разряд переменной, в которую заносилась текущая скорость, становился равен единице, и машина думала, что едет задом, со всеми вытекающими. Баг «спал» три года.
Работаю штатным кодером в маленькой европейской стране. Меня всегда умиляла реакция людей, которым повезло заглянуть в мой экран и увидеть там что-то типа:
class Destructor() {
public function get_parent_location() …
public function kill_children() …
public function kill_child_by_parent() …
}
Чаще всего удавалось отшутиться и вовремя объяснить, что это всего лишь заготовка под проект для управления различными деревьями данных, но на прошлой неделе везение кончилось. Новый секретарь, присевшая за мой ноутбук с моего же разрешения, не стала терять времени даром и тем же вечером позвонила в службу безопасности, очевидно, решив, что видит программу управления каким-нибудь спутником-шпионом или бомбой с искусственным интеллектом. Последствия бдительности гражданочки я разгребаю до сих пор.
Коллеги, будьте внимательны — избегайте контакта запуганных юзеров с открытым кодом!
Работаю я в конторе, связанной с производством программно-аппаратных комплексов для телевещания.
Утро, метро, очередь в кассу. На моё плечо ложится чья-то рука. Поворачиваюсь и вижу друга, с которым не виделись пару лет. Разговорились. Друг спрашивает:
— Чем на хлеб зарабатываешь?
— Программы для телевидения пишу.
В этот момент ко мне поворачивается стоящая впереди женщина:
— Молодой человек, это вы пишете программы для телевидения?
— (слегка растерявшись) Пишу… А что?
— Тогда объясните мне, почему сериалы идут в такое неудобное время?
Пришлось двинуть стрелы на приказ начальства и посоветовать накатать жалобу на имя Эрнста.
Эта короткая, но поучительная история приключилась со мной в юности, году этак в 93-м. Пребывая в глубоко промежуточном состоянии абитуриента и проскочив в универ без экзаменов, под конец лета я приналёг на водочку. Онажды за каким-то фигом (не помню уже зачем — родителям в помощь, наверное) потребовалось мне вечером запрограммировать какой-то график.
Ну, надо, так надо. Ничтоже сумняшеся, я, пошатываясь, вскрыл свежую пол-литру злого яда и на пару с оной плюхнулся за комп. Прихлёбывая, приступил. Всё, что помню — сначала на экран нужно было выплюнуть сетку координат десять на десять клеток. Дальнейшее — тайна, покрытая раком… Ни фига не помню.
Просыпаюсь утром мордой в клаве. Тем, кто спал только мордой в салате, завидую. Клава, само собой, пищит от переполнения очереди, экран забит одним символом. Фиг с ним — лезу наверх тереть мусор и натыкаюсь…
Я таки нарисовал эту сетку координат. Запустил программу — всё пашет идеально. Вот только передо мной во всём своём непередаваемом великолепии красовались двадцать два последовательных вызова LineTo и столько же вызовов MoveTo с вручную расчитанными экранными координатами — и никаких циклов.
С тех пор зарёкся кодить пьяным. Уже сколько лет прошло, а до сих пор помню и содрогаюсь…
Потерял паспорт три года назад, написал заявление об утрате в МВД. Потом паспорт нашёлся, и заявление я забрал.
Получаю права. Мне говорят, что паспорт в розыске. Пошёл в паспортный стол разбираться. Оказывается, у них такая особенность программы: паспорт «потерять» можно, а вот «найти» нельзя. Итог — ещё две недели ожидания нового паспорта, потом мучения с правами. Хотелось бы взглянуть в глаза ответственному программисту и сказать несколько нежных слов.
В конце восьмидесятых у нас в школе появились компьютеры — клоны «Синклера». В системе были предустановленные игры и поддержка Бейсика, разумеется. Наглядевшись на всё это, мой друг решил написать собственную игру — лучше тех, что были в комплекте. И написал. Это была простенькая двумерная космическая стрелялка — для тех времён очень даже ничего. Я был назначен первым тестером.
Исхитрившись остаться после уроков в классе, я стал увлечённо играть. За сбивание звездолёта с первого выстрела игроку добавлялась в запас одна жизнь. Я набрал пятнадцать жизней и, пальнув по очередному звездолёту, ожидал прибавления шестнадцатой — но жизней стало ноль, и я умер.
Прошло уже больше двадцати лет, а я так и не полюбил компьютерные игры.
Работаю в совершенно замечательной конторе, занимающейся веб-разработкой на базе коммерческой CMS на букву «Б». Понадобилось нам создать дополнительную примочку к административной панели. Важную миссию доверили вашему покорному слуге.
— А вот такой-то вариант вызова функции может быть? — поинтересовался я, когда продумывал алгоритм.
— Нет, что ты! Согласно концепции проекта такое невозможно. У нас всё будет по-другому, — ответил мне senior developer, сидящий за соседним столом.
«Ну и славно», — решил я и воткнул в случае «невозможного» вывода функции код, прекращающий выполнение программы со специфическим сообщением об ошибке. Написал и забыл — проект шибко большой, работы много.
Прошло три недели. Сижу, ковыряюсь в коде, и тут справа от меня раздаётся проникнутый удивлением вопль на весь офис:
— Что это?!
Подлетаю к «сеньору» и вижу на экране открытую админку, где вместо полей с данными для заполнения виднеется заветное сообщение об ошибке: «Горшочек, не вари!»
Думаю, что каждый программер хоть раз в своей жизни слышал историю про американский спутник, улетевший к чертям из-за ошибки в одном байте машинного кода. Американцы американцами, а свой урок на тему «почему писать безглючный код так важно» ваш покорный слуга получил.
Будучи обычным студентом обычного вуза, мой брат Саша помимо обычных студенческих увлечений уважал две вещи: программирование и хоккей. Именно поэтому в качестве обязательной для любого студента халтуры была выбрана полставочная должность инженера-системотехника в местном ледовом дворце. Да, в нашем уездном городке была своя хоккейная команда (назовём её «ГазМяс»), которая играла хоть и не на высшем уровне, но с довольно стабильной периодичностью занимала призовые места в своём дивизионе. Тренер «ГазМяса», дядя Вася, пользовался огромным уважением в кругах болельщиков.
Сашкина работа была довольно творческой и в основном заключалась в лечении внезапно глюкнувшего электронного оборудования. Особенно любимым занятием на рабочем месте была пляска с бубном вокруг электронного табло. Монохромная светодиодная панель через пень-колоду была подключена к гордости завхоза ледового дворца, старенькому 286-му с 640 килобайтами памяти и 30-мегабайтным винчестером. Работой табло управляла писанная на Сях программка, сопровождение которой передавалось по наследству от одного инженера-системотехника к другому. Жил мой брат да не тужил, но в один прекрасный день пришёл домой сильно пьяным, а наутро подал заявление об уходе. О причинах такого поступка он рассказал мне только через десять с лишним лет, и то после очень хорошего количества совместно принятого на грудь алкоголя.
Шёл февраль, хоккейный сезон подходил к своей кульминации, и мой брателло начал было грустить по поводу будущего вынужденного отпуска, как вдруг в один прекрасный день к нему в каморку зашёл профсоюзный деятель с предложением скинуться на подарок к дню рождения дяди Васи. И тут Сашка зажёгся Идеей! Лучший подарок для тренера что? Разумеется, победа любимой команды!
Идея была простой и гениальной. Большинство очков «ГазМяс» терял, лидируя в конце матча с разницей в одну шайбу и пропуская гол за несколько секунд до конца встречи. Соответственно, если как-нибудь уменьшить время игры, то и вероятность неблагоприятного исхода была бы меньше. Помимо судьи-хронометриста, контрольный секундомер которого благополучно пылился в ящике стола, единственным источником точного времени было пресловутое табло. Идея Саши заключалась в следующем: модифицировать табло так, что если «ГазМяс» ведёт, то смена секунд происходила бы не через одну секунду реального времени, а приблизительно через 0,9 секунды. Разница для человеческого глаза во время игры практически незаметная, но для игры — довольно критическая.
В программу было внесено следующее условие:
for (i=0; i<2; i++) { // Мы не знаем, в каком порядке команды будут на табло
if (startswith(lower(team[i]), "газмяс") { // Пусть мелочь из «ГазМяса-2» тоже порадуется
teamindex = i;
}
}
if (score[teamindex] > score[1 - teamindex]) {
quantifier = 0.9;
} else {
quantifier = 1;
}
Изменения были успешно протестированы на второй команде. Наступил день рождения уважаемого тренера, по совпадению ставший и днём очередного матча «ГазМяса». Саша, предвкушая радость дяди Васи вечером, отправился сдавать последний экзамен сессии. Только вот препод попался на редкость въедливый, и освободиться брату удалось только часов в восемь, аккурат к окончанию третьего периода. В нетерпении он зашёл на трибуну и обомлел. «ГазМяс» проигрывал одну шайбу, до конца игры оставалось десять секунд. Вбрасывание, пас назад, к левому борту, в центр, бросок… Шайба вошла в ворота соперника «ГазМяса» на мгновение позже сирены. Судья покачал головой и развёл руки в стороны, показывая, что взятие ворот засчитано не будет. Сашка посмотрел на табло. Местный «ГазМяс» встречался с «ГазМясом» из другого города. Украденной десятой доли секунды не хватило до ничьей.
К счастью, о произошедшем никто не узнал, а на турнирном положении «ГазМяса» потеря двух очков так в итоге и не отразилась. Мой брат живёт и работает сейчас в Штатах, пишет программы для микроконтроллеров, которые использует NASA в своих спутниках.
На втором курсе нам преподавали Delphi. В конце года сказали для доступа к экзамену задали написать программу. Дали темы, провели несколько консультаций и сказали: «Шуруйте!» Однокурснику Андрею выпало писать игру «Танчики».
Сдав свои проекты и стоя в коридоре, мы обсуждали, кто как сдал и как писал код. Тут из кабинета послышались громкие возгласы: кто-то сильно удивился. Мы решили проверить, что стряслось, и, войдя в кабинет, увидели толпу около Андрея.
Посмотрев пояснительную записку, преподаватель, мягко говоря, офигел. У всех записки вышли на 10–30 листов, а у Андрея их было около 400. Танчики ездили, стреляли, врезались в стенки, даже мины работали, но в коде не было ни одного цикла и ни одного массива. Переделывать программу преподаватель просить побоялся — мало ли что ещё вылезет!
Теперь я стараюсь как можно сильнее оптимизировать свой код — неприятно, когда в тебя весь курс пальцами тыкает.