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

https://github.com/arialdomartini/Back-End-Developer-Interview-Questions
  • Перевод
Этот список появился как личная памятка по темам, которые я обсуждал с коллегами и друзьями и в которых хотел разобраться поглубже…

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

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

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


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

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

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

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

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

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

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

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

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

      Хотя… для нетрезвых конкурсов на корпоративе они вполне сгодятся.
        +51
        Поздно. Тысячи HR уже скопипастили себе статью в файлик «Вопросы на собеседование компьютерщика.doc».
          –4
          .docx давно уже
            +5
            Спасибо, я знаю.
          +16

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


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

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

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

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

              +4
              Это вопросы не на умение программировать, а на знание модных баззвордов. Не дай бог заиметь начальника, который оценивает тебя по подобному списку.
                +1
                В корне с вами не соглашусь. Про баззворды там вопросов раз, два, и обчелся.
                Большинство вопросов как раз-таки на понимание архитектуры программных продуктов и хорошие практики разработки.
                  +3
                  Знание названий паттернов — это не понимание архитектуры. Точнее понимание архитектуры совсем не подразумевает знания всех этих идиотских словечек, которыми пестрит вопросник. Про явно подразумеваемое соответствие «бэкенд = java» вообще промолчу.
                    0
                    Говоря про паттерны и прочие «идиотские словечки», обычно ожидают и оценивают не знание названий, а понимание их смысла и назначения.
                    И решительно не ясно, почему все так взъелись на «Java», по-моему вполне очевидно, что при собеседовании разработчика с другим стеком вместо Java в вопросах будет %your_language_name% и %your_platform_name%, благо большинство из вопросов с некоторыми адаптациями применимы и для других языков и технологий.
                      +1

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

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

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

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

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

                        А кодсниппеты с характерными «болячками» %your_language_name% тоже будут другими? Что-то сомневаюсь.
                          +1
                          Понимание смысла и назначения паттерна это одно, но не факт, что человек может знать его название. Успешно применяет и понимает, сам до этого дошёл, а названия не знает, такое вполне возможно. Тут уже зависит от упоротости проводящего собеседование, если ему важно знание терминологии и он не хочет задавать наводящие вопросы — скорее всего он поставит мысленный минус кандидату, хотя фактически, это скорее минус именно ему.
                            +1
                            уже зависит от упоротости проводящего собеседование

                            Что не зависит от упоротости проводящего собеседование?

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

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

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


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

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


                        А это вообще тонкий вопрос. Тут как повезёт. Некоторые загипнотизированы фразами «новые технологии», «новые возможности». А некоторые думают «а где мы найдем специалистов на этот зоопарк, давайте по-старинке работать?»
                          0

                          Т.е Джаву ниспослал господь, а люди могут только поменять ее на что-то или нет. Джава по умолчанию "по-старинке" а гринфилд проектов не бывает? Ее ж в свое время выбирал кто-то?

                      0
                      > Почему многие разработчики не любят Java?
                      вот тоже интересно.
                      я, например, немного недолюбливаю(недолюбливал?) за отсутствие некоторых очевидных вещей типа лямбд и val, которые теперь есть.
                      ну и нелюблю саму jvm по причине отсутствия unsigned типов и ряда других нюансов.
                      • НЛО прилетело и опубликовало эту надпись здесь
                          0
                          это уже скорее не к языку относится а к нездоровым технологиям применения
                          0
                          А мне кажется, что не любят за многословность и остутствие геттеров и сеттеров (вернее за необходимость их генерировать)
                            –1
                            Геттеры и сеттеры нарушают инкапсуляцию. Не вижу смысла вообще их генерить и использовать
                              0
                              Они как раз ее обеспечивают.
                                0
                                Похоже вам стоит перечитать определение инкапсуляции еще раз.
                                И Можно еще почитать вот это
                                  +1
                                  Создается впечатление, что вы не умеете пользоваться инструментом и говорите, что он не нужен.
                                  Вы сами-то эту статью читали?) Автор говорит о том, что аксессоры — зло лишь тогда, когда они втупую проксируют приватное поле. А вы возводите кричащий заголовок в абсолют.
                                    +1
                                    Генерируемые это и делают. Просто проксируют поля, чем и нарушают инкапсуляцию.
                                    Генерировать их чтоб были — смысла нет и вообще вредно.
                                    К тому же, будет более изящней заменить SetX(X value), на набор бизнес-методов. Как-то enableX() \ disableX() или markAsNew() \ markAsPending() \ etc… Тем самым инкапсулировав логику внутри агрегата
                                      0

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


                                      public int X -> public int X {get;} -> public int X { get { return myWebService.method1() }}


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


                                      enableX / disableX — это значит что у вас есть X который у вас голове связан с enable и disable, а в интерфейсе сущности X нет.


                                      Фактически вы генерируете код только ручками.

                                        0
                                        вот такой подход — наиболее логичный.
                                        собсно в котлине его и приняли
                                          0
                                          Как в с#
                                          Как в Delphi :)))

                                          property X: integer read GetX write SetX;
                                          Потом Ctrl+G…
                                        0
                                        Раскрытие состояние объекта действительно нарушает инкапсуляцию. Объект предоставляет поведение, и скрывает состояние. Именно поэтому в некоторых языках программирования интерфейсы позволяют декларировать только методы, но не свойства.

                                        Мысль заключается в том, что геттеры/сеттеры предоставляют доступ к состоянию, но не предоставляют поведения. Т.е. придают объектам свойства структур данных, образуя собой объекты-гибриды, недостатки которых хорошо раскрыл Robert C. Martin в своей книге «Clean Code».

                                        Посмотрите, как устроены правильные OO-языки (Smalltalk, Objective-C, Ruby и т.д.). Объекты общаются посредством сообщений. Интерфейс — это протокол взаимодействия. Геттеры/сеттеры никакого взаимодействия не осуществляют, и в большинстве случаев (разумеется, не всегда) просто воплощают Code Smell под названием Feature Envy.

                                        Посмотрите письма Alan Kay, того самого, кто и провозгласил термин OOP:
                                        «I thought of objects being like biological cells and/or individual computers on a network, only able to communicate with messages (so messaging came at the very beginning – it took a while to see how to do messaging in a programming language efficiently enough to be useful).» (Alan Kay)
                                        «OOP to me means only messaging, local retention and protection and hiding of state-process, and extreme late-binding of all things.» (Alan Kay)
                                        Собственно, упомянутая oxidmod статья именно об этом. Письма Alan Kay можно найти в интернете, два наиболее важных из них я цитировал здесь. Кстати, статья по ссылке тоже посвящена этому вопросу, только уже на уровне паттерна «Event Sourcing».
                                          0
                                          Мысль заключается в том, что геттеры/сеттеры предоставляют доступ к состоянию, но не предоставляют поведения.

                                          Мне кажется даже во времена дельты присваивание значения свойству вызывало какое-то поведение. Например изменение текста кнопки. То есть это как бы "интерфейсное состояние" изменение которого есть поведение.


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

                                            0
                                            С оппонентом выше договорились о том, что это спор о терминологии.
                              +6
                              Если я понятия не имею, почему люди не любят джаву, то что мне делать?
                                +14
                                Искать другое место. Достоин только тот кандидат, который точно знает. Тот, который за последнюю неделю что-то узнал, и пятилетний сын которого умеет делать транзакции Юникодом.
                                Тот, который на собеседовании написал минимум три образца плохого кода.

                                На его футболке написано: «Единство дизайна означает элитность архитекторов».
                                  +2
                                  достойный кандидат вообще код писать не будет. он будет писать язык и машину, на которых однострочники будут генерировать идеальный код. а, ну и он обязательно должен знать, за что не любят java, да.
                                  0
                                  Ну как сказать, я в жизни ни строчки кода не написал на Java, но при этом вполне себе имею представление о ее достоинствах и недостатках, и даже фольклор с этим связанный вспоминается. Тут уже вопрос скорее на кругозор в современном мире :)

                                  А если серьезно, то по-моему вполне логично ожидать, что в зависимости от позиции, в вопросах вместо Java будет %your_languange% или %your_platform%.
                                    0
                                    Подразумевается, что без джавы бэкэнда не существует
                                      –2

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

                                        +1

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

                                        +3
                                        Какой ваш самый нелюбимый язык программирования и почему именно Java?
                                      +55
                                      >> транзакции в СУБД пятилетнему ребёнку.
                                      Ну, как тут не вспомнить гениальное:
                                      XXX шо есть транзакцыи?
                                      YYY как бы тебе объяснить.
                                      YYY вот ты бежышь срать в толчок.
                                      YYY но по дороге не донёс.
                                      YYY и обосрался.
                                      YYY так вот с транзакциями можно сделать так, будто ваще и не бежал и не обосрался
                                        +1
                                        Пример без говна: чтобы поставить киоск, надо дать взятку пожарникам, санинспекции и в администрации города. Пожарник взял, санитары взяли, а в администрации не взяли. Транзакция — это когда заранее ставится условие, что если кто-то не возьмёт, предыдущие взявшие вернут.
                                        +18
                                        Можно вопрос? Многих получилось нанять?
                                          +1
                                          Многих получиться и не должно было. Элита малочисленна.
                                          +3
                                          хехе, я как минимум на треть вопросов не ответил бы, это я такой глупый или вопросы?
                                          да и некоторые ответы могут превратиться в нехилый холивар вместо собеседования :D
                                            0

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

                                              +3
                                              middle php разрабы пишут слово «причем» именно так. вы уверены насчёт 80%?
                                                –1
                                                И запятые туда же? Уже мiddle?
                                                  +1

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

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

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

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

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

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

                                                  0
                                                  Я полагаю если на собеседовании более чем 1 человек ответит правильно на все вопросы то значит что ваш тест плохой, так как вы не сможете понять кто больше знает.
                                                    0
                                                    А если 0, включая автора?
                                                  +2
                                                  ПМСМ, самый лучший вопрос: «Объясните ${базовая_технология} пятилетнему ребёнку.»
                                                  Часто бывает так, что работать надо не со знакомым языком/ технологией, а с чем-то специализированным. К примеру, 1С-ники иногда поддерживают groovy-код, а джависты попадают в Perl или JavaScript или вообще в ABAP, питонисты попадают в 1С и т.п…
                                                  И тут тимлид ищет тех, кто знает основы (сетевые протоколы, устройство юникода и принципы работы СУБД).
                                                • НЛО прилетело и опубликовало эту надпись здесь
                                                    +8
                                                    Как-то определиться надо или они зло или нет.
                                                    Темной силы стороной владеть уметь необходимо!
                                                      0
                                                      Это похоже на кальку с английского «if they are evil or not». Я начал за своей дочерью 5 лет замечать нетипичные для русского языка конструкции типа этой, у нее есть оправдание — она пошла в англоязычную школу, но дома говорит только на русском, конструкции стала уже путать.
                                                      –2

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

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

                                                        • НЛО прилетело и опубликовало эту надпись здесь
                                                            0
                                                            Пример не мой, а тот, о котором вы писали: «идеально рефакторится goto».
                                                            +3

                                                            Да любой более-менее сложный конечный автомат. Например: https://www.thibault.org/newhome/thoughts/goto-and-fsms.html
                                                            Согасен с тем, что goto никаким злом не является. Просто конструкция, которую стоит применять обдуманно.


                                                            Спуститесь на уровень пониже (в ассемблер), и (о боже!) там везде goto! Безусловные и условные переходы по-другому и не работают.


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

                                                              +1
                                                              Излишняя демонизация goto и глобальных переменных говорит скорее об узости мышления таких демонизаторов.

                                                              Мне кажется, когда на вопрос "Почему goto зло" начинают отвечать, что "goto — не зло" это свидетельствует просто о нежелании понять вопрос. Человек вступает в режим конфронтации. Любая живая речь недостаточно формализована, чтобы иметь некотору свободу интерпретации. С моей точки зрения, наиболее адекватно воспринять вопрос "Почему [в каких-то случаях] goto — зло". И рассказать про идеи структурного программирования, отметив, что в каких-то случаях goto может быть полезным.


                                                              Интересно, что сейчас в оригинале перевода вопрос поставлен так:


                                                              Is goto evil? You may have heard of the famous paper "Go To Statement Considered Harmful" by Edsger Dijkstra, in which he criticized the use of the goto statement and advocated structured programming instead. The use of goto has always been controversial, so much that even Dijkstra's letter was criticized with articles such as "'GOTO Considered Harmful' Considered Harmful". What's your opinion on the use of goto?

                                                              В случае с конечным автоматом мне ближе подход, когда задача описывается в терминах конечного автомата и в языке достаточно средств, чтобы описать eDSL для удобной формулировки конечных автоматов. Хотя я признаю, что в случае низкоуровневого языка и сильных требований к быстродействию, когда-то допустим и goto.


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

                                                                0
                                                                Речь шла о рефакторинге конкретного кода, автор комментария написал, что он идеально рефакторится с помощью goto. Я попросил пример этого рефакторинга.

                                                                Примеров, где goto может использоваться я и так предостаточно знаю, но практически в любом случае можно без него обойтись (об ассемблере я не говорю).
                                                                • НЛО прилетело и опубликовало эту надпись здесь
                                                                    0

                                                                    Но при этом легко обойтись и без него.


                                                                    1) когда перед return есть работа, мы ее вложим в фигурные скобочки или вынесем в функцию.
                                                                    2) когда разные if дают одинаковый результат, условия объединяют в одном if


                                                                    Вообще, ничего не имею против goto, лишь бы не в моём проекте.

                                                                    • НЛО прилетело и опубликовало эту надпись здесь
                                                                        0
                                                                        я имел ввиду когда if(!SUCCEEDED(Operation1())) и if(!SUCCEEDED(Operation2())) должны сделать одинаковую работу. Но сами if' разные.

                                                                        Тогда их можно соединить через && (в некоторых языках).


                                                                        Вообще, это похоже на монаду или исключения. :)

                                                                          0
                                                                          Вообще через ||
                                                                            0

                                                                            Ну да. Если! не выносить за скобки

                                                                            0

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

                                                                              +1

                                                                              Это все зависит от языка и задачи. На ассемблере без goto вообще никак. В функциональных языках "дополнительные функции" создаются вообще на лету.

                                                                                0

                                                                                Полностью согласен.

                                                                    0
                                                                    Всех демонов надо прогнать через SWOT анализ. Каждое благое немерение надо проверить, на предмет — в какой ад оно ведёт.
                                                                    0
                                                                    CMP DX,	00  ; Compare the DX value with zero
                                                                    JE  label_yes      ; If yes, then jump to label L7
                                                                    JMP	label_no
                                                                    LABEL_YES: ... 
                                                                    LABEL_NO:...
                                                                    
                                                                      0
                                                                      Да это ж не рефакторинг, а портирование)
                                                                  +3
                                                                  Нуу, ответ, видимо, в том, что goto провоцирует писать код с глупыми ошибками или код, в котором крайне трудно разобраться.
                                                                  Например, в вашем примере написано «деинициализируем в обратном порядке», а порядок тот же.
                                                                    +2
                                                                    Я думаю в его случае там опечатка и имелось ввиду:

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


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

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

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

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


                                                                            Или так
                                                                            Так
                                                                            
                                                                            #define  WINDOW_STAGE 1
                                                                            #define CONTEXT_STAGE 2
                                                                            #define RENDER_STAGE 3
                                                                            
                                                                            void foo()
                                                                            {
                                                                                Window *wnd = CreateWindow();
                                                                                if (!wnd) { 
                                                                                   release(WINDOW_STAGE); 
                                                                                   return;
                                                                                } 
                                                                               Context *ctx = GetContext(wnd);
                                                                               if (!ctx) { 
                                                                                       release(CONTEXT_STAGE); 
                                                                                       return;
                                                                               } 
                                                                               Renderer *renderer = GetRenderer(ctx);
                                                                               if (!renderer) {
                                                                                       release(RENDER_STAGE); 
                                                                                       return;
                                                                                  }           
                                                                                 renderer->drawline(0, 0, 100, 100);
                                                                             }
                                                                            
                                                                            void release(int stage)
                                                                            {
                                                                             switch(stage) {
                                                                               case RENDER_STAGE :
                                                                                   FreeRenderer(renderer);
                                                                               case CONTEXT_STAGE:
                                                                                   FreeContext(ctx);
                                                                               case WINDOW_STAGE:
                                                                                   FreeRenderer(renderer);
                                                                             }
                                                                            }
                                                                            


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

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


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

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

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

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

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

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

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

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

                                                                                  0
                                                                                  -
                                                                                  +3
                                                                                  Использование «проваливающихся» case — практически то же самое что использование goto. Но код с goto при этом чище выглядит…
                                                                                  • НЛО прилетело и опубликовало эту надпись здесь
                                                                                      0
                                                                                      Ну, так все циклы это тоже goto по большому счету, (while(...) {} это m: if(...) {… goto m;}). :)

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

                                                                                      Это называется описки (увы, писал без компа), исправить примеры ничего не стоит.
                                                                                        +1
                                                                                        А если залезть в ассемблер… То там фактически все условные операторы (jnz, jz, je и тд) — goto в чистом виде.
                                                                                    +1
                                                                                    В более объемном и сложном коде 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);
                                                                                    }
                                                                                    

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

                                                                                      А разве такое использование 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)
                                                                                      }
                                                                                      0
                                                                                      У Вас даже если init_some1() вернет 0, init_some2() всё равно выполнится. Лучше так:
                                                                                      foo(...)
                                                                                      {
                                                                                          bool init1_success= !init_some1();
                                                                                          // если init1_success == 0, init_some2() не будет выполнено
                                                                                          bool init2_success = init1_success && !init_some2();
                                                                                          // и так далее
                                                                                      
                                                                                          // деинициализируем в обратном порядке
                                                                                      
                                                                                          if (!init2_success) {
                                                                                               deinit2();
                                                                                          }
                                                                                          if (!init1_success) {
                                                                                               deinit3();
                                                                                          }
                                                                                          //
                                                                                          // и так далее
                                                                                      }


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

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

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

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

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

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

                                                                                              0
                                                                                              Вторая и последующие строки будут без надобности исполняться

                                                                                              bool init2_success = init1_success && !init_some2();

                                                                                              — это точно то же самое, что и
                                                                                              bool init2_success;
                                                                                              if (init1_success) {
                                                                                                  init2_success = !init_some2();
                                                                                              } else {
                                                                                                  init2_success = 0;
                                                                                              }

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

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

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

                                                                                              0
                                                                                              А с этим никто и не спорит :)
                                                                                            0
                                                                                            Надо думать, каждый блок кода, следующий за меткой, должен заканчиваться оператором 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 чуть больше, чем просто объявление глобального объекта.
                                                                                              0
                                                                                              Никто не утверждал, что между вопросами теста должны быть какие-то взаимосвязи, например логические. Каждый вопрос как-бы запускает виртуалку с нуля.
                                                                                              +10
                                                                                              В какой-то момент слушая вполуха собеседования кандидатов на должность, примерно равную моей, пришел к выводу, что на свое место я бы не прошел
                                                                                                +1
                                                                                                Да потому что в процессе работы идет концентрация на чем-то определенном в ущерб другому, даже если что-то знали в прошлом без постоянного применения на практике остается только воспоминаниями, причем чем дальше тем призрачнее.
                                                                                                  +1
                                                                                                  Не могу сформулировать, где тут расхождение с наблюдениями. Уровень требований явно вырос, а рабочие процессы усложнились умеренно
                                                                                                  +4
                                                                                                  Слушаешь вполуха собеседование, или даже проводишь его, и думаешь, что себя бы я не взял…
                                                                                                    +2
                                                                                                    Проходишь собеседование, понимаешь что проваливаешься (это не помнишь, то не знаешь, там не использовал и выводишь решение на месте или рассказываешь как бы сделал с тем, что умеешь и куда бы смотрел чтобы сделать), а потом оказывается что прошёл, поскольку не хуже остальных, можешь понять как решить проблему и работал с аналогичной технологией и представляешь куда копать. Да и задачи сильно уже, чем вопросы.
                                                                                                  +2
                                                                                                  Занятный конечно же списочек, но интересно какой уровень зарплаты предложат человеку который может ответить на все вопросы)

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


                                                                                                    «Ну, для начала, 25 на руки. Белыми, конечно. По итогам года можно будет говорить о постепенном пересмотре зарплаты, накинем пару тыщ, не обидим. А как вы относитесь к переработкам?»
                                                                                                      +3
                                                                                                      Вот кстати абсолютно согласен, на практике доказано обратная пропорциональность въедливости с широты распросов на собеседовании и размера зарплаты.
                                                                                                        0
                                                                                                        Если учесть, что 180 тыс в год в Долине норм, то 25 тыс на руки для начала в месяц совсем неплохо.
                                                                                                          +1
                                                                                                          180 в год? Это не сильно больше МРОТ, налоговая за такое а-та-та сделает, даже в долине реки Волга (не говоря про Силиконовую долину).
                                                                                                        +8
                                                                                                        Все зависит от «принимающей» стороны. У меня был опыт когда на собеседовании у меня спросили мое отношение к некоторой вещи (подзабыл, что именно было, так как обсуждали несколько вещей). В процессе обсуждения я много рассказывал, что думаю, почему думаю, когда бы стал использовать. В конце мне сказали, что они сами не сторонники этого, но им понравились мои рассуждения. Не часто удается так приятно пообщаться на собеседовании без какого либо холивара и единственно верной точки зрения.
                                                                                                        На мой взгляд «открытые вопросы» хороший вариант понять как рассуждает кандидат. Да и вообще понять насколько комфортно общаться с человеком, как он воспринимает критику. Все таки живем и работаем мы чаще в команде и общение играет не последнюю роль.
                                                                                                        +1
                                                                                                        Почему глобальные объекты и статика — это зло? Можете показать на примере кода?

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


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


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


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

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

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

                                                                                                              +1

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


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

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


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

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

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

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


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

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


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

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

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


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

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

                                                                                                                    0
                                                                                                                    Так это глобальные имена, а не объекты. У этого оператора, равно как и у a, b и c, стейта нет.

                                                                                                                    Какой-нибудь глобальный IORef можно с натяжкой считать глобальным объектом в хаскеле, но этот IORef нельзя будет создать без unsafePerformIO, который издалека заметен и очень плохо пахнет.
                                                                                                                  0
                                                                                                                  Насчет ФП.

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

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

                                                                                                                  А-А-А-А-… как это развидеть ?!?!
                                                                                                                    +1
                                                                                                                    По ООП нет вопросов? Забавно.
                                                                                                                      0

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

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

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

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

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

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

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

                                                                                                                        upd.
                                                                                                                        Погуглил… афигеть, оно еще живо… и это с таким-то жутким синтаксисом.
                                                                                                                          0
                                                                                                                          Собственно, это его почти единственный плюс — если знать кобол, то тебе будут платить много денег за поддержание жизнеспособности ископаемого приложения на оном.
                                                                                                                            +1
                                                                                                                            Но если вдруг решат заменить прогу на что-то новое, то можно внезапно оказаться умирающим мамонтом без какого-либо представления о современных языках и сопуствующих им технологиях.
                                                                                                                              +2

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

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

                                                                                                                            Чувак, я из твоего будущего. Мой тебе добрый совет: иди на кружок бокса, авиамоделирования или дизайна. Не ходи в тот корпус, не ходи.
                                                                                                                              +6
                                                                                                                              Это не вопросы для собеседования, а дедовщина самая настоящая.
                                                                                                                              Выглядит так, будто чувак чудом устроился на работу и теперь на собеседованиях глумится над кандидатами
                                                                                                                                –1
                                                                                                                                Объясните Юникод или транзакции в СУБД пятилетнему ребёнку.
                                                                                                                                Просто объяснить или так, чтобы он понял? Если второе, надо ли в конце проводить проверку того, что пятилетний ребенок все понял правильно? А то, что мозг пятилетнего ребенка недостаточно развит для понимания концепций такого уровня сложности, автора не смущает?
                                                                                                                                  +2
                                                                                                                                  А то, что мозг пятилетнего ребенка недостаточно развит для понимания концепций такого уровня сложности, автора не смущает?
                                                                                                                                  Вы сильно недооцениваете детские мозги. В этом возрасте они такие объемы информации перелопачивают, что людям зрелого возраста и не снились.
                                                                                                                                    –1
                                                                                                                                    Дело не в объемах информации, а в умении строить связи между абстракциями. Это приходит со временем, по мере развития мозга. В среднем по больнице, разумеется.

                                                                                                                                    Можно объяснить первокласснику как решать дифуры. Только вы почитайте про судьбу вундеркиндов сами.
                                                                                                                                      +1
                                                                                                                                      Дифуры — это уже глубокая теория, требующая неплохой базовой подготовки, в которую не каждый зрелый сможет, в отличии от того, что буковки можно обозначать циферками, а некоторые операции можно обратить, как на «машине времени».
                                                                                                                                        0
                                                                                                                                        «Вы просто их не понимаете, раз не можете объяснить пятилетнему ребёнку»(Ц)
                                                                                                                                          0
                                                                                                                                          Надеюсь, что это сарказм.
                                                                                                                                            0
                                                                                                                                            Скорее — передразнивание тех, кто советует объяснять всё условному пятилетнему ребёнку (а они разные) вплоть до квантовой механики.
                                                                                                                                      –1
                                                                                                                                      У меня двое детей, 2 и 11 лет. У меня есть знакомые с детьми, с кем я довольно часто пересекаюсь (ну и дети дружат, само собой). У одной пары 4 детей — 6, 4, 2 и 1 год, у другой — трое, 5, 3 и 0,5 года. Я отлично знаю, какие у них мозги в каком возрасте. Ну и профильную литературу (о развитии детского мозга) я тоже читал (правда, научпоп).
                                                                                                                                      Вот лет с 9 — 10 уже можно начинать пробовать. Некоторые точно поймут.
                                                                                                                                      +1
                                                                                                                                      Будь вы на собеседовании, то сразу догадались бы, что надо объяснять не пятилетнему ребенку, а той здоровенной детине, что вас собеседует.
                                                                                                                                      0
                                                                                                                                      Безусловно, самое важное для бэкенд-разработчика, так это уметь отвечать на подобные вопросы:

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

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

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

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

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


                                                                                                                                        Чет мне кажется, это не каждому разработчику надо знать. А кому надо, к тому это знание само придет.
                                                                                                                                          0
                                                                                                                                          Sorry, тег «сарказм» не поставил :)
                                                                                                                                          +1
                                                                                                                                          Как бы вы справитесь с очень большой текучкой и убедите разработчиков не покидать команду без повышения зарплаты

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


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

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

                                                                                                                                          +1
                                                                                                                                          Компания оплачивает те пару недель пока я буду читать им лекции, которые получатся в результате ответов на те вопросы которые знаю. Некоторые не знаю. Но на одном собеседовании и десяток их не обсудить. А на большинство открытых самый правильный ответ: «текущая мода такая, плюсы такие, минусы такие. Ультимативно запрещать себе какие-то вещи опрометчиво, стоит опасаться того и того, в целом практика такая, мне лично нравится вот так, но вот кейс контрпример где общественно осуждаемая практика быстро и качественно решила бизнес задачу, а потом либо была переделана либо исчерпывающе документирована и оставлена, ибо программы пишут чтоб денег фирма заработала»
                                                                                                                                            +1
                                                                                                                                            А где развёрнутые ответы? Вопросы любой дурак придумать может.
                                                                                                                                              0
                                                                                                                                              «А мы сами не знаем ответа. Давайте вы нам придумаете, а мы подумаем, прошли вы тест или нет» ;-)
                                                                                                                                              +2
                                                                                                                                              Средней креативности вопросы. Но есть и совсем дебильные:
                                                                                                                                              Если Cat — это Animal, то верно ли, что TakeCare Cat — это TakeCare Animal?
                                                                                                                                                +1

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

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

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

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

                                                                                                                                                        Почему?

                                                                                                                                                          0
                                                                                                                                                          Там про подтипы, в вопросе про них ничего нет.
                                                                                                                                                            0
                                                                                                                                                            Если Cat — это Animal, то верно ли, что TakeCare Cat — это TakeCare Animal?

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

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

                                                                                                                                                                :) а я — вам!

                                                                                                                                                  –1
                                                                                                                                                  Не такой уж и дебильный. Про контрвариантность надо слышать, чтобы ответить.
                                                                                                                                                  0
                                                                                                                                                  Что вернёт эта функция JavaScript?


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

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

                                                                                                                                                      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.

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

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

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

                                                                                                                                                    +6
                                                                                                                                                    Вредная статья.Сколько судеб теперь она поломает, сколько отказов в приеме на работу теперь получат именно достойные разработчики!
                                                                                                                                                      +3
                                                                                                                                                      Если бы мне задавали подобные вопросы на собеседовании, я был бы очень рад. Прекрасно, когда вместо экзамена собеседование превращается в общение будущих потенциальных коллег к обоюдному удовольствию!
                                                                                                                                                      Вопросы, в целом, хороши, поскольку они предполагают рассуждения, а не заученные ответы.
                                                                                                                                                        0
                                                                                                                                                        Приходите вы на пятое собеседование, а там вас ждет тот же список милых дикуссионных вопросов)
                                                                                                                                                        +7
                                                                                                                                                        Вы знаете почему крышки люка круглые, сколько шариков влезет в школьный автобус и как сдвинуть гору Фудзи?
                                                                                                                                                        Вы в совершенстве владеете балансировкой красно-черного дерева?
                                                                                                                                                        Ваши коммиты есть в опенс-сорс, решениях используемых в крупных компаниях?
                                                                                                                                                        Вы подняли и поставили на ноги более двух стартапов? Вы знаете SQL и no-SQL решения?
                                                                                                                                                        Віg Data и Data Science не пустой звук для вас?
                                                                                                                                                        Добро пожаловать к нам, на позицию Front-end developer в стабильный с 2002 года крупный enterprise проект документооборота в одном из крупнейших отечественных банков, в ваши задачи будет входить доработка UI части проекта на основе тикетов от группы поддержки.
                                                                                                                                                          +10
                                                                                                                                                          Язык разработки: 1С.
                                                                                                                                                          +3

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

                                                                                                                                                            +3

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

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

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

                                                                                                                                                              +1
                                                                                                                                                              Неактуально… сейчас все блокчейн проекты разрабатывают)
                                                                                                                                                                +11
                                                                                                                                                                Из личного.

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

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

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

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

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

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

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

                                                                                                                                                                  +2
                                                                                                                                                                  Походил по собеседованиям и понял одну вещь-все собеседования субъективны, особенно с HR'ами. Профессионализм и тесты-это всё вторично. Будет некая симпатия со стороны собеседников/нанимателей-напишут хороший отзыв даже при «неправильных» ответах, будет антипатия-будут всячески «валить». Никогда не заморачивался по поводу отказов или отсутствия фидбэка-не взяли-мне же лучше, найду лучше работу. И жизнь показывает что так всегда и получается.
                                                                                                                                                                    0
                                                                                                                                                                    С философской точки зрения — вы абсолютно правы :) Я просто поделился своей болью :) Хочется видеть более приближённый к решаемым задачам процесс отбора. В большинстве же случаев отбор происходит абсолютно хаотичный, а не по конкретным способностям. Это и удивляет. О чём-то подобном не так давно на хабре была статья.
                                                                                                                                                                      0
                                                                                                                                                                      Я замечал такое только в российских компаниях. Иностранцы более прагматичны и рациональны. Умеешь делать это и это? Нас устраивает. Российские очень придирчивые, хотя платят меньше. Парадокс. И ведь уже разъехались все кто мог, уже и рынок ИТ выскоблен до дна, и всё равно жизнь российского работодателя ничему не учит, продолжают привередничать. Ну ладно, подождём ещё лет 5, просто интересно посмотреть чем это всё закончится и когда уже завезённых гастарбайтеров-дворников начнут переучивать на программистов.
                                                                                                                                                                        +1
                                                                                                                                                                        Я замечал такое только в российских компаниях. Иностранцы более прагматичны и рациональны.

                                                                                                                                                                        Эээ, тут вы не совсем правы. У иностранцев (Европа/США и т.п.) еще важнее личное впечатление, если у вас подвешен язык, вы улыбаетесь, на собеседовании шутите и говорите на хорошем английском ваши шансы намного выше чем у замкнутого ботаника, который обладает огромным опытом, но двух слов связать не может. В России с этим даже попроще.
                                                                                                                                                                          –1
                                                                                                                                                                          В чём я не прав? Вы же сами и подтверждаете мои слова. Я говорю что российские компании слишком много уделяют внимания непонятным тестам вместо того чтобы брать пусть и не блестящих, но старательных, позитивных и улыбчивых людей.
                                                                                                                                                                          В России попроще с этим если вы землекоп. Во всех остальных случаях нужны связи и знакомства.
                                                                                                                                                                            +1
                                                                                                                                                                            Старательный и улыбчивый идиот — тоже перебор. Не стройте иллюзий по поводу западных компаний. Когда сталкиваешься, то некоторые вещи просто шокируют.
                                                                                                                                                                              0
                                                                                                                                                                              Расскажите что шокирует, очень интересно.
                                                                                                                                                                              +2
                                                                                                                                                                              что российские компании слишком много уделяют внимания непонятным тестам

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

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

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

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

                                                                                                                                                                              Программисту? Никогда не требовалось, там скорее наоборот нужны связи и знакомства чтобы выйти на хорошего специалиста.
                                                                                                                                                                            0
                                                                                                                                                                            На самом деле, моя боль основана не только на российских компаниях :) Беседую и с иностранными. Там тоже местами забавно. Вот, например, американец два раза пропустил назначенное время начала Skype-интервью, а потом удивлялся, почему это я ему через пол часа уже не отвечаю. У меня же дел своих не может быть на другом краю Земли, я могу часами сидеть и ждать его ) Я считаю, что это полностью нормально с моей стороны после 30 минут считать интервью несостоявшимся по вине интервьюера и заняться своими делами.
                                                                                                                                                                      0
                                                                                                                                                                      Для крупных компаний на многие вопросы не обязательно знать все правильные ответы. В большинстве случаев проверяется знание математики, стрессоустойчивость кандидата и его умение работать со справочной документацией.
                                                                                                                                                                        –3

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

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