О производительности и SLOC
Проблема с SLOC
Проблема с метрикой SLOC заключается в том, что она измеряет приблизительное количество написанного кода без учета:
- качество кода (то есть, что если для каждых 100 SLOC вам придется добавить еще 90 SLOC из-за ошибок, но чего вы не знаете в момент доставки своего кода?)
- цели, достигнутые с помощью кода (т. е. обрабатывает ли 10K SLOC все ожидаемые варианты использования или пользовательские истории? или только крошечное подмножество?)
- возможность сопровождения кода (т.е. вам придется добавить на 1% или 50% больше кода для адаптации кода к ожидаемым развивающимся требованиям?).
Иначе говоря, создание подверженного ошибкам не поддерживаемого кода спагетти с большим количеством вставленных копий частей будет считаться более производительным, чем тщательно спроектированный повторно используемый код.
Таким образом, SLOC - определенно не лучший способ измерения производительности.
Какую производительность мы рассматриваем?
Производительность измеряется для процесса. Таким образом, SLOC может быть совершенно достоверным индикатором только для процесса кодирования.
Например, если вы неправильно понимаете неудовлетворительные требования, потратите пять месяцев на создание программного обеспечения, покажите его пользователю, обнаружите, что оно совершенно неверно, и потратите еще пять месяцев, чтобы переписать его с нуля, вы получите ту же производительность в SLOC. / месяц, когда команда пишет код правильно с первого раза, например, потому что она использовала гибкий процесс, который уменьшает недопонимание за счет частой обратной связи. Эта очевидная равная производительность скрывает огромные проблемы.
Таким образом, измерение производительности разработки программного обеспечения должно учитывать весь процесс, включая анализ требований, разработку того, что кодировать, кодирование, тестирование, отладку и проверку того, что ожидания пользователей оправданы. Поскольку все эти действия очень разные, лучше всего измерить единственное, что имеет значение: работающее программное обеспечение, то есть то, что созданное программное обеспечение означает для пользователя .
Как измерить результаты программного обеспечения?
Существует несколько подходов:
- Типичный подход в классической разработке программного обеспечения - это Function Points (FP). Функциональные точки измеряются на основе требований, которые необходимо выполнить (например, количество форм, количество полей в каждой форме и т. Д.). Производительность затем измеряется в FP за единицу времени и на человека. Некоторые компании даже располагают данными, указывающими, сколько функциональных точек может получить разработчик за единицу времени на данном языке для данного домена. Проблема с FP заключается в том, что она требует очень подробных предварительных требований и отнимает много времени.
- Более современный и прагматичный подход - это сюжетные точки (SP). Они используются для оценки сложности создаваемого кода и обычно используются для оценки скорости групп разработчиков. Тем не менее, SP является оценочной мерой для работы, выполненной до того, как станут известны все детали. Это не окончательный показатель того, что на самом деле произошло. Таким образом, необходимо соблюдать осторожность при использовании его в качестве меры производительности, поскольку это может иметь негативные последствия для процесса оценки .
О производительности статической и динамической типизации
Я должен признаться, что лично я поклонник статически типизированных языков, потому что в своем внутреннем я знаю, что это более надежно (годы кодирования доказали мне это).
Итак, одно, что я уверен, это то, что статически типизированный язык способен предотвратить гораздо больше ошибок / ошибок во время компиляции (например, опечатки, несоответствие в ожидаемых типах и т. Д.), Чем не статически типизированные языки. Но при всей объективности я бы не посмел оскорбительно обобщить это как более высокую производительность.
Ваш архитектор прав?
Может быть, а может и нет.
Но его аргументы не кажутся верными: повышение производительности статически типизированного языка происходит от значительного числа ошибок, которые заранее обнаруживаются компилятором.
Следовательно, невозможно обнаружить этот «более высокий» прирост производительности, рассматривая только SLOC, не смотря на переделку, требуемую для динамически типизированных языков. Так что его сравнение не может быть справедливым.
Аргумент о сопоставимых обстоятельствах также не имеет места. Некоторые динамически типизированные языки допускают некоторые конструкции более высокого уровня, которые требуют меньше кода, чем делают это на одном из классических статически типизированных языков. Таким образом, вам может понадобиться меньше времени, написать меньше кода, но добавить тот же анализ, тестирование и накладные расходы на верификацию. Таким образом, измерение производительности с помощью SLOC уменьшит потенциальный прирост производительности, создав таким образом перекос в динамически типизированном языке.
Любое исследование в поддержку этого требования?
Несколько последних академических исследований существуют по этой теме. Хотя некоторые из них видят преимущество статической типизации, в целом оно ограничено определенной целью (документирование, повторное использование плохо документированного кода или API и т. Д.). Разумная формулировка также используется, потому что современные IDE значительно снизили риски, связанные с динамической типизацией: