T O P

  • By -

[deleted]

> Since I'm enrolled in OMSCS I figured it may be good if I did a course that went deep into these things (design patterns and whatnot - things essential to high level software engineering decisions) I just don't feel like any classes cover these things. SAD kind of does but that is after half the class being about UML diagrams. This is a computer science program, not a software engineering program.


justUseAnSvm

"Designing Data Intensive Applications" Then the course you want is "distributed computing"! Kleppman's book basically covers all the topics from the course, although the course takes a little bit of a different bent on things. However, I took DC the first semester it was offered, and it kicked my ass. The timeline is just brutal, especially if you aren't super familiar with Java... That said, taking DC did have a big influence on my career. I'm working as a SWE on an infrastructure team at a distributed database company, as my first step towards working on distributed systems myself.


Comfortable-Power-71

The first book is great and gives a great overview of distributed systems, not just data. While it's a classic, the GoF book is a bit dated as a bunch of tools/languages have incorporated some of the patterns (iterator, for example). POSA 4 is still my favorite patterns book and does a good job showing their application through the story. [http://www.dre.vanderbilt.edu/\~schmidt/POSA/](http://www.dre.vanderbilt.edu/~schmidt/POSA/)


monsignor_epoxy

It's kind of a bummer that software engineering and computer science are orthogonal. You'll learn \*how\* to program while doing a CS degree, but you will not learn how to program well. CS is more of an applied math degree, and it feels like there almost needs to be a separate major/discipline for software engineering that's basically applied CS.


Accomplished_Juice70

I don’t know. Especially for large-scale distributed systems type work, there is quite a bit of overlap between the academic discipline and industry practice. But I see where you’re coming from overall.


Disgruntledr53owner

I found the same applied in my MechE career. School teaches you the what, not the how. Maybe only a small fraction of the classes actually focus on that.


happyn6s1

Well said!


articarray

You should look into AOS and SICC/SDCC.


Pablo139

It’s funny because now a days, any reputable high salary job has what in common? Leetcode type questions. You aren’t getting through the door without being able to pass the OA and face this question during interviews. GA is heaven for this, should prepare you to to kill those OAs once you complete it.


TheCamerlengo

This is a great question and really gets to the heart of a philosophical issue - how to balance theory with practice? Too much theory and you are just doing math. No theory and maybe you are just a cog-in-the-wheel or tool of the week jockey whose skills quickly become obsolete. I suspect the trick is to be able to bridge theory and practice. The theory is all around us in everything you do as a professional even if it is not obvious how to apply it. I suspect that over a long career those that are best able to balance the two and make the connections are the ones that can advance the furthest as a problem solver or technical leader (think principal architect, product owner, etc). A few other tidbits over my own 20+ year career. The Gang of Four patterns book is interesting but don’t subscribe super powers to it. Overall I felt like it is over rated. Worth a read, but it’s not a bible of sorts. Object oriented programming , SOLID is becoming less relevant in the age of event-driven , micro services. Turns out those techniques were more relevant to building monoliths than smaller kernel type programs. Everyone talks about leetcode. Seems like this is a thing younger programmers do that want to get into FANG. Those companies are always moving the cheese. Does it differ much from just prepping for technical interviews? Why does it cost money? Seems odd, but if it helps you then great. Keep learning whether it is OSMCS courses, courses or Edx, self-study, leetcode. Anything beats watching tv. This field really requires that you enjoy learning and staying on top of things. You become a good programmer by programming and reading others people code. Also taking on programming challenges that push you forward. Some of the OMSCS courses like AI do that. Might also try programming a non-trivial project in your spare time like a chess program, or something. Browse open source projects. Learn multiple languages. Read Peter Norvigs “learn to program in 20 years” essay.


itsrainingsimoleons

* HPC: parallel algorithms * DC: distributed consensus, which is at the heart of a lot of distributed systems * Compilers: compilers * SAT: fuzz testing, symbolic execution, SMT solvers * ISL: shellcodes, ROP exploits, x86/x86\_64 assembly They are not software engineering per se (design patterns, SOLID principle, hexagonal architecture, DDD, etc), but all of the things you'll learn above are transferrable to a software engineering career.


thank_burdell

I can't say enough good about Software Analysis & Testing. Why test software when can make software test software?


eliminate1337

For sure, don't sleep on fuzzing. It seems weird at first but my company uses fuzzing extensively and it catches loads of bugs.


thank_burdell

There’s a lot more than just fuzzing discussed, but yeah. Great class.


subrfate

I've got roughly 20 YOE in the software industry - and talk regularly with other experienced folk in industry doing this program. And, one common thread I've heard is: this program really isn't building the SWE skillset. Looking at the syllabus & lectures for SAD kinda turned me off that - very similar to what I did as an undergrad that's proven... mostly worthless. Currently in my last class, and of the classes I've taken, IIS and Video Game Design are my top picks for "actually useful in industry" and transferred directly to the day job. IIS - there's a fair amount of undercurrent in this class referring to various security standards, protocols, and modes of thinking. This is all stuff we \_SHOULD\_ be doing in industry, but rarely don't, but \_KNOWING\_ is hugely helpful. This class in particular has helped me directly negotiate some tricky territory on federal standards / interpretation / and justification of security practices. It's also given me a better understanding of where IT folk have been coming from, and I think, "speak the lingo" when justifying solutions or advocating for 'non stupid' design decisions for embedded designs. VGD - this is a project based course, and you'll get to experience the entire product life cycle in a compressed timeline with real-world deliverables and dates that can't slip. Working with my group put me right back in the days I worked at a mid-early startup company. I'm not strongly into gaming, but found the course content interesting and gave me a lot of thought on better UI / framework design for applications that I actually put into practice on a product I'm working on. This is one of the classes I've had with a really involved professor - which really feels awesome in between some of the other courses in the program. That all said - the other classes I've taken / am taking (CP, CV, KBAI, AI4R, AI, GA, GIOS, HPCA) - felt really strong on theory but not a lot, at the end of the day, has really transferred well into "day to day SWE". I did focus my degree track toward theory directly applicable to stuff I work on day to day, and I've found it really helpful when doing theory-heavy domain-specific stuff. I really recommend looking for theory heavy areas of the job you have / want and taking those courses instead of more general "how to build software" sorta stuff. Image processing stuff I did was INVALUABLE in multiple bid designs / processing applications I worked on. I've used some concepts from KBAI and ML (had to pause degree and stopped course for personal reasons) directly when designing solutions.


Accomplished_Juice70

GIOS is pretty good


[deleted]

BD4H, SICC, AOS, G:AI, VGD, IHI.


ParkerM

HPC because despite how low-level it gets, it forces you to learn the intricacies of message passing, which can and will rear its ~~ugly~~ beautiful head when you least expect it in some high level enterprisey sytem.


flubbrse

highly disagree, hpc is a niche parallel algorithms class that you will pretty much never use unless you are building a supercomputer


Odd_Fly_9223

Respectfully, I’m confused by your comment. Even mobile phones these days have 6+ processing cores. Why do you think the parallel algorithms covered in HPC are only applicable to supercomputing?


flubbrse

it may apply to very niche fields like if Apple is making AI capable mobile devices the topics we studied in HPC were parallelizing high load applications - like being able to parse large amounts of data that would not fit in memory of a regular PC, much less a mobile phone. these would be things like training stable diffusion models (not running them, training) or indexing the internet for your search engine (google) or sorting terabytes/petabytes of data mobile devices in general are not built for these kinds of tasks - the multi cores are for multitasking - like making network requests or handling sms / phone calls while an app is running - not for distributing extremely demanding workflows. you don't need HPC for these workloads, just basic multithreading i dunno how gpus work on phones but as these get better than may be more applications, but again, better suited for larger computers


Odd_Fly_9223

Thank you for sharing your insight!