Сколько разработчиков до непрерывной интеграции станет для нас эффективным?

34

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

В какой момент непрерывная интеграция окупается?

РЕДАКТИРОВАТЬ: Это были мои выводы

Настройка была CruiseControl.Net с Нант, чтение из VSS или TFS.

Вот несколько причин сбоя, которые не имеют ничего общего с настройкой:

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

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

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

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

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

Это типы проблем, которые возникали на сервере сборки для ежечасных тестовых прогонов и ночных сборок QA. Я считаю, что они не нужны, поскольку мастер сборки может выполнять эти задачи вручную во время выпуска, особенно с группой из одного человека и небольшой сборкой. Таким образом, одношаговые сборки не оправдали использование CI в моем опыте. А как насчет более сложных, многошаговых сборок? Это может быть трудно построить, особенно без сценария Нанта. Таким образом, даже создав их, они не были более успешными. Затраты на устранение проблем, связанных с красным светом, перевесили преимущества. В конце концов, разработчики потеряли интерес и поставили под сомнение обоснованность красного света.

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

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

Для работы CI недостаточно просто писать модульные тесты, пытаться поддерживать полное покрытие и обеспечивать работающую инфраструктуру для значительных систем.

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

CarneyCode
источник
13
Это может быть полезно даже для одной команды. Особенно, если у вас есть длительный набор тестов, гораздо лучше автоматически получать результаты ночной сборки и тестового прогона, чем делать это все время вручную.
SK-logic
3
@Carnotaurus, локальный клон удаленного репозитория git, избавляется от тайм-аута из системы контроля версий. Проблемы с сетью - для создания продукта? Теперь действительно ...
3
@Carnotaurus красный свет из-за качества данных или инфраструктуры является кодовым запахом Fragile Tests . См. Также : управление бременем единичных испытаний
k3b
1
Чем больше тест зависит от внешних аспектов, тем он более хрупкий. Пример: Если тест завершается успешно только в том случае, если клиент XY находится в базе данных, тест считается хрупким, если только тестовая настройка не гарантирует, что эта предпосылка существует, путем вставки данных в случае необходимости.
k3b
6
«Итог: зачем создавать рабочие продукты, когда мы можем заставить кого-то платить нам за его исправление, потому что не то, чтобы они ожидали, что программное обеспечение будет работать в первую очередь»? Это может не соответствовать юридическому определению, но для меня это звучит как мошенничество.
Крис Питман

Ответы:

43

Настройка CI-двигателя сродни настройке пожарной сигнализации в доме.

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

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

Также обратите внимание, что если вы позволите вашему CI-движку выполнять всю скучную работу, включая установку инсталляторов и т. Д., Вам не придется делать это вручную. Вы можете просто проверить свой источник и ждать, пока готовый продукт будет построен в стандартном месте. (РЕДАКТИРОВАТЬ: CI-механизм также работает в четко определенной среде, избегая каких-либо специфических настроек для разработчика, обеспечивая воспроизводимость)

Это также является частью обеспечения качества.


РЕДАКТИРОВАТЬ: После написания выше, у меня был опыт работы с инструментом сборки Maven для Java. По сути, это позволяет нам сохранить полную конфигурацию CI внутри проекта (с pom.xml), что значительно упрощает поддержку установки CI и / или миграцию на другой механизм CI.


источник
1
@Carnotaurus, в этом случае красный свет используется также для временных ошибок. Похоже на ограничение в CI-движке, который вы используете.
2
@ Carnotaurus, по моему опыту, работа, проделанная для тщательного документирования каждого аспекта всего, что касается, например, создания релиза, а затем выполнения упомянутых релизов несколько раз, больше, чем захват рабочего процесса в сценарии ant или maven, который затем может быть выполнен роботом. любое количество раз. Упомянутый робот также работает в чистой комнате, обеспечивая воспроизводимость сборок.
1
Обратите внимание, что искажение, которое я ищу, - это не провал модульных тестов, а то, что программы, которые мы отправляем, все еще могут создавать. Это уже не так важно, поскольку мы перешли на артефакты maven вместо компиляции всего для каждого выпуска, но все же важно знать, что сборка полностью функциональна. Нам просто нужна часть непрерывного развертывания тоже.
2
@Carnotaurus: я не говорю о системе сигнализации. Если тесты не пройдены, патч не будет интегрирован в основной репозиторий (вообще), гарантируя, что при извлечении / клонировании вы получите полностью рабочую копию и сможете сразу начать работать. Теперь, я согласен с вами, что тесты могут быть сложными для написания и поддержки ... но я работал с тестами и без них, и я вижу определенное улучшение качества с ними. Итак, вопрос: автоматизирован или нет? По моему опыту, тестирование вручную занимает больше времени, чем написание сценария автоматизации (но я работаю в большой корпорации с инструментами для этого).
Матье М.
5
« Нужно много работы, чтобы выявить несколько ошибок, которые компания все равно заплатит за исправление в рамках соглашения об обслуживании клиентов », - в таком случае у вас есть экономический стимул НЕ производить программное обеспечение с как можно меньшим количеством ошибок, и в этом случае все это не относится к вам.
33

Дело не в том, сколько разработчиков, а в том, сколько шагов нужно, чтобы получить от 1 до n (включительно), где 1 & n ...

1: проверка кода
И
n: наличие устанавливаемых \ развертываемых пакетов

Если n <2, возможно, вам не нужен CI
, вам нужен CI

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

Бинарный Беспорядок
источник
1
+1 - я могу многое добавить к вышесказанному - но это очень близко к сути того, почему мне нравится CI ... не только за то, что он делает, но и за то, что он требует от вас, чтобы сделать это работать (эти требования - вещи, которые вы действительно должны делать в любом случае).
Murph
2
@murph: Да, и это дает небольшие преимущества, такие как 1) знание того, что будет собираться в вашем репозитории, 2) сборка одним щелчком, 3) возможность выпустить версию в любой момент и многое другое
Binary Worrier,
Так что справедливо сказать, что это зависит от сложности того, что должно быть выпущено, измеряемой количеством шагов к развертыванию как способностью «тестировать» отдельные слои?
CarneyCode
1
@Carnotaurus: Извини, приятель, но я не уверен, что знаю, что ты пытаешься сказать. КИ не имеет ничего общего с тестированием. Да, вы можете - и должны - запускать модульные тесты как часть сборки, но они не должны зависеть от того, что не настроено как часть теста. Однако CI помогает тестированию. Одно из многих преимуществ CI заключается в том, что он позволяет команде QA немедленно и безошибочно воспринимать новые изменения кода. CI = способность к немедленному освобождению
бинарный беспорядок
1
@BinaryWorrier - я думаю, что шаг 1 проверяет код;)
10

Это может стоить усилий даже для команды из одного человека. Это особенно верно, когда вы разрабатываете кроссплатформенный код и вам нужно убедиться, что ваши изменения будут работать на обеих платформах. Например, компилятор Microsoft C ++ более приемлем, чем GCC, поэтому, если вы разрабатываете в Windows, но также должны поддерживать Linux, наличие системы CI сообщит вам, когда перерывы в сборке в Linux - огромная помощь.

Некоторые CI-системы довольно просты в настройке, поэтому накладные расходы не так уж велики. Попробуйте Дженкинс или Хадсон, например.

МЧ
источник
Я не рассматривал кроссплатформенный сценарий. Если для создания разных сборок нужны разные компиляторы, то для CI есть веские аргументы - возьмите верх.
CarneyCode
4

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

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

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

Стивен Бейли
источник
Таким образом, длина проекта (размер проекта) важна для вас CI? Я обнаружил, что ложные срабатывания очень дороги.
CarneyCode
Да, вам нужно время, чтобы окупить затраты на настройку и обучение. В теории вы должны со временем научиться устранять ложные тревоги.
Стивен Бейли
Да, это теория
CarneyCode
Ну нет, это практика. Со временем вы делаете заметки о том, какие тесты являются хрупкими, а какие - нет, и вы не слишком беспокоитесь, если ваши хрупкие тесты ломаются, если они не ломаются несколько раз подряд. По мере того, как вы учитесь, вы пишете более изолированные и надежные тесты и позволяете унаследованному покрытию со временем, а не делать все сразу. На практике CI - не серебряная пуля, это изменение процесса, которое требует времени и, в конечном итоге, приводит к снижению количества ошибок в программном обеспечении.
Philododad
3

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

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

Выполнение этого с нуля занимает час или около того (возможно, один день с Google, если вы не сделали этого раньше). Это ничего не стоит, потому что все инструменты доступны бесплатно.

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

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


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

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

Во всех остальных случаях это чистый выигрыш.

Маке
источник
Я думаю, что это то, откуда я тоже. Это тоже намного дешевле.
CarneyCode
Что вы подразумеваете под проверкой в ​​этом случае? Если это автоматизировано, происходит как можно чаще и помогает выявить умственные ошибки и упущения, тогда я полностью за это. :-)
Уильям Пейн
1

Накладные расходы минимальны. Я бы сказал, что для одного человека это было бы полезно. Как только вы достигнете двух, это бесценно.

Я согласен, что для проектов с одним человеком, если у вас есть «пошаговая сборка / проверка», тогда вы можете быть в порядке с непрерывной интеграцией, но в этих случаях вы проделали большую часть тяжелой работы по настройке CI, так что можно просто поставить это в формальной системе (CC, Hudson, TeamCity и т. д.).

Майк
источник
Вы имеете в виду без КИ?
CarneyCode
1

На вопрос, когда КИ окупается, трудно ответить на новый проект.

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

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

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

Майк Корнелл
источник
1
Для замены ручного регрессионного теста на некоторые пользовательские интерфейсы автоматических тестов требуется немало времени и навыков. В одной компании один парень написал около 40% тестов и ушел из компании. Несколько лет спустя тесты еще не были написаны. Могу поспорить, это типично.
CarneyCode
Нет, это не типично.
Quant_Dev
Я не видел много встречных доказательств
CarneyCode
Если вы пишете интеграционные / приемочные тесты на естественном языке DSL, такие как Gherkin, вы можете легко перевести автоматизированный тест на ручной. Так что я не вижу в этом проблемы.
Майк Корнелл
@Carnotaurus - я думаю, что это типично. Я тоже видел это дважды. Автоматизированные тесты пользовательского интерфейса сложны.
Роклан
1

КИ всегда всегда стоит того: чувство безопасности, которое оно дает, позволяет вам работать с большей скоростью, чем это было бы возможно в противном случае. Кажется, что проблема у вас вращается вокруг модульных тестов. Я согласен с тем, что модульные тесты очень дороги, но также думаю, что (для многих вещей) они являются наименее худшим вариантом, который у нас есть. Лично, и для систем, над которыми я склонен работать, я клянусь тестами системного уровня, работающими на комбинации реальных и (возможно, синтетических) патологических случаев; Это дешевле, чем юнит-тесты, и попадает в те труднодоступные уголки вашей концептуальной вселенной: «Неизвестные неизвестные» Дональда Рамсфелда.

Уильям Пейн
источник
Мне нравится немного о тестах пользовательского интерфейса на уровне системы. Большая часть тестирования теряется в тумане юнит-тестов сомнительного качества и охвата.
CarneyCode
Охват также является вопросом человеческой психологии; у нас есть врожденная тенденция писать тесты для тех случаев, о которых мы уже думали. Именно по этой причине для сертификации на высоком уровне SIL модульные тесты должны быть написаны отдельной командой из той, которая разработала тестируемую систему, и даже в этом случае существует множество случаев и ситуаций, которые очевидны только для всех ретроспективно. Требуется тщательная проверка покрытия кода; но необычайно сложно и дорого.
Уильям Пейн
... Отсюда выгода, которую вы получаете, выбрасывая самый неприятный мусор, который вы можете найти в системе на верхнем уровне, и наблюдая, что происходит ... :-)
Уильям Пейн
1
+1 - полностью согласен. Некоторые части системы просто не могут быть проверены модулем (например, ребра, как в базе данных). Конечно, вы можете издеваться над БД, но это оставляет код, который обращается к БД, без проверки. В какой-то момент вам нужно написать несколько реальных тестов, которые интегрируют ваши системы и общаются с другими системами. Когда вы делаете это, вы всегда обнаруживаете ошибки, которые вы пропустили в уютном чистом мире модульного теста и фреймворк-фреймворка (на ум приходит LINQ to SQL).
На самом деле, я недавно обнаружил интересный взгляд на нечеткое тестирование, которое могло бы помочь в
Уильям Пейн
0

Всегда используйте его, независимо от размера команды. Если, например, только вы, кто знает, возможно, вы пишете код со своего ноутбука в Starbucks, а затем продолжаете работать в своей более мощной системе дома?

Накладные расходы не так уж и плохи.

Julio
источник
0

Один. Да, достаточно начать использовать непрерывную интеграцию.

java_mouse
источник
0

Дело не в том, сколько разработчиков, а в

а. Сколько времени вы экономите с помощью автоматизации и как часто.

  • Время, сэкономленное на сборке после интеграции, выполнении автоматических тестов и создании настроек * частота регистрации = процент сэкономленного времени.

б. Сколько версий / веток / продуктов у вас есть.

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