TOP5 - Falsas Suposições de Programadores

975 visualizações

Publicada em

Slides da palestra apresentada no DevCamp 2015.

Você, caro programador, já deve ter tido problemas por ter assumido algumas meia-verdades.

Quando estamos desenvolvendo, muitas vezes assumimos saber de algo sem nem ao menos pensar no assunto, eis as 5 classes de situações mais problemáticas (ou mais interessantes):

1. Tratamento de data/hora, problemas com fuso horário e horário de verão
2. Pessoas têm nomes, nem sempre tão simples como você imagina
3. Endereços também não são tão simples assim
4. Precisão de pontos flutuantes
5. Concorrência em bancos de dados (relacionais)

Causas e efeitos serão vistos, mas também vamos ver a solução para esses problemas (muitas vezes bem simples). Talvez você economiza várias horas de refactoring, correção de bug, atualização de dados, simplesmente ao assistir esta palestra.

0 comentários
2 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
975
No SlideShare
0
A partir de incorporações
0
Número de incorporações
28
Ações
Compartilhamentos
0
Downloads
15
Comentários
0
Gostaram
2
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

TOP5 - Falsas Suposições de Programadores

  1. 1. TOP5 – Falsas Suposições de Programadores Matheus de Oliveira <matheus.oliveira@dextra.com.br> Apresentado no 15 de Maio de 2015
  2. 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. 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. 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. 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”
  6. 6. TOP5 Falsas Suposições de Progra- madores
  7. 7. 1. Tratamento de Data/hora
  8. 8. Tratamento de data/hora • todo dia tem 24 horas? 5 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  9. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 21. Não existem “apenas” 24 fuso horários 7 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  22. 22. 2. Pessoas têmnomes, nem sempre tão simples como você imagina
  23. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 44. 3. Endereços também não são tão simples assim
  45. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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
  55. 55. 4. Precisão de pontos utuantes
  56. 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. 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. 58. 5. Concorrência em bancos de dados (relacionais)
  59. 59. Concorrência em bancos de dados (relacionais) • Errado: 18 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  60. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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

×