bash.im ithappens.me zadolba.li

Программизмы

1110

Faceteabag.jpg

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

«Так-так-так... Ага... Вот же блин!» — найдя глупейшую ошибку, я хлопаю себя по лбу левой рукой.

Обычная реакция? Всё бы ничего, только оказалось, что в процессе сосредоточенного поиска багов я машинально наматывал на палец верёвочку от пакетика с чаем.

1091

Точка, точка, запятая — вышла рожица кривая

Работаю в известной геймдев-студии уже больше года. Когда я только устроился, народ в основном занимался 2D-проектами. Проработал я месяц-полтора, поднабрался знаний от местных мэтров и внезапно был переброшен на новую 3D-разработку — аркадный шутер. Под него купили движок Lithtech Jupiter (на нем в 2000 году делали NOLF 2). Движок, к слову, для своего времени был очень хорош — все тулзы на месте и пайплайн удобный. Поскольку препродакшн только стартовал, много народу на него не перекидывали, и по счастливому стечению обстоятельств именно меня с тремя старшими специалистами отрядили поковыряться в заморском звере. Пока старшие спецы копали исходники и расширяли функционал под наши нужды, я начал пробивать возможность создания минимальными усилиями конструктора города — строить все по-честному на таком старом движке было почти невозможно.

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

Месяц боев с экспортером, попытки расковыривания исходников, переустановка дистрибутивов — не помогло ничего. Время поджимает, пора уже игру контентом набивать, а модели в движок всё не лезут. Что интересно, на машине у одного из старших спецов все проходило как по маслу. Ну, думаем, пора писать в заокеанскую техподдержку. Разработчики только плечами пожимают. Подходит время «Ч» — надо срочно что-то решать, игры-то может и не быть...

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

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

Вуаля! Как по мановению волшебной палочки, всё заработало. Оказалось, что заморские ребята написали движок таким образом, что экспортер использовал значение виндовского разделителя; файл модели же был простым текстовиком, в котором перечислены положения всех вершин. Когда движок читал файл с запятыми вместо точек, он округлял координаты точек, и модели искажались затейливым образом.

1084

Метод плоскогубцев

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

Меня вызвали для решения проблемы. Конечно, можно было бы просто перекрыть доступ воздуха, но проектировщик стенда клапан не предусмотрел. Отключить подачу можно было лишь выключив компрессор, чего делать было нельзя, поскольку пришлось бы остановить занятия и в других лабораториях — включение и выключение заняло бы значительное время. Преподаватель начал рассказывать, какие теоремы и формулы надо использовать для рассчёта новых настроек, которые стабилизируют систему. Думать над этим мне было лень. Я взял в мастерской плоскогубцы и зажал ими шток исполнительного механизма, тем самым прекратив и колебания, и ужасные звуки. После долгой паузы преподаватель сказал: «Ну или так...»

Уже четыре года я работаю программистом. Я написал не одну тысячу строк кода, но до сих пор в каждой программе можно найти тот самый «метод плоскогубцев».

1052

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

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

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

1008

Если б мишки были пчёлами

Забавная всё-таки штука — программирование!

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

Программа умеет работать как в интерактивном, так и в пакетном режиме, при этом может оставаться реентерабельной, не выполняя реинициализацию при повторном входе, и вызывается в разных режимах из нескольких прикладных пакетов.
И вот модифицированный код составляет уже 40% текста программы.

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

Что делает программа? Фигню — печатает PIN-конверты для банковских карточек. Обычная такая банковская программа, написанная не самыми бездарными программерами. У нас тут ещё миллион таких.

Как там у классиков? «Если бы строители строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию».

Верю!

965

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

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

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

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

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

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

955

Радиоуправляемый снаряд

Писал в качестве семестровой по информатике игру «Танки», аналог классической Scorched Earth. 2D-ландшафт, баллистические формулы — всё как в оригинале.

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

При наличии некоторого навыка можно было поражать вражеский танк, даже если изначальный выстрел был неизбежным промахом или цель находилась где-нибудь в глубине пещеры. Более того, при резкой смене угла колёсиком (мышь у меня геймерская, с жёстким скроллом) снаряд пробивал горы, не взрываясь. Куда там Бекмамбетову с его пулями, летающими по параболам — тут радиоуправляемые танковые снаряды зигзагами летают!

928

Привет из подземелья

Я уж думал, что совсем свихнулся. Моя числодробилка периодически показывает, какую итерацию она сейчас считает. Запустил, понял, что надо бы немного поменять алгоритм. Нажал Ctrl+C, поправил код, снова пускаю. Пишет:

а = -1
а = -0.9
а = -0.8
а = 0.3
а = -0.7

И почему же она на 0.3 скакнула, а потом вернулась обратно на –0.7 вернулась? Опять жму Ctrl+C, снова лезу в алгоритм, всё просматриваю — не может такого быть! Я этот код долго вылизывал, нечему там ломаться. Запускаю по новой.
а = -1
а = -0.9
а = 0.6
а = -0.8
а = -0.7
а = 0.7

Такого не может быть, потому что такого не может быть никогда! Я поиском по коду смотрел — переменная меняется только в строчке «for a = -1:0.1:1».
Понял, в чём было дело, только когда появилось сообщение «запущенный в бэкграунде процесс завершён». Я случайно не прервал выполнение программы, а отправил её в фон, откуда она и посылала мне свои «приветы».

900

Полиморф-конкур

Пару лет назад мы небольшой командой энтузиастов занимались настройкой геймерских серверов в локалке. Юзеры очень уж просили поставить World Of Warcraft — игра тогда вызывала у всех дикие восторги, а оплачивать это дело народ, как водится, не хотел.

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

Об «особенностях» игры на нашем сервере можно рассказывать очень долго. Мелочи вроде того, что мобы набрасывались на игрока через стену, ползали как альпинисты по скалам или, провалившись сквозь землю, пускали заклинания прямо из преисподней, — далеко не самые весёлые моменты.

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