Мишель Тонутти, специалист по анализу данных Pacmed

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

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

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

В Pacmed группа специалистов по науке о данных занимается разработкой, тестированием и прототипированием моделей машинного обучения, которые используются в наших инструментах поддержки принятия клинических решений. Наши конечные продукты предназначены для внедрения и использования на практике в клиниках и больницах по всей Голландии, с конкретной целью: помочь врачам предоставить своим пациентам наилучшее лечение. Чтобы наше программное обеспечение было максимально точным, безопасным и надежным, его код должен быть абсолютно безупречным. Кроме того, наши процессы разработки программного обеспечения и обеспечения качества должны соответствовать международным стандартам и правилам в отношении медицинских устройств, чтобы получить необходимые сертификаты, позволяющие использовать программное обеспечение в клинических условиях.

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

Примечание. Мы предпочитаем Python, но его концепции применимы к любому языку программирования, который вы предпочитаете.

Шаг №0. Структурирование репозиториев

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

В Pacmed мы используем формат Cookiecutter для науки о данных, который является стандартизированным и логичным, но при этом очень гибким. Гибкость очень важна, поскольку мы не хотим полностью ограничиваться рамками, которые не соответствуют нашим целям. С другой стороны, мы хотим убедиться, что все проекты следуют одному и тому же базовому организационному подходу; это позволяет людям, которые не работают над проектом регулярно, найти то, что они ищут, или вернуться к старому коду и сразу узнать, что где находится. Например, код для инициализации, обучения и тестирования моделей прогнозирования будет находиться в папке models; код для создания функций из необработанных данных будет в features; функции для построения данных для анализа будут в визуализациях; и так далее.

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

Хорошая IDE - хорошая идея

Еще один простой способ повысить эффективность и избавиться от разочарований - это выбрать правильную интегрированную среду разработки (IDE). По сути, IDE - это программа или приложение, которое вы используете для написания кода.

Хорошая IDE должна быть универсальным мастером, выполняющим функции проверки орфографии, корректора, копирайтера, суфлера и справочника. Он предоставит вам автоматическое форматирование, предложения автозаполнения, документацию и бесконечное количество ярлыков для повышения производительности и минимизации возможности ошибок. Наши личные выборы - PyCharm и Atom. Для исследовательского моделирования и прототипирования мы также широко используем блокноты Jupyter, которые отлично подходят для интерактивного и совместного кодирования.

В целом, вероятно, лучше всего иметь доступ к комбинации вышеупомянутых инструментов: например, использовать Jupyter для кодирования исследовательского конвейера данных, при этом PyCharm или Atom открыты сбоку, чтобы иметь возможность эффективно просматривать исходный код. вашего репозитория.

Контроль версий: Git ’em all

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

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

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

  1. Принцип четырех глаз: код можно добавить в основную ветку вашего репозитория только в том случае, если он прошел проверку и одобрен (по крайней мере) другим человеком. В качестве дополнительного преимущества, если другие программисты проанализируют нашу работу, это также поможет улучшить собственные навыки программирования.
  2. Управление версиями: каждый раз, когда изменяется главная (основная) ветвь кодовой базы, ей присваивается номер версии. В любой момент в будущем мы будем знать, какую версию кода использовал каждый проект при выпуске в производство. Это также работает в малых масштабах: с помощью «контрольных точек», называемых коммитами, можно относительно безболезненно исправить роковые ошибки.
  3. Непрерывная интеграция и непрерывная доставка (CI / CD): набор принципов для автоматизации создания, тестирования, обновления и развертывания наших инструментов в производственных средах. Всякий раз, когда мы отправляем код в Git, серия автоматических тестов проверяет, что наш код не дает сбоев и не нарушает существующие функции и продукты.

… И многие другие преимущества. Больше не нужно злиться на своего товарища по команде за изменение очень важного фрагмента кода! Больше не будет головной боли, пытаясь выяснить, как исправить небольшую ошибку, не теряя при этом целый рабочий день! Конечно, если вы не знакомы с инструментами управления версиями, они могут показаться пугающими и чрезмерно сложными; но они резко увеличивают вашу продуктивность, и вы можете обнаружить, что программирование в команде может быть даже увлекательным (… в большинстве случаев).

Защитите (виртуальную) среду

Если вы собираетесь сотрудничать и работать над несколькими проектами одновременно, вы можете обнаружить, что требования к программному обеспечению для каждого из них могут сильно различаться. Виртуальные среды - отличный способ управлять пакетами Python независимо для каждого проекта путем создания изолированных деревьев каталогов, содержащих установку определенной версии Python. Для разных проектов могут быть установлены разные версии одного и того же пакета (или даже самого Python), и для каждого нужно только установить строго необходимые пакеты. Окружающая среда может и должна быть разделена между членами команды, чтобы можно было легко воспроизвести результаты. Еще одна приятная особенность сред состоит в том, что они могут содержаться в файлах с версией, что создает прекрасную синергию с Git. Каждая версия проекта сопровождается собственным файлом среды с точной версией пакетов, используемых на тот момент. Больше никаких проблем с несовместимостью и установкой!

Для создания виртуальных сред и управления ими мы предпочитаем Conda, поскольку он очень гибкий, поддерживает другие языки (например, R) и особенно совместим с Jupyter. Другие варианты - pipenv или virtualenv, оба из которых хорошо известны и признаны в сообществе Python.

Готов к кодированию!

К этому моменту мы рассмотрели необходимые основы для создания настройки для эффективного и продуктивного совместного кодирования и приступили к разработке надежных программ для медицинских приложений. Во второй части статьи мы поговорим о собственно процессе написания кода. Вы можете найти его здесь :

Https://medium.com/@Pacmedhealth/healthy-code-healthy-patients-coding-best-practices-in-medical-data-science-part-2-925a21c50b0a

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

Удачного кодирования!