1.83K subscribers
3.24K photos
127 videos
15 files
3.52K links
Блог со звёздочкой.

Много репостов, немножко программирования.

Небольшое прикольное комьюнити: @decltype_chat_ptr_t
Автор: @insert_reference_here
Download Telegram
Наконец-то смержили мой MR, который висел уже два месяца. И он даже попадёт в ближайший релиз.

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

Я делаю недостаточно. На работе я большую часть времени пинаю балду, вне работы тоже. Мои каналы простаивают без авторского контента. Своим родственникам я помогаю (в той или иной мере) мало и неохотно. По дому от меня помощи не дождаться.

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

Я ничтожен. Все мои постоянные обязанности мелочны и не обременительны. Мир постоянно напоминает мне о том, какой я не взрослый и не самостоятельный, причём романтических отношений это тоже касается. Самое страшное, что меня это в какой-то мере устраивает.

Хочется просто ничего не делать и оставаться лежать в кровати, прижимая к себе плюшевую акулу — единственное существо, которое я могу себе позволить обнять.
#article

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

media-xyz.com/ru/articles/1098-otkuda-berutsia-toksichnye-igroki-i-kak-s-nim
This media is not supported in your browser
VIEW IN TELEGRAM
#prog

Немного опыта работы с #go
Forwarded from Sergei Fomin 🕊
Первое же, чем я отстрелил себе ногу в го - отсутствие каких-либо компайл-тайм гарантий относительно гонок. Всё как в старом добром си - что-то меняешь конкурентно, будь добр взять мьютекс. Забыл - сам себе злобный буратино. Отсутствие константности в го усугубляет проблему.

Второе, чем я себе отстрелил ногу уже три раза - это утечки. В го нет raii, так что забыл позвать defer close(), например, на grpc клиент - опять сам себе буратино. Парадоксально, что GC не спасает от утечек :)

Третье, на что я напарывался уже пару раз в проде - это дурацкий захват переменной в цикле. Типа хочешь создать 1000 каких-то объектов через grpc, пишешь без задней мысли Name: &obj.name (где obj - переменная цикла), и получаешь запрос на создание 1000 объектов с одинаковым именем. Можно сказать, что сам дурак, но вне цикла & это по сути аллокация объекта на куче, так что само напрашивается. Здесь borrow checker без GC сработал бы намного лучше - у меня бы не скомпилился код, где я вместо аллокации на куче случайно захватил локальную переменную. GC же тут только мешает, делая не то, что я ожидаю.

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

type Foo struct {
inner SomeIface
}


Мне в этом типе надо во всех методах проверять, что inner не nil (ведь клиент может написать просто var Foo foo), чтобы хотя бы внятную ошибку дать (типа "используйте NewFoo для конструирования"). Или забить, тогда будет паника с nil dereference, причина которой может быть клиенту неочевидна.

Это основное, по мелочи ещё тоже есть. Например, по типу не понятно, это struct или interface (от этого зависит nullability). Про nullability ещё на нравится, что очень много типов могут быть null (указатели, интерфейсы, мапы, слайсы). Намного лучше кмк, когда типы не nullable, но есть option. Банально не понятно, если функция возвращает nullable тип - стоит ли проверить на null или нет? Я обычно стараюсь проверять, так что возникает много бойлерплейта
Forwarded from Sergei Fomin 🕊
Го мне всё равно нравится больше плюсов, но расту на мой вкус он сильно проигрывает по многим фронтам. Мне язык кажется эдаким осовремененным си со сборкой мусора и горутинами, чего-то принципиально нового в нём вроде бы нет, кажется by design :)
Forwarded from Sergei Fomin 🕊
Ещё вспомнил общий бич всех языков с GC - отсутствие внятной семантики владения. Здесь го даже переплюнул конкурентов тем, что даёт возможность неявно сделать shallow copy объекта - когда веохнеуровневый объект скопировался, а все содержащиеся в нём интерфейсы/указатели/мапы/слайсы остались ссылками на старые объекты) Даже в Питоне кмк получше, там обычно все объекты передаются по ссылке, пока ты явно не сделаешь иного
Forwarded from Sergei Fomin 🕊
Про многопоточность, кажется best practice это просто строить код на каналах: нет общего стейта - нет проблем. Но есть сценарии, когда общий стейт всё-таки нужен, и тут мне не известно никакого решения настолько же системного, как Send/Copy и семантика владения в Rust.

Про raii, один гофер мне сказал, что вместо в go 2.0 обещают дженерики с With<T>(func() error), это должно смягчить проблему, но зато появляется лапша из коллбеков) Плюс при работе с объектом мне всё равно надо самому напрягаться и смотреть, надо ли с ним использовать этот With или нет. В теории, линтеры могли бы ловить проблемы типа отсутствия defer obj.Close(), но сейчас они этого не делают и вроде даже понятно, почему: сложно сформулировать какое-то правило, которое бы не страдало от высокого рейта false positive/false negative. Но вообще, на мой вкус, это перекладывание ответственности на линтер не есть хорошо - лучше пусть будет деструктор на уровне языка)

Про захват переменных, линтер иногда что-то такое отлавливает, иногда нет, по-разному бывает)

Про nullability, кажется, можно любо включить режим паранойи и проверять везде и всё, либо положить болт, либо выбрать какой-то вариант посередине. Если код мой собственный для моего же пользования, я предпочитаю делать вид, что null initialization не бывает, и везде инстанциирую через функции а-ля NewFoo(...). Пару раз меня такое подводило кстати :(
👍1
Forwarded from Sergei Fomin 🕊
Из плюсов го, во-первых он очень быстро компилится, во вторых меня довольно радует context, который используется примерно во всех либах и позволяет удобно делать cancellation асинхронных процессов. В Rust кажется ещё нет такого стандартного механизма, но возможно я ошибаюсь
Клиент был обслужен по высшему разряду электрического стула
yeah sex is cool but have you ever read Amos?
#prog

Интересно, почему это замедление происходит именно с jump-инструкциями. Неужели с другими не возникает?
Forwarded from Experimental chill
В последнее время много игрался с ARM архитектурой, и сегодня я наткнулся в x86 микробенчмарке на так называемый Jump Conditional Code Erratum, который при jmp инструкциях, которые попадают на границу кешлинии и могут замедлять горячие циклы по двойной лэтенси того самого кэша, а и в редких случаях его инвалидировать. И компиляторы/линкеры это не детектят из-за нетривиального оверхеда на размер бинаря или просто потому что это очень новая (2019) находка. Но присутствует с процессоров Sandy Bridge.

Помогает выставить -mbranches-within-32B-boundaries в компиляторах, насладиться 1% оверхеда размера бинаря и чтобы такое никогда не возникало в жизни.

Это даже выглядит как какой-то ужастик. Вы пишите код, выравнивание цикла ломается в совершенно другом месте. Ваш код откатывают, потому что "бенчмарки просели", а вы с этим кодом ничего общего не имеете. Вообще.

В ARM такой проблемы быть не может, так как все инструкции по размеру 4 байта, в x86 оно переменное. Надеюсь, ARM возьмёт своё в итоге.