All streams
Search
Write a publication
Pull to refresh
89
0
Александр Слесарев @nuald

Техлид, Cisco Meraki

Send message

Живу в Канаде 12 лет, этот год будет последний, переезжаем в США. Хочу немного дополнить автора:

  1. Жизнь dink-ов (double income, no kids) != жизни с детьми (собственно, поэтому и уезжаем). Торчать в emergency 10 часов, чтобы потом сказали, пейте обезболивающее, а на следующий день ребёнок чуть не умирает, и его откачивают из 911, малости радо. Вон летом в Келовне ребёнок умер от ангины (в цивилизованной Канаде!!!)

  2. Дом, даже в такой глуши, как Калгари, удовольствие ещё то. Торонто относительно тёплый, а здесь за отопление можно спокойно отдавать 300+ в месяц (у нас утилити иногда доходят до 600, но мы позволяем для себя роскошь держать дома 24 градуса тепла). Каждый год расходы стабильно увеличиваются, по двум причинам: налог на воздух ( carbon tax, пока ещё с rebate, но насколько я понимаю, потом его отменят), и обновление инфраструктуры энергокомпаний (Трюдо сказал же что всех нужно пересадить на электромобили через несколько лет, но естественно расходы идут на налогоплательщиков).

  3. Парикмахеров лучше искать русскоговорящих. У нас в Калгари наплыв из Украины, и мастеров, причём очень хороших, стало много. Правда к Торонто это может не относится.

  4. Costco рулит. Я его не любил, но цены и ассортимент меня переубедили. Думаю, две моих самых любимых сети - это Costco и Ikea (причём последний из-за ресторана, мебель не очень). Walmart лучше из жизни исключить, они когда-то были дешёвые, но сейчас нет, и price matching тоже убрали.

  5. В Reddit-e есть хорошие тематические или географические канадские группы. Именно через них я в свое время нашёл хорошие и дешёвые сотовые и интернет. Но учтите, что здесь нет идеала, в Канаде самая настоящая олигополия, так что за достойные услуги приходится платить.

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

У markdown достаточно бедное форматирование и даже подсветки синтаксиса кода нет из коробки. Да, есть расширения и прямое использование html, но это все выглядит полумерами. Например, с помощью asciidoctor у нас есть:

  • TOC (в markdown требуется скрипт для генерации)

  • Диаграммы (mermaidjs или PlantUML), gitlab поддерживает автоматически

  • Include (самое мощное что есть, все примеры кода у нас рабочие и вставляются из реального кода), поддерживается gitlab, вряд ли когда-нибудь будет поддерживаться github

  • Admonitions (вставки NOTE, WARNING etc)

Думаю, не помешали бы примеры, почему надо все время учиться, потому что видно, что есть недопонимание. Базовые вещи (алгоритмы) не особо поменялись (хотя, например, современный qsort - это уже не старый книжный, а модифицированный: https://awdesh.medium.com/dual-pivot-quick-sort-javas-default-sorting-algorithm-for-primitive-types-77342e1df5e5)

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

  • zstd (2015) - использовать в наше время gz просто уже стыдно

  • linux kernel namespaces (2002)/cgroups (2007) - docker, LXC и в целом OCI

  • sponge functions (2007) - основа современных стандартов криптографии (SHA-3, и в этом году NIST выберет победителя для lightweight/hardware encryption)

  • SIMD (все это было и раньше, но SSE и NEON появлились только в этом веке)

  • сетевые протоколы (QUIC, DNS-over-HTTPS, WebRTC etc) - очень много появилось в последние два десятка лет.

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

Для сравнения скорости необходимо намного больше трудозатрат для проекта, и это не входило в рамки оригинального PoC. Но могу сразу сказать, что Lua достаточно хорош - он и компактный и достаточно быстрый. Но если скорость - это первичный критерий, то надо смотреть на другие бенчмарки (например, после того как Google вбухал огромный деньги в JS, он стал одним из самых быстрых встраиваемых ЯП, но при этом он и весьма увесистый).

На самом деле, не такая уж приличная разница (что подтверждается другими бенчмарками, которые я курирую). Мои данные:

Современная архитектура: Intel Xeon E-2324G

Go (go3, go run concgo.go s): 748,502,994
Rust (rust2, cargo run --release s, запуск как у автора): 941,619,585
Rust (rust2, cargo run --release s, изменён Cargo.toml): 939,849,624
Rust (rust2, RUSTFLAGS="-C target-cpu=native" cargo run --release s, Cargo.toml + target-cpu=native): 965,250,965

В данном случае, lto дает даже чуть худшие результаты, но это прогрешности, и я никогда не видел, чтобы были реально лучше результаты (использование cpu=native совершенно другая история, и это реально может давать улучшения). Насколько я видел, LTO имеет смысл когда линкуются много файлов, и для этого данного теста это не особо важно.

Из моих наблюдений крупных западных компаний в которых я работал (и их софт/сервисы/железо используется повсеместно):

  • Начальство и непотизм. Это только на словах открытость и инклюзивность. Менеджмент окружён друзьями, и они просто не видят реальности, т.к. друзья не хотят потерять свое положение, если будут рассказывать горькую правду. Плюс многие менеджеры считают себя умнее чернорабочих (именно так они воспринимают программистов), и принимают необоснованные решения.

  • Квоты социальной справедливости. Если нанимать людей "по повестке", компании получают налоговые вычеты. Более того, потом этих людей практически невозможно уволить, потому что они сразу начнут раздувать шум и даже судится, потому что типа их уволили из-за их расы/ориентации/тд. Этим людям нельзя ни в чем возражать, поэтому их проекты, какие бы не были бредовые, будут поддерживаться. Их код нельзя честно ревьювить, ибо опять-таки будет шум и суды.

  • Снежинки. В школе их приучают, что они snowflake (т.е. уникальные и неповторимые), поэтому на работе они себя ведут как непризнанные гении, которым нельзя давать монотонную работу. Именно такие внедряют реакты, микросервисы и прочие тренды, ибо это модно и интересно. Алгоритмы, большое О и просто понимание как работает все изнутри - скучно и не нужно. Из-за нехватки специалистов и распространённого глупого мнения, что лучше нанимать джунов ибо "мы их вырастим" (в реальности они покидают компанию через год-два), нанимается очень много именно этих снежинок.

auto не поможет, когда надо написать алгоритм числодробилку, в которой миллиарды надо умножать на миллионы (какой тип будет у "auto c = a * b;", если a и b int?). В этом плане Python с его прозрачным bignum намного удобнее. Другой пример - сложные коллекции (например, словарь со составным ключом и другой коллекцией для значений). В любом случае, это просто был совет, и это ваше полное право его игнорировать.

Во многих серьёзных компаниях есть два пути развития: people manager & individual contributor. Где-то начиная с senior developer можно выбирать и вполне можно оставаться программистом (individual contributor). Например technical leader (моя текущая позиция) эквивалентна director (позиция для менеджера). Естественно, есть дополнительные роли и все-равно не будет много времени на программирование, но с другой стороны, можно продолжать заниматься любимой работой, а не разбираться кто кого обидел.

Единственное исключение я знаю Facebook, они там требуют от всех программировать и у них "горизонтальные" отношения. Деталей дальше не знаю, так как не успел написать решения для их задачек (подсказка всем кто почему-то хочет у них работать - не используйте C++ или что-то другое сильно типизированное, потому что они не принимают псевдокод и надо чтобы программа корректно компилировалась и работала. Естественно, никаких IDE, все в онлайн блокноте с компилятором + несколько предустановленных библиотек).

Новоприбывшим сейчас очень тяжело. Жилье и страховки бешеные, конкуренция с индусами, китайцами и нигерийцами, которые может и менее квалифицированны, но могут лучше влится в коллектив (особенно если компания уже состоит из таких же). Я полностью поддерживаю их мнение что надо получать гражданство и валить. Я ещё верил в Канаду лет пять назад, но сейчас я вижу как все деградирует. Ещё помню когда Ванкувер был реально чистый и красивый, но сейчас в этот бомжатник ни ногой. Монреаля это конечно меньше коснулось, и возможно в вашем райском уголке все хорошо, вам можно только позавидовать.

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

Страховка и интернет в Онтарио дешевле, ибо конкуренция и правила страхования лучше. На западе Канады олигополия (хотя конечно это применимо и ко всей Канаде), а например в BC машины страхует только государство, полная монополия. В Альберте повышенная страховка из-за ужасного климата и постоянных аварий. Например я плачу $350, потому что я провел вне Канады 1.5 года и мне сбросили волительский стаж до нуля (!!!), и это ещё минимальное страхование ответственности (1 миллион, хотели всучить "стандартные" два).

Канада - экспортёр дешевой рабочей силы для США и экспортёр ресурсов + обдирает туристов (включая местных) космическими ценами. Например, самая зачуханная гостиница в Банфе стоит спокойно $300 USD в high season. Хорошие гостиницы типа fairmont могут спокойно стоить $1000+ (можете сами проверить цены на рождественные праздники тут через booking). Причём я останавливался в Fairmont Lake Louise (мне была скидка как резиденту Альберты), $600 выкинуты зря - да, вид красивый, только мутный из-за грязного окна, и обшарпанные стены с облупленной краской никак не создают впечатления высокого класса (сравниваю с Европой и Азией). Так что вот такой тут ВВП, а ай-ти тут имеет очень маленький вклад (T013, примерно 5%): https://www150.statcan.gc.ca/t1/tbl1/en/tv.action?pid=3610043402

Не совсем понял, как это wasm перпендикулярен? Байт-код — это подмножество скриптов, какая разница это бинарный формат или строковой. Lua-байткод не подходил, потому что это проприетарный формат, а оригинальный код не совсем соответствовал требованиям. Wasm стандартизирован, и имеет богатый тулчайн, вплоть до того, что мы можем спокойно модифировать сам байткод, не беспокоясь, что это сломается завтра.

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


В принципе, качество работы вполне удовлетворительное (правда, C++ биндинги подкачали, но это дело наживное). Будем обсуждать с коллегами, но лично я вижу два главных препятствия для того, чтобы wasm3 стал первичным кандидатом для нас:


  • большой расход памяти (проверил valgrind-ом, утечек нет, просто расход большой);
  • [не специфично для wasm3] требуется большой рантайм в самом WASM для хорошей функциональности (я попробовал два варианта: 1) no_std дал размер в несколько десятков байт, но весьма скудная функциональность; 2) полноценный Rust добавил сразу большой рантайм, и хотя стало комфортно программировать, WASM-файл занял несколько сотен килобайт ). Я пытался урезать, но толку мало, все-равно достаточно большие файлы без no_std.

Конечно, компилятор Rust не единственный, можно и Emscripten, но он тоже добавляет свой рантайм, а функциональность будет намного хуже чем в Rust. Впрочем, к самому проекту это отношения не имеет, это отдельная история, и можно рассмотреть те же v-lang, nim и т.п. Дополнительно остается, конечно, вопрос производительности, но этим я буду заниматься в рамках других проектов. Еще раз спасибо за ссылку, при всех сомнениях wasm3 все-равно остается хорошим кандидатом для встраивания.

Спасибо за ссылку, действительно интересный проект. Судя по всему, он удовлетворяет нас по всем требованиям, и есть возможность биндинга нативных функций, пусть даже еще не задокументированная (https://github.com/wasm3/wasm3/pull/71). Насчет прода я не особо переживаю, если проект стоящий, то можно найти ресурсы или спонсоров, чтобы его допилили.


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

Добавил Python (с примером использования Cython: https://gitlab.com/nuald-grp/embedded-langs-footprint#user-content-using-cython ) и MicroPython. Как я и предполагал, Python достаточно тяжелый (и тестовая программа даже не включала всю стандартную библиотеку, а только базовый необходимый набор).


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

Мы поддерживаем компиляцию в WASM, но внедрение его VM — это совершенная другая история. Мы рассматривали это, но не подошло, в частности из-за того, что не нашли подходящую под наши требования VM. Все, что мы нашли, были реализованы:


  • как надстройка к node.js -> V8. Слишком тяжелый рантайм, плюс сборка V8 — это отдельное приключение (возможно, Blink собирается проще, но все-равно тяжеловесный);
  • на Go (например, https://github.com/perlin-network/life). Go добавляет свой собственный рантайм, плюс может иметь проблемы с биткодом (https://github.com/golang/go/issues/22395 — возможно, это решено сейчас, но зная Apple, они могут это сломать в любой момент)
  • на Rust (например, https://github.com/bytecodealliance/wasmtime). Проблем с рантаймом нет, но зато есть с биткодом (https://github.com/rust-lang/rust/issues/35968)
  • компилируют на ходу (например, https://github.com/WAVM/WAVM). Включают очень тяжелый LLVM.

К сожалению, мы не нашли реализацию на чистом C/C++, но если вы знаете какую-либо, дайте знать пожалуйста.

tcc уже несколько лет как фактически заморожен, т.к. его автор больше над ним не работает (https://bellard.org/tcc/):


[Note: I am no longer working on TCC. Check the mailing list to get up to date information.]

Плюс он компилирует в машинный код, что нам не особо подходит (например, не будет работать в WASM VM).

GPL-лицензия, не подходит для коммерческого использования.

Object Pascal не является таким переносимым, как Си — например, так просто скомпилировать его в WASM, или для микроконтроллеров (как вышеупомяный stm32) вряд ли получится (даже если решения есть, они не такие распространенные, и могут иметь проблемы).

Думаю, лучше привести примеры кода (JS):


function f1() {}
function f2() {}

Можно объединить без разделителей (а ";" в выражениях и так нужна, хотя она и опциональная): function f1() {}function f2() {}
В Scheme/Lisp вообще нет разделителей:


(define a 1)
(define b 1)

Объединяются в одну строку: (define a 1)(define b 1)


Так что все зависит от ЯП.

Information

Rating
Does not participate
Location
New Jersey, США
Date of birth
Registered
Activity