Владимир Олохтонов о работе старшего разработчика в Авито

👨‍💻 Герой: Вла­ди­мир Олох­то­нов, 29 лет, Москва. Выпуск­ник Шко­лы ана­ли­за дан­ных Яндек­са

🛠 Рабо­та: Стар­ший раз­ра­бот­чик в Ави­то. Рабо­та­ет в офи­се, 5/2. Обыч­но начи­на­ет в 12:00, закан­чи­ва­ет в 20:00

🧭 Рынок: Инже­нер машин­но­го обу­че­ния в Москве: 55 вакан­сий

Из монтажника интернет-сетей в сисадмины

Первый опыт

Мой отец трид­цать лет зани­ма­ет­ся про­грам­ми­ро­ва­ни­ем, поэто­му ещё с дет­ства я знал, что такое код и зачем его созда­вать. Одна­ко дол­го эта тема меня не инте­ре­со­ва­ла, и до армии я умел все­го две вещи: я мог собрать ком­пью­тер и пере­уста­но­вить вин­ду — это про­стые при­клад­ные навы­ки, за кото­рые мало кто из рабо­то­да­те­лей готов пла­тить.

После армии я про­чёл кни­гу «Локаль­ные сети. Модер­ни­за­ция и поиск неис­прав­но­стей» и устро­ил­ся мон­таж­ни­ком интернет-сетей в груп­пу ком­па­ний «Филан­ко». Я отве­чал за то, что­бы у людей был интер­нет: про­тя­ги­вал кабель в квар­ти­ры новых або­нен­тов, под­клю­чал ком­пью­те­ры к сети, ремон­ти­ро­вал сете­вые узлы и уста­нав­ли­вал ком­му­та­ци­он­ное обо­ру­до­ва­ние — то есть я зани­мал­ся рути­ной, кото­рую мож­но дове­рить нович­ку.


После армии: читаю про локаль­ные сети и готов­люсь к пер­во­му собе­се­до­ва­нию

Поми­мо мон­таж­ни­ков в ком­па­нии рабо­та­ли систем­ные адми­ни­стра­то­ры NOC-центра — это сотруд­ни­ки, кото­рые отве­ча­ют за рабо­ту сети. Обыч­но к ним обра­ща­ют­ся тогда, когда что-то пере­ста­ёт рабо­тать и нуж­но всё попра­вить. NOC, или network operations center, — центр управ­ле­ния сетью.

И вот пред­ставь­те: я лезу на ста­рый чер­дак с голу­бя­ми, несколь­ко часов муча­юсь с уста­нов­кой ком­му­та­то­ра, замер­заю, вклю­чаю обо­ру­до­ва­ние — и оно не рабо­та­ет. Тогда я зво­ню в NOC-центр, гово­рю о про­бле­ме, и они быст­ро вос­ста­нав­ли­ва­ют под­клю­че­ние. Так у меня появи­лась идея выучить­ся на сете­во­го инже­не­ра.

Я начал обу­че­ние с кни­ги Cisco 200-101 — это руко­вод­ство для инже­не­ров, кото­рые пла­ни­ру­ют рабо­тать с сете­вым обо­ру­до­ва­ни­ем. Кни­гу я выбрал слу­чай­но и, навер­ное, пото­му, что на тот момент ком­па­ния Cisco Systems счи­та­лась попу­ляр­ным про­из­во­ди­те­лем и выпус­ка­ла подроб­ные обу­ча­ю­щие мате­ри­а­лы, кото­рые, по отзы­вам интернет-пользователей, помо­га­ли прой­ти собе­се­до­ва­ние и устро­ить­ся на рабо­ту. Так я смог пере­ква­ли­фи­ци­ро­вать­ся и вырас­ти до млад­ше­го систем­но­го адми­ни­стра­то­ра.

В 20 лет я начал изу­чать кни­ги по Linux, и это поз­во­ли­ло попасть в коман­ду дежур­ных адми­нов ком­па­нии AT Consulting. Я про­ра­бо­тал недол­го, но успел позна­ко­мить­ся с SSH, Bash-скриптами и адми­ни­стри­ро­ва­ни­ем SVN — на то вре­мя это были вос­тре­бо­ван­ные тех­но­ло­гии, кото­рые помог­ли попасть в ком­па­нию «Ком­тех». Это было место, где в тече­ние вось­ми меся­цев я был един­ствен­ным сисад­ми­ном и отве­чал за все про­цес­сы. Здесь я набрал­ся опы­та, под­тя­нул зна­ния и полу­чил при­гла­ше­ние от Яндек­са — меня позва­ли в коман­ду под­держ­ки раз­ра­бот­ки поис­ка.

Переход в Яндекс

В Яндек­се мно­го про­дук­тов — поч­та, реклам­ная сеть, хостинг и т. д. Поиск — это один из про­дук­тов Яндек­са. На рабо­ту поис­ка вли­я­ет мно­же­ство систем, кото­рые нуж­но посто­ян­но обслу­жи­вать.

Я попал в груп­пу, кото­рая отве­ча­ет за рабо­то­спо­соб­ность сер­ве­ров и поис­ко­во­го обла­ка Яндекс. Мы писа­ли систем­ный софт для устра­не­ния сбо­ёв обо­ру­до­ва­ния — на тот момент поис­ко­вое обла­ко насчи­ты­ва­ло поряд­ка 40 000 машин, и у них посто­ян­но что-то лома­лось. Это была нуд­ная и непре­рыв­ная рабо­та.

Я решил разо­брать­ся в про­цес­се и при­ду­мал систе­му, кото­рая мог­ла всё чинить без уча­стия нашей груп­пы. В этот пери­од я умел про­грам­ми­ро­вать при­мер­но никак и поэто­му учил­ся на прак­ти­ке: про­чёл кни­гу Мар­ка Лут­ца «Изу­ча­ем Python», про­шёл какой-то курс для пони­ма­ния син­так­си­са и полу­чил пер­вый про­то­тип. Далее я пару недель ниче­го не делал рука­ми и наблю­дал за про­цес­сом: про­грам­ма рабо­та­ла в авто­ма­ти­че­ском режи­ме и ока­за­лась эффек­тив­ней всей нашей груп­пы. Чуть поз­же она оброс­ла допол­ни­тель­ны­ми функ­ци­я­ми, и на её осно­ве полу­чи­лась систе­ма Walle — сей­час это один из инстру­мен­тов адми­ни­стри­ро­ва­ния машин в поис­ке Яндек­са.


Упро­щён­ная вер­сия про­то­ти­па: автов­клю­че­ние → обра­ще­ние к внут­рен­ней про­грам­ме mon_check.sh для опре­де­ле­ния про­блем­ных машин → пере­за­груз­ка через IPMI → 10 минут ожи­да­ния → ещё одна пере­за­груз­ка → 10 минут ожи­да­ния → если не помог­ло, то авто­ма­ти­че­ская пере­уста­нов­ка ОС → ещё пол­ча­са ожи­да­ния → даль­ше почин­ка рука­ми, пото­му что почти навер­ня­ка это про­бле­ма с желе­зом.
  1. про­грам­ма mon_check.sh выда­ёт спи­сок машин, кото­рые не отве­ча­ют по ssh (про­то­кол уда­лен­но­го управ­ле­ния)
  2. для всех маши­нок из спис­ка мы дела­ем запрос на пере­за­груз­ку через IPMI
  3. для тех маши­нок, кото­рые через 10 минут не под­ня­лись, мы дела­ем ёщё одну пере­за­груз­ку
  4. для тех маши­нок, кото­рые через 10 минут не под­ня­лись, мы дела­ем запрос на пере­уста­нов­ку ОС
  5. ждём пол­ча­са, те машин­ки, кото­рые не под­ня­лись, ско­рее все­го име­ют про­бле­мы с желе­зом и даль­ше чинят­ся рука­ми

Из сисадмина в разработчики

Python-разработка

Опыт напи­са­ния пер­вой про­грам­мы помог понять, что даже в круп­ных ком­па­ни­ях мно­гие про­цес­сы нуж­да­ют­ся в дора­бот­ке и если зада­чу мож­но фор­ма­ли­зо­вать, то она может быть авто­ма­ти­зи­ро­ва­на. Я начал мно­го кодить, пере­ме­щать­ся меж­ду коман­да­ми и в какой-то момент ока­зал­ся в коман­де раз­ра­бот­ки поис­ка в ста­ту­се Python-разработчика.

Моя зада­ча заклю­ча­лась в обслу­жи­ва­нии key-value-хранилища на 300 машин — это такая база дан­ных, в кото­рой мож­но что-то сохра­нить и потом полу­чить обрат­но с помо­щью спе­ци­аль­но­го клю­ча. Неко­то­рые части поис­ко­вой систе­мы Яндек­са хра­ни­ли часть инфор­ма­ции в нашей систе­ме, а нашей зада­чей было быст­ро обнов­лять эти дан­ные и быст­ро отве­чать на запро­сы по ним.

Для функ­ци­о­ни­ро­ва­ния key-value хра­ни­ли­ща нуж­ны две под­си­сте­мы: пер­вая отве­ча­ла за сохран­ность и поиск дан­ных, а вто­рая достав­ля­ла эти дан­ные до поль­зо­ва­те­лей. Пер­вая систе­ма рабо­та­ла хоро­шо, а вот с достав­кой были про­бле­мы — систе­ма достав­ки дан­ных посто­ян­но лома­лась.

Про­бле­мы с достав­кой дан­ных воз­ни­ка­ли посто­ян­но, и для их реше­ния тре­бо­вал­ся пол­ный рабо­чий день стар­ше­го раз­ра­бот­чи­ка — чело­ве­ка, чьё вре­мя сто­ит доро­го. Я при­ду­мал систе­му, кото­рая помог­ла авто­ма­ти­зи­ро­вать все про­цес­сы и настро­ить бес­пе­ре­бой­ную достав­ку дан­ных.


Упро­щён­ная схе­ма достав­ки дан­ных из key-value-хранилища к поль­зо­ва­те­лям: шар­ди­ро­ван­ные индек­сы делят инфор­ма­цию на ком­пакт­ные части, а сер­ви­сы ZooKeeper и BitTorrent помо­га­ют доста­вить эту инфор­ма­цию до вычис­ли­тель­ных узлов.

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


Рабо­чее место в Яндек­се. Люб­лю исполь­зо­вать несколь­ко мони­то­ров: на одном мож­но кодить, на вто­ром открыть бра­у­зер с доку­мен­та­ци­ей, а на тре­тьем вести пере­пис­ку в чатах.

Backend-разработка

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

Я попро­бо­вал собе­се­до­вать­ся в дру­гих ком­па­ни­ях и полу­чил пред­ло­же­ние от ком­па­нии Joom — так я удво­ил зар­пла­ту и осво­ил язык Go.

В Joom у меня была зада­ча раз­ра­бо­тать под­си­сте­му email-нотификаций — это когда поль­зо­ва­тель поку­па­ет какой-то товар и через неко­то­рое вре­мя полу­ча­ет от интернет-магазина уве­дом­ле­ние с при­гла­ше­ни­ем вер­нуть­ся за допол­ни­тель­ны­ми покуп­ка­ми. Я про­ра­бо­тал око­ло трёх меся­цев и решил най­ти новую ком­па­нию — мне хоте­лось зани­мать­ся машин­ным обу­че­ни­ем, а зада­чи исклю­чи­тель­но по бэкен­ду дела­ли рабо­ту неин­те­рес­ной.

Пере­ва­рив эту мысль, я открыл резю­ме и полу­чил при­гла­ше­ние от HR-службы Ави­то.

Из разработчика в инженеры машинного обучения

Переход в Авито

Я попал на долж­ность инже­не­ра в коман­ду авто­мо­де­ра­ции объ­яв­ле­ний — это ребя­та, кото­рые борют­ся с нару­ше­ни­я­ми пра­вил на сай­те. Они не поз­во­ля­ют про­да­вать греч­ку по 2000 руб­лей за кило и зани­мать­ся вся­ким мошен­ни­че­ством. Что­бы это делать — нуж­на авто­ма­ти­за­ция про­цес­сов, и имен­но этим я зани­ма­юсь.

Напри­мер, в какой-то момент в раз­де­ле «Недви­жи­мость» появи­лось мно­го объ­яв­ле­ний, когда одна и та же квар­ти­ра про­да­ва­лась в раз­ных местах — её одно­вре­мен­но мог­ли про­да­вать в Аст­ра­ха­ни и Ека­те­рин­бур­ге. Это было оче­вид­ное мошен­ни­че­ство, для борь­бы с кото­рым у нас была систе­ма опре­де­лю­я­щая иерар­хию объ­яв­ле­ний: пер­вая запись ста­но­ви­лась глав­ной, а все после­ду­ю­щие полу­ча­ли бло­ки­ров­ку и фик­си­ро­ва­лись в базе как нару­ши­те­ли сай­та. Сна­ча­ла всё рабо­та­ло хоро­шо.

Затем мошен­ни­ки быст­ро рас­ку­си­ли алго­ритм и научи­лись его обхо­дить с помо­щью любо­го гра­фи­че­ско­го редак­то­ра: доста­точ­но было чуть-чуть изме­нить фото­гра­фию — и два оди­на­ко­вых объ­яв­ле­ния сно­ва на сай­те. Для систе­мы это были раз­ные фай­лы.

Мы реши­ли постро­ить систе­му на осно­ве ней­ро­се­ти. Она долж­на была помочь нам нахо­дить оди­на­ко­вые кар­тин­ки, даже если они были серьёз­но изме­не­ны - раз­мы­ты, выре­за­на часть, изме­не­но раз­ре­ше­ние и т.п.

Так полу­чи­лось, что в ШАДе я зани­мал­ся похо­жей зада­чей — стро­ил индекс для век­тор­ных поис­ков. То есть я знал, как создать ней­ро­сеть, кото­рая уме­ет рас­по­зна­вать оди­на­ко­вые фото­гра­фии несмот­ря на выстав­лен­ные филь­тры. Я про­пи­сал систем­ные тре­бо­ва­ния, пере­дал ней­ро­сеть в раз­ра­бот­ку и сле­дил за тем, что­бы про­грам­ма полу­чи­лась не слиш­ком тяжё­лой и хоро­шо рабо­та­ла в рам­ках общей архи­тек­ту­ры. Это дей­ству­ю­щий про­ект, тех­ни­че­ские подроб­но­сти кото­ро­го вы може­те про­честь на Хаб­ре в ста­тье «Исполь­зо­ва­ние faiss для поис­ка по мно­го­мер­ным про­стран­ствам».


При­мер­ный прин­цип поис­ка фей­ков: про­стран­ство срав­ни­ва­е­мых кар­ти­нок делит­ся на фраг­мен­ты → фраг­мен­ты рас­сла­и­ва­ют­ся на уров­ни → по каж­до­му фраг­мен­ту и уров­ню идёт поиск сов­па­де­ний → все резуль­та­ты скла­ды­ва­ют­ся, и ней­ро­сеть нахо­дит фей­ко­вое изоб­ра­же­ние.

Рабочий график

Я при­ез­жаю на рабо­ту к 12:00 и нахо­жусь на месте при­мер­но до 20:00. Если что-то идёт не так — не страш­но. На мой взгляд, мно­го успе­вать и ори­ен­ти­ро­вать­ся на отра­бо­тан­ные человеко-часы — это не эффек­тив­ная кон­цеп­ция, поэто­му я ста­ра­юсь в первую оче­редь думать о каче­стве и функ­ци­о­наль­но­сти.

Инструменты

Я меня уста­нов­ле­на ОС Ubuntu и эму­ля­тор тер­ми­на­ла Tilix — это поз­во­ля­ет делить рабо­чее про­стран­ство на несколь­ко частей и рас­по­ла­гать их в удоб­ном поряд­ке. Код пишу в PyCharm. Бра­у­зер — Firefox. Обща­юсь через зум и теле­грамм. Если нуж­но что-то спла­ни­ро­вать вме­сте с коман­дой — создаю тике­ты в Jira.


Домаш­нее рабо­чее место: ноут­бук LENOVO ThinkPad T480, удоб­ный стул и мно­го бано­чек чая.

Совет новичкам

Если у вас есть воз­мож­ность — посту­пай­те в самый луч­ший вуз, кото­рый може­те себе поз­во­лить. Так вы дос­ко­наль­но позна­ко­ми­тесь с про­фес­си­ей и уде­ли­те всё сво­бод­ное вре­мя полу­че­нию зна­ний. Если упу­сти­те момент — при­дёт­ся доучи­вать­ся в про­ме­жут­ках меж­ду рабо­той и вре­ме­нем на семью. Это дале­ко не у всех полу­ча­ет­ся.

Если нет воз­мож­но­сти посту­пить в вуз — про­чти­те кни­ги Андрея Сто­ля­ро­ва. Это кра­уд­фандин­го­вый про­ект, кото­рый состо­ит из четы­рёх томов и назы­ва­ет­ся «Про­грам­ми­ро­ва­ние: вве­де­ние в про­фес­сию» — после изу­че­ния вы полу­чи­те базо­вый кар­кас зна­ний и пони­ма­ние того, как раз­ви­вать­ся в про­фес­сии. Желаю уда­чи 🙂