It is the end of the year and the end of the decade. We are at a turning point at Pixelmatic, so I thought it might be good to do a summary of these last 5 years being the CTO of Pixelmatic. And in a future article, I'll mention my ambitions and wishes for the 5 next ones.
First thing first, my CTO role has constantly evolved during the period. In 2016, our team was small hence I had time to lead and contribute. Now in 2020, the Pixelmatic team is more than 40 members with nearly half of them on the engineering team. So my role has switched more to a management and support role. This has not been easy, and I still have a lot to improve especially on giving regular and proper feedback to my collaborators, but I have been taking courses to improve.
Then in technical terms what happened to me during these 5 years? Well, thinking about it now, quite a lot. Here is a non-exhaustive list:
- Python, through our partnership with Super Evil Megacorp on Vainglory, I had to go deep into Python, which I was not familiar with before. Coding in a proper pythonic way (as they say) is something that needs practice. But anyhow I don't regret it, Python is a nice language with a simple syntax. It's also pretty convenient for scripting instead of bash from time to time.
- Go, as we were using Sensu for monitoring I came up with several tweaks and custom plugins to fit our needs and learned Go for that. Also, I debugged some Terraform provider issues directly in their source code. Go is an efficient language as it is compiled. It also has a very mature environment and tools that make development easier. This is for these reasons we decided to use it for our back-end platform of our game Infinite Fleet.
- Ruby, because of Sensu as well, initially a lot of their plugins were written in Ruby. I also experimented with Ruby on Rails and also Lita the chatbot. To be honest I like the syntax of Ruby and I hope to come back to that language someday. But not with Ruby on Rails which I did not like because it's meant to control everything both front and back end code as a whole.
- Angular I started by learning AngularJS because I wanted to customize the UI of the Sensu dashboard. And I quickly liked it. As an evolution, later on, I got into Angular 2 and from there we developed all of our websites using Angular. Coming from PHP world previously, I liked the separation between the front-end and the back-end. Plus the front-end is now fast out-of-the-box. We could have picked React too maybe, but frankly, first I am not fond of Facebook, so I am kind of reluctant of using their tech, and also, Angular is pretty opinionated which I think is good for juniors and starting projects. React is on the opposite super flexible, which IMO can lead to chaos with an inexperienced team.
- Typescript Doing the switch to Angular 2 got me into Typescript. And while I can understand the critics, I do like it. And I would likely put it as my favorite language for web development now. Actually, while we started using Angular 2+ for the front-end of our websites, we also slowly transitioned to use typescript in all our backend to have a more homogeneous codebase across our projects. To be honest, I like C# and Typescript, so I think that kinda makes me a Microsoft fanboy maybe.
- Terraform It's a neat tool that allows you to literally code your infrastructure. Then from a simple command, you can replicate any infrastructure you designed anywhere else (within the same cloud provider though). I would advise you to use it in any case where you regularly repeat some operations to recreate some infrastructure. It will make you save quite some time and make sure you have consistency and avoid human errors (which are often the origin of most outages).
- InfluxDB At some point I needed to store time-series data. Graphite looked old to me. And I encounter the young and fresh InfluxDB. While as a not mature product at that time we had some instability, it was promising and the developer experience was good. Recently we picked it again to store some metrics for Infinite Fleet, and I would advise you all to give it a try whenever you store time-series data.
- Sensu, As I mentioned a couple of times already, we used Sensu in the past for our own infrastructure but also for Vainglory. Using open-source software was great because we have been able to customize it as we wanted. But with heavy customization, comes more maintenance and difficulty to upgrade. You should also consider the cost of having a self-hosted monitoring solution. Sensu has evolved since we used it, and I cannot tell how better it is now. But if you are on a tight budget, I would give it a try. And to be honest we are likely to give it a second shot for Infinite Fleet as we are deprecating our custom monitoring solution.
- Datadog as I was just talking about Sensu, Datadog is a similar monitoring solution but centralized and proprietary. It is obviously faster to deploy and use, they have great customizable dashboards. The overall user experience as a developer is great. The only drawback is having centralized monitoring servers it means if your own servers have a bad connectivity with Datadog's ones, it's going to be a problem (but maybe they have some solutions for that). Also, it is fairly pricey. So to sum up, if you have a budget I would suggest to try Datadog, and if you have time rather than money, prefer Sensu.
- SEO optimization We worked a lot on SEO optimization on all of our websites. There are plenty of tools and requirements for your websites and I think I'll do a tutorial one day to list all the tools and techniques we use.
- Docker If you don't know what is Docker yet. I would just suggest you stop reading that article and dig into that right now. Docker is the best thing that could happen to a developer computer. You don't need to clutter your computer with X version of this or that anymore. Only Docker, a shell, and an IDE. It's a space and time savior. You can test upgrading the version of any framework or tech you use, without breaking your app, and rollback super easily if it's not working. And deploying docker containers on a server is super easy as well. Combine it with Docker-Compose and you can deploy complex software infrastructure pretty easily.
- Kubernetes When you deal with containers in production, using docker and docker-compose, the first thing that will notice is missing is scalability. This is where you start looking for a solution and find out about Kubernetes. Kubernetes is great when you have quite a lot of services in your infrastructure like us with Infinite Fleet. If you have just one or two websites, I would more suggest using Docker, Packer, and the autoscaling groups in AWS or similar.
- Strapi To me it is a real modern CMS. Hell to WordPress and Joomla or others. Strapi is a headless CMS, super flexible and it just serves a RESTful API. And it works great with Angular (or Vue/React of course). So just stop using WordPress people and just get Strapi with some cool front-end.
- Phabricator After using Gitolite for quite some time, we wanted to get a more complete solution. At that time, we picked Phabricator. On paper, it looked great, it has git and svn support and a lot of tools included like tasks management, project management, wiki, documentation, audit, code reviews, ... But after some time, we quickly stopped using all of its tools to only use the git and svn repos purely. And why is that? Because of the UX, that is too heavy. A lot of required input and clicks to do for almost anything. There are plenty of free tools with great UX outside that just outperforms all of their tools individually, that just made everybody on the team flee their all-in-one solution.
- Gitlab When we started the production of Infinite Fleet, we decided to get rid of Phabricator. We tested three solutions: Gitea, Gitlab, and PlasticSCM. Gitea has been quickly rejected because of some deployment difficulties we had to set up everything, including Git LFS. After testing PlasticSCM for a month, we were not super happy with the client UI and its complexity, so we finally decided to go for Gitlab. And it has been great so far.
- Nextcloud It is like Dropbox or box.com but self-hosted. It has also an encryption feature and a lot of plugins more or less useful. So it's just great for company internal file sharing and archiving. Also, the day your cloud service is down for X reason, Nextcloud is still up and running properly on-premise. For daily non-confidential sharing files, I would still recommend just using Slack though. Faster and easier.
- Bitcoin / Liquid / Lightning Hum not sure where to start with Bitcoin, but obviously, it impacted a lot of things in the world. Regarding us, we are using Liquid, the Bitcoin sidechain, for our STO as well as for the in-game currency of Infinite Fleet. I used Python to build tools for us to issues our tokens and maintain them. We also implemented a solution using OpenTimestamps to add a way to make the history of our virtual items provable.
- Unity DOTS/ECS Infinite Fleet is an ambitious game where we want to fit in as many units as we can. From that, using the best performance tools just made sense to us. Burst and Jobs are pretty straightforward. ECS is something else. Using preview packages from Unity comes with some inconvenience, but things are getting stable. The main challenge for one engineer when starting to use ECS is to change his mindset. Designing the data instead of the object needed is different. And sometimes there is no equivalent. For example, there is no consensus on a good solution for implementing a simple and efficient FSM in ECS. Dealing with user input and UI is also different as we are no more dealing with events. But once one gets around that it is just better, say goodbye to spaghetti code. It also makes code more generic and more SOLID.
- PyTorch Quite a lot happened in the AI field during these last 5 years, and I feel that Deep Learning and ML are still not used that much in games. So when I had a chance to try something on Deep Learning, I chose to experiment with PyTorch. It was for a project related to Vainglory. We built a prediction model for guessing the winning team in a match based on player profiles and matches. It was 90% accurate on our dataset of 28K matches. Not too bad. But could have been better maybe with more time. We started experimenting with it for Infinite Fleet also but we will do more on that in the upcoming year.
To sum up, if I had to pick 5 things that really changed my way of working during these last 5 years:
- Docker and by extension Kubernetes made my work computer more healthy and stable,
- Gitlab, and by that I mean having a proper workflow for code review and merging commits into our products, we are thriving for code quality here,
- ECS and Data-Oriented Design are not just about performance, it's also a cleaner and more SOLID way of coding, IMO it's kind of the logical next step for any people who want to write good code,
- Bitcoin didn't impact my work life per se, aside it contributed indirectly to our fundraising via our STO. And I do believe it's a revolution that is changing the world for the better,
- and finally Slack, not a developer tool, but I really use it a lot and it saved me a lot of time. Not only for chatting, but also for taking notes, sharing files, reminders, documentation, and also games (like werewolf haha).
Thinking about all that, makes me realize that more than ever in our jobs it is essential to be always learning and adapt to new situations. I wish you a Happy New Year 2021, and in a future article, I'll describe what I want to keep working with, what I want to experiment with, and what I want to get rid of in the next 5 years. In the meantime, drop down below in the comments the top 5 software that changed your work life.
Did you find this article valuable?
Support Sonny Alves Dias by becoming a sponsor. Any amount is appreciated!