Человеческий фактор в программировании.
Задом наперед.
Принтерные драйверы — не единственные преступники. Из-за огромного количества гигабайт, которые занимали программы и данные на каждом лэптопе в моем офисе, было решено перейти на использование портативных ленточных накопителей большой емкости. Устройства работали превосходно, хотя и немного шумели, но вот драйверы были спрограммиро-ваны высокомерно. Резервное копирование начиналось с запроса накопителя по параллельному порту SСSI-адаптера, однако программа драйвера подразумевала, что накопитель уже подсоединен, включен, готов к работе и снабжен картриджем. Если это было не так, программное обеспечение начинало глючить, нарушая работу всей операционной системы.
Или возьмем одну из версий программы, предназначенной для работы со внешним многофункциональным факсом по параллельному порту. Если вы запускали Windоws до присоединения и включения факса, драйвера начинали жаловаться и выдавать сообщения об ошибке. Если вы хотели переключить печать на принтер, то перед этим вам нужно было сначала удалить драйвер факса, а затем выйти из приложений и перезагрузить систему, иначе драйвер начинал забрасывать вас бесконечными сообщениями об ошибке.
Среди моих любимых кандидатов на попадание в тот особый круг ада являются компании, которые слишком скупы, чтобы вкладывать деньги в испытанную инсталляционную технологию. Такие компании применяют установочные программы собственной разработки. В результате частенько встречаются системы, способные презрительно поправить файлы операционной системы, не спрашивая на то разрешения и не создавая резервных копий. Продукт одной творческой лаборатории, производящей звуковые карты, не только требовал установки Windоws-драйверов под МS-DОS, но и занимал столько памяти, что для его запуска приходилось убирать из СОNFIG.SYS и АUТОЕХЕС.ВАТ все остальное.
Высокомерное программирование можно обнаружить не только в драйверах для периферийных устройств. Вспомните, как несколько лет назад вполне оправданно поднялся шум, когда стало известно, что один крупный провайдер онлайновой информационной службы автоматически «обновлял» ваше программное обеспечение, записывая что-то на ваш диск при подключении к системе. (Конечно, современные броузеры, антивирусные программы и многие другие приложения запросто делают это через Интернет, внезапно превращая неизменный рабочий стол в незнакомую территорию или мистическим образом снижая производительность работы без вашего разрешения.) Кроме того, операционная система провайдера считывала данные с вашего диска и сообщала их вам, когда вы подписывались на предоставляемые услуги. Здесь важно не то, что была возможность отменить эту опцию, а то, что это было высокомерие, расчетливое высокомерие: запрограммировать систему так, чтобы эта опция была активна изначально.
Наверное, самым ярким примером высокомерного программирования является активная электронная почта, которая запускается при открытии почтового сообщения. Такая эгоистичная программа не только запускает себя, не дожидаясь завершения инсталляции, но и широко открывает двери для новых способов распространения вирусов, червей и троянских коней. (Конечно, это было дальновидным, но никем не замеченным предупреждением, которое предсказало появление таких вирусов, как Меlissа и Lоvе Вug.).
Более смиренный код зачастую более прост и менее амбициозен. Его конфигурацию можно изменять, и пользователи сохраняют над ним конт-роль. Он сообщает пользователям необходимую информацию, но не становится при этом навязчивым. Он любезно предлагает не делать то, что уже сделано. Такой код работает тихо, надежно и сотрудничает с другим кодом.
Ах, прекрасная Беатриче, будь ты здесь, ты научила бы нас истинному смирению.
Из журнала Sоftwаrе Dеvеlорmеnt, том 4, № 2, февраль 1996 г.