Me being a software engineer wannabe

Me being a software engineer wannabe

I am not sure how many years it will take to say that I am a software engineer confidently.

·

6 min read

I am not sure how many years it will take to say that I am a software engineer confidently.

I'm currently a final year CS student as I am writing this. Upon graduation, I'm supposed to have gotten my head around the art of software development — the long and painful process of planning, designing, developing, testing and finally, the delivery.

Is it easy to become a software engineer? IMO, I don't think so. Let me go a little more in-depth to explain why I think so.

TBH, I am definitely not a smart one. So for those of you who might be interested in how a mediocre CS student is working his way to becoming a software engineer.

First-year, and the first course — Problem Solving and Computer Programming.

It all begins with the "Hello World".

//some code omitted for the sake of simplicity
System.out.println("Hello World");

The first statement I wrote using Java.

Anyone can write code, but not everyone can become a good software engineer. Writing code is one thing, but writing efficient, elegant and readable code that is easy to maintain by others or self is a different thing.

There will be a lot of approaches to achieve a specific goal using code, but I think it is an important skill that knowing how to evaluate and compare codes in terms of the performance, such as the memory usage and time spent for it to complete.

We got tons of languages in the programming world. Do you have to learn all of them? IMO, I don't think knowing how to write code in many languages is a significant advantage. A language is just a tool to achieve an objective, for example, developing a mobile application.

"What is the best programming language?" TBH, I don't think there is an answer that everybody agree on. (Maybe you have your answer, but not everyone is going to agree with you)

Each language has its pros and cons, and software engineering is about mastering the skill of picking the suitable trade-off. No one silver bullet that can satisfy everyone.

Design Patterns

Design patterns are typical solutions to commonly occurring problems in software design. They are like pre-made blueprints that you can customize to solve a recurring design problem in your code. You can’t just find a pattern and copy it into your program, the way you can with off-the-shelf functions or libraries. The pattern is not a specific piece of code, but a general concept for solving a particular problem. You can follow the pattern details and implement a solution that suits the realities of your own program.

Quoted from Design Patterns - Refactoring.Guru

Programming Paradigms

As I mentioned earlier, it can have a lot of approaches to achieve a specific goal using code. Just as there are many ways to achieve a goal, there are many styles of programming too

  • Object-oriented programming
  • Imperative programming
  • Functional programming

Parallel and concurrent programming are worth to be discussed here.

Parallel or concurrent programming can help in some data-intensive scenarios or in high performance system, such as sorting a large dataset by splitting the work to multiple cores (if we have a dataset that is in size of n and we have p processing units, then a smaller dataset split from the original dataset with size of n/p would be assigned to each processing unit) and merge their work to form the result, the sorted dataset. Furthermore, by harnessing the power of modern processors, we can optimize a sorting operation with multi-cores and SIMD instructions.

Data Structures and Algorithms

Familiarity with the general data structures and algorithms would be helpful when you try to solve a problem.

To go deeper, you might heard of QuickSort, one of the popular sorting algorithms. But not all implementations of QuickSort are the exact same, they are just sharing the same core concept, but their low level details could be different. It could have optimization done when the algorithm runs on specified platforms/processors. For example, some implementations will run faster on AVX512.

Interesting Read:

Reed-Solomon

Computer Organization and Architecture

One of the courses has tortured me so hard. It is not an easy task to learn the concepts of CPU, OS, memory, etc. I am still spending time learning this at the time I am writing this. It is the same for the following item too, the OS.

Operating Systems

Learn about the kernel, scheduler, file system, resource management, etc.

I realized its importance after Git and Windows tortured me when the files were not handled properly because the file system is not case sensitive.

So, familiar with the fundamentals of OS is a beneficial thing, in my opinion.

Fundamentals of Networking

Let say you want to make your web application accessible to the public; you have to deploy your application to a server(assuming you are taking a traditional approach, using the service provided by cloud VPS hosting provider)

Some fundamental knowledge on networking is really helpful when working on the server, such as setting up the port, the HTTP server, installing an SSL certificate, etc.

Internet and networking is a huge topic, the list can go from web browser, DNS, BGP, router, switch, protocols to many many more.

Fundamentals of Cybersecurity

It involves everyone from the programmers to users to maintain the integrity of a system.

Starting from programmers, they need to ensure that best security practices are implemented in the code.

No system is 100% safe.

Saving user passwords as plaintext in the database is a big NO. Sadly, this still happens.

What are some of the basic approaches in protecting user credentials to start with?

Hashing

Interesting Read : Adding Salt to Hashing

Secured Transfer Protocol

  • HTTPS

Database

A little bit of continuation of previous topic, cybersecurity, it is important that the place that storing the data is safe too.

Some of the general approaches?

Access control

Data Backup

Safety of data also includes that the data can be recovered if there is an event of data corruption due to hardware issues or software issues

Properties of transaction - ACID

ACID explained

Then, we have two major categories of database, relational and non-relational.

Mathematics for Computer Science

Mathematics is the language of Science.

You will probably need some knowledge on

  • Algebra
  • Statistics
  • Calculus
  • Discrete Math
  • could be more (not an exhaustive list)

if your interest is on Data Science, Game Development, Computer Graphics/Vision and many more.(again, not an exhaustive list)

Brownie Points (Good to have)

System Analysis and Design

Software Engineering Methods

Software Testing and Analysis

Not an exhaustive list