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

Собес с Ядром

Собес с Ядром

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 считается символом конца строки, и по умолчанию, достигнув такого символа, терминал прекращает вывод.

 

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

Комментариев нет:

Отправить комментарий