Fazendo DevOps direito: Linguagens de programação

By | March 28, 2020

No post anterior comentei da minha transição de syadmin para DevOps e minha opinião sobre 3 linguagens de programação ideais para DevOps: Shell, Python e Go.

Shell Scripting

Vou começar dizendo que se hoje a sua profissão é Sysadmin eu já assumo que você sabe shell script. Pelo menos um pouco acima do básico.

Mas fazer os famosos one-liners com sed ou awk e meia dúzia de pipes não é o que eu considero suficiente para a realidade DevOps. Algo mais complexo com condicionais, loops, funções, checagem de erro, estrutura de dados e outros conceitos mais complexos é o que você vai precisar para fazer DevOps direito.

Enquanto a maior parte dos sysadmins sabem botar meia dúzia de linhas num arquivo e chamar de shell script é realmente raro achar alguém que escreve código bonito e limpo nessa linguagem.

Recomendo esse vídeo (em inglês) de como escrever um shell script decente:

Uso ideal para shell script: Setup inicial (bootstrap) de servidores, interação com sistema operacional (execução de comandos), wrapper ao redor de outros comandos ou script em outras linguagens, facilitador de pipelines e parser simples de arquivos.

Pontos negativos: É fácil criar scripts impossíveis de serem entendidos exceto pelo autor inicial. Checagem de erro pode ser meio complexo e unit tests são extremamente complicados de fazer, se sequer forem possíveis.
Performance em geral é horrível e qualquer lógica um pouco mais complexa vai exigir um esforço herculano para ser implementada.

Python

Logo depois de shell, ou talvez até antes, vem Python. Sem dúvida minha linguagem favorita e uma das mais simples e flexíveis que existe.

A sintaxe é simples e o fato de endentação ser parte da linguagem faz com que até código mal feito e mal escrito seja possível de ser entendido com um pouco de esforço.

Eu acho particularmente vantajoso no Python o fato da linguagem ser simples o suficiente que eu consigo me concentrar no problema que eu estou tentando resolver ao invés de sintaxe, declaração de variáveis, conversão de tipos, etc. É muito rápido criar um protótipo funcional e mais tarde ajustar para as coisas serem mais corretas.

Olhe que coisa mais limpa e simples:

jantar = "arroz, feijão e batata"
if "batata" in jantar:
  print("Oba! Vai ter batata!!!")

A standard library do Python é sensacional. A linguagem por padrão sabe lidar com sistema operacional, rede, json, criptografia, compressão de arquivos, xml, etc, etc. Dá pra fazer muita muita coisa sem precisar instalar nenhum pacote adicional.

Enquanto o parágrafo anterior é verdade, você não precisa fazer ginástica para conseguir resolver seus problemas apenas com a standard library. O número de bibliotecas adicionais para Python é incrivelmente grande. Praticamente qualquer problema que você possa querer resolver já foi endereçado por alguém e uma biblioteca open source vai estar disponível.

Imagine que você precise olhar numa planilha excel qual a VLAN que uma porta de switch cisco precisa ser configurada. Aí você configura a porta, faz update no seu cluster vmware, provisiona 10 máquinas virtuais, instala um cluster kubernetes nelas e notifica o seu time via Slack.

Tudo isso pode ser feito sem sair de um script Python.

É uma linguagem multi-paradigma com uma barreira de entrada bem baixa e ao mesmo tempo muito poderosa.

A principal desvantagem, no meu ponto de vista, é quando você não tem total controle do ambiente onde está rodando sua aplicação. Instalar dependências nem sempre é simples, apesar de existirem coisas como virtualenv.

Go (aka Golang)

Por último vem Go, que pode ser mais ou menos relevante no seu ambiente. Particularmente em produção eu tenho hoje 2 ou 3 coisas bem pequenas.

Ao contrário de Shell e Python – que são linguagens interpretadas – Go cria um binário estático, que não precisa de numa dependência. É uma linguagem extremamente performática, concisa e strongly typed (como fala isso em português?).

Para explicar quão poderosa essa linguagem é vou dar dois exemplos de ferramentas que são a fundação de boa parte de DevOps que são escritas em Go: Docker e Kubernetes.

Eu não sou exatamente a pessoa mais esperta, então Go até hoje é meio desafiadora para mim. Eu não consigo escrever 10 linhas de código sem ter que olhar documentação, Google e Stackoverflow.

A parte boa é que a documentação é abundante, muitas vezes gerada automaticamente à partir do código fonte (uma das vantagem de ser strongly typed). O Go playground também possibilita rodar código direto no browser, o que facilita criar pequenos protótipos.

O uso para Go vai depender muito do seu ambiente. Um exemplo: Aonde eu trabalho meu time (DevOps) usa majoritariamente Python. Um outro grupo desenvolve microservices em C#. Eu precisava fazer uma coisa bem pequena que ia interseccionar nossos dois ambientes. Era impossível em shell script (manipulação de rede) e nos containeres deles não tinha Python instalado. A solução foi escrever em Go. Apenas um binário, sem dependência nenhuma. Boom.

Como descrevi acima, a linguagem razoavelmente simples comparada com outras do mesmo tipo (C, C++, etc). Mas nem de perto simples como Python e isso para mim é a principal barreira. Eu usaria muito mais se fosse ainda mais sucinta. A quantidade de código que precisa ser escrita mesmo para as coisas mais simples é enorme.

Vamos revisitar o exemplo que dei em python acima, mas em Go:

package main

import (
	"fmt"
	"strings"
)

func main() {
	jantar := "arroz, feijão e batata"
	if strings.Contains(jantar, "batata") {
		fmt.Println("Oba! Vai ter batata!")
	}
}

Entendem o que eu quero dizer? Se eu tiver um motivo bem forte para não usar Python eu vou usar Go sem reclamar, mas vou evitar se puder.

Por último uma menção honrosa caso você use Jenkins como sua ferramenta de CI/CD: Groovy.

Vale a pena aprender pelo menos o básico. Esse vídeo, em inglês, chama-se “Lean Groovy in one video”. Tem uma hora, mas se você for parando para acompanhar e escrever o código junto vai precisar de umas 4hrs. Vale a pena como uma introdução que vai resolver a maior parte dos seus problemas.

Alguma outra dicas de linguagens que vocês usam? Alguém discorda das escolhas que fiz? Deixe nos comentários.

3 thoughts on “Fazendo DevOps direito: Linguagens de programação

  1. Lívia Silva Santos

    Acho que é [fortemente tipada] mesmo, não?

    Usei groovy uma única vez, dentro de um fluxo no Camunda (.bpmn). Foi útil.

    Nunca trabalhei com shell script, nem go, nem python, apesar do último estar na minha lista de linguagens a aprender… quem sabe depois dos cursos de Angular? (emoji triste)

    valeu! e boa quarentena.

  2. Chico

    Concordo 100%.
    Dou um pouco mais de importância ao Groovy, no Kibana (ELK) tem uma linguagem de script chamada Painless que é semelhante.
    Não conhecia esse vídeo, vou assistir 🙂

    Sucesso ai na quarentena.

  3. Silvio Gissi

    Strongly Typed == Tipagem Forte. Soa bizarro mas é isso.

    Eu usei bastante Go, ao ponto que preferia usar ele do que Python. No meu caso, era para o time rodar scripts e todo mundo tem máquinas Windows. Era mais fácil guardar um binário do que ensinar um monte de gente a instalar Python sem acess de administrator. Mas para sustentar seu ponto, com mais gente desenvolvendo passamos a usar Python mesmo, é mais fácil de aprender.

    Abs!

Comments are closed.