Рубрики
Без рубрики

Стройте системы быстро и уверенно, сначала замкнув цикл!

Полностью законченная “петля” – это когда вы можете обеспечить необходимый вход в свою систему, и она производит желаемый выход (или побочные эффекты, если вам это нравится). Метод “Сначала закрыть цикл” заключается в том, чтобы закрыть этот цикл как можно быстрее, создав сначала его версию barebones, предоставив все или некоторые необходимые входные данные и создав частичную форму желаемого выходного сигнала. Как только мы замкнули этот цикл, мы можем начать реализовывать поведение изнутри, так что с каждым новым изменением наш цикл начинает больше походить на реальную систему, которую мы хотим.

Автор оригинала: Ketan Bhatt.

Недавно я заново узнал кое-что: важность закрытия цикла в системе, которую вы пытаетесь построить, как можно быстрее, а затем добавления сочных бит позже (Спасибо Кеше за помощь мне с концепцией 😊 ).

Полностью законченная “петля” – это когда вы можете обеспечить необходимый вход в свою систему, и она производит желаемый выход (или побочные эффекты, если вам это нравится). Метод “Сначала закрыть цикл” заключается в том, чтобы закрыть этот цикл как можно быстрее, создав сначала его версию barebones, предоставив все или некоторые необходимые входные данные и создав частичную форму желаемого выходного сигнала. Как только мы замкнули этот цикл, мы можем начать реализовывать поведение изнутри, так что с каждым новым изменением наш цикл начинает больше походить на реальную систему, которую мы хотим.

Конечно, в этом нет ничего нового, верно? Мы все слышали об этом совете в различных формах: постройте доказательство концепции как можно быстрее; сначала проверьте неизвестные; если вы хотите доставить автомобиль, сначала разверните скейтборд и т. Д. Это похоже, но я говорю сегодня исключительно с точки зрения “программирования”. В дополнение к тому, чтобы помочь вам быстро потерпеть неудачу, “закрытие цикла” сначала также позволяет вам создавать системы с большей скоростью.

Давайте рассмотрим то, что я пытаюсь сказать, на простом примере.

У вас есть некоторые данные в формате значений, разделенных запятыми (CSV). Вы должны прочитать файл и для каждой строки очистить несколько столбцов, проверить, существует ли эта строка в таблице базы данных. Если это так, обновите его, в противном случае создайте новую строку в базе данных. Мы также хотим создать новый CSV-файл с дополнительным столбцом, указывающим, была ли строка создана или обновлена в базе данных.

Мы знаем, как примерно это сделаем. Прочитайте CSV-файл и для каждой строки:

  1. Очистите колонки по мере необходимости
  2. Проверьте, есть ли строка уже в базе данных
  3. Если он уже присутствует, обновите его
  4. В противном случае создайте новую строку
  5. Добавьте эту строку в новый CSV-файл с дополнительным столбцом для информации о создании/обновлении.

Мы можем писать наш код в этом точном порядке, или мы можем сначала “закрыть цикл”, а затем добавить возможности в наш код.

Начнем с разомкнутого контура

Шаг 1: Закройте петлю!

Прочитайте CSV-файл и добавьте каждую строку в другой CSV-файл с новым столбцом “операция”

Чтобы быстро закрыть цикл, мы просто добавим статическое значение "created" в новый столбец "operation" . Также добавьте тесты, чтобы проверить, что каждая строка во входном файле присутствует в выходном файле и что существует новый столбец.

import csv

def close_the_loop():
    input_file = open('data.csv', 'r')
    output_file = open('output.csv', 'w')

    input_csv = csv.DictReader(input_file)
    headers = input_csv.fieldnames + ['operation']
    output_csv = csv.DictWriter(output_file, headers)

    for row in input_csv:
        row['operation'] = 'created'
        output_csv.writerow(row)

    input_file.close(), output_file.close()

* Я хотел сделать код более читабельным для блога, имея меньше отступов. В противном случае лучший способ чтения файлов в Python-это открыть файл с помощью with .

Аааааааа … петля замкнута!

Шаг 2: Добавьте сочные кусочки

Для каждой строки вызовите фиктивный метод, который позже будет реализовывать операцию БД, но прямо сейчас возвращает “обновлено/создано”.

Обновите свой тест, чтобы проверить правильное значение столбца operation на основе того, что вы издевались над ним.

...

def update_or_create(row):
    return 'created'

def close_the_loop():
    ...

    for row in input_csv:
        row['operation'] = update_or_create(row)
        output_csv.writerow(row)

    ...

Фактически реализуйте метод update_or_create

Добавьте новый модульный тест для update_or_create . К этому моменту вы уже почти закончили.

Добавьте метод для выполнения некоторой очистки данных перед записью в выходной файл.

Также обновите свои тесты, чтобы учесть это изменение.

...

def clean_row(row):
    row['name'] = row['name'].strip

def close_the_loop():
    ...

    for row in input_csv:
        clean_row(row)
        row['operation'] = update_or_create(row)
        output_csv.writerow(row)

    ...

Аааааааа…работа сделана!

Хотя это звучит как один и тот же совет, я мгновенно представил его себе, когда Кеша поднял его и сказал: “Давайте сначала закроем петлю”. Я очень визуальный человек, и это создало в моем сознании образ петли, которую нужно было закрыть. И когда эта петля замыкается, это еще один чрезвычайно удовлетворяющий образ. Для меня этот образ важен, потому что мы регулярно слышим о множестве лучших практик и шаблонов проектирования, но что действительно важно, так это то, сколько из них мы можем вспомнить, чтобы применить к нашей ситуации, когда мы действительно садимся за реализацию чего-то. Визуализация концепции помогает мне запомнить ее на более длительное время.

Фото автора ХУЗАЙФА ШЕЙХ на Unsplash

Помимо того, что вы можете быстро, по частям, построить свою систему, есть и другие связанные с этим преимущества:

  1. Вы быстро “выполняете” код, что помогает вам добавлять больше кода быстрее и с большей уверенностью (так как вы можете быстро проверить, работает ли он или нет, запустив свой код, надеюсь, используя базовый тест, который вы написали).
  2. Вместо того, чтобы получить 20 сбоев во всей совокупности тех 2000 строк кода, которые вы изменили, вы получаете меньше ошибок по мере того, как строите свою систему по крупицам. Большинство из этих ошибок будут связаны с вашими последними изменениями и, таким образом, их будет легче отлаживать и исправлять.
  3. Если вы правильно планируете, вы можете расставлять приоритеты и выборочно добавлять возможности в свою систему (возможно, делать оптимизацию после первоначального развертывания?) По мере сборки. Это поможет вам доставить базовые возможности как можно быстрее, и иногда это все, что нужно (*кашель* стартапы *кашель*).
  4. И, конечно, все преимущества быстрой неудачи или открытия неизвестных сначала остаются в силе: если ваши предположения окажутся ошибочными, ваши временные затраты на данный момент минимальны, и вы все еще можете найти способ обойти эту новую информацию.

Предостережения

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

И потом, есть вещи, которые лучше реализовать таким образом.

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

Чао!