Как мне полностью самостоятельно изучать компьютерные науки? [закрыто]

46

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

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

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

Проблема с Википедией в том, что она не говорит вам, что важно, но настаивает на том, чтобы быть полной ссылкой.

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

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

SUBJECTS                                                        DONE

Introduction to Computer Science                                  *
Introduction to Algorithms                                        *
Discrete Mathematics                   
Adv. Discrete Mathematics
Data structures                                                   *
Adv. Algorithms
...

Как вы можете ясно видеть, я мало представляю, из каких конкретно предметов состоит информатика.

Было бы очень полезно, даже если бы кто-то указал на основные курсы из учебного курса MIT (+ основные предметы, которых нет в MIT OCW) в рекомендованном порядке обучения.

Я перечислю Сообщения, через которые я уже прошел (и я не получил то, что искал там)

https://softwareengineering.stackexchange.com/questions/49557/computer-science-curriculum-for-non-cs-major - главный ответ говорит, что не стоит изучать cse

https://softwareengineering.stackexchange.com/questions/110345/how-can-a-self-taught-programmer-learn-more-about-computer-science - указывает на MIT OCW

https://softwareengineering.stackexchange.com/questions/49167/studying-computer-science-what-am-i-getting-myself-into

https://softwareengineering.stackexchange.com/questions/19912/overview-of-computer-science-programming

Optimus
источник
Полностью? Все забавные теоретические вещи тоже?
Да, мне действительно нравятся забавные теоретические вещи, я думаю, что это улучшит мое понимание предмета (хотя это вопрос моей дискуссии). Кроме того, я чувствую себя одиноким, когда мои друзья из CS обсуждают вещи CS или раздражают их, задавая слишком много вопросов.
Оптимус
2
Обратите внимание, что в учебной программе есть несколько видов «островков», где вещи держатся вместе. Например, вам редко нужно лямбда-исчисление в теории графов. Также подумайте, что было бы неплохо иметь наставников рядом - вы живете рядом с подходящим учебным заведением?
На самом деле, я общаюсь с профессионалами, но я не могу их постоянно беспокоить. Они внесли большой вклад во многие фрагментированные знания, которые у меня есть.
Оптимус
3
В этом случае вы можете пройти выбранный курс или два - это позволяет вам постоянно проверять профессионалов.

Ответы:

24

Я видел некоторые материалы курса от MIT, и это было ужасно плохо . У них были учебные материалы, которые требовали VC5, связки неявных глобальных переменных, передавая цвета как «синий» вместо 32-битного ARGB, не говоря уже о 4x [0,1] с плавающей точкой, такого рода вещи. Я бы не стал доверять учебному плану или коду только потому, что он исходит из именитого университета.

Моя степень по CS (из университета, который является лучшим в Великобритании по CS) состояла из:

Первый год:

  1. ООП- супер основы
  2. Компьютерные системы - вещи типа двоичных целочисленных представлений.
  3. Основная теория реляционных баз данных
  4. Математика для CS - простая 2D и 3D геометрия.
  5. Немного HTML / JS - полный материал для начинающих
  6. Столь же маленький кусочек PHP.
  7. Немного функционального программирования

Второй год:

  1. Правовые вопросы в области вычислительной техники, такие как законы, вращающиеся вокруг защиты пользовательских данных
  2. Языки программирования - Хомская иерархия и лексинг накрылись
  3. Операционные системы, сети и Интернет - в основном такие вещи, как виртуальная память и пейджинг, стек IP
  4. 2D компьютерная графика - в основном просто доказательство теорем базовой математики
  5. AI - базовые описания нейронных сетей, байесовских систем убеждений и т. Д.
  6. Анализ требований - краткий обзор UML, функциональных / нефункциональных требований.
  7. Командный проект

Третий год:

  1. Алгоритм анализа - теория сложности, в основном
  2. Реализация языков программирования - методы синтаксического анализа LL / LR, CFG и тому подобное.
  3. Управление проектами программного обеспечения - взгляд на модели Waterfall / Agile
  4. Международный компьютерный Unicode и другие развлечения по локализации
  5. Продвинутый AI - не знаю, честно, и скоро у меня будет экзамен
  6. 3D компьютерная графика - в основном, опять же, просто доказательство теорем для матриц вращения и тому подобное
  7. Системы на основе агентов - в основном об асинхронном взаимодействии агентов, принятии групповых решений и т. Д.
  8. Микропроцессорные приложения - цифровая обработка сигналов
  9. Робототехника - охватывает такие вещи, как компьютерное зрение и принятие решений роботами на высоком уровне

Как вы заметите, в значительной степени все является «основой» чего-либо, и почти ничто не охватывает полезной глубины.

Материал, который на самом деле стоил сделать, необходимо:

  1. ООП- и еще немного, а затем еще немного
  2. Функциональное программирование - тоже еще немного. Попробуйте выбрать язык, такой как C ++ или C #, где вам не нужно заново изучать синтаксис, инструменты и т. Д., Чтобы охватить оба стиля.
  3. Часть OS - виртуальная память, которую нужно знать, так же как режим ядра и режим пользователя. Пропустить сегментацию и стек IP.
  4. Анализ требований - должен быть полезным для любого проекта
  5. Анализ алгоритмов - важно знать, что такое алгоритмическая сложность, как ее уменьшить и какова сложность обычных операций.
  6. Модели управления проектами программного обеспечения - многие магазины делают Agile, а многие старые по-прежнему делают модели в стиле Waterfall.
  7. Международный компьютер - Unicode необходим

Вещи, которые стоило сделать, опционально

  1. Языки программирования - иерархия Хомского, инструменты лексирования и синтаксического анализа. Пропустите теорию, лежащую в основе парсеров LL или LR - парсер LR может принять практически любой реалистичный однозначный CFG, а если нет, документация вашего генератора парсера скажет вам об этом.
  2. 3D Графика. Я не имею в виду «Докажи, что это формула матрицы вращения» пустая трата времени, я имею в виду фактические вещи «Это вершинный шейдер», или GPGPU. Это весело, интересно и по-другому.
  3. Некоторые вещи ИИ - это забавные потенциальные поля и поиск путей.

Вещи, которые важны, но я все равно их не освещал:

  1. Параллельность - обязательное знание, по крайней мере, основы для всех в 2012 году.

Остальные были пустой тратой времени. К сожалению, большинство из этих девяти пунктов я либо уже знал, либо взял полезные части в другом месте. Если вы читаете о таких вещах, как проблема FizzBuzz, быстро становится очевидным, что вам на самом деле не нужно знать все, что нужно для того, чтобы быть на вершине пакета, и это удачно, поскольку мой диплом и многие материалы, которые я видел в Интернете для других степеней действительно многому не учат.

DeadMG
источник
3
@ ThorbjørnRavnAndersen: Теория - это инструмент для написания кода, не более того. Теория ничего не стоит, если вы не можете использовать ее для создания лучшего кода.
DeadMG
3
@ Оптимус: Подавляющее большинство всей теории не может помочь вам сделать лучший код.
DeadMG
3
Теория - это основа, чтобы знать, какой код можно написать, а какой нет.
17
В этом посте есть несколько очень полезных советов, но вы слишком догматичны, если объявляете некоторые поля пустой тратой времени. В наши дни существует значительное разнообразие программных заданий, и то, что пустая трата времени на одну работу, может быть важно для другой работы. Вместо того, чтобы просто отбрасывать что-либо как пустую трата времени, было бы полезно описать виды развития, в которых вы участвовали.
Чарльз Грант
4
За последние несколько лет я провел много собеседований, и в наши дни, похоже, самый большой пробел в колледжах - это обучение структур данных и алгоритмов. Второй по величине пробел заключается в понимании того, как инструменты реализуются внутри компании. На мой взгляд, занятия по использованию того или иного инструмента - пустая трата времени. Нет смысла знать синтаксис C ++, если вы не можете объяснить, когда использовать хеш-таблицу и когда использовать дерево.
Gort Робот
5

Open Course ware - это просто список курсов, которые они сделали доступными. Если вы хотите знать, что бы взял студент, зайдите на веб-сайт MIT (не OCW) и посмотрите реальную программу. У них есть список того, что требуется и что считается предварительным условием для чего. Вот их страница.

stonemetal
источник
Я изучаю это, но я нашел их требования довольно лаконичными. а где длинный список курсов?
Оптимус
1
web.mit.edu/catalog/degre.engin.ch6.html Это большой список. CS упоминается как 6,3
Stonemetal
спасибо, это также будет полезно. Полезно знать, за каким учебным планом следуют большие университеты
Optimus
1
Я делаю EECS в Беркли прямо сейчас. Если программа MIT EECS имеет структуру, аналогичную программе Беркли, тогда у вас не будет большого руководства: у нас короткая вступительная последовательность, а затем она буквально делает все, что вы хотите, в любом порядке, который вы хотите, если вы выполняете минимальное количество продвинутых курсы. Я думаю, что это круто, но, вероятно, это не поможет вам понять, какие курсы выбрать: мне приходилось принимать те же решения самостоятельно. (Я получил помощь от своего преподавателя факультета, но по стечению обстоятельств его совет состоял в том, чтобы взять его семинар для выпускников :))
Тихон Джелвис
@TikhonJelvis Проще выбрать, что вы хотели бы изучать, а что нет, если у вас есть представление о том, что представляет собой область действия и какую область следует хотя бы охватить. Я, будучи дипломированным инженером-строителем, понятия не имею, что происходит в области компьютерных наук и англ. Поле
Оптимус
5

Попробуйте рекомендации программы ACM / IEEE по компьютерным наукам 2001 года, ссылки на которые приведены здесь: http://www.acm.org/education/curricula-recommendations

наряду с обновлениями CS 2008 года.

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

Программа бакалавриата не будет иметь времени, чтобы покрыть даже курсы, которые считаются основными в соответствии с этими рекомендациями, поэтому они объединят некоторые категории и позволят студентам выбирать среди них (например, «Операционные системы», «Языки программирования» и «Разработка программного обеспечения»). Программное обеспечение, и студенты выбирают трек).

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

Руан Кайман
источник
хорошо, немного устарело, но все же многие предметы, оставленные на выбор в обычной учебной программе, считаются основными здесь, было бы неплохо иметь более широкий выбор учебы, если у вас заканчиваются вещи, которые вы поставили в очередь +1.
Оптимус
Для ленивых этот список содержит: Дискретные структуры (DS) Основы программирования (PF) Алгоритмы и сложность (AL) Архитектура и организация (AR) Операционные системы (OS) Net-Centric Computing (NC) Языки программирования (PL) Человек-Компьютер Взаимодействие (HC) Графика и визуальные вычисления (GV) Интеллектуальные системы (IS) Управление информацией (IM) Социальные и профессиональные вопросы (SP) Разработка программного обеспечения (SE) Вычислительная наука и численные методы (CN).
Дэмиен Роше
-4

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

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

И, конечно же, вы познакомитесь с git, который просто лучше.

Kzqai
источник
5
-1: Хотя это ценно, это не подвергает его теоретическим аспектам в информатике, которые он должен знать.
Кен Блум
если бы это было сделано, у нас также есть персональное git-репо. Работа с github делает вас лучшим программистом
Optimus