I graduated from Engineering. Now what?
What is our responsibility as Engineers?
The job of an Engineer is to solve problems using technology. They either use technology or create the technology required to solve problems.
The job of a software engineer is to solve problems using Software Technology.
What are examples of applications that Software Engineers build?
If you look at apps in your mobile phone, they are all examples of what Software Engineers build.
The Missing Gap in Technical Skillset
Am I adequately prepared to start my career in the software industry? Do I have the required technical skills to build applications like these? What am I lacking in my technical skillset?
If I call myself as an engineer, should I not be knowing, at least at a high level how applications like Facebook, Twitter, WhatsApp, Google Search, Google Maps, Uber, Amazon Shopping etc work?
Remember that there is a difference between knowing how to use an application like Facebook v/s knowing how to build our own Facebook!
Knowing how to use Facebook and calling ourselves as an engineer is similar to knowing to drive a car and calling ourselves as an automobile engineer! If someone asks a mechanical engineer, the difference between a Porsche and a BMW, we don't expect them to say that a Porsche is a shiny sports car, while BMW is classy. We expect them to talk about the differences from a technical standpoint, the way the engines function, the horsepower, the aerodynamics and the interior/exterior design.
Similarly if someone asks a software engineer how Uber works, or how Google Maps works, we don't expect them to talk in terms of how to book a cab or to find directions in Google Maps. We expect them to talk about the technical challenges in building such applications and what tools/technologies can be used to build one.
When we ask this question, we typically hear students from most universities (the ones that have completed their undergraduate/post-graduate studies) confirming that they have a theoretical understanding of the subjects but they lack application knowledge. They have studied a lot of subjects like Data Structures, Algorithms, Databases, Networking, Operating Systems, Finite Automata, Compiler Design, Programming Languages etc. At the rate of 5-6 subjects per curriculum (of 6 months), an undergraduate engineering curriculum has more than 35-40 different subjects! So it is natural for graduates to ask, do these subjects have any relevance in the industry? How come they are asking us something that we don't know?
This is referred to as a "gap" - a gap between what they teach in an engineering curriculum and what is expected of engineers in the industry.
It is an irony that there are so many vacant jobs, but on the other hand, we also find people struggling to get a job.
Let us dig deeper and understand what this gap is.
Every single subject mentioned above is required to build a search engine like Google or a social networking site like Facebook! While Data Structures and Algorithms is at the heart of everything in Computer Science, databases are required to store data permanently for retrieval in future (the pages on the web, people in your network etc). When we access these applications using a mobile phone or a browser, we are using the concepts of Networking. All these applications are deployed in "cloud" data centers where each of the machines has an Operating System. The code is written using one or more programming languages, which is then compiled using a compiler. The design of a compiler internally uses concepts of Automata Theory. An order management system needs knowledge of finite state machines. Google Maps and the Web needs knowledge of Graph Theory.
We can go on, but we hope we have made our point. All these subjects are of great importance. No doubts about it! However, the real question is, are they sufficient to build applications mentioned above?
The answer is, "No", and that's where the real gap is.
Technologies - the missing piece in the puzzle
Concepts are theoretical. They are just on paper. They are mostly grounded in mathematics and don't change that often. Relational database theory and some data structures that we use are decades old and are still going strong! An undergraduate curriculum has a stronger emphasis on these concepts.
We can't take these "concepts" and build applications with it. What else do we need to build applications like Google or Facebook?
We need tools and technologies.
I can teach you the concepts of aerodynamics and mechanics, but that's not enough to build a car. We need to learn the tools used to manufacture an engine, the way we assemble the car in a factory.
What are examples of such tools and technologies that we need to know of in the software industry?
There are several technologies for each concept. Let us look at this in a little more detail.
It is not enough to know the subject called "Programming Languages". This subject teaches us the theory of a programming language; what a programming language is, how it works etc. We also now need to learn specific programming languages like C, C++, Java, JavaScript, Python etc. These languages implement the concepts that we learn in the subject, "Programming Languages". The industry expects us to know one or more of these programming languages and not just know the concepts of Programming Languages.
Another example: it is not enough to learn the subject called "Databases". This subject teaches us the theory of storage and retrieval of data from a persistent device like a hard-disk. It talks about concepts like tables, primary and foreign keys, normalization, queries, indexes etc. We not only need to know these concepts, we also need to learn specific databases like MySQL, PostgreSQL, MongoDB, Cassandra etc that implement these concepts.
One more example: it is not enough to learn the concepts of machine learning. We also need to learn specific tools like TensorFlow, NumPy, NLTK, pandas etc.
So let us understand the relationship between Concepts, Technologies and Applications.
To build the applications listed above, we need several tools and technologies. The tools and technologies incorporate the Concepts in them.
Now if we understand what an engineering curriculum focusses on, we realize that fhe focus is on learning concepts, and the emphasis on technology is very minimal.
The obvious question that comes to mind is, if these technologies are so important, why does our engineering curriculum not teach us this?
The short answer to this question is, the curriculum cannot teach us all these because there are just so many technologies out there!
The entire Engineering curriculum, teaches students about 2-3 programming languages, a couple of databases etc. However, the applications in the world out there are built with several programming languages.
There are more than 20 popular programming languages (popular in this context simply means languages that are used in applications today), more than 20 popular databases, dozens of MVC frameworks etc.
Examples of programming languages used in applications today: C, C++, Java, JavaScript, TypeScript, Go, Python, Scala, Clojure, Erlang, PHP, Rust, etc.
Examples of databases used in applications today: MySQL, PostgreSQL, MongoDB, Cassandra, Redis, Neo4J, etc.
We can't expect an engineering curriculum to teach us all of these!
The next question that pops in our mind is, am I expected to know all these technologies? Is it enough to pick one? If not, which technology/technologies am I supposed to learn? Who will teach us these? How can I learn all these? Is there enough time to learn everything?
A Technology Ninja?
Some people say, let me learn one technology. I will pick one language, say Java.
The problem with this attitude is, the industry does not work like that.
This attitude is like saying, I know one tool for some job and I will use this same tool for every job. We know this doesn't work.
An electrician carries a toolkit. The toolkit contains several tools and the electrician picks the best tool depending on the job.
Imagine, there is a concept called "making a hole in an object". We learn this concept and then a specific tool, a hammer. We are so good with hammer that we even have a certification for using hammers! We now proudly carry our hammer certificate to an organization that builds roads. They ask us concepts about digging holes and we have mastered all the concepts. The organization is impressed and we get the job. Our first assignment is to dig a hole in the road. We go to the site and start digging the hole with our favourite tool, the hammer. Guess what will happen!
Just like the hammer is not the best tool to dig a hole in the road, similarly a specific programming language is not the best fit for every problem.
So what can we use to dig a hole in the road? We have road diggers for that. So does this mean we use road diggers everywhere and hammers are outdated? What will happen if we use a road digger to dig a hole in the wall? The wall will not exist.
So we have to use the best tool for the job. If a better tool is invented in future, we will learn to use that.
We don't become too sentimental about the tool/technology. So this is a word of caution! We should never brand ourself with a technology; never call ourself a "JavaScript Ninja" or a "Python Geek" etc. The reason is when the technology gets outdated so will we!
We should not have the attitude, "I am a Python expert, so I will do everything with Python". We should ask ourselves, "Is Python the best tool for this job? If so, let's use it. However, if it is not, we will use what tool suits best. Of course, if there is a choice, we pick our favourites. If, during our analysis we find Golang to be a better choice, we pick Golang. It doesn't matter whether we know it or not. We will learn it and apply it to solve the problem."
Be sentimental about the problem we are trying to solve and pick the best tool to solve the problem.
We should aim to be good engineers. An engineer's job is to solve the problem at hand. They use the best tool available in the industry to solve it. They are not sentimental about the tool, rather they are passionate about solving the problem at hand. We should learn to be that!
Being successful as an Engineer
Note that we are in no way reducing the importance of concepts! Concepts are extremely important too. A solid foundation in concepts helps us appreciate different tools. It helps us to compare and contrast tools and pick the best ones. It helps us identify patterns in different tools and learn them faster.
In fact, one issue with most short-term bootcamps and coding schools is that they focus heavily on technologies without providing the learners a solid foundation in concepts and that is not good either. People coming from such schools, many a times only know some tools and don't know the concepts and so cannot relate to other similar tools. They may know MongoDB, but they don't know what similarities exist between MongoDB and MariaDB or when to choose one over the other.
Technologies and their shelf-life
So this brings us back to our question, how many of these do we know? How many are we supposed to know? What if we learn a programming language, but the company where we work uses a different language?
There is one more problem (or should we would call it an opportunity) with technology.
Technologies have a very short shelf-life. The technologies that were prevalent in applications 10 years ago, are outdated today. Technologies used in applications today, were perhaps not even invented 10 years ago.
So what technologies are going to be popular 10 years from now? It's hard to predict that given the history, isn't it? It's perhaps not even invented yet. Who will teach us those technologies? We have to learn them ourselves.
Concepts, on the other hand, don't change so often. Relational database technology is more than 50 years old, the concepts of Operating Systems and Programming Languages is also decades old.
So what's the best way to be successful in this industry?
The short answer is:
(a) Get really solid with concepts - go as deep into them as possible. The more time we invest in solidifying our conceptual knowledge, the better it is. We should pick our favorite areas and go deep! (b) Learn as many technologies as we can fit into our schedule. Learn as many programming languages as we can. Learn as many databases as we can. There is no upper limit. (c) The third area is application - it is not enough to learn concepts and technologies. It is important to apply our knowledge of the concepts and technologies in solving problems. We should create our own problems if our project doesn't demand it. Build our own Twitter clone, build our own Uber clone, not because we are competing with them, but because we want to learn what it takes to do this.
The good thing about this kind of technology exploration is that, once we have explored a few diverse technologies in a domain, we sort of "get it". It becomes easier to explore a new technology even if we have never seen it earlier. If we have worked with about 5-6 databases, the next one is easy to pick up.
The analogy is, "It's like watching a 100 Hollywood movies of different genres" and once we have watched enough, we can sort of predict what the next movie is going to end like by the time we have watched half the movie. We start identifying patterns and know what to expect.
Movies have genres like comedy, sci-fi, drama, horror etc. Imagine a friend says, "I have never watched a horror movie". We will perhaps tell them, "Watch at least one, or else you are missing something".
Technologies are similar. If we learn diverse technologies, it's like watching movies of different genres. The more the technologies we know, the wider our horizon. The next technology is like watching the 101st movie. It's not going to intimidate us. It becomes easier for us to appreciate the next technology that comes our way. We can relate to the changes in technologies much better.
We should fill our mind with as many diverse technologies as possible so that we not only learn those technologies but also get good at identifying patterns and this helps us in exploring and picking up new technologies faster.
We should never measure our experience on how long we have been in the industry. We have met several people who claim to have worked in the industry for 10+ years but they never upgraded their skillset after the first few months of joining the industry. Let this not be you!
When exploring technologies don't worry if the current project doesn't need them. Learning technologies is not necessarily related to what the project needs. This investment is for you.
These courses have been designed in such a way that you will not only get good at the technologies that you are being coached on, but also learn and hopefully master the art of learning on your own. It is our sincere effort to teach you this art.
Welcome aboard and all the best!