1. O que é a Web?
Antes de escrever uma linha de código, precisamos entender o sistema que vamos construir. A World Wide Web (Web) não é sinônimo de Internet — ela é uma aplicação que roda sobre a Internet. A Internet é a infraestrutura física e de protocolos (cabos, roteadores, TCP/IP). A Web é um conjunto de padrões — HTTP, HTML, URLs — que permite que máquinas em qualquer lugar do planeta troquem documentos e dados de forma padronizada.
Tim Berners-Lee criou a Web em 1989 no CERN para resolver um problema simples: físicos precisavam compartilhar documentos entre computadores incompatíveis. A solução foi um protocolo de texto (HTTP) sobre uma rede existente (TCP/IP) com documentos conectados por links (HTML). Essa combinação — simples por design — tornou-se a maior plataforma de software da história.
Internet: rede global de computadores conectados por protocolos TCP/IP.
Web: sistema de documentos interligados acessíveis via HTTP/HTTPS sobre a Internet.
Sistema Web: aplicação que usa os protocolos e padrões da Web para entregar uma funcionalidade específica.
Hoje, quando falamos em "construir um sistema web", não falamos apenas de sites. Falamos de sistemas que usam HTTP para trocar dados entre um cliente (navegador, aplicativo móvel, outro servidor) e um servidor — independente de ter ou não uma interface visual. Uma API que retorna JSON puro é um sistema web tão legítimo quanto uma plataforma de e-commerce com milhões de páginas.
Por que isso importa para engenheiros?
Porque a arquitetura que escolhemos — e as decisões que tomamos — são moldadas pelas restrições e garantias do protocolo HTTP. HTTP é stateless (sem estado): cada requisição é independente, o servidor não "lembra" de requisições anteriores a não ser que você persista essa informação explicitamente. Essa característica força certas decisões de design — cookies, tokens de sessão, JWTs — que aparecem diretamente no código que você vai escrever.
2. Arquitetura Cliente-Servidor
A arquitetura cliente-servidor é o padrão dominante em sistemas web. Ela divide as responsabilidades em dois papéis fundamentais: o cliente, que faz requisições, e o servidor, que responde a elas. Essa separação não é apenas organizacional — ela tem implicações diretas em escalabilidade, segurança, manutenção e custo.
Clique no diagrama ou role a página para ver a animação
O papel de cada camada
Cada camada tem uma responsabilidade bem definida. Misturar essas responsabilidades — colocar lógica de banco no HTML, ou validação de negócio no SQL — é o início do código espaguete que torna sistemas difíceis de manter.
| Camada | Responsabilidade principal | Tecnologias comuns | O que NÃO deve fazer |
|---|---|---|---|
| Cliente | Renderizar interface, coletar input do usuário, exibir respostas | HTML, CSS, JavaScript, React, Vue | Guardar lógica de negócio crítica ou dados sensíveis |
| Servidor | Receber requisições, validar dados, executar regras de negócio, coordenar respostas | Node.js, Python, Java, Go | Misturar lógica de apresentação com lógica de dados |
| Banco de Dados | Persistir, consultar e garantir integridade dos dados | PostgreSQL, MySQL, MongoDB | Conter lógica de aplicação além de constraints simples |
| Rede | Transportar mensagens de forma confiável entre cliente e servidor | HTTP, HTTPS, WebSocket, TCP/IP | Ser ignorada no design — latência e falhas são reais |
Colocar validação de dados apenas no front-end. O navegador pode ser manipulado. Toda validação crítica deve existir no servidor, independente de existir ou não no cliente. O front-end valida para experiência do usuário; o servidor valida por segurança.
Escalando além do básico: arquiteturas de múltiplas camadas
O modelo acima é a forma mais simples. Em sistemas reais, essas camadas se multiplicam. Um servidor pode chamar outro servidor (microsserviços). Pode haver um load balancer na frente de múltiplas instâncias do servidor. O banco pode ser lido a partir de uma réplica de leitura. Existe um CDN (Content Delivery Network) que armazena assets estáticos próximo do usuário.
Para esta disciplina, o modelo de três camadas é suficiente — mas saber que ele pode crescer é importante para que suas decisões hoje não criem barreiras para o futuro. Isso é o que a visão Engineering do RM-ODP (que veremos adiante) tenta capturar.
🔬 Aprofundamento: Stateless vs Stateful — por que HTTP é stateless?
▼HTTP foi projetado para ser stateless por uma razão de design elegante: simplificar os servidores. Se cada requisição carrega toda a informação necessária para ser processada, o servidor não precisa manter um estado de sessão em memória. Qualquer servidor na rede pode responder qualquer requisição — o que permite escalar horizontalmente com facilidade.
O preço é que você, como desenvolvedor, precisa incluir explicitamente o estado necessário em cada requisição. Para autenticação, isso se faz com tokens (enviados no header Authorization). Para preferências do usuário, isso se faz com cookies. Para dados de sessão entre páginas, isso se faz com sessionStorage ou localStorage no cliente.
Protocolo stateful como WebSocket é diferente: a conexão persiste, e o servidor mantém o estado da conversa. Isso é útil para chats em tempo real e jogos online, mas adiciona complexidade de gerenciamento de conexões.
3. O Protocolo HTTP
HTTP — HyperText Transfer Protocol — é o protocolo de comunicação da Web. Foi criado por Tim Berners-Lee em 1991 na versão 0.9 (só GET, só HTML). Hoje, na versão HTTP/3, suporta multiplexação de requisições, compressão de headers e transporte sobre UDP (QUIC). Para sistemas web comuns, a versão que você mais verá é HTTP/1.1 e HTTP/2.
O modelo fundamental é simples: o cliente envia uma requisição e o servidor responde com uma resposta. Ambas têm a mesma estrutura: uma linha de início, headers (cabeçalhos), uma linha em branco e opcionalmente um corpo.
Anatomia de uma requisição HTTP
POST /api/usuarios HTTP/1.1
Host: api.exemplo.com
Content-Type: application/json
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9...
Accept: application/json
{
"nome": "Ana Lima",
"email": "ana@inteli.edu.br",
"senha": "minhaSenhaSegura123"
}
Anatomia de uma resposta HTTP
HTTP/1.1 201 Created
Content-Type: application/json; charset=utf-8
Location: /api/usuarios/42
X-Request-Id: a1b2c3d4
{
"id": 42,
"nome": "Ana Lima",
"email": "ana@inteli.edu.br",
"criado_em": "2026-04-03T10:30:00Z"
}
Observe os headers: eles carregam metadados sobre a requisição/resposta sem poluir o corpo. Content-Type diz ao receptor como interpretar o corpo. Authorization carrega as credenciais. Location na resposta indica onde o recurso recém-criado pode ser encontrado — isso é parte do padrão REST.
4. Métodos HTTP
Os métodos HTTP — também chamados de verbos — definem a intenção da operação. Não é apenas convenção: o protocolo define propriedades matemáticas formais para cada método que guiam implementações de caches, proxies e clientes.
Idempotência significa que múltiplas requisições idênticas produzem o mesmo resultado que uma única. GET, PUT, DELETE e PATCH (quando bem implementado) são idempotentes. POST não é: chamar POST /pedidos duas vezes cria dois pedidos.
GET /api/produtos/42
GET é o método mais usado. Requisições GET podem ser cacheadas, favoritadas, indexadas por buscadores. Nunca use GET para operações que modificam dados — além de errado semanticamente, um robô de busca poderia "visitar" o link e apagar registros acidentalmente.
POST /api/pedidos
POST é usado para criação. A resposta deve retornar
201 Created com o header Location apontando para o novo recurso. Chamar POST duas vezes cria dois recursos — implemente idempotência na aplicação se necessário (ex: chave de idempotência no header).
PUT /api/produtos/5
PUT substitui o recurso inteiramente. Se você enviar um objeto sem um campo, esse campo é apagado. Use quando quiser atualização total e determinista. Chamar PUT duas vezes com o mesmo corpo produz o mesmo resultado.
Body: {"nome": "Ana Silva"}
PATCH é mais eficiente que PUT quando você quer mudar apenas um campo de um objeto grande. Porém, sua semântica é mais complexa — o servidor precisa saber como mesclar os campos. Em projetos menores, PATCH é frequentemente omitido em favor de PUT.
DELETE /api/pedidos/7
DELETE deve retornar
204 No Content em caso de sucesso sem corpo, ou 200 OK com o objeto deletado se quiser confirmar o que foi removido. Implemente soft delete (marcar como inativo) quando os dados precisam ser auditados.
↑ Clique em qualquer card para expandir os detalhes.
5. Status Codes
Os status codes são números de 3 dígitos que o servidor inclui na resposta para indicar o resultado da operação. Eles são organizados em 5 famílias pelo primeiro dígito. Usar o status correto não é detalhe cosmético — é o que permite que clientes, proxies e ferramentas de monitoramento interpretem o resultado sem precisar ler o corpo da resposta.
Retornar 200 OK com {"erro": "usuário não encontrado"} no corpo. Isso quebra a semântica HTTP, ilude ferramentas de monitoramento e força o cliente a ler o corpo para detectar falhas. Use sempre o status correto — 404 nesse caso.
6. JSON — A Língua Franca da Web
JSON (JavaScript Object Notation) tornou-se o formato de troca de dados dominante em APIs web. Não porque seja o mais eficiente (protobuf e MessagePack são mais compactos), mas porque é legível por humanos, suportado nativamente em JavaScript e suficientemente simples para ser implementado em qualquer linguagem com poucas linhas de código.
JSON tem exatamente 6 tipos de valor: string, number, boolean, null, array e object. Essa simplicidade é proposital — ela reduz ambiguidades e facilita a interoperabilidade entre sistemas escritos em linguagens diferentes.
{
"id": 1042,
"cliente": {
"id": 7,
"nome": "Ana Lima",
"email": "ana@exemplo.com"
},
"itens": [
{
"produto": "Notebook",
"quantidade": 1,
"preco_unit": 2499.90
},
{
"produto": "Mouse",
"quantidade": 2,
"preco_unit": 89.90
}
],
"total": 2679.70,
"status": "aprovado",
"criado_em": "2026-04-03T14:22:00Z",
"enviado": false
}
// number — inteiro positivo (ID gerado pelo banco) "id": 1042 // object aninhado — recurso relacionado "cliente": { ... } // array de objects — coleção de itens "itens": [ {...}, {...} ] // number — ponto flutuante (use string para // dinheiro em sistemas financeiros críticos) "preco_unit": 2499.90 // string — enum de texto (melhor que 0/1/2) "status": "aprovado" // string — datas em ISO 8601 (UTC) "criado_em": "2026-04-03T14:22:00Z" // boolean — true ou false, sem aspas "enviado": false
Prefira strings para enums ("status": "aprovado") a números ("status": 2). Strings são autodescritivas — um desenvolvedor lendo o JSON imediatamente entende o valor sem consultar documentação. Prefira ISO 8601 para datas ("2026-04-03T14:22:00Z") — é um padrão internacional parseado diretamente pelo JavaScript (new Date(str)).
Parseando JSON em JavaScript
// Aula 8 vai aprofundar isso — por ora, o padrão fundamental:
const resposta = await fetch('/api/pedidos/1042');
if (!resposta.ok) {
// resposta.ok é true para status 200-299
throw new Error(`Erro HTTP: ${resposta.status}`);
}
const pedido = await resposta.json(); // parse automático
console.log(pedido.cliente.nome); // "Ana Lima"
console.log(pedido.total); // 2679.70
console.log(pedido.itens.length); // 2
7. Nossa Stack
A stack é o conjunto de tecnologias que compõe o sistema. Nesta disciplina, usamos uma stack JavaScript de ponta a ponta — tanto no front quanto no back-end — com PostgreSQL como banco relacional. Essa escolha não é por exclusão das alternativas, mas por coerência pedagógica: você aprende uma linguagem profundamente antes de comparar com outras.
| Tecnologia | Camada | Por que usamos | Alternativas comuns |
|---|---|---|---|
| HTML / CSS / JS | Front-End | Padrões da Web. Sem framework para não esconder o fundamento. | React, Vue, Angular, Svelte |
| Node.js | Back-End (runtime) | JavaScript no servidor. I/O não-bloqueante. Mesma linguagem do front. | Python, Java, Go, Ruby, PHP |
| Express.js | Back-End (framework) | Minimalista. Sem magia. Você vê exatamente o que está acontecendo. | Fastify, NestJS, Koa, Hapi |
| PostgreSQL | Banco de Dados | SQL completo, ACID, open-source, amplamente usado em produção. | MySQL, SQLite, MongoDB, Redis |
| Jest | Testes | Padrão de mercado em JavaScript. Suporte a mocks, cobertura e snapshots. | Vitest, Mocha, Playwright |
Node.js usa um único thread com um event loop — diferente de Java/Python que criam um thread por requisição. Isso permite lidar com milhares de conexões simultâneas com baixo consumo de memória, desde que o código não bloqueie o event loop com operações pesadas de CPU. Aula 5 aprofunda isso.
8. RF, RN e RNF — Classificando Requisitos
Um dos maiores erros em projetos de software é começar a codificar sem saber ao certo o que o sistema precisa fazer e como precisa operar. Os requisitos são a tradução do problema de negócio em especificações verificáveis. Aprender a distingui-los é fundamental para o trabalho de engenharia.
Requisito Funcional (RF)
Descreve o que o sistema faz — comportamentos observáveis, funcionalidades, ações que o usuário pode realizar. É verificável por testes funcionais: ou o sistema faz, ou não faz.
✅ "O sistema deve permitir que um usuário autenticado registre um pedido com pelo menos um item."
✅ "O sistema deve exibir os produtos em ordem de preço crescente quando solicitado."
✅ "O sistema deve enviar e-mail de confirmação após o cadastro de um novo usuário."
Regra de Negócio (RN)
Define restrições e condições que governam o comportamento do sistema. Regras de negócio são geralmente derivadas de requisitos legais, contratuais ou de domínio — e mudam com mais frequência que o código. Separar RN de RF permite que mudanças de negócio sejam localizadas sem reescrever a aplicação inteira.
✅ "Um usuário só pode ter um endereço de e-mail — o campo email deve ser único no banco."
✅ "Um pedido só pode ser cancelado se estiver no status 'pendente' ou 'em preparo'."
✅ "O estoque de um produto não pode ficar negativo após uma venda."
Requisito Não Funcional (RNF)
Descreve como o sistema opera — qualidade, desempenho, segurança, usabilidade. São os atributos que diferenciam um sistema que "funciona" de um sistema que "funciona bem". O erro mais frequente de iniciantes é expressar RNF como opinião vaga.
❌ "O sistema deve ser rápido." — Não especifica o quê, quanto, sob qual carga, em qual ambiente.
✅ "O endpoint GET /produtos deve responder com p99 abaixo de 300ms sob 100 requisições simultâneas no ambiente de produção, validado por teste de carga com relatório Grafana k6."
Um RNF de engenharia precisa responder 6 perguntas: qual eixo de qualidade? qual operação é observada? qual carga ou condição de uso? qual métrica? qual limiar aceitável? como é evidenciado?
No eixo [qualidade], o sistema deve [comportamento observável]
sob [condição/carga], medido por [métrica],
com limite [valor], validado por [teste/ferramenta].
-- Exemplo preenchido:
"No eixo eficiência de desempenho, o endpoint POST /pedidos
deve responder com p99 abaixo de 500ms sob 50 requisições
simultâneas em ambiente de staging, medido por k6,
validado na pipeline de CI após cada deploy."
Como RF, RN e RNF se relacionam
| Tipo | Pergunta respondida | Quem define | Como é verificado |
|---|---|---|---|
| RF | O que o sistema faz? | Product Owner, usuários | Testes funcionais, E2E, demonstração |
| RN | Que restrições limitam o comportamento? | Especialista de domínio, juridico | Testes unitários de regra, validação de banco |
| RNF | Como o sistema opera? | Arquiteto, equipe técnica | Testes de carga, auditoria de segurança, métricas |
9. Os 8 Eixos de RNF (ISO/IEC 25010)
Nesta disciplina, usamos uma decomposição de qualidade em 8 eixos, baseada na norma ISO/IEC 25010 (SQuaRE — Systems and Software Quality Requirements and Evaluation). Essa norma é a referência internacional para qualidade de software e aparece no SWEBOK v4, o corpo de conhecimento oficial da engenharia de software. Ela evoluiu da ISO/IEC 9126 (1991) e expande o escopo para considerar não só o produto, mas o sistema operando em seu contexto real.
Os eixos não são silos independentes: eles se cruzam, se reforçam e frequentemente conflitam entre si. Uma decisão arquitetural que melhora um eixo pode piorar outro — e reconhecer isso é o que separa o engenheiro que escreve requisitos do que apenas lista desejos. Ao documentar RNF do seu projeto, você deve sempre explicitar em qual eixo está trabalhando, qual métrica será medida e qual limite é aceitável.
RFs definem se o sistema faz o que deveria. RNFs definem se o sistema sobrevive em produção. A maioria das falhas pós-deploy — quedas sob pico de acesso, vazamento de dados, indisponibilidade em black friday, bug que não pôde ser corrigido em tempo — são falhas de RNF, não de RF. Tratar RNF como "detalhe técnico" é o maior risco arquitetural de um projeto.
Métricas e ferramentas típicas por eixo
Para cada eixo, existem métricas reconhecidas e ferramentas que geram evidência objetiva. Essa tabela é seu ponto de partida — memorize a relação entre eixo, métrica e ferramenta, porque é isso que torna um RNF auditável.
| Eixo | Métricas típicas | Ferramentas de evidência | Anti-padrão comum |
|---|---|---|---|
| USAB | Tempo de tarefa, taxa de sucesso, SUS score, cliques para concluir | Maze, Lookback, testes de usabilidade moderados, heurísticas de Nielsen | "Interface amigável" — sem métrica nem critério objetivo |
| CONF | MTBF, MTTR, uptime, taxa de sucesso de retries, error rate | Pingdom, UptimeRobot, alertas de SLO no Grafana, chaos testing | "Sistema robusto" — sem definir tolerância a falhas |
| DES | p50/p95/p99 de latência, throughput (req/s), tempo de resposta | k6, JMeter, Artillery, Apache Bench, dashboards APM (Datadog, New Relic) | "Rápido" sem especificar sob qual carga nem em qual percentil |
| SUP | Cobertura de testes, tempo médio para corrigir bug, cyclomatic complexity | Jest coverage, SonarQube, ESLint, git log de hotfixes | "Código limpo" sem métrica objetiva de qualidade |
| SEG | CVSS score, tempo até patch, taxa de logs de acesso indevido, OWASP coverage | OWASP ZAP, Snyk, bcrypt, auditoria manual, SAST/DAST | "Sistema seguro" — sem threat model documentado |
| CAP | Volume máximo de dados, nº máximo de usuários concorrentes, taxa de crescimento | Análise de consultas no banco, EXPLAIN, benchmarks de carga progressiva | Não planejar para crescimento 10x do volume atual |
| REST | Lista fechada de tecnologias aceitas, versões mínimas exigidas | Validação em CI (check de dependências), revisão arquitetural | Não documentar o que é obrigatório vs permitido |
| ORG | Duração da sprint, tamanho da equipe, SLA de code review, orçamento | Ferramentas de gestão (Jira, Linear), políticas de repositório | Misturar restrições de processo com requisitos técnicos |
9.1 Trade-offs entre Eixos — quando qualidade é escolha
Nenhum sistema maximiza todos os 8 eixos simultaneamente. Cada decisão arquitetural troca um eixo por outro, e reconhecer essas tensões é o que separa o projeto viável do projeto utópico. Abaixo, as tensões mais frequentes em sistemas web — e como elas se manifestam no seu código.
| Tensão | Decisão que favorece o primeiro | O que o segundo perde |
|---|---|---|
| Segurança × Desempenho | Hash bcrypt caro em login | Latência de autenticação aumenta; pode exigir cache de sessão |
| Segurança × Usabilidade | MFA obrigatório e timeout curto de sessão | Mais fricção, queda na taxa de conclusão de tarefas |
| Desempenho × Confiabilidade | Cache agressivo em memória | Dados desatualizados em caso de falha do cache |
| Desempenho × Suportabilidade | Otimização manual, queries complexas | Código mais difícil de ler, testar e alterar |
| Capacidade × Custo (ORG) | Banco com réplicas e sharding desde o início | Custo de infraestrutura sobe; time precisa operar mais peças |
| Restrições × Suportabilidade | Stack fixada em tecnologias legadas | Menos bibliotecas modernas, onboarding mais difícil |
| Usabilidade × Confiabilidade | Auto-save frequente, feedback em tempo real | Mais requisições, mais pontos de falha |
Quando um eixo conflita com outro, documente a escolha. Em vez de "o sistema será seguro e rápido", escreva: "priorizamos SEG sobre DES — login com bcrypt (custo 12). Aceitamos latência de autenticação até 400ms p95.". A decisão explícita protege o projeto de regressões acidentais e alinha a equipe.
9.2 Redigindo RNF Mensuráveis — o esqueleto SMART-E
Um RNF mal redigido é pior que um RNF ausente: ele cria a ilusão de que o atributo foi tratado, quando na verdade não há como verificar. Use o esqueleto SMART-E — Specific, Measurable, Achievable, Relevant, Time-bound + Evidence — adaptado para requisitos de qualidade.
[1] EIXO → Qual dos 8 eixos de qualidade é o alvo?
[2] ESPECIFICAÇÃO→ Qual operação / componente / fluxo está sendo qualificado?
[3] CONDIÇÃO → Sob qual carga, ambiente ou cenário?
[4] MÉTRICA → O que é medido? (latência, taxa, tempo, volume)
[5] LIMIAR → Qual valor numérico define passa/falha?
[6] EVIDÊNCIA → Qual ferramenta ou teste gera a prova?
[7] PRAZO → Quando o limite passa a valer? (sprint atual, release X)
─── Exemplo aplicado ───
"No eixo DESEMPENHO [1], o endpoint POST /pedidos [2]
sob 50 req/s concorrentes em staging [3] deve ter
latência p95 [4] abaixo de 500 ms [5], validada por
teste k6 na pipeline de CI [6], a partir da Sprint 3 [7]."
Da frase vaga ao RNF auditável — três exemplos
| Frase vaga do stakeholder | Eixo | RNF redigido (auditável) |
|---|---|---|
| "O sistema não pode cair" | CONF | "O endpoint GET /produtos deve manter disponibilidade ≥99,5% em janela mensal, medida por UptimeRobot com probes a cada 60s, aplicável a partir do release 1.0." |
| "Tem que ser seguro" | SEG | "Rotas sob /admin devem exigir token JWT válido e role=admin, retornando 401/403. Validado por testes automatizados de autorização em CI. Patch de CVEs críticas (CVSS ≥7) em até 5 dias úteis." |
| "Tem que suportar muita gente" | CAP | "O banco deve suportar 100k pedidos por dia mantendo p95 de SELECT abaixo de 200ms. Validado por seed + EXPLAIN ANALYZE em staging. Índice obrigatório em (cliente_id, criado_em)." |
• Usa adjetivos sem métrica: rápido, seguro, amigável, robusto, escalável.
• Não cita a ferramenta ou teste que gera evidência.
• Não especifica a carga/condição sob a qual o limite vale.
• Mistura dois eixos na mesma frase (quebre em dois RNF).
• É uma opinião sem operador de comparação (≤, ≥, <, >, =).
9.3 Priorização de Eixos por Tipo de Sistema
Nem todo sistema precisa ser ótimo em todos os 8 eixos. A priorização depende do contexto — tipo de negócio, volume de usuários, maturidade da equipe, regulação. A tabela abaixo sugere eixos críticos (onde falha é inaceitável) e importantes (onde se deve investir) em perfis comuns de sistema web.
| Tipo de sistema | Eixos críticos | Eixos importantes | Eixos secundários |
|---|---|---|---|
| E-commerce B2C | DES, CONF, SEG | USAB, CAP | SUP, REST, ORG |
| Sistema bancário / financeiro | SEG, CONF, CAP | DES, REST | USAB, SUP, ORG |
| Aplicação médica / saúde | SEG, CONF, REST (LGPD/HIPAA) | USAB, SUP | DES, CAP, ORG |
| Ferramenta interna / B2B | SUP, USAB | CONF, SEG | DES, CAP, REST, ORG |
| Sistema educacional | USAB, DES | CONF, SUP | SEG, CAP, REST, ORG |
| API pública | DES, SEG, CONF | CAP, SUP | USAB, REST, ORG |
| Pipeline de dados / ETL | CONF, CAP, DES | SUP, REST | USAB, SEG, ORG |
Na sprint 1, você entrega RNF mínimos: pelo menos 1 por eixo crítico e 1 por eixo importante. Os demais podem ser "não se aplica nesta fase" — mas documente isso explicitamente. Um projeto que entrega só "funciona localmente" e ignora os eixos não tem RNF; tem esperança.
🔬 Aprofundamento: Como a ISO/IEC 25010 organiza qualidade
▼A ISO/IEC 25010 decompõe qualidade de software em 8 características principais, cada uma com sub-características. Por exemplo, Desempenho (Performance Efficiency) se decompõe em Time Behavior, Resource Utilization, Capacity. Segurança se decompõe em Confidentiality, Integrity, Non-repudiation, Authenticity, Accountability.
Nesta disciplina, usamos uma adaptação pedagógica com 8 eixos (as 8 características + REST e ORG como eixos de contexto). A decomposição mais granular da norma é útil quando você precisa detalhar um RNF em múltiplos testes — por exemplo, um RNF de Segurança geralmente produz 3-5 RNFs menores (um para autenticação, um para autorização, um para auditoria, um para criptografia em trânsito).
Além das 8 características de qualidade do produto, a ISO/IEC 25010 define 5 características de qualidade em uso: Effectiveness, Efficiency, Satisfaction, Freedom from Risk, Context Coverage. Essas são medidas no usuário real, não no código — são usadas em validação pós-deploy, não em critérios de aceite de sprint.
10. Minimundo — Descrevendo o Domínio
Antes de modelar entidades, desenhar telas ou escrever código, você precisa entender o problema. O minimundo é uma descrição textual do domínio em linguagem natural — sem jargão técnico, sem menção a tecnologias. Ele captura quem são os atores, o que fazem, quais informações manipulam e o que está fora do escopo.
Um bom minimundo é escrito da perspectiva do negócio, não do software. "O sistema tem uma tabela de usuários" não é minimundo — é já uma decisão de implementação. "Atendentes precisam registrar pedidos dos clientes" é minimundo.
Exemplo de minimundo completo
Uma loja de campus vende camisetas, cadernos e canecas. Dois atendentes registram pedidos no balcão e precisam consultar o estoque antes de confirmar a venda. O gerente acompanha relatórios de vendas diárias e recebe alertas quando o estoque de algum produto está abaixo de 10 unidades.
Os clientes são cadastrados com nome e e-mail. Um cliente pode fazer vários pedidos. Cada pedido tem pelo menos um item, e cada item referencia um produto com quantidade e preço unitário no momento da compra. O pedido tem um status que evolui de "pendente" para "confirmado" ou "cancelado".
Fora do escopo desta etapa: emissão de nota fiscal, integração com meios de pagamento online, entrega e rastreamento.
Do minimundo às entidades
Substantivos no minimundo tendem a virar entidades (tabelas). Verbos tendem a virar relacionamentos ou operações. Adjetivos e dados associados tendem a virar atributos.
| Trecho do minimundo | Entidade | Atributos principais |
|---|---|---|
| "clientes são cadastrados com nome e e-mail" | Cliente | id, nome, email, criado_em |
| "registrar pedidos" | Pedido | id, cliente_id, status, total, criado_em |
| "cada item referencia um produto" | ItemPedido | id, pedido_id, produto_id, quantidade, preco_unit |
| "produtos com estoque" | Produto | id, nome, preco, estoque_atual |
Ao escrever o minimundo, evite incluir tecnologias ou decisões de implementação. "O sistema usará JWT para autenticação" não pertence ao minimundo — pertence à especificação técnica. O minimundo descreve o problema; a especificação técnica descreve a solução.
11. Casos de Uso — a Narrativa de cada Requisito
Quando você escreve um requisito funcional como "o atendente registra um pedido", a frase resume um objetivo. Um caso de uso (use case, UC) é o filme desse objetivo: um roteiro passo a passo que descreve como o ator interage com o sistema para atingir o resultado — incluindo o que dá errado, quais exceções tratar e em que estado o sistema termina.
Use cases preenchem uma lacuna importante na documentação. Os RFs dizem o que o sistema faz. As RNs dizem quais regras governam. Os RNFs dizem como o sistema opera. Mas nenhum deles explica, em linguagem comum, a sequência de passos que precisa existir no código. É aí que os UCs entram.
🎬 O que é um Use Case?
Uma descrição narrativa de como um ator (pessoa ou sistema) interage com o software para alcançar um objetivo de negócio.
Não é tela, não é código — é o "filme" do que acontece passo a passo, incluindo o que dá errado.
🔗 De RF para UC
Cada RF de alto nível vira um ou mais UCs detalhados. O RF é o título; o UC é o capítulo.
RF-01 Atendente registra pedido → UC-01 Registrar Pedido · UC-02 Cancelar Pedido · UC-03 Consultar Status.
🗣️ Linguagem comum
Negócio e desenvolvimento falam a mesma história — sem ambiguidade, sem jargão técnico desnecessário.
🔀 Cobre caminhos tortos
Fluxos alternativos capturam o que pode dar errado antes de virar bug em produção.
✅ Base de testes
Cada fluxo vira um cenário de teste com entrada, passos e resultado esperado.
11.1 Anatomia de um Use Case — os 7 campos obrigatórios
Um UC bem formado segue um template estável. Qualquer pessoa do time — PM, dev, QA, ops — deve conseguir ler e extrair a informação de que precisa sem ter que decifrar estilo pessoal. Os 7 campos abaixo são obrigatórios. Campos adicionais (frequência, restrições de tempo, atores envolvidos, referências) são opcionais e entram caso o domínio exija.
Identificação + Nome
Código único e nome no infinitivo: "Registrar Pedido", "Cancelar Reserva". Um verbo + um objeto — sem adjetivos, sem detalhes de UI.
Ator(es) principal(is) e secundário(s)
Papel que dispara o caso — não é pessoa específica. Ex.: Atendente, Gerente, Sistema de Pagamento. Ator secundário é quem o sistema consulta durante o fluxo.
Pré-condição
Estado do sistema antes de o UC começar. "Atendente autenticado com role=atendente", "Produto existe no catálogo". Se a pré-condição falha, o UC simplesmente não roda — não é um fluxo alternativo.
Fluxo Principal (caminho feliz)
Passos numerados alternando ator → sistema → ator → sistema, até o objetivo. Um verbo por passo, no imperativo. Nada de "o usuário deseja"; use "Informar CPF", "Selecionar item".
Fluxos Alternativos e Exceções
Numere os desvios: "A1 (no passo 3): se X, então Y"; "E1 (qualquer passo): falha de BD". Inclui validações, erros e mensagens ao usuário — é aqui que o UC brilha em relação ao RF.
Pós-condição
Estado do sistema depois, em caso de sucesso. "Pedido salvo com status=PENDENTE", "Estoque decrementado". É também o que os testes de integração vão verificar.
Regras de Negócio + RNFs vinculadas
Lista dos IDs de RN-* e RNF-* que o UC precisa respeitar. É o que mantém a rastreabilidade entre o roteiro e os demais artefatos de requisitos.
Imperativo em cada passo. Comece com verbo + objeto. Um objetivo por UC. Se virou épico, quebre em UCs menores. Nada de UI. Não diga "clicar no botão azul" — diga "Confirmar envio". UI muda; intenção não.
11.2 Diagrama de Use Cases — a visão panorâmica
Antes de escrever cada UC em detalhe, um diagrama UML serve como mapa: quem são os atores, quais UCs existem, que relações há entre eles. Não é um diagrama técnico — é um acordo visual entre quem define o produto e quem o constrói. O diagrama da Loja Universitária abaixo mostra os elementos básicos que você vai usar.
👤 Ator
Papel externo que interage com o sistema. Não é pessoa específica — é função.
⬭ Elipse
Cada elipse = um caso de uso. Nome no formato verbo + objeto.
▭ Fronteira
O retângulo tracejado delimita o que é escopo do sistema. Atores ficam fora.
┄┄ «include»
UC-01 sempre executa UC-05 (autenticar). Reuso mandatório.
11.3 «include» vs «extend» — os dois tipos de reuso
No diagrama acima você viu uma seta tracejada com rótulo «include» ligando UC-01 e UC-05. UML define dois tipos de relação entre UCs — «include» e «extend» — e confundi-los é um dos erros mais comuns em diagramas mal escritos. A diferença é simples quando você pensa em termos de obrigatoriedade.
UC-A sempre executa UC-B. Sem exceção.
✅ Use quando: há um passo comum a vários UCs — autenticação, validação, auditoria, logging.
UC-B pode estender UC-A em condição específica.
✅ Use quando: há comportamento extra que pode ou não acontecer — cupom, brinde, alerta de fraude, upsell.
| Aspecto | «include» — obrigatório | «extend» — opcional |
|---|---|---|
| Execução | Sempre que UC-A roda | Só se a condição valer |
| Direção da seta | UC base → UC incluído | UC extensão → UC base |
| O UC base sabe? | Sim — referencia UC-B no fluxo | Não — UC-A ignora UC-B |
| Exemplos reais | Autenticar · Validar CPF · Gerar log | Aplicar cupom · Alerta fraude · Upsell |
11.4 Exemplo Completo — UC-01 Registrar Pedido
Aplicando o template da anatomia ao minimundo da Loja Universitária, o UC-01 fica como abaixo. Note como cada passo do fluxo principal é imperativo, como os desvios estão numerados e como a rastreabilidade aos RFs/RNs/RNFs aparece explicitamente no último bloco.
UC-01 · Nome: Registrar Pedidorole=atendente) · Produto(s) existente(s) no catálogo- Atendente inicia um novo pedido informando o cliente.
- Atendente adiciona ≥1 item (produto + quantidade).
- Sistema consulta o estoque de cada item («include» UC-03).
- Sistema calcula o total e apresenta resumo ao Atendente.
- Atendente confirma o pedido.
- Sistema persiste o pedido com
status=PENDENTEe decrementa o estoque. - Sistema retorna o
iddo pedido.
- A1 (passo 3): Estoque insuficiente → sistema exibe "Produto X indisponível" e retorna ao passo 2 para ajuste.
- A2 (passo 5): Atendente cancela antes de confirmar → rascunho descartado, sem efeito no estoque.
- E1 (qualquer passo): Falha de conexão com BD → sistema preserva rascunho local e exibe erro
503.
status=PENDENTE · estoque reduzido · evento PEDIDO_CRIADO emitido.RN-01 · estoque ≥ 0 RN-04 · preço congelado RNF-DES · p95 < 500ms RNF-SEG · role=atendente
Cada fluxo vira um teste: POST /pedidos com itens válidos esperando 201 (fluxo principal); POST /pedidos com item sem estoque esperando 409 (A1); POST /pedidos sem token de atendente esperando 403 (pré-condição). Daí a regra: UC bem escrito = testes de integração quase prontos.
Começa com "o usuário quer..." em vez de um passo imperativo. Mistura UI ("clicar no botão X"). Mais de um objetivo no mesmo UC. Sem pós-condição explícita. Sem rastreabilidade a RNs/RNFs. Fluxos alternativos ausentes — só o caminho feliz. Revisar todos esses pontos antes de marcar o UC como pronto.
12. RM-ODP — As 5 Visões do Sistema
O RM-ODP (Reference Model for Open Distributed Processing) foi padronizado conjuntamente pela ISO/IEC 10746 e pelo ITU-T X.901–X.904 no final dos anos 1990. Surgiu de uma necessidade concreta: nos anos 80–90, sistemas distribuídos estavam se multiplicando (CORBA, DCE, cliente-servidor corporativo), e cada fornecedor documentava seus sistemas de uma forma diferente. O RM-ODP propôs uma linguagem comum — 5 visões padronizadas — para descrever qualquer sistema distribuído de forma consistente.
Por que isso importa em IN02? Porque sistemas web são, por definição, sistemas distribuídos: cliente, servidor e banco rodam em processos separados, frequentemente em máquinas diferentes, e a aplicação só funciona quando as partes se comunicam corretamente. Descrever esse sistema a partir de uma única perspectiva (só o código, só o banco, só a interface) é incompleto — gera projetos com bugs arquiteturais que só aparecem em produção.
Nenhuma descrição única de um sistema distribuído é suficiente. Cada viewpoint é uma projeção do sistema que responde às perguntas de um tipo específico de stakeholder. O sistema real é a superposição coerente das 5 projeções — e inconsistências entre visões são defeitos que precisam ser resolvidos antes da implementação.
Ao longo do módulo, você vai revisitar essas visões a cada aula. O objetivo não é preencher formulários burocráticos — é desenvolver o hábito de pensar o sistema a partir de múltiplas perspectivas antes de escrever código.
O que cada visão produz — perguntas, artefatos e stakeholders
Cada viewpoint responde a um conjunto característico de perguntas e produz artefatos que são consumidos por um público específico. A tabela abaixo amarra tudo: pergunta central, artefato típico de sprint, stakeholders que validam e conexão com os eixos de RNF.
| Visão | Pergunta central | Artefato de sprint | Stakeholder | Eixos RNF relevantes |
|---|---|---|---|---|
| Enterprise | Por que o sistema existe? Para quem? | Minimundo, lista de RF, objetivos de negócio, políticas | PO, cliente, usuário final | USAB, ORG |
| Information | Que informações o sistema armazena e manipula? | Modelo ER, dicionário de dados, invariantes, regras de negócio (RN) | Arquiteto de dados, DBA, especialista de domínio | CAP, SEG (integridade), CONF |
| Computational | Como o sistema é decomposto em componentes com contratos? | Arquitetura MVC, contratos de API, diagramas de sequência | Arquiteto de software, equipe de desenvolvimento | SUP, DES, SEG (autorização) |
| Engineering | Como os componentes se conectam em processos, nós e redes? | Diagrama de deploy, protocolos, bindings, estratégia de rede | DevOps, SRE, arquiteto de infraestrutura | DES, CONF, CAP, SEG (em trânsito) |
| Technology | Quais tecnologias, versões e padrões concretos são usados? | Stack documentada, versões pinadas, padrões de interoperabilidade | Tech lead, arquiteto, time técnico | REST, SUP |
Um erro frequente é tratar RM-ODP como um diagrama em camadas (Enterprise em cima, Technology embaixo). Não é. As 5 visões são projeções ortogonais do mesmo sistema — cada uma enxerga o todo, mas filtrando pelos interesses daquela perspectiva. Você pode (e deve) começar por qualquer uma delas, desde que eventualmente todas estejam descritas e consistentes entre si.
12.1 RM-ODP Aplicado — Loja Universitária nas 5 Visões
Vamos aplicar as 5 visões ao minimundo da Loja Universitária da seção 10. O objetivo é mostrar que cada visão produz um artefato diferente do mesmo sistema, e que a coerência entre elas é o que permite começar a implementar com confiança.
Propósito: apoiar vendas balcão de uma loja de campus, reduzindo erros em estoque e dando visibilidade gerencial.
Atores: atendentes (operam pedidos), gerente (consulta relatórios), clientes (identificados por nome/e-mail).
Políticas: vendas só com estoque disponível; pedido cancelável em até 1 hora após criação; relatórios acessíveis só a gerentes.
Fora de escopo: pagamento online, entrega, nota fiscal.
Entidades: Cliente, Produto, Pedido, ItemPedido, Usuario (atendente/gerente).
Invariantes (RN):
• RN-01: Produto.estoque_atual ≥ 0 sempre.
• RN-02: Pedido.status ∈ {pendente, confirmado, cancelado}.
• RN-03: ItemPedido.quantidade ≥ 1 e preço congelado no momento da compra.
• RN-04: Cliente.email único em toda a base.
Controllers: PedidoController, ProdutoController, RelatorioController.
Services: EstoqueService (valida disponibilidade), PedidoService (cria, cancela), AuthService (login, roles).
Endpoints: POST /pedidos, PATCH /pedidos/:id/cancelar, GET /relatorios/vendas-diarias (role=gerente).
Contrato de erro: 409 Conflict quando estoque insuficiente; 403 quando role inválida.
Nós: navegador (cliente), container Node.js (API), container PostgreSQL (dados).
Canais: HTTPS cliente↔API (JSON sobre HTTP/1.1), TCP API↔banco (protocolo PostgreSQL).
Bindings: JWT no header Authorization para auth; pool de conexões no banco (máx 20).
Falhas previstas: timeout de banco retorna 503 com Retry-After; erro de rede no cliente mostra toast e permite retry manual.
Node.js 20 LTS · Express 4.18 · PostgreSQL 16 · pg 8.x como driver · jsonwebtoken 9 · bcrypt 5 · Jest 29 para testes · Docker Compose para ambiente local. Front-end em HTML/CSS/JS vanilla com fetch. Padrões: REST para API, ISO 8601 para datas, UTF-8 em toda a base.
Faça perguntas cruzadas entre visões. Exemplo: a RN-01 de Information ("estoque ≥ 0") aparece na Computational (validação no EstoqueService) e na Engineering (o banco retorna erro se constraint for violada)? Se sim, há rastreabilidade. Se não, há um buraco arquitetural — alguém vai implementar apenas no banco, ou apenas no service, e a regra não vai valer em todos os caminhos.
12.2 Comparação com Outros Frameworks de Arquitetura
RM-ODP não é o único framework que propõe múltiplas visões de um sistema. Conhecer os vizinhos ajuda a entender o que é específico do RM-ODP e quando outro framework pode ser mais adequado ao contexto.
| Framework | Origem | Nº de visões | Foco principal | Quando usar |
|---|---|---|---|---|
| RM-ODP | ISO/IEC 10746 (1998) | 5 (Enterprise, Information, Computational, Engineering, Technology) | Sistemas distribuídos | Projetos com forte componente de distribuição e heterogeneidade |
| 4+1 View Model | Kruchten / Rational (1995) | 5 (Logical, Development, Process, Physical + Scenarios) | Sistemas de software em geral | Documentação com UML em torno de casos de uso |
| TOGAF (ADM) | The Open Group (1995) | 4 (Business, Data, Application, Technology) | Arquitetura corporativa (enterprise architecture) | Grandes organizações alinhando TI ao negócio |
| C4 Model | Simon Brown (2011) | 4 níveis (Context, Container, Component, Code) | Zoom hierárquico, comunicação visual | Documentar arquitetura de forma leve e incremental |
| arc42 | Starke / Hruschka | 12 seções (template) | Estrutura pronta de documentação | Equipes que querem um template pronto para arquitetura |
RM-ODP brilha quando há distribuição explícita e heterogeneidade de componentes. 4+1 brilha quando há forte uso de UML e casos de uso. TOGAF brilha em contexto corporativo. C4 brilha quando a documentação precisa ser comunicada visualmente e iterativamente. Nesta disciplina, usamos RM-ODP porque o módulo trata especificamente de sistemas web distribuídos — mas as mesmas ideias vão reaparecer em outros formatos ao longo do curso.
🔬 Aprofundamento: O conceito de viewpoint formal no RM-ODP
▼No RM-ODP formal, um viewpoint é mais do que uma "perspectiva" — é uma abstração que define um conjunto de conceitos, regras e linguagens apropriadas para tratar um grupo de preocupações. A norma ISO/IEC 10746-2 define as foundations (conceitos básicos), 10746-3 define a architecture (os 5 viewpoints), 10746-4 define o architectural semantics e 10746-5 define arquitetura de transparências (como esconder a distribuição do desenvolvedor de aplicação).
Cada viewpoint tem uma linguagem própria — um vocabulário de conceitos que você pode usar ao descrever o sistema naquela visão. Por exemplo, a linguagem da visão Information inclui objects, invariants, dynamic schemas. A linguagem da visão Engineering inclui capsules, nucleus, channels, stubs, binders. Em uso prático, você não precisa conhecer todos os conceitos formais — basta saber que cada visão fala uma linguagem diferente e que misturá-las indevidamente gera especificações confusas.
O RM-ODP também define transparências: propriedades que o sistema garante para o desenvolvedor de aplicação (acesso, localização, migração, replicação, falha, persistência, relocação, transação). Muitos frameworks modernos — Kubernetes, service mesh, ORMs — implementam essas transparências sem que o desenvolvedor saiba que existem como conceito formal.
13. Convergência RNF ↔ RM-ODP — A Matriz de Qualidade
RNF e RM-ODP parecem dois tópicos separados, mas se cruzam em todo projeto real. Cada eixo de RNF vive em uma ou mais visões do RM-ODP — e saber onde cada um vive é o que permite que o requisito seja implementável e não apenas declarado. Esta seção sistematiza essa ponte.
Onde cada eixo de RNF se manifesta nas 5 visões
| Eixo RNF | Enterprise | Information | Computational | Engineering | Technology |
|---|---|---|---|---|---|
| USAB | ✅ Público-alvo, jornada | — | ✅ Contratos de UI, feedback | — | ✅ Framework de UI |
| CONF | ✅ SLAs de negócio | ✅ Integridade, constraints | ✅ Tratamento de erro | ✅ Retry, circuit breaker | ✅ Biblioteca de resiliência |
| DES | — | ✅ Índices, normalização | ✅ Algoritmos, caching | ✅ Latência de rede | ✅ Versão otimizada do runtime |
| SUP | — | — | ✅ Arquitetura limpa, testes | ✅ Observabilidade, logs | ✅ Ferramentas de análise |
| SEG | ✅ Política de acesso | ✅ Dados sensíveis, LGPD | ✅ AuthZ, validação | ✅ TLS, firewall, WAF | ✅ Libs de criptografia |
| CAP | ✅ Projeção de crescimento | ✅ Volume de dados, partições | — | ✅ Escala horizontal | ✅ Banco com sharding |
| REST | ✅ Restrições corporativas | ✅ Modelo de dados mandatório | — | — | ✅ Stack obrigatória |
| ORG | ✅ Prazo, orçamento, equipe | — | — | — | — |
Cada ✅ é um lugar onde o eixo precisa aparecer concretamente. Um RNF de Segurança não pode viver só em Enterprise ("o sistema é seguro") — precisa descer para Information (dados sensíveis identificados), Computational (rotas protegidas), Engineering (TLS no canal) e Technology (libs auditadas). Se alguma célula fica vazia sem justificativa, há risco de lacuna arquitetural.
Do minimundo ao artefato de sprint — fluxo unificado
- Minimundo → define escopo e atores (visão Enterprise).
- RF priorizados → derivados do minimundo, descrevem funcionalidades observáveis.
- RN numeradas → invariantes e restrições, vivem em Information.
- RNF por eixo → distribuídos nas 5 visões conforme a matriz acima.
- Matriz de rastreabilidade → cada RF aponta para ≥1 RN e ≥1 critério de aceite técnico.
- Artefato de entrega → o conjunto coerente: minimundo + RF + RN + RNF + matriz, com evidência de teste.
Antes de submeter o artefato, responda:
1. Todo RF tem pelo menos um critério de aceite técnico?
2. Toda RN está numerada e é implementável/testável?
3. A matriz RF → RN cobre todos os fluxos priorizados, sem lacunas?
4. RNF foram escritos por eixo (não genéricos) e cobrem os eixos críticos do tipo de sistema?
5. Cada RNF crítico tem manifestação explícita em pelo menos 2 das 5 visões do RM-ODP?
14. Checklist de Estudo
Clique nos itens à medida que você dominar cada conceito:
- ✓Consigo explicar a diferença entre Internet e Web, e o que é um sistema web.
- ✓Consigo descrever o papel de cliente, servidor, banco e rede em uma arquitetura web.
- ✓Consigo desenhar o fluxo completo de uma requisição HTTP do usuário à resposta.
- ✓Consigo diferenciar GET, POST, PUT, PATCH e DELETE e saber quando usar cada um.
- ✓Consigo classificar status codes em 2xx, 3xx, 4xx e 5xx e citar exemplos de cada.
- ✓Consigo ler e escrever JSON com os 6 tipos de valor, incluindo objetos aninhados e arrays.
- ✓Consigo distinguir RF, RN e RNF e dar exemplos de cada um para um sistema real.
- ✓Consigo transformar "o sistema é rápido" em um RNF com eixo, métrica, carga e evidência.
- ✓Consigo nomear e descrever os 8 eixos de RNF usados na disciplina.
- ✓Consigo citar pelo menos 3 trade-offs clássicos entre eixos (ex: SEG × DES) e explicar em que ponto eles aparecem no código.
- ✓Consigo aplicar o esqueleto SMART-E para escrever um RNF auditável com eixo, condição, métrica, limiar, evidência e prazo.
- ✓Consigo priorizar eixos de RNF de acordo com o tipo de sistema (e-commerce, banco, interno, pipeline de dados).
- ✓Consigo redigir um minimundo sem misturar problema e solução técnica.
- ✓Consigo identificar as 5 visões do RM-ODP, a pergunta central de cada uma e o artefato que produzem.
- ✓Consigo aplicar as 5 visões a um minimundo concreto e verificar coerência cruzando informações entre elas.
- ✓Consigo comparar RM-ODP com 4+1, TOGAF e C4 e explicar quando usar cada um.
- ✓Consigo preencher a matriz de convergência RNF × RM-ODP para um projeto concreto e identificar lacunas.
Referências
- MDN Web Docs — Overview of HTTP — documentação de referência do protocolo HTTP
- RFC 9110 — HTTP Semantics — especificação oficial dos métodos e status codes
- SWEBOK v4 — Software Engineering Body of Knowledge
- ISO/IEC 25010 — SQuaRE Quality Model
- ISO/IEC 10746 — RM-ODP
- json.org — JSON specification
- Node.js — The Event Loop