Емпіричні докази вибору парадигми програмування для вирішення проблеми


11

У вікі С2 обговорюється емпіричний доказ об’єктно-орієнтованого програмування, який, по суті, робить висновок, що немає нічого, крім звернення до влади. Востаннє це було змінено в 2008 році. Тут, мабуть, це обговорення: питання про те, чи є OO застарілим , коли функціональне програмування є поганим вибором, а переваги та недоліки AOP відповідають на думки учасників, не покладаючись на докази.

Звичайно, думки відомих практикуючих лікарів вітаються і мають корисні речі, але вони є більш правдоподібними, коли вони узгоджуються з експериментальними даними. Чи існують ці докази? Я знаю, що інженерія програмного забезпечення на основі доказів - це річ, але чи можу я її практикувати в цьому контексті? Зокрема, якщо у мене є певна проблема, Pяку я хочу вирішити, написавши програмне забезпечення, чи існує сукупність знань, досліджень та досліджень, які дозволять мені побачити, як результат вирішення подібних проблем Pзалежав від вибору парадигми програмування?

Я знаю, що парадигма, яка виступає як "правильна відповідь", може залежати від того, на які показники звертається певне дослідження, на які умови дослідження постійно чи змінюється, і без сумніву і на інших факторах. Це не впливає на моє бажання знайти цю інформацію та критично оцінити її.

Стає зрозуміло, що деякі люди думають, що я шукаю рішення "повернути кривошип" - якийсь автомат ковбаси, в який я вкладаю інформацію про свою проблему, і з якої виходить таке слово, як "функціональний" або "структурований". Це не мій намір. Що я шукаю, - це дослідження того, як - з великою кількістю застережень і припущень, що я не збираюся сюди, але хороша література з цього питання - певні властивості програмного забезпечення змінюються залежно від проблеми та вибору парадигми.

Іншими словами: деякі люди кажуть, що "OO дає кращу гнучкість" або "функціональні програми мають менше помилок" - (частина), про що я прошу, - це свідчення цього. Решта вимагає доказів проти цього, або припущення, згідно з якими ці твердження є правдивими, або докази, що свідчать про те, що ці міркування не важливі. Існує безліч думок, чому одна парадигма краща за іншу; чи є щось об'єктивне за будь-яким із них?


1
пошук в Інтернеті на основі доказової інженерії програм показує безліч посилань
gnat

@gnat EBSE - це систематичне підбиття підсумків літератури та отримання загальних висновків про те, як ми могли б покращити практику. Моє питання - чи існує така література; чи достатньо для систематичних оглядів чи метааналіз, щоб вони були продуктивними.

Відповіді:


12

Попередній перегляд див. У версії 1 цієї відповіді . Однак коментарі та редакції до цього питання ще більше роз'яснюють, що це питання шукає, і дозволяють мені бути більш чіткими.

Так, інженерія програмного забезпечення на основі доказів (EBSE) - річ. Здається, докладено декількох зусиль щодо баз даних EBSE, таких як ця в Університеті Дарем і SEED, яку розпочав професор кафедри Cal Poly . Усі ці зусилля, а також ті, що обговорюються в ряді робіт, які можна знайти через сервер IEEE Xplore або цифрову бібліотеку ACM(передплата або покупка, необхідна для багатьох паперів в обох), базуються на медицині, заснованій на доказах. Вони надають літературні огляди опублікованих емпіричних даних (спостереження та експеримент). Насправді, включення "огляду літератури" в рядку пошуку за будь-яким пошуковим виданням дає інформацію про більшість тем - понад 14000 звернень в ACM і понад 1000 в базі даних IEEE (якщо обмежуються лише темами обчислення).

Переглядаючи загальні типи тем, що обговорюються в цих базах даних EBSE та оглядах літератури, я бачу загальну тему - вони, як правило, не залежать від технології. Здається, акцент в основному зосереджений на процесі та методології, а не на конкретних інструментах, які використовуються для проведення програмної інженерії.

Отже, ця концепція існує в інженерії програмного забезпечення. Академія усвідомлює концепцію, засновану на доказах, і може успішно застосовувати її в інженерії програмного забезпечення.

Зокрема, питання, що застосовують методи EBSE до вибору парадигми, видається важким через велику кількість задіяних змінних, що змушує робити припущення, а також зменшувати можливість повторення експерименту чи спостереження. Це сказано правильно у запитанні - "яка парадигма виходить як" правильна відповідь "може залежати від того, на які метрики приділяється конкретне дослідження, на яких умовах дослідження залишається постійним чи змінюється, і безсумнівно, на інших факторах" . Хоча це не означає, що вивчення того, яка парадигма є "найкращою" в даній ситуації, це робить будь-який огляд літератури цими документами неймовірно складним для завершення та все-таки витягувати інформацію в них.

Вибір парадигми однозначно не має рішення "повернути кривошип".

Враховуючи парадигму програмування, ви можете знайти дослідження в різних академічних і галузевих базах даних про те, як ця парадигма впливає на різні аспекти розробки програмного забезпечення - якість, дефекти, ефективність тощо - в різних конкретних умовах, починаючи від знань і досвіду роботи команда до проблемної області. Будь-який суворий документ повинен чітко визначати умови, за яких були зібрані дані та припущення. Проблема стає спробою виокремити фактори, які роблять це добре в кожному з цих умов.

Академічно є деякі твердження, які легко вивчити. Наприклад, твердження про те, що функціональна парадигма добре підходить для додатків, які вимагають одночасності, випливає з теореми Церкви-Россера . Через це, ймовірно, що програмна система, написана на функціональній мові, матиме менше дефектів, пов’язаних із одночасністю, ніж та сама система, написана на процедурній або об'єктно-орієнтованій мові.

Однак, з практичної точки зору, команда програмного забезпечення не завжди може використовувати «найкращий» інструмент або техніку для роботи лише тому, що дослідження показують це. Хоча ми прагнемо виробляти програмні системи найвищої якості, ми працюємо в межах обмежень. Часто я бачу ці обмеження мінімізованими (або навіть усуненими з рівняння), коли обговорюють ефективність будь-якої методології.

Як практик, коли я беру участь у виборі технологій для використання, я намагаюся визначити найкращі можливі інструменти. Але потім я обмежуюсь тим, що знає і добре розуміє команда, яка в мене є. Повертаючись до мого попереднього прикладу, якщо у мене є команда, яка добре розбирається у створенні одночасних додатків на C ++ і не має досвіду роботи в Haskell, не має сенсу пропонувати будувати систему в Haskell, оскільки я, ймовірно, не зможу зробити графік та бюджетні обмеження, і моя якість, ймовірно, постраждає через брак досвіду роботи в інструментальній мережі.

Для резюме, інженерія програмного забезпечення на основі доказів, як правило, є хорошою справою, а огляди літератури існують і є доступними. Однак є аспекти інженерії програмного забезпечення, де застосування підходів, заснованих на доказах, пропонує мало значення. Вибір парадигми програмування до масштабних зусиль з розробки є одним із таких.

Якщо ви хочете дізнатися про те, як об’єктно-орієнтована вирішує питання повторного використання або дефектів функціонального програмування - ви легко знайдете публікації з них. Однак я не знайшов (і не довіряв би мені довіри) публікації, яка змогла ефективно вирішити вибір парадигми у широкому діапазоні реальних проектів інженерії програмного забезпечення.


У розділі про повноту Тьюрінга ігноруються компроміси, які я хочу побачити на відкритому місці та порівняти. Дозвольте навести конкретний приклад. Дуже багато людей говорять мені, що функціональне програмування чудово підходить для уникнення помилок одночасності. Тепер ми виявимо, що Схема, як Паскаль, є Тюрінг-повною. Таким чином, слід створити процедуру написання безпечного для безпеки коду. Домовились. Але це чудово ? Чи є переваги у виборі одного методу? Чи можна виміряти такі переваги?

1
@GrahamLee Для підтвердження або відхилення вашої гіпотези потрібні об'єктивні докази, яких не існує. Існують суб'єктивні причини для створення нової парадигми та нової моделі представлення саме таких обчислювальних можливостей - і це не обмежується мовами програмування, а й основним математичним поданням цих мов . Ці об'єктивні причини включають орієнтацію на певну демографічну групу (обчислювальний математик проти бізнес-аналітика - їх спосіб мислення відрізняється, вимагає різної парадигми).
Томас Оуенс

2
@Thomas: ваше значення, що практика програмування є однозначно непрозорою для науки. Зараз триває багато досліджень. Неодмінним прикладом є дослідницька група Лутца Прешельта . Я не знаю області досить добре, щоб знати, чи хтось вирішував конкретні питання Грема, але немає підстав вважати, що вони не піддаються тому, що застосовується Прешельтом та іншими методами.
Кріс

1
@Chris Я не вірю, що вони непрозорі для науки. Однак я вважаю, що є деякі речі, які до того часу, як ви, як говорить Грехем у запитанні, додаєте до досліджень "безліч застережень і припущень", практикуючим уже не корисні. З цього моменту, з практичної точки зору, просто ефективніше базувати свої рішення на історії та досвіді. Мати хороші, важкі, достовірні дані - дуже гарна річ. Але настає момент, коли це важко дістати або він дійсний лише в дуже специфічній ситуації, що це не корисно для промисловості.
Томас Оуенс

1
@Thomas я в цьому сумніваюся. Загальна медична практика є принаймні такою ж ситуативною і контекстно-залежною, як і інженерія програмного забезпечення, і, на жаль, свідчать про те, що обґрунтовані доказові лікарі призводять до помітних поліпшень. Це багато в чому питання кількості та якості досліджень.
Кріс

8

Я читав Ерик С. Реймонд "Мистецтво програмування Unix" . У ньому є дуже цікаві історичні уявлення про речі, які ми зараз сприймаємо як належне. Він наводить кілька хороших досліджень програмного забезпечення IEEE, в яких використовуються емпіричні докази, такі як щільність дефектів. Це може бути хорошим джерелом, якщо ви шукаєте навчання в академічному стилі.

Навіть такі методи, як модуляризація за допомогою функцій, не завжди були звичайною практикою. Одна з моїх улюблених цитат з книги до цих пір:

Денніс Річі заохочував модульність, розповідаючи всім і всім, що виклики функцій були дійсно дуже дешевими в C. Усі почали писати невеликі функції та модулювати. Через роки ми з’ясували, що функціональні виклики все ще дорогі на PDP-11, і код VAX часто витрачав 50% свого часу на інструкцію CALLS. Денніс збрехав нам! Але було вже пізно; нас усі зачепили ...

- Стів Джонсон

Однак насправді є дві проблеми із надто емпіричним. Перший полягає в тому, що якість коду - дуже суб'єктивна річ. Код може бути жахливим і все-таки бути правильним. Сприйняття людьми парадигми програмування є дуже вагомою метрикою, оскільки код написаний для того, щоб люди читали стільки, скільки для комп'ютерів, якщо не більше.

Друга проблема полягає в тому, що у 50% розробників є нижчий середній талант програмування. Неважливо, чи є ваш головний розробник більш продуктивним, використовуючи функціональне програмування, якщо "кролик" бореться за те, щоб написати робоче програмне забезпечення, використовуючи його, не кажучи вже про прекрасне, добре архітектурне програмне забезпечення. Так само, як і з мовами програмування TMTOWTDI , ваш топ-розробник все ще збирається писати чистий модульний код, але менш талановиті кодери пишуть рядковий шум через відсутність нав'язаної структури.

Тому я вважаю, що OOP піднявся на вершину за популярністю, незважаючи на свої недоліки. Це не настільки обмежуючий характер, що він хапає найталановитіших, але його структура забезпечує стислий спосіб спілкування та нав'язування хороших принципів дизайну найменш талановитим.

У нашій роботі ми маємо тенденцію оцінювати рішення, виходячи із занадто великої кількості технічних достоїнств. Успішне починання має також враховувати і людську сторону рівняння.


"якість коду - це дуже суб'єктивна річ". Ви повинні бути уважними, що вимірюєте, і сприйняття є важливим фактором. Але сприйняття, як і багато інших речей, теж податливе: подивіться на підйом і падіння та підйом функціонального програмування, щоб побачити, що те, що люди думають про те, як вони працюють, не має прямого відношення до того, як вони працюють. Також я нещодавно перечитував TAOUP. Частиною моєї мотивації цього питання є бачення в ранній літературі рішень проблем, які є актуальними в інженерії програмного забезпечення.

+1, "Друга проблема полягає в тому, що 50% розробників мають нижчий середній талант програмування". Це речення для мене полегшення. Це краще, ніж багато таблеток, які я спробував :)
NoChance

3

Існують конкурси програмування, які використовують комп'ютерну систему оцінювання і дозволяють писати різними мовами та публікувати всілякі результати та речі. Б'юсь об заклад, що вони мають добрі дані для вас. Ось список із 8: http://www.makeuseof.com/tag/8-onlineprogramming-contests-challenge-win/

Я думаю, ви можете зробити змістовне порівняння рішень дуже простих і чітких задач, таких як сума квадратів або ряду Фібоначчі, або намалювати пряму лінію, використовуючи алгоритм лінії Брезена. У більшості завдань програмування в реальному світі немає таких чітких цільових постів, і кожна мова має свої приємні плями. Значна частина переваг мови є суб'єктивною. Ви можете знайти більш значущі дані, опитуючи програміст та щастя клієнта, ніж підраховуючи рядки коду чи кількості дефектів.

Пам’ятаю, коли я провів півдня на написання однієї з моїх перших програм Awk, я подумав, що мені знадобиться цілий тиждень, щоб зробити «те саме» на Яві. Але це тому, що моє рішення Java було б зосереджене на тому, щоб бути надійним там, де рішення Awk було швидким і брудним і вимагало певного ручного налаштування на вході та виході і було справді викинуто, коли я це закінчив. Awk і Java - чудові, тільки не для одних і тих же речей.

Я думаю, що я говорю, що для реальних програм застосування порівнювати мови та інструменти значущим чином надзвичайно важко - старі яблука та апельсини видають. Удачі! Я хотів би побачити те, що ви дізнаєтесь.


2

Я вивчав різні способи розробки програмного забезпечення протягом 30+ років. Існує досить багато опублікованих свідчень щодо вибору парадигми.

Я зібрав велику бібліотеку ASCII, яку можна шукати. Сюди входить багато статей та статей IEEE та ACM. Я тегую предмети за типом наданих доказів. Ось найпоширеніші теги:

...
133 =EXPERIMENT
177 =HISTORY
233 =IDEA
267 =SURVEY
338 =ESSAY
395 =THEORY
454 =ADVERT
491 =EXPERIENCE
500 =DEMO

Тепер знайдіть PARADIGM і порахуйте теги

  1 =ESSAY
  1 =EXPERIENCE
  1 =HISTORY
  1 =IDEA
  1 =POLEMIC
  1 =SURVEY
  1 =TALK

Якщо ви хочете копати глибше, http://cse.csusb.edu/dick/lab.html, і я сподіваюся, що це допоможе ...


1

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

Документ від 2004 року, заснований на доказах, інженерія програмного забезпечення Kitchenham et al. , Висвітлює цілком виграшні вигоди, отримані на основі доказового підходу, та проблеми з його впровадженням в інженерії програмного забезпечення. Я не буду обговорювати переваги тут (з питання зрозуміло, що я хотів би працювати таким чином), але проблеми є відповіді як відповідь на запитання, яке я задав.

  • по-перше, якщо ви не є членом ОСБ, то, ймовірно, ви взагалі не можете прочитати посилання, що стосується першої проблеми: не всі існуючі дослідження фактично доступні практикам.
  • багато інженерно-технічної практики продовжується таємно, як частина комерційно-конфіденційних процесів, тому немає видимості того, що робило чи не працювало для цих людей.
  • інженерія програмного забезпечення є кваліфікованою практикою, тому важко (не неможливо, просто важко) влаштувати відповідне засліплене дослідження.
  • різні частини життєвого циклу програмного забезпечення впливають на результати один одного настільки важко контролювати будь-який експеримент.
  • як свідчать дискусії тут, багато практиків не вважають "літературу" (або академічну сторону інженерії програмного забезпечення взагалі) відповідною для їх роботи.

Тож відповідь, яку я шукаю, - «ні», доказів, яких я шукаю, мабуть, не існує. Я повинен обрати свою парадигму, виходячи з існуючих популярних критеріїв того, що я знаю, що є крутим та думкою експертів.


2
з реферату цитованої статті, акцент міни: "Фактор майстерності означає, що експерименти з програмним забезпеченням вразливі до упередженості суб'єктів та експериментаторів . Коефіцієнт життєвого циклу означає, що важко визначити, як будуть вести себе технології після розгортання . Висновки: Інженерія програмного забезпечення виграє від прийняття того, що може бути доказовим підходом, за умови, що він має справу з конкретними проблемами, які виникають із природи інженерії програмного забезпечення ". До чого я додам: удачі в цьому! ;)
Стівен А. Лоу

Стівен: частина мотивації EBSE полягає в тому, щоб перейти від "я можу здогадатися про наступні проблеми, тому я відкину будь-який шанс вашого рішення працювати" до аналізу результатів за власними достоїнствами. Стаття набагато більше, ніж її конспект.

2
Я ціную ваш ентузіазм. Медична наука та розробка програмного забезпечення - кардинально різні дисципліни. Хоча аналогія цікава, вона навряд чи новаторська. Повний документ доступний тут labada.inf.utfsm.cl/~gvaldes/ESE/docs/… Розділ 5 відображає невідповідність імпедансу, згадану в рефераті. Більш прямим відображенням медичних методів було б налагодження існуючих систем, а не побудова нових. ;) Якщо ви хочете створити кращі продукти, створіть кращі команди. Люди набагато важливіші за інструменти (пор. Peopleware)
Стівен А. Лоу

1
доповнення: на сайті EBSE є якась корисна інформація, dur.ac.uk/ebse/evidence.php була б особливо корисною для тих , хто не з’явився в області SE - але прийміть опитування з допомогою солі, оскільки (1) наявні докази мізерно, і (2) середні результати можуть не відповідати результативності вашої команди конкретних осіб з високоспеціалізованими навичками та навичками.
Стівен А. Лоу

0

Я не вірю, що такого типу дослідження існує. Можна вважати, що не парадигма програмування має значення стільки, скільки фактичний алгоритм, який використовується. Наприклад, дана будь-яка нетривіальна система, яка покладається на віршовані алгоритми малого простору, а друга, що спирається на алгоритми малого часу, генерує різні показники. Той, у кого є кращий час, швидше за все, вважатиметься більш достовірним, якщо тільки пробіл не є проблемою, то обернена правда. Я вважаю це схожим на мощення дороги. Хоча алгоритм чи рецепт виготовлення матеріалів постійний протягом усіх процесів, одна компанія може вважати, що вимощення двох смуг одразу (по одній стороні дороги) краще, ніж прокладати дві смуги на одній стороні дороги відразу . Зрештою, неважливо, як процес виготовлення чорного верху все одно той же, Єдина відмінність - підхід. Повернувшись до програмування, якщо у вас є команда розробників C, пишіть код у процедурному порядку, якщо у вас є команда розробників Java, напишіть його в ОО. Не зациклюйтеся на парадигмі настільки, як на реалізації алгоритму. Тому що в кінці дня ви можете писати Java як C, а ви можете спробувати написати C як Java.

ОНОВЛЕННЯ

Щоб відповісти на коментар, Грем залишив мене:
Я думаю, що під архітектурою ви маєте на увазі парадигму програмування. Якщо ви збираєтеся використовувати Clojure, можливо, вам слід найняти команду програмістів Clojure. Однак, на основі швидкого пошуку Clojure - це мова на базі Java, вона просто функціонує. Враховуючи цю інформацію, я брав би програмістів Java (оскільки технічно вони можуть просто писати Java, і вони дадуть ті самі результати) або шукати функціональних програмістів, таких як розробники Haskell. Тепер щодо вибору того, що найкраще, це повністю залежить від вашої команди. Я ніколи не мав би команду експертів з реляційних баз даних організувати для мене хмарне рішення, а також я не мав би команду функціональних програмістів розробити для мене об'єктно-орієнтоване рішення. Ви повинні використовувати сильні сторони команди, у якої ви не маєте прославленого бачення, аби команда "повинна"


Як вибрати, чи наймати команду програмістів Java чи команду програмістів на C? Чи слід перевчити їх у Clojure? Після того, як я вибрав свій алгоритм, яка архітектура є "найкращим" способом його інкапсуляції в програмне рішення для заданих значень "кращий"?

@GrahamLee дивіться моє оновлення
Woot4Moo

Я відчуваю, що ми обговорюємо ту саму проблему, але на різних рівнях абстракції. "Використовувати сильні сторони вашої команди" означало б ніколи не створювати комп’ютер, тому що в Блетчлі Парк не було нікого з силою в побудові комп'ютерів. Іноді доводиться говорити, "ми могли б створити кращі рішення, якби ми використали цю річ"; те, про що я хочу, - це інформація про ці випадки.

0

Різні парадигми призводять до різних рішень. Від того, яка форма є найкращою, багато в чому залежить:

  • рішення
  • команда розвитку
  • операційне середовище

Я не знаю такого остаточного дослідження, і навіть якби воно було, я б йому не довіряв.

Це робота архітектора.

Заміна мудрості архітектора можливими неактуальними висновками дослідження є рецептом катастрофи.

Примітка: коментар згадує рішення про "алгоритм", а потім вибір мови. Алгоритми є центральним структурним механізмом процедурних мов. Об'єктно-орієнтовані мови фокусуються на класах та моделях співпраці / спілкування. Якщо ви переконані (як архітектор), що алгоритм-орієнтоване рішення є "найкращим", тоді дотримуйтесь процедурних чи функціональних мов.

Додаток: не довіряти навчанню - це не "забобон", це здоровий глузд. Наукові експерименти повинні бути об'єктивними та повторюваними. Програми програмного забезпечення є високо суб'єктивними, але ще гірше - це повторювані експерименти . Ви просто не можете реалізувати проект X з командою Y, виміряти результати, а потім повернути час назад, стерти спогади та повторно зробити той же проект з тією ж командою. Інформація, виявлена ​​або натякана на дослідження, може бути корисна архітектору, але вона ніколи не може бути остаточною.


1
Тож чи не за межами компетенції архітектора шукати попередню роботу, на якій можна будувати свою думку? Можливо, ні - звідси питання про те, чи можна знайти такі результати.

2
Якби було остаточне дослідження з розумним експериментальним методом, результати дослідження можуть бути цікавими; на сьогоднішній день, як видається, ця відповідь наголошує, що будь-яке дослідження є марним, незалежно від методу, який є мені занадто ненауковим для мене
jk.

3
@Steven: слово не довіряти результатам справді остаточного дослідження - це "забобон". Можливо, те, що ви насправді маєте на увазі, це те, що ви не вірите, що в SE можуть колись бути остаточні дослідження (яке твердження, очевидно, вимагало б великого, добре підтримуваного доказу).
Кріс

1
Якість програмного методу полягає в тому, наскільки він відповідає місцевим потребам людини. Взагалі це не обмежене законами фізики (Скотті). Мине довгий час, перш ніж «програмне забезпечення» [дисципліна] встигне вигнати свої незмінні основні закони. Наприклад, див. "Показники якості програмного забезпечення: Три шкідливі показники та дві корисні показники" на сторінці ppi-int.com/newsletter/SyEN-046.php#feature та ppi-int.com/newsletter/SyEN-047.php#feature
Філіп Оуклі

1
@Cris: Що стосується запису, ні, я не вірю, що в цій області коли-небудь може бути справді остаточне дослідження; див. додаток. Ідея, що "остаточне" дослідження може бути використане замість експертного судження для прийняття критичного архітектурного рішення, - це "звернення до влади", що є формою логічної помилки :) На моєму досвіді - і я не роблю ковдри звинувачення, просто спостереження - пошуки таких речей найчастіше є або спробою уникнути відповідальності за рішення, або спробою підтримати рішення, яке вже було прийнято.
Стівен А. Лоу
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.