High Performance Browser Networking

Acabei de terminar a leitura do High Performance Browser Networking, uma ótima introdução ao tópico de como o browser lida com a infra-estrutura de rede.

Eu já tinha alguma noção de como a(s) rede(s) pode(m) impactar aplicações rodando em PCs, mas nunca tinha pegado pra ler material que discutisse isto sob o ponto de vista de aplicações mobile, principalmente de apps que rodam quando o celular está conectado a redes 3G, 4G, etc.

Dado que o acesso à internet se dá cada vez mais por redes wireless (Wi-Fi, 3G, etc), o tipo de informação contida no livro é fundamental para o projeto de sistemas que pretendam oferecer um mínimo de usabilidade a seus usuários.

O livro pode ser lido gratuitamente online em https://hpbn.co/, mas se prefere um livro um livro impresso, pode encontrá-lo na Amazon e outras lojas online.

 

Let it flow

A nice Sunday morning read:

http://code.flickr.net/2015/09/01/the-data-freshener/

But it amazes me that, as an industry, we’re still dealing with these kinds of problems (synchronizing data between different layers) after all these years.

I remember first coming across this issue back in 2003/2004 when developing a Windows Forms + ADO.NET front-end connecting do a SQL Server Back-end.

Sure, the technology stack is completely different and Flickr’s scale is way way bigger, but the problems are fundamentally the same.

One would have guessed that after all these years, we would have learned a couple of lessons from the database replication/synchronization field, applied them to the problem at hand and stopped reinventing the wheel.

Maybe we could all learn something from fluid dynamics.

Data should flow between the different layers the same way a shot of vodka flows when poured into a glass of cashew juice. Hic!

Aprendendo JavaScript – da perspectiva de um desenvolvedor .Net

Eu venho futucando com JavaScript pelo menos desde 1998 ou 1999. Talvez um pouquinho antes.
Mas a grande verdade é que eu nunca peguei pra aprender a linguagem – e uma plataforma correspondente – com o mesmo empenho e na mesma profundidade que dediquei a outras como, por exemplo, Clipper ’87 e 5; Microsoft Access (Access Basic e depois VBA); Visual Basic e por fim C# e VB.NET.

Sempre que precisei fazer alguma coisa que fosse executado num browser, eu partia de uma base fundamental de conhecimento (boa parte da qual aplicável a outras linguagens) e aprendia o resto sob demanda, muitas vezes na base da tentativa e erro, mexendo aqui e ali até conseguir fazer a coisa funcionar – ou desistir.
Muitas vezes, uma parte do conhecimento adquirido na execução da tarefa acabava se perdendo já que no dia-a-dia, o meu foco estava focado em aplicações front-end nativas (que rodam fora do browser) e sistemas back-end usando outra technology stack.

Bom… Há pouco mais de uma semana eu fiz umas fotos lá no Bom Retiro e vi no material uma boa oportunidade de brincar com uma idéia que que venho querendo implementar já há algum tempo.

A idéia era distribuir num mapa marcadores apontando para os locais onde cada foto foi feita. Clicando ou tocando no marcador, abre-se um painel flutuante com a foto correspondente.

Se a resolução do dispositivo que você está usando for baixa, talvez você prefira ver o mapa rodando em tela cheia fora do blog. Neste caso, siga este link, mas não se esqueça de voltar pra cá!

Durante a prototipação eu encontrei as dificuldades costumeiras para quem detém somente um conhecimento básico de uma das ferramentas que está usando – nesse caso JavaScript – e nenhum conhecimento do restante do ferramental: JSON, JSONP, jQuery (que acabei não usando) e as APIs do Flickr e do Google Maps.

Mas o que me deixou particularmente frustrado foi uma hora em que eu estava tentando fazer o painel flutuante funcionar. Na pressa e não tendo lido a documentação com a atenção necessária – especialmente o trecho

The content of the InfoWindow may contain a string of text, a snippet of HTML, or a DOM element. To set the content, either specify it within the InfoWindowOptions or call setContent() on the InfoWindow explicitly.

, eu passei o olho no trecho abaixo
e traduzí isso usando o meu conhecimento de C# e VB.NET como sendo um construtor com um parâmetro nomeado – parâmetro este que seria atribuído à propriedade content do InfoWindow Como eu estava reaproveitando o InfoWindow pra exibir as diferentes fotos, era necessário alterar seu conteúdo cada vez em que o marcador fosse clicado e para isto, eu atribuía o conteúdo a infoWindow.content em outra parte do código. O problema é que infoWindow.content que na terminologia do JavaScript é uma propriedade está implementado no que seria equivalente no .Net a um campo (public instance field) e não uma propriedade (property) Num campo, o código externo referencia o campo diretamente, enquanto que numa propriedade o acesso se dá pelo que chamamos property accessors que nada mais são que rotinas que são executadas para obter ou atribuir um valor à propriedade. O detalhe é que a rotina pode fazer outras coisas além disto, como por exemplo, atualizar a UI com o valor recebido. Pois bem, InfoWindow.content não tem o código necessário para atualizar a UI. Depois de bater um pouco a cabeça eu acabei descobrindo que deveria usar InfoWindow.setContent() e então o problema foi resolvido. Depois deste episódio e levando em conta que muitas das coisas que estou querendo fazer envolvem JavaScript, resolvi tomar vergonha e estudar o assunto na profundidade que ele merece. Para tanto, comprei o JavaScript: The Definitive Guide.

O livro é um calhamaço com mais de 1000 páginas sendo que destas, umas 700 podem ser lidas sequencialmente. As outras 300 tem o formato referência “guia” de referência para a linguagem e os recursos client-side do JavaScript. Tendo lido um pouco mais que 250 páginas, posso dizer que estou gostando bastante. Os primeiros capítulos foram os mais interessantes, já que foram apresentadas uma série de particularidades e nuances da linguagem – que eu não conhecia – de uma forma que foi possível mapeá-las com facilidade ao meu conhecimento existente na plataforma .Net e suas linguagens. Em vários momentos, eu lembrei dos livros de especificação do C#, VB.NET e do CLR via C# – excelentes títulos para quem quer dominar os conceitos fundamentais de .Net que servem de base para tudo que vem acima: ASP.NET, WPF, WCF, etc… Uma das primeiras coisas que me surpreendeu – e que tomei nota:

Mas tem muito mais: Particularidades sobre escopo de variáveis em funções aninhadas (closures) ou durante a execução de eval(), “herança” via prototypes, sutilezas do strict mode, funcionamento dos objetos nativos do JavaScript, delete, loop for in e por aí vai…

O nível de detalhe com o que o autor trata cada assunto me agradou bastante. Pelo menos enquanto ele trata de tópicos sobre os quais eu tinha nenhum ou pouco conhecimento, mas ficou meio chato em alguns trechos onde o mapeamento do conhecimento de JavaScript para C# é mais direto ou quando ele cria polyfills e outras alternativas para implementar em ECMAScript 3 recursos nativos do ECMAScript 5.

Neste último caso, eu achei que o código apresentado nem sempre tem o mesmo nível de qualidade e atenção a detalhe que o texto que o acompanha. Lendo o texto, em mais de uma ocasião foi possível elaborar o código mais simples e/ou mais robusto que o apresentado no livro.

O primeiro exemplo que me vem à cabeça, são os exemplos de código onde ele define o prototype de um construtor. Vários dos exemplos iniciais criam objetos para prototype do zero descartando no processo, o prototype original – ao invés de construir em cima dele. Embora as duas formas tenham os seus usos e aplicações, me parece que é mais usual ir adicionando os novos membros (propriedades e funções) em cima do prototype existente.

Outro trecho cansativo é o capítulo onde ele tenta emular no JavaScript, caraterísticas de orientação a objetos nativas a linguagens como Java (e C# apesar dele não ter citado este último) como encapsulamento, abstração, etc.

Muita gente deve querer e pedir por este tipo de exemplos, mas a impressão que dá, é que se está tentando forçar a linguagem a ser uma coisa que ela não é. As soluções apresentadas podem apetecer a quem reza unicamente pela cartilha da orientação a objetos, mas me deixaram imaginando se não seria o caso desse pessoal abrir a mente e abraçar outras abordagens, como a programação funcional ou mesmo procedural – não no lugar da, mas em adição à orientação a objetos.

Com ou apesar destas ressalvas, da parte que li até agora, numa escala de 1 a 5 eu daria nota 4 para o livro.

Agora deixa eu voltar pro livro porque eu estou doido pra descobrir quem matou o objeto que apareceu lá no Garbage Collector 😉

Growing software keeping things simple

Back in year 2000 I was running my own software development company and had a small kind of ERP system targeted at small companies.

Reading about all the advantages of interfaces such as the ability to switch implementations one for another at any time, I thought: "Wow! That’s amazing! I gotta do that!". So I went extracting the interfaces out of each class and making the classes refer to the interface. Soon I realized that in order to be really independent, I had also to change the methods and properties to point to the interfaces so I could change the object being passed to them.

Several weeks later I had it all done and working, but those were several weeks not adding new features. Only refactoring code at a time where we had no refactoring tools like today.

One could argue that I should have done interfaces from start and then I wouldn’t have had all that work. OK, I agree. The problem is that all that was new for me. Still, all the work would be compensated by the possibility of switching implementations whenever I needed!!!

The problem is that time never came! OK… To be fair, there were a couple of situations where I benefited from using interfaces. And that only became possible because I got a new insight, a new way of seeing the world – through interfaces. But for the most part, it was an overkill. When modifying a class, instead of having one place to change, now I had two!

It has been attributed to Albert Einstein that “Everything should be made as simple as possible, but no simpler

After so many years of developing software I came to appreciate simple designs.

I think about the ways the code might evolve in the future and instead of putting in things that pave the way to this predicted future, I tend to leave out the things that would otherwise make it more difficult to get there.

The reason for this is that the predicted future may never come to realization. So by putting in stuff now, I would eventually be throwing resources away. Resources that may be needed for something else.

It gets even worse when – driven by real needs – you find yourself having to accommodate changes that go in another direction that eventually are incompatible with what was initially predicted.

All of this has already been explained by people much better with words than I am. Take a look at YAGNI, KISS and DRY.

The bottom line is: Grow you software simple. Only add complexity when really needed. Even then, try to keep it as simple as possible, but no simpler. 🙂