Я новачок у галузі CS, і я помітив, що у багатьох прочитаних роботах немає емпіричних результатів (немає коду, лише леми та докази). Чому так? Вважаючи, що інформатика - це наука, чи не слід їй слідувати науковому методу?
Я новачок у галузі CS, і я помітив, що у багатьох прочитаних роботах немає емпіричних результатів (немає коду, лише леми та докази). Чому так? Вважаючи, що інформатика - це наука, чи не слід їй слідувати науковому методу?
Відповіді:
Математика також є наукою, і вам доведеться довго шукати, щоб знайти опубліковані емпіричні результати в цій галузі (хоча, мабуть, вони повинні бути деякі). Є й інші наукові сфери, де «леми та докази» оцінюються за досвідом, наприклад, квантова фізика. Зважаючи на це, більшість наук змішують теорію та практику (з різними співвідношеннями), і інформатика не є винятком.
Інформатика має коріння в математиці (див. Біографію Тьюрінга, наприклад, http://en.wikipedia.org/wiki/Alan_Turing ), і тому такі багато результатів (як правило, охрещені як у галузі "теоретичної інформатики") складаються в докази що комп’ютери в деяких обчислювальних моделях можуть вирішити певну проблему в заданому обсязі операцій (наприклад, конференції, такі як FOCS, STOC, SODA, SoCG тощо). Тим не менш, багато інших результатів інформатики пов'язані із застосуванням цих теорій до практичного життя шляхом аналізу експериментальних результатів (наприклад, таких конференцій, як WADS, ALENEX тощо).
Часто припускають, що ідеал - це хороший баланс між теорією та практикою, як у "Природознавстві", де спостереження за експериментами спонукає до породження нових теорій, які, в свою чергу, пропонують нові експерименти, щоб підтвердити або утвердити ці: як таких багато конференції намагаються прийняти як експериментальні, так і теоретичні результати (наприклад, ESA, ICALP, LATIN, CPM, ISAAC тощо). Підполе "Алгоритми та структури даних" в інформатиці може зазнати дисбалансу в тому сенсі, що "Теоретичні" конференції, як правило, більш високо оцінені, ніж експериментальні. Я вважаю, що це не вірно в інших підполях інформатики, таких як HCI або AI.
Сподіваюся, що це допомагає?
Добре реалізувати алгоритми - це вміння, яке використовує інший набір інструментів, ніж просто доведення теорем. Багато алгоритмів, виявлених теоретичним співтовариством, справді були реалізовані на практиці (хоча я хотів би, щоб теоретичне співтовариство брало більшу роль у цьому процесі). Фізика не просить одних і тих же дослідників робити теорію та експериментувати, хоча очікується, що дві групи спілкуються. Чому б не розраховувати побачити такий самий розрив у інформатиці?
ДОБАВЛЕНО У РЕДАКТУ:
Розширюючи мій коментар у відповідь на питання Суреша про те, що я маю на увазі під «роллю» вище, в Bell Labs і AT&T Labs, дослідників алгоритмів рекомендували спілкуватися з людьми, що знаходяться в стадії розробки. Я цього не робив так багато, як, мабуть, мав, але я дістав хоч один папір із цього, і, думаю, було б добре для цієї галузі, якби в університетах і практиків було більше спілкування між людьми в теорії . Це не означає, що я думаю, що кожен, хто придумав алгоритм, повинен його кодувати (навіть якщо це практично).
З іншого боку, алгоритми кодування (або кодування їх учнями), які, на вашу думку, можуть бути практичними, можуть бути корисними для адаптації їх практиками. Розглянемо один приклад. У 1977 та 1978 рр. Лемпель та Зів написали дві технічні праці щодо нових алгоритмів стиснення даних. Усі їх ігнорували. У 1984 році Велч написав набагато менш технічний документ, який дещо покращив його ефективність і дав результати невеликого дослідження, порівнюючи його ефективність з іншими методами стиснення даних. Він був опублікований у журналі, прочитаному рядом програмістів, а алгоритм був заданий кількома рядками псевдокоду. Метод був швидко адаптований у багатьох місцях, врешті-решт, це призвело до сумнозвісної суперечки щодо інтелектуальної власності.
Звичайно, один з найкращих способів спілкування дослідників з алгоритмами - це виробляти студентів, які працюють і працюють у Google, IBM чи інших компаніях, і ми вже це робимо. Іншим способом може бути відповідь на питання практикуючого на цьому форумі. Сподіваємось, ми теж робимо розумну роботу з цього питання.
One research area that uses empirical methods and methods of Theoretical Computer Science is the field called "Experimental Algorithmics" or "Algorithm Engineering". Like Chris mentioned, high performance computing relies heavily on this as modern systems have complex cache and latency issues that we have a hard time modeling.
Gerth Brodal and Peter Sanders are good examples of researchers who maintain a foot in both the "proof" and "empirical" realms.
--Update 1/20/2013-- I would also mention a great presentation by Robert Sedgewick.
This depends on the discipline you are in; as Jeremy states, there is a spectrum of theory vs. practice.
Topics like complexity tend to be weighted towards the theory side, as often the goal is to find a boundary for the space or runtime. Implementing an algorithm in C++ and then running it a bunch of times isn't going to prove that a problem is NP-complete.
As a polar opposite, high-performance computing (with conferences like Supercomputing) are all empirical; no one would ever submit a proof to an HPC publication as there is too much variability with regard to memory hierarchy and kernel overhead.
So what seems like the same question (How long does something take to run?) will be approached two completely different ways depending on the goals, techniques, community, etc. See Poul-Henning Kamp's You're Doing It Wrong for an example of the dissonance.
In programming languages research many ideas for new programming language constructs or new type checking mechanisms stem from theory (perhaps informed by experience in practice, perhaps not). Often a paper is written about such mechanisms from a formal/theoretical/conceptual perspective. That's relatively easy to do. Next comes the first hurdle: implementing the new constructs in the context of an existing compiler and experimenting with it, in terms of efficiency or flexibility. This too is relatively easy.
But can we then say that the programming construct constitutes an advance to the science of programming? Can we say that it makes writing programs easier? Can we say that it makes the programming language better?
The answer is no. A proper empirical evaluation involving scores of experienced programmers over large periods of time would be needed to answer those kinds of questions. This research is hardly ever done. The only judge of the value of a programming language (and its constructs) is the popularity of the language. And for programming language purists, this goes against what our hypotheses tell us.
Perhaps I'm missing the motivation for your question but there are many examples of empirical results motivating research, algorithms and other results.
MP3 use psychoacoustic to optimize the algorithm for human encoding.
Plouffe gives an account of discovering the BBP spigot algorithm for the digits of where he recounts the use of whatever Integer Relation Algorithm Mathematica was using to discover the formula.
Along the same line, Bailey and Borwein are big proponents of experimental mathematics. See "The Computer as Crucible: An Introduction to Experimental Mathematics", "Computational Excursions in Number Theory" amongst others. One might argue that this is more experimental Mathematics but I would argue that at this level the discussion the distinction is semantic.
Phase transitions of NP-Complete problems are another area where empirical results are heavily used. See Monasson, Zecchina, Kirkpatrick, Selman and Troyansky and Gent and Walsh for starters, though there are many, many more (see here for a brief survey).
Though not quite on the level of Theoretical Computer Science or Mathematics, there is a discussion here about how the unix utility grep's average case runtime beats optimized worst case algorithms because it relies on the fact that it's searching human readable text (grep does as bad or worst on files with random characters in them).
Even Gauss used experimental evidence to give his hypothesis of the Prime Number Theorem.
Data mining (Bellkor's solution to the Netflix Prize to make a better recommendation system) might be argued to be a theory completely based on empirical evidence. Artificial Intelligence (genetic algorithms, neural networks, etc.) relies heavily on experimentation. Cryptography is in a constant push and pull between code makers and code breakers. I've really only named a few and if you relax your definition of empirical, then you could cast an even wider net.
My apologies for being so scattered in answering your question but I hope I've given at least a few examples that are helpful.