Чи важлива концепція складності обчислень для розробників програмного забезпечення? [зачинено]


11

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

Чи важлива концепція складності обчислень для розробників програмного забезпечення? І чи слід це викладати на бакалаврських курсах?


1
Щоб пояснити питання на прикладі: випускники, до яких я натрапив, не знають, що O(n^2)означає.
Мухаммед Алкароурі

1
Цікаве відповідне запитання: programmers.stackexchange.com/q/20832/6184
Мухаммед Алкарурі

Відповіді:


12

У більшості університетів я припускаю (сподіваюся!), Що складність часу та пам'яті, безумовно, є частиною їхніх курсів.

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

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


8

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


6

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

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

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

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

Редагувати:

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

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

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


Цікавий альтернативний погляд. Чи можете ви пояснити, як би ви ввели ці поняття? Або як ти зрозумів їх? Це може вказувати на альтернативний спосіб отримати необхідне розуміння.
Мухаммед Алкароурі

1
@MuhammadAlkarouri Я відредагував свою відповідь, щоб трохи вирішити цю проблему.
Дмитро

4

Так

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

Оновлення: чому це важливо

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

Справа в тому, що легко випадково зробити щось, що на порядок на повільніше, або завжди залишиться в пам’яті до завершення завдання. Хоча швидші машини з більшою кількістю пам'яті можуть пом'якшити невеликі помилки, вони часто не можуть пом'якшити проблеми складності.


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

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

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

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

3

Я вважаю, що запитувати, чи це "важливо чи ні", є досить невиразним.

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

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

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

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

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

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

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


1
Друга частина, мабуть, менш розпливчаста: чи слід це навчати студентам компси на рівні бакалавра?
Мухаммед Алкароурі

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