Здравствуйте, StandAlone, Вы писали:
LMA>>И сколько времени проходили такие собеседования?
SA>У меня заняло три дня. День на брейнбенч — Основы ООП, С++ и SQL. День на задачки, ну и на третий день — беседа с сеньорами.
Офигеть. И что — целый день говорил с сеньорами? Тогда видимо классно у них сеньоры работают — если по целому дню на кандидата.
Здравствуйте, UA, Вы писали:
C>>>Самое смешное, что данный вариант не во всех случаях корректно отработает .
LMA>>Это в каких?
UA>переполнение типа int при сложении чисел близких к INT_MAX?
И где в коде, который я привел сложение чисел, близких к INT_MAX?
Здравствуйте, Ikemefula, Вы писали:
I>Первый вариант, который пришел мне в голову до твоего ответа был вот такой
I>int avg(int x, int y) { return x/2 + y/2; }
I>Правда он будет давать немого более другие средние значения.
Ну да, то, что в этом случае avg(3, 5) == 3 или avg(7, 7) == 6, не здорово.
Здравствуйте, LordMAD, Вы писали:
I>>int avg(int x, int y) { return x/2 + y/2; }
I>>Правда он будет давать немого более другие средние значения.
LMA>Ну да, то, что в этом случае avg(3, 5) == 3 или avg(7, 7) == 6, не здорово.
Здравствуйте, MozgC, Вы писали:
MC>... И сделать нужно так, чтобы через неделю не оказалось, что что-то не продумано, или что-то надо переделать так, что у клиентов код использующий наш веб-сервис перестанет работать. Или чтобы не пришлось писать через неделю всем клиентам письма, сообщая "вы знаете, мы тут кое что добавили/переделали в нашем веб-сервисе" или "доводим до вашего сведения, что теперь этот метод может выбрасывать такое-то исключение". Но при этом алгоритм быстрой сортировки я не помню. У меня просто другие задачи.
Ну вот. А кому-то в свое время численные методы забили в голову настолько глубоко, что они там застряли навечно. И главным, по их мнению, для программиста оказывается умение считать биты, среднее арифметическое или там сумму ряда. А потом пишут веб-сервисы на C++\CGI за несколько человеко-лет
LordMAD пишет:
> Примеры из тем "Программирование на языке C" и "Программирование на > языке С++" я привел выше — можете посмотреть, чтобы составить > впечатление о вопросах.
О вопросах по С/С++ вопросов нет. Смысл примера с целыми ясен, а что
такое "класс, реализующий идиому pimpl" и "эффективная специализация
функции swap для него" я просто не знаю.
Вопросы о том, что именно при условии правильного ответа на них вы
рассчитываете услышать по следующим темам:
2. Архитектура и проектирование
4. Объектно-ориентированное программирование
7. Базы данных
10. Автоматизированное тестирование
12. Составление спецификаций и анализ требований
Здравствуйте, Ytz, Вы писали:
Ytz>Не в обиду, но вы написали два варианта решения элементарной задачи и не один из них не работает, не понятно о чем вообще после этого говорить.
-1 запросто можно и забыть написать, вообще-то. Особенно если привык итераторами пользоваться, а всякие len и for уже давно забыл, как потенциально приводящие вот к таким бякам, я эти -1 уже вообще забыл когда писал. Если на практике потребуется, буду отладчиком внимательно смотреть, а не ошибся ли я — это самый минимум, а желательно еще настроить тестирование таким образом, чтобы такие ошибки всплыли. А если у вас вот такие явная работа с указателями норма, причем вся надежда на внимательность разработчика, и такие ошибки у вас автоматом не всплывут — ваши проблемы. Это задание проверяет исключительно внимательность, и все. Причем нет гарантии, что успешно проверяет, очень реально внимательный человек может просто оказаться уставший, а крайне невнимательный может в данный момент оказаться более сконцентрирован.
Как раз после этого нужно говорить о том, как бороться с такими ошибками, как сделать так, чтобы их не было. А не браковать тех, кто ошибается. Код пишет человек. А человек всегда ненадежен, причем любой. Не ошибается только тот, кто код не пишет. Потому надо не браковать иногда ошибающихся, а делать так, чтобы ошибки быстро находились. Если у человека недостаток внимательности, очень вероятно, что этот недостаток на практике будет компенсироваться осторожностью, тестированием и т.д. И в результате товарищь будет гораздо надежный код писать, чем тот, кто на собеседованиях не ошибается.
Здравствуйте, ProgrammerG, Вы писали:
PG>Здравствуйте, Handie, Вы писали:
H>>Здравствуйте, placement_new, Вы писали:
_>>>Здравствуйте, errest, Вы писали:
E>>>>Какие тестовые задания могут дать на C/C++? E>>>>Нужны простенькие — типа сортировки массива и найти ошибки _>>>Ну например, написать реверс строки или перевод из одной системы счисления в другую, подсчитать число единичек в байте.
H>>Реверс строки я уже писал на трех-четырех собеседованиях и делаю это исключительно по памяти — своп двух указателей идущих навстречу друг другу. Это старый баян, его знают почти все, тест на "лоха".
H>>То же самое и с подсчетом единичек. Оптимальное решение — lookup table c 8 или 16 битными "чанками". Ну и тест на "лоха" с << и | в цикле.
H>>Все это тесты начинающих кодеров
PG>Так оно и есть. Я эту задачу (реверс строки) всегда задаю первой в технической части интервью. И в зависимости от того решает или нет и как решает строится дальнейший разговор.
Хорошо, что ты эту задачу только сишникам, а не плюсовикам задаешь
Здравствуйте, StandAlone, Вы писали:
SA>Здравствуйте, ProgrammerG, Вы писали:
PG>>Так оно и есть. Я эту задачу (реверс строки) всегда задаю первой в технической части интервью. И в зависимости от того решает или нет и как решает строится дальнейший разговор. SA>...без выделения дополнительной памяти?
Да именно так. Причём ниже как раз подтвердили почему такие задачи до сих пор актуальны.
PG>>И я всегда поражаюсь сколько людей не могут решить эту задачу с первого раза (без подсказок). Причём это не всегда студенты, а люди и с 2-3 летним "опытом" на С. SA>А какой сакральный смысл в подсчете единичек и замене lookup table на битовый сдвиг(или деление по модулю 2) и наложение маски?
Ну во-первых надо с чего то начать разговор. Спрашивать сухую теорию типа 4-х постулатов ОО не лучшая замена. Убрать вообще техническую составляющую из собеседования то же не правильно.
Во вторых, убеждён что человек который занимается системным программирванием (а я ищу именно таких, а не формочки рисовать) должен знать как устроено то чем он пользуется. Даже если в реальной жизни он будет пользоваться только библиотеками. Более того написание любого кода на собеседовании считаю правильным.
В третьих, это показывает как человек пишет код — стилистика, сразу бросается или сначала думает, проверяет ли его перед тем как показать мне и т.д.
Чем проще задача — тем лучше. Не давать же написать реальный кусок проекта.
SA>Как они помогут в реальном проекте, когда надо будет оптимизировать какой-нибудь алгоритм Левенштайна, или спектрально-корреляционное преобразование(чисто навскидку крайние задачи, для которых пришлось использовать unmanaged. Подставьте сюда свои реальные задачи, тысячи их...) SA>? SA>Человеку со склонностью к математике проще решить через деление и маску. Человеку со склонностью к архитектуре и дизайну такие задачи вообще за разумное время решить сложно, паттерны здесь не применишь. SA>Итого, кто остается? На поиск кого они заточены — "начинающих кодеров", которые будут пахать за миску доширака от забора и до обеда?
Ну причём тут миска. Да речь идёт о начинающих или с опытом до 3-х лет. Конечно человеку с 10-ти летним опытом будут задаваться другие вопросы.
Здравствуйте, Ikemefula, Вы писали:
I>Здравствуйте, LordMAD, Вы писали:
LMA>>Вариант решения: LMA>>int sign(int a) { return (a < 0) ? -1 : 1; } LMA>>int avg(int x, int y) { return (sign(x) == sign(y)) ? x+(y-x)/2 : (x+y)/2; }
I>Первый вариант, который пришел мне в голову до твоего ответа был вот такой
I>int avg(int x, int y) { return x/2 + y/2; }
А мне вот этот вариант:
int is_odd(int x) {
return x & 1;
}
int avg_my(int x, int y) {
return x/2 + y/2 + is_odd(x & y);
}
LMA>Вариант решения: LMA>int sign(int a) { return (a < 0) ? -1 : 1; } LMA>int avg(int x, int y) { return (sign(x) == sign(y)) ? x+(y-x)/2 : (x+y)/2; }
Это тот случай, когда служение стандарту С++ важнее продуктивной работы. Вам надо работу делать или стандарту следовать? На элементарнейшей задаче два вызова функции, усложненный код.
Простые вещи должны быть простыми. Я никогда не видел чтобы в реальном боевом коде каждое вычисление выражения проверялось на переполнение. Оперируете миллиардами — использование long long решает все проблемы
int avg(int x, int y) { return (int)(((long long)x + y)/2); }
Выглядит проще. Хотя проблема в самой функции, которая удивительно бесполезна в текущем варианте. Вот другой варант
template <class InputIterator, class T>
T average(InputIterator first, InputIterator last);
Реализуется в терминах алгоритмов STL парой строк, работает с любыми типами — int, double, float, long long, c любым количеством чисел хранящихся в любых контейнерах — vector, set, my_super_container.
При этом создатели STL не страдали идиотизмом проверки на переполнения, справедливо считая что это вопрос к программисту который использует инструмент и выбирает адекватные типы данных.
LMA>Офигеть. И что — целый день говорил с сеньорами? Тогда видимо классно у них сеньоры работают — если по целому дню на кандидата.
У меня в Google было шесть собеседований, явно не с джуниорами. Каждый из них потратил 30-45 минут, я потратил два дня. У некоторых интервьюеров были бумажки со списком вопросов и задачек — видимо они для себя шпаргалок наделали или в конторе есть корпоративный "хелп".
Здравствуйте, StandAlone, Вы писали:
SA>Без обид, но ни, и "непонятно". Так вот, непонятно, вам шашечки или ехать?
Все нормально Без обид, но возможно вам стоит попробовать себя как корректора, раз уж с программированием не очень Шутка.
SA>Алгоритм проверить или навыки работы с адресной арифметикой псевдокода, набранного в браузере?
Я затрудняюсь это алгоритмом назвать, это должно быть интуитивно понятно, как зубы почистить.
SA>В первом примере обнуление последнего байта строки я опустил намеренно, а во втором — да, каюсь, позабыл в спешке -1 после strlen() дописать. Слава богу, три года с указателями не работаю Ну и, о чем это говорит? Может, о вас, раз с вами помимо указателей говорить не о чем?
С какой целью опустили? Вообще есть мнение, например у Спольски, которое я разделяю, что у хорошего программиста ответ как написать < или <=, отнять единицу или нет, приходит сам, без дополнительных усилий. Ну если на велосипеде научился ездить, то не будешь задумываться как крутить педали и когда жать на тормоз. Потому и странно.
Здравствуйте, elmal, Вы писали:
E>-1 запросто можно и забыть написать, вообще-то. Особенно если привык итераторами пользоваться, а всякие len и for уже давно забыл, как потенциально приводящие вот к таким бякам, я эти -1 уже вообще забыл когда писал. Если на практике потребуется, буду отладчиком внимательно смотреть, а не ошибся ли я — это самый минимум, а желательно еще настроить тестирование таким образом, чтобы такие ошибки всплыли.
Поймите правильно — я не пытаюсь кого либо принизить, а себе цену набить, но это все равно, что фигурист будет говорить, что он может крутиться как волчок на коньках, а как просто вперед ехать уже забыл.
Здравствуйте, Ytz, Вы писали:
Ytz>Все нормально Без обид, но возможно вам стоит попробовать себя как корректора, раз уж с программированием не очень Шутка.
Спасибо, но у меня и с должностью синьор программера пока неплохо получается справляться — править косяки за студентами и решать задачи, для них в принципе,из-за отсутствия опыта, неразрешимые.
Ytz>Я затрудняюсь это алгоритмом назвать, это должно быть интуитивно понятно, как зубы почистить.
Ну, алгоритмы-то и посложнее бывают. Я тоже затрудняюсь сказать, с какой целью ЭТО спрашивают на собеседованиях, и какой с этого выхлоп практический.
Спрашивал выше по ветке -никто не признается.
Ytz>С какой целью опустили?
С целью побеседовать с интервьюером о чем-нибудь интереснее следующей задачи на биты. Например, насчет безопасности программирования в целом и гарантий Абрамса(для вызывающего кода) в частности.
Ytz>Вообще есть мнение, например у Спольски, которое я разделяю, что у хорошего программиста ответ как написать < или <=, отнять единицу или нет, приходит сам, без дополнительных усилий. Ну если на велосипеде научился ездить, то не будешь задумываться как крутить педали и когда жать на тормоз. Потому и странно.
Ага. Когда-то, в туманной дали, когда я вовсю педалил на С++ Builder-е, обращение с указателями для меня было, как завязка шнурков.
Был ли я тогда хорошим программистом? Глядя на тогдашний код — увы. С указателями там все было в порядке. Зато на уровень абстракции выше — полный швах.
С тех пор утекло много воды, я как-то начал думать больше о дизайне и меньше об указателях. Перешел на обувь без шнурков, условно говоря-ногу забил и пошел.
Потому что те же паттерны невозможно освоить чисто теоретически. Нужно потратить несколько лет и сделать несколько больших, сложных проектов, набить шишки и увидеть грамотную архитектуру, реально поработать- только после этого придет понимание грамотных подходов проектирования, разработки, тестирования, внедрения.
Никакие олимпиады и курсачи\лабы этого не дадут.
Но адресная арифметика может, увы, подзабыться. Даже у Шерлока Холмса объем чердака был ограничен. Sad but true.
Так что там у Спольски с переворотом строки?
Здравствуйте, hrensgory, Вы писали:
H>Вопросы о том, что именно при условии правильного ответа на них вы H>рассчитываете услышать по следующим темам:
H>2. Архитектура и проектирование H>4. Объектно-ориентированное программирование H>7. Базы данных H>10. Автоматизированное тестирование H>12. Составление спецификаций и анализ требований
Я думаю будет понятно, если я просто приведу пример вопроса, например, по теме Объектно-ориентированное программирование:
К каким требованиям на предусловия (preconditions) и постусловия (postconditions) приводит Принцип замещения Лисков (Liskov Substitution Principle — LSP)?
Здравствуйте, Handie, Вы писали:
H>int avg(int x, int y) { return (int)(((long long)x + y)/2); }
Уже лучше. Если бы в начале был еще assert (лучше статический), проверяющий, что размер long long больше, чем размер int, так вообще было бы хорошо. Соответственно — хороший повод на собеседовании обсудить цену преобразования int в long long и операций над ним на разных платформах, особенно если речь именно об C, а не C++, потому что C99 требует для long long не менее 64 бит. Ну и т.д.
H>Вот другой варант
H>template <class InputIterator, class T> H>T average(InputIterator first, InputIterator last);
H>Реализуется в терминах алгоритмов STL парой строк, работает с любыми типами — int, double, float, long long, c любым количеством чисел хранящихся в любых контейнерах — vector, set, my_super_container.
Ну, это вариант, только будучи реализованным кандидатом на собеседовании. Опять-таки — хороший повод обсудить дешевые варианты перехода от двух int'овых аргументов к итераторам и т.д.
H>При этом создатели STL не страдали идиотизмом проверки на переполнения, справедливо считая что это вопрос к программисту который использует инструмент и выбирает адекватные типы данных.
Именно. Это как раз одна из причин, почему в задании приводится объявление функции avg — чтобы было видно, что адекватный результат функции — int.
Здравствуйте, Handie, Вы писали:
LMA>>Офигеть. И что — целый день говорил с сеньорами? Тогда видимо классно у них сеньоры работают — если по целому дню на кандидата.
H>У меня в Google было шесть собеседований, явно не с джуниорами. Каждый из них потратил 30-45 минут, я потратил два дня. У некоторых интервьюеров были бумажки со списком вопросов и задачек — видимо они для себя шпаргалок наделали или в конторе есть корпоративный "хелп".
Ну вот это уже адекватное расходование времени. Всего чистого времени 3-5 часов получается, так?