Почему Илон уволил меня

Feb 12 2023
Как одно изменение символа сэкономило компании тысячи долларов Когда он купил Twitter, Илон Маск попросил программистов распечатать их недавние добавления кода и фактически уволил тех, у кого было наименьшее количество страниц для показа. Количественная оценка работы программиста сложна, но она никогда не будет зависеть от количества написанных вами строк.

Как одно изменение символа сэкономило компании тысячи долларов

Сгенерировано MidJourney

Когда он купил Twitter, Илон Маск попросил программистов распечатать свой последний код и фактически уволил тех, у кого было меньше всего страниц для показа. Количественная оценка работы программиста сложна, но она никогда не будет зависеть от количества написанных вами строк. Позвольте мне рассказать вам, почему.

Проблема

На моей предыдущей работе мы продавали инвентарь на нескольких торговых площадках. Синхронизация акций, внедрение различных API, мониторинг систем… это нетривиально и не имеет ничего общего с ценностным предложением компании, поэтому мы привлекли третью сторону. Вместо того, чтобы обращаться к nторговым площадкам, мы обращались к одному сервису, который делал за нас скучные вещи.

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

Это куча денег и времени, которые не были потрачены на то, чтобы сделать компанию лучше, а только топтались на месте.

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

Первое решение: лечить симптомы

Лечение симптома

Мы создали сценарий и запускали его каждый день первым делом. Он повторно обрабатывал заказы за предыдущий день, и мы запускали его до тех пор, пока не было расхождений.

Это сработало, и нагрузка на службу поддержки снизилась.

Однако это было больше кода , мы не знали, в чем была настоящая проблема, и разработчик должен был запускать его каждый день. Им приходилось тщательно проверять, попали ли мы в ловушку, и запускать сценарий заново, если это не так.

Время разработчика дорого и ценно. Стартап должен поставлять продукты, а не запускать сценарии наверстывания.

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

«Хакерское мышление»

Прежде чем идти дальше, позвольте мне описать образ мышления в этой компании. Между основателями и первыми сотрудниками не было инженеров. Был такой «хакерский» менталитет: заставь это работать, а потом работай над чем-то другим. Для раннего запуска это законно. Если ты не отправишься, ты умрешь.

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

Но было такое ощущение. Некоторые разработчики будут заниматься «настоящей работой», пока мы их сдерживаем и придираемся к «стилю», «хорошо иметь». Для них, если код работал, работа была сделана. Не поймите меня неправильно, мне нравится, когда код работает. Я предпочитаю его коду, который не работает, но это минимум того, что вы можете ожидать.

Такое мышление приводит к написанию большого количества кода, поэтому Илон был бы доволен, но исследовать, почему он на самом деле не работает должным образом, — абсолютная боль. Вот как вы получаете неполные или отсутствующие заказы для стартапа электронной коммерции более года. Я взял это на себя и расчистил день, чтобы добраться до сути проблемы.

Второе решение: поковыряться и узнать

Это не было моей областью знаний (меня наняли для работы с данными компании, это была внутренняя работа), и это была область кодовой базы, которую я еще не исследовал. Но код был настолько плох, что другие разработчики не трогали его и не приближались к нему около года. Это был один из худших кодов, которые у нас были.

Требуется много времени и концентрации, чтобы привыкнуть к ранее неизвестной области кодовой базы. Это время и усилия можно сократить, если он будет «выглядеть» как другие области кода. Вот почему важно применять передовой опыт и последовательный стиль. Здесь невозможно было увидеть проблему, потому что ничего нельзя было увидеть .

После тщательного анализа я понял, что да, мы дважды разбирали ответ, да какой-то код был бесполезен, да мы неправильно конвертировали денежные значения (все действительные, важные проблемы сами по себе), но суть проблемы была в том, другой.

У третьей стороны был API XML, который мы запрашивали для диапазона времени, и они возвращали продукты, которые мы продали за это время, в ответе с разбивкой на страницы. Код выглядел примерно так:

export async function fetchOrders(fromDate: Date, toDate: Date) {
  let products: any[] = []
  // process first page results to get totalPages
  const { productsInPage, pagination } = await getOrdersPage(fromDate, toDate, 1)
  products = products.concat(productsInPage)
  
  const totalPages = Math.ceil(parseFloat(pagination.RecordsAffected) / 50) // 50 is the max number of records per page
  
  for (let pageNumber = 2; pageNumber < totalPages; pageNumber++) {
    const { productsInPage, pagination } = await getOrdersPage(fromDate, toDate, pageNumber)
    if (pagination.PageSize === 0) return []
    products = products.concat(productsInPage)
    
    await timeout(500)
  }
  // Do papa maman with products
}

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

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

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

Я сделал самый маленький запрос на вытягивание на сегодняшний день (трудно превзойти):

1 file changed, 1 insertion(+), 1 deletion(-)

- for (let pageNumber = 2; pageNumber < totalPages; pageNumber++) {
+ for (let pageNumber = 2; pageNumber <= totalPages; pageNumber++) {

Заключение

Если бы Илон увидел, как я работаю в тот день, он мог бы меня уволить. Кроме чтения, переписывания и массажа головы, я почти ничего не делал. И пулреквест даже не пытается скрыть этот факт.

Четкий код важен. Не пытайтесь быть умным, но «это работает» недостаточно. Если вещь не читается, это вызовет проблемы и нанесет ущерб компании.

Затянувшиеся проблемы могут быть настоящей болью, и вам может не понравиться смерть от тысячи порезов бумаги.