A collection of principles I value and lessons I learnt the hard way during my work as a CTO. Also describing what I want to foster when building my team. You may agree or disagree with some pieces - that's fine! Some aspects depend highly on the specific (work) context. Also, as I'm learning, too - I may adapt some thoughts over time 🤓
Some of the below thoughts may sound trivial, but behind every item there's a story and a problem that I was confronted with in the past - that's why I decided to include them. If you want more of this, I really enjoyed the Book Amazing CTO by Stephan Schmidt as a great source of inspiration.
We leave every place in a better state than we found it. We take ownership for our tooling, codebase and related systems. We keep it clean, organized and do constant housekeeping to adapt changes of the universe easily.
There's a famous quote of Kent Beck, saying:
For me, following the scouting rule often times sets up good preconditions to make change easy at any time, thus make easy changes possible. Being aware of it sounds trivial, but is often not practiced enough!I love theory. I can talk about Computer Science and Math theory all day long. But: When it comes to a shipped product, pragmatism is an extremely important characteristic of engineering work. Of course, always take theoretical considerations into account, but iff something doesn't work in reality, adapt, adjust, try and iterate.
Fighting all day long about tooling preferences and superiority is boring and meaningless. Everyone has her/his preferences, all programming languages, frameworks, code editors and build tools are awesome and lovely somehow. Kudos to all the people who contributed that we have such a plethora of options to choose from 💚. If we're are not happy with our tools, let's go ahead, submit a PR to fix it or invent something new!
Success, improvements and change never come automatically. There's hard work and diligence and consistency to invest. Without it, your systems slow down and start grinding. Keep moving, be consistent and keep investing energy constantly. (I am not satisfied with the english terms. The German term with its semantics nails it for me, that's why I named this section this way 😉)
This should be obvious, but we need to recall this very often: All we do is team work. We never expect superpower monster work from individual contributors. We approach everything with structured, consistent work. Divide and conquer. Togetherness is a superpower to exploit.
We all have our struggles. Do not hide it - amplify it! Learn from errors or weird first approaches. Share your uncertainty, often this leads to fruitful discussions. Openly express your thoughts in a humble way. Be able to disagree and commit.
I want to create a system where Software Engineering and Data Science Work is a pleasure and satisfying thing to do. Lets work on our tooling, our structure and our processes every day. If something is constantly getting on our nerves, let's think of how to change this.
Play with (y)our system. Be creative. Seek elegance and sometimes poetry. Well-dosed irrationality leads to unique solution paths. Learn the thin line when to do it and when not. Challenge the industry standard sometimes!