惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
The Last Watchdog
The Last Watchdog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
T
Troy Hunt's Blog
L
LINUX DO - 最新话题
C
Check Point Blog
T
Threat Research - Cisco Blogs
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
罗磊的独立博客
V
Vulnerabilities – Threatpost
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
J
Java Code Geeks
Apple Machine Learning Research
Apple Machine Learning Research
大猫的无限游戏
大猫的无限游戏
S
Security @ Cisco Blogs
IT之家
IT之家
T
The Exploit Database - CXSecurity.com
The GitHub Blog
The GitHub Blog
D
Docker
Engineering at Meta
Engineering at Meta
AWS News Blog
AWS News Blog
S
Security Affairs
U
Unit 42
P
Palo Alto Networks Blog
V
Visual Studio Blog
Y
Y Combinator Blog
D
DataBreaches.Net
Forbes - Security
Forbes - Security
阮一峰的网络日志
阮一峰的网络日志
美团技术团队
Security Latest
Security Latest
aimingoo的专栏
aimingoo的专栏
Simon Willison's Weblog
Simon Willison's Weblog
A
Arctic Wolf
博客园_首页
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
H
Hacker News: Front Page
博客园 - 司徒正美
博客园 - Franky
宝玉的分享
宝玉的分享
TaoSecurity Blog
TaoSecurity Blog
Latest news
Latest news
Scott Helme
Scott Helme
MongoDB | Blog
MongoDB | Blog
量子位
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
C
Cisco Blogs
P
Privacy International News Feed
Application and Cybersecurity Blog
Application and Cybersecurity Blog

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Как я использовал Cursor для онбординга в продукт в бигтех-компании
RJME (МТС) · 2026-05-07 · via Все публикации подряд на Хабре

Уровень сложностиПростой

Время на прочтение8 мин

Охват и читатели1.1K

Привет! Меня зовут Родион, я стажер фронтенд-разработчик. Когда-то в 2022 году писал свои первые сайты на нативном HTML, CSS и JavaScript. С тех пор успел поработать в стартапах и на фрилансе, и вот опыт завел меня в мой первый бигтех — MTS Web Services.

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

В первые дни мне дали задачу по созданию нового виджета. На проекте их уже было много, так что где-то должны были храниться файлы, в которые я планировал дописать строчки, а еще папки, чтобы добавить новые компоненты. Звучит элементарно, на поиск нужных мест я потратил около часа. Просто на то, чтобы понять, где все это лежит.

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

Почему выбор пал на Cursor

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

В Cursor можно напрямую писать и редактировать код в файлах, применять правки и исправлять ошибки. Любые изменения не применяются без согласия пользователя — сначала они отображаются как патч внутри файла: зеленым выделяются те строки, которые будут добавлены, а красным те, которые он хочет удалить. Выглядит это примерно так:

То есть каждую строку видно до того, как она попадет в файл. Можно принять все правки сразу или пройтись по каждой. Для меня как стажера это показалось важным. Конечно, опытные разработчики часто включают автоприменение, потому что вручную принимать правки в десяти местах это потеря времени, а не безопасность. Чем лучше ты понимаешь проект и чем точнее твои промпты, тем меньше нужен ручной контроль каждой строки. Я пока на том этапе, когда лучше перепроверить, чем потом разбираться с последствиями.

Еще Cursor не загружает в модель все файлы разом, а индексирует кодовую базу при открытии проекта — разбивает файлы на смысловые куски (функции, классы, экспорты) и превращает их в векторные представления. По этим индексам он ищет релевантные куски и отправляет их в модель вместе с промптом. Единственный момент: если файл слишком большой или проект представляет собой монорепозиторий, он начинает сильно тормозить и дает неточные изменения (о чем я узнал чуть позже).

Под капотом Cursor использует ChatGPT, Claude, Deepseek и Grok. Поэтому он может анализировать весь проект целиком, а не только дописывать функции или создавать переменные. Это мне как раз и было нужно.

Как я подружился с Cursor

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

В ответ Cursor не написал ни строчки кода, но четко объяснил структуру: какой файл за что отвечает, куда добавляются компоненты, где лежат типы. Именно то, что до этого я пытался найти целый час:

Дальше я задавал вопросы, просил исправить проблемные места, уточнял поведение незнакомых модулей. По ходу диалога Cursor все меньше нуждался в дополнительных объяснениях, быстро улавливал контекст и предлагал правки, которые вписывались в правила проекта. 

Например, в проекте был модуль с непонятным названием, внутри которого была функция на 80 строк без комментариев. Я спросил: «Что делает эта функция и зачем она здесь вызывается?» Из ответного сообщения узнал, почему именно такая трансформация и что трогать эту логику опасно, ведь она используется еще в трех местах. И на это ушло 30 секунд. 

Но это сработало, потому что функция была относительно простой. Когда я попробовал тот же прием на модуле с нетривиальной асинхронной логикой, ответ был уверенный и связный, но часть деталей оказалась все-таки неточной. А узнал я об этом только потому, что мои изменения просмотрел сеньор. Cursor хорошо справляется с читаемым кодом, но чем больше сложностей, тем выше шанс галлюцинации, — это стоит учитывать.

После реализации нового виджета приступил к следующей задаче — созданию формы. Ну и так шаг за шагом познакомился со всем проектом. И вот что я делал и понял в процессе.

Четко формулировал промпты

Отдельно стоит поговорить о запросах. Расскажу, по какой логике их писал.

Во-первых, сразу давал контекст. Не просто указывал, что нужно сделать или что хочу увидеть, а объяснял, зачем я это делаю. Например, вместо «Исправь эту функцию», использовал «Эта функция отвечает за авторизацию, сейчас она падает при пустом токене — нужно добавить проверку и вернуть понятную ошибку». Благодаря этому увидел рабочее решение. Без контекста он, скорее всего, добавил бы просто if (!token) return, и это было бы технически верно, но не соответствовало тому, как обрабатываются ошибки в остальных частях проекта.

Во-вторых, указывал конкретные границы. Как бы пытаясь помочь, Cursor может затрагивать смежные модули. Что бы этого не происходило, я писал напрямую: «Меняй только этот компонент и не трогай остальные».

В-третьих, описывал стек и соглашения. Когда я сам разобрался в правилах проекта, то стал передавать их в явном виде. К промпту стал добавлять: «Проект на React + TypeScript, стейт через Zustand, стили CSS Modules, линтер ESLint с правилами airbnb. Напиши компонент в этом стиле». Без таких дополнений он иногда выдает решения, которые не вписываются в кодовую базу, хоть сами по себе и являются корректными. 

В-четвертых, просил все объяснять. Да, Cursor не только предлагает код, но и может аргументировать, почему выбрал именно такое решение. Для этого в конец промпта я добавлял: «Объясни свое решение в двух предложениях». Ответы помогали мне оценивать и принимать изменения.

Вот еще примеры для сравнения:

Неудачный промпт

Удачный промпт

«Исправь эту функцию»

«Эта функция отвечает за авторизацию и падает при пустом токене. Добавь проверку и верни понятную ошибку. Меняй только этот файл»

«Создай компонент»

«Создай компонент карточки товара. Проект на React + TypeScript, стили — CSS Modules, именование — PascalCase. Объясни решение в двух предложениях»

«Объясни архитектуру»

«Я стажер, работаю два дня. Помоги понять, где файлы и папки, связанные с созданием виджетов»

Использовал отдельные чаты под каждую задачу

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

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

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

Так что важно понимать, что контекст помогает, но только пока он актуален и чат не перегружен.

Добавил правила в Rules и .cursorrules

Чтобы не объяснять стек, соглашения и правила проекта в каждом новом чате, можно положить их в папку .cursor/rules/ в корне проекта. В ней есть файлы с расширением .mdc, которые работают как системный промпт — они читаются автоматически при каждом запросе и в каждом новом диалоге.

Чтобы создать правило, наберите «Cmd+Shift+P → New Cursor Rule» и файл появится в нужном месте. Например:

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

После того как я прописал стек и соглашения, Cursor перестал предлагать решения с inline-стилями или useState там, где должен быть Zustand. Это очень выручило меня в момент онбординга. А еще так я структурировал собственные знания о проекте, собрал все в одном месте, чтобы не держать в голове.

Работал с галлюцинациям

Как и все другие помощники, Cursor может галлюцинировать, причем тогда, когда ты меньше всего этого ждешь. 

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

Я бы разделил галлюцинации в Cursor на четыре категории: 

  • Распространенные решения — когда ответ формируется с опорой на лучшие практики, но без учета кодовой базы, которую он просто еще не знает. Он может предложить inline-стили вместо CSS Modules или any вместо нормального типа. Поэтому я добавил .cursorrules, а еще в промптах подробно описывал весь стек.

  • Неполный контекст — видит только то, что ему показали. Если попросить написать компонент, не объяснив, как устроены соседние модули, он сам будет додумывать связи и почти наверняка ошибется. Так что важно передавать переменные, токены и зависимости в явном виде.

  • Чрезмерная уверенность — предлагает синтаксически правильный код, но со сломанной логикой. Все компилируется, линтер молчит, но в рантайме падает или ведет себя неожиданно. Именно поэтому я старался отслеживать изменения и принимал только те, в которых был уверен. Был момент, что Cursor переписал обработчик формы и забыл передать одно из полей дальше. Форма сабмитилась, запрос уходил, ошибок не было, но одно поле молча терялось. Удалось поймать уже только на ревью.

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

Отслеживал баги

Галлюцинации — не единственная проблема. За время онбординга я поймал несколько багов, которые связаны не с качеством ответов, а с поведением Cursor.

Зависание на больших файлах. Когда я работал с файлами на несколько сотен строк, Cursor иногда долго думал. В итоге либо ничего не менял, либо делал что-то минимальное вроде переименования функций. Не падал, не выдавал ошибку, но делал не то. Я заметил закономерность: если ответ приходил подозрительно быстро после долгого ожидания и патч выглядел слишком коротким, обычно это значило, что он не справился.

Удаление кода, который не просили трогать. В патче несколько раз исчезал код, который я не просил менять. Cursor не предупредил, а просто убрал строки, которые, видимо, посчитал лишними. Именно поэтому я читал весь diff целиком, даже если просил поменять одну строку. И особое внимание уделял красным строкам.

.cursor/rules применялся не всегда. Правила из файла работают, но скорее как подсказки, а не жесткие ограничения. Например, он предлагал useState там, где правило явно говорило использовать Zustand, особенно в Agent-режиме. Помогало просто продублировать правило в промпте. 

Итог

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

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

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