Какими основными навыками должен обладать каждый ученый? [закрыто]

52

Каждый ученый должен знать немного о статистике: что означает корреляция, что такое доверительный интервал и так далее. Точно так же каждый ученый должен знать немного о компьютерах: вопрос в том, что? Что разумно ожидать, чтобы каждый работающий ученый знал о создании и использовании программного обеспечения? Наш список основных навыков - то, что люди должны знать, прежде чем они решат что-то с «облаком» или «peta» в его названии, - это:

  • базовое программирование (циклы, условные выражения, списки, функции и файловый ввод / вывод)
  • сценарий оболочки / основной оболочки
  • контроль версий
  • сколько стоит тестировать программы
  • базовый SQL

В этом списке много чего нет : матричное программирование (MATLAB, NumPy и т. П.), Электронные таблицы при правильном использовании, они такие же мощные, как большинство языков программирования), инструменты автоматизации задач, такие как Make, и так далее.

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

Грег Уилсон
источник
1
Отличный вопрос! Но мне не ясно одно: что вы имеете в виду под учеными в области вычислительной техники? Любой ученый, который использует вычисления? Или НАМНОГО меньшая группа людей, которые считают свое профессиональное звание «ученым в области вычислительной техники»?
Дэвид Кетчесон
9
Составить список вопросов не годятся в формате Stack Exchange. Мы действительно должны пройти через это на каждом сайте?
dmckee
4
@Dan Community Wiki не является оправданием для разрешения вопросов, не относящихся к сайту. Я также хотел бы призвать тех, кто отвечает, взять пример от Джеда и, по крайней мере, попытаться объяснить, почему вам нужны определенные навыки или не нужны другие
Ivo Flipse
5
@IvoFlipse: Это вопрос, который принадлежит сайту в той или иной форме. Возможно не как в настоящее время заявлено; возможно, его нужно взломать на более мелкие вопросы и перефразировать, но проблема плохой разработки программного обеспечения в вычислительной науке является чрезвычайно важной, особенно потому, что вычислительная наука как дисциплина все еще находится в стадии становления. Эта статья в Природе указывает, почему. Грег оказывает большую услугу сообществу вычислительных наук через свой веб-сайт.
Джефф Оксберри
5
Я не согласен с тем, что этот вопрос закрыт. Пожалуйста, смотрите (и голосуйте за) meta.scicomp.stackexchange.com/questions/179/…
Дэвид Кетчесон

Ответы:

46

«Computational Scientist» несколько широк, потому что включает людей, которые проводят численный анализ с использованием бумаги / LaTeX и проверочных концепций, людей, пишущих библиотеки общего назначения, и людей, разрабатывающих приложения, которые решают определенные классы проблем, и конечных пользователей, использующих эти Приложения. Навыки, необходимые для этих групп, различны, но есть большое преимущество в том, чтобы иметь некоторое представление о «полном стеке». Я опишу то, что я считаю критическими частями этого стека, люди, которые работают на этом уровне, конечно, должны иметь более глубокие знания.

Знание предметной области (например, физика и инженерия)

Каждый должен знать основы класса проблем, которые они решают. Если вы работаете с PDE, это будет означать некоторое общее знакомство с несколькими классами PDE (например, Пуассона, упругости и несжимаемой и сжимаемой Навье-Стокса), особенно то, какие свойства важны для «точного» захвата, а какие могут быть вплоть до дискретизации. ошибка (это информирует выбор метода относительно локальных консерваторов и симплектических интеграторов). Вы должны знать о некоторых функционалах и типах анализа, представляющих интерес для приложений (оптимизация подъема и перетаскивания, прогнозирование отказа, инверсия параметров и т. Д.).

Математика

Каждый должен иметь общее представление о классах методов, относящихся к их проблемной области. Это включает в себя основные характеристики разреженной и плотной линейной алгебры, наличие «быстрых методов», свойства пространственных и временных методов дискретизации и способы оценки того, какие свойства физической задачи необходимы для пригодности метода дискретизации. Если вы в основном конечный пользователь, эти знания могут быть очень высокого уровня.

Программная инженерия и библиотеки

Некоторое знакомство с техникой абстракции и дизайном библиотеки полезно почти каждому в вычислительной науке. Если вы работаете над методами проверки концепции, это улучшит организацию вашего кода (что облегчит кому-то еще «перевод» его в надежную реализацию). Если вы работаете над научными приложениями, это сделает ваше программное обеспечение более расширяемым и облегчит взаимодействие с библиотеками. Будьте осторожны при разработке кода, чтобы ошибки обнаруживались как можно раньше, а сообщения об ошибках были максимально информативными.

инструменты

Работа с программным обеспечением является важной частью вычислительной науки. Знание выбранного вами языка, поддержка редактора (например, теги, статический анализ) и инструменты отладки (отладчик, valgrind) значительно повышают эффективность вашей разработки. Если вы работаете в пакетной среде, вы должны знать, как отправлять задания и получать интерактивные сеансы. Если вы работаете со скомпилированным кодом, то знание компиляторов, компоновщиков и таких инструментов сборки, как Make, сэкономит много времени. Контроль версий важен для всех, даже если вы работаете в одиночку. Изучите Git или Mercurial и используйте его для каждого проекта. Если вы разрабатываете библиотеки, вы должны знать языковые стандарты достаточно полно, чтобы вы почти всегда писали переносимый код с первого раза, иначе вы будете погружены в запросы поддержки пользователей, когда ваш код не встроен в их классную среду.

Латекс

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

Джед браун
источник
7
Я согласен с Джедом. LaTeX абсолютно необходим! :)
Пол
1
Я бы поменял «Физику и технику» на предметную экспертизу. В конце концов, мы не все физики или инженеры. Дух этой части ответа находится в правильном месте, но есть довольно вопиющее предположение.
Fomite
Спасибо @EpiGrad, я изменил его на «знание предмета» с примерами.
Джед Браун
Хороший список. Базовое понимание проблем производительности должно быть там тоже. Я встречал слишком много людей, которые не понимают простую концепцию профилирования кода. Примечание: производительность должна означать не только проблемы со скоростью, но и использование памяти.
Фахим Митха
Проверь: "пробелмс" и "похоронен". SE не позволил бы мне их исправить - слишком маленькая правка.
Фахим Митха
26

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

Почему? Что ж, в большинстве вычислительных алгоритмов вы тратите невероятное количество времени и усилий на перемещение данных, а не вычисление чего-либо. Когда-нибудь реализовывать код конечного элемента? Это примерно 90% организации данных. Разница между выполнением этой задачи и выполнением ее хорошо может быть на порядок выше вычислительной эффективности.

Я хотел бы добавить еще один небольшой вопрос, связанный с информатикой, - краткое введение о том, как на самом деле работает процессор, в чем он хорош, а в чем - нет. Например:

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

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

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

Pedro
источник
2
Совсем не скучно. Я бы взял такой курс, если бы он предлагался. :-)
Фахим Митха
18

Я мог бы добавить к этому позже, но для начала я бы взял «сценарии оболочки» и специально заменил его «сценариями Python». Python гораздо более переносим, ​​чем сценарии оболочки, и более читабелен, чем сопоставимые языки оболочки и сценариев. Его большая стандартная библиотека и популярность в науках (за исключением, возможно, биологии, в которой также используется Perl) делают его отличным языком программирования , не говоря уже о хорошем первом языке для обучения программированию. В настоящее время это первый язык, который преподается в EECS в MIT, и он популярен на рынке труда, особенно в области научных вычислений. Его онлайновая документация обширна, и есть также несколько программных текстов, основанных на Python, доступных онлайн.

Используя Python, вы можете обучать основам программирования, а также сценариям. Кроме того, Python отлично поддерживает модульное тестирование, поэтому Python можно использовать и для обучения модульному тестированию. Python также имеет обширный API базы данных (который может заменить или увеличить необходимость в изучении SQL) и пару утилит для сборки, которые предлагают функциональность Make-like. Лично я предпочитаю SCons, а не Make, потому что я считаю, что Python легче документировать и тестировать, чем скрипты оболочки.

В конечном счете, мотивирующий принцип моего вопиющего шиллинга для Python - это эффективность. Намного проще упростить рабочий процесс, если вы можете выполнять большую часть своей работы на одном языке или одном инструменте, особенно если этот инструмент является выразительным языком сценариев. Конечно, я мог бы делать все на C, но моя программа будет в 5 раз длиннее, и есть вероятность, что мне не нужна скорость. Вместо этого я могу использовать Python для импорта данных из текстового файла, составления графика, вызова процедур оптимизации, генерации случайных переменных, построения моих результатов, записи результатов в текстовый файл и модульного тестирования моего кода. Если Python слишком медленный, можно обернуть Python вокруг кода C, C ++ или Fortran, который заботится о вычислительных задачах. Для меня Python - это универсальный магазин для большинства моих потребностей в научных вычислениях.

Python еще не совсем MATLAB; У SciPy и NumPy все еще есть способы пойти по функциональности, но с точки зрения общей полезности я использую Python для более широкого круга задач, чем MATLAB.

Джефф Оксберри
источник
7
Я не могу не согласиться с этим. Python - это головная боль для тех, кто сопровождает системы, так как это немного движущаяся цель. Специалисты в области вычислительной техники должны иметь базовые представления о bash или csh для наиболее элементарного склеивания элементов и выполнения заданий в системах, которые они могут использовать. Python великолепен, и я поддерживаю вас за то, чтобы выучить программистов, но не за счет какой-то элементарной оболочки.
Билл Барт
7
@BillBarth: Я думаю, что каждый ученый должен изучать базовый bash или csh для очень простых сценариев. Причина, по которой я рекомендую использовать Python для сценариев оболочки помимо этих базовых задач, заключается в том, что я унаследовал сценарий bash с тысячной строкой, который по сути запускает программу . Он передает файлы назад и вперед как семафоры, многократно вызывает PBS, и нет никакого способа проверить это вообще. Сценарии оболочки отлично подходят для небольших задач, но не для больших задач, и этот кошмар с клейкой лентой и жевательной резинкой стоил мне пару лет моей диссертации, поэтому я настаиваю.
Джефф Оксберри
2
Как я уже сказал, я не согласен с тем, что «выучить питон» может быть уместным для списка. Я просто не хочу делать это за счет "сценариев оболочки". И то, и другое важно, и никто не позволит вам запускать ipython в качестве оболочки, поэтому сценарии оболочки чрезвычайно важны.
Билл Барт
3
@BillBarth: Нигде я не предлагаю, чтобы Python заменил оболочку. Я только предлагаю Python заменить bash для сценариев; Я считаю, что если вы изучаете базовый bash, вы знаете достаточно для написания сценариев без управляющих структур, поэтому нет необходимости углубляться в «сценарии bash». Как только вы захотите включить управляющую структуру, вам следует переключиться на другой язык, потому что программирование на bash является головной болью для разработчиков программного обеспечения и библиотек.
Джефф Оксберри
1
+1. Python был моим основным языком программирования в течение некоторого времени. Это не идеально, но так будет до тех пор, пока кто-нибудь не изобрел идеальный язык программирования.
Фахим Митха
14

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

Кажется, что любимая ссылка на эту тему - «Что должен знать каждый компьютерщик об арифметике с плавающей точкой (1991)» Дэвида Голдберга http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.22.6768

Питер Рекоре
источник
1
Этот документ упоминался очень много раз на онлайн-форумах. Но это очень длинная и плотная статья, и я не уверен, сколько людей действительно смогли извлечь из этого что-то полезное.
Johngreen
12

Вычислительный ученый должен обладать достаточными знаниями в области компьютерных наук, математики и области применения в науке / технике. Я бы включил навыки в каждой из следующих областей:

Математика:

  1. Численный анализ
  2. Линейная алгебра
  3. Обыкновенные, частичные и / или стохастические дифференциальные уравнения
  4. оптимизация
  5. Статистика и / или вероятность
  6. Обратная теория

Компьютерная наука:

  1. Алгоритмы
  2. Структуры данных
  3. Параллельное программирование (MPI, OpenMP, CUDA и т. Д.)
  4. Научная визуализация
  5. Компьютерная архитектура
  6. Использование среды Linux

Наука / Техника - зависит от приложения, в котором вы хотите специализироваться. В моем конкретном случае (инжиниринг) я бы добавил такие вещи, как механика сплошных сред, теплообмен, гидродинамика, метод конечных элементов и т. Д. Я бы сказал, что чем больше знакомых у вас есть несколько областей науки, тем более вы универсальны как вычислительный ученый.

Пол
источник
Можете ли вы уточнить «Обратную теорию»?
Фахим Митха
1
@FaheemMitha: Традиционно мы сначала устанавливаем параметры модели (например, уравнение в частных производных), а затем наблюдаем за поведением системы. «Обратная проблема» делает обратное. Мы начнем с наблюдений за выходом системы и попытаемся определить параметры модели, которые производят эти наблюдения. Обратная теория описывает методы для решения этой задачи.
Павел
Спасибо за объяснение. У вас есть хорошая ссылка / ссылка на эту тему?
Фахим Митха
2
en.wikipedia.org/wiki/Inverse_problem - хорошее место для начала. space.fmi.fi/graduateschool/Lectures07/HK_inversion.pdf также имеет хороший обзор. Но для более углубленного понимания , я бы рекомендовал книгу как amazon.com/Parameter-Estimation-Inverse-Problems-Second/dp/...
Пол
4

Отличный вопрос, за которым следуют увлекательные ответы! Я хотел бы добавить только одно небольшое дополнение. Насколько я знаю (я и опосредованно), инструмент «все в одном», как правило, действительно полезно знать. Таким инструментом может быть MATLAB, Octave или даже Python (с библиотеками). Всякий раз, когда у вас возникают проблемы в вашей «зоне комфорта», хорошей идеей (насколько я знаю и думаю) было бы попробовать свои силы в инструменте «все в одном». Вы можете попробовать написать свои собственные коды позже. Прелесть таких пакетов в том, что программирование не мешает пониманию того, что вы делаете.

Возьмите пример компьютерной графики. Написание кода для перевода, поворота или масштабирования фигуры - это 10 строк кода в MATLAB (вершины), но это может работать для страниц в C. Я не говорю, что C не очень хорошо. Все, что я хочу сказать, это то, что если у вас нет веских оснований для написания кодов на C, MATLAB будет более простым, лучшим и более интуитивным выходом.

Некоторые могут не согласиться и заявить, что C-подобное программирование - отличный способ построения интуиции. Может быть это. Но когда вам не приходится сталкиваться с проблемой более чем несколько раз, вряд ли стоит сидеть и писать свои собственные коды на языке, подобном C.

расследование
источник
-1

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

GertVdE
источник
3
Я не знаю, действительно ли "интуиция" - это навык. Это скорее просто инстинктивная реакция на предыдущий опыт.
naught101