In college we learn a lot of areas related to computing including programming, compilers, architecture, networking, storage and operating system concepts. After graduation, one gets a job in industry and starts working on real world application development. Previously, it used to largely consist of a code repository, coding guidelines, build and test system maintained by IT and software engineering waterfall models that are run and tracked by managers. However, a lot has changed in terms of application development and deployment in the industry over last 5 years. The change in application development and deployment model is something that every computer science major should know and understand. Let me explain:
Over the last three decades, we have gone through various modes of building and deploying applications:
1) One server, local storage
This is the simplest model. It is very cheap and easy to do, but does not provide reliability or scalability beyond a single large machine. A failure of a single component can lead to loss of data or application.
2) One server, reliable storage
This model allows the persistent state to be stored in a reliable manner. If the compute fails, it can be restarted. This requires more expensive storage but the compute is hard to scale and still introduces downtime in case of compute failure.
3) Multiple servers, reliable storage
This model solves the problem of scaling and reliability of compute layer, but now the scaling bottleneck is shifted back to storage. It gets much more expensive to get a scalable storage layer that can scale with the application. Furthermore moving from one storage system to another becomes a large project with downtime and fork-lift upgrade. Finally, deploying more compute on demand is also a much more time consuming operation due to physical systems that need to be procured and deployed.
4) Multiple servers as VMs and reliable storage as NoSQL stores
The next big wave of technology solved the problem of compute scaling using virtual machines that can be deployed very easily, can be replicated, created and destroyed. Similarly the storage scaling was solved by NoSQL stores that do not give the ACID semantics of a database but provide a scalable storage layer with simple semantics like key value stores or tables with flexible schema without any multi-key transactions. So that complexity moved back into applications. However, getting the new systems deployed was controlled by IT and doing networking configuration still remained very manual.
5) Self-service cloud and API driven infrastructure
Finally we are at a model where developers can deploy machine instances using an API, create and attach storage volumes or disks to those instances using APIs, create private layer 2 networks using APIs and stitch them together using routers created via an API and finally set application level firewall rules, using, you guessed it, APIs.
Now a graduate or undergraduate student with a Computer Science degree can really take everything he or she has learned in various courses and put it to work in real life in a matter of minutes. When I was in grad school, I could never imagine that I would be able to create machines, storage, networks, routers, and switches all using software and see all of it working together within minutes. Understanding each of these concepts was done in separate courses with their own isolated labs and assignments.
I think every curriculum should have a course called “From Code to Running Applications” to put together all the concepts and learning from core courses into building and deploying one application end to end. This would also cover big-data systems, building them, managing them and running analytics on them. All of these systems can be taught by deploying them on a cloud. Most companies are already 80 to 90% virtualized and are using VMs for all application deployment instead of physical machines. At ZeroStack, all of our testing, development and deployment in the cloud happens in the form of VMs.
I wish I had a course like that when I was in grad school, but not all pieces were invented by that time. Mobile applications and software-as-a-service are rapidly becoming very pervasive in our lives. Programming and cloud based applications are becoming the de-facto way to solve challenges in many diverse fields, while leveraging cloud, mobile connectivity and ability to deal with lots of data.
If you are looking to enter tech industry and become successful as programmer, technical leader, product manager or an entrepreneur, I would suggest going through this cycle at least once. Here are few byte-sized steps to take:
1) Create a git repo on a local machine or online.
2) Think of an application that you care about, this could even be for a non-profit cause or organization or yourself.
3) Build that application in the language of your choice.
4) Think about the reliability of the application when deployed.
5) Deploy the application on a cloud environment.
6) Scale it up and down to just test on demand addition of machines.
And you will be one of the most sought after talents in today’s market!