Architecture Notes7 хв читання

Чому наш генератор модулів Odoo не побудував функцію, яку ми просили?

Команда OdoMate

Чому наш генератор модулів Odoo не побудував функцію, яку ми просили?

Ми попросили OdoMate — наш генератор модулів Odoo на основі ШІ — додати колонку знижок до звіту з продажів Odoo. Він її не зробив, бо в Odoo 19 така колонка вже є. Друга копія додала б до системи те, що не дає нічого, але тягнеться крізь кожне наступне оновлення.

Так ці інструменти зазвичай не поводяться. Попросіть асистента, який пише код, — і він напише, що завгодно. Питання, чи мало це взагалі існувати, більшість із них собі не ставить.

Звіт, який ми замовили

Цього літа ми згенерували модуль для Odoo 19: він застосовує знижку до всього замовлення, а великі знижки відправляє керівникові на погодження. Ми вже розбирали, як він виглядає поруч з усталеним модулем з Apps Store — тим, що має понад 21 000 завантажень.

Готуючи те порівняння, ми думали, що знайшли функціонал, якого нашому модулю бракує. Інший модуль виводить власні цифри знижок у звіт з продажів Odoo — той екран, де продажі розкладають за менеджером, клієнтом, товаром чи періодом. У нашому модулі, наскільки ми бачили, не було коду, який робив би щось подібне.

Виглядало так, ніби наш власний генератор тихцем пропустив частину того, що ми просили зробити. Тож ми скористалися функцією «Покращити», яка доступна в платформі, і попросили вивести цифри знижок у звіт з продажів. Цей функціонал дає змогу користувачу описати, що треба змінити в поточній версії модуля, дає можливість додати скріншоти і повертає оновлену версію з відповідними виправленнями.

Проте коли ми отримали оновлену версію модуля — звіту в ньому все ще не було.

Що OdoMate повернув натомість

Тоді ми пішли у файли самого модуля — подивитися, що цей раунд змінив насправді.

У модулі з'явилася автоматична перевірка: вона відкриває власний звіт з продажів Odoo, проганяє через нього замовлення зі знижкою й підтверджує, що знижка там показується правильно. Поруч стояв один рядок пояснення: цей показник Odoo дає сам.

Ось ця нотатка — точно в тому вигляді, як вона лежить у модулі:

def test_sale_report_discount_measure(self):
    # sale.report ships its own 'discount' measure natively (feeding its
    # discount_amount); this pins that it reflects our order-level fan-out.

Якщо перекласти з "інженерної" мови: Odoo вже дає цю цифру. Ця перевірка існує, щоб пересвідчитися, що знижка, яку рахує наш модуль, у ній відображається правильно.

Посібник користувача теж змінився у тому ж раунді. Тепер там дослівно написано:

Аналітика продажів (sale.report) має той самий вимірник Discount % для комерційних пропозицій і замовлень — відкрийте Sales → Reporting → Sales, перемкніться на зведену таблицю чи графік і додайте Discount % поруч зі стандартними вимірниками.

І тут не треба вірити нам на слово. Власний звіт з продажів Odoo має Discount % і Discount Amount як стандартні вимірники — це видно у вихідному коді самої платформи.

Тобто замість того, щоб побудувати функцію, він записав, де знайти ту, яку Odoo вже дає.

І ніде в модулі не з'явилося нового коду для звітності. Нічого не було недобудоване й нічого не залишилося зламаним. Замість другої копії наявного звіту раунд дав записану причину не будувати її — і перевірку, яка доводить, що власний звіт Odoo працює з нашим модулем.

Ми просили функцію. А потрібно нам було, щоб нам сказали: функція вже є.

Чому це незвично

Асистент, який пише код, за замовчуванням слухняний. Ви просите — він робить. Саме це здебільшого й робить його корисним, і саме тут ховається помилка, яку найважче побачити: код працює, тести проходять, на рев'ю причепитися нема до чого. Просто цього коду не мало бути.

Про те, що це робить з кодовою базою, вже є галузеві дані. GitClear проаналізував 623 мільйони змінених рядків коду за 2023–2026 роки: дублювання блоків коду зросло на 81% — найвищий показник за всі роки їхніх спостережень, — тоді як частка змінених рядків, які впорядковують і повторно використовують наявний код замість писати новий (GitClear називає це moved code), впала з 21% у 2022-му до 3,8%.

Тут варто бути точними в тому, що ці цифри кажуть, а що ні. GitClear міряє дублювання всередині кодової бази, а не код, який дублює те, що вже дає платформа. Це не вимір нашого випадку. Але тенденція та сама: що ширше розходяться ці інструменти, то більше коду пишуть з нуля — і то рідше беруть те, що вже написано.

Скільки насправді коштує код, якого вам не треба

Написати код — дешево. Підтримувати його — дорого.

Odoo випускає велике оновлення щороку, і кожен рядок, який належить вашому бізнесу, має пережити кожне з них: його читають, перевіряють і лагодять там, де зміни платформи вплинули на нього. Код, який дублює те, що Odoo й так робить, не дає вам нічого — але щороку потрапляє в рахунок за оновлення, доки ви ним користуєтесь.

Крім того, обсяг коду, який доводиться підтримувати, просто зростає. Кожне зайве поле, вікно чи правило — це ще одна річ, яку може зламати майбутня зміна в Odoo, і ще одна річ, яку наступна людина мусить зрозуміти, перш ніж безпечно торкнутися суміжного функціоналу.

Ми бачили, як це стається, коли готували порівняння: кілька років тому, ще під давнішу версію Odoo, розробники іншого модуля додали власну колонку знижок до звіту з продажів. Сьогодні Odoo дає цю колонку сама, а їхній код у 19-й версії вже не виконується — лишився тільки підпис, який перейменовує рідну колонку Odoo і вводить читача в оману. Це наслідок плину часу, а не чиясь недбалість. І навряд чи хтось обрав би такі витрати свідомо.

Що варто покращити в OdoMate

Рішення OdoMate було правильним. А от те, як він про це рішення повідомив, — ні.

У підсумку того раунду ніде не було сказано, що запитану функцію свідомо пропустили, і чому. Пояснення лежало тільки в коментарі всередині коду — там, куди бізнес-користувач ніколи не загляне. Ми знайшли його, відкривши файли, — але очікувати такого від бізнес-користувача недоцільно.

Це справді прогалина. Коли раунд генерації вирішує чогось не робити, він має прямо про це сказати у своєму підсумку — і назвати причину. Це вже додано в роадмапу розвитку платформи.

Чого це не доводить

  • Наразі ми спостерігали таку поведінку один раз. Ми описуємо один запит до одного модуля. Ми не стверджуємо, що генератор щоразу зважує, чи є така функція в платформі: один випадок — це спостереження, а не властивість продукту.

  • Обсяг вузький. Один процес зі знижками в продажах. Нічого з цього автоматично не переноситься ні на складну бухгалтерську логіку, ні на щось, що має спілкуватися із системою поза Odoo.

  • Згенерований код усе одно потребує перевірки людиною перед продакшеном. Прогалину в цій самій історії знайшла людина, яка читала файли, а не інструмент, який про неї повідомив.

Спробуйте на своїй задачі

Подивіться специфікацію й модуль, який з неї вийшов, або повне порівняння з модулем з Apps Store.

А тоді спробуйте з власною вимогою. Перегляньте модуль, а потім подайте заявку на ранній бета-доступ — ми розглядаємо їх послідовно й підключаємо користувачів невеликими групами.

FAQ

Що таке генератор модулів Odoo на основі ШІ? OdoMate — саме такий інструмент. Ви описуєте бізнес-вимогу звичайною мовою, а він створює робочий модуль Odoo — код, автоматичні перевірки, посібник користувача, написаний для тих, хто цим користуватиметься, і файли перекладу інтерфейсу, — після чого встановлює його на справжню систему Odoo й тестує там. Ви перевіряєте результат, замість того щоб писати його.

Чи побудує ШІ функцію, яка в моїй системі вже є? Може — і саме до цього ризику варто бути готовим. Асистент сприймає запит як вказівку, а не як питання, яке варто спершу перевірити: ви отримуєте робочий, перевірений тестами код для того, що платформа вже дає, і на рев'ю до нього не причепитися, бо з ним усе гаразд. У випадку, описаному тут, OdoMate зробив навпаки: коли в нього попросили вимірник знижки, який Odoo вже дає, він не став будувати другий і записав чому. Це одне спостереження, а не гарантія — але саме про таку поведінку варто питати будь-який генератор, перш ніж його купувати.

Чи показує Odoo знижки у звіті з продажів? Так. У звіті з продажів Odoo 19 вимірник знижки є за замовчуванням — навіть два: відсоток і сума. Відкрийте Sales → Reporting → Sales, перемкніться на зведену таблицю чи графік і додайте його.

Чому зайвий код у модулі Odoo коштує грошей? Бо ви платите за нього далі. Odoo випускає велике оновлення щороку, і весь код, що вам належить, доводиться щоразу перевіряти й лагодити відповідно до змін в новій версії. Код, який дублює те, що Odoo вже дає, — це регулярні витрати, які не приносять вам цінності.

Чи можна змінити модуль, не починаючи генерацію спочатку? Так — для цього в платформі є функція «Покращити». Ви описуєте, що має працювати інакше, додаєте скріншоти, і наявний модуль допрацьовується, а не генерується наново. Саме такий раунд описано в цій статті. Кожна версія зберігається — і вимога, і згенеровані з неї модулі, — тож ви можете повернутися до попередньої версії, якщо раунд пішов не так, як планувалося.