Излишняя сложность как причина дополнительных скрытых издержек

Излишняя сложность как причина дополнительных скрытых издержек

Мы довольно часто говорим кому-то фразы наподобие «Мне необходимо всего лишь пара часов, дабы это сделать/реализовать/внедрить». Но спустя какое-то время по окончании завершения работ внезапно осознаём, что нам приходится систематично исправлять баги и неточности, растолковывать алгоритм и устройство работы вторым разработчикам и инженерам, либо помогать отвечать на вопросы клиентов. И получается, что количество времени, затраченного на поддержку вашего детища, многократно превышает те пара часов, что ушли на его создание.
Смотрите кроме этого: Моноблок Lenovo ThinkCentre TIO II поддерживает подключение дополнительных модулей

Компания Lenovo воображает второе поколение неповторимого компьютера ThinkCentre Tiny-In-One (TIO). В отличие от хороших моноблоков (AIO), каковые предлагают производительность класса настольных компьютеров в компактном корпусе, ThinkCentre TIO разрешает подключать к главной базе-монитору дополнительные модули. ThinkCentre TIO II будет доступен с 22- и 24-дюймовым дисплеем формата Full HD и соотношением сторон 16:9.

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

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

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

Либо создали новую функцию, которая нужна весьма ограниченному числу пользователей, но на исправление багов в ней тратится непропорционально большое количество времени и сил.Усложнение продукта ведёт к росту скрытых издержек. Решения, принимаемые нами на протяжении разработки ПО, воздействуют не только на скорость выпуска продукта. Они отражаются и на том, сколько времени и сил уйдёт на поддержку и продвижение.

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

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

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

Это проявление врождённого любопытства, в большинстве случаев характерного людям этих профессий. Большая часть из них уверены в том, что очередная новая разработка может волшебным образом решить какие-то текущие неприятности. К примеру, в то время, когда в 2011 году в Pinterest взялись за расширение собственного ресурса, они применяли шесть разных разработок хранения и баз данных: MySQL, Cassandra, Membase, Memcache, Redis и MongoDB.

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

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

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

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

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

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

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

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

В командах возможно скоро взять вывод от сотрудников о собственной работе, каковые укажут на неточности, подбодрят. А одиночки и этого не будут получать. В следствии это довольно часто ведет к понижению производительности, непреднамеренному качества усложнению и… падению работы кодовой базы либо инфраструктуры.Как бороться со сложностьюВ 1980 году Энтони Хоар сообщил: «Имеется два пути создания программной архитектуры. Первый — сделать её настолько простой, дабы в ней разумеется не было недочётов.

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

Спросите себя, стоит ли ответ 20% неприятности того, дабы проект был усложнён, либо достаточно закрыть проблему на 80%?Чётко выясните для команды миссию либо видение продукта. Авторы книги Team Geek поведали, как они наставляли команду разработчиков Гугл Web Toolkit, вдохновив их на правильное описание миссии. Последовавшие за тем дискуссии содержимого и формы подачи помогли узнать, что ведущие разработчики в действительности не согласны с неспециализированным видением того, как обязан смотреться конечный продукт!

Команде было нужно сесть и обсуждать все высказанные точки зрения, и в следствии была выработана такая цель: «Миссия GWT содержится в том, дабы радикально улучшить опыт применения веба, разрешив разработчикам использовать существующие Java-инструменты для построения бескомпромиссного AJAX во всех современных браузерах». какое количество сил и времени они израсходовали бы напрасно, если бы не обсудили все собственные разногласия на ранней стадии?Создавайте громадные совокупности из более несложных компонентов.

Гугл есть хорошим примером организации, сосредоточившейся на создании замечательных, базисных структур, каковые позже активно применяются во всевозможных приложениях. У них имеется такие базисные компоненты, как Protocol Buffers, Гугл File System, серверы Stubby. Поверх этих компонентов они надстраивают другие структуры, наподобие MapReduce и BigTable.

А на базе этого выстроено множество приложений, включая масштабный поисковик, сервис Гугл Analytics, кластер Гугл News, обработчик данных Гугл Earth, сервис анализа данных Гугл Zeitgeist и другое.Чётко определяйте интерфейсы сотрудничества между сервисами и модулями. Уменьшение связей между модулями сервисами разрешает уменьшить комбинаторную сложность кроме того маленького по количеству кода.

В 2002 году Джефф Безос постановил, что Amazon будет двигаться в направлении сервис-ориентированной архитектуры, и что все команды разработчиков будут коммуницировать между собой лишь через service-level интерфейсы. Не смотря на то, что эта изменение "настойчиво попросила" огромных затрат на разработку, разделение логики и кода одолжений облегчило создание весьма успешной на сегодня Amazon Web Services. Иногда «оплачивайте технический долг».

Мы постоянно создаём приложения в условиях недочёта нужных данных. В ответ на изменяющиеся условия кодовая база разрастается, что ведёт к росту энтропии. Усложнение проекта делается необычным налогом на будущие разработки. И снизить данный «налог» возможно выделением времени на соответствующие работы. Многие команды и разработчики занимаются этим в перерывах между проектами.

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

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

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

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

Случайная статья:

4.6 Виды издержек постоянные и переменные издержки


Похожие статьи:

Комментирование и размещение ссылок запрещено.

Обсуждение закрыто.