Не ходите в околотелеком

Вот уже третий день в твиттере срутся по поводу треда про тестовые задания в Nokia:

https://twitter.com/st_1ena/status/1419689924505260032

Особенно многих удивила озвученная там зарплата (в 2018 году) — предлагали 120 тысяч рублей в месяц. Народ поделился примерно на два лагеря — первые считают, что задания простые, решит любой студент, и с чего бы это студенту платить больше? Вторые — в основном это успешные фронтендеры, у которых единицей измерения зарплаты служит «1 козуля» (вроде бы 300 тысяч рублей в месяц) считают задачи адски сложными, критерии оценки дикими, ну а озвученную зарплату нищенской. Срутся уже три дня, смотреть на это весело.

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

Спойлер — основано на личном опыте ощупывания большого телекомовского слона, к Нокии отношения не имеет, YMMV.

Для начала вспомним модель OSI, которая, как всем известно, не существует. Когда ее упрощают до четырехслойной — то руководствуются простой логикой, все, что ниже IP (то бишь сетевого уровня) — это херня какая-то, проводочки, не заслуживающие внимания. На самом деле там адов зоопарк, от «понятных» и привычных проводного Ethernet и живущего в вашем роутере WiFi до всякой редкой хтони типа 6LoWPAN. Это, кстати, два разных уровня — упрощенно их можно обозвать MAC (medium access control) и PHY (physical); стандарт Ethernet описывает, грубо, один вариант MAC поверх нескольких PHY, WiFi — несколько связок MAC+PHY, 6LoWPAN — один LLC и MAC поверх полутора десятков PHY из IEEE 802.15.4 и даже Bluetooth. PHY — это отдельная песня, а мы сейчас посмотрим на уровень MAC. Издеваться над людьми я не хочу, так что в качестве учебного протокола уровня MAC в современной беспроводной сети возьмем LoRaWAN.

Ну я думаю, вы все ознакомились со стандартом LoRaWAN? Он небольшой, всего-то сотня страничек — так что давайте продолжим. Стандарт — это хорошо, это надежно, можно (теоретически) набрать толпу программистов и начать делать оборудование под этот стандарт. Потом, правда, возникнут вопросы — например, очевидный: LoRa (физический уровень) поддерживает несколько скоростей передачи данных. В LoRaWAN есть механизм ADR, Automatic data rate, с помощью которого сетевой сервер может назначить конечному устройству какую-то скорость.

Вопрос попроще: а как бы нам эту скорость определить правильно? Побольше? Проиграем в дальности (а LoRa — это Long Range, что намекает). Поменьше? Начнутся коллизии при передаче, проиграем в емкости сети (это сколько устройств можно повесить на одну «точку доступа»). Стандарт этот вопрос почти никак не комментирует, предлагая всегда использовать наибольшую скорость из возможных (определяя ее по SNR, например). Но у модуляции LoRa есть очень интересное свойство — передача данных с использованием разных data rate ортогональна. Это значит, что если одно устройство передает данные, допустим, с DR5, а другое — с DR4 — то шлюз примет данные от обоих! И возникает вопрос посложнее — а как назначать data rate устройствам, чтобы максимально использовать вот этот бесплатный бонус?

Уже звучат вопросы — так какие же задачи придется решать после того зверского собеседования в Нокию? Нет, не такие. Вопрос на самом деле уже решен — немного в другой постановке, но идея довольно понятна (если вы осилите 20 страниц настоящего «матана«). Ноучная ноука в виде Евгения Хорова из ИППИ РАН с соавторами понаписала формул, порисовала графиков — и с точки зрения науки, все хорошо, план по публикациям выполнен, можно спать спокойно.

На самом деле между такого рода «академической» наукой и программистами у любого более-менее крупного вендора есть еще прослойка в виде толпы математиков-алгоритмистов (я тут осознанно упрощаю реальное взаимодействие между всеми заинтересованными сторонами — это не так важно), которые должны выцеплять вот такие хорошие идеи, независимо их проверять и дальше передавать программистам. Разумеется, не все так безоблачно — 95% публикаций будет полным говном, неприменимым в реальной жизни — но в принципе, на то эти математики и нужны, чтобы склепать из оставшихся 5% что-то теоретически удобоваримое. «Удобоваримое» — это еще оптимистично, математики на выходе генерят обычно псевдо- или говнокод на ебучих языках типа питона или матлаба; могут выдать полный пиздец на том, что им кажется C++, или просто на отъебись хуйнуть блок-схему:

Не правда ли, все просто и понятно? Попизжено, кстати, вот отсюда: https://arxiv.org/pdf/2010.08860.pdf, это тоже творчество Хорова сотоварищи, но довольно близко к тому, что попадет в руки программистам.

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

Мне так жалко программиста стало, что пойду за пивком схожу.

Пока я за пивком еще не пошел — пизданул тут на днях, что сетевой сервер LoRaWAN можно утоптать ногами в жирный микроконтроллер (хотя таких прецедентов я не знаю) — и мне похуй, спизданул и спизданул, а для руководителя вашего проекта это стало руководством к действию!

Я вернулся, принял пивка, продолжим.

Что проверяют те нокиевские задания и что мы увидим в нашем проекте охуительного сетевого сервера LoRaWAN по цене простого тупого шлюза? Да собственно все то же самое — манипуляции с битиками? Открываем стандарт и смотрим на любой заголовок MAC-уровня. Манипуляции с самописной реализацией половины коллекций из stdlib? Этого в эмбеде полно, кушайте, не обляпайтесь. Если хотите рассказать, как вам в жизни помогает знание std::list — посмотрите на любое scatter-gather DMA и представьте, что это очередь пакетов, которые будут запихиваться в радиомодем «по готовности». Нет, вы не обернете её в привычный список — а манипулировать очередью надо! Что еще? Задачи с неясной изначально постановкой, про которые надо либо спросить, либо додумать? И этого тут предостаточно, посмотрите хотя бы на это произведение математического мозга:

Ученый (в говне моченый) написал «Sort groups by $PLR_g^{QoS}$» (да, именно так и написал) — а ты теперь сам думай, в какую структуру обернуть эти «группы» и как после этого их эффективно отсортировать. Ах да, учоные на словах еще сообщили, что лучше всего этот алгоритм выполнять «как можно чаще» :)

Математиков этот вопрос не волнует — они готовы даже показать симуляционную модель, где сортируют std::list<std::map<std::string, std::list<SomeShit>>> — в типичном случае эта штука займет всю доступную память в вашем устройстве.

И это, считайте, вам еще повезло — потому что ваш коллега вынужден реализовывать сок мозга другого математика, который молодец, читал Кормена и даже может там ткнуть пальцем в алгоритм Хопкрофта-Карпа (поиск паросочетания в двудольном графе). Вы даже можете найти эту штуку в википедии, но она вам не поможет — это еще более ебаный псевдокод, чем напечатан у Кормена. Что вы там говорили по поводу «адаптации алгоритмов, которые сто раз уже реализованы»?

Ну и да, не забываем, что все эти красивости происходят на микроконтроллере, пусть и жирном, с целым МЕГАБАЙТОМ оперативной памяти — а вам надо будет еще упихнуть туда целый TCP/IP стек, возможно, даже готовый — что-то вроде lwIP, но даже от этого не легче. Остается утешать себя тем, что вам досталась простая и понятная вещь — потому что старый стандарт того же WiFi, 802.11-2012 — это 2800 страниц, вот такая упаковка бумаги и еще полпачки:

Я кончил и закурил.

Надо бы небольшой срач устроить

А то меня программисты читают, в том числе эмбеддеры :)

Вопрос: можно ли так писать, или надо обязательно написать еще и

#define VERY_MAGIC_BOOTLOADER_CONSTANT 0xB00710AD,

и почему?

08-remove-kebab.patch

10-14 строчки прямо отличные:

https://salsa.debian.org/debian/wxhexeditor/-/blob/master/debian/patches/08-remove-debug.patch#L10

А можно ли патч переименовать из remove debug в remove kebab?

Читал и ржал

https://www.cnews.ru/news/top/2021-04-20_nazvany_samye_neobychnye

Прямо даже не знаю, что смешнее — «редкий и необычный» программист микроконтроллеров или «московская компания» Ventra.

Кстати, про персональные компьютеры в СССР

Пролистал тут «каталог» Еськова на lib.ru и в «Дежавю» наткнулся практически на недавно пришедшую в голову мысль:

— Это не телескрин… в смысле — не телевизор, — рассеянно откликнулась она. — Это компутер.
— Как-как?
— Ну, то что у нас в Союзе называют «индивидуальными ЭВМ»…
— Ух ты! И чего она умеет?
— Да в общем-то, по большому счету, это просто пишущая машинка с памятью: можно набрать текст, выправить ошибки, отредактировать… Использовать в следующих работах фрагменты предыдущих… В общем, клей и ножницы…
— Понятно… — разочарование было острым и сильным. — А расчеты на нем проводить можно? Хотя бы простенькие — ну, там кластерный анализ, метод главных компонент?..
— В принципе, можно — но у меня нет таких программ. Если хочешь, я могу их заказать, поставим… Только мне нужны точные названия.
Названий он не знал — откуда?
— Ну вот, и я не знаю. Мне тут, дома, нужды особой нет — эти гробы в нашем ВЦ работают, в общем, не так уж плохо… Понимаешь, я ведь этой штукой пользуюсь вроде как западный человек автомобилем: знаешь правила движения и где газ с тормозом, а чего у него внутри — не твоего ума дело, на это механики есть… Да кстати! — оживилась она. — Ты ведь, небось, никогда не видал компутерной игры? Хочешь поглядеть?
Он ошеломленно воззрился на нее, невольно покосившись на книжную полку: Набоков с Бродским — и электронные бирюльки… Сочетаньеце…
— Однажды видел. И, честно сказать, решил, что это занятие для умственно отсталых детишек.

Там, конечно, описывается альтернативная реальность несколько похуже «обычного» СССР, но вот этот момент показан верно — как объяснить обычному советскому человеку, зачем ему может быть нужен персональный компьютер? Герой рассказа — научный работник, и ему хотя бы интересны «расчеты» — кластерный анализ и метод главных компонент, а вот в остальном — что можно предложить? Пишущую машинку и игрушки для умственно отсталых детей? И все это за сумму, кратно превосходящую среднюю зарплату (БК-0010 или 0011 стоил 600 рублей, при том, что зарплата инженера редко когда превосходила 200 рублей)? Советская «компьютерная пресса» конца 80-х (от «Юного техника» и «Радио» до «Науки и жизни») могла предложить лишь уроки Бейсика и «типа технические» материалы в духе «как расширить память на «Радио-86»» — тем самым лишь утверждая мнение о том, что «персоналки» — это лишь дорогие игрушки для юных и не очень техников.

А что в то же время — или даже чуть раньше — творилось на Западе? Достаточно посмотреть хотя бы рекламу конца 70-х:

Или середины 80-х:

Отец семейства смотрит с умным видом на графики с надписью STOCKS, заодно показана в явном виде оплата каких-то чеков — ну и не стоит забывать, что killer app для того же Apple II стала система электронных таблиц — что VisiCalc, что Lotus 1-2-3 решали вполне себе насущные проблемы американского middle class — заполнение налоговых деклараций, например.

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

Что-то я месяц ничего не пишу

Надо наверстывать упущенное — тем более, что много всякой хуйни в последнее время всячески бесило.

Вот сегодня, например, увидел в твиторе такую картинку с подписью «A nice illustration of TCP/IP vs the outdated yet still referenced OSI model»:

Что меня в ней бесит, как и во всех рассказках об «устаревшей модели OSI»? Да дело в том, что «четырехслойная» модель справа была актуальна этак в 1990 году — ну ладно, может, в 2000, да и то уже с натяжками. Да, удобно, рассуждая о протоколах TCP и IP, выделить два уровня — транспортный и сетевой, а все что выше и ниже — объявить не заслуживающей внимания ерундой. Но вот давайте представим себе mesh-сеть с 6LoWPAN поверх одного из десятка описанных в стандарте IEEE 802.15.4 последней версии вариантов физического уровня (и давайте не забывать про 6LoWPAN over BLE!), по которой гоняется трафик какого-нибудь модного REST API. «Снизу» Network Access Layer моментально распадется на 6LoWPAN и лежащую под ним «физику» (и кстати, такое произойдет с любым радио, даже с банальным WiFi), а сверху…

Задумайтесь — ведь все эти ваши REST’ы и прочие AJAX’ы используют HTTP (или HTTPS) как протокол, натурально, сеансового уровня; уровень представления — это тот JSON, XML или прочая хуйня, которую вы там гоняете, и ваш модный API — это и есть уровень приложений. В рисунке справа все это заменено одним-единственным уровнем, подписанным «HTTP» — что для 2021 года должно быть уже стыдно, у некоторых в этот HTTP настолько сложные вещи завернуты, что для их описания нужно два-три разных уровня вводить.

И да, если в чем семиуровневая модель устарела — так это в количестве уровней разве что; уверен, что следующее поколение программистов навернет еще пару слоев абстракций.

Столлман — русский агент!

Видели сбор подписей в поддержку rms’а?

https://rms-support-letter.github.io/

А вот кто-то не поленился и посчитал, что в поддержку Столлмана оставлено непропорционально много подписей от белых русских мужчин — никак лично злой Влад Путин Free Software Foundation решил поддержать!

https://mobile.twitter.com/geofflangdale/status/1376313386904940544

Еще один «образовательный» спойлер

Удивляет неспособность людей с «высшим программистским» образованием рассказывать о своей работе в виде, отличающемся от «копали от забора и до обеда с использованием лопаты МПЛ-50». На вопросы вроде «что копали, зачем копали, почему именно МПЛ-50» ответить обычно не могут — или в лучшем случае ссылаются на best practices использования лопаты.

Еблорусики пробивают дно

Если вы считаете российских айтишников моральными уродами, гуманитарными недоучками, и вообще дегенератами, охуевшими от кнопкодавства и красноглазия — зайдите на dev.by и прочитайте, например, вот это:

https://dev.by/news/hr-kak-trudoustroit-ludei

Глубина пробитого в очередной раз дна прямо какая-то невероятная.

С++, язык врагов наших

Очередная небольшая подборка разных видов undefined behaviour:

https://github.com/Nekrolm/ubbook

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

Индийские программисты в своем репертуаре

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

https://phabricator.wikimedia.org/T273741

Весьма вероятно, что код, тыкающийся в эту картинку, был взят тупо со Stack Overflow :)

Про веб-программирование

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

Итак, представьте — проводятся соревнования по ралли-спринту или автослалому, правила довольно простые — каждый из участников проезжает от старта до финиша, судья соревнований записывает где-то показанное участником время и добавляемые к нему дополнительные штрафные очки (например, за сбитые конусы на слаломе — каждый конус равен 5 или 10 секундам). Участники запускаются на трассу в порядке очереди, можно свою попытку пропустить, но в целом количество заездов может быть довольно большим — если не лениться, то можно сделать и десяток попыток. Есть две конфигурации трассы, результатом соревнований является сумма времен лучших попыток на каждой из двух конфигураций, если участник заездов по одной из конфигураций не совершал, то штрафное время равно 15 минутам.

Участников довольно много (порой несколько десятков), поэтому вывешивать бумажную «простыню» совершенно непрактично. Для того, чтобы показывать регулярно обновляемые результаты, решено было сделать сайт, где выводилось бы табло результатов — желательно довольно быстро обновляемое.

В общем, я думаю, что все, дочитавшие до этого места, уже решили для себя что-то вроде — херня вопрос! Берем Питон, берем Джангу, с бекендом все вроде бы понятно. «Фронтенд» для участников почти очевиден, надо бы только табличку аккуратно сверстать, а вот судьи в процессе сбора требований что-то не очень хорошо отнеслись к первому прототипу, где предлагалось простенькое поле ввода для времени и штрафных очков, надо бы фронтендера поймать и попросить сделать подобие электронных таблиц. Если учитывать аппетиты некоторых фронтендеров, то стоимость проекта в этот момент перерастает все разумные рамки.

Так вот, все сделано в разы проще, полностью на статическом хостинге. Работа судьи и подсчет результатов происходят в банальном Excel, затем нажатием единственной кнопки таблица результатов выгружается в CSV и по FTP заливается на сайт — где с помощью простого джаваскрипта отображается в «красивом» виде. Просто и почти бесплатно!

Физтеховский курс по Джаве

Вот, кстати, хороший и годный курс по Java:

https://inponomarev.ru/corejava

Читается в МФТИ, видимо, где-то второкурсникам (то есть «общие» понятия программирования вроде ветвлений, циклов и всего такого считаются известными, а Си-подобный синтаксис не вызывает затруднений) — и в целом производит крайне положительное впечатление в сравнении со всяким онлайн-трешем системы «джава для хохлов, кубаноидов и дегенератов в игровой форме«.

Вопрос опытным пользователям этих ваших линуксов

Представьте себе, что коллега, не очень разбирающийся в этих ваших линуксах, спрашивает, какой текстовый редактор использовать в консоли. Что вы посоветуете? vim? emacs? F4 из Midnight Commander? GNU nano? ed? cat > file.txt?

И второй вопрос — как вы отнесетесь к совету «используй ed, он по стандарту есть во всех юниксообразных системах»?

Учимся программировать под ноотропами

Хотя если вам нужна дополнительная стимуляция для того, чтобы осилить детскую книжку Петцольда — может, не надо?

Вышка нинужна

Вот еще один маленький спойлер к планируемой матерной простыни про образование — довольно узкоспециальное, но занятное наблюдение за юными программистами (жизнь свела меня с выпускниками бакалавриата одного в прошлом считавшегося неплохим ВУЗа). «Высшее айтишное» образование у нас, как выясняется, предполагает довольно мало программирования — допустим, курс по «операционным системам» читается в режиме «сухого плавания». Я интереса ради прикинул, сколько строк кода нужно написать, чтобы получить диплом по специальности 09.03.01 «Информатика и вычислительная техника» — получилось даже меньше, чем, скажем, на мехмате (который вовсе не программистов готовит!).

В результате свежий выпускник во многих узкоспециальных вопросах не то что «плавает» — барахтается и тонет. Скажем, представление о многозадачности/многопоточности у многих попросту отсутствует, и выпускник не готов толком ни к работе в «народном хозяйстве» («напиши программку с графическим интерфейсом, выполняющую какие-то расчеты, только чтобы этот интерфейс не тормозил»), ни к продолжению образования и какой-то «научной» деятельности («полистай CSP Book и распиши, используя формальную запись оттуда, как взаимодействуют потоки в этой программе»).

Но студенты же сами не дураки — они прекрасно умеют пользоваться поиском по headhunter и понимают, что с одними только плохими знаниями C и прекрасными навыками тыкания мышкой в LabView их никуда толком не возьмут! На помощь приходит среднеспециальное программистское образование в виде всяких курсов типа «Java с блекджеком и шлюхами», «Петухон за три дня», «Готовим фронтендеров из домохозяек» (и нет, речь идет не о компиляторном фронтенде). В результате весь жизненный опыт начинающего программиста просто кричит о бесполезности высшего образования — и не могу с ними в этом не согласиться, такое образование действительно довольно бессмысленно.

Еще один сложный момент — выпускники экспресс-курсов в интернетах крайне плохо знают «классику Computer science» — и всякие там «проблемы обедающих философов» им вообще незнакомы, а разговор, скажем, об особенностях реализации сортировок вообще выносит мозг (да, вузовскую программу «оптимизировали» настолько, что курсу по алгоритмам и структурам данных места не нашлось). В результате — первокурсник магистратуры в плане знаний по предмету равен примерно второкурснику нормального (идеального?) вуза, на наличие каких-то специальных знаний расчитывать не приходится. Зато о той же многопоточности они могут рассуждать в терминах питоновско-джаваскриптовского async/await — и пожалуй, придется в дальнейшем учитывать такого рода особенности нынешнего айтишного «образования».

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

А вот это прямо огонь

https://habr.com/ru/company/gaijin/blog/533380/

Чуваки скомпилировали под «Эльбрус» вполне себе современные игрушки и они на этом эльбрусе довольно-таки нормально работали.

А вот про американское законодательство немножко

В твиттерном треде мужик рассказывает, что при разводе супруга программиста или супруг программистки (да, давайте использовать феминитивы, это смешно) может потребовать ПАЛАВИНУ от написанного в браке опенсорсного кода:

https://twitter.com/richgel999/status/1335957390869532682

Вот к чему приводит наивное представление об «интеллектуальной собственности«!

И как художник художникам

Хочу поделиться маленькой, но приятной находкой из книжки Питера ван дер Линдена Expert C Programming: Deep C Secrets. Вот такой набор макросов позволяет буквально «рисовать» черно-белые картинки прямо в коде:

#define X )*2+1
#define _ )*2
#define s ((((((((0 /* For building glyphs 8 bits wide */

Например, вот так выглядит символ 8*8 для какого-нибудь знакогенератора:

const uint8_t letter[] = {
/* 0xB8 */
s _ X _ X _ _ _ _,
s _ _ _ _ _ _ _ _,
s _ X X X _ _ _ _,
s X _ _ _ X _ _ _,
s X X X X X _ _ _,
s X _ _ _ _ _ _ _,
s _ X X X _ _ _ _,
s _ _ _ _ _ _ _ _,
};