Производительность программирования (также называемая производительностью программного обеспечения или производительностью разработки ) описывает степень способности отдельных программистов или групп разработчиков создавать и развивать программные системы. Производительность традиционно относится к соотношению между количеством произведенного программного обеспечения и затратами, потраченными на него. Здесь тонкость заключается в поиске разумного способа определения количества программного обеспечения.
Производительность является важной темой, изучаемой в таких различных дисциплинах, как производство, организационная психология, промышленная инженерия, стратегический менеджмент, финансы, бухгалтерский учет, маркетинг и экономика. Уровни анализа включают индивидуальный, групповой, дивизионный, организационный и национальный уровни. [1] Из-за этого разнообразия не существует четкого определения производительности и факторов, на нее влияющих, хотя исследования проводятся уже более века. Как и в программной инженерии, это отсутствие общего согласия относительно того, что на самом деле составляет производительность, воспринимается как основное препятствие для обоснованного обсуждения производительности. [2] Следующие определения описывают наилучший консенсус относительно терминологии. [3]
Хотя общепринятого определения производительности не существует, по-видимому, существует согласие в том, что производительность описывает соотношение между выпуском и затратами:
Производительность = Выход / Вход
Однако в различных дисциплинах можно найти различные понятия и, в частности, различные единицы измерения для ввода и вывода. В обрабатывающей промышленности обычно используется прямое соотношение между количеством произведенных единиц и количеством потребленных единиц. [4] В непроизводственных отраслях обычно используются человеко-часы или аналогичные единицы для сравнения выводов и вводов.
Одно из основных соглашений заключается в том, что значение производительности и средства ее измерения различаются в зависимости от того, какой контекст оценивается. В производственной компании возможными контекстами являются: [3]
Пока классические производственные процессы считаются простым показателем производительности: сколько единиц продукта определенного качества произведено и за какие деньги. Для интеллектуальной работы производительность намного сложнее. Как мы измеряем производительность авторов, ученых или инженеров? В связи с растущей важностью работы со знаниями (в отличие от ручного труда) [5] многие исследователи пытались разработать средства измерения производительности, которые можно было бы применять в непроизводственном контексте. Общепризнано, что природа работы со знаниями принципиально отличается от ручного труда, и, следовательно, необходимо учитывать факторы, помимо простого соотношения выход/вход, например, качество, своевременность, автономность, успешность проекта, удовлетворенность клиентов и инновации. Однако исследовательские сообщества ни в одной из дисциплин пока не смогли установить широко применимые и общепринятые средства измерения производительности. [1] То же самое относится и к более конкретной области производительности программирования.
Рентабельность и производительность тесно связаны и, по сути, часто путаются. Однако, поскольку рентабельность обычно определяется как соотношение между выручкой и затратами
Рентабельность = Доход / Себестоимость
Он имеет более широкую сферу действия, чем производительность, т. е. число факторов, влияющих на прибыльность, больше, чем число факторов, влияющих на производительность. В частности, прибыльность может меняться без изменения производительности, например, из-за внешних условий, таких как инфляция издержек или цен. Кроме того, взаимозависимость между производительностью и прибыльностью обычно отсрочена, т. е. прирост производительности редко отражается в немедленном приросте прибыльности, который, скорее всего, реализуется в долгосрочной перспективе.
Термин производительность даже шире, чем производительность и прибыльность, и охватывает множество факторов, которые влияют на успех компании. Поэтому известные инструменты контроля производительности, такие как сбалансированная система показателей, включают производительность как фактор, который является центральным, но не единственным. Другими значимыми факторами являются, например, восприятие компании клиентами или заинтересованными сторонами.
Эффективность и результативность — это термины, которые вносят еще большую путаницу, поскольку их часто путают, и, кроме того, эффективность часто путают с производительностью. Разница между эффективностью и результативностью обычно объясняется неформально, так как эффективность — это делать вещи правильно , а эффективность — это делать правильные вещи . Хотя существует множество других определений, [3] существует определенное согласие в том, что эффективность относится к использованию ресурсов и в основном влияет на требуемый ввод коэффициента производительности. Эффективность, с другой стороны, в основном влияет на выход коэффициента производительности, поскольку обычно имеет прямые последствия для клиента. Эффективность можно определить как «способность достигать желаемого результата».
Обычно предполагается, что эффективность можно количественно оценить, например, по коэффициентам использования, что значительно проще, чем результативность.
Танген утверждает: «Улучшения качества, за исключением того факта, что бездефектные продукты добавляются к уровню выпуска, не должны быть включены в концепцию производительности». [3] Однако большая часть классической литературы по дисциплинам, не связанным с программным обеспечением, особенно в сфере производства, явно не обсуждает роль качества выпуска в коэффициенте производительности. [6] Более поздние работы по дисциплинам, не связанным с производством, в большей степени сосредоточены на знаниях, офисной работе или работе белых воротничков и, следовательно, все чаще обсуждают роль качества по отношению к качеству. [5] [1] [7] [8] [9]
Друкер подчеркивает важность качества для оценки производительности труда работников умственного труда: «Производительность умственного труда, следовательно, должна быть направлена в первую очередь на достижение качества — и не минимального качества, а оптимального, если не максимального качества. Только тогда можно задаться вопросом: «Каков объем, количество работы?»» [5]
Саари отражает важность качества с помощью своей расширенной формулы производительности: [8]
Общая производительность = (Качество и количество продукции)/(Качество и количество продукции)
Однако, похоже, что эти усилия по включению качества в определение производительности пока не привели к операционализуемой концепции. В настоящее время остается неясным, как количественно определить нечеткие термины «Качество и количество на выходе», а также «Качество и количество на входе», не говоря уже о том, чтобы рассчитать соотношение.
В разработке ПО все сложнее, чем в производстве товаров. Разработка ПО — это инженерный процесс.
Бём был одним из первых исследователей, которые систематически подошли к области производительности программного обеспечения. Его модель оценки стоимости COCOMO — теперь COCOMO II [10] — является стандартным знанием программной инженерии. В этой модели он определяет набор факторов, которые влияют на производительность, таких как требуемая надежность или возможности аналитиков. Эти факторы широко использовались повторно в других похожих подходах к производительности. Остальная часть модели основана на функциональных точках и, наконец, исходных строках кода (LOC). Ограничения LOC как меры производительности хорошо известны.
Джонс — автор серии книг о производительности программного обеспечения. Помимо нескольких теоретических соображений его главный вклад — систематическое предоставление и интеграция большого количества данных, имеющих отношение к анализу производительности. По крайней мере в двух своих книгах [11] [12] он приводит ряд факторов производительности, но также указывает, что для каждого проекта имеет значение разный набор факторов. Эти факторы могут стать основой для оценки производительности и сравнения со средними показателями по отрасли.
Вот один из таких списков:
Ниже приведены 20 факторов, количественное влияние которых на программные проекты было определено на основе исторических данных:
- Используемый язык программирования
- Размер программы
- Опыт программистов и дизайнерского персонала
- Новизна требований
- Сложность программы и ее данных
- Использование методов структурного программирования
- Класс программы или метод распространения
- Тип программы области применения
- Инструменты и условия окружающей среды
- Улучшение существующих программ или систем
- Поддержание существующих программ или систем
- Повторное использование существующих модулей и стандартных конструкций
- Генераторы программ
- Языки четвертого поколения
- Географическое разделение мест застройки
- Потенциалы дефектов и методы их устранения
- Существующая документация
- Создание прототипа перед началом основной разработки
- Проектные группы и организационные структуры
- Моральный дух и компенсация персоналу [12]
Функциональные точки были предложены в 1977 году Альбрехтом как лучшая мера размера для программного обеспечения, чем LOC. В том, что она основана на спецификации программного обеспечения и, таким образом, направлена на измерение размера его функциональности, а не самого кода. Причина в том, что размер кода зависит не только от размера функциональности, но и от возможностей программиста: лучшие программисты будут создавать меньше кода для той же функциональности. Функциональные точки претерпели несколько редизайнов за эти годы, в основном под руководством Международной группы пользователей функциональных точек (IFPUG). Эта группа большая, в нее входят более 1200 компаний, что показывает довольно сильное принятие этой меры. Однако во многих областях она по-прежнему не находит практического применения, поскольку часто рассматривается как применимая только к системам деловой информации.
Несколько исследователей предложили экономически-ориентированную или ценностно-ориентированную программную инженерию в качестве важной парадигмы в будущих исследованиях программной инженерии. Бём и Хуан отмечают, что важно отслеживать не только затраты в программном проекте, но и реальную заработанную стоимость, т. е. ценность для клиента. [13] Они объясняют, что важно создать бизнес-кейс программного обеспечения и поддерживать его в актуальном состоянии. По сути, ценностно-ориентированная программная инженерия фокусируется на ценности для клиента, в основном измеряемой в денежных единицах.
Знаменитая книга «Peopleware: Productive Projects and Teams» де Марко и Листера [14] привлекла внимание широкой аудитории к важности факторов, связанных с людьми. Они собрали во многих проектах по разработке ПО опыт хорошей и плохой практики управления, который влияет на производительность команды. Они и другие показали, что это решающие вопросы в разработке ПО, но смогли описать их только эпизодически.
Вероятно, существует большое количество факторов, влияющих на производительность программирования отдельных лиц и команд. Например, используемый процесс разработки программного обеспечения , вероятно, влияет на эффективность и результативность команды.
Личности программистов влияют на используемые стили кодирования , которые, в свою очередь, влияют на производительность программистов. [15]
В 2007 году комикс xkcd популяризировал концепцию пика Балмера — программист, который при правильном количестве опьянения достигает высокой производительности. Пик Балмера назван в честь бывшего генерального директора Microsoft Стива Балмера [ 16] и, вероятно, является игрой слов на серии спектральных линий водорода Балмера, названных в честь Иоганна Балмера [17] .