Фото Барбари Зандоваль на Unsplash
У світі технологій активно обговорюється питання, чи зможе штучний інтелект зрештою замінити інженерів, і існують сильні аргументи як за, так і проти цього. Мій недавній досвід роботи з Cursor, асистентом для кодування на базі ШІ, дає цікаві практичні інсайти у це обговорення.
Я працюю над навчальним проектом, метою якого є створення прототипу цифрового менеджера активів (DAM) з використанням ШІ на базі Ruby on Rails. Цей проект виявився особливо складним через мій обмежений досвід роботи з Ruby. Для подолання цих труднощів я вирішив експериментувати з Cursor, який нещодавно набув значної популярності.
Протягом цього процесу я зрозумів, в чому Cursor може бути корисний і як він здатен заощадити час. Однак також стало зрозуміло, як використання Cursor без досвідченого наставника може призвести до проблем.
Нижче я опишу проект, процес та висновки з цього експерименту, враховуючи не тільки технічну реалізацію, але й розвиток відносин між інженерами та їхніми асистентами на базі ШІ.
Походження проекту
Приблизно рік тому я працював з командою інженерів над інтеграцією кастомного редактора контенту в популярну комерційну систему DAM.
Під час тестування цієї інтеграції я часто мав потребу знаходити конкретні зображення за певними характеристиками — різними типами файлів, розмірами, темами контенту та колірними схемами.
Це завдання стало надзвичайно складним: наші творці контенту накопичили десятки тисяч зображень в DAM за роки, а пошукова система була обмежена. Я або мав запам’ятовувати унікальний ідентифікатор кожного зображення, або використовувати правильну комбінацію ключових слів.
Ще більше ускладнювало ситуацію те, що ключові слова для цих зображень були непослідовними, адже їх додавали і підтримували різні творці контенту на протязі багатьох років.
Я зрозумів, що має бути інший підхід до пошуку зображень. Що, якщо при завантаженні зображення автоматично генерувати точну назву і опис його вмісту?
Цей підхід дозволив би покращити пошук: якщо мені потрібно знайти зображення вишневого пирога, то, принаймні, слова "вишня" і "пиріг" мали б зберігатися разом з зображенням.
Доказ концепції
Після кількох початкових труднощів я зміг створити робочий прототип, який використовує модель зору OpenAI для автоматичного генерування назви та довгого опису для кожного зображення під час процесу завантаження.
(Цей довгий опис також важливий для доступності, і раніше це поле не заповнювалося належним чином).
Пишучи код, я активно використовував чат Claude Sonnet 3.5.
Після завершення цього доказу концепції, хоча функцію пошуку ще не було реалізовано, я відкллав проект і повернувся до своїх основних обов’язків.
Відродження проекту з оновленнями
Через рік я натрапив на статтю Емілі Гіббс на Medium під назвою "Створення семантичного пошуку зображень за допомогою векторних вбудовувань", яка починалася з питання, яке я сам ставив:
Чи доводилося вам коли-небудь витрачати час, намагаючись знайти конкретне фото в папці зображень? Або шукати потрібне зображення для презентації в репозиторії, але так і не знаходити те, що вам потрібно?
Стаття детально пояснювала, як векторні вбудовування можуть створити функціональність пошуку на основі значення, а не тільки за ключовими словами. Цей підхід здалося ідеальним доповненням до мого попереднього проекту, і відкривав можливість для навчання чогось нового.
Однак, як і раніше, я сумнівався у своїх технічних здібностях, зважаючи на обмежений час. Тому я вирішив спробувати реалізувати цю семантичну функцію пошуку за допомогою Cursor.
Я вибрав Cursor, тому що він почав використовуватись в моєму офісі.
Початкове налаштування та тестування
Я почав з того, що завантажив Cursor, який інтегровано з IDE Visual Studio Code, отримав свій код з віддаленого репозиторію і налаштував середовище для розробки. Коли все було готово, я провів кілька попередніх тестів.
Оскільки додаток був на Rails 7.2, перший тест полягав у тому, щоб попросити Cursor оновити проект до Rails 8. Потрібно було кілька спроб, перш ніж я вибрав наступний запит:
Help me upgrade my Ruby on Rails application from Rails 7.2 to Rails 8.
Perform the following step by step:
- Update the necessary gems in my Gemfile
- Identify any deprecated features and suggest a replacement
- Show me how to run the necessary upgrade tasks or migrations
- Highlight any major API or breaking changes I should be aware of
- Suggest new Rails 8 features to enhance my application
Focus on maintaining compatibility while taking advantage of Rails 8 improvements.
Make sure to do this process step by step, pausing between steps for review.
Цей процес пройшов гладко — мені потрібно було лише кілька коригувань, перш ніж додаток знову запрацював.
Наступним кроком я вирішив вирішити проблему відсутності тестів у попередній версії, попросивши Cursor створити їх для мене. Спочатку це не спрацювало — я зрозумів, що треба бути більш конкретним вказуючи, які саме компоненти потрібно тестувати. Наприклад, я чітко попросив написати тести для моделі зображення:
I need comprehensive tests for my app/models/image.rb file in my Rails application.
Please generate tests that cover:
- Validations and associations defined in the model
- Any instance methods and their edge cases
- Any class methods and their expected behaviors
- Common failure scenarios that should be handled gracefully
When writing these tests, focus on:
- Testing all public methods and behaviors
- Ensuring good test coverage of conditional logic
- Using appropriate fixtures or factory setup
- Following Rails testing best practices for models
Please examine my Image model implementation first, then create appropriate test cases that would properly validate its functionality.
The tests should go in the standard Rails test directory structure for model tests.
Коли я змінив код і тести почали давати помилки, я попросив Cursor виправити їх, але Cursor часто змінював сам код замість виправлення тестів. Мені вдалося подолати це, додавши до запиту: “Do not change the working application code.”
Як фінальний тест я попросив перейти на RSpec замість minitest. Cursor додав gem для RSpec і переробив мої існуючі тести.
I'd like to switch my Rails application from using the default testing framework to RSpec.
Please help me:
- Add the necessary gems to my Gemfile (rspec-rails and any other required dependencies)
- Set up the RSpec configuration files and directory structure
- Convert all my existing tests to the RSpec format, maintaining the same test coverage and functionality
- Update any test helpers or fixtures to work with RSpec
5.
Ensure all tests pass after the conversion
When making these changes:
- Keep the same test coverage and assertions, just translated to RSpec syntax
- Use modern RSpec practices (describe/context/it blocks, expectations with matchers)
- Maintain any existing test data or setup logic
- Do not change the working application code - only modify test files
- Show me how to run the new RSpec test suite
Please walk me through this process step by step so I can understand how to maintain these tests going forward.
Під час внесення змін я мав кілька невдалих спроб, і кілька разів змушений був відкотити код. Але поступово, після консультацій з Claude, все почало працювати.
Процес створення продукту
Для цієї нової функції я вирішив почати, як для будь-якого проекту — з написання користувацьких історій. Для цього я скористався Cursor, щоб допомогти мені. Я пояснив функцію та надав приклад коду, щоб Cursor міг згенерувати користувацькі історії:
В результаті Cursor створив п'ять історій, які я вирішив реалізувати:
- Додати векторні вбудовування при завантаженні зображення
- Додати кінцеві точки для пошуку за зображенням та текстом
- Створити UI для вводу користувачем
- Стилізувати та покращити
- Оновити для підвищення продуктивності
Це було чудовим стартом, але я застряг при реалізації другої історії, коли тести почали давати помилки, і функціональність не працювала. Я продовжував працювати, і з часом зумів подолати це.
Що сталося?
Основною проблемою було те, що Cursor рухався занадто швидко, і я не встигав перевіряти його роботу. Я не ділив завдання на підзавдання, що призвело до помилок і нескінченних проблем, які ставали дедалі складнішими.
Згодом я зрозумів обмеження Cursor, серед яких:
- Відсутність безперервності — Cursor іноді втрачає слід.
- Розширення обсягу роботи — Cursor використовував текст замість векторних вбудовувань.
- Застарілі посилання — використовувалися застарілі моделі.
Однак, на завершення, я навчився, що Cursor є корисним для рутинних завдань, але для складних завдань потрібен досвідчений інженер, який здатен його направляти.
Перекладено з: Cursor and the value of a good engineer