SlideShare ist ein Scribd-Unternehmen logo
1 von 72
Downloaden Sie, um offline zu lesen
TOP5 – Falsas Suposições de Programadores
Matheus de Oliveira
<matheus.oliveira@dextra.com.br>
Apresentado no
15 de Maio de 2015
Matheus de Oliveira
<matheus.oliveira@dextra.com.br>
DBA PostgreSQL – consultorias e suportes
24x7/8x5
Instrutor dos treinamentos PostgreSQL
Concepção, desenvolvimento e suporte à
produção
Matheus de Oliveira
<matheus.oliveira@dextra.com.br>
Mais de 15 anos trabalhando de suporte e
consultoria PostgreSQL
http://www.dextra.com.br/
“Crafting Software, Transforming Business”
Instrutor dos treinamentos PostgreSQL
Concepção, desenvolvimento e suporte à
produção
Matheus de Oliveira
<matheus.oliveira@dextra.com.br>
Mais de 15 anos trabalhando de suporte e
consultoria PostgreSQL
http://www.dextra.com.br/
“Crafting Software, Transforming Business”
10 anos e mais de 10 mil profissionais
capacitados em todo o Brasil.
http://www.dextraining.com.br/
“Aprenda com quem faz na prática”
Concepção, desenvolvimento e suporte à
produção
Matheus de Oliveira
<matheus.oliveira@dextra.com.br>
Mais de 15 anos trabalhando de suporte e
consultoria PostgreSQL
http://www.dextra.com.br/
“Crafting Software, Transforming Business”
10 anos e mais de 10 mil profissionais
capacitados em todo o Brasil.
http://www.dextraining.com.br/
“Aprenda com quem faz na prática”
SaaS para análise e monitoramento PostgreSQL
http://www.pganalytics.com.br/
“Facilitando a vida do DBA”
TOP5 
Falsas
Suposições de
Progra-
madores
1. Tratamento
de Data/hora
Tratamento de data/hora
• todo dia tem 24 horas?
5 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Tratamento de data/hora
• todo dia tem 24 horas?
◦ Então, se subtrairmos 1 dia de uma data/hora, ou 24 horas, teremos o
mesmo resultado, certo?
5 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Tratamento de data/hora
• todo dia tem 24 horas?
◦ Então, se subtrairmos 1 dia de uma data/hora, ou 24 horas, teremos o
mesmo resultado, certo?
postgres =# SELECT ts , ts - i n t e r v a l ’1 day’ FROM
datahora;
ts | ?column?
------------------------+------------------------
2015 -10 -19 00:00:00 -02 | 2015 -10 -18 01:00:00 -02
(1 row)
postgres =# SELECT ts , ts - i n t e r v a l ’24 hours ’ FROM
datahora;
ts | ?column?
------------------------+------------------------
2015 -10 -19 00:00:00 -02 | 2015 -10 -17 23:00:00 -03
(1 row)
5 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Tratamento de data/hora
• Falsa suposições sobre fuso horários:
◦ minha aplicação nunca vai ser usada com diferentes fuso horários
6 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Tratamento de data/hora
• Falsa suposições sobre fuso horários:
◦ minha aplicação nunca vai ser usada com diferentes fuso horários
◦ Ok, mas pelo menos os offsets vão ser próximos
6 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Tratamento de data/hora
• Falsa suposições sobre fuso horários:
◦ minha aplicação nunca vai ser usada com diferentes fuso horários
◦ Ok, mas pelo menos os offsets vão ser próximos
◦ os possíveis offsets são -12:00, -11:00, -10:00, ..., 10:00, 11:00,
12:00
6 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Tratamento de data/hora
• Falsa suposições sobre fuso horários:
◦ minha aplicação nunca vai ser usada com diferentes fuso horários
◦ Ok, mas pelo menos os offsets vão ser próximos
◦ os possíveis offsets são -12:00, -11:00, -10:00, ..., 10:00, 11:00,
12:00
◦ a data/hora do cliente e do servidor são iguais
6 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Tratamento de data/hora
• Falsa suposições sobre fuso horários:
◦ minha aplicação nunca vai ser usada com diferentes fuso horários
◦ Ok, mas pelo menos os offsets vão ser próximos
◦ os possíveis offsets são -12:00, -11:00, -10:00, ..., 10:00, 11:00,
12:00
◦ a data/hora do cliente e do servidor são iguais
◦ Ok, não iguais, mas bem próximas
6 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Tratamento de data/hora
• Falsa suposições sobre fuso horários:
◦ minha aplicação nunca vai ser usada com diferentes fuso horários
◦ Ok, mas pelo menos os offsets vão ser próximos
◦ os possíveis offsets são -12:00, -11:00, -10:00, ..., 10:00, 11:00,
12:00
◦ a data/hora do cliente e do servidor são iguais
◦ Ok, não iguais, mas bem próximas
◦ Ok, ok, mas pelo menos a diferença permanece a mesma, sempre!
6 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Tratamento de data/hora
• Falsa suposições sobre fuso horários:
◦ minha aplicação nunca vai ser usada com diferentes fuso horários
◦ Ok, mas pelo menos os offsets vão ser próximos
◦ os possíveis offsets são -12:00, -11:00, -10:00, ..., 10:00, 11:00,
12:00
◦ a data/hora do cliente e do servidor são iguais
◦ Ok, não iguais, mas bem próximas
◦ Ok, ok, mas pelo menos a diferença permanece a mesma, sempre!
◦ os servidores estarão todos com o mesmo fuso horário
6 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Tratamento de data/hora
• Falsa suposições sobre fuso horários:
◦ minha aplicação nunca vai ser usada com diferentes fuso horários
◦ Ok, mas pelo menos os offsets vão ser próximos
◦ os possíveis offsets são -12:00, -11:00, -10:00, ..., 10:00, 11:00,
12:00
◦ a data/hora do cliente e do servidor são iguais
◦ Ok, não iguais, mas bem próximas
◦ Ok, ok, mas pelo menos a diferença permanece a mesma, sempre!
◦ os servidores estarão todos com o mesmo fuso horário
◦ o fuso horário do servidor não vai mudar
6 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Tratamento de data/hora
• Falsa suposições sobre fuso horários:
◦ minha aplicação nunca vai ser usada com diferentes fuso horários
◦ Ok, mas pelo menos os offsets vão ser próximos
◦ os possíveis offsets são -12:00, -11:00, -10:00, ..., 10:00, 11:00,
12:00
◦ a data/hora do cliente e do servidor são iguais
◦ Ok, não iguais, mas bem próximas
◦ Ok, ok, mas pelo menos a diferença permanece a mesma, sempre!
◦ os servidores estarão todos com o mesmo fuso horário
◦ o fuso horário do servidor não vai mudar
◦ a data/hora do servidor não volta, só avança
6 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Tratamento de data/hora
• Falsa suposições sobre fuso horários:
◦ minha aplicação nunca vai ser usada com diferentes fuso horários
◦ Ok, mas pelo menos os offsets vão ser próximos
◦ os possíveis offsets são -12:00, -11:00, -10:00, ..., 10:00, 11:00,
12:00
◦ a data/hora do cliente e do servidor são iguais
◦ Ok, não iguais, mas bem próximas
◦ Ok, ok, mas pelo menos a diferença permanece a mesma, sempre!
◦ os servidores estarão todos com o mesmo fuso horário
◦ o fuso horário do servidor não vai mudar
◦ a data/hora do servidor não volta, só avança
◦ ... http://infiniteundo.com/post/25326999628/
falsehoods-programmers-believe-about-time
6 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Não existem “apenas” 24 fuso horários
7 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
2. Pessoas têmnomes, nem sempre
tão simples como
você imagina
Pessoas têm nomes, nem sempre tão simples como você
imagina
• É possível validar os caracteres de um nome?
9 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Pessoas têm nomes, nem sempre tão simples como você
imagina
• É possível validar os caracteres de um nome?
• É possível separar os componentes de um nome (nome, sobrenome,
etc.)?
9 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Pessoas têm nomes, nem sempre tão simples como você
imagina
• É possível validar os caracteres de um nome?
• É possível separar os componentes de um nome (nome, sobrenome,
etc.)?
◦ Björk Guðmundsdóttir – Islândia – ordem: nome, sobrenome
9 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Pessoas têm nomes, nem sempre tão simples como você
imagina
• É possível validar os caracteres de um nome?
• É possível separar os componentes de um nome (nome, sobrenome,
etc.)?
◦ Björk Guðmundsdóttir – Islândia – ordem: nome, sobrenome
◦ Mao Ze Dong – China – ordem: sobrenome, genérico (geralmente
compartilhado entre irmãos), nome
9 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Pessoas têm nomes, nem sempre tão simples como você
imagina
• É possível validar os caracteres de um nome?
• É possível separar os componentes de um nome (nome, sobrenome,
etc.)?
◦ Björk Guðmundsdóttir – Islândia – ordem: nome, sobrenome
◦ Mao Ze Dong – China – ordem: sobrenome, genérico (geralmente
compartilhado entre irmãos), nome
◦ María-Jose Carreño Quiñones – Países que falam espanhol – nome,
sobrenome do pai (será o sobrenome “principal”), sobrenome da mãe
9 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Pessoas têm nomes, nem sempre tão simples como você
imagina
• É possível validar os caracteres de um nome?
• É possível separar os componentes de um nome (nome, sobrenome,
etc.)?
◦ Björk Guðmundsdóttir – Islândia – ordem: nome, sobrenome
◦ Mao Ze Dong – China – ordem: sobrenome, genérico (geralmente
compartilhado entre irmãos), nome
◦ María-Jose Carreño Quiñones – Países que falam espanhol – nome,
sobrenome do pai (será o sobrenome “principal”), sobrenome da mãe
◦ José Eduardo Santos Tavares Melo Silva – Brasil
9 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Pessoas têm nomes, nem sempre tão simples como você
imagina
• É possível validar os caracteres de um nome?
• É possível separar os componentes de um nome (nome, sobrenome,
etc.)?
◦ Velikkakathu Sankaran Achuthanandan – Índia – sobrenome, nome do
pai, nome
10 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Pessoas têm nomes, nem sempre tão simples como você
imagina
• É possível validar os caracteres de um nome?
• É possível separar os componentes de um nome (nome, sobrenome,
etc.)?
◦ Velikkakathu Sankaran Achuthanandan – Índia – sobrenome, nome do
pai, nome
◦ Kogaddu Birappa Timappa Nair – Índia – ordem: nome da vila, nome
do pai, nome, sobrenome
10 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Pessoas têm nomes, nem sempre tão simples como você
imagina
• É possível validar os caracteres de um nome?
• É possível separar os componentes de um nome (nome, sobrenome,
etc.)?
◦ Velikkakathu Sankaran Achuthanandan – Índia – sobrenome, nome do
pai, nome
◦ Kogaddu Birappa Timappa Nair – Índia – ordem: nome da vila, nome
do pai, nome, sobrenome
◦ Aditya Pratap Singh Chauhan – Índia – ordem: nome, nome do pai,
sobrenome, casta
10 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Pessoas têm nomes, nem sempre tão simples como você
imagina
• É possível validar os caracteres de um nome?
• É possível separar os componentes de um nome (nome, sobrenome,
etc.)?
◦ Velikkakathu Sankaran Achuthanandan – Índia – sobrenome, nome do
pai, nome
◦ Kogaddu Birappa Timappa Nair – Índia – ordem: nome da vila, nome
do pai, nome, sobrenome
◦ Aditya Pratap Singh Chauhan – Índia – ordem: nome, nome do pai,
sobrenome, casta
• OBS: Exemplos aproximados, sobrenome é o nome da família ou
como deve-se referenciar com Sr./Sra./etc. Mais detalhes, com
mesmos exemplos, em http:
//www.w3.org/International/questions/qa-personal-names
10 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Ok, e como devemos criar nossos formulários?
• Primeiro nome, último nome?
11 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Ok, e como devemos criar nossos formulários?
• Primeiro nome, último nome?
◦ e a senhora “María-Jose Carreño Quiñones”?
11 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Ok, e como devemos criar nossos formulários?
• Primeiro nome, último nome?
◦ e a senhora “María-Jose Carreño Quiñones”?
◦ e o caro “Mao Ze Dong”?
11 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Ok, e como devemos criar nossos formulários?
• Primeiro nome, último nome?
◦ e a senhora “María-Jose Carreño Quiñones”?
◦ e o caro “Mao Ze Dong”?
• Nome, sobrenome?
11 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Ok, e como devemos criar nossos formulários?
• Primeiro nome, último nome?
◦ e a senhora “María-Jose Carreño Quiñones”?
◦ e o caro “Mao Ze Dong”?
• Nome, sobrenome?
◦ E como concatenar? “Dong Mao” ao invés de “Mao Dong”?
11 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Ok, e como devemos criar nossos formulários?
• Primeiro nome, último nome?
◦ e a senhora “María-Jose Carreño Quiñones”?
◦ e o caro “Mao Ze Dong”?
• Nome, sobrenome?
◦ E como concatenar? “Dong Mao” ao invés de “Mao Dong”?
◦ Se eu uso “Matheus”, “de Oliveira”:
Autor: DE OLIVEIRA, Matheus.
11 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Ok, e como devemos criar nossos formulários?
• Primeiro nome, último nome?
◦ e a senhora “María-Jose Carreño Quiñones”?
◦ e o caro “Mao Ze Dong”?
• Nome, sobrenome?
◦ E como concatenar? “Dong Mao” ao invés de “Mao Dong”?
◦ Se eu uso “Matheus”, “de Oliveira”:
Autor: DE OLIVEIRA, Matheus.
◦ “Matheus de”, “Oliveira”:
e-mail: Olá Matheus de, você acaba de ganhar 1 milhão de reais!
11 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Ok, e como devemos criar nossos formulários?
• Não há solução então?
12 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Ok, e como devemos criar nossos formulários?
• Não há solução então?
◦ A verdade é que depende do uso, uma solução aceita é pedir:
• Nome completo: ...
• Como devemos chamá-lo: ...
12 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Ok, e como devemos criar nossos formulários?
• Não há solução então?
◦ A verdade é que depende do uso, uma solução aceita é pedir:
• Nome completo: ...
• Como devemos chamá-lo: ...
• Legal, e o campo para tratamento Sr./Sra./Dr./etc.?
12 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Ok, e como devemos criar nossos formulários?
• Não há solução então?
◦ A verdade é que depende do uso, uma solução aceita é pedir:
• Nome completo: ...
• Como devemos chamá-lo: ...
• Legal, e o campo para tratamento Sr./Sra./Dr./etc.?
◦ Alguns tratamentos vêm no início (Dr./Sr./Sra./etc.), outros no fim
(“, PhD”)
12 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
3. Endereços
também não são
tão simples assim
Endereços também não são tão simples assim
• Errado:
14 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Endereços também não são tão simples assim
• Errado:
◦ todo endereço possui um número
14 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Endereços também não são tão simples assim
• Errado:
◦ todo endereço possui um número
◦ Ok, mas se tem número então é numérico (ah?)
14 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Endereços também não são tão simples assim
• Errado:
◦ todo endereço possui um número
◦ Ok, mas se tem número então é numérico (ah?)
◦ pessoas com CEPs semelhantes moram na mesma região
14 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Endereços também não são tão simples assim
• Errado:
◦ todo endereço possui um número
◦ Ok, mas se tem número então é numérico (ah?)
◦ pessoas com CEPs semelhantes moram na mesma região
◦ Mas pelo menos duas pessoas com exatamente o mesmo CEP moram
próximas uma da outra
14 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Endereços também não são tão simples assim
• Errado:
◦ todo endereço possui um número
◦ Ok, mas se tem número então é numérico (ah?)
◦ pessoas com CEPs semelhantes moram na mesma região
◦ Mas pelo menos duas pessoas com exatamente o mesmo CEP moram
próximas uma da outra
◦ No mesmo logradouro não existe mais de um CEP
14 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Endereços também não são tão simples assim
• Errado:
◦ todo endereço possui um número
◦ Ok, mas se tem número então é numérico (ah?)
◦ pessoas com CEPs semelhantes moram na mesma região
◦ Mas pelo menos duas pessoas com exatamente o mesmo CEP moram
próximas uma da outra
◦ No mesmo logradouro não existe mais de um CEP
◦ Nome de cidade é único no país
14 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Endereços também não são tão simples assim
• Errado:
◦ todo endereço possui um número
◦ Ok, mas se tem número então é numérico (ah?)
◦ pessoas com CEPs semelhantes moram na mesma região
◦ Mas pelo menos duas pessoas com exatamente o mesmo CEP moram
próximas uma da outra
◦ No mesmo logradouro não existe mais de um CEP
◦ Nome de cidade é único no país
◦ Tá, mas nome de rua é único dentro cidade
14 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Endereços também não são tão simples assim
• Errado:
◦ todo endereço possui um número
◦ Ok, mas se tem número então é numérico (ah?)
◦ pessoas com CEPs semelhantes moram na mesma região
◦ Mas pelo menos duas pessoas com exatamente o mesmo CEP moram
próximas uma da outra
◦ No mesmo logradouro não existe mais de um CEP
◦ Nome de cidade é único no país
◦ Tá, mas nome de rua é único dentro cidade
◦ Nome de rua, cidade, bairro, nunca muda
14 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Endereços também não são tão simples assim
• Errado:
◦ todo endereço possui um número
◦ Ok, mas se tem número então é numérico (ah?)
◦ pessoas com CEPs semelhantes moram na mesma região
◦ Mas pelo menos duas pessoas com exatamente o mesmo CEP moram
próximas uma da outra
◦ No mesmo logradouro não existe mais de um CEP
◦ Nome de cidade é único no país
◦ Tá, mas nome de rua é único dentro cidade
◦ Nome de rua, cidade, bairro, nunca muda
◦ ... https://www.mjt.me.uk/posts/
falsehoods-programmers-believe-about-addresses/
14 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
4. Precisão de
pontos utuantes
Precisão de pontos flutuantes
• Devemos usar os tipos double,float,real,... sempre que
trabalhamos com decimais (moeda, volume, etc.)?
16 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Precisão de pontos flutuantes
• Devemos usar os tipos double,float,real,... sempre que
trabalhamos com decimais (moeda, volume, etc.)?
UPDATE venda_item
SET valor_real = valor , qtd_real = qtd ,
valor_double = valor , qtd_double = qtd;
SELECT sum(valor * qtd) AS soma ,
sum(valor_real * qtd_real) AS soma_real ,
sum(valor_double * qtd_double) AS soma_double
FROM venda_item;
soma | soma_real | soma_double
-------------+-----------+------------------
183802.5000 | 183804 | 183802.499999927
◦ soma = numeric/decimal
◦ soma_real = float (4 bytes)
◦ soma_double = double precision (8 bytes)
16 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
5. Concorrência em
bancos de dados
(relacionais)
Concorrência em bancos de dados (relacionais)
• Errado:
18 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Concorrência em bancos de dados (relacionais)
• Errado:
◦ Pegar o próximo “id” único para autoincremento:
SELECT max(id) + 1 FROM minha_tabela;
18 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Concorrência em bancos de dados (relacionais)
• Errado:
◦ Pegar o próximo “id” único para autoincremento:
SELECT max(id) + 1 FROM minha_tabela;
Solução: sequence, serial, auto_increment
18 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Concorrência em bancos de dados (relacionais)
• Errado:
◦ Pegar o próximo “id” único para autoincremento:
SELECT max(id) + 1 FROM minha_tabela;
Solução: sequence, serial, auto_increment
◦ Inserir ou atualizar um registro:
UPDATE acesso SET contador = contador + 1
WHERE url = p_url AND usuario = p_usuario;
IF (NOT FOUND) THEN
INSERT INTO acesso(url , usuario , contador)
VALUES (p_url , p_usuario , 1);
END IF ;
18 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Concorrência em bancos de dados (relacionais)
• Errado:
◦ Pegar o próximo “id” único para autoincremento:
SELECT max(id) + 1 FROM minha_tabela;
Solução: sequence, serial, auto_increment
◦ Inserir ou atualizar um registro:
UPDATE acesso SET contador = contador + 1
WHERE url = p_url AND usuario = p_usuario;
IF (NOT FOUND) THEN
INSERT INTO acesso(url , usuario , contador)
VALUES (p_url , p_usuario , 1);
END IF ;
Solução: tratamento de erro (falha no INSERT, tenta UPDATE
novamente), MERGE, INSERT OR REPLACE, INSERT ... ON
CONFLICT UPDATE, ...
18 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Concorrência em bancos de dados (relacionais)
• Errado:
◦ Trigger para atualizar estoque:
SELECT qtd_estoque INTO v_qtd
FROM produtos
WHERE produto_id = NEW.produto_id;
UPDATE produtos
SET qtd_estoque = v_qtd - NEW.qtd
WHERE produto_id = NEW.produto_id;
19 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Concorrência em bancos de dados (relacionais)
• Errado:
◦ Trigger para atualizar estoque:
SELECT qtd_estoque INTO v_qtd
FROM produtos
WHERE produto_id = NEW.produto_id;
UPDATE produtos
SET qtd_estoque = v_qtd - NEW.qtd
WHERE produto_id = NEW.produto_id;
Solução: um único UPDATE
UPDATE produtos
SET qtd_estoque = qtd_estoque - NEW.qtd
WHERE produto_id = NEW.produto_id;
19 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Concorrência em bancos de dados (relacionais)
• Errado:
◦ Trigger para atualizar estoque:
SELECT qtd_estoque INTO v_qtd
FROM produtos
WHERE produto_id = NEW.produto_id;
UPDATE produtos
SET qtd_estoque = v_qtd - NEW.qtd
WHERE produto_id = NEW.produto_id;
Solução: um único UPDATE
UPDATE produtos
SET qtd_estoque = qtd_estoque - NEW.qtd
WHERE produto_id = NEW.produto_id;
Ou então, use a cláusula FOR UPDATE no SELECT
19 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Concorrência em bancos de dados (relacionais)
• Errado:
◦ Incoerências relativas à sequências (sequences ou campos
autoincrementais) em ids:
• ids são contínuos (sem buracos)
20 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Concorrência em bancos de dados (relacionais)
• Errado:
◦ Incoerências relativas à sequências (sequences ou campos
autoincrementais) em ids:
• ids são contínuos (sem buracos)
• SELECT ... FROM tabela (sem ORDER BY), traz na ordem de inserção
20 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Concorrência em bancos de dados (relacionais)
• Errado:
◦ Incoerências relativas à sequências (sequences ou campos
autoincrementais) em ids:
• ids são contínuos (sem buracos)
• SELECT ... FROM tabela (sem ORDER BY), traz na ordem de inserção
• Ok, mas pelo menos ORDER BY id me traz a ordem de inserção
20 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Concorrência em bancos de dados (relacionais)
• Errado:
◦ Incoerências relativas à sequências (sequences ou campos
autoincrementais) em ids:
• ids são contínuos (sem buracos)
• SELECT ... FROM tabela (sem ORDER BY), traz na ordem de inserção
• Ok, mas pelo menos ORDER BY id me traz a ordem de inserção
• Sério? Ah, mas ORDER BY id e ORDER BY data_insercao são
equivalentes
20 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Resumindo...
1. Marcar tempo é complexo, use sempre valor absoluto (ou um tipo
que use-o internamente)
2. Pessoas têm nomes “estranhos”, e não gostam quando você os erra!
3. Vida de carteiro não é fácil
4. float/double/real/... não têm boa precisão
5. Vai ter mais de um usuário em produção, pense sempre em
concorrência
21 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Obrigado!
Dúvidas?
Matheus de Oliveira
matheus.oliveira@dextra.com.br
IRC – irc.freenode.net:
/join #postgresql,#postgresql-br,#dextra
Meu nick: MatheusOl
Twitter: @matioli_matheus
LinkedIn: br.linkedin.com/in/matheusdeoliveira/
SlideShare: slideshare.net/matheus_de_oliveira

Weitere ähnliche Inhalte

Andere mochten auch

O que você acha que sabe sobre banco de dados
O que você acha que sabe sobre banco de dadosO que você acha que sabe sobre banco de dados
O que você acha que sabe sobre banco de dadosMatheus de Oliveira
 
DevCamp 2013 :: O Mito do Desenvolvedor 10x
DevCamp 2013 :: O Mito do Desenvolvedor 10xDevCamp 2013 :: O Mito do Desenvolvedor 10x
DevCamp 2013 :: O Mito do Desenvolvedor 10xBill Coutinho
 
Impulsione sua carreira contribuindo para projetos open source
Impulsione sua carreira contribuindo para projetos open sourceImpulsione sua carreira contribuindo para projetos open source
Impulsione sua carreira contribuindo para projetos open sourceAlexandre Porcelli
 
PostgreSQL Tuning: O elefante mais rápido que um leopardo
PostgreSQL Tuning: O elefante mais rápido que um leopardoPostgreSQL Tuning: O elefante mais rápido que um leopardo
PostgreSQL Tuning: O elefante mais rápido que um leopardoelliando dias
 
Devcamp 2015 - 1 milhão de pedidos, 1 milhão de entregas… Quais as tecnologia...
Devcamp 2015 - 1 milhão de pedidos, 1 milhão de entregas… Quais as tecnologia...Devcamp 2015 - 1 milhão de pedidos, 1 milhão de entregas… Quais as tecnologia...
Devcamp 2015 - 1 milhão de pedidos, 1 milhão de entregas… Quais as tecnologia...Eduardo Ximenes Soares
 

Andere mochten auch (6)

O que você acha que sabe sobre banco de dados
O que você acha que sabe sobre banco de dadosO que você acha que sabe sobre banco de dados
O que você acha que sabe sobre banco de dados
 
DevCamp 2013 :: O Mito do Desenvolvedor 10x
DevCamp 2013 :: O Mito do Desenvolvedor 10xDevCamp 2013 :: O Mito do Desenvolvedor 10x
DevCamp 2013 :: O Mito do Desenvolvedor 10x
 
Impulsione sua carreira contribuindo para projetos open source
Impulsione sua carreira contribuindo para projetos open sourceImpulsione sua carreira contribuindo para projetos open source
Impulsione sua carreira contribuindo para projetos open source
 
PostgreSQL Tuning: O elefante mais rápido que um leopardo
PostgreSQL Tuning: O elefante mais rápido que um leopardoPostgreSQL Tuning: O elefante mais rápido que um leopardo
PostgreSQL Tuning: O elefante mais rápido que um leopardo
 
Devcamp 2015 - 1 milhão de pedidos, 1 milhão de entregas… Quais as tecnologia...
Devcamp 2015 - 1 milhão de pedidos, 1 milhão de entregas… Quais as tecnologia...Devcamp 2015 - 1 milhão de pedidos, 1 milhão de entregas… Quais as tecnologia...
Devcamp 2015 - 1 milhão de pedidos, 1 milhão de entregas… Quais as tecnologia...
 
Python for Data Science
Python for Data SciencePython for Data Science
Python for Data Science
 

Ähnlich wie TOP5 - Falsas Suposições de Programadores

Como automatizar Sistemas Legados utilizando ferramentas de DevOps
Como automatizar Sistemas Legados utilizando ferramentas de DevOpsComo automatizar Sistemas Legados utilizando ferramentas de DevOps
Como automatizar Sistemas Legados utilizando ferramentas de DevOpsRafael Salerno de Oliveira
 
O poder do Docker (7 Masters)
O poder do Docker (7 Masters)O poder do Docker (7 Masters)
O poder do Docker (7 Masters)Wellington Silva
 
Scrum na Globo.com - Derrubando mitos - UPDATED
Scrum na Globo.com - Derrubando mitos - UPDATEDScrum na Globo.com - Derrubando mitos - UPDATED
Scrum na Globo.com - Derrubando mitos - UPDATEDDanilo Bardusco
 
Porque OKRs são ideais para metodologias ágeis
Porque OKRs são ideais para metodologias ágeisPorque OKRs são ideais para metodologias ágeis
Porque OKRs são ideais para metodologias ágeisPericles Gumerato
 
Tester, pegue suas coisas, você está demitido
Tester, pegue suas coisas, você está demitidoTester, pegue suas coisas, você está demitido
Tester, pegue suas coisas, você está demitidoLeonardo Galani
 
Leonardo Galani - Tester, pegue suas coisas porque vc está demitido
Leonardo Galani - Tester, pegue suas coisas porque vc está demitidoLeonardo Galani - Tester, pegue suas coisas porque vc está demitido
Leonardo Galani - Tester, pegue suas coisas porque vc está demitidominastestingconference
 
Equipes de sucesso final
Equipes de sucesso finalEquipes de sucesso final
Equipes de sucesso finalPaulo Mattos
 
IC Cuidando de Sistemas Doentes
IC Cuidando de Sistemas DoentesIC Cuidando de Sistemas Doentes
IC Cuidando de Sistemas DoentesJefferson Moreira
 
Velozes e furiosos com extreme programming.
Velozes e furiosos com extreme programming. Velozes e furiosos com extreme programming.
Velozes e furiosos com extreme programming. Alessandro Binhara
 
Conhecendo os Padrões De Projetos
Conhecendo os Padrões De ProjetosConhecendo os Padrões De Projetos
Conhecendo os Padrões De Projetoscejug
 
Building Scalable Applications
Building Scalable ApplicationsBuilding Scalable Applications
Building Scalable Applicationsracx
 
[GUTS-RS] DevOps pela visão de QA
[GUTS-RS] DevOps pela visão de QA[GUTS-RS] DevOps pela visão de QA
[GUTS-RS] DevOps pela visão de QAGUTS-RS
 
WP WEEKEND 2015 - Vivendo de word press
WP WEEKEND 2015 - Vivendo de word pressWP WEEKEND 2015 - Vivendo de word press
WP WEEKEND 2015 - Vivendo de word pressRodrigo Toshiaki Horie
 

Ähnlich wie TOP5 - Falsas Suposições de Programadores (20)

Client undertow
Client undertowClient undertow
Client undertow
 
Como automatizar Sistemas Legados utilizando ferramentas de DevOps
Como automatizar Sistemas Legados utilizando ferramentas de DevOpsComo automatizar Sistemas Legados utilizando ferramentas de DevOps
Como automatizar Sistemas Legados utilizando ferramentas de DevOps
 
O poder do Docker (7 Masters)
O poder do Docker (7 Masters)O poder do Docker (7 Masters)
O poder do Docker (7 Masters)
 
Scrum na Globo.com - Derrubando mitos - UPDATED
Scrum na Globo.com - Derrubando mitos - UPDATEDScrum na Globo.com - Derrubando mitos - UPDATED
Scrum na Globo.com - Derrubando mitos - UPDATED
 
Porque OKRs são ideais para metodologias ágeis
Porque OKRs são ideais para metodologias ágeisPorque OKRs são ideais para metodologias ágeis
Porque OKRs são ideais para metodologias ágeis
 
Tester, pegue suas coisas, você está demitido
Tester, pegue suas coisas, você está demitidoTester, pegue suas coisas, você está demitido
Tester, pegue suas coisas, você está demitido
 
Leonardo Galani - Tester, pegue suas coisas porque vc está demitido
Leonardo Galani - Tester, pegue suas coisas porque vc está demitidoLeonardo Galani - Tester, pegue suas coisas porque vc está demitido
Leonardo Galani - Tester, pegue suas coisas porque vc está demitido
 
Estimativas Ágeis
Estimativas ÁgeisEstimativas Ágeis
Estimativas Ágeis
 
Equipes de sucesso final
Equipes de sucesso finalEquipes de sucesso final
Equipes de sucesso final
 
IC Cuidando de Sistemas Doentes
IC Cuidando de Sistemas DoentesIC Cuidando de Sistemas Doentes
IC Cuidando de Sistemas Doentes
 
Seu código fede e você nem sabia
Seu código fede e você nem sabiaSeu código fede e você nem sabia
Seu código fede e você nem sabia
 
Velozes e furiosos com extreme programming.
Velozes e furiosos com extreme programming. Velozes e furiosos com extreme programming.
Velozes e furiosos com extreme programming.
 
Apresentação Mundo Ideal 2015
Apresentação Mundo Ideal 2015Apresentação Mundo Ideal 2015
Apresentação Mundo Ideal 2015
 
Conhecendo os Padrões De Projetos
Conhecendo os Padrões De ProjetosConhecendo os Padrões De Projetos
Conhecendo os Padrões De Projetos
 
Introdução ao TDD
Introdução ao TDDIntrodução ao TDD
Introdução ao TDD
 
Building Scalable Applications
Building Scalable ApplicationsBuilding Scalable Applications
Building Scalable Applications
 
[GUTS-RS] DevOps pela visão de QA
[GUTS-RS] DevOps pela visão de QA[GUTS-RS] DevOps pela visão de QA
[GUTS-RS] DevOps pela visão de QA
 
DevOps pela visão de QA
DevOps pela visão de QADevOps pela visão de QA
DevOps pela visão de QA
 
WP WEEKEND 2015 - Vivendo de word press
WP WEEKEND 2015 - Vivendo de word pressWP WEEKEND 2015 - Vivendo de word press
WP WEEKEND 2015 - Vivendo de word press
 
Consultores digitais semana 2 dia 4 (participantes)
Consultores digitais semana 2 dia 4 (participantes)Consultores digitais semana 2 dia 4 (participantes)
Consultores digitais semana 2 dia 4 (participantes)
 

TOP5 - Falsas Suposições de Programadores

  • 1. TOP5 – Falsas Suposições de Programadores Matheus de Oliveira <matheus.oliveira@dextra.com.br> Apresentado no 15 de Maio de 2015
  • 2. Matheus de Oliveira <matheus.oliveira@dextra.com.br> DBA PostgreSQL – consultorias e suportes 24x7/8x5 Instrutor dos treinamentos PostgreSQL Concepção, desenvolvimento e suporte à produção
  • 3. Matheus de Oliveira <matheus.oliveira@dextra.com.br> Mais de 15 anos trabalhando de suporte e consultoria PostgreSQL http://www.dextra.com.br/ “Crafting Software, Transforming Business” Instrutor dos treinamentos PostgreSQL Concepção, desenvolvimento e suporte à produção
  • 4. Matheus de Oliveira <matheus.oliveira@dextra.com.br> Mais de 15 anos trabalhando de suporte e consultoria PostgreSQL http://www.dextra.com.br/ “Crafting Software, Transforming Business” 10 anos e mais de 10 mil profissionais capacitados em todo o Brasil. http://www.dextraining.com.br/ “Aprenda com quem faz na prática” Concepção, desenvolvimento e suporte à produção
  • 5. Matheus de Oliveira <matheus.oliveira@dextra.com.br> Mais de 15 anos trabalhando de suporte e consultoria PostgreSQL http://www.dextra.com.br/ “Crafting Software, Transforming Business” 10 anos e mais de 10 mil profissionais capacitados em todo o Brasil. http://www.dextraining.com.br/ “Aprenda com quem faz na prática” SaaS para análise e monitoramento PostgreSQL http://www.pganalytics.com.br/ “Facilitando a vida do DBA”
  • 8. Tratamento de data/hora • todo dia tem 24 horas? 5 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 9. Tratamento de data/hora • todo dia tem 24 horas? ◦ Então, se subtrairmos 1 dia de uma data/hora, ou 24 horas, teremos o mesmo resultado, certo? 5 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 10. Tratamento de data/hora • todo dia tem 24 horas? ◦ Então, se subtrairmos 1 dia de uma data/hora, ou 24 horas, teremos o mesmo resultado, certo? postgres =# SELECT ts , ts - i n t e r v a l ’1 day’ FROM datahora; ts | ?column? ------------------------+------------------------ 2015 -10 -19 00:00:00 -02 | 2015 -10 -18 01:00:00 -02 (1 row) postgres =# SELECT ts , ts - i n t e r v a l ’24 hours ’ FROM datahora; ts | ?column? ------------------------+------------------------ 2015 -10 -19 00:00:00 -02 | 2015 -10 -17 23:00:00 -03 (1 row) 5 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 11. Tratamento de data/hora • Falsa suposições sobre fuso horários: ◦ minha aplicação nunca vai ser usada com diferentes fuso horários 6 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 12. Tratamento de data/hora • Falsa suposições sobre fuso horários: ◦ minha aplicação nunca vai ser usada com diferentes fuso horários ◦ Ok, mas pelo menos os offsets vão ser próximos 6 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 13. Tratamento de data/hora • Falsa suposições sobre fuso horários: ◦ minha aplicação nunca vai ser usada com diferentes fuso horários ◦ Ok, mas pelo menos os offsets vão ser próximos ◦ os possíveis offsets são -12:00, -11:00, -10:00, ..., 10:00, 11:00, 12:00 6 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 14. Tratamento de data/hora • Falsa suposições sobre fuso horários: ◦ minha aplicação nunca vai ser usada com diferentes fuso horários ◦ Ok, mas pelo menos os offsets vão ser próximos ◦ os possíveis offsets são -12:00, -11:00, -10:00, ..., 10:00, 11:00, 12:00 ◦ a data/hora do cliente e do servidor são iguais 6 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 15. Tratamento de data/hora • Falsa suposições sobre fuso horários: ◦ minha aplicação nunca vai ser usada com diferentes fuso horários ◦ Ok, mas pelo menos os offsets vão ser próximos ◦ os possíveis offsets são -12:00, -11:00, -10:00, ..., 10:00, 11:00, 12:00 ◦ a data/hora do cliente e do servidor são iguais ◦ Ok, não iguais, mas bem próximas 6 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 16. Tratamento de data/hora • Falsa suposições sobre fuso horários: ◦ minha aplicação nunca vai ser usada com diferentes fuso horários ◦ Ok, mas pelo menos os offsets vão ser próximos ◦ os possíveis offsets são -12:00, -11:00, -10:00, ..., 10:00, 11:00, 12:00 ◦ a data/hora do cliente e do servidor são iguais ◦ Ok, não iguais, mas bem próximas ◦ Ok, ok, mas pelo menos a diferença permanece a mesma, sempre! 6 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 17. Tratamento de data/hora • Falsa suposições sobre fuso horários: ◦ minha aplicação nunca vai ser usada com diferentes fuso horários ◦ Ok, mas pelo menos os offsets vão ser próximos ◦ os possíveis offsets são -12:00, -11:00, -10:00, ..., 10:00, 11:00, 12:00 ◦ a data/hora do cliente e do servidor são iguais ◦ Ok, não iguais, mas bem próximas ◦ Ok, ok, mas pelo menos a diferença permanece a mesma, sempre! ◦ os servidores estarão todos com o mesmo fuso horário 6 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 18. Tratamento de data/hora • Falsa suposições sobre fuso horários: ◦ minha aplicação nunca vai ser usada com diferentes fuso horários ◦ Ok, mas pelo menos os offsets vão ser próximos ◦ os possíveis offsets são -12:00, -11:00, -10:00, ..., 10:00, 11:00, 12:00 ◦ a data/hora do cliente e do servidor são iguais ◦ Ok, não iguais, mas bem próximas ◦ Ok, ok, mas pelo menos a diferença permanece a mesma, sempre! ◦ os servidores estarão todos com o mesmo fuso horário ◦ o fuso horário do servidor não vai mudar 6 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 19. Tratamento de data/hora • Falsa suposições sobre fuso horários: ◦ minha aplicação nunca vai ser usada com diferentes fuso horários ◦ Ok, mas pelo menos os offsets vão ser próximos ◦ os possíveis offsets são -12:00, -11:00, -10:00, ..., 10:00, 11:00, 12:00 ◦ a data/hora do cliente e do servidor são iguais ◦ Ok, não iguais, mas bem próximas ◦ Ok, ok, mas pelo menos a diferença permanece a mesma, sempre! ◦ os servidores estarão todos com o mesmo fuso horário ◦ o fuso horário do servidor não vai mudar ◦ a data/hora do servidor não volta, só avança 6 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 20. Tratamento de data/hora • Falsa suposições sobre fuso horários: ◦ minha aplicação nunca vai ser usada com diferentes fuso horários ◦ Ok, mas pelo menos os offsets vão ser próximos ◦ os possíveis offsets são -12:00, -11:00, -10:00, ..., 10:00, 11:00, 12:00 ◦ a data/hora do cliente e do servidor são iguais ◦ Ok, não iguais, mas bem próximas ◦ Ok, ok, mas pelo menos a diferença permanece a mesma, sempre! ◦ os servidores estarão todos com o mesmo fuso horário ◦ o fuso horário do servidor não vai mudar ◦ a data/hora do servidor não volta, só avança ◦ ... http://infiniteundo.com/post/25326999628/ falsehoods-programmers-believe-about-time 6 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 21. Não existem “apenas” 24 fuso horários 7 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 22. 2. Pessoas têmnomes, nem sempre tão simples como você imagina
  • 23. Pessoas têm nomes, nem sempre tão simples como você imagina • É possível validar os caracteres de um nome? 9 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 24. Pessoas têm nomes, nem sempre tão simples como você imagina • É possível validar os caracteres de um nome? • É possível separar os componentes de um nome (nome, sobrenome, etc.)? 9 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 25. Pessoas têm nomes, nem sempre tão simples como você imagina • É possível validar os caracteres de um nome? • É possível separar os componentes de um nome (nome, sobrenome, etc.)? ◦ Björk Guðmundsdóttir – Islândia – ordem: nome, sobrenome 9 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 26. Pessoas têm nomes, nem sempre tão simples como você imagina • É possível validar os caracteres de um nome? • É possível separar os componentes de um nome (nome, sobrenome, etc.)? ◦ Björk Guðmundsdóttir – Islândia – ordem: nome, sobrenome ◦ Mao Ze Dong – China – ordem: sobrenome, genérico (geralmente compartilhado entre irmãos), nome 9 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 27. Pessoas têm nomes, nem sempre tão simples como você imagina • É possível validar os caracteres de um nome? • É possível separar os componentes de um nome (nome, sobrenome, etc.)? ◦ Björk Guðmundsdóttir – Islândia – ordem: nome, sobrenome ◦ Mao Ze Dong – China – ordem: sobrenome, genérico (geralmente compartilhado entre irmãos), nome ◦ María-Jose Carreño Quiñones – Países que falam espanhol – nome, sobrenome do pai (será o sobrenome “principal”), sobrenome da mãe 9 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 28. Pessoas têm nomes, nem sempre tão simples como você imagina • É possível validar os caracteres de um nome? • É possível separar os componentes de um nome (nome, sobrenome, etc.)? ◦ Björk Guðmundsdóttir – Islândia – ordem: nome, sobrenome ◦ Mao Ze Dong – China – ordem: sobrenome, genérico (geralmente compartilhado entre irmãos), nome ◦ María-Jose Carreño Quiñones – Países que falam espanhol – nome, sobrenome do pai (será o sobrenome “principal”), sobrenome da mãe ◦ José Eduardo Santos Tavares Melo Silva – Brasil 9 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 29. Pessoas têm nomes, nem sempre tão simples como você imagina • É possível validar os caracteres de um nome? • É possível separar os componentes de um nome (nome, sobrenome, etc.)? ◦ Velikkakathu Sankaran Achuthanandan – Índia – sobrenome, nome do pai, nome 10 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 30. Pessoas têm nomes, nem sempre tão simples como você imagina • É possível validar os caracteres de um nome? • É possível separar os componentes de um nome (nome, sobrenome, etc.)? ◦ Velikkakathu Sankaran Achuthanandan – Índia – sobrenome, nome do pai, nome ◦ Kogaddu Birappa Timappa Nair – Índia – ordem: nome da vila, nome do pai, nome, sobrenome 10 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 31. Pessoas têm nomes, nem sempre tão simples como você imagina • É possível validar os caracteres de um nome? • É possível separar os componentes de um nome (nome, sobrenome, etc.)? ◦ Velikkakathu Sankaran Achuthanandan – Índia – sobrenome, nome do pai, nome ◦ Kogaddu Birappa Timappa Nair – Índia – ordem: nome da vila, nome do pai, nome, sobrenome ◦ Aditya Pratap Singh Chauhan – Índia – ordem: nome, nome do pai, sobrenome, casta 10 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 32. Pessoas têm nomes, nem sempre tão simples como você imagina • É possível validar os caracteres de um nome? • É possível separar os componentes de um nome (nome, sobrenome, etc.)? ◦ Velikkakathu Sankaran Achuthanandan – Índia – sobrenome, nome do pai, nome ◦ Kogaddu Birappa Timappa Nair – Índia – ordem: nome da vila, nome do pai, nome, sobrenome ◦ Aditya Pratap Singh Chauhan – Índia – ordem: nome, nome do pai, sobrenome, casta • OBS: Exemplos aproximados, sobrenome é o nome da família ou como deve-se referenciar com Sr./Sra./etc. Mais detalhes, com mesmos exemplos, em http: //www.w3.org/International/questions/qa-personal-names 10 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 33. Ok, e como devemos criar nossos formulários? • Primeiro nome, último nome? 11 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 34. Ok, e como devemos criar nossos formulários? • Primeiro nome, último nome? ◦ e a senhora “María-Jose Carreño Quiñones”? 11 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 35. Ok, e como devemos criar nossos formulários? • Primeiro nome, último nome? ◦ e a senhora “María-Jose Carreño Quiñones”? ◦ e o caro “Mao Ze Dong”? 11 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 36. Ok, e como devemos criar nossos formulários? • Primeiro nome, último nome? ◦ e a senhora “María-Jose Carreño Quiñones”? ◦ e o caro “Mao Ze Dong”? • Nome, sobrenome? 11 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 37. Ok, e como devemos criar nossos formulários? • Primeiro nome, último nome? ◦ e a senhora “María-Jose Carreño Quiñones”? ◦ e o caro “Mao Ze Dong”? • Nome, sobrenome? ◦ E como concatenar? “Dong Mao” ao invés de “Mao Dong”? 11 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 38. Ok, e como devemos criar nossos formulários? • Primeiro nome, último nome? ◦ e a senhora “María-Jose Carreño Quiñones”? ◦ e o caro “Mao Ze Dong”? • Nome, sobrenome? ◦ E como concatenar? “Dong Mao” ao invés de “Mao Dong”? ◦ Se eu uso “Matheus”, “de Oliveira”: Autor: DE OLIVEIRA, Matheus. 11 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 39. Ok, e como devemos criar nossos formulários? • Primeiro nome, último nome? ◦ e a senhora “María-Jose Carreño Quiñones”? ◦ e o caro “Mao Ze Dong”? • Nome, sobrenome? ◦ E como concatenar? “Dong Mao” ao invés de “Mao Dong”? ◦ Se eu uso “Matheus”, “de Oliveira”: Autor: DE OLIVEIRA, Matheus. ◦ “Matheus de”, “Oliveira”: e-mail: Olá Matheus de, você acaba de ganhar 1 milhão de reais! 11 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 40. Ok, e como devemos criar nossos formulários? • Não há solução então? 12 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 41. Ok, e como devemos criar nossos formulários? • Não há solução então? ◦ A verdade é que depende do uso, uma solução aceita é pedir: • Nome completo: ... • Como devemos chamá-lo: ... 12 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 42. Ok, e como devemos criar nossos formulários? • Não há solução então? ◦ A verdade é que depende do uso, uma solução aceita é pedir: • Nome completo: ... • Como devemos chamá-lo: ... • Legal, e o campo para tratamento Sr./Sra./Dr./etc.? 12 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 43. Ok, e como devemos criar nossos formulários? • Não há solução então? ◦ A verdade é que depende do uso, uma solução aceita é pedir: • Nome completo: ... • Como devemos chamá-lo: ... • Legal, e o campo para tratamento Sr./Sra./Dr./etc.? ◦ Alguns tratamentos vêm no início (Dr./Sr./Sra./etc.), outros no fim (“, PhD”) 12 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 44. 3. Endereços também não são tão simples assim
  • 45. Endereços também não são tão simples assim • Errado: 14 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 46. Endereços também não são tão simples assim • Errado: ◦ todo endereço possui um número 14 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 47. Endereços também não são tão simples assim • Errado: ◦ todo endereço possui um número ◦ Ok, mas se tem número então é numérico (ah?) 14 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 48. Endereços também não são tão simples assim • Errado: ◦ todo endereço possui um número ◦ Ok, mas se tem número então é numérico (ah?) ◦ pessoas com CEPs semelhantes moram na mesma região 14 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 49. Endereços também não são tão simples assim • Errado: ◦ todo endereço possui um número ◦ Ok, mas se tem número então é numérico (ah?) ◦ pessoas com CEPs semelhantes moram na mesma região ◦ Mas pelo menos duas pessoas com exatamente o mesmo CEP moram próximas uma da outra 14 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 50. Endereços também não são tão simples assim • Errado: ◦ todo endereço possui um número ◦ Ok, mas se tem número então é numérico (ah?) ◦ pessoas com CEPs semelhantes moram na mesma região ◦ Mas pelo menos duas pessoas com exatamente o mesmo CEP moram próximas uma da outra ◦ No mesmo logradouro não existe mais de um CEP 14 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 51. Endereços também não são tão simples assim • Errado: ◦ todo endereço possui um número ◦ Ok, mas se tem número então é numérico (ah?) ◦ pessoas com CEPs semelhantes moram na mesma região ◦ Mas pelo menos duas pessoas com exatamente o mesmo CEP moram próximas uma da outra ◦ No mesmo logradouro não existe mais de um CEP ◦ Nome de cidade é único no país 14 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 52. Endereços também não são tão simples assim • Errado: ◦ todo endereço possui um número ◦ Ok, mas se tem número então é numérico (ah?) ◦ pessoas com CEPs semelhantes moram na mesma região ◦ Mas pelo menos duas pessoas com exatamente o mesmo CEP moram próximas uma da outra ◦ No mesmo logradouro não existe mais de um CEP ◦ Nome de cidade é único no país ◦ Tá, mas nome de rua é único dentro cidade 14 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 53. Endereços também não são tão simples assim • Errado: ◦ todo endereço possui um número ◦ Ok, mas se tem número então é numérico (ah?) ◦ pessoas com CEPs semelhantes moram na mesma região ◦ Mas pelo menos duas pessoas com exatamente o mesmo CEP moram próximas uma da outra ◦ No mesmo logradouro não existe mais de um CEP ◦ Nome de cidade é único no país ◦ Tá, mas nome de rua é único dentro cidade ◦ Nome de rua, cidade, bairro, nunca muda 14 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 54. Endereços também não são tão simples assim • Errado: ◦ todo endereço possui um número ◦ Ok, mas se tem número então é numérico (ah?) ◦ pessoas com CEPs semelhantes moram na mesma região ◦ Mas pelo menos duas pessoas com exatamente o mesmo CEP moram próximas uma da outra ◦ No mesmo logradouro não existe mais de um CEP ◦ Nome de cidade é único no país ◦ Tá, mas nome de rua é único dentro cidade ◦ Nome de rua, cidade, bairro, nunca muda ◦ ... https://www.mjt.me.uk/posts/ falsehoods-programmers-believe-about-addresses/ 14 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 56. Precisão de pontos flutuantes • Devemos usar os tipos double,float,real,... sempre que trabalhamos com decimais (moeda, volume, etc.)? 16 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 57. Precisão de pontos flutuantes • Devemos usar os tipos double,float,real,... sempre que trabalhamos com decimais (moeda, volume, etc.)? UPDATE venda_item SET valor_real = valor , qtd_real = qtd , valor_double = valor , qtd_double = qtd; SELECT sum(valor * qtd) AS soma , sum(valor_real * qtd_real) AS soma_real , sum(valor_double * qtd_double) AS soma_double FROM venda_item; soma | soma_real | soma_double -------------+-----------+------------------ 183802.5000 | 183804 | 183802.499999927 ◦ soma = numeric/decimal ◦ soma_real = float (4 bytes) ◦ soma_double = double precision (8 bytes) 16 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 58. 5. Concorrência em bancos de dados (relacionais)
  • 59. Concorrência em bancos de dados (relacionais) • Errado: 18 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 60. Concorrência em bancos de dados (relacionais) • Errado: ◦ Pegar o próximo “id” único para autoincremento: SELECT max(id) + 1 FROM minha_tabela; 18 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 61. Concorrência em bancos de dados (relacionais) • Errado: ◦ Pegar o próximo “id” único para autoincremento: SELECT max(id) + 1 FROM minha_tabela; Solução: sequence, serial, auto_increment 18 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 62. Concorrência em bancos de dados (relacionais) • Errado: ◦ Pegar o próximo “id” único para autoincremento: SELECT max(id) + 1 FROM minha_tabela; Solução: sequence, serial, auto_increment ◦ Inserir ou atualizar um registro: UPDATE acesso SET contador = contador + 1 WHERE url = p_url AND usuario = p_usuario; IF (NOT FOUND) THEN INSERT INTO acesso(url , usuario , contador) VALUES (p_url , p_usuario , 1); END IF ; 18 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 63. Concorrência em bancos de dados (relacionais) • Errado: ◦ Pegar o próximo “id” único para autoincremento: SELECT max(id) + 1 FROM minha_tabela; Solução: sequence, serial, auto_increment ◦ Inserir ou atualizar um registro: UPDATE acesso SET contador = contador + 1 WHERE url = p_url AND usuario = p_usuario; IF (NOT FOUND) THEN INSERT INTO acesso(url , usuario , contador) VALUES (p_url , p_usuario , 1); END IF ; Solução: tratamento de erro (falha no INSERT, tenta UPDATE novamente), MERGE, INSERT OR REPLACE, INSERT ... ON CONFLICT UPDATE, ... 18 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 64. Concorrência em bancos de dados (relacionais) • Errado: ◦ Trigger para atualizar estoque: SELECT qtd_estoque INTO v_qtd FROM produtos WHERE produto_id = NEW.produto_id; UPDATE produtos SET qtd_estoque = v_qtd - NEW.qtd WHERE produto_id = NEW.produto_id; 19 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 65. Concorrência em bancos de dados (relacionais) • Errado: ◦ Trigger para atualizar estoque: SELECT qtd_estoque INTO v_qtd FROM produtos WHERE produto_id = NEW.produto_id; UPDATE produtos SET qtd_estoque = v_qtd - NEW.qtd WHERE produto_id = NEW.produto_id; Solução: um único UPDATE UPDATE produtos SET qtd_estoque = qtd_estoque - NEW.qtd WHERE produto_id = NEW.produto_id; 19 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 66. Concorrência em bancos de dados (relacionais) • Errado: ◦ Trigger para atualizar estoque: SELECT qtd_estoque INTO v_qtd FROM produtos WHERE produto_id = NEW.produto_id; UPDATE produtos SET qtd_estoque = v_qtd - NEW.qtd WHERE produto_id = NEW.produto_id; Solução: um único UPDATE UPDATE produtos SET qtd_estoque = qtd_estoque - NEW.qtd WHERE produto_id = NEW.produto_id; Ou então, use a cláusula FOR UPDATE no SELECT 19 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 67. Concorrência em bancos de dados (relacionais) • Errado: ◦ Incoerências relativas à sequências (sequences ou campos autoincrementais) em ids: • ids são contínuos (sem buracos) 20 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 68. Concorrência em bancos de dados (relacionais) • Errado: ◦ Incoerências relativas à sequências (sequences ou campos autoincrementais) em ids: • ids são contínuos (sem buracos) • SELECT ... FROM tabela (sem ORDER BY), traz na ordem de inserção 20 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 69. Concorrência em bancos de dados (relacionais) • Errado: ◦ Incoerências relativas à sequências (sequences ou campos autoincrementais) em ids: • ids são contínuos (sem buracos) • SELECT ... FROM tabela (sem ORDER BY), traz na ordem de inserção • Ok, mas pelo menos ORDER BY id me traz a ordem de inserção 20 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 70. Concorrência em bancos de dados (relacionais) • Errado: ◦ Incoerências relativas à sequências (sequences ou campos autoincrementais) em ids: • ids são contínuos (sem buracos) • SELECT ... FROM tabela (sem ORDER BY), traz na ordem de inserção • Ok, mas pelo menos ORDER BY id me traz a ordem de inserção • Sério? Ah, mas ORDER BY id e ORDER BY data_insercao são equivalentes 20 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 71. Resumindo... 1. Marcar tempo é complexo, use sempre valor absoluto (ou um tipo que use-o internamente) 2. Pessoas têm nomes “estranhos”, e não gostam quando você os erra! 3. Vida de carteiro não é fácil 4. float/double/real/... não têm boa precisão 5. Vai ter mais de um usuário em produção, pense sempre em concorrência 21 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 72. Obrigado! Dúvidas? Matheus de Oliveira matheus.oliveira@dextra.com.br IRC – irc.freenode.net: /join #postgresql,#postgresql-br,#dextra Meu nick: MatheusOl Twitter: @matioli_matheus LinkedIn: br.linkedin.com/in/matheusdeoliveira/ SlideShare: slideshare.net/matheus_de_oliveira