LinkedIn is a company that needs no introduction – with over 187 million users in more than 200 countries, it is one of the most important internet companies on the planet. Today we are very lucky to speak with Jim Brikman, staff software engineer at LinkedIn, about their development process.
Can you tell us about yourself? What is your role at LinkedIn and what do you do?
Sure. I have been at LinkedIn for a bit over three years. I am a software engineer and have worked on a number of teams, including the monetization team and the platform team. My current job is on our Presentation Infrastructure team. We are developing the infrastructure and the technologies that we actually use to build the site – the rest of the company builds and runs their code on top of our code. I also run several other programs at LinkedIn – the monthly HackDays, our [in]cubator program, open source, and the engineering blog.
Sounds good. Can you tell us a bit about the development team at LinkedIn? How many engineers do you have and how is it organized?
Within the large, overarching groups there are much smaller teams. The breakdowns vary quite a bit. Usually the teams own a certain product, and they work together with product managers, designers, and other folks. The average project that I have worked at LinkedIn has had between one and five people working on it – plus one product manager and one designer.
We push code to the site a few times a day. Obviously not every team has something to push each day – you have to code something before pushing it. A lot of teams use an agile, Scrum process, where they do two to three week sprints, and then at the end of each sprint, put something onto the live website. That does not necessarily mean that the users see it – we have the ability to shut features off or hide them, or only make them visible to employees.
The sprints vary a lot per team and per project – as some of the projects are much more long-term. But for the biggest part of the company – the Apps team – it is usually two to three week sprints, and then pushing something live.
Do you work autonomously within the small teams or is there a lot of interaction with the rest of the company?
It really depends on which team you are on and what you are doing. In general you do need a fair amount of interaction with the rest of the company to make sure we are all aligned, not repeating the same work, or contradicting each other. Usually it is taken care of pretty well near the top.
But even beyond that, every new feature usually has a lot of dependencies on everything else. LinkedIn is built as a service-oriented architecture, so for each different type of data, I may need to talk to a different service. When you launch a new feature, it would be less than polite to just dump it out there, and not notify the teams that own that service. You have to work pretty closely with other teams to make sure it is going to scale before you put it in front of a couple of hundred million people. We also have to work with the operations team that gets the code onto the site and with the QA to make sure that somebody tests the code.
It is hard to do something completely in isolation, but the closer you are to the front-end of the site, the easier that can often become. Right now I am on the infrastructure team, which means that my primary customers are other developers, and I am working with other teams very closely. I used to also work on some of the Apps teams and the Monetization team, and there you have a lot more ability to just go and try things. It tends to be a very data-driven decision process. You put something out there, you are doing an A/B test or bunch of buckets – and see how it behaves.
And how do you communicate? You mentioned Scrum, do you do stand-up meetings or other communication methods?
Within your close team of one to five, the communication is usually done just in person and via stand-up meetings. A lot of teams have a ten-minute meeting in the morning, or at some point during the day. We also often have the big Scrum board with Post-It notes, and all the tasks and things we are working on.
Between teams communication varies a lot. We obviously use a lot the standard tools – such as email and in-person chats when it is local (most of the team is in Mountain View). If that does not work, we have internal chat system, IRC, internal Q&A tool, JIRA for bug tracking, wiki pages – a pretty standard set of tools to either synchronously communicate with someone, or leave information for others for later.
What challenges do you encounter when organizing the development process, if any?
Oh, there are tons. There are plenty of challenges any time you do any project. As described in The Mythical Man-Month, the more people there are working on a single project, the more time is spent just communicating things to them. So that often can be a challenge. Finding out who has given information can really be a hard thing. For example, if I need the data from a certain service, it is not always obvious which services will even have the data that I need, how to use it correctly, what the canonical source is, or what the scalable way of doing it is. Even knowing who knows the piece of information, as the company grows, can be a challenge.
There are a lot of interesting ways to solve it. I am not sure that we have cracked that puzzle perfectly, but it comes down to everything from how do you actually build the technologies – are all of your APIs consistent, canonical, and reusable – to how easy it is to find the documentation for these things, how is the code organized, is there some kind of pattern that everybody follows, and so on. Also how we share information in the organization is important – are things like wiki pages of a certain format, and can you search them and the information would actually show up. Some teams do weekly status reports, which are filtered up to the top, and then there is a company-wide email with the information on what the whole technology group is working on.
Do you plan any changes in your process?
I am not aware of any humongous changes as a whole company, but within each team we tweak little things almost every single sprint. After every sprint we get together and just say what worked and what did not – and make little adjustments, like changing how we file bugs, track priorities, etc.
OK. The final question that we have is do you have any advice for startups, their CTOs or other developers?
I think that the last point about Scrum is the most important thing to keep in mind. There is no process that just works, you won’t get it right the first time, you won’t get it right the tenth time. And as the company grows and the projects change, what used to work will no longer work. The most useful thing is to build your process in a way where you can change it and adapt it easily. Set your process to be this dynamic thing that you can adjust as necessary, and make sure to listen to feedback from the people that are using the process. If they are not happy, then the process changes from something that helps you go faster to just pure overhead.
When we first started doing Scrum, it did not work perfectly – a lot of things were wrong and just were not effective for the way we had been trying to do the project. The only way we were able to fix it is after every sprint to honestly just say – here are things we need to stop doing, here are things we need to start doing, and here are things that are working well. If you do that, after a few sprints, you will end up with something that actually helps a team go faster rather than just feeling like stupid overhead that some managers impose.