Подтвердить что ты не робот

Какие концепции компьютерной науки я должен знать?

Какие концепции в области компьютерных наук, по вашему мнению, сделали вас лучшим программистом?

Моя степень была в области машиностроения, поэтому, став программистом, я немного не разбираюсь в основах. Есть несколько стандартных концепций CS, которые я недавно узнал, которые дали мне гораздо более глубокое понимание того, что я делаю, в частности:

Особенности языка

  • Указатели и рекурсия (спасибо Джоэл!)

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

  • Связанные списки
  • Hashtables

Алгоритмы

  • Сортировка пузырьков

Очевидно, список немного короткий на данный момент, поэтому я надеялся на предложения относительно:

  • Какие понятия я должен понимать,
  • Любые хорошие ресурсы для правильного понимания их (так как Wikipedia может быть немного плотным и академическим иногда).
4b9b3361

Ответ 1

Взгляните на это сообщение в блоге от Steve Yegge (ранее Amazon, теперь в Google):

В нем подробно описываются пять наиболее важных понятий, которые разработчики должны знать:

  • Базовое программирование (включая рекурсию, ввод/вывод файлов, форматированный вывод, циклы и т.д.)
  • Объектно-ориентированный дизайн (включая шаблоны проектирования и т.д.). Вы должны иметь возможность создавать разумные проекты OO, а также понимать концепции.
  • Scripting и regexes.
  • Структуры данных - списки, наборы, хеш-таблицы, деревья, графики и т.д. - а также обозначение Big O и алгоритмическая сложность.
  • Биты, байты и двоичные числа - как числа представлены в компьютере и как их манипулировать.

Ответ 2

Вы определенно должны понимать Big-O нотацию и оценки Big-O алгоритмов - что это такое, как оно используется, почему это важно, как вы сравниваете два алгоритма с учетом их оценок Big-O, как вы строите оценки Big-O для простых алгоритмов.

Ответ 3

Мне немного смешно, что вы ищете предметы по информатике, но википедия слишком академична: D

Во всяком случае, здесь идет, в произвольном порядке:

Ответ 4

Некоторые концепции, которые помогли моему развитию (интеллект и код):

  • Лексинг, анализ, соответствие строк, регулярное выражение
  • Memoization
    • инкапсуляция/обзорное/закрытия
    • кэширование
  • Рекурсия
  • итераторы/Генераторы
  • Функциональное программирование - удивительная статья заставила меня "почему"

Это целые области дискретной математики, но для CS требуется серьезное введение:

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

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

Ответ 5

Я бы сказал, что в настоящее время понимание Object Orientated Programming является обязательным, даже если вам не нужно использовать его изо дня в день.

Из этого я бы также сказал, что понимание наиболее распространенных шаблонов также может помочь.

Ответ 6

Я вижу несколько хороших концепций CS, но мало говорят о математике.

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

В то время как мы находимся на предмет математики, линейная алгебра, как правило, является предварительным условием для продвинутых классов компьютерной графики.

Ответ 7

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

Ответ 8

Матрица компетенций программиста подробно рассказала об этом, но я выделю пару:

  • Структуры данных
    • Усовершенствованные структуры данных, такие как B-деревья, биномиальные кучи и кучи Фибоначчи, AVL/деревья Red Black, деревья Splay, списки пропусков, попытки и т.д.
  • Алгоритмы
    • Tree, Graph, простые жадные алгоритмы и алгоритмы "разделяй и властвуй", способны понять актуальность уровней этой матрицы.
  • Системное программирование
    • Понимает весь программный стек, аппаратное обеспечение (процессор + память + кэш + прерывания + микрокод), двоичный код, сборка, статическое и динамическое связывание, компиляция, интерпретация, JIT-компиляция, сборка мусора, куча, стек, адресация памяти…
  • Контроль версий исходного кода
    • Знание распределенных систем VCS. Пробовал Бзр/Меркурий/Даркс/Гит
  • Автоматизация сборки
    • Может настроить скрипт для сборки системы, а также документацию, установщики, генерировать заметки о выпуске и пометить код в системе контроля версий
  • Автоматизированное тестирование
    • Понимает и умеет настраивать автоматические функциональные, нагрузочные/эксплуатационные и пользовательские тесты
  • Проблема Разложение
    • Использование соответствующих структур данных и алгоритмов и разработка общего/объектно-ориентированного кода, который инкапсулирует аспекты проблемы, которые могут быть изменены.
  • Разложение систем
    • Способен визуализировать и проектировать сложные системы с несколькими производственными линиями и интеграцией с внешними системами. Также должен уметь проектировать системы поддержки операций, такие как мониторинг, отчетность, отработки отказа и т.д.

Ответ 9

Правило 1: Программное обеспечение - это сбор знаний. Программное обеспечение что-то означает. Если вы неясны в смысле, потратьте больше времени на общение с пользователями, чтобы понять, что они делают.

Алгоритмы и структуры данных - это две стороны одной и той же монеты. Алгоритм зависит от структуры данных, структура данных зависит от алгоритма.

Отменить сортировку пузырьков как можно быстрее. Шутки в сторону. Все современные языки (Java, Python и т.д.) Имеют классы коллекции, которые реализуют лучшую сортировку, чем сортировку пузырьков. Нет абсолютно никаких обстоятельств, при которых вы должны когда-либо использовать сортировку пузырьков для чего-либо. Вы должны искать класс коллекции, который включает метод сортировки. Лучше, вам следует искать алгоритм, который полностью избегает сортировки.

Вы должны изучить несколько языков.

  • Язык программирования (Java, Python и т.д.)

  • Язык оболочки.

  • Язык базы данных (SQL)

  • Языки презентаций (HTML и CSS)

  • Другие языки представления данных (XML, JSON)

Вы должны изучить несколько структур данных.

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

  • Иерархический (например, документы XML и HTML, а также базовая файловая система)

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

  • Карты (или индексы или ассоциативные массивы), включая карты хэша и карты деревьев

  • Множества

Плюс некоторый алгоритмический анализ сложности. Иногда называется "Big O". Почему плохой тип пузыря - это O (n ^ 2), где quicksort O (n log n).

Ответ 10

Для меня я получил много от следующего курса в университете

  • Управление проектами
  • Взаимодействие с персональным компьютером (помогает нам, выродкам, создавать более удобные для пользователя экраны).
  • Дизайн базы данных (включая работу с базами данных, журналы транзакций, блокировку и т.д.)
  • Хранилище данных
  • Графика (OpenGL)
  • Расширенные алгоритмы
  • Структуры данных

Вещи, которые я хотел бы сделать в университете

  • Конструкция компилятора
  • Шаблоны проектирования
  • Теория автоматов

Ответ 11

ЛОГИКА. Я просто преувеличиваю важность логики в программировании. Вы сказали, что сделали механическую инженерию, поэтому вы должны знать, насколько математика может облегчить вашу жизнь.

Пропозициональная логика, Логика первого порядка, Логика второго порядка: это очень мощные инструменты. Вероятно, самые (и только) важные вещи, которые я изучил в университете. Логика похожа на тяжелую артиллерию программиста - множество очень сложных проблем (а также менее сложных) становятся намного проще, если вы включили их в организованную, логичную форму. Это похоже на то, что линейная алгебра для инженеров-механиков.

Ответ 12

Я думаю, что хорошее понимание того, как работает компилятор, хорошо знать. У Ахо есть классическая книга о концепциях, используемых при создании компилятора. Название - это Составители: Принципы, Методы и Инструменты. Его прозвище - Книга Дракона. Чтобы действительно понять эту книгу, вы должны понимать формальные языки. У Хопкрофта есть хорошая книга об этом - Введение в теорию автоматов, языки и вычисления.

Ответ 13

Некоторые из концепций ОС

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

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

Базовые знания компьютерных сетей

[хорошая книга Таненбаума

ООП концепции

Конечный автомет

Язык программирования (сначала я выучил C, затем C++)

Алгоритмы (сложность времени\пространства, сортировка, поиск, деревья, связанный список, стек, очередь)

[хорошая книга Введение в алгоритмы ]

Ответ 14

Инкапсуляция

В информатике инкапсуляция - это скрытие внутренних механизмов и структур данных программного компонента за определенным интерфейсом, таким образом, чтобы пользователи компонент (другие части программного обеспечения) должен знать только, что делает компонент, и не может зависеть от деталей того, как он это делает

Ответ 15

Здесь уже упоминались хорошие ответы, но я хотел добавить подмножество того, что важно, но пока не охвачено.

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

  • Общие понятия OO и современные возможности языка программирования (классы, скрытие данных и т.д.).
  • Показатели эффективности алгоритма (нотация Big O). При разработке алгоритма, выполняя анализ Big O, чтобы определить стоимость алгоритма и рассмотрим более эффективные альтернативы в узких местах.
  • Связанные списки и другие сложные структуры данных.
  • Быстрая сортировка и различные концепции сортировки.
  • Деревья и быстрое манипулирование деревьями.

Если ваш язык/платформа не поддерживает сбор мусора, распределение памяти и очистка являются критическими и будут добавлены в список.

Ответ 16

Я выдвигаю дискретную математику. Информатика - это абстракция. научиться думать, как математик, очень полезно.

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

Чем больше программных парадигм вы знаете, тем легче собирать новые языки, когда приходит горячий новый язык!

Ответ 17

Ну, червь теперь открыта!:)
Я начал заниматься электротехникой.

Реляционная структура базы данных: Отслеживание данных подобно Арнольду в "Kindergarden Cop".
Это может быть полный хаос. Его нужно контролировать.
Как сохранить ваши данные в наименьших местах с наименьшим количеством дублирования информации. Как сохранить ваши данные светлыми и легкодоступными. Как контролировать рост и целостность данных.

Дизайн пользовательского интерфейса (UI). Вот как пользователь должен получить доступ к данным, которые мы отслеживаем.
Большинство пользовательских интерфейсов разрабатываются разработчиками. Таким образом, большинство пользовательских интерфейсов, к сожалению, параллельны дизайну базы данных. Пользователям вообще не нужен дизайн данных. Они просто хотят, чего хотят. Они хотят получить это легко. Обычно это требует значительного ветки от дизайна данных и пользовательского интерфейса. Научитесь отделять "инженерное" от вас от "южного гостеприимства".

Объектно-ориентированное программирование: Многие языки сводятся к этому формату.

Параллельная обработка - многопоточность:. Многие процессоры быстро работают!
Параллельные компьютеры существуют уже несколько десятилетий. Они уже давно работают на наших настольных компьютерах. В случае "облачных вычислений" массивная параллельная обработка является не только мандатной, но и предпочтительной. Это невероятно мощно! Существует много возможностей для работы с параллельными разработчиками.

Общие сведения о бизнес-правилах:. Это поможет вам сделать много вашей логики, основанной на таблицах.
Многие условия IFblock могут находиться в таблицах бизнес-правил. Чтобы изменить логику, просто измените информацию в таблице. Маленькая/Нет перекодировки. Маленькая/Нет перекомпиляции.

Наблюдение за событиями... Методы выполняют работу:. Храните вещи в своем коде. Это облегчает для других возможность делать обновления в будущем. Он также несколько параллелен структуре Model/View/Controller (MVC).

PJ

Ответ 19

Попытайтесь понять все уровни программирования. От самого низкого уровня (сборки) до самого высокого уровня.

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

Ответ 20

Это, несомненно, хорошее понимание объектно-ориентированного программирования, хорошие руководящие принципы, такие как принципы SOLID, и следование установленным шаблонам и практикам.

Если вы посмотрите на SOA или DDD, все они в конечном итоге прибегают к какой-либо форме концепций ООП.

Я бы порекомендовал вам приобрести несколько хороших книг по ООП, а также выбрать богатый язык, такой как С# или Java, для начала.

ООП от Грэди Буча

(PHP, ребята, пожалуйста, не голосуйте против меня, я просто приведу несколько примеров для него, вы можете предоставить свои собственные ответы и предложения здесь)

Ответ 21

алгоритмы.

Обучение использованию языка программирования в спускаемом пути - это то, чему вы можете научиться, когда идете, но практически невозможно изобретать все широко используемые Алгоритмы самостоятельно. На самом деле, по крайней мере, нужно знать, что может и может " t с некоторыми проблемами.

Например, просто невозможно написать некоторые программы с сортировкой пузырьков и ожидать, что это будет считаться хорошим, независимо от того, насколько хорош код.

Подводя итог - взгляните на Введение в алгоритмы

Не нужно осваивать его, просто знайте, что происходит...

Ответ 22

Как недавний выпускник степени информатики, я бы порекомендовал следующее:

  • Как уже упоминалось в различных сообщениях Big O обозначений

    ОО Дизайн

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

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

    НП Проблемы

Ответ 23

Структура и интерпретация компьютерных программ. Если вы понимаете эту книгу, все остальное можно легко построить на этом фундаменте. Если у вас проблемы с концепциями в книге, вы можете быть разработчиком программного обеспечения, но не ученым-программистом.

Ответ 24

Я не собираюсь рассказывать вам какие-либо конкретные концепции для изучения, но вместо этого рекомендую вам делать много легкого чтения по широкому кругу тем. Не беспокойтесь о том, чтобы получить глубокое понимание каждого предмета, о котором вы читаете, - на данный момент важно, чтобы вы могли распознать, на какую проблему вы смотрите, чтобы вы могли сделать что- когда вы на самом деле сталкиваетесь с этим. Другими словами, это нормально, если вы не знаете, как решить проблему комбинаторики, если вы знаете достаточно, чтобы найти "комбинаторика", когда вам нужно посмотреть, как много способов организовать набор объектов или выбрать подмножество.

Википедия - довольно хороший ресурс для такого рода широкомасштабного просмотра, особенно если вы просто скомбинируете для начала. Еще лучше, особенно если вы считаете, что Википедия слишком академична или недоступна, является C2 wiki. (Это интересно, оригинальная вики, изобретенная Уордом Каннингемом).

Ответ 25

Мне кажется, что важно понять основную теорию многопоточности, без этого может быть трудно даже увидеть, что может быть проблема, пока вы не будете отлаживаться на реальном сервере в 4 часа дня в воскресенье утром.

Семафоры, критические разделы и события.

Ответ 26

Нет, не сортировать пузырь, quicksort. Это средние значения типа О-пузырьков с большими значениями O (n ^ 2), quicksort - O (n * log (n)).

Ответ 27

Я бы сказал, что это самый важный материал

  • Объектно-ориентированное программирование
  • Концепции операционной системы
    • Процесс и поток
    • Алгоритмы планирования
  • Структура данных
    • Тип хранения и сбора данных, типы (связанный список, хэш, массив и т.д.).
    • Алгоритмы сортировки
    • Сложность алгоритмов

Затем перейдите к конкретному языку. Надеюсь, это полезно!

Ответ 28

Я бы начал с цитаты:

", если единственным инструментом, который у вас есть, является молот, ты относишься ко всему, как к гвоздь" (Абрахам Маслоу)

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

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

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

Итак, основная вещь постоянное обучение, навсегда:)

Ответ 29

Я думаю, что 3D-графика - это то, чему все должны учиться. Или, по крайней мере, как правильно использовать однородные векторы и матричные преобразования.

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

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

Ответ 30

Поскольку машины с несколькими ядрами (как CPU, так и GPU) становятся стандартом, я бы сказал, что включает Distributed Algorithms (из нескольких потоков на несколько машин). Крайне важно понимать многопоточную и распределенную обработку. Извините, что ссылка действительно не дает много помощи.