QA десятилетиями ищут баги.
Программисты полвека пытаются перестать программировать.
Биты. Байты. Регистры. Машинный код.
Объясни процессору, что сделать.
Что загрузить. Куда положить. Что прибавить. Как прыгнуть.
Потом появился ASM.
Байтам дали ласковые имена.
MOV ADD JMP
Синтаксический сахар.
Сладкое полезно для мышления.
Языки высокого уровня.
Перестали думать о регистрах.
Переменная. Цикл. Функция. Структура.
Ритчи сильно помог — указатели оставил.
Чтобы не расслаблялись. Они именованные.
От решения задачи — к постановке.
10 PRINT 10
20 GOTO 10
Шестидесятые. Иван Сазерленд. Sketchpad.
Эти линии параллельны. Эти точки связаны.
Система выполняет ограничения.
Constraint solving.
AI в детстве.
Просто компьютер занимал комнату. В Эрмитаже.
Потом Prolog.
Вот факты.
Вот отношения.
Вот правила.
Найди решение.
SQL.
Человеку нужны данные. Пусть скажет, какие.
Как база их найдёт — проблема базы.
Потом появился DBA.
Execution plan. Индексы. Статистика.
Снова пришли на помощь.
Математики. Учёные. DBA.
Просто попросить не получилось.
Мало ресурсов, логики, контекста.
В эксплуатации — то же.
Вместо Ops runbook:
зайди на сервер; поставь пакет; поправь файл; перезапусти сервис.
Хочется сказать:
Здесь должен быть nginx.
Этот файл должен выглядеть так.
Сервис должен работать.
Ansible.
Desired state. Декларативное описание.
Красиво.
Потом tasks. Conditions. Handlers.
shell:. command:.
Три страницы bash внутри YAML.
Страшно.
На одной машине Ubuntu.
На второй — памятник предыдущему архитектору. В полный рост.
На третьей никто не знает, что происходит. Есть записка с адресом и ФИО.
Ещё попытка. Kubernetes.
replicas: 3
Один умер? Должно быть три.
Два умерли? Должно быть три.
Есть желаемое состояние. Есть наблюдаемое.
Между ними работает контроллер.
Потом CRD. Operators. Admission webhooks.
Контроллер на Go.
Ну почти вышло же.
Полвека одна история.
Поднимаем уровень абстракции.
Сложность снизу протекает наверх. Соседи недовольны.
Приходится снова программировать.
Идея была нормальной.
Плохие были исполнители.
Каждая дырка требовала ещё одного if.
Ещё одного DSL. Ещё одного bash-скрипта.
Появился AI.
Этот слой умеет достраивать формализацию.
Ему можно сказать:
При таком входе система должна вести себя так.
Вот ограничения.
Вот примеры.
Вот внешний вид.
Вот допустимые ошибки.
Это уже почти не программа.
Постановка задачи.
Контракт.
Часть реализации перестала интересовать человека.
Ну почти.
Ивану Сазерленду наконец-то завезли железо.
Prolog где-то довольно улыбается.
HAL 9000.
— Твой выход.
Одна небольшая проблема.
Система сделала то, что мы попросили?
Что считать правильным результатом?
Где граница допустимого?
Что вообще является багом?
QA десятилетиями искали ошибки в реализации.
Перестать искать нарушение в готовой программе.
Сначала описать, что считается нарушением.
Контракты. Инварианты. Сценарии. Критерии приёмки. Наблюдаемое поведение.
Программисты полвека пытались перестать программировать.
Кажется, им всё это время был нужен хороший тестировщик.
— Не прошло.
```
curl https://api.openai.com/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{"model":"Skynet","messages":[{"role":"user","content":"I need your clothes, your boots, and your motorcycle."}]}'
```