Skip to content

Instantly share code, notes, and snippets.

@romanitalian
Last active June 6, 2024 18:59
Show Gist options
  • Save romanitalian/8de7262db647f4c68c022544a71bfd5d to your computer and use it in GitHub Desktop.
Save romanitalian/8de7262db647f4c68c022544a71bfd5d to your computer and use it in GitHub Desktop.
Questions for interview - Вопросы для собеседования
Вопросы по шаблонам проектирования:
  • Почему глобальные объекты и статика — это зло? Можете показать на примере кода?
  • Расскажите об инверсии управления и как она улучшает организацию кода.
  • Закон Деметры (Принцип минимальной информированности) гласит, что каждый программный модуль должен обладать ограниченным знанием о других модулях и должен взаимодействовать только с непосредственными «друзьями» (иногда его формулируют как «Не разговаривай с незнакомцами»). Можете написать код, который нарушает этот принцип? Почему у него плохая организация и как её исправить?
  • 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 — это TakeCare?- Почему в Java, C# и многих других языках конструкторы не являются частью интерфейса?- В последние годы много шумихи вокруг Node.js. Каково ваше мнение по поводу использования в бэкенде языка, который изначально задумывался для работы в браузере?- Представьте, что у вас машина времени и есть возможность вернуться в определённый момент времени в истории Java (C#, Python, Go или чего-нибудь ещё) и поговорить с некоторыми из создателей JDK. В чём бы вы попробовали их убедить? Удалить контролируемые исключения? Добавить беззнаковые примитивные типы? Множественное наследование?
  • Почему в 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 и написать более объектно-ориентированный код?
```php
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 лет?
  • Вы мой начальник, а я уволен. Сообщите мне.
  • Я хочу провести рефакторинг старой системы. Вы хотите переписать её с нуля. Аргументируйте. Затем меняемся ролями.
  • Ваш начальник просит вас соврать компании. Ваши действия?
  • Если бы вы могли вернуться в прошлое, какой совет дали бы молодому себе?
Что такое первичный ключ?

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

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

Например, рассмотрим таблицу заказов, состоящую из столбцов:

order_id (уникальный номер заказа — первичный ключ) order_date (дата совершения заказа) order_customer (покупатель, сделавший покупку) order_sum (сумма заказа). В этой таблице столбец order_id является первичным ключом и уникально определяет каждую строку таблицы, т.е. заказ.

Что такое внешний ключ?

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

Например, в таблице заказов, очевидно, должно быть поле order_customer, которое определяет покупателя сделавшего покупку. Мы могли бы в это поле записывать просто ФИО покупателя. Но как быть, если нам нужно выбрать все заказы, сделанные конкретным покупателем? Велика вероятность, что в таблице могут находится люди, у которых полностью совпадает ФИО.

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

Например, в таблице заказов будет строка, где в поле order_customer содержится внешний ключ — 3246. Далее в таблице customers необходимо отыскать строку с первичным ключом, равным 3246, в этой строке и будут содержаться все данные покупателя, включая и ФИО.

Что такое нормализация БД?

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

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

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

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

На практике соответствие базы данных правилам 3-ей нормальной формы вполне достаточно.

Что такое денормализация БД? Для чего она нужна?

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

Если приложению необходимо часто выполнять выборки, которые занимают слишком много времени (например, объединение данных из множества таблиц), то следует рассмотреть возможность проведения денормализации.

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

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

Что такое кластерный и некластерный индекс?

Индексы делятся на 2 вида — кластерный и некластерный.

Обычно СУБД хранит строки в том порядке, в котором они добавляются в таблицу.

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

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

Наиболее часто используемые типы индексов:

B-деревья Хеши R-деревья Полнотекстовые В отличие от некластерного индекса, таблица может иметь только один кластерный индекс.

Какие типы соединений (join) таблиц существуют? В чем их разница?

Существуют следующие типы соединений таблиц:

  • INNER JOIN
  • FULL OUTER JOIN
  • LEFT OUTER JOIN
  • RIGHT OUTER JOIN
  • CROSS JOIN

Опишем каждый тип соединений на примере запросов. Рассмотрим 2 таблицы A и B:

A:

ID	NAME
1	Вася
2	Петя
3	Федя
4	Маша

B:

ID	NAME
1	Иван
2	Вася
3	Лена
4	Федя

Посмотрим на результаты следующих запросов:

SELECT * FROM A INNER JOIN B ON A.NAME = B.NAME
ID	NAME	ID	NAME
1	Вася	2	Вася
3	Федя	4	Федя
SELECT * FROM A FULL OUTER JOIN B ON A.NAME = B.NAME
ID	NAME	ID	NAME
1	Вася	2	Вася
2	Петя	null	null
3	Федя	4	Федя
4	Маша	null	null
null	null	1	Иван
null	null	3	Лена
SELECT * FROM A LEFT OUTER JOIN B ON A.NAME = B.NAME
ID	NAME	ID	NAME
1	Вася	2	Вася
2	Петя	null	null
3	Федя	4	Федя
4	Маша	null	null
SELECT * FROM A RIGHT OUTER JOIN B ON A.NAME = B.NAME
ID	NAME	ID	NAME
3	Федя	4	Федя
null	nul	3	Лена
1	Вася	2	Вася
null	null	1	Ivan
SELECT * FROM A CROSS JOIN B
4	Masha	4	Fedya
3	Fedya	4	Fedya
2	Petya	4	Fedya
1	Vasya	4	Fedya
4	Masha	3	Lena
3	Fedya	3	Lena
2	Petya	3	Lena
1	Vasya	3	Lena
4	Masha	2	Vasya
3	Fedya	2	Vasya
2	Petya	2	Vasya
1	Vasya	2	Vasya
4	Masha	1	Ivan
3	Fedya	1	Ivan
2	Petya	1	Ivan
1	Vasya	1	Ivan

CROSS JOIN является полным декартовым произведением, т.е. возвращает все возможные сочетания записей таблиц A и B. В стандартном SQL CROSS JOIN выполняется без условия ON, однако, например, в MySQL этого ограничения нет и CROSS JOIN является аналогом INNER JOIN.

Что такое SQL курсор?

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

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

Опишите шаги по созданию и использованию курсора? Продемонстрируем использование курсора на простом примере:

CURSOR cselectitem
IS
	SELECT id, name FROM items; /* Объявляем курсор, привязывая к нему SQL — запрос. */
BEGIN
	OPEN cselectitem; /* Далее перед использованием курсор необходимо открыть */
	LOOP
		FETCH cselectitem
			INTO item_id, item_name; /* В цикле вытаскиваем каждую строку, 
                                                    используя конструкцию FETCH, и  значения 
                                                    полей выборки записываем в переменные, 
                                                    которые должны быть заранее объявлены */
		EXIT WHEN cselectitem%NOTFOUND; /*  Выходим из цикла, когда достигнут конец 
                                                    результирующего набора */
	END LOOP;
 
	CLOSE cselectitem; /* Закрываем курсор */
END
Что такое транзакция?

По определению, транзакция — это логическая единица работы.

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

Начать транзакцию можно при помощи команды BEGIN TRANSACTION. Завершить можно либо сохранив изменения в базе данных при помощи команды COMMIT, либо удалив все сделанные транзакцией изменения командой ROLLBACK

Приведем пример транзакции, которая снимает деньги с одного пользовательского счета и переводит их на другой:

BEGIN TRANSACTION
UPDATE user_account SET balance=balance-100 WHERE account_id=1 /* Снимаем деньги со счета,
                                                                  ID которого равен 1 */
UPDATE user_account SET balance=balance+100 WHERE account_id=2 /* И переводим эти деньги на 
                                                                  счет, ID которого равен 2 */
COMMIT

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

При работе с транзакциями возможны 2 варианта:

  • результаты выполнения всех запросов, входящих в транзакцию, будут применены к базе данных
  • все внесенные изменения в базу данных будут отменены (откатаны).

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

Что такое блокировка?

Существует 2 вида взаимодействий с базой данных, которые требуют блокировки 2-х разных типов:

Разделяемая блокировка

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

Монопольная блокировка

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

Что такое deadlock?

Взаимная блокировка (или deadlock) — это ситуация, при которой возник конфликт между несколькими операциями записи.

Рассмотрим пример:

Операция 1	Операция 2
Необходимо изменить данные A и B
Происходит изменение данных A	 
 	Происходит изменение данных B
 	Ожидание снятия блокировки с данных A
Ожидание снятия блокировки с данных B	 

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

Обойти эту проблему никак нельзя, поскольку СУБД не может разрешить двум операциям вносить изменения в один и тот же фрагмент данных одновременно, не потеряв при этом весь контроль над целостностью данных.

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

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

Что такое триггер? (Какие типы триггеров вы знаете?)

Триггеры — это части кода, запускаемые автоматически и основанные на каком-либо действии или событии в таблице базы данных.

Триггеры могут применять в таблице во время выполнения операторов INSERT, UPDATE или DELETE, а затем работать или перед, или после этих действий.

Некоторые СУБД также позволяют работать триггерам на уровне оператора или на уровне каждой строки данных во время ее изменения.

В чем разница между WHERE и HAVING? Конструкцию HAVING можно использовать только при наличии конструкции GROUP BY. Она действует по отношению к результатам конструкции GROUP BY аналогично тому, как конструкция WHERE отсеивает строки, возвращаемые оператором SELECT, в соответствии с указанным условием.

Что такое подзапрос (sub-query)?

Подзапрос — это запрос, вложенный в другой запрос.

Несколько примеров подзапросов:

SELECT * FROM tableA WHERE id IN (SELECT id FROM tableB)
SELECT * FROM tableA WHERE id > (SELECT AVG(id) FROM tableA)
SELECT tA.* FROM (SELECT * FROM tableA WHERE col IS NOT NULL) tA, tableB tB 
WHERE tA.id=tB.id
В чем различия между 4-ой и 5-ой версиями PHP?

Основные изменения в PHP 5: Новая версия движка - Zend Engine 2: увеличилась эффективность и производительность. Объекты передаются по ссылке; добавлен метод клонирования объектов (__clone). Новая объектно-ориентированная модель: добавлены интерфейсы, абстрактные классы, добавлены области видимости для свойств и методов (public, protected, private), унифицированный конструктор (__construct), деструктор (__destructor), статические свойства и методы (static), константы (const), добавлены "магические методы" - Magic Methods (основные, кроме ранее перечисленных - __get, __set, __call, __sleep, __wakeup, __toString), финальные методы (final). Добавлены исключения (try ... catch). Добавлены новые расширения, улучшена поддержка некоторых существующих.

Основные виды баз данных.

Иерархические Сетевые Реляционные Объектно-ориентированные

Типы таблиц в MySQL.

MyISAM InnoDB BerkeleyDB (BDB) MERGE HEAP ISAM

Что такое внешние ключи в БД?

Внешние ключи используются для организации связей между таблицами базы данных. Когда одно поле в таблице ссылается на другое (не обязательно в этой таблице), оно называется внешним ключом. Поле, на которое оно ссылается, называется родительским ключом. При обновлении поля в родительской таблице автоматически происходит определенное изменение поля в дочерней. Можно задать действие при обновлении родительского ключа (ON UPDATE) и при его удалении (ON DELETE). По стандарту SQL при этом с внешним ключом могут происходить следующие действия, в зависимости от заданных параметров: SET NULL - все внешние ключи, которые ссылаются на обновленный или удаленный родительский ключ, получают значения NULL. SET DEFAULT - устанавливает для всех столбцов, входящих во внешний ключ, значение, определенное по умолчанию в фразе DEFAULT, применяемой к данным столбцам. Если значение не определено, то по умолчанию оно равно NULL. CASCADE - изменение значения родительского ключа автоматически приводит к таким же изменениям в значении (значениях) внешнего ключа. NO ACTION. - значение внешнего ключа не изменяется. Если это приводит к нарушению целостности, оператор не исполняется. По умолчанию используется значение NO ACTION.

Что такое реляционная БД?

Реляционная база данных - база данных, построенная на основе реляционной модели. В реляционной базе данных каждый объект задается записью (строкой) в двумерной таблице. Каждая таблица представляет собой двумерный массив и обладает следующими свойствами:

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

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

Что такое MVC?

MVC (Model, View, Controller; Модель, Представление, Контроллер) – паттерн, представляющий объектно-ориентированный метод для разделения логики представления, бизнес-логики и модели данных. MVC состоит из объектов трех видов: Модель - это объект приложения, а вид - экранное представление. Контроллер описывает, как интерфейс реагирует на управляющие воздействия пользователя. Иными словами: Представление (вид) отвечает за отображение информации, поступающей из системы или в систему. Модель является "сутью" системы и отвечает за непосредственные алгоритмы, расчёты и тому подобное внутреннее устройство системы. Контроллер является связующим звеном между представлением и моделью системы, посредством которого и существует возможность произвести разделение между ними. Контроллер получает данные от пользователя и передаёт их в модель. Кроме того, он получает сообщения от модели, и передаёт их в представление. За счет использования MVC повышается гибкость и улучшаются возможности повторного использования.

Что такое модель OSI?

OSI (Open Systems Interconnection Basic Reference Model; базовая эталонная модель взаимодействия открытых систем) - абстрактная сетевая модель для коммуникаций и разработки сетевых протоколов. Представляет уровневый подход к сети. Каждый уровень обслуживает свою часть процесса взаимодействия. Модель состоит из 7-ми уровней, расположенных друг над другом. Уровни взаимодействуют друг с другом (по «вертикали») посредством интерфейсов, и могут взаимодействовать с параллельным уровнем другой системы (по «горизонтали») с помощью протоколов. Каждый уровень может взаимодействовать только со своими соседями и выполнять отведённые только ему функции. Уровни модели OSI:

  • физический уровень
  • канальный уровень
  • сетевой уровень
  • транспортный уровень
  • сеансовый уровень
  • уровень представления
  • прикладной уровень В настоящее время основным используемым семейством протоколов является TCP/IP.
Где PHP по умолчанию сохраняет данные сессии?

По умолчанию PHP хранит данные сессии в файлах.

Что такое паттерн проектирования singleton и как он реализуется?

Гарантирует, что можно создать только один экземпляр класса и предоставляет к нему глобальную точку доступа. Для реализации singleton в классе:

  1. задается приватное статичное свойство, в котором хранится объект экземпляра класса;
  2. методы __construct() и __clone() делаются приватными;
  3. для создания экземпляра класса объявляется статичный метод, который при вызове проверяет, хранится ли в приватном свойстве объект данного класса. Если нет, создает объект данного класса, сохраняет в приватном свойстве и возвращает его. Если хранится, то просто возвращает свойство с сохраненным в нем объектом.
Что такое представления в БД?

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

Зачем нужен HAVING в SQL?

HAVING задает условие на группу строк сгруппированной таблицы. Т.е. HAVING подобен WHERE, но выпоняется после группировки.

Что такое memcached?

Memcached - система кэширования данных в оперативной памяти. Использование memcached позволяет значительно снизить нагрузку на базу данных или файловую систему, данные из которых в нем закэшированы.

Отличия таблиц MyISAM от таблиц InnoDB.

MyISAM работает в среднем быстрее InnoDB, но в InnoDB реализованы блокировки на уровне строк, что увеличивает скорость работы в приложениях, выполняющих и интенсивное чтение, и интенсивное добавление/изменение данных. InnoDB, в отличии от MyISAM, поддерживает транзакции и внешние ключи. Таблицы MyISAM можно копировать средствами самой файловой системы, в отличии от InnoDB, попытка переместить файлы таблицы которой приведет к потере таблицы. MyISAM поддерживает полнотекстовый поиск.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment