Concrete Logo
Hamburger button

O que é um desenvolvedor Android senior para a Concrete Solutions?

  • Blog
  • 6 de Julho de 2016
Share
Senior Yoda

Senior Yoda

O mercado de tecnologia está vivendo uma gigantesca bolha inflacionária de vagas completamente incongruentes. Hoje, há vagas para desenvolvedores sênior com salários de R$ 5.000,00 até R$ 20.000,00 ou mais… Inclusive, há muitas empresas de fora do Brasil tentando levar o pessoal daqui. Mas o que define uma pessoa como apta para receber essa quantia toda? Aliás, o que faz o mercado criar vagas tão desesperadoras assim?

Todos sabemos que ter um produto digital hoje é de suma importância para quase qualquer negócio. Como exemplo, sabemos que mobile representa porcentagens muito significativas hoje em dia de bancos, e-commerces e cia. No entanto, quase tudo que pode ser acessado por um processador (seja websites, aplicativos mobile, equipamentos da internet das coisas) evoluiu muito rapidamente e invadiu nosso cotidiano de forma a transformar nossos hábitos.

Daí, se você é o presidente de uma empresa que tem uma presença digital, sua obrigação é se manter competitivo com a concorrência em geral. Se um destes concorrentes consegue ter um site que renderiza melhor, é mais estável, possui mais integrações, mais canais, entrega novas funcionalidades mais constantemente e de forma mais confiável, então você estará em desvantagem para uma base representativa de consumidores.

Qual a saída? Contratar pessoas experientes! Mas aí você se depara com o problema de que elas gostam de tecnologia e não de e-commerce. Então, sua saída para conseguir atrair os ditos “talentos” é criar vagas “irrecusáveis”. Ótima ideia! Porém, quem dentro da sua estrutura consegue realmente aplicar um processo de contratação de uma vaga extremamente técnica, ampla e crítica? É complicado…

É nessa hora que todo mundo enlouquece e contrata pessoas que talvez sejam boas em uma parte, mas pecam em outras e assim por diante. O efeito final disso é que uma pessoa que ascendeu rapidamente acredita ser um cara “sênior” pois está com salário e responsabilidade de “gente grande”. A pergunta afinal é: essa pessoa seria um sênior em uma empresa em que o “core business” é tecnologia? Seria responsável pela arquitetura da empresa?

Aqui na Concrete Solutions, nosso foco é produtos digitais e, portanto, temos o core business pautado em tecnologia. Assim, também sofremos para achar pessoas qualificadas ou para treinar o time interno para que todo mundo se torne um sênior. Tentamos vários processos de contratação, várias práticas internas de fomento ao compartilhamento de informações e conhecimento e outras vantagens. Mesmo assim, o mercado está tão desesperado que oferece vagas altíssimas para nosso time constantemente, até mesmo para pessoas que sequer são seniores para nós.

Isso não é algo que torcemos contra. Na Concrete Solutions estamos sempre pensando nos desafios como cultura. Reconhecer, contratar e treinar pessoas é algo extremamente difícil e é gratificante ver que de certa forma estamos acertando (apesar de errarmos muito ainda nessa área). Se as empresas gostam do trabalho da Concrete Solutions e se procuram nosso pessoal para vagas de “gente grande” isso é, sem dúvida, um reconhecimento. Porém, vejamos o que é um desenvolvedor sênior para Android aqui dentro:

  1. Em primeiro lugar, é importantíssimo que o desenvolvedor sênior tenha um profundo conhecimento em Java (atualmente a linguagem oficial da plataforma). Parece superficial, mas é incrível como as pessoas pegam atalhos uma vez que já sabem criar um aplicativo com telas, animações e etc. O problema é que o desconhecimento da plataforma pode gerar bugs difíceis de resolver ou, até mesmo, de encontrar. Não há como usar atalhos aqui. Conhecer sobre a literatura (Java Efetivo, Java Generics and Collections, Java Concurrency in Practice, Filthy Rich Clients, etc.) e as pessoas influentes da linguagem é extremamente importante. Além disso, muitas dependências que usamos nos aplicativos Android de hoje em dia são dependências PURAS de Java. Entender reflexão, processamento de anotações, bootstrap de classloader e etc. é extremamente importante para tomar decisões de arquitetura. Conhecer e entender o que é o bytecode Java também é necessário para alguns casos. Principalmente para os casos em que as pessoas acham que por estar compilado está irreversível…

  2. Após ser fluente na plataforma Java é também importante conhecer a plataforma do Android. Muita gente sabe colocar um botão na tela, mas não faz a menor ideia de como os componentes do sistema interagem. Exemplo simples: o que é o package manager? Como eu o acesso por meio do adb? É possível rodar os testes do Android usando apenas o adb? O que é o contexto de instrumentação? Como um layout de XML é construído? Como funciona as bibliotecas de suporte ou as bibliotecas que você utiliza na sua aplicação? Enfim, essa é uma diferença fundamental entre um sênior e um pleno: não basta saber usar como está na documentação da biblioteca (copiar e colar código tantas vezes até que você sabe fazer de cor), mas tem que saber como funciona, olhar “embaixo do capô” de tudo. Isso quer dizer: um desenvolvedor sênior tem que saber se o problema é do código dele ou da própria plataforma (o que não é lá tão raro no Android). Saber exatamente como as bibliotecas que usamos funcionam pode ser a diferença entre abrir uma contribuição que ajuste uma dependência problemática e ser refém da boa vontade de um desenvolvedor de open source.

  3. É fundamental que o desenvolvedor sênior saiba criar e manter de forma estável uma suíte de testes bem feita. O aplicativo que vai para produção deveria ser um aplicativo que possui diversos testes executando em diversos devices. Isso parece óbvio para quem é da administração, mas é incrível como poucas pessoas fazem testes. E muito menos pessoas entendem o que está acontecendo em um teste. A diferença entre instrumentação de um aplicativo e execução de testes unitários na própria JVM já é algo raro. A maioria das pessoas sabem que são duas coisas diferentes, mas não sabem o porquê ou qual o papel de cada uma. É extremamente comum que as pessoas não deem valor para testes. Isso é: ou não fazem nada, ou fazem de forma mal feita como, por exemplo, não escrevem nenhuma asserção no teste, não procuram formas de manter a suíte estável ou outras bibliotecas que nos ajudem a ter asserções mais narrativas com detalhes de falha mais bem descritos. O resultado é que vemos muito software sendo feito como se estivéssemos em 1950 (quando não existia uma prática de testes automatizados, e ainda posso estar errado quanto a essa data…).

  4. Todo desenvolvimento Android depende de uma ferramenta de construção, empacotamento e gerenciamento do ciclo de vida da geração do binário final. No caso atual, trata-se do Gradle. Esta ferramenta é extremamente importante para gerenciarmos cada transformação do nosso projeto em um pacote final. Não basta usar apenas aquilo que está na documentação do Android sobre o Gradle. Em primeiro lugar, não foi o Android que criou a ferramenta. Toda a integração do Android com o Gradle é feita por meio de um plugin. Um sênior precisa saber escrever plugins também para interceptar a configuração padrão e, mais uma vez, não ser refém da forma como as coisas são feitas tradicionalmente. Cada projeto possui suas necessidades especiais de empacotamento e é imprescindível conhecer o funcionamento tanto do Gradle quanto dos plugins do Android (inclusive saber onde está o código fonte para inspeções, como depurar um script Gradle e etc.). Novamente, há muita literatura sobre o assunto (e muita coisa boa gratuita).

  5. Ser um excelente usuário do sistema de controle de versão. Quase sempre aqui na Concrete Solutions isso se trata do GIT. É incrível como as pessoas não conhecem essa ferramenta. Todo mundo sabe algo bem básico e se dizem avançados, mas em diversas situações são reféns do controle de versão pois não sabem como sair de uma situação de conflito, por exemplo, ou configurar a ferramenta para não usar o VI como editor. São coisas simples, mas que incrivelmente pouca gente se dá ao trabalho de ir atrás de fazer de uma forma melhor. Um sênior deve conseguir gerenciar um histórico de controle de versão limpo, aplicar code review seja por ferramentas ou por simples fluxo operacional de Pull Requestse criar um workflow de integração e entrega contínua (mais sobre isso abaixo) que seja fácil de gerenciar no controle de versão. Vejo muitas pessoas utilizando ferramentas das mais variadas para “facilitar” o versionamento, mas acabam não sabendo habilitar as flags corretas para os momentos corretos e gerando um histórico do GIT que não é o ideal. Enfim, há mais reféns do que seniores de GIT. Muitos inclusive sequer abriram “man git-checkout”…

  6. Quase sempre hoje os produtos digitais são conectados. Eles precisam falar com um servidor, alimentar bancos de dados e buscar informações. Um sênior precisa conhecer os protocolos de comunicação que seu aplicativo utiliza para falar com o servidor. Isso quase sempre quer dizer conhecer HTTP, TLS e práticas RESTful, entre outros. Hoje em dia há muitos outros protocolos como MQTT, CoAP, WebSocket, HTTP2 e etc. Não é necessário ser um desenvolvedor back-end, mas precisa ter interesse de estudar tudo aquilo do que seu aplicativo irá depender.

  7. Desenvolvedores seniores sabem configurar um ciclo de integração e entrega contínuos. Mais do que saber a parte técnica, precisam saber os benefícios e saber defender o valor que isso gera para o produto. Pipelines de fases do build (linters -> testes unitários da JVM -> geração do pacote -> testes instrumentados -> geração de relatórios -> entrega) são responsabilidade compartilhada entre DevOps e desenvolvedor. Não dá para exigir que o DevOps imponha quais são as fases que importam ou como gerar os relatórios. Ambos trabalham juntos em um time para que as informações estejam sempre corretamente geradas e visíveis ao time inteiro.

  8. Também espera-se de um sênior que ele conheça a metodologia com a qual trabalha diariamente. Scrum, XP, Kanban ou qualquer outra metodologia ágil. Seja Waterfall (mas por favor não!) ou Rational Unified Process (RUP, mas por favor não!). O que importa é saber qual o papel das cerimônias, como reportar seu trabalho corretamente e não achar que isso tudo não melhora seu próprio trabalho. Será, normalmente, a responsabilidade de um sênior participar do refining, ajudar na quebra de histórias em tarefas, conversar com o time sobre estimativas e tudo mais. Não se trata de SER o Product Owner ou Scrum Master, mas de participar ativamente e não passivamente no processo da metodologia.

  9. Talvez mais importante do que tudo, uma pessoa não se torna sênior simplesmente porque é excelente nos quesitos técnicos. Esse é sem dúvida um dos requisitos. No entanto, a pessoa precisa ter liderança. Não necessariamente liderança de pessoas, mas de que adianta o sênior saber mais que todos e não dar sua opinião na arquitetura ou solução técnica? Ele precisa ser comunicativo nem que apenas na parte técnica, mas precisa se informar do stack inteiro e ser proativo na construção da melhor solução de produto digital que lhe ocorrer.

  10. Muitas vezes os projetos de produtos digitais não conseguem atingir todos estes pontos de forma total. A solução final não depende de uma única pessoa e não acreditamos que o sênior é o único responsável pelo sucesso ou insucesso de uma solução. No entanto, é papel de um sênior tentar influenciar a solução para que ela caminhe no melhor sentido sempre.

Será que esse profissional merece um salário de R$ 20.000,00? Não sei… não é o ponto aqui dizermos o valor de cada um. Cada empresa possui seu momento, seja financeiro, seja de posição no mercado e o valor do salário é algo que não me cabe aqui. O que podemos dizer é que há pessoas que não estão em dia com estes pontos que estão recebendo salários altíssimos e perpetuando soluções não-ótimas de produtos digitais.

Aqui na Concrete Solutions também não estamos parados esperando que as pessoas cheguem com este perfil pronto do mercado! Tentamos várias abordagens de treinamento e erramos muito nessa área. Estamos com outras abordagens ultimamente e tentando melhorar nossa efetividade em conseguir ajudar as pessoas a atingirem esses pontos. É um processo, mas pelo menos temos nossas métricas para tentar atingir!

E as suas? O que é um sênior para você? Deixa seus comentários abaixo 🙂

É desenvolvedor Android e quer fazer parte do nosso time? Acesse aqui.