So I’ve just started my Master’s in CS and wanted to know what subjects (aside from DS and Algo) to review from my bachelor’s that would be important to know while searching for a job as well as which would be useful while on the job. The reason I ask is because I kinda bumbled my way through my Bachelor’s and didn’t really study the subjects well so I want to take the time to relearn them if they’re important to whatever job I’m gonna get (most probably software engineering). For reference here are some of the subjects that were part of my curriculum:
- Data Structures using C
- Design and Analysis of Algorithms
- OOP using JAVA
- Database Management Systems
- Operating Systems
- Software Engineering
- Data Communications
- Compiler Construction
- Object Oriented System Development
- Computer Networks
- Web Programming and Services
- Distributed Systems
- Embedded Systems
- Software Project Management
- Artificial Intelligence
- Data Mining
Data structures are very important and very fundamental regardless of which programming environment you see yourself getting into. They are used in every language from Assembly to C to Javascript. Learning datastructures in C would serve both as a building block to further study on algorithms, and as an essential part of implementing various file formats and network protocols. Hit up libgen and grab the O'rielly "Algorithms in a nutshell" book to brush up.
Object Oriented Programming is overrated. You will need to be familiar with it no matter what, but languages like Java and C# treat OOP as a hammer and every problem becomes a nail. C++ is a miserable language, but at least it lets you choose when OOP is the correct apporach, and when to eschew it completely. Type systems like the ones used in Haskell and Rust are much more flexible IMO. In general, just be familiar with concepts like inheritance, polymorphism, and some of the more common design patterns from the GoF Design Patterns book. Never implement any of them, just be familiar with them. :gigachad: This way when you find yourself working on some Android app and come across a class called DickSuckingFactory, you have an innate understanding (without even needing to read any documentation) that this class is used to create instances and manage the lifetimes of various classes which implement the DickSucking interface. Same thing for singletons, observers, visitors, models/views/controllers, etc.
Data Mining? :gulag:
Compiler Construction is pretty fascinating. Lots of different layers. Heavy on lexicographical analysis, data structures, algorithms, cpu architecture, and more. In general, if you know how compilers work, you have a deep understanding of the full software development stack as well as an innate ability to decide which programming language is the right tool for any job, as well as a good understanding of which programming languages will still be around 10 years from now.
Operating Systems, same boat. Your code is going to have to work on at least one operating system, and understanding the architecture and design decisions made in various operating systems will help you develop good, portable software. Concepts like system calls, the various rings of "protected mode," filesystems, and a general understanding of how permissions work on Unix (Linux/Mac/BSD) and Windows will be very helpful. Additionaly, familiarity with emulators, hypervisors, virtual machines, and containers can be very useful.
Database Systems. If you need to design your own database system, you might need to have even more smarts than the compiler people (debatable, but they are close). No one wants to do this, but you should know enough about database systems to understand WHY this is the case. In summary, Postgres will solve any problem that's worth solving. If Postgres doesn't solve the problem, you are simply holding it wrong.
Web Programming is miserable, but being familiar with concepts like REST API design is still neccessary if you want to get into the back-end side of things. Again, familiarity with containers and virtual machines, as well as database systems will come in very handy in this niche.
Full disclosure: I grew up wanting to do software development (specifically game engine architecture) and ended up as a machinist. At least I still get to write code, and when my programs crash, they CRASH!
Wow, thanks for the compehensive reply comrade.
I only know about OOP. Where can I learn about other useful programming paradigms?
Can I ask why lol?
Is it really that bad? What causes it to be worse than other tech jobs?