Чому деякі програмісти вважають, що існує протиставлення теорії та практики? [зачинено]


63

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

На противагу цьому, розмовляючи з деякими програмістами чи читаючи блоги чи форуми, я часто знаходжу широку думку, яку можна сформулювати більш-менш так: теорія та формальні методи призначені для математиків / вчених, тоді як програмування - це більше про те, щоб зробити справи .

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

За моїм досвідом, я б сказав, що поки вам не потрібно багато теорії, щоб зібрати 100-рядковий сценарій (хата), для розробки складного додатку (10-поверховий будинок) вам потрібна структурована конструкція, ну -визначені методи, хороша мова програмування, хороші підручники з текстами, де можна шукати алгоритми тощо.

Таким чином, теорія ІМО (потрібна кількість) є одним із інструментів для виконання справ .

Моє запитання: чому деякі програмісти думають, що існує протиставлення теорії (формальних методів) та практики (виконання речей)?

Чи сприймається багатьма простою інженерія програмного забезпечення (будівельне програмне забезпечення) порівняно з, скажімо, будівництвом (будівництво будинків)?

Або ці дві дисципліни насправді відрізняються (окрім критичного для місії програмного забезпечення, відмова програмного забезпечення є набагато більш прийнятним, ніж збій у будівництві)?


Я намагаюсь підсумувати, що я зрозумів з відповідей поки що.

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

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

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


9
ні, 90% програмістів є;)
jk.

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

65
У теорії немає різниці між теорією та практикою, але на практиці існує.
Joris Timmermans

6
Хороша книга для пошуку алоритмів? Більшість програмного забезпечення - це просто простий CRUD без нічого близького до того, що включено в будь-який курс алгоритму чи книги.
Жиль

44
Теорія про сучасні мови та алгоритми. Практика приходить на роботу в перший день і дається завдання додати незначну функцію до програмного забезпечення, що працює на касі, який використовує програмне забезпечення, яке було перетворено вручну з BASIC на K&R C людьми, які не знали C , використовуючи помилковий компілятор від постачальника, який збанкрутував і, як очікується, ця функція запрацює не пізніше п’ятниці.
Gort the Robot

Відповіді:


61

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

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


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

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

1
@blesh: Я не думаю, що так. Жорсткі межі обладнання однаково стримують хорошу та погану інженерію.
Майкл Боргвардт

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

5
Однозначно є щось "теоретичне" щодо UML ... ... його корисності!
ObscureRobot

29

Інженерія програмного забезпечення та цивільне будівництво мають мало спільного. Зусилля цивільного будівництва обмежені фізичними властивостями матеріалів та навколишнього середовища. Будівельні інженери проводять багато часу, вивчаючи властивості ґрунту та характеристики матеріалу. Розробка програмного забезпечення фізично обмежена лише швидкістю процесорів та наявним сховищем. І те й інше легко зрозуміти, і ми не витрачаємо багато часу на їх вивчення. Основним обмеженням у розробці програмного забезпечення є інтелект людини. І жоден два розробники не схожі. Чи є цей код доступним? Ким? Трирядкова реалізація кваксорту в Haskell може бути очевидно правильною для деяких, але незрозумілою для інших. Команда з двох осіб може заповнити заявку протягом місяця, тоді як інша команда з десяти намагається поставитись за рік.

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


1
Я погоджуюся з вашими спостереженнями про те, що людський фактор значно сильніший у програмному забезпеченні, але все-таки я вважаю, що спроба аналізу проблеми чи структури вашого рішення є загальним ставленням / інструментом. Моє запитання, чому деякі програмісти вважають, що це не корисний підхід (або навіть марно витрачання часу). Ви згадали про Haskell: Я доклав зусиль, щоб вивчити якийсь Haskell, хоча я не використовував його в жодному проекті, тому що думав, що це допоможе мені написати кращий код (навіть у C ++ або Java). Навіть якщо я не можу це виміряти, моє відчуття, що я став більш продуктивним: я все більше роблю.
Джорджіо

2
Трехрядковий хасквелл? Хм ... чи можливо навіть реалізувати Quicksort мовою, де все незмінне за дизайном?
Мейсон Уілер

3
@MasonWheeler Перший результат від Google: Quicksort у Haskell .
chrisaycock

3
@ Мейсон: час виконання все ще O (n log n). Він також вимагає O (n log n) пам’яті, на відміну від встановленої швидкості, яка вимагає лише O (log n) додаткової пам'яті для рекурсії.
кевін клайн

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

17

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

У традиційній техніці

  • ти повинен знати свою математику та науку, тому що все, що ти робиш, засноване на цьому
  • "герої" на місцях - це люди, які вигадують нові речі, відкривають нові ідеї, вирішують проблеми, що вважаються нерозв'язними

Існує "фізика", яка стосується програмно - теорії інформації, але інженери програмного забезпечення її мало піддаються, і, звичайно, нічого не застосовують. Найбільше теорії, яку вони отримують, - це обчислюваність та big-O.

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

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

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


5
Фізика може сказати вам, чи зруйнується якась структура під власним навантаженням. CS повідомляє вам, що ви не можете сказати, чи зупинить певну програму певний вхід. Офіційні методи ІМО набагато краще масштабуються в цивільній чи машинобудуванні, ніж у програмному забезпеченні, головним чином, тому що системи менш складні та менш динамічні ...
Гай Сіртон,

6
@GuySirton "CS повідомляє вам, що ви не можете сказати, чи зупинить дану програму певний вклад". якщо це все, що ви думаєте, що робить CS, я думаю, ви можете не знати стільки про CS, скільки ви думаєте, що ви робите ...
gregghz

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

3
Я дав би вам +1, окрім тріщини щодо читабельності. Ремонтопридатність становить 80% вартості програмного забезпечення, тому читабельність не є малим питанням. Крім того, коли той авіабудівник або ядерний інженер робить щось, що буде виготовлено, щоб інші люди розуміли, це важливо. Військові, урядові чи навіть великі установи не задоволені магічним винаходом, який не може повторити чи зрозуміти ніхто, крім винахідника.
Томас

2
@Thomas - твердження про те, що життєздатні рішення часто відкидаються на зміну «читабельності» субпартом, не обов'язково означає, що рішення не такі розбірливі, як повинні бути. Я бачив, як це відбувається. Чорт, я зловив себе це робити.
Ерік Реппен

13

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

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

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


Ви сподіваєтесь, що вони не помруть ... залежить від вашого програмного забезпечення;)
Rig

3
@Rig, саме тому я сказав "більшість" і "зазвичай". Деякі програми набагато критичніші.
CaffGeek

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

11

Веди зі мною на цьому. У мене є пункт.

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

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

Я був такою бідною, нещасною душею, і так, мабуть, багато з вас, напевно. Я закликаю вас усіх. Не приймайте простий вихід! :)


3
Якщо вам доведеться це зробити один раз і забути про нього, це добре. Але якщо після цього вам доведеться розширити і підтримувати, ви шукаєте неприємностей. Ви повинні мати відчуття того, скільки теорії: занадто багато означає, що ви ніколи цього не зробите, занадто мало означає, що ви збираєтесь це зробити 10 разів, перш ніж це дійсно буде зроблено. Мої 2 копійки.
Джорджіо

6
Але іноді вам потрібно отримати програмне забезпечення в двері ЗАРАЗ . Вам потрібно перемогти конкурента на ринку. Або у вас є юридична вимога надати певну інформацію. Або вам просто потрібно отримати грошовий потік, щоб ви все одно існували, коли безлад, який ви зробили у своєму підході "закінчіть це", є проблемою ... що іноді є хорошою проблемою. Тому що, якщо у вас його не було, ви не звільнилися вчасно, і ваша компанія мертва, перш ніж вона починається.
CaffGeek

1
@Chad - я з вами згоден. Це баланс. Усі речі, про які ви згадуєте, потрапляли б під "справжнє обмеження у часі", як причини для програмування "виконано", і в короткий термін це добре і навіть вигідніше, як ви це вказуєте.
FishBasketGordo

@FBG: блискуче сказав.
Kuba Ober

@Chad, хороший момент. Мартін Фаулер робить подібний пункт на сайті martinfowler.com/bliki/TechnicalDebt.html . Іноді це вартий компроміс.
Джон М Гант

9

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

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

Загальний фактор - вартість. Проектування на традиційному проекті цивільного будівництва зменшує витрати (як фактичні, як матеріальні, так і потенційні з точки зору відповідальності), тоді як в розробці програмного забезпечення наступає момент, коли вартість проектування збільшується понад повернуту вартість.


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

Є проекти ІМО майже нульові, розроблені наперед, які насправді відповідають їх дизайну. Цивільне будівництво - це (взагалі?) Будівництво однієї і тієї ж речі знов і знов (дорога, чорт, тунель, будівля, міст). Методики добре відомі. Це не вірно в програмному забезпеченні. Тому що це можна легко змінити і тому, що люди не знають, чого хочуть чи що працює, поки не спробують це серйозно, передня конструкція - це марна трата часу. Ми будуємо, тестуємо і повторюємо. Що неможливо з цивільним будівництвом, як зазначено вище. 2 дисципліни не порівнянні.
gman

5
Вибачте, я маю зазначити помилку друку: я не думаю, що будівельні інженери будують чорт. ;-)
Джорджіо

2
Я думаю, що в майбутньому, коли ми, інженери-програмісти, будуватимемо класне програмне забезпечення для моделювання цивільної інженерії, цивільні інженери можуть покінчити з усіма цими математичними речами. Просто побудуйте віртуальний хмарочос висотою 10 км. Якщо він не руйнується під власною вагою протягом перших 100 віртуальних років і може витримати віртуальний ураган котом 5, тоді використовуйте спеціальний 3D-принтер хмарочоса для його побудови.
emory

1
@RexKerr: ти порубав половину його твердження: "... що відповідає необхідним стандартам безпеки"
Lie Ryan

7

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


6

Креслення архітектора / цивільного інженера практично ніколи не ідентичні планам "як побудовані". Щось ЗАВЖДИ змінюється. Чому? Тому що є і завжди будуть "невідомі невідомі". Є речі, які ви знаєте і так можете планувати, речі, які ви знаєте, невідомі, і ви можете досліджувати і оцінювати, а потім є речі, які ви не знаєте, що не знаєте; "сюрпризи". Ви прагнете усунути їх у більшості систем, вивчивши все, що можете, але все, що потрібно, - це одне невелике порушення будівельного коду (яке може базуватися на правилі, яке не існувало 2 роки тому, коли ваша будівля розроблялася) і ваших усіх -обхідний генплан повинен змінюватися, іноді досить кардинально.

Програмне забезпечення дуже схоже на це; завжди невідомо невідомо. Однак, на відміну від цивільної чи будівельної інженерії, розробка програмного забезпечення по суті є набагато більш толерантною до змін на основі проблем, які створюють невідомі невідомі. Якщо ви будуєте 10-поверховий будинок, і ви завищили несучу здатність фундаменту, який ви заклали у свій проект, ви або не можете побудувати будівлю на 10 поверхів, або вам доведеться вирвати значну кількість робіт поверніться до фундаменту та зміцніть або відновіть його. Однак у програмному забезпеченні, якщо ви недооцінили вимоги до певного рівня загальної структури рішення, існує багато варіантів виправлення цього рівня, які не передбачають недійсності всіх інших робіт. Ви можете замінити один сервер БД на більш потужний або кластер реплікації / відмови, або кластер, що балансує навантаження / розподілений. Те саме для веб-сервера. Якщо ви зашифрували неефективний, але простий алгоритм, заснований на помилкових припущеннях розміру вводу, ви можете майже завжди просто видалити та переписати реалізацію відносно хірургічним чином, не впливаючи на інший код, який має знання алгоритму (викликає та передає вхід до він або очікує від нього вихід).

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


3
Існує також набагато більше невідомих невідомих в розробці програмного забезпечення - ви можете почати будувати хмарочос, але коли клієнт дивиться на це, вони говорять вам, що "насправді я хотів десятиповерховий високий куб Рубікса".
Tacroy

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

1
@Giorgio, або законопроект відповідно ...
CaffGeek

5

Різниця полягає насамперед через відомі вимоги:

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

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

Ми використовуємо бібліотеки для подібних речей якомога більше.


1
+1 для "якщо говорити про" теорію ", це зазвичай означає теоретичну сторону інформатики".
Джошуа Дрейк

5

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

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

Один з моїх колег, який працював у NASA, раніше описав процес розробки програмного забезпечення як написання сотень сторінок обґрунтування та сотні годин зустрічей, щоб виправдати написання єдиного рядка коду!

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

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

Під час створення програмного забезпечення вартість його збоїв рідко призводить до втрати життя, тому набагато простіше швидко викинути туди речі та випробувати її. Давайте погодимось, що швидке виконання справ призводить до слабкого коду. Навіть якщо це завжди так, бачити програмне забезпечення в дії - це найкращий спосіб для розробника побачити, де він слабкий, і його потрібно посилити порівняно з тим, де він слабкий і все ж у багато разів сильніший, ніж потрібно бути в курсі навантаження.

Підводячи підсумки, Premature optimization is the root of all evil або як завжди міг би сказати мій начальникShipping is a feature!


3
+1 для "Доставка - це особливість"! Одного разу я почув подібне речення: "Досконалості не існує. Цей програмний продукт має ту перевагу, що він існує". Звичайно, це трохи жарт. Що стосується критичного для місії програмного забезпечення: невдале виключення може спричинити аварію ракети.
Джорджіо

this software has the advantage that it exists... Я цього ще не чув, але він потрапляє до мого списку чудових котировок програмного забезпечення. мені це подобається
Альберт Ланг

@Giorgio: JSF та MISRA C написані так, щоб не було винятків. Винятки та ракети не поєднуються.
Кодер

5

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

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

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

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

TL; DR : Теорія та практика в інженерії програмного забезпечення різні, як і скрізь. Правильною аналогією є інженерія програмного забезпечення: цивільне будівництво :: інформатика: фізика. Але на практиці це трохи складніше, ніж це :)


"Я думаю, що інженерам-будівельникам рідко доводиться враховувати загальну відносність, займаючись своєю роботою. Багато будівельного будівництва може бути безпечно побудовано в Механіці Ньютона.": Наскільки я знаю, їм доводиться використовувати досить багато числення (інтегралів і подібні речі). Це не квантова механіка, але ІМО, безумовно, нетривіальна.
Джорджіо

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

Ти правий. Однак, моя думка не в тому, скільки теорія використовується в цивільному будівництві Wrt для інженерії програмного забезпечення. Швидше за все, будівельні інженери знають, що вони повинні використовувати свої формули та робити розрахунки, як побудувати якусь будівлю. В інженерії програмного забезпечення у мене складається враження, що є більше імпровізації, і іноді, якщо ви хочете сісти і проаналізувати проблему (просто щоб виправити це, а не написати кандидатську дисертацію про це), ви можете нахмуритися: ми хочемо його отримати закінчено, щоб не зробити його ідеальним. Але деяка теорія ІМО (не надто багато) - саме те, що може допомогти швидше закінчити її!
Джорджіо

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

Нічого собі, вибачте, що це поза темою, але, не читаючи вашої відповіді, я закінчила це точно так само - з TL; DR, а потім буквально з такою ж аналогією. Формат SAT. Я відредагував це з моєї відповіді, щоб воно не виглядало так, що я вас копіюю, але все одно мене відлякує. Можливо, програмісти думають занадто багато.
Ярсен

3

Отже, моє запитання: чому деякі програмісти думають, що існує протиставлення теорії (формальних методів) і практики (виконання речей)?

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

Ще один приклад можна зробити з маніпулювання даними. Часто має сенс використовувати делегатів у контексті .NET. У Java це не так просто, оскільки у нього немає рамкової підтримки функціонального стилю програмування, яку має .NET. Іншими словами, в загальному випадку зробити X в ситуації Y просто неможливо. Це пов'язано з тим, що X і Y залежать від N кількості змінних факторів.

Чи сприймається багатьма простою інженерія програмного забезпечення (будівельне програмне забезпечення) порівняно з, скажімо, будівництвом (будівництво будинків)?

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

Або ці дві дисципліни насправді відрізняються (окрім критичного для місії програмного забезпечення, відмова програмного забезпечення є набагато більш прийнятним, ніж збій у будівництві)?

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


1

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

Ваш досвід співпадає з тим, що сказала б більшість людей, яких я знаю (які розробили і написали досить складне програмне забезпечення).

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


3
"математика ... вже зроблено": не тільки врахуйте всі функції бібліотеки, рамки, СУБД, протоколи та багато інших важких речей, які ми можемо просто використовувати в нашому коді, викликаючи функцію з деякими параметрами. Як програміст, я іноді більше схожий на працівника, який ходить по ешафті, ніж на інженера, який проектував будівлю.
Джорджіо

1

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

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

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


1

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

Ви не намагаєтесь і математично формально довести велику програму правильно, точно так само, як ви не намагаєтесь записати хвильову функцію для 100-поверхового будинку


То який програмний еквівалент аналізу кінцевих елементів 100 поверхового будинку? Скільки високих будівель мають помилки в термічній / краш? :-)
Гай Сіртон

@GuySirton - ви можете аналізувати лише велику будівлю лише на дуже грубому рівні, менше деталей, ніж ви б випробували типове додаток. У багатьох великих будівлях є розломи, випадають вікна, руйнуються доріжки, вони створюють ефекти вітрових тунелів. Або у випадку одного зігнутого відбивного готелю у Вегасі ви створюєте промінь смерті в басейні!
Мартін Бекетт

Ви можете пройти досить дрібне зерно в FEA і передбачити поведінку з дуже високою точністю. Люди все ще роблять помилки. ІМО просто неможливо робити подібні прогнози на складному програмному забезпеченні. Згадані вами недоліки - це незначна частка загальної кількості будівель. Коефіцієнт дефектів програмного забезпечення повинен бути на два порядки вище. Однак це очевидно є континуумом між тим, де формальні методи корисні та де вони марні.
Гай Сіртон

@GuySirton - Я думаю, що складність полягає в тому, що ти покладаєшся на інші речі. Nasa може перевірити льотну авіоніку на дуже детальному рівні (хоча все ще не доводить це правильно), оскільки вони також створюють ОС та обладнання. Писати на загальній ОС із наборами інструментів та ліб - це як будувати міст, де вам не дозволяють знати деталі сталі чи бетону.
Мартін Бекетт

1
@MartinBeckett, а коефіцієнт тяжкості змінюється випадковим чином з години на годину ... як, коли ваш системний адміністратор випадково вирішує оновити сервер, не повідомляючи нікому, оскільки "це буде прозоро".
CaffGeek

1

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

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

Тож давайте візьмемо приклад із вашої хати (я зазвичай говорю про те, щоб зробити міст, перекинувши колоду через потік проти кілометрового підвісного мосту ... як би там не було!), І перенесіть його у світ інженерії програмного забезпечення. Основна відмінність, яку я бачу, полягає в тому, що в роботі програмного забезпечення більша частина роботи має такі масштаби, що для успіху їй не потрібно велике моделювання вперед. Помилка початківця полягає в тому, що вважати, що для цього потрібно більше, ніж насправді, і для більшості з нас, зробивши цю помилку кілька разів, ми маємо бажання робити це знову занадто часто.

Ніяких аргументів - є проекти, які потрібно починати з комітету з 17 архітекторів програмного забезпечення. Насправді вони є такими ж рідкими, як 20 каратних алмазів.


1

Я думаю, що аналогія є хибною. Наскільки мені відомо, цивільне будівництво не має такої теоретичної основи, як інформатика; інформатика народилася з теоретичної математики - як машини Тьюрінга. Цивільне будівництво - це створення структур, що протистоять материнській природі і, можливо, навіть виглядають красиво. Знову ж таки, я справді мало знаю про цивільне будівництво, але я не думаю, що є еквіваленти інженера-будівельника P vs NP, мандрівний продавець та інші цікаві речі, які б урізалися з вашими мізками. І для нашої теорії інформатики, безумовно, є місце - якщо хтось вирішить подорожуючого продавця або проблему, що зупиняється, у нас стоїть багато нових дивовижних успіхів. Але для інженера-програміста, який займається архітектурним програмним забезпеченням, такі проблеми справді є лише розвагою та іграми.

Тепер я також думаю, що це залежить від того, що ви маєте на увазі під "теорією". Ми говоримо про схеми дизайну чи накачуємо лему? Тому що добре розуміти шаблони дизайну абсолютно важливо, щоб бути хорошим інженером-програмістом. Однак при архітектурі великої програмної системи теоретизувати проблеми P / NP не корисно. У цьому сенсі я вважаю, що між інженерією програмного забезпечення та теоретичною інформатикою існує дуже різкий контраст.

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

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

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


1
Я бачу деякі схожість між нашими відповідями, але ваші ідеї, очевидно, оригінальні і є деякі відмінності. Я не згоден, що розуміння Р / НП не корисне. Вам не доведеться глибоко вивчати теорію складності, але працюючий інженер програмного забезпечення повинен мати можливість оцінити O (n) будь-якого заданого коду і сказати розумні речі про вартість альтернативних рішень. Справа, яку ви майже не доводили, але цього не зробили, - це те, що теорія часто міститься в бібліотеках. Це добре врахувати.
ObscureRobot

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

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

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

@Jarsen: Це правда, що інформатика є дуже молодою, але будь-який комп'ютер, який був побудований дотепер, може робити лише обчислювальні речі Тьюрінга. Наскільки я знаю (насправді дуже мало) навіть квантові комп'ютери не можуть зробити більше (вони могли би вирішити певні проблеми швидше, але більше проблем не зможуть вирішити). Так, так, хто знає, що можна винайти, але будь-який обчислювальний формалізм, який був уявлений протягом останніх 70 років, не може зробити більше, ніж машина Тьюрінга.
Джорджіо

1

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

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


0

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

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

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

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


0

Ставки нижчі, робота легша, а керівництво рідко бачить цінність у гарному дизайні. Нестабільність, ремонтопридатність та цілісність - це проблема "ІТ", а не проблема "бізнесу". Усі керівники мають одне спільне. Вони або на 95% зосереджені на грошах, або звітують перед кимось, хто є.

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

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

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

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


0

Перш за все, мені подобається це питання. Я написав, як три відповіді на 1000 слів, і всі вони жахливо помилялися до того моменту, коли я дійшов до кінця.

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

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

Чи є, наприклад, модель MVC ідеально підходить, має багато спільного з цим контекстом. Настільний додаток зазвичай працює однією мовою та однією мовою, не враховуючи конфігураційні файли.

Передня частина веб-програми, з іншого боку, складається з двох декларативних (непрограмуючих) мов та JavaScript. Єдина фізична річ, яку ви не можете повністю відігнати - це той факт, що завжди існує ця стіна http, щоб перемістити речі між сервером та браузером. Незалежно від того, як ви закопуєте його в код, це вимагає часу та асинхронного дизайну.

Очевидно, що ви не можете використовувати популярний та добре розглянутий зразок, як MVC, щоб вирішувати проблеми в інтернеті виключно, не змінюючи способи обробляти його в контексті настільних додатків. Насправді я заперечую, ви повинні знати про те, що робить MVC корисним, але навіть не намагатися реалізувати його в особливо вимогливих або оптових продажах. Парадигма веб-додатків унікальна тим, що всі переглянуті вами речі обробляються веб-переглядачем користувача, а всі дані / моделі-результати зазвичай є десь на сервері. Але де це залишає контролер? Все на сервері чи все на передньому кінці? Хтось має володіти цим. А може, MVC не на 100% найкраще підходить для сценарію. Непогано підійде для .NET резервного матеріалу. Не страшно в контексті конкретних віджетів інтерфейсу користувача.

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


0

Гленн Vanderburg представляє прекрасний вид на відмінностях між програмної інженерії та більш традиційними інженерними дисциплінами: http://www.youtube.com/watch?v=NP9AIUT9nos

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

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.