Thoughts on Programming and Its Challenges

Posted by & filed under , , .

iStock_000016987294XSmall servers bitsAt the end of another tough week in Netflix I look back at what I have achieved and what has been challenging in achieving it. I do wonder what I do looks like from the outside and I can’t really see how someone would make sense of my job.

I sit in front of 3 (sometimes more!) screens and stare at code and scroll and stare some more! Occasionally I type things on keyboard. Then I stare some more. Then type some more things and a whole bunch of “stuff” scrolls all of a sudden in a few windows on my monitors. And I stare at them. Then I go back and type some more “stuff”. Repeat.

That’s basically it! 🙂

Here’s the thing though: writing software is a lot like the expansion of the Roman Empire, which was forged over a few hundred years and took every single battle and victory to get to the point where 1 in 5 people at the time lived in the Roman Empire. It wasn’t the First Samnite War that did it; it wasn’t the Roman-Syrian war either. And it wasn’t Punic Wars. Nor the Caesarian campaigns, or Trajan’s push into the East. It was the sum of all of these conflicts which altogether pieced one of the greatest Empires in ancient history.

Similarly, building software systems requires the same tenacity and conquering a problem one small battle at a time. A lot of these “battles” give small wins (solve libraries conflicts in your Gradle build, deploy a few Groovy ETL’s via Docker to sanitize your data, set up your autoscaling in AWS, port some of your caching to RxJava to gain that extra 10 ms per request). None of those individually paints a picture as to where you are heading — but put them together and your system is beginning to shape.

I spend lot of time staring over and over again at the same code base at time — code fatigue is an issue: how can you come up with different (better?) ways of doing things when you have become so familiar with the existing code base to the point that this is the only way something can be implemented? Then you take one small step in a different direction — at first looks like nothing, but that starts a whole snowball effect and all of a sudden your cache module has been changed entirely. Small victory. Then your data store now needs a bit of attention to take advantage of your caching. A few more days of “staring” at this and (what looks like) random scrolling and typing and then you have a fresh data store layer. Another small victory — yet you’ve still not moved your system that much down the path you have set for it. However, you have to start embracing and enjoy these small victories — it’s the sum of small victories which takes you to the finish line.

If someone asks me right now what I have achieved this week I will probably not be able to string a phrase that well together to explain it : “errr…. I deleted some stuff which was preventing other stuff from working then I put that into another branch and copied it over there and seems it’s working so then I added some stuff to get it ready to add the stuff which I’m supposed to do next week” 🙂 (OK, I’m exaggerating here clearly but if you are an outsider to my projects this is what I would tell you probably sounds like.) What this actually reads is “I have had 4 small victories this week”. And what it actually means is “I’m now ready for the big win/step next week”. And finally what this translates to is that we can release next week! All because of small victories.

It’s hard and sometimes I have to remind myself this, but it’s important when building (creating?) software to relish the small victories.