Entendo que você tem total razão, e eu concordo plenamente, que se formos adotar uma linguagem dinâmica, tem que ser de corpo e alma. Programar Ruby como C# seria uma grande perda de tempo. E o mesmo fale para qualquer outra linguagem: temos que abraçar o que ela tem de melhor. Você pode, por exemplo, programar F# com se fosse C#, com mutabilidade e foreachs em tudo quanto é canto, mas isso não faria sentido.
Entendeo esse negócio de ter que escolher conteiner de DI, ORM, etc, etc ser uma dor. Para mim isso é algo absolutamente natural, e leva pouco tempo para montar, já sai naturalmente quando estou programando, eu sequer me preocupo. Coloco quando preciso. Não dói, entende? Então o foco é o negócio. Quando esses detalhes estão prontos, você já pode sair codificando. Se formos falar de mais opinião, talvez poderíamos usar o S#arp, que já tras bem mais coisa.
Entendo o benefício de todo mundo estar olhando, é real. Ao mesmo tempo, cada aplicação é diferente, conseguimos encaixá-las todas no mesmo conceito? Toda aplicação que eu faço, em cada cliente, sempre tem pontos muito diferentes. Por exemplo, o DHH fala de usar CRUD pra tudo. Na boa, não é tudo que é CRUD... e eu não quero que seja difícil não ser CRUD. Não deve doer. Legal, REST é bonito, mas e daí? Preciso me prender ao padrão em todas as minhas apps?
Ao mesmo todo, entendo que a grande maioria das empresas não tem a menor idéia de como aplicar IoC, usar um ORM, etc. E quando sabe o que é, muitas vezes faz errado, então nesse sentido, o Rails ajuda a guiar quem está começando.
A questão de performance X expressividade e flexibilidade é diferente pra mim. Com a devida arquitetura, você tem código muito expressivo com C#. Lambdas ajudam muito nisso, mas não só elas. Há diversas técnicas. Demora para saber escrever uma app fácil de ler, expressiva. Mas alcançar senioridade em qualquer coisa demanda esforço.
Flexibilidade também. Ferramentas como Resharper me permitem codificar muito em pouquíssimo tempo e com grande flexibilidade. Minha produtividade é muito alta, e não custa quase nada. Não faço 300 interfaces, só faço interfaces se preciso substituir o objeto em algum lugar (muitas vezes por causa de testes). E essas interfaces, com frequência, vêm trabalhadas com generics, o que me permite fazer 1 interface genérica, e outras que só crescem sobre ela, mais específicas. E para fazer os testes unitários posso usar Ruby, que é um dos contextos onde ele brilha. Daí nem preciso de interfaces. E então tenho a performance de uma linguagem estática em todo lugar.
O que você disse de bons rubistas escreverem testes para testar o negócio, não o tipo, é válido. A questão é: quando você refatora o teste quebra. E cada vez quebra em um lugar diferente. Imagino que você leva muito mais tempo para arrumar as coisas quando quebra uma entidade em várias, por exemplo, ou muda o nome ou parâmetros de vários métodos. Com C#, você fica sabendo na hora, porque tem o compilador em background, verificando cada toque no teclado. Não preciso rodar os testes pra isso. Meus testes servem para verificar erros de lógica, de negócio. Entendo que essa é uma preocupação a mais em linguagens dinâmicas.
Linguagens de programação ficam no meio do caminho entre o homem e a máquina. Não sei se quero que a máquina decida tanto assim por mim em todo lugar. Mas também não posso falar tanto, preciso me aprofundar em Ruby, e farei isso em breve. Daí aviso vocês do que achei. De qualquer forma entendo que quanto mais as linguagens olham para a máquina com mais abstração, mais elas possibilitam. Foi o que o C fez com o Assembler, o que o C++ fez com o C, e o que o C# fez com o C++. As questões são: quando é demais? Quando é apropriado?
Quanto ao IronRuby, sim, vai sair esses dias a versão que vai compilar quase tudo e passar quase todos os testes da RubySpec (v0.9). O anúncio na OSCON seria feito hoje. Mas ele é sim feito pela nave mãe. Quem paga os desenvolvedores chave, responsáveis pelo projeto, é a Microsoft. No entanto, a Microsoft aceita contribuições no projeto, desde que você assine um termo liberando o copyright, ou seja, é mesmo OSS.
2009/7/23 Juan Bernabó <juan.b...@gmail.com>:
> Sou um cara que historicamente fui strong typed tendo trabalhado
> ruby e rails.
Não sei se eu entendi corretamente a sentença mas, de qualquer forma,
é bom lembrar que Ruby possui tipagem forte. Tipagem forte/fraca não
possui relação com tipagem dinamica/estática.
> Uma coisa interesante que caiu minha ficha é que c++, Java e c# não
> são linguagens orientadas a objetos e sim a classes.
>
> Num projeto que estaba trabalhando precisei usar uma quantide
> gigantesca de patterns e aspect programming que depois estudando ruby
> simplesmente é desnecesario já que posso modificar não uma classe mais
> um objeto e posso interceptar mensagens (métodos) usando a própria
> linguagem, nada raro como geração de código e coisas assim.
Isso não é exatamente verdade. Quando você adiciona um método "a um
objeto" ao invés de "a uma classe" em Ruby você está adicionando (ou
removendo, ou alterando...) métodos à eigenclass -que é um termo bem
obscuro para se referir à uma classe que é criada exclusivamente para
aquele objeto. Em termos de linguagens todas as citadas se comportam
de maneira parecida com relação à classes e objetos, a diferença em
Ruby é que:
1 - Classes podem ser modificadas em runtime
2 - Cada instância possui sua propria e exclusiva classe, derivada da
classe original
> Quando entendi isso vi que a maioria de design patterns são para
> conseguir resolver um problema criado pela orientação a classes das
> linguagens e a ser ripados fortemente.
Sim e não. Os Design Patterns da GoF, por exemplo, surgiram na
comunidade Smalltalk, que é uma linguagem Orientada a Objetos tipada
dinamicamente e com Open Classes, exatamente como Ruby. Toda linguagem
utiliza algums padrões e faz outros desnecessários. E isto não tem
nada a ver com tipagem.
Eu creio que praticamente nenhuma das vantagens atribuídas a C# ou
Ruby nesta ou em qualquer outra discussão que tenha lido tem a ver com
tipagem. Estão apenas comparando funcionalidades das linguagens.
Tipagem dinamica ou estatica apenas diz quando seu programa vai fazer
verificação de tipos, se na compilação ou em runtime. Por si só nem
uma nem outra forma possui muitas vantagens, tudo vai depender das
funcionalidades da sua linguagem e, principalmente, do que é um tipo
nela.
[]s
--
Phillip Calçado
http://fragmental.tw
http://www.fragmental.com.br
2009/7/24 Giovanni Bassi <gig...@giggio.net>:
> Acho que você está se pegando nos detalhes e deixou a discussão anterior
> passar batida. "Strong Typing" é um termo amplo. Amplo demais, talvez.
> Alguns entendem o termo exatamente como o Juan o colocou, ou seja, como
> static typing, referente ao momento em que a checagem do tipo é feita,
> compilação (static) ou execução (dynamic). Outros entendem como você o
> colocou, o que, diante das muitas conotações para o termo, não ficou
> exatamente claro (type safety, fixed-typing, etc).
Eu nao acho que me apeguei ao detahe, me apeguei a definicao formal
dos conceitos. Uma das coisas que Patterns e Domain-Driven Design nos
ensinam eh que eh muito importante ter uma linguagem comum bem
esclarecida. Tipagem e um tema comum em ciencia da computacao ha
muitas decadas, existem algumas partes mais confusas mas os termos
citados sao bem definidos, nao ha porque cada um criar sua propria
interpretacao.
E, pior ainda, existe uma vasta gama de material retratando como
tipagem fraca e um problema. Eu ja vivi muitos momentos onde alguem
associa estes problemas a Ruby ou Python porque acredita erradamente
que estes possuem tipagem fraca. E bom deixar as coisas claras porque
elas significam coisas completamente diferentes.
Como efeito de comparacao seria como se alguem rejeitasse C# porque
ouviu dizer que e procedural e nao orientada a objetos porque o que eu
chamo de OO nao eh o que voce chama de OO.
> Quanto à comparação de C# e Ruby não ter a ver com tipagem, é algo que
> discordo. O Rafael colocou a ideía de recursos de metaprogramação, que não
> são possíveis em C#, mas são em Ruby, devido ao dynamic typing. A criação de
> DSLs segue na mesma linha. Da mesma forma, os recursos de static typing
> permitem a existência dos erros do compilador do C#, mas isso não é possível
> no Ruby.
Nao sao possiveis em C# porque C# nao possui as capacidades que os
tornam possiveis, e isso nao tem nada a ver com tipagem. Se voce olhar
como Scala e Haskell, duas linguagem estaticamente tipadas e muito
mais rigorosas que C# quanto a isso, implementam DSLs e
metaprogramacao voce vai entender o que eu estou dizendo.
Nao eh porque voce faz verificacao de tipos durante a compilacao que
voce nao tem metaprogramacao ou DSLs. Voce tem um gostinho disso em C#
com LINQ e extension methods.
Este e um problema de entendimento bem comum. Minha recomendacao e a
leitura do material de Luca Cardelli que eh o papa do assunto e
escreve de maneira bem acessivel. Em algumas semans eu vou fazer uma
apresentacao sobre exatamente este tema e assim que os slides
estiverem online eu dou um UP aqui.
2009/7/24 Giovanni Bassi <gig...@giggio.net>:
> A questão não é essa. A questão é que a discussão do tópico é outra, e por
> isso você pegou um detalhe da discussão e mudou o assunto dela.
> Independentemente se isso está nos livros ou não, ela é um detalhe no
> contexto desta discussão.
Discordo completamente. Mais de tres vezes nesta thread foi citado que
A ou B que Ruby faz e C# nao (ou o contrario) e por causa do sistema
de tipos. Fora que o email do Juan, que foi o unico que respondi pelo
que sei, eh quase que exclusivamente sobre este tema (e sobre classes
x objetos, que tambem respondi).
> Mas concordo que temos que dar os nomes corretos às coisas. Eu mesmo já
> disse isso no grupo. Só que strong typing é algo que possui significados
> diferentes dependendo com quem você fala. Livros são só mais uma fonte.
Se livros, com provas matematicas, sao "apenas mais uma fonte" para
voce tudo bem, para mim eles sao trabalho cientifico e eu gosto de
basear meu trabalho em ciencia e nao em apenas opinioes.
> Eu não disse que DSLs não são possíveis em C# (eu mesmo já fiz as minhas).
> Só são mais difíceis. Gostaria de ver como Scala implementa metaprogramação,
> você teria um exemplo concreto (com código)?
Uma busca no Google traz muitos resultados:
http://www.google.com/search?q=scala+metaprogramming
> Sou da opinião de que se algo é difícil demais, na prática não existe, senão
> por uns poucos malucos que se aventuram. DSLs com linguagens de tipagem
> estática é algo mais complexo de ser feito do que com tipagem dinâmica.
> Metaprogramação parece ser outro caso onde as linguagens dinâmicas se saem
> melhor. Você não acha que esse padrão existe? Voltando à questão colocada
> pelo Rafael e pelo Juan, será que essa não é a raíz da questão?
O que falei no meu email anterior e vou repetir aqui eh que isto nao
esta ligado a tipagem e sim as funcionalidades da linguagem. O fato de
que C#, Java, C++ e etc. se baseiam em C enquanto Ruby j'a foi
conhecida como "Matz's little Lisp" diz muito sobre o quao isto esta
relacionado com a heranca da linguagem e nao exatamente com tipagem.
Se um sistema não se encaixa no sweetspot do Rails (aplicação web com banco de dados) então é melhor não utilizá-lo, assim como não é uma boa idéia tentar usar MVC em aplicações desktop. A questão é Pareto: 80% dos casos usam a mesma estrutura, e o Rails é focado nesses casos. Para os outros 20% você pode usar Sinatra, Merb, Camping, etc, ou fazer o seu.