Вопросы для собеседования бэкенд-разработчика +40

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

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

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

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


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

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

Этот проект создан по образцу «Вопросов для собеседования на работу фронтендера» от @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
    /#10677098 / -1

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

  2. Free_ze
    /#10677102 / +3

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

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

    • JC_IIB
      /#10677148

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

    • domix32
      /#10677684 / +6

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


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

      • marshinov
        /#10678216

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

    • Artem_zin
      /#10678342

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

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

    • quwy
      /#10678346

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

      • Whuthering
        /#10678586

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

        • quwy
          /#10680546

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

          • Whuthering
            /#10681048

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

            • ApeCoder
              /#10681060 / +1

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

            • quwy
              /#10681986

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

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

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

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

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

    • dim2r
      /#10679340

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

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

      • ApeCoder
        /#10680962 / +2

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

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


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

    • kalininmr
      /#10682038

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

      • linuxover
        /#10682536

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

  3. mak_ufo
    /#10677134 / +1

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

    • ainu
      /#10677158

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

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

      • sevikl
        /#10677610

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

    • F0iL
      /#10678138

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

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

      • domix32
        /#10678330

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

      • webkumo
        /#10678660

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

        • VolCh
          /#10678876

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

      • zzzmmtt
        /#10679214 / +1

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

  4. AstarothAst
    /#10677150

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

  5. Px2
    /#10677156 / +4

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

  6. jetcar
    /#10677222

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

  7. iit
    /#10677228

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

    • maserg
      /#10678386

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

      • kloppspb
        /#10678420

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

        • iit
          /#10678438

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

          • kloppspb
            /#10678444

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

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

            • poxvuibr
              /#10679908

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

              • JC_IIB
                /#10680520

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

            • webkumo
              /#10679992

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

    • Levhav
      /#10678416

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

  8. svboobnov
    /#10677252

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

    • storoj
      /#10678392

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

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

  9. linuxover
    /#10677258 / +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. Как-то определиться надо или они зло или нет.

    • Free_ze
      /#10677320

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

      • romashko_o
        /#10680404

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

    • m1n7
      /#10677636

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

      • mirrr
        /#10678708

        А можно идеальный пример с 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;
        }
        

        • linuxover
          /#10679200

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

          • mirrr
            /#10679288

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

    • alexzzam
      /#10677764 / +1

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

      • RiseOfDeath
        /#10677786 / +1

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

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


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

        • fukkit
          /#10678054

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

          • VolCh
            /#10678122

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

        • kotyara1005
          /#10678126

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

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

          • NeonMercury
            /#10678202

            Потому что часто компоненты 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);
            }

            • vedenin1980
              /#10678222

              по мне лучше

              Так
              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);
              }
              

              • vedenin1980
                /#10678228

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

                • m1n7
                  /#10678250

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


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

                  • vedenin1980
                    /#10678304

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

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

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

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

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

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

              • Deosis
                /#10678466

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

              • RedCatX
                /#10678506 / +1

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

              • linuxover
                /#10679206

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

                • vedenin1980
                  /#10679318

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

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

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

                  • zzzmmtt
                    /#10679480

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

            • mirrr
              /#10678830

              В более объемном и сложном коде 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);
              }
              

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

            • webkumo
              /#10679054

              А разве такое использование 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)
              }

          • alix_ginger
            /#10678908

            У Вас даже если 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();
                }
                //
                // и так далее
            }


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

            • fukkit
              /#10680836

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

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

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

              • ApeCoder
                /#10680870

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

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

              • Free_ze
                /#10681220

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

                • ApeCoder
                  /#10681242

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

            • linuxover
              /#10682538

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

      • linuxover
        /#10678208

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

    • F0iL
      /#10678142

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

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

      • Deosis
        /#10678468

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

        • F0iL
          /#10678594

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

    • AndreyRodin
      /#10678160 / +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 чуть больше, чем просто объявление глобального объекта.

  10. BubaVV
    /#10677336 / +3

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

    • artemmityushov
      /#10677386 / +1

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

      • BubaVV
        /#10677394

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

    • zzzmmtt
      /#10677654

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

      • ToshiruWang
        /#10679072 / +1

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

  11. artemmityushov
    /#10677346 / +1

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

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

    • JC_IIB
      /#10677360 / +3

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


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

      • artemmityushov
        /#10677406 / +1

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

      • samodum
        /#10678306

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

        • ToshiruWang
          /#10679090

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

    • Hokum
      /#10677378 / +1

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

  12. Szer
    /#10677534

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

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


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


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


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

    • ivanra
      /#10678538

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

      • domix32
        /#10678612

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

        • VolCh
          /#10678892

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

      • Szer
        /#10678616

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


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

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


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

        • ivanra
          /#10679948

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

        • PashaNedved
          /#10679964 / -1

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

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

          • Szer
            /#10680010

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

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


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

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


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

    • 0xd34df00d
      /#10680352

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

      • Szer
        /#10680382

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


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

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

    • eoffsock
      /#10681262

      Насчет ФП.

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

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

  13. Lofer
    /#10677536

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

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

  14. Naglec
    /#10677612 / +1

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

  15. pfihr
    /#10677770 / -1

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

  16. RiseOfDeath
    /#10677774

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

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

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

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

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

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

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

    • domix32
      /#10678340

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

      • RiseOfDeath
        /#10678552

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

        • VolCh
          /#10678900

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

  17. Arris
    /#10677784 / +1

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

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

  18. samodum
    /#10677842

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

  19. StrangerInTheKy
    /#10677852 / -1

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

    • Free_ze
      /#10677864 / +1

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

      • Arris
        /#10677888 / -1

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

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

        • Free_ze
          /#10677918

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

          • ToshiruWang
            /#10679106

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

            • Free_ze
              /#10679192

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

              • ToshiruWang
                /#10679560

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

      • StrangerInTheKy
        /#10677890

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

    • PashaNedved
      /#10678148

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

  20. kloppspb
    /#10677930

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

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

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

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

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

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

    • nizkopal
      /#10677986

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


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

      • kloppspb
        /#10678000

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

    • ToshiruWang
      /#10679120

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

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


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

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

  21. Aquahawk
    /#10677964

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

  22. Fid
    /#10678028

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

  23. fukkit
    /#10678032 / +1

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

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

    • lgorSL
      /#10678356

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

      • fukkit
        /#10680850

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

        • ApeCoder
          /#10680866 / +1

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

          • fukkit
            /#10680946 / -1

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

            • ApeCoder
              /#10680952

              Почему?

              • fukkit
                /#10680968

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

                • ApeCoder
                  /#10680978

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

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

    • dmitry_dvm
      /#10678694

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

  24. x07
    /#10678114

    Что вернёт эта функция 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");

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

    • Akuma
      /#10678152

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

      • ApeCoder
        /#10681042

        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.

        • Akuma
          /#10681082

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

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

          • ApeCoder
            /#10681132

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

  25. undersunich
    /#10678128

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

  26. AndreyRodin
    /#10678190 / +1

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

    • Free_ze
      /#10678744

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

  27. DarthVictor
    /#10678328

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

  28. Artem_zin
    /#10678350

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

    • mSnus
      /#10678436

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

  29. vanburg
    /#10678366

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

    • VolCh
      /#10678906

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

  30. Legion21
    /#10678372

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

  31. speller
    /#10678418

    Из личного.

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

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

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

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

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

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

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

    • Dessloch
      /#10678528 / +1

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

      • speller
        /#10678636

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

        • Dessloch
          /#10679958

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

          • vedenin1980
            /#10680054

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

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

            • Dessloch
              /#10680630

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

              • vdshat
                /#10680732

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

                • Dessloch
                  /#10681290

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

              • vedenin1980
                /#10681362 / +2

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

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

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

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

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

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

  32. EgorZanuda
    /#10678508

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

  33. j-ker
    /#10678582 / -1

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

    • speller
      /#10678596

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

  34. bluetooth
    /#10678672

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

  35. laughman
    /#10678736

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

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

  36. modestguy
    /#10678828

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

    • VolCh
      /#10678918 / +2

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

    • vedenin1980
      /#10679060

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

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

      • VolCh
        /#10679098 / +1

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

        • vdshat
          /#10680750

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

  37. OlegTar
    /#10679316

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

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

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

    • VolCh
      /#10679434 / +1

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

    • ToshiruWang
      /#10679566 / +1

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

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

  38. dim2r
    /#10679506

    За что некоторые не любят 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.

    • Szer
      /#10679678

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

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

    • vedenin1980
      /#10680042 / +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();
      }
      

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

      • dim2r
        /#10680376

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

        • vedenin1980
          /#10680518

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

          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 стабильная и надежная лошадка, бегающая в своих задачах весьма шустро, но не скаковой бегун, как по производительности, так и по новым интересным возможностям языка.

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

          • dim2r
            /#10680682

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

          • springimport
            /#10682056

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

            • VolCh
              /#10682502

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

      • WASD1
        /#10681746

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

        int i=(false?0:null);

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

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

        • vedenin1980
          /#10682006

          ожидал бы, что в настройках по умолчанию 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(;;) {...}» для того чтобы один тред висел в бесконечном цикле, а другой делал работу.

  39. mbait
    /#10679726

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

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

  40. alek0585
    /#10680116

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

    • VolCh
      /#10680130 / +1

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

    • vedenin1980
      /#10680132 / +1

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

      • alek0585
        /#10680582

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

    • alizar
      /#10680138

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

  41. StupidMouse
    /#10680300 / -1

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

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

    • dim2r
      /#10680386

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

      • StupidMouse
        /#10680484

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

        • dim2r
          /#10680504

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

          • webkumo
            /#10680532

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

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

            • dim2r
              /#10680758

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

              • webkumo
                /#10680924

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

                • oxidmod
                  /#10680934

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

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

                  • F0iL
                    /#10681054

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

                  • webkumo
                    /#10681122

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

  42. murminathor
    /#10680450 / +1

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

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

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

    • StupidMouse
      /#10680492

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

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

      • murminathor
        /#10680666

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

  43. Foxcool
    /#10680454

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

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

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

    • vdshat
      /#10680780

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

    • ApeCoder
      /#10680948 / +2

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


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


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