Які поняття інформатики я повинен знати? [зачинено]


94

Як ви вважаєте, які поняття з інформатики зробили вас кращим програмістом?

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

Мовні особливості

  • Покажчики та рекурсія (спасибі Джоеле!)

Структури даних

  • Пов'язані списки
  • Hashtables

Алгоритми

  • Сорти бульбашок

Очевидно, що список на даний момент трохи короткий, тому я сподівався на пропозиції щодо:

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

5
Сорти з бульбашками? Тримайся якомога далі від них! Швидше дізнайтеся, як працює швидкий сорт.
Карра

18
Так, вивчайте бульбашки. Дізнайтеся, чому це жахливо. Вивчайте швидкі сорти, злиття та все інше, включаючи їхні слабкі сторони. Але не пишіть їх у виробничому коді: викликайте функції сортування, надані на будь-якій платформі, на якій ви перебуваєте.
Брайан Енсінк,

@Roger Pate - +1 для вас, ви повинні знати, для чого корисний алгоритм або структура даних і для чого це відмовно. І Quicksort, і Bubblesort мають однакові результати найгіршого випадку [O (n ^ 2)], але для дуже різних типів вводу, а Bubblesort має найкращі результати O (n), де QS все ще O (n log n). Звичайно, якщо ви розглядаєте Bubblesort, ви можете замість цього скористатися сортуванням Insertion.
Андре Артус,

Відповіді:


60

Погляньте на цю публікацію в блозі Стіва Йегге (колишня компанія Amazon, а зараз у Google):

Він докладно описує п’ять найважливіших концепцій, які розробники повинні знати:

  1. Базове програмування (включаючи рекурсію, введення / виведення файлів, відформатований вихід, цикли тощо)
  2. Об'єктно-орієнтований дизайн (включаючи шаблони дизайну тощо). Ви повинні мати можливість створювати розумні конструкції ОО, а також розуміти концепції.
  3. Сценарії та регулярні вирази.
  4. Структури даних - списки, набори, хештеги, дерева, графіки тощо - а також позначення Big O та алгоритмічна складність.
  5. Біти, байти та двійкові числа - як числа представлені в комп'ютері та як ними маніпулювати.

Гарне посилання. Трохи зосереджений на стороні unix (повністю відсутній .NET), але все одно приємний.
Toon Krijthe

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

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

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

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

35

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


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

3
Ви повинні мати досить низьку думку про передову математику. Я зрозумів це на першому курсі коледжу, коли пройшов лише обчислення.
GoatRider

1
Не забувайте про концепцію NP, і коли проблема міститься в ній, розробник, який намагається кодувати TSP (мандрівного продавця) у кожну транзакцію бази даних для цілей пошуку або якоїсь іншої такої ідіотичності, є основною проблемою =]
Ед James

2
Ви також повинні знати, що велике O не говорить вам, який алгоритм займає менше часу. Щось, що більшість міських спеціалістів не розуміють
Мартін Беккет

3
Це якось так. Він повідомляє вам, який з них має найкращий гірший випадок, не обов’язково, який з них є „швидшим”, оскільки це залежить від набору вхідних даних.
Ед Джеймс,

30

Мені трохи смішно, що ви шукаєте предмети інформатики , але вікіпедія вважається занадто академічною: D

У будь-якому випадку, тут йдеться, не в особливому порядку:


2
+1, тому що ви згадали бази даних, які часто не враховуються в цих типах списків, але дуже важлива концепція для будь-якого добре округленого випускника CS.
Брайан Енсінк,

14

Деякі концепції, які допомогли моєму розвитку (інтелект і код):

  • Лексинг, синтаксичний аналіз, відповідність рядкам, регулярні вирази
  • Мемоізація
    • інкапсуляція / обсяг / закриття
    • кешування
  • Рекурсія
  • Ітератори / генератори
  • Функціональне програмування - у дивовижній статті Джона Хьюза мені було сказано "чому"

Це цілі сфери дискретної математики, але для CS потрібне серйозне введення:

  • Матриця / Лінійна алгебра
  • Теорія графіка

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


10

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

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


10

Я бачу декілька хороших концепцій КС, але мало розмов про математику.

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

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


1
Якби мені довелося вибрати лише одну, це була б дискретна математика. Це в значній мірі CS 101. Мені важко думати про область чи парадигму в загальному програмуванні, яка якось не зачіпається DM.
Андре Артус,

6

Матриця компетентностей програміста детально висвітлила це, але я виділю пару:

  • Структури даних
    • Розширені структури даних, такі як B-дерева, біноміальні та купи Фібоначчі, дерева AVL / Red Black, Splay Trees, Skip Lists, спроби тощо.
  • Алгоритми
    • Дерево, графік, прості жадібні алгоритми поділу та завоювання здатні зрозуміти відповідність рівнів цієї матриці.
  • Системне програмування
    • Розуміє весь стек програмування, апаратне забезпечення (процесор + пам'ять + кеш + переривання + мікрокод), двійковий код, збірку, статичне та динамічне зв'язування, компіляцію, інтерпретацію, компіляцію JIT, збір сміття, купу, стек, адресацію пам'яті ...
  • Контроль версій вихідного коду
    • Знання розподілених систем VCS. Спробував Bzr / Mercurial / Darcs / Git
  • Автоматизація побудови
    • Може налаштувати сценарій для побудови системи, а також документацію, інсталятори, генерувати примітки до випуску та позначати код у контролі джерела
  • Автоматизоване тестування
    • Розуміє та вміє налаштовувати автоматизовані тести функціональності, навантаження / продуктивності та інтерфейсу користувача
  • Розкладання проблеми
    • Використовуючи відповідні структури даних та алгоритми, ми отримуємо загальний / об’єктно-орієнтований код, який інкапсулює аспекти проблеми, які можуть бути змінені.
  • Розкладання систем
    • Здатний візуалізувати та проектувати складні системи з різноманітними лінійками продуктів та інтеграцією із зовнішніми системами. Також слід мати можливість розробляти такі системи підтримки операцій, як моніторинг, звітування, збої тощо.

5

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


4

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

Алгоритми та структури даних - це дві сторони однієї медалі. Алгоритм залежить від структури даних, структура даних - від алгоритму.

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

Ви повинні вивчити кілька мов.

  • Мова програмування (Java, Python тощо)

  • Мова оболонки.

  • Мова бази даних (SQL)

  • Мови презентації (HTML та CSS)

  • Інші мови представлення даних (XML, JSON)

Ви повинні вивчити кілька структур даних.

  • Послідовності (списки, кортежі, файли)

  • Ієрархічна (як XML та HTML-документи, а також основна файлова система)

  • Реляційні (наприклад, бази даних та файлова система з введеними жорсткими та м’якими посиланнями)

  • Карти (або індекси або асоціативні масиви), включаючи Хеш-карти та Карти дерев

  • Набори

Плюс певний алгоритмічний аналіз складності. Іноді називають "Великим О". Чому сортування міхурів є поганим, це те, що це O ( n ^ 2), де швидким сортуванням є O ( n log n ).


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

Існує незліченна кількість алгоритмів. Більшість з них погані. Деякі з них хороші. Bubble Sort - це просто погано. Купуйте БУДЬ-яку книгу про алгоритми і рухайтесь далі.
S.Lott

Просто збір гніди, але Quicksort - найгірший випадок O (n ^ 2). Я лише на це вказую, бо вважаю, що розуміння, чому це правда, є цінною навчальною вправою під час вивчення фундаментальних алгоритмів.
Брайан Енсінк,

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

4

Ну консервна банка з глистами зараз відкрита! :)
Я починав з електротехніки.

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

Дизайн інтерфейсу користувача (UI): Ось як Користувач повинен отримати доступ до даних, які ми відстежуємо.
Більшість інтерфейсів розробляються розробниками. Таким чином, більшість інтерфейсів, на жаль, паралельно проектують базу даних. Користувачів взагалі не хвилює дизайн даних. Вони просто хочуть, чого хочуть. Вони хочуть отримати це легко. Зазвичай це вимагає великого відділення від проектування даних та інтерфейсу користувача. Навчіться відокремлювати "інженерних" вас від "південно-гостинних" вас.

Об'єктно-орієнтоване програмування: багато мов зводиться до цього формату.

Паралельна обробка - багатопотоковість: багато процесорів пришвидшують роботу!
Паралельні комп’ютери існують десятки років. Вони вже деякий час на наших робочих столах. У випадку "хмарних обчислень", масивна паралельна обробка є не тільки обов'язковою, але й переважною. Це неймовірно потужно! Для паралельних розробників існує багато робочого потенціалу.

Розуміння правил ведення бізнесу: Це допомагає вам скласти багато своєї логіки на основі таблиці.
Багато умов IFblock можуть міститися в таблицях бізнес-правил. Щоб змінити логіку, просто змініть інформацію в таблиці. Мало / Без перекодування. Мало / Без перекомпіляції.

Події контролюють ... Методи виконують роботу:
тримайте речі окремо у своєму коді. Це полегшує іншим оновлення в майбутньому. Це також паралельно з рамкою Model / View / Controller (MVC).

PJ


3

Для мене я багато чого отримав із наступного курсу університету

  • Управління проектами
  • Людська комп’ютерна взаємодія (Допомагає нам, виродкам, зробити більш зручними для користувача екрани)
  • Дизайн бази даних (включаючи те, як працюють бази даних, журнали транзакцій, блокування тощо)
  • Зберігання даних
  • Графіка (OpenGL)
  • Розширені алгоритми
  • Структури даних

Те, що я хотів би робити в університеті

  • Компілятор Будівництво
  • Шаблони дизайну
  • Теорія автоматів

3

ЛОГІКА - Я просто завищую значення логіки в програмуванні. Ви сказали, що займаєтесь машинобудуванням, тож ви повинні знати, наскільки математика може полегшити вам життя.

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


3

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


2

2

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

Після 15 років професійної розробки програмного забезпечення після закінчення університету я переконався, що регулярно використовую деякі з наведених нижче понять у школі:

  • Загальні поняття ОО та сучасні особливості мови програмування (класи, приховування даних тощо).
  • Показники ефективності алгоритму (позначення Big O). При розробці алгоритму, проведенні аналізу Big O для визначення вартості алгоритму та перегляді більш ефективних альтернатив у вузьких місцях.
  • Зв’язані списки та інші складні структури даних.
  • Швидке сортування та різні концепції сортування.
  • Дерева та швидка маніпуляція з деревами.

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


2

Я прихильник дискретної математики. Інформатика - це абстракція. навчитися мислити як математик дуже корисно.

Я також хотів додати до того, що сказав С.Лотт про мови. Важливим є також вивчення багатьох типів мов. Не просто компілюється проти сценаріїв. Але функціональний (ML, Lisp, Haskell) логічний (Prolog) об'єктно-орієнтований (C ++, Java, Smalltalk) імператив (C, Pascal, FORTRAN навіть).

Чим більше парадигм програмування ви знаєте, тим легше підбирати нові мови, коли з’являється гаряча нова мова!


2

Деякі концепції ОС

 ( memory, IO, Scheduling, process\Threads, multithreading )

[хороша книга " Сучасні операційні системи , 2-е видання, Ендрю С. Таненбаум"]

Базові знання комп’ютерних мереж

[гарна книга Таненбаума

Концепції OOPS

Кінцева автомета

Мова програмування (я спочатку вивчив C, а потім C ++)

Алгоритми (складність часу / простору, сортування, пошук, дерева, зв’язаний список, стек, черга)

[хороша книга Вступ до алгоритмів ]


авто мета? - безумовно, "автомати" згідно з першим редагуванням.
Том Даккінг

На жаль! заглиблений у перевірку орфографії, я здогадуюсь. Я це виправлю. Дякую.
aJ.


1

Спробуйте зрозуміти всі рівні програмування. Від найнижчого рівня (складання) до найвищого рівня.

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


1

Алгоритми.

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

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

Підводячи підсумок - погляньте на Вступ до алгоритмів

Не потрібно його опановувати, просто знайте, що відбувається ...


1

Як нещодавній випускник ступеня інформатики, я рекомендую наступне:

  • Як згадувалося в різних повідомленнях, позначення Big O

    ОО Дизайн

    Структури даних та алгоритми (не пам’ятаю точну назву книги, яку я використовував, буде оновлено, якщо пам’ятаю)

    Операційні системи http://www.amazon.com/Modern-Operating-Systems-2nd-GOAL/dp/0130313580

    Проблеми НП


1

Очевидно, це добре розуміння об’єктно-орієнтованого програмування, хороші керівні принципи, такі як SOLID Principles і слідування усталеним зразкам та практиці.

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

Я б порадив вам взяти кілька хороших книг з ООП, а також для початку вибрати таку багату мову, як C # або Java

ООП від Грейді Буча

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



1

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

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


0

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

Семафори, критичні розділи та події.


0

Ні, не сортування за бульбашками, швидке сортування. Це велике O-сортування міхура, середнє значення O (n ^ 2), швидкий сорт O (n * log (n)).


0

Я б сказав, що нижче - найважливіші речі

  • Об'єктно-орієнтоване програмування
  • Концепції операційної системи
    • Процес і нитка
    • Алгоритми планування
  • Структура даних
    • Тип зберігання та збору даних, типи (пов'язаний список, хеш, масив тощо)
    • Сортування алгоритмів
    • Складність алгоритмів

Потім перейдіть до певних мовних матеріалів. Сподіваюся, це корисно !!


0

Я б почав із цитати:

"якщо єдиний у вас інструмент - це молоток, ви ставитеся до всього, як до цвяха". (Абрахам Маслоу)

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

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

Ця порада поєднується із сучасними тенденціями до багатомовних проектів (візьмемо, наприклад, веб-програми, які можуть включати декілька мов в одному додатку, такі як C #, JS, CSS, XPath, SQL, XML, HMTL, RegExp .... і навіть різні парадигми програмування (наприклад, C # нещодавно представив деякі поняття з функціональних парадигм програмування, лямбда).

Отже, основне - це постійне навчання, назавжди :)


0

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

Це може бути корисно не тільки для створення 3D-додатків, але і в механічних полях, таких як зворотна кінематика на роботах, обчислення моментів та багато іншого.

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


0

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

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