Take the 2-minute tour ×
Programmers Stack Exchange is a question and answer site for professional programmers interested in conceptual questions about software development. It's 100% free, no registration required.

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?

Importance of certifications for Java programmer without BS degree?

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.
share
17  
The world needs more programmers with a math degree. Nuff said. –  Pieter B Apr 24 '12 at 10:01
1  
The market for psychologists and other individual consulting or advice giving services must be huge. I am contemplating changing jobs .... –  Ingo Apr 24 '12 at 10:31
16  
Start by editing this question and cut it in half. –  JeffO Apr 24 '12 at 12:06
8  
@PaulHazen once you remove your extremely verbose background and disclaimer content and get to your actual questions, you're asking three things: how do you determine what you're missing from not having a CS degree, how to get what you're missing, and how to prioritize what you're missing. All three questions are completely covered by the duplicated question. If you don't like the answers, offer a bounty: that's what they're there for. –  user8 Apr 24 '12 at 12:49
7  
@PaulHazen Alternatively, if you're not interested in the questions you listed (that are duplicates of the earlier question), revise your question to specifically only ask about something new. Your question suffers from have way too much information—most of which is probably unnecessary to the problem you're having—and should be paired down to ask about a very specific problem you're having that isn't already covered by other questions. –  user8 Apr 24 '12 at 12:54
show 16 more comments

locked by World Engineer Aug 25 '13 at 1:17

This question exists because it has historical significance, but it is not considered a good, on-topic question for this site, so please do not use it as evidence that you can ask similar questions here. This question and its answers are frozen and cannot be changed. More info: help center.

closed as too localized by Walter, Thomas Owens Apr 25 '12 at 14:02

This question is unlikely to help any future visitors; it is only relevant to a small geographic area, a specific moment in time, or an extraordinarily narrow situation that is not generally applicable to the worldwide audience of the internet. For help making this question more broadly applicable, visit the help center.If this question can be reworded to fit the rules in the help center, please edit the question.

10 Answers

up vote 17 down vote accepted

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.

share
    
This is exactly what I was looking for. Thanks! Just about every other response was also good, very few contained anything that was wrong or unhelpful. I'll be updating the question to include a small section about why I chose this, and a link to a blog post that fleshes it out in more detail (the reason for putting such an explanation on my blog instead of Programmers is due to the already HUGE length of the post, as well as the growing number of concerned moderators who already feel the question is ill suited for this site). Stay posted. And thanks again. –  Paul Hazen Apr 25 '12 at 13:25
    
@PaulHazen You're really welcome! Glad to have helped (IF I did)... (Now, as for the HUGE length of my answer... argh... The system auto-recognized it as a "community wiki" post and I'm trying to get the moderators revert it to its initial state : a simple - though a bit re-re-edited - answer) –  Dr.Kameleon Apr 25 '12 at 13:28
    
Over at meta (meta.programmers.stackexchange.com/questions/3513/…) I'm actually encouraging them to move it to a more appropriate destination. According to the official FAQ the question isn't appropriate for this forum. However, observing the de facto use of Programmers, I feel that it's appropriate to be here. The moderators can make up their mind where it best fits. To summarize my thoughts on moving it: According to what Programmers is supposed to be it doesn't belong here, but according to what Programmers is it fits perfectly. –  Paul Hazen Apr 25 '12 at 13:35
    
@PaulHazen Well, at least for me (though I'm by no means an expert on SO stuff), it seems absolutely appropriate. –  Dr.Kameleon Apr 25 '12 at 13:39
    
Yeah, I'll just kinda throw my hands up in the air. As long as people can use google or stack exchange to at least find the answers, I'm happy. The content needs to be easily discoverable in the future by people who have the same question. –  Paul Hazen Apr 25 '12 at 13:46
show 1 more comment

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.

share
    
THIS. This is very good. In fact I consider this to be a more than valid answer. The marked answer was just a bit more validier... *sigh* so hard to judge with so many great answers :( Wish I could help your rep out more. But since I know you in real life (but mostly through twitter as we've previously discussed haha), I'll have to buy you a beer or some whiskey as a consolation prize. –  Paul Hazen Apr 25 '12 at 13:29
add comment

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.

share
    
Good remarks for sure, this resonates with me. See update if you're wondering why I'm restraining from marking any response as "correct" just yet. –  Paul Hazen Apr 24 '12 at 9:43
    
And nice updates. Keep the faith, I won't forget to mark an answer as such when the time comes. –  Paul Hazen Apr 24 '12 at 10:56
1  
Could you please clean up your answer? You have two repeated section headers, with different but similar content beneath each. –  Paul Hazen Apr 24 '12 at 16:06
    
Hello Paul, I'm not sure how you would like me to clean it up. I guess it does look a bit confusing. Each sub heading, it related to each question, i.e. each "question" has a "Why" and "Experience" to back the answer as you requested in your update. I'm more than happy to make any changes in terms of clarity. –  Darknight Apr 24 '12 at 21:06
    
Ohhh... that was what was so confusing to me, could you increment the headings or use **bold** text to mark sub-headings? I think it would go along way in improving clarity. –  Paul Hazen Apr 25 '12 at 1:00
show 1 more comment

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.

share
1  
I feel really bad that I can't mark this as the answer. Like so many of the other responses nothing you say I think is wrong, but you focus entirely on how to further my career when the crux of my question is how to be a successful programmer. While successful programmer implies good career, I'd rather focus on the "successful programmer" aspect, and let the career part be (an important and very intentional) after thought. I do give you a "+1" though for valuable information that answers my question in part. –  Paul Hazen Apr 25 '12 at 1:08
    
Oh, and speaking of networking, I'd love to hear more about your story! Sounds like we share a lot of the same path / goals. Feel free to chose whichever contact method works best for you at paulhazen.net/about, and we'll grab that beer. –  Paul Hazen Apr 25 '12 at 1:09
add comment

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.

share
    
This is great, thank you for your response. I give a "+1", however I can't mark it as the answer, other responses thoroughly fleshed out the why, as well as identified ways to objectively determine learning goals. None of this negates your response, I take what you say to heart and it is truly helpful, so thank you once again. –  Paul Hazen Apr 25 '12 at 1:02
    
@PaulHazen - if you want to know 'why?' then pick a philosophy class :-) But seriously, i did a 4 year theoretical CS degree where there was no C course because 'that's something you can teach yourself' To lighten up I picked a small philosophy class one semester and then did another. As well as challenging it was a great group of people and refreshing ideas. And your question clearly demonstrates that you have the writing skills required for any non math/CS class. –  james Apr 25 '12 at 2:59
add comment

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!]

share
1  
+1 Finally an answer to the question. –  Joshua Drake Apr 24 '12 at 12:32
    
+1 for sure. Despite the fact that you forgot 90% of the details, would you say that the experience of learning those details was what ingrained the concepts and ideas, or would it be more valuable to invest time in learning fewer details and more conceptual/higher level ideas? –  Paul Hazen Apr 24 '12 at 14:47
    
@PaulHazen See the new edit (starting at UPDATE2 -- it didn't fit into the comment field ;)) –  zvrba Apr 24 '12 at 16:48
1  
Trying to forecast the industry is a game lost upfront [e.g., I'm not sure that anybody could've guessed that Twitter -- (almost) IRC clone for the web -- would become such a fad. It's still a mystery to me how they intend to make money in the long run.]. You have to take a proactive choice about what kind of job you'd like to do and find out what it takes to get that. How? Find somebody already working in your target industr(y|ies) and talk with them. –  zvrba Apr 25 '12 at 7:41
1  
@Paul The concepts are vital, but the details (usually) aren't. You can look the details up when you need them, but you have to learn the big picture to know that there is something worth looking up in the area in the first place. –  Donal Fellows Apr 25 '12 at 8:46
show 2 more comments

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.

share
    
Such a seasoned user, surprised you didn't take the time to read other user's posted answers, your answer is nearly identical to some that are already here. Please be careful to review pre-existing answers, or if you think your answer is different, help clarify that for me. –  Paul Hazen Apr 24 '12 at 16:04
    
I didn't see anyone else recommend taking CS classes for electives, which a lot of people don't realize is allowed. The near-duplication on the rest is the result of asking a huge multipart question :-) –  Karl Bielefeldt Apr 24 '12 at 18:37
    
I apologize, you are correct. Nobody else suggested CS classes as electives. While it's good advice, and certainly not wrong, some of the other responses have been more thorough and addressed the three questions in better context with the rest of my question. Not to negate any of the advice you give (I give you a +1), it will be taken to heart for sure, sincerely, thank you very much, and again sorry for my mistake. –  Paul Hazen Apr 25 '12 at 1:12
add comment

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.

share
    
Would it be fair to say that from your perspective there is little to nothing inside a CS degree that on its own is helpful towards becoming a successful programmer? Currently I like your answer the best, you certainly hit on a lot of the things I'm trying to figure out and understand. Could you lend some additional context to what area within CS that you do recruiting for? I imagine recruiters hiring new grads for work on operating systems may have different perspectives than yourself (but I could be totally wrong about that). Appreciate the time you took, this is super helpful –  Paul Hazen Apr 24 '12 at 13:11
    
I work for an IT consulting company that recruits pretty heavily in the 0-1 year experience bracket. Can't answer with confidence regarding OS development shops (how many are there?) but I would assume the same goes there, if they are smart. Very few grads are going to have enough subject matter skill to be competitive on that alone, so you hire for attitude, potential and ability to learn. –  pap Apr 24 '12 at 13:51
    
Interesting. Did give you a "+1", and I do like what you have to say more than anyone else, however you are more accurately answering the question, "how do I successfully get into the field of software development" Invaluable information to be certain, but my interest is in understanding the attributes of a successful programmer, not the attributes of a hirable programmer (yes obviously successful programmers are also hirable, but it doesn't always go the other way around). –  Paul Hazen Apr 24 '12 at 14:55
    
I don't hire people who I don't thing are either successful already or have the potential and capacity to be successful. So to me, "hirable" and "successful" are the same thing. If anyone is recruiting on other criteria they are either wrong or bad at spotting talent. Either way, probably not a good place to work. The key, though, as an employer is to know how to harness the potential of your people and convert it into actual success. That's a mix of training, mentoring and coaching and if you don't have it, doesn't matter how talented people you hire. –  pap Apr 25 '12 at 7:51
add comment

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.

share
    
While this is great content, I feel it doesn't quite hit on the mark as to answering my question (something that may very well be my fault in mis wording). I'm not of the firm belief having a CS degree makes one a successful programmer. My question is more "which of the topics taught within a CS degree do tend to contribute to the success of a programmer, and how do I objectively determine how I measure up in those topics, and how do Isupplement/enrich my existing passion, hunger for knowledge, and industry experience with such topics?" Your answer is certainly not wrong. –  Paul Hazen Apr 24 '12 at 13:07
add comment

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!

share
1  
-1 for not answering my question. You're not wrong, but you seem to have skipped my "what I'm not looking for" section, and didn't hit on any of the things I was looking for. –  Paul Hazen Apr 24 '12 at 14:51
add comment

Not the answer you're looking for? Browse other questions tagged or ask your own question.