Warning: Undefined array key 0 in /var/www/tgoop/function.php on line 65

Warning: Trying to access array offset on value of type null in /var/www/tgoop/function.php on line 65
234 - Telegram Web
Telegram Web
У Андрея там прям крестовый поход, конечно)
😁2🤣1
Так, с мест передают смешное, кто-то пытается выпилить Линуса из Линукса.
😁9🤣2👍1🤩1
Забежал в универ мимоходом в нетипичное для себя время, а тут просто огромная концентрация сиспрошников разных курсов на квадратный метр. Приятно ☺️

Хорошего всем дня!
24❤‍🔥3👍1
Меня тут спрашивали недавно, стоит ли идти в магистратуру, и, если да, то зачем.

На самом деле ответ на поверхности: в магистратуру нужно идти, чтобы через два года, наконец, назвать себя магистром-джедаем. Да, Эни?
😁9👍6🤣1
Обещал тут порассказывать про свои самые злые кранчи. Кажется, сегодня просто идеально подходящий для этого вечер! (начинающаяся осенняя хандра, временное состояние отца-одиночки и просто миллион дел на эту неделю - атмосфера что надо).

---

Итак, кранч первый, пост-студенческий.

Немного контекста: в универе у меня был диплом про то, как сделать из консервативного сборщика мусора точный. В JVM со странным рантаймом, лишь наполовину написанном на managed языке, чём-то типа Java.

Опишу суть в паре предложений. Если супер упростить, то трассирующая сборка мусора в managed языке - это такой DFS: нужно выбрать объекты, которые 100% живы, и найти всех достижимых из них по ссылкам. Все, что вы не нашли - это и есть мусор. Есть небольшая проблемка: граф большеват - миллионы объектов, а обойти его нужно очень быстро - за миллисекунды. Отсюда и куча классных алгоритмов, как это делать эффективно, или по кускам, или параллельно с работой приложения, или еще как.

Но есть еще вопрос с тем, что такое "выбрать объекты, которые 100% живы". Как собственно это сделать? Ну, вот, например, локалы, которые еще будут использовать в будущем: ссылки в них то всяко живы, объекты, на которые они ссылаются - тоже. А как их найти в скомпилированном коде? На каких они регистрах, в каких стековых слотах? Тут есть два подхода:

1) Спросить у компилятора, он точно знает (он же этот код сгенерил!). Он вам может записать структуры данных, в которых будет сказано: "вот в этой точке в коде на rdx лежит ссылка на живой объект, начинай-ка разметку с нее". Понятны с этим проблемы: нужно тормозить треды только в этих специальных точках, а не где попало, для этих точек генерить какую-то метаинфу (а она ведь место занимает), и уже по ней GC будет находить гарантированно живые объекты,

2) Забить на компилятор. Консервативно предполагать, что любой регистр и любой стековый слот содержит указатель на объект, а потом (зная структуру памяти и особенности работы аллокатора) отсеивать всякий мусор. Так делают, когда хотят прикрутить GC к C++, например (там то откуда вам знать: лежит ли у вас на стеке просто чиселко или указатель, приходится падать в консерватизм).

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

Собственно, что мне нужно было сделать: перейти от подхода консервативного GC, который по историческим причинам был у нас сделан, к точному GC. При этом постараться не слишком драматично просадить производительность, но главное - добиться корректности.

Это в свою очередь было не так просто в том числе и из-за хитрого рантайма, который лишь наполовину был написан на managed языке (там не так то просто гарантировать, что исполнение дойдет до safe-point за разумное время).

Ну и дополнительной сложностью было то, что такой работой никто в общем-то не занимается. Ну т.е. да, есть классические статьи Ole Agesen, где в общих чертах описано все, что нужно сделать. Но там a) нет кучи технических деталей, б) там рантайм то обычный, т.е. со многими основательными проблемами реализации никто и не сталкивался раньше (в SubstrateVM столкнулись, но у нас с ними получились прям разные решения).

Короче, задача то в целом довольно инженерная, совсем не rocket science, но чтобы ее сделать нужно просто огромный масштаб изменений провести в рамках кодовой базы JVM, прям с нуля ввести концепции, которых раньше в этой кодовой базе никогда и не было (хотя бы даже safe-points).

Так что в сумме (с перерывами на поход в enterprise и поиск себя) ушло у меня на это дело полтора года: половину на прототипирование (так появляется диплом бакалавра), половину на продуктизацию и решения проблем с рантаймом (так появляется диплом магистра).

Что-то не получилось рассказать контекст за пару предложений, но что поделать) Давайте переходить к кранчу ↓

#дух_машины
🔥10👍3
И вот: дипломы написаны, защиты пройдены, студенческие шапки подброшены в воздух. Плюс еще пара месяцев потрачена на окончательную продуктизацию диплома, полишинг и базовое локальное тестирование. Близится самое интересное и ответственное: момент ОГРОМНОГО коммита всех правок в транк. Вы, конечно, можете сейчас подушнить и сказать: "ты чего, нужно было по кускам коммитать!", но это и так уже были куски, так вот первый кусок был все еще огромным, как чертов авианосец.

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

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

И вот я иду домой (а в этот момент и начинается ночная сборка). Дома сижу и через remote desktop смотрю на то, как сборка продвигается на разных машинах. Пока что до исполнения дело не дошло, так что переживать рано, но я, конечно, все равно очень волнуюсь. В конце концов я засыпаю только для того, чтобы утром побежать на работу (даже не глядя на статус сборки), чтобы уже там оценить последствия. Сажусь за свою машину (пока что в офисе никого нет), кажется, у меня есть пара писем от работавшего ночью QA (святой человек был), медленно начинаю смотреть на статус сборки, и...

Следующий месяц своей жизни я помню смутно, он прошел, как в тумане.

В общем, я развалил нахрен приблизительно все. Вообще. При том спорадичными багами, которые умело избегали обнаружения на локальном тестировании. Уже ночью на меня завели пару ишуев, а весь наступивший день (да и пару следующих) на меня продолжали создавать все новые и новые critical и blocker. Потом, видимо, стали жалеть и просто дописывать новые тестовые сценарии в уже существующие тикеты.

Замечу, что это никак не аффектало клиентов, но вот другие разработчики просто не могли нормально тестировать свои правки: у них все падало из-за меня. Это безумно давило мне на психику, мало того, что у меня все разваливалось, так и другим людям я реально мешал работать.

Вы, наверное, скажете, что логичным шагом было бы откатить огромную правку и продолжить локальное тестирование (благо информацию о падающих сценариях я собрал). Но честь и хвала моему лиду, он решил тогда дать мне время на отладку. Первые, самые легко воспроизводимые баги я отладил за пару-тройку дней (в которые я, конечно, херачил часов по 18). После этого сборка чуть ожила, хотя в каком-то смысле все стало только страшнее: оставшиеся баги были уже не так просты, дать какой-то гарантии на время их отладки я не мог, workaround предложить тоже не мог, а если бы я откатил, то потерял бы сценарии для воспроизведения уже насовсем, слишком уж они спорадичны! Именно тогда я впервые встретился с багом, который воспроизводился раз в год (как я узнал еще через 11 месяцев).

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

Через месяц сборка окончательно (хе-хе, так нельзя говорить в случае спорадичных багов, это тоже урок, который я усвоил) позеленела, я выдохнул, команда тоже. ↓

#дух_машины
🔥17👍4
Это был самый настоящий кранч, при том в каждый момент времени у меня не было понимания, вижу ли я свет в конце тоннеля или это поезд на меня летит нет. Закончится ли эта отладка когда-нибудь или нет? А ведь в какой-то момент мне уже и лид стал говорить аккуратно, но жестко говорить, что если если я до такого-то числа все не отлажу, то это уже будет совсем плохо, и придется откатывать. Откатывать результат предыдущих полутора лет моей работы, да.

Естественно, это все плохо сказывалось на мне: я мало спал (даже для меня), хреново выглядел (хуже, чем обычно), огрызался в разговорах с окружающими. Наверное, это сильно контрастировало с тем уверенным выпускником маги, который на защите сказал: "вот теперь начинается самое интересное, не переключайтесь!".

Стоило ли оно все того? Я до сих пор думаю, что да.

Это был кранч во благо: именно он научил меня отлаживать и главное - любить отлаживать. Без этого кранча не было бы одного из очень важных моих инженерных достижений (точнее первого его кирпичика). А еще он научил меня, как писать более надежный код в рантайме, ведь многих багов можно было бы избежать, перестрахуйся я на этапе разработки лишний раз. Да и с командой меня это сильно сблизило: да, они ворчали, но поддерживали как могли, да и стерпели же все-таки. А лиду я до сих пор благодарен, что он тогда в меня поверил и дал этот месяц.



Но, конечно, далеко не все кранчи в результате оказываются полезными. В следующий раз расскажу о совсем другой истории, хоть и тоже связанной с разработкой GC. Там все получилось прям по классике, так что happy end-а не ждите.

А пока: не забывайте отдыхать и трогать траву, думаю ее еще можно найти на улице даже у нас :)

#дух_машины
🔥303👍1
Доброе утро! Убирай телефон, посмотри, как прекрасен мир вокруг 😍
11😢4🙈1
ну, я походу из 80-ых

единственное хорошее в роли Синдзи, что он жил с Мисатой и Пен-Пеном
❤‍🔥8
Сегодня встретил в кофейне старую знакомую, а она в разговоре: "ну, как у тебя дела? как обычно - хреново?" 😂

Надо что-то делать с репутацией, не иначе)
😢11😁9💔5
This media is not supported in your browser
VIEW IN TELEGRAM
Снег-снег-снег! Наконец-то, чего так долго в этом году? ❄️

Снег меня всегда безумно бодрит после депрессивной осени.
283❤‍🔥1🎄1
Новый офис становится все более душевным. Вот такой портрет Андрея Петровича Ершова внезапно появился у входа в крыло Excelsior-а (в Новосибирском офисе Huawei).

Вот это круто и очень приятно, это уважение к нашей истории и к нашим корням.

Хороший пример того, как нужно выстраивать отношения с присоединившимися самобытными командами (в отличие от "мотивационных" плакатов с корпоративным булщитом).
32👍12🔥6🤩1
Не знаю, сколько мне должно исполниться лет, чтобы я перестал в разговорах закипать на эмоциях и говорить собеседнику в лицо вот ровно то, что я про него сейчас думаю.

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

Так что искренность - это круто, конечно, и очень по-пацански, но переговорщик я из-за этого зачастую довольно слабый.
13😎3👍1😁1🌚1
Прихожу вчера домой, и случается серьезный разговор с сыном:

- папа, расскажи про Хаос!
- ммм, что-что?
- ну, про Хаос, ты что не понимаешь? Х-а-о-с
- эээ... ты о чем?
- про то как однажды все люди из разных народов объединились, чтобы побороть Хаос...

*судорожно думаю, где он умудрился нахвататься вахоебского лора в таком возрасте, делаю последнюю попытку нормализовать ситуацию перед разговором про ересь Хоруса*

- ... в садике что-то обсуждали?
- ну да, про Хаос и победу над ним! Скоро еще праздник про это будет...
- ... ... ... ты про смуту?? А праздник - день народного единства??
- а, точно, смута! Ну так что, расскажешь про смуту?

Потом еще немного подумал и говорит:

- а про Хаос расскажешь, когда мне исполнится 6 лет, хорошо?
- хорошо, сынок, конечно, обсудим.

Видимо свой шестой день рождения он запомнит надолго.
😁42🤣4
Легким движением руки шестидневная неделя превратилась в семидневную, но зато мы очень круто поучаствовали в дне открытых дверей НГУ, при том в этот раз с нами были уже три поколения сиспро :)

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

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

#the_real_science
29👏7💯1
2025/07/09 16:31:58
Back to Top
HTML Embed Code: