Nine things I didn’t know nine years ago

May 19, 2016 by lsmit@wemanity.com in  Blog

 

Image from page 400 of “The Palm of Alpha Tau Omega” (1880)

It’s coming up on nine years since I first started slinging code in a professional setting. Professional here meaning with a salary, in an office, with other engineers, decent coffee and unreasonable deadlines.

Back then I was barely newly minted from school, and what I lacked in understanding I certainly carried in hubris. I remember being vaguely offended not to be on the list of Sweden’s top coders that year. No idea how they would’ve found me, but I still remember being annoyed by it.

What I’ve lost in hubris in the last nine years, I’ve gained in experience. I thought it’d be useful to punch down a few things that it would have been nice to know nine years ago — maybe it can help you, if you’re just about to take your first steps out of school.

In no particular order, here are nine things I wish I’d known when I started out:

  1. Experience counts for something. This is obvious, and maybe a bit condescending. But I remember the first time I saw a colleague in a live, heated situation pull up YourKit and hone in on the fact that we’d have two ServerInstanceFactories, not one, and that caused the entire app to go belly up. Or when I got literally smacked on the fingers for not using two-phased locking correctly. And a thousand other things. My first two years of working, what I mainly learned was that I basically didn’t know shit.
  2. People are messy. I’d love to know how many hours humanity as a total spends every day mediating between two or more angry 40-year old men. Most of the time, you’ll find reasonable people that don’t share your point of view on things, and you are not obviously right. There are tradeoffs. And sometimes people hold on to stupid ideas longer than they should, simply because they’re people. It’s a great irony that software development demands literal, logical, unambiguous reasoning while being complicated enough that you need to collaborate with ornate, arbitrary, ambiguous humans.
  3. You’re not logical, you’re biased. If there was one thing I was certain of was that I reasoned with logic and soundness and that I thought things because they were true. Things such as — we hire people only because of merit. Obviously. What I’ve learned is that any point can be argued from many angles, and who I am, where I was raised, what I studied and who my friends are all influence what I think is obviously true. I’ve also learned that I’ll likely never be Spock, and that the only reasonable defense is to invite different points of view, and accept that reasoning from different premises can lead to different conclusions, and still be logical and sound.
  4. You can use engineering for other stuff. As a flipside to above, I’ve also learned that the method of engineering that you learn in school and hone over the years is useful for a ton of other stuff than just programming. What engineering is to me is a way to define, decompose and reduce a problem space, and from that reason a solution under balanced constraints. Really, figuring out what you’re asking, and then answering that. And turns out that anything from sales, marketing, finance, design to analytics are super-susceptible to this. Don’t be afraid to dive in. It’s usually pretty simple to get stuck in.
  5. Users are not stupid. This one is a big one. When users complain about your product, it’s usually not because they’re stupid. Your dad, uncle or whatever that don’t really understand Facebook are not stupid. They just know other shit, and they haven’t learned this stuff yet. And that’s Facebook. They have literally hundreds of user researchers making Facebook simple. When your uncle doesn’t understand your app, it’s probably because it’s pretty unusable. Don’t blame users for that.
  6. Engineers have professional responsibilities. If you work with software in a company that makes money, chances are you have users. Even if you’re building Spotify, not a pacemaker, you still have a responsibility to your users. They’ve chosen your product, and if it sucks, they’re suffering and it’s your fault. This means that if you’re out chugging beer, the systems you maintain go down, and no one else can pick them up, you get a cab home and fix it. Obviously, don’t let a company take advantage of this responsibility. You should get reasonably compensated. But it’s still a responsibility. You can’t laugh off service disruption.
  7. Inverting a tree is useful, but not in the way you think it is. I’ve always been a strong believer in academic knowledge, and I loved taking the hardest courses. Particle filtering, non-linear signal processing, abstract algebra, advanced algorithms, etc. If it looked hard I wanted to know it. However, the point of Red-Black trees is not Red-Black trees. The point of graph traversal is not graph traversal. The point is, the tools you have shape how you solve problems. And the deeper the understanding of graphs you have, the easier it will be for you to see that a problem is a graph problem. Just like if you know enough economics, you can see business problems as market problems. And so on.
  8. Integrating early is always better. This is really mundane compared to all the other grand advice, but if you’re a bunch of people working on a piece of code, avoid branches and avoid submodules as much as possible. It’s really not better to work on your own branch until all is nice and then merge back. Merge early. Merge often. Otherwise you’ll spend a month merging. I promise. Like, I really, really promise … and actually, I guess there is grand life advice here as well. If you and someone you depend on disagree on something fundamental, don’t hold a grudge. Hash it out, as early as possible. Make sure you see eye to eye. The process and the product will be all the better for it.
  9. Simpler is literally always better. I saw someone write something like “Software engineers spend their first two years building complexity, and the rest of their careers managing it”. This is true. Really true. If you can avoid it, never write a dispatcher. Never write an orchestration framework. Don’t use Java if a bash script will do. Solve the problem you have now, not the problem you might have later. Nothing makes you feel as smart as a well architected, abstract framework for solving really complicated, general problems. Nothing makes you feel as stupid as not understanding how to debug it.

Anyway. This is my list. The nine things I wish I knew nine years ago. It strikes me now that current me would love to see the list Nine Things I Wish I’ll Remember In Nine Years. What stuff have I forgotten that would warp my perspective? I’d love to hear your take on either this, or what I missed on this list.

By: Marcus Frödin from Spotify

https://medium.com/@marcusf/nine-things-i-didn-t-know-nine-years-ago-fcbc757b268b#.9xksp8f8t

Rejecting roles

Mar 29, 2016

Rejecting roles: That’s marketing’s job. You need to talk to IT.

Having roles is considered essential by most organisations. We’ve read dozens of business blogs, HR advice articles and even management training courses that insist clearly defined roles lead to better results, greater productivity and higher motivation. Without clear definition of roles, they warn that tasks get missed, no-one takes responsibility, the office is chaotic and individual motivation drops.

We disagree.

The writers of this advice have grasped the outcomes they want – people taking pride in their work, everyone focusing on delivering value, individuals coordinating and collaborating – but they’ve applied the wrong solution.

They’ve confused roles with responsibilities.

That may not sound like a big deal, but we think it is. Rigid role definition has some major downsides. We believe it hurts companies and individuals, costing them in creativity and happiness.

Most organisations intend their role definitions to be a way of signalling particular specialisations, expertise and responsibilities… but instead, the definitions swiftly harden into barriers, marking out territory which is defended against ‘interference’ from others. Have you ever been told to back off by the marketing manager for commenting on the new advert? Been refused access to the code base by the developers, ‘in case you break something’? Been told to leave presentations to ‘the sales guys’ or forecasts ‘the finance guys’? At the extreme, you may have your opinion rejected with a straight-forward ‘well it’s not your job to worry about x, it’s mine!’.

Individuals may also use their role definition as a way of avoiding unpleasant or boring tasks. This ‘that’s not in my job description’ approach ends up making the company less efficient as well as eroding team motivation. I remember organising a last-minute marketing stunt when I worked at Unilever. I was booking a double-decker bus to turn up and I wanted to check it would actually fit into the office forecourt. The marketing assistant nipped down to Reception to check. An hour later, she returned. The security guard had refused to measure the gateway and if it was beneath the dignity of a security guard, then she reckoned it was beneath the dignity of a marketing assistant as well. So I borrowed the security man’s tape-measure and checked the gateway (you could – quite literally – have fitted a bus through there). Anything wrong with doing my own measuring? Absolutely not. Anything wrong with wasting an hour of time arguing about whose job it was? Plenty.

Roles are comfortable – but bad for us

It’s very human to defend our own work and our own opinion. When we can dress this up with the authority of experience, expertise and organisational separation – all the better. Except it isn’t. Rigid role definition acts as a barrier and can stifle innovation. It can also make things slower and less efficient.

If a customer rings up with a problem, they want a solution, not to be told that only part of their problem can be dealt with by this department, and they must be passed on to billing or whoever to deal with the rest of it.

It’s not great for individuals either. Sticking to just one thing may mean our knowledge gets deeper, but also narrower.  We can get bored or worse, so convinced of our own expertise that we can’t take on other points of view.

Being Radical: Sticking to the start up way

In many start ups, a lack of defined roles is the default position. There is not enough money to hire specialists – instead developers must learn to present to investors, marketing managers must be able to create and manage their own customer data, and everyone must have a grip on the financial assumptions as well as a grasp of the their product (this often means some grasp of the technology).

When entrepreneurs look back on the early stage of their companies, they often comment on wistfully on the diversity of work and of how close to the customer it meant they were.

Jeff Bezos, CEO of Amazon, recalled being the ‘mailroom grunt’ in the company’s early days, driving books to shipping and courier companies in his 1987 Blazer. But this doesn’t scale, right? Jeff Bezos is not still doing deliveries. Actually, he is. He spends a week every year in the warehouse. It’s not a PR gimmick, because he refuses to set up interviews when doing it. It’s an opportunity to stay connected to his responsibility – leading Amazon – and not the role of CEO. That includes really understanding conditions for employees – something for which Amazon has received a lot of criticism – and staying close to core services like order fulfilment.

Another trick used at Amazon is to have individual employees who have no role at all. Bezos has ‘shadows’, people who simply follow him around. It means there’s always someone free to chase a wild idea or set up an experiment – and it recognises that a responsibility like ‘envision Amazon’s future’ requires several people, not just a single role.

So what should we do?

1. Responsibilities not roles

Some radical companies go for a very broad responsibility ‘provide value to the company’ and say that how this is fulfilled is up to the individual. Others go for more precise responsibilities: ‘help the customer’ or ‘make sure we comply with financial regulations’.

The point is that how you fulfil these needs can require doing tasks which, in other companies, would be seen as belonging to differing roles.

2. Trust people

A lack of roles makes people more responsible, not less. Tasks rarely get missed because everyone knows they have total responsibility for the work – no tester will come pick up the programmer’s bugs; no finance controller will correct over-optimistic projections.

3. Trust people some more

A lack of roles doesn’t mean that everyone will try to do everything. People naturally gravitate towards what they’re interested in and what they’re good at. If someone is convinced she’s a brilliant illustrator and everyone else insists the stick men cartoons are rubbish, she will soon stop.

4. Value dissent not consensus

No roles doesn’t mean you have to design by committee. Heated arguments are common, and that’s fine.  Even if people don’t agree at the end of the debate, the important thing tends to be to air the problem. Opinions can be rejected; a decision can still be made, risks can still be taken…

By: Helen Walton from Gamevy

Your Engineering Team Is Not an Island: Success Demands a Holistic View of the Business

May 23, 2016

I just re-read the awesome post from my friends David Loftesness and Raffi Krikorian, What Does A VP of Engineering Do Again? And while I agree with everything that they say, I think there is one crucial item missing, which has been present in every job I’ve had because all of them were user-facing internet services and a majority of my job has been working with product teams. Collaboration with stakeholders (especially with product) is key, but if you take it one step further, a VP of Engineering is actually measured by execution in a wider context across many teams or departments. You cannot look at engineering in isolation for your successes or failures.

But first a short story about my first months at SoundCloud. The CTO wanted more front-end work done because an important release was nearing. He asked me to hire more engineers to accomplish that goal. I started recruiting, but then I looked at why the velocity of the existing team was not meeting expectations. So, I went to all of the front-end teams (at that time it was Web, iPhone, and Android) and asked a very simple question “What slows you down the most in your day-to-day work?” To my surprise, everyone gave the same answer “We only have one designer.” They went on to say that although the designer was very good, she was completely overloaded so designs, changes, and simple clarifications took forever to get done.

Now that I knew design was actually the cause for delays, the solution to my problem was not to hire more engineers (which might have even made the problem worse with more work for the designer), but to start building a design team.

Engineering leads need to look at the whole product process (together with the responsible stakeholders) and not just at engineering in isolation. What I did was a very simple (but, in this case, effective) form of value stream mapping. Our self-improvement at SoundCloud continued. You can read Phil Calcado’s excellent post about the organizational aspects of microservices at SoundCloud.

The Best Engineering Leads Will Stop and Assess the Situation

Continually assessing situations in a holistic way isn’t just the job of an engineering lead — everybody involved should take responsibility. But, in my experience, the problem usually surfaces in engineering because when things are not moving fast enough (and when do they ever?) management’s first reaction can be to throw more engineers at the problem so more work will get done, but also (and this is the not so nice scenario), management thinks the engineers are not working hard enough. Other common responses from management include reorganizing the teams or adopting new methodologies. However, as an engineering leader, you are a lot like a doctor: you need to diagnose the illness before treating the symptoms.

Engineering leaders need to look at the whole value chain and to sit with the leaders from affected departments to review at the problem. The solution to a problem might not be to hire more people (which a lot of startups do), but to organize product development in a better way. And if you have to hire, it might mean that you have to move headcount around. When everyone has the same goal goal — delivering more business value — shifting headcount from engineering to design or to recruiting shouldn’t be an issue. Afterall, the goal is more business value, not having the biggest department. So, when I realized our problem at SoundCloud wasn’t going to be fixed by adding more engineers, we created a design team. But this was just the first step towards a better setup.

Even after creating a larger design team, it remained isolated from other departments and was not fully integrated with our workflows. The problems of turnaround and wasted resources were exacerbated by the increasing risk of misalignment between product, design, and engineering. Therefore, the next logical step was to improve the organization by creating a delivery team per product.

Shifting Organizational Structures to Deliver Business Value

A delivery team is a team that can deliver the vast majority (95%) of its backlog items to production without dependencies on other teams. Unlike more horizontally-oriented teams (for example, a front-end engineering team that relies on the back-end engineering team for any back-end changes), a delivery team has all the necessary skills inside their team. So, depending on your company and your product, these teams can look very different. In engineering teams that are infrastructure focused, these teams can consist of only engineers; but if you look at a team that delivers a consumer-facing web app, then the team looks more like this:

Traditional and Delivery Team Structure

Creating these delivery teams and then making sure you have the right staffing for them should eliminate a staffing mismatch between the affected departments. Some team members (like support) might just be a pointperson for the team, e.g., the support person only attends the daily standup and reports what is going on.

So, don’t look at engineering in isolation when trying to solve delivery problems. It is critical that each engineering leader (and especially the VP of Engineering, who can really influence the organizational setup) ensures that the overall product development process is set up in a way that reduces waste and delivers value to the customer which is the whole point of product development in the first place!

This post includes material from the upcoming book “Scaling Teams” by myself and David Loftesness, which will be published by O’Reilly in 2016. In this book, we will explain in detail the various scaling challenges of software startups.

Thanks to Laurel Ruma and David Loftessness

By: Alexander Grosse from issuu

https://medium.com/scaling-teams/your-engineering-team-is-not-an-island-success-demands-a-holistic-view-of-the-business-bccd6116094b#.9tbmcbfnw

 

 

Great Leaders Ask Great Questions

May 20, 2016

For the last few years, I’ve been working with and studying some of the best teams in the world; Red Arrows teams, SAS and US Navy SEAL units, Racing yacht crews, a Formula One pit crew, etc. I set out to study teamwork. In particular, I wanted to know how these teams have become world class. In the course of my studies, I identified six common characteristics, which differentiated these incredible teams.

Interestingly, I didn’t set out to study world class leadership. However, when I found world class teams, I also found world class leadership (I know, I probably should have expected that!). So, as well as studying teamwork, I also began to look at the characteristics that differentiated world class leadership. One of the most powerful insights that I discovered is this…

Great Leaders Ask Great Questions.

In fact, the great leaders that I encountered often didn’t provide any answers! Instead, they realise that the group has the potential to generate a better answer than they could on their own. It’s a principle that James Surowiecki outlines in his book, Wisdom of Crowds. When I shared this idea at an educational conference last year, a Head Teacher responded by saying, “That’s rubbish. Are your trying to tell me that Einstein should ask his class for the answer, and that the class will have a better answer than Einstein?”. “No”, I said, “Einstein is part of the class. So by engaging the class you get Einstein plus the class, not instead”.

Knowing that great leaders ask questions is one thing. Knowing what constitutes a ‘Great Question’, is another. So, what makes a question ‘Great’?

Here are some of my thoughts and reflections…

To me, ‘Great Questions’ are simply the right question, asked at the right time. To ask great questions, we need to understand the problem we’re trying to solve and where we are in the process. Do we need to ask a strategic question, or a tactical question, or one that’s related to implementing and executing a plan?

Strategic Question – Why?

Tactical Questions – What? …. How?

Action & Implementation Questions – Where? …. Who? …. When?

Very simply, it makes sense to understand why we are doing something (and whether we should be doing it), before deciding what we’re doing or how we will do it? Equally, it makes sense to know what we’re going to do, before deciding who will do it, when and where.

To me, ‘Great Questions’ are also well defined and simple. Sometimes it takes time and thought to frame a question well. The world class leaders that I saw at work often ask simple questions, which engage their team to collectively solve a problem. Some of the most powerful questions I’ve heard simply begin with the words, “How could we…?”.

To find out more, read Stronger Together; How Great Teams Work and hear from world class leaders sharing their wisdom on Be World Class TV.

By: Simon Hartley, Founder of Be World Class.

http://www.be-world-class.com/node/251