Как стать автором
Обновить
1134.5

Программирование *

Искусство создания компьютерных программ

Сначала показывать
Порог рейтинга

Читаемость Си-кода: грустный ликбез, чтобы жить стало веселее

Многие коллеги по цеху подтвердят, что читаемость кода на языке Си иногда оставляет желать лучшего. Как подтвердят и те, кто им плохо владеет, но так или иначе сталкивается в связи с рабочими задачами.

И всему виной (ожидаемо) выражения препроцессора и, как следствие, макросы. Да, вы правильно подумали. Именно те части кода, в которых вызываются такие легенды как:

Последние два очень легко спутать, если читать код невнимательно. Вместо них иногда рекомендуют использовать

#if defined // вместо #ifdef
#if !defined // вместо #ifndef

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

Чего далеко ходить - все open source проекты пестрят именно сокращенными вариантами этих выражений и с этим уже ничего не поделаешь.

А вот первое выражение из первой тройки игроков иногда вообще открывает врата ада, когда используется многострочный макрос с бэкслэш-символами (\) на концах строк.

Конечно же выражения препроцессора - это очень гибкий и полезный инструмент, позволяющий делать всё:

  • условную компиляцию;

  • выравнивание структур;

  • предотвращать повторные включения файла;

  • работать со строками;

  • грамотно оборачивать повторяющийся код и т.д. и т.п.

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

struct {
  const char *name;
  const char *value;
#define _SPECIAL(x) { .name = #x, .value = b->x, }
} specials[] = {
  { .name = "object", .value = b->object_string, },
  _SPECIAL(host),
  _SPECIAL(endpoint),
#undef _SPECIAL
};

*ну все, можно начинать грустить*

Чтобы разобраться, давайте очистим код от макросов, но сохраним суть:

struct {
  const char *name;
  const char *value;
} specials[] = {
  { .name = "object", .value = b->object_string, },
  { .name = "host", .value = host, },
  { .name = "endpoint", .value = endpoint, },
};

Что понятно из очищенного варианта:

  • инициализируется массив specials[];

  • типом данных этого массива является структура с полями *name и *value;

  • поля элементов массива задаются вручную.

Но как можно этот процесс немного автоматизировать и не прописывать вручную одинаковые строки?

Правильно, с помощью макроса:

#define _SPECIAL(x) { .name = #x, .value = b->x, }

который определяется после объявления полей структуры.

Как обрабатывается аргумент x:

  • имя аргумента преобразуется в строку с помощью макроса "#x" и присваивается полю *name;

  • полю *value присваивается значение поля структуры b с названием аргумента x (тут нужно убедиться, что поле с именем x действительно существует в структуре b).

То есть чтобы при заполнении массива не писать каждый раз одинаковые строчки:

{ .name = "host", .value = host, },
{ .name = "endpoint", .value = endpoint, }

можно вызвать выражение _SPECIALS:

_SPECIAL(host),
_SPECIAL(endpoint),

Ну и в самом конце вызываем удаление созданного макроса, чтобы оно не было использовано в коде в дальнейшем:

#undef _SPECIAL

Теперь после прочтения этого небольшого ликбеза вы можете смело пользоваться макросами и создавать более сложные и нечитаемые шедевры наконец-то разобрались в том, насколько гибкими могут оказаться выражения препроцессора ( вообще не понимаю, как вы жили без них раньше...)

А какие выражения и макросы в Си видели вы?

Теги:
Всего голосов 7: ↑7 и ↓0+10
Комментарии2

PEP 750: t-строки в 3.14

Недавно ревьюил один интересный PR в CPython: в питон добавили еще один способ форматировать строки. Теперь – со специальным АПИ для внешних интеграций. Расскажу: как и зачем.

Основная причина: использовать f строки удобно, но нет никакого АПИ для перехвата момента "вставки" или интерполяции значений. Например, при форматировании html или sql – требуется специальным образом делать escape для значений. И раньше код вида f"{template}" представлял собой дыру в безопасности и потенциальное место для XSS.

string.templatelib.Template

Новый префикс t не будет создавать объект str, он будет создавать объект класса string.templatelib.Template:

>>> user = 'sobolevn'
>>> template = t"Hi, {user}"
>>> template
Template(strings=('Hi, ', ''), interpolations=(Interpolation('sobolevn', 'user', None, ''),))

>>> from string.templatelib import Template
>>> isinstance(template, Template)
True

Обратите внимание, что при создании template – у нас не произошло форматирование сразу. Мы создали объект, у которого есть свойства strings и interpolations, из которых можно собрать финальную отформатированную строку.

Давайте посмотрим на примере. Допустим, мы хотим формировать URL из наших данных:

>>> domain = 'example.com'
>>> query = 'python string formatting is too complex'
>>> template = t'https://{domain}?q={query}'

И сам код логики форматирования, где мы будем вставлять значения разным способом. Если у нас шаблон query, то мы будем использовать quote_plus для его форматирования. Остальные значения – будем вставлять как есть:

>>> from string.templatelib import Template, Interpolation
>>> from urllib.parse import quote_plus

>>> def format_url(template: Template) -> str:
...     parts = []
...     for part in template:
...         match part:
...             case str() as s:  # regular string
...                 parts.append(s)
...             case Interpolation(value, expression='query'):
...                 parts.append(quote_plus(value))
...             case Interpolation(value):
...                 parts.append(value)
...     return ''.join(parts)

И вот результат:

>>> format_url(template)
'https://example.com?q=python+string+formatting+is+too+complex'

Только теперь наш Template был отформатирован. Нами. Ручками.
У нас есть полный контроль за процессом форматирования. Вот в чем суть данного ПЕПа.

Фичи одной строкой

  • Работает = как обычно в f строках: t'{user=}'

  • Есть привычные определители формата: !r, !s, .2f, тд

  • t строки можно конкатенировать: t'Hello' + t' , world!' и t'Hello, ' + 'world'

  • Поддерживается режим raw строк: rt"Hi \n!"

Как устроено внутри?

Интересные места имплементации:

>>> import dis
>>> user = 'sobolevn'
>>> dis.dis('t"Hi, {user}"')
  0           RESUME                   0

  1           LOAD_CONST               2 (('Hi, ', ''))
              LOAD_NAME                0 (user)
              LOAD_CONST               1 ('user')
              BUILD_INTERPOLATION      2
              BUILD_TUPLE              1
              BUILD_TEMPLATE
              RETURN_VALUE

Обсуждение: как вам еще один способ форматирования строк?

Если понравилось – заходи в тг, где я рассказываю, как я делаю CPython.

Теги:
Всего голосов 10: ↑10 и ↓0+13
Комментарии7

Для себя я определил архитектуру так:

Архитектура программной системы - это набор ограничений, которые формируют и направляют реализацию системы в сторону максимизации её ценности

Архитектура - это набор ограничений
Архитектура - это набор ограничений
  • Это набор ограничений: архитектура задаёт рамки/правила по которым должна строиться система

  • Архитектура формирует и направляет реализацию: у разработчиков должна быть свобода в реализации, но архитектура задаёт для них ограничения

  • Архитектура максимизирует ценность: ограничения поставлены так, чтобы вписываясь в них система принесла больше ценности. Именно архитектура определяет: какими паттернами реализовывать бизнес-логику, как связываться со сторонними сервисами, из каких категорий будет состоять программный код

И я придумал для этого метафору. Представьте, что мы строим дом. Тогда:

Системный архитектор:
Нарисует чертежи всего дома (фасада, этажей). Задаст форму квартирам: сколько в квартире комнат, куда проведены трубы и электричество. Исходя из этого, сан-узел можно будет поставить только в одной комнате (куда проведены вода и канализация), а кухню только в другой (куда проведена вода и газ). Системный архитектор наложил на весь дом и на каждую квартиру верхне-уровневые ограничения: структурные (сколько в каждой квартире комнат, где сан-узел, где кухня, а где жилые комнаты) и поведенческие (это жилое помещение, а не склад или магазин). Но в какой комнате будет детская, а в какой рабочий кабинет - решать не ему.

Системный дизайнер:
Он как дизайнер интерьеров. Определяет назначение каждой комнаты, учитывая уже наложенные архитектурные ограничения. Где будет гостиная, где спальня, где рабочий кабинет и т.п. И расставляет мебель (структурные ограничения), руководствуясь назначением каждой комнаты (поведенческие ограничения). И всё это так, чтобы живущим в квартире людям было удобно.

Программист:
Это рабочий, который по чертежам дизайнера положит паркет, подключит фурнитуру и соберёт мебель.

Хотя названия этих ролей подходит под метафору, сам я считаю, что всю вышеописанную работу делают программисты. Я не считаю, что компания выиграет, если будет иметь отдельную должность системного архитектора или системного дизайнера. Для меня это больше грейды, чем профессия:

  • Системный архитектор - senior (опытный программист, способный спроектировать кластер контейнеров)

  • Системный дизайнер - middle (программист, способный спроектировать один контейнер)

  • Программист - junior (любой программист, способный работать внутри контейнера по готовым ограничениям)

Теги:
Всего голосов 4: ↑3 и ↓1+2
Комментарии0

Как автоматизировать распознавание текста с изображений?

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

Раньше в моём арсенале был только pytesseract (Python-библиотека для распознавания текста). Она работала, но с серьёзными ограничениями:
➖Плохо справлялась с разными шрифтами
➖Теряла точность на низкокачественных изображениях
➖Путала языки, если текст был мультиязычным

Сейчас появились LLM-модели, которые справляются с этой задачей гораздо лучше, но если у вас нет мощного железа, запустить их локально не получится.

В профильных каналах регулярно пишут: «Вышла модель Х, которая показывает отличные результаты. OSINT-еры больше не нужны!», но никто не дает гайдов, как с этими моделями работать. Сегодня я это исправлю.

Обзор моделей для OCR
Прошерстив не один десяток источников, я выделил две наиболее популярные на текущий момент модели:
1️⃣ GPT-4 mini — высокая точность, но платная.
2️⃣ Google Gemini 2.0 Flash — высокая точность + бесплатный лимит.

Выбор без раздумий пал на Gemini. На момент публикации бесплатные лимиты от Google следующие:
✔️ 15 запросов в минуту
✔️ 1 млн токенов в минуту (ввод + вывод)
✔️ 1 500 запросов в сутки

Как взаимодействовать с Gemini?
1️⃣ Получаем API-ключ в Google AI Studio
2️⃣ Через API отправляем изображение в base64 + промпт
3️⃣ Получаем распознанный текст в ответе

Но есть важный нюанс: сервис не работает с российскими IP

Что делать, если Gemini недоступна?
Если у вас по какой-то причине нет возможности получить доступ к серверам Google AI Studio, то можно воспользоваться сервисами, которые предоставляют доступ к различным open-source моделям. Например, DeepInfra.
Плюсы:
✔️ Нет блокировок по геолокации
✔️ Гибкая тарификация
Минусы:
✖️ Нет бесплатного тарифа

Примеры скриптов выложил на github (https://github.com/vmtest439/britalb_ocr)

Если вам понравился пост и вы хотите читать больше подобного контента, то можете подписаться на мой авторский Telegram-канал BritLab!

Теги:
Всего голосов 4: ↑2 и ↓20
Комментарии3

Проверка знаний в эпоху LLM: опыт преподавателя из Политеха

Сегодня преподаватели сталкиваются с новой реальностью: даже уникальные задания и ежегодное обновление вариантов не гарантируют защиту от списывания. Студенты могут принести работающий код, созданный с помощью LLM-моделей, но совершенно не понимать, как он устроен. Устные собеседования могли бы помочь, но они требуют много времени и экспертности — до 15 минут на одного студента, что превращается в колоссальную нагрузку.

На курсах «Введение в язык программирования Go» и «Технологии параллельного программирования на C++» в Политехе лабораторные работы проверяются с использованием системы контроля версий GitLab. Это позволяет упорядочить процесс сдачи и проверки заданий.

Каждый студент работает в личном fork-репозитории, созданном на базе основного, предоставленного преподавателем. Решения оформляются строго по структуре: каждая задача и подзадача — в своей директории, обязательное наличие модуля go.mod, а точка входа программы размещается в cmd/. Сдача работы происходит через создание Merge Request в основной репозиторий, где автоматически запускаются все проверки.

Пример хронологии коммитов и Merge Request'ов, отправленных в основной репозиторий.
Пример хронологии коммитов и Merge Request'ов, отправленных в основной репозиторий.

Система GitLab CI/CD выполняет серию автоматических тестов, включая проверку структуры проекта, сборку и выполнение юнит-тестов. Если хотя бы один из этапов не пройден, работа не допускается к оценке. Это дисциплинирует студентов и делает процесс проверки прозрачным и объективным.

После успешного прохождения автоматических тестов работа передается на ручную проверку преподавателю. Он дает обратную связь и при необходимости запрашивает доработку через комментарии в Merge Request. Только после этого, если все в порядке, решение попадает в основной репозиторий и считается принятым. Такой подход делает процесс обучения максимально приближенным к реальной командной разработке в индустрии.

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

Теги:
Всего голосов 2: ↑2 и ↓0+5
Комментарии0

Хотите разобраться, как работает Docker и зачем он нужен?

Тогда новый бесплатный курс — для вас!

Docker — это open source-платформа для создания контейнеров — окружений, где приложения работают независимо от ОС или среды. Технология упрощает перенос приложений между окружениями и ускоряет разработку.

В новом бесплатном курсе мы расскажем, с чего начать: как установить Docker, собрать образ, создать и запустить контейнер. Также познакомимся с Docker Compose и обсудим, чем Kubernetes отличается от Docker Swarm.

Несколько материалов для начала

Приступить к изучению курса →

Теги:
Всего голосов 5: ↑4 и ↓1+4
Комментарии0

Это всё началось с изобретения слова “бойлерплейт” в 2012 году. Всем было страшно, что им придётся писать аж по три строки вместо одной. Поэтому все начали насиловать компиляторы и добавлять в них новые функции — только бы (НЕ ДАЙ ГОСПОДЕ БОЖЕНЬКА!!!) не писать дополнительно два символа.

В 2025 году у нас есть ЛЛМ. И не надо врать — я знаю, что вы не набираете код, за вас это делает ЛЛМ. Я не говорю, что вы не вычитываете этот код и не перепроверяете всё. Нет. Но печатает за вас ЛЛМ. И это — нормально.

Пусть она занимается этим бойлерплейтом. Иногда это — самое простое решение. Если у меня есть один файл, в котором чётко видно, в какие функции инвокаются какие рауты, то это — прекрасно. Не надо создавать фабрику, которая будет строить псевдообъекты, которые потом по гаданию на картах Таро будут инвокать методы на основании положения Марса в Стрельце.

Пусть ЛЛМ за вас напишет файл с 500 строками кода, где каждому URL дан чёткий метод. И если вам надо будет переименовать 300 из этих методов, то пусть ЛЛМ это и сделает. Не велика проблема.

В 2025 году можно смело откатить все нововведения Яваскрипта до 2016 года — и не париться больше в попытках улучшить язык. Просто сделайте его стандартом и больше не меняйте. Пусть ЛЛМ будет страдать. Нам не страшно.

Зато потом это будет проще понять и прочитать, чем вспоминать, что делает последовательность символов ?./\ ﷼ℬ в вашем коде и какой транспайлер мне надо поставить, чтобы это компилировалось в Google Chrome версии 18384572.

Теги:
Всего голосов 8: ↑7 и ↓1+9
Комментарии3

Он переписал сортировку в Java! Интервью с Владимиром Ярославским

На JPoint 2025 мы пообщались с Владимиром Ярославским — разработчиком, чья работа вошла в историю Java. Именно Владимир стал автором улучшенного алгоритма сортировки, который используется в JDK.

Делимся ссылками на интервью на других ресурсах:

Это только начало — впереди ещё больше бесед с интересными людьми из мира Java и Spring.

Присоединяйтесь к русскоязычному сообществу разработчиков на Spring Boot в телеграм — Spring АйО, чтобы быть в курсе последних новостей из мира разработки на Spring Boot и всего, что с ним связано.

Ждем всех, присоединяйтесь

Теги:
Всего голосов 3: ↑3 и ↓0+3
Комментарии0

На GitHub выложены исходные коды программ, опубликованы в 3-м издании 101 BASIC Computer Games Дэвида Ала за март 1975 года издательства Digital Equipment Corp.

Теги:
Всего голосов 1: ↑1 и ↓0+2
Комментарии1
Оппа! Не зря мне чудилось, не зря. Что-то глюкнуло и прямо по среди кода ответ на китайском!!!
Оппа! Не зря мне чудилось, не зря. Что-то глюкнуло и прямо по среди кода ответ на китайском!!!

Gork-ушены-ли странности?
Пробуя вайбить Горкушей, обнаружил странные параллели с поведением Синего Кита.

1. "прощупывание пользователя", скобочку там не закрыть, тут инклюд не помянуть, и всё такое-прочее, очевидное и не доставляющее проблем даже джунам, но способное напугать посторонних полотном "ужасных" ошибок ;-)
ДжиПетто вроде подобное тоже вытворяло (не знаю как сейчас), но там на общем фоне остального написанного это выглядело скорее как реальные косяки, а не издёвка...
А вот синий кит, через некоторое время чистого вайба, начинает откровенно жечь!

2. похожие "чудачества в коде", пруф к сожалению привести не могу, он из реальной жизни, и не гуглится, но всё подобное, обычно делается простым и понятным способом, создаётся структура, в которой описывается сколько бит что означает, и вместо разбора пакета, он просто рассматривается через эту структуру и вообще удобненько. Gorkуше был предоставлен пример кода, в котором именно так всё было сделано, и он этим даже воспользовался пару раз, но потом, таки переписал, устроив программный разбор пакета битовыми операциями, и конечно-же криво на столько, что ошибки самостоятельно исправить был уже не в силах, ни за сколько итераций. Что самое поразительное, абсолютно аналогичное поведения я наблюдал у Синего Кита несколько дней назад, вот прямо такой-же код, и такой-же косячный. Логично предположить что он был откуда-то сдёрнут, но нет, ничего подобного не гуглится, да и вообще может-ли такой изврат человеку в голову придти?

3. Я люблю Кита за сравнительную трезвость, позволяющую куда-то его запрягать даже по делу, у Горкуши с этим к стати хуже но, тупят они поразительно похожим образом.
Давеча попросил сделать демона общающегося с железом и что-то шарящего в мемори для других процессов. Read only вестимо, об этом было прямо сказано в промпте, но эти "двое из ларца" мьютиксов туда намутили, поразительно похожим образом!
И ладно-бы это был-бы какой-то пример из книжки переписанный на 100500 сайтах, но нет, там и косяки одинаковые, и по поводу мьютиксов на каждом заборе популярно написано, что в таких ситуациях "скрипач не нужен, родной"...

Вот такой-вот вайб, с котятами, может у кого будут ещё какие похожие замечания из других областей коднинга, я таки православный сионист системщик, и приколы у меня соответствующие, но наверняка на других языках оно чудит похожим образом!

Я начал мучить Горкушу ещё в X использовал преимущественно для самери поиска, а тут он вдруг резко так поумнел перед открытием, демонстрируя сходное с синим китом поведение, вот прямо в деталях. Так что не знаю прямо что и думать ;-)

PS. Протестировал профессионального Джимми 2.5, и кое-что из грядущего, слава Богам! Он действительно с виду более профессиональный НО, без образца проблему не решает, хотя это и ожидаемо, там где осмысленная архитектурная многоходовочка требуется...
...но в отличии от от Кита и Горкуши, Джимми дали мне ссылку на ту отраву, которой они все походу обожрались. Ok это отрава, бывает, но непонятно всё-же, с какого, если в сети есть большое количество годных примеров, берётся один, но гадкий? И как-же так вышло, что его сожрали все, такие разные ;-)

Теги:
Всего голосов 7: ↑1 и ↓6-5
Комментарии8

Какие выгоды можно получить от регистрации программы для ЭВМ в Роспатенте?

В первую очередь, свидетельство о регистрации программы для ЭВМ — это охранный документ. Он дает формальное подтверждение наличия исключительных прав на программный код.

Получение инструмента для защиты от незаконного копирования, использования, распространения программы (ее исходного кода), согласно: 

— УК РФ Статья 146. Нарушение авторских и смежных прав;

— КОАП РФ Статья 7.12. Нарушение авторских и смежных прав, изобретательских и патентных прав — ГК РФ Статья 1252.

Защита исключительных прав. Если программу незаконно использует третье лицо, можно через суд получить компенсацию до 5 млн рублей или возмещение упущенной вами выгоды в двойном размере.

Реальный кейс: Агрофирма «Южная» незаконно использовала программное обеспечение компании «1C» (свидетельства о регистрации №2001611306 и №2001610830) Перед иском в суд “1С” обратилась к нарушителю с предложением урегулировать спор досудебным соглашением, но “Южная” на это не ответила. Суд встал на сторону владельца ПО и компания “1С” получила компенсацию за нарушение ее прав в размере двукратной стоимости использования программы — 568 000 руб. (Дело № N А35-839/2020).

Способ идентификации программы для заключения лицензионных договоров, которые освобождаются от НДС (в случае включения программы в Реестр отечественного ПО). И то же самое свидетельство можно будет предоставить в Федеральную налоговую службу.

Упрощение процедуры постановки программы на баланс компании в качестве нематериального актива, предоставления информации в банки при заключении кредитного договора (в качестве объекта залога). При постановке программы на баланс ее стоимость рассчитывается как сумма затрат на ее создание. Эти затраты не списываются, а капитализируются, что позволяет увеличить стоимость чистых активов компании и ее прибыль. Дополнительный аргумент при внесении программы в реестр отечественного ПОСвидетельство принимается Минцифры как дополнительный документ, подтверждающий наличие исключительного права (наряду с первичными документами, но не заменяет их).

Бесплатный поиск

Поиск по программам

Регистрация программы

Теги:
Всего голосов 5: ↑5 и ↓0+5
Комментарии0

Ежемесячный дайджест: новое за март и апрель⛅

☁️ Провели главную IT-конференцию про облачные технологии и искусственный интеллект — GoCloud 2025. А пока мы готовим записи докладов, читайте об итогах конференции и о том, какой простор облачные и AI-технологии могут открыть для ваших IT-проектов в статье.

🦾 Рассказали про новые сервисы на платформе Cloud.ru Evolution. Например, теперь в коммерческом доступе Evolution Managed ArenadataDB — база данных на основе решения с открытым исходным кодом Greenplum, с которой можно хранить и обрабатывать большие объемы структурированных и полуструктурированных данных. Массово-параллельная архитектура (MPP) базы позволяет ускорять обработку данных даже в критически важных системах. 

Подробнее обо всех новых сервисах, а также обновлениях на других наших облачных платформах читайте в дайджесте на сайте.

💼 В кейсе рассказали, как технологии искусственного интеллекта в облаке Cloud.ru помогли подготовиться к выходу на новый рынок Wildberries — самому крупному по обороту маркетплейсу в России.

💸 Перезапустили реферальную программу, чтобы вы могли с большей выгодой рекомендовать сервисы Cloud.ru клиентам, коллегам или друзьям. Теперь можно получить 20% от суммы чеков приведенных пользователей в первый год и 15% — в последующие годы. Регистрируйтесь в программе до 31 мая и приводите новых пользователей в течение трех месяцев. Участвовать могут самозанятые, ИП и юридические лица. Присоединиться.

📺 Провели вебинары, и их можно посмотреть в записи:

А также приглашаем на вебинар: Безопасность контейнеров и Kubernetes от А до Я: как противостоять киберугрозам. На встрече обсудим базовые меры профилактики и защиты от киберрисков на уровне микросервисов, контейнеров и окружений под управлением Kubernetes. 24 апреля в 11:00 мск.

До встречи в майском выпуске!

Теги:
Рейтинг0
Комментарии1

Приглашаем на Frontend Mix — бесплатный митап ЮMoney для всех, кто интересуется фронтенд-разработкой 🔥

🕓 24 апреля, в четверг, в 19:00 (мск) приходите на митап в Санкт-Петербурге или подключайтесь онлайн.

Спикеры из ЮMoney и Сбера расскажут, как работают над задачами и улучшают процессы в команде. 😎

Темы докладов:

🟣 Рефакторинг за 10 секунд. Как с помощью консольной утилиты производить автоматизированный рефакторинг крупных приложений за считанные секунды.
🟣 Подходы и практики тестирования во фронтенде. Зачем нужно тестирование во фронтенде, какие стандарты и подходы существуют и как мы применяем их в своей работе.
🟣 Уязвимости фронтенда в финтехе. Топ-3 атаки, или как построить защиту по всем фронтам — от планирования до релиза.
🟣 Анимация до кончиков пальцев. Поговорим про анимацию в целом и на вебе. Рассмотрим все способы сделать анимацию. Узнаем про композитные слои и как их посмотреть в Dev Tools — на примере одинаковых анимаций, но с использованием разных подходов.

Чтобы попасть на митап, нужна регистрация. Все подробности — на сайте Frontend Mix❤️

Теги:
Рейтинг0
Комментарии0

Ближайшие события

ИИ-ассистенты (промпты) - это тоже low-code. Бизнес-аналитики сами разрабатывают ИТ-продукты. Сайт какой сложности можно разработать без знания JavaScript? Кейс app.2lead.ru

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

ИИ-помощники (промпты) - это тоже low-code

Чаще всего low-code определяют как создание ПО с помощью графических интерфейсов и настроек, а не через традиционное программирование. Мне ближе более широкое определение: low-code – это системы и платформы, которые предполагают изменение, дополнение кода пользователем, в том числе с применением ИИ-помощников (промптов).

Кейс: Сервисы app.2lead.ru разработаны бизнес-аналитиком

ИИ-ассистенты значительно ускорили разработку сервисов app.2lead.ru, созданных мной на JavaScript - без опыта программирования на этом языке. Это подтверждает возможность разработки ПО силами бизнес-аналитиков, продуктовых менеджеров и так далее. Ранее это была прерогатива только профессиональных программистов. 

Сервисы app.2lead.ru разработаны в конце 2024 года – начале 2025 года. Вошли в топ-5 Яндекса по запросу «калькулятор инфляции». Уже увеличили органический трафик сайта 2lead.ru более чем в 5 раз, без расходов на рекламу. // См. также «Нерекламные методы продвижения» https://habr.com/ru/articles/686736/

Сервисы app.2lead.ru // Калькуляторы инфляции. Аналитика. Прогнозы
Сервисы app.2lead.ru // Калькуляторы инфляции. Аналитика. Прогнозы

Что дальше? Массовое применение таких методов разработки ПО, более совершенные low-code системы и программирование голосом? Считаю, что практику low-code нужно расширять, разрабатывать учебные материалы по этому направлению и т.д. В этих инструментах есть большое пространство для развития.

Теги:
Всего голосов 5: ↑0 и ↓5-5
Комментарии0

Хотел бы прокомментировать эту статью про накрутку

https://habr.com/ru/articles/901138/

Моим предыдущим местом работы был стартап. В один прекрасный день начальство собрало нас и сказало, что "денег нет, но вы держитесь". У нас оставался месяц на поиск нового места перед тем, как остаться с голой задницей.

Я судорожно начал искать работу фронтом, потому что никаких накоплений сформировать еще не успел. На момент описываемых событий мой общий стаж в IT составлял 2.7 лет - я успел поработать АБД, фуллстаком и фронтом. За следующие 3 недели я сходил ровно на 1 собес в откровенно отстойное место, на остальные мои 100500 откликов былы только отказы и игноры.

Я очень не хотел заниматься подобным харамом, но из каждого угла трубили про накрутку. Я поступился совестью и накинул год стажа на первое место работы. Тут же поперли собесы. Мне даже впервые в жизни hr сама написала в телегу. Сложилось стойкое ощущение, что я просто перевалил через какой-то фильтр, как будто бы все hr-ы привыкли к накруткам и к исходным требованиям сами плюсуют пару лет.

Сейчас все хорошо, во время моих попыток устроиться фронтом меня взяли фуллстаком, и теперь я работаю бэкэндером (вернулся к светлой стороне силы).

Вопрос - какие были альтернативы? У меня жена, две собаки и кредит по учебе, жену я замотивировал и отправил получать образование, плюс уговорил ливнуть с ее подработки, чтобы она лишний раз не нервничала и могла себя всю посвятить учебе. Морально я начинал готовиться к работе курьером.

Будет здорово, если вы поделитесь своим аналогичным опытом

Теги:
Всего голосов 3: ↑2 и ↓1+1
Комментарии3

Честный вопрос к разработчикам: сколько процентов кода в вашем последнем PR было фактически написано LLM?

И как бы отреагировали ваши коллеги/руководство, если бы узнали реальный процент?

Теги:
Всего голосов 6: ↑3 и ↓3+1
Комментарии31

Хотите опубликовать свой продукт или сервис? Тогда присоединяйтесь к вебинару про Маркетплейс Cloud.ru.

📆 Когда: 17 апреля в 11:00 мск

📍 Где: онлайн

Какие продукты можно опубликовать на Маркетплейсе Cloud.ru, кто может стать вендором и какие это дает преимущества, а также, как устроен процесс публикации продуктов на витрине, расскажет Бузулуцкова Юлия — ведущий аналитик.

В программе:

  • что такое Маркетплейс Cloud.ru и какие решения мы уже предлагаем клиентам;

  • типы продуктов на витрине и особенности их использования;

  • публикация продукта на витрине: условия, этапы, сопровождение;

  • преимущества партнерства с Маркетплейс Cloud.ru в качестве вендора;

  • демо: как заполнить анкету продукта и опубликовать его.

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

Зарегистрироваться 👈

Теги:
Рейтинг0
Комментарии0

📢 Почему устаревшие библиотеки всё ещё используются? Взгляд на Log4j 1.x 📊

Несмотря на то, что поддержка Log4j 1.x завершилась ещё в 2015 году, исследование показывает удивительную тенденцию:

  • 33.81% проектов продолжают использовать устаревшую версию Log4j 1.x.

  • Лишь 10.89% проектов перешли на современную Log4j-Core 2.x.
    Что ещё более удивительно, даже новые проекты выбирают устаревшую версию, что подчёркивает сложности в управлении зависимостями.

🔍 Почему это происходит?
1️⃣ Недостаточная осведомлённость о безопасности: Разработчики могут недооценивать риски использования уязвимых библиотек.
2️⃣ Высокая стоимость миграции: Переход на новые версии часто воспринимается как сложный и дорогостоящий процесс.
3️⃣ Зависимость от легаси-систем: Многие проекты связаны с устаревшими системами, что делает обновление крайне затруднительным.

⚠️ Риски использования Log4j 1.x
Продолжение работы с этой библиотекой подвергает системы серьёзным угрозам, включая возможность удалённого выполнения кода (например, уязвимость CVE-2019-17571).

💡 Следующие шаги для сообщества

  • Повышать осведомлённость о рисках использования устаревших библиотек.

  • Предоставлять инструменты и ресурсы для упрощения процесса миграции.

  • Рассмотреть временные решения, такие как Reload4j, для быстрого устранения критических проблем.

https://arxiv.org/pdf/2504.03167

Теги:
Рейтинг0
Комментарии0

LLM в разработке: Практические вопросы к сообществу

Привет, Хабр!

LLM уже не просто стучатся — они локтями расталкивают наши привычные рабочие процессы. За последний год я много экспериментировал c LLM в разработке, пытаясь найти эффективный и осознанный способ применения, который я для себя назвал «выращиванием кода». Это подход, основанный на декомпозиции, качественном контексте и итеративной доработке, как антидот слепой генерации или «вайб‑кодингу».

Но теория — это одно, а реальность у всех разная. Хочется сверить часы с сообществом и обсудить конкретные методики и наблюдения. Вместо утверждений — задам вопросы, которые возникли у меня (и в ходе недавних обсуждений):

  1. Как вы используете LLM в своей работе? Только для автодополнения и поиска решений, или пробовали полноценно «выращивать» компоненты и модули? Какие модели дают лучший результат для вашего стека?

  2. Насколько важен контекст при работе с LLM? Замечали ли вы разницу между запросами типа «напиши X» и «вот существующий код, создай Y, который интегрируется с ним»? Как вы подбираете релевантный контекст?

  3. Трансформировалась ли ваша роль как разработчика? Заметили ли вы изменение в процессе работы — больше времени на архитектуру и меньше на написание кода? Или LLM пока остается вспомогательным инструментом?

  4. Какие новые навыки потребовались? Как вы формулируете запросы? Разрабатывали ли особые техники промпт‑инжиниринга для программирования? Какие приемы повышают качество генерируемого кода?

  5. В каких областях LLM справляется лучше всего, а где хуже? UI/UX, бизнес‑логика, алгоритмы, тесты? Есть ли паттерны или типы задач, где вы полностью полагаетесь на LLM, и где предпочитаете писать руками?

  6. Как вы проверяете сгенерированный код? Какие методы и практики помогают выявлять потенциальные проблемы? Меняется ли подход к ревью LLM‑кода по сравнению с человеческим? Приходилось ли сталкиваться со специфическим «LLM‑долгом»?

  7. Как LLM влияет на вашу продуктивность? Замечаете ли реальное ускорение разработки? В каких типах задач выигрыш наиболее заметен? Изменилось ли качество конечного продукта?

  8. Как вы решаете проблему «разрыва интерпретаций» между нечеткими человеческими намерениями и точными машинными инструкциями при работе с LLM? Какие техники помогают сузить пространство возможных интерпретаций в промптах?

  9. Какие техники декомпозиции задач вы используете при работе с LLM? Отличаются ли они от «классической» декомпозиции при ручном программировании (например, в части подготовки контекста для каждого шага)?

  10. Как вы видите будущее этой практики? Считаете ли «выращивание кода» (или похожие осознанные подходы) временным трендом или фундаментальным изменением в разработке программного обеспечения?

Буду рад услышать ваши мнения, опыт и конкретные примеры из практики!

Теги:
Всего голосов 4: ↑2 и ↓2+1
Комментарии5

Индексация массивов (портал в ад).

Как известно, иногда массивы индексируют с нуля, а иногда с единицы, и это часто вызывает споры.

На самом деле, тут можно выделить шесть разных видов языков программирования:

  1. Массивы индексируются с 0.

  2. Массивы индексируются с 1.

  3. Массивы индексируются с 0, но можно указать другое начало.

  4. Массивы индексируются с 1, но можно указать другое начало.

  5. Массивы индексируются только с явно указанного начала.

  6. Массивов в языке нет.

Языков явно выраженного типа (3) мне сходу не удаётся припомнить (хотя в Delphi и C++ есть некоторые движения в этом направлении), а в остальном известные мне языки довольно равномерно распределены между типами.

Нумерация с 0 упрощает индексную арифметику.

Нумерация с 1 соответствует естественному натуральному счёту и математической нотации.

В связи с этим, к нумерации с 1 тяготеют в основном языки для вычислительного применения (Фортран, Матлаб, Джулия). Страшно представить, сколько проклятий получили авторы NumPy от людей, переводящих алгоритмы с Фортрана.

Теги:
Всего голосов 2: ↑1 и ↓10
Комментарии14