46

Disclaimers (Please read before jumping to answer):

I've seen a number of questions similar to the one I would like to ask, so here are some similar questions.

IMHO They are neither completely what I'm asking, nor are they as thorough as I hope to be (I don't mean to brush off the answers to the below questions, nor am I discrediting the askers, I just want to be a little more thorough):

Can a CS degree benefit an older programmer?

https://softwareengineering.stackexchange.com/questions/80024/importance-of-certifications-for-java-programmer-without-bs-degree

https://softwareengineering.stackexchange.com/questions/81591/in-the-absense-of-a-cs-degree-how-can-i-fill-in-the-gaps-so-to-speak

Importance of CS degree when applying for development jobs?

Let me be clear, I'm not asking the following:

  • How to teach myself programming from scratch (without a degree in CS)
  • How to market myself as a good software developer (without a degree in CS)
  • How to get a great high paying job as a software developer (without a degree in CS)

A little context:

Now that I have disclaimers out of the way, let me flesh out my question, starting with a brief history of my experience as a software developer.

First off, I have been incredibly lucky. I've been given several job opportunities (a couple heavy backend PHP/MySQL projects, and several WP7 apps in XAML/C#) through which I really learned everything I know about software development. Nearly all of the software development jobs I've had were ones that I was not rightfully qualified to have (and I made that clear to my employers before they hired me). I don't want to give myself credit where it's not due, but I would say that perfect humility dispenses with modesty.

In nearly every single development job I've had, I have exceeded the expectations of my employer, and proved to be a valuable asset. There are of course exceptions1. But my point is I'm fairly intelligent and was able to teach myself what I needed to know in order to be successful at my job. With each job I had, I was stretched more and more.

I attend the University of Washington's Seattle campus, and am currently in my fourth year with two years left, working on a Math degree. During the various jobs I've had (see my résumé if you want that list) I've also been attending school as a full time student.

As I think most developers would agree, studying the typical general ed undergraduate courses, including introductory programming courses ABSOLUTELY PALES in comparison with writing real code, building real2 products, working with awesome people, and positively affecting the lives of users3.

So... as things go... I spent far more of my time and energy working instead of focusing on my studies. At times I performed very horribly, but for the most part I was able to stay afloat with my grades.

However the computer science program at UW is very, very, very, very competitive.

So, it was no surprise to me when I got rejected by the program. Twice. Ironically enough, the same half-hour window in which I received the always polite, albeit disheartening rejection notice via email, I got a phone call from Amazon offering me a summer internship4 as an SDE.

As I look around at other 'gents my age (21), who share the same goals as myself in software development, I find myself feeling pretty good about where I'm at, what I'm learning, who I am, and what I can do. There are of course much, much, much more brilliant 21 year olds out there than myself, I don't mean to say I stand out in a crowd, merely that I feel like I'm not abysmally behind the progress of my average peer.

I feel confident about my ability to be successful in the world of software. More importantly I feel confident in my ability and desire to continue to grow, learn, and be embarrassingly humbled when I really need it.

Math Degree

I find myself pursuing a Math degree with the sole purpose of having a degree. There are those that say I should drop out and start working now (as I've had opportunity to do), and there are those that say I should really finish my degree. I've made up my mind to go ahead with my degree for entirely different reasons than either camp tends to bring up, so please don't encourage me one way or another on that matter. Consider the issue "closed" :)

*DEEP BREATH* ...sorry this is longer than I anticipated.

This in essence, is my question:

  • How do I objectively determine what areas of study, general knowledge, and other skills I would have gained through a CS degree that I may or may not be lacking in now?

  • How do I sort these skills in order of most importance?

  • What is the best way (over the next two years) to supplement my education to attain those attributes in such a way to match or even surpass the level of a CS undergrad from a top university?

Here are the steps that I am taking already:

  1. Ask the development community (this post)
  2. Pursue mentorships with seasoned developers who share a similar career path with me
  3. Define short and long term "learning" goals and subsequent syllabi outlining topics of study
  4. Continue to write code and work on projects that I'm passionate about

If you've gotten this far, you deserve a cookie :) I appreciate you bearing with me.

So... development community, seasoned developers, fellow students who are in the same boat as me, what advice would you have?

Also... please do keep in mind my disclaimers at the top of this post about what I'm NOT asking for.

Update:

I realize that I did not provide very concrete parameters for what I deem a successful "answer" to my question(s). I think the question is very vague, and could warrant a number of "correct" answers.

After a reasonable amount of time I will select the answer that fits the following attributes:

  • Explains the why behind their answer
  • Can speak from some level of experience (be it hiring/interacting with or being someone who has/is in my shoes)
  • Is concise but thorough, gives broad principles preferably coupled with specific examples
  • Lastly, considering the length that matching the above would seem to require, please make it a good well communicated answer that's pleasant to read. Others who may be interested in this in the future I would hope would be entertained as well as educated by the response.

So there are some parameters for "correct". They're very high I think, but I've designed them as kind of an outline for what I envision the "best" answer would be. Obviously given enough time I'll select the closest matching response as the "answer".


(1) - I worked on a prior version of this website, and while we did not have an explicit 
      conversation about it, I felt that I was not able to do very well at all (this can be 
      evidenced by the fact that they have since changed their website entirely)
(2) - Firstly, yes, it's a real product (even though I'm writing this post in Chrome...), and
      it kicks ass. Secondly, I was a high school intern developer in test, wrote proof of 
      concept code for some of the new features for IE8... so it was a while ago.
(3) - At the time of this posting I am the developer who wrote this app, I am no longer
      responsible for it's code base
(4) - My internship will start in June of 2012, and I'll be working in the Web Store 
      team.

10 Answers10

18

How do I objectively determine what areas of study, general knowledge, and other skills I would have gained through a CS degree that I may or may not be lacking in now?

Browse the curriculum of the CS department at UW, borrow and browse through the required reading, look at previous exams and lab exercises (homework assignments). If you have no idea about how you would approach the problem, you have a hole in your knowledge.

How do I sort these skills in order of most importance?

Think about what kind of programming you would like to do in the future. If you're happy building websites and CRUD applications, it seems you already have all the knowledge you need.

CS education enters the picture if you are interested understanding in how [distributed] databases, web servers, compilers and interpreters, operating systems, network protocols etc. work under the hood, and are interested in building such systems yourself.

What is the best way (over the next two years) to supplement my education to attain those attributes in such a way to match or even surpass the level of a CS undergrad from a top university?

I do not know. For me, the greatest benefit of the university was to 1) broaden my horizons (I have forgotten 90% of the details I learned at uni, but I remember concepts and ideas), and 2) keep my intrinsic motivation for learning the stuff from waning: It's easier to keep motivation up when you're working towards a goal -- exam, another exam, etc. until you graduate. (Also, structuring self-education is not an easy task.)

[Added: choose a university whose CS program you would like to follow, choose courses in topics you're interested in and go through the curriculum yourself: homework assignments, exams, etc. Most courses publish lecture slides and assignments/exams from earlier years.]

A word of advice though: DO NOT give up your math degree. Any bright person can teach themselves to program, but math will give you competitive edge if you should ever wish to work on applications other than CRUD/frontend, for example fluid and mechanical simulations, computer graphics, image processing, recognition and machine learning applications, (even finance!) etc.

UPDATE 2 -- experience [long]: I obtained master's degree at EE faculty: the first two years were common curriculum (physics, electrical engineering, analog&digital electronics, and a lot of math -- linear algebra; discrete math; real, vector and complex applied analysis.) This was very valuable, esp. the EE and electronics part -- it allowed me to work on mixed HW-SW projects, and cooperating with HW designers was very exciting. I didn't contribute anything to HW design, but I was able to follow the HW designer "debugging" his schematic diagram and ask sensible questions [we were unsure whether the bug was in SW or HW -- turned out it was in HW :-)].

Then the lines branched and I choose the CS line. Some of the "details" contributed to ingraining the concepts (e.g., "running" Dijkstra's algorithm by hand). Also I learned details about how CPUs work (bus signals, interpreting bus diagrams, execution, etc.) on the example of, already then, obsolete Motorola 68000, but the concepts learned through details aren't very different for modern CPUs either.

Other details, esp. SW implementations (e.g., implementing Dijkstra), were for me [since I've gotten quite good at coding in highschool] a pointless exercise in debugging and contributed ZERO to understanding of concepts.

And then I enrolled into PhD programme, where I had to take obligatory courses. I was disappointed by the choice of courses, since many of them seemed more to be oriented towards industry's demands (e.g., using Python for scientific data analysis -- thank you, I can program and I'm very much capable of teaching myself that -- which again involved a lot of pointless coding) than towards teaching fundamental concepts (fortunately, I dug out courses on discrete optimization, static analysis of programs and formal analysis with Promela).

So, some details were useful for ingraining concepts, and some were outright unnecessary burden (another example: programming serial port communication between two computers. I was already then used to reading and interpreting HW specs and programming HW through registers, so it was just.. boring. Maybe I'm naive in assuming that average to-become CS engineers don't need to be educated about how to read HW docs).

In conclusion: expose yourself to many different concepts (high-level ideas) and go into detail for those that you want to prioritize and become extremely good at. [You CANNOT be extremely good at everything!]

zvrba
  • 3,480
17

OK, I find it too tempting not to answer your question, so here I am...


A few things about me first


I am 26 years old, and thanks to my father (btw, a mathematician and currently working as a professor) I've had the chance from a very early stage of my life to be around computers. (back in 1986 when I was born, though not the most common thing in those days, we always had one or two computers at home). That being said, and - obviously because of my curious and math-inclined / problem-solving oriented nature - it wasn't long before I found myself in love with programming. First with Pascal, at the age of 7-8 and then pretty much everything else just followed.

First, let me say that, while at school, I've always excelled in anything math-related, simply because I liked it, and honestly I could easily follow my father's example and become a mathematician too. But that didn't happen.

What did happen was probably the biggest mistake of my life (so far) : What would you call it when someone in love with code, who speaks 15+ languages and has written thousands of lines of code (from compilers to micro-kernels and web frameworks) by the age of 18, suddenly (the reasons are still too obscure in my mind, but the general, even if subtle, influence of your environment is never too negligible) decides to pursue a career in Medicine? I guess a "mistake".

The result? 5 years later (at 23), and 1 year before finishing my Med degree (still working on personal open-source programming projects as a hobby all the time), I decided I've had enough and decided to quit. And it was not only that I hated this new field (Medicine) so much, but also that there was something unsettling in this whole situation, an insatiable itch hidden deep inside... (what would it have been if...? ) Moreover, I had just realized that my hobby, what I considered great but had not even imagined as a real job, could not only bring some money but bring me lots of it + keep me happy as an individual. So, I decided to quit. (= the best choice, even if a bit late, I've ever made).

So, here I am now, an once-gonna-be-doctor (on-the-verge-of-a-nervous-breakdown psychiatrist to be precise; stupid me!) going for a CS degree (on my 3rd year actually; and, honestly, pursuing it in order not to end up lacking in those dreaded typical qualifications...) and a more-than-happy professional working on something that I adore and definitely the subject on which I have to offer the most.


A few observations (from my own experience)


  • Programming is one of the very few fields where the really good ones will always find their way up, no matter what. And this is most definitely NOT a matter of typical qualifications (honestly, if I had a company and wanted to recruit programmers, I can easily tell who's good in a matter of minutes - regardless of whether he even has any degree or not)

  • What it takes to be a good programmer is : math-oriented intelligence (but NOT maths itself) and passion (that will make the endless hours of studying a pleasure instead of a burden; and, even if I haven't realized that, trust me i've studied TONS of material on the subject in my life, purely on my own). Formal education is a nice thing, but it's a bit overrated. The core ingredients of success are the first two.

  • Maths is definitely where CS was born. But CS is not just maths anymore. I've always had a strong math-oriented brain, but I'm by no means a math guru. And honestly, in every day programming, (unless you're into building a graphics engine or something too localized) you'll most likely never need anything other than simple arithmetic (addition, subtraction, multiplication, division, modulo) and a few things about arrays. (many will disagree with me, probably mathematicians or too academic-oriented programmers, but definitely mastering calculus is NOT what it takes to be a good programmer). Having a good math background will maybe help you, but NOT because of the math itself; it'll help you solely based on one common thing these two field share : problem-solving skills.

  • Maths is a science (and a science I respect).

  • Programming is an art. (And an applied science as well, if you insist) But keep that in mind : an art - and that's how I've always treated it. And as with all arts, it cannot be taught. I may teach you the formal way of drawing a face and make you better than average but that won't make you neither a Da Vinci, nor a Klimt. Mona Lisas are painted by Da Vincis, and not by carefully educated painters. Great code is written by great code artists. And skill and devotion can easily outbalance formal education.


So, what does it take to become a *really* good programmer?


  • Being smart, great problem-solving skills and a passion for the subject (if you don't have it, just leave it; being mediocre is no excuse)
  • Lots of time to devote to the subject
  • Studying all the time ('coz you'll simply never know it all; and note: why does 'studing' has to be related to some degree? I've always found it far more pleasure doing things on my own pace...)
  • Writing code all the time (no matter how many books you have read; your coding level is directly equivalent to the amount of code you've written)
  • And again, LOVE for the subject (if you don't love it enough, and I mean really love it, all of the above will sooner or later become unbearable; for me, coding as a job is still like getting paid for... watching movies : absolutely absurd but yet simply great)

On your questions


  • How do I objectively determine what areas of study, general knowledge, and other skills I would have gained through a CS degree that I may or may not be lacking in now?

Though, I'd have to really know what's included Math degree, let me sum up what you'll most likely be missing from a CS degree (as courses/subjects/etc - inspired by my uni's programme of studies) in no particular order :

  • Logic Design of Digital Systems (some low-level circuit stuff, and/or/xors/etc - seemingly not too related, but still really educational)
  • Computer Architecture (along with some Assembly coding; you'll most likely never use it, but you can't tell how much it could shape your attitude as a programmer)
  • Data Structures (from linked list, to complex trees, etc; as simple as they may seem, sooner or later you'll need some good background on these; using ready-made solutions that you don't understand is not something a good programmer would do)
  • Compilers (yep, compilers! will you ever write a compiler? probably not; but unless you can write one, you'll never really know how things work...)
  • Operating Systems (same as above)
  • Computer Networks
  • Artificial Intelligence and expert Systems (you'll most likely never code in Prolog too; but it's still one of the things that might shape your coding brain and make it see things from a radically different perspective)
  • How do I sort these skills in order of most importance?

Knowing what to prioritize in an always-changing field as CS will always be a gamble - a guessing game.

Get to know what you want to do, and trust your instict. Of course, having a solid basic knowledge is a must. But what you'll delve into, it's entirely up to you. Also, plan your career carefully : if you want to be employed, then choose your target and be great at it (e.g. wanting to be employed by Google and not knowing how to read a simple Python script is probably one of those no-go situations). If you're starting something on your own (a company), then you have no "boss" to satisfy; just pick what suits you best.

For example, if you want to do something web-related, I'd definitely advise you to go for : PHP / MySQL / HTML / CSS / JavaScript (+jQuery/AJAX). But that's just me. Someone may like (or see more future in) Ruby/Rails than in PHP.

I, for instance, am now primarily coding in Objective-C / Cocoa. Would I advise you to pursue that? Definitely not. That is : unless you're into Macs or want a career selling Mac/iPhone-related software. If you're into Windows development, going for C# / .NET Framework would probably be your best choice. (if you want to get an idea of what I'm mostly into, just have a look in my StackOverflow Profile)

  • What is the best way (over the next two years) to supplement my education to attain those attributes in such a way to match or even surpass the level of a CS undergrad from a top university?

Study a lot (books, internet, other people's code, whatever) and write as much code as you can.

Ah, and try to get a job in anything code related. (I first started working as a freelancer and it's been a really valuable experience, just to see how things really work in the real world).


Just my .2 friendly cents... :-)

Sidenote : I know that some of my points may seem controversial, and i'm sure that there'll be many who will disagree with me. That's acceptable. But that doesn't change the way I see things - and especially the things i love.

7

This in essence, is my question: How do I objectively determine what areas of study, general knowledge, and other skills I would have gained through a CS degree that I may or may not be lacking in now?

Answer 1

If you learn something new from your study. Then you can objectively say that you gained this through a CS degree.

A1. The Why

A CS degree conceptually is about learning. If one returns from a CS degree with no net difference, then its core aim is not fulfilled. Exams and coursework are the "official" measure of what has been learned. However, individual comprehension (have I learnt anything new?) should be a better objective measure.

A1. The Experience

I have both been in academia, and now work professionally. I chose a Master Degree in Computer Science because I wanted to expand my understanding and I have a passion for learning.

My world has expanded as a result of getting a Masters in computing. My world has also expanded from working professionally.

How do I sort these skills in order of most importance?

Answer 2

Importance is relative on who's asking the question and for what situation. If its for personal growth, then its all important. If its for industry, then things like algorithms and good OOP/standard software practices are important.

A2. The Why

The "scope" of importance is highly dependent on the "context". Without a context, the merits of the skills are difficult to sort.

A2. The Experience

I have found that the skills obtained from "university" vs "in the field" are different. The "skills" in university are more "theory", from industry its more "practice". For this reason, this difference means that the skills are indeed ranked differently in terms of importance.

What is the best way (over the next two years) to supplement my education to attain those attributes in such a way to match or even surpass the level of a CS undergrad from a top university?

Answer 3

Push your self beyond breaking point, and when you break keep breaking yourself again.

What do I mean?

If you get to a point where you don't understand, then you have broken yourself. Keep learning until you understand. Then push further until you find something else you don't understand (ad infinitum).

A3. The Why

If you only learn and stay within your boundary, you will only be "ok". You don't want to be just "ok". You want to be the "best" you can be. You can't reach your real potential, if you don't CONSTANTLY push beyond your boundary.

A3. The Experience

I'm always going to be a life long student, I'm not going to enumerate my current skill set, if you are curious you can just see my profile.

The one thing, I will say is that. I'm never fulfilled with my current knowledge. I want to fly higher, see further, and go deeper.

Darknight
  • 12,159
7

I interview and participate in recruiting a lot of junior people fresh out of college. I have yet to hire anyone based on the subject-matter skills they picked up from whichever program they took. The reason for this is simple: no CS program (or any other program) I've encountered teaches any concrete skills connected with programming or software development that is on a professional, commercial level. Being able to crank out models and solutions to complex differential equations and writing optimized special-purpose sorting-algorithms may have academic and/or scientific value, but it has no bearing on general software development.

What DO I look for then? Well, I expect a college graduate to have perfected the art of learning. That is, after all, what a good college should be teaching it's students. How to analyze and break down general problems into logical, discrete components that are predictably solvable. A methodical approach to find, evaluate, organize and apply knowledge and information towards a solution.

Also, I look for people who understand that a group of people, working together and communicating, are worth much more than the sum of it's individuals. That requires maturity and humility and the ability to both give and ask for help.

So, to loop back to the scope of your question: while a CS degree might improve your chances of getting that first interview out of college, I find it has little to no bearing on your success or proficiency as a developer. I've always followed the philosophy "hire for attitude, train for skill" and it's payed off well.

My advice: continue with your math degree if that is something that interests you. Any scientific education will server you well, so pick the one that you like most as that's the one you're most likely to excel in. Then focus on learning the important things: how to learn, how to analyze and approach problem-solution in a structured way, how to interact and cooperate with other people, how to take leadership and responsibility for both your own and your teammates' delivery. The rest is just technology and coding, the tools of the trade. Those, you can and will learn on your own. Pick up and study some general purpose knowledge, like popular design patterns and architectural paradigms. Start writing programs to practice. Pick some language and technology base that is fairly up to date, but don't make the mistake of thinking it's the final one you'll learn. Tools and languages change all the time so software development is a constant process of learning anyway.

pap
  • 1,320
4

How do I objectively determine what areas of study, general knowledge, and other skills I would have gained through a CS degree that I may or may not be lacking in now?

Just look at the degree requirements, then look up the syllabus for each class.

How do I sort these skills in order of most importance?

You can't really do this yourself without the benefit of hindsight. I would say the most important thing most self taught programmers lack is algorithm analysis and design. The rest can be picked up piece meal.

What is the best way (over the next two years) to supplement my education to attain those attributes in such a way to match or even surpass the level of a CS undergrad from a top university?

Even if you aren't admitted to the program, you can often take classes from other departments as electives. One of my favorite classes was a project class from aerospace engineering where I worked on electronics and firmware for a small satellite.

You can also purchase the text book your desired class is using. I did that for a couple classes I couldn't fit into my schedule. Another option is MIT open courseware.

Karl Bielefeldt
  • 148,830
3

Why do you think that a CS degree is so important to be a Successful programmer?

What you need in order to be a successful programmer is:

  • Passion about programming
  • A neverending thirst for knowledge about new technologies
  • Get into the industry someway

Usually the CS degree will get you inside the industry, but if you dont have the passion and the thirst for knowledge, you will suffer, and you will never be a good programmer.

Looks like you already got into the industry, and it certainly feels like you have both the passion and the thirst for knowledge.

What you got to do know is to keep on researching and learning and gaining experience, and the industry will know how to appreciate you without the degree.

An Example From someone I work with

one of the Software Developers working in my team has a law degree... after a few years she understood she doesnt like law at all, and that she wants to be a programmer. she couldn't get a job as a programmer(no experience, no degree), so she did a 6 month computer course, then she got a job, and she's a great developer ever since.

Mithir
  • 1,329
2

IMHO there are no programming jobs (or sales jobs or sysadmin jobs etc), there are only problem-solving jobs. We hire and pay people to solve problems, writing code is only part of solving the problem. Yes, even sales is a form of problem solving. So a Math degree proves you can problem solve as well as a CS degree.

From your posting it is clear you are getting a lot of experience/internships. Great! don't worry about getting a job after graduation.

To attempt to answer your questions:

classes? pick some theoretical CS classes rather than code writing classes. Find some non CS/math classes eg. philosophy it will help you stand out from the crowd

priorities? learn new things (not just easy classes you half know already)

next two years? talk to people, learn, build relationships, look for outside activities. (Hobbies/sports/pastimes away from work/study is one clue to see how motivated an applicant is.)

Final tips: Graduate as soon as you can. Build a network of contacts. And the only secure job is creating your own job. Look for ideas/opportunities where you can start your own business. Good luck.

jqa
  • 1,410
1

Firstly, let me say that I am very happy that you have asked this question because it is one that I have asked myself over the years.

I guess I could consider myself a bit of a success in this area, so far. I have some college experience and would like to eventually finish my college education in Computer Science, but I have not yet merited a degree at this point in my life. I have, however, had quite a lot of success in software engineering despite this disadvantage (going on 10 years). I have to be honest with you, though, it was not necessarily an easy thing to do (of course, I would wager that anything worth doing is most often NOT the easiest). I'm also going to say that it's still not the easiest thing. There are plenty of companies out there willing to give the right candidate a chance, but I have come into contact with others that will balk at the lack of that college education "seal of approval". However, I wanted it (and still want it) so badly that I was willing to do whatever I could to get any and all experience in whatever language I wanted to pursue a job in at the time.

It started in .net at a very large company. As a small time non-programmer (worked as a tech support rep, at the time), I learned everything I could about the languages and technologies used as it applied to the company I worked for. Furthermore, and this is probably the most important thing, I networked. I shot off an email to every single person that I could find in the directory that had Software Engineer in their title. Was I annoying? Probably. I was always courteous and self-deferential with an eagerness to learn. I would schedule lunches or just find them in the cafeteria and sit down to try to have a conversation. Sometimes it was embarrassing or I would get snubbed, but in the end, it got the expected results. I was able to get small-time credentials to some internal databases and after a while acquired the requisite credentials to develop software on their proprietary platform. Soon thereafter, I found myself in a position within the company to lend some skills in internal tools development for the analysis team that I worked on at the time. From there, I always just strived to be the smartest guy in the room in the most unpretentious way possible. I was eager and I made sure that everyone knew it. I always tried to provide a solution wherever possible and found that if you try hard enough there are very few problem domains that are impossible to solve (outside of quantum theory, perhaps).

To wrap up what could be a long story (and if you're in the Pacific Northwest I'd love to discuss over a beer), I got my "big break" at a tiny little startup that was willing to give me a shot. They traded my lack of experience for a little smaller salary, and I hit the ground running. I then bounced from one small dev shop to the next over the next few years, gaining friendships and skills along the way, to where I am finally as the lead developer and director of a small engineering company.

A key takeaway here, if I haven't communicated it effectively enough, is that you have to network. Make friends, have some beers and laughs, and find people who are in the field you want to work in (preferably within your technology stack of choice). Make sure people know your willingness to do whatever it takes and eagerness to get the job done no matter how monumental it may be. You basically have to "overcome" your lack of formal education. Jump in and have fun with it. This industry is the best on earth, IMHO. I have made lasting friendships and contacts that have helped me from one place to the next and I will continue to do the same for them whenever the opportunity presents itself.

1

First, let me LOL at the "concise but thorough" stipulation near the end of your grand opus. Down to business:

How do I objectively determine what areas of study, general knowledge, and other skills I would have gained through a CS degree that I may or may not be lacking in now?

As others mentioned, you can start at the course catalog. But I'd encourage you to step outside of the bounds of that list. It's actually good that you're majoring in Math. Many engineers I've worked with can't remember how to perform simple integration, and never explored outside the walls of the traditional CS discrete maths coursework.

This answer seems pretty sparse in terms of specifics. I don't have a CS degree, and I haven't found myself lacking in any necessary areas. I do wish, however, that I spent more time on the other things that interested me. History, Linguistics, and English, for example.

How do I sort these skills in order of most importance?

Learn what you love

What's important to you? What's important to employers? My personal heuristic has always been to learn what seems most interesting to me – you need to love what you do; otherwise, you'll burn out. Software is such a sprawling field of endeavor that there always seems to be a job available for a competent developer who is passionate about any of these skills.

Learn to learn, and push yourself

I guess that leads me to two meta-skills that I'd place above the rest: learn things voraciously, and work hard. Those may sound clichéd and painfully obvious, but the combination is rare. I've been all over the map in terms of skills "needed" – front-end HTML/javascript to language extensions to mobile development to computer vision to systems administration and back again, over 7+ languages. The only true core skill in all that is having made overcoming my own ignorance a habit.

I really love Jack White's philosophy about guitars and music (seriously, go watch that), and I think it's supremely applicable to the programming world. Put things a little further out of reach. Push yourself. Then it'll seem easy when all someone wants for you to do is your job.

What is the best way (over the next two years) to supplement my education to attain those attributes in such a way to match or even surpass the level of a CS undergrad from a top university?

  1. Non-major CS classes

    Like you, the CS department at UW rejected me... although I think I let them do it a third time before coming to my senses. I wound up majoring in Informatics and minoring in Applied Math. But I still took the entire non-major CS track. That's CSE 373, 410, 413, 415, and 417. So, sure I believe that you should follow your passion first. Mine lead me to those classes. And I think that you get a pretty comprehensive core education with them, although it might be a little light on the theoretical side of things.

    Now, here's the cool thing: with Informatics, most of these counted towards my required electives. In the Math department, you might need to get explicit approval, and it might be a stretch for any but CSE 417.

    Summon up a DARS inquiry (probably a UWNetID-only link) and see where things stand. I used to do this for various majors ad nauseum.

  2. AMATH Classes

    Along the same lines, the Applied Math department has some classes that could be worked in as elective requirements. You could even minor in AMATH like yours truly.

    Why do I mention this? Numerical computing – e.g. AMATH 301/352 – is a huge mystery to most programmers. If you get nothing else from it, you'll be able to write interesting blog posts. But I'd contend that knowing the issues surrounding a language's numerical types and knowing how to measure and ameliorate them is pretty darn important.

  3. Build something!

    The most important thing you can do is to build something new. Take an idea from start to finish. Don't let it be something easy that's within your comfort zone.

    The most fruitful programming classes I took always had a large hands-on programming component. For an engineer, theory incredibly important – so long as it can be turned into something real. So go find a cool sounding CS paper and try to implement it. Seriously.

  4. Get a job

    Now, you already mentioned that you have an internship at Amazon. That's great. Actual work experience really is key! There are plenty of people with CS degrees who can't program their way out of a wet paper bag. Having good work experience is worth way more than a degree.

abscondment
  • 119
  • 4
-2

There are more than a few stories of people becoming millionaires before they graduate from college, maybe the one I hear most is Bill Gates. The people with niche abilities tend to do better without a degree than the cookie stamped CS graduate.

Find something that very few people are into, usually something that is boring, tedious, or difficult to learn, and learn it well, become obsessed with it. Some areas that I have heard about are Unix back end stuff (not Linux, although Linux is not far behind in demand), Flash (I don't know enough about flash to remember exactly what it was, but I know a guy who moved up fast knowing it and he said there is STILL a market for this, mostly because people say it is dying and will not learn it). You might need to take a few classes to get going, but if you know your stuff and have an impressive portfolio there are business out there that are going to need you!

BillyNair
  • 259