Окончание института пришлось на 91й год, так что я сразу выпустился из института в новую реальность. Были две халтуры с VAX уже за деньги - одна в небезызвестной фирме Delta Telecom, где я занимался базой данных (сразу PROD, QA у них не было). Так как это был PROD, то мне сказали - осторожно, у нас все клиенты - люди непростые.
Однако вскоре я прибился к фирме Ниеншанц, которая торговала вначале всем, чем можно (тогда были кооперативы, которые могли обучать английскому, продавать брус обрезной и делать аборты). Однако довольно быстро Ниеншанц сконцентрировался на компьютерах и комплектующих к ним. Нас (меня и еще двух парней) взяли делать, грубо говоря, API к базе - некую структуру, которая позволяет "гулять" по таблице произвольных размеров, подгружая нужные части по мере необходимости. Еще нам казалось очень важным обеспечивать пессимистичную блокировку - если кто-то вошел в документ, то никто другой войти не мог бы.
Код писался на Borland C (который ставился с 35 дискет), а наш третий коллега на С++ писал GUI, точнее редактор GUI, который мог сохранять нарисованный интерфейс в файл и потом использовать это в runtime. Система блокировки писалась на Novell - да, мы создавали NLM. Novell 3.1 имел плоскую 32 битную память без виртуальной памяти, и кооперативную многозадачность. То есть, если вы в своей программе забыли вызвать yield(), то все висло. В качестве сети использовался IPX/SPX, а сеть была по коаксиальному кабелю, который обходил все компьютеры и кончался терминатором. Когда девочки из бухгалтерии начинали переставлять очередной раз свои столы, то кабель отходил, и возникали чудеса.
Первая версия API была написана на VAX и еще работала с его базой данных, VAX RDBMS. Так что спустя многие годы в коде C все еще попадались фрагменты #ifdef VAXVMS. Однако на писишках нам пришлось использовать что попроще. Вначале мы использовали NWSQL - Netware SQL, который использовал базу Btrieve. Однако для использования NWSQL нужно было грузить реквестор - резидентный модуль, который отжирал 200K из драгоценных 640K. Я решил его выкинуть и написать свой SQL который работал непосредственно с Btrieve. Я как сейчас помню модуль bt.c длиной в пару тысяч строк, реализующий узкое подмножество SQL и содержащий такое количество булевых флагов, что я давно отчаялся вспомнить их логику и вводил новые. Тем не менее, модуль верой и правдой проработал до перехода на MS SQL
Начало работы было очень легким, так как мы делали, говоря современным языком, proof of concept. На работу мы приходили в 11, иногда из каморки, где были наши машины, выползало тело, которое после пьянки не смогло уйти к себе домой и осталось до утра. Мониторы иногда исчезали - их продавали, так что часто мы оказывались на черно-белых мониторах, или получали карту Hercules вместо EGA. Мы не перенапрягались - иногда играли в самую первую Дюну, а посмотрев в 5 вечера по маленькому телевизору очередную серию "Чип и Дейл спешат на помощь" шли домой. Тогда же в ларьках мы впервые попробовлали Сникерс и Марс.
Так как proof of concept был успешен, нам поручили, опять-таки выражаясь современным языком, создать home-grown ERP system, которая была названа SELLER 1.0. Тут работы стало больше, но стало веселее. В фирме все знали друг друга, и когда приходил грузовичок с корпусами компьютеров, то все, даже директора, становились, чтобы передавать технику по цепочке. Зарплату вначале нам платили в рублях, и, получив ее, мы часто в тот же день обзванивали обменники и бежали менять рубли на доллары по лучшему курсу. Позже эта проблема исчезла, когда платить стали зелеными купюрами.
К этому моменту SELLER 1.0 стал себя изживать из-за ограничений дизайна. Кроме того, цена товара хранилась в копейках в long int, и, превысив 21 миллион рублей, стала отрицательной (это не так много - это было до деноминации - то есть 21 тысяча рублей, с учетом покупательной способности - тысяч 100 современных). В ответ на это я написал за пару дней decimal fixed point arithmetic.
Лично для меня это было очень оптимистичное время, мы открыли для себя йогурты, и все время появлялись новые. Я купил видик (Электроника ВМ-12) и мог смотреть видеокассеты с комфортом дома, а не в душных видеосалонах. Чуть позже я собрал из уцененного хлама и принес домой первую свою 386ю машинку. А в 95м году купил свой первый автомобиль - Таврия. Таврия все время ломалась но... это была первая машина... Тогда же мне на работе выдали первый сотовый от Delta Telecom, чтобы со мной могли связаться, когда я был на даче. Но вот увы, он ловил вышку только если я забирался на дачный стол и вытягивал руку вверх.
Тем временем мы стали разрабатывать SELLER 2.0, причем сделали его не только гибким функционально, но и разработали, говоря современным языком, managed runtime (мы просто не знали, что двух человек для этого мало). Мой коллега написал (задействовав yacc и lex) компилятор с выдуманного нами языка NDL (Network Database Language), я написал линкер и интерпретатор. Код интерпретатора грузил в extended память DOS, так что мы были избавлены от проклятья 640К. Все это пригодилось в дальнейшем - исполняющая система перекочевала в Win16, потом Win32, потом выкинули Btrieve и задействовали MS SQL (кратко версии 4.0, проскочили 6.0, и остановились на 6.5). Несмотря на все эти изменения бизнес логика работала как есть.
Отказ от Novell был закономерным, хотя не было файлового сервиса лучше, чем Novell Netware. Он не превзойден до сих пор: возможность прятать каталоги, к которым нет прав (Microsoft попыталась это повторить с помощью плохо работающих костылей), программа salvage, восстанавливающая свежеудаленные файлы вне зависимости от того, как они удалены (а не те, которые попали в Recycle Bin). Novell 3.1 было вершиной развития. Потом была версия 4.0 с тяжелыми драйверами только под DOS (тогда как Win95 уже любила нативные 32-битные драйвера не забивающие 640K), и ради чего? Файловый сервер был великолепен, но бизнес логику на yield() писать плохо, дальше Novell стала делать что-то невнятное и в конце выродилась, став веткой Unix.
SELLER 2.0 пошел в активное использование, и где-то год мы работали не поднимая головы. К нам непрерывно приходили с багами, пожеланиями и фичами. Тем не менее, Doom I смог парализовать нашу работу на какое-то время. К нам в помощь стали нанимать еще людей. Мы переезжали в другие помещения вместе с фирмой. Вечерами выходили во двор посмотреть очередную новую машину - чье-то приобретение (новую, то есть свежекупленную, как правило они были пожилыми). Обсуждались только следующие характеристики: мощность, объем двигателя, момент, разгон до 100. Редко какую пятницу я уходил трезвый домой.
Один раз во время пьянки меня вызвал шеф - кое что надо было починить в базе напрямую, исправив значения в таблицах. В PROD разумеется. Шеф критически оглядел меня, но дал добро. Мозг работал неплохо, а вот изображение отчаянно двоилось. Пришлось закрывать один глаз. В другой день пьянка была в середине недели, и, придя на следующий день на работу ко мне подошел охранник и сказал тихо: "Вчера... один из ваших... До туалета не дошел." К счастью, дело было не в том, о чем я подумал: он просто шел к туалету, сел на подоконник покурить, да так и заснул.
1 января 98 года была произведена деноминация: цены в рублях поделили на 1000. Что делать, если часть договора была оплачена до нового года, а часть позже? Во многих частях кода появлялись примерно такие строки:
if Deals.Currency = 'RUB' then Sum := Sum /1000 end;
Основных валют, кстати, было четыре: RUB, USD, а также _USD и _RUB. Валюты с подчеркиванием означали черную бухгалтерию. Был режим, который прятал все черные документы. В каком то месте я забыл поставить if, проверяющий валюту, и на 1000 поделилась сумма в долларах. Это был договор с поставщиком из заграницы (там были честные доллары) и неправильный баланс умудрились подмахнуть не глядя, наш платеж 50'000USD превратился в 50, то есть мы потеряли 49950 USD. Наказан был менеджер, а не я... А могло бы быть и так:
Мы пытались сделать и Seller 3.0, названный Ultima-S, и даже думали его продавать. Проект технически был очень интересен и необычен, но вот только продавать софт никто не умел. Впрочем, даже если бы кто-нибудь бы и умел - вряд ли существует что-то более неблагодарное, чем внедрение ERP систем. Будущее показало, что остались лишь специфические системы под определенных клиентов, либо 1C, либо монстры за которыми стоят репутация и большие деньги - SAP R/3, JD Edwards, причем совершенно неважно, какой ужас творится с технической точки зрения в том же ERP. Решения о внедрении таких систем принимаются на поле для гольфа (в России 90х - в бане) людьми, далекими от IT. И, кстати, я никогда не слышал, чтобы кто-то был бы удовлетворен внедрением таких монстров (в частном разговоре, а не официально, разумеется).
Начинался новый миллениум, и я решил попробовать себя за границей, в Америке (об этом следующая часть). Предыдущие части:
Путь в IT, воспоминания бумера - программируемые калькуляторы, перфокарты, ДЗ-28
Путь в IT, воспоминания бумера - институт, СМ ЭВМ (PDP-11)
P.S. Хорошая задача на собеседовании: назовите отличия моделей памяти tiny, small, medium, large, huge.
iiwabor
Ностальгия)))
Мой сын хотел меня подколоть — поставил DOOM 1 и предложил мне сыграть. Не сразу, но после третьего захода игры я показал ему класс — руки еще помнят)
И это без всяких там IDDQD и IDKFA
3epg
Регулярно в офисе гамаю в DOOM. В тот самый, с 2,5d графикой. Правда с мышкой и WASD.
Пробовал играть в третий, не зашёл. А на современные не хватает ресурсов офисного компа. Оо
martin_wanderer
Ну вроде бы уже тогда не обязательно было трактористом бегать. Мышь, хоть только по горизонтали, но работала.
3epg
Можно, то можно было. Но я познал мышь в шутерах только с выходом первого квейка.
Markov_Il
Ох, сколько же ностальгии… Правда не очень горю желанием окунаться в мир компьютерных игр 0ых, но вспомнить приятно)
yarglor
Проблема в том, что мышь работала и по вертикали (бег). И это мешало. Особенно учитывая, что я через правку default.cfg (или как-то так) поднимал её чувствительность, чтобы коврик не слишком быстро кончался. Даже подумывал о выламывании (отрывании провода) от одного из двух роликов…
mistergrim
А проблема просто решалась www.doomworld.com/idgames/utils/misc/novert
atomlib
Даже первый Doom предполагал использование мыши. То, что он был заточен исключительно под клавиатуру — миф. Если у вас сомнения по этому поводу, просто загляните в приложенный к игре буклет или диалог установки игры. Ну или посмотрите на то, как Ромеро играл в 1993 году с Грином в детматч. Там повороты очевидным образом слишком быстрые для мыши.
3epg
Да я ж не отрицаю, что использование мыши предполагалось изначально. Просто я её начал использовать только в кваке. ХЗ почему, может у меня её на тот момент тупо не было, там и комп то далеко не топовый был. 386й с винтом на 40мб, на который влазил только дум, да турбо паскаль. И монитор с защитным экраном. Звуковухи тоже не было. Все звуки через PC speaker. )) Насколько я помню, чтобы без лагов поиграть, надо было экран минусить, иначе FPSов мало было. Слова то такого, фпс, не знал тогда. :D
maxbl4
Может дум что-то и предполагал, но вы наверно забыли какое было низкое качество у мышей того времени. Шарик, который постоянно залипал, надо было его чистить и ролики внутри. Спецаильный маленький коврик, иначе шарик не будет нормально кататься…
Короче играть в динамичную игру с мышками того времени было очень сложно. А когда стало выходить больше игр требующих мышь уже и оптические мышки стали появляться и тогда стало удобно
drWhy
По состоянию шарика можно было определить, есть ли на этаже горячая вода. Если нет — слой грязи наростал гораздо быстрее.
ilialin
А мне почему-то так и не зашел DOOM, а вот в Heretic до сих пор периодически поигрываю.
drWhy
Hexen ещё был такой…