Учусь в универе и понемногу начинаю заниматься программированием микроконтроллеров. Дома лежит спаянная плата с программатором, на которых я и тренируюсь писать простенькие програмки на Си.
Как-то вечером я решил посмотреть, как в микроконтроллере реализуется рандом. Написал всё, как если бы это был обычный Си, и не особо удивился, когда компилятор стал ругаться. Полез в инет курить мануалы, всё нашел и сделал вроде бы правильно. По задумке в цикле загораются три светодиода, а при нажатии на кнопку один из них, выбранный случайно, должен гаснуть. Скомпилировал, прошил, жму на кнопку — каждый раз гаснет один и тот же светодиод.
Начинаю внимательно изучать код рандома. Всё вроде бы правильно: рандом присваивает иксу значение от нуля до двух, а затем идут три варианта развития событий. Отправляюсь дальше искать информацию — везде написано примерно одно и то же, но в результате проверки всегда гаснет светодиод, который соответствует х = 0. Полчаса поисков ничего не дают. Я уже почти решил оставить это дело на завтра и идти спать, но увидел следующие строчки у себя в коде:
if (x == 0) cbi(PORTB, 1); if (x == 1) cbi(PORTB, 1); if (x == 2) cbi(PORTB, 1);
Я ломал голову, что не так в рандоме, а он, оказывается, честно выполнял свою работу. С тех пор я стараюсь не использовать копипейст, а прописывать подобные вещи вручную.
Работаю web-программистом. Достался мне как-то проект на сопровождение, который представлял из себя форум phpBB 3 с двумя достаточно объёмными модулями. Сами модули были написаны предельно аккуратно, с использованием всех возможных стандартов и правил: XHTML, MVC, «верблюжья» нотация, адекватно названые переменные. Я искренне порадовался, что на PHP пишут не только быдлокодеры.
Однако факт крайне плотного взаимодействия с phpBB (в том числе использование его механизмов отображения представлений) накладывал некоторые ограничения на стандартизацию. Думаю, это и стало причиной появления следующих строчек, найденных мной в одном из представлений внутри тега <body>:
Сижу, ковыряюсь в «1C:Бухгалтерии 7.7». Бух попросил узнать, откуда прога подтягивает территориальные условия сотрудника для отчета в ПФР. Выяснилось:
1) Для печати выводится значение переменной ТУ. 2) Переменная ТУ берёт свое значение из списка ТекущийСписокСтажа. 3) ТекущийСписокСтажа подтягивает данные из таблицы СтажСотрудников. 4) СтажСотрудников заполняется функцией глСобратьДанныеДляСЗВ2002. 5) И, наконец, функция глСобратьДанныеДляСЗВ2002 присваивает ей значение константы. Обычной константы, единой для всей базы.
Работаю в фирме, производящей шахтовую автоматику. В мои задачи входит создание верхнего уровня системы, где уже человек за компьютером всё видит и контролирует.
Сегодня с одной из шахт, где наши контроллеры стоят, пришло письмо со скриншотом с пульта диспетчера, управляющего запуском и остановом конвейерных лент. На картинке, в частности, указываются причины последнего пуска конвейера и последнего останова, числовые коды ошибок анализируются «скадой», и им сопоставляются текстовые строки.
Всего есть около тридцати кодов остановки конвейера. Некоторые из них зарезервированы, и программист контроллера клятвенно заверял меня, что эти коды никогда не будут вызваны. Я поверил ему на слово, и одному из кодов сопоставил строку, которая никогда бы не отобразилась.
Произошло невозможное — видимо, где-то что-то не учли, и ошибка всё же вылезла. Диспетчер с ошарашенными глазами наблюдал у себя на мониторе следующую причину остановки конвейера:
Пишем стрелялку. Естественно, в игровом мире куча всего стреляющего, взрывающегося, просто летающего и, самое главное, сталкивающегося.
При каждом столкновении должна вызываться функция под названием hit_happened(). Получилось так, что именно с этим у нас было связано огромное количество мелких глюков: вызывалась эта функция не с теми параметрами или через два раза на третий. Мы её чинили, потом она снова начинала глючить.
После очередной итерации мой начальник задумчиво сказал, что надо было с самого начала назвать её shit_happened().
Делю кабинет с новеньким парнем. Сколько я слышал приколов про параноиков, но такого не видал:
1. Никогда не подходит к окнам.
2. Никогда не оставляет кружку с чаем без присмотра. В прямом смысле — ходит с ней в туалет.
3. Постоянно думает, что директор следит за ним с помощью камер и хочет украсть все его пароли. Поэтому очень торопится, когда их набирает, и размахивает пальцами над клавиатурой, — как следствие, входит не с первого раза.
4. Если во время разговора спросить его о чём-нибудь хоть немного личном, тут же переводит тему и записывает что-то в блокнот, который всегда носит с собой.
5. Возможно, это я от него заразился, но кажется, что он постоянно за мной наблюдает.
Не секрет, что хороший программист должен обладать даром предвидения, чтобы знать, что нужно заранее предусмотреть в проекте и к каким модификациям проект должен быть готов. Те, у кого такого дара нет, либо выкручиваются перестраховками, либо по нескольку раз переписывают одну и ту же программу.
Недавно мне на глаза попались исходники одного скрипта регистрации на сайте; среди прочих была и графа «пол» — пара радиокнопок. Не знаю, сколько раз человек, писавший этот скрипт, сталкивался с бесконечно меняющимися требованиями заказчиков, но этот перл, по-моему, является верхом перестраховочной паранойи.
Среди прочих таблиц в базе данных была таблица «sexes»: идентификатор и название, две строки. В профиле у каждого пользователя хранился идентификатор нужной строки. Интересно, предусмотрел ли что-нибудь автор на тот случай, если на ключ этой таблицы перестанет хватать четырёх байт?
Проводил сегодня школьную олимпиаду у одиннадцатиклассников. С одним состоялся примерно такой диалог:
— Скажите, а какое ограничение по памяти? Боюсь, как бы memory limit не превысить. — Интересно, и сколько же памяти ты хочешь занять? — Ну, я тут запустил, программа всю доступную оперативную память забила.
Зато на тестовых примерах программка правильный ответ выдавала. А вы говорите, Виста у вас всю память сожрала. Всё познается в сравнении, дамы и господа! Надеюсь, хоть в универе его розгами приучат ресурсы экономить, раз мама, папа и преподаватель информатики не углядели.
Лет пять-семь назад я ещё училась в школе. На информатике мы только начали изучать Паскаль. Объясняя основы, препод сказал, что начинать программу стоит с «Program %name%». Да, подчеркнул он, это необязательный элемент, прога нормально будет работать и без этого вступления, но так «вежливей».
Помимо языков программирования, в ту пору я увлекалась языками иностранными. В частности, особым спросом у меня пользовалась латынь. Латинские слова и выражения я тогда всовывала к месту и не к месту, не всегда заморачиваясь их значением. Но вскоре от этой привычки пришлось избавляться.
Внимательно прослушав лекцию и похмыкав в кулачок насчёт «вежливости», я тем не менее послушно начала решать задачи с «Program», поставив вместо имени слово «mora». Значение его я малость запамятовала, но это меня совершенно не смутило. Задачи были простые, что-то типа «сложи A и B и получи C», прогу я написала быстро, проверила, запустила.
Компилиться задача отказалась. Я почесала в затылке, проверила ещё раз — вдруг где какие запятые потерялись. Всё на месте, но не компилится, хоть убей, и ошибку какую-то кривую выдаёт. Уже без всякой надежды заново проглядываю код, останавливаясь на каждой буковке, и тут меня осеняет.
Слово «mora», которым я нарекла программу, в переводе на русский означало «замедление, задержка». Звучит бессмысленно, но никаких других видимых проблем в коде больше не было. Посему я, не особо надеясь на успех, заменила название на что-то малозначимое и ткнула F9. Граждане, оно заработало!
Знаю, глупо, но с тех пор я всегда проверяю все названия, имена переменных и так далее на осмысленность на всех известных мне языках. Мало ли — вдруг одно из них натолкнёт комп на мысли о самоуничтожении?