Trabalhando remoto e Home Office

Trabalho remoto é um modelo no qual vejo uma série de virtudes para o ritmo de vida moderna. Acredito que ainda exista alguma resistência que é justificável somente em casos onde não é possível o uso de tecnologia para colaboração remota e comunicação.

Na área de desenvolvimento de software em específico, podemos obter diversos benefícios semelhantes aos obtivos fisicamente em um escritório, mas o componente principal para que esse modelo dê certo são pessoas preparadas e consciente dos desafios que irão enfrentar, essas devem estar dispostas também a remodelar quando preciso alguns aspectos da sua rotina pessoal através da adoção de alguns novos hábitos para que esse modelo seja bem sucedido.

Atualmente já trabalho a mais de 4 anos remotamente no meu escritório em casa e ao longo desse tempo adquiri alguma experiência para conseguir destacar alguns pontos que podem lhe ajudar a ter uma boa produtividade e sucesso com o modelo. Esses pontos são principalmente a atenção para rotina, visibilidade do trabalho e organização.

Rotina

Adotar uma rotina é a melhor forma de se manter saúdavel e produtivo trabalhando remoto. É necessário entender como o seu corpo funciona e adotar horários que funcionem para você. Em relação a horário recomendo adotar principalmente um horário para terminar seu turno de trabalho, ele é tão importante quanto ter um para começar. Dentro da rotina também é importante adotar alguma atividade externa e recorrente como uma caminhada ou academia, todas as vezes que descuidei específicamente disso senti uma visível perda de produtividade e uma tendência a descuidar na manutenção de uma rotina.

O importante em relação a rotina é entender que trabalhar remotamente lhe dará uma flexibilidade enorme em relação a horários e uma economia de tempo sensível, mas não confunda essa flexibilidade com ausência de rotina diária.

Visibilidade

É preciso deixar sempre claro que você esta no seu horário de trabalho para as outras pessoas, principalmente as de sua casa. Uma medida interessante é adotar uma peça específica da sua casa onde seja possível fechar a porta quando necessário e modelar fisicamente ela o mais próximo possível de um escritório normal.

Mais do que nunca ao trabalhar remoto é preciso se tornar de alguma forma sempre visível também para os outros integrantes do seu time (caso você tenha um time) avisando que você esta disponível ou fazendo algo. Quando trabalhamos em um escritório estamos lá fisicamente visíveis e não é preciso dizer para as outras pessoas que estamos trabalhando, porque se estamos lá teóricamente já estamos fazendo isso, mas remotamente elas não nos vêem todos os dias e precisam constantemente estarem conscientes disso.

Organização

Manter o seu espaço sempre que possível limpo e organizado é algo bastante fácil de ser descuidado, porque estamos em casa e temos a tendência de nos sentir “mais a vontade”. Porém trabalhar no meio do lixo é a melhor forma para que as outras pessoas da sua casa tirem a conclusão de que você não esta levando muito a sério aquele espaço. Lembre-se sempre da visibilidade, organização é uma forma de visibilidade. É importante também tentar se organizar em relação as suas tarefas e torná-las sempre visíveis por perto. Eu tenho, por exemplo, um quadro branco no meu escritório e utilizo ele frequentemente como ferramenta de apoio, organização e visibilidade do meu trabalho.

Concluindo

Se você pretende adotar esse modelo de trabalho remoto em seu home office, procure atentar para os três pontos que citei acima, eles parecem super simples mas são absolutamente essenciais e muito fáceis de serem descuidados. Para empresas, ou donos de negócios, aconselho que vocês apenas reflitam sobre esse modelo como uma possibilidade, se estiverem na dúvida apenas façam uma experiência com um modelo misto (parte presencial/ parte remoto) e veja se suas pessoas estarão mais felizes e como foram os seus resultados.

Extendendo o comportamento de clonagem de objetos em Ruby

Alguns dias atrás, me deparei com um comportamento inesperado em um código. Basicamente uma das minhas classes Ruby tinha como atributo uma coleção de objetos que quando processada por outras instâncias tinha alguns objetos dessa coleção alterados e com isso alguns efeitos colaterais aconteciam.

Vamos a um exemplo

Vou criar aqui um código bem simples apenas para lhe dar uma ideia melhor do que estou falando. Se quiser, fique a vontade para abrir o seu IRB e ir me acompanhando nos códigos abaixo.

Vamos criar duas classes, Father e Child (Pai e Filho). Child tem um atributo “name” e Father recebe um “child como atributo:

1
2
3
4
5
6
7
class Father
  attr_accessor :child
end

class Child
  attr_accessor :name
end

Para fins de praticidade não estou definindo os initializers. Então crio uma instância de Child e passo ela para Father.

1
2
3
4
5
child = Child.new
child.name = "Mr. White"

father = Father.new
father.child = child

Nesse momento então “father” tem uma cópia do objeto “child”:

1
2
3
father.child.name #=> "Mr. White"

father.child.onject_id == child.object_id # => true

Logo a seguir então crio um clone de Father, que carinhosamente irei chamar de dolly:

1
2
3
dolly = father.clone

dolly.child.name #=> "Mr. White"

Tudo ok até aqui.

Como já esperávamos dolly e father são objetos diferentes:

1
father.object_id == dolly.object_id # => false

Resolvemos então, sem desconfiar de nada, manipular o valor do atributo “name” na cópia de child que foi clonada para dolly.

1
2
3
dolly.child.name = "Jesse Pinkman"

dolly.child.name #=> "Jesse Pinkman"

Finalmente então podemos ver claramente o problema proposto aqui.

Era esperado que o objeto “father” tivesse sido completamente clonado para “dolly” e o seu estado original preservado, certo? Porém, quando atribuimos o valor “Jesse Pinkman” ao atributo “child.name” em “dolly”, alteramos ao mesmo tempo também o valor de “child.name” no objeto clonado “father”. Dê só uma olhada:

1
2
3
father.child.name #=> "Jesse Pinkman"

father.child.object_id == dolly.child.object_id # => true

father#child e dolly#child guardam a refência para o mesmo objeto. Que legal, né?

Se tentarmos usar o método dup ao invés de clone, vamos ter o mesmo resultado no final. Se quiser, faça o teste para conferir.

initialize_copy para o resgate

A nossa alternativa então é definir na classe Father um método initialize_copy, que vai nos permitir extender o comportamento padrão de clonagem do objeto para incluir as partes que ficaram de fora e que nos interessam, que no nosso caso seria clonar também as instâncias de child:

1
2
3
4
5
6
7
8
class Father
  attr_accessor :child

  def initialize_copy(cloning)
      super
      self.child = cloning.child.clone
  end
end

O nosso novo método initialize_copy recebe o objeto que estamos clonando e atribui um clone dele ao nosso atributo child.

Vamos conferir então se agora tudo esta funcionando da forma como esperávamos:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
child = Child.new
child.name = "Mr. White"

father = Father.new
father.child = child

dolly = father.clone

dolly.child.name = "Jesse Pinkman"

dolly.child.name #=> "Jesse Pinkman"
father.child.name #=> "Mr. White"

father.child.object_id == dolly.child.object_id # => false

Perfeito, era isso mesmo que eu esperava que acontecesse!

Espero que se você tiver utilizando alguma técnica, como a de Dependency Injection por exemplo, e tiver uma situação parecida com essa que acabei de descrever você possa se lembrar de que é possivel extender o comportamento de clonagem de objetos em Ruby para que ela atenda específicamente as suas necessidades.

[Talk] Design Web APIs

Ano passado eu tive a oportunidade de falar sobre Design de APIs no nosso grupo local de usuário de Ruby (GURURS).

Como construir e pensar boas APIs tem sido uma das minhas áreas de interesse e estudo, então resolvi na oportunidade falar de uma forma um pouco mais agnostica sobre as boas práticas que envolvem o desenvolvimento de qualquer API RESTfull

Infelizmete a palestra não foi gravada, mas os slides estão disponíveis aqui:

Gerenciando meus Rubis locais

Alguns anos atrás comecei a gerenciar meus rubis locais com o RVM, mas nos últimos dois anos mudei por um tempo para Rbenv e atualmente decidi voltar a utilizar meu velho amigo RVM.

Um dos aspectos positivos do RVM são as Gemset já inclusas. Rbenv não tem isso incluso por defaut sendo preciso então instalar um plugin.

Então, qual meu workflow basico com RVM?

Basicamente, quando inicio um em projeto ruby o meu primeiro passo é decidicir (ou descobrir) qual a versão devo usar nele. Sabendo disso, dou uma olhada nas minhas versões locais disponíveis:

1
2
3
4
5
6
7
8
9
10
$ rvm list

rvm rubies

   ruby-1.9.3-p194 [ x86_64 ]
=* ruby-2.1.2 [ x86_64 ]

# => - current
# =* - current && default
#  * - default

Se por exemplo a versão 2.1.3 for a necessária e não estiver instalada:

1
$ rvm install 2.1.3

Geralmente isso leva algum tempo para finalizar.

Com a versão Ruby correta em mãos é hora de criar uma Gemset específica para o projeto:

1
$ rvm gemset create myProj

Gemsets são legais pois elas isolam completamente as ruby gems do seu atual projeto em relação aos outros projetos que já rodam na sua maquina.

Posso então definir a versão ruby e gemset a ser utilizada no projeto:

1
2
$ rvm use 2.1.3
$ rvm gemset use myProj

ou simplesmente

1
$ rvm use 2.1.3@myProj

Uma boa pratica é criar arquivos padrões do RVM que definem a versão ruby e a gemset a sempre serem utilizados naquele projeto:

1
$ echo 'rvm use ruby-2.1.3@myProj' > .rvmrc && rvm rvmrc to ruby-version

Caso contrário toda vez que o diretório do projeto for acessado você terá que definir a versão e a gemset dele.

E finalmente, com isso a vida do seu projeto irá começar um pouco mais organizada e a sua também.

No Procfile detected, using the default web server

Se você é usuário do Heroku e alguma vez já tentou fazer o deploy de uma nova aplicação, provavelmente você já deve ter visualizado a seguinte mensagem no log do seu terminal:

1
2
3
###### WARNING:
No Procfile detected, using the default web server (webrick)
https://devcenter.heroku.com/articles/ruby-default-web-server

Basicamente por você não ter definido nenhum web server para sua aplicação através de um Procfile será utilizado o default webrick, o que é uma péssima ideia em termos de performance para qualquer projeto em produção.

No artigo de ajuda para esse warning é sugerido que você instale o Unicorn. Eu usei o Unicorn recentemente em produção e foi uma experiência razoável.

Últimamente para qualquer projeto inicio utilizando o Thin, que é muito mais simples e rápido para dar o ponta pé inicial.

Basicamente você precisa adicionar o Thin na sua Gemfile:

1
gem 'thin'

Rodar um $ bundle install.

Criar um arquivo Procfile na raiz do seu projeto e adicionar nele a seguinte instrução:

1
web: bundle exec thin start -p $PORT

Com isso você estara utilizando Thin ao invés do webrick e aquele Warning durante o deploy irá desaparecer.

8 extensões do dia-a-dia

Existem algumas extensões que utilizo por padrão a vários anos. Sempre que preciso fazer o setup de uma nova maquina sempre lembro delas de cabeça mas custa nada manter uma lista delas compartilhadas por aqui e liberar algum espaço na memória.

Normalmente uso 3 browsers (Safari, Chrome e Firefox) ao longo do desenvolvimento de uma aplicação web alternando minha preferência entre Chrome e FF e usando mais o Safari para ver se nada esta quebrando nele.

FireBug
Amigo inseparável com 1001 utilidades.

WebDeveloper
Canivete suíço, geralmente uso para bloquear CSS ou JS já carregados na página e o redimensionamento também.

RailsPanel
Específicamente útil para quem desenvolve com o framework Rails.

ColorZilla
Útil para pegar os hexas.

MeasureIT
Excelente para saber exatamente quantos pixel um determinado elemento tem na sua tela.

WhatFont
Mão na roda para descobrir qual fonte esta sendo aplicada em um determinado elemento.

AdBlock
Essencial para assistir vídeos do Youtube sem aquelas públicidades mala.

OneTab
Adoção recente, faz um zip daquelas 200 abas que “eventualmente” ficam abertas em uma só reduzindo drasticamente o consumo de memória.

Algumas dicas para aprender Inglês

A vários anos atrás fiz um nível inteiro de um curso de inglês em Porto Alegre que durou um ano e meio, na época me ajudou muito e recomendo para quem esta começando e tem um nível praticamente nulo de conhecimento no idioma a se inscrever em um desses cursos como ponto de partida.

Ao longo dos anos, pós esse ponto de partida, acabei descobrindo algumas dicas que me ajudam a manter um bom contato com o inglês e de vez em quando sempre aprender algo novo.

Podcasts diariamente.
Listening é uma parte fundamental de uma conversa pois se você não entender o que o outro esta falando será difícil dar uma resposta decente para continuar a conversa.

O ESL Podcast é o que conheço de melhor porque apresenta sempre um diálogo e no final o mesmo diálogo em normal spech (velocidade normal de fala). Além disso ele passa o podcast inteiro explicando em inglês o que as palavras mais difíceis (ou menos conhecidas) do diálogo significam.

Livro em inglês.
Ler pelo menos 1 livro totalmente em inglês por mês é algo que ajuda a desenvolver muito o vocabulário e a manter o idioma vivo em mente.

No projeto Gutenberg existe uma infinidade de livros gratuítos para download para todos os gostos e interesses.

Aulas em video.
No youtube existem bilhões de videos em inglês. Porém didaticamente explicando, recomendo os videos do canal EngVid. Além das explicações sempre tem um quiz no site para testar o entendimento do que foi explicado. Tem muita coisa interessante por lá.

Além do EngVid assino alguns outros canais porém mais relacionados a cultura americana como o Real English e Amigo Gringo, esse segundo acho sensacional.

Conversar com um nativo.
Ao contrário das outras opções gratuitas essa é paga. Eu já fiz aulas através do LiveMocha (antigo tutors, já não existe mais) e com o meu preferido Skype English Class. Recentemente descobri também o HelpOuts do Google.

O legal de conversar com um nativo é que ele entende absolutamente nada de português, então não adianta você no meio da conversa querer dar uma dica ou fazer uma pergunta em português ( do tipo “como é cadarço de tênis mesmo?”) porque simplesmente a pessoa não irá entender, o que acaba sendo algo ótimo.

Cursos online.
Para quem quiser algo com um conteúdo mais estruturado, recomendo que se inscreva e faça os níveis do LiveMocha ou então o Duolingo, ambos gratuitos. Duolingo aliás que tem uma versão mobile incrível. Esses dois são os melhores que conheço.

Filmes e séries.
Assitir séries e filmes com a legenda em inglês (ou sem) é algo que já fiz algumas vezes e realmente ajuda bastante. Atualmente quando assito algo acaba sendo legendado em português mesmo, questão de costume ou preguiça talvez. No Netflix por exemplo isso é super simples.

Como eu não moro em um país onde posso praticar o idioma no dia-a-dia (que seria o ideal), procuro sempre me manter em contato com algumas dessas práticas sempre que possível ao longo da semana.

Se você conhece mais algumas dicas interessantes sobre como aprender inglês me envie um e-mail ou faça um comentário que irei adorar saber.

Minimalismo 101

Um dos temas que gosto de ler e pensar a respeito é o minimalismo.

Recentemente li o livro “31 day to a minimalist life”. Onde foram sugeridas várias atividades que podemos adotar em pról desse objetivo minimalista de vida ao longo de 31 dias, não irei lista-los um por um por aqui mas recomendo fortemente a leitura do mesmo. Quando eu li ele estava disponível para download gratuitamente, provavelmente agora não estará mais.

Estou longe ainda de ser alguém plenamente minimalista, mas os principais hábitos que já adotei nos últimos anos e que me ajudam bastante são:

  • Não acumular muitas roupas. Toda vez que ganho ou compro alguma roupa procuro enviar em proporção para doação alguma que já se encontra em desuso por algum tempo. Uma revisão no guarda roupa de vez em quando ajuda a manter esse hábito.

  • Revisão semanal de papéis inúteis. Toda semana procuro dar uma revisada na papelada que vai se acumulando na minha mesa, mochila, carteira, etc. Isso ajuda e muito a não guardar lixo e geralmente me ajuda a lembrar de coisas importantes que ficaram esquecidas no meio da bagunça.

  • Organização sempre que possível. Um ambiente organizado ajuda a manter a cabeça limpa e de fato aumenta a concentração. O problema é que toma tempo manter tudo sempre organizado, mas isso é “O sinal” de que existem muitas coisas ao meu redor que talvez eu não precise tanto assim e é um exercício diário pensar sobre isso.

  • Corte de gastos desnecessários. Comprar só pela marca ou apenas por comprar é algo que nunca tive como problema, mas nos pequenos gastos ainda preciso de alguma atenção e procuro sempre me focar nisso.

Veja que somente esses pontos já são bastante simples e ao mesmo tempo complexos de se adotar, mas todos eles estão de certa forma relacionados no dia-a-dia. Além do livro citado, que é uma ótima introdução teórica para refletir sobre o assunto, recomendo também o blog do Alex Castro onde ele trata bastante desse assunto.

Saudações

Sempre gostei de escrever. Geralmente é escrevendo que consigo alinhar as ideias.

Textos simples, sem muita pretensão. Mas que hoje são textos que mantenho única e exclusivamente engavetados no Evernote.

O interessante de textos é que depois de um certo tempo engavetados eles perdem a relevância. Talvez eles sejam um dos reflexos mais próximos de nossas opiniões e experiências, que com o tempo vão mudando.

Normalmente costumo após alguns meses fazer uma varredura nos meus textos descartando praticamente metade deles. Justamente por isso tentarei publica-los o quanto antes por aqui.