Какой методологии программного обеспечения мне следует руководствоваться при проведении исследований?

9

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

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

Мне предложили задать этот вопрос через час или два, когда я обнаружил, что функция r tableзависит от порядка векторов, а не от имени элементов, с которыми их сравнивать. Тогда я подумал, что должен был протестировать поведение и функции, которые я использовал, с некоторыми фиктивными данными. Но я использовал таблицу после того, как другой анализ привел к нехватке информации, поэтому я не мог следовать методологии разработки, основанной на тестировании (если я правильно понял). Тем не менее, я чувствую, что с некоторыми улучшениями в моем отношении к проекту я мог бы быть более эффективным, кроме выявления ошибок раньше, а также того, как и что искать в случае, если я сомневаюсь в результате, поэтому, пожалуйста, не сосредотачивайтесь только на этот пример ошибка.

Какая методология программного обеспечения лучше всего подходит для исследований?

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

Пример того, как я работаю:

Биолог имеет в виду вопрос и знает, что проведение эксперимента приведет к получению данных, представляющих интерес (т. Е. Уровней экспрессии генов в двух условиях), затем он / он устанавливает эксперимент и вспоминает образцы от 10 человек / мышей / крыс. Теперь я должен проанализировать эти данные для этих 10 образцов, используя существующие библиотеки и тесты (или внедряя новые тесты), но принимая во внимание вопрос, который имел в виду биолог (т.е. какие гены более выражены в одном состоянии, чем в другом). Структура такая же, как в предыдущих экспериментах (в которых участвовало 6 условий и другое животное), но статистический тест, нормализация, структура данных могут измениться. Поэтому я обычно копирую предыдущую версию и адаптирую ее к текущим потребностям.

ЛОП
источник
7
то, что ты Донг сейчас хорошо. Никакая методология не остановит вас на ошибках! просто убедитесь, что вы используете систему контроля версий и хорошо организовали свои кодовые базы.
gbjbaanb
Никакая методология не остановит ошибки. Но некоторые поймают ошибки раньше! Проектирование по контракту или контрактный дизайн.
Фрэнк Хайлеман,
Не могли бы вы уточнить ваше последнее предложение? Я не получил это вообще.
11
возможно en.wikipedia.org/wiki/Test-driven_development с некоторой автоматизированной структурой тестирования - небольшие тесты полезны для выявления ошибок, а более крупные тесты могут (приблизительно) отображаться в ваших гипотезах
david.libremone
1
@Llopis в идеале вы сначала пишете тест, он проваливается, затем пишете код, тест проходит, а затем вы фиксируете свой код - если вы обнаружите ошибку позже, вы напишите тест, который бы поймал ошибку, она потерпит неудачу , исправьте код, тест пройден, затем вы фиксируете свой код - вы не можете все предвидеть, но вы можете быть уверены, что то же самое больше не повторится
david.libremone

Ответы:

6

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

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

Он также предоставляет информационные указатели для тех, кто интересуется методологиями разработки программного обеспечения.

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


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


На вашем рабочем месте есть вещи, которых не хватало, и вещи, которые вы можете сделать.

Вещи, которые пропали без вести:

  • Отсутствие руководств
  • Отсутствие контроля или лица, чтобы задать вопросы
  • Нехватка наставников или программистов, которые разбираются в используемых вами инструментах (например, R)
  • Отсутствие повторного использования программного обеспечения, архивирования, контроля версий или документирования ранее разработанного программного обеспечения для целей повторяемости и обучения

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


Что вы можете сделать:

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

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

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

rwong
источник
Интересное сообщение об Институте Программной Устойчивости, спасибо! Я напишу свои собственные рекомендации по управлению кодом и данными, у меня есть руководитель, но он, кажется, не «разбирается в инструментах», я использую git, но я постараюсь следовать вашим советам по документации
llrs
ха да, вики ... за то, что попробовал несколько, я бы рекомендовал здесь dokuwiki.org/dokuwiki# . Прост в настройке и хранит документы в виде текстовых файлов, а не в базе данных. Я обнаружил, что это лучший баланс между простотой настройки, простотой использования и устойчивостью данных.
Newtopian
Проблемы в области компьютерных наук, которые описывает @rwong, присутствуют в большинстве институтов, в которых я работал (физика и астрономия)
Штеффен
2

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

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

Алгоритмическая точность

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

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

Versioning

Слишком часто эта часть не учитывается. Хорошая схема управления версиями для вашего кода и созданных пакетов / исполняемых файлов поможет в огромной степени поддерживать ваш прогресс в порядке. Чтобы выявлять ошибки или несоответствия, может помочь восстановление именно того кода, который использовался для создания ранее полученных результатов. Ветвление также может помочь при экспериментировании с различными подходами или алгоритмами.

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

Автоматизированная сборка

Следствие к пункту выше. Убедитесь, что вы максимально автоматизировали процесс сборки и упаковки вашего программного обеспечения. Вам не нужно идти полным ходом, просто достаточно сделать тривиальное создание окончательной системы из исходного кода и зависимостей. Цель здесь - сэкономить ваше время, а также получить воспроизводимое средство для воссоздания программного обеспечения из источника, включая зависимости и другие внешние факторы. Groovy, Maven, ant, Scons, cmake - это лишь небольшой пример инструментов автоматизации сборки и систем сценариев, которые могут помочь.

Если вы хотите пройти лишнюю милю, установите Jenkins или teamcity или любую другую систему непрерывной интеграции. Дополнительный бонус, если вам нужно поддерживать несколько серверов или рабочих для распределенных вычислений. Большинство из этих систем будут иметь средства, чтобы помочь в обслуживании. Кроме того, вы сможете полностью автоматизировать тестовые прогоны, поэтому вам не нужно ждать результатов, прежде чем продолжить, просто зафиксируйте и получите письмо позже. У меня была система, которая занимала часы, чтобы пройти тестовые наборы. Установка этой автоматизации была лучшей инвестицией моего времени. Особенно, если у вас уже есть сценарии для сборки всего.

Изоляция окружающей среды

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

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

Newtopian
источник
Я обычно оставляю код как есть, когда заканчиваю его, поэтому последняя версия - та, которая используется для вычислений, поэтому мне, возможно, придется ее улучшить. Что касается алгоритмической точности, разве я не должен предполагать, что библиотеки, которые я использую, работают правильно?
ЛОП
Вы можете, хотя я и раньше делал тесты на внешних зависимостях, но это было редко ... вам нужно тестировать свой собственный код, правильно ли вы использовали библиотеки? Сбоит ли он повторно (ваш код)? и т. д.
Ньютоп
0
  1. Вы можете использовать R? Вот для чего это.

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

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

Майк Данлавей
источник
1
Я использую R, надеюсь, мой код достаточно прост, чтобы обнаружить ошибки, которые я мог написать, и любую ошибку, которую я мог сделать. Я придерживаюсь стиля форматирования кода Google R и хотел бы думать, что комментарии полезны для объяснения того, почему я принимаю такие решения в коде.
ЛОП
@Llopis: Тогда я бы сказал, что вы на правильном пути.
Майк Данлавей,
@Llopis в групповой разработке программного обеспечения, члены команды обычно просят кого-то еще пересмотреть код, исходя из предположения, что больше глаз может поймать больше ошибок. К сожалению, в вашей ситуации никто не может проверить вашу, и культура секретности в исследованиях не позволит вам позволить другим (за пределами вашего разрешения на рабочем месте) просматривать ваш код.
Rwong
1
@ rwong, на самом деле, мне теперь разрешено делиться своим исследовательским кодом, так что любой может просмотреть его на github
llrs
@Llopis: все больше причин, чтобы сделать его читабельным. Одна вещь, которую я пытаюсь сделать, это дать очень маленькое руководство (в комментариях) по предмету, потому что, скорее всего, опыт читателя будет отличаться от моего.
Майк Данлавей,