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