Истории с тегом: программизмы

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

5790

И незаряженный false стреляет

Работаю в совершенно замечательной конторе, занимающейся веб-разработкой на базе коммерческой CMS на букву «Б». Понадобилось нам создать дополнительную примочку к административной панели. Важную миссию доверили вашему покорному слуге.

— А вот такой-то вариант вызова функции может быть? — поинтересовался я, когда продумывал алгоритм.

— Нет, что ты! Согласно концепции проекта такое невозможно. У нас всё будет по-другому, — ответил мне senior developer, сидящий за соседним столом.

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

Прошло три недели. Сижу, ковыряюсь в коде, и тут справа от меня раздаётся проникнутый удивлением вопль на весь офис:

— Что это?!

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

5783

Игра в свои ворота

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

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

Сашкина работа была довольно творческой и в основном заключалась в лечении внезапно глюкнувшего электронного оборудования. Особенно любимым занятием на рабочем месте была пляска с бубном вокруг электронного табло. Монохромная светодиодная панель через пень-колоду была подключена к гордости завхоза ледового дворца, старенькому 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 в своих спутниках.

5761

Танки циклов не боятся

На втором курсе нам преподавали Delphi. В конце года сказали для доступа к экзамену задали написать программу. Дали темы, провели несколько консультаций и сказали: «Шуруйте!» Однокурснику Андрею выпало писать игру «Танчики».

Сдав свои проекты и стоя в коридоре, мы обсуждали, кто как сдал и как писал код. Тут из кабинета послышались громкие возгласы: кто-то сильно удивился. Мы решили проверить, что стряслось, и, войдя в кабинет, увидели толпу около Андрея.

Посмотрев пояснительную записку, преподаватель, мягко говоря, офигел. У всех записки вышли на 10–30 листов, а у Андрея их было около 400. Танчики ездили, стреляли, врезались в стенки, даже мины работали, но в коде не было ни одного цикла и ни одного массива. Переделывать программу преподаватель просить побоялся — мало ли что ещё вылезет!

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

5751

Brain mismatch

Девушка учится на менеджера. На экзамене по информатике надо было решить задачку на Паскале:

a := 5;

b := a*2 - 6;

c := b > a;

Конечно, нужно было догадаться, что c — это переменная boolean. Преподаватель с удивлением наблюдал около двадцати листов, на которых в графе ответа стояло: «Error 23. Type mismatch».

5692

Проверка правописания и первокурсности

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

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

5668

Java (не) рулит

Купили Lego Mindstorms. Конструктор такой, чтобы роботов мастерить: двигатели, датчики, контроллер на Атмеле. Есть программа стандартная, эдакий MS Robotics Studio для пятилетних. Всё бы ничего, но визуальное программирование — не для сложных алгоритмов. Давай копаться. Нашли в недрах паутины замечательную вещь — Java-платформу для этих самых контроллеров. Не прелесть ли? Жизнь, казалось бы, облегчилась в разы. Даже многопоточная обработка есть. Якобы. Тут-то веселье и началось.

Копнули документацию. Каждому типу датчика назначен родной порт по умолчанию. Касание — первый, свет — второй, звук — третий, расстояние — четвёртый. Как же так вышло, что именно на четвёртом порту под новой прошивкой все ультразвуковые датчики расстояния не работают? Может, я что-то делаю не так? Воткнул в четвёртый порт кнопку — работает. Воткнул ультразвуковой датчик — всё время расстояние 255 мм, и хоть убейся. Обидно, досадно, но ладно. Жить можно — едем дальше.

К слову, собирали мы с командой интеллектуальную машинку, способную проехать по трассе, не задевая бортики. Начали программировать движение. Я не зря боялся многопоточности! В основной поток я запихал рулевое управление с датчиками, в дополнительный — управление главным двигателем. Удивлению предела не было, когда первую секунду оно рулило, стоя на месте, вторую ехало вперёд, снося всё на своем пути, третью опять рулило, двигаясь по инерции. Меняешь приоритеты — или не едет, или не рулит. А казалось всё так безоблачно…

С тех пор я пишу на Java с оглядкой — вдруг что-нибудь переклинит?

5652

Около нуля

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

+7, −7

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

Коллеги, не экономьте на сне. Страдает здравый рассудок.

5644

Забыли о памяти?

Эх, было раньше время… Несмотря на скромный возраст, с компьютерной техникой я на «… твою мать». В ходе обучения связался даже с БК-0010, зверь-машиной на процессоре К1801ВМ1, и с тех пор моим девизом является старый лозунг: «Памяти много не бывает».

Зажрались вы, люди. Конечно, компьютеры мощны и достойны. Да, Core i7 никого не удивляет. Но, скажите мне, зачем, зачем пихать старый бодрый Quake III в браузер?! Зачем переводить бесценные ресурсы компьютера на игру, которая прекрасно отлажена, место которой — в отдельном приложении?

Каким надо обладать мышлением, чтобы написать программу на ассемблере без единого цикла? Это привет моему одногруппнику, который программу-календарь размахнул на шесть тысяч строк. Конечно, ведь мы русские, широкая душа, но такое отношение — чистый индийский код.

Вы знаете, что существует игра в 56 байтах чистого кода? А компилятор в 20 байтах? Плевать, что язык BrainFuck — зато человек реально умеет программировать.

Зажрались. Пойду мучать «Электронику-5» — научусь хотя бы байты считать.

5636

Госъяваскрипт

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

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

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

Если убрать из базы тестовые значения или заменить базу своей, сделанной по образу и подобию — не ищет.

Если убрать фоновую картинку — не ищет.

Если изменить хоть один символ в яваскрипте — не ищет.

Работает только в Мозилле и IE.

В случае наличия в базе спецсимвола выдаёт что-то неведомое.

Если удлинить поля ввода хоть на пиксель — не ищет.

Если изменить шрифт — не ищет.

В общем, повесили мы это дело как есть и не трогали с тех пор. С госскриптами шутки плохи.

5621

Жить станет проще, жить станет веселей

Фреймворки призваны облегчить жизнь программистов. Как бы не так…

Пришлось мне столкнутся с продуктом некоей компании на букву «Z». Задание простенькое, по крайней мере в плане PHP, но фишка в том, что выполнить его надо в вышеупомянутом фреймворке. Ну, думаю, покурю маны, и через часик будет готово. Ага. Разогнался. Четыре часа ушло на изучение документации, как установить это чудо на сервер. Когда эта фигня наконец встала, я за полчаса справился.

А знаете, что самое интересное? Если бы писал по старинке, без всех этих ваших «облегчалок», написал бы минут за пятнадцать. Оно вам нужно, такое облегчение?