Тестове завдання для C# middle

Цікавим варіантом (простим, і одночасно веселим) буде написання гри 2048.
Час на виконання: 3 години.
Моє рішення: github.com/AndriiZ/2048

P.S. Тестове завдання для senior — написання AI engine, що зможе набирати 2048 плитку.

👍НравитсяПонравилось0
В избранноеВ избранном0
LinkedIn
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Вся суть бессмысленности даного задания ( dou.ua/...c/10085/#487928 ):

Розбити код по модулях і т.д. — це очевидно, але в даному випадку не потрібно.
Код который для тестовых заданий, как правило имеет мало общего с промышленным кодом.
Час на виконання: 3 години.
Никогда не нравились задания с дедлайном.

Я, конечно, не шарпист, но хотел побаловаться. И что вы думаете — не могу собрать! Ругается на строчку IGame game2048 = new Game2048(engine, options, board);
Типа «Я такого класса (Game2048) не знаю». Что это может быть?

Це значить, що мені не треба комітити о першій ночі )

pi@raspberrypi ~/src/csharp/2048 $ git status
On branch master
Your branch is up-to-date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   2048.exe

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        Game2048.cs

no changes added to commit (use "git add" and/or "git commit -a")
pi@raspberrypi ~/src/csharp/2048 $ git add Game2048.cs
pi@raspberrypi ~/src/csharp/2048 $ git commit -a
[master 021c590] Added missed Game2048.cs
 2 files changed, 88 insertions(+)
 create mode 100644 Game2048.cs
pi@raspberrypi ~/src/csharp/2048 $ git push
Counting objects: 4, done.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 1.28 KiB | 0 bytes/s, done.
Total 4 (delta 2), reused 0 (delta 0)
To git@github.com:AndriiZ/2048.git
   d6b8cfa..021c590  master -> master
pi@raspberrypi ~/src/csharp/2048 $

Cirulli created the game in a single weekend (2 дня) as a test to see if he could program a game from scratch.

Ну так

Cirulli
19-річний джуніор, а у нас в Україні від 23 років усі senior.

Отличное задание! Куда интереснее чем интерпретатор брейнфака.

Тестовое задание для Junior: собрать все .cs файлы в проект (.csproj); А .csproj добавить в солюшн (.sln) и откомпилить все в Visual Studio ;)

То для того, щоб взяли на курси джунів:)

шо то вы придумываете, нету тут синьоров которые за 3и часа напишут АИ

Возможно, я что-то не понимаю, но вот мои замечания:
1) Вся прога в одном файле — кошмар. Было бы разумнее разбить сущности Board и манипуляторы над ними PrintBoard по разным файлам, 1 файл на класс.
2) методы длинные и многоуровневые — тяжело читать и воспринимать.
3) где тесты? NUnit или шото похожее?
4) Комментарии только в шапке, что творится в методах не всегда понятно.
5) Волшебные числа — это не миддл. Если 64, 128 и т.д. можно догадаться, то tile.Value = (rndStartTile % 10) != 0 ? 2 : 4;// 90% - 2, 10% - 4 совершенно непонятно и таких кусков много.
[6] откуда ограничение на 1000 шагов?
[7] пихать AI и User game в 1 класс считаю неразумным. Более разумно модульно подключать AI через интегрфейс, что позволит поменять/сравнить несколько вариантов решения.

Мое мнение: незачет

Джунівські зауваження, якщо чесно.
Розбити код по модулях і т.д. — це очевидно, але в даному випадку не потрібно.
AI і User це й так 2 різні класи.
Коментарів в шапці немає. Код самодокументовний назвами методів.

Андрію, в усіх моментах крім коментарів згоден з Габріелем. Я прихильник самодокументованого коду, особливо в коді до 1000 рядків.

З твоїм підходом — тільки чірік-чірік і в продакшен, людину, що пише нормальний підтримуваний код, — або знайдеш, або ні. Ти фокусуєшся на тому, що код працює, але не на його якості, що є фундаментальною і критичною помилкою. В довгограючому проекті будуть проблеми.

Правильно що таки розбив на кілька файлів. Але конструктивну критику можна сприймати спокійніше; на що скажеш про інші 4 пункти, на які ти не відповів? І це зовсім не джунівські зауваження, на інші 3 я тільки по коментарях з тобою згоден.

Плюс до сказаного Габріелем:

1. Назви деяких методів неоптимальні, можна краще. Але в ПоК необов’язково, добре.

2. Доповнення до Габріеля: тести. Якщо від мідла і вище (ну ОК, від синьйора і вище) я отримаю завдання без тестів хоча б 10% критичного функціоналу — це автоматичний фейл. Людина не пише по ТДД, ну й дідько з ним, переживу — необов’язково ТДД це плюс; біда в тім, що людина не хоче і не пише тестів, і це критична проблема. Не рекомендую наймати.

3. Найголовніше — для синьйора це не тест. Де фреймворк, з яким треба буде працювати ASP.NET / ASP.NET MVC / MVVM / Xamarin)? Де вимоги по тестах і самі тести, як результат? Де SQL (ОК, давай без нього, необов’язково)? Де DI? Ти не перевіряєш цим тестом достатньо, щоб сказати, що людина — підкований синьйор. На мідла — зі скрипом ОК, хоча я б потім поганяв ще по теорії.

Для тестів потрібно додавати інфраструктурний код, якого на етапі PoC не потрібно. Ми не знаємо, що буде з кодом, чи знадобиться він взагалі. При реалізації ж задачі для production тести будуть писатися перед кодом, indeed (ваш КО).

Я вважаю, що senior це не той, хто вивчив купу frameworks і API Facebook™, а той, хто може оптимально вирішувати нетривіальні задачі.

Для тестів потрібно додавати інфраструктурний код, якого на етапі PoC не потрібно.
отмазка на уровне стажера
Во вселенной Java тестовый код и его депенденси не попадают на production благодаря настройкам сборки. Например в мавене: src/main/test и src/main/resources не попадут в итоговый артефакт, как и jar-ники JUnit например. В вашей программе не нужен ни DI ни сложный контейнер или фреймворк. Просто использовать тестовое депенденси и написать тесты, которые не попадут в итоговый exe-шник (или как там у вас). Я уверен, что в .NET такое можно сделать.

Согласна с тобой, Gabriel.

Я бы добавила ещё, что для меня лично хороший тест устанавливает не только рамки задачи, но ещё и является лучшим комментарием к коду.

а если вспомнить что это тестовое задание?

Тестовое задание — не код на выброс вопреки всему. Это показывает ваш стиль и подход к работе, внимание к деталям, а также заботу о других людях, которые будут этот код поддерживать. Хотя может во вселенной .NET все не так?

А потом приходится код таких поддерживать и добавлять новые фичи...

Java аноніми, та ви упоролись. PoC на те й PoC, щоб перевірити ідею, а не користуватися нею.

А якщо ідея в тому, як користуватись ідеєю. Ідея — чи здатні Ви писати підтримуваний код.

Для перевірки здатності для тривалого багофіксінга є інші способи перевірки.
Цей же спосіб — для перевірки того, чи здатен кандидат зробити робочий прототип за мінімальний обсяг часу (2 години). Прототип, однак, має бути повноцінно реалізовувати певний, хай і обмежений, функціонал.

Тоді який наступний крок в оцінці кандидатів, якщо 9 із 10 виконали завдання, а потрібно обрати лише одного? Швидкість роботи та к-сть пам’яті, яку споживає?

Сортувати по кількості балів, яку заробить engine

Це круто. Тому, що можна запилити, щоб динамічно змінювались параметри гри — реалізувати примітивний Machine Learning і дійти до штучного інтелекту і ніяких питань про 100500 фреймворків, і різних умовностей. Це клас. А де Ви працюєте? Можливо буде відправити мені резюме з часом.

Я вот читаю-читаю, но не совсем понимаю. Речь об оценке пригодности кандидата? единственный критерий — смог ли решить логическую задачку кодом — остальное неважно? Так извините, а причем тут C#? И причем тут джун-мидл-сеньор? Логические задачки кого-то и в школе учили решать :)
Андрей, вы реально считаете что все о чем вам писали — неважно? А можно один принципиальный вопрос в таком случае: сколько девелоперов у вас в подчинении, сколько из них взятых лично вами, сколкьо и какого размера проектов уже успешно сдано заказчикам вашей командой?
Единственный аргумент который вы привели — то что все это не нужно в случае PoC. Только вот незадача — в исходном посте ничего про PoC не было...

Вам не зрозуміло, що за 3 години можна написати тільки PoC? Ѹкей.

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

Мне понятно, что:
1. В исходном задании ничгео про PoC даже намеками не сказано. Таким образом, по сути годность девелопера можно оценить уже по наличию уточяющих вопросов, заданных либо не заданных _до_ начала написания кода.
2. Задание в том виде как оно Вами подано и интерпретируется — это превосходная задачка для олимпиады по программированию — но абсолютно бесполезно для оценки пригодности кандидата в члены проектной команды. Независимо от левела.

Хочу спросить, как вообще можно оценить человека, если не по коду и скорости его выполнения?

По якості того коду

Задачу решил — может слать всех в п*зду, не решил — сам идет на*уй.

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

Работоспособность кода — условие разумеется необходимое, но никак не достаточное, чтобы быть хорошим мидлом и выше.

Це тестове завдання можна давати для будь-якої мови.

    Для senior краще розробляти АІ, де розмір сітки не фіксований та можуть з’являтись блоки ( заблоковані клітинки ). В інтернеті є готові алгоритми для базової гри, а тут потрібний трішки інший підхід. Хоча мені до вподоби codenjoy.com/portal
    Для мідла базова гра + змінний розмір сітки та блоки.
    Джуніор — базова гра.

Подписаться на комментарии