vak: (Бодхидхарма)
[personal profile] vak
- Пароль?
- План по валу!
- Вал по плану. Проходи.



Покажу, как выглядит программирование с ИИ помощником. В данном случае на примере допиливания текстового редактора v-edit. Для конкретики: используется Cline, такой плагин к VS Code, подключенный к модели grok-code-fast-1.

Ставлю задачу:
Please focus on classes Segment and Workspace. Currently segments are linked into a list in Workspace (head_), and there is a pointer to a current segment (cursegm_). Need to change this representation. Instead of using pointers, let's use std::list and iterators. Here is the plan:
  1. Reimplement head_ as "std::list<Segment> segments_;".
  2. Reimplement cursegm_ as "iterator cursegm_;".
  3. Define helper types:
    using iterator = std::list<Segment>::iterator;
    using const_iterator = std::list<Segment>::const_iterator;
  4. Update all sources to use this representation instead of a doubly linked list with pointers.
Make sure all tests pass after the change.
Переключаю агента в режим Plan и посылаю запрос. Через минуту получаю детальный план разработки:
Based on my exploration of the codebase, here's the detailed plan to convert from a manually maintained doubly-linked list to std::list and iterators:

Current Implementation Analysis

- Segment.h: Contains `prev` and `next` pointers for manual linking
- Workspace.h/cpp: Contains `head_` (Segment*) and `cursegm_` (Segment*) with extensive manual memory management
- Operations: All segment manipulation (insert, delete, search) uses pointer arithmetic and manual linking
- Tests: Comprehensive test suite expects current API behavior

Changes Required

1. Update Segment Class (segment.h)

- Remove `Segment *prev{ nullptr };` and `Segment *next{ nullptr };` members
- These will be managed internally by std::list

2. Update Workspace Class (workspace.h)

- Replace `Segment *head_{ nullptr };` with `std::list<Segment> segments_;`
- Replace `Segment *cursegm_{ nullptr };` with `std::list<Segment>::iterator cursegm_;`
- Add type aliases:
```
using iterator = std::list<Segment>::iterator;
using const_iterator = std::list<Segment>::const_iterator;
```
- Change accessor methods to remain compatible:
- `Segment *chain() const { return segments_.empty() ? nullptr : &segments_.front(); }`
- `Segment *cursegm() const { return &*cursegm_; }` (when valid)

3. Update Constructor/Create Operations

- Instead of `head_ = new Segment(); cursegm_ = head_;`:
```
segments_.emplace_back();
cursegm_ = segments_.begin();
```

4. Rewrite Navigation Logic (set_current_segment, breaksegm, etc.)

- Replace `cursegm_ = cursegm_->next;` with `++cursegm_;`
- Replace `cursegm_ = cursegm_->prev;` with `--cursegm_;`
- Use `std::next(cursegm_)` and `std::prev(cursegm_)` where needed
- Update boundary checks to use `cursegm_ == segments_.begin()` and `cursegm_ == std::prev(segments_.end())`

5. Rewrite Insertion/Deletion Operations

- Replace pointer-based seg->next/prev linking with:
- Insert: `auto pos = segments_.emplace(it, segment);`
- Erase: `segments_.erase(it);`
- Static functions like `create_blank_lines` need to return `std::list<Segment>` instead of chained pointers
- `insert_segments` and `delete_segments` must be rewritten to work with list iterators

6. Update Cleanup Logic

- Replace manual `while(seg) { delete seg; seg = seg->next; }` with `segments_.clear();`
- All memory management becomes automatic

7. Segment Tail Handling

- The tail segment (fdesc == 0) will still be the last element in the list
- Use `segments_.back().has_contents()` to identify tail

8. Update Tests (workspace_unit_test.cpp)

- Tests rely on current pointer-based API, so they should continue working with minimal changes since we're preserving the external Segment* API through accessors
- May need minor adjustments if iterator behavior differs from current pointer tracking

9. Build and Test Verification

- All changes must preserve segment content semantics
- Run full test suite to ensure no regressions
- Verify file loading, editing, and saving still works correctly

Risks and Considerations

- Iterator Invalidation: Ensure no operations invalidate cursegm_ before use
- API Compatibility: External code calling `chain()` or `cursegm()` expects valid pointers
- Performance: std::list insertion/deletion in middle is O(n) worst case, but segments are rarely inserted in middle
- Memory: No memory leaks as std::list handles cleanup automatically

Would you like me to proceed with implementing this plan, or do you have any specific concerns or adjustments to the approach?
Дальше переключаем агента в режим Act и пускаем все перечисленное воплотить. После чего помогаем починить сломавшиеся тесты. Внимательно просматриваем все изменения в коде. Правим что не так, или просим ИИ сделать как нужно. И так десять тысяч вёдер.

Date: 2025-10-28 06:25 (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi
Хм, впечатляет, однако.

Date: 2025-10-28 08:13 (UTC)
chaource: (Default)
From: [personal profile] chaource
У меня на работѣ Курсоръ довольно быстро доходитъ до стадiи "быстрѣе самому исправить". То есть быстрѣе, чѣмъ давать ему подробное описанiе проблемы и причинъ, по которымъ онъ не справился въ предыдущiе двѣ попытки.

Программированiе съ помощью богомерзскаго ИИ ускоряется, но только въ томъ случаѣ, если вы точно знаете, какъ долженъ выглядѣть кодъ въ результатѣ и можете сразу увидѣть, почему кодъ не будетъ правильно работаь. Если вы точно понимаете логику кода и можете сразу увидѣть, гдѣ въ "планѣ работъ" выбрано явно неправильное рѣшенiе.

ИИ можетъ довольно быстро съ нуля написать на 80% подходящiй кодъ, но потомъ продуктивность быстро падаетъ.

Я пока что дѣйствую такъ. Сначала задаю вопросы о томъ, гдѣ въ кодѣ то-то и то-то, какъ оно работаетъ и какъ его можно было бы измѣнить. Но пока ничего въ кодѣ не мѣнять. Потомъ даю конкретное заданiе измѣнить то-то и то-то такимъ-то образомъ. Послѣ чего просматриваю каждое измѣненiе и оцѣниваю, насколько я понимаю то, что ИИ сдѣлалъ. Потомъ я оцѣниваю, будетъ ли мнѣ легче руками исправить или же я по-прежнему не помню какой-то синтаксисъ. Если послѣ двухъ попытокъ ИИ не исправилъ кодъ, я открываю новый дiалогъ и тамъ задаю абстрактно вопросъ - если былъ бы гдѣ-то такой-то кодъ, то какъ его исправить? Если надо написать какую-то функцiю, какiя есть для этого библiотечныя или языковыя средства? Безотносительно къ коду. Иногда такое работаетъ лучше.

Въ общемъ, идетъ процессъ привыканiя къ богомерзкому ИИ.
Edited Date: 2025-10-28 08:14 (UTC)