Серия «Франчайзи на грани нервного срыва»

15

Как запустить новую программу на заводе за 10 дней

Дело было в 2010 году. В октябре месяце к нам в компанию позвонил ИТ-директор другого завода и пригласил в гости. Пообщаться на тему внедрения 1С. Я тут же сел в машину и поехал, всего-то 200 километров до заказчика. «Десяточка» моя пролетела их за два часа.

Когда я вошел в кабинет начальника АСУ, и мы проговорили буквально 10 минут, я понял, что Василий Иванович – наш человек. Специалист с большим опытом автоматизации, который всю свою жизнь проработал на заводе. Знает и его боль, и всех своих пользователей как облупленных. Решает поставленные задачи теми средствами, которые ему доступны. И весьма неплохо справляется, несмотря на ограничения бюджета. В общении с такими людьми у меня возникает ощущение, что мы понимаем друг друга с полуслова, и сразу устанавливается доверие.

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

Ну, надо – так надо. Я попросил посмотреть структуру завода. Василий Иванович посетовал, что она часто меняется и действующий вариант никто не знает. Точно известно только одно, что реальная структура не совпадает с официально утвержденной. Но после пары звонков он все же распечатал мне огромную портянку формата A1.

На ней мы тут же ограничили организационные рамки проекта, обведя те отделы, которые будем автоматизировать, шариковой ручкой. Думаю, поработать ручкой над структурой предприятия – самое первое и простое, но самое важное действие, которое надо произвести при обследовании. Одним росчерком пера вы выявите основных стейкхолдеров – это руководители помеченных подразделений. И отсечете от проекта тех, кто появится со своими требованиями позже. В список автоматизируемых отделов, кроме бухгалтерии, попали финотдел, служба реализации, отдел снабжения и склады.

После этого я попросил принести положения об отделах, попавших в периметр автоматизации. На мое счастье, они нашлись в одном из шкафов в отделе труда и заработной платы. Пыльные немножко и пожелтевшие. Поэтому никто не гарантировал их актуальности. Но, зная, какой консервативной структурой является завод, я был уверен, что все основные функции в них отражены. Мы с Василием Ивановичем сели и за полчаса отметили те функции, которые нужно автоматизировать. Так мы разобрались с функциональными требованиями.

И, наконец, я взялся за штатное расписание по нужным отделам. Попросил вариант с фамилиями, и мне его, конечно же, дали. Но только посмотреть. Пришлось переписывать реальное количество работающих по отделам прямо в структуру завода. Нужно же было как-то узнать, сколько лицензий 1С поставить.

После этого мы с Василием Ивановичем решили, что «1C:Управление производственным предприятием» им вполне подойдет, так как следующим этапом предусматривалась автоматизация производственного планирования и учета.

Покончив с обследованием за пару часов, я уехал с завода. На следующий день Василий Иванович прислал мне свое техническое задание на автоматизацию на трех страничках. В нем был перечень отчетных форм, которые нужно получать из системы. Очень полезное дополнение к тем документам, что я привез с завода.

Почему нам удалось так быстро сформулировать требования, и мы обошлись без интервью со всеми стейкхолдерами? Не только потому, что и я, и Василий Иванович были специалистами с опытом автоматизации заводов, и использовали легко доступные документы. Но и по той простой причине, что автоматизируемая область – бухгалтерский и складской учет – в России почти полностью регламентированы. И возможностей типового решения вполне достаточно для удовлетворения почти всех требований. А перечень выходных форм снимал большинство оставшихся рисков.

Коммерческое предложение и договор были готовы за три дня. Ну а дальше началось то, что всегда происходит в серьезных конторах. Согласование проекта со стейкхолдерами. Не прошло и двух месяцев (друзья, согласитесь, в нашей предпроектной жизни – это просто миг), как мы уже подписали договор. Естественно, в редакции, подготовленной еще в октябре, и только слегка скорректированной под реалии декабря. С остановкой старых программ 31 декабря и запуском всей системы с 1 января.

Когда я собрал проектную команду и показал им подписанный договор, установилась тишина.

– Как вы вообще это представляете? – спросил меня руководитель проекта Азат. – Контрольный пример не проведен, пользователи не обучены, остатков нет. Ну, остановим мы старую программу. А новая-то как заработает?

– Давай вместе подумаем. Представим нашу будущую систему в динамике, начиная прямо с 1 января. Точнее, с 10 января. Какие документы нам понадобятся в первую очередь?

– Так. Отгрузка продукции должна происходить. И оприходование материалов. Банк и касса должны обрабатываться.

– Правильно. Это человек 10–20 складских работников, бухгалтеров и финансистов. И четыре-пять видов документов. Стандартных, которые всем подходят. Если мы сделаем инструкции и попросим пользователей выйти на работу не десятого января, а, скажем, восьмого, успеем мы их обучить? Успеем. А еще мы организуем техподдержку на месте прямо с 10 января, и они смогут получить ответ на любой вопрос сразу.

– Но у них должны быть реальные остатки, иначе как они отгрузят продукцию?

– Согласен, значит, надо остатки перенести из старой системы в новогодние каникулы. Успеем?

– Успеем, только они декабрь будут закрывать до 20 января. Остатки съедут. Раньше двадцатого переносить нельзя.

– Можно, если переносить их два раза. Поэтому программу переноса нужно написать правильную. Такую, что прежде чем что-то перенести повторно, она поищет это в новой системе, исправит и допишет, но ничего не удалит.

– Ну ладно. Оперативный учет с грехом пополам мы запустим. А что делать с бухгалтерским? Мы в январе точно не автоматизируем всю бухгалтерию. А им в начале февраля сдавать отчетность за месяц.

– Не переживай. Я поговорю с главным бухгалтером.

И я поговорил. Специально для этого съездил на завод.

– Знаете, Анна Петровна, должен вас предупредить – мы не сможем сделать вам полноценный отчет за январь в новой системе.

– Ладно, я получу его из старой.

– Не получите. Мы остановим ее 31 декабря на ввод новых данных. Иначе мы не сможем запустить новую систему с 1 января. Народ просто не будет работать с новой системой, если все, что он делал раньше, он сможет делать в старой. Я уже договорился с Василием Ивановичем. Он перепишет код в старой программе и запретит ввод документов с датой старше 31 декабря. Помните, как Александр Македонский сжег корабли, когда его войско высадилось в Персии? Он не оставил своим бойцам другого шанса, кроме как разбить врага на его территории. Так и мы – сожжем мосты. То есть корабли. То есть старую программу.

– Вы что, думаете, что отчетность завода в контролирующие органы – это шутка? Как, по-вашему, я ее должна сделать и сдать?

– Не знаю даже, что сказать. Ситуация, и правда, необычная. У вас будут данные по отгрузке, приходу материалов, банку и кассе. НДС в отгрузке и к зачету тоже посчитаем. Это все.

– Понятно. Ладно, придумаем что-то, используем доступные данные и статистику за прошлые периоды. Да, придется сделать корректировки позже. Ну ладно, все равно мы их делаем регулярно. В этот раз объясним, что внедрялась новая система, и в ней произошел сбой. Но когда я смогу получить реальную отчетность?

– Вы получите ее в середине апреля. Сразу за весь первый квартал.

Анна Петровна кивнула. Я понял, что она приняла предложенную технологию внедрения. Когда из-за сжатых сроков заказчик идет на отказ от этапа опытной эксплуатации. И сразу запускает систему в промышленную. Осознавая все связанные с этим риски ошибок и неверной отчетности.

И мы начали. Всей команде проекта пришлось активно поработать три дня до нового года и все новогодние каникулы. За это время был составлен и выполнен план быстрого запуска, включающий в себя следующие задачи:

• выявление пользователей, работу которых нельзя остановить;

• выявление справочников, документов и отчетов, которые они будут использовать;

• написание кратких технологических инструкций по работе с нужными объектами;

• обучение задействованных в запуске пользователей;

• программирование обработок по переносу данных;

• перенос и сверку перенесенных данных;

• создание службы техподдержки и системы обращения в нее прямо из программы.

10 января 2011 года завод работал уже как обычно. Но в новой программе. Это был самый быстрый запуск УПП в промышленную эксплуатацию в моей жизни.

История из моей книжки "Франчайзи на грани нервного срыва". Еще больше историй в одноименной серии, подписывайтесь

Показать полностью
44

Как мы писали свою первую программу на 1С

Лето 2001-го года. Кончилась эпоха Foxpro, и мы "занялись 1С".

Надо было как-то продавать программу, и я снова вспомнил про свой надежный маркетинговый инструмент – 100 писем счастья. Мы сели и написали такие письма в 100 адресов, разослав всем бесплатный буклет «Как самому просто и быстро автоматизировать бухучет». Буклет этот я сочинил за два вечера, предварительно прочитав книжку «Как продавать услуги» (автора я не помню). Хорошая была книжка, мудрая, хоть и небольшая. Первое правило, с которого она начиналась, гласило: «Услуги, которые оказаны, уже никому не нужны. Берите предоплату». Там же рекомендовалось написать книгу, которая бы подтверждала вашу компетентность. Этому совету я и последовал.

И организации откликнулись на письмо! И откликнулись правильно – пригласили нас автоматизировать бухучет. То есть бесплатный буклет с названием «сделай сам» говорил совсем не то, что сделать самому – просто. Наоборот, он показывал на примерах, что автоматизация бухучета – сложный многоэтапный процесс, и от того, насколько правильно организовано внедрение, и зависит успех проекта. Буклет выполнил свою главную задачу – он показал нас специалистами, которые «глубоко в теме» и знают, как быстро и качественно автоматизировать бухгалтерию.

Первым в списке откликнувшихся был дизайнерский колледж. Его главный бухгалтер пригласила меня на переговоры. Она долго и подозрительно рассматривала меня и сказала примерно следующее: «Как вы автоматизируете колледж, ведь типовая программа 1С не предназначена для бюджетного плана счетов, и в ней нет бюджетных журналов-ордеров?». На что я, не задумываясь, ответил: «Обследуем ваш документооборот, нарисуем модели бизнес-процессов, опишем ваши проводки, согласуем интерфейсы и перепишем программу». То есть я продавал ей в одном флаконе обследование, технический проект и уникальную программу. «Ну ладно, – сказала главбух, – я уверена, что вы знаете, что делаете. У меня есть бюджет на автоматизацию – 14 тысяч рублей. Уложитесь?». Нам очень был нужен первый заказчик на внедрение 1С, и я ответил «Да». И мы подписали первый договор на поставку и внедрение программы «1С:Бухгалтерия». Из этих денег на услуги было заложено 9 тысяч рублей.

Представляете ситуацию? Мы подписываем договор на уникальную разработку программы на языке 1С, вообще не зная языка 1С. Между прочим, договор со сроками – 4 месяца «на все про все». Когда я рассказал своим сотрудникам, какие мы взяли на себя обязательства, народ слегка напрягся. И только консультант Миша меня поддержал: «Нормально, заодно язык выучим, а то совсем стыдно – партнер фирмы 1С не знает языка 1С».

Мы поделили между собой работу, провели обследование, разработали информационную и функциональную модели, а также создали с помощью конфигуратора 1С нужные сущности – бюджетный план счетов, справочники и документы. То есть формы справочников и документов. Теперь нужно было вдохнуть в них жизнь – написать модули форм и модули проведения.

А времени оставалось уже совсем мало. И я, глядя, что мои программисты, бывшие консультанты, не успевают, решил подбодрить их своим примером. «Спорим, – сказал я, – что можно писать по 8 объектов 1С за день?! По одному в час?». «Это невозможно». Я сел за компьютер. В этот момент я вспомнил, как начинал программировать в институте, и мне пришлось освоить «Бейсик» за ночь. Поэтому и 8 объектов конфигурации 1С за рабочий день (а не ночь!) не показались мне такой уж великой проблемой. К вечеру все работало. Кстати, код был не самым совершенным, хотя и вполне рабочим, и Миша потом его переписал. Но свою задачу ‑ «подбодрить» ‑ код выполнил.

И мы сделали и сдали весь проект в срок. Так как программа была неплохо спроектирована и точно укладывалась в требования заказчика, внедрение прошло на ура. И мы получили свои небольшие деньги, которые, конечно, не сделали нас богатыми. Но этот проект дал нам намного больше. Новые знания, возможность ссылаться на довольного заказчика. И самое главное – ощущение успеха, и, как следствие, уверенность в собственных силах.

Поэтому сейчас, когда я слышу от некоторых коллег «Я не знаю эту конфигурацию, не ставьте меня на проект, я не справлюсь, я не буду эффективным», я только улыбаюсь. Конфигурацию он не знает! Ты попробуй фигачить по 8 объектов в день, когда ты языка не знаешь!

Постепенно, опираясь на этот успех, мы и нашли свою первую нишу на рынке 1С в нашем городе – написание уникальных программ по проектной технологии. Обследование, разработка техпроекта, разработка конфигурации, разработка инструкций, обучение, внедрение. После колледжа были замечательные проекты, в каждом из которых был разработан уникальный код – автоматизация тепловозоремонтного завода и автоматизация автодорожного предприятия. Подход с проектированием и уникальной разработкой работал, заказчики наши были довольны, о чем говорили повторные проекты на этих предприятиях.

Почему нам удалось найти свою первую нишу на устоявшемся рынке, где действовали популярные компании, которые пришли на него намного раньше? Дело в том, что в те времена рынок не был так наводнен типовыми программами. А те, что продавались, были не такими крутыми как сейчас и не отражали большинства потребностей заказчиков. Поэтому, рассказывая потенциальным клиентам о том, что они получат уникальную программу, которая будет учитывать все их потребности, мы легко находили новых заказчиков.

Хорошее было время.

Еще больше рассказов в моей книге "Франчайзи на грани нервного срыва", кое-что из которой в одноименной серии здесь. Подписывайтесь и читайте.

Показать полностью
116

Остановите программиста, а то он все автоматизирует, и мы будем не нужны!

Остановите программиста, а то он все автоматизирует, и мы будем не нужны!

Уволившись из Большого предприятия, я искал работу совсем недолго. Неделю, может быть, две. Кто-то из друзей рассказал мне, что Сотовая связь ищет сотрудников. Я распечатал резюме и отправился на собеседование.

В тот же день меня приняли начальником расчетного отдела, в задачи которого входили выставление счетов абонентам и учет оплат. Вообще-то, я хотел там работать в должности программиста. Сотовая связь тогда только появилась, контора делала хорошие деньги на модной услуге и предлагала очень заманчивую зарплату программисту. Но когда директор ознакомился с моим резюме, он сказал, что готов сделать мне оффер1 поинтереснее. Так я стал начальником только что созданного отдела в 5 человек. И мне выдали первый сотовый телефон – «Бенефон дельта», который был не только размером с кирпич, но и такой же прочный. Когда директор на новогоднем корпоративе с размаху кинул свой «Бенефон» на пол, только половица треснула, а телефон даже не поцарапался.

В функции моего отдела входили прием файлов с записями о звонках, расчет начислений, массовое выставление счетов, учет оплат и подготовка приказов на отключения должников. Да, не поверите, в те времена, чтобы отключить должника, Сотовая связь готовила приказ, примерно c неделю, и еще пару дней коммутатор вручную отрабатывал весь список. Клиентов было примерно 800, рост абонентской базы существенно превышал ее сокращение, и компания могла себе позволить такую вальяжность.

Вся сотовая связь помещалась на 5-м этаже телефонной станции. В то время коммутаторы уже начали уменьшаться в габаритах, и городской оператор стационарной связи сдал освободившийся этаж «младшему брату». Никто тогда и предположить не мог, что пройдет 25 лет, и от домашних стационарных телефонов совсем ничего не останется. Но, наверное, «старший брат» уже тогда чуял угрозу, иначе непонятно, зачем он запретил абонентам и сотрудникам сотовой связи пользоваться грузовым лифтом. 5-й этаж телефонной станции – это не 5-й этаж дома. А примерно 9-й или 10-й, так как этажи там были по 6 метров высотой – 4 пролета лестницы на этаж. Но абоненты терпели, топали потихоньку наверх в своих малиновых пиджаках. Выбора-то не было тогда, Сотовая была единственная в городе. А сотрудники и вовсе не обращали на это внимания – главное, что зарплата стабильная, в период взаимных неплатежей это было очень ценно.

На своей должности я быстро освоился, организовал работу, написал инструкции каждому сотруднику и стал думать, чем бы еще заняться. Времени свободного была куча, программа биллинговая была написана на FoxBase, который я хорошо знал, коды программы были открытые, и у меня чесались руки все улучшить. Однако уже тогда я понимал, что автоматизация – вещь неоднозначная. Грамотно проведенная автоматизация всегда ведет к сокращению трудоемкости операций. И, как следствие, к сокращению рабочего времени сотрудников. А в предельном случае – к сокращению самих сотрудников. Тем временем, число сотрудников отдела потихоньку росло. Их стало уже семеро, при этом количество абонентов подходило к 2 000. И темпы прироста абонентов только увеличивались. Это значило, что в новом здании, которая строила Сотовая связь, разросшийся расчетный отдел мог претендовать на приличные площади, а его начальник ‑ на большой кабинет.

И тут мне в руки попалась книжка «Законы Паркинсона». Сирил Норткот Паркинсон заметил, что общее количество занятых в бюрократии росло на 5–7 % в год безотносительно к каким-либо изменениям в объеме требуемой работы, так как чиновники стремились увеличивать количество подчиненных и создавали работу друг для друга. Я тогда здорово посмеялся, в том числе над собой, плюнул на мысли о собственном статусе и, закатав рукава, занялся тем, что мне всегда очень нравилось – повышением производительности труда с помощью автоматизации.

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

Но это не была просто попытка поддержать утомленных коллег. Я начал действовать. Прежде всего, я провел замер трудоемкости всех основных операций, которые выполняли мои подчиненные. Получилось, что самое большое время у них уходило на три операции:

• Закачка файлов со звонками с коммутатора в биллинговую систему;

• Печать и подписание счетов и платежных требований;

• Разноска оплат из банковских выписок в лицевые счета абонентов, особенно в первые три дня после выставления счетов.

Первое, чем я занялся, – это закачка файлов с коммутатора. Коммутатор выдавал нам файлы, которые содержали в себе кучу постороннего мусора. Происходило это потому, что у владельцев Сотовой связи хватило денег на коммутатор и часть программ для него. Но среди этих программ не было той, что выдавала файлы со звонками в правильном формате, на ней сэкономили. Поэтому звонки выковыривали в полуручном режиме из каких-то логов. Мой боец Миша, получал очередной файл с коммутатора, загонял его в редактор и вручную вырезал из него весь мусор. Потом присваивал файлу номер, регистрировал в журнале и запускал закачку файла в систему. Если мусор был удален правильно, система съедала файл и удовлетворенно крякала «Ок». Если мусор оставался или с мусором были удалены и нужные потроха, программа давилась и ругалась «Error».

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

Вторая задача была посложнее. Выставление и подписание счетов и платежных требований. Происходило все так. Система последовательно печатала все сформированные счета, потом все платежные требования для банков, потом счета-фактуры и, наконец, детализированные счета со звонками для тех, кому они были нужны каждый месяц. Директор сперва сам подписывал все счета и платежки, но ему это очень быстро надоело, и он написал доверенность на меня. До прихода в Сотовую связь в моей подписи было 6 букв и красивый замысловатый хвостик. После двух месяцев подписания счетов в подписи осталось две буквы, хвостик же выпрямился и грозился отвалиться совсем. Я уже даже подумывал о переходе на одну букву, но боялся, что тогда моя подпись сольется с директорской, так как он после года работы подписывался одной буквой своего имени – «В». Но подпись – это еще не все. На подписанные документы надо было поставить печать. А также все разложить по комплектам. Каждому абоненту полагались счет, счет-фактура, а некоторым ‑ еще платежное требование и детализированный счет. Документы для комплектов собирались из трех куч. Готовые комплекты раскладывались по реестрам. Реестров было три – «в банк», «доставка курьером» и «на руки в офисе». Уфф. Семь человек печатали, сортировали, подписывали и раскладывали горы бумаг. До сих пор по ночам снится это выставление, давайте уже автоматизируем его поскорее!

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

После автоматизации система работала так. Прежде всего, реестры стали формироваться в самой программе. В каждом реестре документы также автоматически выстраивались в комплекты. Бланки для печати документов готовились заранее. Бумага прогонялась через факсимильный аппарат, который ставил на листы подписи и печати в нужных местах. Готовые бланки заправлялись в три лотка принтера – по лотку для банковских требований, счетов и счетов-фактур. Программа, в зависимости от содержания комплекта, всасывала бланк из нужного лотка и печатала требуемый документ. В итоге в выходном лотке принтера получался готовый реестр документов, в котором все документы были разложены по комплектам, а комплекты шли в нужном порядке. Все, что оставалось сделать сотрудникам отдела – скрепить их, используя мощные автоматические степлеры. Выставление, которое занимало раньше 3 – 4 дня, теперь выполнялось за 4 часа. После чего можно было пить чай до самого вечера.

Тут уже некоторые сотрудники стали подозревать, что про одну большую кнопку-то я не шутил. И Анна Ивановна, которая любила подкормить меня пирожками из дома, очень в своеобразной манере провела со мной беседу. Суть ее сводилась к тому, что огромное спасибо, конечно, некоторым, которые так заботятся о сотрудниках, что теперь можно в выходные дома сидеть. И ничего, что зарплата стала меньше. Зато работа стала легче, и если так и дальше пойдет, то такую легкую работу кому-то из нас придется поискать.

Но меня уже было не остановить! После такого успеха в меня просто вселился зуд автоматизации. Однако с банковской выпиской уровень сложности был еще выше. Тут уже точно нельзя было обойтись только написанием программы и покупкой оборудования. Пришлось идти в банк. И там договариваться о том, чтобы они присылали банковскую выписку не в виде распечатки, а в виде файла. Сделать это удалось с большим трудом, спасибо шефу, который намекнул банкирам, что есть в нашем городе и другие, более сговорчивые банки. Программа тоже получилась непростой. Да, абонента можно было легко идентифицировать по расчетному счету. Но назначение платежа пришлось расшифровывать с использованием алгоритмов синтаксического анализа. Такое умудрялись писать абоненты и банковские операторы в назначение платежа, что уму непостижимо. «За трубу» – и это не про сантехнику. Но постепенно мы довели степень распознавания оплат до 95–98 %, что позволяло выполнить всю разноску банка за полчаса, включая ручной анализ нераспознанных платежей. И это вместо обычных 2 – 3 дней при пиковой нагрузке.

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

– Спасибо.

– За что?

– За расчетный отдел.

Четыре года я проработал в Сотовой и ушел, чтобы снова заняться бизнесом. Как я узнал через несколько месяцев после ухода, отдел сократили до 4-х человек и слили с бухгалтерией. Количество обслуживаемых абонентов к тому времени было 8 000 – в 10 раз больше, чем в то время, когда я начал работать в компании. Уменьшившийся в два раза отдел по-прежнему справлялся со своей работой.

Я вспоминаю эту историю всю свою жизнь. Для меня она ‑ источник полезных выводов.

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

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

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

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

Рассказ из моей книжки "Франчайзи на грани нервного срыва". Подписывайтесь, продолжение следует

Показать полностью 1
51

Как программисту переносить данные идеальному заказчику

Наверное, он не просто так попал на эту должность – руководителя огромной оптовой базы снабжения, которую мы взялись автоматизировать в самом начале 90-х. База занималась снабжением предприятий республики дефицитными товарами, в том числе автомобилями. Представляю, какой конкурс был на это место тогда. И человек, который его занял, обладал особыми качествами.

Мы должны были автоматизировать расчеты с покупателями. Иван Иванович попросил меня собрать всю нашу команду. Семь человек вошли в кабинет и расселись вокруг огромного стола, во главе которого сидел седой и высокий мужчина. Справа от него разместились главный бухгалтер и финансовый директор.

– Друзья, – обратился он к нам, – у нас проблемы. Мы работаем с тысячами предприятий по всей Республике. Как правило, это надежные партнеры. Но вы же знаете, везде работают люди. Они постоянно теряют документы и забывают о сроках. Иногда они забывают заплатить. И если у нас нет надежных сведений о дебиторской задолженности, мы можем продолжать отгрузку товаров таким забывчивым клиентам. Но это еще не все. Намного хуже, если мы откажем в отгрузке надежному партнеру только потому, что мой бухгалтер не вовремя разнес банк в бумажную оборотку. Я уверен, что программа, которую вы внедрите, позволит нам иметь реальную картину дебиторской задолженности. И мы существенно улучшим и наше финансовое положение, и наши отношения с клиентами. Если у вас возникнут какие-то проблемы, то обращайтесь прямо ко мне. Мы все решим. А теперь идите и сделайте это!

После этой речи и мы, и сотрудники предприятия почувствовали, насколько важен наш проект первому лицу предприятия. И мы очень старались. А когда программа была почти полностью внедрена, произошел неприятный сбой. Тогда он вызвал меня в свой кабинет. На этот раз мы были одни.

– Послушай, – начал Иван Иванович. – Тут у меня такая проблема. Мы остановили отгрузку реагента на химзавод. И у них встало производство. Мне позвонил директор завода. Я запустил твою программу и сказал, сколько он должен. И потерял лицо. У них не только нет долга, у них аванс. Мой бухгалтер позже мне все подтвердила. Что будем с этим делать?

– Я разберусь, у нас должно быть все нормально.

– Послушай меня. Ты пришел и назвал свою цену на программу. Я с тобой не торговался, верно? Я только объяснил, насколько нам важен этот проект.

– Верно.

– Сказал ли я тебе, что помогу, если в этом будет необходимость?

– Да, было такое.

– Может быть, я вмешивался в процесс, стоял у тебя над душой, проверял, что именно ты делаешь, как пишешь свою программу?

– Да нет, что вы. Мы работали так, как считали нужным.

– Так какого черта ты заставляешь меня краснеть перед клиентами и друзьями?

Тут мне стало так стыдно, что покраснел я. Сказать было нечего.

Позже мы разобрались в ситуации. Оказалось, что дело не в программе. Дело в остатках, которые в нее ввела бухгалтер из бумажных карточек. Перепутала карточки, из-за чего на клиенте повис чужой долг.

А Ивана Ивановича я запомнил как заказчика, который умел и вдохновлять, и доверять, и строго спрашивать за результат. Не вмешиваясь при этом в процесс. Кстати, он потом далеко пошел. Стал заместителем председателя правительства Республики. Вдохновитель. Думаю, это слово больше всего подходит к человеку, о котором я рассказал.

После этого случая я понял, что процесс переноса исторических данных критически важен для успешного запуска новой системы. Теперь, чтобы не краснеть за результаты, мы следуем простым правилам:

• Готовим приказ о переносе данных. Определяем ответственных со стороны заказчика за представление исторических данных и за сверку результатов переноса. Учитываем, что процесс переноса будет итерационным, поэтому указываем в приказе относительные сроки, а не абсолютные даты.

• Жестко фиксируем те данные, которые нам передали для переноса. Делаем архивную копию на компакт-диск, запечатываем в конверт, подписываем его у ответственного со стороны заказчика и кладем в сейф. Если нас обвиняют в том, что в новой системе неверные остатки, мы можем сверить текущие остатки с теми, что в сейфе. Конечно же, мы фиксируем и дату передачи. Часто заказчик передает данные несколько раз, так как находит в них ошибки. Фиксация дат позволяет исключить обвинения в срыве сроков.

• Разрабатываем методику сверки данных в старой и новой системе. Определяем те отчеты, которые будут показывать расхождения. Если таких отчетов нет, разрабатываем их. На сверку тратится огромное количество времени. Вдумчивый подход к процедуре позволяет его экономить.

• Фиксируем документально, что сверка завершена и ее результаты устраивают заказчика. Пишем протокол совещания или получаем подпись ответственного на копии отчета по сверке перенесенных данных.

Самое главное – помним, что только заказчик отвечает за данные, как в старой, так и в новой системе.

Показать полностью
37

Как автоматизировать завод и не уснуть за рулем

Ламповый завод или «Лампочка», как его ласково называли рабочие, находился в промышленной зоне – у черта на рогах на севере города. Мы с женой снимали квартиру в центре. И мне приходилось вставать в 6 утра, чтобы отвезти сына в школу, находившуюся в самом южном районе, и успеть на завод к 8 утра, к началу первой смены. По этой синусоиде я катался изо дня в день около года, как-то даже уснул за рулем и проснулся за 5 сантиметрах от бампера грузовика, тормозящего на светофоре.

«Аванта» – молодая, только что созданная фирма, бывший вычислительный центр Водоканала, отправленный в свободное плавание. Семь человек. Быстренько создать ТОО пришлось после того, как на уровне города было признано, что увлечение муниципальных предприятий малыми предприятиями является «перегибом на местах». После чего директор кооператива «Вода» вызвал меня к себе, рассказал, что отдел сбыта Водоканала возвращается из кооператива снова в Водоканал. А что делать с вычислительным центром, он не знает, так как ставка зама по экономике в Водоканале есть, а ставок для программистов – нет.

Было самое начало 90-х годов. Я считаю это время рассветом

ИТ-отрасли страны, работы было много, заказы шли сами собой, работало сарафанное радио. ТОО наше потихоньку набирало силу, и вот – заключило договор на автоматизацию завода. Наш самый большой договор. На заводе предстояло автоматизировать три службы – бухгалтерию, отдел сбыта и финотдел.

Эти три службы не очень дружили. Руководители служб ругались на оперативках. Давали настолько разную отчетность за месяц, что директор, когда подписывал договор, сжал мою руку, посмотрел мне прямо в глаза и сказал:

– Послушай. Они дают мне разные цифры. Не совпадает ничего. Ни склад, ни отгрузка, ни дебиторка. Каждый считает, что только его цифры правильные. Я не понимаю, что у меня происходит на самом деле. Я не знаю, кому верить. Ты должен с этим что-то сделать!

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

У нас не было готовой типовой программы для этих подразделений. Тогда с типовыми программами было туго. Даже если бы такая программа появилась, мы запросто могли о ней и не узнать. Интернета не было, а давать рекламу в газетах, радио и на телевидении было не по карману молодым ИТ-компаниям. Поэтому программу для завода нам предстояло написать с нуля.

Первое, что мы сделали – провели обследование этих трех отделов. Результаты зарисовали в виде схем, на которых изобразили основные функции отделов и используемые документы. А также нарисовали стрелочками связи между данными и функциями сотрудников. Собрали образцы всех документов. Тогда еще не были так популярны современные средства формализации требований — разработка моделей «как есть» и «как будет» в case-системах и написание пользовательских историй (use-case). Мы действовали исходя из простого предположения, что раз мы разрабатываем информационную систему, нам нужно знать все о том, кто и какую информацию обрабатывает, и как именно. А рисунки и образцы документов позволяли получить компактное описание системы.

После чего мы занялись проектированием программы. Разработали структуры всех таблиц. При этом исключили дублирование информации. Если финотдел и отдел сбыта использовали для регистрации оплат разные таблицы в разных программах, у нас это была единая табличка для всех служб. За основу мы взяли систему бухгалтерского учета. Идея все построить на операциях и остатках мне очень нравилась, так как принцип двойной записи, применяемый в бухгалтерии, обеспечивал высокую надежность системы.

«Засада» началась, когда мы приступили к программированию. В этих трех отделах на заводе работало человек 50, каждый рассказал о том, что он делает, и нам надо было написать громадную кучу кода. Товарные и железнодорожные накладные, партионный учет на складе, отгрузка посылками и в контейнерах, учет векселей и других ценных бумаг… Система получалась огромной. А программировать на FoxBase – это вам не в 1С объекты создавать! Каждый справочник, документ и отчет надо было писать как уникальный, вручную. Проработав месяц почти каждый день до глубокой ночи, я задумался. Последнее, что меня окончательно убедило, что мы что-то не то делаем, был случай в январскую ночь. Я приехал на завод в 8 утра, а уезжал в 2 ночи. С утра шел снег, и я с трудом нашел свою машину на стоянке возле завода. Откопал ее. Завел мотор и тут же, через 30 метров, застрял на трамвайных путях, которые просто были не видны под снегом! Мне крупно повезло, что пути ночью чистил специальный трамвай-снегоочиститель. Мужик в кабине поржал немного, увидев мою пятерку на рельсах, прицепил трос и вытащил меня на переезд, откуда я смог выкатиться на шоссе.

Как автоматизировать завод и не уснуть за рулем

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

И тогда я сделал то, что у меня всегда получалось лучше всего – я автоматизировал нашу работу. Создал универсальный интерфейс, универсальный справочник, универсальный документ и универсальный отчет. Все эти вещи управлялись простым заданием параметров – как правило, указанием таблиц, с которыми работали программы, и их реквизитов. Теперь все программирование заключалось в правильной настройке универсальных объектов, все остальное – расположение реквизитов на экранах, их ввод, редактирование и прокрутку, – программа делала сама. И дело пошло куда веселее. Производительность труда выросла в несколько раз! У сотрудников моих начали потихоньку рассасываться круги под глазами, и в них снова зажглась надежда.

Но деньги все же кончились раньше, чем кодирование. Хорошо, что нам к тому времени было, что показать, и директор завода, хоть и с ворчанием, но подписал дополнительное соглашение. Хороший был руководитель, приходил несколько раз к нам вечером после окончания рабочего дня, наблюдал, как мы работаем. Понимал, что деньги тратятся не впустую. Мы потом еще много раз сотрудничали с ним. Как-то он даже приглашал меня на должность начальника АСУ завода. Но я тогда работал в Сотовой связи и отказался.

И вот настал счастливый день запуска системы в промышленную эксплуатацию. Бухгалтерия и финотдел взлетели сразу. Бухгалтерия вообще нарадоваться не могла после бумажных журналов-ордеров. У них сразу же исчезла необходимость «сводить» разные счета. Единственное, что их беспокоило – как поделить оставшиеся обязанности. Неожиданно у бухгалтера Светы, которая вела 60-й счет (взаиморасчеты с поставщиками), почти не стало работы. Материалы по документам приходовали бухгалтера материального стола, а оплаты – бухгалтер, разносивший банковскую выписку. Так как вся необходимая информация вводилась на других участках, учет с поставщиками получался автоматически. Бухгалтеру 60-го счета оставалось только готовить акты сверки. Проблему нагрузки решили, передав Свете учет по какому-то из неавтоматизированных счетов. Потому что переделывать программу так, как она хотела (разбивая приходный документ на два – для нее и для материалистов), мы отказались.

Но с отделом сбыта получился эпический фейл. Выяснилось, что им совсем не подходит разработанный нами «универсальный интерфейс», и они отказываются с ним работать! Потому что в предыдущей программе «все было на одном экране и было удобно, а так нам приходится три экрана открывать, чтобы все увидеть». Что было с ними делать? Мы долго пытались их уговорить, убедить, что дело только в привычке. Что три экрана – это даже удобнее, меньше информации на каждом. Но ничего не помогло. Даже отказ переделывать интерфейс. Начальник отдела отправилась к директору. Так как ее цифры по отгрузке нравились ему больше всего, ее влияние на директора было значительным. И к нам поступило жесткое распоряжение – «сделать все так, как будет удобно отделу сбыта». Аргументы, что в бухгалтерии все то же самое, но людям нравится, не помогли. И мы, чертыхаясь, переписали для отдела весь интерфейс, потратив еще неделю.

Тогда я понял две вещи. Первая: интерфейс и привычки людей – это очень важно. Нужно готовить людей к его изменению, проводить специальное обучение. А вторая: стейкхолдеры бывают разные. Кое-кого можно убедить в своей правоте, а кое-кого придется просто слушать и исполнять. А то акт-то и не подпишут.

Еще несколько месяцев мы прожили в стрессе, собирая днем требования по доработке, а по вечерам внося изменения в код. Но система заработала и дала нужный директору результат. Наконец-то он получил отчетность, в которой все цифры отделов полностью совпали, так как были получены из единой базы данных! Надо было видеть его глаза, полные радости! Такие мгновения наполняют жизнь автоматизатора смыслом, давая энергию для разработки новых систем, облегчающих людям жизнь и освобождающих им время для творчества.

Напоследок я добавлю только, что наша программа «Свет» положила начало созданию ERP-системы «Лампочки», которая проработала на заводе более двух десятков лет и успешно развивалась собственным АСУ завода.

История из моей книжки "Франчайзи на грани нервного срыва". Подписывайтесь, опубликую тут постепенно все, что проходит по тематике группы

Показать полностью 1
43

Как программисту съесть слона в диспетчерской Водоканала

Здание нашего Водоканала в то время, в самом начале 90-х, было совсем небольшим. В нем не было лишних кабинетов, и вычислительный центр кооператива «Вода» разместили в подвале. В двух комнатках помещались два отдела – программистов и электронщиков. Весь штат вычислительного центра состоял также из двух человек – меня и Гриши. У меня в комнате стоял стол. На столе – мощная машина «Искра 1030» с болгарским винчестером на 10 мегабайт. Гришины полуразобранные компьютеры, паяльники и провода занимали вторую комнатку. Там всегда приятно пахло канифолью и спиртом.

Диспетчерская Водоканала принимала заявки об авариях на сетях и высылала на устранение протечек аварийные бригады. Начальник диспетчерской, Бабушкин Сергей Петрович, проработал в Водоканале всю жизнь. Он наизусть помнил, как проходит под землей каждая труба и что находится в любом колодце. Разбуди его ночью и спроси: «Петрович, дом № 21 по улице Авроры надо отключить. Что делать?», как он тут же ответит: «Придется отключать весь микрорайон. В 51-м колодце упали плашки на задвижке, даже не лезьте туда».

Сергей Петрович был очень ценным сотрудником. Геоинформационной системы тогда у Водоканала не было, да и некоторая часть проектной документации была утрачена из-за постоянного использования и ветхости. При устранении крупных утечек на магистральных сетях счет шел на минуты. Без Бабушкина устранение аварий происходило бы куда дольше, и последствия были бы серьезнее.

Но Сергей Петрович вовсе не гордился своей незаменимостью. Наоборот, понимая, какие риски такая незаменимость несет для всего предприятия, он старался максимально передать свои знания. Одним из способов это сделать он считал создание базы данных сетей и колодцев.

Паспорт колодца, который Бабушкин придумал и воплотил в виде Excel-файла, содержал две сотни реквизитов. В простейшей, первой нормальной форме1, конечно. Там было все – адрес колодца, его глубина, описание крышки, перечень и материал всех труб и задвижек, находящихся в колодце. По каждой задвижке записывались марка, год выпуска и установки, а также история замен и ремонтов.

Мне предстояло автоматизировать отчеты аварийных бригад о выездах, выполняемых работах и потраченных материалах. Будущая система должна была давать сводку по таким отчетам. Предприятие планировало снизить кражу материалов и объем «левых» работ, анализируя сводку. Сейчас с аналогичными задачами легко справляются мобильные приложения для исполнителей, в которых сотрудники выкладывают фото места аварии до и после ремонта. Тогда же в ходу были выписанные от руки наряды и отчеты аварийных бригад. Их и нужно было вводить в компьютер.

Реализацию этой задачи Сергей Петрович видел на основе «паспорта колодца». Поскольку все работы и материалы должны были быть привязаны к колодцам. Вот тут у нас с Бабушкиным и вышел принципиальный спор.

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

– Как два реквизита? Да их десятки, если не сотни! Задвижки, трубы… А где будет информация обо всем этом?

– Пока она будет там же, где и сейчас – у вас в Excel-файлах. Если она не нужна на выходе этой задачи, то она не нужна и на входе. Если же мы посадим диспетчеров вводить информацию, которой они не будут пользоваться, у нас будут проблемы. Во-первых, внедрение программы сильно затянется. У вас тысячи этих колодцев. Одно дело – ввести два реквизита, и совсем другое – двести. Паспорта могут вводить несколько месяцев, а то и лет. Во-вторых, диспетчеры будут воспринимать эту работу как бесполезную и найдут кучу причин, чтобы ее не делать. А представляете, каким может быть бюджет этого проекта? Боюсь, так мы и вовсе ничего не внедрим.

– Ну а если завтра мы захотим решать другую задачу? Например, выполнять плановые работы на колодцах? Тогда нам обязательно нужно будет знать, когда именно были изготовлены задвижки и их марки!

– Вы сами все правильно сказали. Когда нам нужно будет решать другую задачу, мы сядем, спроектируем функционал и структуру базы данных для этой задачи. Тогда и введем недостающие данные.

– И куда мы их введем? У нас что, будет несколько баз данных с одним и тем же колодцем? В каждой задаче свой колодец? У нас тут знаешь сколько задач? Так мы рано или поздно запутаемся во всех этих «недоколодцах»!

– А почему вы решили, что мы всю эту информацию вообще будем вводить именно в «паспорта колодцев»?

– А куда еще?

– В разные другие таблицы. У нас будут «паспорта задвижек», «паспорта участков трубопроводов», «паспорта труб». Для каждой физической или логической сущности мы сделаем свою табличку.

– Здрасьте, приехали. Так мы все связи между трубами и колодцами потеряем. Зачем нам это? Если я заглядываю в колодец, я должен увидеть всю информацию по нему.

– Вы все увидите. Мы сделаем скрытые от глаз служебные таблицы для связей сущностей между собой. И привычный вам интерфейс. Вы будете как будто у себя в паспорте все вводить, а программа сама разложит информацию по полочкам, запишет ее в нужные таблички. Называется это все «реляционная база данных в третьей нормальной форме». И «пользовательский интерфейс».

– Ладно, это я понял. Но ты так и не ответил, что же произойдет с теми реквизитами, которые точно относятся к колодцам? Куда глубину колодца и тип крышки денем?

– Туда же, в колодцы, и добавим. Базу данных по ходу дела можно будет дорабатывать, добавлять в нее реквизиты. Ничего не потеряется и не продублируется, вы можете не переживать.

Но видно было, что сомнения у Бабушкина остались. Очень он хотел вести «паспорт колодца» в базе данных, а не в Excel. Но аргументы про сроки и бюджет проекта все же сделали свое дело.

И я сделал основу программы для диспетчерской за месяц. Наряды выписывались, отчеты бригад вводились, сводка по работам и материалам готовилась. Парочку бригадиров поймали на «горячем», взгрели на радость Бабушкину и директору Водоканала. Бригадиры стали поскромнее, и явно обозначилась экономия на материалах.

Возвращаясь мысленно в то время, я лучше понимаю, что интуиция меня не подвела, и я принял верное решение – четко выстроить границы будущей программы. А ведь я мог поддаться харизме и авторитету начальника диспетчерской и начать создавать геоинформационную систему с огромной базой данных. С непредсказуемым результатом. Но обсуждение конкретной задачи, ожидаемых сроков и бюджета позволило прийти к разумному компромиссу. Выполнить локальный проект, достичь экономии. И получить карт-бланш на другие проекты.

Но вернемся в наш Водоканал начала 90-х. Воодушевленный результатами, Сергей Петрович решил продолжать. Следующей задачей, которую предстояло решить, стал анализ параметров работы водопроводной сети. Давление, температура и расходы получались с разных контрольных точек, вносились в бумажные ведомости. Дальше по ним строились графики с помощью цветных карандашей и линеек. И делались выводы о состоянии сети и возможных проблемах в ее работе.

Это, скажу я вам, та еще задачка, строить водопроводную сеть с помощью реляционной базы данных! И если с необходимостью увязать между собой контрольные точки я как-то справился, то с графиками была полная незадача. Выведенные на экран звездочки напоминали смесь ежа с ужом и даже близко не были похожи на цветные картинки, которые чертили девочки в диспетчерской.

Это сейчас в 1С можно построить такой график, который впечатлит любого руководителя. Но не в FoxBase, который знал только текстовый режим работы. Разочарованный Сергей Петрович вопросительно смотрел на меня и грустно вздыхал.

Вечером я поделился проблемой с Гришей. Гриша почесал макушку и спросил:

– А с ассемблером2 у тебя FoxBase3 дружит?

– Не знаю, я никогда не пользовался такой возможностью.

– Ну ты посмотри, полистай документацию.

Мы вместе нашли распечатку команд. И обнаружили, среди прочих, возможность запускать из интерпретатора команды постороннего кода.

– Отлично, – сказал Гриша. – Ложись спать, ни о чем не грусти. Утро вечера мудренее.

Утром Гриша продемонстрировал мне великолепный цветной график на всю ширину экрана. То, чего никак нельзя было сделать на FoxBase, прекрасно получилось реализовать на языке, максимально близком к машинным кодам! Еще пару дней мы возились, обеспечивая бесшовную интеграцию программ и мягкий переход из текстового в графический режим работы дисплея.

И вот настал день, когда вся диспетчерская собралась на презентацию новой программы. Глядя на цветное чудо на экране, Бабушкин улыбался во весь рот. Девочки-диспетчеры удивленно пищали и не могли поверить, что навсегда избавились от необходимости чертить карандашами. Мы с Гришей гордились своей работой.

Именно тогда я понял простую истину. Не нужно верить, когда программист говорит, что «это невозможно». Всегда, в любой информационной системе найдется такая «дырочка», через которую можно подтянуть возможности другой, более мощной или более гибкой системы. Такой тандем способен решить любую задачу клиента. «Это невозможно» говорит только о том, что программисту неинтересно решать вашу задачу. Другое дело, что решение некоторых задач может потребовать больше ресурсов, чем было заложено изначально. Да, Грише придется платить, если вы хотите чуда.

Этот рассказ из моей книжки "Франчайзи на грани нервного срыва". Опубликую постепенно из нее все, что подойдет в группу по тематике. Подписывайтесь.

Показать полностью
98

Как написать программу, за которую тебя будут благодарить 15 лет

История произошла в 90-е годы прошлого века.

Программирование занимало в моей жизни все больше времени, и его совсем не оставалось на науку. Поэтому, когда заместитель директора по экономике Водоканала предложил мне ставку программиста в кооперативе «Вода», я не раздумывал. Подписал заявление об уходе в вузе, отработал две недели и перешел полностью на работу с Водоканалом.

Следующей задачей, которую мне предстояло решить, стал расчет начислений и печать счетов абонентам Водоканала.

Делалось все вручную. Расчеты выполнялись в больших книгах, «оборотках». Информация о показаниях счетчиков переписывалась из абонентских книжек на страницы книги и умножалась на тариф. В эти же книги разносились оплаты. По итогам месяца рассчитывалось сальдо. Сложности начинались в период выставления счетов. Счета и платежные требования печатались на печатных машинках на готовых бланках, в нужные места которых впечатывались только объемы и суммы. В дни выставления счетов в абонентский отдел было не зайти – машинки строчили, заглушая все вокруг. Готовые счета раскладывались по конвертам и отправлялись абонентам. Хорошо, что в то время еще не было счетов-фактур. Не представляю, как бы сотрудники отдела справлялись с двойной работой.

Первая программа, которую я написал, была не самой эффективной. Она копировала действия сотрудников, распечатывая данные из электронной ведомости в бланки счетов. Время, которое уходило на правильную установку бланка в принтер, было не меньшим, чем печать счета на машинке. И это не считая загубленных криво вставленных бланков!

Пришлось пойти другим путем – печатать счета полностью. Печатались они на рулонной бумаге сплошной лентой и потом разрывались с помощью линейки по местам разреза. Вообще, меня удивляли первые матричные принтеры. Бумага к ним поставлялась исключительно в рулонах, но ни один из принтеров не был оборудован устройством для подачи бумаги. Или их не выпускали производители, или их не поставляли наши поставщики! Народ делал такие устройства сам, обычно они состояли из металлической оси и подставки, на которой ось крутилась.

Но одной печати счетов было недостаточно для счастья абонентского отдела. Как говорится, вкус приходит во время еды. Запросы к программе росли, и решено было написать вторую версию программы «Абонент», уже для самых современных компьютеров IBM 286.

И тут я столкнулся с тем, что чем больше становилась программа, тем больше в ней было ошибок! Сперва я тратил на их устранение немного времени – несколько минут в день. Но, по мере роста программы, время «ремонта» увеличивалось. Через три месяца на поиск ошибок уходили часы. И, наконец, настал такой день, когда я не написал ни строчки нового кода. Весь день я чинил программу, исправлял в ней «баги». И, как вы понимаете, создавал новые.

Со мной работал старший товарищ, Наиль. Он посоветовал мне книжку про структурное программирование зарубежных авторов. Настоящий бестселлер тех времен. Смысл книги сводился к тому, что не нужно из программы делать огромное запутанное «блюдо спагетти». Большую программу следовало разбить на совсем небольшие модули, так, чтобы каждый модуль умещался в экран дисплея. Писать программу предлагалось с самого верхнего модуля, отлаживая каждую из написанных частей до того, как напишется вся программа. Отсутствующие подпрограммы заменялись «затычками» – небольшими программками, просто отвечающими на вызов: «Все в порядке, я работаю». Особое внимание авторы уделили комментариям. В каждом модуле нужно было подробно описать его назначение и прокомментировать каждый блок кода. С того момента, как я прочитал книгу, жизнь моя изменилась. Ошибки покинули мои программы, а отладка стала занимать незначительное время. Количество кода тоже сильно сократилось, так как дублирующиеся фрагменты переехали в специализированные модули.

Наиль оказал мне еще одну неоценимую помощь. Как-то он увидел структуру таблички «Лицевые счета», которую я создавал в базе данных FoxBase. Она выглядела примерно так:

• Название улицы;

• Номер дома;

• Номер квартиры;

• Номер лицевого счета;

• Фамилия квартиросъемщика;

• ...

– Слушай, – спросил меня Наиль, – ты что, никогда не слышал о третьей нормальной форме?

– Что еще за форма? Почему третья, что с первой и второй? И почему ты думаешь, что у меня форма ненормальная?

– Представь, что завтра улицу переименуют. Была Абрикосовая, а станет Виноградная. А у тебя на Абрикосовой десять тысяч лицевых счетов. И в каждом нужно будет перебить руками название улицы! Ну ладно, предположим, ты программу напишешь, которая это сделает автоматически. Но ты уверен, что у тебя во всех записях Абрикосовая именно Абрикосовая? А не абриксовая или Обрикосовая? И если потом ты захочешь сделать выборку по улице, сколько лицевых счетов ты потеряешь? То-то же.

И он дал мне почитать переводную статью Уильяма Кента, в которой описывались нормальные формы реляционной базы данных – от первой до пятой. После изучения статьи табличка «Лицевые счета» превратилась в пять таблиц – «Улицы», «Дома», «Квартиры», «Жители» и «Лицевые счета», в которых полностью отсутствовало дублирование информации. Теперь улицу можно было переименовать без последствий для домов и лицевых счетов на ней.

Поэтому, когда я встретил Наиля через 20 лет, я сильно удивился. Человек, который так много знал, и сыграл в моей жизни важную роль учителя и наставника, по-прежнему писал программы на FoxBase! Я в то время уже перешел на 1С, создал свою компанию и автоматизировал множество предприятий на этой платформе.

– 1С? Прошу тебя, не рассказывай мне про 1С! Ненавижу эту систему! Она оставила меня практически без работы! Держусь только благодаря двум-трем старым заказчикам! Хочешь, я покажу тебе, какой классный универсальный документ я написал на FoxBase?

Я промолчал. Хорошо, конечно, оттачивать мастерство, создавая все более совершенные программы на старых языках. Но намного лучше идти в ногу со временем, изучая современные платформы. И я еще раз порадовался тому, что платформа 1С не стоит на месте, развивается, седьмая версия, восьмая, веб-сервисы, мобильные приложения, система взаимодействия, работа с большими данными… В каждом релизе появляется что-то новое, и таких релизов выходит несколько в год.

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

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

– У нас никогда не было такой прекрасной программы. Она умеет все! Считает и быстро, и правильно. Правда, в ней не хватает одной небольшой штучки…

– Какой еще штучки?

– Да ерунды, мелочи. Мы забыли с тобой, что водопотребление лимитировано. Нужно следить, чтобы абоненты не потребляли ресурсы сверх установленных лимитов. А кто балуется, с тех брать за сверхлимит по пятикратному тарифу.

Я понимал, что все серьезно, и, хотя, они могли внести этот сверхлимит вручную в любой счет, садился и дописывал программу.

Так в программе постепенно появились:

• Выставление и учет начислений за превышение лимитов по загрязнению окружающей среды;

• Акты за бездоговорное потребление, объем которого рассчитан по времени нарушения и сечению трубы;

• Раздельный учет водоснабжения и водоотведения для бухгалтерии;

• Планирование по статистическим данным за прошлые периоды;

• Счета-фактуры;

• 100 500 новых отчетов...

• … и множество других улучшений, которые я сейчас уже и не припомню.

То есть программа создавалась, сама того не ведая, по модной сегодня идеологии Agile1. Причем, я подозреваю, начальница отдела сбыта «скармливала» мне новые пожелания очень постепенно. Так, чтобы я мог переварить их в период между выставлениями. Вела, скажем так, свой тайный бэклог (список требований). Получался такой спринт длинной в месяц, после которого выходил новый релиз. И релиз этот был вполне рабочий, и внедрялся без проблем.

Ну и, конечно, я не могу не упомянуть тут интерфейс «Абонентов». Он был сделан по образцу программы, которую в то время использовал каждый пользователь Искры-1030, а позднее IBM PC 286, 386 и 486. Это, конечно же, Нортон Коммандер! Как и в прототипе, в «Абонентах» было два экрана. На одном список абонентов, на другом список объектов выбранного абонента. Или на первом карточка абонента, на втором оборотная ведомость со счетами и платежами. И кнопки F2, F3… F10, нажимая на которые можно было открыть нужный объект абонента, счет или платежку. Подсказка по F1, конечно. И никакой мышки, только кнопка Tab для перемещения между полями ввода.

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

Показать полностью
55

Восстание компьютеров? Уже было в советское время

«ДВК 2М» – так назывался аппаратный комплекс, на котором создавалась программа «Расчет зарплаты». Для своего времени это был суперкомпьютер. Во-первых, он был персональным. Вполне приемлемого размера, помещался на стол. Во-вторых, у него было огромное быстродействие – целых 10 или 20 тысяч операций в секунду. Да-да, тогда быстродействие измерялось не тактовой частотой процессора, а именно операциями с двоичными числами. И в-третьих, у него было ОЗУ довольно большой емкости – целых 64 килобайта. Туда спокойно помещалась операционка, программа Бейсик, текст прикладной программы и ее данные. Чего в ДВК не было – так это винчестера. А значит, и записанной на нем операционки. К системному блоку прилагался болгарский сдвоенный дисковод размером 5,25 дюйма. В верхний слот я вставлял дискету с операционной системой и бейсиком. А в нижний – дискету с прикладной программой и данными. Компьютер был отечественный, но сильно продвинутый. Поэтому он зависал и перегружался не чаще двух раз в день. При перезагрузке пропадали не только операционка в ОЗУ, но и, скажем, набитый за пару часов в бейсике текст новой программы. Помню, как долго я не мог прийти в себя, когда в обед компьютер завис и унес в небытие пять страниц готовой программы! Как я в ужасе бегал вокруг стола и думал, что «ну должен же где-нибудь остаться хоть какой-то след от такого серьезного труда!». Но, увы, след оставался только в моем мозгу. Именно тогда я впервые столкнулся с таким интересным феноменом: написанная повторно по памяти программа была всегда лучше прототипа! И короче, и работала быстрее.

Со спонтанными перезагрузками ничего нельзя было сделать. Более того, мы искренне радовались, что они не такие частые, как на больших машинах. Например, перезагрузки на ЕС ЭВМ случались раз в полчаса-час и считались нормой! Так вот, для того, чтобы не терять новую программу при каждой перезагрузке, нужно было ее периодически сбрасывать из ОЗУ на дискету. Но. Тут-то и начиналось самое интересное. Болгарский дисковод записывал программу на дискету. Иногда. Но не всегда. Чаще он шипел, трещал, свистел, но... не записывал! Через минуту шипения и свиста появлялось страшное сообщение «Write failure error» и можно было переходить к новой попытке. Иногда, после трех-четырех попыток, файл все-таки записывался. Однако не было никакой гарантии, что он прочитается! «Read failure error». Это было не менее ужасное и не менее редкое сообщение системы. И вот бывает, сидишь ты за компьютером, в конце рабочего дня, смотришь на листинг программы на экране и пытаешься ее хотя бы запомнить. Потому что записать ее не получается. Ну никак! Это ужасное чувство, думаю, напоминающее то, которое должен испытывать человек, бегущий за последним вагоном электрички, уже коснувшийся поручня, и вдруг осознающий, что поезд ушел.

Водоканал, для которого я писал программу, закупил сразу пять ДВК с болгарскими дисководами. Мы с девочками из бухгалтерии пытались найти среди них тот, который бы записывал и считывал файлы наилучшим образом. Дисковод, более надежный, чем другие, ценился на вес золота. Мы предпринимали различные способы улучшить работу болгарских дисководов. Особой популярностью пользовался такой способ. Покупался настольный вентилятор. Он ставился в коробку из-под бумаги. В коробке вырезались две большие дырки. Одна – для поступления воздуха. А вторая, квадратная, для болгарского дисковода. Он устанавливался в эту дырку и интенсивно охлаждался потоком воздуха. Кто-то свято верил в такие «усовершенствования», я же считал, что это все равно, что камлать на бубне – никакой гарантии. 50 на 50: или запишет, или нет. Вот тогда-то во мне и зародилось первое глубокое сомнение в братстве народов, СЭВ1 и целесообразности социалистического пути развития. Боже мой, как же я проклинал братьев болгар – криворуких безжалостных убийц моего времени!

Операционная система, которую мы тогда использовали, называлась RT11SJ. Загружалась она секунд десять и записывалась на диск в виде пары файлов. В отличие от MS DOS, которая появилась чуть позднее, операционка эта обладала намного большим количеством удобных команд. Например, могла выдавать список файлов с подкаталогами, а DOS не умел этого делать! «Убожество» – вот первое мое ощущение от использования DOS. Однако мы все-таки перешли на DOS окончательно и бесповоротно, когда поняли, что под ней «идут» все новые программы и игрушки, а программ для RT11 становится все меньше.

64 килобайт в ОЗУ и 250 килобайт на каждой дискете делали процесс написания большой программы весьма увлекательным. Программисту требовалась определенная сноровка, чтобы правильно разбить программу и данные на части и заставить их успешно взаимодействовать. Программа расчета зарплаты «Роза» работала так. Сперва в оперативную память загружалась система. Потом Бейсик. Потом Главная программа. Она просила вставить в нижний дисковод дискету № 1 с данными цеха 1 за январь 1989 года. Расчетчица могла отредактировать данные работников, ввести табель и посчитать зарплату за месяц. После этого, если дисковод работал, ей даже удавалось сохранить результаты расчета! Если она хотела их распечатать, Главная программа просила вставить диск с Программой для печати, потом диск с данными цеха, потом диск с Главной программой. Потом вставлялась дискета номер 2 для цеха номер 2, и так далее – до диска номер 42. 42 цеха было в Водоканале. И ни разу нам не удалось рассчитать их все. Или болгарский дисковод перегревался и останавливался (зачастую – уже навсегда). Или расчетчица что-то путала и записывала на диск номер 2 данные цеха номер 17. И неделю, матерясь, их восстанавливала. А что делать – дискет для архива просто не было! Или, если все шло хорошо, в каком-нибудь 27-м цехе обнаруживались новый вид расчета или ошибка в алгоритме, и все приходилось начинать заново! Помню, что благодаря тому ужасу, который вызывала необходимость дойти с такой технологией «до конца», все-таки было принято разумное решение принять программу у программистов по акту на примере двух цехов. После чего девочки продолжили считать зарплату в бумажных расчетных ведомостях, вплоть до того момента, пока программа не заработала надежно на «Искре-1030».

Вспоминая прошлое, я радуюсь тем грандиозным изменениям, что произошли в нашей работе. Надежные и производительные винчестеры, огромная оперативная память начисто избавили программистов от необходимости задумываться о таких вещах, как дефицит вычислительных ресурсов или аппаратные сбои. Теперь программист может сосредоточиться на главном – написании кода для решения задач пользователя.

Восстание компьютеров? Уже было в советское время
Показать полностью 1
Отличная работа, все прочитано!