Предисловие: Приведенная ниже история была опубликована в Интернете в далеком 2001 году. Её автор — Дмитрий Галущенко. Но события, аналогичные описанным в ней, как следует из комментариев пользователей, происходили со многими программистами в 80–90-х годах прошлого века, когда приходилось учитывать серьезные ограничения по памяти, времени работы программы и т.д.
Итак…
Hо все по порядку. Я программер. Но не просто программер. Я принадлежу к касте, которую иногда называют “системщиками”, иногда “кристальщиками”. Вы знаете, что это такое? Я объясню, если потерпите. Мне никак не обойтись без специфики, но иначе вы не сможете понять дальнейшее. Мы программируем чипы-однокристаллки, грубо говоря, это когда весь комп в одном кристалле. Программная память и память данных разделены и не взаимодействуют между собой. Программа не может быть запущена в оперативке. Глубина программного стека ограничена. Максимум, на что я могу рассчитывать, это восемь уровней вложения, причем я не могу изменять предельную глубину стека. О, вы не подумайте чего! У меня бездна ресурсов. Оперативки аж 128 байт! Это на все про все. Переменные, там то да се… Представили, да? С программной памятью тоже неплохо. Аж восемь килобайт. И пользоваться ей совсем несложно. Сначала нужно программно врубить нужный банк памяти, запустить в нем нужную процедуру, а по выходе из нее не забыть вернуться туда, где был. Да, еще надо иметь в виду, что в пределах банка я могу перемещаться только джампами и вызовами процедур, а переходы по условиям возможны только в пределах одной страницы, т.е. 256 байт. Это значит, если я сравниваю два байта и надо ветвиться, но если метка не находится в пределах 256 байт, то это письмо на деревню дедушке, причем компилятор только в половине случаев предупредит, мол, широко шагаешь парень, штаны бы поберег. И это только цветочки! Ягодки я вам сейчас выложу, чтобы вы ими в полной мере могли насладиться. У меня нет команды вычитания. Вообще! Только add. Уж про такую роскошь, как умножение или деление, я вообще молчу, это для лентяев. Зато мне нужно обеспечить десятичную математику. Вы проникаетесь потихоньку? Коды таких игрушек вылизываются так, что вам и не снилось, особенно если приходиться решать задачи на пределе оперативной и программной памяти. Исходники переписываются далеко не один раз. Мне мало просто решить задачу. Я должен впихнуть ее в этот чертов кристалл! Ограничение по переменным, по размеру кода в целом, по размеру каждой процедуры и по числу вызовов. Малейший недосмотр и… стек продавлен, и тебя вышвыривает черт знает куда. И компилятор не поможет. Такое он не ловит… Вы думаете — это все? Hе-е-ет, дорогие мои. Моя игрушка работает в реалтайме… Это когда напротив каждой крохотной процедурки моего кода нужно подсчитать и проставить время ее исполнения в миллисекундах. Мои модули не должны работать больше фиксированного времени, потому что мне надо еще сканировать кейборду и дисплей, поспевать за датчиками и выдавать управляющие сигналы, а все остальное должно работать, никак не мешая сканнингу, иначе я прозеваю нажатие кнопки или дисплей станет неприятно мерцать, меняя яркость. Но и это еще не все! У меня есть интерфейс. Обычный писишный RS232C — так называемый «компорт». Но если вы думаете, что это отдельный чип, мол, сунул ему байт, принял из буфера байт, то вы заблуждаетесь. Себестоимость. Я всё это делаю ручками, телепая единственный бит порта. Ручками кручу диаграмму стартов, стопов и данных.
Любой средней руки программер, поставь его в подобные условия, застрелится на второй день. Вообще, по моему убеждению, парни, работающие в этой области, имеют стальные нервы и неукротимую волю к победе. Мы редко общаемся с обычными программерами — нам в общем не о чём разговаривать. И не потому, что мы снобы или гордецы. Совсем необязательно. Нам трудно представить себе программирование под неисчерпаемыми ресурсами на языках высокого уровня. Мало винта? Купи другой, в чем проблема? Мало рамы? Купи еще, толкни в слот. Меги кодов? А я причем? Это компилятор виноват. Купите машину побольше. Это как разные планеты, и я надеюсь, вы поняли, почему.
Это как красивый белый океанский лайнер в бескрайних океанских просторах — плыви, куда хочешь. А вы попробуйте на нем в финских шхерах порулить. Или вдевать нитку в иголку среди ночи. Причем черную нитку.
Hу что ж. Я ввел вас в предметную область и могу продолжить свой рассказ. Кристалл не понравился мне сразу. Я сразу понял — тесноват. Все на пределе. Законных 20% запаса по ресурсу, на возможные ошибки — не соблюсти. Однако остальные кандидаты были сильно избыточны, и потому дороги и нерациональны. Себестоимость решила все, я, наконец, выдал свое согласие, и мощные и гордые красавцы Intel’ы и Mоторолы последних моделей остались за бортом. Поначалу все шло как надо. Пару месяцев работы и кристаллы были нафаршированы кодом, испытания прошли нормально, платы разведены и отработаны, медленно провернулись шестерни и, набирая ход, закрутились, приводя в действие сложную и громоздкую машину производства. И только у меня изредка ёкало сердечко, ведь все сделано впритирку! Три, от силы пять процентов, ресурсов остались свободными. А это чертовски мало, поверьте мне на слово. Хотя работа была сделана весьма неплохо, и я получил свое законное вознаграждение в виде порции удовольствия от сделанного. Конечно, пара мест сделана довольно авантюрно, местами рыхловато, но зато и несколько изюминок получилось. И тут… Тут все и началось. Выяснилось, что недостает очень важной функции прибора, которую проморгали постановщики. Причем даже не они, а заказчик. Это он вдруг вспомнил, что вот, мол, ребята, тут еще вот такая мелочь должна быть. Ну, сущая ерунда, чесслово, но без нее никак. Ну, забыли при постановке про нее, с кем не бывает? Но это ж несложно совсем добавить, по сравнению с остальными вашими наворотами? Опять же, слава богу, что не датчик забыли. Это всего лишь программа! Ох уж эти постановщики!!! Их карма понять, что надо заказчику! Даже если для этого надо распилить ему черепушку и просеять через сито все ее содержимое!
Hо криком делу не поможешь. И я на две недели засел дома, запретив меня беспокоить. В мозгу завелись маленькая сирена и светофорчик. Би-и-п! Вспышка красного! Первый программный банк исчерпан! Репакинг. Оптимизация размещения кода по страницам и банкам памяти. Би-и-п! Оперативная память исчерпана! Пересмотр функциональности процедур. Эту переменную на фиг. И без этих можно обойтись, если тут по другому пути пойти.
Через полторы недели я понял, что дело худо. Я располагал более чем полудюжиной решений и уже стоял на месте. Я знал каждую процедуру и функцию наизусть, а каждый байт в лицо! Все было впустую. Картинка замерла. Она не хотела оживать! Мне не хватало одного байта. Это показывали все варианты решений. Всего одного байта! Забежав к другу, я сбросил ему все варианты решений с временными диаграммами и планами банков и вновь вернулся в свою берлогу. Спать. Во что бы то ни стало — спать. Нужна ясная голова. Нужна новая идея. Я опустошен. Следующие несколько дней не дали ничего. Я собирал и разбирал код, нанизывая его, как сверкающие бусины, и упаковывал его в фигурки разнообразной формы, пытаясь найти форму, в которой все эти элементы головоломки сложатся в одно целое без единого зазора и также без зазора войдут в заготовленное для них место. Места не хватало… Одного байта! Я мял код, как глину, я выделывал с ним все что угодно, но… один, всего один байт! Наверное, нечто похожее испытывает музыкант, написав симфонию, пытаясь найти одну единственную ноту, чтобы заставить звучать свое произведение. Или художник ищет тот самый, неповторимый мазок, который оживит картину. А без этого все мертво и весь труд годится только на помойку… Как-то в полусне я оделся и вышел на улицу. Под ногами мерзко визжал снег. Кругом все было серо и как-то тускло. Мне больше не нужен был ни компьютер, ни распечатки. Вся схема была во мне… Или вне меня? Она помигивала разноцветными просвирками, имея форму причудливых и чем-то даже красивых трехмерных фигур, или это какие-то ажурные конструкции? Тоненько попискивали контрольные маркеры временных отметок, висящие впритирку к этим кристаллам странных, каких-то завораживающих форм. И все это летело, куда-то перемещаясь и вращаясь в каком-то странно меняющем форму канале? Трубе? Оно проносится вплотную ко всем его стенкам как по команде невидимого штурмана, в нужный момент разворачиваясь по непонятно какому наитию, чтобы выступающая грань не зацепилась за препятствие. Но каков его капитан или кто там? Штурман? Ведь не пройдёт же! Там нельзя пройти! Hо нет! Чудесным образом все сооружение как-то грациозно изворачивается, ровно в нужное мгновенье и беззвучно проскакивает. Нет — величаво минует препятствие… А впереди следующее… И, вдруг, край ажурного сооружения своим крохотным выступом цепляется. Визг и грохот! Лопаются и сминаются сверкающие нити, и все дробится на миллионы осколков… Господи! Это же стек! Оно обходит стек! Вот значит, как это выглядит! Когда я исчерпываю глубину, она видимо с треском цепляется и разрушается, ломая свои ажурные конструкции… В каком-то месте я замечаю скамейку с какой-то одинокой старушкой на ней. Мне нужно тоже посидеть… Напротив стоит продавщица цветов, приплясывая от холода. Какая-то неприятная, чуть не мерзкая. Да и старуха чего-то уставилась на меня? Кто она? Чего сидит здесь? Небось, от нечего делать. Это они вечно толпятся в магазине, и из-за них ничего не успеваешь купить. И визжат в троллейбусе, чтобы им уступили место. Небось, смотрит эти идиотские новомодные сериалы, как их там? Мария? И ещё кто там плачет? Да что они все понимают!? Кто это может понять, сколько знаний и труда надо, что бы выстроить такое? Сколько бессонных ночей надо провести? Сколько читать? Причем ежедневно, и вовсе не идиотский роман о любви и дружбе? Да кто вообще в состоянии это понять!? Эти новоявленные пижоны, называющие себя программистами? Коряво пишущие на фокспрах3, клипперах4 и бейсиках? И везде задающие вопросы: а скажите, какую команду мне надо набрать? А какой хелп почитать? А когда мануал на русский переведут? А этот их так называемый “софт”? Великие стотысячевариантные вечном живые склады и бухгалтерии? Нетленные творения. Все на одно лицо. Если там и есть различия, так в корявости и глючности кода. Глюк на глюке сидит и багом погоняет… Вот заставить бы их высекать их коды в камне, как древние камнетесы, чтобы хоть немного задумались о том, чего пишут… Или эти технокрысы? Это ж надо — вирусы писать, чтобы, значит, гадостью людям сделанной прославиться! Тьфу! Hет. Hе хочу я сидеть на этой скамейке, в компании с этой старушкой. Куда же я шёл? Вспомнил. К другу я иду. Может, подскажет чего? Проклятый байт! Чего я взъелся то так? Все своим делом занимаются, с чего бы худшим, чем я? Талантливых людей хватает везде. Что-то сильно меня, видать, припекло…
Приятель, открыв дверь, молча смотрит на меня.
Колени мои подогнулись, и я то ли сел, то ли сполз на стул. Я глубине души я знал это. А потом я стал говорить. Это был странный монолог. Как будто кто-то кричал, шептал и снова орал моим голосом: “…думал все это время. Я понял, что не так уж важен этот проект, как мерило моей ответственности. Ну не решится он, ну переделается там как-то всё. Черт с ним! Не так уж это важно. Позор там мой. Дело в другом. Во мне.
Ты знаешь, что я уже очень давно не раб, который делает, то что скажут, оправдывая это зарабатываем денег для семьи. Очень долгое время я наемник. Мои услуги, мои программы стоят очень дорого. Ты же знаешь, я не берусь за простые вещи. Пусть хоть озолотят. Я на себя и для себя работаю. Да мне уже давно плевать на деньги! Они практически не имеют надо мной власти! Мне другое надо! И я тщательно скрываю это. Потому, что интересную задачу я готов делать бесплатно, а то ещё и приплачу за нее. Ты же сам знаешь, каково это!? Ну?! Ты ведь тоже не для денег это делаешь! Есть только одна вещь, которую я никогда и никому не говорил. Я, когда делаю, — лечу. И не ври мне, что не знаешь, что это! Все знают это! Только предпочитают не помнить или не верить! Тебе тоже знакомо это! Это как в детских снах. Помнишь? Мы взмываем высоко, высоко и несемся, визжа от переполняющего восторга! А под нами проносятся леса, горы и моря! Ты думаешь, это был сон!? Нет! И я давно понял это! Только сказать боялся. Стыдился, дурак! Но теперь мне все равно! Это душа наша летит! По- настоящему! А разум говорит, что мы спим. Понимаешь? А почему, когда мы взрослеем, перестаем летать? А!? Почему?! Почему нам перестает сниться этот сон? Не знаешь? А я знаю! Потому, что душа наша тяжелеет, потому, что ценности, деньги, условности этого общества захватывают над нами власть и душа наша больше не в силах поднять этот груз! Как же! Мы ж прям, распластываемся, чтобы стать ковриком, о который вытрут ноги! О, какие веские причины, такие аргументированные объяснения, почему это было необходимо именно так прогнуться и как мы это ради кого-то это делаем. Мы врём сами себе каждый день, убеждая сами себя, что живём правильно. А я не хочу, не могу больше врать! Ты не понимаешь, как это относится к этому дьявольскому байту!? Все очень просто. Я уже давно могу летать! И работа помогает мне в этом. Да-да!
Я медленно поднялся и, ссутулившись, пошел к двери.
…В офисе тепло и уютно. Калорифер. Чистенько. Жужжат компы. Папочки, стоечки. Девочки поят меня кофе, подкладывают булочки, которые я пожираю с жадностью, перемазавшись в шоколаде. Они подливают и подкладывают, сердобольно глядя на своего опустившегося коллегу. Девочки тоже программистки, чего-то там офисное набивают, на радость кадрам и бухгалтерии. Они аккуратны, при макияжах, отлично, словом, выглядят, особенно по контрасту с моей многодневной щетиной (а может уже и бородой?). Я кратко и с неохотой отвечаю на вопросы, что, мол, меня до жизни такой довело. “Не решается. Ассемблер. Со стеком проблемы. Байта не хватает”. Одна из них, Оксана, кажется, её зовут, говорит с украинским приятно-округлым выговором: “Який такий стек? Зачем он тебе нужен? Мы с Олей, она на Клиппере, я на Фоксе, никакого стека у нас нет. Может, и тебе не надо? Вечно вы, мужики, себе пакость какую выдумаете. Сами же и мучаетесь, да нас мучаете, скажи, Оля?”. — Что?! — Только кресло мешает мне свалиться на пол. Какой-то противный, каркающий клекот рвется из меня: “Вы пишете без стека!?” А вот это уже истерика. Я снова на улице. Милые, милые наши дамы! Как вы приятны в вашем неведении. И как это здорово, что вы этого не знаете. Вам и не нужно это знать. Сходить с ума от нерешенных задач, как и философских вопросов, — это привилегия мужчин. Конечно, бывают и исключения. Но они скорее подтверждают правила. Если в высокоуровневых языках дамы ещё попадаются, к сям и ассемблерам практически исчезают, то в нашей области я не слышал о них вообще. И это правильно! Нечего валить на женщин ещё и эти проблемы. А ноги несут меня куда-то, мысли текут сами по себе. Мне они неинтересны, я человек конченый. Я не смогу с этим жить. Буду влачить существование, все равно кем, но уж к компьютерам этим, на пушечный выстрел не подойду, это уж точно. Поделом. Нечего было строить из себя крутого. А эта моя снисходительность сноба? Мол, все знаю, все мне по плечу. М-да. Доигрался, козел? Я бреду в этом абсолютно чужом для меня мире, в котором ни одна живая душа не в состоянии меня понять. Друг и тот не смог. И никому нет до меня дела. Hо что это? Я здесь вроде был? Цветы. Скамейка. И бабушка на ней. Как будто и не уходила. Ведь мороз же? В нерешительности я присаживаюсь на край скамейки. Ого! Руки-то замерзли и ухи тоже. И тут, как будто что-то толкнуло меня, я встал, подошел к продавщице цветов и на последнюю трешку (а зачем она мне?) купил розы и подошел к бабушке. В голове у меня судорожно билась мысль: что я делаю? Зачем? Она ждала, подняв ко мне лицо. И я выдавил из себя: “Извините. Я могу подарить Вам цветы? Я плохо подумал о Вас тогда”. Она нисколько не удивилась. И сказала: “Где же ты был так долго, сынок? Я замерзла ждать тебя”. Сказать, что я удивился, значит не сказать ничего. Я был потрясён, ошеломлен, раздавлен! А она продолжала: “Тебе ведь плохо, сынок?”. Она смотрела на меня с участием. В ее глазах светилась мудрость, доброта и… любовь. Вы понимаете!? Ко мне любовь. И тогда я сказал: “Да! Мне плохо. Мне очень плохо”. Я не боялся и не стыдился. Что-то как будто упало с меня, отскочив, как шелуха. И я стал рассказывать. Сбивчиво, торопясь и захлебываясь. Я рассказывал бабушке, как я программирую однокристальные микропроцессоры. Она внимательно, не перебивая, слушала меня. Она всё понимала! Каждое мое слово! Это я видел по её глазам. Я говорил и говорил. А она вела меня куда-то, и я ел, что-то очень вкусное, а потом мы пили чай с каким-то необыкновенным вареньем на крохотной, но такой уютной кухне. Наверное, это была очень странная картина. Полусумасшедший программист и старушка, его внимательно слушающая. А потом говорила она. Я не помню, о чём. Я только помню, что это было очень важное и нужное мне, что я черпал из этой кладези мудрости, которую можно обрести, только потеряв столь много, но обретя любовь. И вдруг. Снова стала разворачиваться внутри меня странная, невесомая и в то же время прочная конструкция. Она разворачивалась мощно и грациозно, окруженная великолепием огней. Каждая ее грань, каждый элемент были совершенны и неповторимы! И легонько вибрируя, она порождала музыку. И всё это вместе наполняло меня необычайным трепетом и восторгом! Это я! Я создал её! Это мной отшлифованы все её грани! Ну почему этого никто не видит!? Ну посмотрите же! Разделите со мной мое счастье! Теперь я не боялся. Я знал, что она полетит! И она поможет и мне оторваться от земли. С ней и я полечу к звездам! И я снова шел по улице. Но совсем по другой. А точнее — просто в другом мире. Потому что этот был прекрасен! Снег брызгал разноцветными искрами тысяч неповторимых красок и такой неповторимой музыкой звучал под ногами. Это как будто ваш старенький компьютер с CGA монитором, вдруг стал показывать миллионы цветов. Впрочем, что за чушь я несу? Это много, много лучше. Создавайте свои корабли. И пусть они путешествуют в необычайных мирах. Я был неправ. Каждый из нас может путешествовать и жить в этих мирах. И это не важно, как и где вы их создаете. Мы создаем программы в той же мере, в какой они создают нас. И настоящие программы создают не хитростью, и для этого мало разума знаний и смекалки. Они должны пройти через сердце, потому что являются порождением нашей любви. Потому, что программы, которые мы создаем, чистый продукт творчества. Именно поэтому они столь привлекательны. Не нужно ни молотка, ни зубила, ни кистей и красок, чтобы выразить в ней главное — себя! И это не важно, что, может быть, понять красоту ваших кодов сможет не так уж и много людей. Если, написав свою программу, мы стали лучше, то это правильная и хорошая программа! Но если вы думаете, что нужно меньше труда, то вы ошибаетесь. И если вы не готовы или не хотите в своем творении оставить часть своей души и любви, не готовы к тому, чтобы изменить себя, то лучше не пишите программ. Поищите себя, в чем-нибудь другом… Послесловие автора. Прекрасно! Это и есть настоящая ЖИЗНЬ. Безудержный восторг, охватывающий тебя в момент, когда твое творение оживает, можно сравнить только с умением летать. Эмоции и чувства бьют через край. Ты уже не можешь их больше в себе сдержать. Ты пытаешься поделиться с другими этим счастьем, но наталкиваешься на стену непонимания, раздражения. В такие минуты хочется забыть их всех, отрешиться от этого жестокого, мертвого мира, закрыться в комнате, наедине со своим компьютером, чтобы продолжить жить в своем прекрасном идеальном мире. Это, как наркотик, притягивает, и ты не можешь отказаться. Ты начинаешь агрессивно нападать на тех, кто пытается посягнуть на твое счастье. Временами кажется, что ты одинок, остался один во всем этом, непонимающем тебя, мире. В такие моменты спасает одно — надежда на то, что всё же есть небольшая горстка людей, способных понять тебя, таких же, как и ты, — низкоуровневых программистов.
Послесловие редакции.
|
|