Scalando (2)

Então, apesar de jurar para mim que eu não tinha tempo para mais nada (e apesar de achar [ter sido convencido] que o tempo que eu tinha deveria ser dedicado a alguma atividade física), resolvi me inscrever no curso Functional Programming Principles in Scala do Coursera (e apesar de ter dito que não sou tão fã do design dessa linguagem, e apesar de ter esbarrado em bugs do compilador nos primeiros minutos de uso, e apesar de não ver para que eu usaria o conhecimento do curso, nem saber o quanto vou aprender de verdade e o quanto vai ser só revisão). Depois de sair no news.ycombinator.com a notícia de que o curso estava começando, serviu como um sinal, haha.

Está ainda na primeira semana e a data limite dos primeiros exercícios está longe, então se algum (raro) leitor deste blog estiver a fim, dá tempo. Por enquanto os exercícios estão bem tranqüilos, dá pra fazer até sem assistir às aulas pra quem sabe essas coisas de fatorial ou fibonacci recursivos (nenhum desses é o exercício de verdade). Não chega a ser possível fazer “sem pensar”, mas a dificuldade está OK. É como voltar ao início da faculdade, mas com “macete” (↑↓←→ A+Start) de já ter terminado uma antes, hahaha.

Anúncios

Scalando

Resolvi dar mais uma chance à linguagem Scala, já que me disseram que se eu gosto de F# eu poderia muito bem gostar de Scala também. Da última vez eu tinha deixado ela de lado porque me pareceu que tinha muitas coisas implícitas (e como o import this do Python diz, “Explicit is better than implicit”), mas talvez eu tenha julgado mal né? Além do mais, eu tentei usar Scala como  um REPL pra Java, mas isso era pedir demais (tinha que lembrar que int era Int, que <T> era [T], e mais um monte de coisas)! Pra esse caso é melhor o Groovy, e usar Scala só como Scala mesmo!

Baixei a última versão, 2.10.1 e fui testar a sintaxe e os tipos básicos no REPL, enquanto também lia algumas coisas mais avançadas (que talvez eu teste mais adiante). E nisso, brincando com coisas básicas, BAM! Crash no compilador. Não, não foi só erro de compilação, foi erro interno do compilador mesmo.

Poxa, eu só queria saber se aceitava {} na condição do while, assim como é permitido no for…

Eis o código:

while {i < 10} { i += 1 }

(Ah, sim! Scala obviamente tem aquele engasgo característico da JVM… Você dá Enter, conta de 0 a ¼ e só aí o negócio executa — deve ser isso que me dá a impressão que Java é mais lento que Python, embora na categoria “mastigação de dados” o Java na verdade seja bem mais rápido)

YAGNI

YAGNI, You Aren’t Gonna Need It (você não vai precisar disso) é um excelente princípio de programação que eu sempre segui por intuição e obviedade, mas é necessário que mais gente aprenda…

A idéia é muito simples: não fazer mais do que o necessário. Muitas pessoas saem criando mais linhas de código, mais classes, mais camadas e mais abstrações prevendo alguma necessidade futura que nunca chega. Ou pior, quando essa necessidade chega, percebe-se que as estruturas de código geradas não são exatamente o necessário e o código precisa ser modificado de qualquer maneira… A idéia que, modificando apenas uma linha seria possível ativar ou conectar a nova funcionalidade não se concretiza.

E o pior é a manutenção. Enquanto o código está, teoricamente, “totalmente preparado para a modificação futura (que nunca será necessária)”, surgem outras necessidades, completamente diferentes do previsto, que para serem implementadas precisam se encaixar na estruturação demasiadamente complexa que foi construída.

A programação não-YAGNI pode acontecer em diversos níveis, como em grande escala na arquitetura geral (excesso de classes, abstrações, camadas) quanto em pequena escala (dentro ou entre funções). Já tive que mexer num código que diligentemente copiava todos os seus parâmetros para variáveis locais temporárias, e apenas alguns poucos precisavam de uma transformação (remover pontuação, espaços, etc.). As outras atribuições eram inúteis e só poluíam o código, deixando-o mais difícil de ler e entender.

Por favor, não façam isso. Nem criem coisas do tipo AbstractContextBuilderFactories. Usem o YAGNI. Criem apenas abstrações que facilitam a manutenção, não que complicam.

Ficão com direito á jubilação…

Você se irrita quando lê algo que alguém escreveu sem sequer saber a diferença entre as terminações -am e -ão, nem a diferença entre à (que é uma crase) e á (que não existe)? Pois é, eu também me irritava.

Na verdade, agora acho que nesses casos essas pessoas estudaram muito, a ponto de conhecerem a ortografia do século 19.

http://www6.senado.gov.br/legislacao/ListaTextoIntegral.action?id=56890&norma=72742

Agora vou admirar muito mais essas pessoas. Na verdade, não.