Ещё про эффективность (и дофамин)
Торговля стала первой отраслью в моей программистской карьере где оказалось возможно хлебать дофамин литрамибез того, чтобы от скуки уходить за ним в соцсети. Очень впечатляет когда для решения внезапно появившейся серьёзной проблемы специалисты из разных команд и ролей мгновенно собираются в ad hoc team, бросая всю более медленную проектную работу которой занимались до этого, и интенсивно решают проблему "здесь и сейчас", не расслабляясь от начала и до конца.
Все имена и события в истории вымышлены, любые совпадения с реальными людьми, живыми или мертвыми, случайны.
Однажды команда, отвечавшая за наблюдения за успешностью быстрых торговых роботов, забила тревогу: с утра они перестали попадать по короткоживущим заявкам с рынка. Мгновенно из повседневной неспешной работы в разных командах выдернули несколько программистов (включая изначальных авторов), которые стали смотреть на трафик и сравнивать его с предыдущими днями в попытке понять, что же случилось.
Оказалось, что биржабез объявления войны поменяла порядок раскладки сообщений по пакетам и те, что раньше приходили в первом пакете и обрабатывались роботами, стали приходить в последующих. Поэтому роботы безнадёжно опаздывали, проигрывая конкурентам. Биржа была в своём праве, поскольку этот порядок не гарантировался спецификацией, а сами сообщения продолжали ей соответствовать.
Ребята отправились в переговорку, захватив старших трейдеров и ещё несколько человек с разными специализациями, где объяснили проблему и предложили несколько решений. Минут за 30 интенсивного обсуждения договорились о том, как чинить, получили добро от юристов, и пара программистов пошла править код. Через пару часов первая версия была готова, проверена на сохранённом трафике и начала пропихиваться по трубопроводам билд-системы в релиз, в то время как программисты дописывали тесты (поймавшие потом пару забытых в горячке пограничных случаев).
Незадолго до конца торгового дня исправленный робот провёл первые сделки, скорость которых была на прежнем уровне, а полностью готовая версия с тестами и исправленными ошибками крутилась в production уже на следующий день. Такая скорость реакции на проблему мне больше нигде не встречалась.
Видели ли вы похожую по насыщенности работу? Дополнительные баллы за примеры не из биржевой торговли.
@engineer10x
Торговля стала первой отраслью в моей программистской карьере где оказалось возможно хлебать дофамин литрами
Однажды команда, отвечавшая за наблюдения за успешностью быстрых торговых роботов, забила тревогу: с утра они перестали попадать по короткоживущим заявкам с рынка. Мгновенно из повседневной неспешной работы в разных командах выдернули несколько программистов (включая изначальных авторов), которые стали смотреть на трафик и сравнивать его с предыдущими днями в попытке понять, что же случилось.
Оказалось, что биржа
Ребята отправились в переговорку, захватив старших трейдеров и ещё несколько человек с разными специализациями, где объяснили проблему и предложили несколько решений. Минут за 30 интенсивного обсуждения договорились о том, как чинить, получили добро от юристов, и пара программистов пошла править код. Через пару часов первая версия была готова, проверена на сохранённом трафике и начала пропихиваться по трубопроводам билд-системы в релиз, в то время как программисты дописывали тесты (поймавшие потом пару забытых в горячке пограничных случаев).
Незадолго до конца торгового дня исправленный робот провёл первые сделки, скорость которых была на прежнем уровне, а полностью готовая версия с тестами и исправленными ошибками крутилась в production уже на следующий день. Такая скорость реакции на проблему мне больше нигде не встречалась.
Видели ли вы похожую по насыщенности работу? Дополнительные баллы за примеры не из биржевой торговли.
@engineer10x
🔥20🤡1
Виталий Шароватов задаётся вопросом кто же такой этот мистический 10x engineer.
https://t.me/vsharovatov/492
В твиттере предлагаются такие примеры. Вам встречались такие? Или, быть может, ещё более впечатляющие?
https://t.me/vsharovatov/492
В твиттере предлагаются такие примеры. Вам встречались такие? Или, быть может, ещё более впечатляющие?
🔥6
Павел Дуров
Очень интересное и насыщенное интервью. Возможно что всё это широко известно, но для меня многое было новым.
- Телеграм пишет и обслуживает ~30 человек 10х инженеров.- Для их найма в компании 0 HR - люди выбираются по результатам соревнований на https://contest.com/
- Компания была и остаётся lean, что делает её похожей на торговые фирмы, торгующие своим капиталом. Причём не только в инженерном смысле, но и вбесполезной регуляторной нагрузке. Но при этом мотивирована не деньгами, как торговцы, а идеалами свободы и беспристрастности, если верить Павлу ;)
- Например, компания не планирует размещаться на бирже - единственный сосредоточенный хозяин позволяет всем участникам кооператива сохранять независимость и концентрироваться на деле вместо ерунды. К тому же, по словам Павла, прежний Твиттер не мог поувольнять -10х инженеров из-за возможного волнения инвесторов ("массовые сокращения == в компании что-то не так").
- (Интересно, что, насколько мне известно, Маск увольнял людей из Твиттера так: всех сотрудников спросили кто в их команде самый лучший. Этих лучших оставили, остальных уволили. Опять-таки, чтобы это сделать, ему пришлось сделать компанию частной и убрать её с биржи).
- Кроме того, юрлицо создано в Дубае, что позволяет минимизировать расходы на интерфейс к государству (налоги/регулирование найма/визы/взаимодействие со спецслужбами). Получается, что Дубай хорош не только для снижения налогов с зарплаты, но и для компаний.
- Для сравнения, приехав в Германию с уже готовой командой, Павел встретился с визовой/трудовой бюрократией (сначала нужно пробовать нанять местных и только если не получится через полгода - можно нанимать своих).
- А в США слишком много внимания со стороны спецслужб (да и пришлось отбивать свой телефон от гопников на улице в Сан-Франциско).
- Лондон и Сингапур тоже почему-то не подошли.
@engineer10x
Очень интересное и насыщенное интервью. Возможно что всё это широко известно, но для меня многое было новым.
- Телеграм пишет и обслуживает ~30 человек 10х инженеров.- Для их найма в компании 0 HR - люди выбираются по результатам соревнований на https://contest.com/
- Компания была и остаётся lean, что делает её похожей на торговые фирмы, торгующие своим капиталом. Причём не только в инженерном смысле, но и в
- Например, компания не планирует размещаться на бирже - единственный сосредоточенный хозяин позволяет всем участникам кооператива сохранять независимость и концентрироваться на деле вместо ерунды. К тому же, по словам Павла, прежний Твиттер не мог поувольнять -10х инженеров из-за возможного волнения инвесторов ("массовые сокращения == в компании что-то не так").
- (Интересно, что, насколько мне известно, Маск увольнял людей из Твиттера так: всех сотрудников спросили кто в их команде самый лучший. Этих лучших оставили, остальных уволили. Опять-таки, чтобы это сделать, ему пришлось сделать компанию частной и убрать её с биржи).
- Кроме того, юрлицо создано в Дубае, что позволяет минимизировать расходы на интерфейс к государству (налоги/регулирование найма/визы/взаимодействие со спецслужбами). Получается, что Дубай хорош не только для снижения налогов с зарплаты, но и для компаний.
- Для сравнения, приехав в Германию с уже готовой командой, Павел встретился с визовой/трудовой бюрократией (сначала нужно пробовать нанять местных и только если не получится через полгода - можно нанимать своих).
- А в США слишком много внимания со стороны спецслужб (да и пришлось отбивать свой телефон от гопников на улице в Сан-Франциско).
- Лондон и Сингапур тоже почему-то не подошли.
@engineer10x
Telegram
Pavel Durov
🐥🐥 The full version of my interview with Tucker is out https://www.youtube.com/watch?v=1Ut6RouSs0w 🎙
👍4❤1🔥1
Как выбрать язык программирования?
Как оценивают какой-то язык когда на нём пишут? Например, "мои программы летают со скоростью света!" или "тяп-ляп и в production за 5 минут!" или "библиотеки всего мира на все случаи жизни под рукой".
Когда выбираешь язык для своего бизнеса количество измерений, над которыми приходится думать, увеличивается.
- Сколько мне нужно будет людей, хорошо знающих этот язык?
- Как легко найти и нанять нужно их количество?
- Сколько людей нужно будет на единицу выхлопа и как её измерить?
- Какие у нас требования и как данный язык помогает достигать их самым простым способом? Или может быть он активно мешает?
- Насколько быстро и легко можно поменять уже написанное?
- Или даже: сколько он жрёт процессорного времени и не станет ли счёт за электричество узким местом?
По каким критериям вы бы выбирали язык(и) программирования для своего проекта?
А для своей фирмы? Особенно если вы вкладываете в неё все накопленные за свою жизнь сбережения...
@engineer10x
Как оценивают какой-то язык когда на нём пишут? Например, "мои программы летают со скоростью света!" или "тяп-ляп и в production за 5 минут!" или "библиотеки всего мира на все случаи жизни под рукой".
Когда выбираешь язык для своего бизнеса количество измерений, над которыми приходится думать, увеличивается.
- Сколько мне нужно будет людей, хорошо знающих этот язык?
- Как легко найти и нанять нужно их количество?
- Сколько людей нужно будет на единицу выхлопа и как её измерить?
- Какие у нас требования и как данный язык помогает достигать их самым простым способом? Или может быть он активно мешает?
- Насколько быстро и легко можно поменять уже написанное?
- Или даже: сколько он жрёт процессорного времени и не станет ли счёт за электричество узким местом?
По каким критериям вы бы выбирали язык(и) программирования для своего проекта?
А для своей фирмы? Особенно если вы вкладываете в неё все накопленные за свою жизнь сбережения...
@engineer10x
👏5
В продолжение вчерашнего
Пересмотрел лекцию Yaron Minsky, в незапамятные времена пересадившего с VBA(!) на OCaml Jane Street - единственную в своём роде HFT-фирму, пишущую почти всё на OCaml. Хотя лекции уже 8 лет, она не потеряла своей свежести.
В то время Jane Street - это 35 пишущих код инженеров, 190 человек всего, 4 офиса в мире, оборот 48 млрд долларов в день(!) на одних только американских биржах.
Требования Jane Street:
- Высокие требования к корректности и качеству (иначе можно потерять гигабаксы в микросекунду).
- Крайне важна скорость и лёгкость переписывания кода/итераций из-за высокого уровень неопределённости и быстро меняющихся внешних (биржи/регуляторы) и внутренних (стратегии) требований.
- Уверенность в сохраняющейся корректности на протяжении всего процесса независимо от высоких скорости и масштабов изменений.
- Обрабатывается огромный объём данных, для этого нужно много инфраструктуры и железа. Железо не дешёвое, а управление железом забирает внимание у людей, которые могли бы наносить непоправимую пользу где-то ещё. Поэтому программы должны летать.
- Лёгкость чтения кода - сами основатели фирмы читали и одобряли каждую строчку нового кода.
Как OCaml позволяет им проще достигать этих целей:
- Лаконичный. Boilerplate (есть хороший термин на русском? "строительные леса"?) забирает большое количество умственных ресурсов и снижает эффективность review. Одно время думали переезжать на C# и отказались - слишком многословный и (внезапно) читая код сложно представить как сработает ООП.Это он ещё своими впечатлениями от Java не поделился.
- Хорошо работает с алгебраическими типами данных - тип-произведение (
- Гораздо более высокое качество инженеров, если они смогли осилить OCaml.
- Хотя их меньше на рынке, чем специалистов по другим языкам, нанимать их - сплошное удовольствие: например, на первое письмо в список рассылки по OCaml - 15 ответов - 12 телефонных собеседований - 5 приглашний в офис - 3 наняли. Очень эффективная воронка.
@engineer10x
P.S. Это не то, чтобы реклама OCaml, или даже Jane Street :). Просто применение такого высокого уровня абстракции ("функан от программирования") на практике да ещё и так эффективно - завораживает.
Пересмотрел лекцию Yaron Minsky, в незапамятные времена пересадившего с VBA(!) на OCaml Jane Street - единственную в своём роде HFT-фирму, пишущую почти всё на OCaml. Хотя лекции уже 8 лет, она не потеряла своей свежести.
В то время Jane Street - это 35 пишущих код инженеров, 190 человек всего, 4 офиса в мире, оборот 48 млрд долларов в день(!) на одних только американских биржах.
Требования Jane Street:
- Высокие требования к корректности и качеству (иначе можно потерять гигабаксы в микросекунду).
- Крайне важна скорость и лёгкость переписывания кода/итераций из-за высокого уровень неопределённости и быстро меняющихся внешних (биржи/регуляторы) и внутренних (стратегии) требований.
- Уверенность в сохраняющейся корректности на протяжении всего процесса независимо от высоких скорости и масштабов изменений.
- Обрабатывается огромный объём данных, для этого нужно много инфраструктуры и железа. Железо не дешёвое, а управление железом забирает внимание у людей, которые могли бы наносить непоправимую пользу где-то ещё. Поэтому программы должны летать.
- Лёгкость чтения кода - сами основатели фирмы читали и одобряли каждую строчку нового кода.
Как OCaml позволяет им проще достигать этих целей:
- Лаконичный. Boilerplate (есть хороший термин на русском? "строительные леса"?) забирает большое количество умственных ресурсов и снижает эффективность review. Одно время думали переезжать на C# и отказались - слишком многословный и (внезапно) читая код сложно представить как сработает ООП.
- Хорошо работает с алгебраическими типами данных - тип-произведение (
struct) и тип-сумма (union) и pattern matching на последних (à la switch - case - default) гарантирует, что переберёт все возможные варианты, что снижает ошибки при изменениях и повышает уверенность в качестве.- Гораздо более высокое качество инженеров, если они смогли осилить OCaml.
- Хотя их меньше на рынке, чем специалистов по другим языкам, нанимать их - сплошное удовольствие: например, на первое письмо в список рассылки по OCaml - 15 ответов - 12 телефонных собеседований - 5 приглашний в офис - 3 наняли. Очень эффективная воронка.
@engineer10x
P.S. Это не то, чтобы реклама OCaml, или даже Jane Street :). Просто применение такого высокого уровня абстракции ("функан от программирования") на практике да ещё и так эффективно - завораживает.
YouTube
Caml Trading
A talk given at CMU about the history of Jane Street's adoption of OCaml, and how that ties into the nature of the work that a company like Jane Street does. The talk includes a discussion of the economic role that a proprietary trading firm like Jane Street…
🔥4👍1
ChatGPT для работы
Сначала, в незапамятные времена, к библиотекам прикладывали мегабайты документации по каждому классу/функции. Чтобы понять как с помощью этой библиотеки решить конкретную задачу нужно было изучить много отдельных функций и приобрести кругозор, чтобы знать где искать (либо спросить у старших товарищей, у которых тоже был встроенный rate limiter). Либо могло повезти и документация содержала хорошие примеры типа "как построить такое-то приложение", но обычно примеров было меньше процентов пяти.
Потом развился поиск, документацию стало можно найти в интернете, но принцип её организации особо не поменялся.
Потом появился stackoverflow.com, где можно было наконец описать свою задачу и спросить как наиболее красиво и правильно её решить и с помощью каких библиотек. Нередко ведущие мировые эксперты начинали тебе отвечатьчерез наносекунду . Поиск стал выдавать ответы со stackoverflow на первых страницах и жить стало существенно удобнее.
Теперь, когда появились LLM, можно попросить ChatGPT (или его конкурента) прямо написать затравку какой-то программы, включая обвязку и boilerplate для тестов, на ходу меняя используемые библиотеки.
Кроме этого, ChatGPT разбирал для меня сообщения из разных протоколрв и описывал их составные части. Или реализовывал стандартную агрегатную функцию из базы данных на С++. Однако мне кажется, что я не использую его и на 5% возможностей. Поделитесь как LLM помогает вам увеличивать свою эффективность в программировании и вообще?
@engineer10x
Сначала, в незапамятные времена, к библиотекам прикладывали мегабайты документации по каждому классу/функции. Чтобы понять как с помощью этой библиотеки решить конкретную задачу нужно было изучить много отдельных функций и приобрести кругозор, чтобы знать где искать (либо спросить у старших товарищей, у которых тоже был встроенный rate limiter). Либо могло повезти и документация содержала хорошие примеры типа "как построить такое-то приложение", но обычно примеров было меньше процентов пяти.
Потом развился поиск, документацию стало можно найти в интернете, но принцип её организации особо не поменялся.
Потом появился stackoverflow.com, где можно было наконец описать свою задачу и спросить как наиболее красиво и правильно её решить и с помощью каких библиотек. Нередко ведущие мировые эксперты начинали тебе отвечать
Теперь, когда появились LLM, можно попросить ChatGPT (или его конкурента) прямо написать затравку какой-то программы, включая обвязку и boilerplate для тестов, на ходу меняя используемые библиотеки.
Кроме этого, ChatGPT разбирал для меня сообщения из разных протоколрв и описывал их составные части. Или реализовывал стандартную агрегатную функцию из базы данных на С++. Однако мне кажется, что я не использую его и на 5% возможностей. Поделитесь как LLM помогает вам увеличивать свою эффективность в программировании и вообще?
@engineer10x
👍3❤1👎1
Что пишут программисты определяется потребностями заказчиков. В продуктовых компаниях их роль выполняют Product Managers. Они должны узнать, что хочет клиент (или убедить клиента, что он хочет именно это) и нацелить программистов (и остальных) на решение этой задачи. PM являются олицетворением заказчика внутри компании, но между исполнителем и реальным клиентом получается достаточно много шагов.
В торговых фирмах заказчики гораздо ближе, как правило это трейдеры, сидящие с программистом за соседним столом. Они точно знают чего хотят и испорченный телефон между реальным клиентом и исполнителем сведён к минимуму. Поэтому роли Product Manager нет, а её задачи делятся между трейдером и программистом (который, как уже обсуждалось выше, человек-оркестр, то есть в том числе и product manager, project manager, SRE и много кто ещё). Обычно трейдер говорит куда хочет прийти, программист по существующему коду предлагает несколько разных путей как туда прийти с разной стоимостью, оба пытаются выбрать минимальную. Дальше выбранный путь радикально очищается от лишнего/не самого срочного и разбивается на кусочки, каждый из которых, в идеале, будет нести самостоятельную ценность.
Трейдеры как никто понимают высокую стоимость времени программиста и часто говорят "нуууу, это development work, давайте попробуем найти какой-нибудь другой способ покрутить систему за ручки так, чтобы получить то, что нам надо?".
Успешные торговые компании стараются решительно отбрасывать 90%+ непрофильной работы (типа "мы не в бизнесе по прозводству build-систем!") и стоять на плечах гигантов - брать готовые библиотеки/решения у FAANG-а и прочих, а также делегировать непрофильное (но нужное) внешним консультантам за фиксированную плату. Свои программисты должны работать только над задачами, которые являются конкурентным преимуществом фирмы.
(Теперь с такой профессиональной деформацией плохо понимаю как можно эффективно работать настоящим Product Manager, которому надо вытаскивать из пользователей что они хотят, особенно если они из ширнармасс. Преклоняюсь перед теми, кто может, поэтому что это непросто. Меня как пользователя например никогда заранее не спрашивали как я отнесусь к радикальным изменениям, причём как правило они меняют продукт в худшую сторону :) ).
@engineer10x
В торговых фирмах заказчики гораздо ближе, как правило это трейдеры, сидящие с программистом за соседним столом. Они точно знают чего хотят и испорченный телефон между реальным клиентом и исполнителем сведён к минимуму. Поэтому роли Product Manager нет, а её задачи делятся между трейдером и программистом (который, как уже обсуждалось выше, человек-оркестр, то есть в том числе и product manager, project manager, SRE и много кто ещё). Обычно трейдер говорит куда хочет прийти, программист по существующему коду предлагает несколько разных путей как туда прийти с разной стоимостью, оба пытаются выбрать минимальную. Дальше выбранный путь радикально очищается от лишнего/не самого срочного и разбивается на кусочки, каждый из которых, в идеале, будет нести самостоятельную ценность.
Трейдеры как никто понимают высокую стоимость времени программиста и часто говорят "нуууу, это development work, давайте попробуем найти какой-нибудь другой способ покрутить систему за ручки так, чтобы получить то, что нам надо?".
Успешные торговые компании стараются решительно отбрасывать 90%+ непрофильной работы (типа "мы не в бизнесе по прозводству build-систем!") и стоять на плечах гигантов - брать готовые библиотеки/решения у FAANG-а и прочих, а также делегировать непрофильное (но нужное) внешним консультантам за фиксированную плату. Свои программисты должны работать только над задачами, которые являются конкурентным преимуществом фирмы.
(Теперь с такой профессиональной деформацией плохо понимаю как можно эффективно работать настоящим Product Manager, которому надо вытаскивать из пользователей что они хотят, особенно если они из ширнармасс. Преклоняюсь перед теми, кто может, поэтому что это непросто. Меня как пользователя например никогда заранее не спрашивали как я отнесусь к радикальным изменениям, причём как правило они меняют продукт в худшую сторону :) ).
@engineer10x
Telegram
On the way to 10x engineering
В торговле большое значение имеет не только (и возможно даже не столько) то, что знает человек, но и то как он работает. В отличие от других отраслей, в торговле за счёт высокой прибыли-на-человека то, как ты работаешь, может иметь большое и видимое влияние…
👍8
Кажется у Маска работают примерно как в торговле, только с железом (что сложнее):
https://twitter.com/AlecStapp/status/1798880702080950569
https://www.danschulz.co/p/eli-dourado
@engineer10x
It depends on what you want to count as a tech breakthrough because I think there is significant learning by doing. This is an important point is that a lot of the progress is made outside of the science lab, but it's still an innovation, it's still an idea, and it comes from deploying, having contact with the real world, seeing what goes wrong, iterating. If you think about why SpaceX and Boeing have such divergent paths. Well, Boeing just designs the product. Whether it's a rocket or capsule or an airplane, they design the product end-to-end and then build it and then fly it and expect it to work flawlessly, whereas SpaceX is, "Well, we're going to build this half-baked version. We're going to fly it. We're going to see where the weak points are, why it blows up. Then we're going to figure out what the problems are and address those in the next iteration."
Iteration speed is so important for development. I don't know if you count that as pure ideas or pure deployment, but it seems really important as attested by the fact that SpaceX has a higher valuation than Boeing's market cap with 1/10 of the employees.
https://twitter.com/AlecStapp/status/1798880702080950569
https://www.danschulz.co/p/eli-dourado
@engineer10x
👍4🔥1🤔1
On the way to 10x engineering
ChatGPT для работы Сначала, в незапамятные времена, к библиотекам прикладывали мегабайты документации по каждому классу/функции. Чтобы понять как с помощью этой библиотеки решить конкретную задачу нужно было изучить много отдельных функций и приобрести кругозор…
Кирилик задаёт тот же вопрос про chat gpt и собирает в коментах множество примеров, некоторые из них - просто 🔥
https://t.me/kyrillic/758
https://t.me/kyrillic/758
Telegram
kyrillic
Как часто вы пользуетесь ChatGPT или похожими инструментами?
Ежедневно / Несколько раз в неделю / Несколько раз в месяц / Попробовал(а), но не нашлось применения / Не пробовал(а) / Другое / посмотреть результаты
Ежедневно / Несколько раз в неделю / Несколько раз в месяц / Попробовал(а), но не нашлось применения / Не пробовал(а) / Другое / посмотреть результаты
🔥2
Торговля - достаточно узкая отрасль и про её техническую сторону не так много можно прочитать в сети. Тем ценнее реальная информация от тех, кто работает в индустрии.
@hft_dev публикует подборки литературы и программистские трюки, полезные в торговле, и рассказывает как зайти в HFT.
Всячески рекомендую подписаться если интересуетесь этой темой.
@engineer10x
@hft_dev публикует подборки литературы и программистские трюки, полезные в торговле, и рассказывает как зайти в HFT.
Всячески рекомендую подписаться если интересуетесь этой темой.
@engineer10x
🔥5😁3✍1
Test driven development
На просторах телеграма встретилось мнение:
в связи с чем вопрос - вы пользуетесь TDD, пишете тесты? или это "мешает вовремя выкатывать задачи"?
@engineer10x
На просторах телеграма встретилось мнение:
для TDD нужен серьезный уровень экспертности, иначе человеком это воспринимается как «это все пустая трата времени»
в связи с чем вопрос - вы пользуетесь TDD, пишете тесты? или это "мешает вовремя выкатывать задачи"?
@engineer10x
Как дела с тестами в ваших проектах?
Anonymous Poll
13%
Посмотреть результаты
13%
Полный TDD - сначала тесты, потом реализация
47%
Иногда пишем, иногда нет
9%
Какие-то команды пишут тесты, какие-то нет
5%
Тесты только замедляют разработку и увеличивают сроки, зачем они вообще нужны?
13%
Тесты? Что это?
🤔2
Писать роботов для алгоримической торговли без тестов невозможно - при некорректной работе системы она будет спускать большое количество денег за очень короткое время (см. например историю Knight Capital), поэтому к тестам относятся совсем по другому чем например в играх (где ошибки часто приводят только лишь к забавным глюкам типа прохождения сквозь стены).
Тесты:
• выпрямляют дизайн, заставляя автора разбивать программу на компоненты и устанавливать между ними явные зависимости. При этом становится понятно неудобство неявных зависимостей между компонентами (вроде Singleton или глобальных переменных).
• обеспечивают качество нового кода, если в каждом комите новую функциональность одним концом втыкать в саму систему, а другим - в тесты. Это настолько входит в привычку, что я даже на домашних заданиях для собеседований или при live coding пишу решения начиная с тестов.
• помогают быстро проверить гипотезу о причине проблем в production. Если из чтения логов после возникновения проблемы появляется предположение о том, что определённое сочетание условий приводит к неправильному поведению компонента, то при наличии тестовой инфраструктуры их можно быстро закодировать в виде теста. Если он падает, то предположение верно и надо чинить код, если не падает - продолжаем искать в логах другие причины проблем.
• помогают уберечься от повторения однажды случившегося бага. Если падающий тест показал проблему в компоненте, то после починки последнего этот тест будет мешать другим программистам вернуть баг обратно.
• (главное) при последовательном применении по всем исходникам дают уверенность в качестве и дают возможность итерировать очень быстро, позволяя накатывать новые версии в прод каждый день. Это важно, ведь конкуренты не дремлют и делают то же самое :)
@engineer10x
Тесты:
• выпрямляют дизайн, заставляя автора разбивать программу на компоненты и устанавливать между ними явные зависимости. При этом становится понятно неудобство неявных зависимостей между компонентами (вроде Singleton или глобальных переменных).
• обеспечивают качество нового кода, если в каждом комите новую функциональность одним концом втыкать в саму систему, а другим - в тесты. Это настолько входит в привычку, что я даже на домашних заданиях для собеседований или при live coding пишу решения начиная с тестов.
• помогают быстро проверить гипотезу о причине проблем в production. Если из чтения логов после возникновения проблемы появляется предположение о том, что определённое сочетание условий приводит к неправильному поведению компонента, то при наличии тестовой инфраструктуры их можно быстро закодировать в виде теста. Если он падает, то предположение верно и надо чинить код, если не падает - продолжаем искать в логах другие причины проблем.
• помогают уберечься от повторения однажды случившегося бага. Если падающий тест показал проблему в компоненте, то после починки последнего этот тест будет мешать другим программистам вернуть баг обратно.
• (главное) при последовательном применении по всем исходникам дают уверенность в качестве и дают возможность итерировать очень быстро, позволяя накатывать новые версии в прод каждый день. Это важно, ведь конкуренты не дремлют и делают то же самое :)
@engineer10x
Henricodolfing
Case Study 4: The $440 Million Software Error at Knight Capital
Knight Capital Group was an American global financial services firm engaging in market making, electronic execution, and institutional sal...
👍12
Dependency injection
Продолжаем разговор.
Если представить систему в виде графа компонентов ("чёрных ящиков" с состоянием, преобразующих сигнал со входа/входов на выход(ы)), вывернуть зависимости компонентов "наизнанку" и передать в каждый компонент ссылку на интерфейс, описывающий его выходы, то появляется возможность подсоединить наш компонент к боевой реализации в основной сборке, а в тестах - к тестовой. Тогда можно написать тесты, которые зафиксируют требования к преобразованию компонентом входных сигналов в выходные. По выходным сигналам можно будет опосредованно наблюдать как меняется состояние компонента.
Последовательно применяя этот подход ко всем компонентам системы можно существенно увеличить уверенность в правильности её работы.
На практике (C++ с gtest/gmock) это выглядит примерно так:
Тесты:
Production:
Если хочется немного ускорить, то можно заменить (небесплатные) виртуальные функции на zero cost dependency injection на шаблонах.Оставим реализацию этого подхода в качестве упражнения для заинтересованного читателя. Если эта тема интересна читателям (скажем этот если пост наберёт в ближайший месяц 1000 просмотров), то напишу пример.
@engineer10x
Продолжаем разговор.
Если представить систему в виде графа компонентов ("чёрных ящиков" с состоянием, преобразующих сигнал со входа/входов на выход(ы)), вывернуть зависимости компонентов "наизнанку" и передать в каждый компонент ссылку на интерфейс, описывающий его выходы, то появляется возможность подсоединить наш компонент к боевой реализации в основной сборке, а в тестах - к тестовой. Тогда можно написать тесты, которые зафиксируют требования к преобразованию компонентом входных сигналов в выходные. По выходным сигналам можно будет опосредованно наблюдать как меняется состояние компонента.
Последовательно применяя этот подход ко всем компонентам системы можно существенно увеличить уверенность в правильности её работы.
На практике (C++ с gtest/gmock) это выглядит примерно так:
// interface.h
#pragma once
struct Interface {
struct Arg {
// ...
};
virtual void call(const Arg&) = 0;
virtual ~Interface() = default;
};
// component.h
#pragma once
#include "interface.h"
class Component {
struct State {
// ...
};
Interface &output;
State state{};
public:
explicit Component(Interface& output_)
: output{output_}
{}
struct Input {
// ...
};
void input(const Input& input) {
auto out_args = combine_input_and_state(input);
output.call(out_args);
update_state_based_on_input(input);
}
private:
Interface::Arg combine_input_and_state(const Input& input)
{
// ...
return {};
}
void update_state_based_on_input(const Input&)
{
// ...
}
};
Тесты:
// test.cpp
#include "component.h"
#include <gmock/gmock.h>
#include <gtest/gtest.h>
struct Mock : Interface {
MOCK_METHOD(void, call, (const Interface::Arg&), (override));
};
struct InputOutputTest : ::testing::Test
{
Mock output;
Component tested{output};
};
TEST_F(InputOutputTest, Test)
{
using namespace ::testing;
auto input = Component::Input{};
EXPECT_CALL(output, call(_ /* IsExpectedOutputForThisInput */));
tested.input(input);
}
Production:
// production.h
#pragma once
#include "interface.h"
struct Production : Interface {
void call(const Arg&) override
{
// ...
}
~Production() override = default;
};
//main.cpp
#include "production.h"
#include "component.h"
int main()
{
// build the graph
Production p;
Component c{p};
// start the graph
// ...
return 0u;
}
Если хочется немного ускорить, то можно заменить (небесплатные) виртуальные функции на zero cost dependency injection на шаблонах.
@engineer10x
Telegram
On the way to 10x engineering
Писать роботов для алгоримической торговли без тестов невозможно - при некорректной работе системы она будет спускать большое количество денег за очень короткое время (см. например историю Knight Capital), поэтому к тестам относятся совсем по другому чем…
👍10❤🔥4❤3
О подходах к работе и бизнес-моделях в торговле
Хозяин одной из успешных крупных американских торговых фирм создаёт и нагружает команды так, чтобы у них было значительно больше работы, чем ресурсов, а также чтобы ответственность пересекались с другими командами (для развития беспощадной конкуренции).
Для каждой создаваемой бизнес-единицы с самого начала вычисляется стоимость её мгновенного закрытия (например, досрочный разрыв контракта на офис, выплаты выходного пособия всем сотрудникам при увольнении и т. д.). Эта цифра постоянно ревностно обновляется, а хозяин всё время сравнивает её с доходами от подразделения.
Выжившие зарабатывают очень хорошо, но риск того, что могут разогнать, всегда присутствует на фоне и атмосфера бывает так себе.
@engineer10x
Хозяин одной из успешных крупных американских торговых фирм создаёт и нагружает команды так, чтобы у них было значительно больше работы, чем ресурсов, а также чтобы ответственность пересекались с другими командами (для развития беспощадной конкуренции).
Для каждой создаваемой бизнес-единицы с самого начала вычисляется стоимость её мгновенного закрытия (например, досрочный разрыв контракта на офис, выплаты выходного пособия всем сотрудникам при увольнении и т. д.). Эта цифра постоянно ревностно обновляется, а хозяин всё время сравнивает её с доходами от подразделения.
Выжившие зарабатывают очень хорошо, но риск того, что могут разогнать, всегда присутствует на фоне и атмосфера бывает так себе.
@engineer10x
😢11🔥2
So You Think You Know Git
Ютуб подкинул шедевр, не могу не поделиться. Узнал новое - из того, что забрал себе:
как
запомнить как разрешили merge conflict и всегда применять этот способ при повторении этого конфликта
сортировать ветки в выводе команды
добавить в crontab регулярную подчистку репозитория, чтобы он работал быстрее
ускорять
Какие у вас самые полезные настройки гита?
@engineer10x
Ютуб подкинул шедевр, не могу не поделиться. Узнал новое - из того, что забрал себе:
git push --force-with-lease
как
git --force, но только если никто не успел закомитить в ветку поверх твоего последнего измененияgit config --global rerere.enabled true
запомнить как разрешили merge conflict и всегда применять этот способ при повторении этого конфликта
git config --global branch.sort -committerdate
сортировать ветки в выводе команды
git branch по времени изменений в нихgit maintenance start
добавить в crontab регулярную подчистку репозитория, чтобы он работал быстрее
git config --global fetch.writeCommitGraph true
ускорять
git log --graph за счёт кеширования графа на каждом fetchКакие у вас самые полезные настройки гита?
@engineer10x
YouTube
So You Think You Know Git - FOSDEM 2024
Scott Chacon's FOSDEM 2024 talk on Git Tips and Tricks and why he's working on GitButler now (https://gitbutler.com)
Scott talks about:
00:00 - Introduction
01:06 - About Me (well, Scott Chacon)
02:36 - How Well Do You Know Git?
05:09 - Our Agenda
06:25…
Scott talks about:
00:00 - Introduction
01:06 - About Me (well, Scott Chacon)
02:36 - How Well Do You Know Git?
05:09 - Our Agenda
06:25…
👍9🔥4
Синхронизация потоков
При обсуждении многопоточности в первую очередь говорят про синхронизацию доступа к общей памяти из разных потоков через mutex или аналогичный синхронизационный примитив. Однако одновременный доступ из нескольких потоков к одному и тому же участку памяти не так уж прост. Как учит нас MIT, у него немало подводных камней и редко проявляющихся багов, его сложно организовать и тестировать, как правило он плохо влияет на дизайн, и так далее.
Другой способ, лишённый этих недостатков, это общение потоков через сообщения. В таком случае потоки общаются друг с другом явно через очереди (вместо неявного общения через изменение общих данных). Использование явной зависимости выпрямляет дизайн, делает код тестируемым и по-сути однопоточным.(Кстати, реализовать эти очереди можно и на мьютексах с условными переменными, главное, чтобы они не вытарчивали наружу) .
При этом явными очередями можно не только улучшить дизайн, но и скорость, если реализовать их на неблокируемых инструкциях процессора вместо мьютексов. Классический пример такой реализации - это LMAX disruptor.
В этом подходе обмен сообщениями между потоками (одним писателем и множеством читателей) организован через кольцевой буфер, находящийся в общей памяти. Писатель записывает новое сообщение в буфер по индексу записи и сдвигает его на единичку через инструкцию процессора с префиксом lock, а читатели всё время проверяют не поменялся ли индекс записи и читают значение по этому индексу, если это произошло.
При таком подходе нет столпотворения читателей, пытающихся взять mutex или rwlock, им не нужно уходить спать в ядро, ожидая его освобождения, а latency может приближаться к пределу, ограниченному только скоростью синхронизации кешей между ядрами, особенно если удастся упаковать свои данные в L1 cache, как рекомендовалось выше.
@engineer10x
При обсуждении многопоточности в первую очередь говорят про синхронизацию доступа к общей памяти из разных потоков через mutex или аналогичный синхронизационный примитив. Однако одновременный доступ из нескольких потоков к одному и тому же участку памяти не так уж прост. Как учит нас MIT, у него немало подводных камней и редко проявляющихся багов, его сложно организовать и тестировать, как правило он плохо влияет на дизайн, и так далее.
Другой способ, лишённый этих недостатков, это общение потоков через сообщения. В таком случае потоки общаются друг с другом явно через очереди (вместо неявного общения через изменение общих данных). Использование явной зависимости выпрямляет дизайн, делает код тестируемым и по-сути однопоточным.
При этом явными очередями можно не только улучшить дизайн, но и скорость, если реализовать их на неблокируемых инструкциях процессора вместо мьютексов. Классический пример такой реализации - это LMAX disruptor.
В этом подходе обмен сообщениями между потоками (одним писателем и множеством читателей) организован через кольцевой буфер, находящийся в общей памяти. Писатель записывает новое сообщение в буфер по индексу записи и сдвигает его на единичку через инструкцию процессора с префиксом lock, а читатели всё время проверяют не поменялся ли индекс записи и читают значение по этому индексу, если это произошло.
При таком подходе нет столпотворения читателей, пытающихся взять mutex или rwlock, им не нужно уходить спать в ядро, ожидая его освобождения, а latency может приближаться к пределу, ограниченному только скоростью синхронизации кешей между ядрами, особенно если удастся упаковать свои данные в L1 cache, как рекомендовалось выше.
@engineer10x
🔥16👍2
300
Тем временем эти скромные измышления читают уже более 300 человек. Спасибо!
Расскажите немного о том, какие темы вам показались интересными, о чём хотелось бы узнать подробнее, из какой вы индустрии, чем занимаетесь сейчас и куда хотели бы двигаться дальше?
@engineer10x
Тем временем эти скромные измышления читают уже более 300 человек. Спасибо!
Расскажите немного о том, какие темы вам показались интересными, о чём хотелось бы узнать подробнее, из какой вы индустрии, чем занимаетесь сейчас и куда хотели бы двигаться дальше?
@engineer10x
❤8🎉1
On the way to 10x engineering
О подходах к работе и бизнес-моделях в торговле Хозяин одной из успешных крупных американских торговых фирм создаёт и нагружает команды так, чтобы у них было значительно больше работы, чем ресурсов, а также чтобы ответственность пересекались с другими командами…
Ещё о бизнес-моделях
Одна успешная фирма постоянно подчёркивает свою продвинутую инженерную культуру.
Однако не меньше половины бизнеса это не торговля, а маркетинг, нацеленный на заманивание 1% лучших выпускников, и небольшого количества опытных.
Дальше их всячески выжимают и с ранних пор начинают придираться на performance review так, что на 100% без придирок пройти его практически невозможно. Человек начинает работать всё более интенсивно, но процентов 95 не смогут исправить все придирки и окажутся за бортом в среднем в течение пары лет. (Кстати, чтобы это понять заранее, полезно почитать отзывы на Glassdoor, начиная с самых плохих).
Основа устойчивости инженерной команды - небольшое количество teamleads, которые очень хорошо представляют себе, что и где живёт в исходниках, потому что участвуют почти во всех code reviews. Они задерживаются в фирме надолго и их труд оплачивается очень хорошо.
Тем не менее, несмотря на большую вероятность покинуть компанию за пару лет, это очень хорошая инженерная школа и даже за это время там можно набраться уму-разуму и всяческих премудростей.
@engineer10x
Одна успешная фирма постоянно подчёркивает свою продвинутую инженерную культуру.
Однако не меньше половины бизнеса это не торговля, а маркетинг, нацеленный на заманивание 1% лучших выпускников, и небольшого количества опытных.
Дальше их всячески выжимают и с ранних пор начинают придираться на performance review так, что на 100% без придирок пройти его практически невозможно. Человек начинает работать всё более интенсивно, но процентов 95 не смогут исправить все придирки и окажутся за бортом в среднем в течение пары лет. (Кстати, чтобы это понять заранее, полезно почитать отзывы на Glassdoor, начиная с самых плохих).
Основа устойчивости инженерной команды - небольшое количество teamleads, которые очень хорошо представляют себе, что и где живёт в исходниках, потому что участвуют почти во всех code reviews. Они задерживаются в фирме надолго и их труд оплачивается очень хорошо.
Тем не менее, несмотря на большую вероятность покинуть компанию за пару лет, это очень хорошая инженерная школа и даже за это время там можно набраться уму-разуму и всяческих премудростей.
@engineer10x
👍6👎4✍1
Как вы думаете - сколько в мире технических специалистов в торговле?
Final Results
3%
1к
6%
5к
17%
10к
9%
20к
18%
50к
18%
100к
6%
200к
7%
500к
16%
1м