Mostrando postagens com marcador Linguagens. Mostrar todas as postagens
Mostrando postagens com marcador Linguagens. Mostrar todas as postagens

quarta-feira, 14 de janeiro de 2009

Ruby on Rails




Ruby on Rails é um meta-framework gratuito que promete aumentar velocidade e facilidade no desenvolvimento de sites orientados a banco de dados (database-driven web sites), uma vez que é possível criar aplicações com base em estruturas pré-definidas. Frequentemente referenciado como Rails ou RoR, o Ruby on Rails é um projeto de código aberto escrito na linguagem de programação Ruby. As aplicações criadas utilizando o framework Rails são desenvolvidas com base no padrão de projeto MVC (Model-View-Controller).

História
Ruby on Rails foi uma extração de David Heinemeier Hansson de um projeto seu, o gerenciador de projetos Basecamp. Foi lançado a público pela primeira vez em julho de 2004.

Componentes
O Rails é um "meta-framework", uma vez que é uma junção de cinco frameworks:

Active Record
O Active Record é uma camada de mapeamento objeto-relacional (object-relational mapping layer), responsável pela interoperabilidade entre a aplicação e o banco de dados e pela abstração dos dados.

Action Pack
Compreende o Action View (geração de visualização de usuário, como HTML, XML, JavaScript, entre outros) e o Action Controller (controle de fluxo de negócio).

Action Mailer
O Action Mailer é um framework responsável pelo serviço de entrega e até mesmo de recebimento de e-mails. É relativamente pequeno e simples, porém poderoso e capaz de realizar diversas operações apenas com chamadas de entrega de correspondência.

Active Support
Active Support é uma coleção de várias classes úteis e extensões de bibliotecas padrões, que foram considerados úteis para aplicações em Ruby on Rails.

Action WebServices
Provê uma maneira de publicar APIs interoperaveis com o Rails, sem a necessidade de perder tempo dentro de especificações de protocolo. Implementa WSDL e SOAP.
O Action Web Service não estará mais presente na versão 2.0 no Rails, visto que o mesmo está voltando-se para a utilização do modelo REST. Mesmo assim, aos ainda interessados em utilizá-lo, será possível fazê-lo através da instalação de um plugin.

Tempo de desenvolvimento
Ruby on Rails segue dois conceitos que visam aumentar a produtividade do desenvolvedor: DRY e Convention over Configuration. Estes métodos estão implementados por todo o Rails, mas podem ser mais notados nos "pacotes" do Active Record (ORM, Object Relational Mapper) e Action Pack (MVC)

DRY
DRY (Don't Repeat Yourself, Não se repita) é o conceito por trás da técnica de definir nomes, propriedades e códigos em somente um lugar e reaproveitar essas informações em outros.
Por exemplo, ao invés de ter uma tabela Pessoas e uma classe Pessoa, com uma propriedade, um método "acessador" (getter) e um "mudador" (setter) para cada campo na tabela, tem-se apenas no banco de dados. As propriedades e métodos necessários são "injetados" na classe através de funcionalidades da linguagem Ruby.
Com isso, economiza-se tempo, já que não é necessário alterar a tabela, o "bean", o "form bean", o "local home", o "home", o "session", ... Alterando apenas no banco de dados, tudo o que se baseia nessas informações é atualizado automaticamente.

Convention over configuration
Na maioria dos casos, usamos convenções no dia-a-dia da programação, em geral para facilitar o entendimento e manutenção por parte de outros desenvolvedores. Sabendo disso, e sabendo que o tempo gasto para configurar XML em alguns frameworks de outras linguagens é extremamente alto, decidiu-se adotar esse conceito.
Ele diz basicamente que deve-se assumir valores padrão onde existe uma convenção. Caso o desenvolvedor deseje, pode-se sobrescrever essa convenção com o valor necessário. Por exemplo, uma classe User pode ter seus dados armazenados na tabela Customer. Seguindo a convenção, seria na tabela Users. Com isso, o tempo de desenvolvimento cai ainda mais.

Escalabilidade
A maioria dos sites não necessita de esquemas sofisticados de escalabilidade, bastando alguns aceleradores. Em sites menores ou normais, uma configuração padrão do servidor web consegue suportar uma boa quantidade de carga, principalmente se forem usados o FastCGI, LightTPD ou Mongrel, que são necessários para obter uma velocidade aceitável de abertura da página. Comparando uma aplicação com FastCGI e sem FastCGI (rodando Ruby direto como CGI), a diferença é perceptível em qualquer aplicação. O processamento do código (sem contar o tempo de download) em CGI ocorre em no mínimo 10 segundos mesmo em servidores Quad Core, enquanto que em FastCGI o desempenho é notável: em no máximo 1 segundo a página é processada, tal qual linguagens web como PHP.
Existem casos de sites feitos em Rails que suportaram 5 milhões de visitas em um mês, ou seja, aproximadamente 115 por minuto, uma performance considerada bastante suficiente para 90% das aplicações atuais. Nestes sites, uma questão frequente é sobre a escalabilidade de aplicações escritas em Rails. Ao contrário de outras tecnologias, você não precisa fazer um código específico para que o sistema esteja preparado para "escalar". Quando necessário pode-se adotar uma das táticas disponíveis para escalabilidade em Rails. Vale notar que o único problema da escalabilidade é a manutenção de sessões entre servidores. Portanto, a saída mais óbvia é guardar estas sessões em volumes NFS, acessíveis por todos os servidores de aplicação. Outra tática é usar o armazenamento de sessões diretamente no banco de dados. Uma terceira, seria salvar a sessão em um cookie na máquina do usuário. Como pode-se ver, uma aplicação Rails já nasce com todo o suporte necessário para crescer sem traumas.

quarta-feira, 5 de novembro de 2008



Uma pergunta bastante relevante que surge na cabeça de quase todos os programadores certa hora da vida é: por que existem tantas linguagens de programação? Outra bastante comum é: qual delas é melhor? Alguém poderia responder: existem tantas porque uma vem para corrigir as falhas das outras, e a melhor é a que tem menos falhas. Certo? Errado.
Na Wikipédia, há uma
lista com mais de uma centena de linguagens de programação. Será que todas elas surgiram para sanar problemas umas das outras? Se olharmos o histórico de surgimento de cada linguagem de programação, veremos que a maioria surgiu para sanar uma necessidade diferente numa determinada área. Isso já nos dá uma pista de qual delas é melhor.
Vamos começar analisando um exemplo famoso: Java. Java nasceu para substituir C e C++? Não. Java nasceu por causa da Orientação a Objetos? Não mesmo! Por que, então, Java nasceu? Nasceu pela necessidade de uma linguagem portável (cujos programas rodassem em plataformas diferentes sem necessidade de alterações). Mas já não existiam linguagens assim? Sim, existiam, mas não com esse enfoque. LISP, Smalltalk e Perl, por exemplo, são linguagens portáveis, assim como Java. Mas LISP, por exemplo, tem um paradigma de programação totalmente diferente. Smalltalk e Perl, um escopo diferente. Smalltalk, por exemplo, nasceu com o objetivo de tornar a programação mais intuitiva. Perl nasceu com o objetivo de ser uma linguagem poderosa e prática.
Há linguagens que surgiram de uma necessidade ainda mais específica. Simula, por exemplo, nasceu pela necessidade de realizar simulações de eventos discretos. MUMPS, pela necessidade de desenvolver aplicações baseadas em bancos de dados para um hospital.
Entretanto, nem todas as linguagens resolvem um problema novo. Há, sim, linguagens que vêm para competir com outras. C#, por exemplo, veio para competir com Java, uma competição que influenciou bastante esta última. Há, também, linguagens que surgem para simples diversão de geeks, como nós. Whitespace, por exemplo, não tem nada de inovador, apenas a forma de programar: o código-fonte é escrito usando-se tabs e espaços.
Dado que cada linguagem tem seus pontos fortes e fracos, não podemos dizer que uma certa linguagem é a melhor. Podemos sim, dizer, que uma linguagem é a melhor para determinado problema numa determinada situação. E, para dizer isso, precisamos avaliar o problema, o que a linguagem oferece para resolvê-lo e o que o programador sabe sobre ela. Fatores importantes na linguagem são o suporte nativo às ferramentas e paradigmas que serão utilizados e bibliotecas e extensões disponíveis.
Às vezes não vale a pena para o programador aprender uma linguagem na qual ele resolveria um problema mais facilmente; o tempo que ele levaria para aprender a nova linguagem (ou ferramenta) é maior do que o tempo que ele vai levar para resolver o problema na linguagem com a qual ele é mais familiar. Note que esse não deve ser um fator tão importante na escolha. Às vezes é melhor que o problema demore mais para ser resolvido para que depois alterações na solução possam ser incorporadas mais facilmente.
Não podemos dizer que existe a melhor e a pior linguagem, mas podemos dizer que existem linguagens boas e ruins. A linguagem ruim é aquela que não ajuda o programador a utilizar seus recursos corretamente, por exemplo: ser uma linguagem poderosa para orientação a objetos mas, ao mesmo tempo, não oferecer suporte fácil para pacotes.
É sempre bom tomar contato com diversas linguagens para saber qual usar em cada situação. Para começar, sugiro que se escolham linguagens sem uma relação forte (uma inspirada na outra). Uma boa lista de linguagens para estudar, na minha opinião:
Smalltalk
Prolog
Scheme
C
Self
Erlang
Assembly (para os mais corajosos)
Propositalmente, são linguagens não muito recentes, especialmente Assembly, C, Prolog e Scheme. As linguagens mais recentes, baseadas nessas, têm muitos recursos avançados. É bom começar pelo básico e, depois de capturar a forma de pensar em cada linguagem, partir para recursos mais avançados.
Especialmente para estudar Assembly (ou, pelo menos, os conceitos dela), sugiro usar uma máquina virtual como o
Hipo.