С чего начать учить computer science
Почему каждому разработчику сначала стоит изучить теории Computer Science
Любой может научиться кодить. Теории computer science научат вас, как программировать.
Разработчики обычно начинают изучать программирование в колледже, университете или на практике для стажёров. Некоторые программисты-самоучки учат программирование, экспериментируя с технологиями и просматривая туториалы в Интернете. Кто-то объединяет все эти этапы.
Разработчики обычно изучают теории computer science в своих университетах. Основы computer science состоят из таких тем, как структуры данных, алгоритмы, принципы работы сетей, дискретная математика, искусственный интеллект, компьютерная графика, шаблоны проектирования и человеко-машинное взаимодействие. Как говорилось выше, не каждый разработчик проходит через университет, и такие люди сразу переходят к программированию, не затрагивая основ computer science. Иногда такие разработчики изучают основы computer science на своей первой работе.
Я начал программировать на Visual Basic 6.0, когда мне было 13 лет. Мой колледж начал преподавать мне программирование, когда мне было 15 лет. Я создал сотни свободных программ, когда учился в колледже перед университетом. В то время я не освоил теории computer science — я просто знал, как кодить. Университет научил меня теориям computer science. Эти теории сильно помогли мне в карьере разработчика ПО и в работе с open source. По моему опыту, изучение основ computer science до программирования обладает следующими преимуществами:
Теории мотивируют писать высокооптимизированный код
Каким бы мощным ни было современное оборудование, производительность всё равно является критически важным фактором разработки ПО. В прошлом из-за ограничений компьютерного «железа» почти все разработчики вынуждены были писать сверхоптимизированный код. Не стоит забывать, что эти люди отправили на Луну корабль с компьютером, имевшим всего 4 килобайта памяти. Сегодня ситуация совершенно иная. Теперь нам нам нужно 16 гигабайт физической памяти только для того, чтобы запустить современный редактор кода.
Однако если мы работаем близко к уровню оборудования или наш продукт используется миллионами конечных пользователей, то нам всё равно необходимо писать высокооптимизированный код. Если нам нужно писать оптимизированный код, то придётся использовать подходящие структуры данных, быстрые алгоритмы и оптимизированные модели памяти. Эти знания можно взять из таких теорий computer science, как структуры данных, анализ алгоритмов и архитектура процессоров.
Теории объясняют разницу между работой кодера и программиста
По мнению большинства, слово «кодинг» имеет то же значение, что и слово «программирование». Однако нужно объяснить неочевидный факт. Кодинг — это не программирование, а кодеры и программисты — не одно и то же. Кодер может писать код на языке высокого уровня для компилятора или интерпретатора. Чтобы писать код, вам не нужно знать, как работает компьютер или его отдельные части. С другой стороны, программист тоже пишет код, но понимает и внутреннее устройство компьютера. Программист может создавать полнофункциональные программные продукты при помощи минимизации ошибок. Другими словами, кодинг — это подмножество сферы программирования.
Кодером может стать каждый, достаточно научиться синтаксису выбранного языка программирования. Но чтобы стать программистом, необходимо изучить теории computer science.
Теории помогут найти вам свою нишу
В отрасли разработки ПО можно пойти по одному из двух путей: или стать мастером на все руки, или профессионалом в выбранной области. На самом деле, разработчики могут стать профессионалами и в нескольких тесно связанных дисциплинах. Например, мои любимые области — это облачные вычисления и архитектура ПО. Сегодня большинство джуниор-разработчиков из-за современных тенденций начинают свою карьеру в сфере фронтенда. Спустя несколько лет работы от подобных разработчиков часто слышны заявления, что им не нравится то, чем они занимаются.
Все современные карьерные пути основаны на подразделах computer science, таких, как разработка ПО, проектирование сетей, облачные вычисления, мобильные вычисления, проектирование встроенных систем, проектирование баз данных и т.д. Если изучить основы всех этих подразделов, то выбор любимой сферы окажется простейшей задачей.
Теории могут улучшить ваши навыки решения задач
Разработка ПО не всегда является прямолинейным процессом. Разработчики часто сталкиваются с проблемами, требующими надёжного и эффективного решения. Триумф решения в сфере разработки ПО зависит от навыков и опыта команды. Например, команда может реализовать быстрое, но неэффективное решение. В то же время, другая команда может найти эффективное решение той же задачи. Теории computer science помогают разработчикам придумывать эффективные и умные решения. Например, в проекте open source Git проблемой было эффективное хранение объектов коммитов. Первые разработчики Git решили её при помощи хеширования и древовидной структуры данных.
На самом деле, любой разработчик способен решать задачи с собеседований в крупных технологических компаниях. Но реализовывать эффективное и оптимальное решение можно только с помощью теорий computer science.
Отличным способом проверки своих навыков решения задач являются онлайн-соревнования по программированию. Крупные технологические компании используют на собеседованиях похожие задания, чтобы найти тех, кто лучше умеет решать задачи. Они не просят кандидатов писать код по готовой спецификации ПО. Вместо этого они тестируют знания теории computer science.
Заключение
Чтобы начать работать в сфере разработки ПО, необязательно знать теории computer science, однако они дают вам некоторые привилегии. То же самое относится и к языкам программирования. Разумеется, разработчики могут начинать программировать с любого современного языка программирования. Проще всего начинать с Python и JavaScript. Но если вы начнёте с языка C, то это даст вам больше преимуществ.
Иногда начинать разработку ПО с теорий computer science не так просто, как начинать с кодинга. Однако без теорий computer science вы станете кодером, но не программистом. Тем не менее, вы можете выбирать сами, стать ли кодером или программистом. Программирование — это решение задач разработки при помощи кодинга и с пониманием внутреннего устройства систем. Следовательно, если начать с теории, то можно стать более качественным программистом.
На правах рекламы
Если для работы необходим VDS с мгновенной активацией на Linux или Windows, то вам однозначно к нам — сервер готов к работе через минуту после оплаты!
Сделай сам: MSc Computer Science на уровне топ американских университетов из дома
Вступление
Давно хотел написать статью про образование в Computer Science, но руки не доходили. Решил все-таки это наконец сделать. Итак, о чем пойдет речь? Речь о том, что из себя представляет диплом MSc Computer Science топовых университетов США (во всех подробностях, включая основные курсы, книги и проекты) и как ему соответствовать.
Почему именно MSc? Это — некая развилка: с одной стороны после MSc — вы уже готовый к жизни инженер (да, речь идет о инженерной подготовке, как мне кажется это самое больное место в нашей системе образования), с другой — можно спокойно идти по пути PhD. Как известно, в PhD программу можно попасть и не особо умея программировать — особенно это касается теоретического Computer Science. С другой стороны найти работу программиста тоже дело не очень сложное, и часто не требует мощного образования. Но достигнув уровня MSc — вы получаете возможность разбираться как во всех новый идеях в Computer Science, так и возможность их воплотить в практику. То есть с одной стороны круто разобраться в каком-нибудь deep learning и сделать в нем что-то новое, а также взять и написать свою операционную систему (кто так сделал?). Причем вы не зажаты в рамки узкой специализации (если конечно продолжаете учиться). То есть вы теперь — универсальный солдат, готовый на все.
Надеюсь что эта статья будет полезна:
1. Студентам, которые хотят соответствовать высоким стандартам топ вузов США, или собирающиеся туда в аспирантуру по Computer Science
2. Профессионалам, которые хотят закрыть «дыры» и пробелы
3. Может кто-то из преподавателей возьмет на заметку для своих курсов.
4. Студентам, аспирантам американских вузов — хотелось бы тоже получить фидбэк, особенно касается последних трендов в образовании
Что же здесь будет написано? Минимум философии и общих мыслей: конкретная программа undergraduate и graduate курсов, конечно из дисциплин наиболее мне близких. Все курсы были лично прочувствованы на собственной шкуре, по этому и пишу. (Я пытался записаться на все интересные курсы, которые были, но мой основной упор — системное программирование, базы данных и искусственный интеллект. Отсюда конечно некий bias, но пытаюсь предложить более-менее универсальную программу).
Содержание
1. Базовая подготовка
2. Undergraduate программа
3. Graduate программа
4. Готовы себя проверить? Computer Science Comps.
Базовая подготовка
Первым делом надо пройтись по математике. Общепринятая теория в российской академической среде — что у нас математика очень очень классная, и мы впереди планеты всей. Но грань между теоретическим Computer Science и математикой тонка, и далее, все, что входит в Computer Science мы математикой называть не будем. Ну а в Computer Science наши успехи последних лет увы…
В двух словах суть такая — хоть математики много не бывает, перегибать палку не стоит. Нам надо получить гибридное образование — смесь ученого и инженера, и сделать это в конечное время. Поэтому математику надо минимизировать. Ибо очень много всего интересного есть в Computer Science.
— Анализ — вполне сойдет уверенное владение основами, то есть многомерный анализ надо понимать, но глубоко вникать со всеми доказательствами не обязательно
— Линейная алгебра — надо хорошо разбираться, очень нужная штука всюду. Причем желательно на довольно продвинутом уровне (собственные вектора, сингулярное разложение, сопряженные градиенты)
— Дифуры — можно спокойно пренебречь, очень редко где они вам понадобятся
— Оптимизация — очень полезно, особенно в машинном обучении это — просто железное требование
— Алгебры, топологии, прочее — с одной стороны это жутко все полезно, но с другой — изучать это по-математически, абстрактно, без прямого применения мне кажется не стоит — можно освоить, когда понадобятся (например реляционная алгебра или теория категорий для систем типов) и нужные свойства и принципы уже изучить в стыке с практикой
— Логика, теория множеств — я считаю что обязательно надо разбираться в основах. ZFC надо брать.
— Теория вероятности, статистика — по минимуму из классической математики, лучше учить то, что нужно для Computer Science в контексте машинного обучения, а то рискуете закопаться в том, что не особо полезно
— Теория игр — полезная штука, но поверхностных знаний хватит надолго
— Функциональный анализ, вариационные методы — очень классно, но изучать только если припрет, например в машинном обучении
— Численные методы — только если хотите ими потом заниматься
Все остальное или не математика, а Computer Science, или не нужно (пока не понадобится для конкретного случая)
Языки программирования
Полемичная тема, выбора много, я предлагаю такой минимальный джентльменский набор:
— C++/Java — к сожалению в системном программировании от этих далеко не уйдешь. Но по-максимуму надо обходиться без них.
— Python — быстро что-то сваять, проверить гипотезу, классные библиотеки, особенно в машинном обучении и математике + основные фишки из функционального программирования
— Scala — практический функциональный язык, при желании можно спуститься и достаточно близко к железу. Много всего системного уже пишут на Scala. Следует сделать основной рабочей лошадкой.
(SQL, Prolog — естественно тоже, но это маленькие язычки)
Undergraduate
Курс будем считать как одну четверть — 3 месяца. Пропустим все вводные курсы про программирование.
1. Дискретная математика (не забываем, что это — уже не математика)
Комбинаторика, теория графов, дискретный тер. вер., recurrence relations, функции-генераторы.
Все это можно пропустить и освоить в других курсах (так как время не жмет). А то может стать скучно, а это — плохо.
2. Алгоритмы и структуры данных
Начиная от всяких сортировок, хэш-таблиц, разных деревьев, потом алгоритмы на графах (Djikstra, min cut/max flow).
По концептуальным знаниям: оценка сложности в нотации O, жадные алгоритмы, динамическое программирование.
Дополнительные темы: линейное программирование, алгоритмы для строк, рандомные алгоритмы.
Самые первые начала теории сложности.
Динамическое программирование вездесуще, деревья надо понимать, нижнюю границу для сортировки надо уметь выводить. Чисто теоретический курс, задачки в учебники есть. В общем довольно просто, слишком много времени не займет.
P.S. Алгоритмы дальше свои в каждой предметной области, и вернемся к общему курсу только в graduate программе.
Но сразу можно порекомендовать книгу по рандомным алгоритмам (недавно коллега посоветовал, пока только пролистал, но вроде очень грамотная), она graduate уровня, но погружаться надо начинать пораньше: www.designofapproxalgs.com/index.php
3. Теория вычислений
Здесь я пропагандирую Сипсера, вообще великолепная книжка — must read, причем годится и для graduate программы.
www.amazon.com/Introduction-Theory-Computation-Michael-Sipser/dp/113318779X
Это супер-важный курс, он заложит основы для всего остального. У Сипсера очень все очень интуитивно, логично и связано. (Недавно полистал Колмогорова — там сразу дается понять, что без мехматовского уровня лучше не заходить. У Сипстера — наоборот, минимум требований, минимум формализации, только самое необходимое — и все становится очень доступным).
Начинаем с определения «задачи» — у Сипсера это — язык. То есть множество строк. Алгоритм — что-то, что на любую строку говорит — да/нет. В этой концепции идет вся работа. Дальше, иерархия языков: регулярные, контекстно-независимые, вычислимые, перечислимые, невычислимые. Также очень неплохо преподносится complexity — P,NP,NP-complete,NP-hard,co-NP + рандомные классы.
Помимо хорошей теоретической подготовки получаем отличные скилы:
Работаем с конечными автоматами и регулярками
Работаем с грамматиками и с автоматом со стэком
По-программируем на Тюринговой машине — это реально надо поделать, это прикольно, расширяет сознание.
Программировать на машине можно здесь, даже есть брейкпоинты! morphett.info/turing/turing.html
Учимся доказывать, какие задачи нерешаемые, причем самыми удобными и быстрыми способами
Играемся с reductions — перевод одной задачи в другую — также очень расширяет сознание
Курс чисто теоретический, отличные задачи, те, которые со звездочками могут сломать мозг
Например: докажем, что машина Тюринга становится по мощности конечным автоматом, если запретить ей переписывать входные символы на ленте.
4. Математическая логика и теория множеств
Обычно не входит в программу Computer Science, но я считаю надо освоить. Я по этой книжке учился, очень простая книжка, очень приятная:
www.amazon.com/Elements-Set-Theory-Herbert-Enderton/dp/0122384407
Все, на этом чисто теоретическая подготовка в undergraduate Computer Science закончена, теперь — прикладные курсы
5. Компиляторы (2 четверти)
Уже многое освоено из теории вычислений, здесь весь акцент на практику. Наша задача — сделать реальный компилятор из серьезного языка в ассемблер. Например нам дали en.wikipedia.org/wiki/Object-Oriented_Turing, но можно что-то более интересное.
— Синтаксический разбор: тут надо брать что-то разумное, вроде JavaCC или ANTLR.
— Перевод в AST
— Семантический анализ: лайтово, хотя можно заморочиться с системами типов
— Генерация кода
Если есть силы и время — добавить сюда Intermediate Language и чуть-чуть оптимизации, самой простой.
В результате отлично понимаем, как работает компилятор, как реализуется вызов функции, как делать объекты, методы, массивы и прочее.
Примечание: нам приходилось все писать на C++, но в современном мире это совершенно не надо для образовательных целей. С другой стороны, если компилятор писать на Питоне или Скале (с питоном умеет работать ANTLR, со Скалой не знаю что есть — если кто-то знает хороший инструмент, просьба подсказать. Пытался понять что Spark SQL использует, но не выкопал) — можно сделать гораздо больше всего интересного с наименьшими потерями.
Ну тут так — почитать, поделать задачки. Но если есть возможность — неплохо бы спроектировать мини-CPU.
На чем-нибудь вроде: www.logiccircuit.org
7. Продвинутые структуры данных
Не уверен какие тут хорошие книжки, но неплохо бы сделать свои индексы на диске:
— B-дерево
— Линейный хэш
— R-дерево
Здесь уже все жестко, C++. Но можно и не заморачиваться, если только не хотите строить базы данных/поисковики.
8. Операционные системы (2 четверти)
Тут у меня такой подход — прочитать книжку: www.amazon.com/Operating-System-Concepts-Abraham-Silberschatz/dp/0470128720, но только ради общих концепций. А реально освоить OS таким образом:
Берем Начос: en.wikipedia.org/wiki/Not_Another_Completely_Heuristic_Operating_System (или Nachos 5.0j) и пишем свои модули:
— Примитивы синхронизации
— Библиотечка потоков
— Мульти-процессинг
— Мини-шелл
— Виртуальную память
— Файловую систему
Примечание: это конечно довольно хард-корно, но стоит того. Наверное лучше взять Nachos 5.0j, дебажить виртуальную память, у которой в самой проблемы с памятью — дело не особо приятное.
После такого упражнения, никакой мистики насчет операционных систем не останется.
9. Базы данных (2 четверти)
Читаем книжку: www.amazon.com/Database-Systems-Complete-Book-Edition/dp/0131873253
Делаем следущий проект: пишем движок SQL сверху простенького хранилища, если времени мало — делаем, как MySQL — запускаем AST. Если времени больше — переводим в реляционную алгебру и добавляем пару оптимизация (каких-нибудь rule-based).
Примечание: опять же, в свое время пришлось все делать на C++/lex/yacc. Время ушло вперед, если делать на Питоне или Скале, можно с меньшими потерями сделать гораздо больше. Или взять сразу более интересный язык запросов, например OQL или SQL++.
10. Искуственный Интеллект
AI — в моих глазах всегда была и будет самой интересной областью в Computer Science, так как там всегда решают очень сложные задачи. При этом, как только что-то хорошо начинает получаться, это прекращает быть AI и выделяется в отдельную дисциплину. В общем читаем замечательную книжку, и делаем 2-3 проекта.
www.amazon.com/Artificial-Intelligence-Modern-Approach-Edition/dp/0136042597
Рекомендуемые проекты:
— A* поиск для задачи 8-королев или еще какой-нибудь, повозиться с эвристиками
— доказатель теорем (resolution theorem proving)
— сделать эффективный вывод для баесовской сети
— реализовать временную логику Алена
— само-обучиться играть в шашки или играть в шахматы mini-max-ом (считая дерево)
Хард кор: можно сделать все задания в курсеровском курсе Probabilistic Graphical Models, но это больше для уровня аспирантуры.
11. Машинное обучение
Без этой темы сейчас никак. Не в курсе, какой учебник лучше для undergrad, но в идеале освоить Бишопа:
www.amazon.com/Pattern-Recognition-Learning-Information-Statistics/dp/0387310738
Вот класс Andew Ng в Стэнфорде для undergrad, не путаем к классом на Курсере, совсем разные уровни:
cs229.stanford.edu
И еще я нашел просто чудесные лекции на YouTube (mathematicalmonk): www.youtube.com/playlist?list=PLD0F06AA0D2E8FFBA
12. Компьютерная графика
Не особо обязательно, но каждый программист когда-то хотел написать свою игру, так что надо брать для фана и для разговоров за пивом.
Не уверен, какие хорошие книги сейчас.
Мы писали кусок OpenGL на C, очень полезно — дает представление как работают все 3D движки.
Можно еще свой Ray-Tracer написать — тоже прикольная штука.
13. Копьютерные сети
Пропустил этот курс, но есть очень хороший курс на Курсере
www.coursera.org/course/comnetworks
14. Распределенные системы
Сильно пересекаются с операционными системами, но много своих важных фишек.
Я бы просто прочитал книжку, особенно ключевые концепции, а не конкретные системы:
www.amazon.com/Distributed-Systems-Concepts-Design-Edition/dp/0132143011
Синхронизация, глобальное состояние системы, консенсус, транзакции, т.д. Сейчас всякие MPP системы стали очень популярными, здесь — основы, на которых они держатся (или не держатся, готовлю популярную статью про всякие модные базы данных).
15. Языки программирования
Часто попадается такой курс, но обычно — трата времени имо. К этому моменту написан компилятор для Turing и SQL, все ясно. Можно заморочиться чем-нибудь вроде Haskell или ML. Как вариант изучить XQuery для небольшого расширения сознания.
Тут я бы закончил undergrad программу, у вас есть диплом B.Sc., поздравляю.
Или можно пойти вширь: Security/Cryptography, Scientific Programming, забуриться в AI: Computational Lingustics например. Что мы имеем после такой программы? Можно спокойно идти работать, но есть еще пробелы в теоретической базе. Можно все заполнить самостоятельно, а можно продолжать учиться на M.Sc.
Аспирантура в Computer Science — это не наша аспирантура. Здесь вы продолжаете учиться пару лет и сдаете comprehensive exam, в случае PhD по 5-ти дисциплинам, то есть надо в голове держать очень серьезную базу на этот момент. Очень полезное упражнение (я сдавал на MSc по 3-м, это намного проще).
И очень быстро начинается специализация. Но давайте основы:
1. Алгоритмы
То же, что и в undergrad, только уже по-настоящему, глубже, плюс рандомизация.
Тут как бы и нет всеми признанной книжки, советую полазить по сайтам университетов. То есть многие обходятся статьями, слайдами и т.п.
Ну и рандомные алгоритмы — это наше все. Так что открываем книгу: www.designofapproxalgs.com/index.php
2. Теория вычислений, по сути чистая Complexity Theory
Можно покрыть Сипсера, и попробовать прочитать еще что-нибудь. У нас был Пападимитроу, но это конечно не для слабонервных. Здесь в основном одни редукции, раньше были NP-complete, сейчас много в рандомных классах.
Еще, если нравится логика, имеет смысл почитать Descriptive Complexity: people.cs.umass.edu/
3. Архитектура
Та же книжка, но уже по-взрослому. Можно построить какой-нибудь продвинутый CPU.
Дальше уже специализация по большому счету. Я бы посоветовал такие области, но это уже мой bias:
4. Машинное обучение
На уровне аспирантуры можно брать Бишопа (сам еще не всего его прошел), и теория машинного обучения
Мне нравится старая добрая: www.amazon.com/An-Introduction-Computational-Learning-Theory/dp/0262111934
Но наверное уже намного актуальнее есть книги.
И можно на курсере зависнуть:
— Probabilistic Graphical Models
— Еще очень хороший курс Natural Language Processing от Columbia University
— Современные нейросети: class.coursera.org/neuralnets-2012-001
5. Теория баз данных
www.e-booksdirectory.com/details.php?ebook=7942
Это очень увлекательное поле, здесь намешано все, что можно: Логика, Теория моделей, Complexity, Descriptive Complexity, даже теорию игр поэксплуатировали. Книга довольно тяжелая и формальная, но стоит того, хотя бы выборочно прочесть и поделать упражнения.
Чего пропущено?
Совсем ничего про формальные методы нету, ну тут сложная штука. По идее между теорией множеств, искуственным интеллектом и теорией баз данных + descriptive complexity — есть весь инструментарий для верификации и доказательств, поэтому такой курс уже должен быть чисто прикладным. Если есть опыт такого курса — очень интересно было бы узнать.
Интернет математика — ну это тоже немного отдельная тема, но вся база заложена.
Все, если дойдете до сюда, делая проекты и решая задачи, можно считать, что вы достигли уровня M.Sc. в Computer Science на уровне топовых университетов мира.
Можете поискать в сети «Computer Science Comprehensive Exam» или что-то вроде этого, и можно найти реальные экзамены уровня M.Sc. и Ph.D.
Я ссылки решил не выкладывать, чтобы не палить лишний раз, так как обычно их не очень распространяют.
Детальный план самообразования в Computer Science за 1.5 года
Обсуждаем один из возможных планов самообразования в Computer Science за 1.5 года со ссылками на онлайн-курсы и другие образовательные сайты.
При составлении этого плана мы отталкивались от предложенного Siraj Raval пятимесячного интенсива, но постарались подойти более реалистично к срокам прохождения курсов из расчета 8-10 часов в неделю. При большем или меньшем временном ресурсе умножайте приведенные длительности на соответствующий коэффициент.
Любой план субъективен, поэтому задачей этой публикации было не составление идеального плана самообразования в Computer Science, а создание конкретного примера одного из возможных направлений с достаточным числом ссылок на образовательные ресурсы, изучив которые вы будете способны воплотить новые идеи на практике. Очевидно, что независимо от наших рекомендаций вы можете корректировать время и направление развития обучения. Мы постарались учесть разносторонний опыт, накопленный за время существования proglib.io, и там, где это было уместно, дополнили тематические блоки ссылками на наши публикации.
Если вы намерены предварительно продумать курс под себя еще более детализировано, изучите различные соображения по самообразованию на примере американских университетов и ресурса Teach Yourself Computer Science (перевод). Если у вас есть возможность отводить занятиям большее время (по 18-22 часов в неделю), рекомендуем обратить внимание на план Open Source Society University.
Наверняка вы хотите, чтобы самообразование проходило эффективно и с максимальной пользой. Некоторые из читателей, начинающих знакомство с IT, не знают, с чего начать, или, имея некоторые соображения на этот счет, хотели бы узнать, как попасть в IT после 30. Возможно, вы стремитесь скорее стать Junior-разработчиком и начать зарабатывать на программировании. Перед тем, как изложить сам план, рассмотрим некоторые предварительные соображения относительно самообразования в Computer Science, справедливые для различных категорий учеников.
Предварительные соображения
Учитывайте, что обучение – это не зубрежка, а погружение в материал, решение практических задач и интервальные повторения. Чтобы избежать типичных ошибок, изучите советы для обучающихся программированию и как/что читать по программированию. Чтобы эффективно использовать свободное время, в дополнение к приведенным ниже курсам вы можете тренироваться в мобильных приложениях. Если вам по душе игровая форма обучения, обратите внимание на подборку соответствующих ресурсов и статью о 27 сайтах с задачками для оттачивания навыков программирования.
При просмотре видеолекций для экономии времени ускоряйте их в 1.25-2 раза, в особенности в тех местах, где происходит обзор концепций и повторение материала предыдущих занятий. Несмотря на легкость изложения, концентрация новых знаний в этих частях минимальна и рассчитана на то, чтобы освежить знания с учетом больших интервалов между лекциями при традиционном обучении. Если вы проходите урок за уроком, соответствующие нейронные связи будут поддерживаться за счет применения старых знаний в новых уроках. Подход ускорения видео требует некоторой привычки, но позволяет больше времени уделять действительно сложным моментам.
При чтении сопроводительных материалов ведите краткий конспект, дополняя его после каждой смысловой части. Пройдя какую-то из концепций, например, определенный алгоритм, полезно детально объяснить его реальному или воображаемому собеседнику. Это та составляющая, которой обычно сильно не хватает относительно самообразования в Computer Science и не только – фидбэка. Будет отлично, если вы можете найти заинтересованного партнера по занятиям – это не только повысит качество проверки тестовых работ, но также добавит в обучение соревновательный аспект и повысит мотивацию прохождения очередного курса.
По тем же причинам при нескольких вариантах реализации практической части выбирайте курсы с мгновенной обратной связью – те, в которых проверка результата происходит без задержки, например, непосредственно в консоли или по приложенным ответам. Если параллельно с планом вы хотите получать дополнительные знания из книг, иметь что-то вроде «списка книг на лето», в этом поможет подборка десяти лучших книг по Computer Science.
Обязательно пользуйтесь системами контроля версий, такими как GitHub и Gist, чтобы не тратить время на решение однотипных задач и реализовывать попутно с обучением различные проекты, приходящие на ум в процессе прохождения курсов. Тогда профиль GitHub можно будет использовать как портфолио при устройстве на работу.
Учебный план самообразования в Computer Science
Предлагаемый план самообразования в Computer Science разбит на три семестра, в среднем по 26 недель каждый. Первый семестр является фундаментом, в котором закладываются математико-алгоритмические основы компьютерных технологий и получаются представления о программировании.
Второй семестр посвящен различным аспектам, в которых полученные в первом семестре понятия реализуются через различные виды взаимодействий между компьютерами или между компьютерами и пользователями: базы данных, компьютерные сети, мобильные приложения и обработка текстов.
Третий семестр является наиболее субъективной частью этого плана, так как анализ данных и компьютерное зрение часто выносятся за пределы Computer Science. Однако с практической точки зрения владение этими технологиями в рамках Computer Science существенно расширяет навыки специалиста относительно решения современных задач анализа данных. В этом завершающем семестре также рассматриваются распределенные системы и практики разработки.
1. Первый семестр – математика, алгоритмы и структуры
1.1. Гарвардский обзорный курс CS50 (4 недели)
Чтобы получить общее представление о Computer Science, пройдите курс CS50 Гарвардского университета. В качестве основного языка программирования используется язык С, что хорошо дополнит ваш инструментарий, так как в приведенном плане в этой же роли выступает высокоуровневый язык Python. Этот курс позволит увидеть картину в целом, и, если вы не уверены в выборе, понять, нужно ли вам заниматься Computer Science.
1.2. Основы Python (4 недели)
Язык Python – интерпретируемый объектно-ориентированный язык с динамической типизацией. Этот высокоуровневый язык позволяет быстро освоить основные концепции программирования и начать делать что-то практическое. Automate the Boring Stuff with Python Альберта Свейгарта (книга также есть в нашей библиотеке) – один из лучших учебников по Python с задачами, направленными на облегчение ежедневной рутины. Книгу в вышеуказанном темпе можно пройти за 4 недели, читая и делая задания одной главы в день. Либо можно ориентироваться на объем книги: 600 страниц это соответственно 150 страниц в неделю или 20-25 страниц в день.
Если вам больше нравятся интерактивные занятия, обратите внимание на один из перечисленных здесь курсов.
1.3. Математика для Computer Science (8 недель)
В освоении вопросов математической индукции, теории чисел, теории графов и прочих математических основ самообразования в Computer Science поможет соответствующий курс MIT, состоящий из 25 лекций и 12 контрольных работ. Полный конспект курса состоит из 557 страниц, соответственно в среднем нужно проходить около 10 страниц в день и решать 1-2 контрольные в неделю.
1.4. Структуры данных (6 недель)
Чтобы разбираться в связных списках, очередях, множествах, хэш-таблицах, бинарных деревьях и других структурах данных, пройдите курс университета Сан Диего, в создании которого принял участие Михал Левин, читающий в Школе анализа данных курс «Алгоритмы и структуры данных поиска».
1.5. Алгоритмы (8 недель)
Одним из лучших курсов по алгоритмам является курс MIT 6.006, состоящий из 8 разделов: 24 лекций и 7 подборок задач. Соответственно каждой теме можно уделить одну неделю. В качестве вспомогательно курса по алгоритмам и структурам данных на русском языке вы можете воспользоваться этим видеокурсом. Кроме того, мы подготовили соответствующую подборки книг, веб-сайтов, онлайн-курсов и видеоматериалов.
Когда будете разбираться в алгоритмах, помните о ресурсах с визуализацией – не только сортировок, но и других алгоритмов. На последней неделе проверьте полученные знания, ответив на вопросы по алгоритмам с собеседований в различных компаниях.
2. Второй семестр – интерфейсы взаимодействия
2.1. Базы данных (3 недели)
Для обучения работе с базами данных пройдите курс Мичиганского университета Using Databases with Python. В качестве базы данных в курсе используется SQLite3. Отточить свои навыки в написании SQL-запросов можно при помощи нескольких сайтов. Если вам потребуется проработать этот вопрос подробнее, воспользуйтесь нашей подборкой материалов для изучения баз данных и SQL.
2.2. Компьютерные сети (6 недель)
Шестинедельный курс от Google, входящий в специализацию Google IT Support Professional Certificate научит вас разбираться в TCP/IP, DNS, DHCP и прочих вещах, на которых строятся компьютерные сети. Если потребуются дополнительные разъяснения на русском, мы подготовили обзор на соответствующий курс.
2.3. Веб-программирование (5 недель)
Гарвардский курс CS50’s Web Programming with Python and JavaScript состоит из 10 лекций и является расширенным подмодулем первого курса (с другим лектором) описываемого плана, рассматривающим основные технологии современного веб-программирования. В течение каждой недели проходите по 2 лекции, отводя по два-три дня под изучение соответствующих технологий.
Язык JavaScript уже шестой год поряд остается самым популярным языком программирования по опросам StackOverflow. Если вы посчитаете, что с JavaScript вы хотите разобраться подробнее, пройдите курс freeCodeCamp или, если хочется разнообразия, посмотрите эту подборку видео.
Лучший способ научиться веб-программированию это создать свой проект. Поэтому параллельно с прохождением указанного курса создайте ресурс, в котором вы будете реализовать возможности рассматриваемых технологий. Множество идей проектов собрано в подборке Just Build Websites.
2.4. Обработка текстов на естественном языке (4 недели)
Одним из интерфейсов взаимодействия человека с миров является язык, на котором человек говорит. Для приобретения навыков в обработке строковых объектов и файлов, написанных на естественном языке, пройдите четырехнедельный курс Мичиганского университета Applied Text Mining in Python.
По этой теме на нашем сайте есть также статья с подборкой дополнительных материалов: онлайн-курсов, библиотек, блогов и книг.
2.5. Мобильные приложения (5 недель)
Для того, чтобы окунуться в разработку мобильных приложений, лучший старт это курс, в котором параллельно объяснениям создается первое приложение (такие курсы есть и для iOS, и для Android).
Если вас увлекла эта сфера и перед вами встал вопрос, стоит ли становиться разработчиком мобильных приложений, прочитайте эту статью.
3. Третий семестр – анализ и управление данными
3.1. Машинное обучение (10 недель)
Один из вариантов разобраться в главных особенностях машинного обучения – пройти десятинедельный курс Python for Data Science. Еще один вариант, который мы рассматривали ранее – план от новичка до профи в машинном обучении за 3 месяца, требующий соответственно 12 недель.
При прохождении любого из вариантов вам помогут ссылки на ресурсы по Machine Learning и подборка материалов по машинному обучению. При проработке конкретных идей и поиске истоков алгоритмов машинного обучения важно знать, как правильно искать и читать научные статьи. Чтобы не забывать основную терминологию этого объемного блока, добавьте в закладки страницу со шпаргалками по машинному обучению.
3.2. Компьютерное зрение (6 недель)
Вводный курс Georgia Tech представляет собой введение в компьютерное зрение, включая основы формирования изображений, обнаружение и сопоставление образов, отслеживание движения и т. д.
3.3. Распределенные системы (5 недель)
Распределенные системы – область с быстро меняющимся инструментарием, поэтому наиболее правильно в этом разделе рекомендовать книгу, рассматривающую фундаментальные особенности этой области. Одна из лучших книг по тематике распределенных систем, не теряющая своей актуальности для самообразования в Computer Science – Распределенные системы. Принципы и парадигмы Таненбаума и ван Стеена. Это довольно объемный труд, требующий чтения порядка 15-20 страниц в день и продумывания вопросов в конце каждой из глав.
3.4. Практики разработки (4 недели)
Курс Миннесотского университета объясняет как происходит совместная работа команды разработчиков, какие процессы и методологии ими используются для создания законченного программного продукта.
После прохождения плана
Наконец, по завершении или во время прохождения приведенного плана самообразования в Computer Science, могут возникнуть вопросы о том, какие еще есть сайты для самообучения и что нужно делать для совершенствования своих навыков. Подпишитесь на подкасты и Youtube-каналы. Если вас увлечет теоретическая сторона Computer Science, просмотрите этот список книг.
Если вы проходили этот план, чтобы найти работу в сфере Computer Science, посмотрите наши советы по написанию резюме и статьи о том, как должно выглядеть резюме, как успешно пройти любое техническое собеседование и протестируйте полученные знания из разных областей Computer Science на подборке задач, предлагаемых на собеседованиях.















