Blog & Projects

Things I Don't Know

Inspired by Dan Abramov's Things I Don’t Know As of 2018, here is my own list of things I don't know as a full-stack TypeScript / React developer after around 14 years of professional experience. These are skills and tools that I would probably benefit from knowing, but didn't get a chance to learn yet, or decided to avoid them for some reason. This is my way to identify my own weaknesses and potential areas of improvement.

DevOps and Infrastructure

Using Docker images for production: I pretty much only use Docker to help with local development and never deployed a Docker image to production. I've been mostly using PaaS and serverless functions to deploy back-ends.

Dockerfiles: I use docker-compose.yml to spin up existing Docker images such as databases, but never got into writing my own Dockerfiles. I played around with them a bit so I know that they extend other images to make custom images, copy files into the container and run commands, but I lack experience with them.

Microservices: I have never set up a microservices architecture myself. I know that messaging is the glue that connects them, but I am not familiar with the challenges and tools of such an architecture.

Kubernetes: I watched some tutorials of Kubernetes and I understand the concept, but I have zero experience making my own cluster. I would be interested in trying deploying one on a managed service like GKE with Autopilot.

Messaging queues: I played around with RabbitMQ, but never used it in a real project.

Job queues: I know the concept of job / task queues, but never set one up myself.

AWS / GCP: I have a deep hatred for AWS and hate GCP just a little bit less. These are the worst and most infuriating developer experience I've had in my career, and I want to stay away from them as much as possible. I also don't like the idea of lock-in and learning proprietary tools. It is undeniable that knowing how to use them is valuable and very profitable though. S3 is the only service of AWS that I use regularly.

Firebase, Backends-as-a-Service: Similarly to the previous point, I typically don't use BaaS, such as Firebase, because I don't like learning proprietary tools that lock me in to one private company's ecosystem. In terms of efficiency though, they are probably the shortest path from idea to production.

NGINX, gateways, reverse proxies, load balancers: I know that they sit between the client and the back-end and route requests, but I never set them up myself.

Unix / Bash: I know enough to get by, like navigating, manipulating files and processes, but my Unix knowledge is pretty limited in general.

Git: I can do basic clone, checkout, add, commit, push, pull, merge, rebase, stash, status, branch and log. For anything more advanced I'll end up on StackOverflow.

Programming and Tools

Other languages: I have used PHP, Python, and Java in the past, but I prefer to focus on TypeScript, to only need to know one language for front-end and back-end development. If I were to pick an other language to learn, it would probably be a low-level language like Rust, C++, or Carbon, mostly for game development.

Object-Oriented Programming: I have used OOP before, and I am familiar with the basics such as inheritance, private, public, static fields, constructors, getters and setters, but in the last few years I've been pretty much only using functional programming and composition due to React's model, so I am rusty on OOP.

Reactive programming: I think it's about processing a stream of event by using patterns similar to functional programming, but I have no idea what I would use this for.

Some of React's hooks: I read a lot about how you're supposed to list the dependencies of a useEffect hook exhaustively, but it still hasn't clicked for me. I just put the dependencies that I wish the hook to re-run on, and it always seems to work as expected. I know what useMemo and useCallback are for, but I rarely use them.

React Native: I played around with React Native and Expo, but never used them in a real project so I am not familiar with the challenges of this approach to building native apps.

Libraries and tools: There are a few tools that I am keeping an eye on and might learn if I feel like the moment is right, but didn't get a chance to try yet. These are: tRPC, Astro, Bun, and Deno.

GraphQL: I have been using GraphQL for all my projects for the past 4 years, and I love the typechecking and fetching only the data I need, but I am designing my APIs "wrong". I am not leveraging the fact that you can have resolvers at field-level instead of type-level or query-level. For this reason I rarely ran into the N+1 problem and didn't get a chance to implement data loaders.

JavaScript / TypeScript: I never use Map or Set, generator functions (function* and yield), and proxies. I am also not very good at typing, particularly when it comes to authoring a library. I can use generics but my knowledge is limited.

Database indices: I know that they are used to speed up queries, but I don't know how to manage or use them properly.

CSS Grid: Even though I started my career as a front-end developer who wanted to know all about CSS, I almost never used CSS Grid and I know I am missing out. I've been using Chakra UI's Simple Grid component, but I should know how to use raw CSS grids. It also took me forever to start using Flexbox.

Closing words

I am probably missing a ton of other things, but these are the main ones I could think of right now. For topics that are somewhat related to game development, I will learn them as part of my learning web game development journey.