ПРОГРАММНЫЕ ПАРАДИГМЫ ДЛЯ ЦЕПОЧКИ ПОСТАВОК (СВОДКА ЛЕКЦИИ 1.4)

learn menu

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

programming-paradigms-as-supply-chain-theory

Просмотр лекции

Статический анализ

Не обязательно быть программистом, чтобы думать как программист, и правильный анализ проблем цепочки поставок лучше всего решается с программным мышлением, а не только с программными инструментами. Традиционные программные решения (например, ERP-системы) разработаны таким образом, что проблемы решаются во время выполнения, а не на этапе компиляции1.

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

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

Рассмотрим компанию, занимающуюся строительством склада. Сначала необходимо продумать расположение проходов, стеллажей и погрузочных площадок, чтобы заранее выявить потенциальные узкие места перед началом строительства. Это позволяет создать оптимальный дизайн и обеспечить плавность работы будущего склада. Такое тщательное планирование аналогично статическому анализу, который Lokad выполняет с помощью Envision.

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

Программирование с использованием массивов

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

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

Представьте себе менеджера склада, у которого есть два списка: список A содержит текущие уровни запасов, а список B - входящие поставки для продуктов из списка A. Вместо того, чтобы просматривать каждый продукт по отдельности и вручную добавлять входящие поставки (список B) к текущим уровням запасов (список A), более эффективным методом будет обработка обоих списков одновременно, что позволит обновить уровни запасов для всех продуктов одним махом. Это позволит сэкономить время и усилия и в основном то, чего добивается программирование с использованием массивов2.

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

Совместимость с аппаратным обеспечением

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

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

  • Вычисления: Вычислительная мощность компьютера, предоставляемая либо ЦП, либо ГП.
  • Память: Объем хранения данных компьютера, предоставляемый ОЗУ или ПЗУ.
  • Пропускная способность: Максимальная скорость передачи информации (данных) между различными частями компьютера или по сети компьютеров.

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

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

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

Вероятностное программирование

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

Кратко говоря, Excel в основном предназначен для детерминированных данных (т.е. фиксированных значений, таких как статические целые числа). Хотя его можно изменить для выполнения некоторых функций вероятности, у него отсутствует продвинутая функциональность - а также гибкость и выразительность - необходимая для работы с сложными манипуляциями случайными величинами, с которыми сталкиваются при вероятностном прогнозировании спроса. Вместо этого, для представления и обработки неопределенностей, с которыми сталкиваются в цепи поставок, лучше подходит язык вероятностного программирования, такой как Envision.

Рассмотрим гипотетический сценарий автомобильного магазина, который продает тормозные колодки. В этом сценарии клиенты должны покупать тормозные колодки пачками по 2 или 4 штуки, и магазин должен учитывать эту неопределенность при прогнозировании спроса.

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

Дифференцируемое программирование

В контексте оптимизации цепочки поставок дифференцируемое программирование позволяет численному рецепту учиться и адаптироваться на основе предоставленных данных. Дифференцируемое программирование, однажды объединенное с стохастическим градиентным спуском, позволяет ученым по цепочке поставок обнаруживать сложные закономерности и взаимосвязи внутри цепочки поставок. Параметры изучаются с каждой новой итерацией программирования, и этот процесс повторяется тысячи раз. Это делается для минимизации расхождения между текущей моделью прогнозирования и прошлыми данными4.

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

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

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

Версионирование кода и данных

Одним из недооцененных элементов долгосрочной жизнеспособности оптимизации является обеспечение возможности получения, отслеживания и воспроизведения численного рецепта - включая каждый составляющий фрагмент кода и крошку данных7. Без этой возможности версионирования возможность обратного проектирования рецепта значительно снижается, когда неизбежно возникают мучительные исключения (heisenbugs в компьютерных кругах).

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

Безопасное программирование

Помимо rogue heisenbugs, увеличение цифровизации цепочки поставок сопровождается соответствующей уязвимостью к цифровым угрозам, таким как кибератаки и программы-вымогатели. Существуют два основных - и обычно непреднамеренных - вектора хаоса в этом отношении: программируемые системы, которые мы используем, и люди, которым мы разрешаем их использовать. Что касается последних, очень сложно учесть случайную некомпетентность (не говоря уже о случаях преднамеренного злонамеренного поведения); что касается первых, намеренные выборы на уровне проектирования являются ключевыми в обходе этих минных полей.

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

В то время как Excel и Python имеют свои преимущества, им не хватает необходимой программной безопасности для защиты всего кода и данных, необходимых для масштабируемой оптимизации цепочки поставок, рассматриваемой в этих лекциях.

Примечания


  1. Время компиляции относится к этапу, когда код программы преобразуется в машинно-читаемый формат перед его выполнением. Время выполнения относится к этапу, когда программа фактически выполняется компьютером. ↩︎

  2. Это очень грубое приближение процесса. Реальность намного сложнее, но это вопрос компьютерных гиков. На данный момент главное в том, что массивное программирование приводит к более упрощенному (и экономически эффективному) процессу вычислений, преимущества которого велики в контексте цепочки поставок. ↩︎

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

  4. Попробуйте совершенствовать рецепт. Может быть, у вас есть базовая схема, на которую вы опираетесь, но достижение идеального баланса ингредиентов и приготовления оказывается непростой задачей. В рецепте есть не только вкусовые соображения, но и текстурные и внешний вид. Чтобы найти идеальную версию рецепта, делаются мелкие корректировки и отмечаются результаты. Вместо экспериментов со всеми возможными приправами и кухонными принадлежностями делаются обоснованные изменения на основе наблюдаемой обратной связи с каждой итерацией (например, добавление немного больше или меньше соли). С каждой итерацией вы узнаете больше о оптимальных пропорциях, и рецепт развивается. В своей сути это то, что делает дифференцируемое программирование и стохастический градиентный спуск с числовым рецептом в оптимизации цепочки поставок. Пожалуйста, ознакомьтесь с лекцией для математических деталей. ↩︎

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

  6. Само собой разумеется, что это упрощенные описания математических операций, вовлеченных в процесс. Тем не менее, математические операции не являются слишком запутанными, как объясняется в лекции. ↩︎

  7. Популярными системами версионирования являются Git и SVN. Они позволяют нескольким людям работать над одним и тем же кодом (или любым другим содержимым) одновременно и объединять (или отклонять) изменения. ↩︎

  8. Уровень сохранения только для добавления относится к стратегии хранения данных, при которой новая информация добавляется в базу данных без изменения или удаления существующих данных. Подробности о безопасности с дизайном только для добавления в Lokad описаны в его обширном разделе FAQ по безопасности. ↩︎