воскресенье, 13 сентября 2009 г.

5G

Участники стади-групп постепенно синхронизируют свои знания как между собой, так и с такими великими людьми как Кент Бек, Мартин Фаулер, Роберт Мартин, Эрик Эванс и многие другие. Становится иногда сложно отличить (было: отлЕчить :) ), где чьи мысли.

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

Чтобы отстаивать свою точку зрения на форумах и подчеркнуть принадлежность к ордену света было решено подписываться следующим образом:

Денис, 5G

суббота, 22 августа 2009 г.

Agile (определение)

Agile - это культура разработки программного обеспечения. Как любая культура имеет четко определенные ценности и принципы. В отличии от методологий не определяет практики, оставляя каждому определить тот набор практик, которые целесообразно применять в данном контексте. Или коротко Agile - это методология с нулём практик.

И краткое определение. Agile - это то, про что пишут в Agile-журналах, -блогах и -сайтах

Agile Guru

Долго пытался понять, что мне не хватает. Регистрил один домен, второй, создавал блоги пачками, чтобы отразить своё миропонимание происходящему. И вчера я понял, как можно объединить все это дело под одной шляпой. Шляпа эта - Agile-гуру.

Цель проекта: выработать критерии понятия Agile-гуру и стать им!

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

Так что приглашаю вступить со мной на трудную ступеньку саморазвития - http://agileguru.org

пятница, 21 августа 2009 г.

Kanban vs. SCRUM

Запись встречи: http://team.custis.ru/2009/07/kanban-vs-scrum.html (видео)

Просмотрел запись, просто супер! Согласно Core Protocol: 6 баллов из 10
+ 3 балла за классные обсуждения
+ 2 балла что используется принципов Study Group - когда заранее было сказано подготовиться к встрече.
+ 1 балл за запись отличную и отчёт

Чтобы поставить 10 баллов, я бы добавил следующее
+ 2 использовать паттерны StudyGroup, тогда и встреча интересней будет
+ 1 попросить участников потом (так как есть е-мыл) написать отзыв в митинг- статью
+ 1 включить вещание в инет, хотябы через скайп или rutube!!!! (это делается за 5 минут, зато аудитория будет в тыщи раз больше!!!)

Мои мысли по теме:
1. Чтобы понять одну из методологий, нужно понимать скоуп её использование. Это продукт, проект, или только одна разработка. Другой нюанс срез в даже в скоупе. И даже в рамках могут быть разные срезы. Поэтому определив какие области покрываются предлагаемой практикой облегчело бы обсуждение.
2. Был график, когда каждая последующая методология уменьшает количество включенных практик. SCRUM исключил технические, отдав на усмотрение команде, Kanban исключил множество других практик. Каждая следующая методология даёт выбор, чем мы покроим свои активности. Поэтому я бы ввёл следующую методологию - Agile. В которой не одной практики вообще, а другие практики выбираем по усмотрению.
3. По поводу менеджера и улучшения процесса. Кайдзен-команды это альтернатива ретроспективам. То есть Just-in-time по отношению к улучшению процесса, и не нужно ждать ретроспективы.
4. По поводу цепочки задач, и почему хорошо не ложиться вытягивание от маркетинга, через тестирование, к разработке. То тут лучше к Lean в построении цепочки создания ценностей. А тестирование по определению Lean должно быть убито как явление. Так как любые ошибки добавляют потраченное время, поэтому здесь практики Unit Testing для разработчиков, и Acceptence (Fitness) тестирование для тестировщиков. Цель уменьшить время фидбека после каждого чекина. Сюда же идут - ScoreCards, Testable Units, разделение кода и дизайна. Что позволяет работу QA вплести в разработку.
5. И вообще мне усматривается, что менеджмент, как средство управления процессом (придумать документы, поставить практики, мотивировать людей в разборках тет на тет), а не продуктом, исчезает. То есть практика Канбан и Лин делает так, чтобы менеджмент процесса убрать за счет способности команды стопорнуть процесс и его улучшить, как только обнаруживается дырка. Что очень хорошо в канбан видно. Просто форсируются изменения как только обнаружены дырки процесса.

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

воскресенье, 5 июля 2009 г.

Бережливое производство программного обеспечения: от идеи до прибыли

Мэри Поппендик, Toм Поппендик
Implementing Lean Software Development (Signature Series)
Mary Poppendieck, Tom Poppendieck

"Эта замечательная книга объединяет практические советы, готовые к использованию методы и глубокое понимание, почему именно так следует создавать программное обеспечение. Мне приходилось наблюдать коллективы, полностью трансформировавшиеся благодаря идеям этой книги."
— Майк Кон, автор книги Agile Estimating and Planning

В 2003 году книга Lean Software Development Мэри и Тома Поппендика познакомила читателей с революционными методами разработки ПО. Теперь их давно ожидаемая вторая книга призвана показать читателям, как именно следует реализовывать на практике бережливый подход к созданию программного обеспечения.
Данная книга, основывающаяся на уникальном опыте Мэри и Тома Поппендик, поможет организациям, занятым созданием ПО, оптимизировать свои технологические процессы. Здесь читатель узнает, какие вопросы следует задавать в той или иной ситуации, каким проблемам следует уделять больше внимания и какие методы доказали свою эффективность на практике. Авторы также рассказывают об опыте наиболее передовых организаций-разработчиков программного обеспечения и приводят практические упражнения, которые помогут читателям сделать первые шаги по внедрению принципов бережливости.

* Расширять и развивать практику гибкой методологии разработки
* Создавать истинные коллективы разработчиков, а не просто рабочие группы
* Добиваться высокого качества с помощью быстрой обратной связи с потребителями
* Принимать решения как раз вовремя и ни в коем случае не позже
* Осуществлять поставки быстро, как в компании PatientKeeper: 45 качественных релизов приложения ежегодно
* Принимать компромиссные решения, способные по-настоящему удовлетворить заказчиков

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

Иными словами, данное издание предназначено для менеджеров, руководителей проектов и ведущих разработчиков предприятий, связанных с информационными технологиями, и компаний-разработчиках программного обеспечения.

Об авторах

Мэри Поппендик является специалистом в области менеджмента и разработки продуктов с более чем тридцатилетним опытом использования информационных технологий. Ей приходилось возглавлять коллективы, занятые реализацией разного рода проектов — от управления цепью поставок на предприятии до цифровых медиа, а также участвовать в создании одной из первых бережливых систем производства, ориентированных на поставки "точно вовремя" (на предприятии 3М, где она когда-то работала). Мэри является президентом компании Poppendieck LLC, специализирующейся на внедрении бережливых подходов в разработку программного обеспечения.
Том Поппендик является аналитиком в области предпринимательской деятельности, специалистом по архитектуре ПО и инструктором по применению гибкой методологии разработки с более чем двадцатипятилетним опытом разработки и реализации комплексных систем. В настоящее время он помогает организациям применять принципы бережливости в процессах создания программного обеспечения. Мэри и Том Поппендик также являются авторами книги Lean Software Development (вышедшей в издательстве Addison-Wesley), которая выиграла премию Jolt Software Development Productivity Award (Премия за высшую продуктивность в разработке программного обеспечения) 2004 года.

256 стр., с ил.; ISBN 978-5-8459-1538-2, 0-321-43738-1; формат 70x100/16; твердый переплетсерия Signature Series; 2009, 4 кв.; Вильямс.

среда, 24 июня 2009 г.

Критерий Lean судья процессов

Забавно, но ключевая идея Lean (бережливого производства) может показать кардинальные различия в Waterfall & Agile. Идея заключается в переходе от массового производства, в терминах ПО - поэтапного производства, в производство по требованию.

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

Agile с игрой в планирование (фокусировка на самых приоритетных задачах) и итеративно-инкрементный (причем важнее инкрементная, нежели итеративная разработка) подход фокусируется на поставке как можно быстрее рабочего, хотя не 100% набитого функционалом приложения. Но самое главное - реализующего ключевой функционал. Зная закон Паретто можно сказать, что 20% функционала покрывают 80% потребности. И это факт :) Agile ориентируется на ключевых для бизнеса вещах, нежели поставка через -цать лет и в полном объеме. Это отличие превращает поэтапное производство в производство по требованию. В гармоничный поток создания ценностей. И аджайл позволяет взглянуть на разработку с точки зрения ценностей клиента, нежели ценностей производства (следования этапам и повышения эффективности оных: CMMI, оценки производственных процессов и т.п.).

Исходя из этого можно предположить, что code&fix, самая лучшая практика. Не соглашусь. При уменьшение цикла от заявки до реализации начинают набирать силу муда ( потери, отходы, то есть любую деятельность, которая потребляет ресурсы, но не создает ценности). То есть можно очень мощно рвануть в создании ценностей и выкатить результат. Но каждый следующий шаг будет давать сложнее и сложнее.

суббота, 20 июня 2009 г.

Терминология Core Protocol

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

ЧЕСТНОСТЬ – полная согласованность единство чувств, мыслей, слов и действий. Полное присоединение.

ПОЗНАНИЕ – процесс структурирования потока поступающей информации.
Познание можно рассматривать как процесс, состоящий из нескольких стадий:
1. Сомнение в тех или иных убеждениях.
2. Анализ и интеграция информации, содержащейся в мыслях, эмоциях и интуитивных догадках.
3. Формирование гипотетических действий на основе собранной информации.
4. Осуществление «наилучшего» действия из тех, которые были сформированы на стадиях 1–3.

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

ВЕРИТЬ – поступать в соответствии с тем, что считаешь истинным. Вера (убеждение) – это «ходячая» гипотеза. В конце концов, она начнет искать пути к тому, чтобы стать достоверностью или даже свершившимся фактом. Она достаточно ценна, что
бы занять постоянное место в вашей голове. Она должна под разумевать достаточную выгоду, чтобы играть более замет нуюроль в вашей жизни. Чтобы стать верой, гипотеза должна превзойти все другие гипотезы, вытеснить похожие убеждения и добиться от вас смелости, чтобы позволить ей руководить вашим поведением.

Убеждения, которые вы называете своей верой, не так важны, как ваши истинные убеждения. Очевидно, что вы не верите в методы, которые не применяете. Описание, проповедование или иное выражение своей веры в отсутствие действий может быть довольно веселым занятием, однако оно редко бывает полезным для вас или коголибо еще. Болтовня о ценностях – это способ уйти от достижения цели. Вера служит не только для организации и проведения исследований и экспериментов, но и для реальных действий. Если вы действуете исходя из своих убеждений, вы очень скоро поймете, насколько они истинны. Лучшим показателем истинности является уменьшение усилий или увеличение изобилия.

Вырожденным состоянием веры является постижение – то есть состояние, при котором гипотеза становится «знанием» или «уверенностью». Знание – это вера вне зависимости от истинности.

ИССЛЕДОВАТЬ – непредубежденно изучать что-либо, руководствуясь реальным или воображаемым любопытством.

ИСТИНА – убеждение, которое при практическом применении чаще порождает изобилие по сравнению с другими убеждениями. Истины открывают путь только другим истинам. Причем постоянно и, как кажется, ускоренными темпами.

ВОВЛЕЧЕННОСТЬ – взаимосвязанность с другими сотрудниками, работой и объектами.

ПРИСУТСТВИЕ – влияние личности в данный период времени; ощущение влияния другой личности. Качество и ценность вашего присутствия, а также расходы, связанные с ним, определяются (1) влиянием вашего присутствия, оказанным на взаимодействовавших с вами людей во время и после данного периода времени, (2) влиянием, оказанным на вовлеченные объекты и процессы, (3) влиянием, которое вы оказали на свою жизнь посредством полученного опыта и взаимодействия с другими людьми. Степень вашего присутствия в течение заданного времени, в заданном месте, в составе заданной группы определяет уровень ваших результатов.

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

ВОСПРИНИМАТЬ – получать информацию при помощи органов чувств, одновременно сознавая приобретаемый опыт.

ЗАЗОР МЕЖДУ ГОЛОВАМИ (затраты) – увеличение расходов (сверх расходов базового зазора), которые необходимы для при менения способностей другого человека. Затраты на преодоление психологического расстояния между двумя людьми (зазор между головами) – это дополнительные затраты, необходимые для того, чтобы сотрудник А смог предоставить свои способности сотруднику Б, плюс дополнительные затраты (сверх базовых) сотрудника Б на освоение этих способностей. Зазор включает в себя все затраты, связанные с межличностным взаимодействием А и Б, с усилиями, которые А и Б должны предпринять, чтобы повысить свою доступность друг для друга, и с усилиями, которые Б должен предпринять, чтобы применить способность, которой обладает А. Также этот показатель включает в себя затраты, вызванные ошибками в процессе взаимодействия А и Б.

КОМАНДА – разумная надличностная сущность. Она может состоять из некоторого количества людей (или команд), которые стремятся действовать сообща для достижения общей цели с максимальной эффективностью. Командное поведение всегда включает в себя два вида деятельности:
• Аккумуляция личных ресурсов, особенно времени, информации и способностей.
• Эффективное применение этих ресурсов для достижения индивидуального и коллективного успеха и изобилия.
Кроме того, команда всегда способна говорить одним голосом.

КОНФЛИКТ – несогласованность интересов. Для разрешения конфликта зачастую требуется большая идея.

РАЗГОВОР – неструктурированное применение голоса, которое может иметь совершенно различные показатели сигнал/шум. Разговор – это самый распространенный способ не руководить и не быть руководимым. Кроме того, это стратегия, позволяющая помешать другим сотрудникам руководить или подчиняться руководству. Зачастую, когда ктото хочет поговорить, вы чувствуете себя обязанным слушать. Это проявление уже исчезающей формы вежливости. Хотя слушание обычно является полезной стратегией, чрезмерное внимание к пустым разговорам не приносит никакой пользы. Более того, внимание к таким разговорам несомненно вредит всем, кто в них участвует.

БОЛТОВНЯ – разговор, который не приближает команду к поставленной цели. Этот разговор может вызывать интерес людей, а может оставлять их равнодушными.

РУКОВОДСТВО – публичная уязвимость. Смелое раскрытие собственных сил.

РУКОВОДИТЬ – быть первым, кто начал действовать в соответствии со своими убеждениями.

ЭМОЦИИ, ЭМОЦИОНАЛЬНЫЙ – высокоскоростные персональные элементы обработки информации, описываемые одним или несколькими примитивными состояниями: раздражением, печалью, радостью и страхом. Функция эмоций состоит в том, чтобы проинформировать человека быстрее или поиному – по сравнению с рациональным мышлением. Эмоции ярче и медленнее интуиции, быстрее и туманнее, чем мысли.

понедельник, 15 июня 2009 г.

AgilePodcast 1. Сезон 1. Что такое Agile?

Участники:
Асхат Уразбаев, Денис Миллер, Никита Филиппов

Обсуждаемые темы
* Проблемы разработки ПО
* Что такое Agile?
* Чем приятен Waterfall
* Сравниваем Agile и не-Agile
* Буддизм в Agile







четверг, 11 июня 2009 г.

Пирамида требований



Записал несколько подкастов на тему управления требованиями и оценки.

http://agile.rpod.ru/112496.html - здесь я ввёл понятие пирамиды требований
http://agile.rpod.ru/112634.html - тут введено понятие условных единиц измерения для каждого уровня. И показано как условная единица уровня User Story превращается в Story Points.
http://agile.rpod.ru/112772.html - ну а здесь краткое объяснение супер техники коллективной оценки трудоёмкости Planning Poker

Подключайтесь и задавайте вопросы. Будем искать ответы :)

понедельник, 8 июня 2009 г.

Аджайл активности

Асхат решил создавать обзор аджайл за неделю. Поэтому очень рекомендую заходить на его сайт. Самые интересные моменты с его точки зрения за неделю читайте по адресу: ссылка. Я думаю это приведёт к реанимации agilerussia и ru_agile под флагом ScrumTrek и Асхат выйдет из подполья, куда втянула его работа. А мы будем снимать самые сливки с его блога. Ням-ням. Супер!

Это провоцирует оживить http://agile.rpod.ru для записей не только стади-групп встреч, но и сам подкаст, где выкладывать свои мысли. Кстати, если вы аджайлист и хотите практиковать английский в разговорной и письменной речи. Agile Study Group решили перейти на английский язык, там мы изучаем всякие полезные источники и обсуждаем их по английский. Так же сделан сайт: http://agileexperts.blogspot.com, где мы комбинируем тренировку в English Writing и изучении Agile. Приглашаю к участию!

пятница, 29 мая 2009 г.

Share the pain : система мотивирования

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

Нечестно, что только программист разделяет боль за некачественное решение. Отдел качества должен быть на передовой взаимодействия с заказчиком. После непродолжительной беседы по чату с Виталием Стаховым, мы решили, что и это не совсем верно. Поэтому предложена схема: клиент разделяет боль с тестером, тестер с программистом. Но стал вопрос, а с кем разделяет боль программист? И поняли, что с аналитиком. А аналитик? С пользователем! Круг замкнулся!

Хитрее всех в данной ситуации находится одна фигура. Эта фигура часто орёт на собраниях, что у него "огромная ответственность перед всеми", и поэтому кстати он получает больше всех денег. Но почему то он выпал из раздачи. Кто это? Конечно же менеджер.

После рассуждений мы поняли. Боль должна разделятся по объёму ответственности. А абсолютная ответственность как выяснилось у менеджера. Поэтому схема упростилась: клиенты, программисты, тестеры, аналитики пинают менеджера.

И это правильно!


среда, 27 мая 2009 г.

Ретроспектива решает конфликты

В предыдущем посте я говорил, что инструмент ретроспективы может быть заимствован и развит до немыслимых высот. Если вы хорошо владеете этим инструментом, ваша зрелость растёт гигантскими шагами.

Пару слов о конфликте. Конфликт - это когда точки зрения не совпадают и мы начинаем подключать эмоции, а по сути никуда не двигаемся. Если посмотрите мои посты про эмоции - то знайте - это вы подключили своё подсознательное. Теперь вы стали сильнее и мудрее, когда включили эмоции. Единственное нужно уметь управлять подсознательным (эмоциями). Это умение управлять эмоциональным интеллектом. Подсознательное через эмоции подсказывает - работаем неэффективно. Теперь понятно, что работаем неэффективно, то есть обсуждения зашли в тупик. И это можно оценить по уровню эмоций.

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

Упрощёная схема:
1. Конфликтная ситуация.
2. Остановится
3. Понять свои эмоции.
4. Найти причину (см. технику)
5. Провести ретроспективу на то КАК вы обсуждаете, а не ЧТО вы обсуждали.

Секретная техника действует! Люди меняются и культура разработки растёт!
Приятной ретроспективы!

понедельник, 25 мая 2009 г.

Эволюция культуры команды - ретроспектива

Как я отличаю аджайл команду от не-аджайл? По наличию одной лишь практики - "Ретроспектива". Мне не достаточно сказать - у нас есть она. Я должен увидеть как происходит это таинство. У меня в загашнике есть ряд критериев по которым определяю качество "ретроспективы". Может быть когда-нибудь напишу :)

Сегодня хотел чуток о другом. Я просто несказанно рад, что Дмитрий у себя на блоге описал эту штучку (ссылка). И этот пост воодушевил закончить находящийся в черновике пост про ретроспективу. Асхат подхватил эстафету про ретро. Рекомендую зайти - ссылка.

Продолжать чтение моего поста нужно после чтения поста Дмитрия.

Я привык использовать облегчённый вариант ретроспективы. Я за упрощение во всем её многообразии. Мои ретроспективы просты по структуре
1. ХОРОШО
2. УЛУЧШИТЬ
3. ИДЕИ

Народ интересуется, почему же есть пункты "Хорошо", "Улучшить" и "Идеи", но нет "Плохо" ) Весь сыр бор вокруг пункта 2. Он показывать отличие в психологии проведения ретроспективы. Готовы ли на свершения (которые оформляются Action-планом, который я забыл упомянуть), или просто "вздыхатели" :)

Для русского менталитета пункт 2 должен быть "ПЛОХО". Для европейского - "УЛУЧШИТЬ".

Разница грандиозна. Во-первых, описать "ПЛОХО" нужно 1 мозго-силу. Констатируем факт и мы в шоколаде. Для описания "УЛУЧШИТЬ" нужно 2 мозго-силы. Первая для описания "плохой" ситуации, а вторая мозго-сила для предложения пути как исправить. Вот и получается пункт "УЛУЧШИТЬ" это посложнее, чем "ПЛОХО.

Во-вторых, "ПЛОХО" характеризует натуру, которая больше любит жаловаться, а не решать проблемы. "УЛУЧШАЮТ" в эффективных коллективах, когда идентифицируют неэффективное поведение, ситуацию и ставят задачи по улучшению. Игра слов. Но все же обращу внимания: жалуются - решают, проблемы - задачи. Можете подумать на досуге к какому поведению приводят две эти стратегии, если ими руководствоваться по жизни.

В общем народ можно разбить на две большие группы по этому критерию. Первая - кто ищет оправдания (для них в ретро нужен пункт ПЛОХО) и другая группа, кто ищет возможности (для этих нужен пункт УЛУЧШИТЬ).

А если получается много "УЛУЧШИТЬ" и улучшения достигаются. Это развивает команду. Команда за счёт "УЛУЧШЕНИЙ" изменяется, изменяется её культура.

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

четверг, 21 мая 2009 г.

Секреты построения команды (Team Building)

Использование практик Agile позволяет эффективно управлять созданием продукта. Но создание команды и динамика построения команды в Agile освещены не очень хорошо. В предлагаемом подкасте я рассказываю о практиках, которые ориентированы на развитие командных отношений и повышение эффективности работы. Весь подход состоит из четырёх этапов:
1. Развитие эмоционального интеллекта
2. Коллективное принятие решений
3. Интеграция личных и командных целей
4. Общее видение

Все секреты одним файлом:

суббота, 16 мая 2009 г.

Null Object и синтаксический сахар C#

public interface Null
{
}

internal class NullWord : Word, Null
{
}

if(word is Null)

Без комментариев. Красотища! :)

Использованы паттерны: NullObject и Marker Interface

Подробнее: http://agile.rpod.ru/109024.html

100% Coverage Driven Design (CDD) - борьба с тухлым кодом

Всем известно, что для качественного ПО покрытие должно быть более 70%. Я не знаю, кто это придумал и причем тут качество, но мне не понятно какая польза от этой цифры. Ещё смешнее слышать, как менеджеры привязывают покрытие к качеству. Если рассуждать в плоскости менеджеров, что и на мелководье и рак рыба, то этого качества конечно же для успокоения самолюбия менеджера достаточно. Но истинные войны света должны понимать, что на этом качество не останавливается... Качество кода - это целая культура разработки, в которую вовлечены клиенты, разработчики, тестировщики и много других людей. Но об этом я уже писал неоднократно, а сегодня остановлюсь на новом подходе. Подходе дающим ещё один мощный инструмент разработчику (ни менеджеру, ни тестировщику) для написания качественного кода.

Я же хочу раскрыть другую замечательную вещь, которая повысит качество кода во много раз. Один нюанс - вам придётся делать 100% покрытие :)

Эту идея пришла во время парного программирования с Кириллом Медведевым в рамках одной из стади-групп.

Эту разработку я называл "100% Coverage Driven Design" (или сокращённо CDD). Суть этого подхода есть сложение TDD, общего подхода написания тестов (ключевая фраза здесь - TestLast) и инструмента покрытия кодом.

Напомню цикл TDD:
1. Пишем тест (формализуем ожидания от будущего кода)
2. Реализуем код
3. Рефакторим

В "100% Coverage Driven Design" цикл такой:
1. Тест
2. Код
3. Рефакторим
4. Добиваемся 100% покрытия

Какие бонусы даёт такой подход
1. Все бонусы TDD
2. Вы всегда контролируете, что ваш код используется и нету лишнего, мертвого, того кода, который будет тухнуть из-за дня в день. Покрытие будет следить, как только что-то лишнее появляется и не используется - сразу выкидываем.

Возникает вопрос. А что делать с тестами, которые устаревают. Ведь их с помощью покрытия нельзя выявить, а тем более сказать что код, который покрывается устаревшими тестами уже начинает потухать. А решение простое - смирение. Если тест устарел, то первым делом он начинает из зеленого превращаться в красное. И вы тут же решаете, что с ним делать. В красное он может превратиться по множеству причин. Но если одна из причин - устаревший и ненужный тест. Мы его удаляем. Запускаем Code Сoverage и проверяем, где произошли смещения от точки 100% покрытия.

Покажу на маленьком примере. С помощью TDD цикла создали библиотечку. Проверили её покрытие и выяснилось не 100%. Начинаем разбираться и видим, что появился тухлый код. Сначала комментирую тухляк, а потом лопатой все убираю.


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



Мне приходиться напрячь мозги и понять, что components объект никогда и не используется! Такое открытие позволяет мне удалить столь запутанную тухлятину тоже.



Результат не заставляет ждать. Идеально чистый код! Я с уверенностью продолжаю дальнейшую разработку.

Теперь немного GUI-шного, про разработку через TestLast и как техника рефакторинга приводит ухудшению Code Coverage.

1. Конечно же, когда добавляется новый функционал, то используем TestFirst:

public void MainForm()
{
     SetUpClass.PrepareTestFile();

     var form = new MainForm();
     var mocks = new MockRepository();

     var dialog = (OpenFileDialog)mocks.CreateMock(typeof(OpenFileDialog));
     Expect.Call(dialog.FileName).Return("filename.ew");
     Expect.Call(dialog.ShowDialog()).Return(DialogResult.OK);
     mocks.ReplayAll();

     form.openFileDialog = dialog;
     form.MenuItem_Open(null, null);

     mocks.VerifyAll();
     Assert.AreEqual(2, form.dicGridControl.Count);
}

2. Реализуем функцию

public void MenuItem_Open(object sender, EventArgs e)
{
     if (openFileDialog.ShowDialog() == DialogResult.OK)
     {
         Dic dic = new Dic();
         dic.Load(openFileDialog.FileName);
         dicGridControl.Bind(dic.ToList());
         }
}

Покрытие: 100%

3. Проводим рефакторинг Replace Nested Conditional with Guard Clauses (кстати, мой самый любимый)

public void MenuItem_Open(object sender, EventArgs e)
{
     if (openFileDialog.ShowDialog() != DialogResult.OK)
         return;


     Dic dic = new Dic();
     dic.Load(openFileDialog.FileName);
     dicGridControl.Bind(dic.ToList());
}

Покрытие: 97%.

Проведение рефакторинга привело к снижению покрытия. Мы столкнулись с усложнением кода с точки зрения поддержки покрытия. Но в тоже время облегчили с точки зрения понимания, сделав линейность выполнения основного блока. То есть основной блок в первом примере разбился на два: проверка условия выполнения и основной код.

В общем снизили покрытие. Что делать. Я останусь верным принципам рефакторинга и оставлю проверку входного условия. Но я должен дотянуть покрытие до 100%. Тут на помощь приходит старая практика Test Last. Если раньше, эта техника была вызвана сообращениями разработки тестов для уже разработанного кода, сейчас эта техника изменит своё предназначение. Используя эту технику я подтяну покрытие до 100%.

После мелких рефакторингов я добавил второй тест, используя технику TestLast:

[Test]
public void MainFormCancel()
{
     Expect.Call(dialog.ShowDialog()).Return(DialogResult.Cancel);
     mocks.ReplayAll();

     form.MenuItem_Open(null, null);

     mocks.VerifyAll();
     Assert.AreEqual(0, form.dicGridControl.Count);
}

Результат: покрытие 100%

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

Другой нюанс, если я пойду дальше и подстрахуюсь от проблем с файловой системой:

public void MenuItem_Open(object sender, EventArgs e)
{
     if (openFileDialog.ShowDialog() != DialogResult.OK)
          return;

     try
     {
          Dic dic = new Dic();
          dic.Load(openFileDialog.FileName);
          dicGridControl.Bind(dic.ToList());
     }
     catch (Exception ex)
     {
          MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message);
     }

}

Этот кусочек кода пишется даже без теста легко. Я нарушил правило TDD и добавил строчку кода без теста. И кара настигла меня моментально - покрытие упало, плюс протестировать статический метод MessageBox.Show - это целая проблема (ни моки, ни что либо другое здесь не поможет - в морг). А представьте сколько проблем мы делаем, когда разрабатываем более менее серьезное приложение?

Что хотелось бы иметь в инструментах покрытия:
1. Механизм разметки - какие функции все же не стоит покрывать. Например, автогенерацию или какие-то ничего незначащие хитрые кейсы.
2. Историю покрытия, чтобы наблюдать диффы. Это понадобилось бы для работы над легаси-системами. В таких системах, если мы начинаем разрабатывать по TDD большая часть кода будем мешать нашему анализу. А анализ диффов позволил бы использовать этот подход даже там.

Вывод: Данную методику изобрёл буквально вчера. За вчера её опробовал, очумел от эффективности и продолжаю праведно работать по ней. Методика 100% покрытия стала для меня точно так же как запускать юнит тесты. Стала родной и без неё уже свет не мил. Теперь не то чтобы у меня тесты есть согласно TDD, но и код очищается от мертвого кода очень удобно и легко. Теперь я не только уверен в функционировании (этому мне помогает TDD), но и что код чистый (этому помогает 100% покрытие). В общем я доволен как маленький ребёнок от такой простои и в тоже время мощной игрушки. Сейчас нарабатываю опыт от применения, о чем буду делиться и буду ждать последователей, кто готов проверить предложенный метод.

четверг, 30 апреля 2009 г.

Скобочки для if в одну строчку

(DRAFT)

Здесь расскажу про такое заблуждение как обрамление фигурными скобочками оператор if с одним простым действием.

if(condition)
{
        return 0;
}


вместо
if(condition)
        return 0;


Мифическая причина идущая от Стива Макконнела (Code Complete). К ней все обращаются, когда начинают мне её называть. Такое ощущение, что это единственная книга, которую горячие стороники скобочек читали :) Кстати, советую тогда заглянуть на http://agileconsulting.ru/wiki/Books - тут множество книг о качестве кода.
1. Защита от дурака, что кто-то в будущем добавит строчку и сделает баг в программе.

А теперь демистификация скобок. Итак, почему скобки это пережиток:
1. Отступы явно указывают на логический блок из одной строки.
2. Отступы проставляются автоматически средой разработки.
3. Тесты не дадут написать код неправильно. У вас нету тестов? Тогда улучшать качество кода начали не от туда :)
4. Скобки кушают 2 линии
5. Мы бизнес-разработчики, и должны свести к минимум все инженерные ухищрения. Ведь в любом языке фраза: "если наступит утро, то я проснусь" не содержит скобок.

А теперь мой аргумент за скобочки:
1. Визуально видно разделение условия от действия. Строка между условием и действием способствует отличию. Но минус в том, что такая конструкция нагружает, когда идёт проверка входных параметров. В таком случаем мне нужно локаничное полотно проверок, а не скобочки :) Поэтому вначале функции проверки без скобочек очень удобны, а вот чуть глубже в тело функции - нужно подумать.

Если вы используете современную IDE и TDD и утверждаете, что скобки полезны по названой мифической причине - просьба дайте конкретный пример. Иначе рассуждаем о коне в ваккууме.

среда, 29 апреля 2009 г.

Вебкасты про Agile

http://www.autumnofagile.net/
http://www.summerofnhibernate.com/

суббота, 25 апреля 2009 г.

«Agile по-крупному!» — ВИДЕО

Во вторник, 21 апреля, прошла аннонсированная ранее встреча сообщества AgileRussia.ru, озаглавленная «Agile по-крупному!». Изначально тема заявлялась, как разбор сложностей Agile в крупных командах и проектах, обсуждение тонкостей масштабирования, ведь все, что выходит за максимальный размер стандартной Agile-команды в 9 человек, уже требует специальных подходов.


«Waterfall2Agile — Agile для Большой Waterfall компании: нужен? как и что внедрять?» — это пришли ребята из широкоизвестной компании «C», они детально описали свой цикл разработки и структуру проектного управления своего Большого Продукта (достаточно заметить, что цикл тестирования релиза занимал у них 18 месяцев), пояснили возникающие проблемы, и запросили у сообщества предложений по улучшению процесса — включая как Agile-практики, так и технические/инструментальные решения.





«AgilePostmortem» — это была посмертная ретроспектива распределенного Agile-проекта, интересного высокотехнологичного стартапа, к сожалению, «не дожившего до весны».



Оригинал: http://team.custis.ru/2009/04/agile-agilerussiaru.html

вторник, 21 апреля 2009 г.

Строки-ресурсы или магические строки (draft)

В продолжение предыдущего поста возникли логичные вопросы. А что делать с
String.Format(StringResourse.TotalString, total)? Кстати, вам легко понять это? А я ещё не начал перечислять минусы :)

Итак, начну с переносом строк в ресурсы. Начнём сначала. Какой смысл был у строки? Если смысл кокатация строчек. То первичный вопрос - накой козе баян? Зачем делать форматирование строке "Всего: " + total + " штук"? А потом повышаем косвенность, закидывая строку "Всего: {0} штук" в ресурсы?

В отличии от string, StringBuilder, String.Format назначение ресурсов в предоставление вариационности. Вариационности в способе отображения, а для строк это либо другой язык, либо другая система отображения значений (пример: дата, дроби и т.п.). Вы часто имеете дело с мультикультурными приложениями? :) Да и там чуток по другому делают. Причем не на стадии программирования, а это свойство относится к всем процессу разработки. Другой нюанс - некоторое множество сообщений, которое на каждом углу программы используется. Некое постоянное магическое множество. Типа "Всего: {0} руб.". Тут ещё можно подумать. Но вредно. Для этого есть специальные классы. Которые должны сразу выплёвывать такие строчки и мы не должны волноваться как это получилось.

Другой сногсшибательный аргумент - если у вас есть технический редактор, и ему удобно работать с одним списком сообщений. Представляю я работу этого редактора. Вместо того, чтобы заранее написать текст, который он ожидает. Или с программистом договориться во время непосредственного написания кода. Он будет открывать файл ресурсов и не соображая, что за туча сообщений, править. Полностью оторвав от контекста применения. Кто нибудь так делает? Ух ты! Ну и как часто так делаете? Чаще чем пишете код? :)

А теперь какие бонусы мы получаем от такой системы (не для варианта мультикультурной платформы, а для нашей простой разработки)
Бонус 1. Попробуйте посчитать количество ваших действий, чтобы внести изменение в вашу строчку. Ужас на крыльях ночи. И это только ради того, чтобы внести маленькое исправление в строчку. Боюсь если вы уделяете столько внимания строчкам, то время на полезный код у вас не остаётся вообще :) Мне намного легче править то, что я вижу непосредственно.
Бонус 2. Даже если не менять. Чтобы читатель мог понял, что тут написано и что ожидается, вам прийдётся скакать как минимум по двум файлам. Кстати, поиск таких вещей и мест их потребления - это другая тема. А разговор идёт не об одной сущности, а просто об одной строчке кода. Да к тому же ещё среди кучи строчек вам нужно ещё вашу. Упасть не встать.
Бонус 3. Я молчу, насколько это эффективно программируется по сравнению с простой строчкой кода :)
Бонус 4. Нарушение ценностей и принципов Implementation Patterns и Simple Design.
Бонус 5. Программирование ради неопределенного будущего. Какой то технический

Задайте себе вопрос - что вы чаще меняете: кучу сообщений без привязки к месту использования или конкретное сообщение в конкретном коде. И из этого делайте вывод. Если вы днями программируете текст в ресурсном файле. То ресурс это ваше все. А если вы пишите код программы и добавляете в него сообщения - то вывод очевиден. Что данные (а строка это данные) должны быть в непосредственной близости от места потребления.

Следующий вопрос - Magic String. Звучит очень странно. Но давайте вернёмся к аналогии. У нас есть Magic Number. Пример: 12. Конечно, любой скажет, что нужно напрячься, причем очень сильно, чтобы найти СМЫСЛ этого. Поэтому СМЫСЛ мы заключаем в название переменной int interest = 12. Ещё раз подчеркиваю, чтобы не искать смысл числу 12 по крупицам в коде окружающем это значение мы вводим переменную, в название которой перенесли смысл числа. В нашем примере 12 означает interest (процент). Теперь взглянем на наши Magic String:

string errorMessage = "Произошла ошибка. Повторите операцию";

Вот скажите, а чего вам не понятно в исходном сообщение? Смысл? Там же по-русски написано :) Я понимаю, что фраза "@#$#@$^%$" может запутать и нужно ввести поясняющую переменную. Но в примере то чего сложного?

Теперь пошли нюансы Magic String:
Бонус 1. Переменная, у которой область видимости максимум круглые скобочки в качестве параметра вызова в MessageBox, почему то становиться видна всей нашей функции. Как будто без этого мало строчек кода.
Бонус 2. При чтение кода нам нужно прыгать сначала к тексту применения, а потом к определению. Хотите скачи - идите на ипподром.
Бонус 3. Некоторые умельцы ещё и форматирование туда запихивают. Мозг выносится напрочь, когда обнаруживается код типа:
string totalString = "Всего: {0} штук";
....
String.Format(totalString , total);

Итог, использование Magic String и ресурсов в большенстве своём плохой и неоправданный стиль программирования. Но когда же их исползовать? Ресурсы - когда вариационность текстовой составляющей (языки, отображение и т.п.), Magic String - ну когда одно и тоже в многих местах или ну совсем длинная или непонятная строчка :)