— Пятачок, нам прислали десять горшков меда, по восемь каждому! — Но как это, Винни, по восемь каждому?! — Не знаю как, но свои восемь я уже съел.
На пятый час написания кода на ассемблере под ATmega128 я осознал, что Винни-Пух на самом деле был очень справедливым медвежонком. Просто он был программистом и считал в шестнадцатиричной системе...
В 2007 году я училась в физико-математическом интернате для 10–11 классов при одном из лучших московских университетов. Нам читали материал первого курса, и на информатике мы усиленно изучали Delphi. Надо сказать, что процесс обучения был построен весьма интересным образом. Выдаваемые нам задачки, которые обычно пишут на Паскале, мы писали в консольном приложении Delphi, и сдавали их не преподавателю, а серверу, который прогонял прогу через 10–20 автоматических тестов.
Однажды нам попалась простая на первый взгляд задачка:
Даны числа A, B, C, D. Если кирпич размерами A х B пролезет в отверстие C х D, то вывести «Да», в противном случае — «Нет».
Пишу примитивную прогу: сравниваю числа, если стороны кирпича меньше сторон дырки, даю положительный ответ. На пятом тесте сервер выдаёт ошибку. Удивленно спрашиваю преподавателя, в чём дело, а тот хитро улыбается: кирпич ведь можно совать наискосок! Вспоминаю тригонометрию — безрезультатно...
За день до «дедлайна» смотрю статистику — почти у всех прога сдана. Мне стало интересно, как ребята справились с задачей, и спросила совета у одноклассницы. Та ответила: «Ой, да лёгкая же задача! Вот, возьми текст», — и протянула мне флешку. Ключевая строчка выглядела примерно так:
if (A=...) and (B=...) and (C=...) and (D=...) then writeLn ('Да');
Для каждого теста, который прога не проходила, студенты написали по «затычке». Какие из них потом вырастут программисты?
Во времена учебы в универе была у нас преподавательница, которая не особо отличалась «умом и сообразительностью». На одной из пар она предложила студенту закодировать алгоритм сортировки, который она сама выберет из толстого справочника. Времени на задание было отведено совсем мало.
Студент не растерялся и настрочил строк 40–50 полного бреда, однако, включающего в себя честный ввод массива чисел и вывод его после сортировки. Естесственно, написанный им алгоритм ничего хорошего с данными сделать не мог, если бы не вставленный в самом конце через несколько десятков «табов» стандартный sort(). Студенты — берите на заметку!
Заварил пакетик чайку на работе и, глядя в монитор, упоённо предаюсь дебаггингу. Правая рука крутит мышиный скроллер, левая сжимает кружку с чаем.
«Так-так-так... Ага... Вот же блин!» — найдя глупейшую ошибку, я хлопаю себя по лбу левой рукой.
Обычная реакция? Всё бы ничего, только оказалось, что в процессе сосредоточенного поиска багов я машинально наматывал на палец верёвочку от пакетика с чаем.
Работаю в известной геймдев-студии уже больше года. Когда я только устроился, народ в основном занимался 2D-проектами. Проработал я месяц-полтора, поднабрался знаний от местных мэтров и внезапно был переброшен на новую 3D-разработку — аркадный шутер. Под него купили движок Lithtech Jupiter (на нем в 2000 году делали NOLF 2). Движок, к слову, для своего времени был очень хорош — все тулзы на месте и пайплайн удобный. Поскольку препродакшн только стартовал, много народу на него не перекидывали, и по счастливому стечению обстоятельств именно меня с тремя старшими специалистами отрядили поковыряться в заморском звере. Пока старшие спецы копали исходники и расширяли функционал под наши нужды, я начал пробивать возможность создания минимальными усилиями конструктора города — строить все по-честному на таком старом движке было почти невозможно.
Поначалу всё шло нормально — я сделал первую тестовую комнату, раскопал референсную систему моделей, и вроде как всё начало вырисовываться. Тут я заметил, что на моделях начала слетать развертка, да и сами модели порой начинали «ломаться» в самых неожиданных местах после экспорта в движок. Покопавшись три-четыре дня в настройках экспортера и покурив мануалы я так и не понял, что к чему. Старшие товарищи были заняты более важными делами и только отмахивались от меня: «Проверь ещё разок настройки экспорта, покрути там, плюнь здесь». Рукава засучили только в пору масс-продакшна, когда проблема вылезла у моделлеров.
Месяц боев с экспортером, попытки расковыривания исходников, переустановка дистрибутивов — не помогло ничего. Время поджимает, пора уже игру контентом набивать, а модели в движок всё не лезут. Что интересно, на машине у одного из старших спецов все проходило как по маслу. Ну, думаем, пора писать в заокеанскую техподдержку. Разработчики только плечами пожимают. Подходит время «Ч» — надо срочно что-то решать, игры-то может и не быть...
Все нервно курят на балконе, я в миллионный раз тщетно пытаюсь что-то поправить. И тут происходит чудо: у нашего спеца, у которого все экспортировалось без проблем, появляется совершенно безумная мысль, от которой поначалу все опешили:
— А зайди-ка в панель управления. — ??? — Зайди-зайди. Там, где региональные параметры. А теперь разделитель целой и дробной части смени с запятой на точку.
Вуаля! Как по мановению волшебной палочки, всё заработало. Оказалось, что заморские ребята написали движок таким образом, что экспортер использовал значение виндовского разделителя; файл модели же был простым текстовиком, в котором перечислены положения всех вершин. Когда движок читал файл с запятыми вместо точек, он округлял координаты точек, и модели искажались затейливым образом.
Всё же айтишник — не профессия, а образ мышления. Учился я тогда на четвёртом курсе и подрабатывал на кафедре учебным мастером. В обязанности входило обслуживание учебных лабораторий и компрессора. Однажды кто-то из студентов «поигрался» с регулятором (в выключенном состоянии) и сбил все настройки. Когда начались занятия и на стенды было подано давление, выяснилось, что вся система «регулятор — исполнительный механизм» пошла вразнос, издавая при этом громкие шипяще-свистящие звуки, которые мешали вести занятия и действовали на нервы.
Меня вызвали для решения проблемы. Конечно, можно было бы просто перекрыть доступ воздуха, но проектировщик стенда клапан не предусмотрел. Отключить подачу можно было лишь выключив компрессор, чего делать было нельзя, поскольку пришлось бы остановить занятия и в других лабораториях — включение и выключение заняло бы значительное время. Преподаватель начал рассказывать, какие теоремы и формулы надо использовать для рассчёта новых настроек, которые стабилизируют систему. Думать над этим мне было лень. Я взял в мастерской плоскогубцы и зажал ими шток исполнительного механизма, тем самым прекратив и колебания, и ужасные звуки. После долгой паузы преподаватель сказал: «Ну или так...»
Уже четыре года я работаю программистом. Я написал не одну тысячу строк кода, но до сих пор в каждой программе можно найти тот самый «метод плоскогубцев».
Повезло: в школе мы не изучали, как сделать текст в «ворде» пожирнее, а занимались настоящим программированием. С 10 класса мы решали простые задачки на Паскале для понимания общих принципов написания кода. Был у нас в классе один парень — не самый глупый, но с программированием у него явно не ладилось. Предложили нам однажды в качестве самостоятельной работы посчитать сумму цифр во вводимом числе. Все только сели организовывать циклы и вспоминать, как выделяется целая часть, как этот самый парень заявляет: «У меня все готово!» Все в шоке, включая учительницу — он никогда не блистал, а все остальные еще и половины работы не сделали. Пошли к нему смотреть код.
Оказалось, он воспользовался истинно программистским подходом — его программа предлагала пользователю ввести первую цифру числа, потом вторую и так далее, сохраняя каждый разряд в отдельную переменную. Неудивительно, что с суммированием проблем у него не было совсем!
Лет пятнадцать назад разработчик пишет красивую, изящную и компактную программу. Последователи добавляют ещё один режим вызова, изменяющий соглашение о передаче параметров. Ещё через пяток лет добавляется третий режим с обходной точкой входа и взятием необходимых данных из файла.
Программа умеет работать как в интерактивном, так и в пакетном режиме, при этом может оставаться реентерабельной, не выполняя реинициализацию при повторном входе, и вызывается в разных режимах из нескольких прикладных пакетов. И вот модифицированный код составляет уже 40% текста программы.
Настаёт момент, когда авторский алгоритм перестаёт работать для определённой комбинации параметров. Причём определяется это не тестированием, а эмпирически — по жалобам клиентов. Изрядно поломав голову и отладчик, приходится в очередной раз крушить остатки стройной концепции и дописывать условную принудительную реинициализацию переменных посреди красивого авторского кода.
Что делает программа? Фигню — печатает PIN-конверты для банковских карточек. Обычная такая банковская программа, написанная не самыми бездарными программерами. У нас тут ещё миллион таких.
Как там у классиков? «Если бы строители строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию».
Работаю веб-программером — делаем разнообразные сайтики и интернет-магазины. Очередной клиент попросил, чтобы к сайту была прикручена статистика от Google. Я прикрутил, а до кучи поставил сайт в очередь на индексирование.
Надо отметить, что для этого проекта мы не писали админку с нуля, а затачивали предоставленную заказчиком под проект, добавляя новые модули. Поиск по сайту был настолько «крут», что исправлять его доверяли только мне — долго я матерился, ковыряясь в индийском коде. На полную переделку поиска меня не хватило.
Прошло некоторое время. В аську стучится админ сервера компании-заказчика: «Твой проект грузит на 103% процессор MySQL-сервера!»
Где-то час выясняли, что не так, и только потом сообразили посмотреть в логи. Выяснилось, что умный Google-бот без проблем отыскал поисковую страницу сайта и стал рекурсивно насиловать проект, отыскивая ключевые слова в результатах поиска по результатам поиска...
Поиск после этого доработали, бота от страницы выдачи отвадили и даже морфологию прикрутили. Вспомнили и бессмертную фразу Стива Макконнелла: «Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете».