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

Команда

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

Базы данных, искусственный интеллект, визуализация и другие простые радости жизни

Поделиться
Запинить
Отправить

Это перевод второй части большой статьи Мэтта Майта о навыках, которые в США считаются обязательными для специалистов в области computer science.

Первая часть.

Дискретная математика

Racket — это полнофункциональный диалект Lisp с чрезвычайно простым синтаксисом. Некоторым студентам даже этот синтаксис дается нелегко. Если у ученика возникают трудности с освоением такого легкого языка, ему стоит вообще задуматься, сможет ли он построить карьеру в сфере программирования. У Racket мощная макросистема и средства для программирования более высокого порядка, которые полностью стирают границы между данными и кодом. При правильной подаче, Lispдается очень легко.

Структуры данных и алгоритмы

Студенты должны обязательно изучать общие (или редкие, но очень эффективные) структуры данных и алгоритмы. Умение создавать алгоритмы гораздо важнее, чем знание структуры определенных данных или алгоритмов.


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

  1. хеш-таблицы;
  2. связанные списки;
  3. деревья;
  4. деревья двоичного поиска; а также
  5. направленные и ненаправленные графики.

Теория

Изучение теории — основа для исследований в аспирантуре. Теория особенно полезна в решении проблем для постановки жестких границ определенных понятий или, наоборот, иных способов интерпретации очевидных понятий. Вычислительная сложность может заслуженно считаться одной из немногих прогностических теорий во всей компьютерной «науке». Должно сформироваться понимание границ между строго вычислимыми и плавающими терминами.

На уровне бакалавра достаточно знания как минимум теории вычислительной сложности и моделей вычисления, понимания разницы между P, NP, NP-Hard и NP-Complete.

Архитектура

Четкое понимание архитектуры компьютера не заменишь никакими другими знаниями. Понимать устройство компьютера необходимо вплоть до транзисторов. Понимание архитектуры должно охватывать стандартные уровни абстракции: транзисторы, ворота, переключатели, мультиплексоры, флип-флопы, ALU, блоки управления, кэш и оперативная память. В скором будущем пригодится понимание GPU моделей для высокопроизводительных вычислений. Для полного представления о архитектуре машин, желательно самостоятельно спроектировать и представить модель небольшого процессора.

Операционные системы

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

Очень важная практика для студентов — самим поковыряться в операционных системах. Благодаря Linuxи виртуализации это проще простого. Для более глубокого понимания ядра можно попрактиковаться: прописать «hello world» во время загрузки;разработать собственный планировщик;изменить политику обработки страниц;создать свою файловую систему.

Создание сетей

Учитывая широкое применение сетей, необходимо точное понимание устройства сетевых коммутаторов и работы протоколов маршрутизации в сети. Ученый-программист не должен теряться в догадках, как работает механика построения эффективного и надежного протокола передачи (например, TCP) поверх ненадежного протокола передачи (например, IP). Ценится правильное понимание базовых принципов и умение выбирать тип протокола (специалист должен точно знать, когда выбирать TCP, и когда выбирать UDP).
Учитывая тот факт, что современный программист довольно часто сталкивается с сетевым программированием, полезно знать стандартные протоколы: 802.3 и 802.11; IPv4 и IPv6; DNS, SMTP и HTTP.

Для практики рекомендуется создать: HTTP-клиент и демон;DNS-преобразователь и сервер; Почтовую программу SMTP с командной строкой.

Безопасность

К сожалению, большинство проблем, связанных с безопасностью, возникают из-за ошибок в программном коде. Самое худшее то, что не во всех учебных заведениях программистов учат защищать свой код. Важно знать все способы взлома программ и моделировать возможные «атаки» со стороны, чтобы в процессе программирования не забывать о мерах безопасности.
Безопасность должна рассматриваться в любой дисциплине.

Каждый ученый в области компьютерных наук должен обладать знаниями в таких вопросах:

  1. социальная инженерия;
  2. переполнение буфера;
  3. целочисленное переполнение;
  4. уязвимость кода;
  5. состояние гонки;
  6. путаница с приоритетной очередностью в коде.

Приветствуются дополнительные знания в IT: правильный выбор безопасного пароля, настройка брандмауэра с помощью Iptables.

Криптография

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

  1. симметрические криптосистемы;
  2. криптосистемы с открытым ключом;
  3. защищенные функции хэширования;
  4. аутентификация методом «запрос-ответ»;
  5. алгоритмы цифровой подписи;
  6. пороговые криптосистемы.

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

Рекомендуется практиковать реализацию RSA создания консольных веб-клиентов, которые подключаются через SSL. В особых случаях, требуются знания, как использовать GPG, аутентификацию с открытым ключом для SSH или как зашифровать каталог, жесткий диск.

Тестирование программного обеспечения

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

UXD

Очень часто программисты пишут продкукты для других программистов, или, что еще хуже — для самих себя. Дизайн пользовательского интерфейса UI (или дизайн для пользовательского опыта в более широком смысле) может оказаться самым недооцененным аспектом научного программирования. Даже у профессоров бывает заблуждение, что UX (пользовательский опыт) — это нечто относительное и этому невозможно обучить. На самом деле, современный UX дизайн основан на базовых исследованиях человеческих факторов и промышленном проектировании. Каждый программист должен свободно владеть навыками проектирования веб-интерфейсов с технологиями HTML, CSS и JavaScript.

Визуализация

Хорошая визуализация — это, по сути, подача данных в формате информации для восприятия человеком. Это непростая задача. Сегодня мир — это безграничное море данных. Стоит полагаться лишь на ограниченные способности человека воспринимать их.

Параллелизм

Параллелизм вновь вернулся. Теперь он ужаснее, чем когда-либо. Суть в том, что для правильного использование параллелизма нужны глубокие знания архитектуры и много практики.

Однозначной точки зрения в отношении параллелизма в программировании нет. Однако появилось несколько решений для конкретной области. Сегодня стоит изучать CUDA и OpenCL. Потоки — это непростая абстракция для параллелизма. Рекомендуется изучать Pthreads — портативную библиотеку потоков. Для понимания крупномасштабного параллелизма рекомендуется MPI.

Инженерный подход в создании программного обеспечения

Принципы в разработке программного обеспечения меняются так же быстро, как и языки программирования. Хорошая командная практика в создании программного обеспечения дает более ясное представление обо всех «подводных камнях» в работе. Навыки управления и работы с большими массивами кода лучше оттачивать во время учебы, а не на первом месте работы.

Все студенты должны понимать устройство централизованных и распределенных систем контроля версий (например, SVN и GIT). Все более значимыми становятся знания таких инструментов отладки, как GDB и Valgrind

Формальные методы

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

Графика и симуляции

Построение графики требует множества «умных» и оптимизированных решений, поэтому дисциплина идеально подходит для изучения программирования. Эта область постоянно развивается. В графике и симуляциях можно найти много полезных примеров кода для изучения. Хороший способ попрактиковаться — создание 3D проекций в Wireframe 3D моделях.

Структуры данных (например, деревья BSP) и алгоритмы (к примеру, рендеринг z-буфер) — наглядные примеры умного дизайна. Но в графике и симуляции их гораздо больше.

Робототехника

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

Искусственный интеллект

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

Машинное обучение

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

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

Базы данных

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

Ученый-програмист, который умеет настраивать и управлять LAMP — это отличный вариант для работодателя.

компьютерное образование
Поделиться
Запинить
Отправить
Facebook YouTube Telegram