After a few years, I’ve got a few basic notions about software development. I went into Software with grand expectations of it being a pursuit of truth, that it was about crafting and pioneering new ways of doing things. These were ideas I’d gotten from nowhere in particular, but I still like the romance of it. But reality I like more, and the reality is that even (most) Software is built by people who are employed by companies, working in teams, working with legacy systems, working with all kinds of personalities, under varying degrees of pressure and under influence of all kinds of forces political, economical and egotistical.
Here are some digested down themes I feel are present.
Why so serious?
- People take their work seriously.
- This is generally a good thing but people can make each other’s lives hard and put tension on relationships just because they want to do what they think is technically right, even at the expense of others. If this is for no good reason then think twice about “getting your way”. E.g. “but I prefer to do it this way! This is how I always did it!” , e.g. “my manager told me so” (whatever that means), e.g. “but this is not what this was intended for originally.” (so what?).
- There’s a way of saying the same thing nicely or not. Take the effort to say things in an inoffensive way.
Be wrong – everything’s a learning experience
- Almost everything you do is just what you thought was right at the time. You’re almost never right because things are so complicated.
- It’s okay to change your mind. Just admit that you have.
- Don’t be afraid to do something just because there are lots of things standing in your way. It’s ok to be proven wrong after having tried your best.
Your level doesn’t matter
- Considering the above, your attitude matters more than your ability.
- A well functioning team is really productive and you won’t get to that with people who might be highly skilled but have a bad attitude.
- Having ideas that broach more than just your team should not just be a manager’s privilege. You should take your idea to the person that can make it happen, regardless of your level. This also means that you should try and have these ideas because it’s not pointless to have them. Think outside the box that you are in and engage the people in the boxes you need.
Seeing things from both sides of the wall
- People often end up being in one team or discipline for a long time. This means they are a consumer of other teams or services around them. That’s ok but quite often consumers have high expectations about getting what they want without trying to understand what’s involved in making that happen. e.g. I just want a Big Mac when I walk into McDonalds and I want to be annoyed if it takes more than 5 minutes. Is this necessarily justified? Is this a good attitude between teams in an organisation?
Technology is a social problem
- Decisions are not really made objectively. They are made on gut feelings or whoever is the squeakiest wheel or whatever consensus you reach on a particular day.
- No problem is one person’s alone. Problems require collaboration and that is a social thing.
- People are emotionally invested in their work. This can make asking questions about the work difficult. It also means you might have to choose your words carefully and not let words fall carelessly out of your mouth when describing systems. “But it’s just software right?”
Delivery is King
- Figure out the thing you really want to deliver and get it out the door.
- Be careful, if you like delivery too much then you’ve got a whole load of crap in prod to support.
- Delete crap.
- Go back to step 1.
- All of this is really about proving assumptions right or wrong, because we so often work on so many assumptions, the proof is in the pudding, so get baking my friend.
What’s the rush?
- Sometimes we choose a technology that we are going to be tied to for years in the space of an hour, just because we want to get it done.
- There’s a lot of things you can do in 8 hours. It pays to stop and think for 5 minutes where you care to spend your time.
- Doing no work isn’t such a tragedy. It’s far worse to work hard at doing the wrong thing than it is to do no work at all. This approach should be taken to “meta-work” too, things like your surroundings. If spending a bit of money on making a nice environment makes everyone just a bit happier then it is totally worth it! I guess what I’m saying is:
- we glorify the work itself over our approach to it.
- The more experience I get the more lazy I am. I constantly ask myself, “why am I bothering to do this?” and when I have a good answer to that question I completely throw myself at the thing, but until then, “what’s the rush?”
Complaining is a symptom
- Every time you complain what you’re really saying is “there’s got to be a better way of doing this that I don’t know about” or “look at this immovable fact of life I have discovered, wouldn’t it be great if the parameters of the universe were more in my favour?”
- Every complaint is just a sentence that’s missing the follow up sentence that explains how you plan on fixing this thing. At this point your follow up sentence is “there’s got to be a better way of doing this that I don’t know about” or it’s an appeal to the fact that you are on Earth for a limited time and you don’t have enough of it to fix this thing and “wouldn’t it be great if the parameters of the universe were more in my favour?” i.e. one of the two statements in the previous point.
- Save your complaining for things that really matter. Don’t complain all the timescos it’s childish and easy, negative and depressing. I can recall people sucking the life out of situations with one downbeat complaint: “Oh but we tried this before and it won’t work”, well tomorrow is another day and maybe it will work. So that’s my complaint 😀
Carrot and stick
- The way you get people to do stuff is to show them why they should.
- The converse of this is that when you’re hoping deep down that if you whine about something enough then someone will fix your problems for you then it’s not going to happen. You need to figure out a way of improving on the way things are done, then actually do it and show others it’s a better way of doing stuff.
Rome wasn’t built in a day – teams take time to gel, products take time to mature
- Lots of projects and teams are gung ho and full steam ahead. If you are successful in executing on some idea then there’s a long road ahead, years and years. Yet we escalate issues that are a massive priority right here right now, we must solve this thing, otherwise we are doomed.
- In project work it pays to step back and think why do we care so much about this thing again and in team relationships if two people aren’t getting on so well then think how we can slowly build a relationship if we work at it instead of ignoring it and in production we should question: perhaps we were wrong about this feature that we now have in production, we should get rid of it.
- Have *some* long term perspective and step back every now and again to see how far you’ve come and how wrong you were a few months ago. It’s healthy.
It’s OK to not have an opinion on something you don’t know much about
- You don’t have to know the answers to everything. It doesn’t make you less good at your job if you don’t know everything about say, the JVM. Well, maybe it does. But what’s worse is pretending you know something by offering some broad brush stroke on a topic that’s hotly debated. What this amounts to is people rallying behind some idea that can be harmful, for example, that slow compile times are a deal breaker on a language choice or that some certain approach to agile development just doesn’t work.
- It’s not about being right about these things, it’s subjective because there is a human element to “the right approach” or “the right tool”, the human element is that part of the utility of a tool or approach is the amount you know about it.
- Let’s imagine for a moment that you could categorically say that Ruby was a bad programming language for all circumstances. Does that mean that you should look down on people who have “fallen into the trap” of using it? Does that mean Ruby has had a bad impact on planet Earth? Taking the idealistic view that we can have such perspective on technology to know what’s absolutely good and bad, even still I think we can be nicer about people’s mistakes. I mean a) it’s so hard to evaluate a statement like “Ruby doesn’t scale up” because so much in technology is “it depends” and b) at least say something like “I found working with X hard because Y” not “X is crap because Y which will never change” because this is a broad stroke that implies little evidence due to its generality.
I’m a different person to who I was a year ago
- Take that into consideration in your decision making and when judging people. There have been a number of people who I have disliked at first and grown to like once I got to know them and vice versa. It’s important to see friendships and allegiances and opinions and ideas as temporal, try and build good ideas and relationships, but don’t desperately hold on to them when you change your mind about a person or a thing. It’s OK to become a different person, it’s not even up to you it just happens most of the time.
You might not realise the effect you have on people.
- We’re bad at telling each other how we feel. A big part of that is being scared that when you admit how you feel now, those feelings might change and then you will regret saying what you did. I think it’s better to say how you feel today and then tomorrow say it again, embracing that you’ll probably say it wrong or imply the wrong thing or even change your mind and feelings, it’s OK to change your mind.
- Most of the time we hold each other in respect. Remember that people care what you think of them and realise that you can inspire ambition or misery in others, motivate and deflate. You might not realise the effect you have on people.
Do the right thing
- A good dev doesn’t work faster, they do the right thing. This means understanding the problem that you are trying to solve, asking lots of questions and challenging the motivation behind the reasons for building something. All of this should happen before you write code, while you write code and after you write code.
- A bad dev does the wrong thing. Not just because their grasp of programming might not be great, but mainly because they do not question anything. They like instructions and they like carrying them out to a tee. This is a quick way to build the wrong thing. Compromise here and there, discuss this and that, and you can get to decent technological implementation of a decent portion of the business goal.
People program for a variety of reasons.
- It’s important to try understand people’s motivations so that you can empathise with what they want to get out of work.
- People program cos they like order and cleanliness. Because they like to make crazy things. Cos they like technology itself. Cos they want to learn the next thing. Cos they want to build a cool product. Cos they want to feed their families. Cos they want to buy expensive things. Cos there is a nice community and open source is cool. Cos they’re too afraid to try something else now that they have done it for so long. Cos they have a group of friends that they like working with. Cos a particular workplace is quite pleasant. The list is long but the point is that everyone wants different things and everyone should try to understand where each other is coming from, to best accommodate everyones needs and wants.
People aren’t aware of the power they have as a programmer.
- When I first started to code, I was so excited by the fact that I could *make* stuff *do* stuff. This is awesome. A computer is an extension of your imagination when you can code. Everyone can code to varying degrees of quality but *everyone* can code. When you work behind many layers of abstraction, be it a team that deploys your code for you or be it a team that manages you or be it a department that all work goes through before it gets to you, the excitement of *making stuff* is hard to come by and there is great power in this excitement. In an ideal world, we’d all build stuff without so many layers between us and the real world. Try to empower people with the responsibility they can hold – should they choose to (they should).
So many business people who don’t know tech and vice versa
- We get more and more specialised over time and optimise our skill set into a local maximum. It’s a shame that we don’t invest in people to spend weeks or months or years seeing the business from different angles. Instead we put people in between people so that they don’t have to learn something that they don’t know yet. Or we explain just enough of the business so that something can be built when we could let people see that part of the business for themselves and ask their own questions.
- The best people I have worked with are people who know more than just a thing or two about what other people around them are trying to achieve, e.g. a product focussed person managing stakeholders who can also code- they understand the trials and tribulations of day-to-day progress and how “velocity” isn’t necessarily indicative of the effectiveness of a team or the complexity of the problem they’re solving.
Every day is a new day, try not to carry the baggage of big long standing issues
- I often heard something like “we tried that before but because of X it will never work”. New starters often shed light on problems that others have gotten used to and now take for granted. But anyone can have that perspective. It’s very hard to have a fresh perspective but you *can* do it. Try and bring renewed optimism to work every day. It’s hard to approach problems from a different angle to the one you approached it with yesterday, but you can at least be aware of this fact and know that you are probably wrong in your approach to most things. Not completely wrong, but at least a little bit wrong.
We constantly try and figure out what people think of us but we just can’t.
- If you care then ask. Otherwise don’t act based on what you think others think of you. Try not to waste too much time inventing stories in your head about others and what others think about you.
- Bitching and gossiping can be really harmful. Not because it might get out and get round and then you feel embarrassed, this is not the biggest problem. The biggest problem is that we read into a set of events and imagine the motivations of people and are often very wrong about them. Over time we can build up stories of what we think is happening and eventually marginalise people, or demonise them or simply misread a set of events that are far more complicated than can be summed up in a short gossipy conversation.
Culture makes geniuses of us all
- The Renaissance in Florence was thanks to the Medici family and a renaissance in your company will come down to starting a similar culture. A culture of trying stuff out, learning from mistakes and challenging the convention.
- I’ve really seen culture bring the best out in people. You create the right environment and people will shine. The flip side is that certain cultures suit some more than others, and the difficulty is trying to cater to everyone. In order to cater for everyone, have a diverse group of people giving their say when it counts, e.g. when you’re deciding on new teams, or new seating plans, or new working hours, or new office activities, don’t do it in private away from the people it will affect, get people involved and their desires will hopefully be taken on board.
Transcend your petty grievances
- So many uber intelligent, experienced and motivated people demotivate themselves by wasting breath on little tiny things. Yes the coffee machine is broken again, is it really worth your breath and my ears for the 111th time? We’ll never attract bright aliens/ higher consciousness to our planet if we whine about this kind of stuff. Next!