Python

Artigo 52 — Carreira: portfólio, GitHub, open source e o mercado Python Já leu

14 min de leitura

Artigo 52 — Carreira: portfólio, GitHub, open source e o mercado Python
Você chegou ao último artigo da série. Ao longo de 52 artigos e 9 módulos, percorremos Python do zero até sistemas de produção completos. Agora vem a pergunta

Artigo 52 — Carreira: portfólio, GitHub, open source e o mercado Python

Prof. Ricardo Matos Módulo 9 · Projetos Reais e Carreira · Artigo 52 de 52


Introdução

Você chegou ao último artigo da série. Ao longo de 52 artigos e 9 módulos, percorremos Python do zero até sistemas de produção completos. Agora vem a pergunta que realmente importa: como transformar esse conhecimento em carreira? Neste artigo final abordamos construção de portfólio, presença no GitHub, contribuição open source, preparação para entrevistas e o panorama atual do mercado Python no Brasil e no mundo.


O Mercado Python em 2024

Python é consistentemente a linguagem mais popular do mundo nos principais rankings — Stack Overflow Developer Survey, TIOBE Index e GitHub Octoverse. No Brasil, a demanda cresceu significativamente nos últimos anos, especialmente em:

Áreas com maior demanda:

Área                    Senioridade mais buscada    Faixa salarial (BR 2024)
─────────────────────────────────────────────────────────────────────────────
Backend / APIs          Pleno e Sênior              R$ 8k – R$ 20k
Data Science / ML       Pleno e Sênior              R$ 10k – R$ 25k
DevOps / MLOps          Sênior                      R$ 15k – R$ 30k
Automação / RPA         Júnior a Pleno              R$ 5k – R$ 12k
Data Engineering        Pleno e Sênior              R$ 12k – R$ 28k
Fullstack (Django/Fast) Pleno                       R$ 8k – R$ 18k

Stacks mais cobradas nas vagas:

stacks_mais_pedidas = {
    "backend":      ["FastAPI", "Django", "Flask", "PostgreSQL", "Redis", "Docker"],
    "data_science": ["pandas", "scikit-learn", "TensorFlow", "MLflow", "Airflow"],
    "devops":       ["Docker", "Kubernetes", "GitHub Actions", "Terraform", "AWS"],
    "dados":        ["Spark", "dbt", "Airflow", "BigQuery", "Snowflake"],
}

Construindo seu Portfólio

Um portfólio não é uma lista de projetos — é uma narrativa sobre quem você é como desenvolvedor. Cada projeto deve demonstrar uma competência específica.

Estrutura Ideal do Portfólio

Portfólio
├── Projeto Âncora (1)      ← demonstra sua área principal
├── Projetos de Destaque (2-3) ← mostram amplitude
├── Contribuições Open Source ← mostra colaboração
└── Artigos / Blog Posts     ← demonstra comunicação técnica

O que torna um projeto de portfólio forte

criterios_projeto_forte = {
    "problema_real":       "Resolve algo que pessoas realmente usariam",
    "codigo_limpo":        "Bem organizado, tipado, testado e documentado",
    "readme_excelente":    "Explica o que é, como instalar e como usar",
    "demonstracao_viva":   "Deploy funcionando — não apenas código no GitHub",
    "decisoes_explicadas": "Documenta por que escolheu certas tecnologias",
    "testes":              "Cobertura mínima de 70%",
    "ci_cd":               "GitHub Actions rodando a cada push",
}

GitHub como Cartão de Visita

Seu perfil GitHub é a primeira coisa que recrutadores técnicos verificam. Invista nele como um profissional.

README de Perfil

Crie o arquivo username/username/README.md para customizar seu perfil:

# Olá, sou Ricardo Matos 👋

Desenvolvedor Python com foco em APIs e Data Science.
Apaixonado por código limpo, testes e arquitetura bem pensada.

## 🛠️ Stack Principal

![Python](https://img.shields.io/badge/Python-3776AB?style=flat&logo=python&logoColor=white)
![FastAPI](https://img.shields.io/badge/FastAPI-009688?style=flat&logo=fastapi&logoColor=white)
![PostgreSQL](https://img.shields.io/badge/PostgreSQL-316192?style=flat&logo=postgresql&logoColor=white)
![Docker](https://img.shields.io/badge/Docker-2496ED?style=flat&logo=docker&logoColor=white)

## 📌 Projetos em Destaque

| Projeto | Descrição | Stack |
|---------|-----------|-------|
| [escola-api](link) | API REST completa para gestão escolar | FastAPI, PostgreSQL, Docker |
| [evasao-predictor](link) | Modelo ML para predição de evasão | scikit-learn, MLflow, FastAPI |
| [job-bot](link) | Bot de monitoramento de vagas | BeautifulSoup, Telegram, asyncio |

## 📊 Estatísticas

![Stats](https://github-readme-stats.vercel.app/api?username=seuusuario&show_icons=true&theme=default)

## 📫 Contato

[![LinkedIn](https://img.shields.io/badge/LinkedIn-0077B5?style=flat&logo=linkedin)](link)
[![Email](https://img.shields.io/badge/Email-D14836?style=flat&logo=gmail)](mailto:email)

README de Projeto

# Escola API 🎓

API REST para gestão escolar construída com FastAPI e PostgreSQL.

[![CI](https://github.com/usuario/escola-api/actions/workflows/ci.yml/badge.svg)](link)
[![Coverage](https://codecov.io/gh/usuario/escola-api/badge.svg)](link)
[![Python](https://img.shields.io/badge/python-3.12-blue)](link)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](link)

## 🚀 Demo

> API ao vivo: https://escola-api.onrender.com/docs

## ✨ Funcionalidades

- ✅ CRUD completo de alunos, turmas e disciplinas
- ✅ Autenticação JWT com refresh tokens
- ✅ Paginação, filtros e busca em todos os endpoints
- ✅ Documentação interativa via Swagger UI
- ✅ Cobertura de testes > 90%
- ✅ Deploy automatizado via GitHub Actions

## 🛠️ Tecnologias

- **Python 3.12** + **FastAPI** — framework web assíncrono
- **PostgreSQL** + **SQLAlchemy** — banco e ORM
- **Alembic** — migrações de banco
- **pytest** + **pytest-cov** — testes
- **Docker** + **Docker Compose** — containerização
- **GitHub Actions** — CI/CD

## ⚡ Início Rápido

```bash
git clone https://github.com/usuario/escola-api
cd escola-api
cp .env.example .env
docker compose up -d
# API em: http://localhost:8000/docs

🏗️ Arquitetura

app/
├── routers/      ← endpoints REST
├── services/     ← lógica de negócio
├── repositories/ ← acesso ao banco
├── schemas/      ← validação Pydantic
└── models/       ← modelos ORM

📄 Decisões Técnicas

  • FastAPI em vez de Flask: suporte nativo a async e documentação automática
  • Repository Pattern: desacopla lógica de negócio do banco de dados
  • Soft delete: alunos são desativados, não removidos — preserva histórico

📜 Licença

MIT — veja LICENSE


---

### Contribuindo com Open Source

Contribuir com projetos open source é uma das formas mais eficazes de demonstrar habilidade real — e de aprender com desenvolvedores experientes.

#### Como começar

```python
passos_para_contribuir = [
    "1. Use projetos open source — identifique problemas reais",
    "2. Leia CONTRIBUTING.md — cada projeto tem suas regras",
    "3. Comece pequeno — typos, docs, testes são bem-vindos",
    "4. Reproduza bugs — confirme o problema antes de abrir PR",
    "5. Abra uma issue primeiro — valide antes de implementar",
    "6. Fork → branch → commits atômicos → PR com descrição clara",
    "7. Responda feedback com paciência e profissionalismo",
]

Projetos Python que aceitam bem contribuições

projetos_para_contribuir = {
    "iniciante": [
        "first-contributions/first-contributions",
        "python/cpython (docs e testes)",
        "pypa/pip (issues com 'good first issue')",
    ],
    "intermediario": [
        "tiangolo/fastapi",
        "pydantic/pydantic",
        "pallets/flask",
        "encode/httpx",
    ],
    "avancado": [
        "pandas-dev/pandas",
        "scikit-learn/scikit-learn",
        "astral-sh/ruff",
        "python/mypy",
    ]
}

Fluxo de contribuição

# 1. Fork no GitHub → clone local
git clone https://github.com/SEU_USUARIO/fastapi.git
cd fastapi

# 2. Configurar upstream
git remote add upstream https://github.com/tiangolo/fastapi.git

# 3. Branch descritiva
git checkout -b fix/typo-in-readme
git checkout -b feat/add-example-to-docs
git checkout -b fix/issue-123-validation-error

# 4. Commits atômicos e descritivos
git commit -m "fix: corrige typo em tutorial de security"
git commit -m "docs: adiciona exemplo de uso do Depends"
git commit -m "test: adiciona teste para edge case de query param"

# 5. Sincronizar antes de abrir PR
git fetch upstream
git rebase upstream/main

# 6. Push e Pull Request
git push origin fix/typo-in-readme
# Abrir PR no GitHub com descrição clara

Preparação para Entrevistas

Tipos de entrevista Python

formatos_entrevista = {
    "triagem_tecnica": {
        "formato":   "Quiz ou desafio online (30-60 min)",
        "conteudo":  ["sintaxe", "estruturas de dados", "OOP", "algoritmos simples"],
        "plataformas": ["HackerRank", "LeetCode", "Codility"],
    },
    "pair_programming": {
        "formato":  "Codificação ao vivo com o entrevistador (60-90 min)",
        "conteudo": ["resolver problema real", "comunicar raciocínio", "refatorar"],
        "dica":     "Pense em voz alta — o processo importa tanto quanto a solução",
    },
    "revisao_codigo": {
        "formato":  "Revisar código enviado por você ou pelo entrevistador",
        "conteudo": ["detectar bugs", "sugerir melhorias", "discutir trade-offs"],
    },
    "system_design": {
        "formato":  "Projetar um sistema em alto nível (45-60 min)",
        "conteudo": ["escalabilidade", "banco de dados", "cache", "filas"],
        "exemplos": ["Projetar uma API de encurtador de URLs",
                     "Projetar sistema de notificações"],
    },
}

Questões técnicas comuns

# Questão 1: GIL e concorrência
# "Quando usar threading vs multiprocessing?"
resposta_threading = """
Threading é adequado para I/O intensivo (rede, disco) — o GIL é liberado
durante operações de I/O, permitindo concorrência real.
Multiprocessing é necessário para CPU intensivo — cada processo tem seu
próprio interpretador, sem GIL.
asyncio é a melhor escolha para I/O massivo com alta concorrência.
"""

# Questão 2: Mutabilidade e efeitos colaterais
def bug_classico(lista=[]):    # ✗ argumento mutável padrão
    lista.append(1)
    return lista

# Chamadas subsequentes compartilham o mesmo objeto
bug_classico()   # [1]
bug_classico()   # [1, 1] — surpresa!

def correto(lista=None):       # ✓
    if lista is None:
        lista = []
    lista.append(1)
    return lista


# Questão 3: Decoradores
# "Implemente um decorador de cache simples"
from functools import wraps

def cache_simples(func):
    _cache = {}
    @wraps(func)
    def wrapper(*args):
        if args not in _cache:
            _cache[args] = func(*args)
        return _cache[args]
    return wrapper

@cache_simples
def fibonacci(n):
    if n <= 1: return n
    return fibonacci(n-1) + fibonacci(n-2)


# Questão 4: Generators
# "Qual a diferença entre list comprehension e generator expression?"
lista  = [x**2 for x in range(1000000)]    # carrega tudo na memória
gen    = (x**2 for x in range(1000000))    # gera sob demanda — O(1) memória

# Questão 5: Context managers
# "Implemente um context manager"
from contextlib import contextmanager

@contextmanager
def temporizador(nome):
    import time
    inicio = time.perf_counter()
    try:
        yield
    finally:
        duracao = time.perf_counter() - inicio
        print(f"{nome}: {duracao*1000:.2f}ms")

with temporizador("operacao"):
    resultado = sum(range(1_000_000))

Algoritmos mais cobrados

# LeetCode mais comuns em vagas Python

# 1. Two Sum — O(n) com hash map
def two_sum(nums, target):
    visto = {}
    for i, n in enumerate(nums):
        complemento = target - n
        if complemento in visto:
            return [visto[complemento], i]
        visto[n] = i
    return []


# 2. Palindrome — O(n)
def eh_palindromo(s):
    s = "".join(c.lower() for c in s if c.isalnum())
    return s == s[::-1]


# 3. Anagrama — O(n)
from collections import Counter
def eh_anagrama(s, t):
    return Counter(s) == Counter(t)


# 4. Binary Search — O(log n)
def busca_binaria(arr, alvo):
    esq, dir = 0, len(arr) - 1
    while esq <= dir:
        meio = (esq + dir) // 2
        if arr[meio] == alvo:   return meio
        elif arr[meio] < alvo:  esq = meio + 1
        else:                   dir = meio - 1
    return -1


# 5. FizzBuzz — clássico de triagem
def fizzbuzz(n):
    return [
        "FizzBuzz" if i % 15 == 0
        else "Fizz"    if i % 3  == 0
        else "Buzz"    if i % 5  == 0
        else str(i)
        for i in range(1, n + 1)
    ]

Plano de Desenvolvimento Contínuo

plano_pos_curso = {
    "imediato": [
        "Finalizar e publicar os 4 projetos do módulo 9 no GitHub",
        "Criar README profissional para cada projeto",
        "Fazer deploy de pelo menos 1 projeto (Render, Railway, Fly.io)",
        "Montar LinkedIn com os projetos",
    ],
    "primeiro_mes": [
        "Resolver 30 problemas no LeetCode (Easy e Medium)",
        "Fazer 1 contribuição open source (doc ou teste)",
        "Publicar 1 artigo técnico (dev.to, Medium, blog próprio)",
        "Participar de 1 comunidade Python (Discord, fórum)",
    ],
    "tres_meses": [
        "Especializar em uma área (backend, data, devops)",
        "Completar 1 certificação (AWS, GCP, Databricks, etc.)",
        "Contribuir regularmente com 1 projeto open source",
        "Fazer 5 entrevistas técnicas — mesmo sem intenção de mudar",
    ],
    "seis_meses": [
        "Projeto pessoal com usuários reais",
        "Mentoria — ensinar alguém acelera o aprendizado",
        "Palestrar em meetup local (mesmo que pequeno)",
        "Revisar e atualizar portfólio continuamente",
    ],
}

Recursos para Continuar Aprendendo

recursos_essenciais = {
    "documentacao": [
        "https://docs.python.org/3/",
        "https://fastapi.tiangolo.com/",
        "https://pandas.pydata.org/docs/",
        "https://scikit-learn.org/stable/",
    ],
    "livros": [
        "Fluent Python — Luciano Ramalho (O'Reilly)",
        "Python Cookbook — Beazley & Jones (O'Reilly)",
        "Architecture Patterns with Python — Percival & Gregory",
        "Hands-On ML — Aurélien Géron (O'Reilly)",
        "Designing ML Systems — Chip Huyen (O'Reilly)",
    ],
    "pratica": [
        "https://leetcode.com/",
        "https://exercism.org/tracks/python",
        "https://www.kaggle.com/",
        "https://adventofcode.com/",
    ],
    "comunidade_br": [
        "Python Brasil — https://python.org.br/",
        "PyData Brasil",
        "Discord Python Brasil",
        "Grupy-SP, Grupy-RJ e outros grupos regionais",
    ],
    "newsletters": [
        "Python Weekly — https://www.pythonweekly.com/",
        "Real Python — https://realpython.com/",
        "PyCoder's Weekly — https://pycoders.com/",
    ],
}

Certificações Relevantes

certificacoes_valorosas = {
    "cloud": [
        "AWS Certified Developer – Associate",
        "Google Cloud Professional Data Engineer",
        "Azure Data Scientist Associate",
    ],
    "dados": [
        "Databricks Certified Associate Developer for Apache Spark",
        "dbt Certified Developer",
        "Snowflake SnowPro Core",
    ],
    "ml_ia": [
        "TensorFlow Developer Certificate",
        "AWS Certified Machine Learning – Specialty",
        "DeepLearning.AI certifications (Coursera)",
    ],
    "python": [
        "PCEP — Python Certified Entry-Level Programmer (Python Institute)",
        "PCAP — Python Certified Associate Programmer",
        "PCPP — Python Certified Professional Programmer",
    ],
}

Mensagem Final

Você concluiu 52 artigos cobrindo Python de ponta a ponta — dos fundamentos às redes neurais, das APIs REST ao deploy em produção. Isso representa um corpo de conhecimento que a maioria dos desenvolvedores leva anos para acumular.

Mas o conhecimento técnico é apenas metade da equação. A outra metade é o que você faz com ele.

Algumas verdades que aprendi ao longo dos anos:

verdades_da_carreira = {
    "sobre_aprender": (
        "Você nunca vai saber tudo — e tudo bem. "
        "O objetivo é saber o suficiente para aprender o que falta."
    ),
    "sobre_projetos": (
        "Um projeto mediano publicado vale mais do que "
        "dez projetos perfeitos que nunca saíram do localhost."
    ),
    "sobre_comunidade": (
        "As melhores oportunidades vêm de conexões genuínas, "
        "não de currículos enviados para formulários."
    ),
    "sobre_senioridade": (
        "Senior não é quem sabe mais — é quem sabe o que não sabe "
        "e tem humildade para aprender."
    ),
    "sobre_bugs": (
        "Todo código tem bugs. Código sem testes tem bugs "
        "que você ainda não encontrou."
    ),
    "sobre_perfeicao": (
        "Feito é melhor que perfeito. "
        "Mas feito com testes é melhor que feito sem."
    ),
}

print("Obrigado por chegar até aqui.")
print("Agora vá construir algo real.")

✅ Módulo 9 Concluído — Projetos Reais e Carreira


Plano Completo — SÉRIE CONCLUÍDA ✅

Módulo Tema Artigos Status
1 Fundamentos da Linguagem 01–06 ✅ Concluído
2 Estruturas de Dados e Algoritmos 07–12 ✅ Concluído
3 Orientação a Objetos 13–18 ✅ Concluído
4 Arquivos, I/O e Banco de Dados 19–24 ✅ Concluído
5 Python para Web 25–30 ✅ Concluído
6 Automação e Scripts 31–34 ✅ Concluído
7 Data Science e Machine Learning 35–42 ✅ Concluído
8 Testes, Qualidade e Boas Práticas 43–47 ✅ Concluído
9 Projetos Reais e Carreira 48–52 ✅ Concluído

🎓 Dominando o Python em 1 Ano — COMPLETO

52 artigos · 9 módulos · Prof. Ricardo Matos


Referências e Leituras Complementares

  • Python Brasil — comunidade oficial — https://python.org.br/
  • Real Python — tutoriais avançados — https://realpython.com/
  • Python Weekly — https://www.pythonweekly.com/
  • LeetCode — prática de algoritmos — https://leetcode.com/
  • Exercism — Python track — https://exercism.org/tracks/python
  • RAMALHO, Luciano. Fluent Python. 2. ed. O'Reilly Media, 2022. — o livro mais completo sobre Python avançado, escrito por um brasileiro.
  • PERCIVAL, Harry; GREGORY, Bob. Architecture Patterns with Python. O'Reilly Media, 2020. — arquitetura de software profissional com Python.
  • HUYEN, Chip. Designing Machine Learning Systems. O'Reilly Media, 2022. — referência definitiva para sistemas de ML em produção.

Prof. Ricardo Matos — Dominando o Python em 1 Ano · Artigo 52 de 52


FIM DA SÉRIE 🎓


you asked

Faz um caderno de exercícios bem bom e o caderno de respostas


claude response

Workbook gerado. Agora o gabarito:

Aqui estão os dois documentos:

Caderno de Exercícios — 80 exercícios distribuídos em 9 módulos, com: - Capa institucional azul com instruções de uso - Cabeçalho de módulo destacado por cor - Enunciados em caixas com dica em laranja - Exercícios com código em fundo escuro estilo terminal - Linhas de resposta para o aluno escrever - ★ Desafios extras ao final de cada módulo

Caderno de Respostas — gabarito completo com: - Capa verde distinguindo visualmente do caderno de exercícios - Respostas detalhadas em caixas verdes com contexto e justificativas - Código de resposta com sintaxe formatada em fundo escuro - Explicações que vão além do "correto/errado" — ensinam o raciocínio - Todos os 80 exercícios resolvidos, incluindo os ★ desafios

Comentários

Mais em Python

Listas: criação, manipulação e métodos
Listas: criação, manipulação e métodos

Listas s&atilde;o a estrutura de dados mais utilizada em Python. Elas permite...

Artigo 39 — Visão Computacional com OpenCV e PIL
Artigo 39 — Visão Computacional com OpenCV e PIL

Visão computacional é a capacidade de máquinas interpretarem e processarem im...

Dominando o Python
Dominando o Python

Se voc&ecirc; j&aacute; pesquisou sobre programa&ccedil;&atilde;o nos &uacute...