Стоимость разработки процедурного программирования по сравнению с ООП?

Я происхожу из довольно сильного опыта в области объектно-ориентированного проектирования, преимущества OOD и OOP для меня - вторая натура, но недавно я оказался в магазине разработки, привязанном к привычкам процедурного программирования. В языке реализации есть некоторые особенности ООП, они не используются оптимальным образом.

Обновление: похоже, у всех есть свое мнение по этой теме, как и у меня, но вопрос был в следующем:

Были ли какие-либо хорошие сравнительные исследования, сравнивающие стоимость разработки программного обеспечения с использованием процедурных языков программирования и объектно-ориентированных языков?

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


person paxos1977    schedule 02.12.2008    source источник


Ответы (9)


Покопавшись в Google, я нашел этот документ здесь . Я использовал поисковые запросы, ориентированные на объект "Производительность".

В первых абзацах говорится

Внедрение объектно-ориентированной технологии, похоже, не снижает общую производительность в новых крупных коммерческих проектах, но и не улучшает ее в первых двух поколениях продуктов. На практике определяющим влиянием может быть рабочий процесс, а не методология.

Я думаю, вы обнаружите, что объектно-ориентированное программирование лучше в определенных обстоятельствах, но нейтрально для всего остального. Моим начальникам при преобразовании приложения CAD / CAM моей компании в объектно-ориентированный фреймворк подкупило то, что я точно показал области, в которых оно поможет. Основное внимание уделялось не методологии в целом, а тому, как она поможет нам решить конкретную проблему, с которой мы столкнулись. Для нас была расширяемая структура для добавления большего количества форм, отчетов и контроллеров машин, а также использование коллекций для снятия ограничения памяти старого дизайна.

person RS Conley    schedule 12.02.2009
comment
Вы знаете, была ли опубликована эта статья? - person paxos1977; 13.02.2009
comment
Покопавшись на сайте, я нашел PDF-файл с этой заметкой, опубликованный в Software - Practice and Experience, Vol. 29, No. 10, pp 833-847, 1999. - person RS Conley; 13.02.2009
comment
В книге Буча по архитектуре сообщается о схожих результатах, но с дополнительной экономией затрат / времени после первых двух проектов по мере того, как команда набирает обороты, и с еще большим выигрышем, если по ходу разработки будет разработана значительная многоразовая архитектура. - person Steven A. Lowe; 01.10.2012

Большинство из этих вопросов связано с тем, что производительность отдельных программистов варьируется на порядок или более; если у вас есть объектно-ориентированный программист, который является одним из группы с производительностью x, и «процедурный» программист, который является программистом в 10 раз, процедурный программист может выиграть, даже если объектно-ориентированный программист в некотором смысле быстрее.

Также существует проблема в том, что продуктивность программирования обычно составляет всего 10-20 процентов от общих усилий в реалистичном проекте, поэтому более высокая продуктивность не оказывает большого влияния; даже этот гипотетический десятикратный программист или бесконечно быстрый программист не может сократить общие усилия более чем на 10-20 процентов.

Вы можете прочитать статью Фреда Брукса «Нет серебряной пули».

person Charlie Martin    schedule 08.12.2008

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

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

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

Так что, я думаю, стоимость OO в долгосрочной перспективе будет ниже по сравнению с процедурой.

person Patrick Desjardins    schedule 08.12.2008
comment
Я могу сказать вам, что почти 100% работы, которую мы должны делать в нашем магазине, - это техническое обслуживание ... так что да, похоже, OO будет лучшим вариантом. - person paxos1977; 08.12.2008

Я думаю, С.Лотт имел в виду феномен «неповторимого эксперимента», то есть вы не можете написать приложение X процедурно, а затем перемотать время назад и написать его OO, чтобы увидеть, в чем разница.

вы можете написать одно и то же приложение дважды двумя разными способами, но

  • вы бы узнали что-то о приложении, которое делает это первым, что поможет вам вторым способом, и
  • вы можете быть лучше в OO, чем в процедурном, или наоборот, в зависимости от вашего опыта, характера приложения и выбранных инструментов

поэтому на самом деле нет прямой основы для сравнения

эмпирические исследования также бесполезны по схожим причинам - разные приложения, разные команды и т. д.

Смена парадигмы сложна, и небольшой процент программистов, возможно, никогда не осуществит переход

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

если нет, что ж, пора бы доработать резюме ... ;-)

person Steven A. Lowe    schedule 02.12.2008
comment
Два комментария. (1) Я думаю, будет преувеличением сказать, что С.Лотт имел в виду этот феномен, кстати, спасибо за то, что он здесь отмечен. Я забыл об этом ... но мне действительно было интересно, проводил ли кто-нибудь ненаучное исследование. Наверняка некоторые магазины программного обеспечения произвели конверсию и отметили стоимость? - person paxos1977; 02.12.2008
comment
(2) это моя первая профессиональная работа в области программирования, у меня есть степень магистра в области CS, и я занимаюсь программированием с детства ... после нескольких месяцев поисков это было единственное предложение по разработке программного обеспечения, которое я получил. - person paxos1977; 02.12.2008
comment
@ceretullis: продолжай искать, а пока попробуй слиться ;-) - person Steven A. Lowe; 02.12.2008
comment
@ceretullis: В самом деле, я имею в виду тот факт, что программные эксперименты всегда вызывают подозрение, потому что они не могут иметь повторяемый контроль. Разработка программного обеспечения - это сбор знаний; это наихудший вид неповторимого неконтролируемого явления. - person S.Lott; 02.12.2008
comment
@ [S.Lott]: Я бы сказал «худший из них», я думаю, что худший из них - «фантастический», как будто моя команда выиграла бы, если бы я был там, чтобы подбодрить их ;-) - person Steven A. Lowe; 02.12.2008

Хорошая идея. Прямое сравнение. Напишите приложение X в процедурном стиле и в стиле OO и измерьте что-нибудь. Стоимость разработки. Прибыль на инвестиции.

Что значит написать одно и то же приложение в двух стилях? Это было бы другое приложение, не так ли? Процедурные люди будут возражать, что люди из объектно-ориентированного программного обеспечения жульничают, когда используют наследование, обмен сообщениями или инкапсуляцию.

Такого сравнения быть не может. Нет никаких оснований для сравнения двух «версий» приложения. Это все равно, что спрашивать, являются ли яблоки или апельсины более рентабельными в качестве фруктов.

Сказав это, вы должны сосредоточиться на том, что на самом деле видят другие.

  1. Пора построить что-то, что работает.

  2. Рейтинг ошибок и проблем.

Если ваш подход лучше, вы добьетесь успеха, и люди захотят узнать, почему.

Когда вы объясняете, что объектно-ориентированный подход ведет к вашему успеху ... ну ... вы выиграли спор.

person S.Lott    schedule 02.12.2008
comment
спасибо 4 комментария. Я не уверен, что это сравнение яблок с апельсинами. Это все равно, что сказать, что я не могу сравнивать две разные техники прыжков с трамплина ... которые, безусловно, могут быть выполнены ... хотя это имеет ту же проблему, поскольку зависит от относительного мастерства практикующих в их соответствующих стилях. - person paxos1977; 02.12.2008
comment
Не согласен: не люблю прыжки с трамплина. Есть небольшая объективная разница, если только вы не упадете. Во многом оценка зависит от стиля судейства. И все приземляются в нескольких метрах друг от друга. Я говорю, что это все равно что сравнивать прыжки с трамплина и подводное плавание с аквалангом. Слишком мало общего. - person S.Lott; 02.12.2008
comment
Но почему бы не сравнить KLOC (для начала) или (записанные) нажатия клавиш (оба используются для ввода и изменения кода во время разработки)? Кажется, что это можно легко сделать в основном в одной среде (например, для C и C ++) и, возможно, дать интересные и полезные результаты, которые могут быть связаны, по крайней мере, с известной выразительностью объектно-ориентированного программирования и процедурных языков / стилей. - person mlvljr; 13.06.2010
comment
@mlvljr: Нажатие клавиш? Включая backspace? Кажется глупым. Строки кода - априори - несправедливы, потому что специалисты по объектно-ориентированному программированию могут использовать наследование. Если вы хотите поиграть в кодовый гольф, все, что вы узнаете, - это то, что сведение к минимуму строк кода делает программное обеспечение непонятным, независимо от того, какой стиль дизайна вы используете. - person S.Lott; 13.06.2010
comment
Что ж, количество набора текста, необходимого для реализации задачи (включая повторный набор и, следовательно, подсчет попаданий на обратную строку :)), кажется мне хорошим средством уловить легкость (и необходимость!) Внесения изменений в уже реализованные части. программного обеспечения, создаваемого при его разработке (такие изменения, вероятно, будут включать повторную реализацию некоторых компонентов из-за изменений контракта, их рефакторинг или даже выброс некоторых из них). Т.е. если для одной и той же задачи требуется меньше набора текста, то одна методология предлагает более эффективную стратегию кодирования (в некотором смысле), чем другая, и эти знания, возможно, будут полезны. - person mlvljr; 18.06.2010
comment
В то же время количество нажатий клавиш могло, вероятно, дисквалифицировать большинство архиваторов кода / гольфистов (за исключением настоящих гениев, собирающих в уме совершенно компактный код, не касаясь клавиатуры). Конечно, измерение усилий по кодированию с помощью нажатия клавиш также подвержено эффекту «уже-в-основном-ноу-хау-сделать-уже-сделано-по-другому» и должно использоваться в соответствующих исследованиях, но это не так глупо, как Подсчет KLOC (измерение усилий, а не результата (окончательный размер кода)) и более естественен, чем показатели зависимости / модульности (которые просто дают подсказку о возможных усилиях). - person mlvljr; 18.06.2010
comment
... (извините, что я такой многословный) Вспоминая статью об объектно-ориентированной пивоварне (portal.acm.org/citation.cfm?id=159420.155839), я легко могу представить себе сравнение объектно-ориентированного и процедурного методов :) (возможно, фиксируя усилия по кодированию с помощью количества нажатий клавиш и времени или любым другим полезным способом). Что касается наследования OO LOC-cheat - при сравнении методологий можно использовать конкретные языки / среды / инструменты не только для обеспечения измеримости, но и для постановки экспериментов в реалистичной обстановке, и здесь отказ от C для C ++, потому что do_smth(&obj, arg); слишком некрасиво честно. - person mlvljr; 18.06.2010
comment
@mlvljr: Дело в том, что поверхностные измерения нажатий клавиш или строк кода примерно ничего не покажут. Вы можете поиграть в это - тривиально - путем определения некоторого макро-подобного языка, который ставит код-гольф выше всего остального. Вы не измеряете ничего полезного. Кроме того, стоимость разработки составляет лишь небольшую часть от общей стоимости жизненного цикла. - person S.Lott; 18.06.2010
comment
Я говорил об усилиях по реализации ..golf, а не о коде. Но настоящие мастера конечно же переферируют яхтинг :)) - person mlvljr; 23.06.2010
comment
@mlvljr: Я говорил об усилиях по реализации. (1) Трудно измерить. (2) Только небольшая часть стоимости жизненного цикла. - person S.Lott; 23.06.2010
comment
@ S.Lott (1) Если есть / будут методы, достаточно практичные, чтобы дать какое-либо существенно полезное понимание (для ОО / процедурного / другого сравнения), это будет нормально (по крайней мере, на начальном этапе). (2) (Пере) наборную работу намного легче измерить (и изучить!), Чем умственную, конечно, однако изменения / дополнения к первой отражают преобразования последней (по крайней мере, существенные). Однако возникает вопрос, будут ли какие-либо метрики «код-вход-количество-выход» достаточно полезны при выборе методологии для проекта. - person mlvljr; 23.06.2010
comment
@mlvljr: не работают ли какие-либо показатели кода на входе и выходе. Прости. Они просто не измеряют затраты в течение жизненного цикла каким-либо полезным способом. Они не измеряют сложность, понятность или что-либо полезное, кроме строк кода, которые практически ни с чем не связаны. Строки кода - это случайность синтаксиса - это не значимого. Это просто случайное число, основанное на случайных синтаксических решениях, принятых десять лет назад. - person S.Lott; 23.06.2010
comment
Будет ли сколько-нибудь значимым количество раз, когда подпрограмма / класс / модуль / пакет был изменен / изменен (во время разработки или, возможно, на протяжении всего жизненного цикла приложения)? Мне кажется, да - если кто-то утверждает, что его программное обеспечение построено по модульному / расширяемому принципу и в то же время ему приходится повторно массировать половину его источников каждый раз, когда следует добавлять какие-то новые функции (не говоря уже о первоначальном период разработки), тогда что-то должно быть не так (и это можно зафиксировать). Я бы не хотел искать простые метрики, просто я не потерял на них надежды. - person mlvljr; 23.06.2010
comment
@mlvljr: Вы пытаетесь измерить связь между модулями? Это метрика дизайна независимо от объектно-ориентированной или процедурной реализации. Опять же, это почти ничего не говорит вам о стоимости разработки или стоимости жизненного цикла объектно-ориентированного проектирования. Он говорит вам о стоимости связывания, а не о стоимости языка реализации. - person S.Lott; 23.06.2010

Ключ - время. Сколько времени нужно компании, чтобы изменить дизайн, добавить новые функции или исправить существующие. Любое исследование, которое вы проводите, должно быть сосредоточено на этой области.

Моя компания в середине 90-х годов разработала ориентированный на события процедурно-ориентированный дизайн программного обеспечения CAM, созданного с использованием VB3. Адаптация программного обеспечения к новым машинам занимала много времени. Долгое время, чтобы проверить влияние исправлений ошибок и новых функций.

С появлением VB6 я смог изобразить текущий дизайн и новый дизайн, который устранил проблему тестирования и адаптации. Нетехнический босс сразу понял, что я пытался сделать.

Ключ в том, чтобы объяснить, ПОЧЕМУ ООП принесет пользу проекту. Используйте такие вещи, как рефакторинг Фаулера и шаблоны проектирования, чтобы показать, как новый дизайн сокращает время на выполнение каких-либо задач. Также укажите, как вы добираетесь от точки А до точки Б. Рефакторинг поможет показать, как можно иметь рабочие промежуточные этапы, которые можно отправить.

person RS Conley    schedule 02.12.2008

Не думаю, что вы найдете подобное исследование. По крайней мере, вы должны определить, что вы подразумеваете под «стоимостью». Поскольку проектирование ООП как-то медленнее, поэтому в краткосрочной перспективе разработка может быть быстрее с процедурным программированием. В краткосрочной перспективе кодирование спагетти станет еще быстрее.

Но когда проект начинает развиваться, все обстоит наоборот, потому что ООП-проектирование лучше всего подходит для управления сложностью кода.

Так что в небольшом проекте процедурный дизайн МОЖЕТ быть дешевле, потому что он быстрее и у вас нет недостатков. Но в большом проекте вы очень быстро освоитесь, используя только простую парадигму, такую ​​как процедурное программирование.

person Emiliano    schedule 11.02.2009
comment
стоимость с течением времени будет подходящей метрикой. Я имею в виду буквальное определение стоимости, то, что вы должны платить в качестве накладных расходов, чтобы добиться результата. - person paxos1977; 12.02.2009

Я сомневаюсь, что вы найдете исчерпывающее исследование. Как уже упоминали несколько человек, это не воспроизводимый эксперимент. Вы найдете множество анекдотических свидетельств. Некоторые люди могут найти статистические исследования, но я бы внимательно их изучил. Я не знаю ни одного действительно хороших.

Я также сделаю еще одно замечание: в реальном мире нет такой вещи, как чисто объектно-ориентированная или чисто процедурная. Многие, если не большинство объектных методов написаны с помощью процедурного кода. В то же время многие процедурные программы используют объектно-ориентированные методологии, такие как инкапсуляция (также некоторые вызывают абстракцию).

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

person Jim C    schedule 11.02.2009
comment
Я согласен с вашим комментарием о том, что это не чистый объектно-ориентированный подход. По самому строгому определению C ++ не является объектно-ориентированным языком. В OOD есть определенный менталитет, который поощряет инкапсуляцию и абстракцию более значимыми способами, чем вы обычно видите в процедурном коде. - person paxos1977; 12.02.2009

В этой статье ничего не говорится о ООП и процедурных методах. Но я бы подумал, что вы могли бы использовать аналогичные показатели вашей компании для обсуждения.

Мне это интересно, поскольку моя компания начинает изучать инициативу ROWE. Во время нашего первого сеанса было очевидно, что в настоящее время мы не собираем достаточно показателей по результатам.

Итак, вам нужно сосредоточиться на 1). Препятствует ли поддержание текущих процессов будущему развитию? 2) Как разные методы повлияют на №1?

person Scott Hoffman    schedule 12.02.2009