Бюджет клієнта $100k недосяжний
Розрив до вердикту — $275k. Без лічильників, нарахувань і оплат з банків Водоканал не зможе відмовитися від старої програми, тому вкластися можна лише скоротивши реліз 1 приблизно на три чверті.
Обвинувач починав з $280k, захисник — з $426k. Після перехресної перевірки обидва зблизилися з оцінкою команди
Оцінка команди
$358k
8 744 год, зовнішні ставки, з AI
Вердикт судді
$375k
9 183 год без резерву, діапазон $361–392k
З резервом 10%
$412k
резерв — окреме комерційне рішення
Дебати
Обвинувач доводить, що оцінка завелика і AI її сильно зменшить. Захисник — що вона замала і AI такого приросту не дасть. Обидва працювали з повними вимогами (15 сторінок) і всіма рядками оцінки, а потім перевірили аргументи одне одного. Суддя не бачив їхніх висновків заздалегідь і кожен спірний пункт перевірив сам.
Предмет — оцінка ITA-Водоканал: 8 744 год, $358k за зовнішніми ставками. Кожна цифра має посилатися на вимогу або рядок оцінки. Кожне прискорення від AI позначене як виміряне в пілоті або припущення.
Оцінка роздута, і щоб це побачити, AI не потрібен. У ній є роботи, яких у релізі 1 немає, і роботи, пораховані двічі. А те, що лишається, здебільшого однотипне — саме таку роботу агенти пишуть найшвидше.
Моя цифра — 6 813 год, ≈ $280k.
↩ Обвинувач«Моя цифра — 6 813 год, ≈ $280k»
$280k — це «оцінка мінус дублікати», а не вартість релізу. Ви тільки віднімаєте. Я пройшов вимоги проти оцінки рядок за рядком: бракує майже 2 000 год роботи. Перенесення даних фактично немає, рахунку абоненту немає.
Моя цифра — 10 456 год, ≈ $426k, з резервом — $469k.
Чи є в оцінці роботи, яких вимоги не просять?
Пенсійний фонд. В оцінці 80 год: тести ЕЦП-конверта, запитів статусу, списку запитів і парсер відповіді. А вимоги кажуть: «У релізі 1 процес ручний… КЕП не є частиною нового продукту». Ми тестуємо протокол, якого в продукті не буде.
Тести ПФУ на 60 год я сам викреслив ще у вступі. Тут сперечатися нема про що.
↩ Захисник«Тести ПФУ я сам викреслив»
Тоді й вхідний обмін із соцзахистом: парсер файлу «Пільга-2» від соцзахисту, звірка, синхронізація довідника — 92 год. Вимоги знають «Пільга-2» тільки як вивантаження. Цього ви у вступі не помітили.
Не помітив — визнаю. Але залишок по субсидіях не чіпайте: історію перенесених субсидій вимоги показувати вимагають.
Поза релізом 1: −408 год. ПФУ −100, вхідний соцзахист −106 (14 год лишаю на історію субсидій), перерозподіл небалансу на 12 місяців назад −64, макети без вимог −44, SFTP −36, юридичний борг −32, редактор калькуляції тарифу −20, збережені фільтри −6.
Чи оцінена одна й та сама робота двічі?
Перемикання робочого періоду: один рядок — POST /admin/working-period/switch, 16 год. Інший — POST /api/admin/working-period/switch з тими самими перевірками, 20 год. Завантаження файлу обміну — двічі по 16. Щомісячне нарахування — дві фонові задачі, 24 і 20. Таблиці відповідності кодів — дві різні таблиці для одного. Разом 260 год дублів.
↩ Обвинувач«з тими самими перевірками»
Не все це дублі. Другий рядок про період додає заборону проводок поза робочим періодом — це окрема вимога. Другий рядок про обсяги юросіб додає прив'язку до будинкового вузла. Журнал файлів оплат має контрольні суми й різницю — цього прямо вимагають фінанси.
Добре, на ці три лишаю по 8–12 год. А решта сім пар — ті самі серверні функції й ті самі фонові задачі. Їх ви не заперечили.
Сім пар — справжні дублі. 124 год, приймаю.
Дублі: −172 год. 124 за сім справжніх пар, 28 за три часткові, де друга копія додає окрему вимогу, і 20 за дубльовані тести.
Роздуті списки чи недооцінені лічильники?
Найменша сторінка вимог — 15 вимог до списків. В оцінці під неї 876 год. Дизайн компонента — 164 год, а фронтенд, який його будує, — 88. Тести — 260 год: окремий ручний кейс на кожну групу операторів фільтра. Серверний рушій фільтрів оцінено двічі: 32 і 24 год.
↩ Обвинувач«Найменша сторінка вимог — 876 год»
А тепер подивіться на лічильники: найбільша сторінка вимог, 187 КБ, — 212 год бекенду. Списки на 45 КБ — 312. Перекіс не в тому, що списки роздуті, а в тому, що лічильники недооцінені.
↩ Захисник«найбільша сторінка вимог, 187 КБ»
Розмір сторінки — не обсяг роботи. Частина логіки показів і будинкового розподілу сидить у рядках нарахувань і вузлів. Ваш пошук за ключовими словами її просто не знайшов — ви самі пишете, що розбивка «приблизна на ±1–2 рядки».
Подвійний рушій визнаю. Але 140 год дизайну на патерн, яким користуються близько 20 списків, — це не нуль. І права та друк на конкретних списках одним параметризованим набором тестів не перевіриш.
Тоді ще параметри обліку: модель одна, а в оцінці реалізована чотири рази. І окрема таблиця журналу для обміну, хоча вимоги кажуть: журнал дій один.
Спільні механізми: −270 год. Дизайн списків −92 (56 год на специфікацію патерну лишаю), подвійний рушій фільтрів −52, тести списків −52, параметри обліку −28, журнал −24, екрани довідників −22. Недооцінку лічильників частково визнаю — розглядаю її серед прогалин.
Чи оцінено перенесення даних зі старої програми?
Головна діра оцінки. Єдиний рядок розробки — «Міграція legacy-довідників „як є“», 32 год, і там тільки довідники. Рядок DevOps прямо каже: мапінг даних робить бекенд. А бекенду немає. Абоненти з історією, лічильники, покази, проводки, сальдо — нуль годин.
При цьому в QA є «Тестування міграції абонентів з legacy Access-бази». Тестуємо те, чого ніхто не будує.
↩ Захисник«Тестуємо те, чого ніхто не будує»
Тестів міграції в оцінці вже 68 год, не 24. А ви просите ще +100 год QA зверху.
↩ Обвинувач«Тестів міграції в оцінці вже 68 год»
Тестів — 68. Розробки — 32, і та на довідники. Що саме ці 68 годин тестуватимуть?
Розробки операційних даних справді немає — це ваша найсильніша знахідка. Але +556 завищено: беру 300 год бекенду і 40 тестів.
↩ Обвинувач«беру 300 год бекенду»
300 — якщо дані ІТА чисті. А вимоги 13 разів кажуть «якщо такі дані є». Цих даних ще ніхто не бачив.
Перенесення даних: +396 год. 340 бекенду на близько 10 груп сутностей по 30–40 год і 56 тестів — тільки на те, чого наявні 68 год не покривають. Це найменш визначений пункт усього вердикту.
Рахунок абоненту, банки, покази, нарахування
Рахунок абоненту стоїть першим у закритому переліку звітів. Його щомісяця отримує кожен абонент: реквізити, QR, послуги, небаланс, перерахунки, пільги, борг. В оцінці на нього — «Дизайн шаблону квитанції», 4 год. «небаланс.docx» згадано у вимогах 11 разів, а в розробці — нуль.
Реєстр звітів в оцінці сам генерує форми запуску з метаданих. Ваші 80 год фронтенду на запуск близько 19 форм — зайві.
↩ Обвинувач«Реєстр звітів сам генерує форми запуску»
Форму запуску — так. А сам рахунок із QR на кожного абонента реєстр теж згенерує? Бекенду на нього нуль.
Ні, не згенерує. Рахунок, небаланс, архівна довідка, пільгові звіти — беру 112 год бекенду, 24 фронтенду і 24 тестів.
Далі коротко:
↩ Захисник«ні фронтенду, ні бекенду»
Банк і касовий ордер — правда. А покази: парсер Приватбанку вже читає лічильник і показники, бракує лише передачі в лічильники і черги. Чернетки: статус «чернетка» вже є, а журнал непроведених — ще один список на спільному рушії. Бракує тільки блокування й екрана запуску.
Прогалини ядра: +608 год. Друковані форми з рахунком абоненту +168, типи показів і середній розрахунок +96, чернетки й блокування +88, покази з оплат +68, банківський файл +52, профілі чотирьох банків +32, тариф з межею +32, касовий ордер +24, екрани обсягів юросіб +24, стартовий перелік прав +24.
Чи можна зняти з оцінки ще й за рахунок AI?
Тепер головне. Близько 130 серверних рядків — це «сутність + історія + CRUD + endpoint». Близько 20 списків на одному рушії. 18 друкованих форм із закритого переліку. Вимоги — 106 тис. слів із нумерованими пунктами: вимога до «Пільга-2» перелічує всі 17 полів файлу. Для агента це готовий контракт.
Я не прошу ×2,5. Беру ×1,2–1,25 тільки на 4 598 год однотипної роботи, це ×1,13 на всю розробку. Фінанси, міграцію, права і запуск не чіпаю. І чесно позначаю: це припущення.
↩ Обвинувач«Беру ×1,2–1,25 тільки на однотипній роботі»
Команда каже: 8 744 год уже враховують AI. Без AI компанія сама рахує 12 000–13 500 год. 12 000 / 8 744 = 1,37×. Пілот виміряв 1,25×. Ви пропонуєте порахувати той самий ефект удруге.
↩ Захисник«12 000 / 8 744 = 1,37×»
12 000–13 500 — цифра з резервом. Без резерву 10–20% закладено ≈ 1,14–1,40×. І в рядках цього не видно: дизайн картки рахунку — 32 год, а фронтенд — 24. Хіба це схоже на оцінку з AI?
↩ Обвинувач«дизайн картки — 32 год, фронтенд — 24»
Це схоже на заниження фронтенду: в ньому немає екрана нарахування, списку непроведених, черги показів. А тепер подивіться у свій «однотипний» кошик тестів, де стоїть ×1,25: тести проводок, ручного рознесення оплат, «Пільга-2» з точністю до байта, міграції, фінансової регресії. Ви ж обіцяли їх не чіпати.
Пілот — два місяці й одна команда. Це рання точка кривої навчання, а не стеля.
↩ Обвинувач«рання точка кривої навчання»
Тоді це аргумент проти будь-якого множника, а не за ваш. А 1,76× — це людина на двох проєктах, а не дешевший проєкт. Кілька агентів в одній кодовій базі зіткнуться на рахунку, наданні послуги, проводці. Рядка на code review в оцінці немає — тільки 12 год архітектурних рев'ю.
Додатковий AI-шар відхилено. Без резерву компанія рахує 10 900–12 270 год, а це 1,25–1,40× від 8 744. Виміряні 1,25× вже в оцінці. Більший множник на однотипній роботі — припущення без виміру, а кошик обвинувача містить саме фінансові тести.
Хто виправлятиме дефекти і скільки закладати зверху?
Годин розробників на виправлення дефектів після запуску — нуль. QA планує UAT і hypercare, а виправляти хто буде? Вимоги називають перші 3–4 місяці критерієм успіху. Прошу +264 год і резерв 10%.
264 — це 8% усього бекенду й фронтенду, забагато. Беру 120. А резерв — не обсяг роботи, а комерційне рішення. Якщо додавати, то однаково до обох цифр.
↩ Обвинувач«резерв — комерційне рішення»
А ваш PM, який зменшується разом з обсягом? Рядки PM календарні: «Супровід щотижневої взаємодії» — 80 год, «Регулярне оновлення статусів» — 64. Менший обсяг календар не скорочує — ви це самі записали у свої ризики.
Запуск: +244 год. Стабілізація розробниками +180 (UAT близько 2 тижнів і hypercare близько 4: половина бекенду, чверть фронтенду), звірка нарахувань за місяць зі старою програмою +40, навчання ключових користувачів +24. Резерв — окремим рядком: 10% = $37,5k. PM рахую тією ж часткою 10,4% від чистої зміни обсягу: +41 год.
Після перехресної перевірки
Визнаю 1 048 год ваших прогалин і не множу їх на AI. Без AI-шару в мене 8 835 год, $361k — це рівень оцінки. З AI-шаром — ≈ $324k.
↩ Обвинувач«Без AI-шару в мене $361k»
Тобто вся різниця між нами — ваше припущення про AI. Я приймаю 748 год ваших скорочень. Моя цифра — 9 920 год, ≈ $404k, з резервом $444k.
↩ Захисник«Моя цифра — $404k»
А ваша «незалежна перевірка» — 12 000–13 500, поділені на 1,25, — вже містить резерв. І все одно ви пропонуєте 10 456 без резерву зверху.
Суддя прочитав усі записки, але не бачив висновків сторін заздалегідь. Спірні пункти і десять найбільших він перевірив сам.
8 744 год оцінка − 850 зайве + 1 248 бракує + 41 PM = 9 183 год
Вердикт, без резерву
$375kдіапазон $361–392kЗ резервом 10%
$412kрезерв — окреме комерційне рішенняОцінка за сумою майже правильна, але неправильно розподілена: 850 год у ній зайві, а 1 248 год потрібної роботи немає.
Поруч із цифрами компанії:
Бюджет $100k недосяжний. Розрив — $275k, для нього потрібне прискорення 3,75× у всіх ролях. Дизайн, архітектура, DevOps, тести й PM у вердикті самі коштують ≈ $162k. Вкластися можна, лише скоротивши реліз 1 приблизно на три чверті.
Обвинувач виграв сутички про скоуп і дублі: точні посилання, і 850 із його 966 год скорочень я прийняв. Захисник виграв про перенесення даних, рахунок абоненту і подвійний рахунок AI, але завищив розміри прогалин у півтора раза: просив 1 976 год, я прийняв 1 248.
Підсумок
Розрив до вердикту — $275k. Без лічильників, нарахувань і оплат з банків Водоканал не зможе відмовитися від старої програми, тому вкластися можна лише скоротивши реліз 1 приблизно на три чверті.
Усі цифри — за зовнішніми ставками, без резерву, якщо не сказано інше. Шкала від нуля до $426k.