Как получить хороший дизайн при использовании гибких методов?

15

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

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

Проблема: сложность получить хороший дизайн

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

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

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

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

РЕДАКТИРОВАТЬ - ПРИМЕЧАНИЕ

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

Например, меня не волнует (слишком много) хороший дизайн, если мне нужно реализовать простой компонент, который (1) должен быть готов как можно скорее, (2) будет использоваться только один раз, (3) не будет используется другими частями системы (YAGNI).

Меня интересует хороший дизайн, когда компонент (1) будет использоваться несколько раз и в нескольких различных выпусках продукта, (2) необходимо поддерживать и расширять с течением времени, (3) имеет много других компонентов в зависимости от него ,

Джорджио
источник
5
The only well-designed module I could produce recently I obtained by taking a different approach-- Вы ответили на свой вопрос. Вам все еще нужно немного авансовый дизайн; Вы не можете ожидать, что хороший дизайн просто вырастет органично от рефакторинга. Это не работает таким образом.
Роберт Харви
1
Нет. Потому что, может быть, я неправильно применяю SCRUM.
Джорджио
3
Там нет такого понятия, как «SCRUM правильно». Есть только тот процесс, который дает желаемый результат.
Роберт Харви
1
Вот почему их называют «руководящими принципами» :) В любом случае, совершайте каждый день, делайте короткие (от 1 недели до 1 месяца) спринты, подобные правила вообще не говорят о дизайне. Вы все еще должны иметь дизайн.
Роберт Харви

Ответы:

13

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

Тогда не делай этого.

Не все вписывается в красивую проворную коробку. Часто продукт имеет несколько сложных вещей, которые не могут быть переданы отдельным лицам и не могут быть завершены каким-либо вменяемым образом в спринте. Заставить их в эту коробку вызовет только проблемы. Но это должно быть мало и далеко друг от друга. Если вы обнаружите, что многие из ваших компонентов похожи на это, ваш владелец продукта должен работать над тем, чтобы разбить вещи лучше (с вашей командой). Я прекрасно поступаю так, как вы: возьмите историю, спроектируйте ее, а затем разработайте ее как можно скорее, ожидая, что это займет несколько недель.

В более общем случае я видел 3 вещи, которые я сделал, чтобы получить хороший дизайн в Agile:

  • На самом деле занимаюсь дизайном - многие места, которые я видел, начинали свой спринт и просто начинали ковбойствовать. Вы получите плохой дизайн таким образом. Agile не меняет процесс разработки плана - кода - тестирования - выпуска, он просто сокращает его до более детальных фрагментов. В начале спринта садитесь по мере необходимости и на самом деле разрабатывайте свое решение.

  • Иметь архитектора / руководителя - Как только ваш проект станет достаточно большим, вы получите несколько групп разработчиков, работающих над разными частями приложения. Очень полезно иметь кого-то (или несколько человек в зависимости от размера приложения), основной задачей которого является знать, что все команды делают с точки зрения дизайна. Они могут отвечать на вопросы и направлять команды к более гармоничному всеобъемлющему дизайну. Наличие у каждой команды схваток лидерства, которое знает большую часть того, что делают другие команды, я также видел и был очень эффективным.

  • Будь прагматиком - я рассказал об этом выше. Agile это инструмент, и, как и любой инструмент; это не относится ко всем проблемам. Если не имеет смысла применять к какому-либо компоненту, не применяйте его там. Ваша цель - поставлять хорошее программное обеспечение; не забывай это

Telastyn
источник
3
+1 (+10, если бы у меня было более одного голоса!) За «Заставить их в эту коробку вызовет только проблемы».
Джорджио
17

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

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

Кевин Клайн
источник
+1: хорошо. Поэтому я должен запланировать историю рефакторинга, когда я думаю, что в этом есть необходимость, и не добавлять никаких новых функций, пока у меня снова не появится достаточно хороший дизайн. Это, вероятно, то, чего нам не хватает в нашем процессе (в дополнение к тому факту, что, ИМО, приращения, которые мы разрабатываем, часто слишком малы).
Джорджио
2
на самом деле вы должны добавить техническую историю задолженности и обсудить, когда на самом деле действовать с Владельцем продукта, это то, что подразумевается под технической задолженностью .
4
Во всех проектах, которые я видел, где ответственность за качество кода лежит на владельце продукта, создавая истории «технического долга» или аналогичные, качество кода всегда ставилось так низко, что наносило серьезный ущерб скорости и моральному духу. Я считаю, что команда - это организация, которая берет на себя ответственность за качество кода. Команда должна оценить истории, чтобы было место для доставки с сохранением или, если необходимо, сниженным техническим долгом.
Буб
4
«История рефакторинга» или «История технического долга» не должна произойти. Никогда. Стоимость рефакторинга является частью разработки и не должна быть отдельной задачей. Это должно быть сделано непрерывно в маленьких шагах, не запланированных, после факта, истории. Я знаю это, наша команда перепробовала истории рефакторинга, это плохо. Когда вы начнете рефакторинг «на лету», вы увидите, что рефакторинг становится частью вашего стиля кодирования, а не отдельной задачей.
Паткос Чаба
1
Если вы считаете, что кодовая база не сможет удобно обрабатывать историю X без существенной реструктуризации / переписывания, то эта реструктуризация должна быть частью истории X, и работа, необходимая для этой реструктуризации, должна приниматься во внимание при оценке истории X.
Бухб
6

«Хорошо продуманный» субъективен

Что значит «хорошо продуманный» для вас? Владельцу продукта? заказчику?

Является ли «хорошо продуманный » целью владельца продукта? цель клиента? или только ты?

Является ли то, что вы считаете "не очень хорошо продуманным", все еще оправдывающим ожидания Владельцев продукта и радующим клиента? Тогда это довольно "хорошо продумано" .

Достаточно хорошо и ЯГНИ

Ничто в большинстве методологий Agile не говорит о «хорошо спроектированной», потому что любая система, в которой Владелец продукта воспринимает истории как завершенные, и клиенты считают, что она соответствует их требованиям, «хорошо спроектирована» .

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

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

SCRUM

Гибкая методология, которую можно записать, не является гибкой методологией ». - Джаррод Роберсон

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

Большинство магазинов, в которых я работал, имеют так называемые Sprint ZERO, Sprints для старших членов команды, чтобы набросать общую архитектуру или тему продукта.

Истории, которые превышают, скажем, 20, обычно разбиваются до тех пор, пока они на самом деле не станут несколькими 3 - 5 баллами. Одна из этих историй гласит: «Нам, как команде, нужно встретиться, чтобы обсудить, как мы собираемся разработать эту функцию, чтобы у нас было как можно меньше технических долгов, если бы отводилось время».

Обычно

В общем, хорошо продуманная система достаточно хороша и следует за YAGNI.

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

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

Роберт Харви
источник
2
Является ли «хорошо разработанная» цель владельца продукта: не прямой целью. Косвенно да: хорошо продуманные средства легче отлаживать и обслуживать. Мне пришлось потратить недели на поиск критических ошибок (которые приводили к сбою приложения) в грязном, плохо спроектированном коде.
Джорджио
3
Какой удручающий ответ. Это в основном гарантирует посредственное программное обеспечение, обволакивающее планету, как серая жвачка.
Роберт Харви
@ Джорджио, это не цель, это подразумеваемое ожидание.
@RobertHarvey Я знаю, что вы видели видео «Большой шар грязи» и читали газету. Это реальная жизнь, в частности SCRUM является признанием BBOM и использует его в методологии, принимая энтропию как часть процесса и управляя ею, пытаясь документировать ее (технический дебют) и замедлять ее (рефакторинг). Да, вы должны начать как можно дальше от общего BBOM / Entropy, но в реальной жизни это не всегда так.
1
Хорошо, но вы не можете съесть «подразумеваемое ожидание». Это просто махание рукой. «Это будет хорошо спроектировано, потому что я профессионал и знаю, что делаю». (используя мой лучший голос Билла Мюррея) Да, верно.
Роберт Харви
3

Мы работаем со Scrum в течение нескольких месяцев, и я хочу поделиться своим опытом относительно вашей проблемы.

Несколько месяцев назад мне дали большой кусок для реализации. У меня были готовы все спецификации, поэтому я должен был соответственно реализовать новые функции. Задача была занять около 5-6 недель (как я подсчитал). Я провел первую неделю, работая только над дизайном. Задача была немного сложной: существовал главный объект, который, как я заключил из спецификации, имел 15 разных состояний, а пользовательский интерфейс должен был иметь разные поведения для каждого состояния.

Я разработал весь рабочий процесс, а также структуру и классы БД.

Я не вижу другого подхода в моем случае. Если бы я сразу погрузился в кодирование, в конце я бы получил большой неприятный беспорядок - почти невозможно поддерживать и чрезвычайно трудно вносить какие-либо дальнейшие изменения. Но изменения произошли в ближайшие 2 недели, поэтому мне пришлось переделать код. Теперь это было легко, с изначально продуманным дизайном. Это сэкономило наше время, деньги и нервы.

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

superM
источник
1
+1: очень интересный ответ. Сторонники Agile скажут вам, что вы должны разбить свою 6-недельную историю на более мелкие. Однажды мне дали похожий совет, и я ответил, что мои шесть однонедельных историй имели бы много зависимостей друг от друга: потому что даже если я изменю свой рабочий план, я не могу изменить проблемную область. Я не получил ответа на этот вопрос: Agile часто предполагает, что вы можете разбить свою работу на небольшие, независимые истории, но в реальном мире это не всегда так.
Джорджио
1

Задний взгляд 20-20. Если у вас была информация в начале проекта, чтобы выяснить все это, а затем написать код через несколько недель, я предлагаю вам сделать это.

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

Зачем кому-то с историей успешных проектов падения воды переключиться на гибкую методологию?

JeffO
источник
«Зачем кому-либо, имеющему историю успешных проектов падения воды, перейти на гибкую методологию?»: Очень хорошее наблюдение (+1). Я думаю, что выбор между водопадом и гибким должен быть связан с типом проектов, которые он делает: для проектов с плохо определенными требованиями, которые требуют частых прототипов и в которых прототип, вероятно, станет конечным продуктом, может быть уместен agile. Для проекта, в котором требования более стабильны, а надежность и стабильность более важны, водопад (или некоторая вариация), вероятно, является лучшим выбором.
Джорджио
0

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

Джеймс
источник
Является ли хорошей практикой планирование пользовательской истории дизайна ?
Джорджио
@ Джорджио: Это, вероятно, не нужно, но владелец продукта должен по крайней мере дать своей команде обзор ожиданий клиента в отношении проекта до его начала, а также объяснить, как он был разбит таким, какой он был.
Джеймс
1
Если кто-то отрицает, пожалуйста, укажите причину
Джеймс
Downvoters редко тратят время, чтобы объяснить, почему они понижают голос. Я нахожу это довольно раздражающим.
Джорджио