Как стать автором
Обновить
2
0
Евгений Даниленко @JekaMas

Golang и распределенные системы

Отправить сообщение

Берем крупняк с ходу https://polygon.technology/careers/

https://www.parity.io/jobs/#jobboard

И у нас для разработки на чейне есть blockchain solution(s) engineer. И это про субстрак, солидити и прочее в зависимости от чейна. А есть blockchain engineer/ blockchain core developer.

Как отличаются по навыкам вам подсказать?

Это так называют hr и ресечеры, которые любят большой процент отказа на высланные предложения.

А на рынке это четко делится. Особенно на вакансиях с английским описанием. Набор умений на такие позиции отличается примерно на 100% Как вы собираетесь искать при столь разном наборе умений - совершенно неясно.

Ну и статистика у вас некорректная, поскольку разное вместе объединили. Это как искать developer, объединяя frontend js и backend rust developer вместе.

Блокчейн разработчик или разработчик на блокчейне у вас в статье?

Было бы здорово.

Я лично property based тесты в каждом гошном проекте использую. И без них трудно.

Действительно круто!

Смущает лишь provider.T, убивающий возможность использовать многие сторонние пакеты для тестирования. Мне первым на ум пришел rapid, например.

В D всё сообщество такое, как его представляете вы? Это бы ответило на вопрос, почему язык так на рынке и не растёт.

Много лет работали на го?

Говорят, если основное время на набор кода уходит, то надо не программистов, а машинисток.

Основное время в программировании уходит на набор букв у вас? Точно?

Подождите в пределах месяца и заиспользуйте atomic.Pointer[T]https://pkg.go.dev/sync/atomic@master#Pointer , вроде должен упростить вашу задачу.

В нынешних обстоятельствах вопрос только в том с какой стороны и когда именно дернут рубильник. Но итог будет одним.

Ну нельзя же было сразу соглашаться. Надо было и поломаться цену понабивать.

Кто владеет торрентами?

И что поменяется такого страшного, если у вас конструкторы начнут возвращать объекты? Хотите - возвращайте приватные объекты. Да и обычные публичные ни инкапсуляцию, ни разделения слоёв не допустят. Или гайдлайн говорит, что так нельзя?)

Кстати, там выше у вас есть странные штуки, когда есть неиспользуемый ресивер по значению, чтобы "обозначить только для чтения). Лучше не так делать:

```

func (MoonRule) IsDepositAllowed(user User, wallet Wallet, amount Money) (bool, error) {

if IsRisingMoon() {

return true, nil

}

return false, nil

```

Про классику в виде "источники данных могут и меняться". У вас часто на проде базы меняются?) Обычно это очень больно и происходит примерно никогда.

Нет, не топлю за функциональное. Вы интересно читаете собеседника: "Можно и в функциональный подход переписать и передавать свои функции-заглушки. Просто как вариант, чтобы показать, что указанный в статье подход не является единственным решением для тестирования, если кто-то пытается это использовать как аргумент."

Но мои вопросы вы "не заметили". Так что с теми проблемами, которые добавляют неуместные интерфейсы в вашем коде?

Как-то вы плохо приписываете мне то, чего я не писал. Попробуйте строго пройти по тексту, который выше. Там нет ничего о том, что интерфейсы не нужны. Там о том, что в го они не нужны так, как вы их используете. И обоснования почему: консирукторы с дополнительной зависимостью на интерфейс, который конструируемый тип имплементирует; большая связность кода; убийство фичи duck typing; отсутствие возможности в вашем же коде прокинуть зависимости; и то, что юниты можно не только на моках писать, часто можно обойтить передачей функции. Вы ведь понимаете, что можно DDD и в функциональном подходе иметь? И тестировать не только через тестовые имплементации интерфейса?

И да. Вы так и не ответили на вопрос о том, что у нас любой пакет, который зависит от инплементации заодно зависит и от интерфейса. Что есть прямая дорога к циклическим зависимостям. Да и то, что имплементации зависят от уровня выше не смотрится чисто.

Я пытаюсь показать, что у вас реализация не DDD, а стайлгайда на DDD, притащенного из других языков. И ваш стайлгайд DDD в го работает плохо.

«Я написал, что если без введения интерфейса можно решить задачу и иметь все нужные свойства, то интерфейс добавлять в golang не надо.» Вроде должно отвечать на повторяемый вами вопрос. И да, не моками едиными ) Можно и в функциональный подход переписать и передавать свои функции-заглушки. Просто как вариант, чтобы показать, что указанный в статье подход не является единственным решением для тестирования, если кто-то пытается это использовать как аргумент. Хотя по сути аргумент один «так захотелось».

NewAntifraud - как его тестировать, есть зависимости создаются напрямую в конструкторе? То есть вся предыдущая пляска с интерфейсами была не нужна?

MoonRule - не имеет зависимостей, равно не имеет полей и ничего изолировать вообще не надо.

По вашему коду имплементация и интерфейс лежат на одном уровне: MoonRule-AntifraudRule; AndRule-AntifraudRule; и там же интерфейсы User, Wallet, Money. При таком подходе смысл в интерфейсах не такой большой, поскольку всё лежит в одном большом пакете. Если же разбивать на пакеты то как? Выносить интерфейсы на уровень выше? Но тогда имплементация будет зависеть от уровня выше. Оставлять на том же уровне? Тогда не разрывается зависимость от пакета с имплементацией. Добавлять новый пакет в пакет с имплементацией? Только так останется поступить. Но опять не решенным остается вопрос конструкторов. У вас интерфейсы не уменьшают связность кода, что как-то странно. Должно быть наоборот.


Это не тот вопрос, который я задал ;)

Я написал, что если без введения интерфейса можно решить задачу и иметь все нужные свойства, то интерфейс добавлять в golang не надо. И мне неясна необходимость в большой части интерфейсов в ваших примерах.

Лично я бы и пустые структуры убрал в пользу более функционального подхода. Но вот это уже точно вкусовщина.

Отнюдь. Вопрос про избыточность не снят, поскольку они не решают никакой задачи, которая не может быть решена без их применения. И без возвращения интерфейсов всё будет работать и обладать теми же свойствами.

Главный вопрос к такому подходу в том, что это применение неподходящих инструментов. Это приводит к мысли, что изначальная проблема была не в го, а в конкретном подходе к реализации DDD. Где так и неясно, для чего же надо вводить дополнительные абстракции, если и инкапсуляцию без них можно достичь и разделение слоёв и типов по ответственности.

Для тестов вам надо только принимать параметры по интерфейсу, но не возвращать.

Про изоляцию. У вас конструкторы возвращают интерфейсы вместо самих объектов. То есть вы не убрали, а добавили пакет в зависимости.

Отнюдь. Убираем ненужные интерфейсы и DDD никуда не делось.

Не стоит переделывать мой вопрос.

Информация

В рейтинге
4 289-й
Откуда
Москва, Москва и Московская обл., Россия
Дата рождения
Зарегистрирован
Активность