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

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

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

Предупреждение


Большинство вопросов открытые, в некоторых просто нет правильного или неправильного ответа. Наоборот, они должны стать отправной точкой разговора, который по идее должен лучше проявить способности человека, чем простой ответ. Лично я вообще предпочёл бы задавать вопросы, ответы на которые сам не знаю.

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

Этот проект создан по образцу «Вопросов для собеседования на работу фронтендера» от @darcyclarke.

Где ответы?


Рано или поздно я дополню статью соответствующими ответами. Буду благодарен за любую помощь!

Содержание


Вопросы по шаблонам проектирования
Вопросы по организации кода (code design)
Вопросы по языкам программирования
Вопросы по веб-разработке
Вопросы по базам данных
Вопросы по NoSQL
Вопросы по версионности кода
Вопросы о параллелизме
Вопросы по распределённым системам
Вопросы о жизненном цикле ПО и руководстве командой
Вопросы по логике и алгоритмам
Вопросы по архитектуре ПО
Вопросы о сервис-ориентированной архитектуре и микросервисах
Вопросы по безопасности
Общие вопросы
Открытые вопросы
Вопросы с фрагментами кода
Вопросы в стиле Билла Гейтса

Вопросы по шаблонам проектирования:


• Почему глобальные объекты и статика — это зло? Можете показать на примере кода?

• Расскажите об инверсии управления и как она улучшает организацию кода.

• Закон Деметры (Принцип минимальной информированности) гласит, что каждый программный модуль должен обладать ограниченным знанием о других модулях и должен взаимодействовать только с непосредственными «друзьями» (иногда его формулируют как «Не разговаривай с незнакомцами»). Можете написать код, который нарушает этот принцип? Почему у него плохая организация и как её исправить?

• Active-Record — шаблон проектирования, который поощряет внедрение в сам объект функций, таких как Insert, Update и Delete, и свойств, которые соответствуют столбцам некоей базовой таблицы в базе данных. По вашему мнению и опыту, какие ограничения и подводные камни у этого шаблона?

• Data-Mapper — шаблон проектирования, который поощряет использование слоя преобразователей (mappers), перемещающих данные между объектами и базой данных, в то же время сохраняя их независимость друг от друга и от самого преобразователя. В отличие от этого шаблона, в Active-Record объекты непосредственно включают операции по сохранению себя в базе данных и свойства, соответствующие базовым таблицам в базе данных. У вас есть мнение по этим шаблонам? В каких случаях вы предпочтёте один из них другому?

• Почему при введении в NULL часто упоминают «Ошибку на миллиард долларов»? Хотите обсудить техники для предотвращения этого, такие как шаблон Null Object, представленный в книге GOF, или опциональные типы?

• Почему композиция зачастую лучше, чем наследование?

• Что такое предохранительный уровень (Anti-corruption Layer)?

• Одиночка (Singleton) — это шаблон проектирования, который создаёт один экземпляр класса для одиночного объекта. Написать Правильного Одиночку (Thread-Safe Singleton) не так просто. Попробуете?

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

• Напишите фрагмент кода, нарушающий принцип Don't Repeat Yourself (DRY). Затем исправьте его.

• Как вы будете бороться с адом зависимостей (Dependency Hell)?

• Почему goto — это зло?

• Принцип надёжности — общее правило организации кода, которое рекомендует «быть консервативным в том, что отправляешь, и либеральным в том, что принимаешь». Его часто формулируют как «быть терпимым читателем и осторожным писателем». Хотите обсудить смысл этого принципа?

• Разделение ответственностей — принцип проектирования для разделения компьютерной программы на отдельные области, каждая из которых отвечает за свою задачу. Есть много разных механизмов для разделение ответственностей (использование объектов, функций, модулей или шаблонов, таких как MVC и тому подобные). Хотите обсудить эту тему?

Вопросы по организации кода (code design):


• Часто говорят, что одна из самых важных задач объектно-ориентированного дизайна (и организации кода в целом) — это сильное сцепление и слабая связанность. Что это значит? Почему они так важны и как их достигнуть?

• Почему в большинстве языков индекс массива начинается с нуля?

• Как тесты и TDD влияют на организацию кода?

• Напишите фрагмент кода, нарушающий принцип Don't Repeat Yourself (DRY). Объясните, почему у него плохая организация, и исправьте.

• В чём разница между сцеплением и связанностью?

• Для чего полезен рефакторинг?

• Полезны ли комментарии в коде? Кто-то говорит, что их следует по возможности избегать, а в идеале они вообще не нужны. Вы согласны?

• Какая разница между организацией кода и архитектурой?

• Почему в TDD тесты пишутся прежде кода?

• C++ поддерживает множественное наследование, а Java позволяет классу реализовать несколько интерфейсов. Какое влияние оказывает использование этих средств на ортогональность? Существует ли разница во влиянии между использованием множественного наследования и множественных интерфейсов? Есть ли разница между использованием делегирования и наследования? [Это вопрос из книги «Прагматичный программист» Эндрю Ханта и Дэфвида Томаса]

• Плюсы и минусы хранения логики предметной области в хранимых процедурах.

• По вашему мнению, почему объектно-ориентированная организация столько лет доминирует на рынке?

• Если у вашего кода плохая организация, как вы это поймёте?

Вопросы по языкам программирования:


• Расскажите о трёх главных недостатках вашего любимого языка программирования.

• Почему возрастает интерес к функциональному программированию?

• Что такое замыкание и для чего оно полезно? Что общего у замыканий и классов?

• Когда удобно использовать дженерики?

• Что такое функции высокого порядка? Для чего они нужны? Напишите такую функцию на любом языке.

• Напишите цикл, затем преобразуйте его в в рекурсивную функцию, используя только неизменяемые структуры (т. е. без переменных). Опишите её.

• Что значит, когда язык рассматривает функции как объекты первого класса?

• Покажите пример, когда может быть полезна анонимная функция.

• Существует много разных систем типов: обсудим статическую и динамическую типизации, их преимущества и недостатки. У вас наверняка есть и мнение, и свои предпочтения на этот счёт. Хотите поделиться ими и обсудить, почему и когда вы предпочтёте одну из этих систем типов при разработке корпоративного программного обеспечения?

• Для чего нужно пространство имён? Придумайте альтернативу.

• Расскажите о совместимости Java и C# (или выберите два других произвольных языка).

• Почему многие разработчики не любят Java?

• Что делает хороший язык хорошим и плохой язык — плохим?

• Напишите две функции, одну референциально прозрачную, а другую референциально непрозрачную. Обсудим их.

• Что такое стек и что такое куча? Что такое переполнение стека?

• Почему важно, чтобы функции были объектами первого класса в языке?

• В некоторых языках, особенно с функциональным подходом, разрешена техника, которая называется сопоставление с образцом. Она вам знакома? Чем сопоставление с образцом отличается от конструкции Switch?

• Почему в некоторых языках программирования не реализованы исключения? В чём преимущества и недостатки такого подхода?

Если Cat — это Animal, то верно ли, что TakeCare<Cat> — это TakeCare<Animal>?

• Почему в Java, C# и многих других языках конструкторы не являются частью интерфейса?

• В последние годы много шумихи вокруг Node.js. Каково ваше мнение по поводу использования в бэкенде языка, который изначально задумывался для работы в браузере?

• Представьте, что у вас машина времени и есть возможность вернуться в определённый момент времени в истории Java (C#, Python, Go или чего-нибудь ещё) и поговорить с некоторыми из создателей JDK. В чём бы вы попробовали их убедить? Удалить контролируемые исключения? Добавить неподписанные примитивные типы? Множественное наследование?

Вопросы по веб-разработке:


• Почему родные куки и сторонние куки обрабатываются настолько по-разному?

• Как бы вы управляли нумерацией версий Web Services API?

• С точки зрения бэкенда есть ли какие-нибудь недостатки или препятствия внедрению одностраничных приложений?

• Почему мы обычно так сильно стремимся, чтобы сервис был stateless? Что такого хорошего в stateless-коде? Почему и когда хранение состояния (statefullness) — это плохо?

• REST и SOAP: в каких ситуациях вы выберете один из этих подходов, а в каких другой?

• В веб-разработке подходы Model-View Controller и Model-View-View-Model во многом похожи как в бэкенде, так и во фронтенде. Что они из себя представляют и почему целесообразно их использовать?

Вопросы по базам данных:


• Как вы перенесёте приложение из одной базы данных в другую, например, из MySQL в PostgreSQL? Если вам придётся управлять таким проектом, какие проблемы вы ожидаете?

• Почему БД расценивают NULL как такой особый случай? Например, почему в SQL SELECT * FROM table WHERE field = null не выдаёт записи с полем null?

• ACID — это акроним для Atomicity, Consistency, Isolation, Durability (Атомарность, Согласованность, Изолированность, Устойчивость). Большинство движков БД гарантируют эти четыре свойства для транзакций в БД. Что вы знаете об этом? Хотите рассказать подробнее?

• Как бы вы справились c переносом схемы БД, то есть как вы автоматизируете изменения схемы БД по мере развития приложения от версии к версии?

• Как реализовать ленивую загрузку? Когда она полезна? Какие есть подводные камни?

• Так называемая «проблема N+1» возникает, когда код должен загрузить дочерние элементы из отношений «родители-потомки» в ORM с ленивой загрузкой, а следовательно, отправить запрос для родительской записи, а потом по одному запросу для каждой дочерней записи. Как решить проблему?

• Как вы обнаружите в приложении самые затратные запросы?

• По вашему мнению, всегда ли необходима нормализация БД? Когда целесообразно использовать денормализованные БД?

• Один из методов непрерывной интеграции называется сине-зелёный деплой. Он заключается в использовании двух сред производственной эксплуатации, максимально похожих — и деплой в одну из них во время работы другой, а затем безопасное переключение трафика из одной среды на вторую после тестирования в удобной обстановке. Этот метод усложняется, если деплой предполагает изменение структуры или содержимого БД. Хотелось бы обсудить с вами эту тему.

Вопросы по NoSQL:


• Что такое согласованность в конечном счёте (eventual consistency)?

• Насчёт теоремы CAP, приведите примеры систем CP, AP и CA.

• Как вы объясните всплеск интереса к NoSQL в последнее время?

• Как NoSQL решает проблемы масштабируемости?

• В каком случае вы предпочтёте документоориентированную СУБД вроде MongoDB вместо реляционной СУБД, такой как MySQL или PostgreSQL?

Вопросы по версионности кода:


• Почему осуществление ветвлений в Mercurial или Git легче, чем в SVN?

• Каковы плюсы и минусы распределённых систем контроля версий, таких как Git, в сравнении с централизованными VCS вроде SVN?

• Можете описать рабочий процесс GitHub Flow и GitFlow?

• Что такое rebase (перемещение)?

• Почему слияние проще осуществлять в Mercurial или Git, чем в SVN и CVS?

Вопросы о параллелизме:


• Зачем вообще нужен параллелизм? Объясните.

• Почему так трудно тестировать многопоточный/распараллеленный код?

• Что такое состояние гонки? Напишите пример на произвольном языке.

• Что такое взаимная блокировка? Вы можете написать какой-нибудь код, страдающий взаимными блокировками?

• Что такое ресурсный голод (process starvation)? Если нужно, давайте рассмотрим его определение.

• Что представляет собой алгоритм неблокирующей синхронизации без ожиданий (wait-free алгоритм)?

Вопросы о распределённых системах:


• Как тестировать распределённую систему?

• В каком случае вы примените асинхронную коммуникацию между двумя системами?

• Каковы основные подводные камни удалённого вызова процедур?

• Если вы создаёте распределённую систему ради масштабируемости и надёжности, какие разные проблемы могут возникнуть в закрытом и безопасном сетевом окружении — и в географически распределённой и общедоступной системе?

• Как обеспечить отказоустойчивость веб-приложения? Десктопного приложения?

• Как справляться со сбоями в распределённых системах?

• Поговорим о разных подходах к восстановлению работоспособности (reconciliation) после нарушения связности сети.

• Каковы заблуждения относительно распределённых вычислений?

• Когда вы примените Request/Reply, а когда Publish/Subscribe?

• Предположим, что система, c которой вы работаете, не поддерживает транзакционность. Как бы вы реализовали её с нуля?

Вопросы о жизненном цикле ПО и руководстве командой:


• Что такое гибкость (agility)?

• Как вы будете работать с легаси-кодом?

• Скажем, я ваш менеджер проекта и не эксперт в программировании. Попробуйте объяснить мне, что такое легаси-код и почему нужно заботиться о качестве кода.

• Я исполнительный директор вашей компании. Объясните мне Канбан и убедите вложиться в него.

• В чём главное отличие гибкой методологии разработки и каскадной модели?

• Будучи руководителем группы, как вы решите проблему слишком большого количества совещаний?

• Как вы будете справляться с проектом, который выполняется с сильным опозданием?

• «Люди и взаимодействие важнее процессов и инструментов» и «Сотрудничество с заказчиком важнее согласования условий контракта» — это половина ценностей, провозглашённых в Agile-манифесте. Обсудим их.

• Расскажите, какие решения вы бы приняли, если бы были техническим директором своей компании.

• Есть ли польза от менеджеров программ?

• Составьте рабочее расписание команды, используя гибкий график (то есть без установленного рабочего времени) и политики отпусков «Бери когда понадобится».

• Как бы вы справитесь с очень большой текучкой и убедите разработчиков не покидать команду без повышения зарплаты? Что хорошего может сделать компания, чтобы они остались?

• Какие три главных качества вы цените в коллегах, кроме программирования?

• Какие три главные вещи о программировании нужно знать гуманитариям, по вашему мнению?

• Представьте, что компания предоставляет вам один месяц и бюджет для улучшения качества повседневной жизни вас и ваших коллег. Что бы вы сделали?

Вопросы по логике и алгоритмам:


• Напишите очередь FIFO, используя только стеки LIFO. Затем создайте стек LIFO, используя только очереди FIFO.

• Напишите фрагмент кода, подверженный переполнению буфера.

• Напишите факториал с концевой рекурсией.

• На любом языке напишите REPL, которая сразу отображает введённые значения. Доработайте её до RPN-калькулятора.

• Как бы вы спроектировали утилиту для дефрагментации?

• Напишите программу, которая генерирует случайные лабиринты.

• Написать пример кода, который создаёт утечку памяти.

• Сгенерируйте последовательность уникальных случайных чисел.

• Напишите пример простой системы сборки мусора.

• Напишите простой брокер сообщений на любом языке.

• Напишите очень простой веб-сервер. Составьте план функций, которую нужно реализовать в будущем.

• Как вы отсортируете файл 10 ГБ? Как вы подойдёте к внесению изменений в файл 10 ТБ?

• Как вы найдёте дубликаты файлов программным путём?

Вопросы по архитектуре ПО:


• Когда кэш не нужен и даже вредит?

• Почему событийно-ориентированная архитектура улучшает масштабируемость?

• Что делает код читаемым?

• Какая разница между развивающимся дизайном (emergent design) и эволюционной архитектурой?

• Горизонтальное и вертикальное масштабирование: чем они отличаются? Когда применять одно, а когда другое?

• Как работать с перехватом управления при отказе (failover) и пользовательскими сессиями?

• Что такое CQRS (Command Query Responsibility Segregation)? Как он отличается от старого принципа Command-Query Separation?

• Что такое трёхуровневая архитектура?

• Как вы будете проектировать программную систему с расчётом на масштабируемость?

• Какие есть стратегии для решения проблемы C10k?

• Как вы спроектируете децентрализованную (то есть без центрального сервера) систему P2P?

• Почему CGI не масштабируется?

• Как вы защитите свои системы от привязки к поставщику (vendor lock-in)?

• Каковы недостатки шаблона проектирования «Издатель-подписчик» при масштабировании?

• Что нового произошло с 80-х годов в разработке процессоров, почему это важно для программирования?

• На каком этапе жизненного цикла следует учитывать производительность и как?

• Как проблема отказа в обслуживании может появиться не из-за DoS-атаки, а по причине плохого проектирования или из-за проблемы архитектуры?

• Какая взаимосвязь между производительностью и масштабируемостью?

• Когда приемлемо использовать сильное зацепление (tight coupling)?

• Какими характеристиками должна обладать система для перехода в облако?

• Означает ли единство дизайна элитность архитекторов? Проще говоря: может ли хороший дизайн возникнуть из коллективных усилий всех разработчиков?

• Какая разница между дизайном, архитектурой, функциональностью и эстетическими качествами? Обсудим это.

Вопросы о сервис-ориентированной архитектуре и микросервисах:


• Почему в SOA не поощряются длинные транзакции, а вместо них предлагается использовать Saga?

• В чём разница между SOA и микросервисами?

• Поговорим о нумерации версий веб-сервисов, совместимости версий и критических изменениях, ломающих обратную совместимость.

• В чём разница между транзакцией и компенсирующей операцией в Saga, в SOA?

• Когда микросервисы уж слишком микро?

• Каковы плюсы и минусы микросервисной архитектуры?

Вопросы по безопасности:


• Как писать безопасный код? По вашему мнению, является ли это обязанностью разработчика или для этого должен быть отдельный специалист в компании? И почему?

• Почему говорят, что вам не следует пытаться изобрести или спроектировать собственные правила криптографии?

• Что такое двухфакторная аутентификация? Как вы реализуете её в существующем веб-приложении?

• Если не обращаться с логами осторожно, то всегда есть риск, что туда попадёт конфиденциальная информация, в том числе пароли. Как вы предотвратите такую проблему?

• Напишите фрагмент кода, подверженного SQL-инъекции и исправьте его.

• Как можно обнаружить уязвимость для SQL-инъекций методом статичного анализа кода? Я не жду, что вы напишете готовый алгоритм, поскольку это слишком большая тема, но давайте обсудим общий подход.

• Что вы знаете о межсайтовом скриптинге? Если не помните, давайте посмотрим его описание в интернете и поговорим о нём.

• Что вы знаете об межсайтовой подделке запросов? Если не помните, давайте посмотрим его описание в интернете и поговорим о нём.

• Как работает HTTPS?

• Что такое атака «человек посередине»? И почему HTTPS помогает защититься от неё?

• Как вы можете предотвратить кражу пользовательской сессии? Скорее всего, вы помните, что такое кража сессии или куков, иначе вместе почитаем страничку на Википедии по этой теме.

Общие вопросы:


• Почему имеет значение функциональное программирование? Когда следует использовать язык функционального программирования?

• Как компании вроде Microsoft, Google, Opera и Mozilla зарабатывают на своих браузерах?

• Почему открытие сокета TCP несёт большие накладные расходы?

• Для чего важно использовать инкапсуляцию?

• Что такое система реального времени и как она отличается от обычной системы?

• Какова связь между языками программирования реального времени и выделением памяти в куче?

• Неизменяемость — это практика однократной установки значений в момент создания объекта, и эти значения затем никогда не изменяются. Как неизменяемость помогает писать более безопасный код?

• Плюсы и минусы изменяемых и неизменяемых значений.

• Что такое объектно-реляционный разрыв (оbject-relational impedance mismatch)?

• Какие принципы вы примените для определения размера кэша?

• Какая разница между TCP и HTTP?

• Каковы компромиссы выбора рендеринга на стороне клиента и на стороне сервера?

• Как разработать надёжный протокол связи на основе ненадёжного?

• Изобретатель нулевого указателя Тони Хоар однажды сказал «Могу назвать это своей ошибкой на миллиард долларов», поскольку она влечёт «бесчисленные ошибки, уязвимости и системные сбои, которые, вероятно, причинили страданий и ущерба на миллиард долларов за последние сорок лет». Допустим, вы хотите устранить возможность использования нулевых указателей в своём языке программирования: как вы решите такую задачу? Какие последствия это может иметь?

Открытые вопросы:


• Почему люди сопротивляются изменениям?

• Объясните концепцию тредов своей бабушке.

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

• Что делает хороший код хорошим?

• Объясните, как осуществляется потоковое вещание и как вы его реализуете.

• Предположим, ваша компания даёт вам одну неделю на улучшение жизни для вас и ваших коллег: как вы используете эту неделю?

• Что вы узнали за последнюю неделю?

• В любом дизайне есть эстетический элемент. Вопрос в том, эта эстетика — ваш друг или враг?

• Назовите пять последних книг, какие вы прочитали.

• Как вы внедрите подход непрерывной поставки ПО в большой успешной компании, для которой переход с каскадной модели на подход непрерывной поставки нетривиален из-за её размера и сложности бизнеса?

• Когда имеет смысл заново изобретать колесо?

• Поговорим о изобретении колеса заново, синдроме неприятия чужой разработки и практике использования компанией или командой разработчиков собственных сервисов и продуктов (Eating Your Own Food).

• Что в первую очередь вы автоматизируете в текущем рабочем процессе?

• Какие сложности в написании программного обеспечения? Что затрудняет поддержку программного обеспечения?

• Вы предпочитаете работать над совершенно новыми проектами (greenfield) или продолжать текущие (brownfield)? Почему?

Что произойдёт, когда вы наберёте google.com в адресной строке браузера и нажмёте Enter?

• Что делает операционная система, когда нет команды на выполнение конкретного кода и она выглядит незанятой? Хотелось бы начать разговор о прерываниях, демонах, фоновых сервисах, опросах, обработке событий и т. д.

• Объясните Юникод или транзакции в СУБД пятилетнему ребёнку.

• Приведите доводы в пользу монолитной архитектуры.

• Что значит быть «профессиональным разработчиком»?

• Программирование — это искусство, ремесло или инженерное дело? Ваше мнение.

• Как вы реализуете систему рекомендаций в магазине электронной коммерции?

• Почему корпорации хуже внедряют инновации, чем стартапы?

• Ваше последнее достижение, которым вы гордитесь?

Вопросы с фрагментами кода:


• Каков результат выполнения этой функции JavaScript?

function hookupevents() {
  for (var i = 0; i < 3; i++) {
    document.getElementById("button" + i)
      .addEventListener("click", function() {
        alert(i);
      });
  }
}

• Насчёт стирания типов, что выдаст такой код Java и почему?

ArrayList<Integer> li = new ArrayList<Integer>();
ArrayList<Float> lf = new ArrayList<Float>();
if (li.getClass() == lf.getClass()) // evaluates to true
  System.out.println("Equal");

• Можете обнаружить утечку памяти?

public class Stack {
    private Object[] elements;
    private int size = 0;
    private static final int DEFAULT_INITIAL_CAPACITY = 16;

    public Stack() {
        elements = new Object[DEFAULT_INITIAL_CAPACITY];
    }

    public void push(Object e) {
        ensureCapacity();
        elements[size++] = e;
    }

    public Object pop() {
        if (size == 0)
            throw new EmptyStackException();
        return elements[--size];
    }

    /**
     * Ensure space for at least one more element, roughly
     * doubling the capacity each time the array needs to grow.
     */
    private void ensureCapacity() {
        if (elements.length == size)
            elements = Arrays.copyOf(elements, 2 * size + 1);
    }
}

• Можете избавиться от переключателя switch и написать более объектно-ориентированный код?

public class Formatter {

    private Service service;

    public Formatter(Service service) {
        this.service = service;
    }

    public String doTheJob(String theInput) {
        String response = service.askForPermission();
        switch (response) {
        case "FAIL":
            return "error";
        case "OK":
            return String.format("%s%s", theInput, theInput);
        default:
            return null;
        }
    }
}

• Можете избавиться от операторов if и написать более объектно-ориентированный код?

public class TheService {
    private final FileHandler fileHandler;
    private final FooRepository fooRepository;

    public TheService(FileHandler fileHandler, FooRepository fooRepository) {
        this.fileHandler = fileHandler;
        this.fooRepository = fooRepository;
    }

    public String Execute(final String file) {

        final String rewrittenUrl = fileHandler.getXmlFileFromFileName(file);
        final String executionId = fileHandler.getExecutionIdFromFileName(file);

        if ((executionId == "") || (rewrittenUrl == "")) {
            return "";
        }

        Foo knownFoo = fooRepository.getFooByXmlFileName(rewrittenUrl);

        if (knownFoo == null) {
            return "";
        }

        return knownFoo.DoThat(file);
    }
}

• Как произвести рефакторинг такого кода?

function()
{
    HRESULT error = S_OK;

    if(SUCCEEDED(Operation1()))
    {
        if(SUCCEEDED(Operation2()))
        {
            if(SUCCEEDED(Operation3()))
            {
                if(SUCCEEDED(Operation4()))
                {
                }
                else
                {
                    error = OPERATION4FAILED;
                }
            }
            else
            {
                error = OPERATION3FAILED;
            }
        }
        else
        {
            error = OPERATION2FAILED;
        }
    }
    else
    {
        error = OPERATION1FAILED;
    }

    return error;
}

Вопросы в стиле Билла Гейтса:


В этом разделе собраны странные вопросы из собеседований Microsoft (вопросы типа почему крышки канализационных люков во многих странах имеют круглую форму стали известными из собеседований Microsoft).

• Что случится, если я отсканирую зеркало?

• Представьте своего идеального клона. Представьте, что этот клон — ваш начальник. Вы бы хотели работать на него/неё?

• Проведите собеседование со мной.

• Почему ответы Quora лучше, чем Yahoo Answers?

• Сыграем в игру: защитите Cobol против современных языков и попробуйте найти как можно больше разумных аргументов.

• Где вы будете через 10 лет?

• Вы мой начальник, а я уволен. Сообщите мне.

• Я хочу провести рефакторинг старой системы. Вы хотите переписать её с нуля. Аргументируйте. Затем меняемся ролями.

• Ваш начальник просит вас соврать компании. Ваши действия?

• Если бы вы могли вернуться в прошлое, какой совет дали бы молодому себе?

Комментарии (208)


  1. lookid
    19.02.2018 13:17
    -1

    Давайте я лучше список разверну на доске, окей???


  1. Free_ze
    19.02.2018 13:20
    +3

    Почему многие разработчики не любят Java?
    Что делает хороший код хорошим?
    Что вы узнали за последнюю неделю?
    Объясните Юникод или транзакции в СУБД пятилетнему ребёнку.
    Ваше последнее достижение, которым вы гордитесь?
    ...<много подобного в статье>...
    Боже, нет, такие вопросы я бы меньше всего хотел слышать на техническом собеседовании.

    Хотя… для нетрезвых конкурсов на корпоративе они вполне сгодятся.


    1. JC_IIB
      19.02.2018 13:37

      Поздно. Тысячи HR уже скопипастили себе статью в файлик «Вопросы на собеседование компьютерщика.doc».


      1. Aquahawk
        19.02.2018 19:20

        .docx давно уже


        1. JC_IIB
          19.02.2018 21:20

          Спасибо, я знаю.


    1. domix32
      19.02.2018 17:08
      +6

      Вероятно автор спутал тех.собеседование и приём у психолога


      Хотите обсудить эту тему?


      1. marshinov
        19.02.2018 22:40

        Я на большинство вопросов «хотите обсудить эту тему» ответил «нет»:) Видимо, меня не возьмут.


    1. Artem_zin
      20.02.2018 01:22

      Что делает хороший код хорошим?

      аааааа в голос просто


    1. quwy
      20.02.2018 01:25

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


      1. Whuthering
        20.02.2018 10:21

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


        1. quwy
          21.02.2018 02:32

          Знание названий паттернов — это не понимание архитектуры. Точнее понимание архитектуры совсем не подразумевает знания всех этих идиотских словечек, которыми пестрит вопросник. Про явно подразумеваемое соответствие «бэкенд = java» вообще промолчу.


          1. Whuthering
            21.02.2018 12:26

            Говоря про паттерны и прочие «идиотские словечки», обычно ожидают и оценивают не знание названий, а понимание их смысла и назначения.
            И решительно не ясно, почему все так взъелись на «Java», по-моему вполне очевидно, что при собеседовании разработчика с другим стеком вместо Java в вопросах будет %your_language_name% и %your_platform_name%, благо большинство из вопросов с некоторыми адаптациями применимы и для других языков и технологий.


            1. ApeCoder
              21.02.2018 12:33
              +1

              Думаю, тут еще в коvментах происходит тестирование на то, наколько человек хочет понять что сказал собеседник и поискать там рациональное зерно или насколько хочет доказать что собеседник неправ :)


            1. quwy
              21.02.2018 20:32

              Говоря про паттерны и прочие «идиотские словечки», обычно ожидают и оценивают не знание названий, а понимание их смысла и назначения.

              Если вопрос содержит название очередного «active-record», то подразумевается, что я должен знать что это такое. А я, как оказалось, уже лет 15 пользуюсь этим паттерном чуть не каждый день, но данное идиотское словосочетание вижу в первый раз.

              Для каждого из миллиона способов сохранить данные в программе тоже отдельное название придумали? Заняться совсем нечем?

              И решительно не ясно, почему все так взъелись на «Java», по-моему вполне очевидно, что при собеседовании разработчика с другим стеком вместо Java в вопросах будет %your_language_name%

              А кодсниппеты с характерными «болячками» %your_language_name% тоже будут другими? Что-то сомневаюсь.


    1. dim2r
      20.02.2018 14:33

      Еще одного вопроса нет, который мне несколько раз задавали — «нравится ли вам java?»

      Для мне это что-то типа «нравится ли уборщице швабра?» или «нравится ли кузнецу молот?». Мне на самом деле мне нравится решать задачи, а каким образом, — это уже второй вопрос. Обычно приходится решать теми инструментами, которые заказчик предпочитает. Если он захочет забивать гвозди мороженной колбасой, — забью без проблем. :) Эстетов будет воротить, но гвоздь будет забит.


      1. ApeCoder
        21.02.2018 11:45
        +2

        Если он захочет забивать гвозди мороженной колбасой, — забью без проблем.

        А не бывает ли таких ситуаций когда есть возможность выбрать инструмент или поговорить с заказчиком и убедить использовать другой?


        Во-вторых, вопрос может быть не для того, чтобы дать вам выбирать а просто выяснить ваш кругозор — насколько вы знаете возможности Джавы и насколько вы будете готовы, когда следующая версия принесет новые возможности из других языков


    1. kalininmr
      21.02.2018 21:00

      > Почему многие разработчики не любят Java?
      вот тоже интересно.
      я, например, немного недолюбливаю(недолюбливал?) за отсутствие некоторых очевидных вещей типа лямбд и val, которые теперь есть.
      ну и нелюблю саму jvm по причине отсутствия unsigned типов и ряда других нюансов.


      1. linuxover
        22.02.2018 09:45

        яву не любят за избыточный ООП


  1. mak_ufo
    19.02.2018 13:31
    +1

    Если я понятия не имею, почему люди не любят джаву, то что мне делать?


    1. ainu
      19.02.2018 13:41

      Искать другое место. Достоин только тот кандидат, который точно знает. Тот, который за последнюю неделю что-то узнал, и пятилетний сын которого умеет делать транзакции Юникодом.
      Тот, который на собеседовании написал минимум три образца плохого кода.

      На его футболке написано: «Единство дизайна означает элитность архитекторов».


      1. sevikl
        19.02.2018 16:35

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


    1. F0iL
      19.02.2018 21:20

      Ну как сказать, я в жизни ни строчки кода не написал на Java, но при этом вполне себе имею представление о ее достоинствах и недостатках, и даже фольклор с этим связанный вспоминается. Тут уже вопрос скорее на кругозор в современном мире :)

      А если серьезно, то по-моему вполне логично ожидать, что в зависимости от позиции, в вопросах вместо Java будет %your_languange% или %your_platform%.


      1. domix32
        20.02.2018 01:16

        Подразумевается, что без джавы бэкэнда не существует


      1. webkumo
        20.02.2018 10:55

        Так вопрос не о достоинствах и недостатках (хотя многие недостатки исключительно субъективны), а о том, "почему многие разработчики не любят Java". А вот это уже бред, ибо не любить можно за что угодно (например, что там "if" а не "если")


        1. VolCh
          20.02.2018 12:08

          Так собеседующему интересно мнение собеседуемого, пускай даже "там "if" а не "если"". Вопрос не подразумевает обязательного перечисления недостатков близкого к объективному или субъективной позиции "почему я не люблю Java". Вопрос подразумевает, скорее всего, осведомленность в области "джавасрачей". :)


      1. zzzmmtt
        20.02.2018 13:48
        +1

        Какой ваш самый нелюбимый язык программирования и почему именно Java?


  1. AstarothAst
    19.02.2018 13:37

    >> транзакции в СУБД пятилетнему ребёнку.
    Ну, как тут не вспомнить гениальное:
    XXX шо есть транзакцыи?
    YYY как бы тебе объяснить.
    YYY вот ты бежышь срать в толчок.
    YYY но по дороге не донёс.
    YYY и обосрался.
    YYY так вот с транзакциями можно сделать так, будто ваще и не бежал и не обосрался


  1. Px2
    19.02.2018 13:39
    +4

    Можно вопрос? Многих получилось нанять?


  1. jetcar
    19.02.2018 14:04

    хехе, я как минимум на треть вопросов не ответил бы, это я такой глупый или вопросы?
    да и некоторые ответы могут превратиться в нехилый холивар вместо собеседования :D


  1. iit
    19.02.2018 14:06

    я middle php разраб и ответил всего на 80% вопросов (не знаю java, нуб в nosql и не teamLead для открытых вопросов) при чем по ощущению правильных ответов процентов 40-50. Это нормально?


    1. maserg
      20.02.2018 02:28

      middle php разрабы пишут слово «причем» именно так. вы уверены насчёт 80%?


      1. kloppspb
        20.02.2018 05:16

        И запятые туда же? Уже мiddle?


        1. iit
          20.02.2018 06:34

          Извиняюсь, забыл отправить комментарий на проверку моему личному grammar nazi


          1. kloppspb
            20.02.2018 06:46

            Для таких забывчивых придумали pre-commit хуки. А пока — давай, до свидания.

            P.S. Чем форма «извиняюсь» отличается от «прошу прощения» объяснять надо, или тоже в школе не доучили?


            1. poxvuibr
              20.02.2018 18:22

              Объясните мне, я до сих пор уверен, что не отличается практически ничем.


              1. JC_IIB
                21.02.2018 01:22

                Ну, типа «извиняюсь» — это за то, что ты собираешься сделать, а «прошу прощения» — за уже совершенное. «Извиняюсь, можно я пройду? Ох, я наступил вам на ногу, прошу прощения.» В английском excuse me/I am sorry вроде бы точно так же работает.


            1. webkumo
              20.02.2018 19:00

              Различие форм "извиняюсь" и "прошу прощения" — для эстетов. И классические объяснения училок "извиняю себя" некорректно, т.к. форма скорее несёт смысловую нагрузку "приношу извинения", а в такой формулировке разница ещё более никакая.


    1. Levhav
      20.02.2018 05:10

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


      1. ToshiruWang
        20.02.2018 12:46

        А если 0, включая автора?


  1. svboobnov
    19.02.2018 14:14

    ПМСМ, самый лучший вопрос: «Объясните ${базовая_технология} пятилетнему ребёнку.»
    Часто бывает так, что работать надо не со знакомым языком/ технологией, а с чем-то специализированным. К примеру, 1С-ники иногда поддерживают groovy-код, а джависты попадают в Perl или JavaScript или вообще в ABAP, питонисты попадают в 1С и т.п…
    И тут тимлид ищет тех, кто знает основы (сетевые протоколы, устройство юникода и принципы работы СУБД).


    1. storoj
      20.02.2018 02:44

      Часто бывает так, что работать надо не со знакомым языком/ технологией..

      а с пятилетними детьми



  1. linuxover
    19.02.2018 14:15
    +1

    некоторые вопросы — сомнительны.


    Почему goto — это зло?

    goto — это не зло, а добро. goto позволяет строить читабельный код, в сложных случаях. Есть ряд случаев где без goto будет кошмар. например linux kernel смотрим, там очень много такого паттерна:


    foo(...)
    {
        if (!init_some1())
            goto deinit_some1;
        if (!init_some2())
             goto deinit_some2;
        // и так далее
    
         // деинициализируем в обратном порядке
    
        deinit_some1:
            //
        deinit_some2:
           //
           // и так далее
    }

    Почему глобальные объекты и статика — это зло?

    и ниже есть вопрос-предложение написать singletone. Как-то определиться надо или они зло или нет.


    1. Free_ze
      19.02.2018 14:39

      Как-то определиться надо или они зло или нет.
      Темной силы стороной владеть уметь необходимо!


      1. romashko_o
        20.02.2018 23:31

        Это похоже на кальку с английского «if they are evil or not». Я начал за своей дочерью 5 лет замечать нетипичные для русского языка конструкции типа этой, у нее есть оправдание — она пошла в англоязычную школу, но дома говорит только на русском, конструкции стала уже путать.


    1. m1n7
      19.02.2018 16:48

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


      1. mirrr
        20.02.2018 11:13

        А можно идеальный пример с goto? А то у меня как-то так получилось:

        function()
        {
            if(!SUCCEEDED(Operation1()))
                return OPERATION1FAILED;
        
            if(!SUCCEEDED(Operation2()))
                return OPERATION2FAILED;
        
            if(!SUCCEEDED(Operation3()))
                return OPERATION3FAILED;
        
            if(!SUCCEEDED(Operation4()))
                return OPERATION4FAILED;
        
            return S_OK;
        }
        


        1. linuxover
          20.02.2018 13:45

          если в Вашем примере if'ов множество, а видов return'ов скажем 2-3 и помимо return перед return делается немножко работы, то использование goto просто идеально получается.


          1. mirrr
            20.02.2018 14:14

            Пример не мой, а тот, о котором вы писали: «идеально рефакторится goto».


    1. alexzzam
      19.02.2018 17:58
      +1

      Нуу, ответ, видимо, в том, что goto провоцирует писать код с глупыми ошибками или код, в котором крайне трудно разобраться.
      Например, в вашем примере написано «деинициализируем в обратном порядке», а порядок тот же.


      1. RiseOfDeath
        19.02.2018 18:11
        +1

        Я думаю в его случае там опечатка и имелось ввиду:

        foo(...)
        {
            if (!init_some1())
                goto deinit_some1;
            if (!init_some2())
                 goto deinit_some2;
            // и так далее
        
             // деинициализируем в обратном порядке
        
            deinit_some2:
                //
            deinit_some1:
               //
               // и так далее
        }
        


        Неоднократно видел такое в сишных прогах.


        1. fukkit
          19.02.2018 20:11

          И чем это лучше скобочек (которые неявные, зато контролируемые, goto)?
          Вложенность кода понижаем? Если 1-5 уровней — можно и вложить, если больше — кривота и смелл, что с goto, что без.


          1. VolCh
            19.02.2018 21:05

            Тем, что deinit_some1 автоматически исполнится после deinit_some2, с одной стороны. А, с другой, deinit_some* можно исполнить с любого уровня, не дублируя код.


        1. kotyara1005
          19.02.2018 21:07

          Почему нельзя так?

          foo(...)
          {
              var int flag1 = 0, flag2 = 0;
              if (!init_some1())
                  flag1 = 1;
              if (!init_some2())
                   flag2 = 1;
              // и так далее
          
               // деинициализируем в обратном порядке
          
              if flag2:
                  //
              if flag1 || flag2:
                 //
                 // и так далее
          }


          1. NeonMercury
            19.02.2018 22:12

            Потому что часто компоненты init_some2() и init_some1() взаимосвязаны.
            Сравните код какого подхода чище:


            void foo()
            {
                Window *wnd = CreateWindow();
                if (!wnd) goto cleanup_wnd;
            
                Context *ctx = GetContext(wnd);
                if (!ctx) goto cleanup_ctx;
            
                Renderer *renderer = GetRenderer(ctx);
                if (!renderer) goto cleanup_renderer;
            
                renderer->drawline(0, 0, 100, 100);
            
            cleanup_renderer:
                FreeRenderer(renderer);
            cleanup_ctx:
                FreeContext(ctx);
            cleanup_wnd:
                DestroyWindow(wnd);
            }

            Или:


            void foo()
            {
                bool wnd_failed = false;
                bool context_failed = false;
                bool renderer_failed = false;
            
                Window *wnd = CreateWindow();
                if (!wnd) 
                    wnd_failed = true;
            
                Context *ctx = NULL;
                if (!wnd_failed) 
                    ctx = GetContext(wnd);
                if (!ctx) 
                    context_failed = true;
            
                Renderer *renderer = NULL;
                if (!context_failed) 
                    GetRenderer(ctx);
                if (!renderer) 
                    renderer_failed = true;
            
                if (!renderer_failed)
                    renderer->drawline(0, 0, 100, 100);
            
            if (renderer_failed)
                FreeRenderer(renderer);
            if (context_failed)
                FreeContext(ctx);
            if (wnd_failed)
                DestroyWindow(wnd);
            }


            1. vedenin1980
              19.02.2018 22:45

              по мне лучше

              Так
              void foo()
              {
                  int stage = 0;
                  Window *wnd = CreateWindow();
                  if (wnd) { 
                     stage++;
                     Context *ctx = GetContext(wnd);
                     if (ctx) { 
                           stage++;       
                           Renderer *renderer = GetRenderer(ctx);
                           if (renderer) {
                                stage++;             
                                renderer->drawline(0, 0, 100, 100);
                            }
                       }
                 }
              
                switch(stage) {
                 case 2:
                     FreeRenderer(renderer);
                 case 1:
                     FreeContext(ctx);
                 case 0 :
                     DestroyWindow(renderer);
              }
              


              1. vedenin1980
                19.02.2018 22:53

                Не заметил, естественно нужно переменные Context *ctx, Renderer *renderer объявлять до первого блока и передавать в функцию release.


                1. m1n7
                  19.02.2018 23:23

                  В первом случае:
                  Допустим, в случае полного успеха уничтожать ничего не надо. Делаем if перед свичом?


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


                  1. vedenin1980
                    20.02.2018 00:01

                    Допустим, в случае полного успеха уничтожать ничего не надо. Делаем if перед свичом?

                    Нет. в случае успеха stage = 3 и свич не выполнится.

                    Вот уже появилась функция о четырех переменных, вместо простого гоуту

                    Во-первых, не всегда с 4 переменными, при классах в C++ переменные могли быть полями, так же они могут быть глобальные, частями одной структуры или даже массива (вы же все равно их как-то использовать и освобождать будете? Тогда код в примере выше все равно неправильный, так как созданные объекты в случае успеха никогда не удалятся).

                    Во-вторых, в случае программирования бритва Оккама не работает. Принцип единственной ответственности и чистый код советуют делать функции с одной ответственностью — в данном случае, их две — создать и очистить в случае ошибки. Поэтому с определенной стороны (для понимания другими разработчиками), две функции лучше чем одна, но большая.

                    P.S. Вопрос, что будет если вы в последнем goto вместо goto cleanup_renderer напишите goto cleanup_ctx? Правильно утечка памяти, причем другой программист голову сломает это специально так задумано (может вы по каким-то причинам решили пока рендер не очищать) или вы ошиблись.
                    Goto чуть-чуть экономит место, но делает код сложнее для понимания. Оно того стоит?


              1. Deosis
                20.02.2018 08:17

                В ваших примерах окно не очищается.
                Так какой код лучше: с багом или без?


                1. mirrr
                  20.02.2018 12:03

                  -


              1. RedCatX
                20.02.2018 09:07
                +1

                Использование «проваливающихся» case — практически то же самое что использование goto. Но код с goto при этом чище выглядит…


              1. linuxover
                20.02.2018 13:46

                switch — это по сути тот же оператор goto. когда можно goto свести к одной переменной — это switch, когда нельзя — это goto :)


                1. vedenin1980
                  20.02.2018 14:26

                  Ну, так все циклы это тоже goto по большому счету, (while(...) {} это m: if(...) {… goto m;}). :)

                  В ваших примерах окно не очищается.
                  Так какой код лучше: с багом или без?

                  Это называется описки (увы, писал без компа), исправить примеры ничего не стоит.


                  1. zzzmmtt
                    20.02.2018 15:22

                    А если залезть в ассемблер… То там фактически все условные операторы (jnz, jz, je и тд) — goto в чистом виде.


            1. mirrr
              20.02.2018 11:57

              В более объемном и сложном коде goto — зло, так как вносит серьезную путаницу и усложняет чтение. А для такого простого кода ни goto ни switch не нужны:

              void foo()
              {
                  Window *wnd = CreateWindow();
                  if (wnd) {
                      Context *ctx = GetContext(wnd);
                      if (ctx) {
                          Renderer *renderer = GetRenderer(ctx);
                          if (renderer) {       
                              renderer->drawline(0, 0, 100, 100);
                          }
                          FreeRenderer(renderer);
                      }
                      FreeContext(ctx);
                  }
                  DestroyWindow(wnd);
              }
              

              *Это если предположить, что нам действительно зачем-то нужно очищать пустые объекты, как у вас в примере, иначе даже проще получится.


            1. webkumo
              20.02.2018 12:49

              А разве такое использование if-ов или свичей у vedenin1980 — не тот же code smell?!!! Имхо лучше как-то так:


              void foo() {
                  Window *wnd = CreateWindow();
                  if (wnd) {
                      context(wnd);
                  }
                  DestroyWindow(wnd);
              }
              void context(Window *wnd) {
                  Context *ctx = GetContext(wnd);
                  if (ctx) {
                      render(ctx);
                  }
                  FreeContext(ctx);
              }
              void render(Context *ctx) {
                  Renderer *renderer = GetRenderer(ctx);
                  if (renderer)
                      renderer->drawline(0, 0, 100, 100);
                  FreeRenderer(renderer)
              }


          1. alix_ginger
            20.02.2018 12:17

            У Вас даже если init_some1() вернет 0, init_some2() всё равно выполнится. Лучше так:

            foo(...)
            {
                bool init1_success= !init_some1();
                // если init1_success == 0, init_some2() не будет выполнено
                bool init2_success = init1_success && !init_some2();
                // и так далее
            
                // деинициализируем в обратном порядке
            
                if (!init2_success) {
                     deinit2();
                }
                if (!init1_success) {
                     deinit3();
                }
                //
                // и так далее
            }


            С ООП было бы, конечно, гораздо красивее и понятнее.


            1. fukkit
              21.02.2018 10:45

              С ООП было бы, конечно, гораздо красивее и понятнее.

              Вот именно. Дядьки объектную модель придумали не для того, чтобы круг от элипса наследовать, а потому что задолбались управлять ресурсами вручную. Хочется жить, а нужно следить за порядком выделения и освобождения памяти — даже о крепких нервах взвоешь.

              P.S. Код ваш еще хуже того, что с goto. Вторая и последующие строки будут без надобности исполняться, хотя уже в первой может стать очевидно, что этого не требуется. Плюс замена условий выражениями. Не плюс, а минус, конечно. Ибо абстракции протекли уже во второй строке, где «init2_success» по смыслу является «init1_and_init2_success». Это путь к головокружительному дебагу, слезам, мату и дурной репутации. Не нужно так.


              1. ApeCoder
                21.02.2018 11:07

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

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


              1. Free_ze
                21.02.2018 13:43

                Мне кажется, что наследовать круг от эллипса наследовать — не самая лучшая идея.


                1. ApeCoder
                  21.02.2018 13:53

                  То есть о точке зрения дядек вы судите не потому, что прочитали что-то по истории ООП а потому, что вам что-то кажется?


            1. linuxover
              22.02.2018 09:47

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


      1. linuxover
        19.02.2018 22:25

        да, я писал прямо на форуме — опечатался. конечно в обратном порядке и метки идти должны


    1. F0iL
      19.02.2018 21:23

      Ну в приведенном вами случае, goto это своеобразная замена exceptions, отсутствующим в чистом Си.
      C исключениями этот код будет немного красивее и с меньшей вероятностью допуска ошибки по невнимательности (правда, за счет некого оверхеда).

      По-моему, если вопрос поставлен таким образом, то интервьюер хочет услышать именно о плохих примерах :)


      1. Deosis
        20.02.2018 08:18

        С RAII код ещё лучше.


        1. F0iL
          20.02.2018 10:25

          А с этим никто и не спорит :)


    1. AndreyRodin
      19.02.2018 21:38
      +1

      Надо думать, каждый блок кода, следующий за меткой, должен заканчиваться оператором return? И вот ваша функция уже превращается в блюдо спагетти, пусть даже уложенных ровным слоем. Хотя, возможно, вы просто перепутали последовательность меток в конце функции, и на самом деле они должны следовать в обратном порядке. Вот, кстати, еще один довод в пользу отказа от использования goto — оказывается, можно легко допустить ошибку и не заметить это!

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

      Что касается глобальных объектов, да — по большому счёту это зло. Почему — хорошо объясняется, например, здесь: ru.stackoverflow.com/questions/510910/%D0%9F%D0%BE%D1%87%D0%B5%D0%BC%D1%83-%D0%B3%D0%BB%D0%BE%D0%B1%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5-%D1%8D%D1%82%D0%BE-%D0%B7%D0%BB%D0%BE-%D0%B0-%D0%BF%D0%BE%D0%BB%D1%8F-%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0-%D0%BD%D0%B5%D1%82. Но иногда глобальные обекты все-же приходится использовать, и thread-safe singletone — это лучший паттерн для этого. Кстати, сфера применения паттерна singletone чуть больше, чем просто объявление глобального объекта.


  1. BubaVV
    19.02.2018 14:45
    +3

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


    1. artemmityushov
      19.02.2018 15:02
      +1

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


      1. BubaVV
        19.02.2018 15:06

        Не могу сформулировать, где тут расхождение с наблюдениями. Уровень требований явно вырос, а рабочие процессы усложнились умеренно


    1. zzzmmtt
      19.02.2018 16:55

      Слушаешь вполуха собеседование, или даже проводишь его, и думаешь, что себя бы я не взял…


      1. ToshiruWang
        20.02.2018 12:55
        +1

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


  1. artemmityushov
    19.02.2018 14:48
    +1

    Занятный конечно же списочек, но интересно какой уровень зарплаты предложат человеку который может ответить на все вопросы)

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


    1. JC_IIB
      19.02.2018 14:54
      +3

      Занятный конечно же списочек, но интересно какой уровень зарплаты предложат человеку который может ответить на все вопросы)


      «Ну, для начала, 25 на руки. Белыми, конечно. По итогам года можно будет говорить о постепенном пересмотре зарплаты, накинем пару тыщ, не обидим. А как вы относитесь к переработкам?»


      1. artemmityushov
        19.02.2018 15:08
        +1

        Вот кстати абсолютно согласен, на практике доказано обратная пропорциональность въедливости с широты распросов на собеседовании и размера зарплаты.


      1. samodum
        20.02.2018 00:11

        Если учесть, что 180 тыс в год в Долине норм, то 25 тыс на руки для начала в месяц совсем неплохо.


        1. ToshiruWang
          20.02.2018 13:03

          180 в год? Это не сильно больше МРОТ, налоговая за такое а-та-та сделает, даже в долине реки Волга (не говоря про Силиконовую долину).


    1. Hokum
      19.02.2018 15:00
      +1

      Все зависит от «принимающей» стороны. У меня был опыт когда на собеседовании у меня спросили мое отношение к некоторой вещи (подзабыл, что именно было, так как обсуждали несколько вещей). В процессе обсуждения я много рассказывал, что думаю, почему думаю, когда бы стал использовать. В конце мне сказали, что они сами не сторонники этого, но им понравились мои рассуждения. Не часто удается так приятно пообщаться на собеседовании без какого либо холивара и единственно верной точки зрения.
      На мой взгляд «открытые вопросы» хороший вариант понять как рассуждает кандидат. Да и вообще понять насколько комфортно общаться с человеком, как он воспринимает критику. Все таки живем и работаем мы чаще в команде и общение играет не последнюю роль.


  1. Szer
    19.02.2018 15:53

    Почему глобальные объекты и статика — это зло? Можете показать на примере кода?

    Чо эт сразу зло-то? В ФП вот всё по умолчанию статика и глобальные объекты. Ну не учитывая разбивку на модули (по сути неймспейс).


    Наверное стоит спрашивать почему ИЗМЕНЯЕМЫЕ глобальные объекты зло? Но и это не всегда правда, может у меня есть изменяемый глобально параметр LogLevel, небеса не развернутся если я его буду менять из разных кусков кода.


    Многие другие вопросы заранее в себе содержат "правильный" ответ, который собеседуемый должен взять за основу рассуждений (например: почему Java это плохо?).


    Короче, плохой опросник.


    1. ivanra
      20.02.2018 09:36

      На самом деле, тема статьи намекает.
      Для бэкенд-разработчика статика — зло очевидное. Да и за глобальными объектами нужно внимательно приглядывать. Тут даже кода не надо приводить, только 2 волшебных слова: «сервер приложений»


      1. domix32
        20.02.2018 10:30

        Только статикой они почему-то зовут статические переменные, а не неизменяемые данные для раздачи клиентам.


        1. VolCh
          20.02.2018 12:11

          Потому что сервер приложений их не раздаёт. Ваш КО.


      1. Szer
        20.02.2018 10:35

        Я вот бекенд разработчик, занимаюсь "чёрными ящиками" (вход -> магия -> выход) — WebAPI, ETL, Streaming. И мне очевидно две вещи:


        • я хочу всё распараллелить, заасинхронить
        • я не хочу проблем

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


        Я видимо плохой бекенд разработчик, потому что хороший, судя по опросу, использует для бекенда исключительно ООП.


        1. ivanra
          20.02.2018 18:41

          иммутабельность хорошо, но недостаточно. Ключевые слова «Сервер приложений».
          Конечный пользователь берет и устанавливает несколько экземпляров приложения, с разными контекстами, на одной виртуальной машине. Какой будет результат?
          Про библиотеки и говорить нечего


        1. PashaNedved
          20.02.2018 18:47
          -1

          Я видимо плохой бекенд разработчик, потому что хороший, судя по опросу, использует для бекенда исключительно ООП.

          Хорошие разрабы используют ОО языки для процедурного программирования.


          1. Szer
            20.02.2018 19:11

            Хорошие разрабы используют ОО языки для процедурного программирования.

            Эту фразу стоит превратить в вопрос:


            Расскажите почему хорошие программисты используют ОО языки для процедурного программирования?

            и смело добавлять в статью, настолько она сильная.


            Я не знаю как ещё это комментировать.


    1. 0xd34df00d
      20.02.2018 22:49

      Можно пример глобальных объектов в ФП?


      1. Szer
        20.02.2018 23:09

        Пример на F# (но синтаксис у ML подобных языков очень похож)
        Глобально объявленный оператор сложения, два значения и результат:


        let inline (+) x y = x + y
        
        let a = 1
        let b = 2
        let c = a + b

        объявлять класс не нужно. идентификаторы a,b,c и оператор (+) будут доступны всем желающим.


    1. eoffsock
      21.02.2018 14:00

      Насчет ФП.

      В Erlang вообще нет глобальных и статических переменных, только локальные, принадлежащие стеку или куче процесса. Процесс закончился — память очищаем, все в мусорку улетело, все параметры, переменные, результаты, мэйлбокс. Хотите что-то передать — будьте добры явно этим озаботиться. Собственно, для того gen_server и придумали, чтобы можно было эмулировать сохранение состояния.

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


  1. Lofer
    19.02.2018 15:54

    Вопросы о сервис-ориентированной архитектуре и микросервисах:
    • В чём разница между SOA и микросервисами?

    А-А-А-А-… как это развидеть ?!?!


  1. Naglec
    19.02.2018 16:35
    +1

    По ООП нет вопросов? Забавно.


  1. pfihr
    19.02.2018 18:02
    -1

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


  1. RiseOfDeath
    19.02.2018 18:04

    • Что случится, если я отсканирую зеркало?

    Люли от владельца сканера? Вообще будет черный лист. Вопрос, судя по формулировке, не предполагает объяснения почему. Честно говоря я не знаю почему, но тем не менее он реально будет черный… а люли не приятными.

    • Почему ответы Quora лучше, чем Yahoo Answers?

    А что это? Я оба названия первый раз слышу. Или туда берут только тех, кто знает?

    • Сыграем в игру: защитите Cobol против современных языков и попробуйте найти как можно больше разумных аргументов.

    А если я кобол вообще ни разу в жизни не видел то тоже не подхожу?

    upd.
    Погуглил… афигеть, оно еще живо… и это с таким-то жутким синтаксисом.


    1. domix32
      20.02.2018 01:22

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


      1. RiseOfDeath
        20.02.2018 09:45

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


        1. VolCh
          20.02.2018 12:13

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


        1. domix32
          20.02.2018 20:55

          Просили только плюсы


  1. Arris
    19.02.2018 18:11
    +1

    Если бы вы могли вернуться в прошлое, какой совет дали бы молодому себе?

    Чувак, я из твоего будущего. Мой тебе добрый совет: иди на кружок бокса, авиамоделирования или дизайна. Не ходи в тот корпус, не ходи.


  1. samodum
    19.02.2018 18:34

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


  1. StrangerInTheKy
    19.02.2018 18:39
    -1

    Объясните Юникод или транзакции в СУБД пятилетнему ребёнку.
    Просто объяснить или так, чтобы он понял? Если второе, надо ли в конце проводить проверку того, что пятилетний ребенок все понял правильно? А то, что мозг пятилетнего ребенка недостаточно развит для понимания концепций такого уровня сложности, автора не смущает?


    1. Free_ze
      19.02.2018 18:43
      +1

      А то, что мозг пятилетнего ребенка недостаточно развит для понимания концепций такого уровня сложности, автора не смущает?
      Вы сильно недооцениваете детские мозги. В этом возрасте они такие объемы информации перелопачивают, что людям зрелого возраста и не снились.


      1. Arris
        19.02.2018 18:55
        -1

        Дело не в объемах информации, а в умении строить связи между абстракциями. Это приходит со временем, по мере развития мозга. В среднем по больнице, разумеется.

        Можно объяснить первокласснику как решать дифуры. Только вы почитайте про судьбу вундеркиндов сами.


        1. Free_ze
          19.02.2018 19:10

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


          1. ToshiruWang
            20.02.2018 13:08

            «Вы просто их не понимаете, раз не можете объяснить пятилетнему ребёнку»(Ц)


            1. Free_ze
              20.02.2018 13:41

              Надеюсь, что это сарказм.


              1. ToshiruWang
                20.02.2018 15:47

                Скорее — передразнивание тех, кто советует объяснять всё условному пятилетнему ребёнку (а они разные) вплоть до квантовой механики.


      1. StrangerInTheKy
        19.02.2018 18:56

        У меня двое детей, 2 и 11 лет. У меня есть знакомые с детьми, с кем я довольно часто пересекаюсь (ну и дети дружат, само собой). У одной пары 4 детей — 6, 4, 2 и 1 год, у другой — трое, 5, 3 и 0,5 года. Я отлично знаю, какие у них мозги в каком возрасте. Ну и профильную литературу (о развитии детского мозга) я тоже читал (правда, научпоп).
        Вот лет с 9 — 10 уже можно начинать пробовать. Некоторые точно поймут.


    1. PashaNedved
      19.02.2018 21:30

      Будь вы на собеседовании, то сразу догадались бы, что надо объяснять не пятилетнему ребенку, а той здоровенной детине, что вас собеседует.


  1. kloppspb
    19.02.2018 19:14

    Безусловно, самое важное для бэкенд-разработчика, так это уметь отвечать на подобные вопросы:

    • Составьте рабочее расписание команды, используя гибкий график (то есть без установленного рабочего времени) и политики отпусков «Бери когда понадобится».

    • Как бы вы справитесь с очень большой текучкой и убедите разработчиков не покидать команду без повышения зарплаты? Что хорошего может сделать компания, чтобы они остались?

    • Какие три главных качества вы цените в коллегах, кроме программирования?

    • Какие три главные вещи о программировании нужно знать гуманитариям, по вашему мнению?

    • Представьте, что компания предоставляет вам один месяц и бюджет для улучшения качества повседневной жизни вас и ваших коллег. Что бы вы сделали?


    1. nizkopal
      19.02.2018 19:36

      самое важное для бэкенд-разработчика


      Чет мне кажется, это не каждому разработчику надо знать. А кому надо, к тому это знание само придет.


      1. kloppspb
        19.02.2018 19:41

        Sorry, тег «сарказм» не поставил :)


    1. ToshiruWang
      20.02.2018 13:13

      Как бы вы справитесь с очень большой текучкой и убедите разработчиков не покидать команду без повышения зарплаты

      Пневмопистолет с гвоздями, пару убедить — остальные сами останутся. Небольшая потеря производительности (прибитыми к столу руками код не набрать), но можно оформить их консультантами. Это будет крайне логичным решением, учитывая остальные вопросы при приёме на работу в компании.


      вам один месяц и бюджет

      А вот и средства для реализации пункта 2.


  1. Aquahawk
    19.02.2018 19:28

    Компания оплачивает те пару недель пока я буду читать им лекции, которые получатся в результате ответов на те вопросы которые знаю. Некоторые не знаю. Но на одном собеседовании и десяток их не обсудить. А на большинство открытых самый правильный ответ: «текущая мода такая, плюсы такие, минусы такие. Ультимативно запрещать себе какие-то вещи опрометчиво, стоит опасаться того и того, в целом практика такая, мне лично нравится вот так, но вот кейс контрпример где общественно осуждаемая практика быстро и качественно решила бизнес задачу, а потом либо была переделана либо исчерпывающе документирована и оставлена, ибо программы пишут чтоб денег фирма заработала»


  1. Fid
    19.02.2018 19:56

    А где развёрнутые ответы? Вопросы любой дурак придумать может.


  1. fukkit
    19.02.2018 19:58
    +1

    Средней креативности вопросы. Но есть и совсем дебильные:

    Если Cat — это Animal, то верно ли, что TakeCare Cat — это TakeCare Animal?


    1. lgorSL
      20.02.2018 01:43

      О, контрвариантность подъехала. Хотя по вопросу фиг догадаешься, чего вообще они хотят.


      1. fukkit
        21.02.2018 10:57

        Догадаться то можно, конечно, но кто нам дал право расширять постановку задачи?
        С точки зрения логики вопрос вырожденный.


        1. ApeCoder
          21.02.2018 11:06
          +1

          С точки зрения логики вопрос не вырожденный. Вы же знаете LSP?


          1. fukkit
            21.02.2018 11:41
            -1

            В такой постановке вопрос не имеет к LSP ровно никакого отношения.


            1. ApeCoder
              21.02.2018 11:42

              Почему?


              1. fukkit
                21.02.2018 11:50

                Там про подтипы, в вопросе про них ничего нет.


                1. ApeCoder
                  21.02.2018 11:54

                  Если Cat — это Animal, то верно ли, что TakeCare Cat — это TakeCare Animal?

                  Слово "это" — ("is a") это как раз про подтипы


                  1. fukkit
                    21.02.2018 12:02
                    -1

                    Я честно пытался вам объяснить.


                    1. ApeCoder
                      21.02.2018 12:18
                      +1

                      :) а я — вам!


    1. dmitry_dvm
      20.02.2018 11:05

      Не такой уж и дебильный. Про контрвариантность надо слышать, чтобы ответить.


  1. x07
    19.02.2018 21:00

    Что вернёт эта функция JavaScript?


    function hookupevents() {
      for (var i = 0; i < 3; i++) {
        document.getElementById("button" + i)
          .addEventListener("click", function() {
            alert(i);
          });
      }
    }
    About Type Erasure, what's the output of this Java snippet, and why?
    ArrayList<Integer> li = new ArrayList<Integer>();
    ArrayList<Float> lf = new ArrayList<Float>();
    if (li.getClass() == lf.getClass()) // evaluates to true
      System.out.println("Equal");

    Это специально так? Или это ошибка копипаста?


    1. Akuma
      19.02.2018 21:34

      Суть даже не в этом, а том, что функция то ничего не возвращает. Обработчики кликов навешиваются и есть «заковырка» с переменной i в цикле, но вот функция ничего не возвращает при этом.


      1. ApeCoder
        21.02.2018 12:22

        o return a value other than the default, a function must have a return statement that specifies the value to return. A function without a return statement will return a default value. In the case of a constructor called with the new keyword, the default value is the value of its this parameter. For all other functions, the default return value is undefined.


        1. Akuma
          21.02.2018 12:37

          Ну да, точно. Давайте докопаемся до undefined.

          Таким образом тут все вопросы можно разобрать до таких косточек, что HR повесится.


          1. ApeCoder
            21.02.2018 13:07

            На самом деле в оригинале "What's the output of this Javascript function?", а в переводе это сейчас "результат выполнения" а не "что возвращает" :)


  1. undersunich
    19.02.2018 21:08

    Вредная статья.Сколько судеб теперь она поломает, сколько отказов в приеме на работу теперь получат именно достойные разработчики!


  1. AndreyRodin
    19.02.2018 22:02
    +1

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


    1. Free_ze
      20.02.2018 11:38

      Приходите вы на пятое собеседование, а там вас ждет тот же список милых дикуссионных вопросов)


  1. DarthVictor
    20.02.2018 01:11

    Вы знаете почему крышки люка круглые, сколько шариков влезет в школьный автобус и как сдвинуть гору Фудзи?
    Вы в совершенстве владеете балансировкой красно-черного дерева?
    Ваши коммиты есть в опенс-сорс, решениях используемых в крупных компаниях?
    Вы подняли и поставили на ноги более двух стартапов? Вы знаете SQL и no-SQL решения?
    Віg Data и Data Science не пустой звук для вас?
    Добро пожаловать к нам, на позицию Front-end developer в стабильный с 2002 года крупный enterprise проект документооборота в одном из крупнейших отечественных банков, в ваши задачи будет входить доработка UI части проекта на основе тикетов от группы поддержки.


    1. domix32
      20.02.2018 01:26
      +1

      Язык разработки: 1С.


  1. Artem_zin
    20.02.2018 01:26

    Похоже пора писать статью "Кто убил сеньйора?"


    1. mSnus
      20.02.2018 06:30

      СеньЙорик… я знал его.


  1. vanburg
    20.02.2018 02:02

    А нормально, что у меня 10+ лет экспы бэкендера, и мне 70% этой инфы никогда не надобны были? По-моему, это коллекция вопросов от с десятка разрабов занимающихся разными уровнями программирования. Я сторонник специализации, надо быть крутым в конкретной области (какой-то части стека), остальное попахивает дилетантством.
    Не встречал еще крутого спеца по морде и по бэкенду одновременно. Что-то из этого будет хромать на фоне дева специализирующегося на чем-то одном, знающего весь инструментарий в совершенстве, когда какие языки и т.п.


    1. VolCh
      20.02.2018 12:17

      Подобные вопросы часто ориентированы не на проверку конкретных знаний, а на широту кругозора. Грубо, поняли о чём вопрос — уже плюсик.


  1. Legion21
    20.02.2018 02:06

    Неактуально… сейчас все блокчейн проекты разрабатывают)


  1. speller
    20.02.2018 05:14

    Из личного.

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

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

    HR, пропускающий два раза подряд интервью по скайпу — так тоже бывает.

    Давать непрошедшим кандидатам фидбэк — западло.

    Лучший способ провести выходные — за решением тестовых заданий. Жена, дети, домашние дела — это всё ерунда.

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

    Немного грустно, когда ты квалифицированнее собеседующего тебя «сеньора» и тебя не берут только поэтому.


    1. Dessloch
      20.02.2018 09:27
      +1

      Походил по собеседованиям и понял одну вещь-все собеседования субъективны, особенно с HR'ами. Профессионализм и тесты-это всё вторично. Будет некая симпатия со стороны собеседников/нанимателей-напишут хороший отзыв даже при «неправильных» ответах, будет антипатия-будут всячески «валить». Никогда не заморачивался по поводу отказов или отсутствия фидбэка-не взяли-мне же лучше, найду лучше работу. И жизнь показывает что так всегда и получается.


      1. speller
        20.02.2018 10:41

        С философской точки зрения — вы абсолютно правы :) Я просто поделился своей болью :) Хочется видеть более приближённый к решаемым задачам процесс отбора. В большинстве же случаев отбор происходит абсолютно хаотичный, а не по конкретным способностям. Это и удивляет. О чём-то подобном не так давно на хабре была статья.


        1. Dessloch
          20.02.2018 18:45

          Я замечал такое только в российских компаниях. Иностранцы более прагматичны и рациональны. Умеешь делать это и это? Нас устраивает. Российские очень придирчивые, хотя платят меньше. Парадокс. И ведь уже разъехались все кто мог, уже и рынок ИТ выскоблен до дна, и всё равно жизнь российского работодателя ничему не учит, продолжают привередничать. Ну ладно, подождём ещё лет 5, просто интересно посмотреть чем это всё закончится и когда уже завезённых гастарбайтеров-дворников начнут переучивать на программистов.


          1. vedenin1980
            20.02.2018 19:34

            Я замечал такое только в российских компаниях. Иностранцы более прагматичны и рациональны.

            Эээ, тут вы не совсем правы. У иностранцев (Европа/США и т.п.) еще важнее личное впечатление, если у вас подвешен язык, вы улыбаетесь, на собеседовании шутите и говорите на хорошем английском ваши шансы намного выше чем у замкнутого ботаника, который обладает огромным опытом, но двух слов связать не может. В России с этим даже попроще.


            1. Dessloch
              21.02.2018 08:06

              В чём я не прав? Вы же сами и подтверждаете мои слова. Я говорю что российские компании слишком много уделяют внимания непонятным тестам вместо того чтобы брать пусть и не блестящих, но старательных, позитивных и улыбчивых людей.
              В России попроще с этим если вы землекоп. Во всех остальных случаях нужны связи и знакомства.


              1. vdshat
                21.02.2018 09:47

                Старательный и улыбчивый идиот — тоже перебор. Не стройте иллюзий по поводу западных компаний. Когда сталкиваешься, то некоторые вещи просто шокируют.


                1. Dessloch
                  21.02.2018 14:14

                  Расскажите что шокирует, очень интересно.


              1. vedenin1980
                21.02.2018 14:46
                +2

                что российские компании слишком много уделяют внимания непонятным тестам

                Эти тесты и вопросы про люки, опишите свои недостатки или кем вы себя видите через 10 лет, пришли с Запада.

                старательных, позитивных и улыбчивых людей.

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

                Во всех остальных случаях нужны связи и знакомства.

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


  1. EgorZanuda
    20.02.2018 09:07

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


  1. j-ker
    20.02.2018 10:18
    -1

    В целом-то неплохой набор для создания собеседования. Правда, вот, не на бекенд и даже не на фронтенд, и даже не на программиста вообще, а на роль автора-теоретика для выпуска какой-нибудь очередной книжки из разряда "Стань программистом на… за… часов". Я не шучу, правда. Вся эта муть интересна, как теория. На практике же это не более, чем повод потолкаться в курилке, на хабре или в обществе себе подобных фриков где-нибудь в большой картонной коробке под мостом (это я про будущее, т.к. скоро программировать будет ИИ вместо нас и ряды маргинальных жителей трущоб пополнятся МИЛЛИОНАМИ небритых, патлатых и одиноких бродяг, готовых за еду на ...)


    1. speller
      20.02.2018 10:25

      Кому-то придётся управлять ИИ, обучать его и контролировать, поэтому «патлатым» применение всегда найдётся ))


  1. bluetooth
    20.02.2018 10:59

    И при чем тут канализационный люк из Праги?


    1. m1rko Автор
      20.02.2018 11:15

      Это одна из категорий вопросов на собеседовании.


      1. bluetooth
        20.02.2018 11:18

        Понятно. У нас таких вопросов не задают, и слава Богу!


  1. laughman
    20.02.2018 11:31

    «Какие три главных качества вы цените в коллегах, кроме программирования?
    Какие три главные вещи о программировании нужно знать гуманитариям, по вашему мнению?»

    я считаю, важнее было бы:
    — какие три главные качества/вещи вы хотите от вашего руководства?
    — интересно ли вам, какие три главные качества/вещи хотят от вас?


  1. modestguy
    20.02.2018 11:56

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


    1. VolCh
      20.02.2018 12:19
      +2

      Кто вам мешает их подготовить и задать?


    1. vedenin1980
      20.02.2018 12:52

      если бы соискатель также составлял список технических вопросов и это было бы вроде версуса — ты отвечаешь на мои, я на твои.

      А это можно сделать на любом собеседовании. Вас спрашивают о технологии X, а вы даете ответ и спрашиваете «а как реализовано в вашей компании? А почему именно так?», иногда техническую беседу можно построить в виде одних ваших вопросов «У вас так? А вы не сталкивались с проблемой Y? Сталкивались? Я помню на одном проекте ее решил способом Z. А как это работает с технологией N?», главное задавать вопросы и давать комментарии так чтобы все поняли, что вы в теме (это тоже не легко).


      1. VolCh
        20.02.2018 13:05
        +1

        Ну, на некоторых бывает "Вопросы здесь задаю я", но на таких радоваться нужно, что "провалил" :)


        1. vdshat
          21.02.2018 09:51

          Или: «Я с удовольствием отвечу на ваши вопросы. Но у нас не осталось времени, к сожалению»


  1. OlegTar
    20.02.2018 14:25

    Почему в большинстве языков индекс массива начинается с нуля?

    В Си массив — это указатель, индекс указывал смещение относительно начала массива.
    Ты мог обратиться к элементу несколькими способами. через [], через *(pointer + 2) (не уверен, что правильно написал). Твой код был завязан на то, как массив хранится в памяти

    Думаю, остальные языки просто продолжили традицию.
    в PL/SQL и Паскале индекс начинается с 1, и всё нормально. В Перле по умолчанию ноль, но можно поменять, хоть на 2.
    Думаю нет какой-то специальной причины, почему 0 во многих языках, где тебе похрен на то, как массив хранится в памяти. В других языках у тебя есть некая абстракция «массив», и ты не знаешь, как элементы хранятся в памяти: рядом, не рядом, а обращение к элементу массиву всегда происходит через операцию [] и никак иначе.


    1. VolCh
      20.02.2018 15:06
      +1

      Проще: потому что большинство языков старались быть похожими на C, а не на Fortran :)


    1. ToshiruWang
      20.02.2018 15:53
      +1

      Паскале индекс начинается с 1

      var a: array[-1..1] of integer; и вот он с -1, с 1 начинался во всяких примерах обычно.
      Написали array[0… и он уже с 0.
      Вот string в OP/Delphi с 1, потому как в 0 длина (и для совместимости в длинных строках).
      И вообще массив начинается с low(массив), для динамических array of это 0.


  1. dim2r
    20.02.2018 15:29

    За что некоторые не любят java? При большом количестве понтов есть куча неадекватностей. Например:

    1) Компилятор не разбирается в константных выражениях. Этот кусок кода компилируется, хотя содержит ошибку, которую можно выявить уже на этапе компиляции.

    int i=(false?0:null);
    


    2) Возможно неожиданное зависание в рекурсивной процедуре. Ни какой ошибки не выдается, просто висит.
     public static void work(){
            try{
                work();
            }finally{
                work();
            }
        }
    


    3) Все говорят о high perfomance в java. IMHO high perfomance связан с утилизацией оборудования на полную катушку, а java далека от этого. Например, мало кто из джавистов знает, чем отличается физическая память от виртуальной, и что такое блокировка блоков в физической памяти. Ушел процесс в swap и будешь терять миллисекунды при просыпании. В примерах на параллелизм нет анализа, сколько процессоров в системе.

    4) Все спрашивающие озабочены деталями, как работает сборщик мусора. IMHO в хорошей системе это не должно быть проблемой.

    5) При переполнении числа не выдается ошибка, а просто идет по кругу. То есть можно не заметить переполнения и попортить данные.
     int i = Integer.MAX_VALUE+1;
    


    Я нашел пунктов 10, которые меня смущают при всей рекламе крутости java.


    1. Szer
      20.02.2018 16:42

      При большом количестве понтов есть куча неадекватностей.

      Так можно про любой язык сказать если в нём разобраться.


    1. vedenin1980
      20.02.2018 19:26
      +1

      У Java много проблем никто не спорит (многословность, костыли обратной совместимости), но в данном случае у вас полно придирок и неточностей, лень все разбирать, но пример

      1) Компилятор не разбирается в константных выражениях. Этот кусок кода компилируется, хотя содержит ошибку, которую можно выявить уже на этапе компиляции.
      int i=(false?0:null);

      Это и не должен. Такие вещи вроде «Integer x = null; int i = x;» приведут к ошибке, но сознательно не ловятся компилятором. Если программисты хотят они настраивают в IDE статистический анализ, который ловит такие странные вещи и не дает их скомпилировать или сделать коммит.

      Во-первых, стандарт языка общий для большого количества Java компиляторов (да их много), усложнение проверок сильно усложнит реализацию стандарта (там и так много тысяч тестов, которые нужно пройти).
      Во-вторых, компилятор сознательно не додумывает за программиста, хочешь бесконечный цикл — делай, напишешь так чтобы null pointer в первой строчки будет, компилятор не будет тебе мешать. Хочешь чтобы тебя ловили за руку — статические анализаторы (например, IDEA) тебе в помощь.
      В-третьих, компилятор всегда компромисс между скоростью компиляции и количеством функций. Хочешь добавить сто тысяч подобных проверок — ожидай, что компиляция будет как в С идти медленно и печально. Это всем не надо, поэтому этого в стандарте нет.

      2) Возможно неожиданное зависание в рекурсивной процедуре. Ни какой ошибки не выдается, просто висит.

      Зачем так сложно? Можно же проще:
      public static void work(){
             work();
      }
      

      Бесконечная рекурсия, где система просто весит и в лучшем случае упадет с стак оферфлоу экспешнеом. А что вы тут ожидали? Можно еще бесконечный цикл написать — тоже система повиснет. Это ожидаемое поведение, компилятор не должен за вас решать нужен ли вам бесконечный цикл/бесконечная рекурсия или нет. Но это тоже ловится статистическими анализаторами, надо — включайте, не надо не включайте.


      1. dim2r
        20.02.2018 23:07

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


        1. vedenin1980
          21.02.2018 01:20

          А смысл? Проблемы и плюсы джавы совсем не в том что вы описывает.

          3) high perfomance в java — надо понимать, что java почти всегда медленнее C/C++ и его аналогов (Go, D и т.д.), но скорее всего быстрее многих высокоуровневых языков. В целом, просто для серверных приложений, бекэнда, обработки больших данных и т.п. производительности Java хватит с головой, а если тормозить будет то скорее из-за кривых рук. Вопросы кол-ва процессоров, памяти и т.п. можно отдать на откуп виртуальной машине, она в большинстве случаев сама разбирается. Это нелепо когда пытаются оптимизировать производительность на копейки, когда один кривой sql запрос сжирает в тысячи раз больше ресурсов. Для простых задач вы скорее упретесь в пропускную способность сети, кол-во открытых портов, скорость работы жесткого диска или базы данных.
          С другой стороны, если вам нужна максимальная производительность на уровне C++ (игрушки, ОС, драйверы, 3D моделирование и прочее) — вам не к Java.

          4) Сборщики мусора в Java (их несколько на выбор) очень сложные и отлаженные системы. В 90-95% случаев стандартный и так будет хорошо работать. Но с помощью выбора сборщика и его настройки можно получить приличный выигрыш в оставшихся 5-10%. Поэтому знать его работу — полезно (ну и чтобы не сделать утечек из-за кривых рук).

          5) Можно, это решение архитекторов языка. Вероятно причина в производительности (каждый раз проверять на переполнения — дорого), Integer хранит 2 млд. значений, крайне редко кому-то удается вызвать переполнение без танцев c Integer.MAX_VALUE или ошибке в коде, А вызвать переполнения long или BigInteger — вообще крайне сложно. Если у вас может быть переполнения используйте long/BigInteger или специально проверяйте на переполнения.

          Сначала купился на рекламу

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

          Но для новых проектов есть более интересные языки в мире JVM (скала, котлин), для десктопных приложений под Вин — лучше взять, скорее всего что-то вроде Net. Если вам интересны самые новые подходы в разработке — в Java новые возможности приходят медленно и печально (впрочем для энтерпрайза это скорее плюс).

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

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


          1. dim2r
            21.02.2018 09:09

            Примерно понятно, что Вы имеете в виду. У меня круг задач другой был до недавнего времени.
            На счет переполнения чисел для меня была самая болезненная проблема в одном проекте, в котором было много математики. Проект работает, работает, а потом фиг знает где начинает что-то глючить. И разобраться трудно. Приходилось обкладывать проверками вручную. На паскале, например, есть опция компилятора, которая заставляет при переполнении вызывать исключение и отладчик.


          1. springimport
            21.02.2018 21:11

            Каждый раз получаю море удовольствия когда работаю в приложениях на джаве. Для примера есть PHPStorm. В проекте с magento 2 (несколько К файлов) индексация занимает до минуты на i7 с 16 гб и, что самое главное, ssd. И вот после этого у меня большие подозрения на скорость выполнения, хотя и кривость кода допускаю, конечно.


            1. VolCh
              22.02.2018 09:05

              Знаете что-то схожее по функциональности с большей скоростью работы?


      1. WASD1
        21.02.2018 18:13

        С одной стороны мы рискуем уйти в холивар, но с другой от языка ожидаешь некоторого уровня контроля за кодом «по-умолчанию». Вот я бы (на java не пишу) ожидал бы, что в настройках по умолчанию java выведет как минимум 2 варнинга в compile-time.

        int i=(false?0:null);

        Просто по анализу AST проверить семантику типов в операции. Для языка со строгой типизацией, неужели сложно?

         public static void work(){
                try{
                    work();
                }finally{
                    work();
                }
            }
        
        Цикл без выходной дуге в графе вызовов? Тоже практически без накладных расходов (при компиляции). И тоже я бы ожидал от java увидеть при компиляции варнинг.


        1. vedenin1980
          21.02.2018 20:38

          ожидал бы, что в настройках по умолчанию java выведет как минимум 2 варнинга в compile-time.

          1) Null можно использовать как любой тип. То есть выражение «условие? число: null» — полностью корректно. Если бы было Integer i=(false?0:null); — это было бы 100% рабочее выражение. Если бы была число и скажем строка вместо null — программа бы не собралась.

          2) Данное выражение не константа, оно аналогично следующему коду с точки зрения компилятора:
              Integer tmp;
              if(false) {
                   tmp = null;
              } else {
                   tmp = 0;
              }
              int i = tmp;

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

          Цикл без выходной дуге в графе вызовов? Тоже практически без накладных расходов (при компиляции). И тоже я бы ожидал от java увидеть при компиляции варнинг.

          В ряде случаев это корректный код, скажем иногда используется код «for(;;) {...}» для того чтобы один тред висел в бесконечном цикле, а другой делал работу.


  1. mbait
    20.02.2018 17:10

    Когда кэш не нужен и даже вредит?

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


  1. alek0585
    20.02.2018 19:59

    После такой статьи я ожидал увидеть у автора околонулевую карму. А она 385,5
    Да и плюсов у статьи 36.
    Хабраюзерские фишки видимо))


    1. VolCh
      20.02.2018 20:06
      +1

      Просто не все воспринимают собеседование как экзамен :)


    1. vedenin1980
      20.02.2018 20:06
      +1

      1. Это перевод за что автору-то карму снижать?
      2. У автора 154 публикации, достаточно чтобы набрать кармы,
      3. Часть вопросов полезные, часть вопрос — вредные, но их тоже могут задать на собеседовании. Интервью по этой статье проводить я бы не стал, а вот просмотреть вопросы при следующем поиску работы — имеет смысл.


      1. alek0585
        21.02.2018 05:06

        Часть вопросов полезные
        Это какие?


    1. alizar
      20.02.2018 20:13

      За этот перевод карму немного отняли, так что не волнуйтесь, всё справедливо. :)


  1. StupidMouse
    20.02.2018 22:11
    -1

    Вопросы по логике и алгоритмам:
    • Написать пример кода, который создаёт утечку памяти.

    Уже третий час не получаеться сделать на javascript, это задание для гениев.


    1. dim2r
      20.02.2018 23:11

      Надо знать особенности сборщика мусора. Некоторые сборщики не обрабатывают циклические ссылки изза того, что используется счетчик ссылок. К java не относится. На javascript не проверял еще.


      1. StupidMouse
        21.02.2018 00:46

        Попробовал с циклическими ссылками — не удалось добиться утечки.
        Находил такое «IE до версии 8 не умел очищать циклические ссылки».
        Также встретил предположение что утечек воможно добиться через замыкание, но достичь желаемого эффетка не удалось, либо V8 слишком умна, либо делал что-то не так.
        Т.е. технически такое возможно (к примеру в IE), но т.к. задача находилась в разделе «Вопросы по логике и алгоритмам», считаю случай с IE не показательным, мелкомягкие всегда умели порадовать своих фанов.


        1. dim2r
          21.02.2018 01:10

          В java у меня один раз получилось для частного случая. В базе oracle можно писать процедуры на джаве. Я забыл закрывать какой-то объект для передачи UDP датаграм. Думал, что сборщик мусора должен автоматически закрывать системные хэндлы, а он зараза не закрывал. И после некоторой работы все UDP порты были заняты, что приводило к коллапсу системы.


          1. webkumo
            21.02.2018 01:48

            Думал, что сборщик мусора должен автоматически закрывать системные хэндлы, а он зараза не закрывал

            А с чего ему их закрывать? Сами закрываются они только вместе с JVM


            1. dim2r
              21.02.2018 09:58

              Ну вот считай утечка. Пооткрывал всякой всячины: файлов, портов, конектов… Объекты java удалил, а системные хэндлы остались.



              1. webkumo
                21.02.2018 11:32

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


                1. oxidmod
                  21.02.2018 11:36

                  В пыхе все само релизится, когда пыха обработала запрос.

                  зы. если это конечно не реакт-пхп или чтото подобное


                  1. F0iL
                    21.02.2018 12:32

                    Потому что время жизни самого приложения на пыхе в большинстве случаев ограничено временем выполнения самого запроса, не? (опять же, как вы верно сказали, если это не какой-нибудь react-php)


                  1. webkumo
                    21.02.2018 13:00

                    Ну вы познакомьтесь с понятием ЖЦ приложения и поймёте что это оно. Только в Java сессия жизни не ограничена одним запросом и не вынуждает придумывать способы быстро загрузить/закешировать данные приложения, которые нужны между сессиями. Естественно, при этом, заставляя разработчиков больше думать о других нюансах.


  1. murminathor
    21.02.2018 00:14
    +1

    «Послушаешь вопросы на собеседованиях — не иначе как гениев ищут. Посмотришь код проекта — и куда только всех гениев дели?»((с)тырено)

    Людей следует искать под конкретный проект, конкретную задачу а не «сферического программиста в вакууме». Соответственно этому нужно и готовить список вопросов. В обсуждаемой статье отсутствует цель найти кого-то определённого, т.к. слишком много направлений затронуто (frontend, backend, менеджмент, архитектура...). К тому же, чтобы обстоятельно ответить хотя бы на половину вопросов, да ещё и с неминуемыми уточнениями по ходу разговора, денька два может уйти влёгкую. Пойдёт-ли на такие расходы фирма и согласится-ли на такое, с позволения сказать, собеседование мало-мальски толковый профи — вопрос, думаю, риторический.

    Вот как своеобразная шпаргалка, база «дежурных» вопросов (а скорее — тем для построения своих вопросов) эта статья очень даже полезна, как по мне.


    1. StupidMouse
      21.02.2018 00:53

      «Послушаешь вопросы на собеседованиях — не иначе как гениев ищут. Посмотришь код проекта — и куда только всех гениев дели?»((с)тырено)

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


      1. murminathor
        21.02.2018 08:56

        Я больше склоняюсь к мысли, что тут работает простое и понятное желание получить лучших из лучших (а платить им… в лучшем случае как среднячкам). Вот только очень уж часто работодатели забывают что это всё-же СОбеседовавшие, которое предполагает СОтрудничество. Из чего следует, что потенциального работника нужно таки заинтересовать, а не продемонстрировать/выпячивать своё превосходство.


  1. Foxcool
    21.02.2018 00:15

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

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

    Т.е. чтоб держать в голове пачку глубоких и порой нечасто используемых знаний, надо себя заставлять их постоянно поддерживать или реально быть увлеченным. Если большая часть времени тратится на задачки для собеседования, вопросы и прочие тесты, то времени и сил на реальные интересы может не оставаться. Стоит ли это редких блистаний у привередливых собеседователей, которые как правило не являются лучшими работодателями и коллегами (согласен с комментарием)? В любом случае, я рад что рынок есть и он довольно свободный. Всегда можно просто не связываться с теми, с кем не удобно. (:


    1. vdshat
      21.02.2018 10:12

      Попадались такие «спринтеры»: собеседование проходят на ура, но ни строчки реального кода не оставили после себя! Заметили закономерность — это «преподаватели» всяких курсов. Полная оторванность знаний от практического применения.
      Либо люди с легкой руки одного сотрудника названными «с альтернативным мышлением». Человек либо фанатик в определенной области, что остальные просто выпадают из поля зрения. Либо комплексы двигают показать свое превосходство над кандидатом.


    1. ApeCoder
      21.02.2018 11:42
      +2

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


      По результатам может быть вывод "Реально крутой в ООП чувак но хреново с облаком, но у нас есть Вася он его научит".


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