bash.im ithappens.me zadolba.li

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

1695

Потеснитесь

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

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

1657

Десять раз по шесть рук

Мое первое знакомство с компьютером вообще и программированием в частности состоялось в восьмом классе школы. Происходило это всё в Доме Пионеров. Компьютерный класс состоял из нескольких «Корветов ПК8010» и одного главного «Корвета ПК8020», объединённых локальной сетью. Программировали мы на бейсике — других языков ещё не знали.

Никаких дискет и стримеров не было. Точнее, дисковод на головном «Корвете» был, но со странностями (об этом ниже). Первые коротенькие программки набирались быстро и в общем-то сохранения не требовали — нужные алгоритмы и функции записывались в тетрадки карандашиком. Но вот я дорос до написания Игры в Го, а одноклассник решил заняться «Морским Боем». Почему с больших букв? А вы попробуйте разрабатывать и отлаживать программу в тетради в клеточку...

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

1. На компьютере-терминале набирался нужный для сохранения код.
2. На сервере с дисководом код перекачивался в оперативную память и скармливался запущенному в фоне интерпретатору бейсика.
3. Дальше один человек не справлялся:

— Первый участник нависал над клавиатурой с целью нажать по сигналу Enter после команды SAVE "%filename%".
— Второй, хитро извернувшись под столом, залезал рукой в системник и указательным пальцем держал шпиндель дисковода с целью его раскрутки.
— Третий синхронизировал действия команды, отдавая приказы с определённым временным интервалом.

На практике выходило раза с третьего-четвёртого.

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

1634

Укрощение десятиголовой гидры

Где-то в 1992 году я учился на физфаке. На кафедре общей физики у нас был компьютерный класс, оснащённый компьютерами, гудящими, как реактивный самолет на взлёте. Звали машинки «Электроника», на борту крутилась операционная система «ПрОС 2.0». Через полгода завкафедрой выбил класс 80286 машин. Будучи несколько знакомым с компьютерами, я без труда стал лаборантом. Некоторое время жизнь была сказкой — неплохо получать и стипендию, и зарплату! Эстетическим бонусом были пятикурсницы, мывшие полы у меня в компьютерном классе.

На втором курсе в расписании появился предмет «информатика». Самым печальным было то, что я прочитал этот курс задолго до преподавателей. В отделе ИТ на пятом этаже стоял грозный i386 с десятью терминалами. Как они это умудрились это сделать — чёрт знает, но я помню толстенный пучок проводов, припаянных прямо к материнской плате. Первым (и последним) моим развлечением было создать на бейсике замкнутый на себя цикл. Естественно, вся система от переизбытка чувств вешалась. Раза после десятого меня вызвал преподаватель, поставил в зачётке «4» и расписался. Мотивировал так: «„5“ за диверсию — много, а „3“, учитывая знания, мало». Хороший дядька оказался, только вот на свои занятия ходить запретил категорически.

1633

Разбитые мечты, или «Идите на»

В далеком 1991-м я поступил в горный техникум на специальность, никак не связанную с IT. Но так случилось, что именно в этом учебном заведении я впервые увидел настоящий комп. Развлекались с товарищем бейсиком — других языков не знали, однако местный админ, увидев наше стремление, дал нам отведать С++. Это и стало ключевым моментом в выборе профессии — я стал программистом, правда, без диплома.

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

Из нашей группы в 25 человек имели представление о программировании не больше десятка, а на самом деле программировали только я и ещё один парень. Сидим мы однажды на лекции по программированию. Преподаватель — известный в этом вузе доцент, женщина бальзаковского возраста. Доходит очередь до операторов цикла. Преподаватель разъясняет типы, синтаксис и условия. Рассказав про операторы break и continue, преподаватель неожиданно заявляет, что пользоваться этими операторами ни в коем случае нельзя, так как они нарушают логику программы, а для прерывания цикла следует использовать исключительно goto. Группа продолжает писать лекцию; возмущаются, как вы уже поняли, только двое. Впрочем, возмущения ни к чему не привели. Все наши аргументы были разбиты о простой намёк: «Будем умничать — сессию не сдадим!»

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

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

1628

Если ты не выпьешь пива, компилиться будет криво

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

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

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

Прога запустилась сразу и отработала на 5+.

1596

Русский стандарт

Пишу программу учета статистики на чемпионате по квиддичу. Отлучился от компа, возвращаюсь — приятель пристально смотрит в мой код:

— Слушай, а зачем у тебя в программе переменная называется «Русский стандарт»?
— Где ты там такую переменную нашел?

Смотрим в код вместе. Втыкаем. Я объясняю, что «rudefault» — это не ru_default, а rude fault (грубый фол).

1595

Полуночные алгоритмы

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

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

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

В ходе непродолжительного опроса товарища оказывается, что задача поставлена именно так, как я её понял с первого раза, и даже не нужно учитывать случай, когда значения равны. И никаких гвоздей, как говорится…

Из соображений цензуры не буду показывать то, что он мне прислал в ответ на мою одинокую строчку:

return (a > b) ? a : b;

А мораль проста. Граждане программисты! Здоровый сон — основа качественного кода!

1544

Всё своё ношу с собой

Как-то раз дорабатывал я чужой проект, написанный на РНР. Конечно, использовалось ООП — известно, что только ламеры пишут процедурный код, а реальные пацаны без объектов и «хеллоу ворлда» не напишут.

Центральным элементром нестройного ансамбля был класс main, содержавший в себе всё. Его экземпляр создавался в каждом скрипте, он содержал в себе весь набор сервисных функций в виде методов и так далее. Были и классы помельче — например, класс, необходимый для работы с потоком закачки файлов. Из экземпляров этого класса в классе main создавался массив закачек. Здорово, но как из любого экземпляра класса «поток» получить доступ к сервисным функциям, определённым в main? Всё гениальное просто! Надо в каждый класс «поток» воткнуть экземплярчик класса main, и дело в шляпе.

В итоге сервак, который на лету распаковывал гигабайтные архивы и с лёгостью ворочал ISO-образами, тупо висел по 30 секунд на примитивном фронт-энде для линуксовой консольной качалки. Всякого я повидал, но такое — первый раз в жизни.

1534

Первый прямой отжим

С архиваторами у меня давние и тёплые отношения. Самый мощный в мире архиватор написал я на втором курсе института в качестве курсовика. Файл любого размера он сжимал до двух байт: 0x00 и 0x01. На растерянный вопрос препода: «И что же теперь с ним делать?» — я честно ответил: «Понятия не имею. Было задание написать архиватор, а задания писать разархиватор не было».

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

Делать нечего — через неделю архиватор был предъявлен. Он сжимал любой файл раз в пять лучше RAR на максимальной компрессии и делал это раз в десять быстрее. Выгодно отличало его от моего первого детища то, что этот умел разархивировать файлы. Руководитель сиял, как стоваттная лампочка, и на предъявленный исходник отреагировал мимолётным взглядом и снисходительным кивком. А зря, потому что среди 30 КБ bitwise-операторов и булевой логики сиротливо ютились несколько вызовов к внешним DLL. Один из них со скромным названием RightAlignDWORD получал хэндл открытого файла, копировал его на последние незанятые кластеры жесткого диска и возвращал список кластеров — FAT, разумеется, оставался нетронутым. Этот список кластеров и был единственной полезной информацией в получившемся «архиве».

Защита прошла на ура, я забрал диплом и выписался из общежития. Пути наши с моим (теперь уже бывшим) руководителем разошлись. По слухам где-то через год он меня упорно искал через знакомых. Зачем бы, интересно?