Зачем request в logError(r *http.Request, error), где он не используется. Наверно в поначалу поднимали логгер из контекста. И в http-ответе он не нужен, нужен только w.
Не надо, чтобы `message interface{}` (причем давно - any). Стоит сделать string, и приводить к строке на на месте или реализовывать интерфейс через String().
Не очень понял логику. serverErrorResponse пишет в лог и в http, а два других метода только в http. Типа это не ошибка бизнеса и не надо логгировать?! - для меня необычно, ну да ладно.
В принципе примерно также писал, но потом понял, что http-хелпер не пересекается с бизнес-логикой и стал писать вида `if d.CatchErr(op, err) { return }`, где d - обертка поверх (w, r).
Вау, оказалось, что я комментил вашу предыдущую статью.
Поражен вашей внимательностью ;) Писал залпом, и это был кусок кода из головы. Не проверял, потому что в этом месте по сценарию должен быть uuid. И мне трудно представить, что я его где-то чистым текстом вписал. Для такого зарезервированные значения в models.
Тут бы разбить общение на деловое и нет. Я тут ниже написал, что делаю "деловое общение" (или "что") - там важны статусы, деловая этика и рациональные мысли. И есть неделовое "как" - важны как раз эмоции, которые точно не рациональны. Потому это просто разное общение в разных системах. И проблемы, только если мешать одно с другим.
Я тоже что-то такое делаю. Но не особо похожее на описанное. Делаю сообщества (соседи в недвижке как цель, но не обязательно). В сообществах есть чаты и есть "документы" типа древних форумов, но со специализацией. Ролевая система. И внутри можно скинуться деньгами (учет с остатками). И фильтр на входе. Акцент на реестре участников с долей в управлении. И тогда есть многообразие плюшек. И "замедление" в документах, чтобы не в пару экранов как в чате. И перспективный модуль "партнерств" - сообщества могут иметь вертикальные связи (структура) и горизонтальные (партнерство). И добавляются испорт/экспорт ролей представителей. И тут же может двигаться информация - вверх/вниз и вправо/влево. Но пока модуль структур слабо развит. А вот очень надо потестировать основной модуль на людях. Если у вас есть сообщество с общим имуществом (управление чем-то) и денежными отношениями, то вэлкам сюда: https://pro.deloset.ru
Привет, Петр! я про него тебе точно рассказывал - монолитик на go + react pwa (deloset.ru, а лендинг туда переедет с pro.deloset.ru). По теме статьи - мотив был очень сильный к написанию. К идее уже было видение "как надо" + опыт в недвижке и управлении - нельзя было не написать. И это захватывающе, но "очень тяжело продавать" для интроверта. Делаю отдельные вылазки, общаюсь, потом отдыхаю ;)
Сделал свой продукт, теперь учусь продавать, что чревато просадкой по техническим скиллам. Но не первый день замужем! и своё же продавать, так что держусь. Но если можете не делать своего, то не делайте!
Не очень вчитывался, но у меня вроде посложнее: - на внешний сигнал стопа закрываем прием новых запросов (у меня http-сервер), доделываем имеющиеся запросы, сервер по завершении обработки завершается и кидает ок в канал - по сигналу закрываются соединения с ресурсами, чтобы не потерять данные, - и потом выход из main (или жесткий шатдаун по истечении второго времени). И потому есть контекст на управление сервером, есть контекст запросов внутри сервера, и есть контекст на приложуху с ресурсами - данные в одну сторону. И каналы для ответов. Потому долго ковырялся.
Всё не настолько плохо, чтобы тащить новую зависимость. Мне не зашел "uber/fx". И за несколько дней разобрался в теме - задача красиво остановить сильно сложнее, чем запустить. Пучок каналов, несколько контекстов, waitgroups для внешних сервисов - и готово. Решение на пару сотен строк, разбросанных по модулям. Я за отсутствие магии в разработке, если что.
Добрых лучиков! Это кусок текста из "примерно в начале", где я набрасываю, что это не мой выбор. И там речь больше про чтение логов в chrome-for-devs. И в принципе работает - там текст же. Но ГОРАЗДО УДОБНЕЕ писать больше букв. В первую очередь, есть правило наименования переменных - чем дальше от места использования тем длиннее. И здесь по сути название очень далекой функции. Потому не надо сокращать. Про идентификаторы в путях типа "users/:id" подробно в разделе "о входящих данных". Если кроме одного идентификатора ничего не нужно - то ок. На этом REST API держится. Но если пересылать больше данных, которые уже в query/body И ДОПОЛНИТЕЛЬНО парсить путь - да зачем?! А если не пихать в путь, то сильно просто парсить входящие данные по ОДНОЙ модели с валидатором.
Вертушка - наоборот раскидывала входящие звонки на дежурных в разных офисах. А поднимать старые звонки через CRM было больнее, да. Я какое-то время назад вернулся в разрабы со своей идеей из недвижки. Долго пилил, теперь учусь продавать проект. Рекламу бросил давать еще до пандемии, но иногда делаю сделки - вот недавно меня нашла заказчица через 8 лет. С видео и аи в продажах недвиги не вижу перспектив - эффект мал, а трудоемкость высокая. А продвижение услуг - это НОВЫЕ контакты, то есть надо собрать клиентов (а не пользователей как в циан) в одном месте и свести с риелторами, которых надо фильтровать (не как в циан). Причем собрать на фоне перегретого информационного шума. Если так, то фантастика! Здесь просто общаемся, мне было приятно вспомнить что-то старое.
Стоит сначала определить, кто такой риелтор (у каждого риелтора своё определение профессии). Я склонен называть риелтора "доверенным специалистом". И сказал бы не о контент-голоде (обычно всякие страшилки) - а об отсутствии реальных контактов. Раньше с телефонной вертушки нормально клиентов набирали, и это то качество, которое не дает никакой контент (особенно сгенерированный) - клиент выбирает "своего" риелтора во многом по речи - громкость, чистота речи, понятность, и даже скорость и тембр. И приходит на личную встречу уже теплый. "Ведущие соцсети" - это имиджевая реклама, такое себе мало кто может позволить. И не всем надо - какие-то клиенты предпочитают тишину и кулуарность. З.Ы. РиЭлтор - это конкретно член Российской Гильдии Риэлторов. Грамотно писать "риелтор", но РГР зарегистрировало товарный знак "риэлтор". А называть себя таким словом может только тот, кто платит членские взносы. Риелтор - это устоявшееся название, которым любой себя может назвать.
Видео вообще в недвижке не нужно, от нейронки тем более. В первичке и так полно обмана, где соседнюю промзону или пустырь изображают на схеме взрослым лесом. Во вторичке база для ручной фильтрации (ну вы и так поняли после 100 собесов) - минимум времени на объявление по типовому шаблону. И смотреть видео будет никто. Есть общий тренд на то, что выбирают по фотографиям (витрина), а при визите уже подтверждают свое решение. Видео сработает для нестандартных объектов, которые невозможно сравнить с соседями - и уже другая оценка объекта. В целом рад, что вы опрашивали именно риелторов - обычно их почему-то игнорируют, когда что-то в недвижке хотят поменять.
Думаю, что зависит от назначения приложения. У меня сервер обслуживает сайт. И умеет всё с данными - это бизнес. А из сервисов там cron, рассылка и sse...
Entity/use_cases - это популярные слои. Походу я напутал. Use_cases решает "сложные" операции - типа "умные". И может вызывать entity и db. И entity - слой только про одну сущность. Типа здесь должно быть просто CRUD-операции, но внезапно разрастается из-за логики проксирования - нельзя в db минуя entity. И разделение на модули выше уровнем - я такое видел. И вот use_cases умеет всякие штуки, типа запрашивать данные из связанных сущностей. И один модуль запросто встретится с другим - функция из организаций вызывает список рабочих групп другого модуля. А рабочие группы вызывают полномочия участника в организации на переименование. Логично выделить такие "сложные" функции в отдельный слой, который может. И это получается супер слой, который чересчур сложен. И выше пишу - этот супер слой отлично распиливается в обработчики, но уже не тупые.
Уточню, что не структуры данных. А цикл импортов. Сущности великолепно себя чувствуют по отдельности - разные ветки и ок. А есть бизнес-слои "одного уровня", где они встречаются. И когда два слоя entity стучатся друг к другу - цикл. И не получается дублировать структуры, как в typescript - в го это разные структуры. Придумываются всякие DTO, которые идентичны оригиналу, но есть экспортируемые поля через методы (или дубликат структуры с преобразованием 1-к-1) - вот это костыль, имхо. Я порешал тему, подняв логику на обработчики - вообще 0 циклов. И хорошо читается код - например, всё про патч объекта ушло в http-обработчик. Вроде как не логично, но работать сильно проще. Оказалось, что запрос через очередь не будет пересекаться с запросом от сайта - разная логика и разные входящие данные. Потому за год не было конфликта в логике.
Модели DTO весьма странные штуки, которые, имхо, появились в go из другого языка. В go стоит передавать данные как аргументы. Но когда полей много, и их порядок сложен, то возникает соблазн объединить в один объект. Норм если точечно, но если юзать везде, то вдруг оказывается, что их также надо поддерживать. И это горькая пилюля. Пример зацикленности - организация и рабочая группа как часть. Организация знает и спрашивает вложенные рабгруппы. Но в рабгруппе хочется узнать про организацию, и кто ее директор. И "в лоб" уже цикл. Разруливается, но если таких много - персона и участник организации и туда-обратно. Вот про такие границы между сущностями я думал. Логика сверху-вниз - это обычное явление. Есть варианты с тем что верх и что вниз - у кого-то это снизу-вверх, но тождественно. И тут есть споры - можно ли сверху-вниз стучаться, минуя слои - из верхней логики сразу в слой данных, например. Если упираться и последовательно проксироваться через слои, то при росте количества функций выглядит весьма уродски. Транзакции тоже создают вопросы. ИМХО, должны быть на верхнем уровне (все последующие у меня принимают универсальный интерфейс), потому что наверху "оркестратор" решает: удачно закоммитился, то создаем сообщение об обновлении. Если транзакция ниже слоем, то возникает сложность вернуть в предыдущее состояние.
Не очень понятно, что вы предлагаете. В принципе все делят на слои, а как - это уже "все мужчины имеют свой способ избавления от последней капли". Понятно выделение слоя данных, а вот с бизнес-логикой не все понятно - где границы связности сущностей?! База в том, что сущности без связности вообще не работают. А если связывать в логике, то голанг видит зацикленность импортов. Кто-то разбивает через интерфейсы, это весьма тяжело поддерживать, когда много сущностей связано с многими сущностями. При этом не вижу ценности делать "тупые контроллеры" - я обнаружил, что этот слой очень ценен, так как обладает особенной логикой (https://habr.com/ru/articles/901938/). Например: http-обработчик проверяет доступ через jwt-токен, и выдает http-ошибку, а обработчик из очереди не будет проверять доступ перед исполнением, и выдает ошибку только в логгер. И такой подход юзаю уже год - код легко поддерживать, изменения вносить очень удобно. Пока кризиса не предвижу.
Наблюдаю в статье "привычный набор техник". В ключе "примени технику - получи результат". И напомню, что "кризис - это состояние, когда старые методы не действуют". То есть если чел выгорел - это ранее примененные методы уже подействовали. И далее "попробуйте новенькое" - смена стимулов (внешнее же воздействие!), чтобы чел на выдохе отработал пару месяцев, пока начальство новый грейд не закрыло. Если говорить о действительно хорошем сроке работы - 20-40 лет стажа в одной компании как раньше было нормой, то окажется, что все мотивы и стимулы давно придуманы и описаны.
Зачем request в
logError(r *http.Request, error), где он не используется. Наверно в поначалу поднимали логгер из контекста. И в http-ответе он не нужен, нужен только w.Не надо, чтобы `message interface{}` (причем давно - any). Стоит сделать string, и приводить к строке на на месте или реализовывать интерфейс через String().
Не очень понял логику.
serverErrorResponseпишет в лог и в http, а два других метода только в http. Типа это не ошибка бизнеса и не надо логгировать?! - для меня необычно, ну да ладно.В принципе примерно также писал, но потом понял, что http-хелпер не пересекается с бизнес-логикой и стал писать вида `if d.CatchErr(op, err) { return }`, где d - обертка поверх (w, r).
Вау, оказалось, что я комментил вашу предыдущую статью.
Пользуйтесь на здоровье!
Поражен вашей внимательностью ;) Писал залпом, и это был кусок кода из головы. Не проверял, потому что в этом месте по сценарию должен быть uuid. И мне трудно представить, что я его где-то чистым текстом вписал. Для такого зарезервированные значения в models.
Тут бы разбить общение на деловое и нет. Я тут ниже написал, что делаю "деловое общение" (или "что") - там важны статусы, деловая этика и рациональные мысли.
И есть неделовое "как" - важны как раз эмоции, которые точно не рациональны. Потому это просто разное общение в разных системах. И проблемы, только если мешать одно с другим.
Я тоже что-то такое делаю. Но не особо похожее на описанное. Делаю сообщества (соседи в недвижке как цель, но не обязательно). В сообществах есть чаты и есть "документы" типа древних форумов, но со специализацией. Ролевая система. И внутри можно скинуться деньгами (учет с остатками). И фильтр на входе.
Акцент на реестре участников с долей в управлении. И тогда есть многообразие плюшек. И "замедление" в документах, чтобы не в пару экранов как в чате.
И перспективный модуль "партнерств" - сообщества могут иметь вертикальные связи (структура) и горизонтальные (партнерство). И добавляются испорт/экспорт ролей представителей. И тут же может двигаться информация - вверх/вниз и вправо/влево.
Но пока модуль структур слабо развит. А вот очень надо потестировать основной модуль на людях. Если у вас есть сообщество с общим имуществом (управление чем-то) и денежными отношениями, то вэлкам сюда: https://pro.deloset.ru
Привет, Петр! я про него тебе точно рассказывал - монолитик на go + react pwa (deloset.ru, а лендинг туда переедет с pro.deloset.ru). По теме статьи - мотив был очень сильный к написанию. К идее уже было видение "как надо" + опыт в недвижке и управлении - нельзя было не написать. И это захватывающе, но "очень тяжело продавать" для интроверта. Делаю отдельные вылазки, общаюсь, потом отдыхаю ;)
Сделал свой продукт, теперь учусь продавать, что чревато просадкой по техническим скиллам. Но не первый день замужем! и своё же продавать, так что держусь. Но если можете не делать своего, то не делайте!
Не очень вчитывался, но у меня вроде посложнее:
- на внешний сигнал стопа закрываем прием новых запросов (у меня http-сервер), доделываем имеющиеся запросы, сервер по завершении обработки завершается и кидает ок в канал
- по сигналу закрываются соединения с ресурсами, чтобы не потерять данные,
- и потом выход из main (или жесткий шатдаун по истечении второго времени).
И потому есть контекст на управление сервером, есть контекст запросов внутри сервера, и есть контекст на приложуху с ресурсами - данные в одну сторону. И каналы для ответов. Потому долго ковырялся.
Всё не настолько плохо, чтобы тащить новую зависимость. Мне не зашел "uber/fx". И за несколько дней разобрался в теме - задача красиво остановить сильно сложнее, чем запустить. Пучок каналов, несколько контекстов, waitgroups для внешних сервисов - и готово. Решение на пару сотен строк, разбросанных по модулям.
Я за отсутствие магии в разработке, если что.
Добрых лучиков! Это кусок текста из "примерно в начале", где я набрасываю, что это не мой выбор. И там речь больше про чтение логов в chrome-for-devs. И в принципе работает - там текст же. Но ГОРАЗДО УДОБНЕЕ писать больше букв. В первую очередь, есть правило наименования переменных - чем дальше от места использования тем длиннее. И здесь по сути название очень далекой функции. Потому не надо сокращать.
Про идентификаторы в путях типа "users/:id" подробно в разделе "о входящих данных". Если кроме одного идентификатора ничего не нужно - то ок. На этом REST API держится. Но если пересылать больше данных, которые уже в query/body И ДОПОЛНИТЕЛЬНО парсить путь - да зачем?! А если не пихать в путь, то сильно просто парсить входящие данные по ОДНОЙ модели с валидатором.
Вертушка - наоборот раскидывала входящие звонки на дежурных в разных офисах. А поднимать старые звонки через CRM было больнее, да.
Я какое-то время назад вернулся в разрабы со своей идеей из недвижки. Долго пилил, теперь учусь продавать проект. Рекламу бросил давать еще до пандемии, но иногда делаю сделки - вот недавно меня нашла заказчица через 8 лет.
С видео и аи в продажах недвиги не вижу перспектив - эффект мал, а трудоемкость высокая. А продвижение услуг - это НОВЫЕ контакты, то есть надо собрать клиентов (а не пользователей как в циан) в одном месте и свести с риелторами, которых надо фильтровать (не как в циан). Причем собрать на фоне перегретого информационного шума. Если так, то фантастика!
Здесь просто общаемся, мне было приятно вспомнить что-то старое.
Стоит сначала определить, кто такой риелтор (у каждого риелтора своё определение профессии). Я склонен называть риелтора "доверенным специалистом". И сказал бы не о контент-голоде (обычно всякие страшилки) - а об отсутствии реальных контактов. Раньше с телефонной вертушки нормально клиентов набирали, и это то качество, которое не дает никакой контент (особенно сгенерированный) - клиент выбирает "своего" риелтора во многом по речи - громкость, чистота речи, понятность, и даже скорость и тембр. И приходит на личную встречу уже теплый.
"Ведущие соцсети" - это имиджевая реклама, такое себе мало кто может позволить. И не всем надо - какие-то клиенты предпочитают тишину и кулуарность.
З.Ы. РиЭлтор - это конкретно член Российской Гильдии Риэлторов. Грамотно писать "риелтор", но РГР зарегистрировало товарный знак "риэлтор". А называть себя таким словом может только тот, кто платит членские взносы. Риелтор - это устоявшееся название, которым любой себя может назвать.
Видео вообще в недвижке не нужно, от нейронки тем более. В первичке и так полно обмана, где соседнюю промзону или пустырь изображают на схеме взрослым лесом.
Во вторичке база для ручной фильтрации (ну вы и так поняли после 100 собесов) - минимум времени на объявление по типовому шаблону. И смотреть видео будет никто. Есть общий тренд на то, что выбирают по фотографиям (витрина), а при визите уже подтверждают свое решение. Видео сработает для нестандартных объектов, которые невозможно сравнить с соседями - и уже другая оценка объекта.
В целом рад, что вы опрашивали именно риелторов - обычно их почему-то игнорируют, когда что-то в недвижке хотят поменять.
Думаю, что зависит от назначения приложения. У меня сервер обслуживает сайт. И умеет всё с данными - это бизнес. А из сервисов там cron, рассылка и sse...
Entity/use_cases - это популярные слои. Походу я напутал. Use_cases решает "сложные" операции - типа "умные". И может вызывать entity и db. И entity - слой только про одну сущность. Типа здесь должно быть просто CRUD-операции, но внезапно разрастается из-за логики проксирования - нельзя в db минуя entity. И разделение на модули выше уровнем - я такое видел.
И вот use_cases умеет всякие штуки, типа запрашивать данные из связанных сущностей. И один модуль запросто встретится с другим - функция из организаций вызывает список рабочих групп другого модуля. А рабочие группы вызывают полномочия участника в организации на переименование.
Логично выделить такие "сложные" функции в отдельный слой, который может. И это получается супер слой, который чересчур сложен. И выше пишу - этот супер слой отлично распиливается в обработчики, но уже не тупые.
Уточню, что не структуры данных. А цикл импортов. Сущности великолепно себя чувствуют по отдельности - разные ветки и ок. А есть бизнес-слои "одного уровня", где они встречаются. И когда два слоя entity стучатся друг к другу - цикл. И не получается дублировать структуры, как в typescript - в го это разные структуры. Придумываются всякие DTO, которые идентичны оригиналу, но есть экспортируемые поля через методы (или дубликат структуры с преобразованием 1-к-1) - вот это костыль, имхо.
Я порешал тему, подняв логику на обработчики - вообще 0 циклов. И хорошо читается код - например, всё про патч объекта ушло в http-обработчик. Вроде как не логично, но работать сильно проще. Оказалось, что запрос через очередь не будет пересекаться с запросом от сайта - разная логика и разные входящие данные. Потому за год не было конфликта в логике.
Модели DTO весьма странные штуки, которые, имхо, появились в go из другого языка. В go стоит передавать данные как аргументы. Но когда полей много, и их порядок сложен, то возникает соблазн объединить в один объект. Норм если точечно, но если юзать везде, то вдруг оказывается, что их также надо поддерживать. И это горькая пилюля.
Пример зацикленности - организация и рабочая группа как часть. Организация знает и спрашивает вложенные рабгруппы. Но в рабгруппе хочется узнать про организацию, и кто ее директор. И "в лоб" уже цикл. Разруливается, но если таких много - персона и участник организации и туда-обратно. Вот про такие границы между сущностями я думал.
Логика сверху-вниз - это обычное явление. Есть варианты с тем что верх и что вниз - у кого-то это снизу-вверх, но тождественно. И тут есть споры - можно ли сверху-вниз стучаться, минуя слои - из верхней логики сразу в слой данных, например. Если упираться и последовательно проксироваться через слои, то при росте количества функций выглядит весьма уродски.
Транзакции тоже создают вопросы. ИМХО, должны быть на верхнем уровне (все последующие у меня принимают универсальный интерфейс), потому что наверху "оркестратор" решает: удачно закоммитился, то создаем сообщение об обновлении. Если транзакция ниже слоем, то возникает сложность вернуть в предыдущее состояние.
Не очень понятно, что вы предлагаете. В принципе все делят на слои, а как - это уже "все мужчины имеют свой способ избавления от последней капли".
Понятно выделение слоя данных, а вот с бизнес-логикой не все понятно - где границы связности сущностей?! База в том, что сущности без связности вообще не работают. А если связывать в логике, то голанг видит зацикленность импортов. Кто-то разбивает через интерфейсы, это весьма тяжело поддерживать, когда много сущностей связано с многими сущностями.
При этом не вижу ценности делать "тупые контроллеры" - я обнаружил, что этот слой очень ценен, так как обладает особенной логикой (https://habr.com/ru/articles/901938/). Например: http-обработчик проверяет доступ через jwt-токен, и выдает http-ошибку, а обработчик из очереди не будет проверять доступ перед исполнением, и выдает ошибку только в логгер.
И такой подход юзаю уже год - код легко поддерживать, изменения вносить очень удобно. Пока кризиса не предвижу.
Посмотрел с интересом. А ссылка на канал битая
Наблюдаю в статье "привычный набор техник". В ключе "примени технику - получи результат". И напомню, что "кризис - это состояние, когда старые методы не действуют". То есть если чел выгорел - это ранее примененные методы уже подействовали. И далее "попробуйте новенькое" - смена стимулов (внешнее же воздействие!), чтобы чел на выдохе отработал пару месяцев, пока начальство новый грейд не закрыло.
Если говорить о действительно хорошем сроке работы - 20-40 лет стажа в одной компании как раньше было нормой, то окажется, что все мотивы и стимулы давно придуманы и описаны.