Computer Science — зачем учить?
“Программирование — это не что-то, что вы знаете. Это нечто, в чем вы можете разобраться.” Крис Пайн, эксперт в программировании, автор книг и учебников. “В некотором смысле программирование похоже на рисование. Сначала у вас есть только чистый холст и материалы. Нужно использовать сочетание науки, искусства и ремесла, чтобы определить, что со всем этим делать.” Эндрю Хант (Andrew Hunt), автор бестселлера The Pragmatic Programmer и один из авторов Манифеста Agile. Понять к чему мы ведем, несложно. Чтобы стать действительно хорошим программистом, или просто подняться хотя бы на ступень выше рядового кодера, нужно иметь максимально широкие и при этом достаточно глубокие знания в разных сферах, помимо самих языков программирования. И владение дисциплинами, входящими в понятие CS, идет здесь на одном их первых мест.Дисциплины Сomputer Science
Давайте разберем, какие предметы входят в область компьютерных наук. К коротким описаниям дисциплин с причинами для их изучения добавим рекомендации лучшей книги и лучшей серии бесплатных видеолекций по предмету из, пожалуй, лучшего англоязычного гайда по computer science, написанного Озом Новой (Oz Nova) и Майлзом Бирном (Myles Byrne), преподавателями Школы компьютерных наук Брэдфилда в Сан-Франциско.Программирование
Программирование является основой и базовой дисциплиной компьютерных наук, большинство студентов начинают изучение курса CS именно с него. Самые лучшие курсы программирования в рамках CS будут полезны далеко не только новичкам, но и опытным кодерам, которые могли пропустить те или иные концепции и модели программирования, когда учились этому впервые.
Лучшая книга: “Структура и интерпретация компьютерных программ” (Structure and Interpretation of Computer Programs). Авторы: Джеральд Сассман (Gerald Sussman) и Хэл Абельсон (Hal Abelson).
А на JavaRush, кстати говоря, всем желающим доступен для изучения легендарный гарвардский курс “CS50. Основы программирования”, полностью переведенный на русский.
Лучшая видеолекция: Brian Harvey’s Berkeley CS 61A
Алгоритмы и структуры данных
Знание наиболее распространенных алгоритмов и структур данных помогает решать разного рода задачи, а это очень важно в любой из областей компьютерных наук, включая, конечно, и разработку программного обеспечения.
Лучшая книга: The Algorithm Design Manual. Автор: Стивен Скьена (Steven Skiena).
Лучшая видеолекция: лекции Стивена Скьены
Компьютерная архитектура
Знание компьютерной архитектуры, то есть понимание того, как на самом деле работает компьютер, является еще одной важной частичкой пазла, без которой попытки построения программных конструкций и моделей часто оказываются неудачными.
Лучшая книга: “Архитектура компьютера и проектирование компьютерных систем” (Computer Organization and Design). Авторы: Дэвид Паттерсон (David Patterson) и Джон Хеннеси (John Hennessy).
Лучшая видеолекция: Berkeley CS 61C
Операционные системы
Практически весь код, написанный программистом, будет выполняться операционной системой, поэтому знание принципов работы ОС также является важным элементом.
Лучшая книга: “Введение в операционные системы” (Operating Systems: Three Easy Pieces). Авторы: Андреа Арпачи-Дюссо (Andrea Arpaci-Dusseau) и Ремзи Арпачи-Дюссо (Remzi Arpaci-Dusseau).
Лучшая видеолекция: Berkeley CS 162
Компьютерные сети
Мало что в современном ИТ может обойтись без использования Интернета, поэтому ИТ-специалистам важно понимать, как Всемирная сеть работает, чтобы использовать ее потенциал по полной.
Лучшая книга: Computer Networking: A Top-Down Approach. Авторы: Джеймс Куросе (James Kurose), Кит Росс ( Keith Ross).
Лучшая видеолекция: Stanford CS 144
Математика для computer science
Поскольку компьютерные науки, по сути, являются ответвлением прикладной математики, знание этого предмета тоже будет очень полезным практически в любой профессии, связанной с программированием. А также даст вам конкурентное преимущество перед теми, кто этой дисциплиной не владеет.
Лучшая книга: Mathematics for Computer Science. Авторы: Альберт Р. Мейер (Albert R. Meyer), Эрик Леман (Eric Lehman) и Фрэнк Томсон Лейтон (Frank Thomson Leighton).
Лучшая видеолекция: Tom Leighton’s MIT 6.042J
Базы данных
Базы данных — относительно новая область компьютерных наук, и экспертов в ней по-прежнему не так уж много. Данные — еще один ключевой элемент CS, потому что они лежат в основе большинства значимых программ, но мало кто понимает, как на самом деле работают системы баз данных.
Лучшая книга: Readings in Database Systems. Авторы: Джозеф М. Хеллерштейн (Joseph M. Hellerstein) и Майкл Стоунбрейкер (Michael Stonebraker).
Лучшая видеолекция: Joe Hellerstein’s Berkeley CS 186
Языки и компиляторы
Понимание того, как технически работают языки программирования и компиляторы, позволяет совершенствовать свой код и навыки программирования. А также облегчает изучение новых ЯП, что тоже критически важно для любого разработчика в долгосрочной перспективе.
Лучшая книга: “Компиляторы: принципы, технологии и инструменты” (Compilers: Principles, Techniques and Tools). Авторы: Альфред Ахо (Alfred Aho), Моника С. Лам (Monica S. Lam), Рави Сети (Ravi Sethi), Джеффри Ульман (Jeffrey Ullman).
Лучшая видеолекция: Alex Aiken’s course on Lagunita
Распределенные системы
В наши дни, большинство систем являются распределенными. Компьютеры и программы становятся все более комплексными, и знание распределенных систем окажется полезным для обеспечения правильной и бесперебойной работы вашего софта.
Лучшая книга: Distributed Systems, 3rd Edition. Авторы: Мартен ван Стин (Maarten van Steen) и Эндрю С. Таненбаум (Andrew S. Tanenbaum).
Лучшая видеолекция: CS 436: Distributed Computer Systems
Советы для изучения Computer Science
Ну и напоследок несколько советов для тех, кто планирует начать изучение дисциплин CS.Развивайте практические навыки в дисциплинах CS
Одно из преимущества CS, как и других ИТ курсов, состоит в том, что полученные только что теоретические навыки можно сразу же применить на практике. Не забывайте об этом, и чередуйте теорию с практикой, чтобы добиться наилучших результатов.
Не прокрастинируйте
Компьютерные науки — это достаточно сложный предмет, изучение которого мало кому дается легко, особенно поначалу. Именно поэтому, начиная изучать дисциплины CS, нужно не поддаваться прокрастинации — не откладывайте на потом освоение теории, решение задач и практику, так как из-за этого обучение не только может сильно затянуться, но и, скорее всего, окажется не таким эффективным.
Не ограничивайтесь одним курсом
Не ждите, что сможете получить все необходимые знания по предмету из одного курса, как бы хорош он ни был. Лучше всегда обращаться как минимум к нескольким источникам информации, чтобы добиться более широкого понимания предмета.
Найдите единомышленников
Звучит слегка банально, но эффективно обучаться, как и делать многие другие вещи в жизни, лучше всего в составе группы единомышленников. Найти себе компанию для совместного изучения CS будет полезным по ряду причин. Это поможет учиться более эффективно, вместе решать задачи и проблемы, сравнивать с другими свой прогресс в обучении и навыки применения новых знаний.
Учитесь писать слова, а не только код
Еще один распространенный совет от многих экспертов, для тех программистов, которые изучают CS для улучшения своих навыков и повышения профессионального уровня: учиться писать (а не кодить), то есть складывать слова в предложения и составлять из предложений тексты. Этот навык достаточно важен для любого разработчика, а его отсутствие будет мешать прогрессировать не только в изучении компьютерных наук, но и в других аспектах программирования как профессии.