Backend разработчик — кто он? Каким должен быть бэкенд-веб-разработчик Что должен знать backend разработчик

Веб-разработчик

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

Давайте начнем с определений.

Фронтенд - все, что браузер может читать, выводить на экран и / или запускать. То есть это HTML, CSS и JavaScript.

HTML (H yperT ext M arkup L anguage) говорит браузеру, каково содержание страницы, например, «заголовок», «параграф», «список», «элемент списка».

CSS (C ascading S tyle S heets) говорит браузеру, как отображать элементы, например, «после первого параграфа отступ в 20 пикселей» или «весь текст в элементе body должен быть темно-серым и написан шрифтом Verdana».

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

Бэкенд - все, что работает на сервере, то есть «не в браузере» или «на компьютере, подсоединенном к сети (обычно к Интернету), который отвечает на сообщения от других компьютеров».

Для бэкенда вы можете использовать любые инструменты, доступные на вашем сервере (который, по сути, является просто компьютером, настроенным для ответов на сообщения). Это означает, что вы можете использовать любой универсальный язык программирования: Ruby, PHP, Python, Java, JavaScript / Node, bash. Это также означает, что вы можете использовать системы управления базами данных, такие как MySQL, PostgreSQL, MongoDB, Cassandra, Redis, Memcached.

Структура взаимодействия бэкенда и фронтенда

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

Серверные приложения

В этом случае HTTP-запросы отправляются напрямую на сервер приложения, а сервер отвечает HTML-страницей.

Между получением запроса и ответом сервер обычно ищет по запросу информацию в базе данных и встраивает ее в шаблон (ERB, Blade, EJS, Handlebars).

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

Связь с использованием AJAX

Другой тип архитектуры использует для связи AJAX (A synchronous J avaS cript and X ML). Это означает, что JavaScript, загруженный в браузере, отправляет HTTP-запрос (XHR, XML HTTP Request) изнутри страницы и (так сложилось исторически) получает XML-ответ. Сейчас для ответов также можно использовать формат JSON.

Это значит, что у вашего сервера должна быть конечная точка, которая отвечает на запросы JSON- или XML-кодом. Два примера протоколов, используемых для этого - REST и SOAP.

Клиентские (одностраничные) приложения

AJAX позволяет вам загружать данные без обновления страницы. Больше всего это используется в таких фреймворках, как Angular и Ember. После сборки такие приложения отправляются в браузер, и любой последующий рендеринг выполняется на стороне клиента (в браузере).

Такой фронтенд общается с бэкендом через HTTP, используя JSON- или XML-ответы.

Универсальные/изоморфные приложения

Некоторые библиотеки и фреймворки, например, React и Ember, позволяют вам исполнять приложения как на сервере, так и в клиенте.

В этом случае для связи фронтенда с бэкендом приложение использует и AJAX, и обрабатываемый на сервере HTML.

Вне фронтенда и бэкенда

Автономный фронтенд

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

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

Легкий бэкенд

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

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

Размытые границы

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

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

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

Разработка сайтов по системе front-end и back-end подразумевает иерархическое разделение процесса создания ресурса на две части, на разработку пользовательского интерфеса –(фронтэнда ) и его программно-административной части (бэкэнда ).

Front-end разработка – это работа по созданию публичной части сайта, с которой непосредственно контактирует пользователь и функционала который обычно обыгрывается на клиентской стороне (в браузере ).

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

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

При создании пользовательской стороны сайта и формировании html страницы мы учитываем следующие моменты:

  • Грамотное использование тегов h1, h2 и т.д. в порядке очерёдности.
  • Грамотное использование тега lang.
  • Реальное заполнение атрибута alt для картинок. Если на картинке изображен логотип, то “Логотип компании”, если человек, то имя человеке. Для значков на английском языке “Twitter Icon” и т.д. (не относиться к динамическим изображениям, например, фото новости).
  • Не забываем про метатеги.
  • Не забываем про фавиконку (favicon).
  • Там где предполагается ссылка, должна быть прописана ссылка.
  • Для контактов использовать атрибуты skype, tel и mailto.
  • Ссылки на внешние страницы должны открываться в новом окне.
  • Каждая ссылка имеет атрибут title.
  • Код хорошо прокомментирован.
  • Оптимизация изображений для Интернета.
  • Использование мобильных версий картинок, там где это необходимо.
  • HTML, CSS и JS файлы должны иметь параллельно с основной (рабочей) и сжатую версию для последующего запуска сайта на хостинге.
  • Все стили и скрипты вынесенны в отдельные файлы.
  • Размеры всех картинок заданы средствами CSS.
  • Использовать слайдеры, карусели и галереи адаптированны для мобильных устройств.
  • Всплывающие окна адаптированны для мобильных устройств.
  • Переименование файлов в случае использования кеширования.
  • Подсветка (hover, active, visited) для ссылок.
  • Подсветка (hover, active) для кнопок и полей в формах.
  • Прижатый подвал при малом кол-ве контента на странице.
  • Отсутствие outline у кнопок.

Back-end разработка

Бэкэнд development – это процесс программирования сайта и наполнения его функционалом. Создание ядра сайта, разработка платформы сайта, наполнение его основным функционалом и создание административной зоны – это и есть бэкэнд разработка.


Бэкэнд производит обработку пользовательской информации полученной из front-офиса, и возвращает front-end’у результат в понятной ему форме.

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

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

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



При этом некоторые работодатели всячески это приветствуют и считают чем-то вроде предохранителя от выгорания – человек сменит фокус внимания, сменит департамент или отдел, но не сменит саму работу в целом.


Меня зовут Костя, и я работаю в QIWI почти 4 года. Сегодня расскажу вам, как успешно перешел из frontend-разработки в backend.

Frontend

В QIWI я с конца 2014 года, начинал работать как разработчик iOS–приложений, и, в принципе, пару лет занимался разработкой QIWI-кошелька. При этом не могу сказать, что было скучно – задачи были довольно разные и в рамках одного приложения: мы занимались интеграцией кошелька с другими нашими сервисами, чинили баги, подтягивали анимацию. Кроме этого, был занятный опыт по созданию приложения для Apple Watch. Потом немного расширил фокус и поработал еще и над iOS-приложением для «Совести».



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


Но в бэкенде на то время было слишком мало разработчиков и слишком здоровенный бэклог, так что в итоге я все же переключился на бэкенд полностью. То, что я делаю сейчас, это классические задачи бэкендера – пишу код в наших микросервисах, чиню баги, занимаюсь рефакторингом, постигаю Kotlin. Есть возможность работать и над свежим продуктом компании – QIWI Инвестор.


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


Так что тут сложилась win-win ситуация – я хотел помочь команде и продукту (перевес в разработке был сильно не в сторону бэкендеров) и набраться новых знаний. Тимлиды все поняли и отпустили меня без каких-то претензий, продакт тоже.


Кроме этого, знания хотелось именно диверсифицировать, чтобы не привязываться к одной платформе (Android мне немного не по душе, но и Apple все же сдает позиции). Ну и было желание в случае чего уметь взять и сделать себе приложение самому (и фронт, и бэк), если вдруг появится какая-то клевая идея. Пока вот не пригодилось, правда.

Backend


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


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


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

Впечатления от бэкенда после фронтенда

Нет работы с UI. Вообще. Раньше приходилось убивать время на исправление багов в UI, сейчас – нет. Минусы такого положения – конечный пользователь не видит результатов конкретно моей работы, как это было с фронтом. Я пытался определить, что же сложнее – бэк или фронт, и понял, что (лично для меня) тяжелее всегда было работать с многопоточностью и сетевым стеком. И тут уже не так важно – за фронт ты или за бэк. На фронте я просто столкнулся с такими задачами впервые, без подготовки, а на бэкенде уже с каким-никаким опытом.


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


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

Что в итоге

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


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


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

  • Перевод

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

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

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

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

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

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

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

Где ответы?

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

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

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

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

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

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. В чём бы вы попробовали их убедить? Удалить контролируемые исключения? Добавить беззнаковые примитивные типы? Множественное наследование?

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

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

Как бы вы управляли нумерацией версий 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)? Почему?

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

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

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

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

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

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

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

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

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

Function hookupevents() { for (var i = 0; i < 3; i++) { document.getElementById("button" + i) .addEventListener("click", function() { alert(i); }); } }
Насчёт стирания типов, что выдаст такой код Java и почему?

ArrayList li = new ArrayList(); ArrayList lf = new ArrayList(); 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; } public void push(Object e) { ensureCapacity(); elements = 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; }