The Many Worlds of Programming
Tags: webdev, learning, beginners, programming
Published: 2019-02-12 01:10:45

---
title: The Many Worlds of Programming
published: true
description: A look into the many worlds of programming and the pieces that make them up.
tags: webdev, learning, beginners, programming
series: the-many-worlds-of-programming
cover_image: https://thepracticaldev.s3.amazonaws.com/i/jf0pldgkw08rxokdhsy1.png
---

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. 

No. 

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.*

##Basic Programming

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. 

**Key Components**

1. Data Types
2. Variables
3. Collections
4. Basic Operations
5. Conditional Logic
6. Iteration

##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.

**Key Components**

1. Classes
2. Methods
3. Objects
4. Inheritance
5. Polymorphism
6. Abstraction
7. Encapsulation

##Functional Programming

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.)

**Key Components**

1. Functions
2. Processes
3. Supervisors
4. Concurrency
5. Recursion

##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. 

**Key Components**

1. Memory Allocation
2. Pointers
3. Bitwise Operations
4. Assembly
5. Machine Code
6. Binary

##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!*

**Key Components**

1. Data Structures (Sets / Stacks / Queues / Linked Lists / Trees / etc.)
2. Algorithms (Binary Search / Bubble Sort / etc.)
3. Big O Notation
4. Space vs Time Complexity

##Testing

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.

**Key Components**

1. Unit Tests
2. Integration Tests
3. Mocks & Stubs
4. Factories
5. Benchmarks

##Data Management

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.

**Key Components**

1. SQL
2. Relational Databases
3. Indexes
4. NoSQL Databases
5. Graph Databases
6. In-Memory Datastores (Redis)
7. Data Integrity

##Data Transfer

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!

**Key Components**

1. OSI Model Layers
2. TCP / IP
3. HTTP
4. Sessions / Cookies
5. SSL / HTTPS
6. REST
7. GraphQL

##DevOps

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.

**Key Components**

1. 12-Factor App
2. Git
3. CI/CD
4. Automation Tools
5. Docker
6. Kubernetes

##Operations

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. 

**Key Components**

1. Hosting & Domains
2. AWS / Google Cloud / Digital Ocean / Heroku
3. Linux
4. SSH
5. Firewalls & Security
6. Logs

##Frontend (Fundamentals)

Frontend is a word typically used to describe the client-side environment of your application on the web. Put another way, the frontend is *what the user actually sees.* In the old days, this typically meant HTML files with some CSS, and a little bit of JavaScript to handle some animations and calls to the backend. A lot has changed since then, but this world is still as applicable as ever, and will teach you a lot of the fundamentals that will help you grow as a developer.

**Key Components**

1. HTML
2. CSS
3. Javascript
4. JQuery/AJAX

##Frontend (New Age)

Recently, frontend development has experienced a pretty radical shift from the old days of HTML, CSS, and JavaScript. This has happened as a lot of tools, standards, and frameworks have been developed or implemented that speed up development by taking care of a lot of the common features or problems that you used to have to code by hand.

**Key Components**

1. React vs Vue vs Angular
2. Webpack
3. Bootstrap / Materialize
4. EMCAScript 6+
5. Progressive Web Apps
6. SPA vs SSR
7. Redux


##iOS Development

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.

**Key Components**

1. Swift / Objective C
2. XCode
3. Storyboards
4. Segues & ViewControllers
5. UIKit
6. CocoaTouch

##Architecture 

*Thanks [@laurie](https://dev.to/laurieontech) 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!

**Key Components**

1. Code Patterns (MVC / Abstraction / etc.)
2. Architectural Patterns (Microservices / Containerization / Client Server Split / etc.)
3. Interdependencies & Coupling
4. Coordination
5. Security


## Missing Worlds

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!

1. Android Development
2. Security 
3. Hacking 
4. Machine Learning / AI
5. 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!*