Pull to refresh
19
0
Олег Аксенов @OlegAxenow

Developer, DBA, CTO

Send message

К сожалению нет, архитектура Roslyn не разделяет их на разные типы — для анализатора нет никакой разницы, запущен он в IDE или при сборке

Может я не максимально понятно выразился. Для анализатора может и нет, но что мешает написать два анализатора и один настроить для билда, а другой для IDE? В документации есть, сам не пробовал, потому что не требовалось.

P.S. На случай, если новый редактор что-то сотворит со ссылкой, вот названия настроек оттуда:

<RunAnalyzersDuringBuild>false</RunAnalyzersDuringBuild>
<RunAnalyzersDuringLiveAnalysis>false</RunAnalyzersDuringLiveAnalysis>
<RunAnalyzers>false</RunAnalyzers>

Разве нельзя сделать две версии анализатора - один для билда, другой для live analysis (реюзая базовый код при этом)?

Тогда watch для билда совсем можно не делать (если только у вас не совсем что-то извращённое с ресурсами).

"В каком отделении репозиторий открывали, туда и приходите."

Кроме того, бритву Хэнлона невозможно кратко сформулировать так, чтобы она учитывала это обстоятельство. Вот даже в статье выше, автор предлагает формулировку

Вариант "не объясняй лишь злонамеренностью то, что вполне объясняется глупостью*" не идеален, но суть передаёт.

Потому что они призваны, на самом деле, только напомнить о противоположной склонности

Что тоже немало для многих людей...

P.S. "*раздолбайством и т.п."

Разработчик начинает совершенно новый проект с продуманной архитектурой и чистым, структурированным кодом.

Всегда же так? Да? Ведь правда?

Первый способ будет ещё легче, если сразу поделить первое 365 на себя и потом сложить только 169 и 196.

Хранить пароли в облаке (чужом). Что могло пойти не так...

Программировать можно в VSCode и Rider EAP.

Уже релизнулся Rider 2021.3.

Немного странно видеть картинку в формате png размером 2.5 мегабайта в статье про оптимизацию...

В целом, присоединяюсь к большинству комментариев на тему "раньше было лучше". Особенно про счётчик непрочитанных комментариев.

По поводу "упасть при компиляции" - решается nameof(a).

P.S. Конечно, это не гарантирует, что не окажется поля с таким названием... Вероятность этого можно снизить с помощью StyleCop или чем-то вроде. Сам уже лет 10 пользуюсь для приватных полей подчёркиванием ("_name"), коллег тоже подсадил - все довольны.

Плюсану. Вы очень ёмко выразили основную мысль, которую я сам хотел донести в комментарии ниже. Но у меня огромный комментарий получился из нескольких частей, прям, монолит какой-то...

Если основной посыл статьи — "думайте, прежде чем использовать микросервисы" — на 100% согласен.


Disclaimer: я не сторонник "пихать микросервисы везде", я за их умеренное использование там, где они уместны. На контрасте со статьёй дальнейшие слова могут показаться "фанатскими", однако, это не так.


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


Когда кода реально много — появляются проблемы с тем, что, как ни старайся соблюдать границы внутри монолита, появляются "клубочки". Например, когда программисту проще смешать всё в одну кучу, потому что так удобнее решить конкретную задачу. А потом, с большой вероятностью, получить неожиданные сюрпризы из-за большой связанности кода.


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


А ещё, у каждого модуля свой жизненный цикл и вносить изменения в один модуль проще (в т.ч. с точки зрения тестирования). Конечно, до тех пор, пока не приходится делать мажорные изменения — тут уже надо решать, поддерживаем ли старую версию (и сколько старых версий) или всё настолько серьёзно, что лучше обновить все зависимости сразу.
Зато внутри модулей, особенно новых и не "устоявшихся", частично может быть подход "фигак-фигак и в продакшн", но он не распространяется как раковая опухоль на всё, а решение целиком работает приемлемо.


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


Да, про прямые вызовы. У нас есть возможность сделать так, чтобы оба модуля были в одном процессе, но вызовы выглядят всё равно как внешние, через "прокси". И сериализацию параметров полезно оставить (чтобы, опять же, не прокрались лишние зависимости). Такой вот ".NET Remoting наоборот".


Возможно, мы какие-то нетипичные разработчики микросервисов и вообще (ужас!) — мы Docker не используем, хотя сервисы обычно распределены либо на несколько виртуалок, либо на несколько физических серверов.


В общем, из моего опыта (не буду называть что-то явно плюсом или минусом, не всё так просто):


  • микросервисы заставляют тратить больше усилий на этапе проектирования;
  • продуманный API — наше всё (мелкие исправления вносить несложно, а вот сильно переделывать — больно);
  • некоторые "минусы" микросервисов можно обойти, когда есть возможность править (или написать свой) код, отвечающий за инфраструктуру (внешние вызовы и т.п.);
  • не стоит ставить целью делать "мельчайшие" микросервисы, выше был правильный комментарий про Transaction Boundary и т.п.

P.S. "спец-циалисты" — прям хорошо!

В целом — скорее согласен с комментарием, но есть встречные комментарии.


В частности, есть правило, что микросервисы должны делиться так, чтобы не пересекать transaction boundary.

Это стараются обходить сагами и прочими ухищрениями, то есть правило не железобетонное. Но хорошее, да — всё-таки саги — это дополнительная сложность, дополнительная сложность заставляет меня грустить (поэтому обхожусь пока без саг).


В идеале никакой сервис не должен дергать другой сервис.

Ну, это слишком уж строгое ограничение. А лучший код — тот, который не написан? И то и другое звучит красиво, но работает редко.
Скажем так, если один микросервис изредка вызывает другой — не вижу проблемы. А вот если один микросервис постоянно вызывает другой — тут уже возникают вопросы, правильно ли выбрали границы.


Если у вас после проектирования получилось так, что пайплайн запроса состоит из пяти микросервисов, то это серьёзная ошибка, имхо.

Здесь согласен. Разве что, в качестве исключения могут быть инфраструктурные вызовы (положить в интеграционную шину, просигналить о необходимости отправки оповещения и т.п.). Но у всех по-разному это происходит — где-то для инфраструктуры библиотеки подключены, где-то — отдельные микросервисы.

Жалею, что статья не вышла раньше на две с половиной недели, как раз зуб удалил…
Странно, что хирург посоветовал поставить имплант в течение 3 месяцев и не сказал, что лучше сразу.


Правда, там была старая нижняя семёрка слева, с которой были проблемы ещё лет 25 назад, сейчас уже от зуба почти ничего и не осталось. С другой стороны нижнюю семёрку удалили тоже лет 25 назад, имплант тогда не поставил.


И вот вопрос — имеет ли смысл сейчас бежать и ставить имплант или уже не дёргаться и можно до июня подождать?
И, в принципе, насколько важно ставить имплант в текущей ситуации (с отсутствием правой семёрки проблем не испытываю)?

Чёрт, я только после вашего комментария вспомнил, что коллеги давным-давно на одном из хакатонов запилили приложение для Android.


Если вдруг интересно...

Вроде в комментах тут можно ссылки оставлять, тем более, что приложение бесплатное...


Redmine Time Management


Забыл, потому что сам не пользовался. Наверное, даже работает, если в свежем redmine кардинально эту часть API не поменяли.

Видимо, на большинство продуктов лишь бегло посмотрели. А жаль — подумал, было — "наконец-то не только маркетинг". На примере Redmine, про который сказано:


Слабые стороны: устаревший интерфейс, некоторые функции спрятаны в очень неочевидных местах. Нет инструмента для отслеживания времени и активности пользователя по задачам. Система требует определенных навыков для установки на вашем собственном сервере. Также требуется время, чтобы сориентироваться в интерфейсах и понять назначение каждой функции.

Disclaimer: я не "евангелист" Redmine, даже не контрибьютор, просто им пользуюсь.


Давайте по пунктам.


  1. Думаю, у большинства сколь-нибудь сложных продуктов некоторые функции спрятаны в очень неочевидных местах.
  2. Инструмент для внесения времени есть (включается в настройках проекта). Если речь про всякие трекеры — не интересовался, может есть плагины (их море, кстати, только некоторые устаревшие).
  3. Какой именно активности пользователя не хватает? Есть такая и такая. Или хочется мгновенного уведомления о комментариях или смене статуса задачи? Возможно, для кого-то важно (сам бы я отключил, если бы такое было и отключалось).
  4. Про навыки для установки на собственном сервере — да, есть такое. Хотя есть хостинг и готовые образы для тех, кто не хочет или не может этим заниматься.
  5. См. пункт (1). Если сравнивать с простыми продуктами с меньшим набором функций, то, конечно, они будут проще (чертовски логично).

В целом ощущения (по тому же HN и Twitter), что, как минимум, среди технарей больше поддерживающих JetBrains. Некоторые очень даже креативно поддерживают.


Другой вопрос, что не все бизнесмены и чиновники в технических вопросах прислушиваются к технарям. Хотя, казалось бы...

В такой статье было бы полезно поделиться и другим взглядом на внутреннее устройство Valve:


https://medium.com/dunia-media/the-nightmare-of-valves-self-organizing-utopia-6d32d329ecdb

Information

Rating
3,546-th
Location
Ярославль, Ярославская обл., Россия
Date of birth
Registered
Activity