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


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