Что произойдет, если мы будем делать все, о чем они нас просят? у нас будет перегруз.
Допустим, команда возьмется сделать 10 новых историй за эту неделю.Если на входе 10 а на выходе 4-6, то команда будет перегружена. Будет спешить, переключаться между задачами, терять мотивацию, в итоге снижается производительность и качество. Это заведомо проигрышная стратегия.
Scrum и XP в этом случае используют метод “вчерашняя погода”. Команда говорит: “За последнее время мы делали 4-6 фич в неделю, какие 4-6 фич мы будем делать на следующей неделе?”
https://www.youtube.com/channel/UC36gZMTo6_PNi9dpS97V0sw
Задача владельца продукта в том, чтобы грамотно выбирать, какие именно пользовательские истории будут реализованы на этой неделе.
Kanban рекомендует ограничиться несколькими задачами — WIP limit. Допустим команда решает, что 5 — это приемлемое количество пользовательских историй, над которыми они смогут работать одновременно без перегруза, не перескакивая с одной на другую.
Оба эти подхода хорошо работают и оба они создают очередь задач, которые в Scrum называется Backlog, или приоритезированный список задач.
Этой очередью тоже необходимо управлять.Если заинтересованные лица запрашивают 10 историй в неделю, а команда реализует 4-6 историй, то эта очередь будет становиться все больше и больше. И скоро ваш Backlog будет расписан на полгода вперед. То есть одна история будет ждать выхода 6 месяцев.
График уничтожения историй
Время от времени, заинтересованные лица будут спрашивать у Пэт: “Когда выпустят мою фичу?” или “Сколько фич выпустят к рождеству?”. Владелец продукта должен уметь управлять ожиданиями пользователя. И управлять ожиданиями реалистично.
Два тренда — оптимистичный и пессимистичный (можно на глаз). Расстояние между трендами показывает насколько нестабильна скорость работы команды. Со временем эти тренды стабилизируются и конус неопределенности будет уменьшаться.
Предположим, заинтересованное лицо спрашивает, когда вот эта фича будет сделана?
Это вопрос с фиксированным содержанием и неопределенным сроком. Для ответа Пэт использует две линии тренда. Ответ — в апреле или мае.
Заинтересованное лицо спрашивает Пэт: «Сколько будет сделано к рождеству?» Это вопрос с фиксированным сроком и неопределенным содержанием. Линии тренда отсекают на вертикальной шкале вероятный отрезок того, что успеют реализовать.
Заинтересованное лицо спрашивает :«Успеем ли мы сделать вот эти фичи к рождеству?» Это вопрос с фиксированными временными рамками и фиксированным содержанием. Ориентируясь на тренды, Пэт отвечает: «Нет». Добавляя: «К рождеству мы успеем сделать столько, а вот столько времени нам понадобится чтобы завершить всю эту работу полностью.»
Обычно лучше уменьшать содержимое проекта, чем увеличивать время. Если мы уменьшаем содержание, у нас будет возможность отодвинуть сроки. Мы можем выпустить кое-что здесь, а остальное — позже.
Владелец продукта делает расчеты еженедельно и использует исключительно эмпирические данные, а не выдает желаемое за действительное. Он честно говорит о неопределенности. Команда поддерживает темп работы, а Пэт не давит на них, заставляя ускориться.
Основные идеи и принципы
4 ключевые идеи Agile сфокусированы на гибкости и адаптивности этого подхода:
- Эффективное взаимодействие между людьми – базовое средство достижения целей;
- Реально работающий продукт является главной ценностью;
- Изменения, которые могут повысить качество и конкурентоспособность продукта, приветствуются на любом этапе разработки;
- Контрактная, техническая и прочая регламентирующая документация вторична по значимости относительно работающего продукта и сотрудничества между участниками проекта.
Эти идеи раскрываются в 12 принципах AgileManifesto[1]:
- работающий конкурентоспособный продукт, удовлетворяющий заказчика — лучший показатель прогресса и измеритель эффективности;
- оперативная и бесперебойная поставка продукта, удовлетворяющего заказчика;
- адаптивность продукта к новым требованиям, которые могут повысить его ценность и конкурентоспособность (возможность внесения изменений на любом этапе разработки);
- простота и прозрачность технических решений, документации, процессов и инструментов, чтобы не создавать лишней работы;
- частая поставка функционирующего продукта (раз в месяц/неделю или ещё чаще);
- постоянный темп работы всех участников проекта на протяжении всего его срока;
- минимизация организационных и информационных барьеров, лучший путь передачи информации — это личный разговор лицом к лицу;
- тесное и ежедневное общение исполнителей с заказчиком в течении всего проекта;
- мотивация участников проекта и обеспечение их всеми необходимыми условиями работы, поддержкой и доверием;
- самоорганизация и самоконтроль команды проекта;
- непрерывное улучшение профессиональных компетенций команды проекта;
- систематический анализ и постоянный поиск возможностей оптимизации командной и индивидуальной работы.
Где, как и кем используется agile
Сегодня эджайл применяется не только в управлении ИТ-проектами, а используется как эффективная практика организации труда небольших групп и творческих команд вместе с либеральными и демократическими методами менеджмента [1]. В частности, одной крупной телеком-компании благодаря внедрению Agile-практик в процессы кросс-функциональное взаимодействия всего за 3 месяца удалось достичь следующих результатов [6]:
- рост от продажи устройств на 45%;
- сокращение сроков запуска рекламных кампаний в 2 раза;
- рост плановой ежемесячной выручки от разработки продуктов на 20%;
- в 1,5 раза больше запущено рекламных кампаний по направлению В2В.
Гибкие практики управления также активно применяются и в банковском секторе. Например, за год в проектном офисе ЦентроБанка в 2 раза увеличилась скорость достижения результатов, повысилась вовлеченность сотрудников, улучшилась прозрачность и управляемость изменений [7].
https://www.youtube.com/c/RapidEnt1/videos?sort=dd
Подобным опытом делится Райффайзен-Банк [8] и Сбербанк [9]. Предприятия нефтегазовой промышленности также активно используют Agile для повышения эффективности своих бизнес-процессов, открывая новые офисы и выстраивая работу филиалов по адаптивным принципам [10].
Кроме того, в рамках государственных проектов цифровизации, идеи и принципы эджайл используются в бюджетных и правительственных организациях [11]. В частности, правительство Новой Зеландии, Норвегии и США изучали методы Scrum для внедрения в своих министерствах [12].
Источники
Гибкость против жесткости: agilevswaterfall
В отличие классического Project Management (PM), когда проект жестко регламентирован заранее установленными требованиями (контрактами), Agile предполагает быстроту реагирования, а также гибкую адаптацию к внешним и внутренним изменениям. Это достигается с помощью итеративной разработки продукта и эффективного межличностного общения.
В водопадной (каскадной) модели PM, которая считалась стандартом де-факто, проект состоит из функциональных задач, где каждая последующая работа четко регламентирована и начинается строго после окончания предыдущей, например, тестирование начнется только после того, как написан весь код.
В Agile продукт создается серийно, когда каждая последующая версия работоспособного решения имеет больше функциональных возможностей, чем предыдущая. Такое уплотнение процессов позволяет существенно сократить сроки выхода готового продукта на рынок, что особенно значимо для бизнеса.
Методы и средства реализации
Наиболее популярными Agile-подходами считаются Scrum (скрам) и Kanban (канбан).
В Scrum над проектом работает команда профильных технических специалистов (например, аналитик, программист, тестировщик, администратор) вместе с владельцем продукта (product owner) и модератором (scrum-мастер). Product owner аккумулирует бизнес-требования, соединяет команду исполнителей с заказчиком и следит за развитием проекта.
В Scrum рабочий процесс делится на равные периоды от 1 до 4-х недель (спринты), в зависимости от проекта и команды. Перед стартом каждого спринта на митинге формулируются его задачи, а в конце обсуждаются результаты. Краткосрочность и измеряемость спринтов позволяет эффективно управлять проектной деятельностью, не перегружая участников проекта авралами [4].
В отличие от Scrum, в команде канбан отсутствуют роли владельца продукта и модератора, а процесс разработки делится не на универсальные спринты, а на стадии выполнения задач («Планируется», «Разрабатывается», «Тестируется», «Завершено»).
Канбан, как и другие практики бережливого производства, пришедшие из Японии, направлен на достижение баланса и выравнивание нагрузки исполнителей. Эффективность работы оценивается по среднему времени жизни задачи, от начальной до конечной стадии. Если задача прошла весь путь быстро, то команда проекта работала продуктивно и слаженно.
Сегодня наблюдается некоторое слияние Scrum и Kanban, например, канбан-доски стали практически обязательным элементом популярных систем управления проектами (Jira, Trello, Битрикс.24, Basecamp, Мегаплан и т.д.), которые, в том числе, поддерживают методологию скрам [5].
Преимущества и недостатки
Главные достоинства эджайл – быстрота, адаптивность и фокус на главном. Отсутствие бюрократии и периодичность поставок работающего продукта с постепенным наращиванием его функциональных возможностей существенно сокращают сроки получения итогового результата. Это особенно важно для бизнеса, т.к. благодаря стремительному выходу на рынок можно быстро занять свободную нишу.
Недостатки Agile являются прямым следствием его достоинств:
- снижение важности регламентирующей и технической документации может привести к ее нерелевантности или даже к фактическому отсутствию;
- краткосрочное планирование не всегда учитывает необходимость масштабирования продукта, что влечет ошибки в архитектуре;
- появление новых требований после нескольких итераций приводит к кардинальным изменениям архитектуры и переделкам уже созданных решений;
- накопление дефектов и снижение качества продуктов вследствие решения проблем самым простым и быстрым, но не всегда самым правильным способом.
Принятие решений
Некоторые истории крайне необходимы, а некоторые просто бонусные фичи. На разработку одних историй уйдет пару часов, на разработку других — месяцы.
Как соотносится размер истории и ее ценность? Никак. Больше не значит лучше. Ценность и сложность задачи — вот что помогает Пэт расставлять приоритеты.
https://www.youtube.com/channel/UCDSN2Xo2vYiTdcPjEQJV5lw
Как владелец продукта определяет ценность и объем истории? Никак. Это игра в угадайку. И лучше в ней участвовать всем. Пэт постоянно общается с заинтересованными лицами, чтобы знать ценность каждой истории, общается с командой разработчиков, чтобы знать объем работ, но все это приблизительные догадки, никаких точных цифр. Вначале всегда будут промахи и это нормально. Гораздо большую ценность представляет общение, чем сверхточные цифры.
Каждый раз когда разработчики выпускают что то новое, мы узнаем больше информации и можем лучше ориентироваться.
Одной приоритезации недостаточно. Чтобы выпускать истории быстро и часто, нужно разбивать на кусочки, которые можно сделать за пару дней. Мы хотим чтобы в начале воронки были маленькие и четкие истории а в конце — большие и неопределенные. Вовремя делать такую разбивку мы можем воспользоваться нашими последними открытиями относительно продукта и нужд пользователя. Это все называется очистка Backlogа.
https://www.youtube.com/channel/UCT0l77ZQ3y-Gp-qMHK9g80A
Пэт проводит встречу по очистке Backlogа каждую среду с 11 до 12. Обычно на ней собирается вся команда и иногда несколько заинтересованных лиц. Содержание встреч бывает разным. Фокусировка на оценке, на разбивке историй, на критериях приемки.
Про agile на пальцах. путь к быстрой разработке. — @emacsway’s blog
Я уже писал “на тему Agile-разработки шпаргалку”, более чем наполовину состоящую из цитат выдающихся архитекторов.
Проблема в том, что она ориентирована на осведомленных людей (как правило, на менеджеров и архитекторов), и малопонятна тем, кто сталкивается с этим впервые.
Поэтому я решил написать упрощенную версию своими словами.
Вы не сможете использовать фрагменты этой статьи для аргументации перед заказчиком, так как она не содержит цитат праотцов архитекторы, но я надеюсь, что она будет легче для понимания ключевых моментов экономики разработки программного обеспечения.
Задумывались ли Вы когда-нибудь, почему одни люди работают в разы быстрее чем другие?
Причем, часто “тормозят” в работе именно наиболее умные и толковые разработчики.
На одном из проектов, в одну из наших бэкенд-команд пришел новый парень.
Он взял себе тикеты, которые позволяли ему в определенной мере абстрагироваться от унаследованной кодовой базы, сколотил свою собственную небольшую кодовую базу, и в одиночку начал работать в два раза быстрее, чем работала команда из трех человек.
Почти в 6 раз быстрее любого другого разработчика.
И это при том, что у нас работали далеко не последние разработчики, и компания была достаточно известной.
А поскольку, как говорил Martin Fowler, экономика всегда побеждает, пришлось разбираться в причинах такого отрыва.
Этот парень использовал на то время лишь ограниченный сегмент практик Extreme Programming (XP) — наиболее эффективной и одной из первых Agile-методологий.
Все что он использовал — TDD, Evolutionary Design, принципы SOLID, из которых особый упор был на Single Responsibility Principle (SRP), а также активно использовал Type Hinting для автоматического рефакторинга, поскольку язык был с динамической типизацией.
Именно так я и познакомился впервые с Extreme Programming, вернее, с его неоспоримым превосходством даже в столь урезанном виде.
Под настоянием этого парня я прочитал свою первую книгу в области качества кодирования — Clean Code, и с этого началось мое становление специалиста в области проектирования программного обеспечения.
В последующем, темпы разработки выросли не только у тех, кто работал с ним, но и, по цепной реакции, у тех, кто работал уже с этими, и даже в других компаниях, и так на протяжении уже нескольких лет.
Итак, как нам это удалось, и почему до этого мы не могли работать эффективно?
Кент Бек как-то сказал, что труднее всего работать в Agile-разработке докторам наук.
Причина в том, что чем выше интеллект человека, тем больше ему свойственно продумывать всю задачу наперед, охватывать умом всю реализацию, от начала до конца (upfront thinking), еще до начала ее реализации.
Первая проблема заключается в том, что на начальном этапе разработчик не обладает достаточной информированностью.
И он усердно пытается эту недостающую информацию собрать.
Он думает, анализирует, собирает информацию, часами и сутками “ходит по заколдованному кругу”.
Время существенно затягивается, если разработчик не обладает достаточным опытом и не знаком с типовыми решениями.
В конечном итоге он принимает некое решение, которое в большинстве случаев оказывается ошибочным.
Другая проблема заключается в том, что исправление ошибочного решения в коде занимает несопоставимо меньше времени, чем требуется для заблаговременного обдумывания правильного решения.
Ответом на эту проблему является Evolutionary Design (Emergent Design).
Смысл его заключается в том, что мы начинаем реализовывать первое пришедшее на ум решение, которое затем, уже в процессе разработки, изменяем путем рефакторинга по мере роста информированности.
Но при этом соблюдаем несложные правила:
- Single Responsibility Principle (SRP)
- Качественное проектирование кода, позволяющее отложить решение о конкретной реализации. Декларирование качественных интерфейсов важнее конкретной реализации.
- Обеспечение автоматического рефакторинга: расстановка Type Hinting для динамических языков программирования, покрытие кода тестами, использование средств автоматизированного рефакторинга.
- YAGNI — реализация только того, что требуется текущей задачей, без предположений о том, что нам потребуется в будущем, т.е. ничего не реализуется “впрок”. Существует простая лакмусовая бумажка принципа YAGNI: “выделение лишних абстракций (и любое другое усложнение) оправдано лишь в том случае, если стоимость их выделения в будущем будет существенно дороже, чем сейчас”.
Из перечисленного, второй принцип “Качественное проектирование” очень важен, и ниже я расскажу почему.
Но сперва об Agile-разработке.
Удивительно, но несмотря на то, что подавляющее большинство разработчиков работало в своей жизни по Agile-методологии, мало кто из них понимает в чем она заключается.
Обычно стоимость изменения кода растет экспоненциально по мере увеличения объема кодовой базы.
Это справедливо как к Waterfall проектам, так и к Scrum проектам, не использующих технических практик.
Такие проекты очень дорого изменить когда они уже в значительной мере реализованы, поэтому их следует проектировать заранее.
Попытка же делать такие проекты по Scrum обычно приводит к финансовому кризису, который наступает в среднем через 3-4 года развития проекта, когда стоимость изменения кода взлетает очень высоко.
Как правило, этот кризис находит решение в какой-то радикальной попытке спасения финансов, например, в закрытии проекта, эмиссии акций, массовых сокращениях штата, замене тех.руководства или даже всей команды.
Суть Agile-разработки заключается в том, чтобы изменить этот экспоненциальный график стоимости изменения кода на плоский и горизонтальный (насколько это возможно), более правильное название которого — асимптота.
Если проект равно одинаково легко изменить в любой момент независимо от объема кодовой базы, то это значит, что нам не нужно проектировать его заранее (т.е. нет необходимости в upfront design)!
Вот в чем заключается смысл слова “гибкий” (agile)!
Это особенно актуально в наши дни, когда программа морально устаревает быстрее, чем она создается.
В таком случае, мы можем легко адаптировать проект под скоротечно меняющиеся потребности рынка независимо от стадии развития проекта и объема кодовой базы.
В свое время Кент Бек сказал, что если плоский график стоимости изменения кода делает XP возможным, то крутой график делает его невозможным.
Agile-разработка — это значит достигнуть такого качества архитектуры (проектирования), которое позволит дешево внедрять проектные решения не заблаговременно, а итеративно, уже в процессе разработки и развития продукта, с учетом обратной связи от практического использования результатов решений предыдущих итераций.
Плоская кривизна графика достигается проектными решениями.
Именно поэтому одна из первых Agile-методологий была изобретена архитектором.
И именно поэтому Agile-разработка нацелена на внедрение качественных проектных практик в масштабах всей команды.
И именно поэтому, без опытного проектировщика в команде Agile-разработка невозможна. Никак невозможна. Совершенно.
Как вы думаете, каким вопросам посвящена книга “Agile Software Development. Principles, Patterns, and Practices.”, написанная в 2002 году Robert C. Martin, который в 2001 году организовал встречу группы, подписавшей Agile Manifesto?
Сколько в составе этой группы было выдающихся архитекторов того времени?
Какую основную проблему подчеркивает Dave Thomas, автор “The Pragmatic Programmer” и один из создателей Agile Manifesto?
Изначально Scrum содержал технические практики заимствованные из XP.
Однако, позже решение о выборе конкретного набора технических практик было отдано на откуп самим разработчикам.
Они считали, что это сдерживает проникновение Scrum в массы.
Именно поэтому, Scrum — это не методология, а framework (каркас, скелет), на который еще необходимо нарастить практики.
К сожалению, из Scrum удалили именно то, что поддерживает стоимости изменения программы низкой и делает Agile-разработку возможной.
Одним из вариантов решения этого вопроса является комбинация Scrum и XP.
На практике же разработчики не уделяют этому вопросу должного внимания, и часто вообще не используют никаких технических практик, превращая Scrum в обычный Waterfall с итеративным планированием, но при этом рост стоимости изменения кода не позволяет сделать разработку гибкой.
Нужно заметить, что разработчики редко получают правильное представление о Scrum из первоисточника.
Поэтому я здесь приведу несколько жизненно-необходимых ссылок:
На Русском:
Очень хорошая интерактивная шпаргалка: Subway Map to Agile Practices.
Возникновение Agile-разработки обусловлено стечением ряда факторов.
Во-первых, обрели популярность объектно-ориентированные языки, предоставляющие более высокие возможности по управлению сложностью кода.
Ключевую роль здесь сыграл Smalltalk.
Во-вторых, на проектирование кода были спроецированы архитектурные строительные паттерны, которые позволили поднять коллективное понимание программы на принципиально иной уровень.
Это был серьезный удар по стоимости изменения программы.
В-третьих, появились инструменты автоматического выполнения рефакторинга существующего кода.
Появились браузеры рефакторинга, которые позволяют автоматически определять фрагменты кода, подлежащие рефакторингу.
Это был еще один существенный удар по стоимости изменения программы.
В-четвертых, методики тестирования вошли в новую фазу своего развития.
Предварительное тестирование стало источником проектных решений, что позволило, с одной стороны, еще больше удешевить проектирование, а с другой стороны — позволило проще и уверенней осуществлять рефакторинг, т.е. изменять проектные решения.
В-пятых, начала вызревать архитектура приложения.
Большое влияние оказали работы Bertrand Meyer, Ivar Jacobson, Martin Fowler и др.
Вскоре после подписания Agile Manifesto, вышло в свет наиболее полное руководство по архитектуре приложения — “Patterns of Enterprise Application Architecture” by Martin Fowler.
Как сказал Ralph Johnson, архитектура — это коллективное понимание устройства системы.
И это был, наверное, самый серьезный удар по стоимости изменения программы.
Оценить коллосальное влияние этой книги в масштабах индустрии можно на примере web-framework Ruby on Rails, созданным David Heinemeier Hansson на ее основе.
На то время Ruby on Rails произвел революционный скачок темпов разработки в 5-6 раз (несмотря на то, что архитектура этого web-framework содержала определенные спорные и критикуемые решения).
Мгновенно появилось множество его клонов на различных языках программирования.
Накопление этих факторов привело к тому, что проектные решения стало дешевле изменить, чем проектировать заблаговременно.
Количественные изменения перешли в качественные.
Наступил переломный момент.
Актуальность этого момента нашла отражение в скоротечности изменения рыночных требований, когда программы стали морально устаревать быстрее, чем разрабатываться.
Эти обстоятельства позволили переосмыслить модель проектирования и планирования, и перейти от заблаговременного проектирования к итеративному, получая обратную связь от решений каждой итерации еще в процессе разработки.
Это позволило вывести управление бизнес-рисками на принципиально иной уровень.
Здесь я должен сделать оговорку, что Agile-разработка позволяет изменить модель проектирования, но не исключить проектирование.
Именно в этом и заключается основная ошибка многих менеджеров, которые не понимают что Agile-разработка становится возможной именно в результате качественных проектных решений, позволяющих сохранять низкой стоимость изменения программы.
Я намеренно не затрагивал многие исторические моменты, чтобы выделить важное.
Если интересна более подробная история развития итеративной разработки (начиная с 1930 года), то вы можете посмотреть ее в статье “Computer Iterative and Incremental Development: A Brief History” by Craig Larman.
Чем отличается качественное проектирование от некачественного?
Суть архитектуры лежит в коллективном понимании разработчиками устройства системы.
Потребность в качественном проектировании диктуется тем, что программу должны понимать не только машины, но еще и люди.
И вот здесь возникает проблема.
Ибо, как сказал Дейкстра, размеры человеческого черепа ограничены, и хороший программист их всегда осознает.
Проектирование диктуется психологией, законом магического числа семь плюс-минус два , согласно которому кратковременная человеческая память, как правило, не может запомнить и повторить более 7 ± 2 элементов.
Еще во времена процедурного программирования возник принцип Low Coupling & High Cohesion, нацеленный на то, чтобы снизить концентрацию сложности кода и удовлетворить закон магического числа семь, т.е. исключить переполнение мозга.
Отсюда вытекает один из главных императивов разработки ПО — управление сложностью кода.
Coupling (Сопряжение, Зацепление) — это показатель того, насколько класс осведомлен о стороннем поведении.
Cohesion (Связанность) — выражает сфокусированность класса, насколько его методы служат единой обязанности класса.
Обычно критерием Связанности класса служит плотность использования его атрибутов (свойств) методами.
Если в классе ряд атрибутов используется лишь ограниченным количеством методов, то это обычно свидетельствует о совмещении классом нескольких обязанностей.
В таком случае Связанность повышается путем выделения лишних обязанностей в отдельные классы.
Кстати, размер класса измеряется количеством его обязанностей, и при хорошем проектировании оно стремится к единице (SRP), за исключением тех обязанностей, которые “не тянут” на самостоятельный класс.
Подробнее смотрите в статье “Coupling And Cohesion”.
Именно для снижения Сопряжения и предназначены многие паттерны проектирования.
Хорошая новость заключается в том, что паттерны проектирования предназначены для снижения сложности программы, и именно так их и следует использовать.
Этому вопросу посвящена статья “Is Design Dead?” by Martin Fowler.
Качество программного кода измеряется именно уровнем его сложности, а не изобилием паттернов проектирования (что является частым заблуждением новичков, которым нетерпится продемонстрировать свои новые навыки).
Плохая новость заключается в том, что паттерны знать нужно, и паттернов очень много — Design Patterns, PoEAA, DDD Patterns, Cloud Design Patterns, Service Design Patterns, Enterprise Integration Patterns, Analysis Patterns, Concurrency Patterns, POSA, DSL Patterns, Microservices Patterns, Architectural Patterns, XUnit Test Patterns, TDD Patterns, и другие.
Здесь, наверное, было бы уместно сделать небольшое отступление.
Классическим заблуждением начинающих и толковых ребят является вера в то, что практика и опыт могут заменить работу с теорией, в частности — с литературой.
Во-первых, честно говоря, среднестатистический коммерческий проект на рынке редко может служить источником качественной практики (если даже наоборот).
Более лучшим источником качественной практики могут служить открытые проекты, основанные компетентными сообществами.
А во-вторых, помните что Дейкстра говорил о строго ограниченных размерах человеческого черепа?
Воспроизвести в одиночку эволюцию целой индустрии — это весьма самонадеянно.
Жизни не хватит.
Можно, конечно, попытаться изобрести колесо, и в одиночку обобщить и систематизировать весь совокупный опыт индустрии, и, если человек обладает умом Эриха Гаммы или Мартина Фаулера, и посвятит этому вопросу половину жизни, то у него может даже и получиться.
Вот только совокупный опыт индустрии выражается, опять же, в литературе.
Так что — никак.
Можно привести еще такой пример.
Сколько бы вы не смотрели выполнение задней подножки на практике, но, без знания теоретической составляющей, выполнить ее вы не сможете.
Более того, при попытке ее провести, вы поставите себя в уязвимое положение, и, с высокой долей вероятности, будете успешно контратакованы.
Это потому, что самая важная часть ее подготовки — перераспределение нагрузки, снаружи не видна, но играет решающую роль.
Множество людей годами систематизировали практику, и создавали теорию.
Благодаря теории, теперь не нужно проживать несколько жизней, чтобы это постигнуть.
Это я говорил про Самбо — не самая теоретическая наука по сравнению с разработкой программного обеспечения.
Игнорирование теории по сути является проявлением “Культа Карго”.
Еще одним ярким примером игнорирования теории является эпизод о том, как нарисовать 7 перпендикулярных линий игнорируя геометрию, из известной короткометражки “The Expert” (оригинал).
Теория также играет важную роль в формировании коллективного понимания того, как устроена система, что существенно снижает порог вхождения нового разработчика в проект, смягчая негативное воздействие Закона Брукса.
Другая крайность при работе с литературой заключается в чрезмерном перегибе, который приводит к подсознательному отторжению этого процесса.
Чтобы стать хорошим специалистом, достаточно читать 5 страниц в день, по крайней мере так говорит один из известнейших авторитетов в области IT-индустрии Steve McConnell.
И желательно работать с первоисточниками.
Если Design Patterns — значит GOF.
Если рефакторинг — значит Martin Fowler.
И т.д.
Сегодня в мире ООП принцип Low Coupling & High Cohesion известен благодаря принципам GRASP, однако его функции в значительной мере взяли на себя такие понятия как Абстракция и Инкапсуляция.
Удивительно, но большинство разработчиков не понимают этих базовых вещей, что приводит к написанию tricky code и Big Ball of Mud.
Именно поэтому, я рекомендую начинать путь специалиста в области проектирования не с книги “Clean Code”, а с книги “Code Complete” 2-d edition by Steve McConnell, которая дает глубокое понимание базовых фундаментальных понятий.
В наши дни базовые принципы качественного проектирования хорошо известны под акронимом SOLID.
Неопытные разработчики часто говорят, что им некогда писать качественный код, так как у них мало времени, и все равно этот код читать никто не будет.
Истина в том, что при написании кода, разработчик 90% времени именно читает код, и только 10% времени он вводит символы с клавиатуры.
Пишет код он в одиночку и лишь единожды.
Зато читают код все разработчики команды и много раз.
Таким образом, плохо написанный код на 90% влияет на снижение темпов разработки всей команды.
Хорошая программа должна читаться, а не пониматься.
Если Вы вынуждены изучать реализацию программы — то у программы есть проблемы.
А если Вы не можете понять реализацию программы без помощи отладчика — то у программы серьезные проблемы.
В хорошей программе достаточно открыть файл с декларацией публичных интерфейсов (даже если используется язык с динамической типизацией), и этого должно быть достаточно, чтобы понять что делает программа.
Если этого не понятно, то интерфейсы следует улучшить.
Программа должна выражать “ЧТО” она делает, а не “КАК” она делает непонятно что.
На самом деле, без тестирования просто невозможен рефакторинг, а значит, невозможен и Evolutionary Design.
А без Evolutionary Design разработчик возвращается к засасывающей воронке времени под названием upfront thinking.
Однако, есть и другие причины использовать тестирование, причем, желательно в стиле TDD.
- Тестирование повышает качество кода, т.к. разработчику легче изначально написать слабо сопряженный код (Low Coupling), чем ломать голову над тем, как протестировать код с высоким сопряжением (High Coupling). С целью достижения наибольшего эффекта, желательно ограничить использование автоматизированных средств создания Mock-объектов, так как они упрощают тестирование плохо спроектированного кода.
- TDD повышает качество интерфейсов, т.к. мы продумываем интерфейс изначально с точки зрения его использования, и используем этот интерфейс еще до реализации. Вы, наверное, обращали внимание на то, что, при итеративной разработке, представитель бизнеса всегда получает более ясное представление об User Interface после того, как впервые попробует его использование. Здесь то же самое, только интерфейсы программные.
- Тестирование устраняет страх очищать кодовую базу и исправлять ошибки в коде. Т.е. придает уверенность разработчику. Без этого просто невозможен процесс Model Distilling, т.е. улучшение качества бизнес-моделирования по мере переработки знаний. Подробнее этот вопрос раскрывается в DDD.
- TDD устраняет засасывающую воронку времени под названием перфекционизм, т.к. существует очевидное условие, выполнение которого свидетельствует о решении задачи.
- Тестирование исключает использование отладчика. А отладчик отнимает значительно больше времени, чем написание тестов. К тому же, в отличии от использования отладчика, время для написания тестов прогнозируемо.
- Тесты — один из лучших способов документации кода.
- Инверсия стресса, что увеличивает работоспособность.
- TDD концентрирует внимание на решении только одной осязаемой обязанности. Снижает нагрузку на мозг и обеспечивает более высокие темпы разработки.
Несмотря на то, что при TDD разработчик пишет больше кода, он имеет более высокие темпы разработки.
Основное время занимает не сам ввод символов с клавиатуры, а обдумывание предстоящей структуры кода.
TDD вырабатывает привычку изолировать в голове только одну осязаемую обязанность кода в единицу времени, и думать только о ней вплоть до момента ее реализации.
Как песочные часы.
Это можно сравнить с работой хирурга, проводящего операцию.
Фактически все тело оперируемого пациента укрыто специальной простыней, за исключением того места, в котором осуществляется операция.
Внимание хирурга должно быть сфокусировано, чтобы он имел дело с фиксированным набором переменных.
Хирург не должен думать о всех органах одновременно (смотрите главу “Isolate Change” of “TDD by Example” by Kent Beck).
Т.е. эта методика учит не загружать в голову сразу много.
Учит управлять сложностью.
Благодаря такому снижению нагрузки на мозг, разработка продвигается в разы быстрее, особенно в сочетании с Помидорным Методом.
Раньше была такая пословица, что веник легко переломать по одному прутику, но трудно сломать когда они связаны.
Тут то же самое.
TDD позволяет “развязать” реализуемые обязанности и быстро реализовать их поодиночке.
К тому же, тестирование практически полностью исключает из рабочего процесса такого монстроидального пожирателя времени как “отладчик”.
Многие разработчики не понимают разницы между оценкой (estimate) и обязательством (commitment).
А также не понимают разницы между планированием и предсказанием.
Это приводит к стрессу.
Разработчик боится плохо выглядеть, и врет про estimates.
Затем боится не выполнить estimates, и работает сверхурочно (что, кстати, претит Agile практикам).
Работает сверхурочно — теряет работоспособность, не развивается, и совершает много проектных ошибок, которые с эффектом “положительной обратной связи” (т.е. “вразнос”) ухудшают прогнозирование estimates, что, как снежный ком, ведет к экспоненциальной эскалации напряженности.
Истина в том, что рост стоимости оценки имеет экспоненциальную зависимость от ее точности, а рост бизнес-выгоды от точности оценки — линейную зависимость.
Все дело в соблюдении баланса выгоды от точности оценки и затрат на нее.
Как правило, на оценку отводится не больше 5% от времени итерации.
И точность здесь не критична.
Задача планирования — помочь бизнесу грамотно управлять бизнес-рисками.
И чем раньше бизнес будет осведомлен об отклонении от плана, тем раньше он сможет принять бизнес-меры.
Вот почему честность — ключевой критерий профессионального разработчика.
Именно поэтому в Planning Poker обычно используется ряд Фибоначчи — нет смысла оценивать предмет с точностью выше, чем погрешность оценки.
А погрешность тем выше, чем выше объем задачи.
Более подробно эта тема раскрывается в книге “Clean Coder” by Robert Martin.
Эта книга сложна для чтения в оригинале, и многим будет легче читать ее русский перевод (который достаточно качественный) под названием “Идеальный Программист”.
Также будет полезным этот видеоролик “Effective Estimation (or: How not to Lie)”.
Существует несколько превосходных книг, посвященных вопросам estimates.
Например:
Но я не вижу смысла уделять внимания изучению оценки предмета больше, чем изучению самого предмета.
Лаконичной информации, предоставленной Robert C. Martin, вполне достаточно для большинства разработчиков.
Почему я затронул здесь эту тему?
Потому что в условиях непонимания роли оценки в разработке, при ее нарушении у разработчика включается психологическая защита, и он начинает пытаться оправдать сложившееся положение искусственным завышением сложности реализации, пытаясь продемонстрировать свои сильные умственные стороны в борьбе с этой сложностью, чтобы замаскировать свой просчет, одновременно с этим нарушая ключевой принцип Agile-разработки — Simple Design.
А между тем, четырехкратная оптимистичность ошибки оценки, по статистике приводимой Steve McConnell, является среднестатистической.
Ошибаться — это нормально.
Единственный способ получить точную оценку — это реализовать задачу.
Искусственно завышая сложность проекта, разработчик ставит сам себе же ловушку в будущем, запуская процесс с “положительной обратной связью”.
Из-за чего прогнозируемость оценок стремительно падает.
Наверное ничто не бывает настолько затратным и настолько ненужным как преждевременная оптимизация.
Это мельница для нескончаемого донкихотства.
На эту тему было сказано так много, что даже удивительно наблюдать как снова и снова люди тратят кучу усилий и создают во имя оптимизации самые неудачные решения и кучу ненужностей.
И мы тоже так делали.
Потом случилось чудо.
У нас не было на оптимизацию времени, так как мы были заняты созданием качественного программного дизайна.
И мы заметили, что показатели нагрузки, вопреки предположениям, не только не упали, а, наоборот, улучшились.
И когда New Relic изредка нам сообщал о проблеме в performance, мы обнаружили, что устранять проблему в качественно спроектированном коде намного легче.
В общем, оптимизировать нужно исключительно в соответствии с Законом Парето (80/20) и только то, что измерено профайлером и представляет собой реальную проблему. И желательно делать это на уже стабилизированной кодовой базе, чтобы потраченные усилия не оказались выброшенными из кода через пару недель.
Code Review — мощный инструмент, который часто используется далеко не на полную силу.
Во многих проектах, в которых я принимал участие, первоначальное отношение к Code Review было, как правило, негативным и воспринималось чуть ли не как подозрение в некомпетентности.
Ревьюировали в основном новичков, и этот процесс пожирал невероятно много времени.
Часто было быстрее решить задачу самому, чем добиться приемлемого качества кода от новичка.
В общем, толку от Code Review обычно было немного.
Если вы уже знакомы с Agile-разработкой, то понимаете, что без Collaborative Development не может быть и речи о Collective Ownership.
К первому относятся Парное Программирование, Формальные Инспекции (Formal Inspections), Анализ Кода (Walk-Throughs) и Чтение Кода (Code Reading).
Чтение Кода похоже на Code Review, но ориентировано на распространение знаний, поэтому является коллективным мероприятием, и должно вовлекать хотя бы 2-3 человека помимо автора.
Кроме того, около 90% ошибок обнаруживается самим автором на этапе подготовки к Чтению Кода.
Часто это единственная доступная форма of Collaborative Development, так как заказчик не часто соглашается на Парное Программирование.
Во всех случаях нам удавалось перевернуть отношение к Code Review, и впоследствии обиду вызывало уже не Code Review, а, наоборот, нежелание коллег ревьюировать Pull Request.
По мере роста участников команды в вопросах проектирования, Code Review стало своего рода площадкой для демонстрации достижений.
Обычно после создания Pull Request каждый разработчик просил в командном чате о проведении Code Review, и если находилось мало желающих, то это воспринималось как то, что разработчик никого не заинтересовал своим кодом.
Для мержа Pull Request требовалось минимум 2 одобрения.
Для этого переворота было достаточно решить 2 проблемы.
1. Сражения мнений (или даже ЧСВ).
Это невероятный пожиратель времени и отравитель морального климата.
Мы решили эту проблему тем, что ввели в обиход каталоги Code Smells.
Есть три популярных каталога.
Мнений стало меньше, знаний — больше.
Сражения прекратились.
Мало кто хотел спорить с Robert C. Martin или с Martin Fowler.
С другой стороны, никто не ощущал обиды или ущемления, так как авторитет этих авторов признавали все.
Чувство обиды сменилось спортивным интересом.
Написание чистого кода стало делом чести, и это имело вирусный эффект и цепную реакцию.
2. Вторая проблема — это большой расход времени на объяснения и обучения в процессе Code Review.
Решили эту проблему просто — заставили работать книгу вместо себя.
На Code Review вместо длительных разъяснений просто бросали ссылку на нужный метод рефакторинга по каталогу рефакторингов:
Каждый метод рефакторинга содержит номер страницы книги, где разработчик может получить исчерпывающее пояснение.
Например, как здесь.
Code Review, которое раньше могло длиться весь день, теперь сжалось до 10 минут.
Буквально за пару месяцев качество кода и квалификационный уровень команды поднялись в разы, как и общекомандный velocity.
Также полезны каталоги для рефакторинга БД:
В итоге Code Review стало вполне приятной процедурой, которая повышала темп разработки, а не тормозила его.
Важность этой темы саркастически раскрыта в статье “Рик, ты уволен: мы избавились от нашего лучшего сотрудника и не пожалели об этом” (оригинал “We fired our top talent. Best decision we ever made.”).
Трудно что-то добавить к содержимому статьи, разве что только то, что в статье не отражены ошибки руководства, которые привели к такой ситуации.
К сожалению, описанная ситуация, когда целый проект становится жертвой некомпетентности и самоутверждения единственного человека — не такая уж и редкость.
Хороший специалист всегда заботится об интересах дела, а не о своем положении в этом деле.
Хороший специалист не проявляет нетерпимости к технологиям и инструментам.
Во-первых, у него нет необходимости в самоутверждении.
Во-вторых, он понимает, что если инструмент диктует условия, то проблема не в инструменте, а в качестве проектирования.
Это как в пословице про плохого танцора…
Подробно этот вопрос рассмотрел Robert Martin в статье “The Clean Architecture” (в 2021 вышла его одноименная книга).
Даже если инструмент перестал устраивать вовсе, то хорошая архитектура обеспечивает заменяемость и адаптируемость.
Один из сильнейших специалистов, с которым мне доводилось работать, мог вполне спокойно поработать и с PHP и с, Django, и с Active Record, и с MySQL и т.п.
В-третьих, хороший специалист способен иногда и сам создавать хорошие инструменты, если это требуется.
Хороший специалист действует открыто, говорит аргументированно и по сути (ибо компетентность позволяет), и избегает демонстрировать свое личное отношение (оно все равно никого не волнует, кроме его самовлюбленности).
Хороший специалист не опускается до оскорблений или перехода на личности, ведь он тем самым признает ущербность своей позиции, пытаясь таким образом найти какой-то щит для своей бескомпетентности.
Хороший специалист не ищет виноватых, потому что умеет не попадать в такие ситуации.
Ничто не влияет так на темпы разработки, как моральный микроклимат.
Наверное поэтому сегодня на рынке труда стремительно набирают значение т.н. soft skills.
Мне периодически приходится слышать истории о том, как довольно неплохим специалистам отказывали в предложении о работе на основании soft skills.
Тут я должен заметить, что многие (в т.ч. и представители компаний) ошибочно под термином Soft Skills понимают Конформность.
Это не так.
Вопросам профессиональной этики, soft skills и поведению в конфликтных и стрессовых ситуациях много внимания уделяет Robert C. Martin в книге Clean Coder.
Степлер для бумаги rapid r5080e электрический для скрепления до 80 листов бумаги. тд чеял
Офисный электрический степлер Rapid R5080E работает на высокоемких кассетах со скобами (5000 шт). Предназначен для скрепления бумажных блоков. Максимальная толщина прошиваемой стопы 80 листов бумаги 80 гр/м кв. Глубина скрепления — до 50 мм.
Прекрасно подойдет для интенсивного использования в крупных офисах с большим документооборотом, страховых и транспортных компаниях, автосалонах, банках. Округлые формы, эргономичный дизайн, компактные размеры и, при этом, высокая производительность, удобство и комфорт в использовании. Степлер Rapid R5080E прекрасно впишется в любой офисный стиль и будет достойно смотреться в кабинете любого уровня.
Специальная высокоемкая кассета вмещает 5000 скоб, это 2500 брошюр (на 2 скобки) без замены картриджа. Оптическая индикация минимального количества скрепок в кассете (19 шт) подскажет когда нужно сменить картридж.
Расстояние от кромки листа до места установки скобы — регулируется. Тип скрепления листов — втачку (по краю листа) и в угол.
Одним из плюсов является низкий уровень шума, по сравнению с аналогичными моделями других марок. Специальный кожух защищает пользователя от травм, при поднятом защитном козырьке и открытой зоне установки скоб работа степлирующей головки блокируется.
Электрический степлер для бумаги Rapid R5080E — это качество, элегантность и надежность от проверенного временем европейского производителя офисной техники Isaberg Rapid, выпускающего канцелярскую и полиграфическую технику с 1927 года. Прекрасно подходит для бухгалтерий, плановых, экономических и коммерческих отделов, банков, страховых компаний и нотариальных контор. Не требуется усилий при установке скоб даже на достаточно толстую стопу в 80 листов, компактные размеры и эргономичный дизайн — несомненные плюсы при выборе этого электрического степлера для интенсивной работы.
Расходные материалы — высокоемкие картриджи на 5000 скоб.
Купить электрический степлер для бумаги R5080E можно оформив заказ через корзину сайта или позвонив в офис 8-495-287-09-90 (г. Москва) или 8-800-707-60-45 (бесплатно по России), менеджеры оформят покупку и доставку.
Компания Isaberg Rapid устанавливает на всю выпускаемую технику гарантию — 5 лет или 500 000 скреплений, т.к. у Rapid R5050E все быстроизнашивающиеся детали меняются с каждой заменой блока со скобами.
Электрический степлер rapid 5080e
Данная серия электрических степлеров делает возможным сшивание без проблем и с комфортом. Кассета содержит целых 5000 скоб, и это значит, что скобы вообще редко заканчиваются. В отличие от модели Rapid 5050е, данный электрический степлер способен скрепить около 80 листов.
Электронный степлер Rapid 5080e с загружаемой кассетой (5 000 скоб, один тип скобы независимо от кол-ва листов). Гарантируется 500 000 скреплений (изнашиваемые части каждый раз заменяются с новой кассетой). Регулируемая глубина скрепления и точное скрепление до 80 листов. Простая загрузка. Световой индикатор предупредит вас задолго до того, как скобы в кассете заканчиваются. Чрезвычайно тихая работа и низкая вибрация.
Скрепление — сшивает до 80 листов бугами, 5 000 скреплений с одной кассеты;
Срок службы — минимум издержек при использовании, гарантируется 500 000 скреплений (изношенные детали автоматически заменяются с каждой новой кассетой);
Удобен — регулируемая глубина скрепления, точное сшивание до 80 листов бумаги;
Функциональный — четкое сшивание благодаря плоскому подгибанию ножек с обратной стороны;
Степлер удобен для потребителя — легок в использованиии. Световой индикатор на степлере предупреждает об окончании скоб в кассете и необходимости замены. Зеленый цвет — готов к работе. Красный цвет — замените кассету (остается 19 и менее скоб);
Влияние на окружающую рабочую среду — бесшумная работа, низкая вибрация.