«Рун не должен резать
Тот, кто в них не смыслит.
В непонятных знаках
Всякий может сбиться»
«Сага об Эгиле», Снорри Стурлусон, XIII век

В саге, кстати, описана чисто софтверная история: джун составил руническую программу для лечения девушки, но не преуспел из-за большого количества багов. Потом пришёл опытный senior-скальд, пропатчил код, а джуна выгнал с процитированным напутствием.
:)
Тот, кто в них не смыслит.
В непонятных знаках
Всякий может сбиться»
«Сага об Эгиле», Снорри Стурлусон, XIII век

В саге, кстати, описана чисто софтверная история: джун составил руническую программу для лечения девушки, но не преуспел из-за большого количества багов. Потом пришёл опытный senior-скальд, пропатчил код, а джуна выгнал с процитированным напутствием.
:)
Заметил, что всё чаще использую большие текстовые нейросетки для того, что назвал бы вайб-проектированием.
В отличие от вайб-кодинга, где программист ставит задачу и проверяет результат, вайб-проектирование - это своеобразный брейншторм. Пусть LLM и не порождают собственных идей, но зато отлично критикуют твои и предлагают варианты из известного им (но не всегда мне).
И это бывает очень полезно, особенно, когда "мозги разбегаются" из-за недоопределённости или сложности задачи. Анализ "what-if" с нейросетями тоже часто работает. Ну и просто метод резинового утёнка, только утёнок умеет отвечать :)))
А код я и сам напишу. В текущем проекте дважды использовал gemini и qwen для рефакторинга кода (чужого, кстати), в обоих случаях пришлось обвешать переписанное тестами "было-стало", на разработку которых ушло времени сравнимо с ручным рефакторингом.
P.S. Справедливости ради, аппаратный расчёт CRC32 на ядре A53 через интринсики gemini написала корректно, я не знал нужных вызовов.
P.P.S. Хотелось бы спихнуть на нейросети как раз разработку тестов и документирование кода, но это явная задача со звёздочкой :)
В отличие от вайб-кодинга, где программист ставит задачу и проверяет результат, вайб-проектирование - это своеобразный брейншторм. Пусть LLM и не порождают собственных идей, но зато отлично критикуют твои и предлагают варианты из известного им (но не всегда мне).
И это бывает очень полезно, особенно, когда "мозги разбегаются" из-за недоопределённости или сложности задачи. Анализ "what-if" с нейросетями тоже часто работает. Ну и просто метод резинового утёнка, только утёнок умеет отвечать :)))
А код я и сам напишу. В текущем проекте дважды использовал gemini и qwen для рефакторинга кода (чужого, кстати), в обоих случаях пришлось обвешать переписанное тестами "было-стало", на разработку которых ушло времени сравнимо с ручным рефакторингом.
P.S. Справедливости ради, аппаратный расчёт CRC32 на ядре A53 через интринсики gemini написала корректно, я не знал нужных вызовов.
P.P.S. Хотелось бы спихнуть на нейросети как раз разработку тестов и документирование кода, но это явная задача со звёздочкой :)
За прошедшую неделю открыл для себя некоторые особенности работы конструкторов сложных классов в C++ 20, научился использовать интринсики для SIMD-вычислений ARM v8 NEON и аппаратного CRC32 на Cortex A53, вспомнил алогритмы работы планировщиков расписаний.

Аппаратная crc32 работает раз в 30 быстрее универсальной программной реализации через полином. Команды NEON очень быстро шарашат поиск по линейным массивам. Планировщик позволяет наконец-то сделать нормальную логику работы с приоритетами отправки пакетов без реанимации унаследованной "лапши". Проект стал немного ближе к железу и научился использовать его возможности оптимальнее.

Аппаратная crc32 работает раз в 30 быстрее универсальной программной реализации через полином. Команды NEON очень быстро шарашат поиск по линейным массивам. Планировщик позволяет наконец-то сделать нормальную логику работы с приоритетами отправки пакетов без реанимации унаследованной "лапши". Проект стал немного ближе к железу и научился использовать его возможности оптимальнее.
То чувство, когда...
Jan. 26th, 2026 07:56 pm...месяц с хвостом меняешь унаследованный спагетти-код так, чтобы встроить в него новые фичи и не сломать старые, и вдруг понимаешь, что всё это аккуратное перемещение шестерёнок было зря, потому что одна из фич требует изрядной переработки архитектуры. И понять это месяц назад было невозможно.
Печалько. Но прорвёмся :)

(*уходит в глубины*)
P.S. Переслушиваю песни Канцлера про средневековье, очень под настроение. Там, кстати, масса исторических личностей, от Эццелино III и Аццо VIII д'Эсте до Сиджизмондо Малатесты (Волк Римини) и Раймона VII.
Печалько. Но прорвёмся :)

(*уходит в глубины*)
P.S. Переслушиваю песни Канцлера про средневековье, очень под настроение. Там, кстати, масса исторических личностей, от Эццелино III и Аццо VIII д'Эсте до Сиджизмондо Малатесты (Волк Римини) и Раймона VII.
Развлечение выходного дня
Dec. 29th, 2025 03:01 amПо случаю отмены занятия в мотошколе купил себе Ардуинку (ESP32-S3 WROOM N16R8), красивый круглый дисплей 240x240 на GC9A01 и научился это программировать. Основное время в Arduino IDE ушло на подбор параметров настройки и прошивки платы. Методом перебора и общения с нейросетками нашёл верный режим. А потом всё таки заработало :)

( ...тынц... )

( ...тынц... )
(no subject)
Nov. 3rd, 2025 10:34 pmПриехала тут реклама курсов с JavaRush:
Страх №2: "А что, если я выберу не тот язык?"
Ты боишься потратить месяцы на JavaScript, чтобы потом понять, что тебе был нужен Python. Или пойти в Java, хотя вся душа лежит к созданию веб-приложений...
Что-что... Выучишь два. Или три. :)
Поколение IT-снежинок, блин.
Страх №2: "А что, если я выберу не тот язык?"
Ты боишься потратить месяцы на JavaScript, чтобы потом понять, что тебе был нужен Python. Или пойти в Java, хотя вся душа лежит к созданию веб-приложений...
Что-что... Выучишь два. Или три. :)
Поколение IT-снежинок, блин.

Пусть код кодится, системы работают без критичных ошибок, а в голову приходят гениальные идеи!
( Ну и... )
New spices of AI
Jun. 6th, 2025 11:18 pmПопробовал GigaCode c gitverse.ru в виде плагина к VSCode.
Реально, ни нормального анализа не очень развесистого (порядка 1000 строк) кода на третьем питоне с asyncio, ни, тем более, конкретных рекомендаций по его улучшению.
Документирование сломалось на примерно 200-й строке и перестало комментировать функции. Ну и на то, что оно там накомментировало, без слёз не взглянешь.
Код ревью зациклился и выдал мне порядка 20 порций из 13 одинаковых рекомендаций общего порядка, совершенно неоспоримых и не менее совершенно бесполезных ("Асинхронность: Ваш код использует асинхронность для отправки сообщений и мониторинга. Убедитесь, что асинхронность используется правильно и эффективно").
В текущем виде - клинически бестолковая штука, до Bito с Copilot-ом и DeepSeek-ом (к которым у меня туча вопросов) этому поделию как пешком до Марса.
Душераздирающее зрелище
Реально, ни нормального анализа не очень развесистого (порядка 1000 строк) кода на третьем питоне с asyncio, ни, тем более, конкретных рекомендаций по его улучшению.
Документирование сломалось на примерно 200-й строке и перестало комментировать функции. Ну и на то, что оно там накомментировало, без слёз не взглянешь.
Код ревью зациклился и выдал мне порядка 20 порций из 13 одинаковых рекомендаций общего порядка, совершенно неоспоримых и не менее совершенно бесполезных ("Асинхронность: Ваш код использует асинхронность для отправки сообщений и мониторинга. Убедитесь, что асинхронность используется правильно и эффективно").
В текущем виде - клинически бестолковая штука, до Bito с Copilot-ом и DeepSeek-ом (к которым у меня туча вопросов) этому поделию как пешком до Марса.
При переходе с C++ на чистый C приходится смотреть в оба.
В частности, если ты сделал typedef enum, создал функцию с параметром такого типа, а потом при её вызове подставил переменную типа int, тоотряд не заметит потери бойца gcc -Wall проглотит это молчком, потому что первое - фактически int, а второе - int явный, чего тут разбираться-то? :)))
Если что, задача была отсекать на уровне компилятора использование в параметрах функций значений от другого enum-а.
В частности, если ты сделал typedef enum, создал функцию с параметром такого типа, а потом при её вызове подставил переменную типа int, то
Если что, задача была отсекать на уровне компилятора использование в параметрах функций значений от другого enum-а.
Не похвальбы ради, а токмо учёта для
Feb. 17th, 2024 01:43 pmПосчитал недавно, какими языками программирования я пользуюсь в текущих проектах (как своих, так и унаследованных) в прошлом и этом году, получилось так:
С - прошивки микроконтролллеров
С++ - middleware, серверный софт и утилиты
C# - программы с графическим интерфейсом под Win
Python - прототипирование, утилиты, часть серверного софта
Java - приложения под Android и middleware
Kotlin - приложения под Android
PHP - серверная часть web-приложений
Javascript - браузерная часть web-приложений и часть серверного функционала (nodeJS)
Это не считая bash-скриптинга, языков описания хранимых процедур PL/pgSQL и mySQL, awk/sed и языков разметки HTML/XML.
Так что фраза «активно использую десяток языков» не лишена смысла.
А ещё я сталкивался в той или иной мере на практике с процедурными языками Algol-60, Cobol, Fortran, Basic, Рапира ;), Pascal, Delphi, Ada, Ruby, Rust, Go, Modula-2, R, Oracle PL/SQL, списочным/функциональным LISP, стековым FORTH, предикативным Prolog, разными ассемблерами (IBM 360/370, PDP-11, x86, ARM) и макроязыками, графическими нотациями (BPMN, Дракон, TIBCO), метаязыками (YACC, Bison). Итого плюс-минус 30. Наверняка что-то ещё было. А, точно, ещё был Erlang.
Upd: Ещё универсальный perl и датабазные Dbase/FoxPro, Clarion и Clipper.
Могу считать себя специалистом по формальным языкам :)))
Из человеческих за это время - более-менее приличный английский, немного японского и итальянского (этот почти забыт, впрочем).
Заметил, что после десятка языков программирования освоить новый на уровне логики/синтаксиса - вообще не проблема, больше времени тратишь на изучение библиотек. На восстановление навыков разработки на С++ после более чем десятилетнего перерыва потребовался месяц вместе с освоением boost-а, хотя сам язык со времён С++11 изменился довольно существенно.
С - прошивки микроконтролллеров
С++ - middleware, серверный софт и утилиты
C# - программы с графическим интерфейсом под Win
Python - прототипирование, утилиты, часть серверного софта
Java - приложения под Android и middleware
Kotlin - приложения под Android
PHP - серверная часть web-приложений
Javascript - браузерная часть web-приложений и часть серверного функционала (nodeJS)
Это не считая bash-скриптинга, языков описания хранимых процедур PL/pgSQL и mySQL, awk/sed и языков разметки HTML/XML.
Так что фраза «активно использую десяток языков» не лишена смысла.
А ещё я сталкивался в той или иной мере на практике с процедурными языками Algol-60, Cobol, Fortran, Basic, Рапира ;), Pascal, Delphi, Ada, Ruby, Rust, Go, Modula-2, R, Oracle PL/SQL, списочным/функциональным LISP, стековым FORTH, предикативным Prolog, разными ассемблерами (IBM 360/370, PDP-11, x86, ARM) и макроязыками, графическими нотациями (BPMN, Дракон, TIBCO), метаязыками (YACC, Bison). Итого плюс-минус 30. Наверняка что-то ещё было. А, точно, ещё был Erlang.
Upd: Ещё универсальный perl и датабазные Dbase/FoxPro, Clarion и Clipper.
Могу считать себя специалистом по формальным языкам :)))
Из человеческих за это время - более-менее приличный английский, немного японского и итальянского (этот почти забыт, впрочем).
Заметил, что после десятка языков программирования освоить новый на уровне логики/синтаксиса - вообще не проблема, больше времени тратишь на изучение библиотек. На восстановление навыков разработки на С++ после более чем десятилетнего перерыва потребовался месяц вместе с освоением boost-а, хотя сам язык со времён С++11 изменился довольно существенно.
Бывает, что в суете бегущих дней никто не реализовал простую, вроде бы, штуку, и нет ответа на твой вопрос ни в StackOverflow, ни в гугле... :)
Понадобилось намедни нагенерить в постгресе некоторое количество неповторяющихся случайных mac-адресов с первым октетом из нулей.
Настоящий веб-программист :))) написал бы аж целый скрипт с подключением к базе и подстановкой сгенерированных значений в SQL-запросы.
А я не нашёл ничего лучшего, чем соорудить простенькую функцию на Pl/PgSQL. Бонус - она исполняется на стороне сервера и может быть задействована в любом запросе или хранимой функции/процедуре без запуска дополнительных сущностей.
Выглядит так:
( ...click to open code... )
Возможно, кому-то пригодится.
P.S. Постояно замечаю, что люди используют СУБД преимущественно как место хранения таблиц, вынося всю логику в приложения. Причём, началось это не вчера (ругался на такой подход ещё в нулевые), но в последние годы тенденция приобрела угрожающие масштабы, вплоть до попыток теоретического обоснования "почему центральная БД с логикой - это плохо" со стороны микросервисников.
Джеффри Ульмана на них нет :)))
Понадобилось намедни нагенерить в постгресе некоторое количество неповторяющихся случайных mac-адресов с первым октетом из нулей.
Настоящий веб-программист :))) написал бы аж целый скрипт с подключением к базе и подстановкой сгенерированных значений в SQL-запросы.
А я не нашёл ничего лучшего, чем соорудить простенькую функцию на Pl/PgSQL. Бонус - она исполняется на стороне сервера и может быть задействована в любом запросе или хранимой функции/процедуре без запуска дополнительных сущностей.
Выглядит так:
( ...click to open code... )
Возможно, кому-то пригодится.
P.S. Постояно замечаю, что люди используют СУБД преимущественно как место хранения таблиц, вынося всю логику в приложения. Причём, началось это не вчера (ругался на такой подход ещё в нулевые), но в последние годы тенденция приобрела угрожающие масштабы, вплоть до попыток теоретического обоснования "почему центральная БД с логикой - это плохо" со стороны микросервисников.
Джеффри Ульмана на них нет :)))
Буквально вчера нейросетевой помощник Bito не осилил написать код преобразования текстовых строк вида
При том, что задачка простая и решается даже без рекурсии. Мне было лень возиться (в парсере, всё-таки, не три строки), попробовал попользоваться АI-подсказкой. Не помогло.
Пришлось заморочиться и написать код самому.
name[name_level1][name_level2][.....][name_levelX]=valueв JSON-форму
{"name":{"name_level1":{"name_level2":{.....:{"name_levelX":value}...}}}При том, что задачка простая и решается даже без рекурсии. Мне было лень возиться (в парсере, всё-таки, не три строки), попробовал попользоваться АI-подсказкой. Не помогло.
Пришлось заморочиться и написать код самому.
Нейроложество :)
Apr. 4th, 2023 11:03 pmПродолжаю развлекаться с "программирующими" нейросетками.
Задал сетке BITO вопрос "write hello world in ..." для всех языков программирования, которые вспомнил сходу.
В основном, получилось правдоподобно: сетка знает С, С++, C#, Ada, Algol-60, Pascal, Oberon, Modula2, PHP, Basic, Fortran, Cobol, Java, Kotlin, Lisp (common и autocad-овский), Rust, Erlang, Go, JS и минимум три ассемблера (IBM-360, PDP-11 и x86).
Видит разницу между python-ом 2 и 3, умеет всякую экзотику вроде Befunge, Brainfuck, Prolog и APL.
Комментирует код и позволяет себе высказываться в стиле «Note: Brainfuck is not recommended for practical use, as it is an esoteric programming language with a limited set of instructions and can be difficult to read and understand»
Знает, как вывести "Hello world" в оракловом PL/SQL, мелкомягком TSQL и консоли mySQL (select 'Hello, world!'; да ;).
Понимает, что CODASYL и REDIS - вообще не языки, а JSON и YAML - не языки программирования.
А вот в ответ на провокационный вопрос "write hello world in gcode" выдала:
... нарисовав вращающейся фрезой в воздухе треугольник :)
В качестве вишенки на торте "write hello world in chinese":
人类:请输出你好世界 (pinyin: qǐng shūchū nǐhǎo shìjiè) - "Человек: пожалуйста, выведите привет, мир", если верить гуглопереводчику.
P.S. Валидность ассемблерного кода не проверял. В остальных случаях иногда порождает правильное обрамление модулей, иногда теряет, но, в целом, выглядит рабоче. Программера, конечно, такое не заменит, но ассистента по синтаксису и библиотекам - вполне.
Задал сетке BITO вопрос "write hello world in ..." для всех языков программирования, которые вспомнил сходу.
В основном, получилось правдоподобно: сетка знает С, С++, C#, Ada, Algol-60, Pascal, Oberon, Modula2, PHP, Basic, Fortran, Cobol, Java, Kotlin, Lisp (common и autocad-овский), Rust, Erlang, Go, JS и минимум три ассемблера (IBM-360, PDP-11 и x86).
Видит разницу между python-ом 2 и 3, умеет всякую экзотику вроде Befunge, Brainfuck, Prolog и APL.
Комментирует код и позволяет себе высказываться в стиле «Note: Brainfuck is not recommended for practical use, as it is an esoteric programming language with a limited set of instructions and can be difficult to read and understand»
Знает, как вывести "Hello world" в оракловом PL/SQL, мелкомягком TSQL и консоли mySQL (select 'Hello, world!'; да ;).
Понимает, что CODASYL и REDIS - вообще не языки, а JSON и YAML - не языки программирования.
А вот в ответ на провокационный вопрос "write hello world in gcode" выдала:
G0 X0 Y0 Z0 ; move to home position
G4 P2000 ; pause for 2 seconds
G0 X0 Y0 Z10 ; move tool 10 units above workpiece
M3 S500 ; start spindle at 500 RPM
G1 X10 Y10 F100 ; move tool to position (10,10) at 100 units per minute
G1 X10 Y0 F100 ; move tool to position (10,0) at 100 units per minute
G1 X0 Y0 F100 ; move tool to position (0,0) at 100 units per minute
M5 ; stop spindle
G0 X0 Y0 Z10 ; move tool 10 units above workpiece
M30 ; end of program
... нарисовав вращающейся фрезой в воздухе треугольник :)
В качестве вишенки на торте "write hello world in chinese":
人类:请输出你好世界 (pinyin: qǐng shūchū nǐhǎo shìjiè) - "Человек: пожалуйста, выведите привет, мир", если верить гуглопереводчику.
P.S. Валидность ассемблерного кода не проверял. В остальных случаях иногда порождает правильное обрамление модулей, иногда теряет, но, в целом, выглядит рабоче. Программера, конечно, такое не заменит, но ассистента по синтаксису и библиотекам - вполне.
(no subject)
Mar. 13th, 2023 06:55 pmПрограммирование под андроид - чрезвычайно крышесносное занятие, особенно, когда занимаешься этим от случая к случаю.
- Мы тут сделали простой способ расшарить данные между приложениями - SharedPreferences
- Только он небезопасный, поэтому мы запретили другим приложениям читать твои данные
- Но мы сделали контент провайдер, он секьюрный, просто вместо двух строк в одном файле пишешь 50 в нескольких, и счастье. Можно даже указать authority, не совпадающее с именем пакета
- Только это несекьюрно, поэтому с 10-й версии андроида authority должно совпадать с именем пакета
- И с 11-й версии андроида вы провайдер даже с правильным именем пакета не увидите, если не напишете в манифесте <queries>
:)
- Мы тут сделали простой способ расшарить данные между приложениями - SharedPreferences
- Только он небезопасный, поэтому мы запретили другим приложениям читать твои данные
- Но мы сделали контент провайдер, он секьюрный, просто вместо двух строк в одном файле пишешь 50 в нескольких, и счастье. Можно даже указать authority, не совпадающее с именем пакета
- Только это несекьюрно, поэтому с 10-й версии андроида authority должно совпадать с именем пакета
- И с 11-й версии андроида вы провайдер даже с правильным именем пакета не увидите, если не напишете в манифесте <queries>
:)




