Recentemente eu tive contato com uma disciplina chamada Ciência de Sistemas, ou Systems Science. Achei bastante curioso e resolvi estudar mais sobre o tema. Essa decisão me fez comprar um livro acadêmico sobre o tema: Principles of Systems Science.
O livro foi escrito por um professor de computação e um de filosofia e confesso que isso parece estranho. Mas estou me divertindo. Antes que você me entenda mal, o livro não é divertido, é um livro sério, mas eu me divirto quando estudo assuntos não correlacionados e faço relações.
Primeiro ponto é que é óbvio que o livro pode ser lido sob o viés de um desenvolvedor. Nós escrevemos sistemas de software que interagem com outros sistemas. Quando o sistema fica complexo, nós quebramos esse sistema em outros sub-sistemas. Isso se correlaciona diretamente com a primeira característica dos sistemas: Sistemicidade (do inglês systemness).
Todo sistema é constituído de sistemas e pertence a um sistema. Apenas o universo, até onde se sabe, não está contido em outro sistema. Isso me lembra muito a definição de Sistemas Distribuídos proposta por van Steen e Tanenbaum: Um Sistema Distribuído são um conjunto de elementos computacionais autônomos que aparentam ser um único sistema coerente para os seus usuários.
É bom ter em mente que quando falamos de Sistemas Distribuídos, estamos pensando em alguns desafios especificos desses tipos de sistemas, mas não da totalidade desses desafios que são abordados sobre outros nomes. Na indústria é muito comum se pensar em Microsserviços e podemos também falar sobre Computação Distribuída. Cada um desses temas tem desafios diferentes e todos eles falam sobre Sistemas. Eu creio que o mais disforme é o tema Microsserviços, pois muitos usam e não se aprofundam no tema, apenas replicando formulas prontas.
Outro ponto positivo que encontrei foi a forma como podemos interagir com sistemas. (Vamos com calma que vão aparecer uns nomes difíceis, mas vou explicar tudo.) Todo sistema tem um aspecto ontológico, um epistemológico, um abstrato e o software. Acho que é até engraçado que o software é um apêndice. Para outras disciplinas, o software pode não existir, mas para nós desenvolvedores isso é fundamental e se liga muito ao debate sobre Domain-Driven Design (DDD).
O sistema ontológico é o que existe no mundo real. Isso pode ser traduzido para a linguagem do DDD para o Domínio. Domínio é a área do conhecimento do mundo real para a qual o nosso sistema é desenvolvido.
O sistema epistemológico é a forma como entendemos esse sistema ontológico. É o nosso modelo mental, é o que entendemos do sistema real. Isso é uma construção individual e pode não ser similar entre pessoas do mesmo projeto.
O sistema abstrato é a forma como descrevemos esse sistema epistemológico. Ele é construído através de documentações e é derivado do sistema epistemológico de uma ou mais pessoas. Mas, ele também não reflete integralmente o sistema epistemológico. Toda modelagem exige uma simplificação e adiciona uma possibilidade de distorção da realidade.
Por fim, temos o software. O software é construído através do sistema abstrato, da documentação gerada para a sua criação. Mas esse software vai interagir com o sistema ontológico, com o mundo real. Logo, esse ciclo no entendimento deve se retroalimentar para que o software esteja sempre entregando valor a esse sistema ontológico.
Tudo isso tem muita relação com a discussão sobre modelagem de sistemas e quero falar mais disso a posteriori.