Задний план
В прошлом году я проходил стажировку в исследовательской группе по физике в университете. В этой группе мы в основном использовали LabVIEW для написания программ для управления нашими настройками, сбора данных и анализа наших данных. Для первых двух целей это работает нормально, но для анализа данных это настоящая боль. Вдобавок ко всему, все в основном были самоучками, поэтому написанный код, как правило, был довольно беспорядочным (неудивительно, что каждый доктор философии быстро решил все переписать с нуля). Контроль версий был неизвестен, и его невозможно было настроить из-за строгих правил программного обеспечения и сети со стороны ИТ-отдела.
На самом деле все обошлось на удивление хорошо, но как люди в естественных науках занимаются разработкой программного обеспечения?
Вопросы
Некоторые конкретные вопросы:
- Какие языки / среды вы использовали для разработки научного программного обеспечения, особенно для анализа данных? Какие библиотеки? (например, что вы используете для черчения?)
- Было ли обучение для людей без значительного опыта в программировании?
- Было ли у вас что-нибудь вроде контроля версий и отслеживания ошибок?
- Как бы вы попытались создать достойную среду для программирования, не слишком сильно мешая отдельным ученым (особенно физики - упрямые люди!)
Резюме ответов на данный момент
Ответы (или моя интерпретация их) на данный момент: (2008-10-11)
- Языки / пакеты, которые кажутся наиболее широко используемыми:
- Контроль версий используется почти всеми респондентами; отслеживание ошибок и другие процессы встречаются гораздо реже.
- Курс Software Carpentry - хороший способ научить ученых методам программирования и разработки.
- Как улучшить ситуацию?
- Не заставляйте людей соблюдать строгие протоколы.
- Создайте среду самостоятельно и покажите пользу другим. Помогите им самостоятельно начать работу с контролем версий, отслеживанием ошибок и т. Д.
- Обзор чужого кода может помочь, но имейте в виду, что не все это оценят.
Ответы:
Какие языки / среды вы использовали для разработки научного программного обеспечения, особенно? анализ данных? Какие библиотеки? (Например, что вы используете для черчения?)
Раньше я работал на Enthought , главного корпоративного спонсора SciPy . Мы сотрудничали с учеными из компаний, заключивших контракт с Enthought на разработку программного обеспечения на заказ. Python / SciPy казались удобной средой для ученых. Начать работать с ним гораздо менее пугающе, чем, скажем, с C ++ или Java, если вы ученый без опыта работы с программным обеспечением.
В дистрибутив Enthought Python входят все библиотеки для научных вычислений, включая анализ, построение графиков, трехмерную визуализацию и т. Д.
Было ли обучение для людей без значительного опыта в программировании?
Enthought действительно предлагает обучение SciPy, и сообщество SciPy довольно хорошо отвечает на вопросы в списках рассылки.
У вас было что-нибудь вроде контроля версий, отслеживания ошибок?
Да и да (Subversion и Trac). Поскольку мы работали совместно с учеными (и обычно удаленно от них), контроль версий и отслеживание ошибок были важны. Потребовалось некоторое обучение, чтобы научить некоторых ученых усвоить преимущества контроля версий.
Как бы вы попытались создать достойную среду для программирования, не слишком сильно мешая отдельным ученым (особенно физики - упрямые люди!)
Убедитесь, что они знакомы с цепочкой инструментов. Это требует вложения заранее, но это заставит их отказаться от них в пользу чего-то более знакомого (Excel). Когда инструменты подведут (а они откажут), убедитесь, что им есть куда обратиться за помощью - списки рассылки, группы пользователей, другие ученые и разработчики программного обеспечения в организации. Чем больше будет помощи, чтобы вернуть их к занятиям физикой, тем лучше.
источник
Курс Software Carpentry предназначен специально для людей, занимающихся научными вычислениями, и направлен на то, чтобы преподать основы и уроки программной инженерии, а также способы их наилучшего применения в проектах.
Он охватывает такие темы, как контроль версий, отладка, тестирование, создание сценариев и различные другие вопросы.
Я прослушал около 8 или 9 лекций и считаю, что их стоит очень рекомендовать.
Изменить: также доступны MP3-файлы лекций .
источник
Ядерная физика / физика элементарных частиц здесь.
Чтобы улучшить ситуацию:
Еще одно предложение по улучшению вещей.
источник
Это может быть немного косвенным, но, надеюсь, актуальным.
Раньше я работал в отделе исследований и разработок National Instruments, где писал программное обеспечение для наборов инструментов NI RF & Communication. Мы довольно часто использовали LabVIEW, и вот методы, которым мы следовали:
источник
Я не совсем естествоиспытатель (я изучаю транспорт), но я академик, который пишет много собственного программного обеспечения для анализа данных. Я стараюсь писать как можно больше на Python, но иногда мне приходится использовать другие языки, когда я работаю над расширением или настройкой существующего программного инструмента. В моей сфере обучения программированию очень мало. Большинство людей либо самоучки, либо изучили свои навыки программирования на занятиях, взятых ранее или вне дисциплины.
Я большой поклонник контроля версий. Я использовал Vault, работающий на моем домашнем сервере, для всего кода моей диссертации. Прямо сейчас я пытаюсь уговорить отдел настроить сервер Subversion, но предполагаю, что я буду единственным, кто его использует, по крайней мере, сначала. Я немного поигрался с FogBugs, но, в отличие от контроля версий, я не думаю, что это так же полезно для команды из одного человека.
Что касается поощрения других к использованию контроля версий и тому подобного, это действительно проблема, с которой я сейчас столкнулся. Я планирую заставить своих аспирантов использовать его в исследовательских проектах, которые они выполняют для меня, и поощрить их использовать его в своих собственных исследованиях. Если я буду преподавать курс, связанный с программированием, я, вероятно, заставлю студентов использовать контроль версий и там (оценивая их по тому, что находится в репозитории). Что касается моих коллег и их аспирантов, все, что я действительно могу сделать, - это сделать сервер доступным и полагаться на мягкое убеждение и подавать хороший пример. Честно говоря, на данный момент я думаю, что важнее заставить их делать регулярные резервные копии, чем получать их в системе контроля версий (некоторые люди носят с собой единственную копию своих исследовательских данных на USB-флешках).
источник
1.) Языки сценариев популярны в наши дни для большинства вещей из-за лучшего оборудования. Perl / Python / Lisp преобладают для легких приложений (автоматизация, легкие вычисления); Я вижу много Perl в своей работе (вычислительная ЭМ), поскольку нам нравится Unix / Linux. Для повышения производительности обычно используются C / C ++ / Fortran. Для параллельных вычислений мы обычно вручную распараллеливаем прогоны в EM, в отличие от того, чтобы программа выполняла это неявно (т.е. разделяла задания по углу обзора при вычислении радиолокационных сечений).
2.) Мы просто как бы добавляем сюда людей. Большая часть кода, который у нас есть, очень беспорядочный, но ученые, как правило, представляют собой группу рассеянных людей, которые не возражают против подобных вещей. Не идеально, но у нас есть дела, и мы сильно недоукомплектованы. Мы постепенно поправляемся.
3.) Используем SVN; однако у нас нет программного обеспечения для отслеживания ошибок. Примерно так же хорош, как и текстовый файл, который сообщает вам, где находятся конкретные ошибки.
4.) Мое предложение по внедрению лучших практик для ученых: делайте это медленно . Как ученые, мы обычно не отправляем продукцию. Никто в науке не делает себе имя, имея чистый, поддерживаемый код . Обычно они получают признание по результатам этого кода. Им нужно видеть оправдание тратить время на изучение практики программного обеспечения. Медленно вводите новые концепции и пытайтесь заставить их следовать; они ученые, поэтому после того, как их собственные эмпирические данные подтвердят полезность таких вещей, как контроль версий, они начнут использовать его постоянно!
источник
Я настоятельно рекомендую прочитать «Что должен знать каждый компьютерный ученый об арифметике с плавающей точкой» . Многие проблемы, с которыми я регулярно сталкиваюсь, возникают из-за проблем с программированием с плавающей запятой.
источник
Я физик, работающий в области физики конденсированного состояния, построение классических и квантовых моделей.
Языки:
Библиотеки:
Графика:
Инструменты разработки:
источник
Я работаю физиком в британском университете.
Возможно, мне следует подчеркнуть, что разные области исследований по-разному акцентируют внимание на программировании. Физики элементарных частиц (например, dmckee) почти исключительно занимаются вычислительным моделированием и могут сотрудничать в больших проектах программного обеспечения, тогда как люди в таких областях, как моя собственная (конденсированная материя), пишут код относительно редко. Я подозреваю, что большинство ученых попадают в последний лагерь. Я бы сказал, что навыки программирования обычно считаются полезными в физике, но не важными, так же как навыки физики / математики считаются полезными для программистов, но не важными. Имея это в виду...
Обычно анализ данных и построение графиков выполняются с использованием общих пакетов анализа данных, таких как IGOR Pro , ORIGIN , Kaleidegraph, которые можно рассматривать как «Excel плюс». Эти пакеты обычно имеют язык сценариев, который можно использовать для автоматизации. Более специализированный анализ может иметь специальную утилиту для работы, которая, как правило, была написана очень давно, ни у кого нет исходного кода, и в ней довольно много ошибок. Некоторые другие технические специалисты могут использовать упомянутые языки (Python, R, MatLab с Gnuplot для построения графиков).
Программное обеспечение управления обычно создается в LabVIEW, хотя на самом деле мы используем Delphi, что несколько необычно.
Я был на семинарах по грид-вычислениям, 3D-визуализации, ускорению обучения и т. Д., Проводимых обоими университетами, в которых я был. В бакалавриате нас учили VBA для Excel и MatLab, но C / MatLab / LabVIEW более распространены.
Нет, хотя у людей есть установки на личное развитие. Наша база кода находится в общей папке на «сервере», которая поддерживается в актуальном состоянии с помощью инструмента синхронизации.
Шаг за шагом! Я пытаюсь заменить общую папку чем-то более надежным, возможно, поможет найти клиент SVN, который имитирует текущее поведение инструментов синхронизации.
Я бы сказал, что в целом для большинства естественнонаучных проектов лучше потратить время на исследования!
источник
Бывший академик-физик, а теперь физик-промышленник из Великобритании:
Какие языки / среды вы использовали для разработки научного программного обеспечения, особенно? анализ данных? Какие библиотеки? (Например, что вы используете для черчения?)
В наши дни я в основном использую MATLAB (простой доступ к функциям визуализации и математике). Раньше я много использовал Фортран и IDL . Я использовал C (но я больше читатель, чем писатель C), макросы Excel (уродливые и запутанные). В настоящее время мне нужно уметь читать Java и C ++ (но я действительно не могу программировать на них), и я также взломал Python. Для собственного развлечения я сейчас занимаюсь программированием на C # (в основном для обеспечения переносимости / низкой стоимости / красивых интерфейсов). Я могу писать Fortran практически на любом языке, который мне представлен ;-)
Было ли обучение для людей без значительного опыта в программировании?
В большинстве (всех?) Бакалаврских курсах физики будет небольшой курс программирования, обычно на C, Fortran или MATLAB, но это настоящие основы. Я действительно хотел бы в какой-то момент пройти обучение в области разработки программного обеспечения (контроль версий / тестирование / проектирование систем среднего масштаба)
У вас было что-нибудь вроде контроля версий, отслеживания ошибок?
Я начал использовать Subversion / TortoiseSVN относительно недавно. Группы, с которыми я работал в прошлом, использовали контроль версий. Я не знаю ни одной академической группы, которая использует официальное программное обеспечение для отслеживания ошибок. Я до сих пор не использую никаких систематических тестов.
Как бы вы попытались создать достойную среду для программирования, не слишком сильно мешая отдельным ученым (особенно физики - упрямые люди!)
Я бы попытался представить некоторые идеи программной инженерии на уровне бакалавриата, а затем закрепить их на практике на уровне магистратуры, а также предоставить указатели на такие ресурсы, как упомянутый выше курс Software Carpentry.
Я ожидал, что значительная часть академических физиков будет писать программное обеспечение (хотя и не обязательно все), и они остро нуждаются, по крайней мере, в введении в идеи программной инженерии.
источник
Python, NumPy и pylab (построение графиков).
Нет, но я работал в мультимедийной исследовательской лаборатории, поэтому почти у всех было образование в области информатики.
Да, Subversion для контроля версий, Trac для отслеживания ошибок и вики. Вы можете получить бесплатный хостинг для отслеживания ошибок / контроля версий на сайте http://www.assembla.com/, если их TOS подходят вашему проекту.
Убедитесь, что инфраструктура настроена и поддерживается в хорошем состоянии, и попытайтесь продать преимущества контроля версий.
источник
Я статистик в университете в Великобритании. Обычно люди здесь используют R для анализа данных, его довольно легко изучить, если вы знаете C / Perl. Его реальная сила в том, что вы можете импортировать и изменять данные в интерактивном режиме. Очень легко взять несколько файлов CSV (или Excel) и объединить их, создать новые столбцы на основе других, а затем добавить их в GLM, GAM или другую модель. Построение графиков тоже тривиально и не требует знания совершенно нового языка (например, PGPLOT или GNUPLOT). Конечно, у вас также есть преимущество наличия множества встроенных функций (от простых вещей, таких как среднее значение, стандартное отклонение и т. Д.). путь к нейронным сетям, сплайнам и построению GL.)
Сказав это, есть пара проблем. С очень большими наборами данных R может стать очень медленным (я действительно видел это только с наборами данных> 50 000x30), и, поскольку он интерпретируется, вы не получаете преимущества Fortran / C в этом отношении. Но вы можете (очень легко) заставить R вызывать разделяемые библиотеки C и Fortran (либо из чего-то вроде netlib, либо из тех, что вы написали сами). Итак, обычный рабочий процесс будет заключаться в следующем:
Что мне очень нравится.
Я один из немногих в своем отделе (из> 100 человек), использующих контроль версий (в моем случае использую git с githuib.com). Это довольно тревожно, но они, похоже, не хотят его пробовать. out и довольны распространением zip-файлов (фу.)
Я предлагаю продолжить использование LabView для приобретения (и, возможно, попытаться убедить ваших коллег согласовать набор инструментов для приобретения и сделать доступным для всех), а затем перейти к экспорту данных в CSV (или аналогичный) и делать анализ в R. В этом отношении действительно очень мало смысла изобретать колесо заново.
источник
Какие языки / среды вы использовали для разработки научного программного обеспечения, особенно? анализ данных? Какие библиотеки? (Например, что вы используете для черчения?)
LabVIEW преподавал на физическом факультете моего бакалавриата. классы и широко использовал их в своих исследовательских проектах.
Другая альтернатива - MATLAB , в которой у меня нет опыта. Есть лагеря для любого продукта; у каждого есть свои преимущества / недостатки. В зависимости от того, какие проблемы вам нужно решить, один пакет может быть предпочтительнее другого.
Что касается анализа данных, вы можете использовать любой тип вычислителя чисел. В идеале вы можете выполнять сложные вычисления на языке X и форматировать выходные данные для удобного построения графиков в Excel, Mathcad , Mathematica или в любой другой системе построения графиков. Не ждите здесь стандартизации.
У вас было что-нибудь вроде контроля версий, отслеживания ошибок?
Оглядываясь назад, мы этого не сделали, и нам всем было бы легче, если бы мы это сделали. Нет ничего лучше, чем сломать все и часами бороться за это!
Определенно используйте систему контроля версий для любого распространенного кода. Поощряйте людей писать свой код таким образом, чтобы его можно было сделать более общим. На самом деле это просто лучшие практики кодирования. На самом деле, вы должны попросить их преподавать (или брать) уроки информатики, чтобы они могли получить основы.
Как бы вы попытались создать достойную среду для программирования, не слишком сильно мешая отдельным ученым (особенно физики - упрямые люди!)
Существует четкое разделение между сбором данных (DAQ) и анализом данных. Это означает, что можно стандартизировать DAQ, а затем позволить ученым поиграть с данными в программе по своему выбору.
источник
Еще один хороший вариант - Scilab . В нем есть графические модули типа LabVIEW , собственный язык программирования, и вы также можете встраивать, например, код Fortran и C. Он используется в государственном и частном секторах, в том числе в крупных промышленных компаниях. И это бесплатно.
Что касается управления версиями, некоторые предпочитают Mercurial , поскольку он дает больше свободы в управлении и определении репозиториев. Однако у меня нет опыта с этим.
Для построения я использую Matplotlib . Скоро мне придется делать анимацию, и я видел хорошие результаты с использованием MEncoder . Вот пример, включающий звуковую дорожку.
Наконец, я предлагаю использовать модульный принцип, то есть стараться хранить основные фрагменты кода в разных файлах, чтобы облегчить пересмотр, понимание, обслуживание и улучшение кода. Я написал, например, модуль Python для проверки целостности файлов, другой модуль для последовательностей обработки изображений и т. Д.
Вам также следует подумать о разработке с использованием отладчика, который позволяет вам проверять содержимое переменных в устанавливаемых точках останова в коде вместо использования строк печати. Я использовал Eclipse для разработки Python и Fortran (хотя у меня возникла ложная ошибка при компиляции с ним короткой программы Fortran, но, возможно, это была плохая конфигурация), и я начинаю использовать Eric IDE для Python. Он позволяет вам отлаживать, управлять версиями с помощью SVN , у него есть встроенная консоль, он может выполнять рефакторинг с помощью Bicycle Repair Man (он также может использовать другой), у вас есть Unittest и т. Д. Более легкая альтернатива для Python - IDLE , в комплекте с Python, начиная с версии 2.3.
В качестве подсказки я также предлагаю:
Без использования односимвольных переменных. Если вы захотите выполнить поиск по внешнему виду, вы получите результаты везде. Некоторые утверждают, что приличная среда IDE делает это проще, но тогда вы будете зависеть от постоянного доступа к среде IDE. Даже использования ii, jj и kk может быть достаточно, хотя этот выбор будет зависеть от вашего языка. (Двойные гласные будут менее полезны, если, например, комментарии к коду будут сделаны на эстонском языке).
Комментируем код с самого начала.
Для критических приложений иногда лучше полагаться на более старые версии языка / компилятора (основные выпуски), более стабильные и лучше отлаженные. Конечно, у вас может быть более оптимизированный код в более поздних версиях, исправленные ошибки и т.д., но я говорю об использовании Fortran 95 вместо 2003, Python 2.5.4 вместо 3.0 или около того. (Особенно, когда новая версия нарушает обратную совместимость.) Множество улучшений обычно приводят к множеству ошибок. Тем не менее, это будет зависеть от конкретных случаев применения! Обратите внимание, что это личный выбор, многие люди могут возразить против этого.
Используйте резервное и автоматическое резервное копирование! (С контролем версий).
источник
Определенно, используйте Subversion для сохранения текущих, незавершенных и стабильных моментальных копий исходного кода. Сюда входят C ++, Java и т. Д. Для собственных программных средств и быстрые сценарии для одноразовой обработки.
Учитывая сильную склонность науки и прикладной инженерии к методологии разработки «одиноких ковбоев», обычная практика организации репозитория в виде ствола, тегов и всего остального - не беспокойтесь! Ученые и их лаборанты любят вращать ручки, двигать электроды и искать утечки вакуума. Достаточно работы, чтобы все согласились, скажем, с Python / NumPy или следовали некоторому соглашению об именах; забудьте о попытках заставить их следовать тайным практикам и соглашениям разработчиков программного обеспечения.
источник
Что касается управления исходным кодом, централизованные системы, такие как Subversion , лучше подходят для научного использования из-за четкой единой точки истины (SPOT). Ведение журнала изменений и возможность вспомнить версии любого файла, не пытаясь понять, где что-то найти, имеет огромные преимущества для ведения учета. Такие инструменты, как Git и Monotone : о, черт возьми, какой хаос, который я могу представить, последует! Наличие четких записей о том, какая версия сценариев хакерских работ использовалась при игре с новым датчиком, когда прошел бозон Хиггса или взорвалась сверхновая, приведет к счастью.
источник
Языки, которые я использовал для числовых и научных данных:
Мой редактор - Emacs, хотя я использую vim для быстрых вещей, таких как редактирование файлов конфигурации.
Для черчения я обычно создаю текстовый файл и загружаю его в gnuplot.
Для анализа данных я обычно создаю текстовый файл и использую GNU R.
Я вижу здесь множество людей, использующих FORTRAN (в основном 77, но около 90), много Java и немного Python. Мне они не нравятся, поэтому я их не использую.
Я думаю, что это не относится ко мне, так как я получил высшее образование в области CS - но там, где я работаю, нет формального обучения, но люди (инженеры, физики, математики) действительно помогают друг другу.
Контроль версий абсолютно важен! Я храню свой код и данные на трех разных машинах, в двух разных концах света - в репозиториях Git. Я синхронизирую их все время (так что у меня есть контроль версий и резервные копии!) Я не занимаюсь контролем ошибок, хотя могу начать это делать. Но мои коллеги вообще не знают BTS или VCS.
Во-первых, я бы дал им как можно больше свободы. (В университете, где я работаю, я мог выбирать между тем, чтобы кто-то установил Ubuntu или Windows, или мою собственную ОС - я решил установить свою собственную. У меня нет поддержки от них, и я несу ответственность за все, что происходит с мои машины, включая вопросы безопасности, но я делаю с машиной все, что хочу).
Во-вторых, я бы посмотрел, к чему они привыкли, и заставил бы это работать (нужен FORTRAN? Мы его настроим. Нужен C ++? Нет проблем. Mathematica? Хорошо, купим лицензию). Затем посмотрите, сколько из них хотели бы изучить «дополнительные инструменты», которые помогут им быть более продуктивными (не говорите «разные» инструменты. Скажите «дополнительные», чтобы не казалось, что кто-то «проиграет» или «позволит» идти "или что-то еще). Начните с редакторов, посмотрите, есть ли группы, которые хотели бы использовать VCS для синхронизации своей работы (эй, вы можете оставаться дома и отправлять свой код через SVN или GIT - разве это не здорово?) И так далее. Не навязывайте - покажите на примерах, насколько круты эти инструменты. Проведите анализ данных с помощью R и покажите им, насколько это просто. Покажите красивую графику и объясните, как вы ее создали (но начните с простых примеров,
источник
Я бы предложил F # в качестве потенциального кандидата для выполнения манипуляций, связанных с наукой, учитывая его сильную семантическую связь с математическими конструкциями.
Кроме того, поддержка единиц измерения, о которой здесь написано, имеет большой смысл для обеспечения правильного преобразования между математической моделью и исходным кодом реализации.
источник
Прежде всего, я определенно выбрал бы язык сценариев, чтобы избежать необходимости объяснять множество лишних вещей (например, ручное управление памятью - в основном - нормально, если вы пишете низкоуровневые, чувствительные к производительности вещи, но для тех, кто просто хочет использовать компьютер в качестве усовершенствованного научного калькулятора, это определенно перебор). Кроме того, посмотрите, есть ли что-то особенное для вашего домена (например, R для статистики). Это имеет то преимущество, что уже работает с концепциями, с которыми пользователи знакомы, и имеет специализированный код для конкретных ситуаций (например, расчет стандартных отклонений, применение статистических тестов и т. Д. В случае R).
Если вы хотите использовать более общий язык сценариев, я бы выбрал Python. Для этого есть две вещи:
В качестве дополнительного преимущества у него есть библиотеки для большинства вещей, которые вы хотели бы с ним делать.
источник
Я не специалист в этой области, но я всегда понимал, что MATLAB создан именно для этого. Также есть способ интегрировать MATLAB с SVN для управления версиями .
источник