Everything that is built in industry today is in fact taught at your school. You just need to be able to block out the marketing fluff and know the fundamentals. A lot of times students ask me, or declare, or tell their juniors ‘you learn to learn at college- all this knowledge is not applicable in real life’. I want to dismiss this notion and also explain how this magnificent and exciting field of computing works. Of course it is a gross simplification but I assure you that grasping these fundamentals will set you up for future success.
I used course names from my Bachelor’s degree back in 2004-2008 but it still holds true. Some names differ from university to university.
Ready? Lets do it!
To achieve something of value, you follow some steps to take information you have and convert it into new information. For example, if you want to go from LA to Sf, you take a map, chart a route and make a plan. You learn all this in school. We can work these steps faster by using computers who follow simple instructions. Learn about this in ‘intro to computing’.
So, You write a set of instructions called a computer program. Most programs need memory to hold data temporarily or permanently. In our case it needs the map, and it needs to hold some information while it performs those steps.
Temporary data is held in variables or constants. Things like ‘x=42’ or ‘name=‘elon’’. Permanent data is stored in ‘files’ for example ‘inventory-store-2012.dat’. It then performs instructions on this memory. This is done using a ‘computer language’. Almost any language will do so stop fretting about languages, Learn about instructions and memory in Computer Programming.
Now, Programs have a state, which is a snapshot of its memory and instruction it is at. For example, if I give you a map of SF and ask you to give me a route from MoMA to Golden Gate bridge, you will open the map and start following some intuitive set of instructions in your mind to find the route. If I stop you at any point and ask you what you have done so far, whatever you tell me is your state.
It could be in-memory state, or it could be persisted elsewhere for long term. When you are playing a computer game, which is also a program, your character’s position, your score, your health and karma are all stored in-memory. If you plug your computer off it is gone. But the high score leaderboard is persisted for long term. You can also ‘save’ your game which basically takes a snapshot of your memory and saves it. Learn about persistence in ‘Database Management Systems’. State can be hard to manage. One way is to think in terms of objects so Object Oriented Programming course is for you. As code grows, you need better ways to manage your code itself. Learn about this in Software Engineering which also teaches other things like requirement gathering, testing, design patterns, etc.
How you represent information is crucial. Searching for your friend in a list of 200,000 names when they are not sorted will take time. If they are sorted, you can use binary search to find it quicker. If you index these names, its even quicker. Data representation is taught in Data Structures. Efficient steps to process that data is taught in Algorithms. Underlying principles of all this is in Automata. Fascinating stuff.
So, Programs run as a process on a machine. A process is executed on a CPU (learn about components of a computer in CS101 and history of computing). An operating system handles this scheduling of multiple processes on a single machine. Processes talk to each other using IPC and RPC. The operating system ensures proper usage of hardware resources(CPU, RAM, video processor, network adapter, power, etc). Learn about this in Operating Systems.
Operating systems make available the underlying hardware resources. Different needs require different hardware. Learn about how simple on/off switches, transistors, registers, circuits work together in Digital Logic Design, Computer Architecture and Assembly language programming.
In order to convert your code to something a machine can execute, you need to compile it. Compilers are simple programs that do it. Learn about them in compiler construction.
Sometimes programs run on different machines. They talk to each other over a network. It is like cable in your TV. There are different ways to do it but mostly they utilize sockets and file descriptors. Learn about this in computer communication.
While programs can talk to each other over network, sometimes its hard to find which program is where and what language it understands. It sometimes is better to not worry about the fact that programs are running on separate machines. They need to act as one system. A distributed system. So they need remote procedure calls, data serialization and message passing. Learn about this in Distributed Systems. When these systems need to do intense processing you need efficient ways. You can learn those in ‘high performance computing’. Think weather prediction, missile trajectories, nuclear impact and super computers. Fun!
Your program needs to help Humans do their job better. Learn in Human Computer Interaction on how to do it. It will teach UX/UI and other stuff.
At this point, we should talk about abstraction. You know how when you plan a trip to go from LA to SF you just assume that at certain points there will be gas stations and our car needs gas and we need food and there are roads? We don’t worry about how gas stations work and how cars work or how roads are build. It is because we work on a higher ‘abstraction’ level. Similarly, what if you could simple make a user interface and do some high level stuff and do things over a network? So we have Web Programming. It lets you write programs on top of programs: a web browser and an application server. Both of which are just simple programs as we discussed but a web programmer works at a higher level of abstraction.
But what if computers could learn and make decisions on their own based on a set or rules or even make up their own rules? For example what if you chat application knows who your favorite friends are and surfaces their names when you open the app? Learn about this in Machine Learning and Artificial Intelligence. These systems work on very large stashes of data gathered (analytics) and processed (data science) and stored (data warehousing). All this in Big Data Systems.
Finally, you want things to be visible and get as close to reality as possible or you want to show information in a meaningful way. Learn that in Computer Graphics.
Phew. So now you know and we can lay down to rest the silly notion that schools don’t teach stuff that is used in real life.
Oh but you say what about ‘other courses’ we have to take?
Computer Graphics relies on Linear Algebra. You need to know about matrices, transformations, etc.
Data structures and algorithms need Discrete Mathematics as it relies on Graph Theory, Set theory etc.
Numerical computing, which is used in simulations of real world require knowledge of Calculus and Differential equations, maybe even Physics.
Other than all this, you need to learn about the legal and ethical issues that arise from working on all this so there may be courses related to that.
So, these are at least 30 courses that prepare you as a generalist in computing. It will expose you to a range of disciplines with in computing and different people get attracted to different things. If I were to tell you to simply learn AngularJS and Ruby on Rails, i am barely even touching the surface of what is possible in the field of tech.
So, stop worrying about languages and technologies and companies etc. Learn computing instead. Focus on fundamentals. Get exposed and find your true calling!
In some other post I may go into how, in light of this post, it is actually not just OK but good to do whiteboard interviews like they do in Tech Companies and how to ace them.