Что должен знать бэкенд разработчик. Backend разработчик — кто он? Впечатления от бэкенда после фронтенда

Опытного IT рекрутера точно нельзя испугать модными словечками или техническими выражениями, а вот начинающему стоит разобраться во всех тонкостях IT сферы. Узнайте, чем занимаются "front end", "back end", "full stack" разработчики, чтобы быть уверенными в том, что вы с твердыми знаниями подходите к выполняемой роли специалиста. Какие-то различия - существенные, какие-то несут в себе большое количество тонкостей, но все они позволят вам понять текущие потребности IT-индустрии.

На сегодняшний день создается все больше и больше различных веб-инструментов, программ и сервисов. Спрос на разработчиков растет с каждым днем с такой же прогрессией. В связи с этим выросла потребность в IT рекрутерах.
Сегодня мы поможем вам понять, кто такие "front end", "back end", "full stack" разработчики.

Front End разработчик

Когда вы видите наполненный жизнью сайт с привлекательным интерфейсом, вам становится интересно, кто же этот волшебник, который так профессионально с ним поработал. Именно в эту минуту вы думаете о front end разработчике, даже об этом не зная. Любое визуальное отображение, с которым вы работаете, производится потом, кровью и слезами front end разработчика. GUI или «Графический пользовательский интерфейс» - это визуальный фронт, на котором отображается экран, позволяющий клиентам взаимодействовать с программным обеспечением. Любое из сегодняшних устройств с прилагательным «умный», будет иметь интерфейс, который запускает приложения, предоставляет доступ к веб-сайтам, и все это создается разработчиком front end.

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

Дизайнер UX ссылается на конструктор «User Experience», в котором описывается путь, который пользователь использует, и его общая эффективность. Front end разработчики также должны думать над общим удобством использования, полезностью и опытом, которые пользователь имеет при взаимодействии с программным обеспечением и этот конкретный сегмент требует, безусловно, самых «гибких навыков» программиста. Тем не менее, эта работа может выполняться также не программистами.

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

Традиционно разработчиком front end является человек, которому удобно работать как с дизайном, так и с кодированием. Другими словами, тот, кому комфортно работать с использованием простых инструментов проектирования и умеет писать структуру веб-сайта в HTML и стилизовать его с помощью CSS-кода. На данный момент самой большой проблей для front end разработчиков является то, что веб-сайт, построенный только с использованием HTML и CSS, будет полностью статическим. Если вы думаете о stickman на пустой странице в качестве веб-сайта. HTML будет достаточно, чтобы нарисовать его форму и CSS будет использоваться для его стилизации (сгустить, покрасить его, добавить одежду и т.д.). Но чтобы заставить stickman двигаться и реагировать, front end разработчику как следствие потребуется что-то еще.

По мере усложнения и совершенствования веб-приложений спрос на полный язык программирования Turing в интерфейсе растет с большой скоростью, поэтому для анимации программистов - stickman используют Java Script, который является языком программирования на стороне браузера.

Back End разработчик

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

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

У back end разработчика может быть множество обязанностей. От создания базы данных и интеграции до обеспечения безопасности, а также технологий резервного копирования и восстановления, также back end разработчики создают мозг приложения.

Back end разработчики используют различные технологии для кодирования основной вычислительной логики информационных систем, конкретного программного обеспечения или веб-сайтов. Они могут включать Java, C#, Python и языки баз данных, такие как SQL и многие другие. Back end отличаются от разработчиков front end тем, что работа back end разработчика полностью лишена какого-либо визуального дизайна и основывается на логике и архитектуре программного обеспечения, целью которой является предоставление определенного результата. Иногда возникают проблемы с объединением back end и front end, что приводит нас к человеку, который может обработать обе части.

Разработчик Full Stack.

Разработчик full stack - это тот, кто хорошо работает как с бэкэнд, так и с фронтэнд. «Чтобы быть более конкретным, это означает, что разработчик может работать с базами данных, PHP, HTML, CSS, JavaScript и всем, что находится между ними, также принимая во внимание преобразование проектов Photoshop в интерфейсный код», - говорит Sitepoint.

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

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

По пунктам: что нужно знать о бэкенде новичку в веб-разработке

  1. Запоминающая предыдущее состояние - реализуется с помощью сессий. Пользователь авторизуется один раз, а затем получает возможность свободно передвигаться по приложению и доступ к защищенным ресурсам (таким, как банковские транзакции или селфи в Snapchat), не отправляя данные, которые подтверждают его вход повторно.
  2. Не запоминающая предыдущее состояние - реализуется с помощью токенов. Пользователи делают все то же самое, но при выполнении каждого HTTP-запроса пользователю нужно отправлять идентификационные данные. Так обычно поступают с REST API. Сейчас золотой стандарт, не запоминающей состояние аутентификации с токенами, - JWT .

Есть и более продвинутый сценарий - многофакторная аутентификация. Она повышает безопасность приложения, добавляя дополнительные уровни защиты к логину и паролю. Хорошие примеры реализации есть у Google и Amazon .

Прим. перев. А у нас есть про двухфакторную аутентификацию и протокол FIDO U2F.

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

4. REST

Чтобы обеспечить управление ресурсами в вашем приложении (такими, как книги или аккаунты), нужно реализовать программный слой, принимающий запросы и формирующий ответы. Здесь вам доведется поработать с маршрутами (routes) и контроллерами (controllers). Они обеспечивают соблюдение ограничений, накладываемых REST - стилем архитектуры программного обеспечения для распределенных систем.

В типичном приложении на Ruby маршрут выглядит так:

Get "/photos/:id", to: "photos#show"

Что в это время происходит в системе:

  1. Приходит запрос на фото с этим маршрутом и передается контроллеру с помощью метода show .
  2. Этот метод, обращаясь к ресурсу из базы данных или к другому API, формирует и передает ответ в формате HTML или JSON.
  3. Клиент (в данном случае браузер компьютера) получает ответ и выводит фото на экран.

Запросы могут приходить из многих источников (их называют клиентами). Чаще всего запросы для веб-приложения формируются в форме ввода браузера. Но, если вы пишете бэкенд для мобильного приложения, то клиент - это API приложения, и он посылает запросы GET, POST, PUT, DELETE из приложения.

5. Формы и состояния

Формы - это самый распространенный способ общения пользователей с приложением. В основном через них пользователи и вводят все данные.

Вам надо создать формы для взаимодействия с бэкендом: если пользователь заказывает билет на концерт, то форма должна выглядеть, как сетка мест:

Когда пользователь начинает взаимодействовать с формой, вам надо сделать следующее:

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

6. API

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

17. Командная строка

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

Эдуард Гурский, Technical Lead в команде Internal Development

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

Бэкенд-веб-разработчик – это, по сути, человек, разрабатывающий серверную логику и осознающий, в каком контексте она будет исполняться – в контексте веб-приложений. Если бэкенд-веб-приложения реализуются на языке Java, а в большинстве случаев это так, то, по сути, к такому специалисту применимы все те же требования по знаниям и навыкам, что и к обычному Java-разработчику: знание языка, понимание работы и устройства основных библиотечных компонент Java SDK и т.д. Однако еще добавляются опыт работы с различными веб-фреймворками (упрощающими реализацию dependency injection, mvc и т.д.), умение оценивать и улучшать производительность приложения, его масштабируемость. Необходимо учитывать и понимать, насколько быстро пользователь приложения получит результат выполнения серверного кода, а также насколько безопасно и рационально ту или иную серверную функциональность делать доступной через браузер пользователя.

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

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

Несмотря на то что такой человек в основном занимается разработкой серверной логики приложения, возникает необходимость отладки или прототипирования с использованием клиентской части приложения. Отсюда вытекает необходимость понимания работы стека протоколов TCP/IP, HTTP, принципов взаимодействия браузера с веб-приложением, базовые знания о верстке, CSS-стилях, JavaScript-возможностях.

Каков инструментарий бэкенд-веб-разработчика?

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

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

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

Какие требования предъявляются к опыту работы?

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

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

Приветствуется опыт разработки приложений с использованием продуктов JetBrains. Мы все в компании стараемся пользоваться своими продуктами, потому что они удобные и потому что мы хотим сделать их еще удобнее!

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

  • Перевод

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

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

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

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

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

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

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

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

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

Итак, основные функции back end разработчика сводятся к следующим:

  • Осуществление задач по проектированию сервиса и архитектуры такового;
  • Создание непосредственно ядра сайта;
  • разработка в полном объеме платформы, а также ее функционала;
  • знание кода, его архитектуры;
  • разработка вех приложений, которые осуществляют поддержку интерфейса пользователя, а также безопасность такового;
  • осуществление контроля и присмотра за всеми серверами;
  • контролирование версий, баз с данными, а также непрерывной интеграции.

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

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

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

Похожие статьи