ar
Feedback
P(hD)ython

P(hD)ython

الذهاب إلى القناة على Telegram

О Python, PhD, распределённых системах и не только Автор - Михаил Масягин (@masyagin1998): - Python Lead в NDA HFT; - преподаватель в Бауманке; - эксперт по СУБД System Design World; - любитель PhD и авторегрессии.

إظهار المزيد
لم يتم تحديد البلدالفئة غير محددة
214
المشتركون
لا توجد بيانات24 ساعات
لا توجد بيانات7 أيام
لا توجد بيانات30 أيام
أرشيف المشاركات
«HFT-доклад прошёл по плану 😎» День Московского четвертьфинала ICPC позади 😌 Поговорили с многими десятками студентов, разд
«HFT-доклад прошёл по плану 😎» День Московского четвертьфинала ICPC позади 😌 Поговорили с многими десятками студентов, раздали тонны мерча и ещё больше ребят завлекли на наш контест 😈 Я очень волновался перед выступлением, но всё прошло просто супер! Были и доп. вопросы, и бурные овации! ❤️ Особенно приятно было видеть студентов из родной Бауманки!  Ребята - вы лучшие! 🔥 P.S. Больше фото в комментариях! P.P.S. А вот и видео https://youtu.be/i8GXmeoMmn8?t=28055 ! С уважением, Михаил Масягин

«Сдеаноню NDA HFT на 300+ человек 😈😬» Уже в это воскресенье я буду выступать с живой лекцией на 300+ человек на четвертьфин
«Сдеаноню NDA HFT на 300+ человек 😈😬» Уже в это воскресенье я буду выступать с живой лекцией на 300+ человек на четвертьфинале ICPC в Сколково и публично расскажу о том, как построить современную и прибыльную HFT-инфраструктуру с нуля 😎! Присоединяйтесь: https://t.me/moscowregional_news/48 🚀! О чём поговорим: - как выглядит живой пайплайн HFT изнутри, а не в учебных статьях; - почему shared memory решает; - что такое hot- и cold-path; - что точно должен уметь делать ваш бэктест; - и ещё о миллионе технических нюансов! - ах да, и о том, где лучше работать в HFT 🤑 Если вдруг вы будете среди этих 300+ человек (а я точно знаю, что в этом канале сидит несколько олимпиадников ❤️), подходите после доклада - поболтаем про HFT, борьбу за микросекунды и вот это вот всё наше! P.S. А ещё у нас будет свой собственный олимпиадный контест с уклоном в HFT и стенд с рафом, матчей и чётким мерчом для чётких разработчиков 😎 С уважением, Михаил Масягин

«Python для собесов - 2026 🚀» Продолжаем подготовку к Python-собесам! В прошлом посте мы перенесли тяжёлую функцию из Python
«Python для собесов - 2026 🚀» Продолжаем подготовку к Python-собесам! В прошлом посте мы перенесли тяжёлую функцию из Python в C, используя механизм FFI. Сегодня мы научимся делать это более элегантно 💅 посредством Python-компиляторов, таких как Numba, Pythran или JAX. Они компилируют подмножество Python в машинный код для CPU или GPU, тем самым повышая производительность и оставаясь в рамках Python. У каждого из приведённых инструментов своё собственное поддерживаемое подмножество Python, но базово можно считать, что все они способны компилировать функции, принимающие на вход, порождающие внутри себя и возвращающие: - numpy-структуры данных, исключая object; - Python-примитивы (int, float, complex, bool, str, ...); - реже - гомогенные числовые списки (List[float], List[int], ...). Python-компиляторы работают следующим образом: - Вы пишете Python-функцию и помечаете её компилируемой с помощью декоратора (Numba, JAX) или комментария (Pythran). - Далее, если компилятор работает как JIT (Just-in-Time), то он... ничего не делает 😄 (Numba, JAX), а вот AOT-компилятор сразу приступает к «конвертации» функции в машинный код (Pythran). Недостатком второго подхода является то, что он требует задавать типы входных данных на этапе написания кода. Кстати, в Numba так тоже можно сделать. - При исполнении Python-кода в случае AOT'а сразу запускается «бинарная» версия функции, а в случае JIT'а - функция компилируется при первом вызове, а при последующих уже используется её производительная версия. В связи с этим JIT'ованные функции важно «прогревать» - вызывать их с примером входных параметров при инициализации приложения, дабы исключить задержки компиляции при исполнении. Отмечу, что Numba и Pythran налагают ограничения только на типы входных данных, а JAX - ещё и на их размер, то есть для Numba и Pythran вызовы func([1, 2, 3]) и func([4, 5]) идентичны, а для JAX они, грубо говоря, приводят к двум разным функциям. Пара важных нюансов: - Переходы между Python и скомпилированным кодом дороги. Чтобы их минимизировать, следует делать компилируемые функции крупнее. Например, если в коде есть обработка данных в цикле, то лучше компилировать цикл целиком. - Чтобы не бить проект на отдельные компилируемые функции, можно использовать режим jit в Numba: он скомпилирует лишь то, что сможет. К сожалению, его производительность непредсказуема. К примерам! Напишем функцию fmul из прошлого поста на Numba и Pythran. А на JAX можете написать сами 😄. Numba: Поставим Numba:
pip install numba
Затем создадим файл numba_demo.py:
import numpy as np
from numba import njit

@njit
def fmul_numba(a, b, out, n):
    for i in range(n):
        out[i] = a[i] * b[i]

out = np.empty(4, dtype=np.float64)
fmul_numba(np.array([0.0, 0.5, 1.0, 1.5]), np.array([1.0, 2.0, 3.0, 4.0]), out, 4)
print(out)
Запустим его:
python3 numba_demo.py
[0. 1. 3. 6.]
Pythran:
pip install pythran
fmul_pythran.py:
# pythran export fmul_pythran(float[], float[], float[], int)
def fmul_pythran(a, b, out, n):
    for i in range(n):
        out[i] = a[i] * b[i]
pythran_demo.py:
import numpy as np
from fmul_pythran import fmul_pythran
import sys

print(sys.modules["fmul_pythran"])

out = np.empty(4, dtype=np.float64)
fmul_pythran(np.array([0.0, 0.5, 1.0, 1.5]), np.array([1.0, 2.0, 3.0, 4.0]), out, 4)
print(out)
pythran fmul_pythran.py
ls
fmul_pythran.cpython-312-x86_64-linux-gnu.so  fmul_pythran.py  pythran_demo.py
python3 pythran_demo.py
<module 'fmul_pythran' from './fmul_pythran...so'>
[0. 1. 3. 6.]
Кстати, пару лет назад на одном из собесов мне пришлось писать Numba-код, так что это даже более актуально, чем FFI 🤓. Сегодня мы познакомились с Python-компиляторами, в следующем посте поговорим о том, как понять, какие именно функции нам надо компилировать! ⚙️🚀 С уважением, Михаил Масягин

«Python для собесов - 2026 🚀» На днях я понял, что хоть мой канал и называется P(hD)ython, на нём всё ещё нет ни одного полн
«Python для собесов - 2026 🚀» На днях я понял, что хоть мой канал и называется P(hD)ython, на нём всё ещё нет ни одного полноценного поста про Python 😅. Исправим это! Запускаю серию постов, которые помогут Вам при прохождении Python-собеседований в 2026 году 😎. Один из моих любимых вопросов на Python-собесах звучит так: «если все ругают Python за скорость, то почему на нём пишут столько ML и математики?!». Удивительно, но часто на нём сыплются даже матёрые разработчики. Отвечаю! Сам по себе Python и правда медленный (почему - отдельный вопрос), но когда дело доходит до тяжёлых вычислений, оказывается, что он вызывает функции, написанные на компилируемых языках вроде Rust, C\C++ или... Fortran! Так, например, numpy по сути является обёрткой над С-массивами, а scipy.linalg.lapack обычно импортирует Fortran-библиотеку LAPACK! Даже pytorch, исполняясь на GPU, по факту делает это на C\C++ & CUDA ⚙️. Всё это достигается за счёт Foreign Function Interface (FFI) - механизма, позволяющего коду на одном языке вызывать функции, написанные на другом. FFI есть не только в Python. Он имеется в Rust (extern "C" & unsafe), Java (JNI & JNA), Go (cgo) и т.д., так что идея этого поста легко обобщается и на другие языки. А теперь пример! Сегодня мы напишем свой собственный numpy с поэлементным умножением float-векторов! Сперва реализуем функцию fmul поэлементного умножения float-векторов на C в файле fmul.c:
#include <stddef.h>
void fmul(const float* a, const float* b, float* out, size_t n) {
    for (size_t i = 0; i < n; ++i) out[i] = a[i] * b[i];
}
Скомпилируем его как разделяемую библиотеку:
gcc -O3 -fPIC -shared -o libfmul.so fmul.c
Установим cffi для поддержки FFI в Python:
pip install cffi
Теперь напишем Python-класс для работы с float-векторами и fmul в файле fmul.py:
from array import array
from pathlib import Path
from cffi import FFI

# через FFI подгружаем разделяемую библиотеку в Python-код
ffi = FFI()
ffi.cdef("void fmul(const float* a,const float* b,float* out,size_t n);")
C = ffi.dlopen(str(Path(__file__).with_name("libfmul.so")))

class F32Vec:
    # используем __slots__ для более компактного и производительного представления объектов класса
    __slots__ = ("a",)

    # требуем, чтобы наш класс конструировался из float-массива Python
    def __init__(self, data):
        self.a = (
            data
            if isinstance(data, array) and data.typecode == "f"
            else array("f", data)
        )

    def __len__(self):
        return len(self.a)

    def _mul_arr(self, other):
        if len(self.a) != len(other):
            raise ValueError("len mismatch")

        # готовим выходной массив
        out = array("f", [0.0]) * len(self.a)

        # вызываем через FFI C-функцию fmul
        C.fmul(
            ffi.from_buffer("float[]", self.a),
            ffi.from_buffer("float[]", other),
            ffi.from_buffer("float[]", out),
            len(self.a),
        )
        return F32Vec(out)

    # перегружаем операторы умножения, чтобы поэлементное произведение работало как в numpy
    def __mul__(self, other):
        if isinstance(other, F32Vec):
            return self._mul_arr(other.a)
        if isinstance(other, (int, float)):
            return self._mul_arr(array("f", [float(other)]) * len(self.a))
        return self._mul_arr(array("f", other))

    __rmul__ = __mul__

    def tolist(self):
        return list(self.a)

    def __repr__(self):
        return f"F32Vec({list(self.a)})"


if __name__ == "__main__":
    x = F32Vec([0.0, 0.5, 1.0, 1.5])
    y = F32Vec([1.0, 2.0, 3.0, 4.0])

    print(x._mul_arr(y.a))
    print((x * y).tolist())
    print((x * 2.0))
    print((2.0 * x).tolist())
Наконец, запустим код:
python3 fmul.py
F32Vec([0.0, 1.0, 3.0, 6.0])
[0.0, 1.0, 3.0, 6.0]
F32Vec([0.0, 1.0, 2.0, 3.0])
[0.0, 1.0, 2.0, 3.0]
Сегодня мы узнали, почему медленный Python способен быстро перемножать вектора, и как работает FFI! К сожалению, FFI громоздок и требует знания других языков. Как этого избежать - поговорим в следующем посте 🚀! С уважением, Михаил Масягин

«Коробки & EXPAR» К сожалению, октябрь выдался совсем без постов - переезд, коробки и постоянные переносы доставок добили мен
«Коробки & EXPAR» К сожалению, октябрь выдался совсем без постов - переезд, коробки и постоянные переносы доставок добили меня 😅. Но вот я снова в строю 🫡! Небольшой научный апдейт: наконец вышла моя статья в «Вестнике МГТУ им. Н. Э. Баумана: сер. естественные науки» совместно с моим научным руководителем - В. Б. Горяиновым: Вычисление асимптотической ковариационной матрицы оценки Хьюбера в обобщенной экспоненциальной авторегрессионной модели. Журнал входит в белый список ВАК, Scopus и т.д., так что всё по понятиям 😎 А теперь замолвлю пару слов об экспоненциальной авторегрессионной модели aka EXPAR. Несмотря на продолжительную историю, она очень активно применяется в различных инженерных и научных областях, включая трейдинг. Мы получили её асимптотическую ковариационную матрицу для оценки Хьюбера, а затем и для произвольной M-оценки, что позволяет при известном обновляющем процессе по малому набору данных оценивать дисперсию на «большом» наборе для заданной функции потерь и тем самым значительно упрощать её выбор в прикладных задачах. Ещё один шажок к диссертации 💪. Для цитирования (а что, а вдруг): Горяинов В. Б., Масягин М. М. Вычисление асимптотической ковариационной матрицы оценки Хьюбера в обобщённой экспоненциальной авторегрессионной модели. Вестник МГТУ им. Н. Э. Баумана. Сер. Естественные науки, 2025, № 4 (121), с. 23–39. EDN: QCRHHH. P.S. На фото есть маленькая отсылка к одному из «египетских» постов - кто найдёт, тот молодец 👀 С уважением, Михаил Масягин

«Штормит рынок 🌊 - держи курс! 🧭» А вот и первый апдейт после отпуска! Общаюсь с коллегами-разработчиками из разных компани
«Штормит рынок 🌊 - держи курс! 🧭» А вот и первый апдейт после отпуска! Общаюсь с коллегами-разработчиками из разных компаний - и картина у всех схожая: вакансий всё меньше, собеседования всё жёстче, рынок штормит. Если раньше для Python Senior'а хватало умения написать декоратор с произвольным числом параметров и отличать new от init, то теперь даже на Middle-позицию могут попросить спроектировать Uber, URL-Shortener или даже собственный S3! Но мы с @vova_dev стараемся быть маяком 🗼 в это непростое время 🚀! Стартовал второй поток нашего курса по System Design - https://nevzorov.courses! Я веду часть курса по СУБД и мучаю студентов на мок-интервью 😈 На моих лекциях поговорим о: - индексах и транзакциях; - шардировании и репликации; - кэшах и бэкапах; - CAP, PACELC и почему их никто не понимает (кроме Мартина Клеппманна и конечно же нас с Вовой 😅); - и даже... сделаем RAG и устроим эпичную битву Postgres + PGBouncer vs MS SQL SQLOS! Никакой «воды» - только практика, реальные кейсы и нюансы, которые помогут уверенно пройти System Design Interview и выйти на желаемый оффер. P.S. Курс уже начался, так что это не реклама, а просто рассказ про то, какие мы молодцы 😄 P.P.S. Залететь на курс ещё не поздно 😂 С уважением, Михаил Масягин

«Верность заветам Ильича 🫡» Одно из моих увлечений - история России конца XIX - начала XX веков. Когда погружаешься в её пуч
«Верность заветам Ильича 🫡» Одно из моих увлечений - история России конца XIX - начала XX веков. Когда погружаешься в её пучину, узнаёшь, что Ленин никогда не говорил «религия - ... для народа» или «мы пойдём другим путём», да и многие другие фразы. Но зато в 1899 году, в работе «Попятное направление в русской социал-демократии», он точно писал: «учиться, учиться и учиться». Я решил последовать этому завету Ильича и… поплыл учиться дайвингу! 🤿 Всем рекомендую, это невероятно крутой опыт! Правда, уши потом приходят в себя ещё пару часов ⏰ - но оно того точно стоит. С уважением, Михаил Масягин

«На чилле, на расслабоне 😁» Автор канала временно скрылся в отпуске, но уже с середины сентября (15-20 числа) будет шквал ап
«На чилле, на расслабоне 😁» Автор канала временно скрылся в отпуске, но уже с середины сентября (15-20 числа) будет шквал апдейтов: преподавание, диссертация, гранты и не только 🎉 Курение и употребление алкоголя вредит вашему здоровью! (поэтому оставьте это мне 😉) С уважением, Михаил Масягин

sticker.webp0.19 KB

Что-то мой канал об IT стал превращаться в лайф-стайл... Пора это исправить! Третья лекция! https://www.youtube.com/watch?v=IsdbGojdeK0 Хочу заметить, что на всех известных мне курсах по системному программированию довольно много времени уделяют многопоточной синхронизации, а вот многопроцессную никто не затрагивает. Исправим и это 🤓 На лекции обсудим: - запуск процессов: fork, vfork, spawn; - синхронизацию процессов: - sockets & UNIX-sockets; - pipes & named pipes; - message queues; - shared memory & mmaped-files; - semaphores; - устройство и работу shared memory: - mutex, semaphore, condvar в shared memory; - lock-free & address-free data structures... - поговорим про замечательный фильм «Умница Уилл Хантинг» 😁 GitHub курса: https://github.com/masyagin1998/hp-systems-course Полезные ссылки к лекции: Хорошая история System V & POSIX: https://www.opennet.ru/docs/RUS/os_unix/ man7: https://man7.org/linux/man-pages/man2/mmap.2.html https://man7.org/linux/man-pages/man2/pipe.2.html https://man7.org/linux/man-pages/man3/mkfifo.3.html https://man7.org/linux/man-pages/man3/mq_open.3.html https://man7.org/linux/man-pages/man3/shm_open.3.html https://man7.org/linux/man-pages/man2/futex.2.html https://man7.org/linux/man-pages/man3/sem_open.3.html futex (снова): https://man7.org/linux/man-pages/man2/futex.2.html Как shared memory используют большие дяди: https://www.youtube.com/watch?v=8uAW5FQtcvE P.S. Даже если Вы не системный программист, эти материалы могут быть для Вас очень полезны. Вы узнаете как реально работают под капотом системы, о которых мы так любим говорить на System Design Interview 👍 С уважением, Михаил Масягин

«Ну что, работяги, волки вернулись с охоты!» 🐺 #профсоюзная https://unionconf.ru/ Профсоюзная финишировала - огонь 🔥. Маска
«Ну что, работяги, волки вернулись с охоты!» 🐺 #профсоюзная https://unionconf.ru/ Профсоюзная финишировала - огонь 🔥. Маска волка, купленная в последний момент, отработала на все 100% (ладно, лисы… но какая разница 😅). - Понетворкались с крутыми разработчиками, тимлидами, продактами и архитекторами. - Подебатировали про менторство в IT - раскатали команду противников этого подхода 💪. Правда я сам не фанат этой темы, но уж что попалось на жеребьёвке, то и отстояли 😂 - А дальше - алкокодинг: решали LeetCode на скорость и на количество выпитого 🍺. Антон - топовый спикер и организатор: всё по-взрослому, но при этом весело и драйвово. P.S. На фото - 10 самых огненных людей конфы 🔥. С уважением, Михаил Масягин

Ауф 🐺🐺🐺 С великим и ужасным @M0rtyMerr!!
Ауф 🐺🐺🐺 С великим и ужасным @M0rtyMerr!!

«Ну что, работяги, пора становиться волками!» 🐺 #профсоюзная https://unionconf.ru/ Я редко выбираюсь на конференции, но мимо такого события пройти не смог - IT-конференция Профсоюзная от Антона Назарова и «Осознанной меркантильности». Скажу честно: история с одновременной тайной работой на нескольких работодателей мне не близка. У меня был другой опыт - почти три года я совмещал работу в американско-дубайском стартапе и российском ИБ, причём обе стороны знали друг о друге. Для меня «осознанная меркантильность» — это не про количество работодателей, а про уважение к своему времени, умение считать деньги и трезвый взгляд на профессию и карьеру 🚀. Очень хочу послушать выступления Олега Козырева и Максима Аверина, так как и сам совместно с @voda_dev занимаюсь образованием в сфере IT 📚. Если тоже окажетесь там - пишите, будет классно пересечься 👋 P.S. Говорят, там будет конкурс волчьих костюмов — может, прикупить маску?.. 😅🐺 С уважением, Михаил Масягин

«Если ваши ночные релизы не похожи на это, не зовите меня 😁»
«Если ваши ночные релизы не похожи на это, не зовите меня 😁»

«System Design & Counter Strike» Встретился с ребятами из System Design World — обсудили System Design, рынок IT в РФ в 2025,
«System Design & Counter Strike» Встретился с ребятами из System Design World — обсудили System Design, рынок IT в РФ в 2025, банки, HFT и стартапы. Обменялись мыслями и смешными историями из индустрии 🚀. Для баланса сыграли вместе в VR-версию Counter Strike: я бегал с пулемётом и прикрывал @vova_dev, идущего с дробовиком в атаку на вражеские позиции 🔫! Никогда бы не подумал, что играя в CS можно вспотеть не меньше, чем в тренажёрном зале 😅 С уважением, Михаил Масягин

🧠💡 Транзакция в СУБД. Клеппманн 7 глава. BEGIN! ✔️ Что такое транзакция? ✔️ Составляющие ACID в реальности ✔️ Уровни изоляций в СУБД ✔️ Подробней о Read Commited ✔️ Особенности Репликации в контексте транзакций ✔️ Применение полученных знаний в System Design Интервью и на работе ✔️ Варианты прокачки в СУБД в контексте System Design ✅ COMMIT ⏱ Всё это за насыщенные 55 минут. Автор разбора - Михаил Масягин. Преподаватель System Design Интенсива. 👀 Смотреть - Youtube

Заглянул на огонёк к @vova_dev на канале System Design World! Поговорили о траназакциях, выкинули букву I из ACID и узнали, что REPEATABLE READ в PostgreSQL вовсе и не REPEATABLE READ... 😅 Буду рад вашим просмотрам и комментариям под роликом на YouTube! ❤️ P.S. Дел было ооочень много, но скоро продолжу радовать вас новыми лекциями по системному программированию на своём канале 💪 С уважением, Масягин Михаил

«Курсы & Мерч» Как и положено любому уважающему себя айтишнику, добрую половину моего гардероба составляет «мерч» - худи, фут
«Курсы & Мерч» Как и положено любому уважающему себя айтишнику, добрую половину моего гардероба составляет «мерч» - худи, футболки, кепки, значки. Удобно и практично 😅 Пару дней назад пришли особенно ценные для меня экземпляры - футболка и стикеры курса по System Design от System Design World, где я выступал в роли соавтора: читал лекции по базам данных, делился опытом прохождения System Design Interview и, конечно, отвечал на вопросы. До этого я преподавал только в вузах, а тут - интенсивный практический курс для разработчиков с опытом. Было волнительно, но ни разу не пожалел! 💪 Курс получился живой и интересный: обсуждали как строить RAG'и и DWH, ругали CAP и PACELC, пытались чинить конфликты в multi-master'ах и холиварили на тему того, можно ли всё запихать в Neo4j 😂 Огромное спасибо @vova_dev за доверие и возможность поучаствовать в таком крутом проекте, а участникам - за вопросы и жаркие обсуждения! P.S. Инсайд: второй поток на подходе 👀 С уважением, Михаил Масягин

«FPGA & HFT» Я ни разу не специалист в сфере FPGA, но за последние пару недель несколько подписчиков одновременно спрашивали
«FPGA & HFT» Я ни разу не специалист в сфере FPGA, но за последние пару недель несколько подписчиков одновременно спрашивали меня о том, как FPGA используется в трейдинге. Делюсь с вами тем, что знал и что узнал 😅 FPGA (Field Programmable Gate Array) - это микросхема, в которой вы сами программируете логику на уровне логических блоков и соединений между ними. Если ядро CPU выполняет инструкции последовательно (опуская детали ILP и SIMD), то FPGA сразу раскладывает их в виде аппаратного конвейера, где множество операций идут параллельно, и с минимальными задержками. Безусловно, передача данных между FPGA и CPU вносит дополнительную задержку, но грамотная архитектура с буферизацией, минимизацией пересылаемого объёма данных и zero-copy позволяет сделать оверхед пренебрежимо малым. В HFT (High-Frequency Trading) FPGA чаще применяют для работы с классическими биржами, которые предоставляют коллокацию - размещение ваших торговых серверов в дата-центрах биржи, компактные бинарные протоколы и т.д., нежели с криптобиржами. На них можно эффективно реализовать: - кодирование и декодирование маркет-даты (ITCH, OUCH и прочие бинарные данные); - построение книги заявок; - быстрые проверки лимитов и позиций до отправки заявки; - генерацию несложных торговых сигналов и фильтрацию биржевых шумов; - в отдельных случаях значительную часть торговой логики! И всё это до того, как данные попадут на CPU! К сожалению, есть у такого подхода и ряд существенных недостатков. Ключевые из них: - сложность разработки и отладки, и, как следствие, значительное повышение time-to-market; - проблемы с поиском FPGA-разработчиков - их рынок очень маленький, особенно по сравнению с нами - питонистами 😅; - чрезвычайно (!!!) высокая стоимость FPGA-решений. В комментариях приложены ссылки на статьи по теме и даже... пара русскоязычных вакансий на стыке FPGA и HFT, которые я нашёл ☺️ С уважением, Михаил Масягин

«Экспертные заключения и котики» Мне регулярно приходится получать экспертные заключения на статьи, которые мы публикуем с на
«Экспертные заключения и котики» Мне регулярно приходится получать экспертные заключения на статьи, которые мы публикуем с научным руководителем (Владимир Борисович, здравствуйте! 👋) Обычно на факультете это занимает 2–3 недели. Причём обязательно нужно соединять парные листы канцелярской скрепкой и приклеивать на каждый титульный лист стикер с пояснением, для чего нужен документ. В этот раз у меня были только стикеры с котиками 😺 — и… всё подписали меньше чем за неделю! Похоже, на факультете тоже любят котиков 🐈😻🐈‍⬛️ Своего рода лайф-хак 😁 С уважением, Михаил Масягин P.S. А ведь можно провести A/B-тест, подавая статьи с котиками и без, и сравнивать время их подписания. А потом написать об этом статью и... подать её тоже С КОТИКАМИ! 😺