Общая папка для работы Claude Code и Codex
Луи-Франсуа Бушар собрал заметки, инструкции-скиллы, скрипты и итоги встреч в Obsidian. Его связка устроена так:
Папка хранит исходные материалы и решения
↓
Индекс указывает, где искать данные для задачи
↓
Claude Code планирует работу
↓
Codex выполняет задачи по его вызову
В описании этого рабочего процесса Бушар объясняет, зачем даёт агенту сведения для конкретной задачи. Начать предлагает с общей папки, короткого индекса и одного повторно используемого скилла.
#ии #инструменты
Луи-Франсуа Бушар собрал заметки, инструкции-скиллы, скрипты и итоги встреч в Obsidian. Его связка устроена так:
Папка хранит исходные материалы и решения
↓
Индекс указывает, где искать данные для задачи
↓
Claude Code планирует работу
↓
Codex выполняет задачи по его вызову
В описании этого рабочего процесса Бушар объясняет, зачем даёт агенту сведения для конкретной задачи. Начать предлагает с общей папки, короткого индекса и одного повторно используемого скилла.
#ии #инструменты
👎6👍3🤗2🔥1😘1
Типичный программист
Общая папка для работы Claude Code и Codex Луи-Франсуа Бушар собрал заметки, инструкции-скиллы, скрипты и итоги встреч в Obsidian. Его связка устроена так: Папка хранит исходные материалы и решения ↓ Индекс указывает, где искать данные для задачи ↓ Claude…
Приходится ли вам копипастить данные и какие именно, когда переходите из одной нейросети в другую?
Anonymous Poll
18%
Код
28%
Описание задачи
14%
Документацию
17%
Результаты работы
19%
Настройки и контекст: историю чатов, промпты, скиллы
51%
Ничего, использую один инструмент
😐4✍2🔥2🤔2❤🔥1🎉1👨💻1🤝1
Зачем CPython предлагают Rust и почему начинают с zlib
Миллион строк C за один раз не перенести. Команда Rust for CPython предлагает начать с небольшого модуля zlib: он сжимает данные и широко используется при упаковке Python-пакетов. Замена на zlib-rs может ускорить почти каждый pip install, если предложение примут.
По предложенной дорожной карте реализация на Rust появится в Python 3.16 как опция, а версия на C останется запасной. Сроки условны, переход ещё не принят. Rust тоже не гарантирует отсутствие ошибок: команда планирует проверять код тестами, в том числе на случайных входных данных.
В разборе постепенного внедрения Rust есть и условия продолжения: поддержка всех платформ CPython, отсутствие заметного замедления и готовность разработчиков ядра работать с Rust.
#python
Миллион строк C за один раз не перенести. Команда Rust for CPython предлагает начать с небольшого модуля zlib: он сжимает данные и широко используется при упаковке Python-пакетов. Замена на zlib-rs может ускорить почти каждый pip install, если предложение примут.
По предложенной дорожной карте реализация на Rust появится в Python 3.16 как опция, а версия на C останется запасной. Сроки условны, переход ещё не принят. Rust тоже не гарантирует отсутствие ошибок: команда планирует проверять код тестами, в том числе на случайных входных данных.
В разборе постепенного внедрения Rust есть и условия продолжения: поддержка всех платформ CPython, отсутствие заметного замедления и готовность разработчиков ядра работать с Rust.
#python
🤔11❤8🔥7💅3✍1☃1👎1🙏1👀1🗿1🦄1
Как нашли причину антивирусной тревоги в Tauri-приложении и заменили шифрование
Добавили шифрование файлов с аккаунтами, и Microsoft стал помечать приложение как троян. Так произошло с Roblox Account Manager. Сравнение старой и новой сборок сначала завело автора в тупик: набор подозрительных системных вызовов не изменился.
Тогда автор запустил
В разборе замены на RustCrypto есть тест совместимости: новый код должен расшифровать данные, созданные старым. Файлы пользователей остались читаемыми, а exe перестал вызывать тревогу.
#безопасность
Добавили шифрование файлов с аккаунтами, и Microsoft стал помечать приложение как троян. Так произошло с Roblox Account Manager. Сравнение старой и новой сборок сначала завело автора в тупик: набор подозрительных системных вызовов не изменился.
Тогда автор запустил
git bisect: на каждом шаге собирал exe и проверял его через VirusTotal, сужая поиск до одного коммита. Тот добавлял sodiumoxide, библиотеку шифрования. Почему именно она вызвала тревогу, автор объясняет своей гипотезой о работе классификатора Microsoft.В разборе замены на RustCrypto есть тест совместимости: новый код должен расшифровать данные, созданные старым. Файлы пользователей остались читаемыми, а exe перестал вызывать тревогу.
#безопасность
👍6❤2😁2🔥1👏1🤔1
🧑💻 Какие навыки помогают вам в разработке в 2026 году?
Что вы чаще используете в работе? В каких задачах помогает ИИ, а где проще справиться самостоятельно?
Мы решили собрать портрет современного разработчика — и приглашаем вас поделиться своим опытом. Расскажите, какие навыки вам пригодились и как вы используете ИИ. Если обходите его стороной, нам тоже интересно узнать почему.
Опрос анонимный и займёт около 5 минут. Результаты опубликуем в общем большом исследовании.
👉 Пройти опрос
Что вы чаще используете в работе? В каких задачах помогает ИИ, а где проще справиться самостоятельно?
Мы решили собрать портрет современного разработчика — и приглашаем вас поделиться своим опытом. Расскажите, какие навыки вам пригодились и как вы используете ИИ. Если обходите его стороной, нам тоже интересно узнать почему.
Опрос анонимный и займёт около 5 минут. Результаты опубликуем в общем большом исследовании.
👉 Пройти опрос
🔥4👍3❤2🎉2🌭2😁1😢1🤣1😐1😈1🆒1
Измеритель INP тоже может ошибаться
В SpeedCurve нашли баг в lux.js: обёртка передавала durationThreshold во вложенном options, хотя PerformanceObserver ждёт этот параметр на верхнем уровне. Браузер не видел настройку и применял стандартный порог 104 мс.
Что это меняло? Взаимодействия короче 104 мс не попадали в обычный Event Timing observer. Например, запись о событии длительностью 80 мс могла отсутствовать. Это могло влиять на рассчитанное INP и определение событий, которые его сформировали.
В lux.js 4.5.3 вложенность исправили и добавили браузерный тест. Перед сравнением графиков проверьте версию сборщика и отметьте момент обновления: распределение могло измениться из-за измерения, а не вашего релиза.
Разбор ошибки
#веб #производительность
В SpeedCurve нашли баг в lux.js: обёртка передавала durationThreshold во вложенном options, хотя PerformanceObserver ждёт этот параметр на верхнем уровне. Браузер не видел настройку и применял стандартный порог 104 мс.
Что это меняло? Взаимодействия короче 104 мс не попадали в обычный Event Timing observer. Например, запись о событии длительностью 80 мс могла отсутствовать. Это могло влиять на рассчитанное INP и определение событий, которые его сформировали.
В lux.js 4.5.3 вложенность исправили и добавили браузерный тест. Перед сравнением графиков проверьте версию сборщика и отметьте момент обновления: распределение могло измениться из-за измерения, а не вашего релиза.
Разбор ошибки
#веб #производительность
Csswizardry
Web-Perf Wednesday 011 – SpeedCurve’s INP Observer Missed Its Threshold – CSS Wizardry
A long-standing lux.js bug left Event Timing on its 104 ms default, while browser releases improve testing and rendering performance.
🤔5😁2💯2🍌2❤🔥1👏1🐳1🤣1🍓1🍾1😈1
Как IRC-сеть из 1998 года пересобрали на Go и WebAssembly
28-летняя Yudum.NET теперь помещается в один исполняемый файл на Go: сервер чата, сайт и веб-чат работают в одном процессе с базой SQLite. Никнейм служит учётной записью на сайте, а старые IRC-клиенты по-прежнему подключаются.
Веб-чат тоже написан на Go: TinyGo компилирует его в WebAssembly для запуска в браузере. Один и тот же код проверяет ход в игре на сервере и рисует стол в чате. Цена решения: несколько мегабайт браузерного модуля и сборка, которая занимает минуты.
В разборе переписывания Yudum.NET есть и история борьбы с перезапусками: временный процесс обслуживает веб-запросы, пока запускается новая версия. Сайт не гаснет, но IRC-соединения ещё обрываются. Эту часть предстоит решить.
#веб
28-летняя Yudum.NET теперь помещается в один исполняемый файл на Go: сервер чата, сайт и веб-чат работают в одном процессе с базой SQLite. Никнейм служит учётной записью на сайте, а старые IRC-клиенты по-прежнему подключаются.
Веб-чат тоже написан на Go: TinyGo компилирует его в WebAssembly для запуска в браузере. Один и тот же код проверяет ход в игре на сервере и рисует стол в чате. Цена решения: несколько мегабайт браузерного модуля и сборка, которая занимает минуты.
В разборе переписывания Yudum.NET есть и история борьбы с перезапусками: временный процесс обслуживает веб-запросы, пока запускается новая версия. Сайт не гаснет, но IRC-соединения ещё обрываются. Эту часть предстоит решить.
#веб
👍5🎉3😁2🎄2👾2🤷♀1🔥1💋1😈1🎃1🆒1
Почему доставка сообщения не гарантирует выполнение платежа
Брокер доставил команду провести платёж, но обработчик может упасть при её выполнении или обращении к платёжному сервису. Подтверждение доставки ещё не подтверждает результат.
В схеме отслеживания завершения отправитель публикует команду и сохраняет идентификатор платежа со статусом PENDING, то есть ожидает результата. После выполнения обработчик отправляет подтверждение с тем же идентификатором. Получив его, отправитель меняет статус на COMPLETE: работа завершена.
Если остался PENDING, исход неизвестен: платёж мог сорваться, а мог пройти без обработанного подтверждения. В зависимости от сценария может потребоваться запросить результат у платёжной системы, прежде чем решать, повторять ли операцию. Такой контроль добавляет хранение состояний, компоненты и новые точки отказа.
Брокер доставил команду провести платёж, но обработчик может упасть при её выполнении или обращении к платёжному сервису. Подтверждение доставки ещё не подтверждает результат.
В схеме отслеживания завершения отправитель публикует команду и сохраняет идентификатор платежа со статусом PENDING, то есть ожидает результата. После выполнения обработчик отправляет подтверждение с тем же идентификатором. Получив его, отправитель меняет статус на COMPLETE: работа завершена.
Если остался PENDING, исход неизвестен: платёж мог сорваться, а мог пройти без обработанного подтверждения. В зависимости от сценария может потребоваться запросить результат у платёжной системы, прежде чем решать, повторять ли операцию. Такой контроль добавляет хранение состояний, компоненты и новые точки отказа.
❤5👍4🤔3👎2🗿2💯1🍌1
Листаете ленту, открываете ролик, переходите в сообщество автора — всё внутри ВКонтакте. За этими привычными действиями стоят разные системы и команды. Каждой нужна возможность развивать свою часть продукта и выпускать обновления в собственном темпе.
В прошлом году ВКонтакте начала переход на сервисную архитектуру: пользовательские сценарии постепенно переносили в отдельные сервисы, пока продуктовые команды продолжали выпускать обновления. Для подготовки новых сервисов создали внутреннюю платформу разработки. Она автоматизирует типовые операции — теперь подготовка занимает часы вместо недель.
Трансформация затронула и веб-версию. Основные разделы перевели на SPA: браузер обновляет нужные части интерфейса без полной перезагрузки страницы. В результате страницы открываются на 25% быстрее, а переходы между разделами ускорились в 3,5 раза.
Вместе с техническим директором ВКонтакте Юрием Кочаряном разобрали, как проходили эти изменения, что помогло командам ускорить разработку и какие подходы можно применить в своём проекте.
https://tproger.ru/articles/kak-perestraivat-produkt-kotorym-ezhednevno-polzuyutsya-65-milli
В прошлом году ВКонтакте начала переход на сервисную архитектуру: пользовательские сценарии постепенно переносили в отдельные сервисы, пока продуктовые команды продолжали выпускать обновления. Для подготовки новых сервисов создали внутреннюю платформу разработки. Она автоматизирует типовые операции — теперь подготовка занимает часы вместо недель.
Трансформация затронула и веб-версию. Основные разделы перевели на SPA: браузер обновляет нужные части интерфейса без полной перезагрузки страницы. В результате страницы открываются на 25% быстрее, а переходы между разделами ускорились в 3,5 раза.
Вместе с техническим директором ВКонтакте Юрием Кочаряном разобрали, как проходили эти изменения, что помогло командам ускорить разработку и какие подходы можно применить в своём проекте.
https://tproger.ru/articles/kak-perestraivat-produkt-kotorym-ezhednevno-polzuyutsya-65-milli
👍7🤣7❤5🔥5💊4👌3👏2🤔1🕊1🎅1🦄1
Forwarded from Инструменты программиста
От чатбота к агентам: опыт Митчелла Хашимото
Для работы с кодом Хашимото перешёл от отдельного чата к агенту, который читает файлы проекта и запускает программы. После этого начал повторять собственную работу: сначала решал задачу сам, затем давал её агенту без готового решения.
Так он выяснял, какие задачи можно поручать ИИ. Дальше добавлял инструкции в AGENTS.md, файл с правилами проекта, и способы проверить изменения, включая запуск тестов.
В истории освоения ИИ в разработке Хашимото связывает выбор задач с настройкой рабочего окружения. Отдельные чаты при этом остались в его повседневной работе.
#ии #инструменты
Для работы с кодом Хашимото перешёл от отдельного чата к агенту, который читает файлы проекта и запускает программы. После этого начал повторять собственную работу: сначала решал задачу сам, затем давал её агенту без готового решения.
Так он выяснял, какие задачи можно поручать ИИ. Дальше добавлял инструкции в AGENTS.md, файл с правилами проекта, и способы проверить изменения, включая запуск тестов.
В истории освоения ИИ в разработке Хашимото связывает выбор задач с настройкой рабочего окружения. Отдельные чаты при этом остались в его повседневной работе.
#ии #инструменты
👏4🎉4❤2🤔2👌2👍1
Forwarded from Инструменты программиста
Где вы чаще всего работаете с ИИ-инструментом?
Anonymous Poll
33%
В отдельном окне чата или веб-версии
21%
Прямо в редакторе кода
26%
В терминале
2%
Через корпоративные сервисы или платформы
18%
По-разному, зависит от того, что нужно сделать
👍5🔥5🤔2❤1🎉1🍌1🍾1💋1😎1
Что можно настроить в ИИ-агенте Pi?
Армин Ронахер пользуется Pi и добавляет нужные возможности через расширения. В его описании устройства агента есть три составляющие:
— ядро читает, записывает и редактирует файлы, запускает команды;
— расширения добавляют функции и могут сохранять свои данные в сессии;
— ветки беседы позволяют отдельно отладить проблему и вернуть в основную сессию краткий пересказ.
Список задач и ревью изменений Ронахер поручил создать самому Pi. В разборе агента с примерами расширений видно, что он дописал под собственный рабочий процесс.
#ии #инструменты
Армин Ронахер пользуется Pi и добавляет нужные возможности через расширения. В его описании устройства агента есть три составляющие:
— ядро читает, записывает и редактирует файлы, запускает команды;
— расширения добавляют функции и могут сохранять свои данные в сессии;
— ветки беседы позволяют отдельно отладить проблему и вернуть в основную сессию краткий пересказ.
Список задач и ревью изменений Ронахер поручил создать самому Pi. В разборе агента с примерами расширений видно, что он дописал под собственный рабочий процесс.
#ии #инструменты
🤔5👌3🐳2🔥1🎉1🏆1🙈1🤝1🎅1🎄1🤷1
Перенос MiniJinja с Rust на Go силами Opus и Codex
Около десяти часов работы агента и примерно 45 минут активного участия автора. Так Армин Ронахер оценивает основной перенос MiniJinja с Rust на Go. MiniJinja собирает текст по шаблонам.
Он начал с Opus 4.5 внутри Pi, а оставшиеся исправления тестов передал GPT-5.2 Codex. Рабочая среда оставалась той же; Go-реализацию сверяли с сохранёнными результатами тестов Rust-версии.
По ходу работы агент отказался от проверок, в которых программа должна завершаться ошибкой: текст сообщений не совпадал дословно. Ронахер вмешался и сохранил эти тесты, изменив способ сравнения сообщений.
#ии #инструменты
Около десяти часов работы агента и примерно 45 минут активного участия автора. Так Армин Ронахер оценивает основной перенос MiniJinja с Rust на Go. MiniJinja собирает текст по шаблонам.
Он начал с Opus 4.5 внутри Pi, а оставшиеся исправления тестов передал GPT-5.2 Codex. Рабочая среда оставалась той же; Go-реализацию сверяли с сохранёнными результатами тестов Rust-версии.
По ходу работы агент отказался от проверок, в которых программа должна завершаться ошибкой: текст сообщений не совпадал дословно. Ронахер вмешался и сохранил эти тесты, изменив способ сравнения сообщений.
#ии #инструменты
👍7👏5❤2🔥2🤔2❤🔥1👻1👨💻1😨1🤗1😎1
Doom на виртуальной машине Turso: память в таблице, кадры в строках запроса
Вся память Doom помещается в одну запись таблицы: двоичное значение BLOB на 64 МиБ. Указатель в C становится смещением внутри этого значения, а чтение и запись памяти игра выполняет командами базы данных.
Команда Turso написала компилятор vdbecc: LLVM переводит исходный C-код в промежуточное представление, а vdbecc превращает его в VDBE, байткод виртуальной машины базы. Готовые кадры игра отдаёт через ResultRow, ту же инструкцию, которой SELECT возвращает строки результата.
В разборе порта есть код и браузерная демонстрация, а также объяснение, как реализовали вызовы функций и указатели на них. Повторить это в обычном SQLite нельзя: нужны расширения Turso и добавленный загрузчик программы.
#веб
Вся память Doom помещается в одну запись таблицы: двоичное значение BLOB на 64 МиБ. Указатель в C становится смещением внутри этого значения, а чтение и запись памяти игра выполняет командами базы данных.
Команда Turso написала компилятор vdbecc: LLVM переводит исходный C-код в промежуточное представление, а vdbecc превращает его в VDBE, байткод виртуальной машины базы. Готовые кадры игра отдаёт через ResultRow, ту же инструкцию, которой SELECT возвращает строки результата.
В разборе порта есть код и браузерная демонстрация, а также объяснение, как реализовали вызовы функций и указатели на них. Повторить это в обычном SQLite нельзя: нужны расширения Turso и добавленный загрузчик программы.
#веб
❤10👍6👏4🤔2🔥1😁1🤣1🍓1🙈1🤝1🫡1
Звонки Discord на Cloudflare: почему сервер поближе не всегда лучше
Сервер в Рейкьявике снизил задержку местных звонков, но пинг иностранных участников вырос в 2,7 раза. У Discord весь звонок обслуживает один сервер: если он оказался в Исландии, участники из Германии тоже отправляют пакеты туда и обратно.
Перенос трафика из Роттердама в Амстердам добавил другую проблему. У пользователей французского провайдера Orange задержка в часы пик превышала секунду: соединение между сетями на пути к Cloudflare было перегружено. Перенос пришлось откатить.
В разборе миграции голосовых звонков команда Discord показывает, как эти сбои изменили план: регионы стали переносить по одному, заранее проверяя, выдержат ли соединения с крупными интернет-провайдерами дополнительный трафик.
#облака
Сервер в Рейкьявике снизил задержку местных звонков, но пинг иностранных участников вырос в 2,7 раза. У Discord весь звонок обслуживает один сервер: если он оказался в Исландии, участники из Германии тоже отправляют пакеты туда и обратно.
Перенос трафика из Роттердама в Амстердам добавил другую проблему. У пользователей французского провайдера Orange задержка в часы пик превышала секунду: соединение между сетями на пути к Cloudflare было перегружено. Перенос пришлось откатить.
В разборе миграции голосовых звонков команда Discord показывает, как эти сбои изменили план: регионы стали переносить по одному, заранее проверяя, выдержат ли соединения с крупными интернет-провайдерами дополнительный трафик.
#облака
🔥9👍3👏3😨2🎉1🙏1💋1😈1👨💻1🙈1😇1
Модель C-интерфейса в Quint помогла найти больше десяти ошибок в SQLite
SQLite должна отклонить десериализацию базы, пока идёт транзакция чтения. Но в тесте вместо ошибки SQLITE_BUSY, означающей, что база занята, произошло падение.
Паван Намби из сообщества Turso моделировал в Quint отдельные контракты C-интерфейса SQLite: что операции должны делать по документации. Quint генерировал последовательности состояний, которые переводили в небольшие программы на C и запускали на настоящей базе. Сравнение ожиданий с поведением SQLite выявило ошибки, пропущенные прежними проверками.
В разборе Намби и команды Turso показаны шаги, приведшие к падению, и подход к проверке отдельных контрактов без моделирования всей базы данных.
#инструменты
SQLite должна отклонить десериализацию базы, пока идёт транзакция чтения. Но в тесте вместо ошибки SQLITE_BUSY, означающей, что база занята, произошло падение.
Паван Намби из сообщества Turso моделировал в Quint отдельные контракты C-интерфейса SQLite: что операции должны делать по документации. Quint генерировал последовательности состояний, которые переводили в небольшие программы на C и запускали на настоящей базе. Сравнение ожиданий с поведением SQLite выявило ошибки, пропущенные прежними проверками.
В разборе Намби и команды Turso показаны шаги, приведшие к падению, и подход к проверке отдельных контрактов без моделирования всей базы данных.
#инструменты
🔥8❤3👏3🤔2👍1🎉1🙏1😴1🙈1😘1
Каскадный сбой Discord: почему сокращение кластера сорвало звонки
Инженеры Discord увеличили ресурсы каждой копии сервиса сессий и уменьшили число копий. При остановке те не успели передать данные соседним узлам: разом оборвались 17% сессий подключённых устройств.
Переподключения перегрузили два процесса, через которые создавались HTTP-соединения для управления звонками. Через них же шло обновление регистрации сервисов в etcd, хранилище сведений о доступных узлах. Очереди росли, регистрация перестала обновляться, узлы выпадали из списка доступных. После перезапуска нагрузка снова блокировала их работу.
В разборе этой цепочки отказов команда объясняет, как ограничения запросов и расширение кластера помогли восстановить звонки и зачем создание соединений распределили между независимыми управляющими процессами.
#облака
Инженеры Discord увеличили ресурсы каждой копии сервиса сессий и уменьшили число копий. При остановке те не успели передать данные соседним узлам: разом оборвались 17% сессий подключённых устройств.
Переподключения перегрузили два процесса, через которые создавались HTTP-соединения для управления звонками. Через них же шло обновление регистрации сервисов в etcd, хранилище сведений о доступных узлах. Очереди росли, регистрация перестала обновляться, узлы выпадали из списка доступных. После перезапуска нагрузка снова блокировала их работу.
В разборе этой цепочки отказов команда объясняет, как ограничения запросов и расширение кластера помогли восстановить звонки и зачем создание соединений распределили между независимыми управляющими процессами.
#облака
🌭5❤4👍3🤔3🔥2👌1💯1🍓1😈1😴1😎1
Викторина об оптимизации Rust: проверка компилятора и испытание живой аудиторией
Деление целого числа на пять компилятор может заменить умножением и битовым сдвигом. Автор викторины для EuroRust проверял такие превращения в Compiler Explorer, сервисе для просмотра машинных инструкций, и переводил результат обратно в Rust, чтобы составить вопросы.
Затем собрал веб-приложение: ведущий переключает слайды, зрители отвечают с телефонов. Тесты с участием до 50 человек прошли успешно, но на сцене один ранний голос закрыл вопрос для остальных. При возврате на слайд игра разрешала отвечать только тогда, когда голосов ещё не было.
В разборе создания викторины соседствуют неожиданные результаты оптимизации и решения для совместной игры, чьи ограничения проявились перед сотнями зрителей.
#веб
Деление целого числа на пять компилятор может заменить умножением и битовым сдвигом. Автор викторины для EuroRust проверял такие превращения в Compiler Explorer, сервисе для просмотра машинных инструкций, и переводил результат обратно в Rust, чтобы составить вопросы.
Затем собрал веб-приложение: ведущий переключает слайды, зрители отвечают с телефонов. Тесты с участием до 50 человек прошли успешно, но на сцене один ранний голос закрыл вопрос для остальных. При возврате на слайд игра разрешала отвечать только тогда, когда голосов ещё не было.
В разборе создания викторины соседствуют неожиданные результаты оптимизации и решения для совместной игры, чьи ограничения проявились перед сотнями зрителей.
#веб
🔥6👏5❤2👍2😢2💯2🤗2🎉1🤩1🙈1🦄1
Forwarded from Библиотека ИИ для айтишников
Если приходилось уходить с одного ИИ-инструмента на другой, что стало главной причиной?
Anonymous Poll
29%
Качество ответов и кода стало не устраивать
14%
Упёрся в лимиты или не хватает функций
10%
Цены кусаются
17%
Проблемы с доступом: блокировки, нужен VPN
3%
Сложности с оплатой
3%
Стало неудобно работать
23%
Не менял инструмент — сижу на привычном
👍4❤3🔥1🤔1🐳1🗿1