face

IT-аллегория

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

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

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

Покончив с анализом, я приступил к реализации проекта. Описывать это неинтересно, потому что здесь, в целом, всё прошло гладко. Из-за нехватки времени некоторые возможности пришлось оставить до следующей версии, но, главное, их было легко добавить, ничего не ломая. Самое интересное произошло спустя месяц, в финальной стадии разработки. Первым неладное почуял дизайнер, которому предстояло облагородить внешний вид прототипа. Ему показалось, что на рукоятке «отвёртки» слишком много кнопок. Я рассказал ему, зачем эти кнопки нужны, и показал, как пользоваться инструментом в различных режимах. Тогда дизайнер поинтересовался, а почему было не сделать, как у всех, просто горстку сменных насадок. Я объяснил, что фиксированный набор сменных насадок никогда не сравнится по широте возможностей с универсальной рабочей головкой, и был, после продолжительных дебатов, понят, однако затем аналогичную серию вопросов задал редактор технической документации, а вслед за ним — сотрудник отдела QA. Пришлось созвать совещание с участием начальника, главного аналитика проекта и других официальных лиц.

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

Вот тут бы, по-хорошему, провести новый раунд анализа, снова найти «общий знаменатель» и реализовать ещё один прототип. Но — вот незадача — до запланированного и объявленного уже в рекламной кампании срока выхода продукта на рынок осталось всего-ничего. На всё перечисленное времени нет, даже если не есть, не спать и не ходить по-малому. Поэтому, как ни крути, а придётся адаптировать уже существующий прототип к изменившейся постановке задачи. Это означает — расширять его в тех направлениях, в которых расширение не было предусмотрено. Это означает — реализовывать заведомо неправильные и недальновидные решения. Это означает — на выходе получить нечто не расширяемое уже ни в каких направлениях, сложное в отладке и поддержке, и, конечно же, утратившее всю изначальную красоту подхода.

Я взвесил эту нерадостную перспективу, вздохнул и убрал прототип вместе с чертежами и схемами в долгий ящик. Вместо того, чтобы уродовать имеющуюся мега-отвёртку напильником, я предпочёл сделать новую. Вообще не универсальную. Совсем не настраиваемую. Умеющую работать ровно с тремя, перечисленными в новом задании, типами шурупов — традиционным способом, с помощью сменных насадок, — и забивать гвозди. Поскольку это изделие было по своей сути полностью шаблонным и не содержало ни одного нетривиального узла, на изготовление нового прототипа у меня ушло три дня и три ночи, или что-то в этом роде. Один узел, не слишком важный, я всё же заимствовал в готовом виде из первоначальной модели. Это был аккумулятор — здесь ничего не поменялось, и переделывать эту часть не было необходимости. Результат получился вполне сносным — но это до тех пор, пока не потребовалось какое-нибудь расширение его возможностей.

Почему я выбрал такой путь? Ведь очевидно, что простенькая конструкция, которую я смог сколотить за трое суток, не обладает ни гибкостью, ни расширяемостью, ни масштабируемостью. Да вот только переделанный под новую задачу старый прототип едва ли мог бы этим похвастаться. Он гибок, но не в ту сторону; он расширяем, но не в том направлении; он масштабируем, но не по тем параметрам. Это естественно, поскольку Вообще Универсальную систему построить невозможно. Если нужно сделать что-либо универсальное, нужно сперва ответить на вопрос: что нужно охватить этой универсальностью? Неправильный (или впоследствии оказавшийся неправильным) ответ на этот вопрос приведёт к бесполезной потере времени и усилий. Попытка же использовать систему, являющуюся универсальной в одной плоскости, для охвата задач из другой плоскости приводит к потере всех преимуществ данной системы как универсальной, а в качестве бонуса приносит увеличенную сложность всей конструкции в целом. Раз уж нет возможности сделать правильно, лучше сделать неправильно, но просто, чем неправильно и сложно. То, что сделано за трое суток, в случае необходимости и переделать можно.

А первый прототип и теперь лежит у меня в ящике стола. Может, когда-нибудь ещё будет случай сдунуть с него пыль?

In English: IT Allegory
  • Current Music: J-J Goldman - Envole-moi
Tags:
есть такая фигня
(Anonymous)
в нашей работе всегда приходится идти на компромиссы...
порой даже чаще чем хотелось бы...

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

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

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

было бы интересно пообщаться на эту тему... может, я не прав?
Re: есть такая фигня
Да почему же не творческий? Был вполне нормальный творческий процесс. И всё бы хорошо получилось. Заметь: я ведь не написал нигде, что я сначала сделал хорошо (много возможностей, куча кнопок), а меня потом вынудили сделать плохо (одна кнопка). Я просто решал задачку с одним условием, а потом пришлось использовать результат для решения другой задачи. А когда так делают, получается ерунда.

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

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

Re: есть такая фигня
Ну вот ты же пользуешься Emacs. Вот уж обобщение из всех обобщений.
Re: есть такая фигня
emacs - это просто запускатель для многих различных lisp-программ, каждая из которых нифига не универсальна, а умеет только одно :)
Re: есть такая фигня
Думаю, ты неправ. Фундаментальное обобщение для Emacs звучит примерно так: текстовый редактор занимается обработкой текста, состоящего из строк, которые, в свою очередь, состоят из символов. И, да, есть вещи, которые сюда не укладываются. Например, приличного web-браузера для Emacs так и не появилось именно потому, что он работает с текстом, состоящим из строк. Картинки в концепцию с горем пополам впихнули, представив их как гипертрофированные символы; но произвольную графику и текст, размещённый в произвольных блоках, Emacs обрабатывать не может by design.
Re: есть такая фигня
Не соглашусь. Если ты на первых шагах не предсмотришь некоторые простые вещи, которые сейчас не нужны, но предусмотреть их не сложно - поимеешь дикий геморой очень скоро.

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

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

Универсальность имеет некий оптимальный уровень. Я мог бы купить отдельно дрель, отдельно отбойник, отдельно перфоратор. Однако, я купил все в одном. Почему? Да потому, что производителю ничего не стоит их совместить. Функциональность всех трех инструментов легко совмещается в одном агрегате и управляется одной ручкой. А вот, например, шуруповерт - это уже отдельный агрегат. Потому что к его реализации -- существенно другие требования.
Re: есть такая фигня
Но я точно знаю - через полгода придется переписать полностью, плюс поиметь геморой с миграцией.

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

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

Хотя наверняка есть ситуации, когда мы оба не правы.


PS: с последним абзацем согласен.
Re: есть такая фигня
Через полгода всё будет не так, как ты думаешь сейчас, и то, что ты предусмотрел сегодня, придётся убирать, так как надо будет совсем другое.

Нифига. Что-то, конечно, поменяется. Но базисные требования довольно устойчивы.
Аналогия из ремонта: тот факт, что через полгода кто-то захочет поменять обои, не исключает необходимости делать выравнивание стен сегодня.
Если "габариты" ПО вревышают определенный предел - оно уже не может не иметь скелета. За гибкость заплатишь хаосом.

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

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

Здесь стоит одна проблема - определить, что нужно юзеру.

Если определил неправильно - продукт идет на помойку. Вместе со всеми красивыми и правильными решениями (ибо сами по себе они никому не нужны).

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

Забавно, что в масса реально популярного ПО была слеплена кривыми руками "из того, что было". Да, сделано херово, но оно делает то, что нужно юзеру. А есть масса красивых в реализации проектов, которые оказались не нужны. И оказались на упомянутой помойке.

Интересно, нельзя ли совместить точный маркетинг с хорошей реализацией??

Есть мнение, что очень трудно найти менеджера, который

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

В зависимости от того, кто из 1) и 2) (в реальности это разные люди) главный - то и получаем. :) Тогда вопрос в грамотной кооперации.
Re: Reply to your post...
Дельный комментарий, но при чём здесь маркетинг? Надо поставить вопрос
так: можно ли совместить качественный анализ задачи с хорошей реализацией?
Можно. Есть много бесплатного софта, совмещающего то и другое. Основным
условием, обеспечивающим этим проектам такую возможность, на мой взгляд,
является отсутствие временного прессинга. Другое дело, что
затягивающиеся сроки выхода новых версий негативно влияют как раз на
популярность продукта, то есть на то, чем в коммерческих продуктах
занимается маркетинг.
Re: Reply to your post...
Дельный комментарий, но при чём здесь маркетинг?
Гм. А как же? Собственно задача определения того, чего хочет юзер, имеет самое непосредственное отношение именно к маркетингу. Под выражением "точный маркетинг" имелось ввиду именно точное маркетинговое позиционирование. То есть для кого - этот продукт (или его модуль). Для тех, кому нужна "универсальная рабочая головка" или для тех, "кому нужны 2-3 сменных насадки + возможность забивать гвозди".

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

много бесплатного софта, совмещающего то и другое.
Боюсь, этот софт немного из другой песни.

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

Ты же сам понимаешь, что отсутствие временного прессинга крайне не характерно для коммерческого софта. Если нас интересует результат, а не процесс - то есть временной прессинг. Замечу, что результат, полученный не своевременно, в коммерческом софте за результат засчитан никак не будет.
Re: Reply to your post...
>> можно ли совместить качественный анализ задачи с хорошей реализацией?
> О каком именно анализе ты говоришь? Хотя ... пожалуй, совместить можно в любом случае. В теории.

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

>> много бесплатного софта, совмещающего то и другое.
> Боюсь, этот софт немного из другой песни.

В упор не вижу, чем принципиально отличается в том аспекте, который мы обсуждаем.
Re: Reply to your post...
Если этот аспект - абстрактное соединение грамотного анализа продукта (делаем то, что нужно) с грамотной реализацией (делаем так, как правильно) - то может быть и никакой разницы.

Но с моей точки зрения - это сферический конь в вакууме. :)

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

Я просто одну такую историю - о гибели универсального решения в пользу простого, которое нужно пользователю - уже знаю. Речь, кстати шла о месяцах и годах работы. Но я так и не понял, почему они не смогли выразить простое решение, через средства универсального - создав некоторые шаблонные конфигурации, которые будут видны юзеру, но сохранив гибкость где-то внутри. Им ведь все-равно пришлось потом снова расширять функцональность. Юзер - существо не постоянное.
Re: Reply to your post...
У молотка, понимаешь, ядро другое. Отвёртка построена на электроприводе
для вращательного движения; для молотка нужно возвратно-поступательное.
Re: Reply to your post...
Я на самом деле - про насадки. Молоток - его можно просто вложить в коробку.

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

Вот и тебе нельзя было таким же манером просто положить в коробку со своей отверткой какой-нибудь молоток?

Кстати сочетание возвратно-поступательного и вращательного движения - очень продуктивно. Называется перфоратор. Рекомендую. :)
Re: Reply to your post...
Клиент хотел забивать гвозди и закручивать шурупы именно одним и тем же инструментом. Дело в том, что он с трудом отличает одни от других, и каждый раз греть голову по поводу того, отвёртка здесь нужна или молоток, клиент не желает.
Re: Reply to your post...
А сочетание возвратно-поступательного движения с вращательным нужно закладывать в ядро. Это как раз было бы во втором прототипе, если бы осталось время на второй раунд анализа.
Re: Reply to your post...
А сочетание возвратно-поступательного движения с вращательным нужно закладывать в ядро.

Вот я как раз считаю, что это должна быть насадка такая.
Re: Reply to your post...
Такая насадка является грязным хаком. Нечто вроде добавления в Emacs картинок путём представления их как особой разновидности символа. И возможности ограничены, и сложность избыточная.
Re: Reply to your post...
Есть много бесплатного софта, совмещающего то и другое.

Я не знаю ни одной хорошей бесплатной программы.
Re: Reply to your post...
А какие ты вообще знаешь хорошие программы?
Re: Reply to your post...
Ну... Maya, например, или 3DS. Autocad вроде мне понравился, но мало я с ним работал, чтобы судить о нём.

Хотя zsh, например, ничем не хуже.


Не, реально хороших программ я вообще не знаю, тут ты хорошо спросил.
Re: Reply to your post...
Ну, тут я мало что могу сказать, поскольку с трёхмерной графикой дела не имею. А что-нибудь более знакомое мне?
Прежде чем делать универсальную систему,
надо проанализировать все варинты её
использования :)
Re: Reply to your post...
Чтобы проанализировать все варианты использования, нужно о них знать.
Re: Reply to your post...
это задумывалось как шутка.

впрочем, положа руку на сердце, не возникало ли с самого начала
у тебя мысли что наш, эээ, контингент именно как раз и хочет
"3 стандартных насадки + возможность забивать гвозди"?

а ещё лучше, конечно, добиться таки от
наших коллег (начальства в первую очередь)
предварительного обсуждения.
У меня, правда, до сих пор не получалось этого.