355 500 произведений, 25 200 авторов.

Электронная библиотека книг » Алистэр Коуберн » Парное программирование: преимущества и недостатки » Текст книги (страница 2)
Парное программирование: преимущества и недостатки
  • Текст добавлен: 7 октября 2016, 18:14

Текст книги "Парное программирование: преимущества и недостатки"


Автор книги: Алистэр Коуберн



сообщить о нарушении

Текущая страница: 2 (всего у книги 3 страниц)

Непрерывность проверки кода

Уже двадцать лет тому назад было установлено, что визуальная проверка кода – это эффективный, с точки зрения стоимости, метод исправления дефектов в программных продуктах. Это подтверждают и эмпирическими исследованиями, однако несмотря на это, большинство программистов не любят проверок и не считают это занятие ни приятным, ни стоящим. В результате о проверках, как правило, забывают (за исключением тех случаев, когда их выполнение требуется официально). Зачастую проверку кода осуществляют неподготовленные к этой задаче программисты.

"Несмотря на положительные результаты исследований в течение более 20 лет, процедура проверки кода очень плохо приживается в индустрии производства программных продуктов. Точных данных у нас нет, однако согласно неформальному обзору USENET-групп, 72 из 90 опрошенных программистов практикуют проверку кода крайне редко, или вообще ей не занимаются."

Идея проверки кода базируется на известном постулате: чем раньше обнаружен дефект, тем проще и дешевле его исправить. Существует много исследований на эту тему, в некоторых даже утверждается, что исправление дефекта будет стоить в десять раз дороже на каждой последующей ступени развития проекта.

Экспоненциальный рост стоимости дефектов легко объяснить. Во время проверки, программист говорит: "У оператора "if", что на 450 строке кода, должен быть оператор "else"." После этого ему понадобится несколько минут, чтобы быстро исправить эту ошибку на своем компьютере. Если же программный продукт уже находится в эксплуатации, то в один прекрасный день раздается звонок разъяренного клиента: "Новый год на носу, а у меня ни одна касса не работает! Я ни-че-го не могу продать! Вы меня разоряете!"

Итак, в первом случае программист имеет дело с ошибкой, на которую ему только что указали. Во втором случае, группа технической поддержки должна потратить время на диагностику проблемы (все кассовые аппараты не работают), затем обратиться к самой системе и определить, где нужно вносить исправления (в какой строке кода не хватает оператора "else"). На этом примере всякий может убедиться – работа группы поддержки, которой надо проанализировать проблему и выявить дефект, стоит гораздо дороже, чем те несколько минут, которые должен затратить программист на исправлении ошибки в своем собственном коде. Если программисты работают парами, то такие проверки кода происходят непрерывно. А непрерыная проверка кода не только опережает спорадические "инспекции" как по качеству, так и по скорости нахождения ошибок, но и не вызывает у программистов отрицательных эмоций.

Посмотрите, как сардонически описывает свой опыт программирования в паре с новичком опытный программист, который в начале был настроен к идее совместной работы весьма скептически. К своему удивлению, этот специалист вдруг обнаруживает, что даже новичок может существенно улучшить качество кода, который он пишет.

Как-то я работал с одним из наименее опытных разработчиков над довольно простой задачей. Честно говоря, я всегда считал себя замечательным специалистом по языку Smalltalk, поэтому был уверен, что просто буду учить молодежь, как надо работать.

Не прошло и нескольких минут, как этот малец задает мне вопрос – почему, дескать, я делаю то, что я делаю. И точно, оказалось, что я уже совершил ошибку! Я исправился. Тогда этот бойкий мальчишка напомнил мне правильное название метода или чего-то там еще, что я писал в тот момент неправильно. Вскоре он уже вовсю указывал мне, что я должен делать дальше, а сам успевал подмечать еще и все ошибки в синтаксисе и форматировании.

[со слов Рона Джеффриза]

И наконец, еще одним преимуществом постоянных проверок кода является то, что с их помощью разработчики узнают новые способы и стили кодирования, особенности языка и лучше представляют себе всю систему.

Непрерывная проверка кода при совместном программировании создает уникальные условия для обучения, поскольку оба программиста постоянно учатся друг у друга. "Проверка кода – это уникальная возможность для обучения: процесс анализа и критики программных артефактов, которые создал кто-то другой, представляет собой замечательный по эффективности способ изучения языков, техники проектирования, предметной области и т.д."

В том же ключе выдержаны и другие высказывания программистов, занимающихся проверкой кода:

Ошибки обнаруживаются сразу, на момент появления, что позволяет экономить даже на компиляции, не говоря уже о прочих экономических выгодах раннего обнаружения и исправления дефектов.

Горазо легче соблюдать стандарты кодирования, если за этим следит сразу две пары глаз.

Команда разработчиков учится общению и совместной работе.

Решение проблем

Было время, когда мы чувствовали, что уже готовы уже все бросить, все, кроме работы «в связке». Когда я был ведущим, я старался описать проблему таким образом, чтобы мой партнер мог как можно лучше вникнуть в ее суть. Затем в бой вступал он и боролся, до тех пор, пока не доходил до мертвой точки… затем у меня появлялась какая-нибудь хорошая идея… и так далее. Наверное, многие назовут этот метод «мозговым штурмом», но у меня остается после него совсем другое ощущение.

[– Дэвид Уагстафф (David Wagstaff), Salt Lake City]

Мы называем описанный Дэвидом Уагстаффом эффект парной эстафетой (pair relaying). Работающие парами программисты часто сообщают о том, что благодаря этому методу могут решать проблемы гораздо быстрее, а также о том, что этот метод отличается от таких процессов как улучшение качества дизайна системы, обнаружение ошибок при наборе или проведение «мозгового штурма». Под словами «Решение проблем» мы понимаем ту ситуацию, когда оба программиста озадачены сбоями в работе программы или же просто не могут решить, как им следует разрабатывать ее дальше.

Во всех интервью и неформальных разговорах программисты отмечали, что в трудной ситуации прилагают к решению проблем максимум своих возможностей, в результате чего обретают новые знания. Они делятся с партнером своими знаниями и энергией (а также устраивают "мозговой штурм"), и таким образом, шаг за шагом приближаются к решению проблемы.

Очень эффективно совмещать технику "мозгового штурма" и парной эстафеты. Один из опытных программистов заметил:

Когда мне приходится снова работать в одиночку после того, как поработал в паре, мне кажется, что у меня отказала часть мозга. Я чувствую, что начинаю терять уверенность в том, что делаю.

Обучение

Партнеры постоянно обмениваются знаниями: от навыков работы с инструментами (вплоть до мышки) до изучения правил языка программирования, определенных способов проектирования и программирования, общего навыка построения дизайна системы.

Обучение протекает в режиме "ученичества". Партнеры-программисты попеременно выполняют роли ученика и учителя. При этом они обмениваются даже навыками и привычками, которые невозможно передать на словах.

Обучение на визуальных примерах и его роль в ученичестве

В этой книге обсуждаются исследования процесса ученичества в разных областях – от портновского дела до профессии сигнальщика во флоте и мясника в современным супермаркете.

У книги есть подзаголовок – "периферийное участие в работе на серьезном уровне", который подчервкивает три основных аспекта ученичества: новичок участвует в работе мастера активно; новичку поручают серьезную, ответственную работу и, наконец, что новичок работает на периферии, постоянно приближаясь к более высокому уровню профессионализма. Поначалу новичкам поручается простая (и не самая важная) часть работы. С течением времени его работа приобретает все более ответственный характер.

Одно из наиболее интересных замечаний по поводу ученичества, которое делают авторы этой книги, заключается в том, что для успешного обучения ученик должен постоянно находиться в поле зрения учителя, поскольку знание передается частично визуально, частично на слух. Авторы книги дают два примера быстрого обучения – у портных и сигнальщиков (в обоих случаях учителя находятся в поле зрения учеников, так чтобы одни могли наблюдать за работой других). Таким образом новичок может видеть и слышать своего учителя и получать от него непосредственные инструкции.

Наибольший интерес для нашей темы представляет пример обучения мясников в супермаркете. Начинающий мясник работает отдельно от профессионалов; ему поручают только самую простую рубку мяса. При этом он не может научиться у старших рубщиков тому, как нужно делать более сложную и тонкую работу, потому что специалисты находятся в другом помещении. Авторы указывают, что эта ситуация – пример невозможности передачи знаний от учителя к ученику.

Нужно ясно осознавать, что в большинстве случаев, рабочие условия программистов больше похожи на условия работы мясников, а не портных или сигнальщиков. Очень трудно построить работу программистов таким образом, чтобы новички работали в непосредственной близости от высококлассных специалистов. Как правило, новички сидят в своем собственном помещении и пишут только простой код. "Спецы" находятся в другой комнате, где они решают сложные задачи и занимаются проектированием. Парное программирование позволяет избавиться от этих недостатков и создать среду, благоприятствующую обучению.

Специалист в пределах слышимости (Expert In Earshot)

В результате работы на семинарах, в которых участвовали 10 руководителей проектов, первый автор этой статьи сформулировал еще один паттерн для руководства проектом. Полностью (включая примеры и пояснения) вы найдете его в приложении к этой статье. Вкратце его суть можно описать так:

Использовать паттерн Специалист в пределах слышимости (Expert In Earshot) нужно тогда, когда вы замечаете, что программисты-новички, работающие в вашей команде, усваивают новые навыки не так хорошо, как хотелось бы. При этом вы не хотите, чтобы специалист в данном вопросе тратил все свое рабочее время на их обучение. В этом случае нужно поместить специалиста или руководителя команды в то помещение, где работают новички. Таким образом, молодежь будет наглядно обучаться тому, как работает профессионал. Наблюдая и прислушиваясь, новички приобретут манеру (будем надеяться, правильную) работы специалиста. (Понятно, что этого специалиста будут часто отвлекать, поэтому необходимо заранее позаботиться о том, чтобы у него было время и на спокойную, сосредоточенную работу).

Обратите внимание, как этот подход соотносится с исследованиями в области ученичества (см. выше). Важно отметить, что этот паттерн понравился всем 10 руководителям, и они собирались немедленно внедрить его в своих компаниях.

Парное программирование представляет собой сочетание паттерна Специалист в пределах слышимости (Expert In Earshot) и принципа периферийного участия ученика в серьезной и ответственной работе (когда он слышит и видит учителя). Следовательно, в случае с парным программированием мы вправе ожидать более значительных результатов, нежели просто обучение владению новым инструментарием или языком программирования. Эти ожидания подтверждаются сообщениями программистов, которые уже приняли на вооружение эту практику.

Данные статистики

Второй автор этой статьи использовал парное программирование во время преподавания курса web-программирования в университете Юта. Группа студентов состояла из 20 человек, имевших разный опыт программирования. Однако никто из них не знал ни языков web-программирования, ни инструментарий, который для этого используется. Опыт большей части студентов в этой области состоял лишь в применении WYSIWYG редакторов web-страниц. В течении 11 недель занятий студенты на хорошем уровне изучили язык HTML, JavaScript, VBScript, Active Server Page Scripting, Microsoft Access/SQL и некоторые команды ActiveX. Порой им приходилось совмещать операторы всех этих языков в одной программе.

Во время обучения эти студенты задавали на удивление мало вопросов своим преподавателям. Когда, в последний день занятий, их спросили о причинах такой независимости, мнения распределились следующим образом:

74% написали, что выясняли все вопросы в процессе общения друг с другом.

84% согласились с утверждением: "Я смог изучить Active Server Pages быстрее и лучше, так как все время работал вдвоем с партнером".

Нам кажется, что такими результатами мы обязаны, с одной стороны, более успешному решению проблем при парном программировании (как обсуждалось выше), а с другой – большей возможности для обучения, которая возникает при этом стиле работы.

Формирование команды amp;коммуникация

По прибытии я обнаружил удручающую картину: у Билла не было никакой команды разработчиков. У него было шесть талантливых, хорошо подготовленных сотрудников, которые не могли вместе работать. Они даже сидели поодаль друг от друга. Ясно было, что особых симпатий между ними пока не возникло.

"Давайте поговорим о парном программировании. (далее перечисляются все его преимущества). ‹пауза› Парное программирование вводится теперь в обязательном порядке. Весь программный код должен быть написан при участии второго партнера".

‹Неловкое молчание. Люди обмениваются неприязненными взглядами›

"Не думаю, что это сработает. Вот, например, что будет, если мне нужно писать код, а партнера нет рядом?"

"Тогда найди кого-нибудь еще. Главная цель – работать вместе, чтобы передавать друг другу знания".

"А если рядом никого не окажется?"

"Тогда позови меня, я с удовольствием с тобой поработаю. Если же ты и в самом деле не можешь найти ни одного партнера, чтобы писать код вместе, тогда отложи клавиатуру и отдохни."

‹Все удивленно смотрят на меня. Гробовая тишина. ›

Несколько раз парное программирование прошло довольно гладко. Иногда, правда, что-то не получалось. Общались разработчики вяло и редко. Я изо всех сил старался помочь ребятам – старался приучить их думать вслух (то, что Уорд Каннингэм называл рефлективной артикуляцией). И это решило дело! Программисты действительно стали вместе работать, а не просто писать код для одной системы.

Уже через неделю я начал подмечать существенные изменения в поведении разработчиков. Они начали разговаривать друг с другом. Совершенно нормально, так как говорят между собой обычные люди. Нужно было видеть их в начале проекта, чтобы понять, как сильно изменилось их отношение друг к другу. Они беседовали, шутили, смеялись. Теперь уже они начали понимать, что такое доверять друг другу и получать удовольствие от совместной работы.

Еще через несколько дней эти разработчики превратились в отличную слаженную команду."

[из архивов Алистэра Коуберна]

Несмотря на то, что книги "Психология программирования" ("The Psychology of Computer Programming") и "Кадровое обеспечение" ("Peopleware") были написаны, соответственно, 20 и 30 лет тому назад, никто до сих пор не написал ничего лучшего о командной работе. Уже в наши дни формированию команды и коммуникациям стали уделять внимание новые методологии – eXtreme Programming , семейство Crystal [15] и Adaptive Software Engineering [16]. В статье "Characterizing People as Non-Linear, First-Order Components in Software Development" (Русский перевод: «Люди как нелинейные и наиболее важные компоненты в создании программного обеспечения»)

[Закрыть]
, Алистэр Коуберн вообще ставит человеческий фактор в деле разработки ПО на первое место, утверждая, что это вовсе не второстепенный вопрос, как принято считать.

Таким образом, парное программирование выгодно по трем основным причинам.

Как вы уже поняли из приведенного выше рассказа, люди учатся работать вместе. Во время эксперимента в университете Юта ни одна из 14 пар программистов не столкнулась с непреодолимыми препятствиями психологического толка. Впрочем, со слов тех, кто пытается практиковать парное программирование во время реальной работы над проектом, такие проблемы все же случаются (возможно, сказывается слабое воздействие на программистов или недостаток мотивации к совместной работе). Опросы тех разработчиков, которые сумели преодолеть трудности, показывают, что изложенный выше сценарий срабатывает довольно часто (может быть, разве что не в столь ярко выраженной форме). Зачастую люди могут научиться работать вместе только после того, как начнут это делать.

Научиться работать вместе – значит научиться более быстро решать вместе со своими коллегами различные проблемы, а не скрывать друг от друга свои мысли и идеи. В этом случае заметно совершенствуется командный стиль работы.

Если пара программистов сумеет сработаться, то им будет гораздо легче общаться. Кроме того, это общение будет протекать гораздо чаще. При увеличении объема и частоты коммуникаций увеличивается и общий поток информации, циркулирующий внутри команды. Чтобы усилить и ускорить этот процесс, нужно не забывать менять партнеров в парах.

Похоже, все это существенно улучшает производительность команды. К сожалению, эти выводы основываются только на рассказах самих программистов. Никаких статистических данных на этот счет у нас пока нет.

Персонал amp; Управление проектом

Руководство проектом только выигрывает от улучшения качества работы персонала и уменьшения рисков, которые с ним связаны.

И компании, и команде разработчиков выгодна атмосфера постоянного обучения и обмена знаниями. Во время работы над проектом существенно возрастают профессиональные навыки разработчиков – как в области языков программирования, так и в области проектирования.

Снижается риск потери ключевых разработчиков, так как многие их коллеги хорошо знают каждую из частей системы. Некоторые называют это "принципом грузовиков": "Сколько разработчиков должен сбить грузовик, чтобы проект не смог нормально завершиться?" Наихудший из возможных ответов: "Одного". Если знания о системе рассредоточены по всей команде разработчиков, это существенно повышает требуемое количество грузовиков, а вместе с ним и уровень безопасности проекта.

Заключение

Основные преимущества парного программирования заключаются в следующем:

большинство ошибок можно обнаружить в процессе кодирования, а не во время тестирования качества (QA) или же во время работы клиента с системой (см. непрерывная проверка кода);

заметно снижается общий коэффициент ошибок, что подтверждается статистическими данными (см. непрерывная проверка кода);

готовый продукт имеет лучший дизайн и меньший объем программного кода (см. "мозговой штурм" и принцип "парной эстафеты");

команда быстрее справляется с возникающими проблемами (см. принцип "парной эстафеты");

разработчики гораздо больше узнают как о системе, так и самом процессе разработки ПО (см. обучение в поле зрения учителя);

к моменту окончания проекта множество людей обладает глубокими знаниями о каждой из его частей;

люди учатся совместной работе и общению, что приводит к увеличению потока информации внутри команды и положительно влияет на ее динамику;

люди испытывают больше удовольствия от своей работы.

При этом увеличение стоимости разработки при парном программировании составляет вовсе не 100%, как можно было бы ожидать, а приблизительно 15%, что легко окупается за счет более высокого качества программного кода (а значит, меньших затрат на тестирование и поддержку).

Литература

1. Salomon, G., Distributed Cognitions: Psychological and educational considerations. Learning in doing: Social, cognitive, and computational perspectives, ed. R. Pea and J.S. Brown. 1993, Cambridge: Cambridge University Press.

2. Constantine, L.L., Constantine on Peopleware. Yourdon Press Computing Series, ed. E. Yourdon. 1995, Englewood Cliffs, NJ: Yourdon Press.

3. Beck, K., Extreme Programming Explained: Embrace Change. 2000, Reading, Massachusetts: Addison-Wesley.

4. Williams, L., et al., Strengthening the Case for Pair-Programming, in IEEE Software. submitted to IEEE Software. Online at www.cs.edu/~lwilliam/Papers/ieeeSoftware.PDF

5. Williams, L.A. and R.R. Kessler. The Collaborative Software Process. in International Conference on Software Engineering 2000. submitted for consideration. Limerick, Ireland. Online at www.cs.edu/~lwilliam/Papers/ICSE.pdf

6. Nosek, J.T., The Case for Collaborative Programming, in Communications of the ACM. 1998. p. 105-108.

7. Humphrey, W.S., A Discipline for Software Engineering. SEI Series in Software Engineering, ed. P. Freeman, Musa, John. 1995: Addison Wesley Longman, Inc.

8. Humphrey, W.S., Introduction to the Personal Software Process. 1997: Addison-Wesley.

9. Flor, N.V. and E.L. Hutchins. Analyzing Distributed Cognition in Software Teams: A Case Study of Team Programming During Perfective Software Maintenance. in Empirical Studies of Programmers: Fourth Workshop. 1991: Ablex Publishing Corporation.

10. Fagan, M.E., Advances in software inspections to reduce errors in program development. IBM Systems Journal, 1976. 15: p. 182-211.

11. Johnson, P.M., Reengineering Inspection: The Future of Formal Technical Review, in Communications of the ACM. 1998. p. 49-52.

12. Lave, J. and E. Wenger, Situated Learning: Legitimate peripheral participation. 1991, New York, NY: Cambridge University Press.

13. Weinberg, G.M., The Psychology of Computer Programming Silver Anniversary Edition. 1998, New York: Dorset House Publishing.

14. DeMarco, T. and T. Lister, Peopleware. 1977, New York: Dorset House Publishers.

15. Cockburn, A., Crystal "Clear": A human-powered software development methodology for small teams, Addison-Wesley, 2001, in preparation. Online at http://members.aol.com/humansandt/crystal/clear

16. Highsmith, J., Adaptive Software Development, Dorset House, 1999.

17. Cockburn, A., Characterizing People as Non-Linear, First-Order Components in Software Development, in International Conference on Software Engineering 2000. submitted for consideration. Limerick, Ireland… Online as Humans and Technology Technical Report, TR 99.05, http://members.aol.com/humansandt/ papers/ nonlinear/nonlinear.htm. (На русском языке: «Люди как нелинейные и наиболее важные компоненты в создании программного обеспечения»

[Закрыть]
);


    Ваша оценка произведения:

Популярные книги за неделю