Pull to refresh
-9
0
Михаил Лопский@ScienceInCode

Инженер

Send message

«Закрепится подход "разные части системы на разных языках"»

Полностью согласен с этим тезисом. На практике это работает отлично.

Из опыта (17 проектов промышленного оборудования):

• Python — оркестрация, тесты, code generation, прототипирование алгоритмов
• C/C++ — горячие пути, real-time логика, работа с ресурсами. В моём случае (embedded) это ещё и прямое управление железом, но принцип тот же: когда каждый такт на счету — абстракции отходят на второй план.
• Связка — pybind11 или ctypes для моста между слоями

Нюанс, о котором не упомянули: при таком подходе критически важна граница абстракции. Если Python-часть начинает «лезть» в низкоуровневую логику (или наоборот) — получаем overhead на сериализацию и дебаг-ад.

Вопрос: Как вы в МТС решаете проблему отладки кросс-языковых вызовов?

P.S. Как человек, писавший свой компилятор: иногда проще написать code generator на Python, который выдаёт оптимизированный код, чем бороться с накладными расходами FFI.

Отличная работа! Сам работаю над системами анализа для медтехники и промышленного оборудования (17 проектов), поэтому хорошо понимаю боль с субъективностью экспертных оценок.

Несколько мыслей из опыта:

Про архитектуру:

«Мозг системы — это нейросеть... Система работает локально, использует локальные мощности GPU»

Правильный подход для production. В медицине тоже требуем локальную обработку — данные не должны уходить в облако.

Вопрос по валидации:
Как проверяете корректность классификации пограничных форм (III–V)?
В медтехнике мы используем double-blind тесты: несколько независимых экспертов + консенсус.
Пробовали ли собирать метрики inter-rater reliability для сравнения «система vs эксперты»?

Про производительность:
Python удобен для прототипа и оркестрации пайплайна. Но для hot paths (предобработка изображений, морфометрия) не рассматривали ли вынос на C/C++?
На STM32 с OpenCV мы получали 5–10× ускорение при обработке 12-bit TIFF.

P.S. Как человек, писавший свой компилятор: иногда проще сгенерировать оптимизированный C-код под конкретные морфологические фильтры, чем бороться с overhead Python. Но это уже уровень micro-optimization 😄

Финальный вопрос:
Планируете ли открытую API для интеграции с LIMS-системами? В промышленности часто нужно встраивать такие модули в существующие контуры контроля качества.

Интересная реализация!
Вопрос по производительности: как ведёт себя алгоритм на больших размерах (10000x10000+)?
Из опыта работы с процедурной генерацией: для игр часто критична не только скорость генерации, но и локальность — возможность генерировать лабиринт по частям (chunk-based).
Можно ли адаптировать Prim под потоковую генерацию? Или для этого лучше подойдёт Recursive Backtracker / Wilson's algorithm?
P.S. Для второй реализации с random edge — не пробовали использовать heap/priority queue вместо списка? Должно дать прирост на больших лабиринтах с O(n²) до O(n log n).

Сама схема известна давно, и её кинематика хорошо изучена вдоль и поперёк. Актуальнее вопрос в том, какой подобрать материал, который сохранит преимущества этой структуры в разных условиях эксплуатации.

Без сети это бесполезный кирпич?

Вывод: не начинайте с нейросетей, начните с аналитики.

Точно!

На морозе такой девайс - самое то 😁

А как мигрировать с rand() на современный ГПСЧ в существующем проекте?

Если OpenAI уже оказались под давлением, то какие реальные рычаги останутся у них, чтобы заставить Пентагон соблюдать «красные линии», если после подписания контракта нарушатся запреты на слежку или автономное оружие?

Интересно, как нововведение повлияет на старые устройства или серверы, которые не поддерживают постквантовую криптографию, сохранится ли для них возможность соединения по старым стандартам?

Отличная статья! Чувствуется, что пишешь для таких же, как ты — кто хочет понять «зачем», а не просто скопировать код. Сам переходил с МК (STM32/AVR) на FPGA для промышленных проектов, поэтому каждый этап узнаю.

Про «схема, а не программа»:

«Язык HDL это не язык программирования. Это язык описания схемы»

Это самый важный инсайт, и ты его точно подсветил. Добавлю из опыта: когда объясняю коллегам переход с C на Verilog, использую аналогию:

  • C: «Сделай A, потом B, потом C»

  • Verilog: «Построй блок, где A, B и C работают параллельно, и соединяй их»

Про module и ООП (мой личный инсайт):
Как C++-разработчик, при переходе на Verilog заметил интересное сходство:

  • moduleкласс: у него есть «интерфейс» (порт-лист) и «реализация» (внутренняя логика)

  • Параметры (parameter)шаблоны/константы класса: позволяют параметризовать модуль при инстанцировании

  • Иерархия модулейкомпозиция/наследование: top-level модуль «содержит» подмодули, как объект содержит поля

  • generate-блокишаблонная метапрограммика: генерация структуры на этапе «компиляции»

Конечно, это не настоящее наследование в смысле ООП, но для мозга, привыкшего к C++, такая аналогия помогает быстрее «переключиться».

Про D-триггеры и делитель частоты:
Собрать делитель на 25 триггерах — это правильный путь для понимания! Но на будущее: в Quartus есть примитив altclkctrl и IP-ядра PLL, которые делают то же самое эффективнее. Для продакшена лучше использовать их, а ручные делители оставлять для обучения.

Про Pin Planner и имена пинов:

«имена входов и выходов модуля верхнего уровня появляются в табличке только после "анализа и обработки"»

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

set_location_assignment PIN_G1 -to clk
set_location_assignment PIN_Y17 -to led


Тогда не нужно ждать «Analysis & Synthesis» перед открытием Pin Planner.

Про USB-Blaster и драйверы: Да, это отдельный квест. Если кто-то застрянет: драйвер лежит в quartus/drivers/usb-blaster/, но в Windows 10/11 иногда нужно отключить проверку подписи драйверов.

Вопросы на продолжение:

  1. Планируешь ли сравнивать схемный вход (как сейчас) vs Verilog-код на примере того же мигания? Интересно увидеть, как один и тот же результат описывается по-разному.

  2. Будешь ли затрагивать тестбенчи и симуляцию? В МК мы отлаживаем пошагово, а в FPGA симуляция — часто единственный способ найти баг до прошивки.

  3. Для Cyclone 10 LP есть встроенные блоки памяти (M10K) и DSP. Планируешь ли примеры с их использованием?

P.S. Как человек, писавший компиляторы: иногда смотришь на Quartus и думаешь — «а ведь это тоже компилятор, только на выходе не бинарник, а битстрим для конфигурации LUT». Та же магия, только для железа 😄

Привет! Понимаю боль — сам начинал с no-name плат, когда документация была «бонусом», а не стандартом 😄

По фото вижу:

  • FPGA: Altera Cyclone IV EP4CE15E22C8N (15K логических элементов, 225 GPIO)

  • SDRAM: SK hynix H57V2562GTR (256 Mbit = 32 MB)

  • JTAG: 10-pin разъем (слева, черный)

  • USB: Micro-USB (вероятно, CH340/CP210x для UART)

  • LED: D1-D6 (справа от FPGA)

  • Кнопки: K1-K5 (справа)

Характеристики EP4CE15E22C8N:

  • 15,408 логических элементов

  • 504 Kbit embedded memory

  • 4 PLL

  • 144-pin EQFP корпус

  • Напряжение ядра: 1.2V, I/O: 3.3V

План действий:

1. Quartus + прошивка:

  • Скачай Quartus Prime Lite Edition (бесплатная, полностью поддерживает EP4CE15)

  • Купи USB-Blaster (AliExpress, ~$5-10) или используй FT2232H

  • Создай тестовый проект

2. Поищи по маркировке:

  • Введи в Google: EP4CE15E22C8N development board schematic

  • Поищи по коду с платы: 343708C_F163_210924

  • Попробуй Google Lens по фото — может, найдёшь клон с документацией

3. Тестовый код (мигающий LED):
module blink(
input clk,
output reg led
);
reg [24:0] counter;
always @(posedge clk) begin
counter <= counter + 1;
led <= counter[24];
end
endmodule

4. Reverse-engineering пинов:

  • LED: назначь сигнал на разные пины, смотри где загорается

  • SDRAM: скачай datasheet H57V2562GTR, отследи дорожки

  • Кнопки: прозвони мультиметром от кнопок до FPGA

Вопросы:

  1. Есть ли маркировка на обратной стороне платы?

  2. Какой чип рядом с Micro-USB (маркировка)? Это поможет понять UART.

  3. Определяется ли плата как COM-порт в системе?

Если скинешь фото обратной стороны или маркировку USB-чипа — помогу с pin assignment для Quartus!

Cyclone IV EP4CE15 — отличная плата, на таких в промышленных проектах работали.
Всё получится! 👍

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

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

Поэтому у нас жёсткое правило: прототип ≠ продакшен, и граница между ними должна быть явной. Если показываешь демо — говори, что «это симуляция». Если заявляешь ML-модуль — покажи хотя бы валидацию на hold-out.

Про метрики ML:

«SMAPE 79% у линейной регрессии... Transformer 33%... MAE=0.03 при потреблении в м³»

Это классический red flag. Добавлю из опыта валидации моделей для промышленного прогнозирования:

Масштабирование данных — SMAPE «взрывается» на околонулевых значениях. Всегда проверяйте распределение target'а перед выбором метрики.
Кросс-валидация — сравнивать модели можно только на одинаковых фолдах. Разное число eval_points = невалидное сравнение.
Интерпретируемость — в промышленности часто важнее «почему модель так решила», чем «на 0.1% точнее». Линейная модель с feature importance может быть полезнее чёрного ящика.

Вопрос:
Пробовали ли вы написать формальный отчёт о несоответствии организаторам? В сертифицируемых областях (медицина, авиация, АСУ ТП) есть процедура «non-conformance report» — фиксация расхождения между заявленным и фактическим. Может, стоит адаптировать этот подход для хакатонов?

P.S. Как человек, писавший свой GUI-движок и компилятор: иногда проще сгенерировать минимальный working prototype, чем рисовать 50 экранов с неработающими кнопками. Но это уже вопрос философии разработки 😄

Держитесь. Честных соревнований и адекватных заказчиков вам!

Спасибо за структурированный материал!

Как Team Lead, часто вижу, как джуны злоупотребляют декораторами, превращая код в «луковицу» из обёрток.

Чек-лист, который я даю команде: ✅ Декоратор уместен, если:

  • Логика повторяется в 3+ функциях

  • Это инфраструктурный код (логирование, retry, auth)

  • Декоратор не меняет семантику функции

❌ Декоратор — плохая идея, если:

  • Внутри бизнес-логика (должна быть в самой функции)

  • Декораторы вложены >3 уровней (сложно дебажить)

  • Вы не можете объяснить, что делает декоратор, за 10 секунд

Вопрос: Как вы относитесь к декораторам, которые меняют сигнатуру функции? Например, @inject_db добавляет аргумент db в функцию. С одной стороны — удобно, с другой — нарушает явность (Zen of Python: "Explicit is better than implicit").

Information

Rating
5,451-st
Location
Новосибирск, Новосибирская обл., Россия
Date of birth
Registered
Activity

Specialization

Десктоп разработчик, Фулстек разработчик
Ведущий
From 1,500,000 ₽
ООП
C++
Прикладная математика
C
Assembler
Алгоритмы и структуры данных
Verilog HDL
FPGA
STM32
Разработка печатных плат