Developing Software The Right Way, with Intent and Carefulness
This blog post / write-up is long overdue. I’m the guy that’s gone from electronics and hardware person, to embedded software, software, networking and now back to software with a keen interest in programmable hardware. Whilst I haven’t had to quite start from scratch in software again, it’s been a long journey to get proficient. Therefore, perusing Twitter, Facebook, Reddit, conference notes and videos, occasionally something comes up which is interesting. Psychologically, coding is interesting (note how no-one says programmer any more? Who writes programs?). It gives away something about your personality, current learned/learning state and your happiness levels. It gives away how you view the world and how you handle danger. Seriously. I can hear those thoughts that say “Whatever dude”. Look at how some developers handle failure prone code. Do they check for errors in a shotgun style approach, or with the accuracy of a sniper?
What caught my eye back in January was a Tweet from one of my coding heroes, William Kennedy. The top one started a thought process off that I’ve been chewing on for months. Below is a transcript from an exchange on Twitter.@goinggodotnet Thinking about the diff between ignorance vs carelessness as it relates to writing software. These two words have very different realities.
Replying to @goinggodotnet Can one also tell the diff between “I’m still learning” vs ignorance in code? Luck plays a huge part in both of your args.
Replying to @VTEP42 I think this comes out during code reviews. It’s something each of us must check against ourselves. It’s tied to attitude.
Replying to @goinggodotnet @VTEP42 But how we think about and handle errors can be an indicator. Integrity and Resilience in design and code can be a marker.
Replying to @goinggodotnet @VTEP42 so maybe when we see something that raises a flag, should we ask the question of ignorance vs carelessness? This can help us improve
Replying to @goinggodotnet Will employers pay for carefulness and informed employees? Are these habits “more for less” symptoms?
Replying to @goinggodotnet Got me thinking hard about this. I really should be asleep 🙂 It’s 1am for me!
Replying to @VTEP42 IMO I think carefulness should be expected and demanded. This needs to be nurtured and instilled inside the culture.
Replying to @goinggodotnet Writing good idiomatic software is hard and requires dedication. Explicit carefulness over implicit outcome of dedication?
Replying to @goinggodotnet I may have to write a blog post on this. So many thoughts, grievances and views
Replying to @VTEP42 That would be awesome. I’m just in the early stages of incorporating these ideas into my classes. Please write your thought down!
Replying to @goinggodotnet @VTEP42 Been looking for that other dimension and I think it’s Intent. Does carelessness require intent and without intent is it ignorance?
Replying to @goinggodotnet @VTEP42 and are their exceptions when carelessness is a valid choice or the right decision?
Replying to @goinggodotnet @VTEP42 when ignorance is acceptable, intent determines validity. When it’s not, intent determines a measure of degree.
Replying to @goinggodotnet Hrmm. Without intent and carefulness, become a Java programmer? snark ok. That’s not fair, but a little funny perhaps.
Replying to @goinggodotnet [1/2] Could carelessness with intent reveal ignorance and reveal the need to be careful if intent is not met?
Replying to @goinggodotnet [2/2] But then aren’t design specs not intent? So ignorant towards requirements as well as the code?
Ignorance, carelessness, carefulness, resilience, integrity, intent…lots of meaningful words that you might not immediately associate with coding. Also how these apply to someone’s job, salary and general well-being differs person to person. It’s clear to see my 1am ramblings are the equivalent of ‘spray and pray’ thinking. Thought provoking never-the-less.
Is it possible to be ignorant and careless simultaneously? Ignorance suggests you do not know as opposed to ‘ignoring’ what you know better than. Being careless suggests you do know but either intentionally or accidentally failed to employ carefulness.
noun the state or fact of being ignorant; lack of knowledge, learning, information, etc.
Integrity is multi-dimensional. Do you build something with integrity? Do you display integrity for your employer or project that you contribute to? What even is integrity? Is it the same as honour? What do you then honour? The unspoken commitment of intent to build something with integrity? Open Source software brings out the best in us and working in a good team can do the same. Will an informed employer (being aware of what makes good employees and their requirements to help them flourish) pay for these attributes or are win a concrete agile mindset? Concrete agile mindset you ask. One that says “throw enough devs at a situation, who will add code like laying bricks…”. An older saying goes something like this:
Give a monkey a typewriter, at some point it will type something legible.
My personal favourite:
Throw enough typewriters down the stairs and at some point one will type a word.
Call me sceptical, but the statements above align with the rough view of the gig economy and the use of ‘builders’. Whether that’s software, mechanical projects or the construction industry. I’m not sure if William Kennedy had these thoughts in mind whilst Tweeting what came out in January, but it touched a nerve and I started looking at patterns.
As we all start thinking like ‘game changers’, ‘entrepreneurs’ and try to avoid thinking we’re employees who are being played to think more independently and like wider contributors, is there a formula to help us through our gigs? A code? Being agile, employing methodologies like Scrum are great, but without extra dimensional thinking, all we’ve done is traded one set of problems for another. Sure, we can generate output aligned with business requirements faster, reduce big bang release problems, but are we actually improving things? Bugs come and go much quicker and our user acceptance has changed. How many times a day does your phone do something strange and you discard it as a ‘snag’? An app does something odd but you shrug it off. Bugs are bugs and forever present, but our acceptance and understanding of software is changing which could mean the results of all of our efforts to improve software development are biased. The more we consume, the fast we consume, we shrug off niggles in favour of 80/20 usability.
Intent could be the dimension we’re all looking for. Do these work?
- Intent + Carefulness = Output with integrity
- Intent + Carelessness = Ignorant output
- Intent + Ignorance = Careless output
One of my life missions is to assist networking people learn to code and apply software ‘building’ skills to the networking field. Helping them do it the right way is the hardest part. If you understand networking protocols, without a doubt coding is in reach. Doing it the right way without shrugging off responsibility (vendors I’m looking at you) is an attribute I’m keen to ingrain in to learners who want to embrace the world of network programmability and automation. That attribute is the combination of intent, carefulness and ownership.
Intent + Carefulness + Ownership = The Ability To Achieve Anything
The matrix below was input from William Kennedy and points out an excellent visual representation of some of the points made in this post.
I really care about how people approach software development. It’s strange the things we align with, but this is certainly one of them. As eSports rise in popularity and people watch others playing video games, reading code and watching how something organically takes shape is nothing short of fascinating. A huge amount of your personality and thought process is open to read.
It’s so easy to be ignorant towards development but it’s much harder to be careful. Careful involves learning the skills required to do something well. Not just good, but well. It removes your excuses for ignorance and carelessness. Add intent, with carefulness, you now have a driving goal to hit with self-prescribed honour. When it comes to measuring honour, allow yourself to be measured both professionally and personally. Peer code reviews and feedback sessions not only provide a great measuring stick, but also can help you to better yourself. You might be thinking “hey, I’m a great person, I know I do things well”. My advice, even when working on your own projects, seek out a reviewer. It’s something I’ve come to accept for my own projects. It starts off a bit daunting with thoughts like “it’s mine, all mine, I don’t want anyone else’s input”, but it will add extra focus, validate your intent and prove that you’ve been careful and informed. Not only do you get help, but you get to help others and learn from their experience too. If I would have listened to my mentors more over the years, I would have learnt far more from others.
One final thank you to William Kennedy for your input, reviewing and passion for this subject!
- Tags: Software Development
- Categories: Software Development