четверг, 28 августа 2025 г.

Собес с Ростелекомом

Собес с Ростелекомом

yurembo

 

На прошлой неделе у меня было собеседование с компанией Ростелеком на позицию C++-программиста в отдел передачи видеоданных. Со мной беседовал только один человечек посредством Яндекс.Телемоста, и после моего рассказа о себе любимом было только две вполне простые задачки.

 

В первой задачке надо было улучшить код в многопоточном приложении отправитель/получатель. Код для нее по памяти мне писать лень, поэтому я расскажу только о своих предложениях по улучшению, которые вспомню. Во-первых, я бы заменил класс потоков с std::thread на std::jthread. Главное преимущество последнего — это остановка потока в любое время, не дожидаясь завершения выполнения алгоритма, к нему привязанного.

 

Поток-получатель находится в бесконечном цикле, беспрерывно проверяя содержимое дека. Дек оставим в покое, хотя в данном случае можно было бы использовать стек. Тем не менее мне не нравится бесконечный цикл. Он имеет смысл только в играх, при бесконечной перерисовке экрана. Всё. А в случае рассматриваемого приложения можно воспользоваться сокетами, чтобы не гонять бесконечный цикл.

 

Вторая задачка: объяснить, что делает, и улучшить код класса, содержащий два указателя на строки. Ненавижу строки C. Первым делом их надо заменить строками класса std::string. От этого упростится деструктор, который написан тоже не верно: delete[] c. Квадратные скобки не нужны, так как в конструкторе создается простой указатель. Если оставить как есть и создать объект этого класса, то при его разрушении возникнет неопределенное поведение. В остальном класс содержит конструкторы копирования и перемещения, которые используются для копирования и перемещения объектов, включающих две строки. Ну, как бы всё. Комментировать здесь больше нечего.

 

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

Собес с Ядром

Собес с Ядром

yurembo

 

На этой неделе у меня был собес с Ядром на позицию C/C++-программиста в отдел разработки операционных систем (отдел деградации Linux). В последние годы эта компания, образованная под влиянием первых санкций в 2014-м году, стала лидером рынка IT в РФ, благодаря перекрытию общения с внешним миром и запрету на использование заграничного ПО в государственном секторе. Лидерами в отрасли на российском рынке являются четыре компании: Ядро, VK, Ростелеком, Яндекс. Остальные — более мелкие или не совсем российские, например, Касперский. Но речь не об этом.

 

О собесе. Он проходил посредством Контур Толк — аналог Google Meet. Со мной на связь вышли три человека. Расписание собеса было вполне обычным, ничего нового. Сначала один из группы собеседующих рассказал про компанию, и чем она занимается. Оказалось, что они готовят операционные системы для десктопов (на основе Linux) и мобильников (на основе Android), которые будут использоваться в гос. учреждениях. Для продажи/использования среди прочего населения продукты не предназначены.

 

После этого я рассказал о своем опыте, чем по жизни занимаюсь. Далее, пошли вопросы про C/C++ вперемешку. Меня удивило отсутствие вопросов про построение операционных систем (ведь меня нанимают их разработчиком), про ядерный/пользовательский режимы, планирование процессора, работу с памятью и тому подобное. Зато меня огорчили вопросы про арифметику указателей в C. Нафига писать сложно, если можно писать код проще и понятнее, не выдумывая, как усложнить жизнь человеку, читающему твой код?

 

Под конец собеса были две практические задачки. Первую из них я решил правильно, вторую – нет. После собеса я проверил решение, отправил правильный вариант, да только после драки кулаками не машут. А, вообще, во время собеса задачки надо было решать в уме, проверять компилятором было запрещено. И это зря. Я ведь, устраиваюсь программистом, чтобы писать код, транслируемый компилятором, а не чтобы компилировать его в уме.

 

Я запомнил эти задачки и предлагаю их разобрать:

 

1) Дан следующий код: 


        int main()

{

    std::cout << "name is";

}


Надо дополнить его так, чтобы на экран выводилась строка: «My name is Yuriy», не внося изменений в функцию main.

 

Мне пришлось подумать над решением этой задачки. Можно создать два класса: в конструкторе первого вывести «My », в деструкторе второго вывести « Yuriy». В итоге получилась следующая программа:

 

#include <iostream>

 

class CBegin {

    public:

        CBegin(){

            std::cout << "My ";

        }

};

 

class CEnd {

    public:

        ~CEnd() {

            std::cout << " Yuriy";

        }

};

 

CBegin b;

CEnd e;

 

int main()

{

    std::cout << "name is";

}

 

Её вывод:




2) Вторая задачка выглядела так. Дан код:

 

#include <stdio.h>

 

int main()

{

char a[] = "11111111";

*((int*)a + 1) = 0;

printf("%s", a);

}

 

Вопрос: что выведет оператор printf?

Ответ: оператор printf выведет «1111».



Пояснения. Массив char a[] состоит из восьми элементов, следовательно занимает восемь байтов. В результате преобразования: *((int*)a + 1) получается указатель на второй элемент массива элементов типа int. И ему присваивается 0. Как мы знаем, значение типа int в памяти занимает четыре байта. Значит обнуляются четыре байта. В итоге содержимое массива a будет выглядеть так: «11110000». Но в терминал будут выведены только единицы, поскольку 0 типа char считается символом конца строки, и по умолчанию, достигнув такого символа, терминал прекращает вывод.

 

Будет новый собес, будут новые задачки! Всем пока!

четверг, 14 августа 2025 г.

Собес с G5 Entertainment

Собес с G5 Entertainment

yurembo

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


Итак, в июле я прошел собес на позицию C++-программиста в компании G5 Entertainment. Интервьюрер пообещал отчет. Жду неделю, две. Эйчарка не отвечает в Телеграмме. Нашел ее емайл. Отправил письмо. Она: «Наш специалист был на больничном. В ближайшее время составит отчет, отправит.»


Через несколько дней приходит письмо со стандартными фразочками. Я говорю: «И это все, на что он способен?» Проходит еще несколько дней. И в отчете: «Вы неправильно рассказали про ключевое слово override». Я тут же на эмоциях отвечаю: "Ваш специалист никчемный болтун и пиздабол".


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


Меня больше всего пугает, что «специалисты» этой компании не вдупляют, что это слово необязательное.


По пунктам расскажу об их претензиях, и какие еще ошибки они мне нарисовали:

1) возникли сложности с описанием действия модификаторов доступа при наследовании (по умолчанию);

a) Я ему подробно описал действия модификаторов доступа. Только забыл их использование по умолчанию при наследовании. Потому что всегда задаю их явно. Чтобы читающему мой код было удобнее сопровождать.


2) определение статического метода не удалось сформулировать сразу;

a) На этот вопрос я ответил не сразу. Понадобилось несколько секунд, чтобы вспомнить. Но ответил-то я правильно. Потому что цитирую Мэйерса.


3) вопрос по работе с константными и неконстантными методами вызвал затруднения;

a) Чушь! Я сразу ответил на этот вопрос! Со всеми пояснениями. Отвечая на такие вопросы, цитирую Скотта Мэйерса. Современное поколение программистов его не читает? Это же не устаревающая истина! Скотт Мэйерс, кстати, у меня в переписке. Душевный человек.


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

a) Чушь! Не было никаких трудностей! Я сразу ответил на этот вопрос. Также упомянул стандарт языка, в котором это слово было введено. Более подробно этот необоснованный наезд рассмотрен выше.


Кроме того были вопросы:

1) Как выкинуть исключение?

a) На что я ответил: с помощью throw.


2) Как убрать константный признак?

a) Я ответил: есть ключевое слово mutable.

        b) Я считаю, что если надо нарушать константнось, то всё это неправильно спроектировано. Гнать в шею надо тех, кто это задумал. Очень близорукое видение проекта.

c) Еще для удаления константности значения можно использовать шаблонную функцию std::remove_const, появившуюся в C++11. Но об этом на собесе я не сказал, так как интервьюрера устроило слово mutable.


3) Какие инструменты вы используете для оптимизации работы с кодом?

a) Об этом можно целую статью написать, какие я использую инструменты для оптимизации работы с кодом. На собесе я остановился на двух плагинах для Visual Studio: Visual Assist и Deleaker.


Кого они пытаются нанять? Таких же дураков, как сами?

От этого становится понятным застой, а местами регресс в области современного программного обеспечения.

Гнать в шею надо этих недоумков! 


Время игр

Книга Андрея Подшибякина «Время игр»

Yurembo von Yazev

Наконец-то моё внимание дошло до этой книги. Она была издана в 2020-м году издательством «Эксмо», так сказать, в мирное время: до пандемии Covid-19 и мировых конфликтов. И автор, говоря: «Русские игры», — подразумевал игры, созданные в республиках бывшего Советского Союза, будучи уверенным, что никого не оскорбит и не обидит своими словами.

 

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

 

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

 

В книге в подробностях рассматриваются процессы разработки следующего списка игр:

  1. Parkan

  2. Вангеры

  3. Дальнобойщик, Дальнобойщики 2, Дальнобойщики 3: Покорение Америки

  4. Аллоды: Печать тайны

  5. Корсары: проклятие далеких морей, Корсары II: Пираты карибского моря

  6. ИЛ-2: Штурмовик

  7. Операция Silent Storm

  8. Периметр

  9. S.T.A.L.K.E.R.: Тень Чернобыля, S.T.A.L.K.E.R.: Чистое небо

  10. Cut the Rope

  11. World of Tanks

  12. Всеслав Чародей

  13. Приключения капитана Блада, Axle Rage / Rage Rider

  14. Солнце

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

 

Судя по годам выхода указанных игр, «золотой век» русских игр по мнению Андрея Подшибякина начался в середине 90-х и закончился в 2010-м году. С началом этого периода я согласен, однако, по-моему, конец наступил раньше, чем описывает Андрей. После Сталкера по-настоящему «русских игр» не было. Изменилась технология доставки и потребления контента. Вместе с ней закончилась и эпоха русских игр. Для меня настоящие игры – это синглплеерные игры, которые устанавливаешь на свой компьютер / консоль и играешь в одиночку без сетевых друзей и врагов, без донатов и платежей. Между тем на протяжении своей карьеры мне больше доводилось работать над многопользовательскими онлайн проектами, поскольку моя карьера началась уже на исходе «золотого века».

 

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

 

В следствии этого, из приведенного в книге списка можно с уверенностью исключить World of Tanks – многопользовательскую онлайн игру и Cut the Rope – мобильную игру, потому что они по определению не попадают в «золотой век».

 

Между тем, хотелось бы продолжения рассказа о «золотом веке» русских игр. Ведь, попавшими в книгу тайтлами, список игр «золотого века» не ограничивается. В список, к сожалению, не попали Ex Machina от Targem Games, Мор Утопия от Ice-Pick Lodge и многие другие.

 

Об авторе. На момент написания книги (2019-й год) Андрей Подшибякин являлся креативным директором компании Xsolla. В прошлом он был редактором многих периодических изданий, в том числе, на рубеже веков такого знакового игрового журнала, как Game.exe. В книжных интернет-магазинах я иногда встречаю полноформатные художественные книги Андрея.

среда, 13 августа 2025 г.

Мега-велозагон до деревни Казаево II

Мега-велозагон до деревни Казаево II

Осмотр территорий Чусовского района

Юрий «yurembo» Язев
независимый игродел

Этим велозагоном я повторил путешествие трехлетней давности (https://yazevsoft.blogspot.com/2022/09/yurembo.html). Поэтому подробно описывать окружение не буду. Ничего по-большому счету не изменилось. Новых зданий на пройденном пути не появилось, новых магазинов не открылось. Ещё бы, — деревня.


г. Чусовой, Аллея молодежи

Между тем в этот раз у природы было другое настроение. Три года назад во время поездки, по-сути, была уже ранняя осень. Листва на деревьях желтела, на полях лежали стога сена. Температура воздуха была комфортной 12*. В этот же раз — разгар лета – последний день второго летнего месяца. На улице жара — 26*, вместе с тем облачное небо немного сглаживало зной. На полях вовсю зеленеют посаженные культуры.

 

Стартанул, как обычно, с Красного поселка. В этот раз не стал объезжать по Северному коридору, рванул напрямую под гору — одно из немногих мест, где можно разогнаться до 60 с копейками км/ч, через Лисики до отворота с пермской дороги на деревню Саламатово. Сделал остановку. Передохнул. Поехал в гору по брусчатке. После подъема и поворота направо следует относительно прямая дорога с небольшими спусками и подъемами. Так как на этом отрезке скорость уже значительная: 15 км/ч — по прямой, 30 км/ч – под горку и 7 км/ч — в горку, от брусчатки в руках ощущается каждый камень. Что заставило меня настроить переднюю вилку помягче.

 

Далее следует пологий, но прогрессирующий в крутизну спуск к отвороту на Саламатово.


После контр-поворота от Саламатово идет ровная дорога, без спусков и подъемов, простирается равнина множество километров.

За следующим поворот, двигаясь вдоль берега реки Чусовой по улицу Береговой, я въезжаю в село Верхнее Калино.

Дорога пролегает по краю села, поэтому я решил заехать внутрь него, посмотреть что в там имеется. Фоток в нем не сделал, но впечатлился. На въезде находятся два магазина. Чуть поодаль справа большой Дом культуры, который приютил множество других организаций: сельская администрация, почта России, Сбербанк. Напротив — слева находится детский сад. Чуть дальше – Верхнекалинская школа.


Рядом с ней стоит желтый автобус для сбора детей на уроки и развоза обратно по ближайшим деревенькам. Эта переулочная асфальтированная дорога, по которой я двигаюсь, разделяет деревню на две почти равные части. Она пролегает дальше, справа вразумительная дорога отсутствует, слева — улица Гагарина тоже асфальтирована. Еду вперед. Дорога поворачивает налево и делает обход вокруг аккуратного скопления не менее аккуратных одноэтажных каменных домиков. Этот порядок радует глаз. На расстоянии нескольких десятков метров старушка ругает свою корову, хлыщит ее кнутом. Вернувшись по улице Гагарина на проселочную дорогу, я поехал на улицу Береговою – вон из Верхнего Калино.

 

Повернув на запад, через некоторое время я въехал в деревню Мичурино.



После Мичурино почти сразу следует совсем небольшая деревня Нижнее Калино в сравнении с Верхним.

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

yurembo

Наконец, я добрался до деревни Казаево.

 

Я взглянул на часы: нахожусь в пути уже два с половиной часа. Прикинув, что обратный путь однозначно займет больше времени, решил: пора возвращаться. И покрутил педали в обратном направлении.

 

Уже во второй раз деревня Казаево становится промежуточным финишем моего пути. Охота проехать дольше, но потом как-то домой надо возвращаться.

 

На обратном пути сначала крутил педали бодро, но, доехав до Мичурино силы уже начали кончаться, поэтому впоследствии приходилось часто делать остановки для отдыха. Временные промежутки стоянок тоже увеличились.

 

Возле отворота на Саламатово сделал фото Чусовской безмятежности. Пейзаж, запечатленный на фото, похож на фоновую картинку Windows XP.

Чусовская безмятежность

Преодолев подъем от Саламотово, сделал привал на автобусной остановке.

На этом месте у меня закончилась питьевая вода во фляжке. Тем не менее расстояние до дома было еще приличным. Ближайший магазин — на вьезде в город, в начале Лисиков. А оттуда уже рукой до дома подать. На самом деле, нет.

 

Продолжая свой путь дальше по спускам и подъемам, я задумался об устройстве трансмиссии велосипеда. По очень скромной оценке существуют два вида переключения скоростей на велосипеде, которые были у меня, по крайней мере. На моем первом горном велосипеде в системе (передняя звездочка) было три звездочки, а в кассете (задняя звездочка) было восемь звездочек. Что в общем количестве составляет 24 скорости. Несколько лет спустя, я купил новый горный велосипед, так как первый начал приходить в негодность: механизм переключения скоростей стал плохо работать и в краевые состояния перестал переключать. Под веянием современных трендов я купил велосипед с одной звездочкой в системе и восемью — в кассете.

 

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

 

Я много думал об этом: может, старею? И это тоже. Но очевидно, при большем количестве звездочек, большая комбинация скоростей, из которых можно подобрать подходящую для разных подъемов.

 

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

 

После моста через Усьву я проехал по улице Южной, далее поднялся ко Дворцу Культуры и расположился на лавочке у фонтанчика.

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

 

Итого. Велозагон у меня занял приблизительно шесть часов и составил 44 км. Самым трудным отрезком стала заключительная часть пути: подъем с улицы Южной ко Дворцу и подъем от электростанции на Красный поселок.