Як ми прискорили розробку на iOS за допомогою Cursor AI

💡 Усі статті, обговорення, новини про Mobile — в одному місці. Приєднуйтесь до Mobile спільноти!

Всім привіт! Мене звати Сергій. Я працюю iOS Tech Lead у Futurra Group, де відповідаю за розробку мобільних рішень та приймаю ключові технічні рішення й вибудовую процеси, які допомагають команді стабільно доставляти якісний продукт швидше.

В цій статті я розповім, як ми змінили Xcode на Cursor і чому це стало одним із найпомітніших «левел-апів» у нашому iOS-workflow. Якщо коротко, Cursor — це своєрідний форк VSCode, доповнений інтелектуальними функціями, які допомагають швидше писати й редагувати код.

Ми перейшли на Cursor відносно нещодавно, але вже встигли відчути помітний приріст у швидкості розробки. Нижче я покажу, як ми його налаштували під iOS і які фічі використовуємо найчастіше, щоб ви могли оцінити, наскільки цей підхід зайде у вашому workflow.

Коли в Xcode 26 нарешті з’явилась вбудована AI-інтеграція (ChatGPT in Xcode), ми реально зраділи: менше контекст-світчингу, усе «в одному місці», звучить як мрія. Але на практиці виявився нюанс: на момент написання статті ця інтеграція крутиться навколо моделі GPT-5 (включно з «Reasoning» варіантом), і цього часто не вистачає для швидкої, стабільної роботи з реальним продакшн-кодом.

Паралельно Cursor вже підхопив GPT-5.2, і різниця відчувається майже одразу: менше «тертя» в діалогах, краще тримається контекст, швидше виходимо на коректні правки без нескінченних уточнень і переробок. Саме цей розрив між «AI є» і «AI реально прискорює» став тригером, чому ми почали системно мігрувати свій процес у Cursor.

Практичний приклад: Figma → SwiftUI у Cursor + перевірка в Xcode Preview

У цьому прикладі ми покажемо повний сценарій «дизайн → готовий SwiftUI-екран»: беремо посилання на екран у Figma (де намальований список планів), вставляємо його в промпт у Cursor, і просимо згенерувати верстку на SwiftUI з підключенням реальних даних із JSON-файла в проєкті. Після цього відкриємо результат у коді, а фінальну перевірку зробимо в Xcode через SwiftUI Preview, щоб наочно побачити, як екран відображається в застосунку.

Крок 1

Створюємо новий проєкт.

Крок 2

Відкриваємо макет екрана зі списком планів у Figma та копіюємо посилання на потрібний фрейм/артборд (Copy link to selection).

Мета: передати Cursor точний дизайн, щоб він міг зчитати структуру, стилі та відступи.

Крок 3

У Cursor відкриваємо чат і вставляємо посилання на Figma. Далі описуємо задачу: «зверстати цей екран на SwiftUI» та вказуємо, що дані потрібно брати з локального JSON у проєкті.

Крок 4

Формуємо промпт так, щоб Cursor:

  • підтягнув дизайн з Figma через MCP;
  • знайшов у репозиторії JSON з даними;
  • згенерував SwiftUI-екран і потрібні моделі/мапінг;
  • зробив компоненти максимально близько до структури макета (тексти, іконки, spacing, стани).

Крок 5

Cursor отримує контекст із Figma: бачить фрейми, компоненти, типографіку, кольори та layout. На основі цього він пропонує структуру SwiftUI: контейнерний екран + список + рядок плану + допоміжні в’ю.

Крок 6

Далі Cursor знаходить JSON-файл з даними для цього екрана і підключає його як datasource:

  • описує модель (Decodable);
  • додає loader (наприклад, з bundle);
  • будує binding у ViewModel/State;
  • щоб список планів рендерився з реальних даних, а не з «хардкоду».

Крок 7

На цьому кроці ми бачимо результат: Cursor створив потрібні файли (SwiftUI view + моделі + loader/VM) і відтворив екран відповідно до дизайну. Важливо, що код одразу інтегрований у структуру проєкту й готовий до запуску.

Крок 8

Переходимо в Xcode, відкриваємо згенерований SwiftUI-екран і перевіряємо, що все збирається без помилок та коректно підтягує дані з JSON.

На весь цей приклад у нас пішло приблизно 30 хвилин. Якщо робити те саме вручну — підігнати верстку під дизайн, рознести компоненти, підключити JSON і довести все до робочого Preview — це зайняло б суттєво більше часу і точно більше «контекст-перемикань».

Далі я покажу, як налаштувати Cursor для iOS-розробки та підключити MCP-сервери, щоб ви могли повторити цей сценарій у своєму проєкті.

Налаштування Cursor під iOS development

Спочатку потрібно встановити Cursor. Він має безплатний тариф, але частина можливостей, які я покажу далі, потребує підписки за $20. Я нічого не «продаю» — просто опишу, як це працює, а чи варто платити, вирішите самі. Безплатної версії цілком достатньо, щоб спробувати редактор у справі.

Також у налаштуваннях можна підключити власні API-ключі (OpenAI / Claude / Gemini), якщо ви вже окремо оплачуєте ці сервіси.

🛠️ Базове налаштування

Після інсталяції Cursor варто додати кілька залежностей — тоді інтеграція з iOS-проєктом буде повноцінною (нормальна індексація, підказки, навігація по коду).

У терміналі встановіть Xcode Build Server:

brew install xcode-build-server

Це дозволить SourceKit-LSP працювати поза межами Xcode й давати ті самі базові можливості: перехід до визначення, пошук усіх посилань, аналіз call tree та інші інструменти навігації по коду. Фактично, більшість того, до чого ви звикли в Xcode, стане доступним і в Cursor.

Редактор коду Cursor із запущеним Xcode Build Server

Далі встановіть xcbeautify:

brew install xcbeautify

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

Термінал Cursor під час білду з xcpretty

Також встановіть SwiftFormat, якщо у вас його ще немає.

brew install swiftformat

Після встановлення всіх потрібних залежностей запустіть Cursor, відкрийте вкладку Extensions і додайте:

  • Swift Language Support — Це розширення відповідає за коректну підсвітку синтаксису Swift і дає базові можливості, потрібні для комфортної розробки. GitHub: github.com/swiftlang/vscode-swift
  • SweetPad — ключовий інструмент, який дозволяє працювати з iOS-проєктом поза звичним інтерфейсом Xcode. На сторінці розширення є детальний опис усіх можливостей, гарячих клавіш і принципів роботи. У цій статті я зачеплю лише найпрактичніші моменти SweetPad, а решту нюансів можна легко знайти там. GitHub: github.com/sweetpad-dev/sweetpad

Список можливостей розширення SweetPad.

SweetPad додає зручний шар команд і гарячих клавіш поверх стандартного xcodebuild. По суті, він переносить у Cursor те, до чого звикли в Xcode: можна переглядати всі targets/schemes, обирати destination (симулятор або реальний пристрій), збирати проєкт і запускати застосунок — майже так само, як у Xcode, але без виходу з редактора.

Окремий плюс: SweetPad автоматично готує проєкт до роботи з Xcode Build Server, тож ви отримуєте повноцінні Swift-фічі редактора (навігацію по коду, references тощо), про які говорили вище.

Після встановлення SweetPad натисніть CMD + SHIFT + P, відкрийте меню команд і виберіть:

SweetPad: Generate Build Server Config

Після цього в корені проєкту буде створено файл buildServer.json — саме він підключає Xcode Build Server до вашої директорії з проєктом і дає змогу коректно працювати з індексацією та Swift tooling у Cursor.

Коли конфігураційний файл уже створений, запустіть Build & Run — або через меню команд, або з панелі SweetPad у Cursor (я зазвичай закріплюю її, щоб була під рукою). Там ви побачите всі свої targets/schemes і зможете зібрати та запустити будь-який із них у кілька кліків.

Крім цього, в Cursor можна й дебажити застосунок. Для цього створіть launch configuration для режиму відладки — коли Cursor попросить вибрати провайдер, оберіть SweetPad.

Далі є два зручні сценарії:

  • спочатку запустити застосунок через Build & Run, а потім перейти в Run & Debug;
  • або одразу у вкладці Run & Debug вибрати Attach to running app і під’єднатися до вже запущеного процесу.

Це покриває більшість щоденних задач: брейкпоїнти, стек викликів, змінні, логіка в рантаймі — без постійних стрибків назад у Xcode.

Cursor із запущеним дебагером: виконання зупинено на breakpoint’і

Ви отримаєте майже все, до чого звикли в Xcode (а подекуди й більше): breakpoints, перегляд call stack, інспекція та print змінних, step over/step into, перехід по рядках виконання тощо — усе в одному інтерфейсі Cursor.

Ваш файл ./vscode/launch.json має виглядати приблизно так:

{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "sweetpad-lldb",
            "request": "launch",
            "name": "SweetPad: Build and Run (Wait for debugger)",
            "preLaunchTask": "sweetpad: debugging-launch"
        }
    ]
}

📦 Налаштування MCP-сервера через Docker

Практичний гайд із запуску сервера Model Context Protocol (MCP) у Docker. Це дозволяє AI-асистенту підключатися до ваших локальних інструментів, файлів і API у безпечному контейнеризованому середовищі — з контрольованими доступами та без «прямого» втручання в систему.

Ми будемо використовувати Docker MCP Toolkit — він закриває три критичні проблеми, з якими найчастіше стикаються розробники під час побудови AI-агентів:

Нульова складність конфігурації. Класичне підключення MCP зазвичай вимагає вручну ставити залежності, налаштовувати environment variables і уважно слідкувати за версіями. Натомість MCP Catalog від Docker дає вже підготовлені контейнери, які стартують «з коробки»: кілька кліків — і сервер запущено.

Універсальна сумісність. Неважливо, що ви використовуєте: Cursor, Claude Desktop чи VS Code + GitHub Copilot — Docker MCP gateway виступає єдиною точкою підключення. Ваші AI-агенти отримують доступ до всіх встановлених MCP-серверів через стандартизований інтерфейс — незалежно від обраної LLM або IDE.

Безпека рівня «enterprise». Кожен MCP-сервер працює в ізольованому контейнері з ресурсними лімітами (за замовчуванням 1 CPU і 2 GB RAM), із підписаними image’ами від перевірених Docker-видавців та з автоматичним secret detection, яке блокує витік чутливих даних. OAuth tokens і API keys залишаються захищеними у своїх контейнерах.

Налаштування MCP-серверів

Для старту з Docker MCP Toolkit потрібен Docker Desktop 4.40+ (macOS). Далі — спрощений план:

Увімкнення MCP Toolkit:

  1. Відкрийте Docker DesktopSettings.
  2. У розділі Beta features увімкніть «Docker MCP Toolkit».
  3. Натисніть Apply & Restart.

Це активує MCP gateway і відкриє інтерфейс каталогу, через який можна встановлювати та керувати MCP-серверами.

Ми використовуємо такі MCP-сервери:

  • Fetch — MCP-сервер для отримання контенту з вебсторінок. Дозволяє LLM підтягувати вміст із URL, діставати потрібні фрагменти та конвертувати HTML у Markdown, щоб моделі було простіше «їсти» текст і працювати з ним.
  • Memory — базова реалізація персистентної пам’яті на основі локального knowledge graph. Завдяки цьому асистент може зберігати важливі факти про користувача та контекст і використовувати їх між різними чатами.
  • Sequential Thinking — MCP-сервер, який додає інструмент для структурованого мислення: розбивка задачі на кроки, рефлексивний аналіз, перевірка гіпотез і більш керований процес розв’язання складних проблем.

Щоб Cursor міг читати структуру макетів у Figma і допомагати «верстати» UI (SwiftUI / UIKit) максимально близько до дизайну, спочатку потрібно увімкнути MCP server у Figma.

Увімкнення MCP Server у Figma

  1. Відкрийте Figma.
  2. Натисніть CMD + K (Command Palette).
  3. У пошуку введіть «MCP server».
  4. Оберіть відповідний пункт і увімкніть MCP Server.

Після цього Figma стане «джерелом контексту» для Cursor: асистент зможе отримувати дані про фрейми, компоненти, текстові стилі, кольори, spacing тощо — і на їх основі генерувати код UI більш точно, ніж з описів «на словах».

Тепер потрібно підключити MCP-сервери в Cursor — для цього створюємо конфіг і вмикаємо потрібні інтеграції.

Додаємо MCP servers у Cursor

  1. У Cursor відкрийте SettingsTools & MCP.
  2. Натисніть Add custom MCP — Cursor створить файл mcp.json.
  3. Далі в mcp.json додаємо конфіг для кожного MCP-сервера, який будемо використовувати.

У мене конфіг виглядає так:

{
  "mcpServers": {
    "Figma": {
      "url": "http://127.0.0.1:3845/mcp"
    },
    "Context7": {
      "url": "https://mcp.context7.com/mcp",
      "headers": {}
    },
    "sequentialthinking": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "mcp/sequentialthinking"
      ]
    },
    "memory": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "-v",
        "/Users/SergeyZhuravel/mcp-data/data",
        "mcp/memory"
      ]
    },
    "fetch": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "mcp/fetch"
      ]
    }
  }
}

Кілька практичних деталей, які економлять час:

  • Для Docker-based серверів параметр -i важливий — це режим STDIO, через який Cursor спілкується з MCP-контейнером.
  • Для memory я відразу додаю volume (-v ...) — так памʼять переживає перезапуск контейнера і не «скидається» кожного разу.

Збережіть mcp.json, поверніться в SettingsTools & MCP і увімкніть всі потрібні MCP-сервери.

Після цього Cursor підхопить інструменти (tools) з кожного сервера — і ви зможете прямо в чаті просити, наприклад: підтягнути дані з Figma, витягнути контент із вебсторінки через Fetch, або вирішити задачу «крок за кроком» через Sequential Thinking.

Налаштування моделей

Тепер налаштуємо моделі. Відкрийте SettingsModels і в списку увімкніть ті, з якими плануєте працювати. На момент написання цієї статті ми використовуємо дві основні:

  • GPT-5.2 — як «універсальну» модель для складних задач: аналізу, планування, архітектурних рішень, рев’ю великих змін.
  • GPT-5.1-Codex — як модель «під код»: швидкі правки, рефакторинг, генерація типового boilerplate, правки по файлах і дрібні таски без зайвих розмов.

Практичний підхід простий: Codex — для рутинного coding-flow, GPT-5.2 — коли потрібно думати ширше (або коли задача «не влізає в один файл»).

Перший запуск проєкту та базові правила для AI

Після цього відкрийте свій проєкт у Cursor і можна починати працювати з чатом/Composer. Але щоб AI-агент орієнтувався в репозиторії швидко й не «плавав» у здогадках, дуже раджу одразу зробити дві речі:

  1. Згенерувати коротку документацію про проєкт (що це, як зібрати/запустити, структура модулів, ключові флоу).
  2. Заповнити Cursor Rules (структура, принципи, архітектура, конвенції) — тоді більшість відповідей і правок будуть одразу у вашому стилі.

Ось приклад промпта, який ми використовуємо:

Промпт (template):

Проаналізуй репозиторій і створи документацію в папці docs/ у Markdown.

Вимоги до docs:

  • docs/README.md: короткий опис проєкту, вимоги, як запустити (build/run/test), як працює конфіг, де що лежить.
  • docs/architecture.md: архітектура (модулі/шари), залежності, ключові патерни (Swift Concurrency, DI, навігація), типові флоу.
  • docs/conventions.md: code style, naming, структура папок, правила для SwiftUI/UIViewController, підходи до тестів.
  • створи підпапку docs/api/. Якщо в проєкті є API-клієнт/ендпоїнти — опиши їх і згенеруй OpenAPI YAML у docs/api/openapi.yaml (базуючись на реальних ендпоїнтах у коді).

Додатково: заповни Cursor Rules (або .cursorrules), де зафіксуй структуру проєкту та основні принципи: що можна/не можна міняти, preferred patterns, вимоги до PR (маленькі дифи, тести для критичних змін), і як ми називаємо файли/типи.

Висновок

Cursor чудово закриває рутинні задачі в iOS-розробці: написання тестів, рефакторинг, оновлення API, дрібні правки по проєкту та швидке генерування boilerplate. Найприємніше — значно менше контекст-світчингу: багато відповідей і правок ви отримуєте прямо в редакторі, без постійних походів у браузер чи сторонні інструменти.

Але є важливі нюанси:

  • Cursor не замінює глибоку діагностику. Пошук витоків пам’яті, складний дебаг, профілювання — це все ще зона, де Xcode почувається сильніше.
  • AI не робить «самостійне problem solving» за вас. Він може запропонувати рішення, але перевірка гіпотез, розуміння контексту й відповідальність за зміни залишаються на інженері.
  • Немає Xcode-інструментів на кшталт Memory Graph чи View Hierarchy. Для таких задач ми все одно повертаємось в Xcode.

Тож Cursor — не ідеальний і точно не «вбивця Xcode». Але як помічник він уже зараз економить години рутини й пришвидшує доставку фіч — особливо там, де потрібні швидкі правки, робота з кількома файлами та підтримка контексту.

Happy Coding!

Також запрошую до мого Telegram-каналу про iOS-розробку, де вже понад рік ділюся цікавими матеріалами та практичними інсайтами.

Зв’язатися зі мною можна через LinkedIn.

Сподобалась стаття? Підписуйтесь на автора, щоб отримувати сповіщення про нові публікації на пошту.

👍ПодобаєтьсяСподобалось22
До обраногоВ обраному9
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Частина з MCP для мене була новою, в іншому вже близько місяця використовую приблизно аналогічний механізм)
Ще б додав окремо про необхідність використання та цільового наповнення AGENTS.md та SKILLS.md.

Гарна стаття!

Як альтернативу Docker MCP Toolkit та Docker Desktop можна використати open source ToolHive та Podman Desktop.

Docker має практику надсилати кляузи у випадку комерційного використання останнього у комерційних цілях не індивідуальними розробниками.

це не пробували, на скільки я зрозумів це більше для дизайнерів щоб AI генерував дизайн у Figma

Чудова стаття. Вельми дякую за детальний опис процесів.

Цікаво, чому обрали саме GPT-5.2? Чи порівнювали з Opus/Sonnet 4.5 на тих самих задачах і метриках?
У мене в загальних задачах GPT інколи дає слабший результат — цікаво, чи в iOS-контексті картина інша

Ми не робили «лабораторний» бенчмарк з ідеально рівними умовами, але порівнювали в бойових задачах iOS: багатофайлові правки в проекті, SwiftUI/UIKit екрани з підключенням даних, рефакторинг з урахуванням конвенцій, рев’ю/планування змін, оптимізація перформансу. У цьому контексті GPT-5.2 в Cursor у нас виявився стабільнішим по довгому контексту і частіше «доводив задачу до кінця» з меншим числом уточнень/переробок.

GPT часом дуже любить переускладнити все і видати 100 строк коду там де хватить і 5-ти.
але можливо мій промт був не дуже чітким

малость не моя тема, но если верстка руками такого примитивного дизайна занимает много времени, то либо у вас верстальщик проф непригодный, либо инструментарий для верстки неэффективный

тут питання не тільки про «верстку трьох блоків», а повний цикл: підтягнути макет з Figma, згенерити SwiftUI-структуру, підключити реальні дані з локального JSON (моделі/лоадер/binding), інтегрувати в проєкт і довести до робочого Preview. Навіщо це все робити вручну, якщо це може зробити AI-шка.

Навіщо це все робити вручну, якщо це може зробити AI-шка.

потому что AI-шка делает плохо.
а чтобы сделать хорошо, ты над ней стоишь и в итоге тратишь больше времени, чем экономишь.

Ну уже ж ясно — AI это новый Бог любителей уяк-уяк и в прод.

(facepalm) откуда вы все лезете такие: «малость не моя тема, но она делает плохо»? чувак, в кривых руках все плохо делается.

З усією повагою, прошу вказати на місце, де мені треба випрямити руки.

Користувався моделлю Claude Sonnet 4.5 (начебто середняк: не найгірша, не найліпша, загальнодоступна).
Задачку взяв простіше нема куди, нічого не вигадував.
Сам я її реалізував з тестами за дві хлини.

Написати промпт у мене зайняло хвилин 5-ть. Ну ладно, дамо фору і припустимо що по часу це зайняло стільки ж.
Новий чат, ніяких додаткових налаштувань, ніякого контексту окрім того, що в промпті.

# Завдання
Створити функцію пошуку n-го числа послідовності Фібоначчі.

# Вхідні данні
* Індекс послідовності (прик.: -100, 0, 1, 10)

# Вихідні дані
* Значення за заданим індексом послідовності

# Умови
* використовуй мову програмування Python
* використовуй послідовність Фібоначчі, яка починається з 0, 1, 1
* для індексів менших за 1 завжди має повертасить 0

Розв’язок від LLM нижче.
Я його мінімально відредагував, щоб займав менше місця.
Код не чіпав.

def fib(n):
    if n <= 0:
        return 0

    if n in [1, 2]:
        return 1

    return fib(n - 1) + fib(n - 2)


if __name__ == "__main__":
    test_cases = [-100, 0, 1, 2, 3, 4, 5, 10]
    for n in test_cases:
        result = fib(n)
        print(f"F({n:3d}) = {result}")

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

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

я не знаю, как Соннет 4.5 выдал такой код. прокомментировать не могу.

у меня ровно твой промпт на GPT OSS 20b выдал вот так:

def fib(n: int) -> int:
    """
    Повертає n‑й елемент послідовності Фібоначчі.
    
    Параметри
    ----------
    n : int
        Індекс елемента. Якщо n < 1, повертається 0.
    
    Повертає
    -------
    int
        Значення n‑го елемента послідовності.
    
    Послідовність починається з:
        0 (n = 0)
        1 (n = 1)
        1 (n = 2)
    """
    if n < 1:
        return 0

    # Початкові значення для n = 0, 1, 2
    a, b = 0, 1  # a = F(0), b = F(1)

    # Якщо n == 0, повертаємо a (0)
    # Якщо n == 1, повертаємо b (1)
    # Для n >= 2 будемо ітерувати
    for _ in range(n - 1):
        a, b = b, a + b
    return b
я не знаю, как Соннет 4.5 выдал такой код. прокомментировать не могу.

Я знаю відповідь «як», але вона нас не дуже цікавить.

Виконання задачі з AI та без у мене зайняло однаково. В обох випадках код працює, тести проходить.
За твердженням

в кривых руках все плохо делается.

проблема в моїх руках, а не в модельці. От я і питаю, як мені це виправити?

— применять на реальных задачах, а не на «напиши мне расчет числа фибоначчи»
— купить подписку Claude Code, или хотя бы Cursor
— использовать скиллы, субагенты, в целом — использовать агентный подход, а не one-shot
— читать и анализировать чужой опыт, применять на себе, адаптировать. рекомендую X, во вторую очередь — Reddit
— писать промпты на английском

применять на реальных задачах, а не на «напиши мне расчет числа фибоначчи»

З якого це моменту розрахунок числа Фібоначчі не вважається реальним завданням? Я не встаючі з місця назву п’ятірку проєктів, де це потрібно. А якщо про застосування послідовності спитати у ШІ — я думаю ми і сотню наберемо.
Трошки оффтопу: мої реальні проєкти мали такий величезний контекст, що навіть супер наворочена LLMка перетворить їх за пару спрінтів на кашу, яку буде неможливо підтримувати. Причина проста: нейронки не вміють в стратегічне планування, вони можуть тільки імітувати цей процес. Я це з власного досвіду кажу, бо займався їх навчанням ще до того, вистрелив ChatGPT. Так, технології з того моменту звісно просунулись, але кор-концепт не сильно змінився.

купить подписку Claude Code, или хотя бы Cursor

Маю таку, навіть раз десять нею скористувався за минулий рік.
Claude Code видає робочій код, який можна підтримувати без бубна стабільно з вірогідністю 50%. Що трошки нижче моїх очікувань.
Я знаю як зробити шанси вище, але конкретно тут ми не про це. Якщо ми кажемо про «холодний старт» — вони завжди ~50%.
А загалом, якщо за дефолтом

использовать агентный подход, а не one-shot

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

использовать скиллы
читать и анализировать чужой опыт, применять на себе, адаптировать.

Я цим займаюсь регулярно і послідовно ще від шкільної парти. Хіба що не користуюсь Х, але я не думаю, що це критично важливо.

писать промпты на английском

В статті промпт українською, і начебто все ок працює.
A загалом я вважав що використання агентів це про зручність. Он ChatGPT китайську вивчив за два (чи скільки там?) місяців після публічного релізу. То ж, якщо мені зручно спілкуватись українською, най трошешки напружиться.

смотри, я отвечал тебе, полагая, что меня спрашивают о совете. но видно, что цель у тебя была другая.

я думаю, что у тебя проблема не с руками, а скорее, с attitude. проще говоря, ты не ищешь, что делать, чтобы получить эффект. ты ищешь, почему у тебя это не будет давать эффект. стадия отрицания.

Мене розкусили.

но видно, что цель у тебя была другая.

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

я думаю, что у тебя проблема не с руками, а скорее, с attitude.

По-чесному, немаю проблем ані з першим, ані з другим.

проще говоря, ты не ищешь, что делать, чтобы получить эффект. ты ищешь, почему у тебя это не будет давать эффект.

Коли я вже вскриваю карти, то ні — тут все геть не так. Моїх поточних знань цілком вистачає, щоб майже гарантовано сказати — де технологію треба використовувати, а де — не треба, навіть якщо можно. Якщо казати конкретно про цю статтю, то з висновками автора я здебільшого погоджуюсь.
Ще простіше: я не шукаю, я знаю. Claude Code у мене чудово працює там, де має працювати, і очікувано не вивозить там, де поки що вивезти не здатен.

стадия отрицания.

Не думаю. Особисто для мене нема причин щось заперечувати.
Якщо конкретно про мене та AI — то поза проєктами для забавки ми взаємодіємо мінімально.

---

я отвечал тебе, полагая, что меня спрашивают о совете.

Це вже особисто від мене, без образ, будь ласка. Але наведені поради — це щось середнє між «книгами-по-успішному-успіху» та можливістю оновити WinRAR до платної версії. Іншими словами, я можу перефразувати їх як: «щоб ідти — іди, щоб дивитись — дивись, щоб навчитись користуватись AI — вчись». Я б порадив трохи більше уваги контексту та деталям; це трошки складніше, ніж робити висновки про чиїсь руки.
Мій промпт не спрацював тому, що в ньому не зазначено прямих вимог до складності розв’язку, і Claude просто підібрав перший, який пройшов тіньові тест кейси, бо це був єдиний доступний йому контекст.
Вірогідність того, що буде обрано саме цей розв’язок була ~20%. Але мені пощастило отримати його з першого трая.

советы были даны самые лучшие — открытые, предложение развиваться. «чтобы научиться пользоваться — нужно учиться» — это правда, другого пути нет.

так что я по прежнему вижу, что дело в attitude. «мои задачи не такие», «мне не подходит», «у меня такие проекты, что их LLMка не вывезет», «пусть агенты напрягаются, чтобы меня понять». я в индустрии 25 лет, слышал такого достаточно.

что я хочу донести и закрою эту тему: измения в индустрии происходят тектонические. я предвижу взрывной рост создания софта по той причине, что AI в значительной степени снижает/снимает барьеры:

— легче стартовать. то, что раньше требовало недель, требует часов — меньше затраты, быстрее итерируемость
— проще что-то пробовать, создавать новое, проверять идеи
— команды расширяют охват продуктов за счет повышения производительности
— новые экосистемы для новых инструментов

бизнес получает самое главное — быстроту. быстрее получить результат, быстрее проверить гипотезу, быстрее выйти на рынок, быстрее итерироваться.

уже сейчас каждая вторая интересная вакансия требует agentic coding. просто нет смысла спорить с рынком и рассказывать, что у тебя задачи не такие.

да, по поводу твоего промпта. я не зря привел пример, что даже небольшая опен-сорсная модель ровно с твоим промптом дает хороший ответ (вот лог: Log). как у тебя Соннет 4.5 дал продемонстрированный код — я не знаю. может поделишься логом?

я в индустрии 25 лет

У мене є друг, так от він каже: «Та я за кермом 40 років», і тільки я та ще пара людей кажемо йому: «І всі сорок років, ти водиш як мудак». Апеляція до авторитету — це прийом демагогії. Навіть якщо вона замаскована. Без образ.

что я хочу донести

Та хіба ж я заперечував хоч щось з того, що ви кажате?
Я лишень сказав, що не все так просто, не так швидко, як бажалось би, не всюди можна застосувати. Але з часом це зміниться, просто я не думаю, що це станеться прямо найближчим часом, поживемо-побачимо.

уже сейчас каждая вторая интересная вакансия требует agentic coding.

Жодної не бачив, але не стану сперечатись — можливо просто вони мені не цікаві.

может поделишься логом?

Та будь ласка. Тільки цього разу це був Opus4.5, і «потрібну» відповідь я отримав з 6-го разу (трохи не пощастило, але все ще доволі близько до тих самих ~20% про які я казав). Оригінальний чат з Sonnet я вже видалив (принаймні, я його не знайшов).
В усьому іншому — я вище надав детальний розгляд чому саме така відповідь. Слабенька модель від сильної відрізняється тільки вхідними даними для тренування, і початковим bias. У іншому проблеми у них однакові.

claude.ai/...​c3-43ca-8e49-f09d4ea77b5c
---
Мій тейк був не про «AI поганий», а про ваше зверхнє та упереджене ставлення до своїх же колег, най навіть і віртуальних. Дуже радий, що ми з вами за ці 25-ть років не пересікались, і сподіваюсь — не пересічемось.
Без образ.

«цікаву» відповідь я отримав з 7-го разу

ну т.е. ты 7 раз нажимал на кнопку Retry, пока не получил ответ, годный, чтобы притащить на форум и выстроить на нем цепочку утверждений?

и что это, как не attitude?

последнее: мой тейк про криворукость был адресован какому-то орлу, который сходу написал, что мол тема не моя, я вообще сиплюсплюсник, но верстальщик у вас говно и ваша аишка все делает плохо. тебе, Сергей, я отвечал корректно, даже когда изначально было ясно, что ты у меня не совета спрашиваешь, а поспорить хочешь.

а ты меня на третьем комменте мудаком назвал.

сподіваюсь — не пересічемось

это уж без сомнения

ну т.е. ты 7 раз нажимал на кнопку Retry, пока не получил ответ, годный, чтобы притащить на форум и выстроить на нем цепочку утверждений?

З 6-го, я помилився, але тут було не про це.
Вчора мені вдалось отримати цей варіант коду з першого разу. Я ж кажу, це тільки питання вірогідності. Вчора одразу, сьогодні довелось почекати, завтра — тільки її буду отримувати. Як пощастить, LLMки за своєю природою недетерміновані.

а ты меня на третьем комменте мудаком назвал.

На п’ятому, якщо бути точним, але навіть так — я цього не робив. Це ви самі собі надумали.

З 6-го

а я тебе писал совет: не используй one-shot, пользуйся агентами с ризонингом. да даже one shot с первого раза дает хороший код.

просто очевидно же, что нет цели получить результат, есть цель — найти причину. и каждый раз причины разные:

— мои проекты слишком большие
— много трачу времени на ревью
— не генерит код, который мне нравится
— когда нибудь AI assissted подход будет работать, но не сейчас

теперь вот еще нашлась причина, что LLM недетерминированные и вот это вот прям останавливает!

я цього не робив

у меня есть друг, он бывает, сморозит какую-то хрень, мы на него посмотрим с укоризной, а он такой:

я цього не робив. Це ви самі собі надумали.
пользуйся агентами с ризонингом

І навіть вони помиляються з певною вірогідністю.

да даже one shot с первого раза дает хороший код.

З певною вірігодністю.

Питання, яке я ставлю конкретно собі: «Чи є така вірогідність помилки для мене прийнятною?» Дуже часто відповідь — ні, але це мої особисті підходи, нікого не закликаю так робити.

теперь вот еще нашлась причина, что LLM недетерминированные

Мені було важко сформувати речення, але я зробив найліпше — не судіть строго.
Це не «еще причина» — це першопричина, через яку LLM (навіть з reasoning) не стане на будь-який проєкт. Усе інше — це вже наслідки цього; які в свою чергу будуть причиною, чому окремий дев не захоче з цим працювати, для кожного вони можуть бути свої.

очевидно же, что нет цели получить результат, есть цель — найти причину.

Я он пару повідомлень вище писав, що особисто у мене Claude Code працює, там де може, a де не може (фактично де недоцільно витрачати сили на його налаштування) — працюю вже я сам. За умови що я маю необмежені ресурси, я можу прикритути AIшку до будь-якого проєкту, але це як анекдоті: «Намагаємось заощадити полтос, шляхом ввалювання тисяч».

и каждый раз причины разные

Здебільшого, мені просто легше та швидше одразу набрати код який мені подобається, ніж вичитувати та/або вимучувати такий у модельки. А там, де мені потрібно «аби працювало» — тільки AI-шка; за бажання я мабуть зможу знайти шматки коду згенеровані ще найпершими загальнодоступними моделями, а я вважаю ми всі погодимось у думці про їх «артефакти».

Ще раз: де можна отримати прийнятний результат за допомогою AI — я його використовую; там де я швидше отримаю такий результат без AI — не використовую.

Я б назвав таку поведінку, дуже спрямованою на результат.

когда нибудь AI assissted подход будет работать, но не сейчас

Він вже працює — ми з вами зараз у коментарях до статі, яка розповідає про його застосування. Я ж кажу, що не всюди його використання доцільно. А ще (мабуть втретє вже це повторюю) я вірю, що це з часом зміниться.

у меня есть друг, он бывает, сморозит какую-то хрень, мы на него посмотрим с укоризной

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

вайбкодирую в 12+ -летнем монолите с 1,000,000+ коммитов и порядка 200 активными контрибьюторами. все фреймворки проприетарные. даже тест-раннер

моя роль при этом как раз про вот эту блабла стратегическую не кашу

это достаточно большой контекст?

это само собой

я просто пытаюсь понять: что такое этот огромный и непостижимый контекст и почему в человека он помещается, а в ллмку — нет

Мені трохи дивно чути таке питання від людини, роль якої

как раз про вот эту блабла стратегическую не кашу

Я не маю короткої відповіді, але спробую пояснити, як зможу.

Коли ми говоримо про умовну межу, де LLM «не вивозить», то вона проходить не за розміром, а за структурою — за здатністю утримувати, переосмислювати й стратегічно керувати знаннями у часі.

Коли ми розглядаємо проєкт як сукупність модулів, класів, функцій, ADR, specs тощо, важливо памʼятати: модель може бачити весь текст, але не мислить по ньому рівномірно.
Більший контекст ≠ глибше розуміння, тому що LLM не має власної стратегії керування увагою:
— не знає, що важливо з точки зору майбутнього
— не має довгострокової мети, окрім заданої у поточному промпті

Навіть з reasoning!
reasoning = локальна оптимізація, а не довгострокове планування з ревізією рішень.
І без чіткої інструкції LLM не здатна «перезавантажити» власні рамки мислення.

Водночас людина тримає контекст системи не як сотні тисяч рядків коду, а як ментальну модель. Думаю, у випадку згаданого моноліту ви сприймаєте його приблизно так:

— тут не чіпаємо, бо впаде X (неявні інваріанти або, простіше кажучи, болісний досвід)
— тут зробили через Y (ієрархія евристик — так, слово неідеальне, але суть у цьому)
— це не робимо, бо стрьомно (відчуття ризику)
— плюс пам’ять про попередні спроби щось змінити

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

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

Якщо зовсім просто:
LLM ламається не на розмірі контексту, а на кількості прийнятих відповідальних рішень.

І я майже впевнений, що міг би відкопати у своїй памʼяті навіть не моноліт, а якийсь «невинний» мікросервіс, підтримку якого LLM не вивезе.

ключевое тут как будто

а якийсь «невинний» мікросервіс, підтримку якого LLM не вивезе.

ну если просто кликать кнопку «мне повезет» — да, не вывезет. зачем так делать — это другой вопрос

если перед этим потратить время на дизайн и чуть посидеть в план моде, то я не вижу особых проблем

можно в ответ, конечно, сказать, мол это это же значит, что ллмка сама не вывезла! но так она и не должна — у нас же не соревнование кто лучше код пишет. у нас речь про использование коддинг ассистента и «ассистент» тут — это довольно точное название

Як інструмент і кодинг-ассистент — так, LLM цілком ок, якщо перед цим є дизайн, план і рамки. І тут ми, здається, повністю згодні.

Але саме в цьому й різниця, про яку я намагався сказати у відповіді.
Коли кажете:

якщо перед цим потратити час на дизайн і план

— фактично описуєте винесення контексту з LLM назовні, у власну голову.

Тобто:
дизайн → ваш
стратегічні інваріанти → ваш
межі допустимих змін → ваш
рішення, що робити не треба → теж ваші

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

Чемпіонат із шахів серед LLM на Kaggle якраз дає відповідь на це питання. Весь цей контекст і розуміння закінчуються там, де треба реально рахувати варіанти: вона робить нормальний код, але може не побачити тактику. Наприклад, та ж багатопотоковість. Або будь-який нетиповий код, як от коли пишеш рушій для своєї гри на кшталт футболу на папері.

тестирование/аналогия с шахматами мало имеет общего с использованием кодинг ассистента. мы тут не соревнуемся кто тактику найдет. мы используем ассистента для работы

точно также я не понимаю примера с задачей «напиши мне движок».
человек же не будет садиться и такой сходу со словами «ну понеслась» писать движок игры
я себе представляю сначала какую-то дизайн фазу, где надо прикинуть общую систему, более подробный дизайн каких-то отдельных частей, основные контракты
что мешает использовать ллмку сначала при дизайн фазе, а потом уже конкретно для кодирования?

я просто реально максимально странно себя чувствую, когда такое расписываю. это же буквально то, как любая крупная задача делается. разве что я с сумрачными гениями общаюсь, которые реально просто садятся и не отвлекаясь на какое-то обдумывание кежуалли печатают ультра-сложные решения. тогда да — мы явну друг друга не поймем

Дозвольте мені декілька уточнень/спостережень.

Я не пам’ятаю, щоб хтось змагався з ШІ. Моє оригінальне повідомлення — це тільки хайлайт про імовірність помилок, невизначеність відповідальності та доцільність використання ШІ в окремих рамках.

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

У реальності:
— частина виникає тільки під час реалізації
— частина — ніколи не формалізується
— частина — це наслідок попередніх фейлів

Різниця, яку я намагався окреслити, швидше в припущеннях:
— з одного боку — «якщо дизайн достатньо хороший, LLM зможе нормально працювати»
— з іншого — «дизайн ніколи не є достатнім, і саме в цій незавершеності й живе основний контекст роботи»

І тут справа не в «сумрачних геніях», а в тому, де саме на нашу думку знаходиться складність і відповідальність.

Мій досвід каже, що більшість логічних багів це непрорахований варіант. Тому аналогія з шахами мені здається дуже вдалою. Якщо у нас код це перекладання з JSON в базу, то там варіантів майже немає та помилятися ніде. А от якщо у нас синхронізація потоків, то пропустити якийсь сценарій досить просто.

Написати рушій... Береш да пишеш... Я не знаю, що таке контракти, загальний дизайн, ... Зазвичай необхідно швидкий генератор ходів, ти з прицілом на це пробуєш різні варіанти представлення позиції, та обираєш що перспективно. Так, є розбиття на підзадачі, але LLM дуже тупить, бісить, відволікає...

Але проблема скоріше в тому, що LLM намагається натянути шахи, шашки... бо щоб зрозуміти треба думати, а не гадати.

Насправді AI-шка може сильно спростити життя. Проблема, яку я бачу, полягає у відсутності бодай якоїсь регуляції (це прям Дикий Захід, діжітал версія), і у тому, що її пхають усюди — де треба, і де не треба. А так, якщо працює — то чому б ні. Якість коду у будь-якому випадку гуляє від «дуже погано» до «задовільно» навіть на ентерпрайзах (я б навіть сказав, особливо на ентерпрайзах).

Гарний опис процесів, + в карму

Ще один привід сказати колегам: «AI ­— це не загроза, це наш новий асистент» :)

Цікаво, дякую! Підписався на ваш канал

Супер! давно хотел попробовать разработку под iOS, а тут весь сетап уже разложен по полочкам. спасибо огромное!

Підписатись на коментарі