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

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

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

898

Нюансы кода и gluteus maximus

Меня всегда удивляло, что код комментируют так сухо и бездушно. Привожу пример моих комментов одной VBA-процедуры, написанных в разные моменты времени:

Первая версия:

/* Сделано через жопу. Прошу прощения у того, кто будет дорабатывать — меня заставили сделать именно так. */


Исправленная версия:

/* Cобрался с силами и исправил код так, чтобы он выглядел более логичным и читаемым. Концептуально он остался жопой, но теперь стал больше похож на аппетитную женскую попку, чем на суровую мужицкую задницу. */


Комментирование — занятие крайне интересное и творческое. Сделайте немного интереснее жизнь человеку, которому придётся потом разбираться в вашем коде!

890

Береги работу до пенсии — кто ж тебе другую даст

В своей деятельности я придерживаюсь инженерного подхода, а не научного. Но вот сомнения стали одолевать...

Лет пять назад выпала мне халтурка — написать парсер не сильно прямого языка — объектно-ориентированного расширения SQL. Порекомендовали меня одной конторе, поскольку их штатный программер просидел над этим делом год, нарисовал много схем и, доказав, что это контекстно-зависимая и не LR грамматика, заявил, что быстро написать парсер — дело неподъемное.

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

А потом задумался. Штатный программер получил никак не меньше 15000 баксов, и работа осталась "неиспорченной". Такую работу можно было еще работать и работать. А я, как урод, решил проблему за жалкие 2 штуки. Ну и кто после этого дурак?

879

За –3 года до конца света

Случилось это в стародавние времена, когда даже «спектрумы» ещё не появились на просторах нашей необъятной родины, а отдельные энтузиасты толкали в массы вычислительную технику, собранную на суперсовременном процессоре K580ИК80. Происходило всё это в общаге, где у одного энтузиаста был собран такой монстр. Работал на нем BASIC, причём довольно неторопливо.

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

На вопрос, чего он такого напрограммировал, товарищ рассказал, что ему надо посчитать плотность плазмы в ТОКАМАКе. Когда у нас прошел первый шок от серьёзности задачи, ему посоветовали урезать количество итераций в программе, чтобы закончить расчёты в этой пятилетке, и вывести на экран обратный отсчет, чтобы можно было спокойно сходить пообедать или хотя бы попить чайку.

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

Три.

Два.

Один. (Все напряглись, как будто сейчас должно рвануть).

Ноль. (Гробовая тишина).

Минус один. (Тишина, общий шок).

Минус два. (Взрыв хохота).

На минус трёх программа начала строить графики, но смеялись мы ещё долго.

877

При тестировании не пострадали люстры и фарфоровые котики

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

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

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

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

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