resume/work/Rambler.rs
1//! 2015-2022 [Rambler&Co](https://rambler.ru) is one of the biggest media holdings in Russia.
2//!
3//! I started work at Rambler as a Middle Python developer in 2015 and ended as Head of Media
4//! Development team in 2022.
5use crate::roles::{Developer, TeamLead};
6use crate::technologies::databases::{Cassandra, ClickHouse, Postgresql, Riak};
7use crate::technologies::frameworks::{Actix, AioHTTP, AsyncIO, Celery, Django, Tokio};
8use crate::technologies::languages::{Erlang, Python, Rust};
9use crate::technologies::messages::GRPC;
10use crate::CleanupDocs;
11
12/// System for collecting and processing media portal’s users such as visit information, unique material, and others.
13///
14/// The media portal using this collected information can set up some access limits.
15/// These restrictions can be overcome by users after successful payment.
16#[derive(CleanupDocs)]
17#[deprecated(since = "2017.1.1", note = "Closed")]
18pub struct Paywall;
19/// Python developer in Paywall
20///
21/// The project uses Riak as the main storage and is based on event architecture built on top of RabbitMQ.
22/// Btw this project uses Cassandra and python 3.5 with asyncio as backend.
23#[allow(clippy::extra_unused_lifetimes)]
24impl<'period, 'f2015, 't2017, Languages> Developer<Languages> for &'period Paywall
25where
26    Languages: Python + Erlang,
27    'period: 'f2015 + 't2017,
28{
29}
30/// Python was a main programming language on this project.
31impl Python for Paywall {}
32/// Main storage.
33impl Riak for Paywall {}
34/// Secondary storage for analytics
35impl Cassandra for Paywall {}
36/// Project was built on top of asyncio.
37impl AsyncIO for Paywall {}
38/// Project was built on top of aiohttp.
39impl AioHTTP for Paywall {}
40
41/// The system allows mobile users to disable advertisements for some small payments.
42#[derive(CleanupDocs)]
43#[deprecated(since = "2017.1.1", note = "Closed")]
44pub struct AdBlock;
45/// This project uses [Paywall] architecture and shares some codebases.
46#[allow(clippy::extra_unused_lifetimes)]
47impl<'period, 'f2016, 't2017, Language> Developer<Language> for &'period AdBlock
48where
49    Language: Python,
50    'period: 'f2016 + 't2017,
51{
52}
53/// Python was a main programming language on this project.
54impl Python for AdBlock {}
55/// Main storage.
56impl Riak for AdBlock {}
57/// Secondary storage.
58impl ClickHouse for AdBlock {}
59
60/// Video recommendation [platform](https://web.archive.org/web/20180119134125/https://video.rambler.ru/).
61#[derive(CleanupDocs)]
62#[deprecated(since = "2018.1.1", note = "Closed")]
63pub struct Video;
64/// Migration to Python 3.6 bugfix and codebase support.
65#[allow(clippy::extra_unused_lifetimes)]
66impl<'period, 'in2017, Language> Developer<Language> for &'period Video
67where
68    Language: Python,
69    'period: 'in2017,
70{
71}
72/// Python was a main programming language on this project.
73impl Python for Video {}
74
75/// One of the biggest [news aggregator and news platform](https://news.rambler.ru) in Russia.
76///
77/// When I started on this project (2017) it was mostly python applications with classical legacy project problems:
78/// * High costs of development and support
79/// * High latency on web components (API and front-end)
80/// * The low actuality of news (mostly by long caching)
81#[derive(CleanupDocs)]
82pub struct News;
83/// Python developer in Rambler News
84///
85/// Infrastructure migration to k8s and refactoring deployment process.
86/// Migration legacy codebase to python 3.
87#[allow(clippy::extra_unused_lifetimes)]
88impl<'period, 'f2017, 't2018, Language> Developer<Language> for &'period News
89where
90    Language: Python,
91    'period: 'f2017 + 't2018,
92{
93}
94/// Head of Media development team.
95///
96/// Since 2018, I have become the head of the development team. With the team, we were able to mostly solve all the problems described:
97/// * We are rewriting all Aggregator parts with actual ML algorithms and technical stack
98/// * Rewrite core API with Rust.
99/// * Rewrite parsing component with Rust
100/// * Remove all caching layers instead of one
101/// * Latency has decreased by about 10 times
102/// * Incidents count has decreased by about 10 times
103/// * Resource costs have decreased by about 20 times
104/// * Re-select and rewrite all DS workers
105///
106///   By the way, the development team's area of responsibility includes such projects as [MediaUp], [Horoscopes], [Weather], and some others.
107#[allow(clippy::extra_unused_lifetimes)]
108impl<'period, 'f2018, 't2022, Team> TeamLead<Team> for &'period News
109where
110    Team: Rust + Python,
111    'period: 'f2018 + 't2022,
112{
113}
114/// Current realisation of the core API rewritten completely in Rust.
115impl Rust for News {}
116/// Project was built on top of Actix actor and web framework.
117impl Actix for News {}
118/// Project was built on top of tokio and Tonic for RPC and Event Sourcing services.
119impl Tokio for News {}
120/// Main language for Rambler/News up to 2020.
121///
122/// DS tasks such as classification, clusterisation and etc. are written in Python with
123/// self-made actor framework built on top of RabbitMQ and Protobuf.
124impl Python for News {}
125/// Main data storage.
126impl Postgresql for News {}
127/// Old DS workers based on Celery and Python 2.
128impl Celery for News {}
129/// RPC implementation based on Tonic for Event Sourcing.
130impl GRPC for News {}
131
132/// [MediaUp](https://play.google.com/store/apps/details?id=ru.rambler.media_app&gl=US) is a news mobile application for Android and iOS based on recommendations and editor’s choices.
133///
134/// With the team, I designed the entire API for the application and the Administrative part (for news editors).
135#[derive(CleanupDocs)]
136pub struct MediaUp;
137/// As a Head of the development team, I chose all technical decisions about application architecture and infrastructure.
138///
139/// Backend architecture closest to News rust core API and had the same technology stack.
140#[allow(clippy::extra_unused_lifetimes)]
141impl<'period, 'f2020, 't2021, Team> TeamLead<Team> for &'period MediaUp
142where
143    Team: Rust,
144    'period: 'f2020 + 't2021,
145{
146}
147/// Rust is a main programming language on this project.
148impl Rust for MediaUp {}
149/// Project was built on top of Actix actor and web framework.
150impl Actix for MediaUp {}
151/// Main data storage.
152impl Postgresql for MediaUp {}
153/// RPC implementation based on Tonic for Event Sourcing.
154impl GRPC for MediaUp {}
155
156/// Rambler&Co service with [esoteric content](http://horoscopes.rambler.ru). (:
157#[derive(CleanupDocs)]
158pub struct Horoscopes;
159#[allow(clippy::extra_unused_lifetimes)]
160impl<'period, 'f2018, 't2022, Team> TeamLead<Team> for &'period Horoscopes
161where
162    Team: Python,
163    'period: 'f2018 + 't2022,
164{
165}
166/// Main data storage.
167impl Postgresql for Horoscopes {}
168/// Project was built on top of Django web framework.
169impl Django for Horoscopes {}
170
171/// Rambler&Co weather [forecast service](https://weather.rambler.ru).
172#[derive(CleanupDocs)]
173pub struct Weather;
174#[allow(clippy::extra_unused_lifetimes)]
175impl<'period, 'f2018, 't2022, Team> TeamLead<Team> for &'period Weather
176where
177    Team: Python,
178    'period: 'f2018 + 't2022,
179{
180}
181/// Main data storage.
182impl Postgresql for Weather {}
183/// Project was built on top of Django web framework.
184impl Django for Weather {}