• +7 (495) 648-57-90
  • +7 (8442) 95-99-99

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

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

Наиболее массовая профессия в ИНТЕРВОЛГЕ –  backend-разработчик, и чаще всего на тестовое задание мы предлагаем разработку простого веб-проекта с особым вниманием к серверной части.

Мы получаем несколько десятков резюме в месяц, проводим около 10 собеседований, принимаем на работу 1-2 человек.

Цель системной работы над отбором кандидатов – повысить качество и снизить трудозатраты на отбор.

Тестовое задание “до собеседования”

Вот пример такого задания:

Интерфейс добавления и просмотра данных

В таблице базы данных хранятся страны. Напишите на html, css, js, php интерфейс добавления новой страны в таблицу и просмотра списка стран из таблицы.

Структуру таблицы придумайте самостоятельно. Удаление и редактирование делать не нужно.

Подход к проверке тестовых заданий

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

Возникает спорный, почти религиозный вопрос – что такое хорошо и что такое плохо? Что наши “проверяющие потенциальных программистов” считают достойным минимальным уровнем?

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

Публикация требований

Чтобы сэкономить время на разбор решений, мы решили дополнить задание “требованиями”.

Был опубликован общий текст со списком проверяемых пунктов.

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

Хорошее решение – это:

  1. защита от инъекций при получении параметров через get- или post;

  2. защита от опасного текста, вводимого пользователем;

  3. осмысленное название полей и таблицы базы данных;

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

  5. отсутствие дублирование кода; копипаст – признак низкой культуры разработки;

  6. запускаемость в linux-средах без танцев с бубнами (регистр имен файлов, относительные пути);

  7. разделение логики работы и представления – некрасиво писать html и php вперемешку;

  8. осмысленное использование css и хотя бы немного на js.

HTML- и CSS-фреймворки использовать можно. PHP-код надо написать с нуля.

Это задание не нужно решать "как попало". Оно очень простое, но сделать нужно хорошо.

Критерий качества решения — защищенность, надежность, простота реализации.

Это привело к некоторому снижению количества решений и росту их качества. Стало лучше. 

Однако некоторые требования (например, “защита от опасного текста, вводимого пользователем”) все еще были непонятны и систематически не выполнялись. Мы решили сделать следующий шаг и развернуть наши требования.

Мы опишем каждый пункт и опубликуем пример кода, который считаем достойным новичка для приглашения на собеседование.

Требования к решению тестовой задачи на PHP и уровни качества

Набор требований приведен далее. Мы сгруппировали их в 5 блоков:

  1. Защита

  2. Оформление кода

  3. Эффективность

  4. Портируемость

  5. Фронтэнд

На каждый уровень написаны уровни решения от плохого к хорошему. Минимально-приемлемый для приглашения на собеседование уровень указан в каждом пункте. Для каждого требования мы определили уровень важности для нас. Уровня получилось всего 2: “обычный” и “критичный”.

“Обычный” – значит мы можем этому научить и отсутствие уверенного навыка у новичка нас не удивляет.
“Критичный” – либо научить нельзя, либо отсутствие навыка мы считаем “гигиенически неприемлемым”.

Защита: SQL-инъекции

Программист должен обладать здоровой паранойей. Любого пользователя нужно воспринимать как потенциального противника и не доверять ни единому его запросу. Возьмём, к примеру, код поиска пользователя по логину:

mysqli_query('select * from users where LOGIN = ' . $_REQUEST['login']);

По задумке разработчика честный пользователь в параметр login будет передавать нам на сервер свой логин. Но если вдруг вместо него он подсунет строчку

Vasya; drop table users;

Тогда нас ждёт удаление всех пользователей из базы данных.

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

Уровни соответствия требованию:

  1. htmlspecialchars , trim , addslashes

  2. prepared statements , PDO::prepare или хотя бы real_escape_string , приведение к int для чисел

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

Пример хорошего кода:

Защита: вывод html

Удивительно, но этот пункт не выполняется почти никогда. О чем он?

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

Отсутствие такого фильтра чревато как минимум визуальными нарушениями структуры, а как максимум – пользовательским JS, исполняемым для всех гостей. Здравствуй, “кража кук с осложнениями”.

Любимый наш тест для этого пункта: создание записи с названием

<script>alert(1);</script>

Если после этого на каждой странице выскакивает окошко с единицей — тест провален.

Уровни соответствия требованию:

  1. str_replace , preg_replace как извращение, приведение к int для чисел

  2. htmlspecialchars при выводе

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

Пример хорошего кода:

Именование (таблицы, колонки, PHP-классы, HTML-классы, переменные)

Искусство выбора подходящих названий играет немалую роль в разработке ПО. Казалось бы, что тут сложного? Правил немного и запомнить их не так сложно:

  1. Единообразие имён. Если одну переменную вы назвали $firstVar то назвать вторую $second_var — отступление от этого правила. Мы не разжигаем холивар и не утверждаем что camelCase лучше чем snake_case (или наоборот) — но если вы выбрали один из этих стилей, то придерживайтесь его всегда.

  2. Использование грамотного английского языка. Если со знанием английского проблемы — начинайте учить, а пока пользуйтесь переводчиком от Google .

  3. Название должно отражать суть содержимого. Ничто так не огорчает опытного техлида, как переменные типа a, b, c. Мы не на уроке математики в 6 классе, код нужно развивать и поддерживать.

  4. Если речь про название переменной или столбца в БД — то должен быть понятен ещё и тип содержимого. Например, в столбце capital хранятся какие-то сведения о столице, но неизвестно какие. Стоит лишь переименовать в capital_name, становится сразу ясно, что речь о названии.

Мы оцениваем именование по 4 разным направлениям:

  1. БД (таблицы, колонки)

  2. PHP (переменные, классы, функции)

  3. CSS (классы и id)

  4. Файлы

Пример хорошего кода:

Оформление кода [критично]

Оформление кода – больной вопрос. Мы выпустили несколько статей на тему code style и статического анализа, боремся за звание дома высокой культуры быта единый стиль.

Это “критичное” требование. В то же время оно звучит просто: ваш код не должен быть похож на кашу. Рецепт прост: грамотно и аккуратно расставлять отступы, скобки и комментарии.

Отступы

Опять же, мы стараемся остаться в стороне от вечного противоборства фанатов табуляции и приверженцев пробелов. Чем хотите, тем и ставьте отступы — но одинаковые по всему заданию. Часто получаем такое “письма из Простоквашино”, что остаётся только гадать: либо авторов у кода было несколько, либо программист ну очень уж нерешительный и хочет угодить одновременно всем возможным авторам различный стилей.

Пример хорошего кода:

Фигурные скобки

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

Пример хорошего кода:

Комментарии

У каждого программиста свой уровень и каждый определяет необходимость комментариев только по своему “внутреннему” компасу. Поэтому сложно дать готовый рецепт. Мы это понимаем, поэтому ввели следующую шкалу:

  1. Комментариев нет совсем — не молодец

  2. Комментарии есть ко всем смысловым блокам (блоки по 5-10 строк) — молодец

  3. Нет бесполезных комментариев (вроде “добавляем 1 к переменной-счётчику” или “умножаем на 10”) и присутствуют комментарии для функций в нотации phpdoc — большой молодец.

Пример хорошего кода:

Эффективность: дублирование кода [критично]

Есть известный принцип программирования — DRY (Don’t repeat yourself) . Есть злой, но справедливый перевод “копипаст – признак тупости”. Вот с ней этим явлением мы и боремся.

Если в вашем решении несколько страниц и на каждой у вас есть подключение к БД, вывод DOCTYPE и прочей вёрстки — выносите это, пожалуйста, в отдельный файл и подключайте через include или require.

Пример хорошего кода:

Эффективность: разделение логики и представления [критично]

Современные веб-приложения пишутся на нескольких языках одновременно. Для Битрикса это PHP, JS, CSS, HTML, SQL. Конечно, можно “не париться” и писать всё в одном файле. Выбирать данные из БД, выводить вёрстку и стили вперемешку с JS. А можно подумать о поддержке кода, его будущих читателях и простоте отладки, разделив логику и представление. Мы не требуем разрабатывать свой MVC-фреймворк, но даже на нашей простейшей задаче можно показать умение (или неумение) отделять логику от представления разумным и осмысленным способом.

Обычно рецепт прост:

  1. Подключение к БД и выборка из нее — это отдельные функции/классы, подключаемые на странице.

  2. Возвращаемые такими функциями значения выводятся через минимальное количество PHP-конструкций: if, foreach, while, echo.

Ну а если вы вынесите повторяющуюся часть начала и конца страницы в header и footer-файлы, это вообще замечательно.

Пример хорошего кода:

Эффективность: подключение к БД [критично]

Подключение к БД — одна из ключевых возможностей языка PHP. Как правило, она изучается ровно один раз и больше программист не вспоминает об этом (если только на привычные строки подключения к БД сервер не отвечает function undefined). Важно идти в ногу со временем и использовать современные библиотеки для работы с базой.

Способ, который был популярен каких-то 2-3 года тому назад — функции семейства mysql_*, например mysql_connect уже уходят в прошлое.

  1. Функции семейства mysqli_ и их ООП-аналоги

  2. PDO

Второй способ более предпочтителен и за его использование ваше решение получит дополнительную “звездочку”.

Пример хорошего кода:

Портируемость: независимость от ФС

Мы проверяем, можно ли запустить код потенциального коллеги на windows- и linux-сервере без правки файлов и их имен.

  1. Все в одной папке

  2. Код не зависит от папки, в которой расположен сайт; имена всех файлов в нижнем регистре.

Это требование среднего уровня, но невнимание к регистру имен файлов и пути вроде

С:/Интерволга/Программирование/Теставое задание

нас огорчают.

Пример хорошего кода:

Портируемость: имена файлов в нижнем регистре

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

Фронтенд: CSS

Задание, которое мы выдаем, простое и может быть решено без единой строчки CSS, это факт. Но почему-то соискатели в большинстве своём считают, что такой интерфейс  это нормально.

Как думаете, при прочих равных условиях, мы позовём этого человека или автора следующего интерфейса?


Это задание, как и любое другое — способ показать себя, привлечь внимание. Если вы присылаете решение без CSS — чаще всего мы думаем: “похоже он (она) понятия не имеет, что это такое и как этим пользоваться”. А ведь мы добавляем баллы за:

  1. CSS, встроенный в страницу

  2. CSS, вынесенный в отдельные файлы

Разумеется, на второй способ мы смотрим более благосклонно.

Пример хорошего кода:

Фронтенд: JS

Аналогичные мысли хочется донести до соискателей и по JS. Используйте любую анимацию, эффекты, подтверждение действий. Однажды нам даже прислали решение с AJAX. Не то чтобы это было killer-фичей — но этого человека мы приняли.

Пример хорошего кода:

Штрафы за

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

  1. Наличие закомментированного кода

  2. Загрузка изображений, CSS, JS из внешних источников

Бонусы за

А за следующие “благодетели” мы награждаем дополнительными баллами при проверке.

  1. Использование любого фронтенд-фреймворка, например Bootstrap.

  2. Предоставляя код, не скидываете архив а даёте ссылку на Github (двойной бонус за наличие коммитов)

  3. Автозагрузка классов

  4. Правильный редирект после отправки данных на сервер методом POST

  5. Включен вывод ошибок — если пользователь что-то где-то не задал — он понимает где и что.

  6. ORM для работы с БД вместо прямых запросов или набора функций

Наши вакансии

Мы готовы принять на работу начинающего веб-разработчика и сделать из него гуру. Задания и условия . Форма заявки там же.

Пример кода

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

Выводы и итоги

Эта работа дает результат – наши новенькие программисты все лучше готовы к реальной работе.

Следующим шагом для нас станет открытие Школы веб-разработчика для начинающих в Волгограде. Следите за обновлениями.

Оцените статью:
Я «поделился» статьей, прошу прислать файл

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