1. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
www.akitaonrails.com
(Fabio Akita)
goruco2008.confreaks.com/04_davis.html
GoRuCo 2008
2. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Machucando Código
por Diversão
e Lucro
GoRuCo 2008
3. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Criando Expectativa
• 142 slides em 30 minutos.
• Isto será rápido.
• Não é a forma como normalmente apresento.
• É mais sobre melhorar você do que o código.
GoRuCo 2008
4. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Uma
História
GoRuCo 2008
6. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Código Legado
• Qualquer código que você não escreveu é legado.
• Toda empresa tem tonelada de legados.
• Mesmo startups.
GoRuCo 2008
23. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Moral desta
história?
GoRuCo 2008
24. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Pessoas vão te
incriminar se
machucá-las
GoRuCo 2008
25. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Código
não.
GoRuCo 2008
26. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Esta apresentação é
um evento de “saída”
para mim
GoRuCo 2008
27. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Meu nome é Ryan, e…
GoRuCo 2008
28. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
…adoro machucar
código…
GoRuCo 2008
29. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
…e estou Bem!
GoRuCo 2008
30. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Por que machucar código?
• Machucar código é divertido!
• Pode te tornar um programador e testador melhor.
• Pode tornar o código mais limpo, claro e fácil de
testar, escrever e manter ... até pode torná-lo mais
rápido.
GoRuCo 2008
31. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Sadismo Ruby:
nome
A tendência de derivar
prazer infringindo dor
ao software.
Esp. mal software.
GoRuCo 2008
32. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
É apenas outra
maneira de enxergar
desenvolvimento de
software
GoRuCo 2008
33. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Eu dou risada toda vez
que acho código que
posso punir.
GoRuCo 2008
34. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Código com
complexidade que
conheço, eu posso
resolver.
GoRuCo 2008
35. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
É sobre mudar sua
perspectiva sobre
código ruim.
GoRuCo 2008
36. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Torne divertido
descobrir e corrigir e
fará isso mais vezes.
GoRuCo 2008
37. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Sadismo Ruby vêm em
várias formas:
GoRuCo 2008
38. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Matar um bug
escrevendo um teste.
GoRuCo 2008
39. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Lendo código esperto
demais e se coçar para
quebrá-lo em pedaços.
GoRuCo 2008
40. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Explodindo mal design,
tornando-o mais rápido
com menos código.
GoRuCo 2008
41. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
e muito, muito mais.
GoRuCo 2008
42. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Um Exemplo
• Um projeto rails de mídia social de 2 meses foi
arrastado por 12 meses.
• Ligando ActiveRecord a WebDAV. Emulando o
banco de dados inteiro via propriedades
WebDAV.
Desnecessariamente complexo e lento!
• Então, arranquei o WebDAV num fim de semana.
GoRuCo 2008
43. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Antes:
Terminado em 74.77783 segundos.
622 testes, 2502 asserções
Depois:
Terminado em 5.258559 segundos.
330 testes, 961 asserções
GoRuCo 2008
44. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Tempo de Teste em 6 Meses
DAV
Post DAV
GoRuCo 2008
45. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Por alguma Razão as
pessoas amam
complexidade.
GoRuCo 2008
46. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Elas festejam nisso.
GoRuCo 2008
47. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
A comunidade Ruby
não se parece única
nesse sentido.
GoRuCo 2008
48. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Eu não sou uma
dessas pessoas.
GoRuCo 2008
49. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Mas, eu costumava ser
uma delas.
GoRuCo 2008
50. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Eu melhorei...
GoRuCo 2008
51. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
...e você também pode
melhorar.
GoRuCo 2008
52. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Minha História de Programação
10
9
8
7
6
Fu/Style Units
Ruby
Sadism/
5 Asceticism
Perl/
4 Ruby
Python/
UNIX/ etc
Smalltalk/
3
OO Epiphany
Pascal
2
C++
1 Logo
C
BASIC
0
1984 1986 1988 1990 1992 1994 1996 1998 2000 2002 2004 2007
Year
GoRuCo 2008
53. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Ascetismo Ruby:
noun
Caracterizado por ou
sugerindo a prática de severa
auto-disciplina &
abstenção de todas as formas
de indulgência.
GoRuCo 2008
54. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Flageladores
GoRuCo 2008
55. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Testar Antes é uma
forma de auto-
disciplina.
GoRuCo 2008
56. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
YAGNI é uma forma de
abstenção.
GoRuCo 2008
57. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Ascéticos:
Vida Real™ Ruby
Evite possessões Evite complexidade
materiais. extra.
Auto-disciplina para Auto-disciplina para
chegar à alta melhor entender a si e
espiritualidade. a mente do código.
GoRuCo 2008
58. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
O que é indulgência?
• Código desnecessariamente complexo e que tenta
se esperto demais.
• Código ou design que você não imediatamente
precise. Os “e se”.
• Débito Técnico.
GoRuCo 2008
59. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Débito Técnico
• Pular design é como pegar dinheiro emprestado.
• Refatoramento é como o princípio de pagar de
volta.
• Juros são pagos com tempo gasto com
complexidade.
—Ward Cunningham–ComplexityAsDebt, c2.com
GoRuCo 2008
60. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
80:20 ou Princípio de Pareto
• Na maioria dos sistemas existe desequilíbrio entre
produtores/consumidores, dinheiro/pessoas, etc.
• 85+% da terra é ocupada por 5% das pessoas.
• 80% do tempo é gasto com 20% do código.
• Use essa tendência para focar esforços de forma
eficiente e objetiva.
GoRuCo 2008
61. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Sinal : Barulho
• Normalmente relacionado a 80:20.
• Foque no que é importante.
• Minimize interrupções e tarefas irrelevantes para
ter mais tarefas reais concluídas.
• Como meu gerente favorito gosta de falar:
• Grandes Crocodilos, Pequenos Crocodilos,
Pântano.
GoRuCo 2008
62. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Em outras palavras:
“A obrigação do desenvolvedor é garantir que
o código sendo escrito mostre da maneira
mais clara sobre como a solução foi
entendida no momento da sua escrita.”
–Ward Cunningham, c2.com
GoRuCo 2008
63. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Um Exemplo
• test/unit & rspec são reis de testes/specs mas são
realmente grandes.
• O mspec de Brian Ford (do rubinius) é mais novo,
pequeno, & compatível com rspec.
• O bacon de Christian Neukirchen & test/spec são
alternativas minimalistas de spec.
• miniunit vai mais fundo: test+spec+mock < 1kloc.
GoRuCo 2008
64. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
lib test/spec
15,000
12,862
11,250
7,500 7,785
6,476
3,750
3,571
2,763
2,464
0
test/unit mspec rspec
GoRuCo 2008
65. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
lib test/spec
15,000
11,250
7,500
3,750
1,115
833
0 578
395
310
298
bacon miniunit test/spec
GoRuCo 2008
66. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
lib test/spec
1,200
1,115
900
833
600
578
395
300 310
298
0
bacon miniunit test/spec
GoRuCo 2008
67. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Acredito que sadismo
e ascetismo Ruby são
muito poderosos.
GoRuCo 2008
68. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Mas chegar lá não é fácil.
GoRuCo 2008
69. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Requer entender a si
mesmo tão bem
quanto se entende o
código.
GoRuCo 2008
70. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Desenvolvimento
Orientado a
Introspecção
GoRuCo 2008
71. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Como faço melhor?
Como não vi aquele bug?
Onde estou perdendo em clareza?
Como posso usar melhor minhas
ferramentas?
Onde desperdiço meu tempo?
Como me foco melhor?
Onde estou me segurando?
estou errado?
GoRuCo 2008
72. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Faça essas perguntas
constantemente!
GoRuCo 2008
73. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Auto-Melhoria:
Leia!
• 1 livro nerd / mês = 12× média da indústria.
• c2.com & outros wikis c/ pessoas espertas.
• Fique tão próximo dos experts quanto posssível.
• Alguns blogs espertos.
GoRuCo 2008
74. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Ignorância NÃO é boa
“Pessoas que fazem coisas de mal jeito, [...]
normalmente são altamente confiantes em
suas habilidades, de fato, mais do que
pessoas que fazem as coisas direito.”
Erica Goode, NYT
reportando em Dr. David Dunning, Cornell
GoRuCo 2008
75. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Auto-Melhoria:
Foco!
• Fique longe de:
• WTF, coding horror, forums idiotas.
• Um bilhão de blogs em seu leitor de feed.
• Toneladas de mailing lists super-ativas.
• Trabalhe no que é realmente importante.
GoRuCo 2008
76. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Urgente Não Urgente
Prevenção
Pressão
Planejamento Pró-ativo
Importante Apagar Incêndios
Implementando Sistemas
Projetos orientados a datas
Prevenção de Cansaço
Não Interrupções TV
Apagar alguns Incêndios Youtube
Importante Maioria das Reuniões Outras perdas de tempo
–7 Habits of Highly Effective People–Covey
GoRuCo 2008
77. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Auto-Melhoria:
Cresça!
• Aprenda uma nova linguagem por ano.
• Aprenda suas ferramentas, a fundo. Agora mais a
fundo.
• Examine seus hábitos de desenvolvimento.
• Codifique com outras pessoas.
• Estude alguma coisa não orientada a código.
• Pessoas de multi-disciplinares sempre são mais
interessante e codificam melhor.
GoRuCo 2008
78. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Auto-Melhoria:
Empurre!
Escreva mais código. Muito.
Quantidade > Qualidade
(algumas vezes)
GoRuCo 2008
79. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Desafio dos Potes
• Um professor de potes disse à metade da classe
que suas notas dependeriam de uma única peça
que eles produziriam no final do curso.
• Ele disse à outra metade que suas notas seriam
baseadas no volume de todas as peças criadas.
• Qual metade você acha que produziu melhores
peças ao final?
GoRuCo 2008
80. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
“A função da grande maioria dos trabalhos
artísticos é simplesmente lhe ensinar como
fazer a pequena fração de sua arte que
levanta vôo.
Uma das lições básicas e difíceis que todo
artista precisa aprender é que mesmo as
peças fracassadas são essenciais.”
—Art & Fear—Bayles & Orland
GoRuCo 2008
81. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Auto-melhoria:
Pressione, mais!
• Seja competitivo. Competição é prática.
• Desafie o Status Quo.
• Eles estão quase sempre errados.
• (Mesmo quando estão certos)
GoRuCo 2008
82. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Não seja uma ovelha!
GoRuCo 2008
83. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Auto-melhoria:
Sinta!
• Deixe as opiniões fluírem. Tenha opinião!
• Mas não as deixe mandar em você.
• zentest, flog, & heckledesenvolvimento. amor por
todos vieram do
boas ferramentas de
• vlad & image_science vieram do ódio de código
impossivelmente complexo.
• Eu gastei 10 hrs debugando UM problema de
capistrano antes de escrever vlad.
GoRuCo 2008
84. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Auto-melhoria:
Feedback
• Use feedback:
• Peça por ele.
• Ouça ele.
• Retroalimente o feedback.
GoRuCo 2008
85. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Auto-melhoria:
Feedback
• Use feedback:
• Peça por ele.
• Ouça ele.
• Retroalimente o feedback.
GoRuCo 2008
86. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Encontre seu balanço
GoRuCo 2008
87. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Ferramentas
que podem
ajudar
GoRuCo 2008
88. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
autotest
• Você provavelmente não tinha percebido que usar
autotest é uma forma de sadismo e ascetismo
ruby, não é?
• Pobre cara do Doom ...
GoRuCo 2008
89. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
autotest
• Você provavelmente não tinha percebido que usar
autotest é uma forma de sadismo e ascetismo
ruby, não é?
• Pobre cara do Doom ...
GoRuCo 2008
90. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Flog
class Test
• Relator de complexidade
def blah # 11.2 =
a = eval quot;1+1quot; # 1.2 + 6.0 +
if a == 2 then # 1.2 + 1.2 + 0.4 +
baseado em métricas ABC. puts quot;yayquot; # 1.2
end
• Nota Flog é correlato com
end
end
complexidade de teste. Test#blah: (11.2)
6.0: eval
• Quanto maior a nota flog,
1.2: branch
1.2: ==
1.2: puts
mais difícil de ter um teste 1.2: assignment
completo (& bom).
0.4: lit_fixnum
GoRuCo 2008
91. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Complexidade Desnecessária 1
if MODELS.keys.inject(true) {|b, klass| b and
klass.constantize.columns.map(&:name).include? association.options[:foreign_key]} then
# ...
end
main#none: (22.9)
1 linha if(!) 7.0: to_proc_normal
3.3: assignment
3.1: branch
132 caracteres 2.0: inject
1.8: constantize
1.8: association
132
méd carac 1.6: columns
1.6: options
1.4: []
22.9 flog 1.4: block_pass
1.4: map
1.2: include?
1.2: keys
GoRuCo 2008
92. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Complexidade Desnecessária 2
fk = association.options[:foreign_key]
if MODELS.keys.inject(true) {|b, klass| b and
klass.constantize.columns.map(&:name).include? fk} then
# ...
end
main#none: (23.5)
3 linhas 7.5: to_proc_normal
4.7: assignment
3.4: branch
144 caracteres 2.2: inject
1.9: constantize
1.7: columns
48
méd carac. 1.5: block_pass
1.5: map
1.5: association
23.5 flog 1.3: include?
1.3: keys
1.3: options
1.1: []
GoRuCo 2008
93. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Complexidade Desnecessária 3
fk = association.options[:foreign_key]
columns = MODELS.keys.map { |key| key.constantize.columns.map(&:name) }
if columns.inject(true) {|b, column| b and column.include? fk} then
# ...
end
main#none: (22.8)
4 linhas 7.0: assignment
6.0: to_proc_normal
4.5: branch
182 caracteres 2.3: map
2.2: inject
1.6: constantize
45
méd caract 1.5: association
1.4: columns
1.3: include?
23.5 flog 1.3: options
1.3: keys
1.2: block_pass
1.1: []
GoRuCo 2008
94. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Complexidade Desnecessária 4
fk = association.options[:foreign_key]
columns = MODELS.keys.map { |key| key.constantize.columns.map(&:name) }
if columns.all? {|column| column.include? fk} then
# ...
end
main#none: (20.8)
4 linhas 6.0: to_proc_normal
4.6: assignment
3.3: branch
165 caracteres 2.3: map
1.6: constantize
1.5: association
41
méd carac 1.4: columns
1.3: keys
1.3: options
20.8 flog 1.2: block_pass
1.2: include?
1.1: []
1.1: all?
GoRuCo 2008
95. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Complexidade Desnecessária 5
fk = association.options[:foreign_key]
columns = MODELS.keys.map { |key| key.constantize.columns.map { |c| c.name } }
if columns.all? {|column| column.include? fk} then
# ...
end
main#none: (15.9)
4 linhas 5.9: assignment
4.5: branch
2.3: map
172 caracteres 1.6: constantize
1.5: association
1.4: columns
43
méd carac 1.3: name
1.3: options
1.3: keys
15.9 flog 1.2: include?
1.1: []
1.1: all?
GoRuCo 2008
96. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Complexidade Desnecessária 5
fk = association.options[:foreign_key]
columns = MODELS.keys.map { |key| key.constantize.columns.map { |c| c.name } }
if columns.all? {|column| column.include? fk} then
# ...
end
main#none: (15.9)
4 linhas 5.9: assignment
4.5: branch
2.3: map
172 caracteres 1.6: constantize
1.5: association
1.4: columns
43
méd carac 1.3: name
1.3: options
1.3: keys
15.9 flog 1.2: include?
1.1: []
1.1: all?
Muito mais limpo, claro e rápido
GoRuCo 2008
97. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Ferramentas de
Cobertura
São excelentes para mostrar buracos.
GoRuCo 2008
99. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
De jeito nenhum
significam qualidade
dos testes.
GoRuCo 2008
100. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
quot;Temos 100% de
coberturaquot;
GoRuCo 2008
101. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
… E daí?!?
GoRuCo 2008
102. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Você pode ter 100%
de cobertura com 0
asserções.
GoRuCo 2008
103. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
(ou, mais freqüente:
más asserções)
GoRuCo 2008
104. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Exemplo absurdo
class Vida
VIVA!
def significado
42 100% de
end
cobertura!
end
class TestVida < Test::Unit::TestCase
def test_significado
real = Vida.new.significado
esperado = 6 * 9
assert_equal esperado, real
end
end
GoRuCo 2008
105. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
O que 100% de
cobertura significa
então?
GoRuCo 2008
106. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Cobertura é o Raio-X
do mundo do código.
GoRuCo 2008
107. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Raios-X são ótimas
ferramentas, mas não a
use quando você está
sangrando.
GoRuCo 2008
108. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Heckle
• Ferramenta mais sádica que escrevi.
• Muda sua implementação (em
tempo real) para verificar se seus
testes são bons.
• Se seus testes passam depois
disso, você está perdendo casos.
GoRuCo 2008
109. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Para Repetir
GoRuCo 2008
110. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Divirta-se machucando
código ruim e você terá
menos deles com o
tempo.
GoRuCo 2008
111. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Pratique severa auto-
disciplina & abstenção.
GoRuCo 2008
112. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Evite complexidade.
GoRuCo 2008
113. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Pratique
Desenvolvimento
Orientado à
Introspecção.
GoRuCo 2008
114. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Conheça-te.
Melhora-te.
GoRuCo 2008
115. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Use todas as
ferramentas que puder.
GoRuCo 2008
116. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Mas use a ferramenta
certa para o trabalho.
GoRuCo 2008
117. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Tenha uma opinião
&
Sinta seu código
GoRuCo 2008
118. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Para Fechar
GoRuCo 2008
119. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Frank Herbert estava
errado
GoRuCo 2008
120. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Medo não é o
assassino da mente
GoRuCo 2008
121. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Apatia é o assassino
da mente
GoRuCo 2008
122. Machucando Código por Diversão e Lucro Ryan Davis, Seattle.rb
Você precisa se
importar pelo código
GoRuCo 2008