ИТ развој

Backend Craftsmanship: Building AI's Understanding from Your Code

Занаетчиство за бекенд: Градење на разбирањето на ВИ од вашиот код

Кодот е суровината за разбирањето на ВИ

Функционалностите со ВИ често започнуваат со примамлива претпоставка: насочете модел кон кодната база, додадете поле за разговор и оставете го да одговара на прашања. Во пракса, квалитетот на одговорите на асистентот со ВИ е ограничен многу пред дизајнот на потсетниците да влезе во разговорот. Тој е ограничен од архитектурата, именувањето, границите, договорите за податоци и оперативните навики што веќе се вградени во бекендот.

Моделот може да сумира класа. Може да следи познат образец низ датотеки. Но се мачи кога деловните правила се расфрлани низ контролери, активатори на база на податоци, потрошувачи на редици и недокументирани исклучоци. Истото важи и за човечките инженери. Ако еден систем е тежок за разбирање за нов развивач, ќе биде тежок и за да се направи сигурно корисен за алатки напојувани со ВИ.

Ова повторно му дава вредност на бекенд-занаетчиството. Чистиот дизајн не е само естетски, а документацијата не е само артефакт за предавање. Заедно, тие го создаваат контекстот од кој системот со ВИ може да формира корисни, ограничени објаснувања.

Нека системот раскаже кохерентна приказна

Најкорисните кодни бази ја откриваат намерата на повеќе нивоа. Рутирањето покажува што изложува системот. Апликациска услуга опишува деловна акција. Доменски објект ги штити правилата. Репозиториум или портал ја прави перзистентноста експлицитна. Ниту еден од овие слоеви не мора да биде сложен, но нивните одговорности треба да бидат читливи.

Разгледајте крајна точка што прифаќа барање за плаќање. Контролер што го валидира HTTP-влезот, пресметува цени, ја менува состојбата на нарачката, создава запис за плаќање, испраќа е-пошта и објавува настан може да работи. Сепак, не му дава на асистентот со ВИ очигледен одговор на едноставно прашање како: „Каде се обработува авторизацијата на плаќањето?“

Потесна композиција го прави одговорот видлив:

final class CapturePaymentAction
{
    public function __construct(
        private PaymentAuthorizer $authorizer,
        private OrderRepository $orders,
        private TransactionManager $transactions,
        private PaymentCapturedPublisher $publisher,
    ) {
    }

    public function execute(CapturePaymentCommand $command): void
    {
        $this->transactions->run(function () use ($command): void {
            $order = $this->orders->get($command->orderId);

            $this->authorizer->capture(
                $order,
                $command->paymentMethodId
            );

            $order->markPaid();
            $this->orders->save($order);
        });

        $this->publisher->publishFor($command->orderId);
    }
}

Примерот не гарантира исправен систем за плаќање. Вистинските имплементации мора да се справат со идемпотентност, неуспеси кај давателот, повторни обиди и испорака на настани. Но тој воспоставува места каде што припаѓаат тие грижи. Тоа е вредно за одржувачите и за алатките со ВИ што преземаат релевантен код.

Имињата се инфраструктура за пребарување

Развивачите понекогаш го третираат именувањето како локален проблем со читливоста. Во работен тек потпомогнат од ВИ, имињата исто така одредуваат дали сродните концепти може да се најдат и поврзат. Метод наречен process() не кажува многу ниту на лице ниту на модел без околниот контекст. captureAuthorizedPayment() носи значајно ограничување во своето име.

Целта не е церемонијална опширност. Таа е стабилен речник. Изберете поими што одговараат на деловниот јазик и повторно користете ги доследно низ API-ја, команди, колони во базата на податоци, настани и тестови. Ако системот разликува фактура од нарачка, не користете ги тие зборови наизменично само затоа што нивните тековни полиња случајно изгледаат слично.

  • Користете глаголи за операции што ја менуваат состојбата: reserveInventory, cancelSubscription, issueRefund.
  • Користете именки за трајни концепти: Invoice, Fulfillment, TaxRate.
  • Направете ги двосмислените состојби експлицитни: pending_review е поинформативно од pending кога постојат неколку работни текови.
  • Одржувајте ги имињата на полињата во јавниот API усогласени со јазикот што се користи во документацијата и интеграциите со клиенти.

Доследниот јазик го стеснува опсегот на веродостојни толкувања. Токму тоа ѝ е потребно на сигурната автоматизација.

Поставете ги правилата блиску до податоците што ги штитат

Бекенд-системите стануваат тешки за објаснување кога инваријантите се спроведуваат недоследно. Една крајна точка може да спречи нарачка да биде испратена пред плаќањето, додека административна задача директно го ажурира истиот статус. Базата на податоци може да дозволи состојби што апликацијата никогаш не планира да ги создаде. Асистент со ВИ, прашан за валидни премини, ќе најде противречни докази.

Важните правила треба да имаат авторитативен дом. Тоа може да биде доменски објект, наменска услуга или ограничување во базата на податоци, зависно од правилото и архитектурата. Клучно е заобиколувањето на правилото да биде тешко и видливо.

final class Order
{
    public function markShipped(): void
    {
        if ($this->paymentStatus !== PaymentStatus::Captured) {
            throw new DomainException('A paid order is required before shipping.');
        }

        if ($this->shipmentStatus === ShipmentStatus::Shipped) {
            return;
        }

        $this->shipmentStatus = ShipmentStatus::Shipped;
    }
}

Ова не го заменува интегритетот на базата на податоци. За критични односи и барања за единственост, ограничувањата на базата на податоци остануваат суштински. Апликациските правила обезбедуваат значајно однесување; ограничувањата на базата на податоци обезбедуваат последна линија на одбрана кога повеќе процеси запишуваат во истите податоци.

Документирајте ги одлуките, не очигледната синтакса

Коментарите што го прераскажуваат кодот ретко го подобруваат разбирањето. Записите за одлуки и фокусираната документација го прават тоа. Вредниот контекст обично е причината поради која постои граница, режимот на неуспех што го спречува или прифатениот компромис.

На пример, кратка белешка може да објасни зошто барањето запишува во outbox-табела во истата трансакција како и ажурирањето на нарачката: системот мора да избегне да ја евидентира нарачката како платена, додека тивко го губи настанот од кој зависи последователното исполнување. Тоа објаснување е многу покорисно од коментар што вели „insert outbox record.“

Чувајте ја таквата документација блиску до кодот или во лесно пронаоѓлива архитектонска област. Ажурирајте ја кога се менува одлуката. Застарените објаснувања се полоши од оние што недостигаат, бидејќи создаваат убедлив, но лажен контекст.

Дизајнирајте API-ја како договори, не како практични погледи кон базата на податоци

API е ветување за однесување. Изложувањето табели директно преку крајни точки често прави раната испорака да изгледа брза, но ги спојува клиентите со одлуките за складирање и протекува внатрешна терминологија. Подоцнежните промени стануваат ризични и за луѓето и за измените генерирани од ВИ, бидејќи не постои јасна граница на договорот.

Намерно дефинирајте валидација на барања, облици на одговори, однесување при грешки, пагинација и идемпотентност. За операција што клиентите може повторно да ја обидат, прифатете клуч за идемпотентност и зачувајте доволно информации за да вратите доследен резултат за повторените барања. Не потпирајте се на тоа дека клиентот „веројатно нема да кликне двапати.“ Неуспесите во мрежата ги прават повторните обиди нормални.

Исто така, разликувајте минлив неуспех од траен во обработката во заднина. Грешка при испорака што може да се повтори може да заслужи одложување и ограничена политика за повторни обиди. Невалидните податоци во товарот треба јасно да не успеат, наместо да трошат повторни обиди што не можат да ги поправат. Овие разлики припаѓаат во кодот, логовите и оперативната документација.

Оперативната јасност ја заокружува сликата

Разбирањето со ВИ е добро само колку што е добар набљудливиот систем околу кодот. Docker-поставувањето, конфигурацијата на околината, процесот на миграција, крајната точка за здравствена проверка и логовите треба да одговорат на практичните прашања: што работи, од што зависи, како се стартува и како откажува.

Претпочитајте експлицитна конфигурација наместо скриени стандардни вредности. Третирајте ги миграциите како верзирани промени на апликацијата. Вклучете структурирани логови со идентификатори што поврзуваат барање, задача и доменски ентитет каде што е соодветно. Избегнувајте евидентирање тајни или непотребни лични податоци. Добрата набљудливост им овозможува на инженерите да потврдат објаснување според однесувањето во продукција, наместо да ѝ веруваат на веродостојна приказна.

Градете за следното прашање

Најсилните бекенд-системи не се оние со најмногу слоеви или најмодерни алатки. Тие се системи каде што инженер може да праша: „Што се случува кога ова барање не успее на половина пат?“ и да најде конкретен одговор во кодот и неговиот околен оперативен дизајн.

Истиот квалитет ја прави помошта со ВИ побезбедна и покорисна. Јасните граници го подобруваат преземањето. доследната терминологија го подобрува толкувањето. Експлицитните договори го намалуваат нагаѓањето. Добро поставените тестови и документацијата обезбедуваат докази наместо импликации.

ВИ може да го забрза разбирањето, но не може да произведе кохерентност од двосмисленост. Бекенд-занаетчиството останува работата на тоа системот да се објасни самиот себеси — прво на луѓето одговорни за него, а потоа на секоја алатка што им помага да го изградат она што следува.

Портрет на автор на блогот

Mihajlo

Јас сум Михајло - развивач поттикнат од љубопитност, дисциплина и постојаната желба да создадам нешто значајно. Споделувам увиди, упатства и бесплатни услуги за да им помогнам на другите да ја поедностават својата работа и да растат во постојано развивачкиот свет на софтверот и вештачката интелигенција.