Каждый ученый должен знать немного о статистике: что означает корреляция, что такое доверительный интервал и так далее. Точно так же каждый ученый должен знать немного о компьютерах: вопрос в том, что? Что разумно ожидать, чтобы каждый работающий ученый знал о создании и использовании программного обеспечения? Наш список основных навыков - то, что люди должны знать, прежде чем они решат что-то с «облаком» или «peta» в его названии, - это:
- базовое программирование (циклы, условные выражения, списки, функции и файловый ввод / вывод)
- сценарий оболочки / основной оболочки
- контроль версий
- сколько стоит тестировать программы
- базовый SQL
В этом списке много чего нет : матричное программирование (MATLAB, NumPy и т. П.), Электронные таблицы при правильном использовании, они такие же мощные, как большинство языков программирования), инструменты автоматизации задач, такие как Make, и так далее.
Итак: что у тебя в списке? Как вы думаете, справедливо ли ожидать, что каждый ученый узнает в эти дни? И что бы вы вынули из списка выше, чтобы освободить место для этого? Ни у кого нет времени, чтобы все выучить.
Ответы:
«Computational Scientist» несколько широк, потому что включает людей, которые проводят численный анализ с использованием бумаги / LaTeX и проверочных концепций, людей, пишущих библиотеки общего назначения, и людей, разрабатывающих приложения, которые решают определенные классы проблем, и конечных пользователей, использующих эти Приложения. Навыки, необходимые для этих групп, различны, но есть большое преимущество в том, чтобы иметь некоторое представление о «полном стеке». Я опишу то, что я считаю критическими частями этого стека, люди, которые работают на этом уровне, конечно, должны иметь более глубокие знания.
Знание предметной области (например, физика и инженерия)
Каждый должен знать основы класса проблем, которые они решают. Если вы работаете с PDE, это будет означать некоторое общее знакомство с несколькими классами PDE (например, Пуассона, упругости и несжимаемой и сжимаемой Навье-Стокса), особенно то, какие свойства важны для «точного» захвата, а какие могут быть вплоть до дискретизации. ошибка (это информирует выбор метода относительно локальных консерваторов и симплектических интеграторов). Вы должны знать о некоторых функционалах и типах анализа, представляющих интерес для приложений (оптимизация подъема и перетаскивания, прогнозирование отказа, инверсия параметров и т. Д.).
Математика
Каждый должен иметь общее представление о классах методов, относящихся к их проблемной области. Это включает в себя основные характеристики разреженной и плотной линейной алгебры, наличие «быстрых методов», свойства пространственных и временных методов дискретизации и способы оценки того, какие свойства физической задачи необходимы для пригодности метода дискретизации. Если вы в основном конечный пользователь, эти знания могут быть очень высокого уровня.
Программная инженерия и библиотеки
Некоторое знакомство с техникой абстракции и дизайном библиотеки полезно почти каждому в вычислительной науке. Если вы работаете над методами проверки концепции, это улучшит организацию вашего кода (что облегчит кому-то еще «перевод» его в надежную реализацию). Если вы работаете над научными приложениями, это сделает ваше программное обеспечение более расширяемым и облегчит взаимодействие с библиотеками. Будьте осторожны при разработке кода, чтобы ошибки обнаруживались как можно раньше, а сообщения об ошибках были максимально информативными.
инструменты
Работа с программным обеспечением является важной частью вычислительной науки. Знание выбранного вами языка, поддержка редактора (например, теги, статический анализ) и инструменты отладки (отладчик, valgrind) значительно повышают эффективность вашей разработки. Если вы работаете в пакетной среде, вы должны знать, как отправлять задания и получать интерактивные сеансы. Если вы работаете со скомпилированным кодом, то знание компиляторов, компоновщиков и таких инструментов сборки, как Make, сэкономит много времени. Контроль версий важен для всех, даже если вы работаете в одиночку. Изучите Git или Mercurial и используйте его для каждого проекта. Если вы разрабатываете библиотеки, вы должны знать языковые стандарты достаточно полно, чтобы вы почти всегда писали переносимый код с первого раза, иначе вы будете погружены в запросы поддержки пользователей, когда ваш код не встроен в их классную среду.
Латекс
LaTeX является стандартом де-факто для научных публикаций и совместной работы. Умение работать с LaTeX важно для того, чтобы иметь возможность сообщать свои результаты, сотрудничать по предложениям и т. Д. Сценарии создания фигур также важны для воспроизводимости и происхождения данных.
источник
Я имею опыт работы в области компьютерных наук, поэтому мое мнение может быть немного предвзятым. Сказав это, я бы добавил «основные алгоритмы и структуры данных» в список. Под основами я имею в виду линейный поиск и сортировку, а также структуры данных, такие как сбалансированные деревья, кучи и / или хеш-таблицы.
Почему? Что ж, в большинстве вычислительных алгоритмов вы тратите невероятное количество времени и усилий на перемещение данных, а не вычисление чего-либо. Когда-нибудь реализовывать код конечного элемента? Это примерно 90% организации данных. Разница между выполнением этой задачи и выполнением ее хорошо может быть на порядок выше вычислительной эффективности.
Я хотел бы добавить еще один небольшой вопрос, связанный с информатикой, - краткое введение о том, как на самом деле работает процессор, в чем он хорош, а в чем - нет. Например:
Это мелкие скучные вещи, но объяснение занимает всего несколько минут, и, помня об этом, вы сможете написать хороший код с самого начала или разработать алгоритмы, не основанные на несуществующих аппаратных функциях.
Что касается того, что удалить из списка, я думаю, что SQL немного для вычислительных ученых. Кроме того, тестирование программного обеспечения важно, но это наука сама по себе. Модульное тестирование и правильные абстрактные типы данных - это то, чему следует учить с помощью базового программирования, и не требует двухлетней магистерской программы.
источник
Я мог бы добавить к этому позже, но для начала я бы взял «сценарии оболочки» и специально заменил его «сценариями 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.
источник
Математика с плавающей точкой Большая часть науки имеет дело с ценностями реального мира, а ценности реального мира часто представляются в компьютерном мире плавающей точкой. Есть много потенциальных ошибок с поплавками, которые могут нанести ущерб значимости результатов.
Кажется, что любимая ссылка на эту тему - «Что должен знать каждый компьютерщик об арифметике с плавающей точкой (1991)» Дэвида Голдберга http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.22.6768
источник
Вычислительный ученый должен обладать достаточными знаниями в области компьютерных наук, математики и области применения в науке / технике. Я бы включил навыки в каждой из следующих областей:
Математика:
Компьютерная наука:
Наука / Техника - зависит от приложения, в котором вы хотите специализироваться. В моем конкретном случае (инжиниринг) я бы добавил такие вещи, как механика сплошных сред, теплообмен, гидродинамика, метод конечных элементов и т. Д. Я бы сказал, что чем больше знакомых у вас есть несколько областей науки, тем более вы универсальны как вычислительный ученый.
источник
Отличный вопрос, за которым следуют увлекательные ответы! Я хотел бы добавить только одно небольшое дополнение. Насколько я знаю (я и опосредованно), инструмент «все в одном», как правило, действительно полезно знать. Таким инструментом может быть MATLAB, Octave или даже Python (с библиотеками). Всякий раз, когда у вас возникают проблемы в вашей «зоне комфорта», хорошей идеей (насколько я знаю и думаю) было бы попробовать свои силы в инструменте «все в одном». Вы можете попробовать написать свои собственные коды позже. Прелесть таких пакетов в том, что программирование не мешает пониманию того, что вы делаете.
Возьмите пример компьютерной графики. Написание кода для перевода, поворота или масштабирования фигуры - это 10 строк кода в MATLAB (вершины), но это может работать для страниц в C. Я не говорю, что C не очень хорошо. Все, что я хочу сказать, это то, что если у вас нет веских оснований для написания кодов на C, MATLAB будет более простым, лучшим и более интуитивным выходом.
Некоторые могут не согласиться и заявить, что C-подобное программирование - отличный способ построения интуиции. Может быть это. Но когда вам не приходится сталкиваться с проблемой более чем несколько раз, вряд ли стоит сидеть и писать свои собственные коды на языке, подобном C.
источник
Здравый смысл и интуиция ... Последнее приходит только со временем и после того, как «пережил» пару позорных переживаний в большом плохом мире.
источник