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


47

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

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

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

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

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

Ответы:


85

Среди многих бизнес-пользователей и клиентов существует общее представление о том, что когда оно выглядит завершенным, оно почти завершено. Как вы, вероятно, знаете, это далеко от истины. Можно сделать так, чтобы он выглядел красиво, но без серверной части, и некоторые пользователи считают, что сделать его красиво - это 80% работы, а не 20% ( или другие 80% ).

Бесчисленные разработчики могут рассказать ужасные истории об этом - макет страниц, сделанных в Microsoft Word, используя снимки экрана какого-либо другого инструмента, и клиент, говорящий: «Итак, вы почти сделали это?»

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

Наихудший случай с «первым и вторым» - когда вы переходите к другой части, вы обнаруживаете, что она совсем не соответствует дизайну.

Таким образом, построить оба. Покажите прогресс в передней части, сделайте так, чтобы бэкэнд работал с тем, что вы строите. Во многих случаях хорошей идеей является создание инкрементных сборок и проверка того, что вы делаете то, что хочет клиент (это входит в Agile). Если слишком долго обходиться без «видимых достижений», это может повредить отношениям с клиентом (это касается обоих случаев: «все выглядит рано» и «ничего не сделано до самого конца» - клиенту сложно увидеть, как пишется структура или модульные тесты или очистка данных как прогресс).

Джоэл написал об этом в «Секрете айсберга» :

Важное следствие два. Если вы покажете непрограммисту экран с пользовательским интерфейсом, который на 100% красив, они подумают, что программа почти готова.

Люди, которые не являются программистами, просто смотрят на экран и видят пиксели. И если пиксели выглядят так, как будто они составляют программу, которая что-то делает, они думают: «О, черт возьми, насколько сложнее было бы заставить ее работать на самом деле?»

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

Это снова повторяется в посте блога. Не заставляйте демо-версию выглядеть готовой, на которой есть этот полезный график:

Как это делается для того, как это выглядит

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

То, как «сделано» что-то выглядит, должно совпадать с тем, как «сделано» что-то.

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

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


Для тех, кто борется с этим в мире Java Swing, есть внешний вид под названием Napkin, который делает его таким, чтобы пользовательский интерфейс не выглядел полным (даже если это так).

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


Дальнейшее чтение (и ссылки из статьи):


7
Похоже, вы предлагаете какую-то гибкую методологию ... :)
Александр

7
@ Александр Agile помогает в этом случае, но это не обязательно. Водопад может иметь (поставляемые) вехи, и клиенты могут быть очень разочарованы, увидев, что "все выглядит готово, почему есть еще 3 мили миль, которые занимают столько же времени?" FWIW, у меня были случаи, когда бизнес-пользователь думал, что это было сделано, потому что скриншот + мс краски в техническом дизайне (магазин водопада) выглядели хорошо.

3
Если вы не видели ответа эксперта на это видео, вот оно: youtu.be/B7MIJP90biM
ragol

3
Я разрабатывал пользовательские интерфейсы для большей части моей карьеры программиста, и НЕ РАЗ, когда у меня был клиент, предполагал, что прототип пользовательского интерфейса означал, что программное обеспечение «почти готово». Для меня это звучит так, будто докладчики каркасных интерфейсов не очень хорошо объясняют каркасы, если клиенты каким-то образом запутываются, думая, что проект почти завершен.
Грэм

2
+1 для салфетки L & F. Это наверняка будет в моем будущем. :)
Кэти

27

Это зависит от вас : вам нужна тесная обратная связь вокруг наиболее важной части вашей функциональности

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

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

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


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

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

8

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

В упомянутом вами примере приложения вы начинаете с окна и, возможно, с одной вкладки, и заставляете все работать в некотором роде. Затем со временем вы добавите функциональность и, следовательно, вкладки в каждом конкретном случае, чтобы каждая функция работала при ее создании. Это часть того, что дают вам частые демонстрации клиентов: возможность показать что-то новое, работающее и мгновенно получить обратную связь.

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

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


+1 Всегда важно иметь что-то, что можно отправить.
JensG

@Jens: «Всегда иметь при себе отгружаемый кусок чего-то важного» - это слух. В лучшем случае это высказывание относится только к меньшинству программных приложений. В реальном мире приложения, которые выполняют только часть необходимой работы, ни на что не годятся.
Данк

Это ваш опыт. У меня разные. Крупные, реальные проекты с большим количеством этапов и реальных клиентов.
JensG

1
@Dunk: приложение, которое не выполняет какую-либо часть работы, менее полезно, чем приложение, выполняющее часть работы. Я, однако, не говорю о приложении, которое «сделано»; Я говорю о порядке создания приложения. Мой опыт совпадает с JensG: всегда возможность сократить бета-версию на основе того, что вы продемонстрировали на этой неделе, и сразу же отправить ее клиентам, что делает их намного счастливее.
Кит Б,

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

3

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

Кстати, разве не так разработано большинство крупных программ с графическим интерфейсом? Посмотрите, например, в браузер Firefox : от одной версии к другой развивались как функциональность, так и пользовательский интерфейс.


2

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

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


Это то, что я пытаюсь сделать. Поскольку мой конкретный проект реализован в виде массивной оболочки пользовательского интерфейса, и каждый харвестер datapoint является плагином, каждый плагин отвечает за управление своими собственными компонентами пользовательского интерфейса. Таким образом, для данного человека / группы людей не требуется «контракт». Предполагается, что одна и та же группа людей будет работать над заданным плагином от начала до конца. Это одна из причин, почему я создаю это так, как я есть. С другой стороны, для других проектов это отличный совет. Так что отзывайтесь от меня, так как это будет полезно другим.
RobotHumans

2

Я склоняюсь к тому, чтобы начать с дрянного пользовательского интерфейса, который просто выводит переменные данные на экран. Нет шрифтов, нет выравнивания, ничего графического на долгое время. Просто «Welcome user x» и кнопки, называемые «load pic» и т. Д. Что хорошего в этом, вы узнаете, не сломано ли что-то в бэкэнде.

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

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


И где клиент вступает в игру в вашей методологии? Имейте в виду, что обычно ваш клиент имеет только общее представление о том, что он хочет. Вам решать, как «извлечь из них» именно то, что они хотят, чтобы вы могли это построить. Ваша методология просто построила то, что вы думаете, что клиент хочет, но это редко будет тем, что клиент на самом деле хочет. Таким образом, вы потратили кучу времени на кодирование того, что клиент не хочет.
Данк

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

0

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


0

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

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


0

По-разному. Насколько четко определены ваши требования? Какая часть системы стоит перед пользовательским интерфейсом?

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

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

Затем у вас есть свои спринты и вы постоянно общаетесь с клиентом, разрабатывая как пользовательский интерфейс, так и функциональные аспекты.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.