воскресенье, 23 января 2011 г.

Карточка №205 «Как посчитать амперы?»

ИСТОЧНИК:

СИТУАЦИЯ:
«Возникла тут одна программистская задача, вкратце выглядит так. Есть 16-разрядное микропроцессорное устройство без плавающей арифметики. Есть необходимость масштабирования сигналов. То есть измеренное (в дискретах) 16-разрядное целое надо умножить на масштабный коэффициент (конечно, вещественный в общем случае), чтобы получить значение в нужном диапазоне и в нужных величинах (скажем, в амперах).

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

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

Результат обескураживает - на дисплее отображается полный бред. Проверяем, откуда руки у испытателей растут и как они задали исходные параметры. Убеждаемся, что задали неправильно. Задаем правильно и снова получаем бред… При отладке обнаруживается, что делитель d был равен 500, но после того, как его вместе с множителем m поделили на 1000, чтобы избежать переполнения, вместо одной проблемы имеем другую - в знаменателе получился ноль!..

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

Как быть?

СИСТЕМНОЕ ПРОТИВОРЕЧИЕ:
Сигнал должен быть выражен в абсолютных величинах и не должен быть выражен в абсолютных величинах (должен быть выражен в величинах относительных)

РЕШЕНИЕ:
«Тут один товарищ (назовем его "представителем заказчика", хотя это не то, что подразумевалось в советское время; просто подчеркнем, что к процессу программирования устройства в этой его части он имеет весьма косвенное отношение) говорит - а у нас там что? Амперы? И в 1000 раз меньше показывает? Ну так давайте напишем, что это КИЛОамперы, и все будет как надо!..»

ИСПОЛЬЗОВАННЫЙ ПРИЕМ:
Прием «обратить вред в пользу»

КОММЕНТАРИЙ:
«Я обрадовался, он обрадовался, а начальник почесал репу и сказал, что не верит в такие простые решения... Не бывает так, чтобы приходили с глобально фатальной проблемой, а уходили с тем, что и делать ничего не надо вовсе! Тут я сразу про ТРИЗ и вспомнил. ИКР это называется, то бишь Идеальный Конечный Результат. Совершенно классический пример - и делать ничего не надо, и проблема решена!»

КАТЕГОРИЯ:
ТРИЗ в программировании


Комментариев нет:

Отправить комментарий