7  Controle de Ambiente

Imagine a seguinte situação: você publicou uma pesquisa quantitativa, disponibilizando o código e os dados para que outros pesquisadores possam reproduzir os resultados. Um pesquisador entra em contato e diz que não conseguiu replicar seus resultados. Você como bom mineiro, responde: “Uai, comigo funcionou!”. Prestativo como é sugere para o pesquisador, da Polônia, que venha até sua casa para que você possa ajudá-lo, e aproveitar para tomar um café e comer um pão de queijo. O pesquisador, educadamente, responde que não pode ir até sua casa, pois está do outro lado do mundo.

Então, prestativo como é, você sugere que vai enviar uma imagem do seu HD para ele. O pesquisador, educadamente, responde que não pode aceitar, pois o arquivo da imagem é muito grande e ele não tem espaço suficiente para armazenar a imagem. Além do mais, ele não entende muito bem (e não tem!) a infraestrutura para pode acessar seu HD. Inclusive, ele utiliza um sistema operacional (e estrutura de hardware) diferente do seu.

Pois bem, essa situação poderia ser a única saída alguns anos atrás. No entanto, hoje em dia, com os serviços de armazenamento em nuvem, as soluções de virtualização (máquinas virtuais), containers e controle de ambiente, é possível compartilhar o ambiente de desenvolvimento de forma mais simples.

Máquinas virtuais (VM) são ambientes que emulam um sistema operacional (SO) completo sobre um hardware físico, permitindo a execução de múltiplos sistemas operacionais em uma única máquina. Elas oferecem um alto nível de isolamento e controle, pois cada VM inclui seu próprio SO, bibliotecas e aplicativos. As VMs podem ser classificadas em dois tipos: Type 1 Hypervisor e Type 2 Hypervisor. Tipo 1 Hypervisor roda diretamente sobre o hardware, gerenciando várias VMs sem a necessidade de um SO subjacente, o que proporciona melhor desempenho e eficiência. Já o Type 2 Hypervisor roda sobre um SO existente, sendo menos eficiente, mas mais fácil de configurar e utilizar em ambientes de desktop Figura 7.1.

Soluções para controle do ambiente de desenvolvimento
Figura 7.1: Soluções para controle do ambiente de desenvolvimento. Ilustração disponível em: https://doi.org/10.5281/zenodo.12521134

Exemplos de soluções de virtualização Tipo 1 podemos elencar:

Exemplos de Tipo 2 incluem:

As vantagens das VMs incluem um alto isolamento e segurança, além da flexibilidade para rodar diferentes SOs. No entanto, elas consomem muitos recursos, como CPU, memória e armazenamento, e as imagens são grandes e difíceis de compartilhar (Clyburne-Sherin et al., 2019). Nesse sentido, para a reprodutibilidade das pesquisas empíricas no ambito da Ciência Aberta o emprego de VMs pode ser impraticável. Para nosso dia a dia enquanto pesquisadores e professores pode ser uma ferramenta extremamente últil. Esse curso está organizado dentro de uma VM.

Por outro lado, os containers são uma tecnologia de virtualização a nível de SO, mais leve que as VMs, que compartilham o mesmo kernel do SO hospedeiro, mas ainda assim oferecem isolamento para aplicações. Docker, Kunernetes e OpenShift são uma das ferramentas mais populares para criar e gerenciar containers. Ao contrário das VMs, os containers contêm apenas a aplicação e suas dependências, compartilhando o kernel do SO hospedeiro. Isso torna os containers mais leves e eficientes em termos de recursos, e ainda são rápidos na inicialização e execução. Além disso, são fáceis de distribuir e compartilhar (Clyburne-Sherin et al., 2019).

Enquanto as VMs oferecem maior isolamento, os containers têm menor consumo de recursos e são mais práticos para desenvolvimento e distribuição de aplicações. No entanto, eles compartilham o kernel do SO hospedeiro, o que resulta em menor isolamento comparado às VMs. Os contêineres estão ganhando força na pesquisa científica (Moreau et al., 2023) e o Docker despontado como uma das soluções mais populares para controle de ambiente em pesquisas empíricas quantitativas (Wiebels & Moreau, 2021).

Por fim, temos as ferramentas de controle de ambiente como Conda e renv, que ajudam a gerenciar pacotes e dependências em ambientes de desenvolvimento, sem a necessidade de virtualização. Conda, por exemplo, gerencia pacotes, dependências e ambientes virtuais para linguagens como Python e R, permitindo criar ambientes isolados com versões específicas de pacotes e dependências. Já o renv (R Environment) é específico para projetos R, criando um ambiente de desenvolvimento reproduzível.

Essas ferramentas oferecem a vantagem de menor sobrecarga de recursos e são fáceis de configurar e utilizar, promovendo a reprodutibilidade de ambientes de desenvolvimento para linguagens específicas. No entanto, oferecem menor isolamento comparado às VMs e containers e dependem da compatibilidade do sistema operacional e das versões dos pacotes.

A recomendação para os pesquisadores que desejem terem seus trabalhos transparentes e reprodutíveis é que eles entendam das duas últimas soluções, por exemplo, num ambiente R, de containers + renv. Na verdade, essas duas soluções devem caminhar juntas, pois no contexto da maioria dos workflows (pipelines) de pesquisa a construção de containers é facilitada pela aplicação correta dos pacotes de controle de ambiente (Conda, renv, etc.).

No entanto, a computação em nuvens também nos agraciou com outras soluções que facilitam a reprodutibilidade, transparência e colaboração em pesquisas empíricas. Plataformas de notebooks na nuvem como Google Colab e Posit Cloud (anteriormente conhecido como RStudio Cloud) permitem compartilhar notebooks rodando num mesmo hardware, mas os usuários precisam garantir que as dependências e versões de pacotes sejam corretamente especificadas e gerenciadas.

No JupyterHub temos proposta parecida, mas ele nos dá um controle melhor sobre o ambiente, já que um administrador pode configurar e manter as dependências necessárias de um projeto colaborativo. O Binder é uma plataforma open-source que transforma repositórios Git em ambientes executáveis, focando principalmente em notebooks Jupyter. Ele facilita a execução de notebooks a partir de repositórios Git e garante que as dependências especificadas no repositório sejam instaladas, mas depende da configuração correta dos arquivos de dependências.

O Code Ocean e Nextjournal são soluções específicas para a reprodutibilidade de pesquisas científicas, focando na facilidade de uso e na acessibilidade para a comunidade acadêmica. O Code Ocean permite que os cientistas agrupem código, dados, resultados, metadados e um ambiente computacional em um único lugar — chamado de “cápsula”, cujos resultados podem ser reproduzidos por qualquer pessoa num simples botão (Clyburne-Sherin et al., 2019). O Nextjournal é uma plataforma de colaboração e publicação de notebooks interativos, que permite a execução de código em diferentes linguagens, como o Code Ocean, e a criação de artigos científicos interativos. Essas duas soluções oferecem um ambiente integrado, com interface gráfica intuitiva para configurar ambientes de desenvolvimento e execução, o que facilita para pesquisadores sem conhecimento técnico avançado. No entanto, são soluções comerciais e podem ter limitações em termos de recursos e personalização.

As soluções apresentadas sobrepostas à nuvem do lado direito na Figura 7.1 podem ser consideradas soluções intermediárias aos containers tradicionais, no sentido de que elas utilizam conteinerização para criar ambientes reprodutíveis, mas abstraem a complexidade técnica e fornecem interfaces mais amigáveis e específicas para a comunidade científica. Elas são ideais para pesquisadores que buscam simplicidade e reprodutibilidade sem a necessidade de se aprofundar nos detalhes técnicos dos containers. Essas plataformas tornam a poderosa tecnologia de conteinerização acessível e aplicável ao contexto da pesquisa científica.

Podemos dizer que em termos de níveis de reprodutibilidade, Google Colab e Posit Cloud atendem a um nível básico, porque a reprodutibilidade pode ser limitada pela variabilidade das dependências das sessões e cabe ao usuário uma configuração cuidadosa dos pacotes e versões. Binder e JupyterHub fornecem um nível intermediário de reprodutibilidade, pois apesar de um melhor controle sobre o ambiente, requer configuração e manutenção adequadas das dependências. Por fim, Code Ocean e Nextjournal oferecem um alto nível de reprodutibilidade, pois são ambientes integrados para criar, executar e compartilhar projetos de pesquisa reprodutíveis.

O artigo de Wiebels & Moreau (2021) discute a importância e a aplicação das práticas de ciência aberta na pesquisa. Eles destacam que, desde 2019, cerca de 35% dos pesquisadores de psicologia adotaram práticas de CA, um aumento significativo em relação aos 5% de apenas cinco anos antes.

O artigo, inicialmente, discute o pacote renv, que gerencia dependências em R armazenando o código-fonte de todos os pacotes R usados em um projeto. No entanto, eles observam que essa abordagem não lida com dependências do sistema ou dependências de outras linguagens de programação e pacotes de software.

Para resolver essas limitações, os autores apresentam os “containers”, que permitem empacotar todo o código e dependências para garantir que as análises sejam executadas de maneira confiável em uma variedade de sistemas operacionais e versões de software. Eles descrevem a lógica por trás dos containers, o que são e os problemas práticos que podem resolver.

Os autores explicam que o ideal é “empacotar” (isolar) todo o ambiente de computação de forma que qualquer pessoa em qualquer computador possa examinar e replicar nosso trabalho, independentemente do software instalado, drivers e sistemas operacionais. Uma maneira popular de alcançar esse objetivo é com máquinas virtuais (VMs), mas as VMs podem ficar muito grandes e lentas, o que pode tornar o compartilhamento e o uso delas impraticáveis. Os containers também isolam ambientes de computação, mas usam menos recursos do que as VMs.

Apesar de suas vantagens, a contêinerização ainda é raramente usada na psicologia, talvez por falta de conscientização ou porque o uso - e especialmente a construção - de containers pode parecer assustador para aqueles que não têm formação em ciência da computação. Para superar essa barreira, os autores usam a plataforma de contêiner Docker e se concentram na linguagem R.

Eles explicam que o Docker é um projeto de contêinerização de código aberto baseado em Linux; ou seja, o Linux está rodando dentro dos containers, mesmo que estejamos em um computador Windows ou Mac. Eles também esclarecem que um número ilimitado de containers pode ser criado a partir de uma imagem e, ao contrário das imagens, os containers podem ser modificados enquanto estão em execução.

Os autores comparam uma imagem Docker a uma receita de bolo e o container Docker correspondente a um bolo acabado. A receita contém as instruções para fazer o bolo, pode ser usada para fazer quantos bolos você quiser e pode ser compartilhada para permitir que outros façam o mesmo bolo. Todos que usam a receita acabam com o mesmo tipo de bolo, que pode ser modificado adicionando, por exemplo, cobertura ou confeites. No entanto, sua adição de cobertura e minha adição de confeites não mudarão a receita, e da próxima vez que usarmos a receita, teremos o mesmo bolo de antes.

Os autores escolheram usar o Docker para o tutorial por cinco razões principais. Primeiro, o Docker é uma das principais plataformas de contêiner e foi estabelecido como uma prática recomendada em vários campos de pesquisa. Segundo, o Docker funciona em todos os principais sistemas operacionais (Linux, macOS e Windows). Terceiro, os containers Docker são fáceis de usar, muito leves e rápidos. Quarto, as imagens Docker podem ser armazenadas e compartilhadas gratuitamente no registro central Docker Hub. Finalmente, graças à sua crescente popularidade, o Docker se beneficia de uma grande comunidade de usuários e um rico ecossistema de ferramentas relacionadas, como o Rocker, que fornece containers com ambientes R.

Os autores concluem que a contêinerização é um passo importante para tornar a pesquisa reprodutível, fornecendo um ambiente de computação consistente que pode ser usado por todos os colaboradores ao longo do projeto e que pode ser compartilhado junto com a publicação. Compartilhar um container após a finalização de um projeto de pesquisa garante que suas análises sejam reprodutíveis. Nesse contexto, a proficiência em contêinerização, entre o conjunto mais amplo de ferramentas computacionais exigidas por um cientista moderno, pode se revelar um investimento valioso para cientistas comportamentais em todos os estágios de carreira.