Предотвращение ошибок poka yoke

Poka-yoke (звучит как пока ёкэ) — забавный на слух японский термин, который обозначает один из инструментов бережливого производства. Оказывается, мы сталкиваемся с ним каждый день. Только на русском он звучит как «принцип нулевой ошибки» или «защита от дурака».

На английский poka-yoke дословно переводится как «avoid mistakes», т.е. «избегать ошибок». А на практике используется адаптированный перевод — mistake proofing или error proofing (защита от ошибок).

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

Устройства защиты от дурака предохраняют не просто от ошибок, а от ошибок, вызванных человеческим фактором:

  • невнимательностью
  • забывчивостью
  • неосторожностью
  • незнанием
  • усталостью
  • и даже саботажем.

Люди ошибаются, а poka-yoke приспособления не дают им допустить ошибку.

Принцип действия poka-yoke характеризуются:

  1. стопроцентным охватом проверки
  2. быстрой обратной связью
  3. низкой стоимостью и простотой.
Устройства poka-yoke работают по принципу pass no defect — не пропустить ни одного дефекта.

История создания методов poka-yoke

Poka-yoke призван устранить ошибки, основанные на человеческом факторе. Защита от ошибок использовалась на предприятиях в том или ином виде задолго до формирования концепции poka-yoke. Формализовали эту систему в Toyota.

Изобретатель методов poka-yoke — японский инженер Сигео Синго (1909-1990), эксперт в области производства и один из создателей производственной системы Toyota. Сигео Синго разработал подход Zero Quality Control (ZQC), или Zero Defects (ноль дефектов).

Изобретатель методов poka-yoke японский инженер Сигео Синго

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

Акцент контроля качества смещается с проверки готовой продукции на факт брака на предупреждение возникновения брака на каждом этапе производства.

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

Poka-yoke или метод нулевой ошибки — один из ключевых аспектов ZQC. Система poka-yoke использует сенсоры или другие устройства, которые буквально не дают оператору совершить ошибку.

Они регулируют производственный процесс и предотвращают дефекты одним из двух способов:

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

Уровни устройств poka-yoke

Способы защиты от дурака делятся на три уровня по возрастанию эффективности:

  • 1-й уровень — обнаруживает несоответствие деталей или продукции. Система обнаруживает дефектную деталь, но не отбрасывает её.
  • 2-й уровень — не допускает несоответствие. Система не дает обработать дефектную деталь на следующей стадии производственного процесса.
  • 3-й уровень — конструкционная защита, например, изделие имеет такую конструкцию, что установить или собрать его непредусмотренным образом невозможно.

Принципы защиты от ошибок

Существует шесть принципов или методов защиты от ошибок. Они перечислены в порядке приоритета:

  1. Устранение: этот метод устраняет возможность ошибки путем редизайна продукта или процесса так, чтобы проблемная операция или деталь вообще больше не требовались.
    Пример: упрощение продукта или соединение деталей, чтобы избежать дефектов продукта или сборки.
  2. Замещение: чтобы повысить надежность, нужно заменить непредсказуемый процесс на более надежный.
    Пример: Использование роботизации и автоматизации, чтобы предотвратить ошибки ручной сборки. Применение автоматических диспенсеров или аппликаторов для точной дозировки жидких материалов.
  3. Предупреждение: инженеры-конструкторы должны разработать такой продукт или процесс, чтобы вообще невозможно было совершить ошибку.
    Пример: Конструктивные особенности деталей, которые допускают только правильную сборку; уникальные разъемы для избежания неправильного подключения кабелей; симметричные детали, которые позволяют избежать неправильной установки.
  4. Облегчение: Использование определенных методов и группирование шагов облегчают выполнение процесса сборки.
    Пример: Визуальные элементы управления, которые включают цветовое кодирование, маркировку деталей. Промежуточный ящик, который визуально контролирует, чтобы все детали были собраны. Нанесение характеристик на детали.
  5. Обнаружение: Ошибки обнаруживаются до того, как они перейдут на следующий производственный процесс, чтобы оператор мог быстро исправить проблему.
    Пример: Сенсорные датчики в производственном процессе, которые определяют, что детали собраны неправильно.
  6. Смягчение: Старание уменьшить влияние ошибок.
    Пример: Предохранители для предотвращения перегрузки цепей в результате коротких замыканий.

Основные методы poka-yoke

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

Контактные методы

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

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

Считывающие методы

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

Методы последовательного движения

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

Типы чувствительных устройств

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

  1. сенсоры физического контакта
  2. сенсоры энергетического контакта
  3. сенсоры, которые определяют изменения физических условий.

Сенсоры физического контакта

Этот тип устройств работает по принципу физического касания детали или части оборудования. Обычно такое устройство посылает электронный сигнал в момент контакта. Вот некоторые примеры таких устройств:

  • Концевые переключатели — подтверждают наличие и положение объектов, которые касаются маленького рычага на переключателе. Самые распространенные и недорогие устройства.
  • Сенсорные переключатели — аналогичны концевым выключателям, но активируются легким прикосновением объекта к тонкой «антенне».
  • Триметрон — это чувствительные игольчатые датчики, которые посылают сигналы для звукового оповещения или остановки оборудования, когда измерения объекта выходят за пределы допустимого диапазона.

Энергетические сенсорные датчики

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

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

Энергетические сенсорные датчики в poka-yoke

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

К другим типам энергетических сенсорных устройств относятся:

  • Волоконные датчики
  • Датчики площади
  • Датчики положения
  • Датчики габаритов
  • Датчики вибрации
  • Датчики перемещения
  • Датчики для обнаружения проходов металла
  • Датчики цветовой маркировки
  • Датчики контроля двойной подачи
  • Датчики положения объекта сварки

Сенсоры, которые определяют изменения физических условий

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

7 ключей к внедрению эффективной системы защиты от ошибок

Чтобы эффективно внедрить метод нулевой ошибки, нужно отталкиваться от следующих рекомендаций:

  1. Сформируйте команду для внедрения poka-yoke и всегда учитывайте мнение людей, которые непосредственно участвуют в производственном процессе. В этом случае успех вероятнее, чем при привлечении внешних технических экспертов.
  2. Используйте систематизирование потока ценности, чтобы определить, где нужно повысить стабильность процесса. Это позволит сосредоточиться на областях, которые будут влиять на непрерывный поток.
  3. Используйте систематизирование процесса внутри выбранной области, чтобы четко определить каждый шаг процесса.
  4. Применяйте простую методологию решения проблем, например, диаграмму причинно-следственных связей, чтобы определить коренные причины проблем внутри процесса. Так вы выявите те шаги процесса, которые требуют внедрения защиты от ошибок.
  5. Используйте самую простую работающую технологию poka-yoke. Во многих случаях такие простые устройства как направляющие штифты и концевые выключатели будут отлично справляться. Однако в других случаях понадобятся более сложные системы.
  6. Отдавайте предпочтение контролирующим, а не предупреждающим системам, поскольку контролирующие системы не зависят от оператора.
  7. Заведите стандартную форму для каждого устройства poka-yoke со следующими полями:
  • проблема
  • тревожный сигнал
  • действия в случае чрезвычайной ситуации
  • способ и частота подтверждения правильности работы
  • способ проверки качества в случае поломки.

Poka-yoke устройства вокруг нас

Люди допускают ошибки не только на производстве, но и в процессе использования продуктов. Эти ошибки ведут, как минимум, к поломкам, как максимум, к возникновению серьезной опасности. Поэтому производители встраивают защиту от дурака в конструкцию своих изделий.

Poka-yoke в быту

Poka-yoke в быту: электрочайник отключится сам, когда вода закипит

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

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

Ребенок не попробует лекарство, которое упаковано в баночку со специальной защитой от детей.

Лифт автоматически откроет двери, если наткнется на препятствие при закрытии.

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

Poka-yoke в автомобиле

Poka-yoke в автомобиле: датчики и системы автопилота

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

К ним относятся активные и пассивные системы безопасности, например:

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

Poka-yoke в программном обеспечении

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

Примерами защиты от дурака могут быть обязательные поля форм и поля с заданным форматом ввода данных.

Книги по теме

Zero Quality Control: Source Inspection and the Poka-Yoke System / Shigeo Shingo

Книга от создателя системы poka-yoke Сигео Синго, впервые опубликованная в 1986 году. В ней автор обосновывает важность применения устройств защиты от ошибок для достижения безупречного качества продукции. Он называет 112 примеров устройств poka-yoke, работающих в цехах. Внедрение этих устройств обошлось меньше $100.

Poka-Yoke: Improving Product Quality by Preventing Defects / Nikkan Kogyo Shimbun

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

Вердикт

Система poka-yoke — очередное гениальное изобретение японцев. За 30 лет устройства poka-yoke эволюционировали вместе с производственным оборудованием. Они перестали быть дешевыми, как гласит один из принципов концепции, но стали гораздо эффективнее.

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

Само понятие защиты от ошибок стало шире: специальные устройства, конструктивные особенности и просто предупреждения оберегают нас от ошибок в повседневной жизни.
Благодаря poka-yoke у нас определенно меньше проблем.

From Wikipedia, the free encyclopedia

Poka-yoke (ポカヨケ, [poka joke]) is a Japanese term that means «mistake-proofing» or «error prevention». A poka-yoke is any mechanism in a process that helps an equipment operator avoid (yokeru) mistakes (poka) and defects by preventing, correcting, or drawing attention to human errors as they occur.[1] The concept was formalized, and the term adopted, by Shigeo Shingo as part of the Toyota Production System.[2][3]

Etymology[edit]

Poka-yoke was originally baka-yoke, but as this means «fool-proofing» (or «idiot-proofing») the name was changed to the milder poka-yoke.[citation needed]
Poka-yoke is derived from poka o yokeru (ポカを避ける), a term in shogi that means avoiding an unthinkably bad move.

Usage[edit]

More broadly, the term can refer to any behavior-shaping constraint designed into a process to prevent incorrect operation by the user.

A simple poka-yoke example is demonstrated when a driver of the car equipped with a manual gearbox must press on the clutch pedal (a process step, therefore a poka-yoke) prior to starting an automobile. The interlock serves to prevent unintended movement of the car. Another example of poka-yoke would be the car equipped with an automatic transmission, which has a switch that requires the car to be in «Park» or «Neutral» before the car can be started (some automatic transmissions require the brake pedal to be depressed as well). These serve as behavior-shaping constraints as the action of «car in Park (or Neutral)» or «foot depressing the clutch/brake pedal» must be performed before the car is allowed to start. The requirement of a depressed brake pedal to shift most of the cars with an automatic transmission from «Park» to any other gear is yet another example of a poka-yoke application. Over time, the driver’s behavior is conformed with the requirements by repetition and habit.

History[edit]

The term poka-yoke was applied by Shigeo Shingo in the 1960s to industrial processes designed to prevent human errors.[1] Shingo redesigned a process in which factory workers, while assembling a small switch, would often forget to insert the required spring under one of the switch buttons. In the redesigned process, the worker would perform the task in two steps, first preparing the two required springs and placing them in a placeholder, then inserting the springs from the placeholder into the switch. When a spring remained in the placeholder, the workers knew that they had forgotten to insert it and could correct the mistake effortlessly.[4]

Shingo distinguished between the concepts of inevitable human mistakes and defects in the production. Defects occur when the mistakes are allowed to reach the customer. The aim of poka-yoke is to design the process so that mistakes can be detected and corrected immediately, eliminating defects at the source.

Implementation in manufacturing[edit]

Poka-yoke can be implemented at any step of a manufacturing process where something can go wrong or an error can be made.[5] For example, a fixture that holds pieces for processing might be modified to only allow pieces to be held in the correct orientation,[6] or a digital counter might track the number of spot welds on each piece to ensure that the worker executes the correct number of welds.[6]

Shingo recognized three types of poka-yoke for detecting and preventing errors in a mass production system:[2][5]

  1. The contact method identifies product defects by testing the product’s shape, size, color, or other physical attributes.
  2. The fixed-value (or constant number) method alerts the operator if a certain number of movements are not made.
  3. The motion-step (or sequence) method determines whether the prescribed steps of the process have been followed.

Either the operator is alerted when a mistake is about to be made, or the poka-yoke device actually prevents the mistake from being made. In Shingo’s lexicon, the former implementation would be called a warning poka-yoke, while the latter would be referred to as a control poka-yoke.[2]

Shingo argued that errors are inevitable in any manufacturing process, but that if appropriate poka-yokes are implemented, then mistakes can be caught quickly and prevented from resulting in defects. By eliminating defects at the source, the cost of mistakes within a company is reduced.[citation needed]

A methodic approach to build up poka-yoke countermeasures has been proposed by the Applied Problem Solving (APS) methodology,[7] which consists of a three-step analysis of the risks to be managed:

  1. Identification of the need
  2. Identification of possible mistakes
  3. Management of mistakes before satisfying the need

This approach can be used to emphasize the technical aspect of finding effective solutions during brainstorming sessions.

Benefits of poka-yoke implementation[edit]

A typical feature of poka-yoke solutions is that they don’t let an error in a process happen. Other advantages include:[8]

  • Less time spent on training workers;
  • Elimination of many operations related to quality control;
  • Unburdening of operators from repetitive operations;
  • Promotion of the work improvement-oriented approach and actions;
  • A reduced number of rejects;
  • Immediate action when a problem occurs;
  • 100% built-in quality control;
  • Preventing bad products from reaching customers;
  • Detecting mistakes as they occur;
  • Eliminating defects before they occur.

See also[edit]

Look up poka-yoke in Wiktionary, the free dictionary.

  • Defensive design
  • Fail-safe
  • Idiot-proof
  • Interlock
  • Murphy’s law

References[edit]

  1. ^ a b Robinson, Harry (1997). «Using Poka-Yoke Techniques for Early Defect Detection». Berry College. Archived from the original on December 27, 2014. Retrieved May 4, 2009.
  2. ^ a b c Shingo, Shigeo; Dillon, Andrew (1989). A study of the Toyota production system from an industrial engineering viewpoint. Portland, OR: Productivity Press. ISBN 0-915299-17-8. OCLC 19740349.
  3. ^ John R. Grout, Brian T. Downs. «A Brief Tutorial on Mistake-proofing, Poka-Yoke, and ZQC». John Grout’s Mistake-Proofing Center. Archived from the original on Apr 14, 2009. Retrieved May 4, 2009.
  4. ^ The Sayings of Shigeo Shingo: Key Strategies for Plant Improvement. QualityCoach.Net. ISBN 9781563273841. Archived from the original on January 28, 2014. Retrieved August 20, 2012.
  5. ^ a b «Poka Yoke or Mistake Proofing :: Overview». The Quality Portal. Retrieved May 5, 2009.
  6. ^ a b Nikkan Kogyo Shimbun (1988). Poka-yoke: improving product quality by preventing defects. Productivity Press. p. 111. ISBN 978-0-915299-31-7.
  7. ^ Ivan Fantin (2014). Applied Problem Solving. Method, Applications, Root Causes, Countermeasures, Poka-Yoke and A3. How to make things happen to solve problems. Milan, Italy: Createspace, an Amazon company. ISBN 978-1499122282
  8. ^ Misiurek, Bartosz (2016). Standardized Work with TWI: Eliminating Human Errors in Production and Service Processes. New York: Productivity Press. ISBN 9781498737548.

Further reading[edit]

  • Shingo, Shigeo (1986). Zero quality control: source inspection and the poka-yoke system. Portland, Oregon: Productivity Press. ISBN 0-915299-07-0. OCLC 13457086. Retrieved 30 April 2009.
  • Nikkan Kogyo Shimbun (1988). Poka-yoke: improving product quality by preventing defects. Portland, Oregon: Productivity Press. ISBN 0-915299-31-3. OCLC 300302752.
  • Hinckley, C. M.; P. Barkan (1995). «The role of variation, mistakes, and complexity in producing nonconformities». Journal of Quality Technology. 27 (3): 242–249. doi:10.1080/00224065.1995.11979596.
  • Misiurek, Bartosz (2016). Standardized Work with TWI: Eliminating Human Errors in Production and Service Processes. New York: Productivity Press. ISBN 9781498737548.

External links[edit]

  • Mistake-proofing example wiki
  • Mistake-Proofing — Fool-Proofing — Failsafing

Энциклопедия

0 комментариев

Poka-yoke (Принцип нулевой ошибки, англ. Zero defects) – предотвращение ошибок, метод, благодаря которому работу можно сделать только одним правильным способом и дефект просто не может появиться. Принцип нулевой ошибки означает: допускается минимум ошибок или всего одна. При инициировании программ нулевой ошибки отношение к дефектам следующее: промахи из-за забывчивости, случайной перестановки, перепутывания, неправильного считывания, ложной интерпретации, заблуждений, незнания или невнимательности возможны и неизбежны. Однако они должны рассматриваться сотрудниками как нормальное явление. Их следует вскрывать и нельзя замалчивать. Необходимо искать не виновников дефекта, а его причину.
Причины дефектов отыскиваются путем разделения следующих понятий: причина – промах и заблуждение – сотрудник – действие – дефект, возникший в продукте. Таким образом, определяется механизм предотвращения ошибок. Его основные моменты:

создание предпосылок для бездефектной работы,
внедрение методов бездефектной работы,
систематическое устранение возникших ошибок,
принятие мер предосторожности и внедрение простых технических систем, позволяющих сотрудникам предотвратить совершение промаха (poka-случайная, непреднамеренная ошибка; yoka- избежание, сокращение количества ошибок).

Применение метода Poka Yoke

При определение ошибок в области входного контроля– в таком случае дефект выявится до того, как будут совершены те или иные операции.
При контроле завершенного процесса.
При проверке в ходе выполнения процесса самим работником.
При передаче изделия на последующие процессы.

Для предотвращения ошибок необходимо отнести проверку качества в структуру выполняемых процессов в качестве их рабочего этапа. Метод Poka-yoke, применяемый вместе с другими инструментами бережливого производства, служит гарантией того, что изделие бездефектно, а процесс его производства протекает без сбоев (см. схему 1).
Схема 1. Принцип действия Poka-yoke

Производственный Пример: при сверлении на вертикально-сверлильном станке со стойкой обрабатываемое изделие часто закреплялось в зеркально перевернутом виде. Результат – неправильное положение сверления, которое было обнаружено только при монтаже. Причина дефекта: Ошибка при закреплении изделия.
Вопрос: Как можно предотвратить этот дефект? Типичная ошибка, которую можно устранить, используя:

устройства;
позиционирование на сверлильной стойке;
обучение персонала;
оптический контроль.

Дефекта больше не будет!
Сегодня для предотвращения ошибочных действий применяются жесткие и мягкие мероприятия. К жестким относятся: геометрически замкнутые формы, точные размеры, одинаковый материал, проверка процесса с отключением и др. Часто применяются более мягкие мероприятия, как например, использование окрашивания разными цветами, различных конфигураций или в последовательностей в выполнении монтажа, свечение, сигналы, указания.
Производственные Примеры:
Схема 2. Poka-yoke во вспомогательных материалах на японском предприятии. 

Схема 3. Poka-yokeв процессе установки детали на немецком предприятии. 

Больше практических примеров можно найти в Альманахе «Управление производством».
Выдвинутый доктором Схинго производственный принцип нулевой ошибки базируется на 3 компонентах:

Анализ причины: Проверка и нахождение возможных ошибочных действий происходит не только после завершения процесса. Распознанные ошибочные действия могут предотвращаться так еще в ходе их возникновения, прежде чем их результатом станет изготовление брака. Вследствие этого возможнополное предотвращение дефектов.
100%-й контроль: с помощью простых и эффективных устройств ошибочные действия обнаруживаются еще в текущей стадии процесса. Благодаря простоте и экономичности устройств возможно не только выборочная проверка, но и каждая отдельной детаи.
Немедленные меры по исправлению: возможно очень короткое время реакции от обнаруживания ошибки до введения необходимого корректирующего мероприятия.

Термин по теме: Дзидока (Jidoka)
Статья по теме: Poka Yoké в промышенном комплексе РЕНО

Poka-yoke (Принцип нулевой ошибки, англ. Zero defects)  предотвращение ошибок, метод, благодаря которому работу можно сделать только одним правильным способом и дефект просто не может появиться. Принцип нулевой ошибки означает: допускается минимум ошибок или всего одна. При инициировании программ нулевой ошибки отношение к дефектам следующее: промахи из-за забывчивости, случайной перестановки, перепутывания, неправильного считывания, ложной интерпретации, заблуждений, незнания или невнимательности возможны и неизбежны. Однако они должны рассматриваться сотрудниками как нормальное явление. Их следует вскрывать и нельзя замалчивать. Необходимо искать не виновников дефекта, а его причину.

Причины дефектов отыскиваются путем разделения следующих понятий: причина – промах и заблуждение – сотрудник – действие – дефект, возникший в продукте. Таким образом, определяется механизм предотвращения ошибок. Его основные моменты:

  • создание предпосылок для бездефектной работы,
  • внедрение методов бездефектной работы,
  • систематическое устранение возникших ошибок,
  • принятие мер предосторожности и внедрение простых технических систем, позволяющих сотрудникам предотвратить совершение промаха (poka-случайная, непреднамеренная ошибка; yoka- избежание, сокращение количества ошибок).

Применение метода Poka Yoke

  • При определение ошибок в области входного контроля– в таком случае дефект выявится до того, как будут совершены те или иные операции.
  • При контроле завершенного процесса.
  • При проверке в ходе выполнения процесса самим работником.
  • При передаче изделия на последующие процессы.

Для предотвращения ошибок необходимо отнести проверку качества в структуру выполняемых процессов в качестве их рабочего этапа. Метод Poka-yoke, применяемый вместе с другими инструментами бережливого производства, служит гарантией того, что изделие бездефектно, а процесс его производства протекает без сбоев (см. схему 1).

Схема 1. Принцип действия Poka-yoke

Принцип действия Poka-yoke

Производственный Пример: при сверлении на вертикально-сверлильном станке со стойкой обрабатываемое изделие часто закреплялось в зеркально перевернутом виде. Результат – неправильное положение сверления, которое было обнаружено только при монтаже. Причина дефекта: Ошибка при закреплении изделия.

Вопрос: Как можно предотвратить этот дефект? Типичная ошибка, которую можно устранить, используя:

  1. устройства;
  2. позиционирование на сверлильной стойке;
  3. обучение персонала;
  4. оптический контроль.

Дефекта больше не будет!

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

Производственные Примеры:

Схема 2. Poka-yoke во вспомогательных материалах на японском предприятии. 

Poka-yoke во вспомогательных материалах на японском предприятии

Схема 3. Poka-yokeв процессе установки детали на немецком предприятии. 

Poka-yokeв процессе установки детали на немецком предприятии

Больше практических примеров можно найти в Альманахе «Управление производством».

Выдвинутый доктором Схинго производственный принцип нулевой ошибки базируется на 3 компонентах:

  1. Анализ причины: Проверка и нахождение возможных ошибочных действий происходит не только после завершения процесса. Распознанные ошибочные действия могут предотвращаться так еще в ходе их возникновения, прежде чем их результатом станет изготовление брака. Вследствие этого возможнополное предотвращение дефектов.
  2. 100%-й контроль: с помощью простых и эффективных устройств ошибочные действия обнаруживаются еще в текущей стадии процесса. Благодаря простоте и экономичности устройств возможно не только выборочная проверка, но и каждая отдельной детаи.
  3. Немедленные меры по исправлению: возможно очень короткое время реакции от обнаруживания ошибки до введения необходимого корректирующего мероприятия.

Термин по теме: Дзидока (Jidoka)

Статья по теме: Poka Yoké в промышенном комплексе РЕНО


Всем привет! Я Алексей Грезов, разработчик Server Team Badoo. Мы в Badoo всегда стараемся сделать так, чтобы наш код было легко поддерживать, развивать и переиспользовать, ведь от этих параметров зависит, насколько быстро и качественно мы сможем реализовать какую-либо фичу. Одним из способов достижения этой цели является написание такого кода, который просто не позволит совершить ошибку. Максимально строгий интерфейс не даст ошибиться с порядком его вызова. Минимальное количество внутренних состояний гарантирует ожидаемость результатов. На днях я увидел статью, в которой как раз описывается, как применение этих методов упрощает жизнь разработчикам. Итак, предлагаю вашему вниманию перевод статьи про принцип «poka-yoke».

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

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

Итак, как мы можем предотвратить это? С помощью принципа «poka-yoke».

Что такое poka-yoke?

Poka-yoke – японский термин, который переводится на английский примерно как «mistake-proofing» (защита от ошибки), а в русском варианте более известен, как «защита от дурака». Это понятие возникло в бережливом производстве, где оно относится к любому механизму, который помогает оператору оборудования избежать ошибок.

Помимо производства, poka-yoke часто используется в бытовой электронике. Возьмём, к примеру, SIM-карту, которая благодаря своей асимметричной форме может быть вставлена в адаптер только правильной стороной.

Противоположным примером (без использования принципа poka-yoke) является порт PS/2, имеющий одинаковую форму разъёма и для клавиатуры, и для мыши. Их можно отличить только по цвету и поэтому легко перепутать.

Ещё концепция poka-yoke может использоваться в программировании. Идея в том, чтобы сделать публичные интерфейсы нашего кода как можно более простыми и понятными и генерировать ошибки, как только код будет использоваться неправильно. Это может показаться очевидным, но на самом деле мы часто сталкиваемся с кодом, в котором этого нет.

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

Прежде чем обсуждать конкретные меры, позволяющие сделать код более защищённым от ошибок, важно знать, что механизмы poka-yoke можно разделить на две категории:

  • предотвращение ошибок
  • обнаружение ошибок.

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

С другой стороны, механизмы обнаружения ошибок находятся вне нашего кода. Они контролируют наши приложения, чтобы отслеживать возможные ошибки и предупреждать нас о них. Примером может быть программное обеспечение, которое определяет, имеет ли устройство, подключённое к порту PS/2, правильный тип, и, если нет, сообщает пользователю, почему оно не работает. Такое ПО не могло бы предотвратить ошибку, поскольку разъёмы одинаковые, но оно может обнаружить её и сообщить об этом.

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

Примеры предотвращения ошибок

Объявление типов

Ранее известное как Type Hinting в PHP 5, объявление типов – это простой способ защиты от ошибок при вызове функций и методов в PHP 7. Назначив аргументам функции определённые типы, становится сложнее нарушать порядок аргументов при вызове этой функции.

Например, давайте рассмотрим уведомление, которое мы можем отправить пользователю:

<?php

    class Notification {
        private $userId;
        private $subject;
        private $message;

        public function __construct(
            $userId,
            $subject, 
            $message
        ) {
            $this->userId = $userId;
            $this->subject = $subject;
            $this->message = $message;
        }

        public function getUserId()
        {
            return $this->userId;
        }

        public function getSubject()
        {
            return $this->subject;
        }

        public function getMessage()
        {
            return $this->message;
        }
    }

Без объявления типов можно случайно передать переменные неверного типа, что может нарушить работу приложения. Например, мы можем предположить, что $userId должен быть string, в то время как на самом деле он может быть int.

Если мы передадим в конструктор неправильный тип, то ошибка, вероятно, останется незамеченной до тех пор, пока приложение не попытается что-то сделать с этим уведомлением. И в этот момент, скорее всего, мы получим какое-то загадочное сообщение об ошибке, в котором ничто не будет указывать на наш код, где мы передаём string вместо int. Поэтому обычно предпочтительнее заставить приложение сломаться как можно скорее, чтобы как можно раньше в ходе разработки обнаружить подобные ошибки.

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

<?php

    declare(strict_types=1);

    class Notification {
        private $userId;
        private $subject;
        private $message;

        public function __construct(
            int $userId,
            string $subject, 
            string $message
        ) {
            $this->userId = $userId;
            $this->subject = $subject;
            $this->message = $message;
        }

        public function getUserId() : int
        {
            return $this->userId;
        }

        public function getSubject() : string
        {
            return $this->subject;
        }

        public function getMessage() : string
        {
            return $this->message;
        }
    }

Обратите внимание, что по умолчанию PHP попытается привести неверные аргументы к их ожидаемым типам. Чтобы этого не произошло и сгенерировалась фатальная ошибка, важно разрешить строгую типизацию (strict_types). Из-за этого объявление скалярных типов не является идеальной формой poka-yoke, но служит неплохой отправной точкой для уменьшения количества ошибок. Даже при отключённой строгой типизации объявление типов всё равно может служить подсказкой, какой тип ожидается для аргумента.

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

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

Объекты-значения

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

Когда аргументы имеют разные типы, PHP может предупредить нас о нарушении порядка аргументов, но это не cработает, если у нас несколько аргументов с одним и тем же типом.

Чтобы в этом случае избежать ошибок, мы могли бы обернуть наши аргументы в объекты-значения (value objects):

class UserId {
        private $userId;

        public function __construct(int $userId) {
            $this->userId = $userId;
        }

        public function getValue() : int
        {
            return $this->userId;
        }
    }

    class Subject {
        private $subject;

        public function __construct(string $subject) {
            $this->subject = $subject;
        }

        public function getValue() : string
        {
            return $this->subject;
        }
    }

    class Message {
        private $message;

        public function __construct(string $message) {
            $this->message = $message;
        }

        public function getMessage() : string
        {
            return $this->message;
        }
    }

    class Notification {
        /* ... */

        public function __construct(
            UserId $userId,
            Subject $subject, 
            Message $message
        ) {
            $this->userId = $userId;
            $this->subject = $subject;
            $this->message = $message;
        }

        public function getUserId() : UserId { /* ... */ }

        public function getSubject() : Subject { /* ... */ }

        public function getMessage() : Message { /* ... */ }
    }

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

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

Валидация

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

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

Чтобы предотвратить подобные ошибки, мы могли бы добавить некоторую валидацию в конструктор UserId:

class UserId {
        private $userId;

        public function __construct($userId) {
            if (!is_int($userId) || $userId < 0) {
                throw new \InvalidArgumentException(
                    'UserId should be a positive integer.'
                );
            }

            $this->userId = $userId;
        }

        public function getValue() : int
        {
            return $this->userId;
        }
    }

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

Обратите внимание, что здесь мы могли бы добавить объявление скалярного типа вместо использования is_int, но это заставит нас включать строгую типизацию везде, где используется UserId. Если это не сделать, то PHP будет пытаться приводить другие типы к int всякий раз, когда они передаются в качестве UserId. Это может стать проблемой, так как мы могли бы, например, передать float, который может оказаться неправильной переменной, поскольку идентификаторы пользователя обычно не являются float. В других случаях, когда мы могли бы, например, работать с объектом Price, отключение строгой типизации может привести к ошибкам округления, поскольку PHP автоматически преобразует float-переменные в int.

Неизменяемость

По умолчанию объекты в PHP передаются по ссылке. Это означает, что, когда мы вносим изменения в объект, он мгновенно изменяется во всём приложении.

Хотя у этого подхода есть свои преимущества, он имеет и некоторые недостатки. Рассмотрим пример уведомления, отправляемого пользователю посредством SMS и электронной почты:

interface NotificationSenderInterface
    {
        public function send(Notification $notification);
    }

    class SMSNotificationSender implements NotificationSenderInterface
    {
        public function send(Notification $notification) {
            $this->cutNotificationLength($notification);

            // Send an SMS...
        }

        /**
         * Makes sure the notification does not exceed the length of an SMS.
         */
        private function cutNotificationLength(Notification $notification)
        {
            $message = $notification->getMessage();
            $messageString = substr($message->getValue(), 160);
            $notification->setMessage(new Message($messageString));
        }
    }

    class EmailNotificationSender implements NotificationSenderInterface
    {
        public function send(Notification $notification) {
            // Send an e-mail ...
        }
    }

    $smsNotificationSender = new SMSNotificationSender();
    $emailNotificationSender = new EmailNotificationSender();

    $notification = new Notification(
        new UserId(17466),
        new Subject('Demo notification'),
        new Message('Very long message ... over 160 characters.')
    );

    $smsNotificationSender->send($notification);
    $emailNotificationSender->send($notification);

Поскольку объект Notification передаётся по ссылке, получился непреднамеренный побочный эффект. При сокращении длины сообщения в SMSNotificationSender связанный объект Notification был обновлен во всём приложении, так что сообщение тоже было обрезанным, когда позже отправлялось в EmailNotificationSender.

Чтобы исправить это, сделаем объект Notification неизменяемым. Вместо того чтобы предоставлять set-методы для внесения в него изменений, добавим with-методы, которые делают копию исходного Notification перед внесением этих изменений:

class Notification {
        public function __construct( ... ) { /* ... */ }

        public function getUserId() : UserId { /* ... */ }

        public function withUserId(UserId $userId) : Notification {
            $c = clone $this;
            $c->userId = clone $userId;
            return $c;
        }

        public function getSubject() : Subject { /* ... */ }

        public function withSubject(Subject $subject) : Notification {
            $c = clone $this;
            $c->subject = clone $subject;
            return $c;
        }

        public function getMessage() : Message { /* ... */ }

        public function withMessage(Message $message) : Notification {
            $c = clone $this;
            $c->message = clone $message;
            return $c;
        }
    }

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

Однако обратите внимание, что в PHP очень сложно (если не невозможно) сделать объект по-настоящему неизменяемым. Но для того чтобы сделать наш код более защищённым от ошибок, будет достаточно добавить «неизменяемые» with-методы вместо set-методов, так как пользователям класса больше не нужно будет помнить о необходимости клонировать объект перед внесением изменений.

Возвращение null-объектов

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

Чтобы избавиться от необходимости проверки возвращаемых значений, мы могли бы возвращать вместо этого null-объекты. Например, у нас может быть ShoppingCart со скидкой или без:

interface Discount {
        public function applyTo(int $total);
    }

    interface ShoppingCart {
        public function calculateTotal() : int;

        public function getDiscount() : ?Discount;
    }

При вычислении конечной стоимости ShoppingCart перед вызовом метода applyTo нам теперь всегда нужно проверять, что вернула функция getDiscount(): null или скидку:

    $total = $shoppingCart->calculateTotal();

    if ($shoppingCart->getDiscount()) {
        $total = $shoppingCart->getDiscount()->applyTo($total);
    }

Если не выполнить эту проверку, то мы получим предупреждение PHP и/ или другие побочные эффекты, когда getDiscount() вернёт null.

С другой стороны, этих проверок можно избежать, если мы вернём null-объект, когда скидка не предоставляется:

class ShoppingCart {
        public function getDiscount() : Discount {
            return !is_null($this->discount) ? $this->discount : new NoDiscount();
        }
    }

    class NoDiscount implements Discount {
        public function applyTo(int $total) {
            return $total;
        }
    }

Теперь, когда мы вызываем getDiscount(), мы всегда получаем объект Discount, даже если скидка отсутствует. Таким образом, мы можем применить скидку к итоговой сумме, даже если её нет, и нам больше не нужна инструкция if:

    $total = $shoppingCart->calculateTotal();
    $totalWithDiscountApplied = $shoppingCart->getDiscount()->applyTo($total);

Опциональные зависимости

По тем же причинам, по которым мы желаем избежать null’евых возвращаемых значений, мы хотим избавиться и от опциональных зависимостей, просто сделав все зависимости обязательными.

Возьмём, к примеру, следующий класс:

class SomeService implements LoggerAwareInterface {
        public function setLogger(LoggerInterface $logger) { /* ... */ }

        public function doSomething() {
            if ($this->logger) {
                $this->logger->debug('...');
            }

            // do something

            if ($this->logger) {
                $this->logger->warning('...');
            }

            // etc...
        }
    }

Есть две проблемы:

  1. Нам постоянно нужно проверять наличие логгера в нашем методе doSomething().
  2. При настройке класса SomeService в нашем сервис-контейнере кто-то может забыть сконфигурировать логгер, или он может вообще не знать, что у класса есть возможность это сделать.

Мы можем упростить код, сделав LoggerInterface обязательной зависимостью:

class SomeService {
        public function __construct(LoggerInterface $logger) { /* ... */ }

        public function doSomething() {
            $this->logger->debug('...');

            // do something

            $this->logger->warning('...');

            // etc...
        }
    }

Теперь наш публичный интерфейс стал менее громоздким, и всякий раз, когда кто-то создаёт новый экземпляр SomeService, он знает, что класс требует экземпляр LoggerInterface, и поэтому он никак не сможет забыть указать его.

Кроме того, мы избавились от необходимости постоянной проверки наличия логгера, что делает doSomething() более лёгким для понимания и менее восприимчивым к ошибкам всякий раз, когда кто-то вносит в него изменения.

Если бы мы захотели использовать SomeService без логгера, то могли бы применить ту же логику, что и с возвращением null-объекта:

$service = new SomeService(new NullLogger());

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

Public-методы

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

Свести количество public-методов к минимуму поможет аналогия с транзакциями. Рассмотрим, к примеру, перевод денег между двумя банковскими счетами:

$account1->withdraw(100);
$account2->deposit(100);

Хотя база данных с помощью транзакции может обеспечить отмену снятия денег, если пополнение не может быть сделано (или наоборот), она не может помешать нам забыть вызвать либо $account1->withdraw(), либо $account2->deposit(), что приведёт к некорректной операции.

К счастью, мы легко можем исправить это, заменив два отдельных метода одним транзакционным:

$account1->transfer(100, $account2);

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

Примеры обнаружения ошибок

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

Unit-тесты

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

Поскольку кто-то может забывать проводить unit-тестирование, рекомендуется автоматически запускать тесты при внесении изменений с использованием таких сервисов, как Travis CI и GitLab CI. Благодаря им разработчики получают уведомления, когда что-то ломается, что также помогает убедиться, что сделанные изменения работают так, как задумывалось.

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

Отчёты о покрытии кода тестами и мутационное тестирование

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

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

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

Статические анализаторы кода

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

Помимо анализаторов, встроенных в большинство IDE, в процесс сборки наших приложений можно включить сторонние и даже пользовательские анализаторы для выявления конкретных проблем. Неполный список анализаторов, подходящих для проектов на PHP, можно найти на GitHub.

Существуют также онлайн-решения, например, SensioLabs Insights.

Логирование

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

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

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

Не подавлять ошибки

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

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

Помимо error_reporting, важно всегда включать strict_types, чтобы PHP не пытался автоматически приводить аргументы функций к их ожидаемому типу, поскольку это может приводить к трудно обнаруживаемым ошибкам (например, ошибкам округления при приведении float к int).

Использование вне PHP

Поскольку poka-yoke скорее концепция, чем конкретная методика, её также можно применять в сферах, не связанных с PHP.

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

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

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

REST API

При создании REST API можно внедрить poka-yoke, чтобы упростить использование API. Например, мы можем убедиться, что возвращаем ошибку всякий раз, когда неизвестный параметр передаётся в URL или в теле запроса. Это может показаться странным, поскольку мы, очевидно, хотим избежать «поломки» наших API-клиентов, но, как правило, лучше как можно скорее предупреждать разработчиков, использующих наш API, о некорректном использовании, чтобы ошибки были исправлены на ранней стадии процесса разработки.

Например, у нас в API может быть параметр color, но кто-то, кто использует наш API, может случайно использовать параметр colour. Без каких-либо предупреждений эта ошибка может запросто попасть в продакшн, пока её не заметят конечные пользователи.

Чтобы узнать, как создавать API, которые не доставят вам хлопот, прочтите книгу Building APIs You Won’t Hate.

Конфигурация приложения

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

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

Предотвращение ошибок пользователя

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

Заключение

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

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

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

Время чтения: 7 мин.

Музей Toyota.

Музей Toyota. TOYOTA Commemorative Museum of Industry and Technology. Flickr/cotaro70s

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

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

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

Poka-yoke - метод, известный также как «защита от дурака».

Flickr/Michel Curi

Для того, чтобы избегать подобных глупых ошибок и существует метод poka-yoke (читается как пока-ёкэ). Изобретение (а точнее формализацию и адаптацию к условиям производства) этого метода приписывают японскому инженеру Сигэо Синго.

Название poka-yoke происходит от двух японских слов: избегать (yokeru) и
ошибка (poka). Изначально концепция Сигэо Синго называлась baka-yoke, что можно
перевести как «защита от идиота». Но когда, согласно легенде, Синго излагал
свои идеи перед рабочими производственной линии Toyota, одна из работниц
расплакалась. «Я не идиот!» — возмутилась она. Тогда инженер решил переименовать
концепцию в «защиту от ошибок», а не от идиота.1   

Тем не менее, в русском языке poka-yoke традиционно обозначается как
«защита от дурака». Иногда poka-yoke называют принципом нулевой ошибки.

Принцип метода

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

Poka-yoke - метод, известный также как «защита от дурака».

Парковка с использованием poka-yoke. Flickr/Martin Burns

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

Можно привести и бытовые примеры защиты от дурака. Например, в некоторых
автомобилях с механической коробкой передач перед тем как включить зажигание
нужно нажать педаль сцепления. А многие автомобили с автоматической коробкой не
заводятся, если коробка передач не стоит в положении «парковка». Наиболее
простой пример — дополнительное отверстие слива, расположенное у верхней кромки
раковины. Если забудете выключить воду — она не перельется через край.

Poka-yoke - метод, известный также как «защита от дурака».

Flickr/Matthew Paul Argall

В борьбе за чистоту речи

Майкл Шрейг из  бизнес-школы при
Массачусетском технологическом институте приводит такой пример — уже из
профессиональной области. Он и его коллеги зачастую вели слишком эмоциональную
переписку, используя не слишком подходящую для рабочей коммуникации лексику.
Эмоции проходили, а испорченные отношения оставались. Тогда Шрейг создал
простой фильтр для исходящих сообщений, который не пропускал слова, типа
«идиот», «дебил», «придурок», «задница» и т.п. Если в сообщении были такие
слова, программа спрашивала: «Вы действительно хотите это отправить?» Если отправитель
выбирал «да», то следовал вопрос: «Вы уверены?»

Шрейг предложил свой poka-yoke фильтр Microsoft. Но компания не
заинтересовалась.1

Flickr/Lorie Shaull

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

Poka-yoke
— пример Toyota

Poka-yoke - метод, известный также как «защита от дурака».

Музей Toyota. TOYOTA Commemorative Museum of Industry and Technology. Flickr/cotaro70s

А
вот как используется принцип poka-yoke в компании Toyota, откуда, собственно,
этот принцип и происходит.

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

Другой
вариант обеспечения poka-yoke — оборудование, которое просто не позволяет
выполнение операций ненадлежащим образом. Например, удерживающие устройства,
используемые при вытачивании деталей, устроены на производстве Toyota таким
образом, что они позволяют удержание детали только в правильном положении.
Вставить деталь неправильным образом просто невозможно.2

И
подобные механизмы применяются в Toyota на самых разных этапах производства. В
целом, можно выделить механизмы poka-yoke, которые извещают оператора о
возможности возникновения ошибки, и механизмы, которые предотвращают
возникновение ошибок. Сигэо Синго назвал их предупреждающей poka-yoke и
контролирующей poka-yoke, соответственно.3

Ошибки неизбежны, но…

Poka-yoke - метод, известный также как «защита от дурака».

Музей Toyota. TOYOTA Commemorative Museum of Industry and Technology. Flickr/cotaro70s

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


Релевантно: В чем секрет японского производства. Монодзукури — что это, и как оно работает


  1. Schrage M. Poka-Yoke is Not a Joke. Harvard Business Review. Feb 04, 2010.
  2. The official blog of Toyota GB — Poka-yoke – Toyota Production System guide.
  3. Shingo, Shigeo; Dillon, Andrew (1989). A study of the Toyota production system from an industrial engineering viewpoint. Portland, OR: Productivity Press

На главную ИЛИ ЧИТАТЬ ЕЩЕ:

  • Провальная пиар кампания от McDonald’s. Какие можно извлечь урокиПровальная пиар кампания от McDonald’s. Какие можно извлечь уроки

    Пытаясь оправдать минимальные зарплаты, McDonald’s решил научить людей обращаться с деньгами. Это была провальная пиар кампания, вызвавшая общественное недовольство.

  • Что произошло с Microsoft, и как Google пытается избежать той же участи. Дисбаланс операционных и динамических способностейЧто произошло с Microsoft, и как Google пытается избежать той же участи. Дисбаланс операционных и динамических способностей

    Microsoft утратила позиции лидера хайтека. То, что произошло с Microsoft можно описать как нарушение баланса операционных и динамических способностей.

  • Билл Гейтс о коронавирусеБилл Гейтс о коронавирусе

    Билл Гейтс — не только миллиардер, но и большой авторитет в области общественного здоровья. Что говорит Билл Гейтс о коронавирусе.

  • Истории успеха не учат. Менеджеры и компании учатся на историях неудач. ИсследованиеИстории успеха не учат. Менеджеры и компании учатся на историях неудач. Исследование

    По данным ученых, изучение чужого негативного опыта гораздо ценнее, чем изучение позитивного опыта. Поэтому истории успеха бесполезны в…

  • Т-образные работники — почему они необходимы компаниямТ-образные работники — почему они необходимы компаниям

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

  • Ресурсы и операции — баланс потребностей и возможностей организацииРесурсы и операции — баланс потребностей и возможностей организации

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

  • Прекрастинация — откуда берутся бездумные ответы и непродуманные планыПрекрастинация — откуда берутся бездумные ответы и непродуманные планы

    Прекрастинация — феномен обратный прокрастинации. Люди со склонностью к прекрастинации действуют быстро, но не всегда эффективно. Опасно…

  • Как повысить продуктивность, не прикладывая больших усилийКак повысить продуктивность, не прикладывая больших усилий

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

  • Что нужно делать, чтобы возглавить компанию. Мнение президента Walmart Inc.Что нужно делать, чтобы возглавить компанию. Мнение президента Walmart Inc.

    Три простых совета тем, кто хочет когда-нибудь возглавить компанию, от президента крупнейшей сети супермаркетов в США Дага Макмиллона.

  • Почему люди глупеют на совещаниях? Углекислый газ тому причиной (наравне с плохой организацией)Почему люди глупеют на совещаниях? Углекислый газ тому причиной (наравне с плохой организацией)

    Ученые установили, что люди глупеют на совещаниях. И причиной тому, помимо плохой организации, служит углекислый газ. Участники глупеют…

  • Что случилось с Kodak — чем может обернуться боязнь новогоЧто случилось с Kodak — чем может обернуться боязнь нового

    Компания Kodak не выдержала конкуренции со стороны производителей цифровых фотокамер. Горькая ирония состоит в том, что цифровая камера была изобретена самой компанией …

  • Жадность или убеждения. В чем IKEA противоречит своему собственному кодексу поведенияЖадность или убеждения. В чем IKEA противоречит своему собственному кодексу поведения

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

  • Рикардо Семлер и его управленческий метод. Задолго до холакратии и бирюзовых организаций…Рикардо Семлер и его управленческий метод. Задолго до холакратии и бирюзовых организаций…

    Задолго до появления «бирюзовых организаций» и холакратии Рикардо Семлер ввел на своем предприятии систему управления, использующие их принципы.

Понравилась статья? Поделить с друзьями:
  • Предосудительный поступок ошибка недостаток 4 буквы
  • Предостеречь от совершения ошибок
  • Предостеречь от ошибки или об ошибке
  • Предостеречь от поступка лексическая ошибка
  • Предостеречь от опасности лексическая ошибка