When it comes to software engineering, most of the people think it is just about a computer and a person writing some code on it.Well their perception is just a subset of what software engineers actually do.Like engineers in other fields (mechanical engineer, electrical engineer,civil engineer etc) software engineers also have tools in their tool-box.Yes, software engineers use a lot of tools to build a software product. Actually, I would use the statement “engineer a software product” . If you are thinking what’s there in a software product, which needs to be engineered , you will understand as you continue reading.
Building a software product can be compared to building a bridge.
Both need a solid architecture. A poorly architected bridge may fall and kill hundreds of people under it, similarly a poorly architected software may crash/be hacked and ruin people’s life by compromising sensitive data(like saved credit cards), misuse of personal data(like photos, videos etc) and many other problems.
When an architect prepares an architecture for a bridge he tries to get answers for the following questions :
a) How many people are going to use the bridge ?
b)What type of vehicles will be allowed on the bridge ?
c) Type of soil, length of the bridge and many more such questions.
Aren’t these questions similar to what a software engineer would try to ask ?
a) How many people are going to use the product ?
b) How much data needs to be stored ?
c) What type of people are going to use it and a lot more like these.
After all such questions are answered, civil engineers make estimations and decide on the materials to be used, dimensions of the bridge etc. Similarly software engineer make estimations on the data storage, network load, number of hits etc and decide on the technologies, languages to be used to engineer the product.
After all the above efforts (and more) are put in and lot of information is gathered, implementation can be started, which finally results in a robust and user friendly product.
Now since we have briefly talked about how a software product is engineered, let talk about the toolbox.
Below is the list of all the skills(tools) which are really important for a software engineer to work efficiently : (Almost all of them are part for engineering studies, but due to the current pace of work most of us forget the basics and hence the quality of work is reduced.)
- Mathematics : Mathematics is the most important skill that every engineer should possess.Using basic maths calculations can be done correctly to derive all the numbers that are really critical.For example, how the data storage will grow ? how the network load will grow ? how much throughput cab be generated ? What are the caching requirements ? how much can the product scale ? what is the complexity of programs ?All these questions need calculation.
- Data structures and Algorithms : These are the building blocks of any software product.An engineer should always practice these, no matter how much advanced technologies are used.Popular data structures are arrays, lists, sets, trees, graphs, but an engineer should not stick to only these. Advanced data structures like B-Trees, Red-black trees,Heaps, Bloom filters are also very important.
- Programming languages : An engineer should master at least two programming languages. Most popular ones are Java,Python,C,C++,Ruby,Scala etc.These languages can really help in implementing complex programs and optimize the product.
- Database systems : Database systems lie at the core of the software products.Without data storage a software cannot work.For any program to work data needs to be stored somewhere in-memory, persistent storages, cache systems etc. Also, besides mastering the regular relational DB systems, experience with NoSQL database systems is a must have for software engineers. Popular DB systems are Oracle, MySQL, MongoDB,Couchbase, Neo4J, Dynamo DB etc.
- Networking : Basic concepts of networking are really important to build networked applications.Today most of the applications are built and deployed on cloud, hence it is very critical to understand the concepts. Basic networking concepts include types of networks, networking protocols, encryption-decryption, network certificates, encoding-decoding,data compression etc.
- Frameworks : Frameworks are reusable, customizable, configurable and well tested software components.They allow software engineers to build on top ensuring the basic functionality is provided out of the box. Frameworks like Spring,Play,Grails,Hibernate, Akka, Kafka, Storm etc are very popular.
- Performance measurement tools : These tools help engineers to evaluate the performance of the software. As engineers, we should know our software in and out. To do that, we need to have performance figures ready on hand.Tools like Jmeter, Loadrunner, Jconsole, MAT are some popular examples.
- Automation tools: A task performed manually should be automated immediately, which reduces the risk of human errors, improves speed of delivery and makes the software robust.Automation helps engineers focus on other problems, saves time and makes their life easier.Selenium is the most common testing automation tool, Jenkins/Bamboo are very popular continuous integration tools.
There are many others which can be added to the list, but these are the very important ones.I hope we all as engineers possess these skills and contribute to the software engineering society.