O documento discute princípios de design de código e qualidade de código. Ele apresenta Guilherme Silveira como líder técnico, instrutor e palestrante sobre tópicos como escrever código limpo e evitar código ruim no futuro. O documento também fornece contatos de Guilherme Silveira.
Palestra ministrada no 22° PythonFloripa Meetup (https://youtu.be/tB0uNqjwbX8?t=7h14m57s) demonstrando as funcionalidades do Postgres, integrações com Python e algumas curiosidades
Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo SilveiraCaelum
Uma apresentação para conhecer umas das principais features do servlets 3; o asyncContext. bastante focada em conceitos, vamos utilizar o jetty 8 e o tomcat 7 para ver o impacto dessas decisões para fazer o ajax reverso/push.
Durante a apresentação também rodamos os códigos de exemplo para ver a brusca diferenca de se usar a abordagem assincrona em relacao ao thread-per-request/connection. codigo aqui:
https://github.com/peas/asyncservlets-test
Palestra ministrada no 22° PythonFloripa Meetup (https://youtu.be/tB0uNqjwbX8?t=7h14m57s) demonstrando as funcionalidades do Postgres, integrações com Python e algumas curiosidades
Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo SilveiraCaelum
Uma apresentação para conhecer umas das principais features do servlets 3; o asyncContext. bastante focada em conceitos, vamos utilizar o jetty 8 e o tomcat 7 para ver o impacto dessas decisões para fazer o ajax reverso/push.
Durante a apresentação também rodamos os códigos de exemplo para ver a brusca diferenca de se usar a abordagem assincrona em relacao ao thread-per-request/connection. codigo aqui:
https://github.com/peas/asyncservlets-test
Para quem começou com Java, é importante conhecer um pouco mais do que a JVM é capaz. Aqui vimos uma demonstração de como o JIT trabalha, além de como funciona a máquina virtual.
[QCon 2011] Por uma web mais rápida: técnicas de otimização de SitesCaelum
Palestra do Sérgio Lopes no QCon SP 2011 sobre otimizações client-side.
Post sobre essa palestra com bastante conteúdo:
http://blog.caelum.com.br/por-uma-web-mais-rapida-26-tecnicas-de-otimizacao-de-sites/
O que você NÃO aprendeu sobre Programação Orientada a ObjetosDanilo Sato
Slides da minha palestra na RubyConf BR 2013
Ruby é uma linguagem orientada a objetos, porém a maneira como aprendemos orientação a objetos geralmente foca no "O que?" e pouco no "Por quê?". Aprendemos o que é herança, polimorfismo, as diferenças entre classes e objetos, mas não discutimos questões mais relevantes como: o que caracteriza um bom design OO? Quais as vantagens e desvantagens de usar herança? Como OO me ajuda a resolver problemas do dia a dia? Nesta palestra vamos abordar estas e outras questões de design e modelagem OO através de exemplos. Pretendo desbancar alguns mitos - como modelar OO é modelar o mundo real - assim como compartilhar alguns princípios para ajudar você e seu time a melhorar a qualidade do código da sua aplicação Ruby.
Minicurso de Ruby on Rails que ocorreu de 25/11/2014 até 28/11/2014 no Instituto Federal de Educação Ciência e Tecnologia do Sudeste de Minas Campus Barbacena
Se você não usa geradores, está deixando de aproveitar um recurso poderoso de Python. Partimos do pattern Iterator e mostramos seus usos práticos e suporte nativo na linguagem, incluindo funções e expressões geradoras, que permitem lidar com massas de dados muito grandes de modo eficiente e com baixo consumo de memória. Ao final, mostramos o uso prático de funções geradoras em uma ferramenta de conversão de bancos de dados.
Introdução a linguagem de programação Ruby, onde tópicos como
história, comunidade, e diferenciais da linguagem serão abordados.
Será dada uma ênfase na simplicidade e produtividade do código em si,
além de alguns exemplos utilizados no dia-a-dia.
Apresentado em 07/11/2011, na Hora da Tecnologia, na Universidade Feevale.
http://www.feevale.br/internas/vwImprensaVisualizar.asp?strInd=via6&intIdSecao=2578&intIdConteudo=49091&dteDataPublicacao=2011/11/05
Para quem começou com Java, é importante conhecer um pouco mais do que a JVM é capaz. Aqui vimos uma demonstração de como o JIT trabalha, além de como funciona a máquina virtual.
[QCon 2011] Por uma web mais rápida: técnicas de otimização de SitesCaelum
Palestra do Sérgio Lopes no QCon SP 2011 sobre otimizações client-side.
Post sobre essa palestra com bastante conteúdo:
http://blog.caelum.com.br/por-uma-web-mais-rapida-26-tecnicas-de-otimizacao-de-sites/
O que você NÃO aprendeu sobre Programação Orientada a ObjetosDanilo Sato
Slides da minha palestra na RubyConf BR 2013
Ruby é uma linguagem orientada a objetos, porém a maneira como aprendemos orientação a objetos geralmente foca no "O que?" e pouco no "Por quê?". Aprendemos o que é herança, polimorfismo, as diferenças entre classes e objetos, mas não discutimos questões mais relevantes como: o que caracteriza um bom design OO? Quais as vantagens e desvantagens de usar herança? Como OO me ajuda a resolver problemas do dia a dia? Nesta palestra vamos abordar estas e outras questões de design e modelagem OO através de exemplos. Pretendo desbancar alguns mitos - como modelar OO é modelar o mundo real - assim como compartilhar alguns princípios para ajudar você e seu time a melhorar a qualidade do código da sua aplicação Ruby.
Minicurso de Ruby on Rails que ocorreu de 25/11/2014 até 28/11/2014 no Instituto Federal de Educação Ciência e Tecnologia do Sudeste de Minas Campus Barbacena
Se você não usa geradores, está deixando de aproveitar um recurso poderoso de Python. Partimos do pattern Iterator e mostramos seus usos práticos e suporte nativo na linguagem, incluindo funções e expressões geradoras, que permitem lidar com massas de dados muito grandes de modo eficiente e com baixo consumo de memória. Ao final, mostramos o uso prático de funções geradoras em uma ferramenta de conversão de bancos de dados.
Introdução a linguagem de programação Ruby, onde tópicos como
história, comunidade, e diferenciais da linguagem serão abordados.
Será dada uma ênfase na simplicidade e produtividade do código em si,
além de alguns exemplos utilizados no dia-a-dia.
Apresentado em 07/11/2011, na Hora da Tecnologia, na Universidade Feevale.
http://www.feevale.br/internas/vwImprensaVisualizar.asp?strInd=via6&intIdSecao=2578&intIdConteudo=49091&dteDataPublicacao=2011/11/05
Criando Símbolos Otimizados para Projetos no InduSoft Web StudioAVEVA
Como o supervisório InduSoft Web Studio permite facilmente o desenvolvimento de aplicações para dispositivos mobile e embedded, é fácil se perder no rico conjunto de recursos existentes e acabar criando símbolos não otimizados. Neste webinar vamos mostrar como criar símbolos que podem ser facilmente redimencionados e otimizados para dispositivos mobile e embedded.
Aprenda de forma bem objetiva as principais estruturas de dados disponíveis no Python: listas, tuplas, set, dicionário, pilha e fila. Conheça também primitivas de programação funcional como list comprehension, map, reduce, filter sorted entre outros.
Como aproveitar o que a sua ferramenta preferida tem de melhor, sem ter que lidar com o que ela tem de ruim? Esse talk é sobre uma experiência vivida durante o desenvolvimento de uma plataforma de ensino online para qual uma das soluções que se provou mais efetiva foi o uso não de uma única linguagem ou framework. Mas sim de tecnologias específicas para problemas específicos e pontuais. Um ponto importante e crítico dessa abordagem é a integração de todos esses micro sistemas.
(2015-01-29/30) [WTA2015] Adaptatividade em Python (Tutorial)Danilo J. S. Bellini
Slides do tutorial "Adaptatividade em Python" ministrado no Workshop de Tecnologia Adaptativa de 2015 (WTA2015) na Escola Politécnica da Universidade de São Paulo (Poli-USP) nos dias 2015-01-29 e 2015-01-30.
Código disponível em https://github.com/danilobellini/wta2015
Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)Julio Betta
Slides que utilizei para ministrar uma palestra sobre Desenvolvimento WEB com Ruby on Rails no IV Congresso de Iniciação Científica da Faculdade Redentor de Itaperuna / RJ em Novembro de 2011.
Semelhante a Qualidade de código - a qualidade que faz a diferença (20)
Métricas e a automatização do controle de qualidadeCaelum
"Essa história vai melhorar as vendas. Essa refatoração vai melhorar a manutenção". Será?
Se queremos escolher histórias e manter um produto melhor para o cliente final, essa decisão deve ser baseada em alguma medida.
Complexidade do código? Coesão? Aguentar altas cargas? Diminuir taxas de erro? Efetuar mais compras? Para entender qualquer uma delas é preciso medir: veremos nessa palestra como pegar um projeto cujo build mínimo está automatizado, mediremos a complexidade do código, o desempenho em relação a erros, a vendas e a percepção do usuário final.
Mantemos um rastreamento dessas métricas com o passar do tempo: encontrando os commits responsáveis pela quebra nas regras estabelecidas. A decisão se algo é bom ou não deixa de ser romântico e passa a ser algo lógico.
Além do responsive design: a mudança de paradigma do design adaptativo e os m...Caelum
Slides da palestra do Sérgio Lopes no Front In Sampa 2013.
Uma revolução aconteceu na Web e no mundo front-end com a explosão dos dispositivos móveis. Mais que ajustar seu site pra uma tela pequena com meia dúzia de media queries, o responsive web design traz reflexões importantes sobre o papel da Web como mídia adaptável, flexível, portável e democrática. Essa lightning talk discute a nova Web moderna, responsiva e adaptativa, seu papel hoje e como se preparar pro futuro.
64. def _read_attribute(attr_name)
attr_name = attr_name.to_s
attr_name = self.class.primary_key if attr_name == 'id'
value = @attributes[attr_name]
unless value.nil?
if column = column_for_attribute(attr_name)
if unserializable_attribute?(attr_name, column)
unserialize_attribute(attr_name)
else
column.type_cast(value)
end
else
value
end
end
end
fonte pequena?
65. def _read_attribute(attr_name)
attr_name = attr_name.to_s
attr_name = self.class.primary_key if attr_name == 'id'
value = @attributes[attr_name]
unless value.nil?
if column = column_for_attribute(attr_name)
if unserializable_attribute?(attr_name, column)
unserialize_attribute(attr_name)
else
column.type_cast(value)
end
else
value
end
end
end
agora sim? fonte 16
67. 23...
def _read_attribute(attr_name)
attr_name = attr_name.to_s
attr_name = self.class.primary_key if attr_name == 'id'
value = @attributes[attr_name]
unless value.nil?
if column = column_for_attribute(attr_name)
if unserializable_attribute?(attr_name, column)
unserialize_attribute(attr_name)
else
column.type_cast(value)
end
else
value
end
end
end
68. 23...
def _read_attribute(attr_name)
attr_name = attr_name.to_s
attr_name = self.class.primary_key if attr_name == 'id'
value = @attributes[attr_name]
unless value.nil?
if column = column_for_attribute(attr_name)
if unserializable_attribute?(attr_name, column)
unserialize_attribute(attr_name)
else
column.type_cast(value)
end
else
value
end
end
end
69. mas e se... 23...
def _read_attribute(attr_name)
attr_name = attr_name.to_s
attr_name = self.class.primary_key if attr_name == 'id'
value = @attributes[attr_name]
unless value.nil?
if column = column_for_attribute(attr_name)
if unserializable_attribute?(attr_name, column)
unserialize_attribute(attr_name)
else
column.type_cast(value)
end
else
value
end
end
end
70. mas eese...
mas se... 23...
def _read_attribute(attr_name)
attr_name = attr_name.to_s
attr_name = self.class.primary_key if attr_name == 'id'
value = @attributes[attr_name]
unless value.nil?
if column = column_for_attribute(attr_name)
if unserializable_attribute?(attr_name, column)
unserialize_attribute(attr_name)
else
column.type_cast(value)
end
else
value
end
end
end
71. mas eese...
mas ese... 23...
mas se...
def _read_attribute(attr_name)
attr_name = attr_name.to_s
attr_name = self.class.primary_key if attr_name == 'id'
value = @attributes[attr_name]
unless value.nil?
if column = column_for_attribute(attr_name)
if unserializable_attribute?(attr_name, column)
unserialize_attribute(attr_name)
else
column.type_cast(value)
end
else
value
end
end
end
72. mas eese...
mas ese... 23...
mas ese...
mas se...
def _read_attribute(attr_name)
attr_name = attr_name.to_s
attr_name = self.class.primary_key if attr_name == 'id'
value = @attributes[attr_name]
unless value.nil?
if column = column_for_attribute(attr_name)
if unserializable_attribute?(attr_name, column)
unserialize_attribute(attr_name)
else
column.type_cast(value)
end
else
value
end
end
end
73. mas eese...
mas ese... 23...
mas ese...
mas ese...
mas se...
def _read_attribute(attr_name)
attr_name = attr_name.to_s
attr_name = self.class.primary_key if attr_name == 'id'
value = @attributes[attr_name]
unless value.nil?
if column = column_for_attribute(attr_name)
if unserializable_attribute?(attr_name, column)
unserialize_attribute(attr_name)
else
column.type_cast(value)
end
else
value
end
end
end
74. mas eese...
mas ese... 23...
mas ese...
mas ese...
mas se...
def _read_attribute(attr_name)
attr_name = attr_name.to_s
attr_name = self.class.primary_key if attr_name == 'id'
value = @attributes[attr_name]
unless value.nil?
if column = column_for_attribute(attr_name)
if unserializable_attribute?(attr_name, column)
unserialize_attribute(attr_name)
else
column.type_cast(value)
end
else
value
end
end
end
75. mas eese...
mas ese... 23...
mas ese...
mas ese...
mas ese...
mas se...
def _read_attribute(attr_name)
attr_name = attr_name.to_s
attr_name = self.class.primary_key if attr_name == 'id'
value = @attributes[attr_name]
unless value.nil?
if column = column_for_attribute(attr_name)
if unserializable_attribute?(attr_name, column)
unserialize_attribute(attr_name)
else
column.type_cast(value)
end
else
value
end
end
end
77. def _read_attribute(attr_name)
attr_name = attr_name.to_s
attr_name = self.class.primary_key if attr_name == 'id'
value = @attributes[attr_name]
unless value.nil?
if column = column_for_attribute(attr_name)
if unserializable_attribute?(attr_name, column)
unserialize_attribute(attr_name)
else
column.type_cast(value)
end
else
value
end
end
end
78. o fluxo é COMPLEXO
def _read_attribute(attr_name)
attr_name = attr_name.to_s
attr_name = self.class.primary_key if attr_name == 'id'
value = @attributes[attr_name]
unless value.nil?
if column = column_for_attribute(attr_name)
if unserializable_attribute?(attr_name, column)
unserialize_attribute(attr_name)
else
column.type_cast(value)
end
else
value
end
end
end
79. o fluxo éSEMANTICA
não há COMPLEXO
def _read_attribute(attr_name)
attr_name = attr_name.to_s
attr_name = self.class.primary_key if attr_name == 'id'
value = @attributes[attr_name]
unless value.nil?
if column = column_for_attribute(attr_name)
if unserializable_attribute?(attr_name, column)
unserialize_attribute(attr_name)
else
column.type_cast(value)
end
else
value
end
end
end
121. def cached_attributes
@cached_attributes ||= columns.select { |c| cacheable_column?(c) }.map { |col| col.name }.to_set
end
how many tests do I need?
how frequently does flow control appear?
126. how many ifs?
def cached_attributes
@cached_attributes ||= columns.select { |c| cacheable_column?(c) }.map { |col| col.name }.to_set
end
Text
how frequently does flow control appear?
127. how many ifs?
def cached_attributes
@cached_attributes ||= columns.select { |c| cacheable_column?(c) }.map { |col| col.name }.to_set
end
Text
how frequently does flow control appear?
128. how many ifs?
how many fors?
def cached_attributes
@cached_attributes ||= columns.select { |c| cacheable_column?(c) }.map { |col| col.name }.to_set
end
Text
how frequently does flow control appear?
129. how many ifs?
how many fors?
def cached_attributes
@cached_attributes ||= columns.select { |c| cacheable_column?(c) }.map { |col| col.name }.to_set
end
Text
how frequently does flow control appear?
130. how many ifs?
how many fors?
def cached_attributes
@cached_attributes ||= columns.select { |c| cacheable_column?(c) }.map { |col| col.name }.to_set
end
Text
how many tests do I need?
how frequently does flow control appear?
133. and now?
how frequently does flow control appear?
def cached_attributes
@cached_attributes ||= columns.select { |c| cacheable_column?(c) }
.map { |col| col.name }
.to_set
end
145. o que acontece?
requisição remota?
Client client = clients.lookup(15L);
client.getName();
146. o que acontece?
requisição remota?
EJB 2 hell!
Client client = clients.lookup(15L);
client.getName();
147. o que acontece?
requisição remota?
EJB 2 hell!
Client client = clients.lookup(15L);
client.getName();
148. o que acontece?
requisição remota?
EJB 2 hell!
Client client = clients.lookup(15L);
client.getName();
Quer ver uma mágica?
149. o que acontece?
requisição HTTP?
inferno de “rest” proxy
aka active resource
Client client = clients.lookup(15L);
client.getName();
150. o que acontece se?
client.save
def save
database.save(this)
end
151. o que acontece se?
an HTTP remote request!?
client.save
def save
database.save(this)
end
152. o que acontece se?
an HTTP remote request!?
ClientRule.checkUniqueEnroll is invoked!?
client.save
def save
database.save(this)
end
153. o que acontece se?
an HTTP remote request!?
ClientRule.checkUniqueEnroll is invoked!?
“invisible invocation(s)” pattern
client.save
def save
database.save(this)
end
180. esse dói?
select * from Contatos where a=b or (c=d && e=f)
order by primeiro_campo
181. esse dói?
select * from Contatos where a=b or (c=d && e=f)
order by primeiro_campo
Maurício Aniche
182. esse dói?
select * from Contatos where a=b or (c=d && e=f)
order by primeiro_campo
Como você testaria isso?
Maurício Aniche
183. esse dói?
select * from Contatos where a=b or (c=d && e=f)
order by primeiro_campo
Como você testaria isso?
mock.assert(_.select(“select from ...”))?
Maurício Aniche
184. esse dói?
select * from Contatos where a=b or (c=d && e=f)
order by primeiro_campo
Como você testaria isso?
mock.assert(_.select(“select from ...”))?
1 teste?
Maurício Aniche
190. Facinho...
select * from Contatos where a=b or (c=d && e=f)
order by primeiro_campo limit 2
Martin Fowler
191. Facinho...
select * from Contatos where a=b or (c=d && e=f)
order by primeiro_campo limit 2
sql também é linguagem...
Martin Fowler
192. Facinho...
select * from Contatos where a=b or (c=d && e=f)
order by primeiro_campo limit 2
sql também é linguagem...
mina gata hein...
Martin Fowler
193. menos de 5 testes não garanto
mas a cobertura diz “100%”...
mentirosa ...
203. declare dependência
e código no
CONSTRUTOR
mas e no Rails, Javabeans, Hibernate, etc?
204. java (the javabeans way) rails (the ruby way)
dumb constructor dumb constructor
getter+setter attr_accessor
the scala way
dumb constructor
val
205. java (the javabeans way) rails (the ruby way)
dumb constructor dumb constructor
public variable public variable
the scala way
dumb constructor
public variable
206. O padrão de OO no mercado é a
“orgia dos objetos” pattern.
Todo mundo pega todo mundo.
240. abra *.jsp, *.erb, *.ssp, *.similares
CTRL+F, if com algo != de boolean
CTRL+F, if com chamada != de boolean
Notas do Editor
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
Esse é o gráfico de Requests/segundo do site da Caelum ao longo de duas semanas normais em Agosto/Setembro de 2010. Até que um belo dia acontece o lançamento da nova apostila de Rails 3 do curso RR-71 da Caelum...\n\n@sergio_caelum | Caelum | QCon São Paulo 2010\n
... e, em apenas um instante, os acessos ao Site quintuplicam! \n\nEnviamos uma campanha em newsletter para milhares de inscritos, divulgamos no Blog com milhares de leitores e várias pessoas twitam. Tudo simultaneamente, em uma fria manhã de quinta-feira.\n\nComo lidar com esse tipo de pico? Como gerenciar os recursos computacionais necessários para segurar o tranco? E mais, sem desperdiçar recursos nem antes e nem depois; afinal o normal do site não é esse volume de acessos e o pico logo acaba.\n\nPodemos lançar por partes. Enviar a newsletter aos poucos para pequenos grupos. Divulgar no Blog apenas no dia seguinte. Mas piorar a experiência dos usuários por limitações técnicas? Perder aquele momento de marketing onde milhares e milhares de pessoas estão falando de você?\n\nVocê passa a vida toda desenvolvendo um produto e querendo que ele dê certo. E um belo dia ele estoura em sucesso. Como seu sistema reage? Ele capota ou segura o tranco naquele momento importantíssimo de crescimento? No fim de 2009, sem sabermos, o portal da revista InfoExame fez uma matéria citando nossas apostilas abertas. Foi uma correria para downloads, muitos e muitos acessos no site. Imagine não aguentar o tranco em um momento tão especial e com tanta visibilidade como esse?\n\n@sergio_caelum | Caelum | QCon São Paulo 2010\n
A solução rápida e fácil? Cloud computing e computação elástica\n\n@sergio_caelum | Caelum | QCon São Paulo 2010\n