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

Команда

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

А вы думали, достаточно пройти курс по C++?

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

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

«Учитывая стремительное развитие сферы программирования, все сложнее определить, что именно относится к современной информатике, как к науке. Вопрос «что должен знать каждый ученый-программист?» можно раскрыть с точки зрения четырех основных проблем:

  1. Какие знания необходимы каждому студенту, чтобы найти хорошую работу?
  2. Какие знания помогут студенту иметь хорошую работу на протяжении всей жизни?
  3. Какие знания нужны для поступления в аспирантуру?
  4. Какими знаниями нужно обладать, чтобы принести пользу обществу?

Ниже приведены как базовые принципы, так и особые, рекомендации, наиболее актуальные рекомендации.

Что лучше: портфолио или резюме?

Если учесть тот факт, что информатика сочетает в себе инженерные и математические принципы, принципы, логичным будет прием на работу выпускников на основе резюме. Однако резюме не дает полного понимания способностей кандидата в сфере программирования. Для каждого ученого в сфере компьютерных наук важно создать личное портфолио. Можно представить его в удобном формате собственного блога с постами о каждом новом успешном проекте или достижении. Самый удачный вариант портфолио включает отдельные страницы по каждому проекту и общедоступный код (его можно разместить на хосте Github или с помощью сервиса Google Code). Любые изменения в коде нужно линковать и фиксировать документально. Портфолио с примерами кода дает возможность работодателю оценить реальные способности программиста, в отличие от оценок GPA и стандартного резюме. Преподаватели должны разрабатывать для своих учеников курсовые проекты, которые они смогут дополнять в процессе обучения и дорабатывать по окончанию курса.

Правильная подача технической части работы в коммуникации с другими

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

Полезная практика для студентов — делать больше презентаций своих проектов в устной форме. Для создания визуальных самопрезентаций можно использовать PowerPoint или Keynote. Они лучше, чем статичные инструменты на основе LaTeX. Для подготовки документов с математическими расчетами LaTeX подходит лучше. Технические задания курса также рекомендуется подавать в LaTeX.

Инженерное ядро

Информатика — это не только инженерный подход, но именно с ним плотно связана компьютерная наука. Ученые-программисты плотно сотрудничают с инженерами. Обеим категориям специалистов важно говорить на одном языке, основанном на реальном анализе, линейной алгебре, вероятности и физике. Ученые в сфере программирования должны заниматься физикой через электромагнетизм. Для этого нужно провести многочисленные расчеты (и дифференциальные уравнения для измерений).

В создании звуковых симуляций значение линейной алгебры и вероятностей — неоценимо. Для интерпретации результатов не обойтись без четкого понимания статистики.

Философия Unix

Ученые в области компьютерных наук должны хорошо владеть навыками работы в Unix и понимать философию этой операционной системы с точки зрения вычислений. Философия Unix (в отличие от самой Unix) превозносит лингвистическую абстракцию и структуру на уровне с эффектом вычисления.

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

  1. управлять файловыми системами;
  2. создавать процессы с каналами;
  3. свободно редактировать файлы в Emacs и Vim;
  4. создавать, изменять и исполнять Makefile для программного проекта;
  5. писать простые скрипты оболочки.

Для полного понимания философии Unix студент должен до конца осознать ее силу. Ученикам рекомендуется давать полезные задания, в которых подчеркиваются преимущества Unix. Например:

  1. найти в заданном каталоге 5 папок, которые занимают место больше всех;
  2. сделать на компьютере выборку дубликатов файлов MP3 (по содержимому, а не по названию);
  3. отсортировать имена и фамилии с маленькой буквы и исправить на правильный вариант с большой;
  4. найти все слова с определенной второй буквой с начала или с конца;
  5. подключить микрофон к динамику другого компьютера через сеть;
  6. вывести на экран 10 последних ошибок доступа определенного IP-адреса к веб-серверу.

Системное администрирование

Некоторые ученые в сфере информатики с ухмылкой утверждают, что системное администрирование — это работа IT-специалистов. Бытует мнение, что любой ученый-разработчик может сам научится всему, что делает технический специалист. Теоретически — да. Однако на практике такой подход нельзя считать верным: ученые должны уметь грамотно и безопасно управлять своими собственными системами и сетями. Многие задачи в разработке программного обеспечения эффективно решаются и без участия системного администратора.

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

  1. устанавливать и управлять дистрибутивом Linux;
  2. настраивать и компилировать ядро ​​Linux;
  3. устранять неполадки соединения с помощью dig, ping и traceroute;
  4. компилировать и настраивать веб-сервер, например, Apache;
  5. компилировать и настраивать DNS такого сервера, как BIND;
  6. видоизменять сайт через текстовый редактор;
  7. отрезать и зажимать сетевой кабель.

Языки программирования

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

Самые важные языки

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

  1. Racket;
  2. C;
  3. JavaScript;
  4. Squeak;
  5. Java;
  6. Standard ML;
  7. Prolog;
  8. Scala;
  9. Haskell;
  10. C++;
  11. Assembly.

Racket

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

ANSI C

C — это сжатый, базовый для силиконовой долины язык. Без него не обходится ни одна встраиваемая программная система. В процессе изучения C дается полное понимание доминирующей архитектуры фон Неймана, что практически невозможно с другими языками. Плохо написанный, уязвимый код повышает вероятность переполнения буфера, поэтому важно использовать язык правильно.

JavaScript

JavaScript — хорошо реализованная семантическая модель, которая особо популярна в динамических языках высшего порядка, таких как Python, Ruby и Perl. Это родной язык web-разработки с уникальными возможностями для графики.

Squeak

Squeak — это современный диалект Smalltalk, самый чистый из объектно-ориентированных языков. Он передает всю суть термина «объектно-ориентированный».

Java

Java еще долгое время будет популярным, поэтому не стоит его игнорировать

Standard ML

Standard ML — это чистое воплощение системы Хиндли-Милнера. Система Хиндли-Милнера — одно из самых важных (но наименее известных) достижений в современном программировании. Несмотря на всю сложность, у системы быстрый вывод типов, что очень важно для самых востребованных программ. Расширенная система типов удобна для выражения сложных структурных инвариантов. Благодаря этой особенности, хорошо типизированные программы обычно вообще не содержат багов.

Prolog

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

Еще один язык логического программирования, на который стоит обратить внимание — это miniKanren. Он чист и логичен без исключений. Язык miniKanren обладает некоторыми несвойственными для Prologособенностями. Он послужил основой для альтернативного стиля логического программирования (репляционного).

Scala

Scala — хороший симбиоз функциональных и объектно-ориентированных языков программирования. Scala — это то, чем должен был стать Java. Язык основан на Java Virtual Machine, совместим с кодовыми базами Java и является наиболее вероятным его преемником.

Haskell

Haskell — это вишенка на торте языков Хиндли-Милнера. Он наиболее близок к чистому математическому программированию в сравнении с другими самыми распространенными языками.

ISO C++

ISO C++ — это зло во благо. Его нужно учить, и учить. Причем полностью. Ученые в области компьютерных технологий должны иметь полное представление о мета-програмировании.

Assembly

Сгодится любой язык ассемблера. Учитывая популярность x86 — это лучший вариант. Лучший способ изучения — через компиляторы. Только так формируется интуитивное представление о том, как будет преобразован код высокого уровня.

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

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