Чем Software Engineering отличается от Computer Science
Знаете, это какая-то слабая программа для Computer Science
До того, как я приехал на программу SE, во всех комментариях читал именно такое утверждение.
Человек переходит по [вот этой] ссылке и читает:
• 17-651 Models of Software Systems
• 17-652 Methods: Deciding What to Design
• 17-653 Managing Software Development
• 17-602 Introduction to Personal Software Process
• 17-654 Analysis of Software Artifacts
• 17-655 Architectures for Software Systems
• 17-677 MSIT Project I
• 17-678 MSIT Project II
И начинаются разговоры: хм, простите, но где здесь хотя бы один классический курс по алгоритмам и структурам данных? Ну или хотя бы один годный курс по ООП, или по C++, или по основам распределенных систем или может быть базы данных, где всё это?
Ну, что я могу сказать, всего этого нет. Точнее, этого нет среди указанных выше основных курсов, зато каждый семестр можно брать 1-2 электива, я вот, например, брал Distributed systems и Data structures for application programmers. Подробнее про элективы [читать тут] и [здесь]. Причина подобного отношения – изначально неверная реклама этой программы в России, а также невнятное определение того, что такое software engineering (оно у всех очень разное). 
Выше короткая вырезка с официального сайта. Можно увидеть, что пересечения есть, но фокус принципиально другой. Есть некоторые вещи, которым не учат на Computer Science программах. Я не знаю как иначе объяснить разницу между SE и CS, кроме как сравнить создание IT системы с чем-нибудь из реальной жизни. Например, с постройкой моста. Вот список вещей, которым не учат на CS:
• как выбрать форму моста
• как решить, где именно этот мост должен стоять
• как скоординировать это с финансовыми или правовыми вопросами
• как именно должен выглядеть мост с точки зрения заказчика
• как скоординировать 100500 рабочих, которые будут строить этот мост
• как ответить руководству (спонсорам, инвесторам, etc), на каком этапе строительства сейчас мост и когда он будет завершен
• как ДО того, как мост построен, оценить его качества: грузоподъемность, производительность
• как задокументировать построенный мост так, чтобы в будущем его можно было починить
• какие действия должны быть выполнены, кем и когда, чтобы мост не упал через 2 года
… ну, в общем, идея понятна, продолжать можно долго. С одной стороны, это менеджмент (17-653 Managing Software Development). От него никуда не денешься, потому что с людьми надо общаться, и это почти самое сложное, а еще является причиной провала большинства проектов. После чего – умение собирать требования (17-652 Methods: Deciding What to Design). Как только требования собраны, мост нужно нарисовать на бумаге (17-655 Architectures for Software Systems), по возможности используя формальные методы расчета моста (17-651 Models of Software Systems). На протяжении всего процесса желательно проверять качество собранных требований, процесса постройки, итогового результата и т.д. (17-654 Analysis of Software Artifacts)
Я считаю, что все вышеописанные курсы должны предваряться мощным бакалавриатом по Computer Science, а затем 3-5 годами работы в индустрии. Лишь после этого имеет смысл говорить о менеджменте или архитектуре.
И вот мы плавно переходим к вишенке на торте. Практикум, он же MSIT Project, это то, что склеивает всю программу воедино. Я уже писал краткий обзор нашего проекта [тут]. Следующим постом расскажу о практикуме более подробно.
По материалам студента магистратуры первого потока (2013/2014) совместной программы Университета Иннополис
*«Магистр информационных технологий – управление разработкой программного обеспечения» – программа магистратуры Университета Иннополис, разрабатываемая на базе программы MSIT-SE (Master of Science in Information Technology) одного из лучших ИТ-вузов мира Carnegie Mellon University (№3,QS World University Rankings by Subject 2014 — Computer Science & Information Systems), с учетом лучших практик МФТИ, ИТМО, National University of Singapore и других партнеров в области образования. Университет Иннополис планирует осуществить набор группы магистров на своей базе для обучения в 2014/15 годах.
Как я прохожу Online Master of Science in Computer Science, и кому это может не подойти
Закончила свой первый год учебы по программе Online Master of Science in Computer Science (OMSCS) в Georgia Institute of Technology (3 курса из 10). Захотелось поделиться некоторыми промежуточными выводами.
Не стоит туда идти, если:
1. Хочется научиться программировать
В моем понимании, в базе хорошему программисту надо:
На эту тему есть книги, MOOC курсы, нормальная работа в хорошей команде. Отдельные курсы на MSCS могут помочь с чем-то из перечисленного, но в целом программа не про это. Знание языков — либо prerequisite к курсам, либо предполагается, что ты можешь быстро их освоить в нужном объеме. Для примера, в курсе Graduate Introduction to Operating Systems надо было сделать 4 проекта общим объемом на 5000+ строк C кода, плюс надо было прочитать около 10 научных работ. В курсе Artificial Intelligence в дополнение к шести непростым проектам надо было сдать два экстремальных экзамена — в течение одной недели решить 30 и 60 страниц не самых простых задач.
Требований к «хорошему» коду в плане читаемости чаще всего нет. Часто оценка ставится автоматически на основе автотестов, нередко есть требования к производительности, код и тексты проверяются на плагиат.
2. Основная мотивация — применить новые знания на текущем месте
Некоторые курсы могут дать инструментарий. Но вопрос, что ты будешь делать с еще тонной проектов и материалов, на освоение которых будет уходить всё свободное время на протяжении нескольких лет. Мне кажется опыт MSCS хорошо ложится на анекдот:
У ученого и популяризатора науки спросили о целях и результатах некоторого исследования:
Популяризатор:
— Результаты этого исследования помогли проверить гипотезу… А также внесли значительный вклад в развитие…
Ученый:
— Да это же просто ох**нно!
Я верю в то, что пройти всю программу без потерь можно, только если всё это зачем-то интересно и весело. Но это все не отменяет тот факт, что на такое образование смотрят работодатели (особенно в Штатах, но думаю, что не только). После добавления информации в LinkedIn о том, что я там учусь, мне начали поступать запросы от рекрутеров неплохих компаний из Европы и Штатов. Из моих знакомых в Торонто, несколько человек за время учебы продвинулись по карьере или нашли новую работу.
Кроме профессиональных, MSCS открывает и другие возможности. Можно вписываться в интересные научные проекты внутри Georgia Tech, если успешно прослушал нужные курсы. Head teaching assistant (TA) в AI — это русский парень, который, после года учебы в OMSCS, перевелся в кампус и уехал учиться и заниматься исследованиями в Атланту. Насколько мне известно, планирует получать PhD.
3. Рассчитываешь пройти программу в гордом одиночестве
Условно 50% профита от программы — это возможность общаться. У OMSCS большое и активное коммьюнити. Для каждого класса нанимается большая команда TA (часто это студенты той же программы, успешно прошедшие текущий курс). Все эти люди зачем-то хотят работать и учиться вместе. Что дает общение:
Основная часть студентов — это люди с опытом в индустрии, часто руководители отделов, архитекторы, вплоть до CTO. Примерно 25% не имеют формальное CS образование, т.е. люди с просто достаточно разнообразным опытом. У меня на начало программы было 5 лет опыта Java-разработки в Яндекс.Деньгах, а сейчас part-time работа ресерчером в медицинском стартапе (deep learning в стоматологии).
Многие студенты мотивированы и открыты к общению. Программу можно пройти и в одиночку, но в результате ты инвестируешь 2.5-3 года своего времени (если учитывать работу) и получаешь только 50% возможного профита. Для меня этот пункт — это самая большая сложность, т.к. есть неуверенность в себе и языковый барьер, но я стараюсь работать над этим. Регулярно встречаемся с коллегами, живущими в Торонто. Все они довольно активные и интересные ребята и продвинутые профессионалы, один из них организовал встречу с Zvi Galil, «отцом» программы OMSCS, деканом факультета Computing Georgia Tech, оставившим позицию в этом году.
Пример про мотивацию: есть легендарный студент, который совместил прохождение программы и службу в армии. Он подключался к форуму во время полетов, и делал проекты и слушал лекции, проходя полевые учения. Сейчас работает в исследовательском институте при Georgia Tech, планирует делать PhD.
4. Нет готовности серьезно коммититься по времени
На первый взгляд может показаться, что OMSCS аналогична набору MOOC курсов или специализации на Coursera или похожей платформе. Я слушала несколько курсов на Coursera, например, первые части Cryptography и Algorithms от Stanford. Кроме того, я прошла один платный онлайн Graduate курс в Stanford (его же слушают MS и PhD студенты) и бесплатно прослушала лекции стенфордского CS231n (Convolutional Neural Networks for Visual Recognition).
Исходя из моего опыта, основные отличия Online graduate курсов от бесплатных MOOC курсов:
Почему каждому разработчику сначала стоит изучить теории 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, то вам однозначно к нам — сервер готов к работе через минуту после оплаты!
Как разобраться в Computer Science самостоятельно
Авторизуйтесь
Как разобраться в Computer Science самостоятельно
Для большинства программистов Computer Science — факультет в зарубежных вузах, целиком и полностью посвящённый программированию, математике и всему, что связано с разработкой программного обеспечения. К счастью, в современном мире необязательно инвестировать тысячи долларов и 4 года своей жизни в образование, ведь существует бесчисленное множество онлайн-курсов, книг и других ресурсов для изучения компьютерных наук.
Приводить сотни всевозможных материалов для программистов-самоучек мы не будем, а лишь попытаемся ответить на два главных вопроса:
В качестве ответа приведём список материалов, опубликованный Озаном Онай (Ozan Onay) и Майлзом Бёрном (Myles Byrne) — инструкторами в школе компьютерных наук Брэдфилда в Сан-Франциско. Данная подборка литературы и курсов основана на личном опыте обучения сотен программистов-самоучек.
Зачем изучать компьютерные науки?
Существует два типа программистов: те, кто владеют компьютерными науками достаточно хорошо, чтобы совершать инновации, и те, кто вроде как что-то могут благодаря знанию пары-тройки высокоуровневых инструментов.
И те и другие называют себя программистами или инженерами программного обеспечения и имеют примерно одинаковые доходы в начале своей карьеры. Однако первые в итоге становятся более высокооплачиваемыми специалистами. Причём абсолютно неважно, работают они над известными, дорогими и большими коммерческими проектами или над инновационными open-source проектами различной сложности. Они становятся лидерами в своей области и привносят нечто большее и более качественное на рынок.
17–19 декабря, Онлайн, Беcплатно
Они углубленно изучают компьютерные науки, читая книги, слушая лекции, практикуясь или же упорно поглощая материал на личном опыте в своей карьере. Вторые же обычно остаются на дне, изучая различные инструменты и технологии для своей работы, а не то, на чём эти технологии основаны. Для них причиной для изучения чего-то нового является появление новых инструментов и, следовательно, устаревание старых.
На данный момент число людей в индустрии постоянно растёт, а число выпускников с факультета компьютерных наук остаётся неизменным. Перенасыщение рынка инженерами второго типа в итоге приводит оных к безработице или к сравнительно дешевому трудоустройству. Вне зависимости от ваших стремлений: хотите вы стать инженером первого типа или просто ищете способ заработать немного денег, изучение Computer Science — единственный надёжный путь для этого.
Дисциплины
Программирование
Структура и интерпретация компьютерных программ
Львиная доля студентов Computer Science начинают с «вводных курсов» по программированию. Однако такие курсы будут полезны не только новичкам, но и вполне себе специалистам, которые по какой-либо причине пропустили некоторые базовые для программирования вещи.
Мы рекомендуем взять во внимание классическую «Структуру и интерпретацию компьютерных программ». Прочтите как минимум три главы приведенной выше книги, выполняя упражнения для практики. Для тех, кому данная книга кажется слишком сложной, рекомендуется «How to design programs». Тем же, кому она наоборот кажется слишком лёгкой, следует обратить внимание на «Concepts, Techniques, and Models of Computer Programming».
Можно также послушать лекции университета MIT по данной теме. Как альтернативу мы рекомендуем прослушать лекции Брайана Харви из университета Беркли, особенно, если для вас это в новинку.
Для дополнительной практики возьмите на заметку ресурс Exercism: на нём можно найти сотни интересных задачек по программированию, которые помогут вам в освоении синтаксиса разных языков программирования и прокачают ваше логическое мышление, которое необходимо программисту, как воздух.
Архитектура ЭВМ
Цифровая схемотехника и архитектура компьютера
Архитектура ЭВМ, также иногда называемая «компьютерными системами» или «организацией компьютера» — достаточно важная тема, описывающая работу аппаратного слоя, который лежит на уровень ниже, чем слой программного обеспечения. Пожалуй, самая недооцененная область среди инженеров-самоучек.
The elements of Computing Systems — амбициозная книга, которая даёт понимание того, как работает компьютер. Каждая глава — строение одной маленькой детали большой системы: от написания логики на HGL (языке описания аппаратуры) через центральный процессор к созданию тетриса.
Мы рекомендуем прочесть как минимум первые 6 глав книги и завершить указанный в ней проект. Это поможет лучше понять отношения между архитектурой компьютера и программным обеспечением, которое на ней работает.
Не ищите простого объяснения сложных вещей в этой книге — автор заходит издалека. Если конкретнее, то в книге, например, почти полностью отсутствуют два очень важных концепта в современной архитектуре ЭВМ — вычислительный конвейер и иерархия памяти.
Как только вы почувствуете себя в своей тарелке, читая эту книгу, смело переходите на Computer Organization And Design, отличный текст, который стал своего рода классикой. Также обратите внимание на курс CS61C, лекции которого доступны онлайн.
Алгоритмы и структуры данных
Алгоритмы Руководство По Разработке
Мы полностью согласны с народной мудростью, которая гласит, что знание алгоритмов и структур данных — один из важнейших аспектов изучения компьютерных наук. К тому же, это отличный способ потренироваться в способности решать разного рода задачи, которые пригодятся в любой области компьютерных наук.
Есть сотни книг для изучения алгоритмов, но наш фаворит — «Алгоритмы Руководство по разработке» от Стивена Скиена. Наш выбор пал именно на неё, потому что автор определенно любит то, что он делает и хочет донести свои знания до читателя.
Для тех же, кто предпочитает лекции в формате видео, Скиена предлагает свой онлайн-курс. Также следует обратить внимание на курс Тима Рафгардена, доступного на Lagunita (сервис от университета Стэнфорда) или на Coursera. Материал обоих авторов очень полезен и информативен и кому из них уделить внимание — решать вам.
Мы практикуемся, решая задачи на Leetcode, потому что их задачи кажутся нам наиболее интересными. К тому же у каждой задачи есть ветка обсуждения и прикрепленное решение для самопроверки. Стоит отметить, что подобного рода задачи могут являться вопросами на интервью и решение их может сыграть вам на руку в будущем трудоустройстве. Для проверки своего знания алгоритмов решите 100 случайных задач на Leetcode.
В завершение, мы настоятельно рекомендуем How to solve it — великолепный материал для практики решения задач. Подходит как тем, кто изучает компьютерные науки, так и математикам.
Математика для компьютерных наук
Mathematics for Computer Science
В каком-то смысле компьютерные науки — это лишь область прикладной математики. Пока некоторые программисты пытаются и возможно преуспевают в попытках оставаться вдали от математики, мы рекомендуем не уподобляться им и изучать её. Ведь знание математики даст вам значительную фору по сравнению с другими программистами, которые математику игнорируют.
В основе большая часть математики для компьютерных наук — дискретная математика, где слово «дискретная» — прямая противоположность слову «непрерывная» и, грубо говоря, является сборником интересных тем в прикладной математике, за пределами математического анализа. Немного расплывчато, согласны. Впрочем, это не так важно: можно поставить себе цель изучить базовую логику, комбинаторику, теорию вероятности, теорию графов, основы криптографии. Линейная алгебра не менее прочего заслуживает вашего внимания, особенно для изучения компьютерной графики или машинного обучения.
Хорошим началом изучения дискретной математики является сборник лекций от László Lovász. Профессор проделал хорошую работу, чтобы сделать математику понятной и интуитивной, так что его работы куда больше подойдут новичкам, чем формальные математические тексты.
Для большего погружения советуем Mathematics for Computer Science — записи с лекций по одноименному курсу MIT, которые по объёму тянут на полноценную книгу. Видео данных лекций, кстати, тоже в свободном доступе.
Для линейной алгебры мы предлагаем начать с плейлиста Основы линейной алгебры.
Операционные системы
Operating Systems: Three Easy Pieces
Operating System Concepts и Modern Operating Systems — классика в вопросе операционных систем. Обе довольно часто подвергались критике в основном за то, что не являются 1000-страничными быстроустаревающими энциклопедиями, новое издание которых приходится покупать каждые пару лет.
Существует ещё одна книга по операционным системам, которую мы также очень рекомендуем к ознакомлению. Three Easy Pieces: структура повествования книги делает её легкой к восприятию, а задания помогут закрепить полученные знания.
После прочтения указанных выше книг имеет смысл пройтись по конкретным операционным системам и прочесть следующее: A commentary on the unix operating system, The design and implementation of the freeBSD operating systems и Mac OS internals.
Идеальный способ закрепить полученные знания — это прочесть код небольшого ядра и внести в него свои изменения. Как вариант можно взять XV6 — современную реализацию 6 версии Unix для архитектуры x86, написанную на ANSI C. В приведённой выше Three Easy Pieces есть раздел с заданиями с XV6, полный интересных идей для потенциальных проектов.
Компьютерные сети
Computer Networking: A Top-Down Approach
Учитывая то, что львиная доля работы у программистов целиком и полностью опирается на веб-сервера, компьютерные сети — одна из самых важных областей компьютерных наук. Программисты-самоучки, которые методично изучают компьютерные сети, хвастают тем, что гораздо лучше многих понимают термины, концепты, протоколы, которыми постоянно окружены в своей карьере.
Наш фаворит в этом вопросе — Computer Networking: A Top-Down Approach. Небольшие проекты и задания для практики на протяжении всего материала весьма интересны и стоят вашего внимания. Также следует обратить внимание на Wireshark labs, любезно предоставленные автором книги.
Для тех же, кто предпочитает просмотр лекций чтению книг, мы рекомендуем серию лекций от университета Стэнфорд Stanford CS 144.
Небольшие проекты, как ни странно, более полезны для освоения компьютерных сетей, нежели задачки. Некоторые из них — HTTP сервер, чат-приложение на UDP, мини TCP stack или же распределённая таблица хэшей и т.д.
Базы данных
Readings in Database Systems
Изучение баз данных требует куда большего упорства, чем нужно для других тем, так как базы данных —относительно новая область компьютерных наук (с 1970-ых). Её основы скрыты от нас по вполне себе понятным коммерческим причинам. К тому же многие потенциальные авторы книг по базам данных предпочли сами стать разработчиками и основали свои компании.
Учитывая приведенные выше обстоятельства, мы настоятельно рекомендуем новичкам избегать книжек и начинать прямиком с записей CS186 весны 2015 от Джо Геллерштейна из университета Беркли. После данного курса уже можно переходить к книжкам.
Одна из них — это Architecture of a Database System от того же профессора из того же университета. Книга даст читателю углубленный взгляд на реляционные базы данных и послужит отличным скелетом для будущих знаний в этой области.
Readings in Database Systems, также известная как красная книга по базам данных (никто не вымирает), представляет собой сборник публикаций по данной теме. Для тех, кто осилил CS186, эта книга может стать следующей остановкой.
Если вы настаиваете на том, чтобы начинать изучение баз данных по книжкам, то советуем обратить внимание на Database management systems.
Сложно закрепить знания в этой области без практики. Студенты CS186 работают над дополнениями для Spark, однако лучшей практикой для начинающих будет всё же написание своей реляционной базы данных с нуля. Скорее всего, она поначалу не будет богата уникальными особенностями, но значительно укрепит ваше понимание темы.
Под конец, моделирование данных — один из самых пренебрегаемых аспектов в изучении баз данных. Здесь нашим фаворитом является Data and Reality: A Timeless Perspective on Perceiving and Managing Information in Our Imprecise World.
Языки и компиляторы
Compilers: Principles, Techniques and Tools
Большинство программистов изучают языки программирования, в то время как специалисты компьютерных наук пытаются понять, как эти языки работают. Эти знания позволяют им опережать своих коллег по карьерной лестнице и быстрее схватывать новый материал.
Классикой в данном вопросе является Compilers: Principles, Techniques and Tools. К сожалению, этот материал больше подходит учителям, нежели самоучкам. Однако книга отлично подойдёт для непоследовательного чтения, для выхватывания отдельных кусков из материала и изучения по ним. К тому же, если у вас будет учитель, это лишь ускорит ваше обучение.
Если же вы решите учиться по данной книге без учителя, то настоятельно рекомендуем обратить внимание на серию лекций от Алекса Айкена из Стэнфордского университета.
Потенциальной альтернативой этой книге может стать Language Implementation Patterns. Она написана с упором на инженеров, которые собираются практиковаться на языках вроде DSL.
В качестве проекта для закрепления материала можно написать свой компилятор для простенького языка вроде COOL. Те, кому данный проект кажется невыполнимым, могут начать с чего-то вроде Make a Lisp.
Распределённые системы
Distributed Systems, 3rd Edition by Maarten van Steen
Число компьютеров и их разнообразие увеличилось за последние несколько десятков лет. Если раньше крупные компании закупали огромные сервера для обеспечения работы каких-либо программ, то сегодня нам кажется очевидным тот факт, что даже самые незначительные программы работают на нескольких компьютерах одновременно. Распределённые системы — наука о том, как это обеспечить.
Книга, которую мы хотим посоветовать, — Distributed Systems, третье издание которой служит прекрасным дополнением всем предыдущим. Учитывая то, что распределенные системы — область, которая достаточно часто меняется, нет уникальной книги, которая проведёт вас по этому тернистому пути. Приведённая же выше книга, по нашему мнению, наиболее близка к этому идеалу.
Можно также обратить внимание на серию лекций MIT 6.824, но, к сожалению, качество записи звука оставляет желать лучшего.
Не имеет значения, какую книгу или сторонний ресурс вы выбрали для изучения распределённых систем, погружение в эту область компьютерных наук требует от студента чтения большого количества литературы. Здесь вы можете найти список полезных книг.
Часто задаваемые вопросы
Что насчет искусственного интеллекта и графики?
Мы постарались ограничить наш материал списком дисциплин, которым, как нам кажется, любой практикующий инженер должен владеть вне зависимости от специальности и индустрии. С таким фундаментом знаний вы сможете гораздо быстрее схватывать новый материал из книг или сторонних ресурсов. Что касается ИИ и графики, вот наш список рекомендуемых материалов:
Насколько важно строго следовать порядку, приведенному в статье?
На самом деле, все 9 дисциплин достаточно часто пересекаются. К примеру, возьмите дискретную математику и алгоритмы: изучение математики поможет вам в освоении алгоритмов. Знание алгоритмов, в свою очередь, даст стимул погрузиться в дискретную математику. В идеальном сценарии программист достаточно часто повторяет данный материал в своей карьере.
По существу наша последовательность сконструирована таким образом, чтобы помочь вам начать. Если у вас есть непреодолимое желание следовать другой последовательности, мы не настаиваем. Однако мы считаем, что освоить архитектуру ЭВМ нужно перед освоением операционных систем и баз данных, а компьютерные сети и операционные системы перед распределёнными системами.
Что общего у данного списка с Open Source Society или FreeCodeCamp?
Первый содержит слишком много дисциплин для изучения, предлагает не самые лучшие материалы для большинства из них и не даёт понять, какие аспекты конкретной дисциплины наиболее ценны. Мы же попытались ограничить наш материал списком дисциплин, которые должен знать каждый инженер, вне зависимости от специальности.
Касательно FreeCodeCamp, данный ресурс сконцентрирован на программировании, а не на компьютерных науках.
А где же язык X?
Изучение конкретного языка программирования — совершенно другая плоскость, нежели изучение компьютерных наук. Изучение языка программирования — задача наиболее простая и менее ценная. Если вы уже знаете пару-тройку языков, то советуем просто следовать нашему списку дисциплин, оставляя языки на потом. Если вы знаете программирование в целом достаточно хорошо и знаете, как работают компиляторы, вам потребуется не больше недели, чтобы выучить новый язык программирования.
Почему вы до сих пор рекомендуете книжку с драконами (Compilers: Principles, Techniques and Tools)?
Потому что книжка с драконами до сих пор является полным и актуальным источником информации по компиляторам. Проблема в том, что никто и предположить не мог, что в итоге книга окажется инструкцией для преподавателей по составлению учебной программы. Вы же можете воспользоваться этим для составления своей собственной программы или следуя программе какого-либо преподавателя.














