Computer science refers to a study which will go deeper into the science behind computers. Basically, how do computers work, how do hardware and software connections are formed likewise. On the other hand, software engineering is about the process or the cycle of developing software systems. The software development process uses computers and software systems are usually deployed into various types of computers (Eg:- server computers, personal computers, handheld devices etc). Therefore, computer science and software engineering is having a great relationship together
Computer science is a vast topic but we are able to identify top computer engineering concepts that every software engineer should now.
Data structures and algorithms
Applications of computer science are mostly about solving real world problems using the theorems from computer science and mathematics. Consider following examples,
- Finding the shortest route between two cities — An application of Dijkstra’s algorithm.
- Detecting how many people in a snapshot of surveillance camera recording — Using facial recognition algorithms.
- Calculating the visible area in a drawing software — Computer graphics and algorithms.
As we can see almost all applications of computer science require knowledge of data structures and algorithms. Indeed, we have to use those in day to day programming too to make solutions for specific business logic in our software systems. For instance, using
Set data structure to store unique page numbers that have been read by the application user.
Software engineers are making software systems with the help of computer devices and also those systems will be deployed into again, to computer devices. Hence, understanding how a generic computer works is highly required. Someone could argue that the modern high level programming abstraction doesn’t require any knowledge about the computer engineering aspect.
Whereas writing well optimized code, working with a programming language such as C or C++ and working with embedded systems may require this knowledge. It is so important to have a good understanding about following topics as a software engineer.
- Digital logic and logic gates — Everything is 0 or 1 with computers so better to know the concept.
- Architecture of a generic computer — Components such as ALU, CU, Registers, Memory modules, storage devices and I/O devices.
Software systems usually process some data which are entered by users or captured from another sources. Computer security is about protecting data or the system from external parties who should not have the access. In the modern world most of the software systems are hosted in remote computers and provisioned over the internet allowing its users to access it globally. Therefore, nowadays application security coverage is a mandatory requirement(Legally there are critical certifications such as GDPR).
Having basic knowledge about computer security is highly required for every software engineer because there is a chance to identify possible vulnerabilities of the system in the first place before the actual implementation process.
We already know the basic behavior of computing is like the diagram shown above (Figure 4.1). It’s same for generic software systems too. Databases help us to store our data in a manageable structure also offering the ability to apply logical inputs to retrieve persisted data(also known as querying).
Since the data persistence is used in almost all software, experience about databases and knowledge about database concepts (indexing, joins, querying, performance factors etc.) are needed as software engineers.
There are situations where we need to interconnect computers in order to share resources or computation power. Nowadays computer network theory plays a big role in the world since almost all things are available as cloud services.
Following things could be very useful for software engineers.
- Networking protocols — Eg:- IP, HTTP, HTTPS, SSL, SMTP, UDP etc.
- Basic networking concepts such as routing and ip configuration,
- Other related topics like distributed systems and cloud computing.
Computer graphics related industries are growing rapidly because computer based visualization is a great way for entertainment and also for detailed explanation of things. Some popular technologies/industries that are influenced by computer graphics are,
- Gaming industry
- Virtual Reality (VR)
- Augmented Reality (AR)
- 3D animated movies
Having fundamental computer graphics knowledge is a good thing for developers and it is extremely required for developers who work with industries mentioned above. Human Computer Interaction principles also could be related with computer graphics and those principles are needed for developers who work closer to the front-end of software systems.
Design patterns and architecture
There are infinite ways to solve a specific business problem using computer science. Whereas there are few manageable and well organized approaches of doing it. Therefore software engineers should use proper design patterns and architectural patterns. Having experience with following points is great for any kind of software engineer.
- Object Oriented Programming (OOP)
- Most common architectural patterns such as layered architecture(monolithic model), micro-services, event driven pattern and MVC model)
- Software design patterns (Eg:- Singleton, Factory, Proxy, Facade etc)
World is going towards automation of things with less human interaction to get something done using software systems. One of the great example could be searching something on Google, we usually enter only the name of things when we need, for instance,
- “Inception” — Google shows about the “Inception” movie first
- “Apple” — Google will prioritize “Apple” devices over the fruit
Furthermore, When we are typing a new email on Gmail it will try to autocomplete the email by matching phrases according to our normal writing style. All of these things are applications of artificial intelligence concepts. Knowing about basic artificial intelligence concepts is nice for software engineers. Especially if you are going to work with data science related software projects, having experience with these stuff could be compulsory. Here are some AI concepts to get familiar with,
- Neutral networks fundamentals
- Classification problems and models
- Other related topics such as machine learning and deep learning
Indeed, all the points mentioned here are focused on the theoretical side of computer science. But, each and every framework, library or tech stack is built based on these principles. Therefore, learning every new technology is practically not a wise choice. Instead, improving knowledge and experience about computer science fundamentals could be priceless since one day you may write your own framework or a library.