Автор Тема: Про важность правильных циклов.  (Прочитано 16495 раз)

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Про важность правильных циклов.
« : Июнь 06, 2012, 08:32:46 am »
Чтобы было понятно о чем речь, небольшое вступление:
Мы создаем некий програмно-аппаратный комплекс. Ну, как комплекс.. Сенсор + цифровой мозг (микроконтроллер, плата) + bluetooth low energy по которому эти данные передаются на какой-нибудь iPhone, или персоналку, и где они затем в реальном времени забавными численными методами обрабатываются. Решение околомедицинское (ну, то есть не для реанимации, но для фонового мониторинга пациентов, для людей вообще следящих за своим здоровьем, для тех кто занимается фитнесом в том числе, для тех кто любит полазить по горам).

У сенсора есть некий параметр, которым можно рулить как с микроконтроллера, так и с iPhone/PC. Параметр критически важный, если его выставить не правильно, то процесс измерения нарушится.

Буквально пару дней назад внезапно обнаружилось странное: выставляем одно значение этого параметра, а сенсор нам говорит, что выставлено на самом деле совсем другое. Ну, то есть скажем выставили параметр в единицу, а он говорит, что нифига, тройка там. Плюс были еще некие странности с непосредственно данными получаемыми от собственно процесса измерений. Начали разбираться. На стороне iPhone проверили - все ОК, тут ошибки нет. Пошли разбираться с микроконтроллером. Посмотрели код - все вроде бы хорошо. Пошли дебажить протокол обмена между ним и сенсором. Дебаггер там конечно никак не поможет, поэтому воткнули осцилограф, пошли битики считать на нем. Там вроде тоже все хорошо. Пародоксальная ситуация - все хорошо, а параметр выставляется не правильно!

Ладно, пошли шагать в дебагере по коду микроконтроллера, а ну как там ошибка? Ошибки в коде не обнаружилось, зато обнаружилось, что после того как байт с сенсора принят, в момент посылки сигнала STOP по I2C, принятый байт портится. Если в байте было число n, то становится 2*n+1 (ну, или  (n << 1) | 1 ). А поскольку значения-результаты измерений у нас были двух байтовые, то вместо числа 10, мы получали число 277, а вместо 1 мы конечно же получали 3 (тот параметр однобайтовый). Кода отвечающего за это поведения просто нет - ошибка на уровне камня. (а камень у нас от всем известной американской компании широко известной в том числе научными калькуляторами и микроконтроллерами). Воткнули код для обхода этой ошибки, теперь у нас все работает корректно.

При чем тут циклы? А циклы тут не при чем, как и в случае всех остальных ошибок которые я видел как минимум за последний год в нашей команде. Процентов 70-80 ошибок которые вылезают имеют характер подобный вышеописанной ошибке.

PS. И пошаговый отладчик, логгирование и осцилограф помогает отловить именно такие вот ошибки, которые другими методами отловить просто не реально (а таких ошибок, повторю, процентов 70-80). А циклы в отладчике никто не гоняет, в них ошибок просто не бывает.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

DIzer

  • Гость
Re: Про важность правильных циклов.
« Ответ #1 : Июнь 06, 2012, 08:46:20 am »
И... что вы хотели этим примером сказать? Лично я вижу следующее... на вход в вашу систему поступают  неверные (в контексте вашей модели обработки) данные. Вы модифицировали (расширили) модель их обработки и стало все ОК... банальщина... или я что то не улавливаю?
Циклы тут действительно не причем.. но также  не причем и Прометей, коровник, и ежик в тумане..

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Про важность правильных циклов.
« Ответ #2 : Июнь 06, 2012, 08:52:06 am »
И... что вы хотели этим примером сказать? Лично я вижу следующее... на вход в вашу систему поступают  неверные (в контексте вашей модели обработки) данные. Вы модифицировали (расширили) модель их обработки и стало все ОК... банальщина... или я что то не улавливаю?
Дело в том, что и сенсор и микроконтроллер и алгоритмы на чем-то мощном (тот же iPhone) - это все наша система. Целиком и полностью. Если проводить аналог, для тех кто привык к десктопам, представьте себе, что ваш процессор при сложении некоторых чисел стал выдавать удвоенный результат.

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

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

DIzer

  • Гость
Re: Про важность правильных циклов.
« Ответ #3 : Июнь 06, 2012, 09:04:43 am »
а это что такое  "Воткнули код для обхода этой ошибки, теперь у нас все работает корректно." - в моей системе понятий это и есть уточнение модели.

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Про важность правильных циклов.
« Ответ #4 : Июнь 06, 2012, 09:21:56 am »
а это что такое  "Воткнули код для обхода этой ошибки, теперь у нас все работает корректно." - в моей системе понятий это и есть уточнение модели.
Код микроконтроллера. Ведь его тоже программируем мы. Этот воткнутый код - типичный workaround. Логически он ниоткуда не следует. В следующей ревизии камня он будет, видимо, бесполезен либо вреден.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

DIzer

  • Гость
Re: Про важность правильных циклов.
« Ответ #5 : Июнь 06, 2012, 09:22:32 am »
Далее, что за фигня
PS. И пошаговый отладчик, логгирование и осцилограф помогает отловить именно такие вот ошибки, которые другими методами отловить просто не реально (а таких ошибок, повторю, процентов 70-80). А циклы в отладчике никто не гоняет, в них ошибок просто не бывает.
ВАШУ проблему вполне решает ПОНИМАНИЕ задачи и куча следующих из этого
ассертов на входе... (не инфо21 в чем то увы прав.... :( )

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Про важность правильных циклов.
« Ответ #6 : Июнь 06, 2012, 09:39:40 am »
А я согласен с valexey. Я пошаговый отладчик запускаю в ровно тех же случаях, когда ошибка возникает слоем ниже моего кода.
В своем коде обычно ошибки и так видно. Я писал и по 1,5к строк не запуская отладчик вообще.
Написал, запустил, словил исключения, поправил опечатки, опять запустил... и т.д.

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

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Про важность правильных циклов.
« Ответ #7 : Июнь 06, 2012, 09:55:37 am »
Далее, что за фигня
PS. И пошаговый отладчик, логгирование и осцилограф помогает отловить именно такие вот ошибки, которые другими методами отловить просто не реально (а таких ошибок, повторю, процентов 70-80). А циклы в отладчике никто не гоняет, в них ошибок просто не бывает.
ВАШУ проблему вполне решает ПОНИМАНИЕ задачи и куча следующих из этого
ассертов на входе... (не инфо21 в чем то увы прав.... :( )
Гм. Ну, придумай ассерт для данного случая. Алсо, в какой код будешь ассерт втыкать? В код микроконтроллера? :-D
« Последнее редактирование: Июнь 06, 2012, 09:58:22 am от valexey »
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Про важность правильных циклов.
« Ответ #8 : Июнь 06, 2012, 10:02:02 am »
И про циклы... А откуда у info21 вообще взялась статистика об ошибках в циклах у проф. кодеров?
В моей практике нетривиальные циклы попадаются очень редко. Подавляющее большинство циклов - это форычи и всякие разновидности линейного поиска. Один единственный раз в жизни мне показалось что хорошо подходит дейкстра, но в итоге я понял что он у меня вылез как следствие индусскости общего решения, и был заменен на линейный поиск.

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

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Про важность правильных циклов.
« Ответ #9 : Июнь 06, 2012, 10:17:19 am »
Для статистики:
Вот прямо сейчас правлю модуль 6к строк. (расчет себестоимости)
Форычи - 137 штук
Форы - 9 штук
Вайлы - 0 штук

Ну и Ифы до кучи - 240 штук

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Про важность правильных циклов.
« Ответ #10 : Июнь 06, 2012, 10:24:04 am »
И вообще имхо нетривиальный цикл в большинстве случаев - следствие недопонимания задачи.
Либо это какой-то хитрозакрученный алгоритм/численный метод.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Про важность правильных циклов.
« Ответ #11 : Июнь 06, 2012, 10:33:49 am »
Да, да. А сложная математика имхо ваще должна писаться в виде отдельной библиотеки с особой тщательностью и прилежностью. И еще вопрос должен ли быть программист при этом математиком.
Мое имхо - программист и математик должны быть в разных лицах, и каждый должен хорошо знать именно свое дело.

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

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Про важность правильных циклов.
« Ответ #12 : Июнь 06, 2012, 10:42:53 am »
Да, да. А сложная математика имхо ваще должна писаться в виде отдельной библиотеки с особой тщательностью и прилежностью. И еще вопрос должен ли быть программист при этом математиком.
Мое имхо - программист и математик должны быть в разных лицах, и каждый должен хорошо знать именно свое дело.
Ну, как минимум это должен быть алгоритмист с навыками промышленного программирования.

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

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

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re: Про важность правильных циклов.
« Ответ #13 : Июнь 06, 2012, 11:30:08 am »
При чем тут циклы? А циклы тут не при чем, как и в случае всех остальных ошибок которые я видел как минимум за последний год в нашей команде. Процентов 70-80 ошибок которые вылезают имеют характер подобный вышеописанной ошибке.
С одной стороны, это верно. Если суммировать все то дерьмо, с которым приходится сталкиваться, то процент проблем от циклов там ничтожен.
Но не равен нулю. А если кто-то не видит проблем, то, возможно, ему просто нечем их видеть.

С другой стороны, мне непонятен объем усилий, направленных на обоснования того, что не нужно владеть этим элементом ремесла.
Ну что ж, это выбор каждого.

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Про важность правильных циклов.
« Ответ #14 : Июнь 06, 2012, 11:34:26 am »
С одной стороны, это верно. Если суммировать все то дерьмо, с которым приходится сталкиваться, то процент проблем от циклов там ничтожен.
Но не равен нулю. А если кто-то не видит проблем, то, возможно, ему просто нечем их видеть.

С другой стороны, мне непонятен объем усилий, направленных на обоснования того, что не нужно владеть этим элементом ремесла.
Ну что ж, это выбор каждого.

С третьей стороны, возможно у нас этих ошибок нет, или почти нет, потому, что мы умеем правильно строить циклы? :-)
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"