Войдите или зарегистрируйтесь
Вы сможете писать комментарии и посты, ставить лайки и другое
Поиск
Тёмная тема

Посты по тегу: программирование

Джуны и мидлы не нужны: неделю использую Claude Code в качестве агента (личный опыт)

2 дн. назад
Пугалка становится реальностью, а маркетинговая чушь от авторов нейросетей не такая уж и чушь.

Неделю пишу код, взяв в помощники Claude Opus 4.7 от Anthropic (через расширение для VS Code). Тариф самый дорогой, поэтому токены не экономлю. Общее ощущение - восторг. Пишу и бэк и фронт.

Клод отлично понимает, что мне нужно, когда я ему чётко говорю, что сделать. Важно кратко, но точно указать, что именно нужно ему сделать и в каком стиле написать. По поводу стиля - почти всегда хватает написать что-то вроде "пиши по аналогии с другими методами". Русский язык понимает прекрасно, нет смысла писать на английском.

Значительная экономия времени. То, на что я бы потратил 3 дня, с Claude Code я сделал за 3 часа. Тесты так вообще пишет очень быстро, и даже сам запускает для перепроверки, а это такая унылая рутина. С тестами надо обязательно указать моменты, которые мы проверяем, чтобы тесты были реально тестами, а не бессмысленными заглушками.

Я перестал бояться потери навыков. :) Стал больше концентрироваться на архитектуре. Чем меньше ему даёшь работы по объёму, тем лучше код, т.е. задачи надо декомпозировать. Конечно, Клод не знает всего огромного контекста проекта и того, что у тебя в голове. Он просто быстрый и умный исполнитель. Но иногда даже видит вещи, которые я сам бы не увидел; часто пишет лучше, чем я бы сам написал, находя опасные моменты, дописывая там дополнительные проверки на пограничные случаи.

Тут важно самому не лениться и тщательно перечитывать сгенерированный код. Т.е. бОльшую часть времени работы ты делаешь код-ревью. Здесь можно сорваться и всё сразу коммитить. Так делать нельзя!!! Надо перепроверять! Claude Code - это очень толковый усердный мидл, который не знает усталости (тариф максимальный). Он ошибается, а ты ему говоришь, где исправить. Изредка сам вручную меняешь, иногда так быстрее.

Так вот, мой вердикт - джуны и мидлы теперь не нужны. Реально, парой сеньоров можно заменить команду из 6 человек. Лично моя работа ускорилась. Понимаю, что теперь ситуация для рынка IT-вакансий крайне фиговая. Останутся только профессионалы, а джуны вообще больше будут не нужны. Мидлы нужны максимум, чтобы вырастить нового сеньора.

Делает ли Клод ошибки? Конечно, делает, кто ж их не делает. Кожаные мешки тоже ошибаются, но ревью кода никто не отменял.

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

Рынок будет сильно меняться. Не все осознали мощь платных нейросетевых агентов, я тоже раньше скептически относился. Кто не в теме, уйдёт с рынка рано или поздно. В общем, IT (по крайней мере программирование) теперь будет только для синьоров-помидоров.
Показать полностью...
+2
6

Может ли Claude Code удалить посторонние файлы или выполнить rm -rf

5 дн. назад
Щупаю Claude Opus 4.7 по тарифу Max. Штука очень мощная, ускоряет работу, если правильно пользоваться, особенно приятно Клоду поручить рутину.

Агент Claude работает из терминала. Даже если это extension в IDE, то он постоянно отправляет запросы в bash, всё время спрашивая разрешение.
В заголовке поста был вопрос: может ли Claude Code удалить посторонние файлы или выполнить rm -rf? Ответ - да, может. Вообще не проблема для него. Вся защита от опасных команд смехотворна. Вот это вот ни от чего не защитит:
{
  "permissions": {
    "allow": [
      "Bash(npm run *)",
      "Bash(git commit *)",
      "Bash(git * main)",
      "Bash(* --version)",
      "Bash(* --help *)"
    ],
    "deny": [
      "Bash(git push *)"
    ]
  }
}

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

В общем, тут или доверять Клоду полностью или делать вид, что ты "защитился" с помощью строчек в permissions.
Показать полностью...
+2
6

Ещё один миф из JavaScript: нестрогое равенство

недавно
Очередной миф на сайте "Современный учебник JavaScript":
https://learn.javascript.ru/comparison
Цитата:
При сравнении значений разных типов JavaScript приводит каждое из них к числу.

Откуда дровишки? Правда о JavaScript написана только в одном месте - в документации языка. Поэтому смотрим доку:
https://262.ecma-international.org/16.0/index.html
EqualityExpression : EqualityExpression == RelationalExpression
 1. Let lRef be ? Evaluation of EqualityExpression.
 2. Let lVal be ? GetValue(lRef).
 3. Let rRef be ? Evaluation of RelationalExpression.
 4. Let rVal be ? GetValue(rRef).
 5. Return ? IsLooselyEqual(rVal, lVal).

Ага, значит, ищем IsLooselyEqual:

The abstract operation IsLooselyEqual takes arguments x (an ECMAScript language value) and y (an ECMAScript language value) and returns either a normal completion containing a Boolean or a throw completion. It provides the semantics for the == operator. It performs the following steps when called:

1. If SameType(x, y) is true, then
   a. Return IsStrictlyEqual(x, y).
2. If x is null and y is undefined, return true.
3. If x is undefined and y is null, return true.
4. NOTE: This step is replaced in section B.3.6.2.
5. If x is a Number and y is a String, return ! IsLooselyEqual(x, ! ToNumber(y)).
6. If x is a String and y is a Number, return ! IsLooselyEqual(! ToNumber(x), y).
7. If x is a BigInt and y is a String, then
   a. Let n be StringToBigInt(y).
   b. If n is undefined, return false.
   c. Return ! IsLooselyEqual(x, n).
8. If x is a String and y is a BigInt, return ! IsLooselyEqual(y, x).
9. If x is a Boolean, return ! IsLooselyEqual(! ToNumber(x), y).
10. If y is a Boolean, return ! IsLooselyEqual(x, ! ToNumber(y)).
11. If x is either a String, a Number, a BigInt, or a Symbol and y is an Object, return ! IsLooselyEqual(x, ? ToPrimitive(y)).
12. If x is an Object and y is either a String, a Number, a BigInt, or a Symbol, return ! IsLooselyEqual(? ToPrimitive(x), y).
13. If x is a BigInt and y is a Number, or if x is a Number and y is a BigInt, then
   a. If x is not finite or y is not finite, return false.
   b. If ℝ(x) = ℝ(y), return true; otherwise return false.
14. Return false.

Вот и весь ответ. В JS есть чёткий алгоритм нестрогого сравнения, который назван IsLooselyEqual, а всё остальное - отсебятина.

null == undefined; // вернёт true

В Javascript при нестрогом сравнении null равен undefined не потому, что они оба привелись к 0, а потому что в пункте 2 чётко сказано, если первый оператор null и второй оператор undefined, то нужно вернуть true.
Показать полностью...
+1
21

Неочевидно опасное undefined behaviour в языке Си

недавно
Чтобы мозг не раскисал, учу Си. Язык простой и одновременно довольно сложный. А ещё в нём есть куча undefined behaviour - неопределённое поведение компилятора для пограничных случаев, которых на самом деле масса.

Вот пример простейшей функции:
int get_zero(void) {
  int num;
  return num & 0;
}
Переменная num не инициализирована, значит там могут сидеть любые "мусорные" биты.
& - это оператор побитового И, который сравнивает последовательно биты двух чисел и ставит в соответствующий бит возвращаемого числа 1, только если оба бита - это 1, иначе поставит туда 0.

Вроде всё просто и кажется, что функция всегда должна вернуть 0, ведь "побитовый и" с нулём всегда вернёт ноль.
123 // 00000000 00000000 00000000 01111011
0   // 00000000 00000000 00000000 00000000
Сравнение битов двух чисел выше всегда вернёт 0, т.к. второе число тоже 0. Неважно, какие там будут биты у первого числа, всегда в итоге 0.

Но проблема кода здесь связана со спецификацией Си. Код небезопасен, потому что теоретически компилятор может делать всё что угодно! Программа может "упасть", компилятор может удалить код и прочее. Компилятор имеет право делать что угодно в этом случае. Undefined behaviour - это поведение программы, для которого стандарт языка не накладывает никаких требований, стандарт не говорит, что должно или не должно произойти!

Т.е. писать код таким образом в Си - опасно. Даже переполнение обычного signed int (он же просто int) в Си - это уже undefined behaviour!
int x = 2147483647; // Максимальное значение
x = x + 1; // Опачки - undefined behaviour - рисково!
Вот такое приходится учить. А кто-то жалуется на сложности Golang.
+2
147

Как по-английски костыль в программировании

1 г. назад
В русском языке не очень хороший код, который решает задачу некачественно, но всё же решает, принято называть костылём. Часто костыли делают как бы временным решением, но в большинстве случаев они остаются навсегда. В любой крупной кодовой базе всегда куча костылей, можете мне поверить.

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

Так вот на английском языке есть аналогичное слово - kludge (кладж). Смело используйте его в своих слаках и гугл-митингах, когда общаетесь на английском. Никаких больше workaround, теперь только честный kludge!
+3
230

Почему рейтинг языков программирования Tiobe – это полная чушь

1 г. назад
Давайте посмотрим на этот чудесный рейтинг:
https://www.tiobe.com/tiobe-index/
Вот скрин на апрель 2025 года:
Рейтинг сразу изумляет. На первом месте Пайтон, ну ок, верю. Далее Си и Си++. Уже что-то не то.
Потом Джава и Сишарп, ну ок, но как-то сомнительно. ЖС только на 6-м месте (тайпскрипт, кстати, только на 36-м, ха-ха). Седьмое место у Го - ок.

Но далее - Visual Basic на 8-м месте! Чтоооо?
9-е место - Delphi/Object Pascal. Смешно.
10-е место - SQL.
11-е место - Фортран!!!

Таблица далее:
Показать полностью...
+4
21

Хитрость spread-синтаксиса в JS

1 г. назад
А вы знали, что теоретически spread-синтаксис в JS можно применять почти к любому типу.
Вот пример "обычного" использования:
// Массив спредится
console.log([...[1, 2, 3]]); // [1, 2, 3]
// Строка спредится
console.log([...'Famabara']); // ['F', 'a', 'm', 'a', 'b', 'a', 'r', 'a'] 
Но если попытаться заспредить number, то будет ошибка:
console.log([...555]); // Uncaught TypeError: 555 is not iterable
Не является iterable.
Так давайте сделаем iterable!
Number.prototype[Symbol.iterator] = function * () {
  yield 'Фамабара';
  yield 'лучше';
  yield 'всех';
}

console.log([...555]); // ['Фамабара', 'лучше', 'всех']
Мы успешно заспредили number! Толку от этого никакого, на сам факт забавен.
Можно джунов за собесах мучить :)
+4
190

Как в Git безопасно поправить коммит в удалённой (remote) ветке

1 г. назад
Представим вы несколько дней работали, писали код и наконец-то сделали коммит:
git commit -m "#715 changed color of button from red to green"
git push
И тут вы понимаете, что забыли убрать какой-нибудь console.log() или fmt.Println().
Можно добавить ещё один коммит поверх, что-то вроде:
git commit -m "#715 clean unnecessary code"
Но в некоторых командах это могут посчитать мусорным коммитом. Что делать?

Вместо второго коммита "правим" первый коммит, дописывая amend:
git commit --amend -m "#715 changed color of button from red to green"
И теперь можно пушить снова. Но сервер не даст запушить, ведь у нас локально и на ремоуте уже разные истории одной ветки. Можно запушфорсить:
git push force
Но это может быть очень плохо, если над веткой работает несколько человек. Кто-то мог уже поверх нашего коммита свои коммиты накатать. Но есть хороший параметр force-with-lease, который перезапишет ветку только тогда, когда никто поверх не дописал свои коммиты:
git push --force-with-lease
В этом случае никто не пострадает.
+3
81

TypeScript скоро станет в 10 раз быстрее

1 г. назад
Андерс Хейлсберг (автор Тайпскрипта) опубликовал пост в блоге:
https://devblogs.microsoft.com/typescript/typescript-native-port/

В общем, TypeScript скоро станет в 10 раз быстрее, вернее, он уже стал таким, просто пока эту версию не сделали общедоступной.

Вот такой прирост скорости компиляции крупных проектов теперь показывает tsc:
Как видно, прирост на порядок - т.е. примерно в 10 раз. Достигается это за счет использования Golang для работы tsc, а не JS. Сам по себе JS быстрый, но он упирается в один поток. А кто писал на Go, то знает, насколько легко там запустить горутину. Теперь tsc будет использовать несколько имеющих потоков, что и даст прирост скорости компиляции.

Обратите внимание, это полноценная работа tsc, а не как у esbuild, где только транспиляция без проверки типов.

На момент написания этого поста текущая версия TypeScript - 5.8.2. Следующая мажорная версия - 6-я - будет всё ещё на JS-е, а вот 7-я версия будет уже на "нативном" коде, т.е. компилироваться из Go. Автор их так и называет:
For the sake of clarity, we’ll refer to them simply as TypeScript 6 (JS) and TypeScript 7 (native)

В общем, новость хорошая. Быстрее будет не только компиляция в JS, то и VSCode будет работать быстрее, потому что там все подсказки в редакторе, даже если это JS-код, реализованы с помощью тайпскрипта.
Показать полностью...
+3
143

Идёт разработка Vue Vapor

1 г. назад
Между прочим в мире VueJS большая новость - активно разрабатывается Vue Vapor. По основной идее этого проекта во VueJS исчезнет виртуальный DOM, который являлся важной частью всего VueJS. Теперь работа будет вестись напрямую с DOM и меняться будут только нужные HTML элементы, если срабатывает реактивность.

А еще интересная деталь: пишут, что будет работать только с Composition API, а Options API уйдёт на свалку истории. А ведь говорили, что этого не будет и старый Options API будет поддерживаться до последнего. Плюс обязателен script setup.
+3
238

Есть ли в IT-отрасли кумовство?

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

Так вот в IT привычное "кумовство", имхо, не работает. Это не госсектор, где можно пристроить племянника, брата-свата, друга сына маминой подруги. IT - это одно из тех направлений, где важны опыт и знания. Никому не нужен дятел, который не имеет работать. По факту работники в айтишечке - это пролетариат. И чем выше уровень работника, тем работодателю лучше, ведь работник выдаёт более качественный результат за меньшие сроки.

Мало того, плохой работник в разработке может вообще не выдать результат за неимением навыков и опыта. И зачем такое надо работодателю?

Подавляющее большинство работодателей в разработке ПО - это бизнес. А бизнес считает деньги. Даже бизнес по типу какого-нибудь банка со значительной долей государства среди собственников нынче всё равно ведёт себя как полноценное коммерческое предприятие.

Это в госуправлении и всяких чиновничьих клоаках можно очередным замом устроить своего одногруппника из института или внука брата бабушки. Или придумать никому не нужный отдел и там своих людей посадить. В IT такое не прокатит.

Представьте, что вы держите фирму, которая проектирует частные дома на заказ. Возьмёте ли вы на работу архитектора, который не знает как рассчитывать количество и толщину арматуры? То же самое и в разработке ПО.
+4
310

Нейросети ещё нескоро заменят программистов

1 г. назад
Работаю разрабом в одной небольшой конторе, которая поддерживает несколько онлайн-магазинов крупного предприятия. Знаете, что самое сложное в работе? Нет, не разобраться в чужом коде. Нет, не провести крупный рефакторинг всей кодовой базы.

Самое сложное - понять, что от тебя хотят. Самое сложное и важное - предвосхитить будущие проблемы, связанные с переделкой, и сообщить об это заказчику заранее, разъяснить так, чтобы люди поняли. А фантазий у заказчика может быть много :) Если ТЗ сформулировано как ХЗ, то фиг какая нейросеть заменит разраба ещё много лет.

Чтобы четко сформулировать запрос в какой-нибудт ChatGPT, сначала нужно абсолютно все вводные данные. А когда всё у тебя есть, то и ChatGPT нафик не нужен, можно без него обойтись.

Ну, а кнопки красить и макака сможет, это да.
+3
177
1