Re[2]: Что не так с тестовым заданием?
От: elmal  
Дата: 06.03.19 15:14
Оценка: +4
Здравствуйте, Tourist, Вы писали:

T>Ну, не знаю. Самое просто, а почему для money у вас BigDecimal?

Оно вообще то всю жизнь было рекомендованным решением по умолчанию для денег. Сейчас что, появились новые рекомендации и я что то пропустил?
Re[5]: Что не так с тестовым заданием?
От: arth  
Дата: 06.03.19 15:16
Оценка:
Здравствуйте, Stanislav V. Zudin, Вы писали:

..

SVZ>Ну т.е. ты предложил второй стороне разбираться самим, какие соглашения ты выбрал и угадывать, почему именно так?

SVZ>Я бы такое не оценил.
SVZ>"common sense" он у всех свой Вот они и оценили соответственно.

ну это не была q&a сессия и ее наличие как-бы не предполагалось
обычно она случается уже после, по результатам теста
Re[2]: Что не так с тестовым заданием?
От: arth  
Дата: 06.03.19 15:20
Оценка: +1
Здравствуйте, GarryIV, Вы писали:

GIV>Здравствуйте, arth, Вы писали:


A>>код — https://github.com/arthells/mtest


GIV>Как то смущает рукопашный разбор параметров. Почему не https://dinject.io/javalin ?


почему рукопашный? тот же javalin вроде.

GIV>Ну и для датастора я бы ожидал какую-нибудь ин мемори бд.


зачем? чтобы просто показать, что я умею затащить в апп как депенденси и сделать таблицу из 2х полей?
Re[4]: Что не так с тестовым заданием?
От: arth  
Дата: 06.03.19 15:25
Оценка:
Здравствуйте, syrompe, Вы писали:


A>>2/ в реальном мире она нигде не атомарна и не может быть таковой

S>ACID

ну в реальном мире с реальными требованиями все сложнее чем аббревиатуры. теоретически можно в контексте _этого_ задания сделать atomic move,
но я решил, что достаточно atomic exchange (add). конкретно здесь я не вижу необходимости и потенциальных race conditions тоже — основные операции атомарны, а
сам wallet введен лишь как иллюстрация возможного BL
ну то есть за бабки в пилот я бы написал совсем иначе, но для тестового задания я выбрал такой путь и не очень понимаю почему он неверен
Отредактировано 06.03.2019 17:07 arth . Предыдущая версия .
Re[5]: Что не так с тестовым заданием?
От: Skorodum Россия  
Дата: 06.03.19 15:38
Оценка: +3
Здравствуйте, arth, Вы писали:

A>выложил на github, поправил стартовое сообщение

Может им не понравилось, что нет истории разработки? (Все одним коммитом.)

Вообще если дали тз на несколько часов, а потом леняться дать вменяемый ответ что для них плохо, то с чистой совестью можете раскрывать название конторы.
Re[3]: Что не так с тестовым заданием?
От: GarryIV  
Дата: 06.03.19 15:42
Оценка: -1
Здравствуйте, arth, Вы писали:

GIV>>Как то смущает рукопашный разбор параметров. Почему не https://dinject.io/javalin ?

A>почему рукопашный? тот же javalin вроде.

Я про @Post вместо
 val to = ctx.queryParam("to") ?: throw IllegalArgumentException("@to is required.")


GIV>>Ну и для датастора я бы ожидал какую-нибудь ин мемори бд.

A>зачем? чтобы просто показать, что я умею затащить в апп как депенденси и сделать таблицу из 2х полей?

Так мне мой common sense говорит
WBR, Igor Evgrafov
Re: И вот feedback от них и мои им ответы
От: arth  
Дата: 06.03.19 15:56
Оценка:
The solution is no concurrency safe — transaction is not atomic
me — there is no explicit requirement and actually basic
transaction (add) is atomic. There is no race conditions. Atomicity of
_transfer_ is required if we don't want to loose data — but here there
is no such problem since we don;t store anything between sessions.

Insufficient testing coverage
nothing to say. It's 6hrs test. Not 40hrs

If we transfer negative amount money, author don’t throw exceptions, it takes abs value of this amount and transfer positive amount of money.
transferring negative amount is something which is odd. So it's a
convention. It either has to be documented or exception should be
thrown. So I partially agree.

Author don't know how to catch exceptions in junit
minor. Nothing to add.

Procedure of transferring money is not clear and difficult to support
no comment.

Poor documentation — there is no specifications of endpoints, how to build a project
KL — there is a README. And there is a build.gradle. It's kind of
misunderstanding what we expect from 6hrs test.
Re[6]: Что не так с тестовым заданием?
От: arth  
Дата: 06.03.19 15:58
Оценка:
Здравствуйте, Skorodum, Вы писали:

S>Здравствуйте, arth, Вы писали:


A>>выложил на github, поправил стартовое сообщение

S>Может им не понравилось, что нет истории разработки? (Все одним коммитом.)

это другой репо. для них я открывал и там несколько коммитов с моим настоящим именем

S>Вообще если дали тз на несколько часов, а потом леняться дать вменяемый ответ что для них плохо, то с чистой совестью можете раскрывать название конторы.


ответ дали после того как я их попросил/он ниже в ветке
Re[2]: И вот feedback от них и мои им ответы
От: AndyCyp США  
Дата: 06.03.19 16:12
Оценка: +2
Здравствуйте, arth, Вы писали:

A>The solution is no concurrency safe — transaction is not atomic

A> me — there is no explicit requirement and actually basic
A>transaction (add) is atomic. There is no race conditions. Atomicity of
A>_transfer_ is required if we don't want to loose data — but here there
A>is no such problem since we don;t store anything between sessions.

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

A>Insufficient testing coverage

A>nothing to say. It's 6hrs test. Not 40hrs

тоже было в требованиях.
Re[3]: И вот feedback от них и мои им ответы
От: arth  
Дата: 06.03.19 16:16
Оценка:
Здравствуйте, AndyCyp, Вы писали:

AC>Здравствуйте, arth, Вы писали:


A>>The solution is no concurrency safe — transaction is not atomic

A>> me — there is no explicit requirement and actually basic
A>>transaction (add) is atomic. There is no race conditions. Atomicity of
A>>_transfer_ is required if we don't want to loose data — but here there
A>>is no such problem since we don;t store anything between sessions.

AC>вообще то было в требованиях, конкурентное исполнение.


atomicity и конкурентное исполнение не одно и то же/и мой код concurrent safe

A>>Insufficient testing coverage

A>>nothing to say. It's 6hrs test. Not 40hrs

AC>тоже было в требованиях.


да, и у меня 20 или больше тестов
Re[2]: И вот feedback от них и мои им ответы
От: elmal  
Дата: 06.03.19 17:28
Оценка: +3
Здравствуйте, arth, Вы писали:

A>The solution is no concurrency safe — transaction is not atomic

A> me — there is no explicit requirement and actually basic
A>transaction (add) is atomic. There is no race conditions. Atomicity of
A>_transfer_ is required if we don't want to loose data — but here there
A>is no such problem since we don;t store anything between sessions.
Здесь они в принципе правы. Для тестовых заданий я делаю базовую атомарность, тупо ставлю synchronized на все методы бизнес логики, чтоб не заморачиваться и оно работало. Оптимизировать влом и все эти оптимизации потом. Даже если там атомарность есть фактическая — совсем не очевидно что она есть, лучше явно по умолчанию поставить лок, да и все.

A>Procedure of transferring money is not clear and difficult to support

A>no comment.
Здесь они тоже правы. Там логика то простейшая, но навернул ты сильно больше, чем можно было бы сделать. Лучше б простой императивщиной в лоб бы сделал да и все. Я про метод add, а не про transfer. Такое впечатление что начитался про паттерн матчинг и захотел непременно применить что то похожее. Да и transfer тоже — amount.abs() и доп логика.

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

Но, только бы за эти недочеты я бы браковать не стал.
Re[3]: И вот feedback от них и мои им ответы
От: arth  
Дата: 06.03.19 17:45
Оценка:
Здравствуйте, elmal, Вы писали:

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

ну а на что им мозг? чтобы смотреть и разбираться/атомарность там есть в нужном объеме

A>>Procedure of transferring money is not clear and difficult to support

A>>no comment.
E>Здесь они тоже правы. Там логика то простейшая, но навернул ты сильно больше, чем можно было бы сделать. Лучше б простой императивщиной в лоб бы сделал да и все. Я про метод add, а не про transfer. Такое впечатление что начитался про паттерн матчинг и захотел непременно применить что то похожее. Да и transfer тоже — amount.abs() и доп логика.

ну, мне удобно паттерн матчинг, я писал на котлине прод, это не для выпендрежа
ну и интерфейс concurrenthashmap прост и понятен вроде. зачем локи когда есть просто merge?

E>То есть код можно было сделать одновременно и более простым, и более надежным. Плюс более компактным. Еще я б для тестового задания не стал бы выделять интерфейс. Принципиально не стал бы, если бы стали придираться — аргументировал бы тем, что мне не нужна дополнительная сложность и дополнительный код на ровном месте. При необходимости рефакторинг вида extract interface делается мгновенно, и если у интерфейса только одна реализация, то лучше не выпендриваться и не городить доп сложность на ровном месте.


ну, зачем на котлине писать в императивном стиле, подумал я/

E>Но, только бы за эти недочеты я бы браковать не стал.


спасибо за фидбек
Re: Что не так с тестовым заданием?
От: maxkar  
Дата: 06.03.19 19:00
Оценка: 34 (5) +1
Здравствуйте, arth, Вы писали:

A>код — https://github.com/arthells/mtest


Ну давайте по порядку. Это то, что я на автомате проверяю на ревью, без определенного порядка.


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

Ссылаться на недостаток времени здесь смысла нет. За 6-12 часов все это делается (ни один из шагов много времени не добавляет) если вы раньше писали rest и задумывались обо всех мелочах. Если раньше не делали — да, хорошее упражнение. Но, вероятно, на другую позицию. В чем-то это похоже на найм в хороший ресторан. Вы приходите на кухню и вас просят приготовить обед за 45 минут. Вы сделали стейк с картошкой. Но картошку не почистили, мясо не посолили и никакого соуса не добавили. Потому что "что же вы хотели за 45 минут". А это вещи, которые как раз делаются автоматически.

Нет, у вас конечно не плохо. Откровенно плохого там ничего нет. Но и ничего выдающегося тоже нет. Видимо, у компании были более интересные кандидаты.
Re: Что не так с тестовым заданием?
От: mgu  
Дата: 06.03.19 21:22
Оценка: +1
Здравствуйте, arth, Вы писали:

A>Попросили сделать тестовое задание часов за 6-12 (всего на задание давали примерно неделю):

A>Design and implement a RESTful API (including data model and the backing implementation)
A>for money transfers between accounts.

A>Я написал и им не понравилось. Не оч понимаю, чего они хотели и где я налажал?


https://www.google.com/search?q=%22(including+data+model+and+the+backing+implementation)%22&oq=%22(including+data+model+and+the+backing+implementation)%22
Re[2]: И вот feedback от них и мои им ответы
От: mgu  
Дата: 06.03.19 21:24
Оценка: +2 :))
Здравствуйте, arth, Вы писали:

A>Author don't know how to catch exceptions in junit


-- MGIMO ended?
-- Ask!
Re: Что не так с тестовым заданием?
От: lintik  
Дата: 06.03.19 21:28
Оценка:
Здравствуйте, arth, Вы писали:

A>Попросили сделать тестовое задание часов за 6-12 (всего на задание давали примерно неделю):

A>Design and implement a RESTful API (including data model and the backing implementation)
A>for money transfers between accounts.
Не смотря на то, что делать домашнее задание в 2019 году это полная дикость, все же глянул одним глазом.
Не понравилась модель предметной области.
Если с Account, который id + amount еще как-то можно смириться в тестовом задании, то кто такой Wallet?
Его интерфейс и реализация никак не следуют из названия.
Это что-то более похожее на Transaction чем на Wallet.
Зачем вообще нужен add, когда у вас в задании "money transfers between accounts"?
Почему пополнение счета не сделать как transfer(from='Cash/Wire', to=account)?
Re[2]: Что не так с тестовым заданием?
От: arth  
Дата: 06.03.19 23:55
Оценка: -2
Здравствуйте, maxkar, Вы писали:

M>Здравствуйте, arth, Вы писали:


A>>код — https://github.com/arthells/mtest


M>Ну давайте по порядку. Это то, что я на автомате проверяю на ревью, без определенного порядка.


M>

чтобы model отдать клиенту, core ему не нужен (либо перенести ifaces из core в model, кто тоже стоит отдельного обсуждения)

M>Вот весь тот список — это "элементы стиля". Вещи, которые делаются вообще автоматически. Показывает, насколько разработчик механически следует шаблонам и насколько все же задумывается о причинах определенных технических решений.

большинсто про вкус, остальное minor по мне. нейминг — не технические решения, как и работа с Assert

M>Ссылаться на недостаток времени здесь смысла нет. За 6-12 часов все это делается (ни один из шагов много времени не добавляет) если вы раньше писали rest и задумывались обо всех мелочах. Если раньше не делали — да, хорошее упражнение. Но, вероятно, на другую позицию. В чем-то это похоже на найм в хороший ресторан. Вы приходите на кухню и вас просят приготовить обед за 45 минут. Вы сделали стейк с картошкой. Но картошку не почистили, мясо не посолили и никакого соуса не добавили. Потому что "что же вы хотели за 45 минут". А это вещи, которые как раз делаются автоматически.


какие-то не очень уместные на мой взгляд аналогии

M>Нет, у вас конечно не плохо. Откровенно плохого там ничего нет. Но и ничего выдающегося тоже нет. Видимо, у компании были более интересные кандидаты.


спасибо за отзыв энивей
Отредактировано 07.03.2019 0:00 arth . Предыдущая версия .
Re[2]: Что не так с тестовым заданием?
От: arth  
Дата: 07.03.19 00:08
Оценка:
Здравствуйте, mgu, Вы писали:

mgu>Здравствуйте, arth, Вы писали:


A>>Попросили сделать тестовое задание часов за 6-12 (всего на задание давали примерно неделю):

A>>Design and implement a RESTful API (including data model and the backing implementation)
A>>for money transfers between accounts.

A>>Я написал и им не понравилось. Не оч понимаю, чего они хотели и где я налажал?


mgu>https://www.google.com/search?q=%22(including+data+model+and+the+backing+implementation)%22&oq=%22(including+data+model+and+the+backing+implementation)%22


и что, такое им понравилось?
Re[4]: И вот feedback от них и мои им ответы
От: elmal  
Дата: 07.03.19 06:39
Оценка:
Здравствуйте, arth, Вы писали:

A>ну а на что им мозг? чтобы смотреть и разбираться/атомарность там есть в нужном объеме

Вообще то основное правило — при чтении кода мозг напрягаться не должен . Исключение — когда это высоко оптимизированный код, тут приходится. Соответственно решение по умолчанию — это минимальное количество кода, максимальная линейность кода, минимальный уровень вложенности. Применив merge ты возможно увеличил производительность по сравнению с решением в лоб, но понизил читаемость и поддерживаемость кода. Кстати, если уж начал выпендриваться с не совсем очевидной атомарностью — тест бы на параллельную попытку изменить счет бы не помешал. Накосячить на вот таких неблокирующих операциях на практике очень и очень легко, соответственно если решил так повыпендриваться, то тест нужно написать по любому. Если бы сделал через synchronized в лоб, причем synchronized был бы на все методы, то тут можно было бы и схалявить, ибо скорее всего ты бы не ошибся, но на более продвинутых решениях тестировать все таки надо.

У меня как то был случай, когда я увидел не неатомарность в чужом коде. Было запутанно, я предположил что автор проверил нормально, тем более он там был спец по алгоритмам, в олимпиадах участвовал и т.д. Так вот, он блин все таки ошибся и его творчество пришлось мне переписывать после того как он уволился. А шишки полетели на меня, исправлять ошибки в авральном режиме пришлось мне, не смотря на то, что код мне достался в наследство.
Re[3]: Что не так с тестовым заданием?
От: Tourist Россия  
Дата: 07.03.19 07:30
Оценка:
Здравствуйте, elmal, Вы писали:

E>Здравствуйте, Tourist, Вы писали:


T>>Ну, не знаю. Самое просто, а почему для money у вас BigDecimal?

E>Оно вообще то всю жизнь было рекомендованным решением по умолчанию для денег. Сейчас что, появились новые рекомендации и я что то пропустил?

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

В Java есть Money API, правдо оно ни как не дойдет до включения в JDK. Можно посмотреть его как на пример дизайна.

А так, как минимум у любого счета есть тип валюты этого счета. Что тоже минус в вашей модели.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.