Всё на костылях, но мы видим, что это работает

Это — корот­кая вер­сия под­ка­ста «Запуск зав­тра», в кото­ром наш това­рищ Самат Гали­мов гово­рит с Ильёй Кра­силь­щи­ком из «Лав­ки». Если есть вре­мя — послу­шай­те пол­ную вер­сию, напол­нен­ную кул сто­ри и потёк­ши­ми ананасами:

В этой статье

  • Как Илье уда­лось запу­стить «Яндекс.Лавку» с нуля без опы­та в торговле.
  • Что нуж­но было посчи­тать, что­бы про­дук­ты ока­за­лись в ассортименте.
  • Как про­шли испы­та­ния Хамовниками. 
  • Как жила систе­ма, сде­лан­ная на костылях.
  • В целом — о том, как гума­ни­та­рий стро­ит пол­но­цен­ный тор­го­вый биз­нес внут­ри Яндек­са с помо­щью дан­ных и экспериментов.

👉 Речь идёт про запуск «Лав­ки» в 2019 году. С тех пор мно­го воды утек­ло. Текст суще­ствен­но сокра­щён и отре­дак­ти­ро­ван, что­бы вам было удоб­но читать, доро­гие. Если хоти­те погру­зить­ся в исто­рию «Лав­ки» от пер­во­го лица, слу­шай­те ори­ги­нал.

Кто такой Илья Красильщик

  • Нет выс­ше­го обра­зо­ва­ния. Отчис­лен с пято­го кур­са РГГУ, пото­му что пере­стал туда ходить, но стал ходить в «Афи­шу». 
  • В 21 год стал глав­ным редак­то­ром жур­на­ла «Афи­ша».
  • Рабо­тал изда­те­лем про­ек­та «Меду­за». 
  • Потом был без­ра­бот­ным
  • И теперь запу­стил сер­вис по достав­ке про­дук­тов внут­ри «Яндек­са», хотя у него не было ни опы­та в ретей­ле, ни опы­та в сервисах.

Что такое «Лавка» 

Девиз про­ек­та — «Заме­ним мага­зин у дома элек­трон­ным сер­ви­сом». В «Лав­ке» чело­век зака­зы­ва­ет обыч­ные про­дук­ты и това­ры для дома, а курьер достав­ля­ет их со скла­да за пол­ча­са. Вро­де про­сто, да непросто.Подробнее: lavka.yandex.ru

Особенности «Лавки»

Пред­ставь­те себе про­дук­то­вую сет­ку. Из чего она состо­ит от нача­ла до кон­ца? Нуж­но спро­гно­зи­ро­вать, сколь­ко тебе нуж­но про­дук­тов и каких.

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

Ско­рее все­го, они при­ве­зут това­ры не на точ­ки про­даж, а на рас­пре­де­ли­тель­ный центр: что-то отправ­ля­ет­ся на хра­не­ние, что-то ложит­ся в моро­зиль­ную каме­ру, что-то — в холо­диль­ную каме­ру. Часть рабо­та­ет по тех­но­ло­гии pick-by-line — это когда това­ры при­ез­жа­ют и сра­зу же рас­пре­де­ля­ют­ся по «Лав­кам». 

Даль­ше гру­зо­вич­ки по рас­пи­са­нию везут эти това­ры по «Лав­кам». Рас­пи­са­ние дол­жен кто-то соста­вить и сле­дить, что­бы гру­зо­вич­ки по нему работали. 

Гру­зо­вич­ки при­ез­жа­ют. На «Лав­ке» това­ры кла­дут­ся в холо­диль­ную каме­ру, в моро­зиль­ную каме­ру, на тёп­лую пол­ку. «Лав­ка» вся раз­ме­че­на, там есть при­ло­же­ние «Яндекс.Полка», по кото­ро­му сбор­щи­ки полу­ча­ют зака­зы и соби­ра­ют това­ры в паке­ти­ки по неко­то­рой тех­но­ло­гии. У нас там есть тре­бо­ва­ния по ско­ро­сти: поло­жить один товар зани­ма­ет при­мер­но 10 секунд. 

А даль­ше начи­на­ет­ся то, что к тому момен­ту уме­ла «Яндекс.Еда» (с кото­рой мы дру­жи­ли и во мно­гом про­си­ли помо­щи): при­нять заказ, отпра­вить курье­ра, курьер возь­мёт, при­ве­зёт и т. д. 

Сложности

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

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

Даль­ше мы реша­ли дру­гие вопро­сы: сколь­ко това­ров будет в ассор­ти­мен­те, сколь­ко това­ров будет про­да­вать этот мага­зин? Две тыся­чи? Три тыся­чи? В тер­ми­нах ретей­ла это важ­ная вещь, поэто­му я уго­во­рил всех, что мы про­сто сде­ла­ем так: мы собе­рём некое коли­че­ство ана­ли­ти­ки, даль­ше из это­го соста­вим мини­маль­ный спи­сок това­ров, и даль­ше пой­дём по нему и будем каж­дый товар обсуж­дать, нуж­но его про­да­вать или нет. Это заня­ло часов пять.

Когда мы дошли до раз­де­ла про­кла­док и там­по­нов, выяс­ни­лось, что в ком­на­те сидят толь­ко мужи­ки — четы­ре чело­ве­ка. Мы были в тупи­ке, пото­му что мы об этом ниче­го не знаем.

Разработка и запуск

Запус­кать­ся мы хоте­ли где-то в рай­оне 20 апре­ля. При этом ниче­го нет, а тебе нуж­но снять точ­ку, постро­ить в ней стел­ла­жи, каким-то обра­зом оциф­ро­вать. Для это­го долж­на быть склад­ская система.

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

Раз­ра­бот­ка была не нашей. То есть я не мог ска­зать «делай­те это»: это не моя раз­ра­бот­ка, мне надо ходить и уго­ва­ри­вать. Раз­ра­бот­ку нуж­но было «делить» с «Яндекс.Едой». 

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

В тесто­вой вер­сии мы запус­ка­лись в Хамов­ни­ках. Там глав­ный офис «Яндек­са» на «Крас­ной Розе», соот­вет­ствен­но, в Хамов­ни­ках живёт очень мно­го сотруд­ни­ков «Яндек­са». Поэто­му ты можешь про­сто напи­сать во внут­рен­них систе­мах: «Мы запус­ка­ем сер­вис. Хоти­те поте­сти­ро­вать его — пожа­луй­ста, давайте».

Из сотруд­ни­ков «Яндек­са» мы набра­ли тесто­вую груп­пу на 120 чело­век: это­го более чем доста­точ­но, что­бы тести­ро­вать сер­вис тако­го уровня.

И вот насту­па­ет 30 апре­ля. В нашей точ­ке начи­на­ют появ­лять­ся курье­ры. И мы дума­ем: «О, это чудо! Они появ­ля­ют­ся!» И тут мы пони­ма­ем, что их начи­на­ет появ­лять­ся очень мно­го, пото­му что из этой груп­пы 100 чело­век мно­гие реши­ли сра­зу поте­сти­ро­вать сервис. 

Есте­ствен­но, в пер­вый день ниче­го не рабо­та­ет. Зака­зы тебе при­хо­дят в неко­то­рое при­ло­же­ние, кото­рое мы не раз­ра­ба­ты­ва­ли, а взя­ли гото­вое — не было вре­ме­ни. При­ло­же­ние чудо­вищ­ное: ниче­го не вид­но. К тебе при­ез­жа­ют, и ты не пони­ма­ешь, что делать, пото­му что в при­ло­же­нии это­го не высве­чи­ва­ет­ся. Неко­то­рые пози­ции зад­ва­и­ва­ют­ся. Выле­за­ют все клас­си­че­ские про­бле­мы с база­ми дан­ных. И вот мы все бега­ем, пыта­ем­ся соби­рать эти зака­зы и дико нервничаем. 

Один день мы как-то пере­жи­ли, во вто­рой что-то почи­ни­ли. Начи­на­ют­ся май­ские празд­ни­ки, мы все сидим на точ­ке все май­ские праздники. 

В ито­ге при­ло­же­ние рабо­та­ет чудо­вищ­но, но достав­ки за 10–15 и даже 20 минут — это для наших тесто­вых поль­зо­ва­те­лей очень удоб­но, они нико­гда в жиз­ни тако­го не встре­ча­ли. И мы видим, что это работает.

Ужасы тестового запуска

Напри­мер, тебе при­ле­та­ет заказ, но его нет в при­ло­же­нии кла­дов­щи­ка. При­хо­дит курьер, пока­зы­ва­ет при­ло­же­ние, что есть заказ. У тебя это­го не вид­но. Ты начи­на­ешь соби­рать заказ по при­ло­же­нию курьера.

База, есте­ствен­но, в этот момент лома­ет­ся, пото­му что ты ниче­го не «про­пи­кал» на ска­не­ре, ты про­сто собрал заказ. Физи­че­ские остат­ки начи­на­ют разъ­ез­жать­ся. Потом зака­зы начи­на­ют зад­ва­и­вать­ся. Потом в базу при­ле­та­ют непра­виль­ные зада­ния. Потом у тебя лома­ет­ся инте­гра­ция с «Едой». 

И так день за днём: ты неде­лю тести­ру­ешь, дру­гую тести­ру­ешь. И всё вре­мя что-то про­ис­хо­дит, всё вре­мя что-то лома­ет­ся, пото­му что систе­ма сде­ла­на на костылях. 

Начи­на­ет­ся про­бле­ма с про­дук­та­ми: поми­мо того, что у тебя тех­ни­че­ски не очень, тебе ещё надо уметь хра­нить про­дук­ты. У тебя начи­на­ет что-то гнить, ты не зна­ешь почему.

Напри­мер, при­ез­жа­ет ана­нас, а он внут­ри про­тух­ший. Ты не зна­ешь поче­му. Выяс­ня­ет­ся, что твои холо­диль­ни­ки были с непра­виль­ной тем­пе­ра­ту­рой. Тогда мы пол­но­стью отка­зы­ва­ем­ся от про­да­жи ово­щей и фрук­тов, гово­рим: «Изви­ни­те, пока не гото­вы». И начи­на­ем гото­вить­ся к ново­му запус­ку ово­щей и фрук­тов, толь­ко по-умному. Но это уже после офи­ци­аль­но­го запуска.

По ито­гам пер­во­го теста мы при­ня­ли реше­ние про­длить тест ещё на две неде­ли. «Лав­ка» ушла на неде­лю на исправ­ле­ние ради­каль­ных багов. Через неде­лю мы вер­ну­лись, и всё ста­ло силь­но лучше.

Нагрузочное тестирование

Ещё мы устра­и­ва­ли нагру­зоч­ное тести­ро­ва­ние. Мы гово­ри­ли: «Доро­гие дру­зья, толь­ко с 7 до 8 вече­ра вы все може­те зака­зать про­дук­ты со скид­кой». И в этот момент мы обру­ши­ва­ли на себя зака­зы и пыта­лись понять, можем это вывез­ти или не можем мы это вывезти.

О зонах доставки

Раз­мер зоны достав­ки опре­де­лял­ся на глаз: ста­вишь точ­ку в «Яндекс.Картах» и по кар­те отме­ря­ешь рас­сто­я­ние, при­мер­но семь минут на вело­си­пе­де. Ино­гда дела­ешь пять, ино­гда дума­ешь «Хочу захва­тить ещё» и дела­ешь 10. Потом из-за это­го начи­на­ют­ся про­бле­мы, и ты страдаешь. 

Пер­вые пол­го­да мы рисо­ва­ли зоны сами. Рисо­вать кар­ты при­ят­но, это похо­же на ком­пью­тер­ную стра­те­гию: толь­ко это реаль­ные дома, в них живут реаль­ные люди. И потом ты запус­ка­ешь­ся и пишешь об этом в какой-то рай­он­ной груп­пе. Тебе чело­век пишет: «О гос­по­ди, вы в моём дво­ре в один дом достав­ля­е­те, а в сосед­ний, кото­рый через дорож­ку, не достав­ля­е­те». И ты захо­дишь в интер­фейс и добав­ля­ешь домик. Гово­ришь: «Попро­буй­те теперь». И у чело­ве­ка ощу­ще­ние чуда.

Маршрутизация курьеров

При­ме­ча­ние веду­ще­го под­ка­ста Сама­та Галимова

Вооб­ще зада­ча марш­ру­ти­за­ции курье­ров — это клас­си­че­ская зада­ча computer science. В про­грам­ми­ро­ва­нии это назы­ва­ет­ся «клас­си­че­ская зада­ча ком­ми­во­я­жё­ра», когда тебе нуж­но объ­е­хать сколько-то горо­дов опти­маль­ным спо­со­бом. Опти­маль­но — это, напри­мер, потра­тив мень­ше все­го бен­зи­на или мень­ше все­го времени.

В слу­чае курье­ров по достав­ке про­дук­тов тебе ещё нуж­но парал­лель­но решить вто­рую такую же слож­ную зада­чу в про­грам­ми­ро­ва­нии — это зада­ча упа­ков­ки рюк­за­ка: какие това­ры нуж­но поло­жить в рюк­зак, что­бы он был оптимальным.

Есть мно­го раз­ных опти­ми­за­ций на этот счёт. Но, в общем, что­бы гаран­ти­ро­вать пра­виль­ное реше­ние, нуж­но пере­брать все воз­мож­ные вари­ан­ты. Для 15 точек назна­че­ния, для 15 горо­дов таких вари­ан­тов 43 мил­ли­ар­да. Для 16 горо­дов их там боль­ше 20 000 мил­ли­ар­дов. Это совер­шен­но безум­ные чис­ла, поэто­му все при­ду­мы­ва­ют раз­ные опти­ми­за­ции, так назы­ва­е­мые эври­сти­ки: хит­рые алго­рит­мы, кото­рые поз­во­ля­ют это чис­ло силь­но уменьшить.

Предсказание нагрузки на точки

Есть про­бле­ма: в зави­си­мо­сти от чис­ла зака­зов в каж­дой «Лав­ке» нуж­но раз­ное чис­ло курье­ров и сотруд­ни­ков. Это нуж­но уметь пред­ска­зы­вать. Но сей­час для нас это сюжет в развитии. 

Про­бле­ма, что эти пред­ска­за­ния рабо­та­ют на очень малень­ких дан­ных. Как бы ты ни пред­ска­зы­вал, всё рав­но будут нестыковки. 

Напри­мер, у тебя есть «Лав­ка», кото­рая дела­ет сколько-то сотен зака­зов в день. Но если раз­бить это, у тебя может быть час, в кото­рый дела­ет­ся 20 зака­зов, и тут несколь­ко чело­век реши­ли ещё зака­зать, и их полу­чи­лось не 20, а 40. Это малые чис­ла, поэто­му там ста­ти­сти­ка не очень работает. 

Мы в этой ситу­а­ции балан­си­ру­ем спрос таким обра­зом. Мы гово­рим: «А сей­час мож­но зака­зать не мень­ше чем на тыся­чу руб­лей». Но в этот момент, прав­да, у тебя начи­на­ет сама лав­ка стра­дать, пото­му что у тебя повы­ша­ет­ся объ­ём этих зака­зов, тебе надо боль­ше собирать.

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

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

Инфраструктура

Внут­ри «Лав­ки» очень мно­го ИТ-продуктов и инстру­мен­тов. Напри­мер, систе­ма управ­ле­ния вело­си­пе­да­ми — отдель­ная систе­ма; систе­ма управ­ле­ния скла­дом — ещё одна; при­ло­же­ние кла­дов­щи­ка, при­ло­же­ние курье­ра, кли­ент­ское при­ло­же­ние и два­дцать пять тысяч подоб­ных штук — всё это отдель­ные инстру­мен­ты. Мы рос­ли очень быст­ро, а наши тех­но­ло­гии не успе­ва­ли за этим. Сей­час нам нужен рывок, что­бы все тех­но­ло­гии луч­ше зара­бо­та­ли вместе.

Кто отбирает ассортимент 

Про­дук­ты для про­да­жи у нас отби­ра­ют люди, а не ком­пью­те­ры. Непо­нят­но, как ком­пью­тер может выбрать в самом нача­ле, про­да­вать что-то или не про­да­вать. Есть люди, кото­рые в этом раз­би­ра­ют­ся: они зна­ют, что луч­ше и что хуже.

Есть вещи, кото­рые про­хо­дят через внут­рен­ние тесты. Ино­гда идёшь по офи­су, а к тебе под­хо­дят: «Попро­буй эту моца­рел­лу». Ты гово­ришь: «М-м-м, вкус­но!» И бежишь дальше.

Категория «Похмелье»

У нас рань­ше была кате­го­рия «Похме­лье». Потом шут­ка затя­ну­лась, мы её убрали.

Посколь­ку наши тех­но­ло­гии не очень дорос­ли к это­му момен­ту, у нас был чело­век, кото­рый вста­вал в 7 утра в суб­бо­ту, руч­ка­ми вклю­чал кате­го­рию «Похме­лье», а потом в пол­ночь в вос­кре­се­нье выклю­чал кате­го­рию «Похме­лье». Мно­гие тре­бо­ва­ли про­дле­ния кате­го­рии «Похме­лье» на поне­дель­ник, но мы реши­ли, что в поне­дель­ник нет, мы не готовы. 

Полная версия

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