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

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

8228

Эликсир эффективного кода

Во время оно в голове у меня было только две мысли: написать программу, уложившись в ТЗ, и навариться на эпидемии вируса Chernobyl, имея под рукой программатор.

А ТЗ было очень даже заколдобистое. То есть программа должна была работать на XT без винта. С двух дискет. По филиалам у нас такие едва ли не до 98-го работали.

Кто писал объёмные проекты на Clipper, тот знает, чего стоит впихнуть клиппериану в 640К минус драйвер русской клавиатуры минус драйвер сетевой карточки минус драйвер принтера. То есть ~540К. И клипперовский рантайм на 320К.

И был у меня там модуль. Ничего сверхординарного: выборка по заранее не определённому, но конечному количеству параметров. Только Клиппер — это не SQL. Он не только сам запрос должен создать, но ещё и сам его обработать.

Был этот модуль в двух вариантах: либо быстро, но то чего-то пропустит, то вылетит по нехватке памяти, либо медленно даже с винта. А уж с дискетки на XT вообще вешалка. По полчаса. Зато точно.

И тут пациент за восстановление погрызенного «Чернобылем» биоса подгоняет аж три литра настоящего привозного Хольстена. Дедлайн по проекту был не то что виден, а уже конкретно кусал за пятки, то есть оставалась до него пара дней. И решил я превентивно выпить и попрощаться с премией, а то и с работой.

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

Утром, придя на работу, я первым делом схватился за исходники. Бэкап был только от последнего релиза. Плохо. BAK-файлы. Их много. Время у них практически совпадало со временем моей эвакуации охраной. Очень плохо. Значит, на перекурах сохранялся. Где там наш большой авось?

Запускаю сборку. Собирается. Причём даже без привычных ворнингов. О как! Подцепляю тестовые базы. Гоняю в хвост и в гриву. Всё работает! Добавились кое-какие красивости интерфейса. Откуда бы? Запускаю эту, мать её, выборку. Работает. Быстро. Ну, это на 486-й. Засовываю дискетку в стендовую экстишку. Работает. Быстро. Проверяю ковырнадцать раз. И не ошибается. Тихо обалдеваю.

Глазам не верю. Лезу в исходник. До меня доходит, что я не понимаю, как он работает. Любая попытка что-то поменять или поправить приводит к неработоспособности. Да и чёрт с ним! Трачу день на всевозможные тесты и точно в срок сдаю новую версию АРМ. Ну, премия, хорошие слова, почти слава.

Спустя несколько лет мне позвонил мой преемник с вопросом: «Что-то я никак не пойму, как у вас работает модуль N». Пришлось рассказать ему эту самую историю.

8224

За пределами восприятия

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

Эстетом меня назвать можно, хоть и с изрядной натяжкой, но так как в качестве курсача была выбрана игра, значит, и выглядеть она должна поигривей; даже кнопка закрытия должна быть весёленькой. Кнопку нарисовал, впихнул на форму, запускаю — нету. Матерюсь на чём свет стоит, проверяю всё, что можно — опять не фурычит. Возился три дня с этой мерзостью, в конце концов плюнул и дописал в пояснительной записке, что закрытие осуществляется путём нажатия волшебного аккорда Alt+F4.

Пришёл защищаться, запустил… Моя челюсть, протаранив по пути стол, придавила ногу преподавателя. Кнопочка была на месте. В чём дело? Да в разрешении, будь оно неладно! Будучи совершенно никаким программистом (первый курс, едва закончили знакомство с Паскалем, в школе видели только КуМир на «Корветах»), я всё далал по мануалам и конспектам и не придал значения злосчастному параметру 1024×768. На старичке, на котором я всё это писал, было вбито 800×600 на 60 Гц как максимально возможное.

8206

Джентльмен удачи

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

Очередная задача: вводим двумерный массив три на три, состоящий из цифр, а программа должна определить, симметричен ли он относительно главной диагонали. Код написал, теоретически должен работать, но что такое? Специально ввожу симметричный массив — говорит, что симметричен. Ввожу рандомно с клавиатуры — всё равно говорит, что симметричен! Пробую ещё два раза — то же самое.

Подзываю друга помочь. Он смотрит логи и замечает, что все три раза я действительно вводил абсолютно симметричный массив. Вот и верь теперь в случайность…

8203

+20% мозгов

Разбирался с одной невероятно тормозящей программой. Нашёл источник проблем — жирную библиотеку непонятного назначения. Морально подготовился к встрече с индусским кодом и долгим раскопкам. Открываю. Первый комментарий:

//TODO:

//include brains.h

//include hands.h

//exclude indian.h

Код пестрил комментариями, местами индусятина была исправлена. Неизвестный мне разработчик явно копался в коде как минимум неделю! Разобраться по комментариям было намного легче, и уже через день всё было доделано, программа летала, а к первому комменту добавились две строчки:

//DONE!

//thank you, unknown developer!

8200

Удаляйся, тварь волосатая

Я смотрю, хорошего программиста мы на работу взяли.

if (i < 1024) {

...

} else if (i/1024 < 1024) {

...

} else if (i/1048576 < 1024) {

...

} else if (i/1073741824 < 1024) {

...

} else {

return "о$#еть, терабайтный файл!";

}

* * *

if (selected.isFile()) {

...

} else if (selected.isDirectory()) {

...

} else {

menu.add(Menu.NONE, 0, Menu.NONE, "What The Fuck?");

}

* * *

if(!selected.remove()) {

Log.v(TAG, "Да e$@л я эти пермишены, удаляйся, тварь волосатая по имени "+selected.getName());

} else {

...

}

* * *

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

8198

Вкалывают роботы — счастлив человек

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

Но игр много. Недавно я подсел на ММО про космические кораблики. Интересная особенность игры: все играют на одном-единственном серваке. И англичане, и русские, и немцы, и японцы, и австралийцы, и все-все-все прочие.

Теоретически игра платная: 15 мёртвых американских президентов в месяц. Но есть возможность платить игровыми деньгами. Самое простое: копаешь руду, продаёшь и платишь. 50 часов копки — и игра на месяц оплачена. Но копать часами так скучно! А что делает программер, когда ему становится скучно выполнять однообразные действия? Правильно, он автоматизирует процесс. Тру-кодер, как известно, не кодить не может.

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

8188

Фальшивобайтчики

Немного просрочили проект. Заказчик расстроился настолько, что запросил полный возврат средств.

Мы с коллегой тоже расстроились. Возвращали по WebMoney Transfer, в примечании к платежу написали: «Фальшивые».

8186

To sleep() or not to sleep()

// // /*

// // //Sleep(100);

// // //слип здесь не нужен!

// // Sleep(100); //Нужен!

// // */ //не нужен!!!

// // Sleep(100); //нужен! без него окно не до конца дорисовывается.

// //идиоты! а код поправить слабо?

// /*

// Sleep(100); //сам дурак! так проще.

// */ //правьте баги или уволю нах!

// Sleep(100); //увольняй.

// Sleep(100);

// Ладно, поправили. Теперь нормально?

// P.S. Сегодня пятница, может по пиву?

// Ладно, можно и по пиву.

// P.P.S. Хорош срать в комментах!

8162

Звёздам не нужны Джифорсы

Электроника Б3-21. 60 шагов программы, 8 ячеек памяти, обратная польская запись арифметических действий, стек в две ячейки; встроенных циклов, как в МК, нету, только условные переходы.

Впёрло нарисовать траекторию движения планеты в системе двух солнц. Всего-навсего дифурчик второго порядка. Мелочи. Но ведь хватило 60 байт кода и 8 переменных! Правда, пару недель по точкам получал траекторию и наносил на миллиметровку, но всё же справился и был доволен.

Гляжу на современные требования к железу — и как-то боязно становится. Неужели все настолько обленились, что проще заставить пользователя купить новый компьютер или пару плат, чем сесть и подумать?

8161

Под шелест выпадающих ячеек

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

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

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