Pull to refresh

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

Reading time 16 min
Views 186K
Original author: Arialdo Martini
Этот список появился как личная памятка по темам, которые я обсуждал с коллегами и друзьями и в которых хотел разобраться поглубже…

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

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

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


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

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

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

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

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

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

• Если бы вы могли вернуться в прошлое, какой совет дали бы молодому себе?
Tags:
Hubs:
+39
Comments 274
Comments Comments 274

Articles