Программирование занимало в моей жизни все больше времени, и его совсем не оставалось на науку. Поэтому, когда заместитель директора по экономике Водоканала предложил мне ставку программиста в кооперативе «Вода», я не раздумывал. Подписал заявление об уходе в вузе, отработал две недели и перешел полностью на работу с Водоканалом.
Следующей задачей, которую мне предстояло решить, стал расчет начислений и печать счетов абонентам Водоканала.
Делалось все вручную. Расчеты выполнялись в больших книгах, «оборотках». Информация о показаниях счетчиков переписывалась из абонентских книжек на страницы книги и умножалась на тариф. В эти же книги разносились оплаты. По итогам месяца рассчитывалось сальдо. Сложности начинались в период выставления счетов. Счета и платежные требования печатались на печатных машинках на готовых бланках, в нужные места которых впечатывались только объемы и суммы. В дни выставления счетов в абонентский отдел было не зайти – машинки строчили, заглушая все вокруг. Готовые счета раскладывались по конвертам и отправлялись абонентам. Хорошо, что в то время еще не было счетов-фактур. Не представляю, как бы сотрудники отдела справлялись с двойной работой.
Первая программа, которую я написал, была не самой эффективной. Она копировала действия сотрудников, распечатывая данные из электронной ведомости в бланки счетов. Время, которое уходило на правильную установку бланка в принтер, было не меньшим, чем печать счета на машинке. И это не считая загубленных криво вставленных бланков!
Пришлось пойти другим путем – печатать счета полностью. Печатались они на рулонной бумаге сплошной лентой и потом разрывались с помощью линейки по местам разреза. Вообще, меня удивляли первые матричные принтеры. Бумага к ним поставлялась исключительно в рулонах, но ни один из принтеров не был оборудован устройством для подачи бумаги. Или их не выпускали производители, или их не поставляли наши поставщики! Народ делал такие устройства сам, обычно они состояли из металлической оси и подставки, на которой ось крутилась.
Но одной печати счетов было недостаточно для счастья абонентского отдела. Как говорится, вкус приходит во время еды. Запросы к программе росли, и решено было написать вторую версию программы «Абонент», уже для самых современных компьютеров IBM 286.
И тут я столкнулся с тем, что чем больше становилась программа, тем больше в ней было ошибок! Сперва я тратил на их устранение немного времени – несколько минут в день. Но, по мере роста программы, время «ремонта» увеличивалось. Через три месяца на поиск ошибок уходили часы. И, наконец, настал такой день, когда я не написал ни строчки нового кода. Весь день я чинил программу, исправлял в ней «баги». И, как вы понимаете, создавал новые.
Со мной работал старший товарищ, Наиль. Он посоветовал мне книжку про структурное программирование зарубежных авторов. Настоящий бестселлер тех времен. Смысл книги сводился к тому, что не нужно из программы делать огромное запутанное «блюдо спагетти». Большую программу следовало разбить на совсем небольшие модули, так, чтобы каждый модуль умещался в экран дисплея. Писать программу предлагалось с самого верхнего модуля, отлаживая каждую из написанных частей до того, как напишется вся программа. Отсутствующие подпрограммы заменялись «затычками» – небольшими программками, просто отвечающими на вызов: «Все в порядке, я работаю». Особое внимание авторы уделили комментариям. В каждом модуле нужно было подробно описать его назначение и прокомментировать каждый блок кода. С того момента, как я прочитал книгу, жизнь моя изменилась. Ошибки покинули мои программы, а отладка стала занимать незначительное время. Количество кода тоже сильно сократилось, так как дублирующиеся фрагменты переехали в специализированные модули.
Наиль оказал мне еще одну неоценимую помощь. Как-то он увидел структуру таблички «Лицевые счета», которую я создавал в базе данных FoxBase. Она выглядела примерно так:
– Слушай, – спросил меня Наиль, – ты что, никогда не слышал о третьей нормальной форме?
– Что еще за форма? Почему третья, что с первой и второй? И почему ты думаешь, что у меня форма ненормальная?
– Представь, что завтра улицу переименуют. Была Абрикосовая, а станет Виноградная. А у тебя на Абрикосовой десять тысяч лицевых счетов. И в каждом нужно будет перебить руками название улицы! Ну ладно, предположим, ты программу напишешь, которая это сделает автоматически. Но ты уверен, что у тебя во всех записях Абрикосовая именно Абрикосовая? А не абриксовая или Обрикосовая? И если потом ты захочешь сделать выборку по улице, сколько лицевых счетов ты потеряешь? То-то же.
И он дал мне почитать переводную статью Уильяма Кента, в которой описывались нормальные формы реляционной базы данных – от первой до пятой. После изучения статьи табличка «Лицевые счета» превратилась в пять таблиц – «Улицы», «Дома», «Квартиры», «Жители» и «Лицевые счета», в которых полностью отсутствовало дублирование информации. Теперь улицу можно было переименовать без последствий для домов и лицевых счетов на ней.
Поэтому, когда я встретил Наиля через 20 лет, я сильно удивился. Человек, который так много знал, и сыграл в моей жизни важную роль учителя и наставника, по-прежнему писал программы на FoxBase! Я в то время уже перешел на 1С, создал свою компанию и автоматизировал множество предприятий на этой платформе.
– 1С? Прошу тебя, не рассказывай мне про 1С! Ненавижу эту систему! Она оставила меня практически без работы! Держусь только благодаря двум-трем старым заказчикам! Хочешь, я покажу тебе, какой классный универсальный документ я написал на FoxBase?
Я промолчал. Хорошо, конечно, оттачивать мастерство, создавая все более совершенные программы на старых языках. Но намного лучше идти в ногу со временем, изучая современные платформы. И я еще раз порадовался тому, что платформа 1С не стоит на месте, развивается, седьмая версия, восьмая, веб-сервисы, мобильные приложения, система взаимодействия, работа с большими данными… В каждом релизе появляется что-то новое, и таких релизов выходит несколько в год.
Но вернемся к нашей программе «Абоненты». Создавалась она очень постепенно, в течение нескольких лет. Сперва я написал совсем небольшую основу. В базовую программу можно было ввести данные об абонентах, объектах водопотребления, часовые нагрузки, данные приборов учета и произвести расчет начислений. Выставить счета. Ввести оплаты. И получить отчеты о реализации и дебиторской задолженности.
Дальше работа по развитию программы происходила таким образом. Каждый месяц, после выставления счетов абонентам, ко мне приходила начальница отдела сбыта и говорила примерно так:
– У нас никогда не было такой прекрасной программы. Она умеет все! Считает и быстро, и правильно. Правда, в ней не хватает одной небольшой штучки…
– Какой еще штучки?
– Да ерунды, мелочи. Мы забыли с тобой, что водопотребление лимитировано. Нужно следить, чтобы абоненты не потребляли ресурсы сверх установленных лимитов. А кто балуется, с тех брать за сверхлимит по пятикратному тарифу.
Я понимал, что все серьезно, и, хотя, они могли внести этот сверхлимит вручную в любой счет, садился и дописывал программу.
Так в программе постепенно появились:
То есть программа создавалась, сама того не ведая, по модной сегодня идеологии Agile. Причем, я подозреваю, начальница отдела сбыта «скармливала» мне новые пожелания очень постепенно. Так, чтобы я мог переварить их в период между выставлениями. Вела, скажем так, свой тайный бэклог (список требований). Получался такой спринт длинной в месяц, после которого выходил новый релиз. И релиз этот был вполне рабочий, и внедрялся без проблем.
Ну и, конечно, я не могу не упомянуть тут интерфейс «Абонентов». Он был сделан по образцу программы, которую в то время использовал каждый пользователь Искры-1030, а позднее IBM PC 286, 386 и 486. Это, конечно же, Нортон Коммандер! Как и в прототипе, в «Абонентах» было два экрана. На одном список абонентов, на другом список объектов выбранного абонента. Или на первом карточка абонента, на втором оборотная ведомость со счетами и платежами. И кнопки F2, F3… F10, нажимая на которые можно было открыть нужный объект абонента, счет или платежку. Подсказка по F1, конечно. И никакой мышки, только кнопка Tab для перемещения между полями ввода.
Но все хорошее, когда-нибудь, да и кончается. Через пару лет наступил такой день, когда я вынужден был уйти из Водоканала и сопровождение программы передали другому программисту. Иван много лет развивал программу. Мы с ним часто встречались по работе, и каждый раз он благодарил меня за три вещи: правильную структуру данных, продуманную модульную архитектуру кода и комментарии. За 15 лет, что прожила программа, он внес в нее множество улучшений, и ни одно из них не сломало систему.