JavaRush /Курси /Claude code /IDE, термінал і логи як докази

IDE, термінал і логи як докази

Claude code
Рівень 8 , Лекція 1
Відкрита

1. Одних файлів уже замало

Код — головне джерело істини. Але між «у коді написано» і «у середовищі виконання сталося» лежить прірва.

У лекції про API_MAP.md ви шукали кінцеві точки, контролери, клієнтів, черги, конфіги й тести. Це статична карта проєкту. Візьмімо Commerce OS: ви знайшли POST /api/orders, побачили OrderController, зрозуміли, який сервіс створює замовлення, знайшли тести. А інтеграційний тест каже: за порожнього email система має повернути 400, але повертає 500. Карта з файлів — це схема, а не поведінка.

Тримайте в голові різницю:

Джерело На яке питання відповідає
Код і конфіги «Де це має працювати і як це задумано?»
Вивід термінала і тести, що впали «Що реально зламалося просто зараз?»
Stack trace і логи середовища виконання «Де саме це впало або пішло не туди?»
Скриншот інтерфейсу «Що в цей момент побачив користувач?»

Код показує, як влаштований механізм. Сигнали виконання показують, як він поводився під конкретним введенням, командою і сесією. Ці сигнали і потрібні Claude Code: вони звужують простір припущень. Ви не просите «вгадай, де баг» — ви приносите докази.

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

2. IDE — точний канал контексту, а не просто красивіший редактор

У роботі з Claude Code IDE цінна не красою, а точністю. Вона дає моделі саме той фрагмент, який важливий зараз: конкретний метод, блок умов, рядок у контролері. Це контекст через виділення — selection-as-context.

Розслідуєте баг у Commerce OS: за порожнього email checkout має повернути 400, а приходить 500. Типова помилка — надіслати «перевір, чому замовлення ламається» і дозволити читати весь модуль orders. Це вже не розслідування, а екскурсія районом. Точніше — відкрити OrderController, виділити метод і сказати: «використовуйте виділений код як основний контекст».

@PostMapping("/api/orders")
public ResponseEntity<?> createOrder(@RequestBody CreateOrderRequest request) {
    orderValidator.validate(request);              // за невалідних даних очікуємо 400
    Order order = orderService.create(request);    // зараз десь тут отримуємо 500
    return ResponseEntity.ok(order);
}

Фрагмент працює в зв’язці з точним запитом:

Використовуйте виділений метод як основний контекст.
Ось мета: зрозуміти, чому за порожнього email endpoint повертає 500 замість 400.
Посилайтеся на конкретні рядки і не робіть припущень без evidence.

Запит добрий не формулюванням, а тим, що він вузький: область пошуку обмежена, очікувана поведінка позначена, робота від фактів задана. Claude легше з 12 рядками, ніж із 600.

Другий сильний бік IDE — прив’язка до file:line. Пишете не «дивись OrderController», а OrderController.java:42-46 — і модель не починає обговорювати сусідні методи та архітектуру модуля «про всяк випадок». А «про всяк випадок» — дорогий спосіб забруднити контекст.

3. Термінал: показуйте помилку, а не переповідайте

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

Замість «замовлення чомусь падає» дайте команду й результат:

./gradlew test --tests OrderControllerTest
# FAILED: expected: <400> but was: <500>
# at OrderControllerTest.createOrder_validationFails(OrderControllerTest.java:73)

З такою вуликою розмова інша:

Ось команда, яка відтворює проблему:
./gradlew test --tests OrderControllerTest

Ось результат:
FAILED: expected: <400> but was: <500>
at OrderControllerTest.createOrder_validationFails(OrderControllerTest.java:73)

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

Корисний не тільки вивід, а й команда, яка його породила. Без команди моделі складніше відновити контекст: це unit-тест? integration? локальний запуск? build? smoke check? Один і той самий текст помилки в різних командах означає різне.

І з міркувань безпеки на старті: перед передачею terminal output перевірте, чи немає там секретів, токенів, внутрішніх URL та інших чутливих даних. AI не «забуває по-людськи» — приносите очищений матеріал.

4. Stack trace — це маршрут до рядка

Stack trace виглядає як прокляття: довгий текст, купа класів, framework internals, пів екрана дужок. Але це одна з найкоротших доріг від симптому до місця поломки.

Увесь trace розбирати не потрібно. Дивіться на тип помилки, потім шукайте перші рядки свого проєкту, а не внутрішні механізми Spring, JUnit або іншого фреймворку:

java.lang.NullPointerException: Cannot invoke "String.trim()" because "customerEmail" is null
    at src/orders/OrderService.create(OrderService.java:51)
    at src/orders/OrderController.createOrder(OrderController.java:45)
    at OrderControllerTest.createOrder_validationFails(OrderControllerTest.java:73)

Це вже карта руху: тест викликав контролер, контролер — сервіс, сервіс упав на рядку 51, тому що customerEmail виявився null, а код викликав trim(). Модель не вгадує про «щось із валідацією на фронтенді» — вона бачить реальний шлях виконання.

Відкрийте проблемний метод в IDE — отримаєте зв’язку runtime trace + точковий фрагмент:

public Order create(CreateOrderRequest request) {
    String email = request.customerEmail().trim(); // тут і падаємо за null
    paymentPolicy.check(request);
    return orderRepository.save(new Order(email));
}

Лише код — можете не помітити проблему. Лише trace — знаєте місце падіння, але не бачите сусіднього контексту. Разом — майже завершена інженерна гіпотеза.

Логи середовища виконання працюють так само, навіть без повного stack trace. Видно в логах email=null, а одразу після — creating order: це вже ланка доказового ланцюга. Головне — показувати релевантний фрагмент, а не переповідати словами.

5. Скріншот — теж evidence, якщо є підпис

Дві крайнощі: одні не використовують скриншоти як «нетехнічне», інші прикладають картинку як реліквію і чекають, що вона все пояснить сама. Скріншот корисний, коли проблема в стані інтерфейсу: порожній екран, неправильна помилка, зникла кнопка, накладання елементів, зламана модалка.

Той самий checkout у Commerce OS: користувач вводить порожній email, натискає «Оформити замовлення» і замість помилки валідації отримує порожній екран. «Фронт розвалюється» — замало. Скріншот із коротким підписом — ясніше:

Скріншот: checkout-empty-email.png
Підпис: після кліку по «Оформити замовлення» сторінка не показує помилку валідації, а переходить у порожній екран.

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

Правило просте: у скриншота майже завжди підпис у один-два рядки. Без підпису Claude інтерпретує зображення сам — знову припущення. Із підписом картинка стає доказом.

6. Збираємо невеликий пакет доказів для Claude Code

Для більшості завдань не потрібен гігантський звіт. Достатньо короткого, акуратно зібраного пакета: рівно стільки, щоб Claude Code зрозумів проблему і не потонув у шумі.

Мета:
Зрозуміти, чому POST /api/orders за порожнього email повертає 500 замість 400.

Контекст:
Використовуйте виділений метод OrderController.createOrder як основний контекст.

Команда відтворення:
./gradlew test --tests OrderControllerTest

Результат:
FAILED: expected: <400> but was: <500>
at OrderControllerTest.createOrder_validationFails(OrderControllerTest.java:73)

Stack trace (скорочено):
java.lang.NullPointerException: Cannot invoke "String.trim()" because "customerEmail" is null
at src/orders/OrderService.create(OrderService.java:51)

Скриншот:
checkout-empty-email.png — після кліку сторінка переходить у порожній екран.

Що потрібно від Claude:
Знайти мінімальну причину, послатися на рядки коду і запропонувати найменше виправлення без масштабного рефакторингу.

Зверніть увагу, як тут поєднуються всі вже знайомі нам практики. Є мета з task spec. Є вузький контекст через виділення в IDE. Є команда та її вивід. Є скорочений stack trace. Є візуальне підтвердження з боку інтерфейсу. І є явне прохання не розповзатися в великий рефакторинг. Такий пакет добре працює не лише в поточній сесії, а й тоді, коли ви повертаєтеся до завдання після паузи і не хочете знову переповідати всю історію.

Ця ж звичка дуже корисна і для ваших артефактів на кшталт API_MAP.md. Якщо раніше запис про POST /api/orders спирався лише на контролер і сервіс, то після розслідування ви вже можете прив’язати до нього і докази з середовища виконання: який тест підтверджує поведінку, яка команда відтворює збій, які обмеження знайшлися валідацією. Карта проєкту від цього стає живішою й чеснішою.

У якийсь момент ви помітите цікавий злам. До нього ви просите Claude Code «подумати, що тут не так». Після нього ви приносите йому конкретні докази й просите провести розслідування. І саме в цій точці Claude перестає бути ворожкою з клавіатурою й починає працювати як справжній інженерний помічник.

Такий пакет доказів потрібен не лише для виправлення бага. Ним також зручно уточнювати спірний запис у API_MAP.md, збирати troubleshooting note або чернетку документації і, коли розслідування розростається, виносити широке читання в окреме вікно на кшталт subagent-а, щоб назад повернулася вже коротка перевірна вичавка.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ