Собеседование

Собеседовался я недавно в одну компанию на программиста. Они занимаются написанием игр: браузерки и под смартфоны. И меня там очень долго и с пристрастием трое допрашивали на тему множественного наследования. Причём не для случая реализации классом интерфейсов, а именно со всем ромбовидным хардкором, переопределением и перекрытием методов и так далее.


На предыдущем месте работы один мой коллега, которого я уважал как человека и программиста, как-то сказал фразу: "Множественное наследование имеет смысл использовать либо если ты гений, либо если долбоёб." На что я и указал собеседующим, но нейтрально, в стиле: "Просто не надо так писать". Но их этот ответ, конечно же, не устроил:

— А если уже так написано?


— Посмотреть, кто так написал, и спросить зачем.


— Нет, ну, давайте абстрагируемся, вот код...



Собеседования тем хороши, что самому тоже можно задавать вопросы. Это не экзамен, на котором профессор, мысленно теребя свой анус власти, с нескрываемым неуважением визгнет: "Здесь я задаю вопросы, а ты отвечаешь!" Поэтому после демонстрации невладения непрактичными механизмами я спросил:


— А вот как бы вы стреляли из пистолета, из дула которого вылетает всегда две пули: одна как обычно, а вторая - в противоположную сторону?



Повисла пауза. По глазам одного собеседующего было видно, что ему захотелось свести это к шутке, но я совершенно не был на это настроен.


— Зачем же его таким сделали?


— Ну, не знаю. Может, оптимизация для тех, кто хочет застрелить кого-нибудь, а потом покончить с собой. Это не имеет значения, давайте абстрагируемся, вот пистолет. Как из него стрелять, при условии, что самому бы пулю получить не хотелось?


— Ну, наверное, уклоняться.


— А целиться тогда как?


— Сначала можно прицелиться, а потом убрать голову и выстрелить.


— Но прицел ведь собьётся.


— Ну да...



Один из собеседующих, который всё это время молчал, загорелся идеей:


— А что если сзади пистолета поставить зеркало, а стрелять как бы сбоку?


— Ну, во-первых, целиться будет сложнее. Во-вторых, пуля, что вылетит сзади, разобьёт зеркало. В-третьих, вы собираетесь везде таскать зеркало? В-четвёртых, вы собираетесь стоять к опасному животному или вооружённому преступнику спиной или боком?


— Зеркало можно маленьким сделать, заведомо там, где в него не будет пуля попадать. Как вариант, можно видеокамеру с прицелом поставить...



Тот, что хотел свести к шутке, перебил:


— А можно изогнуть ствол с обеих сторон, как подкову. Получится что-то вроде двустволки, где обе пули будут лететь в одну сторону.


— Ну, я думаю, вряд ли получится изогнуть дуло. И курок нужно будет нажимать в другую сторону, изогнув руку. Да и прицела не будет.


— Ну, сделать новый прицел.


— А старый куда?


— Старый просто останется, не мешает.



Таким образом, программисты предлагали всё новые и новые варианты. В конце концов я сказал:


— А знаете как бы я поступил?


— Как же?


— Я бы не стал использовать такой пистолет вообще. Просто взял бы вместо него нормальный, обычный. И использовал его так, как его обычно используют.


— Ну-у, не, загадка ведь не в том была...


— Да нет, в том и была. Просто не нужно использовать такие вещи. Ствол не для того создан, чтобы с двух сторон стрелять. А зеркала, дополнительные мушки и гнутые стволы - это всё то говно, что вы сделаете, чтобы предыдущее говно работало. А можно было не творить говно просто в самом начале, отказавшись от его использования, не обрекая себя на замкнутный круг говна.



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





-Автор: Иван Гладин (multiprogramm)

14
Автор поста оценил этот комментарий

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

9
Автор поста оценил этот комментарий
Почему программисты такие умные, а весь софт кривой?
раскрыть ветку
2
Автор поста оценил этот комментарий
Когда начинал писать на С#, жаловался, что нет множественного наследования. Сейчас, спустя годы разработки, смотрю назад и понимаю, что слава мелкомягким, интерфейсы - наше всё. Ну на крайний случай composition over inheritance, паттерны в помощь :)
1
Автор поста оценил этот комментарий

Хаха, оптимизация пистолета для тех кто хочет убить и сразу застрелиться - это прекрасно

1
Автор поста оценил этот комментарий

Иногда такие вещи применяются очень даже естественным образом. Надо просто понимать, как это работает. Ничего сложного в vtable нет.