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

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

8763

Идите индийским путём

В 1994-м подарили мне старенький «Агат». Подключил я его к телевизору «Рубин» и давай учиться программировать. Впрочем, программированием это было назвать нельзя — так, баловство. Команда GOTO встречалась чаще остальных, вместе взятых. Только потом я узнал, что это называется «спагетти».

Затем «Агат» был задвинут во встроенный шкаф. А недавно решил я ностальгию потешить — достать, пропылесосить и включить. Сказано — сделано. Заработало с полпинка. Теперь на видном месте стоит, включаю иногда.

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

И откуда столько GOTO?

8754

Петух свинье товарищ

Мне очень сильно надоело, что проектированием новых фич в системах занимаются люди, которые даже не потрудились как-то разобраться в уже имеющихся возможностях и в том, что вообще это за система.

Вот пример. Разводим мы кур. Приходит такой грамотей:

— А давайте теперь будем ещё и кроликов разводить в той же клетке!

— Кролики хорошо рыть умеют, они из этого курятника выроют себе выход на волю. Здесь клетки нужны.

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

Через некоторое время он возвращается и, воодушевлённый прочитанной в интернете статьёй, говорит:

— Свиньи — новая фишка! Они не особо роют, не вылезут из курятника. Всё, завтра заселяйте свиней!

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

— Давайте оградку поставим, чтобы они друг с другом не контактировали.

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

Опять грамотей уходит думать.

— А давайте коров! Они травоядные.

— Ну что ж ты, уважаемый? Мы же тебе только что объясняли, что нужно больше места. Да и доить корову нужно, и пастись выводить.

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

Ещё эти грамотеи часто любят, казалось бы, простые задачи описывать целыми поэмами: «Покрасьте забор курятника зелёной краской. Не белой, не чёрной, не красной, не фиолетовой, а именно зелёной. #00FF00 — вот такой! Землю вокруг курятника и в нём не нужно красить. Сарай и гараж тоже не нужно. Это мы через месяц будем менять и всё перекрасим. А курятник — в зелёный».

А сложные — двумя словами: «Отремонтируйте курятник». А что в нём ремонтировать? Дверь скрипит, лампочка сгорела или недостаточно ярко светит? Может, окружить колючей проволокой?

Вот так и работаем.

8746

My name is the law

Специальность «Программная инженерия», 1-й курс. Пример кода из методички про константы :

Const

PI = 3.14; { Real constant }

KOEF_1 = 9; { Integer constant }

KOEF_2 = KOEF_1*PI − 1; { Real constant }

MY_OPINION = True; { Boolean constant }

Компьютерщики всё-таки захватят мир. Когда-нибудь…

8712

Когда все принцессы спасены

Одни так мечтают вместо обучения программированию баловаться играми, что для них приходится программы типа SuperPuperAntiGame писать. А у меня в детстве, когда мне «Денди» подарили, наоборот, через две недели возникло острое желание попрограммировать. Моя фантазия рисовала клавиатуру, подключающуюся вместо джойстика, и картридж с Бейсиком. О том, что для оригинальной NES всё это уже было реализовано, я не знал, а «Сюбора» тогда ещё даже в проекте не было.

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

8702

Послушай клиента и сделай наоборот

Приходит к сапожнику клиент.

— Сделайте мне перчатки.

— Но я ведь сапожник!

— Ну правильно, я их на ноги надевать буду, но чтобы перчатки!

— Хорошо, сделаю.

Проходит день. Сапожник делает сапоги и ставит на полочку. Проходит ещё два дня.

— Знаете, я тут прикинул, у меня ведь пальцы на ногах короче, чем на руках. Мне нужны перчатки для ног, но чтобы пальцы короче. И нужно, чтобы они надевались через голову, так ведь куда удобнее!

— Хорошо, сделаю.

Сапожник отдыхает. Проходит пять дней.

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

— Хорошо, сделаю.

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

— Заказ готов?

— Да, конечно.

Сапожник снимает с полки сапоги и клеит на них бирку: «Перчатки для ног».

— О, самое то! То, о чём я мечтал!

— Всегда пожалуйста — я же профессионал.

8693

SuperPuperAntiGame, или Гонка вооружений

В 1990 году поступил я в МВТУ им. Баумана и попутно устроился работать оператором в местный вычислительный центр под названием «Аквариум». Только-только появились первые персоналки, и к нам как раз завезли суперсовременные компьютеры IBM PC XT. Как водится, студенты сразу же вместо занятий стали на них играть.

Начальство поставило задачу игры запретить. Сначала пытались бороться словесно — не помогало. Тогда я решил бороться программно и взялся за изучение ассемблера. Через пару месяцев появился первый продукт под названием AntiGame. Программа резидентно висела в памяти, перехватывала запуск программ через функцию 4Bh 21 прерывания и имела базу сигнатур различных игр — просто читался кусок данных размером 32 байта из файла со смещением 1000h. Если запускаемая программа совпадала с одной из сигнатур, то считалась игрой. Запуск обрывался, в буфер клавиатуры посылалось echo y|del., проигрывалась веселая мелодия. Через месяц мелодию знали все.

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

Покумекав, я взялся за клавиатуру. Спустя пару месяцев родился шедевр под названием SuperAntiGame. Это была шедевральная программа, написанная с использованием всех современных технологий, включая вирусные. Частично она даже использовала неизвестный тогда механизм «стелс», чем я до сих пор горжусь. Программа перехватывала 13 и 21 прерывания, причём не обычным способом, а путём внедрения в точки входа в области DOS, что делало бесполезным восстановление оригинальных векторов прерывания. В функциях поиска, открытия и записи файлов делалась проверка на имя файла antigame.exe и в случае совпадения возвращалась ошибка «File not found», так что ни один из «коммандеров» программу не видел. Также перехватывалось прерывание таймера 1Ch — на нём висела функция, постоянно проверяющая код в памяти. Если хотя бы один бит был изменён, то отключалась клавиатура, запускалась мелодия, флаг read only со всех файлов в текущем каталоге снимался, а в буфер клавиатуры отправлялось так любимое студентами echo y|del.. Помимо этого, там было ещё множество новаторских решений. Полный исходник занимал около 300 КБ текста, откомпилированный файл — 9 КБ.

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

Я, конечно, не питал иллюзий и знал, что рано или поздно это случится. К тому времени подходила к концу разработка бета-версии нового SuperPuperAntiGame, работающего в защищённом режиме только вышедшего тогда процессора 386SX, первые компьютеры с которым появились в нашем «Аквариуме».

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

8690

С миру по нитке, с программера по байту

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

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

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

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

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

Начальство подумало, вспомнило о премиях за новые идеи, согласилось и приказало программу доработать. Вот только старая версия была на C# и MSSQL, а разработчик, которого наняли взамен старого, знал PHP и чуть-чуть SQL. Благо все идеи о доработке сводились к созданию пары запросов. Однако срок доработки по приказу был месячный, потому разработчик перекрестился и сделал новую программу на PHP. Да, она выводила только результаты этих двух запросов. Да, оформление было просто никакое, но программа работала — и работала очень быстро. А ещё она использовала старую базу и была веб-ориентированной. Потом разработчик предложил перевести всё на веб, потому что так модно, и через полгода ушёл работать в крупному региональную контору.

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

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

8679

Те же колёса, тот же руль

Понадобилось как-то в программе выводить отчёт с названиями месяцев. Недолго думая, создаю функцию MonthName с двумя аргументами: индекс месяца и признак сокращённого имени.

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

8668

Из чего же, из чего же, из чего же сделаны эти игрушки?

Когда я учился на технической специальности, нам дали задание, расплывчатое чуть более, чем полностью: «Разработать собственный программный продукт».

Ну, я не поленился. Всё же игры пишем с друзьями достаточно давно — дай-ка исполню мечту детства, проведённого в Total Annihilation! Решил создать RTS в стиле известного детского конструктора. Выбрал изометрическую проекцию, нарендерил зданий, деревьев и упорно работал четыре месяца.

Конец февраля. С торжеством смотрю на получившуюся игру, провожу за ней часы, придумываю планы по дальнейшему развитию и лелею нескромные надежды сделать из неё что-то коммерческое. Решаюсь наконец-то приняться за написание реферата, знакомлюсь с местными правилами оформления списка источников.

Вопрос месяца: к какому типу источников относится друг-программист, кто автор статей по C# на MSDN и что теперь делать ещё с четырьмя необходимыми источниками?

8659

Ошибок не может не быть

Тестирую свой код.

1. Пишу юнит-тест.

2. Прога выдает на нём не тот результат.

3. Проверяю юнит-тест — не, прога вывела правильный результат, это у меня неправильный юнит-тест.

4. Исправляю.

5. Запускаю — ну надо же, проходит! Как так вдруг?!

6. Пишу новый юнит-тест.

7. Возвращаюсь к пункту 2.

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