Reflection On 2019

A reflection on my software career in 2019.

tl; dr

I am disappointed when looking back on 2019. I could have achieved much more than I have if I had more discipline and drive. In 2020 I believe that the main thing I require to realize my own potential is to have a defined routine and stick to it.

What went well

As I am an extremely critical person, especially of myself. I think it is a good exercise for me to first start with what went well.

Recognition at work

At work, despite all of my protestations and supplied evidence to the contrary, I am praised pretty much universally for my performance. Generally my teammates, managers, and even former co-workers seem to go out of their way to let me know that I am doing a good job, or that I had some impact on their projects.

I believe it to be core to my personality to brush off compliments and to focus on what I can make bettter in my craft. While this has given me success in other disciplines, in the software world this trait can come off as obnoxious and even demoralizing to other people.

For example, I know my managers can be frustrated by me not accepting any compliments, and to simply tackle workplace problems as best as I can in determined silence. This results in a situation in which I as an employee am not providing adequate feedback for my manager to help me help us succeed as a team. Or I know it can also be demoralizing for our team to have done something like emergency maintenance due to a critical CVE coming out, or a release, and for me to only focus on the things that went wrong in our process and what can be improved. I need to understand that we are a system of people, more than a software system.

The compromise to be made here is to try my best to focus on the positives, before getting into the negatives.

Docker knowledge

I spend quite a lot of my personal time doing what I consider “catching up” to my peers. I recognize that I got placed into the type of job where juniours rarely are hired, and so I have spent a considerable amount of time this year just on Docker studying alone. I relied on two different sources to get myself started: Linux Academy, and Kubernetes The Hard Way. And I really started from the basics.

First I did an intro to Docker course on Linux Academy, and after that I tried messing around with docker containers on my own. Running a little “hello world” web app in a container, and also using a MariaDB container to power a side project that I was working on. Once I got my feet wet I went further into a Docker “Deep Dive” course to learn about more advanced container management, of which the most critical knowledge gained was how to create Dockerfiles. After learning to make a Dockerfile I churned out a continuous integration pipeline just to have a versioned web app container image as a toy project.

But I wasn’t learning Docker just to learn Docker. My team had a Kubernetes project in the pipeline and I was determined to get on it. So I did the Kubernetes Essentials, and CKA courses on Linux Academy to learn about what Kubernetes is about, and the basics of managing a cluster. I found these two courses a little bit light on detail and to not be as hands on as I would have liked. So then I followed Kelsey Hightower’s tutorial on Kubernetes. These three sources ended up complimenting each other a lot. The basic definitions were covered in Kubernetes Essentials, the “automagical” features of Kubernetes were taught in the CKA course, and Kubernetes The Hard Way gave me more familiarity with the actual nuts and bolts that gets a cluster working.

After all of this learning, I was fortuitously asked to assist with my company’s adoption of Kubernetes. I don’t know the depth and breadth of my NDA, but needless to say we are using the tool for some of the software we run. Here I leveraged EKS to build a cluster for us, but most of the legwork was done by a dedicated developer to make one of our apps and business workflows work in a transient environment such as Kubernetes. Building and running Kubernetes has convinced me that this is the future of software deployment. I am not so convinced yet that provided solutions like EKS or GKE are the correct way to go “at scale” for reasons such as large cloud computing costs and loss of direct control of the control plane. However, managed Kubernetes is amazingly fast and easy to get a project started at start getting value out of it as soon as possible.

For me, the Docker journey is still not done. My current project still has a couple of months to go, and I’m sure that this technology will be critical to the solutions I make in the future.

Linux knowledge

Leveraging Linux Academy again, I completed all of the courses required for the LPIC-1 and LPIC-2 certifications. I passed the example exams on this learning platform, as well as some sample exams, but did not proceed to get the certificate properly. This was due to:

  1. It seems like no-one actually cares about certifications.
  2. The LPIC exam format is multiple choice, whereas the Red Hat exam format is practical. As such I would prefer to shift my focus to getting something like my RHCE certificate, if at all.

I truly believe, though, that getting fundamental Linux knowledge has been immensely helpful in my job. After achieving (in my own mind) an LPIC-2 level of knowledge of Linux, my next step should be to revisit my more basic operating system coursework to gain a better appreciation of what my operating system does for me.

What went poorly

Oh, boy…

Software engineering knowledge

I have been frustrated since probably 6 months into my career that I am a glorified YAML engineer. I write Puppet manifests and Cloudformation templates as my bread and butter at my current job for the past 2 years. I have done infrastructure maintenance, disaster recovery, system architecture design, mundane systems administration, mundane network administration, continuous integration, continuous deployment, and even direct developer support. Many people have made their jobs out of this, but to me I think that the future for systems administration is in software engineering, and not in traditional administration.

What I have done in the past year is to touch the services that I am responsible for and add minor improvements to them. Adding a Prometheus library and creating proper monitoring endpoints, adding a logging statement where helpful, removing a logging statement where not helpful… But what this has resulted in is to just get my toes wet. I am not a software engineer by having written a few lines of code.

Just like with any discipline, I don’t think there is any magic towards getting good at something. It is simply the combination of:

  1. Hours put in
  2. Reflection on how best to apply effort to maximize learning

And simply getting a ticket which says “Add a metric for X to service Y” is just not enough to fulfil either of my requirements to get good at something. I am not spending enough time coding, and as a result of not spending enough time coding I don’t have much to reflect on. Further, it doesn’t help to gain deep knowledge if I touch Nodejs, Python, and Scala projects in the span of a month.

I actually find this extremely worrying. From the time that I finished my coursework, to now. After 2 years, it feels like my coding skills have atrophied.

And I saw this coming. So I would do things like Project Euler, Exercism, a side project (Repo deleted), and Leetcode. I would read the Golang tutorials, I would (try to) read textbooks on programming. But each time I would spend some amount of time (lets say 20-40 hours every couple of months) and then not actually achieve anything significant and proceed to fall out of my brief burst of motivation.

I am quite frustrated with myself to have let this aspect of my skill to have slipped through my fingers. And in 2020 I need to do better. It is especially painful for me as my current job is my first tech job in my career.

Going forward I have an agreement with my team lead for me to always have some coding tickets in my sprints. Even if they are bugfixes, or minor improvements. It is absolutely critical for me to actually get the hours in if I want to get any good at it. But, I am more cynical than that. I know there will be pressing issues to distract me from what I want to learn. If the company needs me to be a YAML engineer, then it is not exactly my position to argue against that.

So, what I need to do in that case is to really put my nose to the grindstone for learning (re-learning?) foundational software engineering. And I have a concrete plan for it:

  1. Take my intro to programming textbook Amazon Link, into the section with the data structures and learn each basic data structure by rote.
  2. For each data structure I learn, I will try to solve 5-10 Leetcode problems with that data structure tag. Not in Java though. Probably some more fashionable language like Go.
  3. I will read a couple of books on software engineering and attempt to internalize their lessons. The two I have in mind are: The Pragmatic Programmer and Design Patterns
  4. I will make a side project that is actually useful and code it myself. (I already have the idea for the project, I need to just realize it now)
  5. I will actually finish a track in Exercism.

I will achieve all 5 steps by March of 2020.

General lack of discipline

Starcraft 2

This year I got into the top 1% of Starcraft 2 ladder players. Again. I joined a competitive amateur team. Again. This was months of self study time removed from the calendar year for me to ramp my skills back up and then to maintain them. I stopped after eventually realizing that to get into tournament qualifying shape I would need to spend at least 20 hours per week on the game and that this simply would not fit into my schedule when factoring in exercising, commuting, working, and socializing.

I just need to cut this out. Starcraft is not fun to play when a player is either rusty or not particularly good. I’m not saying I need to cut out video games, but I am saying that this is not one game that I can juggle with my actual life.

Fitness

I have not regressed, but that is not good enough for me. My strength level remains shockingly steady, and my cardio level is also at the same unimpressive level it has always been. There was a period in the late spring/early summer in which I did manage to work up to deadlifting 170 kg, bench pressing 95 kg, and front squatting 120 kg all for 5 sets of 5 repetitions. But these are all numbers that I had achieved 4 years prior. The problem compounds when realizing that I put on 3 kg of body weight this year, and gained no strength for it!

During the periods in which I am not regularly exercising. I feel genuine melancholy and sluggishness. And this feeling extends everywhere in my life. I have made an improvement in 2019 over 2018 in my training consistency, but I am still a long ways off from my 2016 schedule of training 20+ hours per week. I don’t think I will get there ever again, but at the very least I should be weight training 5 days a week and doing cardio 2 days a week for 2020.

Alcohol

Alcohol is a social lubricant. It brings friends and strangers alike closer together. It introduces you to other people in the industry and helps you stay “networked.” Alcohol makes you feel great.

It is also absolutely awful for your health.

One of the things that made getting into a disciplined routine this year difficult was staying up late and drinking too often. This resulted in me having a variable sleep schedule which is bad for several reasons. Not the least of which being that it is hard to go to the gym before work if you are used to waking up at 9am, or generally performing poorly at work when slightly groggy from the night before.

My relationship with this drug will change to reserve it for special occasions only. I need to focus on more important things for now, and having a steady sleep schedule is a key piece of that.

As with anything, I need a real plan to address the above issues. But this one is pretty simple:

  1. Go to sleep and wake up at the same time every day.

Conclusion

I doubt anyone will make it all the way to the bottom of this post.

This post is more of a writing exercise for myself. To put my own thoughts into words and record them somewhere.

I don’t want this to be thought of as a new year’s resolution. It is not.

At the beginning of December 2019, I was already putting into motion my plans to properly learn to code. November 2019 was my most disciplined month in a long time when it came to fitness. Discussions with my managers on my career ambitions were happening already since October.

New year’s resolutions are notorious for not being upheld. This is not going to happen to me.

But I will probably write another one of these around this time next year :)