• Про новинки в .NET 5 и C# 9.0
    +7
    if (x is not null but y)
    


    Шутка.
  • Меня перевезли в другую страну и через две недели выставили на мороз — потому что передумали нанимать
    0
    Ну как минимум это контринтуитивно — что компания, которая занимается продажей людей, якобы относится к ним по-умолчанию лучше, чем компания, для которой эти люди делают «самую большую ценность». Типа pet vs cattle?
  • CucumberTalks: избегаем антипаттернов и пишем выразительные сценарии
    +2
    Используется ли у вас в компании DDD подход в разработке, и если используется — насколько он заменяет собой BDD подход, и если не особо — то почему?
  • 4 рекомендации по разработке крупномасштабных проектов на Vue
    0

    Пробовал его и не понравилось, но сейчас в доках вижу что-то новое. Спасибо, попробую.

  • 4 рекомендации по разработке крупномасштабных проектов на Vue
    0
    Сотни строк данных это не самый большой объем, вообще говоря.
    Я на своем петпроекте обычно держу в состоянии приложения только срез данных. Например, если у меня есть табличка с юзерами, то подгружается она постранично, и если из вебсокетов приходит сообщение об изменении пользователя (например, он вошел в сеть), то в хранилище вносятся изменения только если пользователь есть на этой условной странице.
    Аналогично ведется работа с другими многочисленными сущностями — комментариями, новостями итд. Приложение и его стор не должны превращаться в копию бд на клиенте.
  • 4 рекомендации по разработке крупномасштабных проектов на Vue
    0
    Недавно перевел средних размеров проект (страниц штук 40, своя библиотека базовых компонентов) на тайпскрипт и стайлус. Ничего особенно сложного, а поддержка тайпскрипта вполне бодрая.
    Единственное что меня как олда подбешивает — это отсутствие хоть одной удобной тулзы для валидации форм. После, простите, jquery.unobtrusive.validate все выглядит громоздким и при этом черновым.
  • 4 рекомендации по разработке крупномасштабных проектов на Vue
    +3
    Я бы еще добавил — сразу используйте тайпскрипт.
  • Фрактальная шизофрения
    +1

    Боюсь, помимо отображения вам еще понадобится само множество

  • «В карантин нагрузка выросла в 5 раз, но мы были готовы». Как Lingualeo переехал на PostgreSQL с 23 млн юзеров
    0
    О, круто, спасибо! Надеюсь, в новом подходе им нашлось место.
  • «В карантин нагрузка выросла в 5 раз, но мы были готовы». Как Lingualeo переехал на PostgreSQL с 23 млн юзеров
    +2
    1. Названия полей json — это типа «тайпчеки для самых маленьких». В декларациях типа xml/grpc и даже в swagger.json есть возможность указать явно, что вот эта строка — это uuid, а эта — дата в формате ISO, тут любое число, а здесь — беззнаковое целое. И по-хорошему нужно проверять на стороне «бэка», что вы отдаете в верно проименованных полях верного типа данные. И, конечно, я вообще молчу про глубокие объекты с массивами и прочим.

    2. Мы говорили о константах для перечислений состояний. Например, у вас есть поле Status, где хранится число — логично, экономно. Числа никто не помнит, если их больше двух, а хранить строки для такого служебного поля — оверкилл. Держать в конфигурации информацию о том, что 1 — это подписка на поздравление с днем рождения, а 21 — на новости о новых фичах — крайне плохая идея, как минимум потому, что сценарий «вот на этом инстансе пожалуйста пускай будет наоборот» становится возможным, но не перестает быть идиотским.

    Или под «конфигом» вы понимаете еще одну таблицу в БД?

    Уточню, что в моем примере выше использовалась фича языка C# под названием Enum — там можно создавать компайл-тайм константы с привязками к целочисленным значениям, которые спокойно приводятся туда-обратно, но при этом дают возможность на этапе компиляции требовать не 1 или 21, а Subscription.Birthday или Subscription.NewFeatures. Это к вопросу о выразительности и удобстве скуля.

    3. Повторю вопрос — каким конкретно образом вы ограничиваете использование таблиц в хранимках? Вы лично бдите за этим? У каждого разработчика есть чеклист? Используется какой-то глобальный тест? Что, если хранимок с данной таблицей уже 10, а мне ну очень нужно сделать новую фичу с ее использованием? А если хранимок уже 12 при этом?
  • «В карантин нагрузка выросла в 5 раз, но мы были готовы». Как Lingualeo переехал на PostgreSQL с 23 млн юзеров
    +1
    Изменение структуры хранения данных — это вряд ли вообще рефакторинг, но даже если и относить это туда, это не единственный вариант. Речь идет скорее о том, что вдруг в какой-то udf вы поняли, что ух — контракт неудобный, опечатка в поле возвращаемого параметра или «нам нужны монады!» В строго типизированных языках есть целые чудесные инструменты, вплоть до того, что переименование поля возвращаемого значения делается одной клавишей буквально.

    Разве это не локальные константы? Думаю, вопрос скорее про глобальные константы, которые будут едиными для всех хранимок во всей базе.

    Каким образом вы ограничиваете количество хранимок, где используется таблица? Скажем, таблица юзеров у вас правда только в 10 хранимках встречается?
  • «В карантин нагрузка выросла в 5 раз, но мы были готовы». Как Lingualeo переехал на PostgreSQL с 23 млн юзеров
    +1
    В приведенном примере еще проблемы нешутошные с типизацией возвращаемого json, не наблюдается возможности компайл-тайм проверки того, что все везде правильно отдается. Про автоматическую генерацию swagger.json или чего-то подобного речи тоже не идет.
  • «В карантин нагрузка выросла в 5 раз, но мы были готовы». Как Lingualeo переехал на PostgreSQL с 23 млн юзеров
    +2
    Вот шарпы с использованием EntityFramework. Тут, кстати, настоящая защита от инъекций, можно даже анализатор написать для экранирования любых строковых констант содержащих SQL определенного диалекта. Конечно, его тоже можно обойти, но ревью это вряд ли пройдет.

    return db.Subscriptions
      .Where(s => s.Status == SubscriptionStatus.Active)
      .Where(s => s.SubscriptionDate <= currentMoment)
      .Select(s => new ActiveSubscription
      {
        UserId = s.UserId,
        UserName = s.User.Name,
        Date = s.SubscriptionDate,
      })
      .ToArrayAsync();
    
  • «В карантин нагрузка выросла в 5 раз, но мы были готовы». Как Lingualeo переехал на PostgreSQL с 23 млн юзеров
    0
    Учитывая, что у них все-таки используется mq — технически это не одна транзакция, в зависимости от того, дергается ли хранимка на стороне консюмера.

    Ну и опять же — хорошо, когда вы владеете всеми данными. А тут поскольку есть все-таки какие-то сервисы, то сценарий
    1. Обновить сущность А
    2. Сходить на внешний сервис за данными
    3. Обновить на их основании сущность Б
    либо лишится транзакционной целостности, либо поменяет местами шаги 1 и 2 и тем самым превратится в другой сценарий, где обновление сущности А условное.
  • «В карантин нагрузка выросла в 5 раз, но мы были готовы». Как Lingualeo переехал на PostgreSQL с 23 млн юзеров
    +4
    В каждой хранимке оказывается логика по формированию ответа на ошибку и отправки ее в лог? Вообще вы с дублированием кода и подобными бойлерплейтами как разбираетесь? Через udf?
  • «В карантин нагрузка выросла в 5 раз, но мы были готовы». Как Lingualeo переехал на PostgreSQL с 23 млн юзеров
    +1
    То есть, захотел поменять текст ошибки на фронте — запустил запрос. Примерно как я и предположил.

    А эти запросы лежат в какой-то системе контроля версий? Как гарантируется консистентность нескольких баз? Грубо говоря, есть ли у меня возможность узнать, что моя бд такая же как у Пети, а у Васи — такая же как на проде?
  • «В карантин нагрузка выросла в 5 раз, но мы были готовы». Как Lingualeo переехал на PostgreSQL с 23 млн юзеров
    0
    Обычно, в компаниях, где царит плюрализм, изменения в бд делаются итерационно и хранятся в какой-то системе контроля версий. Как правило, удобно держать изменения в отдельных файлах, например, с номером версии. Поменял хранимку? Залил дельту в виде отдельной миграции, и теперь любой коллега может запросто накатить твою версию на свою среду либо вручную (не айс), либо воспользовавшись готовой тулзой. Всё-таки тянуть целый снепшот всей бд в краткосрочной перспективе не очень удобно, а вот держать для историчности хотя бы минорные и патчевые изменения в схеме базы и ее окоужении — полезная штука.

    Допустим, у вас не используется этот подход. Ваше дело, хотя и странное. Получается, для изменения текста ошибки на фронте мне придется на прод выкатывать… что? В случае с миграциями, релиз будет состоять в запуске одного скрипта, который выполнит alter stored procedure, а в вашем случае релиз в чем состоит?
  • «В карантин нагрузка выросла в 5 раз, но мы были готовы». Как Lingualeo переехал на PostgreSQL с 23 млн юзеров
    +1
    Да нет, вас понять очень легко как раз-таки. Статьи по хранимкам входят в топ 3 сущностей, где на хранимки можно смотреть без слез.
  • «В карантин нагрузка выросла в 5 раз, но мы были готовы». Как Lingualeo переехал на PostgreSQL с 23 млн юзеров
    +5
    То есть, вы вместо монолита сделали якобы не-монолит, где для изменения текста ошибки фронта нужно выполнять миграцию бд? Это, конечно, новый уровень…
  • Повышаем надёжность HttpClient’а в .NET Core или как ошибиться в 3 строках кода 4 раза
    +1
    Ну например в гайдлайнах некоторых советуют использовать паттерн Deadline для распределенных таймаутов: www.datawire.io/guide/traffic/deadlines-distributed-timeouts-microservices

    Но вообще несмотря на то, что Polly — это прекрасная библиотека, вам наверное стоит пересмотреть идею использовать ее для CircuitBreaker'а. Раз у вас SOA, то вы наверное используете горизонтальное масштабирование, и вряд ли вы сможете шарить состояние CB между двумя инстансами одного сервиса. Возможно, целый ряд ваших проблем с распространением ошибки решат Hystrix или Istio, но CB-то уж точно стоит туда отправить.
  • Повышаем надёжность HttpClient’а в .NET Core или как ошибиться в 3 строках кода 4 раза
    +1
    При работе с таймаутами в распределенных системах еще возникает вот такая коллизия:

    Есть сервис, который выполняет какие-то операции и вызывает другой сервис. Этот сервис тоже выполняет операции и вызывает сервис. Наконец, последний сервис просто что-то делает. У каждой операции в пайплайне есть свой таймаут, например 10 секунд. Если собственные операции каждого сервиса будут работать по 4 секунды, то на гейтвее может случиться ошибка таймаута, хотя каждый сервис отработал за корректное время. Вы как-то решаете подобные проблемы?
  • Ускоряемся в Entity Framework Core
    –1
    В core вроде как вызовы .Result и .Wait() не могут приводить к дедлокам, насколько мне известно. Хотя, конечно, ничто не мешает в этом примере заавейтить результат.

    Поправьте меня, если я ошибаюсь? Есть ли какие-то другие подводные камни, кроме тех что исчезли с уходом контекста синхронизации?
  • У меня нулевая текучка
    0
    в некоторых штатах и четырьмя!
  • Опциональная цепочка, объединение с null, и как они меняют наш подход к написанию кода
    0

    Ну можно сделать в любом случае some?.method?.call(some, args);
    Хотя выглядит не особо. Но выше пишут, что в стандарте есть более элегантное решение.

  • Боярское программирование
    0
    Можно, пожалуйста, дабы поддержать концепцию, не «классъ», а «сословие»?
  • Разбираем WTF задачки в JavaScript
    0

    Мы все держим за вас кулачки. Вебасм в президенты!

  • Девелопишь на .NET Core? Го в Ubuntu, я создал
    0

    Это радует, а то на моей последней попытке падал старт etcd ноды под 18.04 и на форуме ответили дескать так и нужно.

  • Девелопишь на .NET Core? Го в Ubuntu, я создал
    0
    Но разве для ранчера не нужна чуть ли не 16.04 или вообще своя сборка ядро+докер? Что если мне хочется 19+ версию убунты (если честно, не уверен, зачем)?
  • Прекратите использовать Else в ваших программах
    +1
    Проблема всегда в том самом god-классе/методе. Куда уж проще!
  • Знакомьтесь, <details>
    0
    Еще добавлю свои пять копеек. Допустим, на вашем ресурсе пользователям доступна кастомная верстка с возможностью добавлять «спойлеры». Вы предоставляете контент по API в виде html, чтобы ускорить отображение (пусть даже с какой-то конфигурацией). Теперь у вас есть выбор — либо использовать checkbox для того чтобы открывать/закрывать содержимое, либо вешать listener на документ, чтобы подгружаемые по xhr спойлеры сразу работали. Притом если по какой-то причине исполнение js прервется до навешивания этого слушателя, то спойлеры вообще не будут работать.

    Ну и, понятное дело, что если вы используете какой-нибудь react или vue — в вашу сторону за такие «навешивания» будут коситься.

    Нативное решение для достаточно популярного элемента интерфейса — это всегда лучше чем пусть и проверенные временем костыли.
  • С Днём Программиста
    +1
    Выразить-то совершенно запросто можно, выражение — это соглашение. Любая инъекция, в образе которой содержится число 256, будет являться валидной, нет?
  • Приходите и забирайте книги на английском
    0
    User Story Mapping еще остался? Спасибо заранее
  • Приходите и забирайте книги на английском
    0
    Наверное для верификации достаточно войти на хабр под нужным логином?
  • Practicalities of deploying dockerized ASP.NET Core application to Heroku
    0
    There's another way to solve the default ports problem without using the «UseUrls» method:
    In we can put the environment variable right in the dockerfile like
    CMD ASPNETCORE_URLS=http://*:$PORT dotnet myapp.dll
  • Как я ушел из IT в психологию
    0
    У меня очень много знакомых психологов, они говорят что последнее время на учёбу к ним (например в «гармонию») стали приходить программисты в большом количестве. Насколько я успел понять, на том же б17 их тоже немало (по обе стороны).
  • Я написал эту статью, ни разу не посмотрев на клавиатуру
    0
    Я научился слепой печати по ночам играя в Warcraft III. Свет приходилось тушить, чтобы родители не погнали из-за компьютера, старый компьютерный стол (с выезжающей полкой под клавиатуру) был сконструирован так, что на клавиатуру ложилась густейшая тень. Когда я начал программировать, как-то само собой оказалось, что я бодренько печатаю вслепую. Спасибо Blizzard за успешную карьеру программиста!
  • Первые десять дней на пути от совы к жаворонку: сон, рацион, режим питания и нагрузка
    +5
    Я все понимаю, но зачем в общении регулярно нужно слово «лицемерие»? Я лично его юзаю впервые за кучу лет — и на русском притом
  • Blameless environment: никто не должен писать качественный код
    +5
    А «цену» тикета кто определяет? Разработчик может отказаться от задачи, если не согласен с её ценой?

    Может быть, я морально не готов к этой прорывной идее или неправильно понял посыл статьи — но это все звучит как описание очередной галеры с небезызвестного сайта на домене .it — и менеджер-евангелист, который, разумеется, может писать код сутки напролёт, и невероятный контроль на рабочем месте (про игру престолов нельзя говорить, линтер пишет код за тебя, потому что менеджер для себя решил что никто не умеет писать код [как ему нравится]), неопределенная зарплата по тайным kpi.
  • 5 чрезвычайно простых способов ощутимо повысить скорость вашего VueJS-приложения
    0
    Два года в vuejs. Начинал с первой версии. Я три с половиной года назад писал spa на второй версии. Или у товарища так себе с актуализацией технологии, или статья морально устарела.
  • 5 ошибок начинающего лида
    +21
    Но… вы же… буквально используете слово «транслит»…