Останнім часом я став свідком дедалі більшої кількості проблем, подібних до тих, що пояснюються у цій статті про перехрестя зображень. Іншим терміном для цього будуть продуктові лінії, хоча я, як правило, пов'язую їх із фактично різними продуктами, тоді як я зазвичай стикаюся з цими проблемами у вигляді можливих конфігурацій товару.
Основна ідея такого типу проблем проста: Ви додаєте функцію до продукту, але якимось чином ускладнюється через поєднання інших існуючих функцій. Зрештою, QA виявляє проблему з рідкісним поєднанням функцій, про які ніхто не думав раніше, і який повинен бути простим виправленням, навіть може перетворитись на вимогу великих змін дизайну.
Розміри цієї проблеми перетину особливостей мають вражаючу складність. Скажімо, поточна версія програмного забезпечення має N
функції, і ви додасте одну нову функцію. Давайте також спростимо речі, сказавши, що кожну з функцій можна вмикати або вимикати лише тоді ви вже маєте 2^(N+1)
можливі комбінації функцій. Через відсутність кращих формулювань / пошукових термінів я називаю існування цих комбінацій проблемою перетину функцій . (Бонусні бали за відповідь, включаючи посилання на більш встановлений термін.)
Тепер питання, з яким я боюся, - як вирішити цю проблему складності на кожному рівні процесу розвитку. З очевидних причин вартості недоцільно розглядати кожну комбінацію окремо, доки не є утопічною. Зрештою, ми намагаємось уважно триматися осторонь від алгоритмів експоненціальної складності, але перетворення самого процесу розвитку на чудовисько в експоненціальному розмірі неодмінно призведе до повного збою.
Тож як ви отримаєте найкращий результат систематично, що не вибухає жодних бюджетів і є повноцінним, корисним та професійно прийнятним способом.
Специфікація: Коли ви вказуєте нову функцію - як ви гарантуєте, що вона добре грає з усіма іншими дітьми?
Я бачу, що можна було систематично вивчати кожну існуючу особливість у поєднанні з новою функцією, але це було б ізольовано від інших ознак. Враховуючи складний характер деяких особливостей, цей ізольований погляд часто вже настільки задіяний, що йому потрібен структурований підхід сам по собі, не кажучи вже про
2^(N-1)
фактор, викликаний іншими ознаками, які людина охоче ігнорує.Впровадження: Коли ви реалізуєте функцію - як ви гарантуєте, що ваш код взаємодіє / перетинається належним чином у всіх випадках.
Знову ж, мені цікаво, яка вона складна. Мені відомі різні методики зменшення потенціалу помилок двох особливостей, що перетинаються, але жодна, яка б не була можливою в масштабах. Я припускаю, що хороша стратегія під час специфікації повинна тримати проблему під час впровадження.
Перевірка: Коли ви тестуєте функцію - як ви маєте справу з тим фактом, що ви можете протестувати лише частину простору перетину цієї функції?
Досить складно знати, що тестування однієї функції в ізоляції нічого не гарантує десь поруч із кодом без помилок, але коли ви зменшите це до частки,
2^-N
здається, що сотні випробувань не охоплюють жодної краплі води у всіх океанах разом . Ще гірше, що найбільш проблемними є помилки, що виникають у результаті перетину функцій, які, можливо, не очікують, що це призведе до будь-яких проблем, - але як ви перевіряєте їх, якщо ви не очікуєте такого сильного перетину?
Хоча я хотів би почути, як інші вирішують цю проблему, мене в першу чергу цікавить література чи статті, що аналізують цю тему більш глибоко. Тож якщо ви особисто дотримуєтесь певної стратегії, було б непогано включити у відповідь відповідні джерела.