I remember when I first started learning Elixir. It was a little over a year and a half ago.
At the time, I was living happily in the world of Object Oriented Programming with Ruby, a world where everything made sense to me. I knew how to use objects and methods and classes and inheritance and everything just felt right!
Then it happened. One fateful night, after a growing desire to dip my toes in the waters of Elixir, I decided to venture far off into unknown territory, into the world of Functional Programming. It was scary and unfamiliar at first, but also exhilarating. A world built on functions and processes and supervisors and concurrency. Everything was new and everything was exciting.
Before my adventure, I was in that state of blissful ignorance so many post-beginners find themselves in at one time or another. I thought I knew it all. I had mastered the world of OOP and, for a brief moment, I was both naive enough and lucky enough to believe that I had made it. I had mastered programming.
Oh how wrong I was.
That journey on that night changed me. It opened up my eyes. How could I have been so naive as to believe I had mastered everything in just two short years? How many other unknown worlds were out there? Just how vast was the cosmos of programming really?
And so now, almost two years later, I’ve decided to set out on a new adventure. Not to master every world, not even to visit every world, there’s not enough days in a lifetime for that.
I simply wish to map out the many worlds of programming.
The idea behind this post is that development is kind of split into many different "worlds" like you might see in a video game. And that we as developers can travel from world to world learning new skills (or stick to one world and master it)
I want to touch on of some of the different worlds of programming I’ve been introduced to (or at least heard of), as well as some of the key pieces that make up that world.
I’m not an expert in every single one of these fields, and I might put certain things in places you don’t agree with. Please let me know in the comments if you disagree with anything in the list. Also this isn’t complete, I’m sure I’ve missed at least half of the key worlds of programming out there. I’d love to make this a ‘community’ effort to map out all the worlds.
This is the most basic level of programming, the place where almost every coder, no matter what field they're interested in, starts. It is made up by the key components of programming logic.
- Data Types
- Basic Operations
- Conditional Logic
Probably the most popular paradigm in development. Object oriented programming is a method of programming whereby systems and applications are based on the use of different objects and how they interact with each other.
Functional Programming is on the rise, and it helps remove some of the key pitfalls of object oriented programming, such as the unpredictable nature of testing methods based on external factors (in-memory state) or thread deadlocks. Functional programming is based on the manipulation of data through the use of mathematical functions (1-to-1 input/output ratio.)
Low Level Programming is something I am not totally familiar with, as I've dealt with mainly higher level languages. The idea with Low Level programming is that you deal with data in a similar manner to how the processor deals with it, without all of the abstraction of new-age languages. The lower you get, the less complexity is taken care of for you, so you have to worry about things like memory allocation, pointers, garbage collection, and even bit manipulation on your own.
- Memory Allocation
- Bitwise Operations
- Machine Code
I could have just as easily called this world 'preparing for the interview.' This world is comprised of a lot of the stuff you would learn during college, and deals a lot more with the theory and mathematics behind programming than actually putting code into practice.
I learned to program at a bootcamp, so I'm lacking a bit of expertise in this area and I'm sure I missed quite a bit of the core components. Let me know if you think anything should be added!
- Data Structures (Sets / Stacks / Queues / Linked Lists / Trees / etc.)
- Algorithms (Binary Search / Bubble Sort / etc.)
- Big O Notation
- Space vs Time Complexity
Testing is one of the most important things you can do to ensure the quality of your code remains consistent. Testing code is a way to simulate the use of certain functions or features in your code with specific input or interactions, and ensure that the code does what you expect it to do.
- Unit Tests
- Integration Tests
- Mocks & Stubs
Data Management is the field that deals with how you store for your applications or services, instead of how you compute that data. In this world, you will find many different unique ways to store data-each best suited to specific situations, tricks you can use to speed up access to that data, and patterns you can use to ensure data integrity and avoid data loss.
- Relational Databases
- NoSQL Databases
- Graph Databases
- In-Memory Datastores (Redis)
- Data Integrity
Data Transfer deals with how you transfer data from device to device across the internet or other networks. A lot of developer stick to the high-level protocols and patterns that use abstraction to hide a lot of the internals of what's going on, but when you dive deep into this world there's a lot you can learn!
- OSI Model Layers
- TCP / IP
- Sessions / Cookies
- SSL / HTTPS
DevOps is somewhat of a buzzword these days, and there's a reason for that! One of the biggest bottle-necks in the web development process is getting the code that runs on a developers local computer up and running on a server and accessible to the world! Due to differences in environment, developers often face many problems and errors when finally deploying their code. DevOps is a branch of programming dedicated to best practices and tools you can use to ensure that the transition from local code to live code is as seamless as possible.
- 12-Factor App
- Automation Tools
Operations is all about how your code runs in the wild. On your local machine, you can often download programs that make it easy to store data, or run your code. In production however, you have to rely on custom servers or a variety of cloud services to make sure your app is accessible by users and runs consistently.
- Hosting & Domains
- AWS / Google Cloud / Digital Ocean / Heroku
- Firewalls & Security
- React vs Vue vs Angular
- Bootstrap / Materialize
- EMCAScript 6+
- Progressive Web Apps
- SPA vs SSR
This one is pretty self-explanatory. If you want to develop any apps for Apple's mobile operating system iOS, you will need to learn how to navigate the key components of this world.
- Swift / Objective C
- Segues & ViewControllers
Thanks @laurie for the idea for this world!
Architecture is the field of computer science that deals with how software systems are designed and interact with each other. Architects must have a broad knowledge of the different requirements of an application or service and be able to identify the right design patterns and organization techniques to use to ensure the service runs smoothly, meets requirements, and remains maintainable, expandable, and scalable!
- Code Patterns (MVC / Abstraction / etc.)
- Architectural Patterns (Microservices / Containerization / Client Server Split / etc.)
- Interdependencies & Coupling
Below is a list of worlds I know are missing from the list, if you have experience with any of them, please leave a comment with a quick description of the world and a few key components (doesn't need to be a complete list, just something to get started!)
Let me know what else you think is missing!
- Android Development
- Machine Learning / AI
- Game Development
This is an incomplete list.
Please feel free share any worlds you think are missing, as well as any of the core components of a specific world you think should be added, I will try my best to update the list accordingly.
I'm messing around with the idea of eventually building some sort of cool graphical website for the 'Many Worlds of Programming' with a brief introduction to each, the key pieces (as listed above), and links to some of the best resources out there for each individual world. Let me know if you'd be interested in using or contributing to a website like that!