как собеседуют jr c++ в штатах :)
От: chipsеt Россия http://merlinko.com
Дата: 01.12.07 08:48
Оценка: 10 (1)
Проходил интервью на юниора в http://verdiem.com. Собеседовали долго. Длинная сессия (4 часа) в понедельник и коротенькая в пятницу (сегодня).

Было пять человек и пять вопросов от каждого:

Понедельник
1. Обьяснить как мультипоточность поможет в создании интернет-краулера. Есть грубо говоря три функции
StorePage
ParsePage
DownloadPage

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

2. Найти проблему в

class A {};
class B : public A {};
class C : public A {};

class D 
{
private:
A *ptr;

public:

};


и решить её.
Тупил первые 10 минут потом мне интервьювер дал пинок и я после повторного осмотра быстренько написал правильный ответ с использованием виртуального clone.

3. Написать алгоритм нахождения самого большого числа меньше чем некий X в правильном бинарном дереве. Легко

Пятница

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

Легко но нудно ибо на доске и фломастером блин.

5. Развернуть linked list. АА!!! я с испугу принял linked list за doubly linked list и написал...

template<typename Data> 
class element
{
public:
element<Data> *prev;
element<Data> *next;
Data _data;
};


... чем эффектно выпендрился юзая шаблоны :\ Однако написать prev в llist это позор

После назидательного "но-но" со стороны дяденьки я удалил к чертовым бабушкам prev и вспех написал на доске фломастером что-то типо такого:

void reverse(element *head)
{
element *curcopy;
element *temp;
element *headcopy = head;
curcopy = head; head->next = NULL; 
while(curcopy)
{
//забыл
}

//забыл и не буду вспоминать ибо это решение ужасное и рекурсия рулит

}


и вроде все правильно.

Очень сложно было то что заставляли писать маркером на доске. У меня почерк ужасный и поэтому тяжело было "дебаггить".

А в целом понравилось. Первое интервью такого масштаба
... << RSDN@Home 1.2.0 alpha rev. 784>>
"Всё что не убивает нас, делает нас сильнее..."
Re: как собеседуют jr c++ в штатах :)
От: dotidot Россия  
Дата: 01.12.07 11:12
Оценка:
Здравствуйте, chipsеt, Вы писали:

C>2. Найти проблему в

C>
C>class A {};
C>class B : public A {};
C>class C : public A {};

C>class D 
C>{
C>private:
C>A *ptr;

C>public:

C>};
C>

C>и решить её.
C>Тупил первые 10 минут потом мне интервьювер дал пинок и я после повторного осмотра быстренько написал правильный ответ с использованием виртуального clone.

что за клон? что за проблема? при копировании Д указатель у копии будет указывать туда же куда и у оригинала? так деструктора вообще нету — т.е. почему бы и нет? ptr всё равно никогда не инициализируется, т.е. на объекты не будет указывать
я здесь не вижу никаких проблем, классы A,B,C — вообще пустые, какие тут проблемы? В отсутствии смысла?

Вы либо чего то не договариваете, либо сакральное знание "проблемы" таковым на самом деле не является.
Re: как собеседуют jr c++ в штатах :)
От: dotidot Россия  
Дата: 01.12.07 11:19
Оценка:
Здравствуйте, chipsеt, Вы писали:

C>
C>void reverse(element *head)
C>{
C>element *curcopy;
C>element *temp;
C>element *headcopy = head;
C>curcopy = head; head->next = NULL; 
C>while(curcopy)
C>{
C>//забыл
C>}

C>//забыл и не буду вспоминать ибо это решение ужасное и рекурсия рулит

C>}
C>

рекурсия не рулит, если список длинный(а предполагать обратное без веских обоснований по моему не логично), поскольку стек не резиновый.
Тем более, что если память не изменяет есть способ развернуть его вообще с константными требованиями по памяти.
Re[2]: как собеседуют jr c++ в штатах :)
От: dotidot Россия  
Дата: 01.12.07 11:54
Оценка:
D>Здравствуйте, chipsеt, Вы писали:
наверное от вас ждали что-то вроде

#include <stdio.h>

struct Node
{
  int data;
  Node* next;
};

Node* reverseList(Node* l)
{
  Node* s = 0;
  while (l)
    {
      Node* n = l->next;
      l->next = s;
      s = l;
      l = n;
    }
  return s;
}

Node* makeList(int n)
{
  if (n < 1)
    return 0;
  n--;
  Node* l = new Node;
  Node* start = l;
  for (int ii = 0; ii < n; ii++)
    {
      l->data = ii;
      l->next = new Node;
      l = l->next;
    }
  l->data = n;
  l->next = 0;
  return start;
}

void deleteList(Node* l)
{
  while (l)
    {
      Node* p = l;
      l = l->next;
      delete p;
    }
}

void printList(Node* l)
{
  while (l)
    {
      printf("%d, ", l->data);
      l = l->next;
    }
  printf("\n");
}


int main()
{
  for (int ii = 0; ii < 6; ii++)
    {
      printf("Test %d:\n", ii);
      Node* l = makeList(ii);
      printList(l);
      l = reverseList(l);
      printList(l);
      deleteList(l);
    }
  return 0;
}
Re[3]: как собеседуют jr c++ в штатах :)
От: dip_2000 Россия  
Дата: 01.12.07 17:48
Оценка: +1
Здравствуйте, dotidot, Вы писали:

D>>Здравствуйте, chipsеt, Вы писали:

D>наверное от вас ждали что-то вроде

(поскипано много кода)
Простите, это что с++ ?!
Re[2]: как собеседуют jr c++ в штатах :)
От: chipsеt Россия http://merlinko.com
Дата: 01.12.07 18:31
Оценка:
Здравствуйте, dotidot, Вы писали:

D>Здравствуйте, chipsеt, Вы писали:




D>что за клон? что за проблема? при копировании Д указатель у копии будет указывать туда же куда и у оригинала? так деструктора вообще нету — т.е. почему бы и нет? ptr всё равно никогда не инициализируется, т.е. на объекты не будет указывать

D>я здесь не вижу никаких проблем, классы A,B,C — вообще пустые, какие тут проблемы? В отсутствии смысла?

D>Вы либо чего то не договариваете, либо сакральное знание "проблемы" таковым на самом деле не является.


Не договариваю конечно Предполагаеся что в B и C есть некоторые данные а вот насчёт деструктора не помню. да! там предполагалось что нужно написать assignment operator с deep copy.
... << RSDN@Home 1.2.0 alpha rev. 784>>
"Всё что не убивает нас, делает нас сильнее..."
Re[4]: как собеседуют jr c++ в штатах :)
От: dotidot Россия  
Дата: 01.12.07 19:29
Оценка:
Здравствуйте, dip_2000, Вы писали:

_>Простите, это что с++ ?!

представьте себе. представьте себе.
Re[3]: как собеседуют jr c++ в штатах :)
От: dotidot Россия  
Дата: 01.12.07 19:38
Оценка:
Здравствуйте, chipsеt, Вы писали:

C>Не договариваю конечно Предполагаеся что в B и C есть некоторые данные а вот насчёт деструктора не помню. да! там предполагалось что нужно написать assignment operator с deep copy.

а потом коммисия, наверное, долго хихикала, тыкая пальцем в доску и говоря, что у вас нету виртуального десруктора, и в delete ptr не вызовутся деструкторы подкласса, если он указывает на инстанс B или C.
Что интересно, про виртуальный деструктор спрашивают почти все. Но побывав по ту сторону интервью, я, с удивлением для себя, отметил, что почти никто на этот вопрос не может пролить свет и несут полную пургу.
Re[4]: как собеседуют jr c++ в штатах :)
От: chipsеt Россия http://merlinko.com
Дата: 01.12.07 21:05
Оценка:
Здравствуйте, dotidot, Вы писали:

D>Здравствуйте, chipsеt, Вы писали:


C>>Не договариваю конечно Предполагаеся что в B и C есть некоторые данные а вот насчёт деструктора не помню. да! там предполагалось что нужно написать assignment operator с deep copy.

D>а потом коммисия, наверное, долго хихикала, тыкая пальцем в доску и говоря, что у вас нету виртуального десруктора, и в delete ptr не вызовутся деструкторы подкласса, если он указывает на инстанс B или C.
D>Что интересно, про виртуальный деструктор спрашивают почти все. Но побывав по ту сторону интервью, я, с удивлением для себя, отметил, что почти никто на этот вопрос не может пролить свет и несут полную пургу.

ну деструктор я дорисовал все-таки
... << RSDN@Home 1.2.0 alpha rev. 784>>
"Всё что не убивает нас, делает нас сильнее..."
Re[4]: как собеседуют jr c++ в штатах :)
От: shrecher  
Дата: 02.12.07 10:56
Оценка:
Здравствуйте, dip_2000, Вы писали:


_>(поскипано много кода)

_>Простите, это что с++ ?!

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

Кстати, посмотрите в STL, там тоже полно pointer-ой арифметики.
Re[5]: как собеседуют jr c++ в штатах :)
От: dotidot Россия  
Дата: 02.12.07 11:10
Оценка:
Здравствуйте, shrecher, Вы писали:

S>Кстати, посмотрите в STL, там тоже полно pointer-ой арифметики.

которой у меня в примере, кстати, нету
Re[5]: как собеседуют jr c++ в штатах :)
От: bkat  
Дата: 02.12.07 11:17
Оценка:
Здравствуйте, shrecher, Вы писали:

S>Здравствуйте, dip_2000, Вы писали:



_>>(поскипано много кода)

_>>Простите, это что с++ ?!

S>вы что думаете c++ это обязательно куча темплейтов, наследование и пр. Это не всегда нужно особенно для базовых алгоритмов.


Это не тот случай. У dotidot код сишный.
Даже для базовых типов на C++ пишут конструкторы и деструкторы, а не функции
makeList и deleteList.

S>Кстати, посмотрите в STL, там тоже полно pointer-ой арифметики.


Ну они же скрыты эти детали pointer-ой арифметики
и тот же vector имеет вполне нормальные конструкторы, деструктор и прочие методы.
Re[5]: как собеседуют jr c++ в штатах :)
От: shrecher  
Дата: 02.12.07 11:26
Оценка:
Здравствуйте, chipsеt, Вы писали:


C>ну деструктор я дорисовал все-таки


а зачем для D виртуальный деструктор, если он сам ptr не создает/аллокирует и "A *ptr;" задан как private? Т.е. в принципе ничего в "A *ptr" положить нельзя.

Если написать

A *d = new D;
delete d;


то утечки памяти быть недолжно.
Re[6]: как собеседуют jr c++ в штатах :)
От: shrecher  
Дата: 02.12.07 11:30
Оценка:
Здравствуйте, bkat, Вы писали:

S>>вы что думаете c++ это обязательно куча темплейтов, наследование и пр. Это не всегда нужно особенно для базовых алгоритмов.


B>Это не тот случай. У dotidot код сишный.

B>Даже для базовых типов на C++ пишут конструкторы и деструкторы, а не функции
B>makeList и deleteList.

Ну это формализм. Как я понимаю, на собеседовании проверяют как человек мыслит с указателями и понимает как устроен список.
Re[7]: как собеседуют jr c++ в штатах :)
От: bkat  
Дата: 02.12.07 11:42
Оценка:
Здравствуйте, shrecher, Вы писали:

S>Ну это формализм. Как я понимаю, на собеседовании проверяют как человек мыслит с указателями и понимает как устроен список.


Фиг знает...
Указатели и внутреннее устройство списка вещь конечно важная,
но и продуманные интерфейсы классов вещь тоже не менее важная.
В общем не соглашусь с тем, что это формализм.
Просто это другой, не менее важный пункт.

А если на интервью человек вместо деструктора пишет функцию deleteList
вместо дектруктора, то как мне это понимать?
Понимать ли что человек понятия не имеет о деструкторах
или что он проженный сишник или что он решил приколоться над собеседующими и посмотреть на ихнюю реакцию?
Re[6]: как собеседуют jr c++ в штатах :)
От: dotidot Россия  
Дата: 02.12.07 17:46
Оценка:
Здравствуйте, shrecher, Вы писали:

S>Если написать


S>
S>A *d = new D;
S>delete d;
S>


S>то утечки памяти быть недолжно.

конечно не должно. оно просто не скомпилируется.
Re[8]: как собеседуют jr c++ в штатах :)
От: dotidot Россия  
Дата: 02.12.07 17:48
Оценка:
Здравствуйте, bkat, Вы писали:

B>или что он проженный сишник или что он решил приколоться над собеседующими и посмотреть на ихнюю реакцию?

там вся соль в выделенном жирным шрифтом кодом. С конструкторами/деструкторами было бы намного больше и сложнее — здесь этого точно не надо.
Re[9]: как собеседуют jr c++ в штатах :)
От: bkat  
Дата: 02.12.07 21:06
Оценка:
Здравствуйте, dotidot, Вы писали:

D>там вся соль в выделенном жирным шрифтом кодом.


Аааа... То, что часть кода выделено жирным я не заметил.
Не привык, что код выделяют жирным
Re: как собеседуют jr c++ в штатах :)
От: Alex Dav Россия  
Дата: 03.12.07 08:45
Оценка:
Здравствуйте, chipsеt, Вы писали:

C>Проходил интервью на юниора в http://verdiem.com. Собеседовали долго. Длинная сессия (4 часа) в понедельник и коротенькая в пятницу (сегодня).


Простите за назойливость, а это вопросы действительно для юниорского уровня?
Re[2]: как собеседуют jr c++ в штатах :)
От: dotidot Россия  
Дата: 03.12.07 10:15
Оценка:
Здравствуйте, Alex Dav, Вы писали:

AD>Простите за назойливость, а это вопросы действительно для юниорского уровня?

По моему да. Они предполагают только знакомство с языком и фундаментальными структурами данных/алгоритмами.
Про краулер — тоже на общее понимание, хотя многопоточность и джуниор, на мой взгляд, не совсем совместимые вещи
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.