0%

Se tem algo que aprendi nestes anos suportando e criando produtos de tecnologia é que menos é mais.

Aqui vai algumas dicas valiosas que funcionaram para mim:

  • Se for desenvolver, escolha tecnologias padrões de mercado
  • Não caia na armadilha de achar que tecnologias de código aberto, ou soluções on premise significam “sem custo” ou “mais barato”
  • Terceirize atividades que não agregam valor para o produto

Se for desenvolver, escolha tecnologias padrões de mercado

Imagino que isso se repita em todos os setores de produção, mas a indústria de Telecomunicações em particular tem aversão a “última versão de software”. Ninguém quer pagar o pato de ser o primeiro a descobrir um novo bug enquanto há uma fila de clientes reclamando em todos os canais de atendimento.

Não me entenda mal, usar novas tecnologias é bastante empolgante e muitas das vezes pode até significar diferenciais para seu produto, mas softwares e tecnologias bem consolidados que todos estão usando é uma ótima aposta, terá ótimo suporte de empresas e fóruns no mercado e não te fará correr o risco de ser o primeiro a encontrar um bug que ninguém mais resolveu.

Código Aberto nem sempre é “sem custo” e On Premise nem sempre é “mais barato”

Então você fez o trabalho de casa, colocou suas opções numa matriz de decisão e escolheu um software aberto para implementar certas funcionalidades no seu produto, até levou em conta minha dica anterior e escolheu uma versão estável.

Você está levando em conta o custo de operar por si mesmo esse software?

Existe um abismo entre provar um conceito (PoC) para o cliente utilizando ferramentas Opensource e desenvolvimento interno com dois estagiários, 2 desenvolvedores full-stack, 1 especialista em sistemas Operacionais, 1 em redes de computadores é criar um ambiente de produção que esteja pronto para a carga de trabalho, com alta disponibilidade, segurança, em conformidade com LGPD, gerenciamento de Alarmes.

Muitas das vezes desenvolver internamente o produto requererá também atividades laterais como:

  • Criação de uma equipe de Operação e Suporte em tempo integral para monitorar a saúde do seu sistema
  • Manter o conhecimento original do desenvolvimento vivo entre sua equipe. O mercado de TI rotaciona muito as cadeiras, o conhecimento do time que implantou aquele software de código aberto persistiu a informação nas suas ferramentas de gestão de conhecimento.
  • E conforme o produto cresce e ganha escala, problemas acontecem, bugs aparecem. Quando você menos esperar verá que seu Squad de produto estará afogado em resolver problemas e pouco envolvido em desenvolver novas funcionalidades e novos valores para o produto

Terceirize atividades que não agregam valor para o produto

Se você chegou até aqui, essa dica talvez é chover no molhado, mas não quero ficar com a consciência pesada de não ter avisado.

Durante o processo de criação de seus produtos e conforme sua empresa vai evoluindo de uma Startup para uma Empresa de crescimento e por fim alcançando uma Empresa consolidada com um produto forte pode ser que seu time de tecnologia se perca pelo caminho.

Certifique-se que seu time não esteja em alguma dessas armadilhas:

  • O Backlog de atividades só possui Correções de Bugs e nenhuma Funcionalidade nova, que agregue valor ao produto
  • O Time passa mais tempo preocupado em implementar uma esteira de CI/CD perfeita que pensando em como entregar alguma coisa que o Cliente goste.
  • O time passa mais tempo preocupado em “instalar, manter e garantir” do que em “evoluir, criar e inovar”

Não me leve a mal, tudo isso é importante, e provavelmente consequência do desenvolvimento interno, mas isso é atividade indiferente para o seu Cliente. Você está mantendo um time de vários Engenheiros e Desenvolvedores na sua estrutura que deveria ser enxuta para criação do produto, depois falo sobre isso noutro tópico ocupados com atividades irrelevantes para aumentar o Valor percebido para os Stakeholders e os Benefícios para os clientes.

Terceirize esses serviços!

  • Terceirize a administração dos ambientes para empresas especialistas em suporte de código aberto
  • Terceirize até mesmo o desenvolvimento de funcionalidades para empresas especialistas em Fábrica de Software.

Foque seu time de alto desempenho apenas em AUMENTAR O VALOR do seu produto.

Espero que tenham gostado deste post e comentem suas experiência neste assunto.

Construindo a estrutura mínima do projeto

Vamos construir a estrutura mínima para um projeto python com Flask

Crie a pasta do seu projeto

1
2
mkdir ./formula_magica_app
cd ./formula_magica_app

Crie um Ambiente virtual Python para seu projeto.

1
2
python3.6 -m venv venv
source venv/bin/activate

Não precisa criar o Ambiente virtual para um projeto em Docker. Eu apenas o Faço para facilitar o pip freeze

Neste ponto gosto de criar o arquivo base de requisitos do Python já com a dependência do Flask instalada

1
2
3
pip install flask
pip install gevent
pip freeze >requirements.txt

Sobre o Flask

Para projetos rápidos e de aprendizado gosto de usar o Framework Flask devido a sua facilidade de uso e por ser “direta e reta”.

É um pacote extremamente leve para rodar, sem uma estrutura de diretório complexa e ao mesmo tempo possui muitas extensões e uma comunidade forte.

Outra framework muito utilizada é o Django e confesso que para um projeto bem delimitado ele oferece ferramentas melhores integradas a framework, já vem com um painel admin, bibliotecas para bancos de dados, uma estrutura pré-definida de diretório. Mas a simplicidade é exatamente a beleza do Flask, a comunidade diz que o Flask é uma framework “unopinionated”, ou seja, ele te permite decidir como implementar sua aplicação sem ficar no meio do caminho.

Existem diversas outras Web Frameworks para python e você pode conferi-las aqui.

Criando os arquivos iniciais do Projeto

Vamos criar um arquivo de configuração para a nossa aplicação na pasta do projeto já com classes que representam ambientes de produção e desenvolvimento.

./config.py
1
2
3
4
5
6
7
8
class Config(object): 
pass

class ProdConfig(Config):
pass

class DevConfig(Config):
DEBUG = True

E agora o arquivo da aplicação.

./main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
from gevent.pywsgi import WSGIServer
from flask import Flask
from config import DevConfig

app = Flask(__name__)
app.config.from_object(DevConfig)

@app.route('/')
def home():
return '<h1>Olá mundo pequeno!</h1>'

if __name__ == '__main__':
http_server = WSGIServer(('', 5000), app)
http_server.serve_forever()

Já já vamos colocar esse código para rodar, aguenta aí.

Configurando o Docker

Crie um Dockerfile na pasta do projeto

./Dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
FROM python:3.6.5
# Criando uma pasta para a aplicação
WORKDIR /app

# Copiando arquivos da pasta local para dentro do Docker
ADD . /app

# Instalando as dependências dentro do Docker
RUN pip install -r requirements.txt

EXPOSE 5000

#Rodando a aplicação
CMD ["python", "main.py"]

Nesta altura do campeonato, sua estrutura de diretório deve ser assim:

upload successful

Por que Docker?

Nossa aplicação precisará rodar a aplicação Web, mas não para por ai. No fim deste artigo também precisaremos de um sistema de banco de dados, de um sistema de autenticação e projetos reais muitas vezes rodam mais de um servidor web, enfim, você pegou a idéia.

Dado essa pilha (“stack”) de aplicações, uma forma simples de defini-lá e executá-la e através de sistemas de containers. E é ai que o Docker entra na jogada.

Com o Docker, você define como instalar sua aplicação e depois pode facilmente compartilhar o script com seu time e até mesmo subir para produção de forma rápida e ligeira.

Rodando a Aplicação

Bora colocar a aplicação para rodar.

Construa sua imagem do Docker

1
docker build -t formula_magica .

Rode o container

1
docker run --name fm -p 5000:5000 formula_magica 

Agora só acessar sua aplicação em: http://localhost:5000

Diquinha para facilitar o Docker Build

Depois de rodar várias e várias vezes o comando, tu notará que o docker build reinstala toda vez os requirements.txt do pip.

Para evitar isso eu gero uma tag local após saber que não modificarei mais o requirements.txt

1
docker tag formula_magica local/formula_magica

E modifico o Dockerfile para isso

./Dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
FROM local/formula_magica
# Criando uma pasta para a aplicação
WORKDIR /app

# Copiando arquivos da pasta local para dentro do Docker
ADD . /app

# Instalando as dependências dentro do Docker
RUN pip install -r requirements.txt

EXPOSE 5000

#Rodando a aplicação
CMD ["python", "main.py"]

Facilita muito o serviço!