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

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

Мы пишем числовые коды, чтобы получить решения задач. Решения должны быть в чем-то правильными и доставляться вовремя. Таким образом, основные требования к любым числовым кодам: (i) правильность, (ii) простота написания и (iii) высокая производительность.

Прежде всего, убедитесь, что ответы правильные

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

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

Требование тестирования обосновывает использование языка сценариев, такого как Python, в числовом коде, который предоставляет удобные средства запуска тестов (например, https://docs.pytest.org/en/stable/) и зрелую среду тестирования. (стандартная библиотека https://docs.python.org/3.10/library/unittest.html). При создании тестовых случаев необходимо часто настраивать параметры и конфигурации, а язык сценариев обеспечивает необходимую нам гибкость. Гибкость также порадует пользователей.

После проведения базового модульного тестирования служба непрерывной интеграции (например, GitHub Actions) еще больше повысит производительность и надежность вашего процесса разработки. Создание тестов — это самое важное для вашего кода.

Простота использования

Ученые и программисты думают по-разному. Даже для тех, кто работает в обоих мирах, обычно они играют только одну роль за раз. То есть легкое для программирования может оказаться нелегким для науки (или инженерного дела). Чтобы привести конкретный пример, программисты могут думать, что управлять поведением системы с помощью переменной среды просто (env MYSETTING=1 ./program должно «просто работать»), но ученые и инженеры могут обнаружить, что только новая запись в файле конфигурации имеет смысл для их работы. Работа.

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

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

Высокая производительность

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

Потребность в скорости не подлежит обсуждению. Предположим, что вам нужно, чтобы 1000 серверов работали в течение дня, чтобы завершить расчет. Падение производительности на 1% будет стоить вам 10 серверо-дней, а это довольно большие деньги. Вычислительные ресурсы дороже, чем программисты и пользователи. Нам понадобится что-то, что обеспечивает производительность, и обычно это C++.

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

На первый взгляд кажется, что использование C++ противоречит использованию языка сценариев, такого как Python, но это не так. C++ и Python очень хорошо работают вместе. Недавно проект pybind11 сделал объединение двух миров еще проще и мощнее. Требуется некоторое время, чтобы вникнуть в детали. В качестве начального шага мы можем просто иметь в виду, что наши системы могут в конечном итоге использовать C++ для скорости и Python для гибкости.

И больше …

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

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

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

Предстоит пройти долгий путь и написать много кода. Основные требования помогают нам узнать, что изучать в начале. На мой взгляд, изучение Python не может быть неправильным. Он предлагает большое количество готовых к использованию инструментов. Вы можете использовать его везде, не ограничиваясь числовым расчетом. Python очень дружелюбен к C, C++, Fortran и многим другим иностранным языкам. Это даст вам хороший старт!