Файл: Руководство по стилю программирования и конструированию по.pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 30.11.2023
Просмотров: 763
Скачиваний: 2
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
1 0
ЧАСТЬ I Основы разработки ПО
Переход от геоцентрического представления к гелиоцент- рическому в астрономии Бахман сравнил с изменением,
происходившим в программировании в начале 1970-х. В это время центральное место в моделях обработки данных стали отводить не компьютерам, а базам данных. Бахман указал,
что создатели ранних моделей стремились рассматривать все данные как последовательный поток карт, «протекаю- щий» через компьютер (компьютеро-ориентированный подход). Суть изменения заключалась в отведении централь- ного места пулу данных, над которыми компьютер выпол- няет некоторые действия (подход, ориентированный на БД).
Сегодня почти невозможно найти человека, считающего, что
Солнце вращается вокруг Земли. Столь же трудно предста- вить программиста, который бы думал, что все данные мож- но рассматривать как последовательный поток карт. После опровержения старых теорий трудно понять, как кто-то когда-то мог в них верить. Еще удивительнее то, что приверженцам этих старых теорий новые теории казались такими же нелепыми, как нам старые.
Геоцентрическое представление о Вселенной мешало астрономам, которые сохра- нили верность этой теории после появления лучшей. Аналогично компьютеро- ориентированное представление о компьютерной вселенной тянуло назад ком- пьютерных ученых, которые продолжили придерживаться его после появления теории, ориентированной на БД.
Иногда люди упрощают суть метафор. На каждый из описанных примеров так и тянет ответить: «Разумеется, правильная метафора более полезна. Другая метафора была неверной!» Так-то оно так, но это слишком упрощенное представление. Ис- тория науки — не серия переходов от «неверных» метафор к «верным». Это серия переходов от «менее хороших» метафор к «лучшим», от менее полных теорий к более полным, от адекватного описания одной области к адекватному описанию другой.
В действительности многие модели, на смену которым приходят лучшие модели,
сохраняют свою полезность. Так, инженеры до сих пор решают большинство своих задач, опираясь на ньютонову динамику, хотя в теоретической физике ее вытес- нила теория Эйнштейна.
Разработка ПО — относительно молодая область науки. Она еще недостаточно зрелая, чтобы иметь набор стандартных метафор. Поэтому она включает массу второстепенных и противоречивых метафор. Одни из них лучше другие — хуже.
Оттого, насколько хорошо вы понимаете метафоры, зависит и ваше понимание разработки ПО.
2.2. Как использовать метафоры?
Метафора, характеризующая разработку ПО, больше похожа на про- жектор, чем на дорожную карту. Она не говорит, где найти ответ —
она говорит, как его искать. Метафора — это скорее эвристический подход, а не алгоритм.
Не стоит недооценивать важ- ность метафор. Метафоры име- ют одно неоспоримое достоин- ство: описываемое ими поведе- ние предсказуемо и понятно всем людям. Это сокращает объем ненужной коммуникации,
способствует достижению вза- имопонимания и ускоряет обу- чение. По сути метафора — это способ осмысления и абстраги- рования концепций, позволяю- щий думать в более высокой плоскости и избегать низкоуров- невых ошибок.
Фернандо Дж. Корбати
(Fernando J. Corbatу)
1 2 3 4 5 6 7 8 9 ... 104
ГЛАВА 2 Метафоры, позволяющие лучше понять разработку ПО
11
Алгоритмом называют последовательность четко определенных команд, которые необходимо выполнить для решения конкретной задачи. Алгоритм предсказуем,
детерминирован и не допускает случайностей. Алгоритм говорит, как пройти из точки А в точку Б не дав крюку, без посещения точек В, Г и Д и без остановок на чашечку кофе.
Эвристика — это метод, помогающий искать ответ. Результаты его применения могут быть в некоторой степени случайными, потому что эвристика указывает только способ поиска, но не говорит, что искать. Она не говорит, как дойти пря- мо из точки А в точку Б; даже положение этих точек может быть неизвестно. Эв- ристика — это алгоритм в шутовском наряде. Она менее предсказуема, более за- бавна и поставляется без 30-дневной гарантии с возможностью возврата денег.
Вот алгоритм, позволяющий добраться до чьего-то дома: поезжайте по шоссе 167
на юг до городка Пюиолап. Сверните на аллею Сауз-Хилл, а дальше 4,5 мили вверх по холму. Поверните у продуктового магазина направо, а на следующем перекре- стке — налево. Доехав до дома 714, расположенного на левой стороне улицы,
остановитесь и выходите из автомобиля.
А эвристическое правило может быть таким: найдите наше последнее письмо. Езжайте в город, указанный на конвер- те. Оказавшись в этом городе, спросите кого-нибудь, где находится наш дом. Все нас знают — кто-нибудь с радос- тью вам поможет. Если никого не встретите, позвоните нам из телефона-автомата, и мы за вами приедем.
Различия между алгоритмом и эвристикой тонки, и в чем-то эти два понятия пе- рекрываются. В этой книге основным различием между ними я буду считать сте- пень косвенности решения. Алгоритм предоставляет вам сами команды. Эвристика сообщает вам, как обнаружить команды самостоятельно или по крайней мере где их искать.
Наличие директив, точно определяющих способ решения проблем программи- рования, непременно сделало бы программирование более легким, а результаты более предсказуемыми. Но наука программирования еще не продвинулась так далеко, а может, этого никогда и не случится. Самая сложная часть программиро- вания — концептуализация проблемы, и многие ошибки программирования яв- ляются концептуальными. С концептуальной точки зрения каждая программа уникальна, поэтому трудно или даже невозможно разработать общий набор ди- ректив, приводящих к решению во всех случаях. Так что
знание общего подхода к проблемам не менее, а то и более ценно, чем знание точных решений конкрет- ных проблем.
Как использовать метафоры, характеризующие разработку ПО? Используйте так,
чтобы лучше разобраться в проблемах и процессах программирования, чтобы они помогали вам размышлять о выполняемых действиях и придумывать лучшие ре- шения задач. Конечно, вы не сможете взглянуть на строку кода и сказать, что она противоречит одной из метафор, описываемых в этой главе. Но со временем тот,
кто использует метафоры, лучше поймет программирование и будет быстрее со- здавать более эффективный код, чем тот, кто их не использует.
Перекрестная ссылка Об ис- пользовании эвристики при проектировании ПО см. подраз- дел «Проектирование — эври- стический процесс» раздела 5.1.
1 2
ЧАСТЬ I Основы разработки ПО
2.3. Популярные метафоры,
характеризующие разработку ПО
Множество метафор, описывающих разработку ПО, смутит кого угодно. Дэвид Грайс утверждает, что написание ПО — это наука (Gries, 1981). Дональд Кнут считает это искусством (Knuth, 1998). Уоттс Хамфри говорит, что это процесс (Humphrey, 1989).
Ф. Дж. Плоджер и Кент Бек утверждают, что разработка ПО похожа на управле- ние автомобилем, однако приходят к почти противоположным выводам (Plauger,
1993, Beck, 2000). Алистер Кокберн сравнивает разработку ПО с игрой (Cockburn,
2002), Эрик Реймонд — с базаром (Raymond, 2000), Энди Хант (Andy Hunt) и Дэйв
Томас (Dave Thomas) — с работой садовника, Пол Хекель — со съемкой фильма
«Белоснежка и семь гномов» (Heckel, 1994). Фред Брукс упоминает фермерство,
охоту на оборотней и динозавров, завязших в смоляной яме (Brooks, 1995). Ка- кие метафоры самые лучшие?
Литературная метафора: написание кода
Самая примитивная метафора, описывающая разработку ПО, берет начало в вы- ражении «написание кода». Согласно литературной метафоре разработка програм- мы похожа на написание письма: вы садитесь за стол, берете бумагу, перо и пи- шете письмо с начала до конца. Это не требует никакого формального планиро- вания, а мысли, выражаемые в письме, формулируются автором по ходу дела.
На этой метафоре основаны и многие другие идеи. Джон Бентли (Jon Bentley)
говорит, что программист должен быть способен сесть у камина со стаканом брен- ди, хорошей сигарой, охотничьей собакой у ног и «сформулировать программу»
подобно тому, как писатели создают романы. Брайан Керниган и Ф. Дж. Плоджер назвали свою книгу о стиле программирования «The Elements of Programming Style»
(Kernighan and Plauger, 1978), обыгрывая название книги о литературном стиле
«The Elements of Style» (Strunk and White, 2000). Программисты часто говорят об
«удобочитаемости программы».
Индивидуальную работу над небольшими проектами метафора написа- ния письма характеризует довольно точно, но в целом она описывает разработку ПО неполно и неадекватно. Письма и романы обычно принад- лежат перу одного человека, тогда как над программами обычно работают группы людей с разными сферами ответственности. Закончив писать письмо, вы запечаты- ваете его в конверт и отправляете. С этого момента изменить вы его не можете, и письмо во всех отношениях является завершенным. Изменить ПО не так уж трудно,
и вряд ли работу над ним можно когда-нибудь признать законченной. Из общего объема работы над типичной программной системой две трети обычно выполня- ются после выпуска первой версии программы, а иногда эта цифра достигает целых
90 % (Pigoski, 1997). В литературе поощряется оригинальность. При конструирова- нии ПО оригинальный подход часто оказывается менее эффективным, чем повтор- ное использование идей, кода и тестов из предыдущих проектов. Словом, процесс разработки ПО, соответствующий литературной метафоре, является слишком про- стым и жестким, чтобы быть полезным.
ГЛАВА 2 Метафоры, позволяющие лучше понять разработку ПО
13
К сожалению, литературная метафора была увековечена в одной из самых попу- лярных книг по разработке ПО — книге Фреда Брукса «The Mythical Man-Month»
(«Мифический человеко-месяц») (Brooks, 1995). Брукс пишет: «Планируйте вы- бросить первый экземпляр программы: вам в любом случае придется это сделать».
Перед глазами невольно возникает образ мусорного ведра, полного черновиков
(рис. 2-1).
Рис. 2-1. Литературная метафора наводит на мысль, что процесс
разработки ПО основан на дорогостоящем методе проб и ошибок,
а не на тщательном планировании и проектировании
Подобный подход может быть практичным, если вы пише- те банальное письмо своей тетушке. Однако расширение метафоры «написания» ПО вплоть до выбрасывания первого экземпляра программы — не лучший совет в мире разработ- ки ПО, где крупная система по стоимости уже сравнялась с
10-этажным офисным зданием или океанским лайнером.
Конечно, это не имело бы значения, если б вы имели бес- конечные запасы времени и средств. Однако реальные ус- ловия таковы, что разработчики должны создавать програм- мы с первого раза или хотя бы минимизировать объем до- полнительных расходов в случае неудач. Другие метафоры лучше иллюстрируют достижение таких целей.
Сельскохозяйственная метафора: выращивание системы
Некоторые разработчики заявляют, что создание ПО следует рассматривать по аналогии с выращиванием сельскохозяйственных культур. Вы проектируете от- дельный блок, кодируете его, тестируете и добавляете в систему, чуть расширяя с каждым разом ее функциональность. Такое разбиение задачи на множество не- больших действий позволяет минимизировать проблемы, с которыми можно стол- кнуться на каждом этапе.
Иногда хороший метод описывается плохой метафорой. В таких случа- ях попытайтесь сохранить метод и обнаружить лучшую метафору. В дан- ном случае инкрементный подход полезен, но сельскохозяйственная метафора просто ужасна.
Планируйте выбросить первый экземпляр программы: вам в лю- бом случае придется это сделать.
Фред Брукc
Если вы планируете выбросить первый экземпляр программы,
вы выбросите и второй.
Крейг Зеруни (Craig Zerouni)
1 4
ЧАСТЬ I Основы разработки ПО
Возможно, идея выполнения небольшого объема работы зараз и напоминает рост растений, но сельскохозяйствен- ная аналогия неубедительна и неинформативна, к тому же ее легко заменить лучшими метафорами, которые описаны ниже. Сельскохозяйственную метафору трудно расширить за пределы идеи выполнения чего-либо небольшими час- тями. Ее приверженцы (рис. 2-2) рискуют в итоге заговорить об удобрении плана системы, прореживании детального проекта, повышении урожайности кода путем оптимизации землеустройства и уборке урожая самого кода. Вы начнете говорить о чередовании посевов C++ и о том, что было бы неплохо оставить систему под паром для повышения концент- рации азота на жестком диске.
Слабость данной метафоры заключается в предположении, что у вас нет прямого контроля над развитием ПО. Вы просто сеете семена кода весной и, если на то будет воля Великой Тыквы, осенью получите невиданный урожай кода.
Рис. 2-2. Нелегко адекватно расширить сельскохозяйственную метафору
на область разработки ПО
Метафора жемчужины: медленное приращение системы
Иногда, говоря о выращивании ПО, на самом деле имеют в виду приращение, или аккрецию (accretion). Две этих метафоры тесно связаны, но вторая более убеди- тельна. Приращение характеризует процесс формирования жемчужины за счет отложения небольших объемов карбоната кальция. В геологии и юриспруденции под аккрецией понимают увеличение территории суши посредством отложения содержащихся в воде пород.
Это не значит, что вы должны освоить создание кода из оса- дочных пород; это означает, что вы должны научиться добав- лять в программные системы по небольшому фрагменту за раз. Другими словами, которые в связи с этим приходят на ум, являются термины «инкрементный», «итеративный», «адап- тивный» и «эволюционный». Инкрементное проектирование, конструирование и тестирование — одни из самых эффективных концепций разработки ПО.
При инкрементной разработке вы сначала создаете самую простую версию систе- мы, которую можно было бы запустить. Она может не принимать реальных дан- ных, может не выполнять над ними реальных действий, может не генерировать реальные результаты — она должна быть просто скелетом, достаточно крепким,
Дополнительные сведения О дру- гой сельскохозяйственной мета- форе, употребляемой в контекс- те сопровождения ПО, см. гла- ву «On the Origins of Designer
Intuition» книги «Rethinking Sys- tems Analysis and Design» (Wein- berg, 1988).
Перекрестная ссылка О приме- нении инкрементных стратегий при интеграции системы см.
раздел 29.2.