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

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



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


Меня зовут Костя, и я работаю в 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 остались далеко позади, к счастью.

Backend-разработчику нужно иметь хорошее фундаментальное техническое образование. Качественное образование дают МФТИ, МГТУ, МГУ, ИТМО или МИФИ. Но многое зависит от человека, от его желания и интереса. При наличии желания хорошее образование можно получить и в менее престижных вузах.

Профильные факультеты

Отсутствие профильного образования приведет к тому, что, когда у человека что-то не заработает, он просто не поймет, почему. Специализация очень важна: есть алгоритмы, структуры данных, понятие конечного автомата. Люди без специального образования не знают этого, и у них возникает много вопросов. Для разработчика важен особый навык — не знать всё подряд (это априори невозможно), а знать о существовании определенных вещей, о том, где их найти и как использовать.

Mail.Ru Group запустила программу бесплатного дополнительного образования «Технопарк » для студентов МГТУ им. Баумана, в рамках которой можно получить все необходимые для backend-разработчика теоретические знания и практические навыки.

Книги

Совершенный код. Мастер-класс

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

Приемы объектно-ориентированного проектирования. Паттерны проектирования

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

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

Бэк-энд разработчик — боец невидимого фронта.

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

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

Основные инструменты бэк-енд разработчика - серверные языки программирования: такие как PHP, Python, Ruby, Java, Perl, Node JS (программная платформа). Дополнительно к Node JS полезно изучить Express (библиотека для взаимодействия платформы Node JS с сервером) и Mongo DB (базу данных для получения и хранения информации).

В качестве дополнительных средств применяются фреймворки Symfony, Codeigniter, Yii, Zend Framework, Kohana и др. С целью хранения данных используются MySQL/SQLite.

Особенности профессии

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

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

Таким образом, функционал бэк-энд разработчика выглядит следующим образом:

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

Плюсы и минусы профессии

Высокооплачиваемая и востребованная профессия.

Место работы

Компании по разработке сайтов, веб-приложений, мобильных приложений.

Важные качества

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

Профессиональные знания и навыки

Знание хотя бы одного языка программирования: Go, C, C++, Perl, Python, PHP, Ruby, Java.

  • умение писать быстрый, красивый и правильный код;
  • знание популярных веб-фрейморков (Django, Flask, Spring);
  • умение проектировать базы данных и оптимизировать запросы;
  • знание современных парадигм программирования;
  • знание паттернов проектирования;
  • понимание устройств веб-сервисов, интерфейсов;
  • английский язык для чтения технической документации.

Где учиться на Бэк-энд разработчика

Обучает (Очно, Москва). Международное учебное заведение, специализирующееся на компьютерном образовании. Работает с 1999 года. 42 филиала в 16 странах мира. Крупнейший авторизованный учебный центр Microsoft, Cisco, Autodesk. Студенты получают международные сертификаты и международный диплом. Главная цель – трудоустройство каждого выпускника.

Высшее образование:

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

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

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

Оплата труда (сколько зарабатывает Бэк-энд разработчик)

Зарплата на 16.09.2019

Россия 40000—100000 ₽

Москва 80000—300000 ₽

Ступеньки карьеры и перспективы

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

  • Перевод

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

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

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

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

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

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

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

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

Бэк-энд разработчик — боец невидимого фронта.

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

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

Основные инструменты бэк-енд разработчика - серверные языки программирования: такие как PHP, Python, Ruby, Java, Perl, Node JS (программная платформа). Дополнительно к Node JS полезно изучить Express (библиотека для взаимодействия платформы Node JS с сервером) и Mongo DB (базу данных для получения и хранения информации).

В качестве дополнительных средств применяются фреймворки Symfony, Codeigniter, Yii, Zend Framework, Kohana и др. С целью хранения данных используются MySQL/SQLite.

Особенности профессии

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

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

Таким образом, функционал бэк-энд разработчика выглядит следующим образом:

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

Плюсы и минусы профессии

Высокооплачиваемая и востребованная профессия.

Место работы

Компании по разработке сайтов, веб-приложений, мобильных приложений.

Важные качества

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

Профессиональные знания и навыки

Знание хотя бы одного языка программирования: Go, C, C++, Perl, Python, PHP, Ruby, Java.

  • умение писать быстрый, красивый и правильный код;
  • знание популярных веб-фрейморков (Django, Flask, Spring);
  • умение проектировать базы данных и оптимизировать запросы;
  • знание современных парадигм программирования;
  • знание паттернов проектирования;
  • понимание устройств веб-сервисов, интерфейсов;
  • английский язык для чтения технической документации.

Где учиться на Бэк-энд разработчика

Обучает (Очно, Москва). Международное учебное заведение, специализирующееся на компьютерном образовании. Работает с 1999 года. 42 филиала в 16 странах мира. Крупнейший авторизованный учебный центр Microsoft, Cisco, Autodesk. Студенты получают международные сертификаты и международный диплом. Главная цель – трудоустройство каждого выпускника.

Высшее образование:

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

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

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

Оплата труда (сколько зарабатывает Бэк-энд разработчик)

Зарплата на 16.09.2019

Россия 40000—100000 ₽

Москва 80000—300000 ₽

Ступеньки карьеры и перспективы

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