Автор Тема: На тему низкого качества ПО  (Прочитано 13082 раз)

Romiras

  • Sr. Member
  • ****
  • Сообщений: 264
    • Просмотр профиля
    • Romiras Dev Lab
На тему низкого качества ПО
« : Ноябрь 15, 2013, 05:48:44 pm »
Наткнулся на любопытную статью: Качество встраиваемого ПО или погром всё-таки случился.

Цитировать
«это позорный образец проектирования и разработки ПО»

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

Цитировать
Соблюдение отраслевого стандарта кодирования (для автомобильной промышленности такой есть, даже целое семейство, совокупно называемое MISRA) характеризуется выявленным числом его нарушений – их набралось 80 тысяч (в Toyota принят свой внутренний стандарт, который заимствует из MISRA всего 11 правил, при минимально требованных во время написания кода 93-х). По ходу дела было выявлено, что в такой сложной системе полностью отсутствует учёт сбоев и ошибок.
Мне думается, это связано с тем, что над разработкой встроенного ПО работают по большей части инженеры-электронщики, у которых нет достаточной квалификации и также культуры программирования.

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: На тему низкого качества ПО
« Ответ #1 : Ноябрь 15, 2013, 06:07:16 pm »
Мне думается, это связано с тем, что над разработкой встроенного ПО работают по большей части инженеры-электронщики, у которых нет достаточной квалификации и также культуры программирования.

Угу. Много глобальных переменных. Ну и что? Работает ведь... Тут даже не знаешь с какой стороны подходить. Просто запретить глобальные переменные числом больше N - не поможет никак...

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: На тему низкого качества ПО
« Ответ #2 : Ноябрь 15, 2013, 06:09:07 pm »
Угу. Много глобальных переменных. Ну и что? Работает ведь... Тут даже не знаешь с какой стороны подходить. Просто запретить глобальные переменные числом больше N - не поможет никак...

А вот если обязать предоставлять исходные коды владельцу автомобиля...

Romiras

  • Sr. Member
  • ****
  • Сообщений: 264
    • Просмотр профиля
    • Romiras Dev Lab
Re: На тему низкого качества ПО
« Ответ #3 : Ноябрь 15, 2013, 07:53:36 pm »
Мне думается, это связано с тем, что над разработкой встроенного ПО работают по большей части инженеры-электронщики, у которых нет достаточной квалификации и также культуры программирования.

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

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: На тему низкого качества ПО
« Ответ #4 : Ноябрь 15, 2013, 08:16:14 pm »
В стандарте должны быть описаны метрики, по которым производится сравнение. Скажем, количество глобальных переменных в процентном соотношении от общего количества всех переменных, с учётом специфики производства встроенного ПО.

В смысле все метрики легко обходятся индусами абсолютно без повышения качества. Те же глобальные переменные превратятся в одну:
struct global_t
{
    int n_23;
    char c_a;
    .... 100500 полей ...
} global;   

P.S. Причем конкретно вот такой пример я видел неоднократно в сишных проектах. Авторы, видимо, где-то слышали о вреде глобальных переменных... но сути не поняли.
« Последнее редактирование: Ноябрь 15, 2013, 08:18:25 pm от vlad »

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: На тему низкого качества ПО
« Ответ #5 : Ноябрь 15, 2013, 08:26:06 pm »
Если код раскрыть ну никак нельзя, то может просто независимые эксперты должны на него смотреть... Но тут тоже широкое поле для предвзятостей и нарушений.

Romiras

  • Sr. Member
  • ****
  • Сообщений: 264
    • Просмотр профиля
    • Romiras Dev Lab
Re: На тему низкого качества ПО
« Ответ #6 : Ноябрь 16, 2013, 01:54:48 pm »
Можно хотя бы вот так:
Цикломатическая сложность
Цитировать
Одно из оригинальных предложений Мак-Кейба в том, что необходимо ограничивать сложность программ в течение их разработки; он рекомендует, чтобы программистов обязывали считать сложность разрабатываемых ими модулей, и разделять модули на более мелкие всякий раз, когда цикломатическая сложность этих модулей превысит десять.

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: На тему низкого качества ПО
« Ответ #7 : Ноябрь 16, 2013, 04:43:25 pm »
разделять модули на более мелкие всякий раз, когда цикломатическая сложность этих модулей превысит десять.

Ну будет мильен модулей с мильеном зависимостей. Это очень хорошо, что есть математические методы. Но они если и имеют какое-то практическое применение, то уже непосредственно к полученному результату и как критерий "необходимости", но не "достаточности". Обязывать непосредственно программистов считать количество IF/WHILE'ов и по результатам бить на модули - глупость в современных реалиях. Метод предложен в 1976 году, тогда и представить не могли всех высот абстракций, на которые может забраться современный программист. Соответственно, сделать гавно можно и без циклов. И отобрать средства для создания мощных абстракций тоже нельзя - ибо в умелых руках оно позволяет достигать надежности, недостижимой более низкоуровневыми средствами.
« Последнее редактирование: Ноябрь 16, 2013, 04:45:02 pm от vlad »

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: На тему низкого качества ПО
« Ответ #8 : Ноябрь 16, 2013, 05:05:37 pm »
Не знаю, что такое ц.с. модулей, но что такое ц.с. процедур я прочувствовал на практике очень хорошо.
У меня есть одна разработка (рожденная в адских условиях без ТЗ). Это самый страшный говнокод, который мне довелось видеть в продакшене. Написал эту гадость я.
Хотя код выглядит на первый взгляд довольно прилично. Никаких глобальных переменных. Все аккуратно написано и хорошо прокомментировано (на этом у меня перфекционизьм)
НО!
4000 строк кода (самая большая процедура ~1000 строк)
ц.с. около 100
Понять это просто невозможно. Сам я правлю эту гадость только после двух часов погружения.

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

Разделяй и властвуй!

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: На тему низкого качества ПО
« Ответ #9 : Ноябрь 16, 2013, 05:47:59 pm »
Соответственно, сделать гавно можно и без циклов.
Можно. Но разве это утверждение отменяет проблему цикломатической сложности?

Wlad

  • Jr. Member
  • **
  • Сообщений: 91
    • Просмотр профиля
Re: На тему низкого качества ПО
« Ответ #10 : Ноябрь 18, 2013, 06:14:05 pm »
В стандарте должны быть описаны метрики, по которым производится сравнение. Скажем, количество глобальных переменных в процентном соотношении от общего количества всех переменных, с учётом специфики производства встроенного ПО.

В смысле все метрики легко обходятся индусами абсолютно без повышения качества. Те же глобальные переменные превратятся в одну:
struct global_t
{
    int n_23;
    char c_a;
    .... 100500 полей ...
} global;   

P.S. Причем конкретно вот такой пример я видел неоднократно в сишных проектах. Авторы, видимо, где-то слышали о вреде глобальных переменных... но сути не поняли.
В мире сугубо встроенных систем это было когда-то не злом, а - суровой необходимостью.
Так неким образом боролись с желанием компилятора распихать статически объявленные переменные по ему угодным адресам.
Относительно Недолго.
Где-то между поздним кайнозоем и раннем антропогеном. :)

От индусского кода именно и отличалось осмысленным вступанием на территорию Абсолютного Зла.
Хотя, как это часто бывает в играх с Нехорошим, контроль над сложностью и осмысленной поддержкой срывался в самом неожиданном месте.

У меня сейчас на поддержке проект на Дельфи, в котором автор не продумал дерево наследования. Вложенные во владельцев объекты обращаются к полям владельцев через указатели на поля (которые инициализируются при создании вложенных объектов). Сейчас приступил к перепроектированию дерева и перетасованию функциональностей по уровням наследования, выделению общих частей, перепродумыванию интерфейсных частей. Ухожу от зацикливания в импорте модулей потихоньку.
Кроме того, есть два огромных куска подсистемы (просто оси графиков и общая горизонтальная ось времени для всех графиков), абсолютно дублирующих функциональность друг друга (различаясь именами полей, но, с практически одинаковыми методами, по смыслу, например в осях параметров тики, метки значений и сетки имеют Y координаты, а на оси времени - по X). Ну, и т.д.... Конец года и другие проекты подпирают, а тут ещё с этим разгребаться....... :)

Wlad

  • Jr. Member
  • **
  • Сообщений: 91
    • Просмотр профиля
Re: На тему низкого качества ПО
« Ответ #11 : Ноябрь 18, 2013, 10:00:58 pm »
И я уверен на 101%, что для облагораживания кода достаточно разбить большие сложные процедуры на более мелкие и обозримые. По отдельности их можно легко вкурить.
Если бывсё было так однозначно просто!
Только - без фанатизьму!
Можно утонуть в процедурах и методах.
Важно не количество, а уместность принятого архитектурного решения.

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: На тему низкого качества ПО
« Ответ #12 : Ноябрь 18, 2013, 10:10:37 pm »
Соответственно, сделать гавно можно и без циклов.
Можно. Но разве это утверждение отменяет проблему цикломатической сложности?

Нет, не отменяет, но обесценивает :) Вот еще иллюстрация - свежак, в пятницу писано:
        typedef boost::multi_index_container<
              object_ref
            , boost::multi_index::indexed_by<
                          boost::multi_index::ordered_unique< boost::multi_index::global_fun<object_ref const&,object_id,&get_object_id_id> >
                        , boost::multi_index::ordered_non_unique< boost::multi_index::global_fun<object_ref const&,object_type,&get_object_type> > > >
            container_t;

        typedef container_t::nth_index<0>::type by_id_t;
        typedef container_t::nth_index<1>::type by_object_type_t;

        container_t container;

Какая тут цикломатическая сложность и какое она имеет значение?

P.S. Если интересно, то это ассоциативный контейнер объектов с двумя индексами - по идентификатору (уникальный) и по типу (не уникальный).

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: На тему низкого качества ПО
« Ответ #13 : Ноябрь 19, 2013, 05:41:59 am »
Не понял. А что тут сложного или непонятного?

Wlad

  • Jr. Member
  • **
  • Сообщений: 91
    • Просмотр профиля
Re: На тему низкого качества ПО
« Ответ #14 : Ноябрь 19, 2013, 07:53:23 am »
Не понял. А что тут сложного или непонятного?
Для собеседования при приёме на фирму - самое то!  8)