
Alexey
16.10.2017
08:30:57
однако

Alex
16.10.2017
08:35:49
http://www.bards.ru/archives/part.php?id=35003

Dmitry
16.10.2017
08:37:06
Кстати, философский вопрос: Как определить нормальная или ненормальная контора?

abc
16.10.2017
08:37:41
Пообщаться с работниками местными

Google

Fedor
16.10.2017
08:37:46
по отзывам знакомых сотрудников

abc
16.10.2017
08:38:06
Если дерганые или онлайн на работе в выходные, то это звоночек )

Alexey
16.10.2017
08:38:14
надо делать аналог market.yandex.ru с отзывами о компаниях )

Fedor
16.10.2017
08:38:22
бесполезно

Alexey
16.10.2017
08:38:35
будут накрутки рейтингов?

Fedor
16.10.2017
08:38:48
будут ботов плоидить и накручивать, конкруентов валить, заставялть сотрудников хорошие отзывы писать...

Alexey
16.10.2017
08:38:49
как на маркете

Dmitry
16.10.2017
08:38:52
Есть какой-то сервис англоязычный с анонимными отзывами сотрудников.

Alexey
16.10.2017
08:39:04
блина. всё тлен
кстати, есть такой сайтец. гребаное айти. там вроде б как раз особо пострадавшие отмечаются

Igor
16.10.2017
08:39:29
> анонимными отзывами сотрудников
лучше всего работает в компаниях до 10 человек ?

Dmitry
16.10.2017
08:43:30
https://www.glassdoor.co.uk/
Вот здесь такое было

Google

Dmitry
16.10.2017
08:44:05
Маленьких компаний, правда помойму наоборот нет
Но был какой-то другой сервис
https://www.kununu.com/
А кажется вот он

Nikolay
16.10.2017
08:54:17
Ищем backend разработчиков с навыками в
• Kubernetes
• Docker

Dmitry
16.10.2017
08:54:52
А там нужны особые навыки?

Nikolay
16.10.2017
08:55:45
наверно, т.к. devops-ить будешь ты

Dmitry
16.10.2017
08:57:36
Ну, в небольших agile коммандах девопсить - это почти норма(по крайней мере я не видел, чтобы было по-другому). Моя комманда в прошлой фирме, в целом ещё и тестовое окружение в kubernetes разворачивает и там многодневные нагрузочные тесты прогоняет сама.

abc
16.10.2017
08:57:43
куб вроде с докером сейчас хочет порвать дружбу. они какой-то свой докер теперь пилят

Максим
16.10.2017
09:25:24
вместо всех отзывов показывать 2 рандомных
один положительный один отрицателньый

Roman
16.10.2017
10:42:49

Dmitry
16.10.2017
10:58:47
Последнюю ветку мы даже причесали
https://github.com/BucklerBot/buckler/tree/adding-attempts?files=1

Nikolay
16.10.2017
11:07:32
я даже тесты на эту ветку написал
но я вам их не покажу (с) Печкин

Alexey
16.10.2017
11:10:48
потому что у нас документов нет?

Roman
16.10.2017
11:10:51

Google

Roman
16.10.2017
11:10:52
спасибо

Nikolay
16.10.2017
11:12:11
Вопрос на миллион - кто как тестирует handle_cast\info методы у GenServer’ов?

Dmitry
16.10.2017
11:18:39
Но юнит я считаю плохой практикой

Dmitry
16.10.2017
11:18:54
Через внешний интерфейс. Все GenServer.call обычно находятся в том же модуле и экспортируют, к примеру def put(a, b), do: GenServer.call(....) его и тестирую.
Тестировать внутренности имплементации не очень хорошо, как помойму.

Alex
16.10.2017
11:20:02
ну а если логику из них перенести в модули, модули мокать чтобы при запуске теста они подменялись?

Dmitry
16.10.2017
11:20:03
В плане cast и info - тоже самое.

Alex
16.10.2017
11:20:39
тогда можно тестить логику отдельно ну и работу genserver отдельно
можно при старте GenServer отдавать ему модули с которыми он работает, и при тестовом запуске также передавать ему моки

Nikolay
16.10.2017
11:22:57

Alex
16.10.2017
11:24:46
как я понял не тру - мокать рабочие модули(?), а если у каждого модуля определять behaviour и в моках его реализовывать то это вроде норм http://blog.plataformatec.com.br/2015/10/mocks-and-explicit-contracts/

Nikolay
16.10.2017
11:26:55
aa, я не так понял значит тебя - я везде так делаю на границах системы, да, через Mock модули
прост не подумал что с генверсерами так же можно намутить

Alex
16.10.2017
11:31:55
ага, можно всю логику из него вынести в модуль, чтобы он тупо дергал его методы и все. ну или максимально стремится к этому. чтобы код в генсервере делал только генсерверную работу ))
по идее можно в генсервере вообще сделать по одному методу
def handle_call(request, from, state), do: MyModule.call(request, from, state)
def handle_cast(request, state), do: MyModule.cast(request, state)
def handle_info(msg, state), do: MyModule.info(msg, state)
и весь мачинг перенести в MyModule
MyModule.call(:request_1, from, state)
MyModule.call(:request_2, from, state) и тд
тогда, по идее генсервер вообще можно и не тестить а тестить только MyModule

Nikolay
16.10.2017
13:44:41
чет я такого не видел примера использования)

Alex
16.10.2017
13:46:07
ну надо же кому то начинать )))

Google

Dmitry
16.10.2017
13:46:22
По идее - можно как угодно извращаться ? Но лучше всего, когда при использовании GenServer-а есть у него публичное API, которым пользуются и его и тестировать. И не тестировать внутренности и не мокать внутренности.
Если конечно речь не о коммуникации со сторонним удаленным сервисом.
Но здесь тогда мок всего генсервера, просто другой процесс или модуль.

Dmitry
16.10.2017
14:06:08
по идее можно в генсервере вообще сделать по одному методу
def handle_call(request, from, state), do: MyModule.call(request, from, state)
def handle_cast(request, state), do: MyModule.cast(request, state)
def handle_info(msg, state), do: MyModule.info(msg, state)
и весь мачинг перенести в MyModule
MyModule.call(:request_1, from, state)
MyModule.call(:request_2, from, state) и тд
тогда, по идее генсервер вообще можно и не тестить а тестить только MyModule
Вообще-то для этого придуман параметр в функции GenServer.start_link

Alex
16.10.2017
14:06:48
какой?

Dmitry
16.10.2017
14:07:16
module
Можно сделать GenServer в двух разных файлах

Alex
16.10.2017
14:15:15
и что в них будет?

Dmitry
16.10.2017
14:17:58
Ну в общем то в одном будет АПИ, а в другом - только хэндлы
Т.е.
defmodule MyServerApi do
def start_link(...)
GenServer.start_link(MyServerCallbacks, ...)
end
def foo(pid), do: GenServer.call(pid, :foo)
end
defmodule MyServerCallbacks do
use GenServer
def handle_call(:foo, from, state), ...
end
А обычно все пишут GenServer.start_link(__MODULE__, ...)
Ну и конечно можно этот module параметр замокать на этапе любом
Но лучше компиляции
Через Application.get_env(:my_genserver_implimentation)

Alex
16.10.2017
14:27:11
а ну вот мозг и зашорился. так вот и надо делать тут можно MyServerCallbacks перетестить вдоль и поперек

Dmitry
16.10.2017
14:27:39
Можно, но не нужно
Потому что в otp app генсервер - это смысловая единица
И тестить надо только MyServerApi

Alex
16.10.2017
14:30:46
а генсервер это что? Модуль?

Dmitry
16.10.2017
14:31:20
Генсервер? Смысловая единица

Google

Alex
16.10.2017
14:31:29
а что это такое?

Dmitry
16.10.2017
14:31:33
Архитектурная единица
Если так проще
Детали реализации не важны с архитектурной точки зрения

Alex
16.10.2017
14:32:30
а с точки зрения парадигмы функционального программирования?

Dmitry
16.10.2017
14:33:09
С точки зрения функционального программирования ГенСервер - это конечно же функция
В базовом смысле - получил вопрос - отдал ответ
Может не отдать
Тогда это какая-то там монада
Хотя я наврал
Он хранит состояние, значит он и сам монада какая-то
Но это не так важно Ж)

illiatshurotshka❄️
16.10.2017
14:35:33
нет монад

Alex
16.10.2017
14:35:58
просто если писать генсервер так как ты написал то тестить можно только MyServerCallbacks
причем тесты могут быть асинхронными

Dmitry
16.10.2017
14:36:36
Ну если в тесте ты напишешь MyServerApi.foo

Alex
16.10.2017
14:36:36
а апи нефиг вообще тестить... чет там тестить то?

Dmitry
16.10.2017
14:36:44
То ты его и протестишь

Alex
16.10.2017
14:37:39
не не... я напишу MyServerCallbacks.foo1 MyServerCallbacks.foo2 и запущу тесты сразу в двух потоках. независимо

Dmitry
16.10.2017
14:37:40
А он под капотом вызовет MyServerCallbacks