вебдев 3
Все категории 

Это — закрепленная заметка в категории.Про сайт

в категориях вебдев, knwn.ru
Этот сайт изначально делался как некий тест технологий, которые я то и дело изучаю. Начал я его себе делать очень давно, около 14−15 лет назад (или еще раньше), тогда это был PHP, MySQL и какое-то чудовище из нативного джаваскрипта, смешанного с ExtJS. И конечно же «кроссбраузерная» верстка для IE6+ и всего остального (Firefox, жуткий на то время Safari еще до WebKit, Opera, которая вообще непонятно зачем). И эти еще помню страшные JS-махинации, чтобы фон у PNG в IE младше 7 стал прозрачным. (еще 694 слова)

REST in peace. Как перейти на Курсор

в категориях AI, вебдев

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

Самое важное: Cursor — это форк VScode, при первом входе он просит авторизоваться (или зарегистрироваться), импортирует все из VScode и сразу почти полностью его заменяет. То есть, можно сказать, что в VScode просто поменялась иконка и появился умный (реально!) ИИ ассистент. Раньше я пользовался Codeium, который был просто плагином, плохо держал контекст и вообще справлялся тяжело, много тупил и выдавал решения мягко говоря удивительные. Я быстро от него отказался. Сейчас он стал Windsurf, но к нему я позднее вернусь, пока про Курсор.

Итак, с Курсором все началось с простого запроса: я попросил его взглянуть на мой сайт целиком и описать, что он понял. Он описал архитектуру проекта лучше, чем я бы сам ее объяснил на устном собеседовании. Причем не просто повторил названия файлов и роутов, а связал их между собой, выстроил логичную структуру, выделил зависимости, понял, что и зачем существует. Указал, где нарушены принципы REST — не в духе сектантского буквоедства, а именно с позиции читаемости и устойчивости URL.

Когда он «увидел», что API реализовано без использования blueprint (потому что ну незачем) — просто через аккуратно организованные маршруты с понятными путями и логикой — он не стал сходу рекомендовать «правильный» подход. Никаких «давай сразу все перепишем на RESTful-стандарты с версионированием и ресурсами». Он понял мой стиль — структурно, просто, понятно — и начал работать в нем, не отвлекаясь на евангелизм. Только когда я сам попросил: «а посмотри, можно ли тут улучшить структуру URL?» — он предложил варианты с /api/posts/, /api/posts/:id/, /api/categories/ и так далее, с комментариями, зачем это может быть полезно и как это вписывается в мою текущую архитектуру.

Проверка

По началу я в каждом промте категорически запрещал что-то менять и просто просил дать оценку. Я начал с простого:

explain what this project does and what each route is for

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

Затем я попробовал дать ему задачу более конкретную:

simplify the /operator/uploads/ code to avoid duplicate file state logic

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

Instead of manually syncing the state, use the same getFiles() function after any mutation (upload/delete). This avoids inconsistencies and duplicated state logic.

И сразу переписывает код в нужных местах, оставляя мне только кнопки Accept и Reject.

После этого я попросил его посмотреть на CSS и JS, просто проверить, что он там найдет. Там было немного кода, что-то около 1.5−2 тысяч строк, но, конечно, местами инлайновые стили, элементы без классов, заглушки — мелочи, короче, но неприятные. Он молча вынес стили в отдельный файл, дал всем объектам осмысленные классы и тут же связал их обратно с HTML. Просто фоном в тишине. И опять: Accept or Reject. С таким подходом начинаешь доверять, но с опаской, естественно.

Контекст

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

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

Он не торопится и перепроверяет (что тоже, конечно, магия). Если просишь изменить функцию, он сначала ищет весь ее контекст. Проверяет, где вызывается. Смотрит, что с ней делают. Иногда спрашивает (всего один раз пока), иногда предлагает сам. Я пару раз ловил себя на том, что он подсвечивает связи, о которых я сам забыл. Такое ощущение, что ты говоришь не с автодополнением, а с инженером, который неделю жил в твоем коде, все там изучил и теперь деликатно уточняет, точно ли ты хочешь вот так. Причем, я «немного» удивлен тем, что он местами меня останавливал и объяснял, почему что-то делать не нужно. Круто, потому что неделю назад я и не думал, что это случится так быстро.

Например, я попросил его собрать новый роут в операторской (это у меня «админка» такая), достаточно понятно ему все объяснил с примерами, так он мне сообщил, что идея ок, но подход не годится, и написал по-своему. А я такой: «ну, я бы и сам до такого дошел со временем». Или не дошел бы. Accept, что уж. За $16 в месяц вполне неплохой напарник, который не перестает удивлять. При этом я фокусируюсь на стратегии, а Курсор делает магию.

Ну нравятся мне эти «зачем?»

в категориях вебдев, knwn.ru

Очень с некоторых пор люблю вопрос «зачем?».

Вот написал я себе сайт, блог внутри написал, целый раздел про себя сделал, но зачем? Ну вот зачем всему интернету знать, что такой человек есть? Да, интересно. Время «персональных страниц» ведь уже закончилось, хотя мамонты, конечно, продолжают какие-то свои блоги вести, но и их терпение, кажется, заканчивается. И вот снова этот вопрос — «зачем?». Ну прекрасно же!

— А ты вот зачем это сделал? Ну вот для чего? («Чтобы что» еще отлично, да.)

Однако, у меня есть ответ. А потому что! Ну нравится мне сайты делать, всегда любил, лет 20 уже, наверное. Вот до Flask добрался, на нем и сделал, раньше вот на NextJS сайт был — нравится мне код писать и всегда нравилось, удовольствие прям получаю, особенно когда новое что-то. В моей работе такая возможность — большая редкость в последние годы, а вот для себя периодически руки чешутся — вот и чешу.

Итак, зачем? Потому что (я уже говорил!) нет-нет да хочется чем-то поделиться и оставить себе на будущее запись о том, что меня занимает в данный момент. А в данный момент меня занимает кризис 40 лет (донимает, скорее), стройка, новый сайт и, конечно, генеративный ИИ, которым я по работе занимаюсь.

Еще мастерскую сделал, там эксперименты всякие лежат (скорее всего в данный момент не лежат).

Смотри также