Translate

Mostrar mensagens com a etiqueta Netflix. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta Netflix. Mostrar todas as mensagens

quarta-feira, 5 de junho de 2024

CSI Netflix: A Arquitetura de Microserviços Investigada por um Programador COBOL

 

Bellacosa Mainframe investiga a arquitetura de microservicos da netflix

☕ Um Café no Bellacosa Mainframe

CSI Netflix: A Arquitetura de Microserviços Investigada por um Programador COBOL

Quando um Simples Clique no Botão “Assistir” Abre uma Cena do Crime Distribuída Entre APIs, Filas, Bancos, Caches, Eventos e Milhares de Servidores

Às 02h17 da madrugada, a cidade de Nova York parecia executar seu eterno processamento batch.

As avenidas continuavam recebendo transações. Os semáforos alternavam estados como flags de controle. Táxis percorriam rotas imprevisíveis, enquanto milhões de janelas iluminadas lembravam terminais conectados a um sistema gigantesco cuja documentação havia sido perdida décadas atrás.

No laboratório do CSI New York, uma nova ocorrência acabava de chegar.

Não havia sangue.

Não havia arma.

Não havia sequer uma vítima humana.

O relatório dizia apenas:

“O usuário pressionou o botão Assistir, mas o vídeo demorou três segundos para começar.”

Para uma pessoa comum, três segundos não seriam um crime.

Para uma plataforma global de streaming, três segundos poderiam representar abandono, perda de audiência, quebra de experiência, sobrecarga em algum serviço ou indício de uma falha distribuída prestes a contaminar milhões de sessões.

Sobre a mesa de análise estava um diagrama com o título:

Microservice Architecture at Netflix

O investigador observou a sequência de componentes:

  • cliente;

  • balanceador de carga;

  • API Gateway;

  • microserviços;

  • cache;

  • banco de dados;

  • pipeline de eventos;

  • Kafka;

  • Spark;

  • Elasticsearch;

  • Amazon S3;

  • Hadoop;

  • sistema de notificações.

Ao lado dele, um programador COBOL iniciante segurava uma caneca de café e tentava encontrar a PROCEDURE DIVISION.

Não havia.

Também não havia JCL.

Nenhum EXEC CICS.

Nenhum CALL explícito mostrando quem chamava quem.

Mesmo assim, o sistema funcionava.

Ou pelo menos deveria funcionar.

O investigador apontou para o diagrama e declarou:

“Em uma arquitetura distribuída, todo componente é uma testemunha. O problema é que algumas testemunhas mentem, outras desaparecem e várias mudam de endereço durante o interrogatório.”

Era hora de reconstruir a ocorrência.


1. A primeira evidência: o clique não é a transação completa

Quando um usuário abre a Netflix em uma televisão, celular, navegador, tablet ou console e pressiona o botão Assistir, parece que apenas um vídeo está sendo solicitado.

Por trás da interface, porém, diversas perguntas precisam ser respondidas:

  • O usuário está autenticado?

  • A assinatura continua ativa?

  • Qual perfil está sendo utilizado?

  • O conteúdo está disponível naquele país?

  • A classificação etária permite a reprodução?

  • Qual idioma deve ser selecionado?

  • Há legenda adequada?

  • O dispositivo suporta HDR?

  • Qual resolução é recomendada?

  • A conexão permite 4K?

  • De onde o vídeo será entregue?

  • Em que ponto o usuário parou?

  • A reprodução deve ser registrada no histórico?

  • Esse evento deve influenciar recomendações futuras?

Um único clique inicia uma cadeia de decisões.

No universo COBOL, poderíamos imaginar um programa monolítico:

PERFORM VALIDAR-USUARIO
PERFORM VALIDAR-ASSINATURA
PERFORM CONSULTAR-PERFIL
PERFORM CONSULTAR-CATALOGO
PERFORM VALIDAR-REGIAO
PERFORM LOCALIZAR-CONTEUDO
PERFORM REGISTRAR-REPRODUCAO
PERFORM INICIAR-STREAMING

Em uma arquitetura de microserviços, essas responsabilidades podem estar espalhadas por diversos programas independentes, executados em máquinas diferentes, atualizados por equipes distintas e comunicando-se por rede.

A operação deixa de ser um grande PERFORM local e passa a ser uma investigação distribuída.

Essa distinção é fundamental.

Quando um parágrafo COBOL chama outro dentro do mesmo programa, o custo costuma ser pequeno e previsível. Quando um serviço chama outro pela rede, surgem novos suspeitos:

  • latência;

  • perda de pacotes;

  • indisponibilidade;

  • timeout;

  • autenticação;

  • serialização;

  • incompatibilidade de versões;

  • congestionamento;

  • repetição de requisições;

  • respostas parciais.

A rede não é apenas um cabo entre dois sistemas.

A rede é uma variável de negócio.


2. O cliente: onde a ocorrência começa

O primeiro componente da arquitetura é o cliente.

Ele pode ser:

  • navegador web;

  • aplicativo Android ou iOS;

  • Smart TV;

  • videogame;

  • receptor multimídia;

  • tablet;

  • dispositivo antigo com poucos recursos.

Um erro comum do iniciante é imaginar que todos os clientes possuem capacidade semelhante.

Não possuem.

Uma Smart TV de entrada fabricada anos atrás pode ter pouca memória, processador limitado e sistema operacional desatualizado. Um smartphone moderno pode realizar tarefas muito mais sofisticadas. Um console de videogame possui características diferentes de um navegador.

O backend não deve simplesmente responder:

{
  "video": "filme.mp4"
}

Ele precisa considerar as características do dispositivo, da sessão e da rede.

Uma resposta mais realista pode incluir:

{
  "titleId": "8732451",
  "profile": "adulto",
  "audio": "pt-BR",
  "subtitle": "pt-BR",
  "resolution": "1080p",
  "hdr": false,
  "resumePosition": 1842,
  "streamingProfile": "adaptive"
}

O cliente é a primeira testemunha, mas nem sempre é confiável.

Ele pode estar:

  • com relógio incorreto;

  • usando uma versão antiga;

  • operando em uma rede instável;

  • repetindo uma requisição;

  • enviando dados incompletos;

  • tentando acessar uma API descontinuada.

Por isso, o backend nunca deve confiar cegamente em tudo que recebe.

No mainframe, essa ideia já existe há décadas: validar campos, proteger limites, conferir códigos, verificar autorização e tratar entradas como potencialmente problemáticas.

A tecnologia muda. A prudência permanece.


3. Elastic Load Balancer: o policial controlando a multidão

Depois que a requisição deixa o cliente, ela normalmente passa por um balanceador de carga.

No diagrama aparece o AWS Elastic Load Balancer, frequentemente abreviado como ELB.

Sua função é distribuir requisições entre várias instâncias de uma aplicação.

Imagine três servidores:

Servidor A
Servidor B
Servidor C

Sem balanceamento, todas as chamadas poderiam cair no Servidor A:

A: 100%
B:   0%
C:   0%

O resultado seria previsível:

Servidor A sobrecarregado
Servidor B ocioso
Servidor C ocioso
Usuários irritados
Equipe de plantão acordada

Com balanceamento:

A: 34%
B: 33%
C: 33%

O balanceador também realiza verificações de saúde.

Se o Servidor B deixa de responder:

A: saudável
B: fora de serviço
C: saudável

O tráfego é direcionado apenas para A e C.

No mundo IBM Z, o programador COBOL pode comparar esse comportamento, de forma conceitual, com mecanismos de distribuição e gerenciamento de carga encontrados em ambientes como:

  • WLM;

  • CICSplex;

  • Sysplex;

  • roteamento entre regiões CICS;

  • múltiplas instâncias de aplicações;

  • balanceamento de workloads.

Não são tecnologias idênticas, mas enfrentam uma pergunta semelhante:

“Para onde esta unidade de trabalho deve ser enviada?”

Curiosidade da perícia

O balanceador não precisa compreender toda a regra de negócio. Ele não precisa saber se o usuário está assistindo a um documentário ou a um anime.

Ele precisa saber coisas como:

  • qual servidor está saudável;

  • qual rota deve receber a chamada;

  • se a conexão deve ser encerrada;

  • se há capacidade disponível;

  • se a comunicação é segura.

Ele é o policial na entrada do prédio.

Não resolve o caso, mas impede que todas as testemunhas entrem pela mesma porta ao mesmo tempo.


4. API Gateway: a recepção blindada

Depois do balanceador, encontramos o API Gateway.

Ele funciona como um ponto central de entrada para as APIs.

Sem Gateway, o cliente poderia precisar conhecer dezenas de serviços:

login.netflix.exemplo
catalogo.netflix.exemplo
perfil.netflix.exemplo
pagamento.netflix.exemplo
recomendacao.netflix.exemplo
historico.netflix.exemplo

Isso criaria forte acoplamento entre o aplicativo e a estrutura interna.

Com um Gateway, o cliente acessa uma entrada controlada:

api.netflix.exemplo

O Gateway analisa a rota:

GET /profiles
GET /catalog
GET /recommendations
POST /playback/start

E encaminha cada requisição ao serviço correspondente.

Além do roteamento, o Gateway pode cuidar de:

  • autenticação;

  • autorização;

  • controle de taxa;

  • logs;

  • métricas;

  • transformação de mensagens;

  • compressão;

  • versionamento;

  • validação de tokens;

  • proteção contra abuso.

Exemplo de rate limiting

Um cliente normal pode fazer algumas requisições por segundo.

Um robô defeituoso pode tentar:

100.000 requisições por segundo

O Gateway pode interromper o abuso:

HTTP/1.1 429 Too Many Requests

Isso protege os serviços internos.

Em uma analogia mainframe, o Gateway reúne funções que podem lembrar, em diferentes níveis, componentes como:

  • front-end transacional;

  • camada de segurança;

  • validação RACF;

  • roteamento;

  • controle de acesso;

  • filtros;

  • monitoramento;

  • limites operacionais.

Ele não substitui o RACF nem é um CICS. A comparação serve apenas para ajudar o iniciante a localizar mentalmente a função.

Dica para o padawan COBOL

Nunca confunda “ponto único de entrada” com “ponto único de falha”.

Se existe apenas uma instância do Gateway e ela morre, toda a plataforma fica inacessível.

Por isso, o Gateway também deve ser:

  • replicado;

  • balanceado;

  • monitorado;

  • escalável;

  • tolerante a falhas.

Em sistemas críticos, até o porteiro precisa de substituto.


5. Microserviços: desmontando o monólito

Chegamos ao coração da arquitetura.

Um monólito reúne muitas funções dentro de uma única aplicação.

Poderíamos ter:

NETFLIX-APP
 ├── Login
 ├── Perfis
 ├── Catálogo
 ├── Busca
 ├── Pagamentos
 ├── Histórico
 ├── Recomendações
 ├── Legendas
 └── Streaming

No começo, esse modelo pode ser simples.

Uma única aplicação.

Um único pacote.

Um único processo de implantação.

Mas, conforme o sistema cresce, o monólito pode se tornar pesado:

  • milhões de linhas;

  • dependências difíceis;

  • testes demorados;

  • deploys arriscados;

  • equipes bloqueando umas às outras;

  • necessidade de escalar tudo, mesmo quando apenas uma função está sobrecarregada.

Os microserviços quebram o sistema em unidades menores:

Serviço de Login
Serviço de Perfil
Serviço de Catálogo
Serviço de Busca
Serviço de Recomendação
Serviço de Cobrança
Serviço de Reprodução
Serviço de Histórico

Cada serviço pode possuir:

  • código próprio;

  • ciclo de vida próprio;

  • equipe responsável;

  • banco ou armazenamento específico;

  • métricas;

  • versionamento;

  • capacidade de escala independente.

Se o serviço de recomendações está sobrecarregado, ele pode receber mais instâncias sem que o serviço de cobrança também precise crescer.

A grande armadilha

Microserviços não eliminam complexidade.

Eles redistribuem a complexidade.

O monólito concentra problemas dentro do programa.

Os microserviços espalham problemas por:

  • rede;

  • contratos de API;

  • autenticação;

  • logs;

  • filas;

  • bancos;

  • versões;

  • observabilidade;

  • deploys;

  • tolerância a falhas.

É como desmontar um grande arquivo sequencial em centenas de datasets.

Você ganha flexibilidade.

Também ganha centenas de nomes, catálogos, permissões, políticas e pontos de falha para administrar.

A arquitetura de microserviços não deve ser adotada porque está na moda. Ela faz sentido quando o domínio, a escala, a organização e a necessidade de independência justificam o custo operacional.

Evidência número 5-A

Um monólito bem projetado é melhor do que uma coleção de microserviços mal projetados.

Esse detalhe costuma desaparecer das apresentações corporativas.


6. Service Discovery: procurando suspeitos que mudam de endereço

Em um ambiente distribuído, os serviços nascem e morrem constantemente.

Uma instância do serviço de catálogo pode estar em:

10.20.14.8:8080

Após um novo deploy, outra instância surge em:

10.20.19.42:8080

Mais tarde, o auto scaling cria novas cópias:

10.20.21.10:8080
10.20.21.11:8080
10.20.21.12:8080

Como os demais serviços descobrem esses endereços?

Não é recomendável gravá-los no código:

MOVE '10.20.14.8' TO WS-ENDERECO-SERVICO.

Esse seria o equivalente distribuído de colocar o nome físico de um dataset em 300 programas COBOL.

A descoberta de serviços mantém um registro atualizado.

Cada serviço informa:

Nome: recommendation-service
Estado: saudável
Endereço: 10.20.21.10
Porta: 8080
Versão: 4.7

Na história da Netflix, o Eureka tornou-se uma referência conhecida para esse tipo de registro e descoberta.

Quando um serviço precisa localizar outro, consulta o registro ou utiliza informações mantidas em cache.

O paralelo com o mainframe

No mainframe, o programador raramente precisa conhecer o endereço físico exato de cada recurso de hardware. Há camadas de abstração, catálogos, subsistemas, definições e mecanismos de roteamento.

O Service Discovery segue uma lógica semelhante:

“Chame o serviço pelo nome lógico; deixe a infraestrutura descobrir onde ele está.”


7. Cache: a impressão digital da performance

O cache é uma das peças mais importantes de sistemas de alta escala.

Imagine que milhões de pessoas abram a mesma série popular.

Sem cache, cada requisição poderia consultar o banco:

SELECT *
  FROM TITULOS
 WHERE ID_TITULO = 8732451;

Multiplique isso por milhões.

O banco acabaria interrogado até confessar crimes que não cometeu.

Com cache, o resultado mais acessado fica temporariamente em memória:

Chave: TITULO:8732451
Valor: metadados do conteúdo
Tempo de vida: 10 minutos

A primeira requisição consulta o banco.

As próximas utilizam a memória.

Como a memória é muito mais rápida, a latência cai e o banco é protegido.

O que pode ficar em cache?

  • informações de perfil;

  • metadados de filmes;

  • títulos populares;

  • configurações;

  • sessões;

  • autorizações temporárias;

  • resultados de busca;

  • recomendações;

  • preferências;

  • disponibilidade regional.

O problema da evidência antiga

Cache também cria riscos.

Imagine que o usuário altere o nome do perfil:

Antes: Vagner
Depois: Conan do Mainframe

O banco foi atualizado, mas o cache continua contendo o valor antigo.

Durante algum tempo, o sistema pode mostrar:

Vagner

Isso é uma inconsistência temporária.

As principais estratégias incluem:

  • expiração por tempo;

  • invalidação após alteração;

  • atualização do cache;

  • cache-aside;

  • write-through;

  • write-behind.

Cache-aside, passo a passo

  1. A aplicação procura a informação no cache.

  2. Se encontrar, retorna imediatamente.

  3. Se não encontrar, consulta o banco.

  4. Armazena o resultado no cache.

  5. Retorna a resposta.

Pseudocódigo:

DADO = CACHE.GET(CHAVE)

SE DADO NÃO EXISTE
    DADO = BANCO.SELECT(CHAVE)
    CACHE.PUT(CHAVE, DADO)
FIM-SE

Para o programador COBOL, a lógica lembra o uso de tabelas em memória, áreas compartilhadas, buffers e recursos temporários para evitar acessos repetidos a dispositivos mais lentos.


8. Banco de dados: o cofre das evidências persistentes

O banco guarda informações que não podem desaparecer quando um processo termina.

Entre elas:

  • usuários;

  • perfis;

  • assinaturas;

  • histórico;

  • preferências;

  • metadados;

  • direitos de exibição;

  • dados financeiros;

  • configurações.

Uma arquitetura de larga escala raramente utiliza apenas um banco universal para tudo.

Diferentes necessidades podem exigir diferentes soluções:

  • dados relacionais;

  • chave-valor;

  • documentos;

  • séries temporais;

  • grafos;

  • pesquisa textual;

  • armazenamento de objetos.

Esse princípio é chamado, em muitos contextos, de persistência poliglota.

Não significa usar dezenas de bancos por entusiasmo tecnológico. Significa escolher o mecanismo adequado para cada tipo de problema.

O alerta do laboratório

Cada banco adicional aumenta:

  • conhecimento necessário;

  • manutenção;

  • monitoramento;

  • backup;

  • recuperação;

  • segurança;

  • custos;

  • complexidade operacional.

No mainframe, o ambiente costuma valorizar padronização e governança forte. Em plataformas distribuídas, a liberdade tecnológica precisa ser equilibrada por disciplina arquitetural.

Caso contrário, a empresa termina com:

37 bancos
14 formatos
9 sistemas de mensageria
0 pessoas que entendem o conjunto completo

Esse é o tipo de cena que nem o CSI deseja encontrar.


9. Kafka e arquitetura orientada a eventos

Quando o usuário pressiona Play, vários sistemas podem precisar saber que a reprodução começou.

Uma abordagem síncrona seria:

Serviço de Reprodução
    chama Histórico
    chama Métricas
    chama Recomendações
    chama Notificações
    chama Auditoria
    chama Analytics

O problema aparece quando um desses serviços está lento ou indisponível.

A reprodução poderia ficar presa esperando um sistema de analytics responder.

Em uma arquitetura orientada a eventos, o serviço publica uma ocorrência:

{
  "eventType": "PLAYBACK_STARTED",
  "userId": "U92837",
  "profileId": "P4",
  "titleId": "8732451",
  "timestamp": "2026-07-26T02:17:31Z"
}

O evento é enviado para um sistema de mensageria ou streaming como o Kafka.

Diversos consumidores podem receber a informação:

Consumidor de Histórico
Consumidor de Recomendações
Consumidor de Métricas
Consumidor de Auditoria
Consumidor de Notificações

O produtor não precisa conversar diretamente com todos.

Isso reduz acoplamento.

Analogia com MQ

Para um programador COBOL, Kafka pode lembrar alguns princípios de mensageria conhecidos no IBM MQ:

  • produtor;

  • consumidor;

  • desacoplamento;

  • comunicação assíncrona;

  • persistência;

  • reprocessamento;

  • filas ou tópicos;

  • confirmação;

  • tratamento de falhas.

Mas Kafka não é simplesmente “um MQ moderno”.

O Kafka trabalha de maneira muito associada a logs distribuídos, partições, offsets, retenção e processamento de fluxos.

No Kafka, mensagens podem permanecer disponíveis por um período e ser relidas.

Isso permite reconstruir estados, reprocessar eventos e alimentar diferentes consumidores.

O offset como marcador de página

Cada consumidor acompanha até onde leu.

Imagine:

Offset 1001
Offset 1002
Offset 1003
Offset 1004

Se o consumidor parar após o 1003, poderá reiniciar a partir daquele ponto.

É como um checkpoint.

Ou, para o veterano do batch:

“O restart point da investigação.”


10. Stream Processing: investigando enquanto o crime acontece

O processamento em lote analisa fatos acumulados.

O stream processing analisa eventos enquanto eles chegam.

Exemplos:

Usuário iniciou episódio
Usuário pausou
Usuário retrocedeu
Usuário abandonou
Usuário terminou
Usuário iniciou o próximo episódio

Um pipeline em tempo real pode detectar comportamentos:

  • aumento repentino de audiência;

  • falhas em determinada região;

  • vídeos travando em um modelo específico de TV;

  • abandono acima do normal;

  • tentativa de fraude;

  • mudança de interesse;

  • tendência viral.

O sistema não precisa aguardar o batch da madrugada.

Pode reagir imediatamente.

Exemplo operacional

Se milhares de usuários começam a receber erro de reprodução em uma região:

PLAYBACK_ERROR aumentou 800%
REGIÃO = Sudeste
DISPOSITIVO = Smart TV modelo X
VERSÃO = 12.4

O pipeline pode gerar um alerta.

A equipe descobre que uma atualização específica introduziu o defeito.

No CSI New York, isso seria o equivalente a cruzar:

  • horário;

  • localização;

  • tipo de vítima;

  • arma;

  • padrão de ocorrência.

Na observabilidade, cruzamos:

  • timestamp;

  • região;

  • versão;

  • dispositivo;

  • endpoint;

  • código de erro;

  • duração;

  • dependência.

O método científico continua o mesmo.


11. Elasticsearch: a busca no catálogo de evidências

Quando o usuário digita uma palavra, o sistema precisa encontrar rapidamente títulos relacionados.

Uma consulta relacional simples com LIKE pode funcionar em bases pequenas:

SELECT TITULO
  FROM CATALOGO
 WHERE TITULO LIKE '%CONAN%';

Em grandes catálogos, com múltiplos idiomas, erros de digitação, sinônimos e relevância, é útil empregar um mecanismo especializado em pesquisa textual.

O Elasticsearch cria índices que facilitam buscas como:

  • palavras parciais;

  • termos semelhantes;

  • filtros;

  • relevância;

  • categorias;

  • idiomas;

  • combinações de campos.

Se o usuário digitar:

filme barbaro espada

O sistema pode retornar obras relacionadas mesmo que a frase completa não apareça em nenhum título.

Curiosidade forense

Um mecanismo de busca não apenas pergunta:

“Existe correspondência?”

Ele também pergunta:

“Qual correspondência é mais relevante?”

Essa ordenação pode considerar:

  • popularidade;

  • idioma;

  • histórico;

  • região;

  • perfil;

  • proximidade textual;

  • tendências.

Buscar não é apenas localizar.

É classificar evidências.


12. Spark, Hadoop e o laboratório de processamento pesado

Enquanto o streaming analisa dados em movimento, tecnologias de processamento distribuído podem analisar grandes volumes históricos.

O Apache Spark pode ser utilizado em tarefas como:

  • transformação de dados;

  • limpeza;

  • agregação;

  • análise;

  • treinamento de modelos;

  • consolidação de métricas;

  • processamento em larga escala.

Imagine bilhões de eventos de reprodução.

Uma análise pode perguntar:

“Quantos usuários abandonaram episódios entre os minutos 12 e 15 durante os últimos 90 dias?”

Outro estudo:

“Quais tipos de conteúdo são assistidos após documentários científicos?”

Essas perguntas podem exigir processamento de enormes conjuntos de dados.

No universo mainframe, o conceito lembra grandes workloads batch:

ENTRADA MASSIVA
      ↓
CLASSIFICAÇÃO
      ↓
AGREGAÇÃO
      ↓
CÁLCULO
      ↓
SAÍDA ANALÍTICA

A diferença está na forma como o processamento é distribuído entre diversos nós.

O programador COBOL não deve subestimar o batch

Existe uma narrativa equivocada segundo a qual batch é tecnologia ultrapassada.

Não é.

Spark, Hadoop e diversos pipelines modernos executam, em essência, formas sofisticadas de processamento em lote e paralelismo distribuído.

O batch não morreu.

Ele trocou o JCL por YAML, JSON, Python e interfaces web, mas continua acordando de madrugada para processar milhões de registros.

Esse é um dos easter eggs do mundo moderno.


13. Amazon S3 e armazenamento de objetos

O Amazon S3 é um serviço de armazenamento de objetos.

Ele pode armazenar:

  • arquivos;

  • imagens;

  • dados de processamento;

  • logs;

  • backups;

  • artefatos;

  • conteúdo multimídia;

  • resultados analíticos.

É importante não imaginar um “disco C:” gigantesco.

O S3 organiza dados como objetos identificados por chaves.

Exemplo conceitual:

bucket: catalog-assets
key: posters/8732451/pt-BR/main.jpg

O objeto possui:

  • conteúdo;

  • identificador;

  • metadados;

  • permissões;

  • políticas;

  • versionamento opcional.

Para o programador mainframe, podemos comparar conceitualmente o uso de diferentes classes de armazenamento, datasets, políticas de retenção e catálogos. Novamente, a implementação é distinta, mas o princípio de organizar, proteger e recuperar grandes volumes permanece familiar.


14. A entrega do vídeo e a CDN

Um dos pontos mais importantes é separar o backend de controle da entrega efetiva do conteúdo.

O backend decide:

  • quem pode assistir;

  • qual conteúdo;

  • qual perfil;

  • qual qualidade;

  • qual licença;

  • qual localização.

Mas enviar o vídeo para milhões de pessoas exige infraestrutura especializada.

A Netflix desenvolveu a Open Connect, sua própria rede de distribuição de conteúdo.

Servidores podem ser posicionados próximos aos provedores de internet, reduzindo a distância entre o conteúdo e o usuário.

Em vez de cada reprodução atravessar metade do planeta:

Usuário no Brasil
       ↓
Servidor distante
       ↓
Alta latência

O conteúdo pode ser entregue a partir de um ponto mais próximo:

Usuário
   ↓
Provedor local
   ↓
Servidor Open Connect

Isso reduz:

  • latência;

  • congestionamento;

  • custo de trânsito;

  • risco de interrupções;

  • tempo de inicialização.

Analogia da locadora

Imagine uma locadora central em Nova York responsável por atender o mundo inteiro.

Seria impossível entregar cada filme rapidamente.

Uma CDN funciona como uma rede de filiais que mantém cópias dos títulos mais procurados próximas aos clientes.

Quando surge uma estreia popular, o conteúdo pode ser posicionado previamente.

O arquivo chega antes do espectador.

A vítima ainda nem entrou na cena, mas a perícia já preparou o laboratório.


15. Tolerância a falhas: todos são suspeitos

Em ambientes tradicionais, muitas equipes tentam impedir qualquer falha.

Em arquiteturas distribuídas, parte-se de uma premissa diferente:

“Algum componente falhará.”

A pergunta deixa de ser:

“Como garantir que nada falhe?”

E passa a ser:

“Como continuar operando quando algo falhar?”

Isso exige padrões como:

  • timeout;

  • retry controlado;

  • circuit breaker;

  • fallback;

  • redundância;

  • isolamento;

  • filas;

  • replicação;

  • degradação graciosa.

Timeout

Uma chamada não pode esperar para sempre.

Serviço A chama Serviço B
Tempo máximo: 500 ms

Se B não responder, A precisa tomar uma decisão.

Retry

A pode tentar novamente.

Mas retries indiscriminados são perigosos.

Se um serviço já está sobrecarregado, milhares de tentativas extras podem piorar a situação.

É o equivalente a uma multidão tentando abrir a mesma porta emperrada.

Circuit Breaker

O circuit breaker interrompe temporariamente chamadas para um serviço com falhas.

Estados conceituais:

FECHADO
Chamadas permitidas

ABERTO
Chamadas bloqueadas

SEMIABERTO
Algumas chamadas de teste

Isso evita que toda a plataforma continue pressionando um componente doente.

Fallback

Se o serviço de recomendações estiver indisponível, a tela inicial não precisa ficar totalmente vazia.

Pode exibir:

Títulos populares
Continuar assistindo
Novidades

O sistema perde personalização, mas continua funcional.

Isso é degradação graciosa.

Uma falha parcial não precisa se transformar em blackout total.


16. Chaos Monkey: soltando o suspeito dentro do laboratório

Uma das iniciativas mais famosas associadas à engenharia da Netflix foi a prática de testar resiliência por meio de falhas provocadas.

O Chaos Monkey tornou-se símbolo dessa filosofia.

A ideia é desconfortável:

desligar componentes propositalmente para descobrir se o sistema suporta a perda.

Parece loucura.

Mas existe lógica.

Se a arquitetura afirma tolerar a perda de uma instância, é melhor comprovar isso de maneira controlada do que descobrir durante uma estreia global.

É semelhante a:

  • simular disaster recovery;

  • testar restauração de backup;

  • executar exercícios de contingência;

  • remover um nó de um cluster;

  • validar failover;

  • testar um plano de continuidade.

Easter egg CSI

O Chaos Monkey é como um investigador que entra na sala de evidências, apaga uma luz, remove uma câmera e pergunta:

“Vocês ainda conseguem resolver o caso?”

Se a resposta for não, o sistema não era resiliente.

Apenas parecia resiliente enquanto tudo funcionava.


17. Observabilidade: logs não bastam

Em um monólito, um log pode mostrar quase toda a sequência.

Em microserviços, uma única transação atravessa muitos componentes.

Precisamos de três pilares:

  • logs;

  • métricas;

  • traces.

Logs

Mostram eventos detalhados:

2026-07-26 02:17:31
PLAYBACK REQUEST RECEIVED
USER=U92837
TITLE=8732451

Métricas

Mostram comportamentos agregados:

requisições por segundo
latência média
percentil 95
taxa de erro
uso de CPU
memória
fila acumulada

Traces distribuídos

Acompanham uma requisição através de vários serviços.

Exemplo:

TRACE-ID: ABC-92871

Gateway           12 ms
Profile Service   18 ms
Catalog Service   25 ms
Rights Service    40 ms
Playback Service  85 ms

Agora sabemos onde o tempo foi gasto.

Sem trace, cada equipe diria:

“Meu serviço está normal.”

E o usuário continuaria esperando.

A correlação é a impressão digital

Todas as chamadas relacionadas à mesma transação devem carregar um identificador de correlação.

CORRELATION-ID = ABC-92871

Esse código funciona como o número do caso no CSI.

Sem ele, a equipe possui milhares de fragmentos, mas não consegue provar quais pertencem à mesma ocorrência.


18. Segurança: ninguém entra na cena sem credencial

A arquitetura precisa proteger:

  • contas;

  • dados pessoais;

  • pagamentos;

  • conteúdo;

  • licenças;

  • APIs;

  • infraestrutura;

  • segredos;

  • chaves;

  • tokens.

A autenticação responde:

“Quem é você?”

A autorização responde:

“O que você pode fazer?”

Um usuário autenticado pode assistir a determinados conteúdos, mas não pode:

  • alterar o catálogo;

  • consultar dados de outros assinantes;

  • chamar APIs administrativas;

  • acessar segredos;

  • modificar regras de distribuição.

No mundo mainframe, essa mentalidade é profundamente familiar.

O RACF, por exemplo, trabalha com identidades, recursos, perfis e permissões.

Em ambientes distribuídos, a segurança pode envolver:

  • IAM;

  • tokens;

  • OAuth;

  • certificados;

  • TLS;

  • roles;

  • políticas;

  • secrets managers;

  • controle de rede;

  • auditoria.

A regra central permanece:

conceder apenas o acesso necessário.

O nome moderno é “princípio do menor privilégio”.

O mainframe já conhecia essa disciplina antes de ela virar slide de conferência.


19. Passo a passo de uma reprodução

Vamos reconstruir o caso completo.

Passo 1 — O usuário abre o aplicativo

O cliente carrega configurações e estabelece uma conexão segura.

Passo 2 — A requisição chega ao balanceador

O tráfego é direcionado para uma instância saudável do Gateway.

Passo 3 — O Gateway valida a chamada

Ele verifica token, rota, limite e versão da API.

Passo 4 — O perfil é consultado

O serviço de perfil identifica preferências, idioma e classificação.

Passo 5 — O catálogo é analisado

O sistema verifica se o título existe e está disponível naquela região.

Passo 6 — Direitos são validados

Nem todo conteúdo pode ser exibido em todos os países ou períodos.

Passo 7 — A sessão de reprodução é criada

O backend define parâmetros de streaming, dispositivo e qualidade.

Passo 8 — O conteúdo é localizado

O sistema identifica o ponto de distribuição adequado.

Passo 9 — O cliente inicia a reprodução

O vídeo começa a ser entregue adaptativamente.

Passo 10 — Eventos são publicados

PLAYBACK_STARTED

Passo 11 — Consumidores processam o evento

Histórico, analytics, recomendações e monitoramento reagem.

Passo 12 — Métricas são acompanhadas

A plataforma mede travamentos, bitrate, buffering e abandono.

Passo 13 — A qualidade é ajustada

Se a conexão piorar, a resolução pode cair.

Se melhorar, pode subir novamente.

Passo 14 — A sessão termina

O ponto de parada é salvo e um evento final pode ser publicado.

Tudo isso nasce de um botão.


20. O que o programador COBOL deve estudar primeiro

Não tente aprender toda a arquitetura de uma vez.

Siga uma sequência.

1. HTTP e APIs REST

Aprenda:

  • GET;

  • POST;

  • PUT;

  • DELETE;

  • headers;

  • status codes;

  • JSON;

  • autenticação.

2. Comunicação síncrona e assíncrona

Entenda a diferença entre:

esperar a resposta

e:

publicar mensagem e continuar

3. Filas e eventos

Compare conceitos do MQ com Kafka, sem assumir que são idênticos.

4. Cache

Estude:

  • hit;

  • miss;

  • TTL;

  • invalidação;

  • consistência.

5. Escalabilidade

Aprenda a diferença entre:

  • escala vertical;

  • escala horizontal.

Escala vertical:

máquina maior

Escala horizontal:

mais máquinas

6. Observabilidade

Aprenda a interpretar:

  • logs;

  • métricas;

  • traces;

  • dashboards;

  • alertas.

7. Resiliência

Estude:

  • timeout;

  • retry;

  • circuit breaker;

  • fallback;

  • bulkhead.

8. Containers e orquestração

Depois dos fundamentos, avance para Docker e Kubernetes.

Não comece pelo Kubernetes sem entender a aplicação.

Isso seria como estudar JES2 antes de compreender o que é um JOB.


21. Lições que o mundo distribuído pode aprender com o mainframe

A indústria gosta de apresentar microserviços como uma revolução completa.

Mas vários princípios fundamentais já existiam em ambientes corporativos muito antes:

  • processamento transacional;

  • controle de carga;

  • alta disponibilidade;

  • segurança centralizada;

  • recuperação;

  • auditoria;

  • mensageria;

  • monitoramento;

  • isolamento;

  • governança;

  • capacidade de processamento massivo.

O mainframe ensina disciplina.

O mundo distribuído ensina flexibilidade e descentralização.

As melhores arquiteturas aprendem com ambos.

Um profissional COBOL não deve olhar para a Netflix e pensar:

“Tudo que aprendi ficou obsoleto.”

Deve pensar:

“Muitos problemas são conhecidos. O que mudou foi a forma de distribuí-los e tratá-los.”

Um ABEND em um programa batch costuma deixar evidências concentradas:

  • código;

  • dump;

  • joblog;

  • step;

  • dataset;

  • horário.

Uma falha distribuída pode deixar fragmentos em:

  • 15 serviços;

  • 8 logs;

  • 3 regiões;

  • 2 filas;

  • 1 cache;

  • milhares de traces.

A habilidade de investigação torna-se ainda mais importante.


22. Curiosidades encontradas na sala de evidências

Curiosidade 1 — Microserviço não significa programa minúsculo

O tamanho deve refletir uma responsabilidade coerente.

Dividir demais produz “nano-serviços” que aumentam o tráfego e a complexidade.

Curiosidade 2 — Nem tudo precisa ser em tempo real

Muitos relatórios, consolidações e treinamentos de modelos podem ser batch.

Curiosidade 3 — O banco não deve ser tratado como fila

Usar uma tabela para simular mensageria pode funcionar em pequena escala, mas costuma criar bloqueios, consultas repetitivas e problemas operacionais.

Curiosidade 4 — Retry pode duplicar uma transação

Se o cliente envia uma cobrança, recebe timeout e tenta novamente, a primeira tentativa pode ter sido concluída.

Por isso, operações importantes precisam considerar idempotência.

Curiosidade 5 — Idempotência é o antídoto contra o duplo disparo

Uma mesma requisição repetida deve produzir um resultado controlado.

Exemplo:

IDEMPOTENCY-KEY: PAY-20260726-92871

Se a requisição for recebida novamente, o sistema reconhece que já a processou.

Curiosidade 6 — “Eventual consistency” não significa desorganização

Significa que diferentes partes podem levar algum tempo para convergir ao mesmo estado.

Mas esse comportamento precisa ser conhecido, medido e aceito pelo negócio.

Curiosidade 7 — Um sistema pode estar funcionando e ainda assim estar doente

A CPU pode estar normal, mas a latência aumentando.

Os servidores podem estar ativos, mas os caches com baixa taxa de acerto.

As APIs podem responder, mas os eventos podem estar acumulando.

Saúde não é apenas estar ligado.


Conclusão — O caso nunca foi apenas sobre streaming

No final da madrugada, o laboratório havia reconstruído o caminho da requisição.

O atraso não estava no vídeo.

Também não estava no banco.

A investigação encontrou uma cadeia inesperada:

  1. o cliente iniciou a chamada;

  2. o Gateway encaminhou corretamente;

  3. o serviço de perfil respondeu;

  4. o serviço de recomendação chamou uma dependência lenta;

  5. a dependência não possuía timeout adequado;

  6. threads começaram a se acumular;

  7. o balanceador continuou enviando tráfego;

  8. a latência contaminou outras chamadas;

  9. o sistema não caiu;

  10. mas ficou progressivamente mais lento.

O culpado não era um servidor quebrado.

Era uma espera sem limite.

O investigador fechou o relatório.

O programador COBOL olhou novamente para o diagrama.

Agora ele já não via apenas caixas coloridas e setas.

Via:

  • unidades de trabalho;

  • pontos de sincronização;

  • recursos compartilhados;

  • filas;

  • gargalos;

  • contratos;

  • estados;

  • dependências;

  • riscos;

  • evidências.

A arquitetura da Netflix não é importante apenas porque suporta vídeos.

Ela é importante porque demonstra como sistemas modernos podem ser construídos para operar em escala gigantesca, aceitando que máquinas falham, redes atrasam, serviços desaparecem e usuários continuam exigindo respostas imediatas.

Para o programador COBOL iniciante, a maior lição não é aprender nomes sofisticados.

Não é decorar Kafka, Spark, Elasticsearch ou API Gateway.

A verdadeira lição é compreender o fluxo.

Todo sistema recebe algo, valida, processa, consulta, decide, registra e responde.

O mainframe faz isso.

Os microserviços fazem isso.

A diferença está na distribuição das responsabilidades e na quantidade de fronteiras que a transação precisa atravessar.

No mainframe, muitas vezes entramos em um prédio fortificado.

Na arquitetura distribuída, atravessamos uma cidade inteira.

E em uma cidade com milhares de serviços, milhões de mensagens e bilhões de eventos, toda chamada deixa uma impressão digital.

Basta saber onde procurar.

No monitor do laboratório, uma nova ocorrência apareceu:

CASE NY-2026-0726

EVENT:
PLAYBACK_STARTED

STATUS:
PROCESSING

CORRELATION-ID:
BELLACOSA-MAINFRAME-001

O investigador pegou a caneca de café.

O programador abriu o terminal.

Em algum ponto da arquitetura, outra evidência acabava de ser produzida.

E o caso estava apenas começando.

BellacosaFlix Mainframe Developer Collection

Bootcamp DIO · Projeto Front-end

LusoFlix sem Mistérios para Programadores Web

Uma investigação completa sobre HTML, CSS e JavaScript, mostrando como um exercício inspirado na Netflix se transformou em um portal audiovisual de viagens, histórias, castelos e memórias de Portugal.

O que você encontrará nesta investigação

Os principais elementos técnicos analisados no projeto LusoFlix, organizados como uma coleção de episódios para estudantes de desenvolvimento web.

Estrutura

HTML como DATA DIVISION

Elementos semânticos, títulos, navegação, seções, artigos, links, imagens e a organização lógica da página.

Interface

CSS e identidade visual

Variáveis CSS, Flexbox, responsividade, gradientes, cores escuras, botões e aparência inspirada em streaming.

Interatividade

JavaScript e carrosséis

Scripts, bibliotecas externas, navegação horizontal, eventos e recursos capazes de tornar a página dinâmica.

Conteúdo

Memórias de Portugal

Lisboa, Setúbal, castelos, monumentos, igrejas, gastronomia, praias, rios, turismo e vídeos do YouTube.

Artigo completo incorporado

Leia o conteúdo dentro desta página ou utilize o botão de acesso direto caso o navegador bloqueie a incorporação.

Bootcamp DIO Projeto LusoFlix: Programadores Front-end em HTML, CSS e JavaScript

Blogspot

LusoFlix: desenvolvimento web com identidade própria

O LusoFlix nasceu como um projeto de desenvolvimento front-end realizado durante um Bootcamp da DIO. A proposta inicial era recriar uma interface inspirada na página principal da Netflix utilizando HTML, CSS e JavaScript.

Entretanto, o projeto ultrapassou a condição de simples clone. Em vez de reproduzir apenas uma coleção genérica de filmes e séries, o desenvolvedor criou um catálogo audiovisual dedicado a Portugal, reunindo vídeos sobre cidades, turismo, monumentos, história, castelos, praias, igrejas, gastronomia e experiências de viagem.

HTML semântico e organização do conteúdo

O HTML fornece a estrutura lógica da aplicação. Elementos como cabeçalho, navegação, seções, títulos, parágrafos, imagens, botões e links ajudam o navegador a compreender a hierarquia do conteúdo.

Uma estrutura semântica também favorece leitores de tela, tecnologias assistivas e mecanismos de busca, porque descreve a função de cada parte da página de maneira mais clara.

CSS, responsividade e experiência visual

O CSS é responsável pelo visual escuro, pelos destaques vermelhos, pela organização horizontal dos elementos, pelos espaçamentos e pelo comportamento responsivo. Recursos como Flexbox, variáveis CSS, gradientes, transições e media queries permitem adaptar a experiência a computadores, tablets e smartphones.

JavaScript e comportamento dinâmico

O JavaScript permite adicionar interatividade ao projeto. Carrosséis, eventos de clique, filtros, pesquisas, janelas modais e carregamento dinâmico de informações são exemplos de funcionalidades que podem ampliar uma página de catálogo.

Publicação e aprendizagem prática

O projeto demonstra como um exercício acadêmico pode se transformar em um produto pessoal. Ao associar programação, conteúdo autoral e memórias de viagem, o desenvolvedor deixa de apenas reproduzir uma interface e começa a construir uma experiência com identidade própria.

Leia a investigação completa no artigo Bootcamp DIO Projeto LusoFlix: Programadores Front-end em HTML, CSS e JavaScript .

  • LusoFlix
  • HTML5
  • CSS3
  • JavaScript
  • Bootcamp DIO
  • Desenvolvimento Front-end
  • Clone Netflix
  • GitHub Pages
  • Web Design
  • Portugal
  • Programação Web
  • Bellacosa Mainframe
☕ Um Café no Bellacosa Mainframe
HTML, CSS, JavaScript, desenvolvimento front-end, educação tecnológica e memórias de Portugal.

quarta-feira, 6 de dezembro de 2023

Bootcamp DIO Projeto LusoFlix : Programadores FrontEnd em HTML, CSS e JavaScript

Bellacosa Mainframe apresenta o projeto DIO Bootcamp Lusoflix


☕ Um Café no Bellacosa Mainframe

LusoFlix sem Mistérios para Programadores HTML, CSS e JavaScript

Quando um Programador Mainframe Descobre que uma Página Inspirada na Netflix Também Pode Guardar Viagens, Castelos, Histórias e Memórias de Portugal

Há projetos que nascem para ensinar uma propriedade do CSS.

Outros surgem para demonstrar uma biblioteca JavaScript.

Alguns existem apenas para cumprir uma atividade de bootcamp, receber uma avaliação e depois desaparecer em algum diretório chamado:

C:\CURSOS\PROJETOS\FINAL\FINAL_AGORA_VAI\

Mas, ocasionalmente, um exercício acadêmico escapa de sua finalidade original.

Ele ganha personalidade.

Recebe um nome próprio.

Passa a carregar fotografias, lembranças, histórias, viagens e pequenos fragmentos da vida de seu criador.

Foi exatamente isso que aconteceu com o LusoFlixhttps://vagnerbellacosa.github.io/002_WebDeveloper_ReplicaNetflix/

O projeto nasceu como uma recriação da interface inicial da Netflix, desenvolvida com HTML, CSS e JavaScript durante um laboratório de desenvolvimento web. Entretanto, em vez de simplesmente copiar filmes, séries e cartazes fictícios, a solução recebeu uma identidade própria: tornou-se uma homenagem a Portugal e um catálogo visual de vídeos publicados no YouTube sobre cidades, monumentos, castelos, praias, igrejas, gastronomia e experiências vividas em terras lusitanas. (GitHub)

Em outras palavras, o exercício deixou de ser apenas:

CLONE NETFLIX

e passou a funcionar como:

PORTAL AUDIOVISUAL DE MEMÓRIAS SOBRE PORTUGAL

É como se alguém tivesse recebido a missão de copiar uma tela de CICS e decidido transformá-la em um sistema completo de consulta histórica.

O LusoFlix demonstra algo essencial para todo programador iniciante:

Uma tecnologia pode ser aprendida através de exercícios, mas somente se torna realmente nossa quando a usamos para contar alguma coisa que nos pertence.

Nesta investigação do Bellacosa Mainframe, abriremos o código do LusoFlix como se estivéssemos analisando um dump de produção.

Examinaremos:

  • a estrutura HTML;

  • a estilização com CSS;

  • a pequena, mas importante, participação do JavaScript;

  • o uso de bibliotecas externas;

  • os carrosséis inspirados em serviços de streaming;

  • a integração com vídeos do YouTube;

  • o conteúdo sobre Portugal;

  • a hospedagem no GitHub Pages;

  • os recursos de SEO e compartilhamento;

  • os pontos fortes do projeto;

  • as melhorias possíveis;

  • e tudo aquilo que o HTML moderno permite construir atualmente.

Sirva o café.

Abra o navegador.

A investigação começou.


1. A cena inicial: o que é o LusoFlix?

O LusoFlix é uma aplicação web estática inspirada visualmente na página inicial da Netflix.

A página apresenta:

  • um cabeçalho com o logotipo LUSOFLIX;

  • um menu de navegação;

  • uma imagem principal de destaque;

  • botões de ação;

  • diversas categorias de vídeos;

  • carrosséis horizontais;

  • miniaturas clicáveis;

  • links para vídeos e playlists no YouTube;

  • informações adicionais sobre Portugal;

  • elementos de compartilhamento e SEO.

O próprio repositório define o projeto como uma réplica da página inicial da Netflix criada com HTML, CSS e JavaScript, utilizando bibliotecas externas. A adaptação temática substitui o catálogo tradicional por miniaturas de vídeos relacionados a viagens por Portugal. (GitHub)

Essa mudança de tema é mais importante do que pode parecer.

Um clone literal normalmente ensina apenas reprodução visual.

Já uma adaptação exige decisões.

O desenvolvedor precisa perguntar:

  • Qual será o conteúdo principal?

  • Como os itens serão categorizados?

  • Que imagem será usada no destaque?

  • Para onde apontarão os botões?

  • Como transformar vídeos do YouTube em um catálogo?

  • Como organizar dezenas de elementos sem perder coerência visual?

É justamente nessa adaptação que o exercício deixa de ser uma simples cópia.

O programador começa a trabalhar como projetista.


2. O HTML como DATA DIVISION da página

Para um programador COBOL, podemos comparar o HTML com uma mistura entre a DATA DIVISION e a estrutura de telas de um sistema online.

O HTML não determina, sozinho, todas as cores, animações ou comportamentos.

Sua principal responsabilidade é declarar:

  • o que existe;

  • qual é a hierarquia;

  • qual é o significado dos elementos;

  • como as partes da página estão organizadas.

O documento começa corretamente com:

<!DOCTYPE html>
<html lang="pt-br">

O DOCTYPE informa ao navegador que o documento utiliza HTML5.

Já o atributo:

lang="pt-br"

indica que o conteúdo está em português do Brasil.

Isso ajuda:

  • leitores de tela;

  • motores de busca;

  • ferramentas de tradução;

  • corretores ortográficos;

  • sistemas de acessibilidade.

Logo depois, o projeto define:

<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">

O charset="UTF-8" permite representar corretamente acentos, cedilhas e outros caracteres.

Sem isso, uma palavra como:

informações

poderia aparecer como uma pequena cena de crime digital:

informações

A meta tag viewport, por sua vez, é essencial para dispositivos móveis. Ela instrui o navegador a adaptar a largura da página à largura real da tela. Esses elementos aparecem logo no início do documento do LusoFlix.

Pense no viewport como um parâmetro de execução.

Sem ele, o navegador móvel tenta exibir a página como se estivesse simulando uma tela de desktop muito larga.

É praticamente um emulador 3270 tentando adivinhar a resolução de um smartphone.


3. O cabeçalho: identidade e navegação

O cabeçalho apresenta uma estrutura bastante clara:

<header>
    <div class="container">
        <h2 class="logo">LUSOFLIX</h2>

        <nav>
            <a href="...">Inicio</a>
            <a href="...">Lisboa</a>
            <a href="...">Turismo</a>
            <a href="...">Gastronomia</a>
        </nav>
    </div>
</header>

Temos aqui três componentes fundamentais:

header

Representa semanticamente o cabeçalho da página.

h2

Apresenta o nome do serviço.

nav

Agrupa os links principais de navegação.

O uso de elementos semânticos como header, nav, main e footer é uma das grandes evoluções do HTML moderno.

No passado, muitas páginas eram construídas quase exclusivamente com:

<div>

Era comum encontrar algo assim:

<div id="topo">
<div id="menu">
<div id="conteudo">
<div id="rodape">

Funcionava, mas o navegador não compreendia claramente a função de cada bloco.

Com HTML5, podemos informar o significado estrutural:

<header>
<nav>
<main>
<section>
<article>
<footer>

Essa semântica ajuda tanto os mecanismos de busca quanto as tecnologias assistivas.

No LusoFlix, os links do menu direcionam o visitante para vídeos relacionados ao início da jornada, Lisboa, turismo e gastronomia.

O menu não está ali apenas como decoração.

Ele funciona como um pequeno índice temático do acervo audiovisual.


4. O herói da página: a área de destaque

Todo serviço de streaming possui um conteúdo destacado.

É aquele grande painel que tenta capturar a atenção do visitante antes que ele comece a navegar pelo catálogo.

No LusoFlix, essa responsabilidade pertence à classe:

<div class="filme-principal">

Dentro dela encontramos:

<h3 class="titulo">Portugal</h3>

<p class="descricao">
    Venha conhecer uma terra belissima...
</p>

e dois botões principais:

ASSISTIR AGORA
MAIS INFORMAÇÕES

O primeiro direciona para uma playlist do YouTube.

O segundo leva o visitante a um blog com informações adicionais sobre Portugal.

Isso representa um padrão clássico de UX, a experiência do usuário:

  • uma ação principal;

  • uma ação secundária.

A ação principal diz:

Veja o conteúdo.

A ação secundária diz:

Conheça o contexto.

Em termos de sistema, poderíamos representar:

OPÇÃO 1 — EXECUTAR
OPÇÃO 2 — CONSULTAR DETALHES

A interface inspirada na Netflix funciona justamente porque aproveita um modelo mental que o usuário já conhece.

Ele vê um grande banner, encontra um botão de reprodução e imediatamente entende o que deve fazer.

Não é necessário explicar o fluxo.

A própria interface conduz o visitante.


5. O CSS entra na sala de interrogatório

Se o HTML define a estrutura, o CSS define a apresentação.

No arquivo principal de estilos, o LusoFlix começa declarando duas variáveis:

:root {
    --vermelho: #E50914;
    --preta: #141414;
}

Essas são Custom Properties, popularmente chamadas de variáveis CSS.

Em vez de repetir uma cor em vários lugares:

color: #E50914;
background: #141414;

o desenvolvedor pode usar:

color: var(--vermelho);
background: var(--preta);

As variáveis CSS funcionam como constantes de configuração visual.

Para um programador COBOL, a ideia lembra declarar valores centralizados na WORKING-STORAGE:

01 WS-COR-PRINCIPAL PIC X(7) VALUE '#E50914'.

Naturalmente, CSS e COBOL são mundos diferentes, mas a filosofia é semelhante:

Evite espalhar valores mágicos pelo programa.

Se amanhã o LusoFlix quiser trocar o vermelho por verde, basta alterar a variável principal.

Sem variáveis, seria necessário procurar dezenas de ocorrências.

Com variáveis, temos uma espécie de tabela de parâmetros visuais.

As cores escolhidas reproduzem a identidade clássica de uma plataforma de streaming: fundo quase preto, texto branco e destaque vermelho. O arquivo CSS centraliza essas cores e aplica o fundo escuro ao corpo da página.


6. O reset global e o misterioso box-sizing

O projeto utiliza:

* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

O seletor universal * aplica regras a todos os elementos.

Os navegadores incluem margens e espaçamentos padrão em títulos, parágrafos e outros componentes. Ao definir:

margin: 0;
padding: 0;

o desenvolvedor zera esses valores e passa a controlar o layout de forma mais previsível.

Já:

box-sizing: border-box;

resolve um problema histórico do CSS.

Imagine um elemento com:

width: 300px;
padding: 20px;
border: 2px;

No modelo tradicional, a largura total poderia ultrapassar os 300 pixels, pois padding e borda seriam somados à largura declarada.

Com border-box, a largura total permanece dentro dos 300 pixels.

É como reservar um registro de 300 bytes e garantir que os campos internos não ultrapassem o LRECL.

Sem isso, o layout pode sofrer o equivalente visual de um:

IEC141I 013-18

O conteúdo simplesmente não cabe onde deveria.


7. Flexbox: o organizador de filas do HTML moderno

O cabeçalho utiliza Flexbox:

header .container {
    display: flex;
    flex-direction: row;
    align-items: center;
    justify-content: space-between;
}

Essa combinação organiza o logotipo e o menu na mesma linha.

Vamos interpretar cada instrução.

display: flex

Ativa o modelo Flexbox.

flex-direction: row

Organiza os filhos horizontalmente.

align-items: center

Alinha os itens verticalmente ao centro.

justify-content: space-between

Coloca um item no início, outro no final e distribui o espaço entre eles.

Antes do Flexbox, layouts desse tipo frequentemente dependiam de:

  • float;

  • posicionamento absoluto;

  • tabelas;

  • margens negativas;

  • pequenos pactos com forças ocultas.

Com Flexbox, o navegador assume a responsabilidade de calcular os alinhamentos.

O resultado é um código mais legível e adaptável.

O CSS do LusoFlix emprega Flexbox tanto no cabeçalho quanto na organização da área principal.


8. A imagem de fundo e a técnica do gradiente

A área de destaque é construída com:

background:
    linear-gradient(
        rgba(0, 0, 0, .50),
        rgba(0, 0, 0, .50)
    ),
    url('../img/PortugalViagens.png');

Aqui temos duas camadas.

A primeira é um gradiente preto semitransparente.

A segunda é a imagem de Portugal.

O navegador sobrepõe o gradiente à fotografia.

Por que fazer isso?

Porque textos brancos podem perder legibilidade sobre imagens claras.

A camada escura aumenta o contraste e permite que título, descrição e botões continuem visíveis.

Essa técnica é muito comum em:

  • plataformas de streaming;

  • sites de turismo;

  • páginas de jogos;

  • landing pages;

  • portfólios;

  • vitrines de produtos.

O efeito é simples, mas poderoso.

A fotografia continua aparecendo, porém deixa de competir com a informação textual.

É como diminuir o ruído de uma evidência antes de ampliá-la no laboratório.


9. Botões e microinterações

Os botões são estilizados assim:

.botao {
    background-color: rgba(0, 0, 0, .50);
    border: none;
    color: white;
    padding: 15px 30px;
    cursor: pointer;
    transition: .3s ease all;
}

Quando o ponteiro passa sobre o botão:

.botao:hover {
    background-color: white;
    color: black;
}

Temos aqui uma microinteração.

O usuário movimenta o mouse.

O botão reage.

Essa resposta visual confirma:

Este elemento é clicável.

A propriedade:

transition: .3s ease all;

faz a mudança ocorrer suavemente.

Sem transição, a troca de cores seria instantânea.

Com transição, o navegador interpola os valores ao longo de aproximadamente três décimos de segundo.

Parece um detalhe pequeno.

Mas interfaces agradáveis são construídas justamente com pequenos detalhes.

Uma aplicação não precisa executar uma animação cinematográfica a cada clique.

Às vezes basta confirmar elegantemente que o usuário está no caminho certo.


10. O coração visual: os carrosséis

O LusoFlix organiza o acervo em categorias.

Entre elas aparecem:

  • Portugal;

  • Lisboa;

  • Setúbal;

  • Uma Viagem na História;

  • Castelos e vilas medievais;

  • A religiosidade nas igrejas;

  • Praias e rios.

Cada categoria contém miniaturas de vídeos publicadas em um carrossel horizontal. A página pública apresenta dezenas de links do YouTube distribuídos nessas seções temáticas. (Vagner Bellacosa)

A estrutura básica é semelhante a:

<div class="owl-carousel owl-theme">
    <div class="item">
        <a href="VIDEO">
            <img
                class="box-filme"
                src="MINIATURA"
                title="DESCRIÇÃO"
                alt="DESCRIÇÃO">
        </a>
    </div>
</div>

A classe:

owl-carousel

revela o uso da biblioteca Owl Carousel.

Essa biblioteca JavaScript transforma uma lista comum de elementos em um componente deslizável.

Ela pode controlar:

  • quantidade de itens visíveis;

  • navegação;

  • rolagem;

  • responsividade;

  • velocidade;

  • reprodução automática;

  • comportamento em diferentes tamanhos de tela.

O projeto inclui os arquivos CSS do Owl Carousel e seu tema visual no cabeçalho do documento.

Aqui existe uma importante lição arquitetural.

O desenvolvedor não precisa construir tudo do zero.

Usar uma biblioteca consolidada é equivalente a chamar uma rotina confiável em vez de reescrever a mesma lógica em cada programa.

No mainframe, usamos:

  • SORT;

  • IDCAMS;

  • LE routines;

  • APIs de CICS;

  • serviços de Db2;

  • módulos compartilhados.

Na web, utilizamos:

  • bibliotecas;

  • frameworks;

  • componentes;

  • APIs;

  • pacotes.

Reutilização não é preguiça.

É engenharia.

A única condição é compreender o que a dependência faz e quais riscos ela introduz.


11. Onde está o JavaScript?

O visitante pode olhar o HTML do LusoFlix e pensar:

Onde está toda aquela programação JavaScript prometida?

Grande parte do comportamento interativo está relacionada à inicialização do carrossel e às bibliotecas carregadas.

Em projetos desse tipo, o JavaScript costuma conter uma configuração parecida com:

$('.owl-carousel').owlCarousel({
    loop: true,
    margin: 10,
    nav: false,
    responsive: {
        0: {
            items: 1
        },
        600: {
            items: 3
        },
        1000: {
            items: 5
        }
    }
});

A lógica determina quantos cartões serão apresentados conforme a largura da tela.

Em um celular:

1 item por vez

Em uma tela intermediária:

3 itens

Em um desktop:

5 itens

O JavaScript não precisa ser enorme para ser importante.

Nesse projeto, ele atua como um operador de sala de controle.

O HTML fornece os itens.

O CSS fornece a aparência.

O JavaScript coordena a movimentação e a adaptação dinâmica.

Podemos resumir assim:

HTML       = inventário do catálogo
CSS        = cenografia
JavaScript = operador da esteira

12. O YouTube como backend audiovisual

Uma das decisões mais inteligentes do LusoFlix foi não tentar hospedar os vídeos dentro do próprio GitHub Pages.

Os vídeos permanecem no YouTube.

A página funciona como catálogo e ponto de acesso.

Cada miniatura é envolvida por um link:

<a href="https://www.youtube.com/watch?v=...">
    <img src="img/...">
</a>

Quando o usuário clica, o vídeo é aberto no YouTube.

Arquiteturalmente, temos:

LUSOFLIX
   |
   +-- apresenta catálogo
   |
   +-- organiza categorias
   |
   +-- exibe miniaturas
   |
   +-- encaminha reprodução
           |
           +-- YOUTUBE

Isso reduz:

  • consumo de banda;

  • complexidade de infraestrutura;

  • necessidade de servidor próprio;

  • preocupação com codecs;

  • armazenamento de arquivos pesados;

  • desenvolvimento de um player completo.

O YouTube assume responsabilidades como:

  • streaming adaptativo;

  • disponibilidade;

  • armazenamento;

  • player;

  • legendas;

  • compatibilidade;

  • estatísticas;

  • comentários;

  • inscrições;

  • recomendações.

O LusoFlix assume outra missão:

Organizar e contextualizar o acervo.

É uma arquitetura simples, porém coerente.

O portal não tenta substituir o YouTube.

Ele cria uma camada editorial sobre o conteúdo.


13. O canal como arquivo de uma vida em Portugal

Os vídeos não aparecem como elementos aleatórios.

Eles formam um mapa de experiências.

Na seção dedicada a Lisboa, encontramos temas como:

  • Oceanário de Lisboa;

  • Castelo de São Jorge;

  • Campo Pequeno;

  • Terreiro do Paço;

  • chegada aérea à cidade;

  • Sé Catedral;

  • ruas históricas;

  • museus;

  • imigração;

  • memórias pessoais.

Na categoria histórica surgem referências a:

  • Templo de Diana, em Évora;

  • Tavira;

  • Ponte de Prado;

  • Banco de Portugal em Faro;

  • Vila Real de Santo António;

  • Óbidos;

  • Mosteiro de Santa Maria da Vitória;

  • Guimarães.

Também há seções dedicadas a castelos, vilas medievais, igrejas, santuários, praias, rios e localidades da Margem Sul. Esses temas são identificáveis nos títulos e textos alternativos das miniaturas declaradas no HTML.

O canal, portanto, não é apenas um repositório de vídeos turísticos.

Ele mistura:

  • memória familiar;

  • documentação de viagens;

  • história;

  • arquitetura;

  • patrimônio;

  • religiosidade;

  • cotidiano;

  • deslocamentos;

  • imigração;

  • descobertas pessoais.

Isso torna o LusoFlix parecido com uma videoteca temática.

Cada miniatura funciona como uma ficha de catálogo.

Cada categoria funciona como uma coleção.

Cada clique abre um registro audiovisual.

No mainframe, poderíamos imaginar:

ARQUIVO-MESTRE-DE-VIDEOS

com uma chave lógica composta por:

PAÍS + REGIÃO + CATEGORIA + LOCAL + DATA

O que vemos na tela é apenas a camada de apresentação de um acervo muito maior.


14. As miniaturas como registros indexados

Considere este padrão:

<img
    class="box-filme"
    src="img/Historia0007.png"
    title="Encantos medievais em Obidos e suas belas muralhas"
    alt="Encantos medievais em Obidos e suas belas muralhas">

Há três informações fundamentais:

src

Indica o arquivo da imagem.

title

Apresenta uma dica quando o usuário mantém o cursor sobre a miniatura.

alt

Fornece uma descrição alternativa.

O atributo alt é especialmente importante.

Ele pode ser utilizado:

  • por leitores de tela;

  • quando a imagem não carrega;

  • por mecanismos de busca;

  • para contextualização semântica.

Um alt vazio ou genérico desperdiça informação.

Em vez de:

alt="imagem"

é melhor usar:

alt="Vista das muralhas medievais de Óbidos, Portugal"

Isso melhora acessibilidade e SEO.

No LusoFlix, muitas miniaturas já possuem descrições individualizadas, demonstrando a intenção de contextualizar o conteúdo visual.


15. SEO: deixando pistas para os mecanismos de busca

O documento inclui diversas meta tags:

<meta name="Author" content="Vagner Bellacosa">

<meta
    name="Description"
    content="Aplicação dos comandos HTML, CSS e JavaScript...">

Também existem propriedades Open Graph:

<meta property="og:title" content="LusoFlix - Viagens a Portugal">
<meta property="og:site_name" content="LusoFlix">
<meta property="og:description" content="...">
<meta property="og:image" content="...">
<meta property="og:type" content="article">

Essas propriedades ajudam plataformas sociais a gerar uma prévia quando a página é compartilhada.

Sem Open Graph, um link pode aparecer apenas como uma URL seca.

Com os metadados corretos, o compartilhamento pode apresentar:

  • título;

  • descrição;

  • imagem;

  • identificação do site.

É como anexar uma capa, um resumo e uma classificação ao registro antes de enviá-lo para outro sistema.

O projeto também declara autoria, palavras-chave, descrição, imagem social, seção temática e endereço canônico utilizado no compartilhamento.

Atualmente, a meta tag keywords possui pouco peso nos grandes mecanismos de busca, mas a descrição, o título, o conteúdo visível, os cabeçalhos, o texto alternativo e a estrutura semântica continuam importantes.

Uma evolução moderna poderia incluir:

<link
    rel="canonical"
    href="https://vagnerbellacosa.github.io/002_WebDeveloper_ReplicaNetflix/">

E também dados estruturados em JSON-LD:

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "CollectionPage",
  "name": "LusoFlix",
  "description": "Catálogo de vídeos sobre Portugal",
  "inLanguage": "pt-BR"
}
</script>

Isso ajudaria os mecanismos de busca a compreenderem que a página representa uma coleção temática.


16. GitHub Pages: o pequeno data center gratuito

O LusoFlix está publicado por meio do GitHub Pages.

Essa solução permite transformar um repositório GitHub em um site estático acessível publicamente.

O fluxo básico é:

ARQUIVOS LOCAIS
      |
      v
GIT COMMIT
      |
      v
GIT PUSH
      |
      v
REPOSITÓRIO GITHUB
      |
      v
GITHUB PAGES
      |
      v
SITE PUBLICADO

Para projetos HTML, CSS e JavaScript que não dependem de processamento no servidor, o GitHub Pages é extremamente útil.

Ele pode hospedar:

  • portfólios;

  • documentação;

  • páginas institucionais;

  • demonstrações;

  • laboratórios;

  • currículos;

  • catálogos;

  • jogos JavaScript;

  • páginas educacionais;

  • protótipos.

O repositório do LusoFlix contém diretórios separados para imagens, JavaScript e estilos, além do index.html, documentação, licença e histórico de commits. (GitHub)

Essa organização já introduz boas práticas:

/index.html
/img
/js
/style

É simples, direta e compreensível para quem está começando.


17. O que o HTML moderno permite fazer?

O LusoFlix demonstra uma parte do poder da web, mas o HTML moderno permite ir muito além.

Hoje, um navegador é quase uma pequena plataforma operacional.

Com tecnologias abertas, podemos criar:

  • players de vídeo;

  • editores;

  • jogos;

  • dashboards;

  • aplicativos offline;

  • mapas;

  • gráficos;

  • sistemas de voz;

  • videoconferência;

  • reconhecimento de dispositivos;

  • armazenamento local;

  • notificações;

  • aplicações instaláveis;

  • experiências tridimensionais.

Vamos examinar algumas possibilidades.


18. Vídeos incorporados diretamente na página

O próprio código possui um comentário indicando uma intenção futura de incorporar vídeos do YouTube ao corpo da página.

Isso poderia ser feito com:

<iframe
    src="https://www.youtube.com/embed/ID_DO_VIDEO"
    title="Vídeo sobre Portugal"
    loading="lazy"
    allowfullscreen>
</iframe>

A vantagem seria permitir a reprodução sem abandonar o LusoFlix.

Uma evolução ainda melhor seria abrir o vídeo em uma janela modal:

CLIQUE NA MINIATURA
        |
        v
ABRE MODAL
        |
        v
CARREGA PLAYER
        |
        v
REPRODUZ VÍDEO

O JavaScript poderia capturar o clique:

const cards = document.querySelectorAll('[data-video]');

cards.forEach(card => {
    card.addEventListener('click', () => {
        abrirVideo(card.dataset.video);
    });
});

Assim, cada cartão receberia:

<button data-video="ylPVYS7Rgyg">
    <img src="img/portugal0001.png" alt="Elvas">
</button>

O uso de button seria semanticamente melhor quando a ação não fosse navegar, mas abrir uma interface interna.


19. Carregamento preguiçoso de imagens

Uma página com dezenas de miniaturas pode consumir muitos recursos.

O HTML moderno oferece:

<img
    src="img/miniatura.png"
    loading="lazy"
    alt="Descrição do vídeo">

Com loading="lazy", o navegador adia o carregamento de imagens que ainda estão fora da área visível.

Isso melhora:

  • tempo inicial de abertura;

  • consumo de banda;

  • experiência em celulares;

  • desempenho;

  • métricas de carregamento.

É semelhante a não carregar um arquivo inteiro quando o programa utilizará apenas alguns registros.

A diferença é que o navegador administra esse acesso sob demanda.


20. Imagens responsivas

O atributo srcset, presente em várias imagens do projeto, pode ser explorado de forma mais completa.

Por exemplo:

<img
    src="img/lisboa-800.jpg"
    srcset="
        img/lisboa-400.jpg 400w,
        img/lisboa-800.jpg 800w,
        img/lisboa-1200.jpg 1200w
    "
    sizes="
        (max-width: 600px) 90vw,
        300px
    "
    alt="Vista histórica de Lisboa">

O navegador escolhe automaticamente a imagem mais apropriada.

Um celular não precisa baixar uma imagem de 3.000 pixels se ela será exibida em um cartão de 300 pixels.

Isso é otimização orientada pelo cliente.


21. CSS Grid: organizando catálogos complexos

O Flexbox é excelente para linhas e alinhamentos.

O CSS Grid é especialmente poderoso para layouts bidimensionais.

Uma futura página de pesquisa do LusoFlix poderia utilizar:

.catalogo {
    display: grid;
    grid-template-columns:
        repeat(auto-fit, minmax(220px, 1fr));
    gap: 1rem;
}

Essa única regra cria uma grade adaptável.

Os cartões se reorganizam conforme a largura disponível.

Em desktop:

[1] [2] [3] [4] [5]

Em tablet:

[1] [2] [3]
[4] [5]

Em celular:

[1]
[2]
[3]

Sem calcular manualmente cada posição.

É uma revolução quando comparada às antigas tabelas HTML utilizadas para diagramar páginas.


22. Busca dinâmica com JavaScript

Imagine um campo:

<input
    type="search"
    id="busca"
    placeholder="Pesquisar Lisboa, castelos, praias...">

O JavaScript poderia filtrar os cartões:

const busca = document.querySelector('#busca');
const videos = document.querySelectorAll('.video-card');

busca.addEventListener('input', evento => {
    const termo = evento.target.value.toLowerCase();

    videos.forEach(video => {
        const texto = video.textContent.toLowerCase();
        video.hidden = !texto.includes(termo);
    });
});

O usuário poderia digitar:

castelo

e visualizar apenas os vídeos relacionados.

Isso transformaria o catálogo estático em uma interface de consulta.

O equivalente mainframe seria sair de uma listagem sequencial e criar uma pesquisa indexada.


23. Catálogo alimentado por JSON

No código atual, cada vídeo é declarado manualmente no HTML.

Funciona, mas gera repetição.

Uma arquitetura moderna poderia armazenar o catálogo em JSON:

[
  {
    "titulo": "Castelo de São Jorge",
    "categoria": "Lisboa",
    "videoId": "rjypUMC2RxI",
    "imagem": "img/lisboa0002.png"
  },
  {
    "titulo": "Templo de Diana em Évora",
    "categoria": "História",
    "videoId": "gLpjM3Xn2Rk",
    "imagem": "img/Historia0001.png"
  }
]

O JavaScript carregaria esses dados:

fetch('./data/videos.json')
    .then(resposta => resposta.json())
    .then(videos => montarCatalogo(videos))
    .catch(erro => console.error(
        'Falha ao carregar catálogo:',
        erro
    ));

A página seria criada dinamicamente.

As vantagens seriam:

  • menos repetição;

  • manutenção facilitada;

  • filtros;

  • ordenação;

  • busca;

  • geração automática de categorias;

  • possibilidade de integrar APIs.

Em termos de arquitetura:

ANTES
HTML = estrutura + dados + catálogo

DEPOIS
HTML = estrutura
CSS  = apresentação
JSON = dados
JS   = montagem e comportamento

Essa separação lembra a divisão entre programa, arquivo e camada de apresentação.


24. Progressive Web App: um LusoFlix instalável

Com um arquivo de manifesto e um Service Worker, o LusoFlix poderia se tornar uma Progressive Web App, ou PWA.

Isso permitiria:

  • instalação na tela inicial;

  • ícone próprio;

  • abertura semelhante a aplicativo;

  • cache de arquivos;

  • funcionamento parcial offline;

  • carregamento mais rápido em visitas futuras.

Um manifesto básico poderia declarar:

{
  "name": "LusoFlix",
  "short_name": "LusoFlix",
  "start_url": "/",
  "display": "standalone",
  "background_color": "#141414",
  "theme_color": "#E50914"
}

O Service Worker poderia armazenar:

  • HTML;

  • CSS;

  • JavaScript;

  • logotipo;

  • imagens principais.

Naturalmente, os vídeos do YouTube ainda dependeriam de conexão.

Mas a estrutura do catálogo poderia continuar acessível.


25. Acessibilidade: o usuário que não vemos

Uma interface moderna deve ser utilizável por pessoas com diferentes necessidades.

Algumas melhorias possíveis seriam:

Navegação por teclado

Todos os cartões e controles precisam ser alcançáveis com Tab.

Foco visível

a:focus-visible,
button:focus-visible {
    outline: 3px solid white;
    outline-offset: 3px;
}

Botões semanticamente corretos

Evitar colocar <button> dentro de <a> quando uma única ação pode ser representada por um link estilizado.

Por exemplo:

<a class="botao" href="PLAYLIST">
    Assistir agora
</a>

Rótulos descritivos

<a
    href="VIDEO"
    aria-label="Assistir ao vídeo sobre o Castelo de São Jorge">

Contraste

Garantir que textos cinza possuam contraste suficiente sobre o fundo escuro.

Movimento reduzido

@media (prefers-reduced-motion: reduce) {
    * {
        scroll-behavior: auto;
        transition: none;
        animation: none;
    }
}

Uma interface acessível não é uma versão especial do sistema.

É o sistema construído corretamente.


26. Pequenas evidências encontradas no código

Toda investigação encontra detalhes curiosos.

No LusoFlix, alguns pontos merecem atenção.

Há links em determinadas seções nos quais as aspas do endereço parecem não estar encerradas antes de target="_blank".

Um exemplo conceitual do problema seria:

<a href="https://www.youtube.com/watch?v=ABC target="_blank">

O correto é:

<a
    href="https://www.youtube.com/watch?v=ABC"
    target="_blank"
    rel="noopener noreferrer">

Quando usamos target="_blank", também é recomendável adicionar:

rel="noopener noreferrer"

Isso reduz riscos associados à página aberta acessar o contexto da página original.

Também aparecem casos de atributos alt duplicados em algumas imagens.

O navegador normalmente tentará tolerar o erro, mas o HTML deveria manter apenas um atributo:

<img
    src="imagem.png"
    alt="Descrição correta">

Esses problemas não diminuem o mérito do projeto.

Ao contrário.

Eles são parte natural do aprendizado.

Todo código antigo funciona como uma fotografia do conhecimento que tínhamos quando o escrevemos.

Revisitar um projeto anos depois é semelhante a abrir um programa COBOL da década de 1990.

Você encontra:

  • decisões corretas;

  • soluções criativas;

  • limitações da época;

  • convenções antigas;

  • oportunidades de modernização;

  • e comentários que parecem mensagens deixadas por uma versão anterior de nós mesmos.


27. Modernizar sem destruir a personalidade

Uma atualização do LusoFlix não deveria apagar sua origem.

Seria um erro transformá-lo em mais um template genérico, tecnicamente perfeito e emocionalmente vazio.

A modernização ideal preservaria:

  • o nome;

  • o tema português;

  • o vermelho característico;

  • as miniaturas;

  • a divisão por localidades;

  • a conexão com o canal;

  • o caráter de diário audiovisual;

  • a simplicidade do projeto original.

Ao mesmo tempo, poderia adicionar:

  • modal de reprodução;

  • busca;

  • filtros;

  • carregamento dinâmico;

  • catálogo JSON;

  • melhor responsividade;

  • acessibilidade;

  • lazy loading;

  • dados estruturados;

  • página individual para cada vídeo;

  • favoritos em localStorage;

  • compartilhamento pela Web Share API;

  • modo claro e escuro;

  • mapa interativo de Portugal.

A modernização correta não pergunta:

Como substituímos tudo?

Ela pergunta:

O que merece permanecer e o que precisa evoluir?

Essa é a mesma pergunta feita em qualquer projeto sério de modernização de legado.


28. Um mapa interativo para as viagens

Uma expansão fascinante seria relacionar vídeos a localidades geográficas.

Cada registro poderia possuir:

{
  "titulo": "Castelo de São Jorge",
  "cidade": "Lisboa",
  "latitude": 38.7139,
  "longitude": -9.1335,
  "videoId": "..."
}

Uma biblioteca de mapas poderia apresentar marcadores em:

  • Lisboa;

  • Setúbal;

  • Évora;

  • Tavira;

  • Faro;

  • Óbidos;

  • Guimarães;

  • Fátima;

  • Sintra;

  • Tomar;

  • Leiria;

  • Elvas.

O visitante poderia clicar em um ponto do mapa e abrir o vídeo correspondente.

A experiência deixaria de ser apenas um catálogo linear.

Tornar-se-ia uma viagem digital.

MAPA
 |
 +-- LISBOA
 |     +-- CASTELO
 |     +-- OCEANÁRIO
 |     +-- BELÉM
 |
 +-- ÉVORA
 |     +-- TEMPLO DE DIANA
 |
 +-- SINTRA
       +-- CASTELO DOS MOUROS

Seria praticamente um KSDS turístico, no qual a chave de acesso seria a localização geográfica.


29. Favoritos com localStorage

O navegador permite armazenar pequenas informações localmente.

Um visitante poderia marcar vídeos favoritos:

const favoritos =
    JSON.parse(localStorage.getItem('favoritos')) || [];

function salvarFavorito(videoId) {
    if (!favoritos.includes(videoId)) {
        favoritos.push(videoId);

        localStorage.setItem(
            'favoritos',
            JSON.stringify(favoritos)
        );
    }
}

Na próxima visita, os favoritos continuariam disponíveis.

Isso não exige banco de dados nem autenticação.

É armazenamento local no navegador.

Naturalmente, possui limitações:

  • os dados ficam naquele dispositivo;

  • podem ser apagados;

  • não são sincronizados;

  • não servem para informações sensíveis.

Mas, para um catálogo pessoal, é uma solução simples e eficiente.


30. Web Share API: compartilhar uma descoberta

Em celulares compatíveis, a Web Share API permite abrir o menu nativo de compartilhamento:

async function compartilhar(video) {
    if (!navigator.share) {
        return;
    }

    await navigator.share({
        title: video.titulo,
        text: 'Conheça este lugar em Portugal',
        url: video.url
    });
}

O visitante poderia compartilhar o vídeo por:

  • WhatsApp;

  • e-mail;

  • redes sociais;

  • aplicativos instalados.

O navegador torna-se uma ponte entre a página e o sistema operacional.


31. O HTML como plataforma, não apenas marcação

Durante muitos anos, ensinar HTML significava apresentar:

<h1>
<p>
<a>
<img>
<table>

Tudo isso continua importante.

Mas a plataforma web moderna inclui muito mais.

O navegador atual oferece recursos para:

  • áudio e vídeo;

  • desenho com Canvas;

  • gráficos vetoriais SVG;

  • comunicação em tempo real;

  • armazenamento;

  • criptografia;

  • localização, mediante autorização;

  • câmera e microfone, mediante autorização;

  • arrastar e soltar;

  • arquivos locais;

  • notificações;

  • execução offline;

  • acessibilidade;

  • animações;

  • componentes personalizados;

  • integração com dispositivos.

O HTML não substitui sozinho Java, C#, COBOL ou Python.

Mas, combinado com CSS e JavaScript, ele se transforma na interface universal de inúmeros sistemas.

O navegador é hoje o terminal de acesso do mundo.

O 3270 conectava o usuário ao mainframe.

O browser conecta o usuário a:

  • nuvens;

  • APIs;

  • bancos;

  • vídeos;

  • aplicações corporativas;

  • inteligência artificial;

  • sistemas governamentais;

  • comércio eletrônico;

  • plataformas educacionais.

Mudou a tela.

A necessidade de arquitetura permaneceu.


32. Um exercício que ensina mais do que parece

À primeira vista, o LusoFlix pode parecer apenas um clone visual criado em um bootcamp.

Mas, ao investigarmos o projeto, encontramos várias disciplinas:

HTML

Estrutura, links, imagens, metadados e semântica.

CSS

Cores, Flexbox, fundos, gradientes, botões, hover e responsividade.

JavaScript

Inicialização de componentes e comportamento do carrossel.

Bibliotecas

Owl Carousel, ícones e dependências externas.

UX

Organização por categorias e ações claramente identificadas.

Arquitetura de conteúdo

Classificação dos vídeos por região e tema.

SEO

Descrição, título, Open Graph e textos alternativos.

DevOps básico

Versionamento com Git e publicação no GitHub Pages.

Produção audiovisual

Integração com vídeos e playlists do YouTube.

Identidade

Transformação de um exercício genérico em uma homenagem pessoal a Portugal.

Isso é desenvolvimento de software.

Não se trata apenas de escrever comandos.

Trata-se de combinar tecnologias para comunicar uma ideia.


33. Passo a passo para um padawan criar seu próprio catálogo

Um desenvolvedor iniciante poderia usar o LusoFlix como referência e seguir esta sequência.

Passo 1 — Escolher um tema

Pode ser:

  • viagens;

  • mainframe;

  • animes;

  • filmes clássicos;

  • cursos;

  • músicas;

  • jogos;

  • patrimônio histórico;

  • receitas;

  • vídeos familiares.

Passo 2 — Criar a estrutura

/projeto
    index.html
    /css
    /js
    /img
    /data

Passo 3 — Montar o HTML sem estilo

Primeiro, crie:

  • cabeçalho;

  • menu;

  • destaque;

  • categorias;

  • cartões;

  • rodapé.

Passo 4 — Aplicar o CSS

Defina:

  • paleta;

  • tipografia;

  • espaçamento;

  • Flexbox;

  • Grid;

  • estados de hover;

  • responsividade.

Passo 5 — Adicionar JavaScript

Implemente:

  • carrossel;

  • busca;

  • filtros;

  • modal;

  • favoritos.

Passo 6 — Trabalhar acessibilidade

Revise:

  • alt;

  • foco;

  • teclado;

  • contraste;

  • títulos;

  • rótulos.

Passo 7 — Melhorar SEO

Inclua:

  • título;

  • descrição;

  • Open Graph;

  • canonical;

  • JSON-LD;

  • conteúdo textual útil.

Passo 8 — Publicar

Use:

  • Git;

  • GitHub;

  • GitHub Pages.

Passo 9 — Testar

Teste em:

  • desktop;

  • celular;

  • tablet;

  • teclado;

  • conexão lenta;

  • imagens desativadas.

Passo 10 — Evoluir

Não tente terminar tudo na primeira versão.

Publique.

Observe.

Melhore.


34. Easter egg localizado

Entre os textos das miniaturas existe uma referência curiosa a:

42 e a resposta

Para os viajantes intergalácticos que carregam uma toalha, o número 42 é a resposta para a pergunta fundamental sobre a vida, o universo e tudo mais.

No LusoFlix, ele aparece associado a uma memória de aniversário.

É um pequeno detalhe, mas combina perfeitamente com a tradição Bellacosa:

  • tecnologia;

  • memória;

  • cultura pop;

  • viagens;

  • uma referência escondida esperando ser descoberta.

Todo bom sistema possui documentação.

Todo grande sistema possui lendas.


35. Conclusão: o clone que deixou de ser clone

O LusoFlix começou como um exercício inspirado na Netflix.

Mas chamar o projeto apenas de clone seria reduzir sua importância.

Tecnicamente, ele demonstra fundamentos essenciais:

  • HTML5;

  • CSS3;

  • Flexbox;

  • variáveis CSS;

  • gradientes;

  • responsividade;

  • bibliotecas JavaScript;

  • carrosséis;

  • integração com conteúdo externo;

  • SEO;

  • GitHub Pages.

Culturalmente, ele faz algo mais valioso.

Organiza lembranças sobre Portugal.

Transforma vídeos dispersos em coleções.

Apresenta Lisboa, Setúbal, castelos, igrejas, praias e cidades históricas como se fossem temporadas de uma grande série documental.

O visitante não encontra apenas cartões clicáveis.

Encontra registros de uma jornada.

E talvez essa seja a principal lição para quem começa a programar para a web.

Você pode aprender HTML criando uma página de exercícios.

Pode aprender CSS copiando um layout.

Pode aprender JavaScript movimentando um carrossel.

Mas o verdadeiro salto acontece quando o projeto deixa de ser uma reprodução e passa a carregar sua identidade.

O LusoFlix usa a linguagem visual de uma plataforma mundial para contar uma história pessoal sobre Portugal.

O código é simples.

A arquitetura é estática.

A infraestrutura é leve.

Mas a ideia é poderosa.

Porque software não é apenas aquilo que o computador executa.

Software também é aquilo que o desenvolvedor decide preservar.

No Bellacosa Mainframe, um registro somente existe enquanto permanece gravado.

Na web, uma memória somente atravessa o tempo quando alguém decide transformá-la em:

<article>
    <h1>Uma história que merece continuar acessível</h1>
</article>

E assim encerramos esta investigação.

O HTML estruturou a cena.

O CSS acendeu as luzes.

O JavaScript colocou o catálogo em movimento.

O YouTube armazenou as imagens do passado.

E o LusoFlix provou que um simples exercício de bootcamp pode se transformar em uma pequena cápsula digital de viagens, afetos e histórias portuguesas.

RETURN-CODE = 0000
CATÁLOGO CARREGADO
MEMÓRIA PRESERVADA
CAFÉ AINDA QUENTE

O texto já está estruturado para publicação no Blogspot, com introdução, análise técnica, exemplos, curiosidades, melhorias e conclusão no estilo Bellacosa Mainframe.

Produção original Bellacosa

LusoFlix: HTML, CSS e JavaScript

Uma coleção sobre desenvolvimento web, estudos em JavaScript, desafios de programação e o projeto LusoFlix, uma experiência visual inspirada nas plataformas de streaming e dedicada às viagens, histórias, castelos e paisagens de Portugal.

  • HTML5
  • CSS3
  • JavaScript
  • GitHub Pages
  • DIO
  • Portugal

Central de exibição

Explore o projeto e os artigos sem sair desta página. Caso o site de origem impeça a exibição em iframe, utilize o botão “Abrir original” abaixo de cada quadro.

Desenvolvimento web, JavaScript e aprendizagem contínua

O LusoFlix é um projeto front-end inspirado na experiência visual de uma plataforma de streaming. Desenvolvido com HTML, CSS e JavaScript, apresenta um catálogo de vídeos sobre Portugal organizado por temas como Lisboa, Setúbal, turismo, gastronomia, castelos, localidades históricas, igrejas, praias e rios.

O projeto demonstra como o HTML estrutura o conteúdo, como o CSS cria a identidade visual e como o JavaScript adiciona comportamento e interatividade. A publicação no GitHub Pages transforma o repositório em uma aplicação acessível diretamente pelo navegador.

JavaScript e plano de estudos

O artigo Dia 7: JavaScript e Plano de Estudos apresenta uma estratégia de aprendizagem baseada em aulas, exercícios, anotações, pesquisas, documentação oficial, repositórios GitHub, depuração no navegador e prática constante.

Bootcamps, desafios e comunidade

O artigo Dia 21: Minha incrível aventura nos desafios da DIO registra experiências com cursos, bootcamps, laboratórios, desafios de programação, VS Code, Node.js, fóruns, mentorias e produção de conhecimento para a comunidade de desenvolvedores.

Juntos, os três conteúdos formam uma pequena trilogia sobre criação, estudo e evolução profissional: primeiro o programador organiza sua aprendizagem, depois enfrenta os desafios e, finalmente, transforma conhecimento em um projeto web publicado.

Bellacosa Mainframe Developer Collection
HTML, CSS, JavaScript, GitHub Pages, educação tecnológica e compartilhamento de conhecimento.
Vagner Renato Bellacosa, IBM Champion e especialista em IBM Mainframe
IBM Z17 SYSTEM ONLINE
Sobre o autor

Vagner Renato Bellacosa

IBM Champion 2026 • Especialista em IBM Mainframe

Vagner Renato Bellacosa trabalha com IBM Mainframe desde 1988 , é IBM Champion e especialista em COBOL, CICS, Db2, z/OS e IBM Z. Compartilha experiências profissionais, conhecimento técnico, história da computação e práticas do universo mainframe para aproximar novas gerações das tecnologias que sustentam empresas, bancos e governos ao redor do mundo.

IBM Champion IBM Z COBOL CICS Db2 z/OS Mainframe desde 1988