вторник, 4 ноября 2008 г.

Должен ли программист знать что такое 2^32?

Собеседовали сегодня человека на должность Python/C++ разработчик. Закончил КПИ.
Среди прочего спросили задачку по плюсам, где суть сводилась к тому чтобы от переменной типа unsigned int и значение которой равно 0 отнять 1 и сравнить с 0. Что-то типа такого (псевдокод)

unsigned int a = 0;
print(a - 1 <= 0);

Примерный диалог:
- Что такое unsigned int?
- ну это беззнаковое целое, которое всегда положительное.
- ОК так чему тогда равно a - 1 если а=0?
- -1
- Так -1 же отрицательное.
- Мда, действительно, ну тогда наверное будут все единички в двоичной записи.
(Тут стало интересно, вроде человек близок к цели)
- Хм а что это за число будет, ну хотябы примерно в десятичной записи, инт у нас 4-байтный
- Не знаю..., единички.
- ну сколько это будет
- ???
- ок 2^32 вам такое число знакомо?
- не совсем
- ок ну это и будет ответ, 2^32 - 1, вы можете прикинуть примерно что это за число
- нет, а что это за число?
Дальше мы ему рассказали как прикинуть что это за число в уме и сказали что это 4 млрд примерно
- Вообще то странно что вы не знаете что это за число, а сколько например 2^64
- ну эта... 16 млрд.

Дальше мы не стали долго продолжать.

Неужели программистам больше не нужно знать таких базисных вещей? Не уметь считать в уме? По моему многие из нас слишком расслабились взвалив всю ответственность на фреймворки и абсолютно не понимая, почему вставка записей через рубишный active record настолько медленная, или почему склеивание тысячи строк в цикле конкатенацией тормозит. Да компьютеры стали быстрее, но и объемы данных растут, и тупость разработчика может свести на нет весь прогресс, и прикрываться он будет тем что руби тормозит и надо было писать эту часть на C++/Java или покупать более мощное железо. Или уже появляется новое поколение, которое мыслит GC, фреймворками, паттернами, аждайлами и юниттестами а не базовыми понятиями computer science?

Зато теперь у меня появился новый вопрос на собеседовании :)

14 комментариев:

CorWin комментирует...

В случае с конкатенацией строк написанной криво Java не спасет. А по сути, разумеется нужно. просто очень часто джуниоры не обращают внимания на такие "очевидные" вещи.
Я запомнил навсегда самое первое интервью, которое я проходил, чтобы получить работу. Один из вопросов был прост и очевиден "сколько памяти можно адресовать в защищенном режиме ассемблера под Windows?". И разумеется я ответил "4Gb". А вот следующий вопрос поверг меня ступор "а почему именно 4Gb?" Я к тому, что очень часто программисты, все и тем более начинающие, считают такие базовые вещи не нужными, не стоящими внимания. Это не всегда показывает, что пришел плохой специалист или не перспективный джуниор, но в любом случае является минусом. С другой стороны нужно не слишком углубляться в сопуствующие детали, разумеется в институтах учат и схемотехнику, и системотехнику, и много всякой другой науки, но если Вы не берете на работу специалиста по ассемблеру, то наверное кандидату совешенно не обязательно досконально в деталях знать, как полиморфизм физически раскладывается в глобальную и локальную дескрипторные таблицы.

shlapa комментирует...

Да, каждый уважающий себя специалист обязан знать азы. С другой стороны, знать все невозможно. Уверен, что нашелся бы более крутой программер, который бы удивил вас таким же бесполезным в реальной работе вопросом на собеседовании. Все ошибаются и волнуются. Человек на собеседовании находится в стрессовом состоянии. И, я уверен, не 2^32 скорее всего главное для вас. Мне кажется, важнее спрашивать про опыт соискателя, примеры работ и про желание работать в вашем коллективе.
А если под ваши задачи действительно нужен крутой спец со всеми знаниями, либо учите его сами, либо приготовьтесь выложить за него гораздо большую сумму, чем вы, скорее всего, планировали платить человеку с собеседования :)

Unknown комментирует...

Всегда умиляли подобного рода вопросы на собеседовании. Вместо того, чтоб разобраться понимает ли человек механизм адресации, например, работу со строковыми типами и т.п. вы пытаетесь выяснить умеет ли он возводить в степень в уме?..

Маразм крепчал, деревья гнулись.

Mykola Paliyenko комментирует...

2ray
Эти вопросы были выяснены до, человек мало что понимал.
А не знать размерность инта и не уметь ее прикинуть это как-по мне диагноз.
Слишком много стало левых людей в отрасли и в текущих реалиях им прийдется несладко.

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

Unknown комментирует...

Знание размера int`а примерно так же бесполезно, как и умение множить столбиком.
Для подобной требухи есть справка. Куда хуже, если человек не понимает механизмов адресации, не знает структур данных, основных шаблонов проектирования и многого другого, что имеет значение в реальной работе.

Mykola Paliyenko комментирует...

Человек не знающий что 2+2=4 и не умеющий это посчитать конечно может уметь брать некоторые интегралы, но это не значит что он знает математику. Есть базовые вещи, без знания которых программист не может называться программистом.

Кстати множить столбиком уметь надо :), и вообще лишних знаний не бывает, бывают ленивые люди.

Unknown комментирует...

Возможно знания не бывают лишними, но совершенно определенно знания бывают бесполезными.

Mykola Paliyenko комментирует...

Давайте не вдаваться в софистику, я много раз понимал что происходит переполнение когда видел в дебагере цифры вроде -2 млрд, без знания диапазонов типов мне нужно было бы намного больше времени чтобы понять где проблема. А умножать столбиком тоже надо, несложно придумать ситуацию когда под рукой нет компьютра а нужно посчитать вещи, которые в уме не посчитаешь.
Так что оба этих знания аж никак не бесполезны, не говоря уже о том что математику нужно учить ибо она ум в порядок приводит.

Unknown комментирует...

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

Unknown комментирует...

"не говоря уже о том что математику нужно учить ибо она ум в порядок приводит". Ну хорошо, можешь навскидку накидать функцию на C++, вычисляющую коэффициент ранговой корреляции Кендалла? а разложение матрицы по сингулярным числам? а аппроксимирующую функцию Гомпертца?..

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

Mykola Paliyenko комментирует...

ray по моемы вы перегибаете с Гомпертцами, не понимаю что вас задело так, если что могу дать контакты кандидата - возмите себе в команду :)

Bananos комментирует...

Кстати, насчет умножения в столбик -- вспомнились лабы в Науковой змине где надо было считать, например 100!
;) Real Mode, Turbo Pascal и никаких фреймворков))

так что действительно знать нада умножение, да и деление помню писал ;)

Mykola Paliyenko комментирует...

Да целочисленная арифметика в то время была очень популярна на всяческих контестах по информатике, к сожалению мало кто в нашей стране получал более-менее вменяемое Computer Science образование в школе.
Люди хотят чтобы им платили 2К за то что они выучили джанго или ежб, и не задавали глупых вопросов на собеседовании :(

Наувул-Наувул комментирует...

Я лингвист по образованию. Если бы я знал, что буду работать программистом, то конечно, уделял бы математике больше внимания. Но на практике мне приходится гораздо больше заниматься текстом, а не числами. Специальных знаний из области математики мне обычно не хватало в двух сферах:
1/ игры
2/ статистика

К счастью, рядом всегда сидел математик или физик, к которому можно было поприставать с "албанскими" вопросами.

В остальном, мне кажется, для программирования важнее логика.