Archive for the ‘Discussion’ Category

My unorthodox thoughts on working at the office versus remote work

Friday, September 12th, 2014

The discussion that I keep seeing everywhere over and over again about office versus remote work is quite interesting. But not as much as it could be, because most people seem to have a similar opinion. Remote work is the latest fashion and is here to stay, but I have some unorthodox opinions that I thought would be nice to share too.

I started thinking about all this a few months back when I came across this video from Jason Fried, author of the book “Remote: Office Not Required” and Founder of 37signals:

* If you can’t see the embedded video you can try to watch it on the original website.

In the dramatisation, Matt Stillman is the CEO of a fictitious company and he discusses with Jason about remote work (and why he think it sucks). Obviously this video is a joke (it’s coming from Vooza anyway). I do have a sense of humor and let me agree beforehand that the video is kind of funny. :) But at the same time it called my attention because it reflects the real world in a way. The comments – although clearly exaggerated and supposed to be a joke – are an extrapolation of what fervous remote workers out there (like Jason, perhaps) think about office work.

For instance, Matt on the video says people can’t work from home because he hires “morons who can’t be trusted and need constant adult supervision”. Matt also says that “he would never want to work from home because he hates his family and only started a company to have somewhere to go every day and get the hell out of there”. Then it gets even more exaggerated when Matt says he evaluates employees badly if they get there 9:05am instead of 9am, or if they use Facebook at work. Again, the video is a joke as we know, but I’ve seen fervorous remote workers really using silly things like that as their real arguments.

I’m not here trying to convince anyone about working from an office. It’s just that when I saw the Vooza video it crossed my mind that I don’t think I ever saw an article about why it’s cool to work from company campuses. With my own experience in mind, here’s why I think working from the office is nice(r):

Communication

When you are in person with your team, the communication barrier is really low or inexistent, so it’s naturally better. A lot of the non-verbal communication (gestures, eye contact, body language, facial expressions, etc.) can get lost in remote teams, and those things are really key to make communication better and more effective.

Remote teams often find effective ways to communicate using Skype, Hangouts, Facetime and other technologies. I’ve done that too (to its full extent, including remote champagne celebration), and I can remember many instances where I couldn’t communicate because Internet went down, or connection was slow, or just to start a meeting we would need 15 minutes for people to get set up, or when kids were shouting and dogs were barking on the background and it was impossible to hear the other side, or when the call was just bad quality and it became unproductive… Those examples are not the rule, but when they happen during a key meeting, or, let’s say, your iteration planning, it really really hurts.

I’ve also seen remote teams (me included) using the Basecamps and Trellos of life. Basecamp for instance is a very nice tool, and It’s also built by Jason and 37signals, so I can totally make the connection that stimulating people to work from home directly contributes to his business and I totally understand why they do that so fervently. :) Jokes aside, those tools are great for improving remote communication and collaboration, but again you lose a lot of the face-to-face signals in that process. Many of the best ideas that I’ve had or seen people having happened in the middle of brainstorm discussions in a room with a bunch of people. Tools like Basecamp help indeed in several ways, but maybe your team is missing out in terms of discussions, brainstorms, collaboration, innovation, etc.

Bottom line is that communication is key for a successful software development team, and in my experience in-person conversations are the best ones.

White board discussions and radiators

Another thing that I really like to do (and is also related to communication) is using white boards and information radiators.

White board discussions make it much easier to get on the same page quickly with a bunch of people. I can think of numerous examples throughout my career where, at the end of the day, it took a bunch of smart people discussing, brainstorming and drawing on a board to solve a tough problem. Actually it just happened today (I’m not joking)! That to me is a big advantage of being altogether at the office. I bet there’s a tool that attempts to solve that problem, but I bet it’s not as productive as the good old “analog” board.

As an agile practitioner, I’m also adept of Kanban boards. This is by far my preferred tool to communicate priorities, track requirements and progress of a development team. There are again tools like Trello and many others that attempt to provide digital boards that can work well for remote teams, but one key principle of the Kanban boards is the principle of information radiation. When the information is retained (say, on Trello), you need to go there to find out what’s going on. When the information is everywhere (say, in the walls and whiteboards around you), you don’t need to go look for it, it gets radiated to you. When you walk into the room you already know what’s going on almost without having to look. You can have electronic information radiators too – and I use that a lot for Continuous Integration dashboards – but they work much better on a big TV in the middle of your work space like this.

Pair Programming

Pair programming is one of the nicest ways to get programming tasks done, especially the complicated ones that require a lot of attention. I’m not a fan of doing it (or enforcing) a 100% of the time, but it works really well and I like to do it more often than not. When you do it in person, you can have paper notepads and draw stuff to discuss, or have a to-do list to track things that you want to come back and do later, and many other things like that. You can do it remotely too, but doing it in person is at least one order of magnitude better. Maybe you can get used to it, but it was frustrating enough for me to not want to try anymore.

“Separation of concerns”

Separation of concerns is a common practice in software development: you separate your code into distinct sections, such that each section addresses a separate concern. I like to do that with my life too: work is work and home is home.

When I worked from home a few years ago I remember I would wake up and suddenly be working already, the hours would pass by, and by the time I noticed my daughter was already into bed and I didn’t even had the chance to say good night. At times it would be really challenging to get concentration going for a number of hours without usual “home” distraction like kids coming in and so on, and if you are a programmer you know that to do your job really well you need to get into flow mode sometimes. Lastly, if I was stressed with a tight deadline or anything like that, because I would “leave work” and “get home” in a heartbeat without even having some time to “decompress”, I would have lunch or dinner frustrated, with my family (and myself) not really enjoying my mood. Even a short commute like mine (10-15 minutes) helps you leave work at work and get prepared to have some quality time at home.

Hallway conversations

Hallway conversations are a great way of knowing what’s going on in different groups, share and learn with others, discuss our favourite tech topics with other geeks (like this week’s Apple Watch announcement), hear different opinions and so on. And when you work in a big company like Yahoo it’s especially good because you also get to meet a lot of new people this way (besides at trainings, in meetings and so on). If you like conversations and getting to know others, the office can be one of the best places to be.

Lunch with the team

My team and I have ridiculously fun conversations and a great time when we have lunch together. From thoughtful conversations to obscene and censored that I wouldn’t be courageous enough to mention here, every time we do that I feel we get to know more about each other and bond as a group, which directly impacts and improves the quality of our work as one unit. Remember the “whole is bigger than the sum of all parts” saying? This is one thing that definitely helps 1 + 1 be > 2.

“Decompression” activities

Have you ever been at a Nerf gun war? If not, dude, you are missing out! Not only that, but I also play table tennis on a regular basis (there was even a tournament a few weeks ago), basketball or beach volleyball sometimes during lunch, go to the gym (not so frequently these days), besides all sorts of really fun and relaxing stuff. Not to mention the soft serve ice cream machine, which is the 8th wonder of the world. I do all of that with my family over the weekend too, and we have a great time together. But that doesn’t mean I can’t have fun anywhere else, especially in the office where I spend a good amount of my time.

Conclusion

I don’t know, maybe I’m just very lucky and have always worked in amazing offices with the nicest people (probably true). But as I explained, there are also many communication and cultural aspects of working from an office that, in my opinion (and based on my experience), make the quality of the work and outputs better.

I’m far from being an “office work advocate” or anything like that, but I really like working at the office. Before you ask or think, I’m not saying this because I work at Yahoo (and by the way, the opinions here are my own and not Yahoo’s). If remote work works for you, that’s great! I’m very supportive. You should continue to do it. I’m not only very supportive of that but also office work and whatever else makes sense in your case and works for you.

Thoughts on Git and “Enterprise Open Source”

Tuesday, June 12th, 2012

Three years ago I wrote a post about how Git and Github changed the Open Source world and how companies can benefit from this model (in Portuguese, unfortunately, but you can try to read an almost-decent automatically translated version).

How come that three years later companies are still struggling to find a good version control system and a good model for internal collaboration when there’s a working model out there ready to be copied? :)

In many big corporations – like the one where I work – finding code in (Subversion) repositories is like finding a needle in a haystack. Code is hidden from potential contributors, which makes collaboration very hard. If you are really willing to collaborate, you have to download the code and send a patch by e-mail or via bug tracker. You just don’t know when, or how, or if the patch was applied. Besides all that, people lose hours and hours on slow SVN blames, checkouts and updates. Branching and merging with Subversion is too painful to mention, it’s an error-prone process that requires a lot of attention and, sometimes, hours of work. And if you are using SVN externals, oh god, poor you!

To solve these problems, two years ago my team started to work with Git using Git-SVN. This is a very well-known approach that lets you work on your Subversion repositories using Git as the client. You get some of the Git benefits like the automatic merges, local stash, local repositories and local commits but keep using Subversion as your remote repository for team syncs and “source of truth”. Well, it turns out that Git-SVN has some problems and you need to do some tricks to avoid trouble. And because you are still working with Subversion, in some situations you will still be slow, for instance, when you do an initial clone (it can take several hours if the repository is big). This approach seems acceptable at first, until you realize you’ve put a Lamborghini body around your old Horsey Horseless car.

In an effort to increase our productivity, we decided to go for a different (and obvious) approach: build our own Git server and quit Subversion forever. But because life is hard, we had several things plugged to our SVN repositories, from CI to internationalization system, and given that Git is not “official”, some of those internal tools didn’t support it and wouldn’t work. Not to mention that if we still wanted to be compliant with IT we needed to have our code on Subversion anyway. Not having Subversion was not an option.

To solve that, we wrote a server-side hook that replicates code to Subversion when there’s a git push. Despite the fact that we were still having slow Git pull and pushes sometimes, it was great because we got rid of many Git-SVN problems. The downside is that our code was being replicated to Subversion without commit history. Every push – regardless of how many commits it contains – becomes one single commit on Subversion, and we lose the commit messages. But since the main goal was to use Git only and still have the hooked systems working with Subversion, we loved it. We use Git for history (and everything else) while Subversion is just the thing that’s there because we couldn’t get rid of.

Two years later and after many different (sometimes inexplicably weird) attempts, our Git setup evolved a lot. We’re now using Gitolite for managing our Git server and, because of that, we needed to change the sync strategy to a cron sync due to the fact that the server-side hook was somewhat unstable with Gitolite. We now have several repositories, there are a few different teams using our server and if other teams want to have their own similar setups, we created a comprehensive step-by-step manual so that in less than a couple hours they can be up and running with their own boxes.

The Git adoption in our teams was painful but we made it. But we made it only for a couple teams and a lot of people are still suffering with Subversion throughout the company. And even if the entire company was using Git (which would be awesome already, don’t get me wrong), that solves only the development productivity problem, not the collaboration problem. Repositories would still be hidden and you would only be able to clone them and send (manual) pull requests knowing where they are.

That’s just wrong.

First, I believe developers shouldn’t be still justifying and fighting for Git adoption when it is clearly becoming the industry standard everywhere. For instance, Google Code had to add Git support to catch up with Github, and because they took too long to do that they lost many projects and developers (including myself). Atlassian’s Bitbucket is also supporting Git since late 2011. Even Microsoft recently announced Git support for Windows Azure. And the list goes on and on. The big players are recognizing Git’s relevance. And the small ones, they don’t care about anything else. Take Heroku for example, where deployment is only possible through Git.

Second, many Open Source projects like Rails, Node.js, Symfony, Django, PHP Language, Qt, openSUSE, YUI, JQuery and countless others already made us the favor of proving how platforms like Github and Gitorious can greatly improve the collaboration and contribution experience by providing workflows and tools that are really helpful for maintaining software projects. Those platforms enhance collaboration significantly, besides giving visibility to people’s projects and things they are working on.

We are not talking about a new hype here. Git and Github (and maybe this could be extended to other Github-like systems like Gitorious and Bitbucket) became the industry standard in the past years. Git is around for some 7 years now and was created inspired by the way people worked on the Linux Kernel, one of the biggest and most important software projects of the computer science history. By the way, if you didn’t do it already, stop for an hour now and watch this great video by Linus Torvalds on why he created Git, I promise you won’t regret. Git is ultra fast, stable, scalable, secure and makes collaboration much easier and faster. Managing merges and patches won’t be a nightmare anymore, not only because they put a lot of effort and intelligence on the merging itself but also because Git embraces collaboration workflow in a way that makes your life much easier (both for project owners and contributors). And Github will make your work more pleasant, collaborative and visible by adding even more tools and value on top of Git. But let’s not make this any longer, you get the idea already: they became the new standard for a reason.

The door is there. Now companies have to walk through it. And because I like challenges, I’ll help one more company take the red pill. See you on the other side.

Open source: “I don’t use open sorce software because I want support”

Wednesday, April 1st, 2009

“I don’t use open sorce software because I want support. I want to pay for it, so I can have support if I need.” That’s what a lot of people say about free and open source software. But today I came to a really interesting situation that it’s interesting to share.

We were configuring a continuous integration server at my team for a new project and we decided to use Integrity – that is a very simple yet powerful and beautiful tool. Our goal was really really simple: run tests, deploy the application and run more (acceptance) tests. Then we came to a situation where the tests were not running and the reason was somewhat bizarre. Integrity was opening a subshell to execute our build (and that’s very fair), but the problem is that Python‘s sys.stdout was showing an Unicode error, because the test reports have a lot of accents. For some strange reason the very same code that was working in our shells was aborting with an Exception when executed in a subshell.

Given that complex situation, I decided to go to the website’s FAQ to see if somebody had this kind of problem before. I thought that maybe some configuration or environment variables setup could easily solve my problem. After some minutes of browsing I found instructions to configure Passenger user switching to overcome this problem, but I got no success.

Then, very frustrated, I decided to take a look in the documentation again and this time I saw a link to “support”, that pointed me to an IRC channel.

In five minutes I was talking to 2 commiters of the project and was having a high level discussion about the problem, the causes and the possible workarounds. The best part was that it took exactly 30 seconds for them to understand what I was talking about and they immediately started pointing me to solutions and asking me to try things… Thank to the guys’ tips (and Google) I could solve the problem in the end.

If you don’t like open source software because of the support, then I would like to ask you: in what reality do you live? Do you prefer to talk about “subshells” and “environment variables” with some call center attendant or do you want to talk to the people that can really help you solve your problem?

In other situation I was working at a company that used a VoIP telephony equipment that only worked on Windows. I wanted so much to use my preferred Linux distro, but that would mean that I couldn’t have a telephone. So, since we had a gold support plan (because we had a lot of PBXs with almost 200 branches), I decided to call the company and ask why they didn’t have a Linux version. I also tried to propose to or account manager: “we can implement that for you, just give us the Windows source code or protocol spec that we will implement everything for you and give you the source code and all the rights for free”. That was 6 years ago and they still don’t have a Linux version of the software….

Then I want to ask again: do you want to pray for your vendor to implement the solutions that are important to you or do you want to have the power to do it yourself when you need?

Think about these things. In the great majority of the times I asked for support in open source projects they were infinite times better than any paid support I’ve ever had!