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
Just land a job and learn whichever tools and languages and frameworks you are using really well. There is plenty of time to learn on the job. The most important skill the willingness to learn.
I am itching to learn. It's just this
Just land a job
part that's the problem
The interview process can vary by company, but many of them do a phone screen with some kind of basic algorithm or recursion problem, or some kind of soft questions. Then the main interview is leetcode-style whiteboarding problems or more niche styles like a group interview where you explain some code you wrote for an hour.
Bottom line - if you can solve leetcode problems (and talk about your thought process while doing so) then you can land a job. There are also other ways.
Thanks! Any good DS&A resources you’d recommend before jumping into leetcode?
I used Cormen Introduction to Algorithms in college. It's pretty good.
I am such a poor student that I might have failed as well, but I took a stack of paper and did the graph algorithms by hand a bunch of times for a few hours and it was enough to learn it for the final. :rat-salute-2:
Found this channel, it might help. https://www.youtube.com/c/ColinGalen
It's a tough thing to answer. It's kind of "everything and nothing". Academic subjects are pretty broad. Like, if we were talking about physics, I'd say "well, are you working on airplanes or microprocessors?" And it's the same thing here.
Gotcha. In my case, I'm more interested towards Software Dev and any subjects that might be useful in that domain
I only did a little tiny bit of the higher education thing, so not sure what "revise" means in this context but I'd say keep algorithms and data structures if that's not what you're already planning.
OOP using JAVA
Object Oriented System DevelopmentThe first thing I wasted my time learning was Java back in the day... I hate Java (and OOP) so much now. Got that DARPA money though at one point lol. But OOP has been a disaster for organizations everywhere, except for game dev probably. I have just never seen a single codebase in a business or information processing environment where the OO nature of it didn't just become the equivalent to the organization taking a 12oz hammer and smashing 2 toes on each foot of every developer after a couple revisions were needed.
Anyway... my votes for emphasis would be Database Management Systems and Distributed Systems.
So is OOP even worth studying atleast for interview purposes? (And java is the only language I'm decent in :agony-wholesome: )
Also, I should give the functional programming intro video that's been sitting in my watch later playlist for 6 years a shot eh? Or is there an even better programming paradigm?
I love functional programming, but sadly it's not that helpful for getting a job. The only area where functional programming really seems to have become mainstream is web dev, and that's mostly because of React.
There's no such thing as the best paradigm, learn what seems cool or what employers want. Sadly, those will usually be two different things.
Searching for a job: Data structures and algorithms. Standard whiteboard interviews are exactly like a random exercise out of Kleinberg and Tardos. You'll occasionally get an object oriented design question (bullshit, but enough shops think it's important), or a large scale systems question (never a good question, some effective answers are "your data is small enough to fit in Postgres", durable queues, and map reduce), or some bullshit where the answer is applying XOR to pointers (you don't want that job anyway).
On the job: if you actually sit down and read whatever framework they've based everything on, you're ahead of 90% of programmers. Most programming is not super technical (and if it is, it will usually be one specific skill, not all of them), and it's mostly about communicating with people.
Kleinberg and Tardos
I'm taking an Algorithm Design course this semester with this textbook being the main reference and boy am I intimidated to attempt any of the questions :sweat: . You got any advice on how to approach/think about those excercises?
Read the chapter and don't skim anything. If you don't understand something, you need to go back a paragraph at a time until you're back in familiar territory, then work forward until you hit what you missed. It's very well constructed to actually explain everything, but it's very, very dense. Set solid blocks of time aside to work on it.
The problems all start out hard, but get much easier once you've done a few from the chapter. Once you've practiced the techniques a while, it gets quite a lot easier; it turns out they know what they're talking about when they say these are general techniques. Think of actually completing your first few problems in a chapter as being the majority of the work.
Expect Dynamic Programming to be harder than the rest. Shit's notoriously hard. Schedule extra time for it. Once again, the majority of the work is getting through your first couple problems of that type. Eventually it clicks.
Unfortunately the answer depends on what kind of job you want. You can do a lot of things with a CS degree. Of course they are nearly all programming or related to it, but someone that programs part of a website at a FAANG is doing different stuff from someone doing advanced data engineering software for a renewables startup is doing different stuff than someone working for a typical enterprise contractor or government.
Example: if you want to do jobs that are web programming, you'd want to focus on full-stack Typescript / modern JS for front and back and maybe play around with Python and Java/Kotlin for back end. In the other hand, if you'll be working more with data, you'll want to get better at SQL and database theory in general, higher performance querying and data processing methods, etc. On the other other hand if you want to be creating new crap from scratch and solving hard problems you'll want to get really good at DS and algo. On the other other other hand if you wanted a geospatial job you'd want to brush up on that, if a graphics job you'll want to brush up on that and linear algebra, if a mobile app job you'll want to learn Kotlin, Swift, and make some toy apps.
The above is about resume building and how to present yourself in an application. Don't try to do all of it unless you're very excited about doing that or something, lol. The point I'm making is that different jobs look for different skills to make the difference when hiring. The dev that has built a full stack web app with real users is more appealing for a shop needing that level of vertical work than someone who only knows Java, for example. Not that you couldn't pick it up p on the job, just that you'll get more interviews and offers if you already have it.
For an interview, you'll want to do a bunch of stupid leetcose bullshit because companies still use it really often even though it's mostly pointless.
Also, since you're getting a master's, consider whether you'd want to become a tech lead and/or project manager type, putting your knowledge and experience to work in a way that isn't just coding. You might have a hard time getting directly hired if you don't have experience yet, but if that's your trajectory you'll want to find experiences that prepare you for it, i.e. not situations where you are the only dev and there are no deadlines (but to be confused with places that overwork you).
keep in mind I don't work lol (doing a master's as well)
apart from DS/ Algo I think databases/distributed systems might help in general, as well as software engineering (which pains me to say, since I had a deep distain for it during undergrad).
the rest depends on what you want to do. Pro tip: don't skip the math/stats if you're doing ML/DS, it'll bite you in the ass sooner than you think.
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.
Type systems like the ones used in Haskell and Rust are much more flexible IMO
I only know about OOP. Where can I learn about other useful programming paradigms?
Data Mining? :gulag:
Can I ask why lol?
Web Programming is miserable
Is it really that bad? What causes it to be worse than other tech jobs?
I'm just a CS undergrad, so take whatever I say with a grain of salt. My thought is that you can't answer your question until you've decided on some sort of specialization. There are many sub jobs that fall under CS, and they all take slightly different skills. Some I can think of are:
- frontend web dev
- backend web dev
- mobile dev (iOS/Swift or Android Kotlin)
- SRE/cloud/DevOps
- data science
- systems programming
- embedded
- cyber security
- network admin
The truth is, 90% of what you learn in a CS degree is useless for an industry job, at least based on internships I have done. You want to focus on passing interviews, once you've done that, everything else is easy. I'm not really sure, but I think the best way to pass interviews is to fill your resume with buzzwords by doing side projects or taking relevant classes. People will always recommend the Leetcode Algo thing, and I think that's a good idea, but it also only applies to certain positions at certain companies. You can also get great jobs by having, say, "kubernetes" plastered all over your CV.
Database, database, database, and database.
Too many student come out bad at db design. Almost every thing need it.
For interview learn worthless algorithm mind puzzle. To get the interview put trending tech on your resume.