27 February 2017

Time for Quality

Since one of my very first presentations in 2009 I have been asked how to make time for testing and code quality related activities. Keeping the code of high quality is difficult if your manager or product owner is only interested in deadlines and the number of hours spent on creating the software. People told me that in their organisation there is neither time nor budget for code quality and that their boss does not consider it necessary. While this is the perfect subject for an angry rant, this time I want to list some options instead.

First let me set the context for my answers:
  1. The demand for software developers and IT professionals in general is ever increasing. We are a highly privileged part of the entire workforce. While finding a decent job is always a (subjective but nevertheless real) problem, finding any work in software just to feed the family is not an issue. There is always another job.

  2. Testing is a mindset - you have to want it. There are thousand excuses why not to write a test or delay that particular cleanup. Some people pretend not to be allowed to create quality code, while they are just lazy. I would rather hear their honest views. I am suspicious of colleagues, who claim an interest in quality code but keep delivering crap on a daily basis.

  3. More often than the lack of interest is the lack of knowledge. For example many developers I meet are not sure how to write good automated tests, because they have written only a few in their entire career. Because they are unsure - they do not know how to start - they claim it to be time consuming and drop the idea. If I do something for the first time I will not do it well. Until I master the new skill I will be slow. These developers need training, more specifically they need practise. Every developer needs to be familiar with clean code, refactoring unit testing, and much more. If you feel not sure enough to apply these core skills in your daily work, ask for training, attend programming workshops at conferences or get a programming coach. Coding Dojos and Coderetreats are a great place to start.
So you want to write unit tests and are able to do it. But your boss has no interest in it or there is no team culture to do it. What could you do?

An argumentFirst read my favourite article of Joel Spolsky, Getting Things Done When You're Only a Grunt, which covers some organisational issues. Like Joel, I recommend staying true to yourself - just do it. This is hard in the beginning when you are alone, but others might follow. (It takes a lot of energy and several years to transform a whole team from within.) When complaints about your work start coming in you have several options:
  1. Do not try to defend yourself and avoid arguing. This is the way you work, end of discussion. Again, you need to be fluent and sure to be able to do that. Especially if you are a new employee you have some privileges. The team might accept your new style. If you are applying testing and clean code successfully others might follow.

  2. Argue for code quality. Sure you need some extra time to write these tests, but then you will not have to go back and fix the code again and again which results in less context switches, less defects and less hot-fix releases. I have not met any manager who would not understand that. But sometimes we (IT) do not use the right vocabulary to be understood by managers. When you talk to your boss, it is better to talk about cost, risk and financial benefit than technical issues. Using the management speak is a skill. Start by collecting hard facts about code quality related activities. Research the estimated cost and later benefit for your particular case and compare it to the risk and later cost of skipping it. The Technical Debt metaphor helps here. Create a simple Powerpoint (yes, blasphemy ;-) with these facts. End with the red traffic light or the estimated downward trend of the team's velocity. For example instead of "the code is ugly" you could say that "because of its inconsistent structure you are more likely to introduce mistakes when changing it." Charts displaying the absence of structure, e.g. class diagrams with edges all over the place, make the missing structure obvious for non-technical people.

  3. Silence, pleaseHide the activities. Push for code quality while you create the code. If you write the test before (TDD anyone?) or immediately after the implementation, writing unit tests is not visible as separate activity. The same is true for refactoring. Do not wait for Friday afternoon to clean up the code you wrote all week, because you might not have time for that. If you improve the code after each green test, there is no bad code even if you are forced to stop early. Further add the time for testing and cleanup to your estimates, but do not talk about it. I know some developers who estimate higher than others. Their estimates are accepted because their solutions are better and have less defects.

  4. Make excuses. Even technical managers do not know the exact details about the code you work with. Maybe there were some issues not anticipated during planning. There are always some. Communicate their (exaggerated) impact and argue that you needed some time to deal with them while in reality you had to restructure some legacy class to add to it.

  5. Finally, you can always find another job. Today you have more options than ever due to remote work.
There are several related questions on Stack Exchange which give more options, e.g. what do you do when your boss doesn't care about code quality or how can I convince management to deal with technical debt.

I wish you all the best for your quest for more code quality in your daily work!

25 January 2017

Interview Finn Lorbeer

Last year I ran a workshop at Quest for Quality, a young Devops and testing conference in Ljubljana. On of the speakers was Finn Lorbeer. During the conference dinner he helped me with suggestions for vegetarian food choices - the dinner was meat heavy unfortunately - which I appreciated a lot. I am not strictly vegetarian but since I talked to Carlos, I have reduced my meat consumption considerably. Now let's hear his views on meaningful work.

Finn, please take a few sentences to introduce yourself.
I am Finn and I work for a consultancy called ThoughtWorks. I am specialised in all aspects of building a high quality product. I analyse software as much as the team composition, the established processes, the business and data around it. With this heuristic approach I consult the ThoughtWorks teams themselves.

Feeding time in the free stallFinn, I know that you are vegetarian and concerned with preserving the environment. Why does that matter to you?
I am a sensible human being. Plus - and this is probably the differentiation - I do not close my eyes to what is going on in the world. I became vegetarian after thinking about where the meat that I was consuming (daily!) really came from. I ignored what marketing told me, and tried to be smarter than blindly believing what I saw in the supermarket. If you are really aware of how much suffering you inflict for you convenience, how would that not change your behaviour? It changed mine.

Years later, investigating more on the topic, I found out that it’s not only about meat. The entire animal farming industry is the root cause for a huge part of our CO2 emissions. Nothing in my private life has a bigger impact on the world's climate than having a vegan diet. I have no idea how people can get up in the morning being aware that with most of what they do over the day destroys the chemical composition of the atmosphere of our planet. So I guess they are not aware. And this is the main difference. It matters to all people, not just me.

What do you actually do regarding these things?
We are right now changing the chemical composition of our atmosphere and destroy our planet we live on. We are very close to a tipping point where the climate may change very fast. We have to stop this madness right now. And there is something everyone can do easily.

The CO2-Footprint of the beef of one burger is about equal to driving 100km by car. I neither eat meat nor drive a car. I organise film screenings about climate justice topics and I am in exchange with people from Ecuador, the US, Australia, China, India and more countries to think how we cannot only impact our private lives, but also our work environment.

What do you consider the biggest challenge (for humanity) of our times?
Again climate change. The poorest areas of the world already suffer the most. Syria experiences the driest times in history. Central Africa, too. They are already hotspots of wars and uprisings today. And we really wonder why so many refugees come from exactly those areas? There are fights between citizens and police in Mexico, because the people have no more access to fresh water. The arctic is melting at an incredible speed. While I love sailing, I would not enjoy sailing over the north pole in a couple of years.

What could we do to engage in these topics? For example, did you take part in public protests, donate money to NGOs or sign petitions?
I think the best thing one can always do is to lead by example. It is difficult to just sent some money somewhere. There are programs where you can donate money based on the miles you flew by plane to counterbalance your CO2 footprint. But studies showed that the people fly more when they use such services. They do not have a bad conscious any more, they pay to be free, and fly more.

Traffic JamI would like to see more impact on these important topics of my regular work by just working on "the right things". Do you think that is possible in general?
No. If everyone does this our economy and lifestyle breaks down. This is not sustainable. Many people need to work so that we have the money that some can do "the right things". This is the basic idea of any social system. So the setting is there, but the balance is wrong: e.g. broker (who do not create value in the economy) earn up to 100 times more than people in child care. IT people earn 10 times more than activists working for NGOs. We have to balance that better than we did before. But it’s unreasonable to think that we will all just work for social justice issues.

There are many decisions we take before and during a project. Which choices do you think are relevant? (The recent VW scandal is an example. Developers could have chosen not to commit fraud.)
I think that this sounds easier than it really is. Imagine that you are together with 200 developers at VW. And all 200 seem OK with tweaking the software a bit. The reasoning - everyone else does it, too - seems just OK and so you go along. What is the alternative? Stand up against 200 colleagues? It is rare to find so very, very courageous people. If this discussion is going on it’s too late already. There is little you can influence as an individual in a large group. The least you can do is to refuse to do it. Someone else will do it, but at least it was not you.

I believe that we all as individuals should work on a culture where such a discussion does not even start. If 200 people would not even consider an idea to manipulate their software, then no one dare to ask. If we build software "properly", we build it secure and with high quality. Both characteristics oppose fraud. I think here a positive attitude towards the (real) product you are building goes hand-in-hand with a guidance to what is right. One should never blindly code, like a code monkey.

How do you think about selecting industry, customer and project based on your values and social responsibility?
This is really difficult! There is something "bad" to find about almost any company. Twitter and Facebook create the little interests-spheres. Amazon tries to make us buy more than we want (and more than some people can actually afford). Uber replaces long-lived taxi companies. Amnesty International does only oppose small third world countries. But what do they do about big companies that are even worse than some small nations? Did Amnesty ever raise issues about Google and their mass-surveillance? No.

Do you have problems with any industries? Why? What about Porn industry or weapon manufacturing?
So while I think there is not "the" company to work for there are definitely some not to work for: companies earning money in tobacco, oil, porn or weapon industry are not worth looking at. They do actually nothing to improve our world.

I think I can work in the finance sector or insurance. Usually, those clients pay well. And this money can then be used for a better course, like helping programs that are working on the social justice mission.

There is a Waste ProblemDid you ever reject a customer or an actual project, that would bring you money based on your values?
No. But I never had a client or project that was totally aligned with my values either. As I explained above: while there is no perfectly aligned company, I never join or reply to offers, that do not fit with my values.

On the other hand, what would be industries, customers and projects that you would love to work on?
I am lucky to work for a company that shares some of my values, especially about social and economic justice. ThoughtWorks just released an open source hospital system that was built together with doctors in India. It is now being rolled out in Pakistan and Bangladesh. There were some developers working on it, so my part was simply to ensure we have the money to do so, e.g. by joining "any" project in Germany.

If I could choose freely, I think I would either go into the automotive industry or renewable technologies. Why automotive? We are at the brink of electro mobility. But our old, rusty German companies move really slow in this direction. I would love to help them get up to speed and get rid of their 130 years old model of explosion-driven-vehicles. A society that is mostly vegetarian and bases on electro mobility is be something I would be proud to be a part of.

Thank you
Thank you, too!

22 November 2016

Followup Global Day of Coderetreat 2016

This is an email I sent to all the participants of the recent Global Day of Coderetreat, Vienna. Because it applies to all participants worldwide, I repost it here.

Looking back at the Global Day of Coderetreat 2016
It is a month since you participated in the Global Day of Coderetreat. Let us look back for a moment. At the end of the day, during the final retrospective, you answered the questions
  • What you learned at that day?
  • What surprised you during that day?
  • What you planned to do differently?
Final RetrospectiveSome of you learned "new programming concepts" and that "it can be done in a simpler way". (These quotes were things you wrote on the Post-its on the picture on the right.) Others found new ways "how to split the problem". Several people discovered that pair programming was productive. You were surprised that there were so "many different ways to do the same functionality". But most important you decided to do things differently in the future. Here are some things that you wanted to do:
  • "Try TDD at work!"
  • "Learn more shortcuts!"
  • "Aim for simpler code!"
  • "Code more!"
These were just a few examples for the 21 things you wanted to do differently. Try to remember your personal plan. What did you write on your Post-it? In the last month, did you apply the things you learned? Did you do the thing you wanted to do differently? Did it work for you? We fall back into old patterns easily - changing habits is hard. If your first attempt failed, I encourage you to try again. Do not give up!

A box of things to take from the Coderetreat
At the end of the Coderetreat the facilitators, Houssam and I, talked about things you might want to try after the event. Houssam called it the "Box of things to take home".
  • Code Katas. Code Katas are exercises like the Game of Life. You can find many suitable exercises at codingdojo.org or codekata.com. If you like to crack some math problems I recommend Project Euler. It is a lot of fun!
  • Coding Dojo. A Coding Dojo is an event like a Coderetreat, just shorter. In Vienna there is the Coding Dojo Vienna. If you need for more practise this is the place to go. The dojo happens once a month. To get notified about upcoming events register at Softwerkskammer Gruppe Wien or follow #CodingDojoVie on Twitter. More information about Coding Dojo can be found in Emily Bache's excellent book.
  • Pair Programming. You can run your own practise session in a coffee shop or McDonalds. Talk to people in your company or at local meetups and find some like minded individuals.
  • Screencasts. Recordings of Code Katas, sometimes called Katacasts, are a great source for learning. This way you can (kind of) pair program with famous people like Robert C. Martin, J.B. Rainsberger, Sandro Mancuso and others.
  • For more details on how to improve your skills further, I recommend Houssam's (and Boris Gonnot's) article How to Boost Your Skills to Become a Better Developer.
Craftsmanship Community
Finally I want to point you to the Software Craftsmanship community in general. In Germany, Austria and Switzerland the local Craftsmanship communities are hosted by the Softwerkskammer. There is a group for Vienna and Linz. These communities run yearly conferences, the SoCraTes (Software Craftsmanship and Testing) unconferences. Currently we have SoCraTes conferences in many countries. In Austria the next SoCraTes will be autumn 2017 in Linz.

I wish you all the best for your future. You can do it!