IT в «лихие 90е» — из воспоминаний бумера
Окончание института пришлось на 91й год, так что я сразу выпустился из института в новую реальность. Были две халтуры с VAX уже за деньги — одна в небезызвестной фирме Delta Telecom, где я занимался базой данных (сразу PROD, QA у них не было). Так как это был PROD, то мне сказали — осторожно, у нас все клиенты — люди непростые.
У меня был такой телефон в 95, до этого были еще примитивнееОднако вскоре я прибился к фирме Ниеншанц, которая торговала вначале всем, чем можно (тогда были кооперативы, которые могли обучать английскому, продавать брус обрезной и делать аборты). Однако довольно быстро Ниеншанц сконцентрировался на компьютерах и комплектующих к ним. Нас (меня и еще двух парней) взяли делать, грубо говоря, API к базе — некую структуру, которая позволяет «гулять» по таблице произвольных размеров, подгружая нужные части по мере необходимости. Еще нам казалось очень важным обеспечивать пессимистичную блокировку — если кто-то вошел в документ, то никто другой войти не мог бы.
Код писался на Borland C (который ставился с 35 дискет), а наш третий коллега на С++ писал GUI, точнее редактор GUI, который мог сохранять нарисованный интерфейс в файл и потом использовать это в runtime. Система блокировки писалась на Novell — да, мы создавали NLM. Novell 3.1 имел плоскую 32 битную память без виртуальной памяти, и кооперативную многозадачность. То есть, если вы в своей программе забыли вызвать yeild (), то все висло. В качестве сети использовался IPX/SPX, а сеть была по коаксиальному кабелю, который обходил все компьютеры и кончался терминатором. Когда девочки из бухгалтерии начинали переставлять очередной раз свои столы, то кабель отходил, и возникали чудеса.
Первая версия API была написана на VAX и еще работала с его базой данных, VAX RDBMS. Так что спустя многие годы в коде C все еще попадались фрагменты #ifdef VAXVMS. Однако на писишках нам пришлось использовать что попроще. Вначале мы использовали NWSQL — Netware SQL, который использовал базу Btrieve. Однако для использования NWSQL нужно было грузить реквестор — резидентный модуль, который отжирал 200K из драгоценных 640K. Я решил его выкинуть и написать свой SQL который работал непосредственно с Btrieve. Я как сейчас помню модуль bt.c длиной в пару тысяч строк, реализующий узкое подмножество SQL и содержащий такое количество булевых флагов, что я давно отчаялся вспомнить их логику и вводил новые. Тем не менее, модуль верой и правдой проработал до перехода на MS SQL
Dune 1. Прекрасная ChaniНачало работы было очень легким, так как мы делали, говоря современным языком, 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), и ради чего? Файловый сервер был великолепен, но бизнес логику на yeild () писать плохо, дальше 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)
Воспоминания бумера — VAX/VMS