О тостере и инженере-электрике
Перевод из Анонимуса
Давным-давно, в тридевятом царстве, в тридесятом государстве король вызвал к себе двух своих мудрецов-советников и задал им хитрую задачку.
Он показал им блестящую железную коробочку с двумя прорезями сверху, переключателем-ручкой и рычагом и спросил: «Что это?»
Один из мудрецов, инженер-электрик, ответил первым: «Это тостер».
Король спросил: «Как к нему приделать компьютер?»
Мудрец ответил: «С помощью четырехбитного микроконтроллера я напишу простенькую программу, которая будет считывать данные с ручки, устанавливающей 16 степеней зажарки: от белого-пребелого до угольно черного. В программе будет простая табличка, сопоставляющая требуемый уровень зажарки тостов и длительность работы таймера. Она будет включать тостер и запускать таймер в соответствии с выбранной степенью зажарки.
По окончании она будет выключать тостер и выбрасывать готовые тосты.
Через неделю будет готов работающий прототип».
Второй мудрец, программист, немедленно увидел опасность такого недалекого подхода к решению задачи. Он сказал: «Тостеры не только превращают хлеб в тосты, но и разогревают замороженные вафли. На самом деле перед вами прибор для приготовления завтраков. По мере того как, ваше величество, ваши подданные будут становиться всё более и более утонченными, они будут требовать все больше новых возможностей. Им нужен будет прибор для приготовления завтраков, который также сможет пожарить им колбасу, бекон и яичницу. Тостеры, которые умеют поджаривать только тосты, выйдут из употребления. Если сейчас не задуматься о будущем, через несколько лет нам нужно будет разрабатывать новый тостер! Если мы взглянем на проблему под таким углом, то мы сможем найти более разумный подход к решению этой задачи. Начнем с создания класса продуктов для завтрака. Разобьем его на подклассы зерновых, мясные и птицу. Далее для каждого подкласса повторим процесс деления на подуровни: в зерновые войдут тосты, кексы, блины, вафли; мясные разделятся на сосиски, колбасу, бекон, а птица будет включать в себя яйца вкрутую, в мешочек, всмятку, яичницу-глазунью и целую подгруппу омлетов. Надо также будет предусмотреть специальные подгруппы рубленой ветчины и сырного омлета, так как они будут пересекаться с разными подгруппами. Таким образом, поставленная задача не может быть решена без множественного наследования. Во время своей работы программа должна создать верный объект и выполнить для него директиву «готовься». Семантика такой директивы, конечно же, зависит от объекта. «Готовься» по отношению к тосту и крутому яйцу будут значить абсолютно разные вещи. Рассмотрев процесс на этой фазе, мы понимаем, что базовое оборудование должно иметь возможность готовить любой вид завтрака. Переходя непосредственно к дизайну мы обнаруживаем наличие производных требований, а именно разработки объектно-ориентированного языка со множественным наследованием. Конечно же, пользователи не захотят, чтобы их яичница остыла к тому моменту, как поджарится бекон, отсюда появляется требование многозадачности. Нельзя забывать и о пользовательском интерфейсе: рычагу, опускающему продукт к нагревательным элементам, не хватает универсальности, а ручка, устанавливающая степень зажарки, недостаточно информативна. Пользователь не будет пользоваться продуктом без привлекательного графического интерфейса. При включении агрегата для готовки завтрака на экране должна появляться анимация, щелчок на которую будет демонстрировать надпись «загрузка Windows XX» (к тому моменту, когда продукт будет готов к выходу на рынок, выйдет и Windows XX).
Посредством ниспадающих меню пользователи смогут выбирать тип готовящихся продуктов. Приняв эти важнейшие решения о разработке программного обеспечения, мы должны перейти к выбору адекватного аппаратного обеспечения на фазе реализации проекта. Компьютер с процессором Интел Пентиум, с 2-мя гигабайтами оперативной памяти, жестким диском в 120 гигабайт и SVGA монитор вполне подойдут для наших целей. Как только мы выберем многозадачный объектно-ориентированный язык, поддерживающий множественное наследование, в который будет встроен графический интерфейс, написание такой программы не займет много времени».
Король мудро обезглавил программиста, и все стали жить-поживать да добра наживать.