Author: zimage

  • Тук ли е вече бъдещето, в което AI ще ни казва да си рестартираме компютъра?

    Колко пъти ви се е случвало да чакате с часове на телефона, само за да ви кажат да си рестартирате компютъра?

    С подобряването на AI системите ще бъде все по-лесно да се осигури добра техническа поддръжка. Но какво значи “добра”?

    Нека обясня, за всеки случай, какво прави техническата поддръжка и къде AI може (или не може) да я замести в близките няколко години. По традиция, заради оптимизация на разходите, поддръжката е разделена на нива.

    Level 1: от “рестартирай компютъра” до “истински полезен техничар”

    Често клиентите се посрещат от хора, които нямат висока квалификация или опит, а следват инструкции.

    Ако са достатъчно многобройни, може и да отговарят бързо, но…

    a) Ако са по-неопитни, ниско платени и т.н. са доста безполезни, защото не разбират по-сложните въпроси, а само повтарят “моля рестартирайте си компютъра” или copy & paste random docs. Ако не са достатъчно много и са претоварени – още по-зле. Могат да помогнат само в доста ограничен кръг ситуации и често просто си губите времето. Това сме го виждали дори при support на големи доставчици на интернет и колокация с месечни договори за десетки хиляди пари на месец.

    b) Ако са по-опитни, може и да са донякъде полезни, може да дадат правилните стъпки, но понякога твърде бавно, не адаптирани за конкретния клиент. Бива, но не са проактивни. Текущите AI на практика са достигнали, че дори надхвърлят това ниво, но не са добре интегрирани все още.

    Една очевидна възможност е, да се захрани AI с всички предишни support cases (RAG, fine tuning) и да подава на служителя готови отговори с бутони за редактиране и одобрение.

    c) Перфектният L1 е техничар с опит, който познава продукта в детайли, не ти губи времето с излишни и грешни стъпки и знае кога да ескалира към по-горно ниво. Ясни инструкции, предугажда какво се случва и какво трябва да се направи. Трудно е да се задържат хора на такава позиция, защото обикновено ги повишават или те си намират друга работа.

    Level 2: от “повишен прекалено рано” до “директен контакт с дев тима”

    a) Посредственият L2 е някой, когото са повишили от L1 твърде рано. Или някой, който е претоварен и няма време и мотивация да свърши работата както трябва. Понякога бърз, понякога бавен. Понякога върши добра работа, понякога налучква.

    b) Отличният L2 е компетенен, има задълбочен опит с продукта, може директно да си говори с разработчиците, админите и въобще когото трябва. Знае как да възпроизведе клиентските проблеми, знае как да заобиколи known issue и т.н. Вярвам, че много скоро ще може да се постигне чрез колаборация от умерено мотивиран и компетентен L2 human + AI tools.

    L3/Developer: злато, ако стигнеш до тях

    Това често са хора, които са участвали в създаването на продукта. Може да променя системата и да оправя бъгове в отговор на потребителски проблеми. Може да отнеме известно време, но реакцията е… gold. Супер висока полезност, ако се добереш до такъв.

    Architect / CTO / Founder-level

    Човекът (хората), които са измислили системата. Познават подробно бизнес логиката, технологиите, историята и бъдещето. Може да променят дизайна на системата при нужда (вкл. в следствие на потребителски оплаквания).

    В типичните компании е на практика почти невъзможно да стигнеш до такъв. Евентуално след множество оплаквания от различни потребители, скандали… ако си голям клиент.

    Bonus: Can you actually get to CTO/CEO?

    Обикновено не. Освен, ако не си много голям клиент, инвеститор или инфлуенсър, който да ги подкара в социалните мрежи 🙂

    В по-малки компании или стартъпи има някакъв шанс, но в големи… good luck reaching Bezos или шефа на A1 (примерно).

    Support TierОписаниеAI-onlyHuman-onlyHuman + AI
    L0 – „Моля, рестартирайте“Без разбиране, просто повторение на шаблони✅ GPT-3.5? ниво (2022)
    L1 – слабCopy/paste от база знания, слабо разбиране✅ GPT-4o? (2024)
    L1 – окЧесто правилни отговори, но понякога налучкване, недостатъчно адаптация⚠️ Claude Sonnet 3.7? (2025)🔥
    L1 – отличенПознава продукта, преценява кога да ескалира, ясни и адаптивни отговори❌ Почти (Reasoning models), но не стабилно (2025-2026)👍
    L2 – посредственЧастично полезен, неуверен, понякога налучква❌ 2027?⚠️ (2025 подпомага само)
    L2 – добърВъзпроизвежда проблеми, намира workarounds, разбира системата дълбоко❌ 2028?⚠️ (2025 подпомага само)
    L3 / DeveloperМоже да направи fix, разбира кода, имплементира❌ 2029?⚠️(2025 подпомага само)
    Architect / CTO / CEOПознава цялата картина, взема решения, променя посока

    Предвид моят личен опит (или трябва да кажа сблъсък?) с поддръжката на най-различни компании — от малки до огромни, от фитнес до технологии — навлизането на AI е положителна тенденция за потребителите. Ще съм доволен да мога да получавам по-бърза и адекватна информация и вярвам, че точно това и ще се случи. AI напредва със зашеметяваща скорост, не го мързи, няма проблеми с мотивацията, не се уморява и не му се спи, не боледува, наличен е 24/7 и е по-евтин от човек.

    За съжаление, може много хора да изгубят работата си :'( Така е било и с индустриализацията разбира се, но имам усещането, че този път е по-различно. Ще бъде по-бързо, всеобхватно и непредвидимо.

    Какво мислите вие – ще успее ли AI да замени човешката поддръжка?

  • Mermaid is awesome

    After the great success of Markdown, someone came up with the brilliant idea of making charts based on it. So, I’m in love with Mermaid! 🙂

    It has a JavaScript renderer, which can be wrapped into other things—like, say, a WordPress plugin—and produce visuals like this:

    flowchart TD
        A[Find Treasure Map] -->|Decipher clues| B(Start Adventure)
        B --> C{Choose a path}
        C -->|Forest| D[Meet Talking Tree]
        C -->|Mountain| E[Discover Hidden Cave]
        C -->|Desert| G[Find Oasis with Genie]
        C -->|Haunted Mansion| H[Solve Puzzles]
        C -->|Mystic Island| I[Encounter Mermaids]
    

    The above is generated from the following simple markup:

    flowchart TD
        A[Find Treasure Map] -->|Decipher clues| B(Start Adventure)
        B --> C{Choose a path}
        C -->|Forest| D[Meet Talking Tree]
        C -->|Mountain| E[Discover Hidden Cave]
        C -->|Desert| G[Find Oasis with Genie]
        C -->|Haunted Mansion| H[Solve Puzzles]
        C -->|Mystic Island| I[Encounter Mermaids]

    Or a more complex one (part of the ancient vpopmail system I’m fiddling with):

    graph TD
        subgraph get_arguments
            A["Start: vdelivermail receives email: no-reply-office-sofia\@domain.com"] --> B["Get EXT and HOST"]
            B --> C{"EXT contains '-'?"}
            C -->|Yes| D["Split EXT at *first* '-' - TheUser = no-reply-office-sofia"]
            D --> E["TheUserExt = no"]
            E --> F["TheExt = reply-office-sofia"]
            F --> G["Replace '.' with ':' in TheExt"]
            C -->|No| H["TheUserExt = EXT"]
            H --> I["TheExt = ''"]
            G --> J["Continue"]
            I --> J
        end
        J --> K{"User no-reply-office-sofia found?"}
        K -->|No| M{"QMAIL_EXT & no-reply-office-sofia != no?"}
        M -->|Yes| N{"vauth_getpw?"}
        N -->|Yes| L["checkuser() TheUserExt=no"]
        N -->|No| O["usernotfound()"]
        M -->|No| O
        L --> P["check_forward_deliver"]
        subgraph check_forward_deliver
            P --> Q{"TheExt (reply-office-sofia) is not empty?"}
            Q -->|Yes| R["Try .qmail-reply-office-sofia"]
            R --> S{"Opened?"}
            S -->|Yes| T1["Process .qmail-reply-office-sofia"]
            S -->|No| U["Loop backwards through TheExt"]
            U --> V{"Current/Previous char is '-'?"}
            V -->|Yes, i=16| W1["Try .qmail-reply-office-default"]
            W1 --> X1{"Opened?"}
            X1 -->|Yes| T2["Process .qmail-reply-office-default"]
            X1 -->|No| U
            V -->|Yes, i=6| W2["Try .qmail-reply-default"]
            W2 --> X2{"Opened?"}
            X2 -->|Yes| T3["Process .qmail-reply-default"]
            X2 -->|No| U
            V -->|Yes, i=0| W3["Try .qmail-default"]
            W3 --> X3{"Opened?"}
            X3 -->|Yes| T4["Process .qmail-default"]
            X3 -->|No| U
            Q -->|No| Y["Try .qmail"]
            Y --> Z{"Opened?"}
            Z -->|Yes| T5["Process .qmail"]
            Z -->|No| AA["Return -1"]
            T1 --> AB["Return 1"]
            T2 --> AB
            T3 --> AB
            T4 --> AB
            T5 --> AB
        end

  • Can’t believe there’s (still) no way to list just the ipset members

    I find it amusing that the ipset command has all kinds of output modifiers like -name to show only the name of the list, -terse to show the name and headers, and even -output xml, but lacks a straightforward way to list the set members only. Many tools have options like –skip-headers, –no-headers, –skip-column-names, etc., but not ipset.

    I guess someone needed the XML output and contributed it, so maybe I should try and contribute -no-headers or something similar.

    At least this gives me some shell scripting practice. 🙂