Продолжаем разговор (начало и продолжение). Сегодня скажу пару-тройку слов о своих впечатлениях от срача на RSDN, довольно характерного для наших русскоязычных интернетиков.
Под катом, т.к. много эмоционального текста.
Размышления и впечатления, которые не хочется держать в себе. О программировании в частности. Ну и о творчестве, и о жизни вообще.
Продолжаем разговор (начало и продолжение). Сегодня скажу пару-тройку слов о своих впечатлениях от срача на RSDN, довольно характерного для наших русскоязычных интернетиков.
Под катом, т.к. много эмоционального текста.
Продолжаем разговор. Сегодня о моем впечатлении от решений автора хабровской статьи (напомню: вот первое, вот второе).
Под катом, т.к. местами матерно.
Сперва была статья на Хабре "Мои собеседования '2021 (C++ developer)", потом один кусочек из нее процитировали на RSDN:
Домашнее задание, написать эффективный TCP-сервер с определенными требованиями. Код должен быть покрыт юнит-тестами. Раньше TCP-сервера писать не приходилось, потратил три дня почти full-time, отослал результат. Ответили что стилистически код понравился, но сервер недостаточно эффективен, в частности имеются лишние копирования данных. Оценил что на исправление замечаний может уйти еще N часов. Забил.
после чего образовался небольшой срач, в который угораздило вляпаться и мне. В какой-то момент туда пришел и автор хабровской статьи, показал написанные им варианты решения тестового задания (номер раз, номер два), после чего озвучил и условие самого тестового задания:
Клиентское приложение устанавливает TCP-соединение и передает строки, разделенные символом перевода строки “\n”.
Сервер должен считать их хеш-суммы (тип суммы — на выбор кандидата) и отправлять их обратно в HEX-виде, также завершая каждую сумму символом перевода строки.
Клиентские запросы должны обрабатываться параллельно, в случае достаточного количества параллельных соединений должны быть загружены все ядра CPU.
Сервер должен работать эффективно — не потреблять лишней памяти и отправлять хэш-суммы по мере их готовности.
Входные строки могут быть неограниченной длины.
Для реализации сетевой части сервера можно использовать любую удобную вам библиотеку из числа стандартных пакетов репозитория Ubuntu 16. Сервер также должен собираться и работать на Ubuntu 16.
На модули приложения должны быть написаны unit-тесты.
Сейчас не буду вдаваться в то, уместно ли в 2021-2022 давать тестовые задания соискателям. Как и не буду говорить про впечатления от RSDN-овского срача. Лучше я этому посвящу отдельный пост.
В этом же посте хочется поговорить именно про само это тестовое задание. Потому что оно мне понравилось. И потому что я слегка прифигел от уровня "решений" автора статьи с Хабра. Так что кому интересны мои пять копеек, то милости прошу под кат.
Где-то с год назад мы открыли разработку под названием arataga. Это был прокси-сервер, который делали под специфические запросы, но который остался невостребованным. Немного о том, что, как и почему можно прочитать в посте годичной давности.
Давеча довелось вспомнить про этот проект. Ну раз довелось, то почему бы и не посвятить этой теме небольшой пост, с картинками :)
Когда открывали arataga в январе 2021-го это был всего лишь работающий прототип, протестировать который под реальной нагрузкой у нас не было возможности.
Но вот в апреле-мае 2021 такая возможность появилась.
Погоняли на реальных серверах по реальными запросами реальных пользователей, посмотрели что к чему. Что-то подшаманили и, местами, стало намного лучше. Так что arataga, по моему мнению, перешел из категории прототипов во вполне себе работающий продукт. Недостаточно проверенный реальной эксплуатацией, к сожалению, но все-таки.
О том, что было сделано в arataga по следам натурных испытаний мы даже рассказали в виде статьи на Хабре. А потом еще и сделали презентацию на тему arataga (вот она на slideshare, а отсюда ее можно взять в PDF). Так что, если кому-то интересно, то можно ознакомиться.
Я же позволю себе в этом посте опубликовать две картинки. Это скриншоты, которые я делал во время испытаний на реальном трафике.
Первая картинка -- это загрузка сервера с работающим старым прокси. Этих прокси там запущено четыре экземпляра. Такая схема была выбрана в процессе сопровождения, поскольку в единственном экземпляре нагрузку держать уже не получалось.
Интересные циферки можно увидеть: в каждом из экземпляров старого прокси работает больше 4K нативных тредов. Это то, к чему приводит использование модели thread-per-connection. Причем это еще слабо нагруженный сервер, доводилось видеть картинки, когда в каждом экземпляре работало более чем по 13K тредов и более...
Вторая картинка -- это загрузка того же сервера, но уже с работающим на нем новым aragata.
Решение открыть arataga до сих пор считаю правильным. Хотя дивидендов нам это пока никаких не принесло.
Тем не менее, пусть лежит в открытом доступе. Отличный пример того, что мы можем делать. И как мы это можем делать. Вдруг когда-то да и стрельнет.
Традиционный отчет о просмотренных в минувшем месяце фильмах и сериалах. Как обычно, в начале списков идут картины, которые понравились мне больше, а в конце то, на что свое время можно и не тратить.
Фильмы
Громкая связь (2018) и Обратная связь (2020). Смотрел эти фильмы в первый раз, один за одним. Отличное кино. "Громкая связь", будучи ремейком итальянского "Идеальные незнакомцы", мне показался более душевным и человечным, чем итальянский первоисточник. "Обратная связь", местами, ощущается чуть скучнее, но местами оказывается более трогательным. Оба фильма рекомендую к просмотру тем, кому нравится творчество "Квартета И".
Черный ящик (Boîte noire, 2021). Интересное кино, мне зашло. Финал, правда, не удивил. Но и не разочаровал.
Охотники за привидениями: Наследники (Ghostbusters: Afterlife, 2021). Мне понравилось. Как показалось, в фильме очень хорошо передан дух оригинальных фильмов из 80-х.
Летчик (2021). Первые 2/3 фильма смотреть было интересно. Оставшаяся треть все испортила. Особенно финальная сцена.
Вальдо (Last Looks, 2021). Какая-то невнятная муть. За сюжетными линиями не уследил, мотивацию героев не понял, что к чему и почему не разобрать. Актерская игра, как мне показалось, присутствует только у Мэла Гибсона, да и тот явно дурачится.
Сериалы
Аркейн (Arcane: League of Legends, 2021, первый сезон). Красиво нарисован. И смотреть интересно, даже если про игру, по мотивам которой сериал сделан, даже и не знаешь ничего. Портит впечатление лишь то, что первый сезон закончился не точкой, и даже не многоточием, а жирной такой запятой, мол, не переключайтесь, все самое интересное еще впереди.
Двойник (Counterpart, 2017, первый сезон). Смотреть было интересно, возможно, главным образом из-за хороших актеров. Несколько подпортило впечатление то, что последние три-четыре серии превратили все происходящее в подобие сопливой мелодрамы. А также то, что большой жирной точки в конце не получилось, всего лишь запятая для того, чтобы заставить посмотреть следующий сезон.
Банши (Banshee, 2013, первый сезон). Отличное кино, кто хочет на время выключить мозги и посмотреть экшОн с кровь-кишки-расп*дорасило и вот этим вот всем. Правда, так и не понял, хочу ли я после всего этого смотреть второй сезон.
Дежурство (Vigil, 2021, первый сезон). Начало выглядело бодро, закончилось же все лютым трешем. Добавлю сюда еще и зачем-то за уши притянутую толерантную повесточку, что еще больше усугубило и так нехорошее впечатление от сериала.
Вне конкурса
Битва при Чосинском водохранилище (Zhang jin hu, 2021). Это качественно сделанная агитка для внутреннего пользования. Как по мне, так достойно уважения: великая страна может позволить себе снимать идеологически правильное кино про знаковые события своей истории. В СССР стоило делать именно такое кино вместо всяких "Гу-Га" и им подобных.
Вчера написал небольшой блог пост с примером собственного стремления использовать const и иммутабельность как можно чаще. А сегодня на Reddit-е обнаружил ссылку на статью "const all the things" от Arthur O'Dwyer. Которая на ту же самую тему. И несколько противоречит моим предпочтениям.
Статья крайне толковая, очень рекомендую к ознакомлению.
Однако, как мне показалось, она написана с точки зрения человека, который пишет новый код. Если же попробовать взглянуть на те же самые аспекты немного с другой стороны, то по двум пунктам я с O'Dwyer-ом не соглашусь.
Чем старше становлюсь и чем больше кода проходит через мои руки, тем больше приверженцем иммутабельности оказываюсь. Чем меньше изменяемых переменных в коде, тем лучше.
При программировании на C++ это выражается в том, что стараюсь по максимуму все объявлять const-ом и делать мелкие вспомогательные функции, которые не содержат внутри себя изменяемых переменных (это нужно для того, чтобы уменьшить количество переменных там, где эти мелкие функции затем вызываются).
Иногда стремление к иммутабельности приобретает странные формы.
Вот сегодня, например, попал на ревью такой код (схематично, к реальности имеет отношение только структура):