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

«Некоторые не понимают разницу компиляции/интерпретации». Зачем Computer Science?

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

О Computer Science нам рассказали Артем Перевозников, Director of Engineering @IDT Corporation (Минск) и Сергей Семенцов, Group Manager @iTechArt (Гомель) — практики со стажем более 10 лет в разработке. У обоих специалистов есть опыт преподавания, поэтому они с легкостью обозначили необходимый бэкграунд, который должен быть у каждого программиста, и поделились секретом, почему на Западе даже опытные разработчики изучают этот курс. Но обо всем по порядку…

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

О Computer Science нам рассказали Артем Перевозников, Director of Engineering @IDT Corporation (Минск) и Сергей Семенцов, Group Manager @iTechArt (Гомель) — практики со стажем более 10 лет в разработке. У обоих специалистов есть опыт преподавания, поэтому они с легкостью обозначили необходимый бэкграунд, который должен быть у каждого программиста, и поделились секретом, почему на Западе даже опытные разработчики изучают этот курс. Но обо всем по порядку…

Перспективы работы

Давайте сначала сравним виды рабочих мест и стажировок, которые вы можете пройти через каждую программу.

К счастью, веб-сайт Университета Ватерлоо предлагает несколько примеров.

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

Дисциплины

Программирование

Лучшая книга:

Структура и интерпретация компьютерных программ

Львиная доля студентов Computer Science начинают с «вводных курсов» по программированию. Однако такие курсы будут полезны не только новичкам, но и вполне себе специалистам, которые по какой-либо причине пропустили некоторые базовые для программирования вещи.

Мы рекомендуем взять во внимание классическую «Структуру и интерпретацию компьютерных программ». Прочтите как минимум три главы приведенной выше книги, выполняя упражнения для практики. Для тех, кому данная книга кажется слишком сложной, рекомендуется «How to design programs». Тем же, кому она наоборот кажется слишком лёгкой, следует обратить внимание на «Concepts, Techniques, and Models of Computer Programming».

Можно также послушать лекции университета MIT по данной теме. Как альтернативу мы рекомендуем прослушать лекции Брайана Харви из университета Беркли, особенно, если для вас это в новинку.

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

Архитектура ЭВМ

Лучшая книга:

Цифровая схемотехника и архитектура компьютера

Лучшая серия лекций: Berkeley CS 61C

Архитектура ЭВМ, также иногда называемая «компьютерными системами» или «организацией компьютера» — достаточно важная тема, описывающая работу аппаратного слоя, который лежит на уровень ниже, чем слой программного обеспечения. Пожалуй, самая недооцененная область среди инженеров-самоучек.

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

Лучшая серия лекций: Berkeley CS 162

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

Лучшая серия лекции: Stanford CS 144

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

Наш фаворит в этом вопросе — Computer Networking: A Top-Down Approach. Небольшие проекты и задания для практики на протяжении всего материала весьма интересны и стоят вашего внимания. Также следует обратить внимание на Wireshark labs, любезно предоставленные автором книги.

Для тех же, кто предпочитает просмотр лекций чтению книг, мы рекомендуем серию лекций от университета Стэнфорд Stanford CS 144.

Небольшие проекты, как ни странно, более полезны для освоения компьютерных сетей, нежели задачки. Некоторые из них — HTTP сервер, чат-приложение на UDP, мини TCP stack или же распределённая таблица хэшей и т.д.

Базы данных

Лучшая книга:

Обложка книги «Readings in Database Systems»

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, 3rd Edition by Maarten van Steen

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

Книга, которую мы хотим посоветовать, — Distributed Systems, третье издание которой служит прекрасным дополнением всем предыдущим. Учитывая то, что распределенные системы — область, которая достаточно часто меняется, нет уникальной книги, которая проведёт вас по этому тернистому пути. Приведённая же выше книга, по нашему мнению, наиболее близка к этому идеалу.

Можно также обратить внимание на серию лекций MIT 6.824, но, к сожалению, качество записи звука оставляет желать лучшего.

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

Перспективы трудоустройства

Как в России, так и в США, компьютерные науки — одна из самых бурно развивающихся областей экономики, поэтому поиск весьма неплохо оплачиваемой работы (при наличии необходимых навыков и образования) должен оказаться проще, чем для представителей других специальностей. Например, выпускники МФТИ, работающие в IT-сфере, по статистике Superjob, зарабатывают в среднем 130 000 рублей в месяц (речь идёт о выпускниках с опытом работы от года до пяти лет). Выпускники МИФИ и МГТУ им. Баумана могут рассчитывать на 100 000 рублей в месяц, МГУ — 90 000 рублей, ИТМО — 87 000.

При этом возможности, открывающиеся перед выпускниками ведущих американских вузов, конечно, несколько более радужные — это в первую очередь связано с тем, что большая часть ведущих IT-компаний находится именно в США. Среднестатистический выпускник бакалавриата по специальности Computer Science может рассчитывать на зарплату в $60 000 в год, а выпускник одного из ведущих вузов — примерно в полтора раза больше.

Конечно, не стоит забывать и о том, что российские выпускники вполне могут составить конкуренцию своим американским коллегам. Можно как поступить на PhD программы в США, так и устроиться на стажировку или работу сразу после окончания университета. Такой путь может быть не всегда простым, однако нехватка квалифицированных кадров диктует свои правила: IT-компании сегодня готовы нанимать высококлассных специалистов с любым гражданством.

Карта компьютерных наук

Откуда же берутся такие теоретические знания? Где им учат? Разумеется, в ВУЗах на специальности computer science, ведь она дает гораздо больше, чем просто умение писать программный код. Студенты, магистранты и аспиранты в computer science изучают теорию алгоритмов, структуры данных, основы операционных систем, вычислительную сложность, теорию языков программирования, машинное обучение и многое другое, не говоря уже о прикладной математике, требуемой для этого.

Специальность «программист» появилась в нашей стране в начале 50-х годов. Но как раз те, кто получил первое специальное образование в этой области, оказали основное влияние на развитие вычислительной техники в СССР. Один из таких пионеров теоретического и системного программирования — Андрей Петрович Ершов. Получив диплом программиста и защитившись на мехмате МГУ в 1957 году, он возглавил отдел теоретического программирования Вычислительного центра АН СССР. Андрей Петрович стал основателем Сибирской школы информатики и академиком АН СССР.

Современным программистам может показаться, что сегодня добиться успеха в ИТ можно и без образования, научившись всему самостоятельно. В качестве примера того, что достичь успеха может любой хакер-самоучка, часто рассматривают open source. Но при этом забывают о том, что основа больших open source проектов обычно создается профессионалами с соответствующим образованием. Так, создатель Linux Линус Торвальдс отучился в Университете Хельсинки восемь лет, получив магистерскую степень в computer science. Его выпускной проект, реализованный в рамках научной группы NODES, назывался «Linux: A Portable Operating System».

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

Задумайтесь, например, почему китайский веб-сайт производителя жевательной резинки Wrigley дает на главной странице ссылки на проекты в сфере социальной ответственности, а британский сайт встречает посетителя слоганом «Создаем простые удовольствия, чтобы украсить ваш день»? Почему на итальянской версии сайта знакомств Match.com одна фотография молодой пары, а на венесуэльской 24 фотографии, как молодых людей, так и людей среднего возраста?

Ответить на эти вопросы помогают теоретические статьи, основанные на работах нидерландских антропологов и психологов Фонса Тромпенаарса и Геерта Хофстеде. Их модели, разработанные в 70-80-е годы в процессе изучения кросс-культурных коммуникаций, легли в основу современных исследований культурных факторов в веб-дизайне.

Подробнее с этим анализом можно познакомиться в заметке Cross-Cultural Considerations for User Interface Design [4] , опирающейся на следующие научные публикации:

  • Cyr, D. (2008). Modeling Web Site Design Across Cultures: Relationships to Trust, Satisfaction, and E-Loyalty.Journal of Management Information Systems.
  • Eristi, S. (2009). Cultural Factors in Web Design. Journal of Theoretical and Applied Information Technology.

А вот еще несколько статей, иллюстрирующих разнообразие научных знаний о разработке ПО:

  • Социальные приложения как источник информации на рабочем месте [5]
  • Краудсорсинговый подход к упрощению интерфейса корпоративных приложений [6]
  • Подход к тестированию графических интерфейсов на основе байесовой модели [7]

4. Структуры данных (6 недель)

Чтобы разбираться в связных списках, очередях, множествах, хэш-таблицах, бинарных деревьях и других структурах данных, пройдите курс университета Сан Диего, в создании которого принял участие Михал Левин, читающий в Школе анализа данных курс «Алгоритмы и структуры данных поиска».

Советы для изучения Computer Science

Развивайте практические навыки в дисциплинах CS

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

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

Не ограничивайтесь одним курсом

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

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

Учитесь писать слова, а не только код

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

Оцените статью
Fobosworld.ru
Добавить комментарий

Adblock
detector