Вот в таком аспекте
Tuesday, 4 Dec 2001
Все переписать!
В девяносто девятом, если не ошибаюсь, году, ко мне на поклон пришел мой хороший знакомый. Я, кажется, пользовался у него репутацией сведущего программиста. Если бы мы не были знакомы со школьных времен, он, вероятно, обращался бы ко мне «гуру». Он нуждался в моей помощи. Программа, которая работала у них в офисе со времен царя Соломона, перестала справляться с тем объемом данных, который в нее пытались запихивать. Так иногда бывает.
Я моментально согласился помочь, и переписать софтину. Техническое задание показалось мне очень прозрачным. Пара таблиц, минимум связей, выкристализованная напрямую постановкой задачи реляционная модель. Единственное, что оставалось сделать мне — выработать интерфейс и реализовать все это. Я подошел к задаче творчески. Мне очень хотелось порадовать моего знакомого (на самом деле, он тоже пытался подвизаться в программировании, и мне хотелось его не столько порадовать, сколько продемонстрировать собственную крутизну). Критичным моментом интерфейса была скорость ввода данных. Точно не помню, но, кажется, эта формочка должна была заполняться в реальном времени в режиме телефонного разговора с клиентом. Как-то так.
Я за день нарисовал базу данных и прикрутил к ней простенькое среднее звено (стандартный библиотечный набор функций для прозрачного обращения к базе данных; заказчик не определился с выбором СУБД, и я, насколько мог, облегчил ему процесс последующей вероятной миграции). Настала очередь интерфейсного окна. Я ходил вокруг компьютера кругами, медитируя и анализируя. Мне очень хотелось сделать шедевр. Тогда я еще не знал, что все гениальное — просто, а изобретение велосипедов — не является кратчайшим путем к славе. Наконец, я определился.
По всем законам оборудования АРМ, почерпнутым из умных книжек на вражеском языке, я увешал каждое поле ввода шорткатами и выделил критичные поля ввода цветом, — неброским, но заметным. Я трижды проверил Tab-order, тщательно продумал структуру меню (в котором и было-то не более десяти пунктов), продублировал меню тулбаром, нарисовал интуитивно-понятные иконки и снабдил ими каждый пункт меню, соответствующую кнопку на тулбаре и поле ввода, если между ними существовала хоть какая-то связь. Вокруг каждого поля ввода была еле заметная рамка, окружающая само поле, метку сего названием, иконку и некоторую область вокруг. Достаточно было ткнуть мышкой в любом месте внутри этой рамки, и поле ввода получало фокус. Я работал почти неделю, по шестнадцать часов в сутки, и я сделал действительно конфетку. Еще день я гонял всяческие тесты. Я вводил буквы в поле суммы, неправильные даты, мой BoundsChecker, если бы он мог говорить, взмолился бы о пощаде и потребовал сверхурочные. Наконец, я был готов к показу.
Показ состоялся на следующий день. Я, кажется, сумел произвести впечатление на их штатного программиста. Что касается операционисток, ради которых все это и затевалось, я провалился совершенно. Я так и не смог сдать этот заказ. Получил небольшие отступные и бормоча себе под нос мантру предания анафеме по-язычески, удалился.
Как выяснилось, я не учел одного. Операционистки привыкли работать со старой программой. Там поле ввода дополнительной информации получало фокус по Esc
(sic!), а клавиша — использовалась для проверки введенных данных. Сохранение записи собственно в базе, разумеется, осуществлялось по F2
. Несчастные операционистки, справившись худо-бедно со вводом фамилии, вводили дату заказа, и автоматически остервенело били по ничем не виноватому Enter
, потому что их старая программа могла уже при сохранении записи ругнуться на неверный ввод и зависнуть. Мои заверения в том, что ввод проверяется на лету, и «вот же! подсвечивается красненьким, если что» — лишь придавали им уверенности в том, что все программисты — ненормальные, и единственной своей целью видят выжить их, бедных и несчастных, с их рабочих мест. Справившись с вводом даты, и раскрасневшись от боязни предстать перед начальником идиотками, они старательно пытались ввести дополнительную информацию — посредством нажатия клавиши F1
.
Как реагировала моя программа на Enter
и F1
, полагаю, рассказывать не нужно.
Спустя несколько дней, поостынув и продумав все, что я хотел бы сказать операционисткам и их ближайшим родственникам, я понял очень простую вещь: чтобы успешно продать эту программу мне нужно было перед проектированием интерфейса часок поиграться с их старым монстром. Всего-то и делов — перехватить пару клавиш. И я был бы королем — если бы не мое страстное желание изобрести велосипед.
С сегодняшнего дня мы...
Другое частое проявление идиотизма — в этом случае, как правило, со стороны руководства — попытка за день перевести весь офис на новый софт. Будь то новая операционная система, новый офисный пакет, новая система обмена сообщениями. Новый системный администратор — самое большое зло, какое может случиться в фирме. Нет, я ничего не имею против системных администраторов. Они все как один — милейшие люди, и если вам не с кем выпить пива, — системщик незаменим. К сожалению, у каждого из них ограниченный в силу объективных причин кругозор. Поэтому вероятность того, что пересечение пристрастий уволенного вчера и только принятого на работу админа окажется ненулевым множеством — исчезающе мала. А так как авторитет этих людей непререкаем, неизбежна миграция с сервера WinNT — наLinux («Уму не постижимо, как это все работало! А безопасность?Ужас!»), с MySQL — на Interbase («OpenSource, конечно же, рулит, но там же нет транзакций!»), с IIS — на Apache («Он проще в конфигурации и поддерживает PHP»).Разумеется, меняется Proxy и политика доступа в интернет. Если Аська была разрешена — ее запрещают. Была запрещена — разрешают. Все эти фразы можно перевести на русский литературный язык, и звучать они будут так: с тем, что у вас тут поустановлено, я работать не умею, а учиться — не хочу. И вот уже всем в офисе принудительно сносят Outlook, и заменяют на TheBat!, потому что вирусы. Вместо MSWord появляется OpenOffice (если фантазия администратора небогата, то по тем же причинам). Всем ставится FAR (учитесь, идиоты).
В результате сеть начинает работать с перебоями, потому что уровень безопасности слишком высок, и в локальной сети за брандмауэром проверяются все мак-адреса, а авторизация требуется по каждому запросу. В фирме, имеющей отношение к полиграфическому бизнесу вместе с баннерами безжалостно вырезаются все до единой картинки и фотографии. Вместе с доступом к порносайтам закрываетсяи доступ к новостным лентам профессионального характера. Вместе с ICQ отрезается SSL к заказчику и FTP к собственному сайту.
Чтобы со всей этой херней взлететь, требуется в лучшем случае неделя.
Эту проблему я называю «болезнь пристрастий». Программисты болеют ей не в меньшей степени. «Как?! У вас сайт на перле? Это прошлый век! Я все перепишу наPHP». «База под MySQL? Да это все завтра навернется, тут нужен, как минимум, Oracle» (эту фразу, кстати, я слышал собственными ушами, и я до сих пор терзаюсь, почему я не спросил, а что же тогда — как максимум?). Всем это знакомо. Мне очень редко встречались люди, которые понимают, чем отличается создание нового проекта от поддержки старого. Я сейчас скажу крамольную фразу, можете кидать в меня камнями.
Если вот этот кусок, написанный, пьяным безграмотным дебилом на КОБОЛе в самом сердце программы на ЛИСПе работает — отойди, и ничего не трогай!
А если вам все же втемяшится его оптимизировать и переписать — переписывать его нужно на ЛИСПе, а не на кроссплатформенной Java, производительном C++ или удобном и строго типизированном Pascal. Хотя бы из уважения к тому, кто этот код будет поддерживать после вас.
Несколько советов
Я тут, собственно, чего распинаюсь. Есть простой и практически идеальный способ решения проблемы поддержки, сопровождения и расширения существующих программных продуктов, сайтов, технологий. Он же — путь наименьшего сопротивления. Ничего не менять, если есть таковая возможность. Ничего не нарушать своими добавлениями и улучшениями в работе существующих частей, пусть даже и — в ущерб производительности. Не добавлять ничего такого, что не требуется на данный момент (не выпуская, впрочем, из головы возможности добавитьэто по первому требованию). Не стремиться к совершенству, супермасштабируемости, суперпроизводительности и суперудобству использования. Правильное решение — всегда находится где-то посередине.
Ничего, что я заговорил трюизмами?
Совсем недавно мне пришлось озаботиться проблемой защиты собственной переписки. Электронной подписью. И даже криптованием. С криптованием, понятно, все просто. Зашифрованные письма ходят между двумя людьми, которые договорились об этом заранее — и загодя обменялись своими открытыми ключами. Мне же, по большому счету, было важно не это. От моего имени стали посылать письма через открытые реле, и я посчитал целесообразным подписывать все мало-мальски значимые исходящие сообщения. И немедленно лицом к лицу столкнулся с проблемой обнародования своего открытого ключа. Ну не цеплять же его в конец каждого письма, в самом деле.
Изящное, на мой взгляд, решение пришло мне в голову достаточно быстро. Берем правильного почтового клиента, который умеет добавлять свои элементы в заголовки исходящей почты. Добавляем вот что:
http://www.matiouchkine.de/gpg/matiouchkine.pub.key (http://mudasobwa.ru/gpg/matiouchkine.pub.key)
by: GnuPG ver 1.2.3 (http://www.gnupg.org)
by: <a href="mailto:am@mudasobwa.ru" name="Key owner" title="Alexei Matiouchkine">
Voilà.
Именно принцип «не мешать тому что работает» очень грамотно вписывается в концепцию AOP — Aspect Oriented Programming. Аспектное программирование, применительно к поддержке продукта, снижает (по-английски я бы написал dramatically decreases
) возможность привнести новую ошибку вуже отлаженный код.
Я, собственно, только сейчас понял, зачем я затеял эту статью. Чтобы написать ключевую завершающую фразу.
Ориентированное на аспекты программирование рулит!