Роль ООП в гуманизации науки
Одна из утилитарных задач науки - сделать так, чтобы все изобретения человечества работали на человека и улучшали его жизнь. Например, моряки начали изучать звёздное небо, потому что оно позволило им ориентироваться посреди океана. Если научные открытия привязаны к неактуальным проблемам, нужны ли они?
Хотя, в принципе, мы всегда имеем шанс найти что-то новое там, что не изучили до конца. Но цель это статьи - показать, что программирование описывает идеальную научную структуру, позволяя перейти к систематизации, анализу и, наконец, к использованию научных знаний в единой среде.
Когда мы пишем на ЯП, мы позволяем действовать вычислительным машинам за нас. Функциональное программирование позволяет описывать действия, создавать новые уровни абстракций. ООП расширяет действия при помощи новых объектов, позволяя создавать определения и методы взаимодействия не функций и переменных, а новых сущностей, которые мы можем создавать сами.
Связь программирования и науки
Когда мы говорим о программировании, на самом деле мы имеем в виду, что хотим поручить компьютерам - нашим специально изобретённым машинам - какие-то вещи, в которых важна:
- Точность работы
- Скорость исполнения
- Возможность многократного использования.
В последнее время в науке всё чаще начинают исследовать не роль определённой дисциплины в мире, а сам мир при помощи сразу нескольких дисциплин. Это называется схоластическим подходом: вместо того, чтобы смотреть на вещи однобоко (например, на человека только с биологической точки зрения), мы смотрим на самого человека и описываем все процессы, которые в нём происходят, опираясь на несколько наук и в результате иногда находим точки соприкосновения между разными науками. Например, жизнь человека зависит от его органоидов, которые имеют в своём составе разнообразные углеводородные соединения, создающие такую конструкцию организма, что атмосферное давление воздуха не может расплющить его. Это - пример взаимодействия нескольких наук для объяснения влияния одних факторов на другие.
Python по умолчанию предоставляет пользователям возможность использовать парадигму, названную объектно-ориентированным программированием, для описания не только функций (каких-то определённых действий внутри одной программы), но и классов. Классы - это аналог любого явления, которое можно рассматривать со схоластической точки зрения. Например, класс Животное имеет определённые атрибуты - цвет кожи, наличие (отсутствие) шерсти, когтей, форму лап, другие параметры, - и методы - всё то, что сам объект может делать.
Согласно ООП, внутренние методы класса - это те методы, которые мы вызываем к конкретному объекту, то есть вызываем их с помощью имеющегося объекта, в то время как внешние (статические) методы класса - те методы, которые позволяют совершать действия без конкретного объекта, от имени всего класса. В научном контексте это можно интерпретировать и использовать как действия какого-то конкретного объекта (который можно классифицировать) и действия неисчисляемых, постоянных вещей. Например, гравитационное поле существует в принципе и обладает специальными методами - законами взаимодействия, едиными для всех объектов с массой, в то время как абстрактное царство Животных не может жить единым методом.
В то время как в Python не существует понятия приватных и публичных функций и атрибутов, и по умолчанию все атрибуты класса доступны отовсюду, это сильно упрощает разработку схоластической системы: можно опрашивать все объекты на наличие атрибута из специального метода, а не описывать для каждого класса метод, который будет определять поведение этого класса, когда у него спросят, есть ли у него атрибут массы (условно).
Проектирование научных исследований
Программирование мира начинается с описания базовых конструктов исследуемой системы. Если математический анализ начинается с множеств чисел и операций над ними, то экономика - с человека, физика - с мельчайших единиц энергии (или струн).
Ключевые процессы происходят во времени. Чтобы позволять любой системе существовать, нужно создать список всех объектов. У каждого объекта будет вызываться метод run, обязательный аргумент которого - какой-то отрезок времени time. Внутри метода в каждом объекте будут происходить собственные, заданные заранее - или полученные в результате хода работы - действия. Такой метод можно назвать временным моделированием системы.
Помните, что если вы делите время на меньшие отрезки, чтобы связать взаимодействие всех объектов, не забывайте, что не потраченное за запуск метода run время должно перейти на следующую итерацию, то есть сохраняйте время: self.time += time. Это нужно, например, для продолжительных действий.
Если у вас большое действие подразумевает выполнение других, вам нужно в метод Большого действия передавать время, чтобы Маленькие действия совершались по порядку и постепенно, а не тогда, когда накопится время, необходимое для всего Большого действия.
Правило создания обобщений
Если вы хотите не только моделировать системы, но и обобщать предыдущие правила и побочные эффекты, помните, что дискретных действий не так много, но именно они порождают всю кажущуюся хаотичность - и порядок. Например, четыре фундаментальных взаимодействия делают жизнь возможной. Как именно - наверняка никто не знает!
Тем не менее, от кварков переходят к ядрам, от атомов - к молекулам, от клеток - к высокоорганизованным организмам, от планет - к звёздным системам, от галактик - к скоплениям и т.д. Как это делать?
На каждом уровне есть две вещи: список объектов, которые мы хотим обобщить и перейти на более высокий уровень, и супервизор, который, явно или неявно, создаёт упорядоченную структуру. Например, пять собак - и их хозяин, а вместе они образуют кластер, который может успешно охотиться на крупную дичь или пересекать заснеженные земли на упряжке. Без хозяина собаки бы разбежались - или передрались (точно не знаем), точно так же и электрон сбежал бы от протона, если бы не существовало взаимодействия между заряженными частицами.
Если вы хотите создать обобщение, класс супервизора должен, используя строго определённые данные объектов, изменять другие их свойства. Хозяин должен снижать агрессивность собак относительно друг друга и пресекать их попытки нападения не на тех существ (например, на прохожих).
Дробление времени по-прежнему приветствуется, при этом на более высоких уровнях вы можете уже не писать маленькие единицы времени: вы скорее захотите узнать, что произойдёт с планетой через тысячу лет, чем через десять секунд (только если у вас там не будет ядерной войны).
Возьмите за правило, что метод run супервизора не должен вызывать методы run подчинённых ему объектов.
Правило внешней бюрократии
Если вы хотите знать, почему программа не работает - или, наоборот, как она работает и какие данные использует, вы можете логировать действия, то есть записывать всю последовательность работы в список и выводить на экран или в файл. Это не тратит внутреннего врмени self.time работы системы (но тратит реальное время вашего компьютера) и позволяет сохранять состояния для самостоятельного анализа.
Правило соединения двух и более плоскостей науки
Если мы в любой момент времени захотим расширить наши конструкты, добавить к ним новые описания свойств, следующих из более низких, и добавить им новые возможности, то нам понадобится всего лишь унаследовать классы конструктов от классов более низких конструктов.
Если мы исследуем экономическую систему и вдруг захотели расширить описание базового конструкта - человека - за счёт биологических составляющих (или с точки зрения эволюции), нам нужно просто добавить в класс Человека ещё одного родителя - Живое существо (с учётом того, что такой класс заранее описан в эволюционной системе).
Если у нас есть человек как единица в экономической системе и как единица в биологической системе, мы можем написать новый класс: class UnitedHuman(EconomicHuman, BiologicHuman). После этого нужно будет переопределить общие методы, чтобы не возникло ошибки, например, переопределить run(self, t, ...) и __init__(self, ...).
Тогда при запуске времени объект будет выполнять действия в качествах объектов одновременно двух систем.
Задание теоретического материала
Теорему нельзя описать на Python. Python - живой язык, потому что программирование заставляет действовать, а не существовать. Но можно задать супервизор, который будет при определённых условиях создавать новый объект.
Определения новых сущностей задаются при помощи создания классов. Таким образом, их удобно описывать и расширять.
Инструменты для работы
Как и в реальной жизни, нам нужно будет пересчитывать все теории при добавлении новых или изменении старых фундаментальных свойств конструктов, так и на компьютере нам нужно будет перезапустить код после изменения. Но иногда на компьютере система уровней может быть настолько большой, что перезапуск программы потребует большого количества времени и ресурсов.
Для уменьшения времени перезапуска используется Jupyter Notebook из пакета Anaconda (https://anaconda.com). В файлах IPYNP можно писать код по определённым кусочкам и перезапускать при изменениях только саму изменённую часть и тот код, который использует эту изменённую часть.
Также вполне вероятно, что на Python была написана какая-то библиотека, которая позволяет работать с вашей областью исследований. Например, в математике часто используются библиотеки NumPy, SymPy: import numpy as np и import sympy as sm. Библиотеки можно скачивать с сайта https://pypi.org/ или с помощью терминала: pip install numpy sympy.
Важные последствия
Когда мы будем использовать ООП в науке, это сделает не только науку доступнее всем слоям населения, приводя к её гуманизации и применению, но и позволит нам пользоваться тремя важными бенефитами, относящимися к упрощению работы.
Например, когда мы хотим разложить вектор по данному нам базису, но нам непонятно, что такое обратная матрица, мы можем посмотреть на метод вычисления обратной матрицы и повторить те действия, которые написаны интуитивно понятным языком, а потом просто посмотреть на всю последовательность действий и либо выполнить её самостоятельно, либо дозволить выполнение машине.
Когда мы захотим изменить какую-то важную вещь, нам не придётся искать нужный кусок кода, а просто перейти либо к описанию класса, либо к заданию объекта - и не вспоминать, как вы назвали тот вектор перемещения вашего спутника.
И, наконец, когда мы захотим узнать, как взаимодействуют несколько разных плоскостей науки на одних и тех же объектах, мы всего лишь объединим классы разных плоскостей, переопределим общие методы - и (при условии, что всё сделано правильно) будет происходить чудо.