У нас эксплуатируется взрослая система радиосвязи от одного маститого европейского производителя. Так вот, у этой штуки, в программе управления абонентами есть две вкладки: «Permissions» (разрешения) и «Blocking» (запреты). Так вот, в «Permissions» установка галочки напротив того или иного пункта означает запрет абоненту пользоваться услугой, обозначенной в пункте, а на вкладке «Blocking» — наоборот.
Интеграторы заметили это дело поздно, когда система уже пошла в серию, а поэтому просто задокументировали: «Это не баг, это фича».
Пишу прошивку для микроконтроллера. Понадобилось обеспечить полную перезагрузку после определённой команды в терминале, чтобы удалённо можно было железку с микроконтроллером «отресетить», да ещё и минимумом команд обойтись — память у контроллера не резиновая.
Читаю мануал к компилятору. Есть функция программной перезагрузки. Работает, только если у программы один поток, а у меня три — не подходит. Есть функция аппаратной перезагрузки. Нужно выделять ножку ввода-вывода на контроллере и цеплять её к линии сброса контроллера. Не пойдёт: схему менять уже нельзя, да и ног свободных уже нема. А потом вспомнил: у меня же используется встроенная в микроконтроллер защита от повисания (мало ли что) — если две секунды сторожевой счётчик не сбрасывается, то самоперезагрузка обеспечена.
Цикл while true do begin end в итоге решил всё дело. Уложился в 18 байт машинного кода вместе с обработкой команды.
Сегодня засиделась под утро над SADT-моделированием системы дистанционного образования. Опа, уже пять! Пора баиньки. Перед сном заглядываю в холодильник и по инерции размышляю: «Надо будет завтра спроектировать салат с шампиньонами». Мысленно открываю BPWin, рисую диаграмму... Всё-таки ночью лучше спать!
Писал документацию к программе — описание алгоритма и всё в таком роде. Уже поздно, голова замылилась. Дошёл до куска алгоритма, который производит определенные вычисления по часовой стрелке и против неё. Серьёзно загрузился: почему же используется часовая стрелка, а не минутная, к примеру? Как описать в документации для будущих программистов, почему выбор пал именно на часовую?
Пошёл курить. Дошло. Поржал, глянул на часы — полчетвёртого. Погасил машину и ушёл спать.
Школа-интернат. Все давно играют в World of Warcraft. Сервер московский, так что играют чаще ночью. В общаге имеется воспитатель, который патрулирует комнаты и коридоры, и за игру в три ночи наказывает нещадно. Играют все лёжа на кроватях — так видно меньше. Однако это не летний лагерь, а всё-таки школа, и выполнение домашней работы по программингу происходит в той же обстановке, на кровати с чашкой кофе/банкой энергетика/бутылкой воды.
Итак, на часах 3:30. В комнате двое играют и один пишет код к завтрашнему уроку.
— Колян, ты где там бродишь? Танковать я, что ли, должен? — Да не парься ты, тут я, щас запинаем как ребёнка. — Серый, напомни, у нас в шестом номере через какую конструкцию процедуру делать? — Через while... Не, ну ты посмотри, срывается, козёл! Саня, тебе долго ещё проги набивать? Нам твой хант позарез нужен. — (под нос) Факинг Паскаль... Где я запятую пропустил? (шёпотом) Да щас зайду, убьём мы эту элитку и орду распинаем. Я вон вижу, у вас там пара орков бегает. — Ладно, ждём тебя.
Звонит телефон: — Элвис, не тупи, заходи в онлайн. Мы в ауте... Да-да, сделал я лит-ру, завтра спишешь. Заходи резче... Что?.. Какое ОБЖ? Какой конспект?.. Да сделаем, щас, добьём гада одного.
— Всё, добил прогу. Как часы работает! Я захожу. Ждите... — А нам не только ОБЖ задавали...
Патруль не дремлет. Мастер-класс от общаги: закрыть ноут и притвориться спящим за полсекунды, пока открывается дверь комнаты. Школа, а за выполнение домашней наказывают — жестокие нравы!
Кодеры под Новый год порадовали. Есть требования на дизайн некой функции, которые звучат примерно так: «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) {}. Код по требованиям, фейлов нет, придраться не к чему.
Учусь в универе и понемногу начинаю заниматься программированием микроконтроллеров. Дома лежит спаянная плата с программатором, на которых я и тренируюсь писать простенькие програмки на Си.
Как-то вечером я решил посмотреть, как в микроконтроллере реализуется рандом. Написал всё, как если бы это был обычный Си, и не особо удивился, когда компилятор стал ругаться. Полез в инет курить мануалы, всё нашел и сделал вроде бы правильно. По задумке в цикле загораются три светодиода, а при нажатии на кнопку один из них, выбранный случайно, должен гаснуть. Скомпилировал, прошил, жму на кнопку — каждый раз гаснет один и тот же светодиод.
Начинаю внимательно изучать код рандома. Всё вроде бы правильно: рандом присваивает иксу значение от нуля до двух, а затем идут три варианта развития событий. Отправляюсь дальше искать информацию — везде написано примерно одно и то же, но в результате проверки всегда гаснет светодиод, который соответствует х = 0. Полчаса поисков ничего не дают. Я уже почти решил оставить это дело на завтра и идти спать, но увидел следующие строчки у себя в коде:
if (x == 0) cbi(PORTB, 1); if (x == 1) cbi(PORTB, 1); if (x == 2) cbi(PORTB, 1);
Я ломал голову, что не так в рандоме, а он, оказывается, честно выполнял свою работу. С тех пор я стараюсь не использовать копипейст, а прописывать подобные вещи вручную.