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 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
Object Oriented Programming
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
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
Theoretical Computer Science
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
Frontend (New Age)
- 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
I Need Your Help
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!
Top comments (15)
Nice post, but I think it should be called "Many worlds of Software Engineering" or something like that, as not all of these worlds are about programming primarly :) Website idea is definitelly good idea, looking forward ;)
Yeah I agree. When I came up with the title I was planning a list more focused on the differences between OOP, FP, Low Level and stuff like that, but as I wrote it the list expanded to something more broad than I originally anticipated.
I wonder if there's an even broader term, maybe "Many Worlds of Development" that could also cover certain aspects of design (UX, UI, Data Driven, etc.) and stuff like that.
Thank you very much for the article.
Most likely gonna be false, but I think the IOS world could be expended to a more general mobile development world (or if you want to keep IOS as a world, maybe create a galaxy) , with android development (kotlin and java, for what I know), and hybrid technologies (nearing from the modern frontend and SPA on this one, but anyway. ). The hybrid technologies could include nativeScript, react-native and flutter (sorry for those I didn't quote...).
Have a nice day.
Android was definitely one of the "worlds" I knew was missing from this list, I'm just not confident enough with Android development to write anything useful about it. I think I'll add a "Missing Worlds" section to the end to hopefully encourage the community to help me out.
I also really like the idea of organizing the worlds into separate galaxies, could apply to way more than just mobile development, and I like the idea of splitting the "mobile" galaxy into iOS, android, and hybrids (maybe call it "Progressive Web Apps?")
Hard real-time, it's an extension of low level programming, but distinct in that in general it has timing, safety and security requirements religiously applied.
E.g. Aerospace, Automotive, Industrial control systems
I like this.
Would you be willing to write up a quick description of it (nothing to crazy, just a couple sentences) along with a list of five or six key components so I can add it to the list?
The fundamental requirement of hard real time is achieving some specific task, in a specific amount of time.
Sometimes this is a repetitive periodic action. E.g. 1ms.
Or a deadline action, event x has happened, complete action y before time z.
All the timings will have a tight tolerance e.g. 1% or 3% of the target time.
This is typically used in control systems or monitoring systems.
Safety is due to the element being controlled. Usually with legal or industry standards to be applied.
Security due to malicious action on those safety systems.
Architecture! Design patterns, interdependencies, coordination. And I agree with Kral, many worlds of software engineering seems most appropriate.
Just added it to the list. Any changes or additions you'd make to the description / key components?
Looks good. I always think architecture has some elements of security. Mainly around understanding what is allowed to interact with what and securing those pieces. However, that's probably a section in itself!
Yeah security is a tricky one, it's mixed in with literally every other world but somehow also a world of it's own! But I think it's important enough to architecture to deserve a spot on the list.
I mean. You need to visit tooling & ops when programming but I'm glad you're refining domain concepts. Wait for years 5 & 10 😉
Oh btw control-flow is what makes OOP & FP (more broadly non-linear Dev) possible.
This is great! I’d love to also think of how these worlds are connected - what links exist between OOP, testing, DevOps, etc. Each of these “worlds” cannot exist without some or all of the others!
Yes, I agree with this! not only are they interconnected, but some of them change drastically depending on the others (testing techniques vary between FP and OOP, DevOps depends on what you're developing and how you're deploying, etc.)
What a great idea , really appreciate it,
I would suggest that to have a graph representation to describe each one of them