Аннотация: Мы, методологи, проектируем сложные системы, но не принимаем во внимание рабочие характеристики активного компонента этих систем, компонента, который известен своей нелинейностью и изменчивостью - человека. В этой статье вкратце перечислены те теории и проекты, которые мне пришлось изучить, чтобы осознать этот совершенно очевидный факт, а также определить, какие качества человеческой психики должны учитываться в создании методологии и более общих рекомендациях касающихся процесса разработки. Именно по этим качествам можно делать наиболее верные прогнозы относительно будущего течения проекта и применимости к нему какой-либо методологии. --------------------------------------------- Алистэр Коуберн Люди как нелинейные и наиболее важные компоненты в создании программного обеспечения ( arc@acm.org ) Humans and Technology, Октябрь, 1999 Введение Этот отчет базируется на моем личном опыте, который я приобрел, изучив около 40 проектов за последние 20 лет. Основная идея этой статьи состоит в следующем: методологи разрабатывают сложные системы, у которых есть весьма изменчивые и нелинейные компоненты - люди. При этом им как-то удается вообще не замечать эти компоненты и то воздействие, которое они оказывают на проектируемую систему. После некоторого размышления такое положение дел кажется абсурдным, однако, в нашей отрасли совсем не много исследователей, уделяющих время серьезному изучению влияния человеческого фактора на разработку программного обеспечения. Наиболее заметными исключениями из этого правила являются Джеральд Вайнберг (Gerald Weinberg [Wei]) и Том Демарко (Tom DeMarco [Dm]), чьи книги публикуются сейчас в юбилейных (!) изданиях. Их работы так популярны в нашей отрасли, что, казалось бы, они должны были только повысить интерес к этому предмету и вызвать активизацию исследований в этой области. Сейчас все большее количество консультантов начинает относиться к людям как к главному фактору в разработке ПО [B99] [Hi], однако, в целом, сообщество разработчиков программного обеспечения продолжает игнорировать тот факт, что именно человек должен быть центральной темой исследований. Это представляется мне серьезным упущением - все равно, что не принимать во внимание металлические перекрытия в стенах и жаловаться на плохую работу радиоприемника. Раньше и я рассматривал людей, участвующих в проектах, как какой-то второстепенный фактор. Это продолжалось до тех пор, пока после нескольких лет работы исследователем и методологом, я не заметил, что мои рекомендации как методолога не соответствуют моему же собственному опыту в разработке ПО. Проблема была не в том, что делали мои разработчики (они справлялись с работой весьма успешно). Проблема была в другом: то, что я писал, не соответствовало тому, что мы делали. В течение последних пяти лет я мучительно пытался определить (мне трудно это сделать даже сейчас) "что же находится у меня перед глазами". Постепенно мне стало ясно, что в моем (да и любом другом) методологическом уравнении не хватает одной переменной - влияния на методологию такого понятия как "человек". Теперь, когда я начал учитывать этот параметр, мои методологические прогнозы и выводы стали соответствовать тому, что я вижу в реальной жизни. Теперь я считаю, что люди - это главный , первоочередной двигатель проекта. Чем же это отличается от того, что писали в "Peopleware" Демарко и Листер (Lister)? Они высказали мнение, что люди представляют собой важный фактор, и указали на некоторую специфику вопроса. Меня же интересует то, как групповые и индивидуальные особенности человека влияют на проектирование способов разработки ПО (иными словами, на методологии), в применении к различным группам, работающим над разными видами задач. Мои идеи весьма сходны с теми, которые излагал Вайнберг в главе "Teaming" ("Работа в команде") своей книги "The Psychology of Computer Programming" ("Психология программирования"). Особенно все то, что касается противопоставления двух стилей руководства - управления задачами (task management) и управления поддержкой (maintenance management). Это весьма близко к тому, что пытаюсь получить я - некие характеристики и рекомендации, которые из них следуют. Вайнберг основывается на тех проектах, которые он исследовал в 60-е годы. Однако его выводы остаются справедливыми и полезными и сейчас, 30 лет спустя, что еще раз подтверждает стабильность и важность человеческого фактора в разработке ПО. Мне кажется, уже наступило время тщательно изучить подобные факторы, и начать относиться к следующим из них рекомендациям как к основам разработки ПО, а не открывать их для себя каждые 30 лет. В этой статье я расскажу о той работе, которую проделал, чтобы понять, что именно люди являются главным залогом успеха проекта. В настоящее время для прогнозирования я использую именно человеческий фактор. Я пишу эту статью от первого лица, потому что формальный, академический стиль не очень подходит для описания поисков чего-то совершенно очевидного и при этом не совсем понятного. Лучше всего подать это в виде рассказа от первого лица. Путь ошибок трудных Году эдак в 1987, когда я занимался формальной разработкой программного обеспечения, существовало следующее убеждение: "В разработке ПО проблема заключается в том, что при постановке задачи и проектировании допускается слишком много неточностей. Все будет хорошо , если мы сможем заставить людей работать с математическим формализмом". Однако, поработав немного в этом направлении, я обнаружил, что перед нами стоят: Проблема 1. Людям, занятым в проекте, совершенно неинтересно изучать нашу систему. Проблема 2. Они вполне могут обойтись и без методологов, и при этом успешно создавать программное обеспечение. Я ушел от формальных разработок, в то время как мои коллеги выдвинули новую идею: "Вся проблема - в обучении. Все будет хорошо , если мы дадим разработчикам необходимые математические знания гораздо раньше, еще в средней школе". Однако мое знание людей подсказывало, что такое желание неосуществимо. Не то, чтобы я ставил под сомнения очевидные преимущества формальной разработки ПО, просто я сомневался в нашей способности убедить 10 миллионов человек заняться математикой. Правильно было бы поставить вопрос следующим образом: "При каких обстоятельствах и для чего нужно включать в проект специалиста по формальной разработке?" Я перешел к разработке инструментальных средств, и стал работать настолько этноцентрично, насколько это было возможно. При этом я наблюдал за теми, кто проектировал коммуникационные протоколы и обсуждал с ними, какие проблемы возникают у них во время работы. И мои коллеги, и я пришли к единому выводу: "Вся проблема состоит в том, что люди до сих пор предпочитают рисовать на доске. Все будет хорошо , если мы предоставим в их распоряжение специальный программный инструмент, с помощью которого они смогут рисовать непосредственно в компьютере и видеть, как будут реализовываться их проекты на ранней стадии работы". Мы потратили несколько лет, чтобы разработать специальный генератор, трансформирующий диаграммы последовательности и взаимодействия в архитектуру программного продукта и систему правил [Ci]. Многие компании работали (и работают) над сходными задачами, например, выполняемыми конечными автоматами Хэрела (Harel's executable finite state machines) [Ha]. Итак, проработав над этим проектом несколько лет, мы сделали прототип, и решили показать его группе наших потенциальных пользователей. Как же мы были поражены, услышав следующее: "Нет, спасибо. Нам больше нравится рисовать на доске, да и не хочется тратить время на то, чтобы заносить все эти рисунки в компьютер. Хотя… мы бы, наверное, взяли из всего вашего набора средств графический редактор". Как оказалось, прочие разработчики подобных программ получали похожие отзывы. Обычно пользователи соглашались, в конце концов, использовать "только графический редактор". Другими словами, перед нами стояли: Проблема 1. Людям, занятым в проекте, совершенно неинтересно изучать нашу систему. Проблема 2. Они вполне могут обойтись и без нас, и при этом успешно создавать программное обеспечение. Такое положение дел уже начинало меня беспокоить, и я стал заниматься методологиями разработки ПО (проектировал объектно-ориентированную методологию по заказу IBM Consulting Group (1992-94)). На этот раз, чтобы не наступать на те же самые грабли, я заранее опросил более дюжины различных компаний, которые работали над ОО проектами в различных странах, и тщательно записал все, что они мне рассказали. Изучая эти заметки, я сделал несколько интересных выводов: Те команды, которые успешно работают над своими проектами, используют инкрементные процессы разработки [Co95] При проектировании любая техника, сложнее "CRC-карточек" [B87] считается слишком сложной и не используется [Co94]. У тех, кто занимается проектированием, всегда есть возможность отказаться от любого программного продукта или техники, которые им не нравятся. Достаточно сказать начальнику: "Это замедляет работу. Если я буду этим пользоваться, то не уложусь в срок", и он разрешит проектировщикам поступать по собственному усмотрению. В то время это наблюдение не казалось мне особенно важным, но, тем не менее, я его записал и назвал "проектным ограничением" методологии. После этого я разработал весьма привлекательную и, как мне казалось, настолько не формальную, насколько это возможно, методологию и опробовал ее на одном из проектов. Наш опыт описан в документации по проекту Winifred [Co98]. Основной идеей техники проектирования, которую я рекомендовал к использованию, и которой я обучал разработчиков, были CRC-карточки. Несколько месяцев спустя, я решил, что теперь пора побыть не консультантом, а этнографом, и стал наблюдать за тем, как ведет себя моя команда разработчиков. То, что я увидел, потрясло меня: Рабочий процесс, который использовала моя команда, был настолько сложным и запутанным, что едва ли его вообще можно было описать. Впрочем, даже если бы мне удалось это сделать, никто бы не смог его повторить [Co98p]. Мою методологию этот процесс напоминал только весьма и весьма отдаленным образом. Ни один из тех двух дюжин проектировщиков, которых я обучил своей методологии, не использовал CRC-карточки. Другими словами, хотя я и использовал свой "этнографический подход", все равно передо мной стояли: Проблема 1. Людям, занятым в проекте, совершенно неинтересно изучать нашу систему. Проблема 2. Они вполне могут обойтись и без нас, и при этом успешно создавать программное обеспечение. Такой процесс повторялся еще несколько раз, и я окончательно разуверился в своей способности "видеть то, что происходит на самом деле". Я мог сказать лишь, что в разработке проекта есть какой-то очень важный аспект, который мы никак не можем вычислить. Не так давно я попробовал решить эту проблему, работая в паре с этнографом. Мне нужна была помощь просто для того, чтобы дать название происходящему [Ho]. Вообще, консультанту хорошо работать вместе с этнографом, однако на этот раз мы едва ли смогли начать работу. Проблема была очень простая и непреодолимая: невозможно сказать, что ты видишь, до тех пор, пока у тебя нет для этого подходящего названия. Было очевидно, что нашему словарю не хватает адекватных понятий. На сегодняшний день мой послужной список складывается из участия, детального опроса или изучения документации более трех дюжин проектов (отдельные их аспекты я обобщил в Таблице 1). Таблица 1. Проекты и методологии, которые я изучал. Информацию в таблице, разумеется, приходится давать в сокращенном виде. Здесь я указываю год, рабочее название проектов и краткое замечание о каждом из них. Некоторые из проектов описаны в другой литературе. Ссылки на источники указаны в квадратных скобках. 1980 . "CT5". Успешно завершен. 26 человек, 3 года (на год позже, чем нужно), имел для компании решающее значение. Изучен в процессе стажировки, четко определенный макропроцесс, микропроцесс отсутствует. 1986 . Проекты "Cleanroom" [Mi]. Успешно завершены. Федеральный сектор IBM, большие команды разработчиков. Неоднократный успех при использовании тяжеловесной методологии, требующей большой дисциплины. 1986 . Проекты "Sherr" [Br] Успешно завершены. Процесс можно описать следующим образом: "сделай так, что все заработало, но не работай сверхурочно". Основной упор на нестандартные креативные решения, процесс не определен. 1980 . "Broooklyn Union Gas" [Co98]. Успешно завершен. Новая ОО технология, 150 человек, проект для решения критически важных задач. 1992 . "Tracy" [Co98]. Провал. Небольшая команда разработчиков слепо следовала методологии, согласно которой нужно было "моделировать мир, а потом превратить модель в программный код". Был доступ только к случайным пользователям и необученному персоналу. 1992 . "BlackKnight". Успешно завершен. Небольшая команда разработчиков, успешно сочетающая использование пояснительных заметок и активное общение 1992 . "Manfred" [Co98]. Провал. Небольшая команда разработчиков, хромает дисциплина, облегченная методология. "Это мы разработаем потом", провал работы из-за постоянного создания прототипа. 1992 . "CSPITF". Успешно завершен. Небольшая команда разработчиков тщательно контролировала итерации. Облегченный процесс, все сидят рядом. Успешная совместная работа руководителя технического процесса и руководителя проекта. Технический руководитель остался, чтобы реструктурировать внутреннюю структуру кода для следующей команды. 1992 . "OTI" [Co98]. Успешно завершен. Маленькие команды разработчиков. "Дайте хорошему работнику хороший инструмент и оставьте его в покое". Неоднократный успех при работе с облегченной методологией, ориентированной на человека. 1993 . "Reginald" [Co98]. Провал. Команда из двух разработчиков выросла до трех команд в двух разных графствах. Одна из этих команд слепо следовала тяжеловесной методологии с обилием документации, и так и не написала ни строчки кода до закрытия проекта. 1993 . "Ingrid" [Co98]. Успешно завершен. 26 человек, 2 года. Инкрементный макро процесс, микро процесс отсутствует. Первый инкремент потерпел неудачу. Заменили всех программистов, с течением времени выработали облегченную методологию, с упором на коммуникации. 1993 . "Synon in NZ". Успешно завершен. Руководитель проекта утверждал, что успех был обеспечен тем, что "четыре человека работали в одной комнате и использовали быстрый итеративный инструментарий", и что это не подходит таким проектам, где разработчики не могут свободно общаться между собой. 1994 . "Udall" [Co98]. Успешно завершен. Поначалу работала большая команда разработчиков, и потерпела неудачу. Успех обусловлен тем, что "начали с нуля и сделали из плохой большой команды маленькую, но хорошую". 1995 . "Winifred" [Co98]. Успешно завершен. 45 человек, 20 месяцев. Успех обеспечили "инкрементность разработки, хорошо поставленная коммуникация и несколько очень хороших работников". Использовался макро процесс, микро процесс отсутствовал. Успешное применение средней по весу методологии, ориентированной на коммуникацию. 1996 . "Reel". Провал. 150 человек, которым было велено обновлять всю документацию при каждом изменении в проекте. Проект закрыт. Один из участников разработки подвел итог: "Сколько не старайся, плохая методика все равно даст плохой результат". 1997 . "Caliper". Провал. 90 человек, проект имел для компании решающее значение. Прошло уже шесть лет, но даже первая основная версия проекта до сих пор не сдана. Слишком смелые ожидания, новые технологии, отсутствие инкрементной разработки, на всех позициях персонал, не обладающий адекватными рабочими навыками. 1997 . "NorgesBank". Опрошено шесть команд разработчиков. Все повторяют приблизительно одно и то же: "Успех обеспечен хорошей коммуникацией, как в самой команде разработчиков, так и между разработчиками и пользователями". 1998 . "C3" [C3]. Успешно завершен. После первого провала 26 человек решили заменить восьмью. Extreme Programming [EP]. Успешное применение в небольшой команде методологии, требующей высокой дисциплинированности от сотрудников. Основной упор - коммуникация. 1998 . "NB Banking". Успешно завершен. Проект, изначально рассчитанный на трех человек и два месяца работы, неожиданно вырос до 10 человек, которые проработали 14 месяцев. Связь при помощи видео. Не понравилась. Макро процесс, микро процесс отсутствовал. Успеха удалось достичь при помощи "инкрементных разработок, правильно подобранных людей и хорошей коммуникации". 1998 . "M.A.D". [Ch]. Успешно завершен. Небольшая команда разработчиков занималась изучением окружения конечных пользователей и использовала прототипы. Удачное использование методологии, основывающейся на создании прототипов и коммуникации. 1998 . "Insman". Успешно завершен. В команде шесть человек, использовалась методология "Crystal(Clear)" [Co00]. Успеха удалось достичь благодаря особому упору на "тесном общении, моральном духе команды, итерациях длиной в три месяца и обучении разработчиков". 1999 . "Cinch". Продолжается в настоящее время. 40 человек работают вместе, однако при этом еще требуются формальные сдачи работ. Все осознают цену написания документации, однако пока не могут перейти на более индивидуальный подход (непонятно почему - из-за личных качеств, по привычке или же в этом виновата культура?). 1999 . "Hill AFB TSP1" [Web]. Успешно завершен. Семь человек, CMM 5-го уровня, используется PSP/TSP. Небольшая команда успешно использовала ориентированную на процесс методологию, в которой требовалось соблюдение строгой дисциплины. Что меня удивило во всех этих проектах? То, что они ясно свидетельствуют о следующем: Практически любую методологию можно с успехом применять в каком-нибудь проекте. Любая методология может привести к провалу проекта. Тяжеловесные методологии тоже могут успешно применяться в работе. Облегченные методологии чаще приводят к успеху, и, что более важно, разработчики сами говорят, что успех проекта был обеспечен именно методологией. Я не нашел ни одной теории, которая объяснила бы, почему облегченные методологии (те, в которых мало места уделяется всяческим формальностям), чаще приводят к успешному завершению проекта, нежели тяжелые методологии, где формальности играют очень большую роль (случайные исключения в нашем списке составляют только Cleanroom и PSP/TSP). Конечно, плохой руководитель - весьма существенный фактор, который сильно влияет на весь ход работ, однако его нельзя отнести к методологии. Впрочем, даже если учитывать и качество руководства проектом, все равно достоверных прогнозов не получится. И тут я наконец-то понял, что прямо перед нами всегда находится нечто, чего мы не замечаем: люди. Именно человеческие качества обеспечивают успех тому или иному проекту, именно они являются фактором первостепенной важности, основываясь на котором надо строить прогнозы о проекте. Теперь я рассматриваю все в обратном порядке - сначала люди, а потом методология, как второстепенный показатель. Весь мой опыт консультанта можно было бы описать, исходя всего лишь из нескольких свойств человеческой натуры. Теперь, применяя свои знания на практике, я могу гораздо лучше прогнозировать развитие проектов и давать гораздо более полезные рекомендации. Мне кажется, пришло время официально признать, что главным в исследованиях должен быть вопрос: "Какими качествами обладают люди, которые занимаются разработкой программного обеспечения, и какое влияние они оказывают на проектирование методологии?" Четыре основных свойства Люди - устройства активные, и у них есть режимы успешной работы и режимы сбоя. Вот несколько основных таких режимов, которые я определил, и которыми пользуюсь и по сей день: Человек - существо, которому необходимо общение. Причем общаться он предпочитает в режиме непосредственного диалога, лично, по типу "вопрос-ответ". Человеку трудно постоянно работать сверхурочно. Человек - существо изменчивое, он меняется в зависимости и от времени, и от пространства. Как правило, у человека есть чувство гражданского долга, он может хорошо ориентироваться в ситуации, брать инициативу в свои руки и делать "все, что необходимо" для того, чтобы проект завершился успешно. Есть и ряд других характеристик, которые я не буду описывать здесь подробно: Человеку нужно время, как на размышление, так и на общение (см. [Co98], [Cs], [Dm]). Человек хорошо работает, опираясь на примеры (этот тезис требует дальнейшего изучения, см. [J-L]). Человек предпочитает скорее потерпеть неудачу из-за своего консерватизма, нежели рискнуть, но сделать что-то необычным образом [Pi]; ему больше нравиться изобретать, а не находить готовые решения, он может одновременно держать в голове совсем немного сведений, он делает ошибки и с трудом меняет привычки. Отдельная личность может легко возобладать над проектом. Способность человека выполнять те или иные задания в большей степени определяется его личными качествами. Человек - существо общительное Основным фактором в разработке программного обеспечения является возможность коммуникации. На рисунке 1 изображена некая кривая, с помощью которой я иллюстрирую свои методологические рассуждения. На этом рисунке видно, как падает эффективность коммуникации, если исчезает ее модальность и синхронизация. Этой теме посвящено несколько исследований (см. [Pl] и [Si]), кроме того, эту же зависимость подтверждает и Вайнберг, который описывал проекты около 30 лет назад [Wei]. Самым эффективным видом коммуникации является непосредственное, личное общение (например, когда вы обсуждаете что-либо и рисуете при этом на доске). Если мы будем убирать одно за другим все свойства общения, присущие двум людям, рисующим у доски, мы увидим, как падает эффективность коммуникации. Убирать мы будем следующие свойства: Физическая досягаемость. Я не знаю, как это объяснить, но физическая досягаемость собеседников влияет на их общение. Что бы ни лежало в основе этого влияния - трехмерность, синхронизация, запах или малозаметные визуальные сигналы - при коммуникации это имеет большое значение. Разнообразные модальности. Человек общается не только словами, но и при помощи жестов. Часто человек может высказать свое суждение жестикуляцией, например, поднимая бровь или указывая на что-то пальцем. Интонация и синхронизация речи. Чтобы подчеркнуть важность какого-либо высказывания или, к примеру, свое удивление, говорящий может ускорять или замедлять темп речи, делать паузы или изменять интонацию. Ведение диалога в реальном времени (вопрос-ответ). С помощью вопросов слушающий выясняет для себя то, что ему было неясно в речи собеседника или же получает дополнительные сведения, которых ему не хватает для полного понимания предмета. Синхронизация вопросов и ответов является основополагающим определением типа коммуникации. Рисунок 1. Виды коммуникации Итак, что же произойдет, если мы начнем убирать одно за другим все эти свойства? Убираем только физическую досягаемость. Поместим собеседников на противоположные концы видеосвязи. В принципе, при этом сохраняются все основные свойства физического присутствия, и тем не менее, эффект уже не тот. Когда мы испробовали этот способ в Норвегии, где одна часть команды разработчиков находилась в Осло, а другая - в Лиллехаммере, то оказалось, что команда находила верные проектные решения, только когда всем удавалось собраться вместе. Даже то время, которое люди тратили, чтобы вместе дойти до электрички, было более продуктивно для работы, нежели видеоконференция. Убираем жестикуляцию и визуальную синхронизацию, оставляем интонацию и вокальную синхронизацию (другими словами, используем для общения телефон). Большинство людей во время беседы по телефону рисуют . Если человек рисует линию, которая соединяет два прямоугольника, это значит, что он собирается сказать нечто важное, то, что нужно отметить особо. Визуально-слуховая синхронизация информации закрепляет в сознании человека ее суть. Когда люди говорят по телефону, эта синхронизация исчезает, а вместе с ней из коммуникации исчезают жестикуляция, выражение лица собеседника, и т.д. Теперь уберем голосовую синхронизацию и интонацию, оставим лишь возможность задавать вопросы (электронная почта). Без голосовой синхронизации мы не можем ни сделать эффектную паузу, ни подождать, не будет ли у собеседника возражений или вопросов, ни ускорить или замедлить темп речи, чтобы сделать высказывание. Лишив себя возможности использовать интонацию, человек не может выразить с ее помощью насколько удивительна, скучна или очевидна выраженная в письме идея. Теперь уберем возможность задавать вопросы (но восстановим один из перечисленных выше факторов). Не имея возможности услышать вопросы собеседника, говорящий должен сам догадываться, что тот знает или не знает, какие вопросы мог бы задать и включить в свою речь ответы на эти несуществующие вопросы. И все это он должен сделать, не имея обратной связи со своим слушателем. Этот вид коммуникации допускает наличие визуальной (видеокассета) или слуховой (аудиокассета) информации. И, наконец, убираем все свойства коммуникации - визуальные, слуховые, голосовые, синхронизацию общения, возможность задавать вопросы - что же мы получаем? Правильно, бумажную документацию. На приведенной выше модели вы видите, что документация является наименее эффективным способом коммуникации из всех возможных. Тот, кто пишет документацию, должен строить догадки относительно своей аудитории безо всякой обратной связи, у него нет возможности использовать ни синхронизацию и другие эмфатические сигналы, ни жестикуляцию и интонацию. Но если построенная нами модель справедлива, то с ее помощью можно понять, как улучшить условия работы. И это вполне реально. Более того, существует множество сложных проектов, которые весьма успешно применяют высказанные нами здесь идеи на практике. "Посадите всех разработчиков в одной комнате". "Мне не нужно больше четырех человек, иначе мы не поместимся в одну комнату и не сможем общаться". Вот стандартные рекомендации, которые дают руководители успешных проектов. Такие руководители планируют работу, базируясь на самом эффективном виде коммуникации - непосредственном общении между людьми. "Убедитесь, что во всем здании хватает досок для рисования и уголков, где можно попить кофе". Такие компании, как Hewlett-Packard и IBM давно поняли всю эффективность неформального общения, и сейчас в нашей индустрии стало обычным положение, что наиболее эффективное окружение для проектирования разработки ПО можно создать специально поощряя и разрешая собрания небольших групп разработчиков. Вайнберг зафиксировал особые случаи, когда неформальные беседы разработчиков оказывали значительный эффект на общую результативность работы всей группы [Wei]. Нередко удачные решения приходят, когда люди "просто беседуют". Сейчас существует три сравнительно новых методологии, где одно из основных положений - размещение всех разработчиков в одной комнате или просто в непосредственной близости друг от друга. Это Adaptive Software Engineering [Hi], Extreme Programming [B99], [EP], и Crystal(Clear) [Co00]). Модель коммуникации, которую мы рассмотрели выше, позволяет, кроме всего прочего, давать рекомендации по архивированию документации: Пусть человек, занимавшийся проектированием, коротко (5-20 минут) расскажет нескольким коллегам, не знакомым с его разработками, о том, что он сделал. Эти люди выступят в роли тех зрителей, которые будут смотреть будущую запись на видеокассете. Пусть они просто обсуждают предложенный вариант проектирования и задают вопросы по мере необходимости. Обсуждение записывайте на видео. В конце воспроизведите те рисунки и примеры, вокруг которых велась дискуссия, или же приложите к видеозаписи те рисунки, которые использовались при проектировании. Они будут служить мнемонической связкой между самим обсуждением и его предметом. Я очень обрадовался, когда Лизетт Веласкес (Lizette Velasquez) из "Lucent Technologies" рассказала мне, что она не только с успехом использует эту технику в работе, но что я забыл упомянуть еще один немаловажный момент: очень важно особо отмечать те места обсуждения, когда "происходило нечто интересное". Обычно обсуждение протекает довольно спокойно, но случаются моменты, когда какой-то вопрос вызывает целый поток дополнительных вопросов и комментариев. В таком случае, зрители наверняка захотят вернуться и просмотреть это место еще раз. Теперь еще можно размещать подобные обсуждения в сети и снабжать их гиперссылками. А тем, кто до сих пор предпочитает книги всем прочим средствам передачи информации, предложу сделать следующее: возьмите, к примеру, замечательную, но очень трудную книгу Design Patterns. Теперь представьте, что вместо того, чтобы разбирать значение паттерна "Decorator" с книжной страницы, у вас есть возможность щелкнуть мышкой и увидеть видеоклип, в котором авторы сами объясняют этот паттерн. Конечно же, в этом случае для передачи своих идей они будут использовать интонацию, жестикуляцию и синхронизацию общения. Какой же вывод нужно сделать относительно этого свойства человеческой природы? Мы должны стараться поднять коммуникацию в команде разработчиков на максимально высокую точку нашей кривой - настолько, насколько это позволяют обстоятельства. Люди непостоянны Когда речь идет о людях, говорить о режимах сбоя нужно осторожно. У англичан есть старинная пословица: "Если ты дашь собаке плохое имя, то лучше ее сразу пристрелить". В самом деле, как вы увидите из приведенных ниже примеров, простые изменения в стиле управления и местной культуре могут привести к огромным изменениям видимого поведения людей. И все же, весь мой опыт говорит о том, что ожидать от людей последовательности и постоянства действий практически невозможно. Как пишет Джим Хайсмит (Jim Highsmith) [Hi]: "…в этой коробочке не винтики и шестеренки, а люди. Люди могут делать постоянно, раз за разом, похожие вещи, но они никогда не смогут сделать одно и то же. В пошаговой методологии мы ожидаем, что, задавая одинаковые данные на входе, мы будем получать одинаковые результаты на выходе. Однако реакция человека на вводную информацию может зависеть от различных условий, причем большая часть этих условий может не иметь никакого отношения к выполняемой этим человеком задаче". Людям нравится отсутствие точных предписаний относительно их собственного поведения. Одна из двух самых трудных для человека задач, которые я могу себе представить - это заставить человека делать что-то очень аккуратно и единообразно день за днем (другой самой трудной задачей будет попросить его изменить свои привычки). Ниже я привожу выдержку из недавно услышанного диалога, которая как нельзя лучше иллюстрирует эту мысль. "Как же мне справиться со всеми этими бумагами, которые приходят в мой офис?" - спрашивает один. Другой отвечает: "Ну, это совсем не сложно! Просто следи, чтобы твой стол всегда был пустым - четыре корзины по углам, несколько папок в верхнем ящике…". Он не смог закончить. "Чтобы стол был пустым?!" - закричали все. "Но ведь это невозможно!" Обратите внимание, что советчик предложил им одновременно изменить свои привычки, а также совершать определенное действие постоянно и единообразно. Если бы люди обладали последовательностью и постоянством, они могли бы убирать бумаги с рабочего стола, предотвращать кариес, избавляться от лишнего веса, бросать курить, и может быть, даже разрабатывать программное обеспечение, укладываясь в рабочий график. Как саркастически заметил Карл Вигерт (Karl Wiegert): "We are not short on practices , we are short on practice " ("нам не хватает практики, а не правил"). И таких правил, действительно, немало. Дэвид Гриз (David Gries) в своей книге "The Science of Programming" ("Наука программирования") дает подробные инструкции по тому, как нужно создавать правильные программы [Gr]. Хорошее средство проектирования представляют собой CRC-карточки [B87]. В методологии под названием "Extreme Programming" [EP], известной своим парным программированием и автоматическим тестированием [Je], тоже используются хорошо известные эффективные методики. Подробно описаны все составляющие методологии "Cleanroom" [Mi]. Уотс Хамфри (Watts Humphrey) дает подробные инструкции программистам, которые хотят работать более эффективно с помощью "Personal Software Process" (PSP) [Hu]. Последовательное и постоянное применение любой из этих методологий замечательно улучшило бы любой проект из тех, которые я видел. Проблема в одном - в словах "постоянный" и "последовательный". Если PSP и Extreme Programming применять лишь время от времени, то они теряют свой смысл. Написанный наполовину код не может быть безошибочным. Точно так же, как и в случае с лишними бумагами на столе, методологию нужно применять полностью, последовательно, изо дня в день. Непоследовательность - обычная причина режима сбоя у человека. Существуют методологии, которые требуют от своих адептов строгой последовательности действий. Такие методологии я называю "высоко дисциплинированными". Как показывают опросы, проводимые в различных проектах, именно такие методологии наиболее уязвимы, однако в некоторых проектах они используются довольно успешно. Вот пример применения методологии PSP в организации с пятым уровнем CMM. Мне он кажется весьма поучительным: [Web]: Летом 1996 года небольшую группу программистов ознакомили с методологией PSP. Несмотря на то, что все были настроены относительно обучения весьма положительно, сразу после его окончания новая методология стала использоваться все меньше и меньше. Вскоре никто из тех, кто специально обучился этой методологии, не использовал ее в работе. Когда этих людей спросили, почему они не используют PSP, ответ был практически один и тот же: "PSP - очень строгая методология, поэтому если никто не требует от меня отчета, мне проще работать по-старому". Чтобы такого не случилось, в методологиях, требующих высокой дисциплины, должны существовать некие регулирующие элементы, которые заставляли бы людей быть более последовательными. В методологии "Cleanroom" есть правило, запрещающее компиляцию, которое подкреплено определенным способом управления. Для Extreme Programming необходим "наставник" ("coach"), который следит за соблюдением всех предписаний этой методологии. В PSP такие функции не были предусмотрены, поэтому неудивительно, что группа разработчиков из нашего примера перестала ей пользоваться - у этой методологии просто не было никакой структуры поддержки. Предполагается, что эти факторы будут предусмотрены в TSP [Web]. Однако, несмотря на все это, существуют люди, которые могут на протяжении длительного времени делать свою работу последовательно и дисциплинированно (это лишний раз показывает, насколько все мы отличаемся друг от друга). Иногда для того, чтобы повлиять на дисциплинированность группы достаточно поменять ее руководителя. Спасибо Трюгве Реенскаугу (Trygve Reenskaug) за историю, которая прекрасно показывает, как стиль управления влияет на личные качества: Недалеко отсюда был маленький галантерейный магазинчик, жуткое место. Товар в беспорядке, продавщицы полируют ногти или болтают по телефону, на покупателей никто не обращает внимания. Вскоре он закрылся, и на том же месте открылся другой магазин. О, тут дела пошли по-другому! Этот магазин был чистый, аккуратный, продавщицы всегда предупредительны… Только вот странное дело - продавщицы ведь были те же самые! На самом деле хорошо известно, что личный стиль руководителя имеет огромное значение. Году в 1997 те, кто работал над проектом Chrysler Comprehensive Compensation [C3] узнали это на собственном опыте. Сначала основными принципами разработки были "думать наперед", "нечеткое, но растяжимое планирование" и "программный код - личное дело разработчика". Затем вся команда перестроилась (главной движущей силой этих перемен был Кент Бек (Kent Beck)), и основными принципами стали "делайте все простым и понятным, потом можно внести необходимые дополнения", "весь код должен быть общедоступным, и любая пара программистов может вносить в него любые изменения". Таким образом, одни и те же люди смогли принять совершенно новые для себя принципы работы и пройти путь от полного беспорядка, отсутствия коммуникации и невыполнения обязательств по поставкам к последовательному применению новой высокодисциплинированной методики и регулярному выполнению обязательств в течение трех лет работы. Чувство гражданского долга и способность ориентироваться в ситуации Проблема человеческого непостоянства относится к так называемому "режиму сбоя", но у человека есть еще и "режимы успешной работы". Вот три их разновидности: как правило, человек имеет чувство гражданского долга, человек предпочитает брать инициативу в свои руки, человек хорошо ориентируется в окружающей обстановке. Когда я провожу опрос по какому-нибудь проекту, я всегда спрашиваю людей, что, по их мнению, привело к конечному успеху работы. Чаще всего я получаю один и тот же ответ: "В ключевой момент разработки несколько человек взяли на себя инициативу и сделали все от них зависящее, чтобы выполнить проект". Вот один из таких типичных ответов, который опубликован NASA в работе "Deorbit flight software lessons learned" ("Уроки, полученные в результате работ над программным обеспечением для увода космических кораблей с орбиты") [NASA]: Возможно, наиболее важным (в долгосрочном плане) фактом являлось то, что в процессе работы над проектом образовалась сплоченная команда разработчиков, способная осуществлять быструю разработку систем GN amp;C. Формирование команды складывалось из поиска новых талантливых людей, их обучения, накопления опыта работы с инструментарием, процессом и методологией, и последующей интеграцией в единый спаянный коллектив. Поработав вместе над проектом целый год, вся команда приобрела хорошие знания в предметной области, а также в методах и средствах разработки. Создание атмосферы дружбы и взаимопомощи среди разработчиков способствовало их взаимному обучению и всячески поощряло его. Готовность членов команды заниматься любым и всеми аспектами проекта многократно оказывалась бесценным подспорьем в работе… (курсив мой, А.К.) …такая команда будет необходима в дальнейшем и данному отделу, и всему агентству". Что заставило людей вести себя таким образом? Одна из возможных причин - чувство гражданского долга. Может быть, наши проекты чаще заканчивались бы успехом, если бы мы просто старались усилить "чувства общности интересов и гражданского долга" в команде разработчиков. Впрочем, я не хочу сказать, что это основная моя рекомендация, потому что в среднем эти чувства и так хорошо развиты, и плохие руководители не упускают случая, чтобы этим воспользоваться (см, к примеру, "Death March" [Yo]). Эта нехитрая идея указывает на элемент, о котором довольно редко вспоминают при проектировании методологии: "Общность интересов и чувство гражданского долга" должны быть в списке основных идей и параметров разработки проекта, по меньшей мере, наравне с "просмотром кода и тестированием". Я был очень рад узнать, что среди нескольких проектов, с которыми мне пришлось работать в последнее время, есть и такие, у которых эти две идеи выделены как отдельный вид деятельности. У них эти два принципа служат для поддержания каналов для межличностного общения (излишне говорить, что во всех этих проектах основной упор делается на непосредственное, личное общение между разработчиками). Впрочем, я еще не видел, чтобы эти принципы были официально включены в описание какой-либо методологии или рабочего процесса. Второй "режим успешной работы" - это когда люди берут инициативу в свои руки. Этот принцип работает в полном соответствии с двумя другими - чувством гражданского долга и хорошей ориентации в ситуации . Вместе все три приводят к тому, что все считают самой обычной причиной успеха в работе: "в ключевой момент разработки несколько человек взяли на себя инициативу". "Хорошо ориентироваться в текущей ситуации" - фраза довольно неопределенная, но имеющая далеко идущие последствия. Люди, которые занимаются сортировкой документов, часто просто раскладывают все бумаги на маленькие кучки (используя при этом сортировку методом Шелла). Самое удивительное заключается в том, что нередко они не разбирают эти кучки дальше, на отдельные документы. Часто приблизительного знания вполне достаточно, ведь в случае необходимости они всегда могут пролистать ту или другую кучку и найти требуемое (будущие исследования покажут нам, какие мнемонические техники для этого используются). Вот пример уже из области разработки ПО. Мы пытаемся сделать документацию по проекту качественной, обновляем устаревшие версии. Однако, зная, что непостоянство - один из наиболее обычных "режимов сбоя" у человека, можно смело предсказать, что документация все равно не будет обновляться достаточно часто. Что касается меня, то я еще не видел ни одного успешно завершившегося проекта, у которого была бы в порядке документация (за исключением тех случаев, когда код или документация создавались автоматически). Зато видел проект, который потерпел крах именно потому, что разработчикам велели обновлять всю документацию после каждого внесенного изменения. Стоимость разработки при этом настолько выросла, а производительность так упала, что проект пришлось вскоре закрыть. Я спрашивал тех, кто занимается поддержкой системы, как им удается вносить в программу изменения, пользуясь устаревшей документацией. Они отвечают, что "смотрят тут и там", то есть они в любом случае не станут полагаться на документацию. Они будут читать программный код. Теперь я уже знаю, что на способность людей "хорошо ориентироваться в ситуации" вполне можно положиться - и при разработке проекта, и при разработке методологии. Поскольку создавать и поддерживать документацию, которая соответствовала бы текущему положению дел в системе, слишком дорого (особенно учитывая неспособность человека к рутинным действиям), я предложил бы поддерживать документацию на "довольно хорошем" уровне. Иными словами такой, чтобы в ней всегда можно было приблизительно понять, где искать более конкретную информацию. А для остального достаточно будет даже небольших способностей и усердия. Впрочем, "довольно хорошее" состояние документации - невыполнимая задача для большинства проектов (тем не менее, это каким-то образом не играет большой роли, поскольку человек скорее спросит того, кто знает, а не будет рыться в документации). Трюгве Реенскауг рассказал мне как-то еще одну историю. Однажды он предложил систему автоматического проектирования инженеру, который занимался разработкой морских нефтедобывающих платформ. Трюгве предложил, чтобы система автоматически отслеживала все виды работ, которые проводились на любой части платформы, и указывала их показатели. Однако в ответ услышал: "Достаточно будет, чтобы в системе хранились только номера телефонов. Я сам позвоню и узнаю, что было сделано". В методологии я обозначаю это термином "невысокая точность" (low precision) [Co98]. Я прихожу к заключению, что большинство проектов вполне можно вести, руководствуясь (верными) не очень точными описаниями: не очень точную документацию по проекту легче читать, приводить в порядок и обсуждать. Архитектуру системы, изображенную с невысокой степенью точности, легче запомнить; в таблицах с не очень точно описанными требованиями легче расставлять приоритеты и легче оценивать масштабы сделанной работы на ранних стадиях проекта. Выполненная не очень точно проектная документация лучше передает "идею" проекта, после чего читатель может начать "ориентироваться в ситуации". Создание артефактов с низкой степенью точности позволяет снизить стоимость работ за счет сильных качеств человеческой натуры. Для этого нужно делать особый упор на таких свойствах, как "хорошая ориентация" и непосредственная межличностная коммуникация, и стараться не обращать внимания на то, что обновления происходят не так часто, как нужно. Я использую эти принципы с 1994 года, и могу смело рекомендовать их как главный методологический элемент. Все люди разные Одни люди любят составлять списки, а другие - нет. Одни предпочитают работать ночью, другие - днем. Одним нравится устанавливать дэдлайны, другим - нет. Точно так же разнятся и группы людей. В одних культурах всячески приветствуется публичная критика, в других самолюбие людей защищено лучше, и т.д. Методологии, как правило, представляют собой набор правил для координирования работы группы людей, и то, что подходит одному человеку или группе, категорически не подойдет другому. То, что годится для работы в группе, принимающей решения сообща, не годится для культуры, где принято ждать решения босса. Возвращаясь к приведенному выше перечню проектов, хочу отметить, что два примера успешного применения "высокодисциплинированной" методологии наблюдались в проекте для федерального сектора IBM и для Военно-воздушных сил. В области коммерческих разработок я такого не видел. Из этого можно сделать такое предварительное заключение: в государственном и военном секторе экономики есть некие дополнительные факторы, которые обеспечивают успешное применение тяжеловесной методологии. Те немногие опросы, которые я проводил в этих областях, пестрят фразами: "нам бы хотелось работать в более легкой и эффективной манере, но..". далее следуют ссылки либо на стандарты производства ПО для военной индустрии, либо на трудности в контролировании работы субподрядчиков. Интересно было бы узнать, являются ли такие факторы внутренне присущими этим областям или же военная и государственная культуры просто "предпочитают" тяжеловесность в разработках. Сейчас методологии создаются для того, чтобы определять тип поведения и манеру работы целых организаций. Как мы уже говорили выше, организация может просто отказаться от методологии (что часто и происходит). Вариации поведения культур методологу учитывать еще труднее, чем вариации каждодневного поведения отдельных индивидуумов. На сегодняшний день я не знаю ни одной методологии, при создании которой принимались бы во внимание культурные особенности (моя методология - не исключение). Впрочем, я знаю людей, которые учитывают местные культурные особенности при формулировании методологических рекомендаций. И другие Вот еще несколько свойств человеческой натуры, на которые я полагаюсь. Они приводятся здесь кратко, в виде списка: Обучение . Человек обучается с помощью наблюдения и практики. Это когнитивный и социальный принцип, хорошо известный в определенных кругах [La], однако до сих пор не использующийся должным образом при разработке программного обеспечения. Я пытаюсь найти возможность применить этот принцип на практике, но пока не придумал для этого подходящей методологической структуры. Поток . В контексте программных разработок "поток" означает время, отведенное для спокойного эффективного размышления над задачей [Dm], [Cs], [Co98]. Это время должно быть уравновешено временем, отведенным для коммуникаций. Как установить подобный баланс при напряженном процессе работы над проектом - выше моего понимания. Тем не менее, многие особо подчеркивают, что время, отведенное на спокойное размышление, играет заметную роль в конечном успехе проекта. Работа по примерам . Некоторые когнитивные психологи убедительно доказывают, что наш механизм дедукции основан на создании отдельных примеров проблем [J-L]. CRC-карточки и варианты использования (use cases) - два способа разработки программного обеспечения, построенные на примерах. Кстати сказать, те, кто их используют, неоднократно свидетельствуют об их эффективности. Новички часто предпочитают "диаграммы экземпляров" (instance diagrams) правильному объектно-ориентированному проектированию. Впрочем, ими пользуются даже опытные проектировщики. Идея создания документации, основанной на примерах, пока не нашла должного отклика у методологов, и представляет собой тему для дальнейшей работы в этой области. Кинетическое и мульти-сенсорное мышление . CRC-карточки, разыгрывание ролей при анализе и проектировании, рисование на доске, создание прототипов интерфейсов на бумаге, все эти виды деятельности подразумевают, что во время размышлений человек говорит и движется. Пока на эту тему нет исследований, я могу лишь сказать, что в программных разработках можно продуктивно использовать все эти техники. Личные свойства характера . Вы и сами, наверное, не раз видели крайне нелюдимых главных проектировщиков, которые бросают на произвол судьбы свою команду. И, не смотря ни на что, эти прекрасные программисты продолжают занимать должности, которые требуют от человека большой общительности! Нередко мы можем встретить и руководителей проектов, которые не умеют принимать решения. Однако для конечного успеха проекта очень важно, насколько личные качества человека подходят для занимаемой им должности. Эти качества нужно учитывать и с точки зрения профессионального роста человека, однако нередко такие должности являются единственным способом продвижения по служебной лестнице. Поражение из-за консерватизма . Люди предпочитают терпеть поражение, но действовать по-старинке, чем идти на риск ради успеха [Pi]. Это объясняет, почему люди уже столько лет используют в работе метод водопада, несмотря на то, что он уже несколько десятков лет не приносит ничего, кроме проблем, и имеет множество альтернатив в лице спирального, инкрементного и итеративного вида разработок. Изменение привычек . Самая трудная вещь на свете из всего, что я знаю - это заставить человека изменить свои привычки. При этом люди меняют привычки почти спонтанно, если изменить их систему ценностей. За 20 лет работы я видел, как это делали (преднамеренно и сознательно) раза два, и скажу, что это впечатляет. "Маленькие головы" . Даже от опытных проектировщиков постоянно слышишь: "Я могу удерживать в голове только небольшую долю всей информации". Существует несколько способов ведения документации, которые призваны облегчить подобные задачи, однако ни один из них пока не объединяет в себе использование рабочих артефактов, созданных с "невысокой степенью точности", и активную межличностную коммуникацию. Я уверен, что существуют и другие свойства человеческой натуры, которые оказывают сильное влияние на процесс разработки ПО, а также на те рекомендации, которые должны давать мы, методологи. Я описал здесь только те, которые в настоящее время сам использую в работе. Заключение Основные свойства человеческой натуры имеют первостепенное значение для разработки ПО, а не второстепенное, как принято считать. Следовательно, главной задачей наших исследований должно быть изучение влияния человеческого фактора на процесс разработки. Я предлагаю сделать эту тему основной в области программных разработок на ближайшие 20-50 лет. В этой статье я привел несколько характерных особенностей человеческой натуры, которые играют существенную роль при разработке методологии. Во-первых, мы, люди, весьма сильно реагируем на временную синхронизацию и модальности коммуникации. Я считаю, что физическая досягаемость собеседнику и удобство общения имеют здесь решающее значение. Во-вторых, люди непостоянны. Я считаю, что все методологии, требующие от своих последователей строгой дисциплины, будет сложно осуществлять на практике. В-третьих, все люди разные, причем не только в зависимости от времени, но и в зависимости от группы, в которой находятся. Сейчас при разработке методологий культурные различия не учитываются, однако это необходимо исправить в ближайшее время. В-четвертых, люди имеют чувство гражданского долга, хорошо ориентируются в ситуации и берут инициативу в свои руки. Именно из этих качеств и складывается наиболее частая причина успешного завершения работы над проектом: "В ключевой момент разработки несколько человек..". Человеческой непоследовательности противостоят такие положительные качества, как способность к общению и ориентации в текущей ситуации. Я склонен полагать, что в методологии можно с успехом использовать различные артефакты, выполненные с невысокой степенью точности (разработчики будут восполнять пробелы в процессе коммуникации). Это предположение подтверждается архивами уже завершенных проектов (его можно считать верным при условии наличия необходимой квалификации, как у разработчиков, так и у руководителей). В названии статьи я называю людей "компонентами". Именно это принято делать в работах, посвященных проектированию процессов и методологий. Ошибкой в таком подходе является то, что "люди", в отличие от "компонентов" весьма изменчивые и нелинейные, причем каждый человек в случае успеха или неудачи ведет себя уникальным образом. Эти факторы имеют первоочередное значение, ими нельзя пренебрегать. Неспособность создателей процессов и методологий принимать их во внимание приводит, как мы это нередко видим, к разнообразным неожиданностям в реализации проекта. И последнее. Я надеюсь, мне удалось показать, что нам категорически не хватает исследований на эту тему. Может быть теперь, читая статью, которую я написал 30 лет спустя вслед за Вайнбергом, исследователи примут мой вызов. С моей точки зрения, особенно нужны психологические и этнографические исследования, в процессе которых можно будет выявить другие важнейшие факторы, о которых я здесь не упоминаю. Библиография [B87] Beck, K. and Cunningham, W., "A laboratory for teaching object-oriented thinking", Proceedings of the OOPSLA Conference, 1987, ACM Sigplan Oct., 1987, pp.1-7. [B99] Beck, K., Extreme Programming Explained: Embrace Change, Addison Wesley Longman, 1999. [Br] Britcher, R., The Limits of Software, Addison Wesley, 1999. [Ch] Christensen, M., et al. , "The M.A.D. experience: multiperspective application development in evolutionary prototyping", in the ECOOP'98 proceedings, Lecture Notes in Computer Science, Vol. 1445, Goos, G., Hartmanis, J, van Leeuwen, J., eds., 1998, pp. 13-41. [Ci] Citrin, W., Cockburn A., von Kaenel, J., Hauser, R., "Using formalized temporal message-flow diagrams," Software Practice and Experience, 1995. [Co94] Cockburn A., "In search of methodology," Object Magazine, July 1994. [Co95] Cockburn A., "Unraveling incremental development," Object Magazine, Jan. 1995. [Co98] Cockburn A., Surviving Object-Oriented Projects, Addison Wesley, 1998. [Co98p] Cockburn A., Position statement for "Software development and process" panel, ECOOP '98, online at http://members.aol.com/acockburn/papers/Ecoop98panel.htm [Co00]Cockburn A., Crystal(Clear): A human-powered software development methodology for small teams, Addison Wesley, in prep. Online at http://members.aol.com/humansandt/crystal/ clear. [Cs] Csikszentmihalyi, M., Flow: The Psychology of Optimal Experience, Harper Perennial, 1990 [C3] The C3 Team, "Chrysler goes to 'Extremes'", in Distributed Object Computing, October, 1998, pp. 24-28. [Dm] DeMarco, T., Lister, T., Peopleware 2nd Edition, Dorset House, 1999. [EP] Extreme Programming, web notes, start from www.extremeprogramming.com. [Gr] Gries, D, The Science of Programming, Springer Verlag, 1987. [Ha] Harel, D., Politi, M., Modeling Reactive Systems with Statecharts, McGraw-Hill, 1998. [Hi] Highsmith, J., Adaptive Software Development, Dorset House, 1999. [Ho] Hovenden, F., "An ethnographic account of writing use cases on an IT project", Humans and Technology Technical Memo, 1999.10.30, online at http://members.aol.com/humansandt/papers/ethno1.htm. [Hu] Humphrey, W., A Discipline for Softwrae Engineering, Addison Wesley, 1995. [Je] Jeffries, R., "Extreme testing", in Software Testing and Quality Engineering, March/April, 1999, pp. 23-26. [J-L] Johnson-Laird, P. and Byrne, R. Deduction, Lawrence Erlbaum Associates, 1991. [La] Lave, J., Situation Learning: Legitimate Peripheral Participation, Cambridge Press, 1991. [Mi] Mills, H., Dyer, M., Linger, R., "Cleanroom Software Engineering," IEEE Software Vol 2 (1984) No. 9, 19-24. [NASA] JSC38609, "Deorbit flight software lessons learned", NASA Johnson Space Center, Jan 19, 1998 online at [Pi] Piatelli-Palmarini, M., Inevitable Illusions : How Mistakes of Reason Rule Our Minds, Wiley amp; Sons, 1996. [Pl] Plowman, L., "The interfunctionality of talk and text", Computer Support of Cooperative Work, vol. 3, 1995, pp.229-246. [Si] Sillince, J.A., "A model of social, emotional and symbolic aspects of computer-mediated communication within organizations", Computer Support of Cooperative Work vol. 4, 1996, pp. 1-31. [Web] Webb, D., Humphrey, W., "Using TSP on the TaskView Project", in CrossTalk, The Journal of Defense Software Engineering , Feb 1999, pp. 3-10, online at http://www.stsc.hill.af.mil/crosstalk/1999/feb/webb.asp [Wei] Weinberg, J., The Psychology of Computer Programming, Silver Edition, Dorset House, 1998. [Yo] Yourdon, E., Death March Projects, Prentice Hall, 1997.