Що є одним з бітів теорії інформатики, який я повинен знати? [зачинено]


27

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

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


42
1 (вибачте, довелося)
haylem

5
о, або найзначніший! (Я піду зараз ...)
haylem

Теоретичний обмін інформатикою підтверджує те, що тут згадують усі: складність, структури даних та алгоритми. cstheory.stackexchange.com/tags
chrisaycock

2
Я відчуваю необхідність заперечувати проти цього питання. Не існує "одного біта", якого було б достатньо для вивчення, і більше того, немає (IMHO) одного "найважливішого" біта. Є кілька аспектів, які (знову ж таки, IMHO) однаково важливі для CS. Тому я думаю, що хоча відповіді на це питання можуть бути цікавими, питання могло б бути сформульовано краще.
Конрад Рудольф

1
Якби у вас ще не було свого енга, я б сказав булева логіка та / або дискретна теорія чисел. Майже кожні ifта loopзатвердження коли - або написане використовує підмножина цих двох областей дослідження.
Стівен Еверс

Відповіді:


52

Якщо я повинен вибрати тільки один біт, який є важким рішенням, я б сказав , що піти на нотації Big O . Розуміння наслідків O (n), O (ln n), O (n²), O (2 ^ n), O (n!) Допомагає вам уникнути безлічі дорогих помилок, види яких добре працюють у тестове середовище, але катастрофічно виходить з ладу у виробництві.


2
+1, і я б сказав, що важливіше, що просто знати, що O (n ^ 2) гірше, ніж O (lg n) (наприклад), - це знати, як отримати Big-O для заданого фрагмента коду.
Дін Хардінг

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

Магнус: З мого досвіду, більшість людей, які не програмують, взагалі не замислюються над складністю, вони інтуїтивно вважають O (n) для всіх проблем.
користувач281377

Мені це ще формально потрібно.
CaffGeek

1
Чад: Немає нічого про велику О-нотацію, яка є надто формалістичною, але без назви речей навряд чи можна думати про ці речі, не кажучи вже про це з колегами.
користувач281377

19

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


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

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

@Bill: Точно. Але ця частина - це одне, чого ви не обов'язково отримуєте на практиці. Теорія дуже допомагає в цій частині.
Менмент

12

Дізнайтеся про структури даних, алгоритми та складність даних.

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

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

Знання моделювання баз даних також важливо.

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


Специфіка - існує багато алгоритмів та структур даних.
Джон Хопкінс

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

1
Це зовсім трохи більше, ніж один біт.

7

Це трохи складне питання.

Всі аспекти інформатики важливі в тій чи іншій мірі.

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

Розуміння великої нотації O важливо, а також розуміння того, як може виконуватися ваш код, також дуже важливо в реальних ситуаціях.


7

Так, це наштовхувало мене на роздуми годинами.

У процесі роботи мені довелося видалити деякі поширені відповіді, які вже дано тут.

НЕ СПИСОК

  1. Велике O (n) позначення . Це важко сказати тут, але Ні, ми можемо інтуїтивно розробити неефективність та порівняти різні набори процедур, навіть не віддалено чуючи про асимптотичний алгоритмічний аналіз.

  2. Функціональні мови Ні, Єдина сім'я мови - це лише один підхід до роздумів про проблеми. Чому тільки цей шматочок повинен мати значення?

  3. Проблема зупинки Деякі просто занадто конкретні, і люди прожили життя, не знаючи, що вони існують.

  4. Слухай Якщо ти не слухаєш, то живеш у своєму власному світі. Не обов’язково згубно!

  5. Цикл розробки програмного забезпечення Nah! Ми все ще можемо натрапити на неймовірне програмне забезпечення або солі героїчні зусилля.

  6. Теорія складності Я думаю, це могло бути, але без усіх формалізмів

Ця одна ідея від Comp Science

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

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

Коли ви бачите кого - небудь , використовуючи list insertionв pythonі not append, ви посміхаєтеся , тому що ви знаєте , що списки пітона побудовані з використанням масивом абстракції , де вставки є дорогими і Append дешевше.

Це лише один приклад.


+1 за відповідь, яку ви, очевидно, багато думали.
Джон Хопкінс

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


3

Конкурентні випадки використання структур даних.

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


3

Є лише три числа, які мають значення:

  • нуль
  • один
  • багато

але це не означає, що "3" також має значення?
Хав'єр

Це має бути нуль, одиниця
Thomas Owens

@Javier: 3 - це підмножина багатьох
Стівен А. Лоу

@Thomas: каже хто?
Стівен А. Лоу

@Steven Моє розуміння може бути не на 100%, але я думаю, що ідея полягає в тому, що у вас немає нічого, ні однієї речі, ні кількості речей, які ви маєте, не повинні обмежуватись. Якщо ви не обмежуєтесь ні одним, ані одним екземпляром, тоді вам не слід обмежувати екземпляри. Однак я не зовсім впевнений, Чому це так (я лише смутно знайомий з концепцією Zero / One / Infinity).
Томас Оуенс

3

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


Що саме ви маєте на увазі під нестабільністю?
amara

3

Проблема зупинки

Той факт, що існують проблеми, пов'язані з комп'ютером, які просто не можуть бути вирішені комп'ютером.


3

Вам слід знати достатню теорію автоматів, щоб можна було знати, де проблема, з якою ви маєте справу, потрапляє в ієрархію формальних мов. З цього ви можете зрозуміти кілька важливих практичних застосувань, наприклад, чому ви не повинні використовувати REGEX для розбору HTML (HTML для його опису потрібна контекстна вільна граматика), і чому для збирання C ++ потрібно набагато більше часу на відміну від Java або C # (для C ++ потрібна машина Тюрінга, тоді як Java та C # можна описати контекстними граматиками).

Найважливіші рівні формальних мов - від найслабших до найсильніших:

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

  2. Мови, які можуть бути розібрані автоматами з пам'яттю стека або граматикою без контексту.

  3. Мови, які можна проаналізувати машиною Тьюрінга або автоматами з пам'яттю з випадковим доступом.


Гм, ні. Регулярний вираз розбирає звичайну граматику. Саме таку категорію граматики можна прийняти автоматами кінцевого стану. І граматика Чомського не посилається виключно на контекстні вільні граматики.
філосодад

@philosodad - Безкоштовна контекстна граматика більш точна, і я оновив пост, щоб використовувати цей термін. Я не розумію вашого питання з тим, що я сказав про регулярні вирази.
Дан Монего

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

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

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

2

Ну, я міг би дати вам сумну відповідь: теорія автоматів та теорія інформації.

Або я можу вам сказати, що я давно дізнався від консультанта по технічному забезпеченню:

  • "Хороший" досить недостатньо.

1

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


2
Закон Мерфі: Все, що може піти не так, піде не так
Річард

Це не теорія CS, але це відмінна відповідь.
justkt

1

Програмування

З кафедри математики та інформатики Гобарта та Вільяма Сміта коледжі приходять з інформатики 124 Вступ до програмування :

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

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

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

Чи програмування Інформатика, як ми це знаємо?

У відповідь на коментар @Thomas Owens, який зазначив (цілком справедливо), що програмування не є суворо інформатикою, я хотів би процитувати статтю з комп'ютерних наук Вікіпедії :

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

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


Програмування - це не теорія CS. Насправді я міг легко стверджувати, що програмування зовсім не є інформатикою.
Томас Оуенс

@Thomas Owens Я оновив свою відповідь, щоб підтвердити свою заяву, що вона є дійсною. Не могли б ви переглянути його і повідомити мені ваші думки?
Гері Роу

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

@Thomas Owens Я бачу вашу думку, і (надягає пуристську шапку) я згоден. Однак ОП просить отримати один біт CS, який би допоміг йому в реальному світі. Я твердо дотримуюся своєї думки, що теорія програмування (як реалізована в хорошому коді) - це один біт. Я відповідно трохи відредагував.
Гері Роу

Так. З CS, я б сказав, що розуміння мов програмування та парадигм може допомогти (особливо якщо ви реалізуєте DSL, але знання багатьох парадигм, таких як процедурна, функціональна, OO, логіка просто допомагає в розробці програмного забезпечення). Розуміння алгоритмів та структур даних також допомагає вибрати правильний (и) варіант вирішення проблеми найбільш ефективно. Теорія автоматів може допомогти (я працював із системою, яка колись була гігантською FSM, але я не знаю, наскільки це часто). Тож я б сказав, що структури даних, алгоритми та теорія PL - це найкорисніші речі, які потрібно знати з CS.
Томас Оуенс

1

Я маю згоду з Конрадом Рудольфом. Існує "Один біт" інформатики, який ви повинні знати, щоб зробити вас кращим "реальним програмістом світу". Якщо ви більше нічого не відволікаєте від відповідей, які ви отримуєте тут, принаймні врахуйте це. Задоволення вимог НЕ таке, як задоволення клієнта! Кінцеві користувачі завжди будуть намагатися використовувати вашу програму так, як ви ніколи не думали і не кодували. ВЖЕ, ВЖЕ, ВЖЕ.

Тому, щоб бути кращим програмістом, спочатку потрібно СПИСОКУ. Слухайте клієнта. Прислухайтеся до їх потреб. Слухайте їхні бажання. І особливо, прислухайтеся до їх рівня "техні-пертіз". Я не можу вам сказати, скільки разів я бачив побудований проект, який був саме таким, що просили, але зовсім не те, що клієнт насправді потребував. Все тому, що програміст, що збирав запити, насправді не слухав.

Ще щось, що ви можете забрати - це, якщо ви не маєте досвіду в дизайні інтерфейсу, заручте когось, хто розробить дизайн інтерфейсу користувача. Я ВЖЕ МОЖУ побачити додаток, де інтерфейс призначений програмістом, а не експертом. Те, що для вас логічно і має сенс, не матиме сенсу для клієнта. І, якщо ваші клієнти не є смачними, (а хто це?), То ваше "функціонально правильне, але естетично некрасиве" рішення буде зустрінене теплом скунсу на вечері.


3
Ця відповідь не стосується теорії CS, про що запитував Хопкінс.
Джеймс

1

Функціональні мови!

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

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


0

Те, що комп’ютери по суті є відповідними шаблонами, не більше того. Все зводиться до машини Тьюрінга - класичного комп'ютерного наукового поняття, що пояснює схему обробки тексту.


-2

Вирішення проблем та бажання продовжувати навчання!

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


6
Це не теорія інформатики, вони однаково застосовуються до електронної (або майже будь-якої іншої форми) інженерії.
Джон Хопкінс

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

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