Math major wants to be a software developer.
January 3, 2013 4:12 PM   Subscribe

What courses should I take if I want to be a software developer? Is knowing data structures and algorithms enough? Or should I learn computer architecture, networks, and operating systems as well?

I don't see why architecture, networks, and OS will be needed for programming. Also I'm trying to make myself useful in society because I majored in math, and pure math is...useless.
posted by molamola to Computers & Internet (28 answers total) 15 users marked this as a favorite
Do you mean college courses? Have you already graduated? You want to switch majors?

At any rate if you want to know what a CS graduate knows, yes, you'll need to take every course a CS major takes including networking, architecture and operating systems. I'm not sure why you think operating systems and networks are not important - you're not planning to write programs that run on an OS or communicate over a network?

There's no clear bright line - the more you know, the more competent you are as a developer. Take as many courses as you can.

If it makes you feel better, take some AI courses which are actually pretty heavy on math. AI and machine learning is a pretty hot sub-field of CS.
posted by GuyZero at 4:24 PM on January 3, 2013 [1 favorite]

Understanding architecture helps you understand the cost of thing you do and it makes it clearer what features in a hll are advantageous. It will also guide you if you need to create a vm and a domain specific language. Operating Systems, taught competently will include a lot on parallelism and resource contention. As we look at systems being shipped with a standard set of two cores, the advantages are obvious.

As a 20 year professional, the courses that I tap the most are discrete structures, architecture, compilers, and algorithms and cs theory. You should be open to classes that stretch your mind because they will change how you fundamentally think and that's a Very Good Thing. Hated Scheme at the time, but it's terriffic mental thinking. Took a class where we implemented a prolog system. Prolog is one of the few languages that I look at and say, 'well. That's different.' Because every other one (and for me it's been 20 or more) has been just the same.

I will also add that if you have a class in design patterns, take it.
posted by plinth at 4:30 PM on January 3, 2013 [1 favorite]

"I don't see why architecture, networks, and OS will be needed for programming."

Well, somebody has to write and maintain the operating system code, why couldn't it be you?

Even if you don't write system-level code: the software you write will run on top of some OS, on some hardware architecture, and these days will almost certainly have some interactions with the network. This stuff is all pretty fundamental.

What sort of software do you see yourself writing, and what's given you the idea that you wouldn't need to understand these things?
posted by bfields at 4:30 PM on January 3, 2013 [1 favorite]

"I don't see why architecture, networks, and OS will be needed for programming."

Those are very important things when you are programming, if you want your programs to like, do stuff.

I have a Software Engineering degree, and the only classes that I feel were worth an iota of my time in hindsight are: The SE Architecture classes, Operating Systems, Programming Languages and SysArch (i.e. from circuits on up to CPUs). Getting my Cisco certs was invaluable for the basics of networking as well.

You can teach yourself languages and tools easily, but school-knowledge in the fundamentals is super-useful.

Also, I wish I had more pure math :/
posted by wrok at 4:43 PM on January 3, 2013

Software development is more than just coding - understanding how the various things you're coding on, with, and for will make you leagues better.

Developers that just treat the foundations they're working with as magical black boxes are of no use to me professionally.
posted by flaterik at 4:43 PM on January 3, 2013 [1 favorite]

"I don't see why architecture, networks, and OS will be needed for programming."

This is why, as a systems and operations guy, I'm better at debugging code than most programmers. This attitude is a great way to piss off your coworkers that you'll constantly be blaming for breaking your apps, when in actuality you made completely unrealistic assumptions about the systems your code interacts with.

And fwiw, pure math isn't useless. I use number theory and graph theory all the time.
posted by bfranklin at 4:43 PM on January 3, 2013 [4 favorites]

I don't see why architecture, networks, and OS will be needed for programming.

This is how people end up doing things like writing web servers that spawn a new thread for every connection. Strictly, it works, and from a conceptual perspective, spawning a new thread is a single operation, so clearly it is inexpensive as per the big-O analysis you learned in your algorithms class. Then you wonder why your server starts crashing if you ever get more than 100 simultaneous visitors.

How do you know how expenive things like spawning new threads are, or what the actual cost of a network connection is? You take the OS and networking classes.
posted by tylerkaraszewski at 4:51 PM on January 3, 2013 [1 favorite]

What courses should I take if I want to be a software developer?

You don't need to take any courses. Software development is a skill perfected by practice and not merely an accumulation of knowledge. You just need to learn how to write code, and then you need to spend a lot of time practicing the art of writing and debugging code so that you can learn to be good at it.

The courses you name all offer knowledge which may be helpful in the task of designing programs. Different types of programs draw on different bodies of knowledge. The more of that knowledge you accumulate, the more kinds of programs you will be able to design and successfully implement.
posted by Mars Saxman at 4:55 PM on January 3, 2013 [2 favorites]

Data structures and algorithms are pretty important, but the more you know the better software you'll be able to write.
  • Architecture: Knowing computer architecture will help you write software that has better performance--You need to know what part of your software is going to be CPU limited vs. memory bus limited. You need to understand why aligned memory accesses can be much faster than unaligned accesses. Knowing about things like L1 and L2 cache help you understand why your loop over a 2D array runs 30% slower if you access it like a[j][i] vs. a[i][j]. See, for example, Jeff Deans list of "numbers that every computer engineer should know".
  • Operating Systems: Most (but not all) programmers will never write their own operating system. But knowing how operating systems work will (again) help you write software that performs well. Knowing what Copy-on-write is and whether your operating system supports it, knowing what Zero-copy operations are, and why you should organize your data in order to minimize the number of virtual memory page faults will help you make software that does its job better and that people find more pleasurable to use.

posted by jjwiseman at 4:57 PM on January 3, 2013 [5 favorites]

I agree with above replies, plus I would add that *good* CS classes present you with challenges (i.e., exercises and lab work) that will develop insights and show you your strengths, weaknesses and insights. It's like reading about driving vs. driving lessons vs. driving in various types of vehicles and weather. The more good classes you take the more you learn the material, what works and doesn't and where your weaknesses lie. To this very day (37 years later) I wish I had paid more attention to my college numerical analysis class (I'm not sure you'd call it pure or applied math, but if you don't know it there are some real world business problems that are difficult to solve).

Note in all the above I said *good* CS classes. In my opinion, nothing is more worthless than a bad CS class (unintelligible instructor with little practical knowledge reading from a reference manual purporting to be a text book, you get the idea).
posted by forthright at 6:26 PM on January 3, 2013

Let me say this...

If there is one thing that colleges don't stress enough, or I should say... most don't stress at all -- it is architecture. There are colleagues of mine with more experience than me that haven't got the slightest clue what design patterns are. It's going to aid you immensely and put everything together once you learn the nitty gritty details. Architecture is very important to learn if you want to succeed.
posted by MMALR at 6:38 PM on January 3, 2013

"I don't see why architecture, networks, and OS will be needed for programming."

Essential, but depth is key. Architecture is critical though.
posted by mattoxic at 6:43 PM on January 3, 2013

The next question I have is...

How can I catch up to all of those ex-cs majors if I'm not in school anymore? I currently do some programming (database developer) but I wish I had that stuff like OS and architecture under my belt. I only took one formal CS class in college and that was MIT 6.00 (I should have never listened to my math professor who told me to take more pure math instead of doing cs).

CS is way more useful for me for anything I want to do, but I don't have the $$$ to shell out for CS classes.
posted by molamola at 6:58 PM on January 3, 2013

Have you considered MIT's free courses? Or perhaps finding another person who knows architecture and operating systems but doesn't know anything about databases or math and learning from each other? I'm just trying to help you think outside the box. I personally have not tried either of these approaches.
posted by forthright at 7:48 PM on January 3, 2013

Coursera and a bunch of other MOOCs out there have information that you can use. Go get it!
posted by oceanjesse at 9:37 PM on January 3, 2013

Maybe find a field where math comes in handy. GIS and geometry come to mind for me, and there are a number of active open source projects out there that could use help from someone with math fundamentals. D3 3.0, for example, leans heavily on fairly serious graphics and geometry techniques and is heavily-used for browser-based interactive graphics.
posted by migurski at 10:15 PM on January 3, 2013

Math is applicable and profitable as applied to insurance/risk. Actuaries make money, and there are likely to be jobs.
posted by theora55 at 10:32 PM on January 3, 2013

I doubt you can cobble together a useful semblance of an actual CS degree out of MOOCs and other free online resources. It's too random, scattershot, and incomplete. There are professional master's programs and certificate programs that might serve your needs, but they are neither free nor funded.
posted by Nomyte at 11:28 PM on January 3, 2013

I used to be an actuary. That's the only option for a math person besides teaching...and I don't want to go back to actuarial.

*also actuarial work involves some programming as well--I should note that.
posted by molamola at 5:40 AM on January 4, 2013

I switched from math to computer science. At some point I did in fact go to the local college bookstore, buy the textbooks for those three classes (OS, architecture, and networking), and read them.

But that probably wasn't as useful as just finding work that required me to learn that stuff to get the job done.
posted by bfields at 9:26 AM on January 4, 2013

So if it's any help I have a friend who has an undergrad in EE and a PhD in pure math who now works full-time as a software developer. The main thing he did? He got jobs working as a software developer. Courses are helpful but just be smart, look for good jobs and get some experience under your belt. There's no magic formula here.
posted by GuyZero at 11:00 AM on January 4, 2013

molamola: keep an eye on Hacker News and read all the nerdy articles about computer science topics. Pay particular attention to anything about algorithmic complexity or functional programming. You'll learn a lot about computer science that way.
posted by Mars Saxman at 11:54 AM on January 4, 2013

All this depends a lot on what kind of software you want to develop.

You are a mathematician. There are a ton of things you can do that CS grads cannot do. For example there are plenty of people in finance writing complex models in Matlab who don't know, and don't need to know, anything very much about things like networking, OS etc. True, there may be someone in the next room that sometimes takes some of those models and rewrites them to be super-fast and efficient in C++, but that person does not have to be you. Nor is it necessarily an efficient division of effort that one person try to know everything.

Btw if your goal is be useful to society and use math, there are lot of ways to do that which may or may not involve programming. If you want to stay close to pure math and do want to work in something involving computing, cryptography or graph theory may be of interest. Alternately you could look at stats, which also has applications in machine learning and such. These skills are also in considerable demand btw.

Also be aware that there is nothing that says a math grad has to work in a job that involves math or tech.
posted by philipy at 12:24 PM on January 5, 2013

Yeah I'm actually going for my stat masters down the road (probably next year or so). I would say statistics is my biggest interest (I nearly got a dual masters in stat when I finished undergrad). The stuff in machine learning, etc are what I'm most interested in. I think that's why I was asking why I would bother learning architecture, OS, or systems, etc. I'm sure it helps, but, like you said, people in finance writing models in Matlab wouldn't NEED to know that stuff.

And I'm interested in jobs that don't involve math or tech, but it's easier for me to land ones that do. Then again, my biggest interest is computational biology so go figure.
posted by molamola at 2:50 PM on January 6, 2013

I wrote a blog article on this that expands on my original answer. Hopefully it will help you out.
posted by plinth at 12:55 PM on January 7, 2013

plinth - These days instead of learning Scheme/Lisp one can get the same change of point of view away from sequential/procedural thinking by learning Haskell instead. I come from a math background, and I like it much more than Lisp.
posted by benito.strauss at 3:23 PM on January 7, 2013

Scala is also a good direction to approach functional programming - it's not purely functional but it encourages it, and the fact that it compiles to JVM is nice on many levels.
posted by flaterik at 9:45 PM on January 7, 2013

Wow thank you everyone for your feedback! This is really helpful for me--before I had no idea where to begin.
posted by molamola at 10:04 PM on January 7, 2013

« Older It's a lovely name, but...   |   Help me build my iguana a water fountain. Newer »
This thread is closed to new comments.