Contratando: Desenvolvedor para Time de Front-End

Estamos em busca de um desenvolvedor experiente para integrar nosso time de front-end, que seja criativo, autodidata, apaixonado por construir experiências de usuário fantásticas, e que se sinta motivado pelo desafio de suportar o crescimento do PetLove, o maior petshop online do Brasil, pelos próximos anos.

No nosso time de front-end, você será responsável por escrever HTML, CSS e JavaScript para nossa loja, que roda em plataforma Vtex, e trabalhar na melhoria contínua da experiência dos nossos usuários.

Esperamos que você tenha experiência com:

– HTML
– CSS
– JavaScript
– JQuery
– Twitter Bootstrap
– SAAS / LESS

Dominar design responsive é bem desejável. Aliás, muito desejável. Photoshop também.

Interessado? Mande-me seu CV em PDF para leandro.silva@petlove.com.br e vamos bater um papo.

Contratando: Desenvolvedor para Time de Back-End

Estamos procurando um desenvolvedor experiente para integrar nosso time de back-end, que seja criativo, autodidata, pragmático, apaixonado por desenvolvimento de software, e que se sinta motivado pelo desafio de suportar o crescimento do PetLove, o maior petshop online do Brasil, pelos próximos anos.

No nosso time de back-end, você será responsável por manter e implementar novas funcionalidades em nosso sistema de Assinatura de Ração e nos diversos web services de integração, além de escrever aplicações de monitoração, analise de dados e automatização de tarefas.

Esperamos que você tenha experiência com:

– C#
– ASP.NET MVC
– ASP.NET Web API (JSON, REST-like)
– Windows Service / Console Application
– SQL Server (Stored Procedure, View)
– Git

Dominar os conceitos da orientação a objetos e saber quando usar determinados design patterns é fundamental. Automatizar testes também. De unidade, de integração, de aceitação, de performance, quanto mais automatizados, quanto menos manuais, melhor.

Conhecimento em outras linguagens e paradigmas de programação também é algo bem apreciável. Pode ser Java, Ruby, Python, Erlang, JavaScript, Clojure, F#, ou qualquer outra linguagem; pode ser programação funcional, concorrente, paralela, orientada a eventos, ou seja lá o que for. Valorizamos a diversidade de conhecimento e o bom senso para usar a melhor ferramenta para o trabalho da vez. O mesmo vale para banco de dados – Redis, MongoDB, Cassandra, MySQL, todos sem bem-vindos por aqui.

Nosso projeto da vez é baseado em C#.NET e SQL Server, mas temos outros projetos no roadmap que, muito, muito, provavelmente, não serão. Esse é um dos motivos de darmos tanta importância à diversidade de conhecimento em linguagens de programação, paradigmas e bancos de dados.

Você acha que jogaria bem nesse time? Entre em contato (leandro.silva@petlove.com.br), mande seu CV em PDF, sua página do GitHub e vamos bater um papo.

Seguindo em frente

Depois de 11 meses de muito trabalho e dois projetos entregues com muito sucesso, junto com meus amigos da Sequenza IT Solutions, chegou a hora de seguir em frente para o próximo [e excitante] desafio.

Hoje foi meu último dia de trabalho com eles e amanhã começo a trabalhar no PetLove, o maior petshop online do Brasil, como Head of Development.

O desafio

Estou muito feliz e excitado com o desafio de liderar o time de desenvolvimento na implementação de soluções de checkout, billing, mobile, big data, antifraude, e claro, uma experiência de usuário excepcional. Tudo para firmar o PetLove entre os maiores e-commerces do Brasil.

Um pouco mais

Dá última vez que vocês me desejaram sorte, funcionou mesmo. Muito obrigado!

Agora, por favor, façam isso novamente.

Composição e Integração de Sistemas em 2013

Hoje estive falando no TDC 2013, na trilha Arquitetura .NET, sobre a estratégia de compor e integrar sistemas a partir de micro-serviços, que é um tema que tenho bastante interesse e pretendo ainda falar um pouco mais a respeito, em eventos e aqui no meu blog.

Esta foi a segunda vez que falei nesse evento e, assim como no ano passado, a sala estava lotada, o pessoal bem interessado e participativo; e no final, uma galerinha veio trocar uma idéia comigo, fazer perguntas, etc. Foi bem bacana mesmo.

Parabéns aos organizadores e ao pessoal que participou!

Sequenza: 2012 foi bom, mas 2013 promete ser ainda melhor!

No último dia 24 completei três meses de Sequenza, mas parece que já faz pelo menos um ano, viu?! Foram três meses de muito trabalho, muitas novidades, muita diversão e uma qualidade de vida que há tempos não tinha – até voltei para a academia, acredita?

Foram três meses de ouro! Estou bem feliz. Feliz, aliás, não só pelo que rolou até agora, mas pelo que ainda está por vir.

Um pouco do que rolou em 2012

Meu primeiro projeto seria para um banco alemão, para quem desenvolveríamos uns simuladores de financiamento, para seu novo internet banking. No entanto, para que a coisa ficasse mais divertida, quando estava a caminho do escritório para meu primeiro dia de trabalho, recebi a notícia de que o início do projeto estava sendo reagendado, mas que já tinham uma outra reunião para mim, em um outro cliente, para iniciar um outro projeto. Tive que parar em um shopping e comprar uma camisa.

Desde então, tenho estado trabalhando no projeto de reescrita do sistema que gerencia todo o processo de produção da área da Giesecke & Devrient que oferece solução para o governo; desde a captura biométrica até a personalização de chips e cartões. Tem sido um projeto bem interessante, em parceria com um instituto de pesquisa e desenvolvimento da Bahia, que tem um baita know-how em biometria, e que deve ir até o meio de fevereiro de 2013.

Paralelamente a isso, estive também prestado algumas consultorias, aqui e ali, para AgilitasBanco Rendimento e a própria Giesecke & Devrient, orientando em decisões de arquitetura e operação de sistema.

Outubro e novembro foi basicamente isso, até que, no início de dezembro começamos um novo projeto, fantástico, para a Giesecke & Devrient. É um projeto para a o governo de São Paulo, para a área de saúde, mas ainda não posso publicar mais do que isso. Depois faço um post apenas sobre isso.

Bem, isso dando só um overview do que rolou, claro. Porque se for escrever tudo, esse post vai ficar enorme!

O que está por vir em 2013?

Esse último mês do ano foi bem intenso em termos de propostas, agendamentos e início de novos projetos:

  • O projeto de saúde, que iniciamos agora em dezembro, deve ir até o meio de abril
  • O projeto dos simuladores vai iniciar em janeiro e deve ir até março
  • Fechamos mais um projeto para a Globalstar!

Isso sem falar dos projetos que estão em vias de fechar contrato; do nosso produto de propaganda em lojas, que tem sido um sucesso, rodando no Carrefour, Leroy Merlin e Ikesaki; e dos nossos consultores que estão fazendo um ótimo trabalho em gestão de projetos, analise de negócios e desenvolvimento de sistemas na Giesecke & DevrientAgilitasBanco Rendimento e Banco Volkswagen.

“2012 foi um grande ano para a Sequenza, mas 2013 promete ser muito melhor!”

Desejem-nos sorte, amigos! :)

Sistemas para o Mundo Real no InfoQ BR

Só hoje me dei conta de que o site InfoQ do Brasil publicou o vídeo da palestra que fiz no TDC 2012, intitulada Sistemas para o Mundo Real.

É isso aí, divirtam-se!

O fim das minhas férias chegou

Pois é, acabou a moleza! Semana passada resolvi me juntar aos meus amigos da Sequenza IT Solutions; hoje será, oficialmente, meu primeiro dia de trabalho.

Quem é a Sequenza?

A Sequenza é uma consultoria relativamente nova, criada por meus amigos de longa data, Fernando Lauria e Alex Terra, que vem focando seus esforços essencialmente em desenvolvimento de software, mentoring em processos e alocação de profissionais, além de alguns produtos nas áreas de biometria e merchandising.

Como mencionei, somos uma consultoria relativamente nova (sou o consultor #11), mas já com um portifólio bem interessante, valores que casaram com os meus e excelentes perspectivas pela frente.

Vou fazer o que por lá?

Vou fazer o que sempre fiz e que amo fazer:

  • Gerenciar projetos
  • Arquitetar e desenhar sistemas de software
  • Mentorar pessoas em técnicas de desenvolvimento de software e processos
  • E escrever código… todo dia!

Além disso, há uma série de idéias e projetos para serem colocados em prática, principalmente no que se refere a novos produtos e ao relacionamento da empresa com comunidades de desenvolvimento de software open source. Estou imensamente animado com o que há por vir!

Meu primeiro projeto

Amanhã começaremos um projeto novo, muito, muito interessante, para um banco alemão. Vamos escrever uns simuladores de financiamento, usando basicamente:

  • C#
  • ASP.NET MVC 3
  • WCF
  • Entity Framework
  • Oracle
  • HTML, CSS, jQuery
  • E outras coisinhas mais

Se interessou? Estamos contratando!

E para finalizar…

…amigos, desejem-me sorte!

A Relational Analogy for the Cassandra Data Model

The idea here is to use Twissandra to try to clarify the column-oriented data model employed by Cassandra, which goes beyond the simple key/value model and often is misunderstood. It’s not quite hard to understand, if you have a little familiarity with JSON-ish data structures, but is quite a bit if you don’t. On the other hand, almost everybody knows relational data model. So here lies my idea on take the relational data model as an analogy.

Wait! I don’t pretend make you think that one can use Cassandra in the same fashion that a relational database. Instead I’d want to get you introduced to that paradigm and give you some ground to further learning. Hopefully, you’ll have insight on potential use cases as well.

Here we go!

Let’s everybody to the same page

Twissandra is a sample application which aim is to demonstrate how to use Cassandra. It’s essentially a simplified Twitter clone, as you can see at http://twissandra.com.

I gently ask you to take a look on the project README, at the specific topic on Schema Layout, in order to getting knowledge of its data model (i.e. users, tweets, friends, etc), because that is going to give you underlying knowledge to follow the analogy which follows.

The Analogy

I believe that at this point you have read the schema layout of Twissandra. So now I think it’s a good time to put a conceptual model in place, in order to synthetize what you have read there.

Keyspace = {
    ColumnFamily1 = {
        RowKey1 = {
            ColumnName1 = ColumnValue,
            ColumnNameN = ColumnValue
        },
        RowKeyN = {
            ColumnName1 = ColumnValue,
            ColumnNameN = ColumnValue
        }
    },
    ColumnFamilyN = {
        RowKey1 = {
            ColumnName1 = ColumnValue,
            ColumnNameN = ColumnValue
        },
        RowKeyN = {
            ColumnName1 = ColumnValue,
            ColumnNameN = ColumnValue
        }
    }
}

What does it look like? Did you say a map of maps? Oh yeah, you’re right. Come on walk through each piece now.

Keyspaces

Analogy: Database, schema
There: Twissandra

This is the top-level identifier of our schema. As such, we usually have one by application.

Column Families

Analogy: Table
There:

  • Users
  • Tweets
  • Friends
  • Followers
  • Timeline
  • Userline

Analogously to tables, column families are containers for rows. Each row has a key and contains a number of columns.

Columns

Analogy: Field
There:

  • Users:
    • password = string
    • email = string
  • Tweets:
    • username = string
    • body = string
  • Friends
    • [{user.name} = timestamp]
  • Followers:
    • [{user.name} = timestamp]
  • Timeline:
    • [{timestamp} = {tweet.id}]
  • Userline:
    • [{timestamp} = {tweet.id}]

Columns follow a name/value fashion. As such, their names can be strings, numerics, etc, and are used as indexes, since they are stored orderly. To put it simple, let’s take the Friends column family as an example, whose which each row is keyed by an username.

Friends = {
    'hermes': {
        # friend id: timestamp of when the friendship was added
        'larry': '1267413962580791',
        'curly': '1267413990076949',
        'moe'  : '1267414008133277',
    },
}

Each row has a number of friend usernames as column names (i.e. column names can be used to store values) and timestamps for their values, thus we can easily know which users are following a given user and since when.

This data model breaks away the common relational concept of selecting records through joins among many normalised tables. Here we often design our “tables” with our future data reading in mind, not with the data storing. I mean, what is read together is indeed stored together.

Going to the next page

Super Columns

There is also another type of column, whose is not employed on Twissandra, which is called Super Column. It’s a special type of column that contains a number of regular columns, what let us to something like a map of maps of maps.

Keyspace = {
    ColumnFamily1 = {
        RowKey1 = {
            SuperColumnName1 = {
                ColumnName1 = ColumnValue,
                ColumnNameN = ColumnValue
            },
            SuperColumnNameN = {
                ColumnName1 = ColumnValue,
                ColumnNameN = ColumnValue
            }
        },
        RowKeyN = {
            SuperColumnName1 = {
                ColumnName1 = ColumnValue,
                ColumnNameN = ColumnValue
            },
            SuperColumnNameN = {
                ColumnName1 = ColumnValue,
                ColumnNameN = ColumnValue
            }
        }
    },
    ColumnFamilyN = {
        RowKey1 = {
            SuperColumnName1 = {
                ColumnName1 = ColumnValue,
                ColumnNameN = ColumnValue
            },
            SuperColumnNameN = {
                ColumnName1 = ColumnValue,
                ColumnNameN = ColumnValue
            }
        },
        RowKeyN = {
            SuperColumnName1 = {
                ColumnName1 = ColumnValue,
                ColumnNameN = ColumnValue
            },
            SuperColumnNameN = {
                ColumnName1 = ColumnValue,
                ColumnNameN = ColumnValue
            }
        }
    }
}

It might be useful if we decided, for example, that we should have friend details right in the Friends column family, e.g. their long names. In this case, our Friends column family would be actually a super column family like follow.

Friends = {
    'hermes': {
        # friend id: timestamp of when the friendship was added and his/her name
        'larry': {
            'longname': 'Larry Page',
            'since': '1267413962580791'
        },
        'curly': {
            'longname': 'Curly Howard',
            'since': '1267413990076949'
        },
        'moe': {
            'longname': 'Moe',
            'since': '1267414008133277'
        }
    }
}

This model is in line with our aforementioned philosophy of “what is read together is stored together”. And also it’s worth to mention that super column names are stored orderly by name, i.e. they’re indexed, just like regular columns are.

Far more

This blog post was undoubtedly a simplified explanation on the Cassandra data model, relying on an analogy to help people, which might be already familiar with relational data model, to getting started with the Cassandra data model.

So now that you have a basic understanding, I’d strongly suggest you to read the official explanation from Cassandra’s wiki and other good explanations, like these following:

I hope have helped you!

klogd2: My second try to route Syslog messages to Kafka

It was really cool to play around with klogd but I have to confess that I’d like to have more fun. So this is my aim with klogd2.

Klogd2 is essentially a new implementation of klogd but in Java, relying on Syslog4j, as I said on klogd2’s README:

I’d want to try Syslog4j on the server side, because I know it’s a rock solid stuff and all those cool kids are using it, e.g. Graylog2.

Take a couple of minutes to get a look there, when you can. As usual, I’d really appreciate your feedback and possibly a pull request.

klogd: What about route Syslog messages to Kafka?

Today I was searching for a way to route Syslog messages to Kafka, since Syslog is the standard bucket for logs on Unix-like operational systems and there are many legacy applications which use it and cannot be changed to use something else. Unfortunately, I didn’t find anything. Therefore I decided to write something to try it.

Kafka is a pretty interesting high-throughput distributed messaging system from LinkedIn’s Data Team guys, whose aim is to serve as the foundation for LinkedIn’s activity stream and operational data processing pipeline. They have used it to handle lots of real-time data everyday and have open sourced it as an Apache project. I suggest you to take a look on its design and use cases today.

The result of my first try is klogd.

It’s a dumb simple Python program which simply listen for UDP packets on 1514 port and send them to a Kafka server. Just it. So I know, of course, there are many things to be done, because klogd is still too naive. This is just the begining.

Take a time to try it and give me your feedback. Further, fork it, hack it, and send me a pull request.