- PVSM.RU - https://www.pvsm.ru -
В заметке будет приведен краткий обзор задания из анкеты Екатеринбургской Yandex школы разработчиков интерфейсов 2013. Мне бы хотелось остановиться на некоторых его тонкостях и предложить критерии его оценки.
Данная заметка из серии – «Выбора тестового задания для разработчиков. Критерии оценки». Она является подготовкой почвы для разговора с будущим разработчиком.
Замечу, что оригинальное задание должно быть выполнено на JavaScript, но, не смотря на это, данную заметку можно рассматривать без привязки к языку.
Напишите алгоритм карточной игры в «Пьяницу» на JavaScript. Интерфейс и возможности игры мы оставляем на ваше усмотрение и фантазию. В качестве ответа на вопрос пришлите ссылку на ваш код на jsfiddle.net [1] или на github.com [2].
Правила игры
Происхождение игры в «Пьяницу» неизвестно. Есть мнение, что свое название она приобрела из-за простых правил и еще потому, что победа в игре зависит исключительно от везения. Играть в «Пьяницу» очень просто. На старте колода из 52 карт тасуется и делится между всеми игроками поровну. Далее каждый игрок кладет свою стопку карт перед собой «рубашкой» вверх. Игроки одновременно переворачивают верхнюю карту. Тот, у кого карта оказывается больше по достоинству, забирает все открытые карты себе и кладет их под свою стопку. Самой большой картой в «Пьянице» считается туз, самой маленькой — двойка.
Если две карты оказываются одного достоинства, то начинается «война». Игроки кладут «рубашкой» вверх следующую карту, а следом за ней — карту лицом вверх. Игрок с большей картой забирает все карты на кону. Если карты снова оказываются равными, то «война» продолжается таким же образом. Снова одну карту кладут «рубашкой» вверх, а за ней — лицом вверх. И так далее до определения победителя. Выигравший «поединок» забирает все карты на кону. Игра продолжается, пока у одного игрока не окажутся все карты — он и считается победителем.
Я не знаю какие критерии оценки решений в компании Яндекс, но это безусловно было бы интересно услышать.
На мой взгляд, самыми важными критериями оценки качества кода является:
Начнем разбираться по порядку.
В данной игре есть тонкие моменты, на которые стоит обратить внимание. Естественно, они должны обрабатываться корректно.
Четвертый случай можно пометить звездочкой, поскольку в правилах данная ситуация никак не регламентирована. Но, естественно, можно считать плюсом обработку подобной ситуации.
Пятый случай я бы пометил двумя звездочками.
Под читаемостью я больше понимаю не следование стайлгайду конкретного языка, а правильность названия переменных и функций и отделение логических блоков. Так же понятно, что в коде не должно быть глубокой вложенности конструкций. Все это более – менее фундаментальные правила (фундаментальные – в смысле что относятся они не к конкретному языку и принятым в нем соглашениям)
Понятно, что стайлгайд – это хорошо, но ведь код можно переформатировать под него и автоматически. А вот правильное название переменных, файлов, названий функций (из названия должно быть понятно, что хранится в переменной, о чем написано в файле, что делает функция) и выделение блоков (отделение переводом строки некоторых частей кода) – это уже задачи, которые решаются только разработчиком.
Данный пункт, прежде всего, предполагает хорошую декомпозицию задачи. Выделение логических частей решения.
Пункт может быть оценен по следующему критерию – легко ли будет внести изменения в код, если техническое задание изменится.
Приведем пример простых изменений:
В идеале, мы должны будем поправить одну – две функции. Ну никак не перепиливать всю игру.
Давайте рассмотрим на примере схемы то, как должна быть выполнена начальная декомпозиция задачи:

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

Названия для состояния игры я бы выбрал исходя из результата раунда, то есть выделил бы следующие названия для состояний:
Так же, можно выделить основные сущности для данной игры: Карта, Колода (стопка) карт, Игра.
Объяснения по поводу выбора сущностей писать не буду, поскольку это очень спорный момент. Я привел их исключительно для примера. В любом случае об этом нужно беседовать с каждым разработчиком индивидуально, что бы выслушать его позицию и аргументацию в пользу его выбора, и уже после этого оценивать его доводы.
Пожалуй, это все основные критерии, по которым я бы оценивал работу.
Заметка получилась немного сумбурной, но я постарался изложить некоторые критерии оценки работы, немного коснулся того, как бы это реализовал я.
С первого взгляда задание кажется глупым и тривиальным, но при более глубоком рассмотрении в нем видны тонкие моменты.
Можно посмотреть на результаты выполнения задания в сети, они легко гуглятся, среди них есть интересные. Особенно любопытные, могут, применив свои СИ способность, узнать победителей. Мне было интересно посмотреть как одну и ту же задачу решили разные люди.
А вообще, было бы интересно узнать, по каким критериям работы оценивали в Яндексе.
Автор: pahaz
Источник [3]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/javascript/43356
Ссылки в тексте:
[1] jsfiddle.net: http://jsfiddle.net
[2] github.com: https://github.com
[3] Источник: http://habrahabr.ru/post/193786/
Нажмите здесь для печати.