Проблема, которая висела 9 лет. И почему её боялись
В far2l - клоне Far Manager для Linux - есть тикет. Обычный такой тикет, про перенос по словам в редакторе. Открыт в 2017 году. Девять лет висит.
Почему? Потому что это не просто "добавить флаг". Это архитектурная проблема. Фар работает с текстом как с массивом строк. Word Wrap требует работать с текстом как с потоком символов. Две разные парадигмы в одном месте.
Если ты думаешь, что это простая задача - попробуй объяснить нейросети разницу между виртуальными и реальными координатами в консольном редакторе. Удачи.
Почему именно Gemini 2.5 Pro, а не ChatGPT или локальная модель?
У меня был выбор: GPT-4o, Claude 3.5, локальный Llama 3.2. Я взял Gemini 2.5 Pro. Вот почему:
- Контекст 1 млн токенов - можно загрузить весь исходник far2l и ещё останется место для диалога
- Понимание C/C++ на уровне Senior - модель видит разницу между FAR_FIND_DATA и WIN32_FIND_DATA
- Умение работать с патчами - .diff, .patch форматы она понимает из коробки
- Архитектурное мышление - не просто генерирует код, а предлагает решения с учётом всей системы
Кстати, если хочешь глубже разобраться в возможностях новых моделей, посмотри сравнение Gemini 3 и Gemini 2.5 - там подробно про reasoning способности.
Шаг 0: Подготовка. Как не утонуть в 300к строках кода
Первое, что сделал - не полез в код. Вместо этого:
- Собрал все связанные тикеты и обсуждения (их набралось 14 штук)
- Нашёл все упоминания "word wrap", "перенос", "EditorWrap" в коде
- Создал карту зависимостей: какие модули затрагивает фича
Потом загрузил это всё в Gemini 2.5 Pro одним запросом. Полный контекст - 850к токенов. Модель не моргнула.
1 Анализ проблемы: почему 9 лет не могли сделать?
Gemini выдала анализ на 1500 слов. Главные проблемы:
| Проблема | Почему сложно | Решение от Gemini |
|---|---|---|
| Двойная система координат | Реальные (файл) vs виртуальные (экран) | Ввести маппинг между системами |
| Буфер обмена | Копирование должно работать с реальными координатами | Трансформация при операциях |
| Поиск и замена | Должны искать в реальном тексте | Двойной поиск: виртуальный → реальный |
Самое важное: модель поняла, что нельзя просто добавить флаг CF_WORDWRAP. Нужно менять архитектуру.
2 План атаки: от прототипа к production
Вот что предложила Gemini (я немного подкорректировал):
// Псевдокод того, что нужно было сделать
class Editor {
private:
vector m_Lines; // Реальный текст
vector m_WrappedLines; // Визуальное представление
vector m_LineMapping; // Маппинг: wrapped → real line
// Новые методы
void ApplyWordWrap();
Position RealToVirtual(Position real);
Position VirtualToReal(Position virt);
};
Ключевой момент: не трогать существующий код пока не заработает прототип. Создал отдельный класс EditorWithWrap, который наследуется от Editor и добавляет функциональность.
3 Генерация кода: где Gemini спотыкается
Попросил модель сгенерировать метод ApplyWordWrap(). Получил красивый код... который не компилировался. Почему?
Gemini не знает про внутренние хелперы far2l. Она видит объявление функции, но не знает её реализации. Поэтому генерирует вызовы несуществующих функций.
Что сделал:
- Спросил: "Какие вспомогательные функции уже есть в коде для работы со строками?"
- Получил список из 12 функций
- Попросил переписать метод с использованием только этих функций
Сработало. Код стал компилироваться.
4 Тестирование: как не сломать всё
Тут пригодились агентные возможности Gemini 2.5. Я попросил:
"Создай тестовые сценарии для word wrap. Учти: 1. Разные длины строк (от 10 до 1000 символов) 2. Табуляции 3. Символы Unicode 4. Смешанные языки (русский + английский) 5. Перенос по границам слов"
Модель сгенерировала 47 тестов. Плюс предложила использовать уже существующую тестовую инфраструктуру far2l.
Кстати, про агентные workflow подробнее в статье про Gemini 3 Flash.
Ошибки, которые я совершил (чтобы ты не повторял)
Ошибка 1: Слишком много контекста сразу
Загрузил ВЕСЬ исходный код. 1.2 млн токенов. Gemini начала терять фокус. Решение: загружать модулями. Сначала editor.cpp, потом viewer.cpp, потом dialogs.
Ошибка 2: Доверился первой реализации
Gemini сгенерировала алгоритм переноса. Красивый, но медленный - O(n²). В редакторе на файле в 100 МБ это приводило к подвисаниям. Пришлось просить оптимизировать.
// ПЛОХО: так делать не надо
for (size_t i = 0; i < lines.size(); ++i) {
while (lines[i].length() > width) {
// Ищем место для разрыва...
// Медленно при каждом изменении
}
}
// ЛУЧШЕ: предварительный расчет
vector breaks = CalculateBreakPoints(text, width);
// Быстрое применение
Ошибка 3: Не проверил edge cases
Китайские иероглифы. Арабская вязь. Справа-налево текст. Gemini про это не подумала. Пришлось специально спрашивать: "Как обработать bidirectional text при переносе?"
Что получилось в итоге
Через 3 дня работы (из них 8 часов с Gemini) - работающий прототип. Ещё 2 дня на полировку и тесты. Итог:
- Полностью рабочий Word Wrap в редакторе
- Поддержка всех языков (Unicode)
- Корректная работа с буфером обмена
- Поиск и замена работают через трансляцию координат
- Производительность: падение на 2-3% при включенном переносе
Патч отправил в репозиторий. 9-летний тикет закрыт.
Почему это важно для Junior/Middle разработчиков
Раньше для таких задач нужен был Senior с 10-летним опытом в C++ и знанием кодовой базы. Теперь достаточно:
- Понимания проблемы (можешь объяснить словами)
- Доступа к Gemini 2.5 Pro или аналогичной модели
- Умения читать и проверять сгенерированный код
Это меняет правила игры. Ты можешь браться за задачи уровня выше своей квалификации. Рисковать. Ошибаться. Учиться.
Но есть нюанс: AI не заменит понимания архитектуры. Если не понимаешь разницу между real и virtual coordinates - никакая Gemini не поможет.
Мои промпты, которые работают
Вот конкретные запросы, которые давали лучшие результаты:
# Анализ архитектуры
"Проанализируй структуру класса Editor в far2l. Какие методы отвечают за:
1. Отображение текста на экране
2. Навигацию по тексту
3. Модификацию текста
4. Работу с выделением"
# Генерация с ограничениями
"Сгенерируй метод ApplyWordWrap с такими ограничениями:
- Используй только функции из пространства имён Text
- Не изменяй существующие публичные методы
- Сохраняй обратную совместимость
- Максимальная сложность O(n log n)"
# Поиск проблем
"Найди потенциальные проблемы с производительностью в этом коде.
Особое внимание на:
- Вложенные циклы по строкам
- Частые аллокации памяти
- Копирование больших массивов"
Больше работающих промптов и техник в гайде по Google Gemini.
Что дальше? Куда двигаться
Если хочешь повторить мой опыт:
- Возьми любой open-source проект с давними открытыми issues
- Выбери задачу, которая тебе немного не по зубам
- Используй Gemini 2.5 Pro или Gemini Pro для разработчиков
- Не бойся спрашивать глупые вопросы. Модель не осудит
- Каждый сгенерированный блок кода проверяй вручную
Самый страшный legacy-код становится не таким страшным, когда у тебя есть AI-ассистент, который понимает контекст. Главное - не расслабляться. Gemini не пишет идеальный код. Она пишет код, который нужно проверять.
И последнее: следующий мой проект - визуализация магнитных полей в браузере. С Gemini и WebGPU. Если интересно - следи за блогом.
Удачи. И не бойся legacy-кода. Он просто код, который ждёт, когда его починят.