Что такое poka yoke
Poka-yoke
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 Yoke
Для предотвращения ошибок необходимо отнести проверку качества в структуру выполняемых процессов в качестве их рабочего этапа. Метод Poka-yoke, применяемый вместе с другими инструментами бережливого производства, служит гарантией того, что изделие бездефектно, а процесс его производства протекает без сбоев (см. схему 1).
Схема 1. Принцип действия Poka-yoke
Производственный Пример: при сверлении на вертикально-сверлильном станке со стойкой обрабатываемое изделие часто закреплялось в зеркально перевернутом виде. Результат – неправильное положение сверления, которое было обнаружено только при монтаже. Причина дефекта: Ошибка при закреплении изделия.
Вопрос: Как можно предотвратить этот дефект? Типичная ошибка, которую можно устранить, используя:
Дефекта больше не будет!
Сегодня для предотвращения ошибочных действий применяются жесткие и мягкие мероприятия. К жестким относятся: геометрически замкнутые формы, точные размеры, одинаковый материал, проверка процесса с отключением и др. Часто применяются более мягкие мероприятия, как например, использование окрашивания разными цветами, различных конфигураций или в последовательностей в выполнении монтажа, свечение, сигналы, указания.
Производственные Примеры:
Схема 2. Poka-yoke во вспомогательных материалах на японском предприятии.
Схема 3. Poka-yokeв процессе установки детали на немецком предприятии.
Выдвинутый доктором Схинго производственный принцип нулевой ошибки базируется на 3 компонентах:
Пока-ёкэ — метод предупреждения ошибок
Что означает “ПОКА-ЁКЭ”?
Термин “пока-ёкэ” переводится как “предупреждение ошибок” или “предупреждение отклонений”. Цель инструмента “пока-ёкэ” — предотвратить появление дефектов благодаря своевременному обнаружению, исправлению и устранению ошибок в первоисточнике проблем. Сам термин был придуман в 1960 — х годах японским инженером Сигэо Синго, одним из создателей производственной системы Тойота. Сам Сигэо Синго называл метод пока-ёкэ методом “защиты от дурака”.
Инструмент “пока-ёкэ” позволяет улучшить производственные процессы с точки зрения качества. С помощью этого инструмента ошибки можно предотвратить, либо выявить их сразу после возникновения. Это позволяет не попадать дефектам на последующие производственные процессы. Более того, незамедлительное решение проблем позволяет значительно сократить время, по сравнению с тем, если бы пришлось искать причины дефекта или ошибки, обнаруженные на последнем этапе производственного цикла.
Почему возникают ошибки?
Работники совершают ошибки не потому, что не соблюдают стандарты или правила выполнения процедур и работ. Людям просто свойственно ошибаться. Ошибки свидетельствуют о несостоятельности систем и методов, применяемых в работе. А возникновение ошибок случается потому, что данный метод позволяет их допускать. В бережливом производстве такой подход позволяет возложить ответственность за ошибки не на людей, а систему. Работники, избавленные от обвинений, могут сосредоточить свои силы на разработке методов, исключающих возникновение ошибок.
При разработке эффективного метода предупреждения ошибок, нужно сосредоточиться на следующих вопросах:
Если ошибку совершает один человек, то необходимо пересмотреть стандарты работы и убедиться, что никакие этапы не пропущены или не доработаны. Если ошибка допускается массово, то здесь уже необходимо задуматься об отсутствии необходимых сведений или нечетких инструкциях. Самое трудное — найти первопричину ошибок и подойти творчески к ее решению. Ошибки исключить полностью невозможно. Однако, можно встроить методы и средства обнаружения дефектов, чтобы ошибки или дефекты не оказались у потребителя.
Как внедрить пока-ёкэ в производственный процесс?
Пока-ёкэ можно внедрить в любой производственный процесс, где возникают ошибки.
Преимущества от внедрения пока-ёкэ
Примеры защиты от ошибок пока-ёкэ в повседневной жизни:
Примеры использования пока-ёкэ на производстве:
Рабочая инструкция «Системы защиты от ошибок (Poka Yoke)»
Системы защиты от ошибок (Poka Yoke)
1.ЦЕЛЬ
Установить порядок разработки и использования систем защиты от ошибок при выпуске продукции.
2.ТЕРМИНЫ, ОПРЕДЕЛЕНИЯ И СОКРАЩЕНИЯ
Ответственность за включение систем защиты от ошибок в техпроцесс сборки изделий несут сотрудники ДР. За функционирование и проверку их работоспособности — ООО. В случае возникновения необходимости применения дополнительных систем защиты от ошибок в ходе массового производства, ответственность за их разработку и внедрение несут сотрудники ОГТ.
3.ОПИСАНИЕ
Системы защиты от ошибок разделяют на:
Наличие системы, благодаря которой операцию можно выполнить только одним единственным, правильным способом, в результате чего неправильная сборка исключается, и дефект просто не может возникнуть, — это идеальный пример проведения предупреждающих действий.
Исторически первый случай осознанного применения систем Poka Yoke — это изобретение ткацкого станка, который останавливался при обрыве нити, и таким образом не был способен производить дефектную ткань.
Другие примеры защиты от ошибок:
Рисунок 1 — пример устройства контактного типа для защиты от ошибок.
Системы защиты от ошибок следует устанавливать в тех местах техпроцесса, в которых невнимательность оператора может повлиять на значение ключевых характеристик процесса или собираемого продукта.
Места установки и использования выявляются при проведении FMEA — анализа причин и последствий потенциальных отказов, который проводится при проектировании любого нового технологического процесса или при его модернизации.
Проанализировав существующие процессы и оборудование с целью определить те их элементы, которые имеют решающее значение для критических характеристик. Также можно определить необходимость и места использования инструментов Poka-Yoke.
Для наиболее эффективного применения систем защиты от ошибок следует вовлекать операторов, выполняющих изучаемые операции. В рабочие группы по проведению FMEA, а также по выявлению и устранению ошибок и дефектов и реализации идеи встроенного качества (не бери — не делай – не передавай).
Работа начинается с выявления характера реальных или предполагаемых дефектов. Затем определяются их причины (с помощью метода «5 почему») и выявляются параметры, изменяемые одновременно с действием этой причины. После аналитической стадии переходят к стадии творческой, придумывая, как исключить саму возможность появления дефекта. Или хотя бы предупредить о возможном его появлении. В результате появляется идея системы Poka-Yoke.
Места установки систем защиты от ошибок помечаются в карте потока процесса специальным значком «PY»
B планах управления следует предусматривать регулярную проверку работоспособности установленных систем защиты от ошибок (обязательно — при каждом запуске процесса сборки изделий).
Poka-yoke — «защита от дурака» как фундаментальный принцип производства. И не только…
Как известно, людям свойственно ошибаться. Иногда ошибки бывают настолько глупыми, что человек никак не может понять, как он вообще умудрился сделать нечто подобное. Когда уже поздно…
И вот такие глупейшие «необязательные» ошибки, которых, на первый взгляд легко избежать, порой обходятся весьма дорого. Цифра, помещенная не в ту колонку Excel, грамматическая ошибка в презентации, электронное письмо, отправленное не тому адресату могут в буквальном смысле похоронить проект.
А такие ошибки, как баг в критически важном программном обеспечении или оставленный инструмент в операционной ране переносят нас из области потерянных возможностей в область профессиональной халатности.
Poka-yoke — метод избежания ошибок
Для того, чтобы избегать подобных глупых ошибок и существует метод poka-yoke (читается как пока-ёкэ). Изобретение (а точнее формализацию и адаптацию к условиям производства) этого метода приписывают японскому инженеру Сигэо Синго.
Название poka-yoke происходит от двух японских слов: избегать (yokeru) и ошибка (poka). Изначально концепция Сигэо Синго называлась baka-yoke, что можно перевести как «защита от идиота». Но когда, согласно легенде, Синго излагал свои идеи перед рабочими производственной линии Toyota, одна из работниц расплакалась. «Я не идиот!» — возмутилась она. Тогда инженер решил переименовать концепцию в «защиту от ошибок», а не от идиота. 1
Тем не менее, в русском языке poka-yoke традиционно обозначается как «защита от дурака». Иногда poka-yoke называют принципом нулевой ошибки.
Принцип метода
Идея poka-yoke проста. В рабочий процесс необходимо закладывать механизмы, выявляющие ошибки, предотвращающие их или обеспечивающие выполнение процесса только надлежащим образом. Сигэо Синго искал простейшие, надежнейшие и наиболее дешевые способы создания таких механизмов.
Парковка с использованием poka-yoke. Flickr/Martin Burns
Например, если необходимо, чтобы рабочий сборочной линии при выполнении определенного процесса использовал непременно три болта, следует доставлять ему болты в упаковке по три штуки. Тогда, если он вкрутит меньше трех болтов, то сразу заметит и исправит эту ошибку. 1
Можно привести и бытовые примеры защиты от дурака. Например, в некоторых автомобилях с механической коробкой передач перед тем как включить зажигание нужно нажать педаль сцепления. А многие автомобили с автоматической коробкой не заводятся, если коробка передач не стоит в положении «парковка». Наиболее простой пример — дополнительное отверстие слива, расположенное у верхней кромки раковины. Если забудете выключить воду — она не перельется через край.
Flickr/Matthew Paul Argall
В борьбе за чистоту речи
Майкл Шрейг из бизнес-школы при Массачусетском технологическом институте приводит такой пример — уже из профессиональной области. Он и его коллеги зачастую вели слишком эмоциональную переписку, используя не слишком подходящую для рабочей коммуникации лексику. Эмоции проходили, а испорченные отношения оставались. Тогда Шрейг создал простой фильтр для исходящих сообщений, который не пропускал слова, типа «идиот», «дебил», «придурок», «задница» и т.п. Если в сообщении были такие слова, программа спрашивала: «Вы действительно хотите это отправить?» Если отправитель выбирал «да», то следовал вопрос: «Вы уверены?»
Шрейг предложил свой poka-yoke фильтр Microsoft. Но компания не заинтересовалась. 1
Flickr/Lorie Shaull
В наше время роль технологий как никогда велика. Пытаться заменить человека технологией — стало всеобщей тенденцией. Ведущие хай-тек компании уже работают над тем, чтобы создать автомобили без водителей, офисы без офисных работников, станки без операторов и т.д. Но возможно, самое лучшее, что могут сделать машины — это выявлять, минимизировать и устранять наши ошибки?
Poka-yoke — пример Toyota
А вот как используется принцип poka-yoke в компании Toyota, откуда, собственно, этот принцип и происходит.
Вся производственная система Toyota направлена на обеспечение максимальной эффективности и безошибочных процессов. Часть системы — оборудование, которое автоматически останавливается при возникновении ошибки. Это ведет к выявлению, исправлению, а то и полному предотвращению ошибок.
Другой вариант обеспечения poka-yoke — оборудование, которое просто не позволяет выполнение операций ненадлежащим образом. Например, удерживающие устройства, используемые при вытачивании деталей, устроены на производстве Toyota таким образом, что они позволяют удержание детали только в правильном положении. Вставить деталь неправильным образом просто невозможно. 2
И подобные механизмы применяются в Toyota на самых разных этапах производства. В целом, можно выделить механизмы poka-yoke, которые извещают оператора о возможности возникновения ошибки, и механизмы, которые предотвращают возникновение ошибок. Сигэо Синго назвал их предупреждающей poka-yoke и контролирующей poka-yoke, соответственно. 3
Ошибки неизбежны, но…
Сигэо Синго утверждает, что ошибки неизбежны на любом производстве. Но если на производстве имеются адекватные механизмы poka-yoke, то ошибки не переходят в дефекты. А устранение дефектов, в свою очередь, ведет к снижению стоимости ошибок. 3
На главную ИЛИ ЧИТАТЬ ЕЩЕ:
Применение принципа poka-yoke в программировании на примере PHP
Всем привет! Я Алексей Грезов, разработчик 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 остановится и немедленно предупредит нас фатальной ошибкой, как только мы попытаемся передать параметр не того типа:
Обратите внимание, что по умолчанию PHP попытается привести неверные аргументы к их ожидаемым типам. Чтобы этого не произошло и сгенерировалась фатальная ошибка, важно разрешить строгую типизацию ( strict_types ). Из-за этого объявление скалярных типов не является идеальной формой poka-yoke, но служит неплохой отправной точкой для уменьшения количества ошибок. Даже при отключённой строгой типизации объявление типов всё равно может служить подсказкой, какой тип ожидается для аргумента.
Кроме того, мы объявили типы возвращаемых данных для наших методов. Это упрощает определение того, какие значения мы можем ожидать при вызове той или иной функции.
Объекты-значения
Проблема, которую не может решить объявление типов, заключается в том, что наличие нескольких аргументов функции позволяет перепутать их порядок при вызове.
Когда аргументы имеют разные типы, PHP может предупредить нас о нарушении порядка аргументов, но это не cработает, если у нас несколько аргументов с одним и тем же типом.
Чтобы в этом случае избежать ошибок, мы могли бы обернуть наши аргументы в объекты-значения (value objects):
Поскольку наши аргументы теперь имеют очень специфический тип, их почти невозможно перепутать.
Дополнительным преимуществом использования объектов-значений по сравнению с объявлением скалярных типов является то, что нам больше не нужно включать строгую типизацию в каждом файле. А если нам не нужно об этом помнить, то мы не сможем об этом забыть.
Валидация
При работе с объектами-значениями мы можем инкапсулировать логику проверки своих данных внутри самих объектов. Таким образом, можно предотвратить создание объекта-значения с недопустимым состоянием, которое может привести к проблемам в будущем в других слоях нашего приложения.
Например, у нас может быть правило, согласно которому любой UserId всегда должен быть положительным. Мы могли бы, очевидно, проверять его всякий раз, когда получаем UserId в качестве входных данных, но, с другой стороны, его также можно легко забыть в том или ином месте. И даже если эта забывчивость приведёт к фактической ошибке в другом слое нашего приложения, из сообщения об ошибке может быть сложно понять, что на самом деле пошло не так, а это усложнит отладку.
Чтобы предотвратить подобные ошибки, мы могли бы добавить некоторую валидацию в конструктор UserId :
Таким образом, мы всегда можем быть уверены, что при работе с объектом UserId он имеет правильное состояние. Это избавит нас от необходимости постоянно проверять данные на разных уровнях приложения.
Неизменяемость
По умолчанию объекты в PHP передаются по ссылке. Это означает, что, когда мы вносим изменения в объект, он мгновенно изменяется во всём приложении.
Хотя у этого подхода есть свои преимущества, он имеет и некоторые недостатки. Рассмотрим пример уведомления, отправляемого пользователю посредством SMS и электронной почты:
Чтобы исправить это, сделаем объект Notification неизменяемым. Вместо того чтобы предоставлять set-методы для внесения в него изменений, добавим with-методы, которые делают копию исходного Notification перед внесением этих изменений:
Однако обратите внимание, что в PHP очень сложно (если не невозможно) сделать объект по-настоящему неизменяемым. Но для того чтобы сделать наш код более защищённым от ошибок, будет достаточно добавить «неизменяемые» with-методы вместо set-методов, так как пользователям класса больше не нужно будет помнить о необходимости клонировать объект перед внесением изменений.
Возвращение null-объектов
Чтобы избавиться от необходимости проверки возвращаемых значений, мы могли бы возвращать вместо этого null-объекты. Например, у нас может быть ShoppingCart со скидкой или без:
При вычислении конечной стоимости ShoppingCart перед вызовом метода applyTo нам теперь всегда нужно проверять, что вернула функция getDiscount(): null или скидку:
С другой стороны, этих проверок можно избежать, если мы вернём null-объект, когда скидка не предоставляется:
Опциональные зависимости
По тем же причинам, по которым мы желаем избежать null’евых возвращаемых значений, мы хотим избавиться и от опциональных зависимостей, просто сделав все зависимости обязательными.
Возьмём, к примеру, следующий класс:
Мы можем упростить код, сделав LoggerInterface обязательной зависимостью:
Кроме того, мы избавились от необходимости постоянной проверки наличия логгера, что делает doSomething() более лёгким для понимания и менее восприимчивым к ошибкам всякий раз, когда кто-то вносит в него изменения.
Если бы мы захотели использовать SomeService без логгера, то могли бы применить ту же логику, что и с возвращением null-объекта:
Public-методы
Чтобы сделать код проще в использовании, лучше ограничить количество public-методов в классах. Тогда код становится менее запутанным, и у нас меньше шансов отказаться от обратной совместимости при рефакторинге.
Свести количество public-методов к минимуму поможет аналогия с транзакциями. Рассмотрим, к примеру, перевод денег между двумя банковскими счетами:
К счастью, мы легко можем исправить это, заменив два отдельных метода одним транзакционным:
В результате наш код становится более надёжным, поскольку будет сложнее совершить ошибку, завершив транзакцию частично.
Примеры обнаружения ошибок
Механизмы обнаружения ошибок не предназначены для их предотвращения. Они должны лишь предупреждать нас о проблемах, когда они обнаруживаются. Большую часть времени они находятся за пределами нашего приложения и проверяют код через определённые промежутки времени или после конкретных изменений.
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 имеет тенденцию продолжать работу, когда происходит «восстанавливаемая» ошибка. Однако ошибки могут быть полезны при разработке или тестировании новых функций, поскольку могут указывать на ошибки в коде. Вот почему большинство анализаторов кода предупреждают вас, когда обнаруживают, что вы используете @ для подавления ошибок, так как это может скрывать ошибки, которые неизбежно появятся снова, как только приложение станет использоваться.
Использование вне PHP
Поскольку poka-yoke скорее концепция, чем конкретная методика, её также можно применять в сферах, не связанных с PHP.
Инфраструктура
На уровне инфраструктуры многие ошибки могут быть предотвращены путём создания общей среды разработки, идентичной среде production, с использованием таких инструментов, как Vagrant.
Автоматизация развёртывания приложения с использованием серверов сборки, таких как Jenkins и GoCD, может помочь предотвратить ошибки при развёртывании изменений в приложении, поскольку этот процесс может включать в себя множество шагов, часть из которых легко забыть выполнить.
REST API
При создании REST API можно внедрить poka-yoke, чтобы упростить использование API. Например, мы можем убедиться, что возвращаем ошибку всякий раз, когда неизвестный параметр передаётся в URL или в теле запроса. Это может показаться странным, поскольку мы, очевидно, хотим избежать «поломки» наших API-клиентов, но, как правило, лучше как можно скорее предупреждать разработчиков, использующих наш API, о некорректном использовании, чтобы ошибки были исправлены на ранней стадии процесса разработки.
Чтобы узнать, как создавать API, которые не доставят вам хлопот, прочтите книгу Building APIs You Won’t Hate.
Конфигурация приложения
Такие моменты трудно отследить, ведь приложение не инициирует ошибку как таковую. И лучший способ получить уведомление при неправильной настройке – просто не предоставлять никаких значений по умолчанию и сгенерировать ошибку, как только будет отсутствовать параметр конфигурации.
Предотвращение ошибок пользователя
Концепция poka-yoke также может использоваться для предотвращения или обнаружения ошибок пользователей. Например, в бухгалтерском программном обеспечении номер счёта, введённый пользователем, может быть проверен с помощью алгоритма контрольной цифры. Это не позволит ввести номер счёта с опечаткой.
Заключение
Хотя poka-yoke представляет собой только концепцию, а не определённый набор инструментов, существуют различные принципы, которые мы можем применить к коду и процессу разработки, чтобы предотвратить ошибки или обнаружить их на раннем этапе. Очень часто эти механизмы будут специфичны для самого приложения и его бизнес-логики, но есть несколько простых методов и инструментов, которые можно использовать, чтобы сделать более надёжным любой код.
Главное – помнить, что, хотя мы хотим избежать ошибок в продакшне, они могут оказаться очень полезными в процессе разработки, и мы не должны бояться инициировать их как можно скорее, чтобы было легче их отслеживать. Эти ошибки могут быть сгенерированы либо самим кодом, либо отдельными процессами, которые выполняются отдельно от приложения и контролируют его извне.
Чтобы ещё больше уменьшить количество ошибок, мы должны стремиться к тому, чтобы public-интерфейсы нашего кода были максимально простыми и понятными.