Contemplating 2019
I spent the holidays in 2018 contemplating what my career in 2019 should look like. It has become a ritual to checkpoint my career every so often and try to figure out where to take it next. It has helped me identify what I want to do and then get all the proverbial ducks in a row.
This time my thoughts were still unresolved when the year turned over. I have been struggling with choosing the technology stack I really want to work with at my day job today while keeping an eye on where the industry is moving. I have been successful in identifying most of the stack. It includes Terraform for infrastructure as code, pytest for writing infrastructure and other tests, Kubernetes to run my day job's platform, and Ansible for configuration management. Other tools that I may need to work with include Jenkins and Prometheus. The final piece of the puzzle is the programming language to write all of the supporting code.
As I have written previously, I have been trying to give Go a try. My first experience with Go was good enough but I feel I'm not ready to use it just yet. Some incredible folks in my team, though, really want to adopt it. I've been feeling this pressure. I really want to continue to use Python both at work and in my side projects. Given my experience with Python and Go, I think I'm more suited to the former.
Not to say that I can't or don't want to learn Go. Recently, I did a tiny experiment by timing how long it took to run similar scripts in Python and in a Go-based binary. The latter was done executing way earlier than the former. There was no competition when it came to execution speed. Add the fact that the Go code was compiled to a static binary and it just adds to the appeal. This obviously didn't help allay my confusion.
I can achieve a lot with Go but the stumbling blocks I listed in my post linked above are real deal breakers for me. It doesn't mean that those I work with would find similar issues with Go. My confusion and vexation are compounded because of it.
I love Python. It's one of the many tools I have ever used in my career that I truly, deeply love to use. It has given me great opportunities to solve really complex problems quickly and easily. The community around Python is one of the most helpful. The language and its ecosystem gel with me unlike any other.
Python also has a great present. All sorts of people and teams are solving all sorts of problems using Python. Microsoft wrote their Azure CLI tool in Python, Instagram uses Django, YouTube heavily uses Python, Dropbox was until recently shipping its client software written mostly in Python; the list goes on. Python is also a darling of the data science community. It's used in Jupyter Notebook by scientists, engineers, and students of all skill levels. Because of these reasons, and because Programming Languages Don't Die, Python has a very bright future. It's highly unlikely that Pythonistas will abandon Python in an instant for something "better". Things written in Python will remain in use for a long time to come.
This does not mean that I can't augment my Python skills with Go. It just means that I have to pick the right language for the right team and the right task. My team writes some glue code around the various systems we work with. This code can be written and maintained very well if it was in Python. Folks in my team are experienced with it and don't hate it. It could be a perfect fit.
But not everyone looks at their career the way I do. Nor should they. We are working together for a period of time and then we'll split into different teams at some point. They need to be ready for the next steps in their careers just like I need to be for mine. We just need to figure out a way to make our current experience productive and happy. For this reason I am willing and able to take up Go or whatever else we can agree on.
I am greatly interested in data science and machine learning. I can see many applications for these skills in my current day job let alone what wonders the future holds. One way to get a step up in that respect is to build on my existing Python skills. I should spend more time learning the fundamentals of this field and less on learning some other orthogonal programming language. It gives me a better return on time investment.
The turning point in my confusion was watching a video on Twitter of a pilot flying within inches of mountainside to rescue an injured skier. The pilot's skill on exhibit in the video was breathtaking (literally, in my case). It made me think of these questions.
- How long has the pilot been flying helicopters?
- How long has the pilot flown this model of the helicopter?
- How long has the pilot been flying in that area?
- How long has the pilot been flying in that weather?
There is a pattern to the list of my questions. It took a pilot to become an expert in flying that helicopter, in that weather, in that area to rescue a person who needed that exact expertise at the moment. In other words, the skier needed a specialist in that situation to get the necessary help. I asked myself, "Am I an expert, a specialist? Or am I a generalist?" The answer, something I've known and strived for for a long time, is that I am a generalist. I have never found any technology interesting or productive enough to force me to become a specialist in. My career is laid out in an attempt to do different things in different teams, adding value in whatever way I could. I have never been a specialist in one stack or in one domain.
I realized that it's time for me to focus on a specific stack for a few years. I'm not giving up an open mind, I'm just focusing my time on certain skills. My team at my day job needs me for a specific role. I'm fortunate enough to be in a team where I have ample opportunities to propose and implement the stack that makes the most sense to me and for the job. This lets me be me.
I have decided to really dig deep into Python. 2019 is not the year where I will adopt Go in my side projects, and if I can help it, at work. I will write everything in Python this year: scripts, CLI tools, tests, etc. All of it will be in Python. I am happy to collaborate with my team on writing Go by reviewing their code, pairing with them as they write Go, and in any other way possible. But for anything that is authored solely or primarily by me will be in Python.
If you're reading this and you work in my team (Howdy!), don't be disheartened. I am not going to turn into a grouch. I won't become the obstinate coworker who refuses to change with the team. I will do everything I can to continue to be a helpful and productive team member. I do ask you, though, to help me in my resolve to only author code in Python this year.
I resolve to become a specialist in Python by writing different applications. I really want to write the following to expand my specialist skills.
- Use Capsicum (FreeBSD) & pledge (OpenBSD) with Python
- Write a mobile app and/or a macOS GUI app with BeeWare
- Write an Alexa skill with Tornado or some other async library
- Create a networking lab (even I have no clue what this means and that's the fun part)
- Write an IPv6 ISP in Python (pretend to be an ISP doling out globally routable addresses and so on)
I'm pretty sure I won't even scratch the surface of most of these projects. But the fun is in dreaming big and trying really hard. My biggest inspiration for this "reach for the stars" approach is Haywire project by Kelly Sommers. I want to give this an honest try.
I also want to take the skills I develop after work to the projects at work. Maybe then I'll be able to convince even more people to make the same resolve and write everything in Python. That way we can ensure the continued success and adoption of Python, a win for everyone.