views:

1694

answers:

19

I've been interested in computer programming since I was about 14 or 15 years old. I taught myself C++ (with the now-deprecated libraries such as iostream.h), and wrote some simple console programs. Just basic stuff, like a program to convert arabic-numerals to roman-numerals and vice versa. Time went by and I didn't do anything else related to programming.

When I was around 20 or so I took a college course on Java as an elective, which I didn't particularly like, but the class did get me interested in programming again. I again took up learning C++ (this time with the standard libraries), and even created some basic games (pong, tetris, etc) using the SDL library. At this point in time, I would describe myself as being absolutely addicted to writing code! I would stay up all night perfecting my collision-detection algorithm, or reading tutorials, etc.

I decided then that I wanted to major in computer science (I was a social science major at the time), and successfully made it through the calculus and physics courses required by the university for computer science. This was a late change for me, as I was only 5-6 classes away from graduating with the social science degree. Unfortunately, mainly due to a combination of financial reasons and fear that I just wasn't smart enough to make it in computer science, I decided it would make more sense to just finish the social science degree in one semester (as opposed to 5-6 semesters for computer science) and get a job. And that's what I did. And I've regretted every minute of that decision.

I'm now 24, going on 25 soon, and worked in the social work field for about a year and a half. I really hated that job. I hadn't done anything programming related for a couple years at that point, but found myself working on some side-projects designing and implementing office automation scripts and various mshta applications. Most of these I started on my free time (such as breaks and lunches) to make my job or my co-workers' jobs easier. I really liked working on those projects, but it wasn't my primary (or secondary, or even tertiary) job, and the time I had to work on the stuff was very limited. And towards the end it was non-existent, due to changes in employee policy.

So, I quit that job a couple months ago, and I re-enrolled myself at the university to major in computer science. My first course will be in a couple months and I'm very, very excited to finally do what I really want to do. And now I'm nervous sick that I just won't be able to make it in the field! I feel like there are a million things to learn, and that I'll never know enough to be competitive, or even just competent.

Some of the things that really concern me:

    I'm no good at reading other people's code. I've svn'd some open-source projects and didn't even know where to begin! I know that reading code is a skill that takes time to get good at, but it seems like such an insurmountable thing to achieve to me right now, that I don't know if I'll ever be able to do it.
    I usually have no idea how to approach programmer "interview questions," until I read the solution and I'm like "aha!" I'm worried that I will freeze up if given one of those types of questions on a real interview.
    I know that the computer science degree will not prepare me for a real-world programming job, but I also don't know what I should be learning in addition to the degree in order to be prepared! I have some books that I'm reading through (currently "How to design programs", "Beginning Visual C++ 2008", and "Pro C# 2008") but I know that book learning != practical learning.
    I'm relearning C++ and C#, even though in the past I've written programs in both languages, I just don't remember how to do things in those languages. And I get frustrated because the books I read always want to explain what a variable is, what a for loop is, etc. I know all of that stuff already. I feel like I'm constantly relearning the same stuff, over and over again. I think my knowledge level at this time is somewhere between "laughable" and "enough to be dangerous," but I don't know how to get beyond this.

I apologize for such a long-winded question/post. I guess, basically, I could sum up most of the above with "I feel lost, and don't know if I'm heading in the right direction." I don't have a friends who are programmers, and I don't know anyone in the field, so I don't really have anyone to bounce these concerns off of.

Edit Thank you all for your answers to my question(s). I greatly appreciate it!

+26  A: 

The most important thing is a passion for the art. Everything else is secondary.

Shane C. Mason
i don't agree, but a downvote?+1 to neutralize
Oliver N.
One has to have the "passion" and patience, and persistence, and training, and more passion. +1
MarlonRibunal
The point is, I have never worked with a 'good' computer programmer that did not have a passion for the art. You can overcome many other deficiencies (math skills, experience level etc etc) but a lack of passion is a road block.
Shane C. Mason
True, but not terribly constructive advice.
Norman Ramsey
More craft than art IMHO.
Si
I agree, passion for programming overshadows everything. +1
Cyril Gupta
Any well practiced craft is indistinguishable from art. There is a reason Knuth called it the art of programming and not the craft of programming.
Shane C. Mason
@Oliver: I was the downvote. This one liner is an empty, feel good response that everyone wishes was true, and doesn't accurately answer the question. Your passion 'for the art' matters less than your dedication, willpower, and goals - great programmers treat the code as a means to another end.
Frank Crook
I totally agree with this.Although most developers I know do not like development or computing! The ones who do really stand out and are generally much better than those who do not.
Techboy
I agree with this, but it doesn't really answer his question.
Ryan Thames
+14  A: 

Your experience sounds very similar to mine, minus the college degree ;)

Here's how NOT to get bogged down in all the details: focus on what you want to be able to do once you learn how to program. All the minutiae will come through your study, don't worry about it so much. Find a website, a program, a system that will make people's lives easier and devote yourself to making it work.

My first programming gig was an Access membership database for a single's event club. They were broke and didn't know better and neither did I. I was paid pennies on the hour overall but it was an AMAZING learning experience.

You do not have to learn this stuff overnight. If you enjoy it as much as you say it will happen naturally through the crazed 2am "need to know." Welcome to the club! :)

EDIT: I don't intend to influence your going back to university for the CompSci degree one way or the other. There are arguments either way, personally I think it's a good thing. Just make sure you can pass a FizzBuzz test (and other related challenges) by the time you're done.

Dave Swersky
+1 - This sums it up "You do not have to learn this stuff overnight". That is called PATIENCE and PERSISTENCE.
MarlonRibunal
True, although I think it's a little more correct to say, You "can't" learn this stuff overnight.
Kibbee
+4  A: 

To answer your question directly it takes patience, persistence, and passion to be a programmer.

The art of programming is a large and complex field which is growing more complex by the day as people create more dynamic and distributed programs. You must take things in peices and be comfortable picking up the details along the way. Much like eating an elephant, one byte (sic) at a time, you must put to rest your need to understand the larger picture and analyze parts individually. Being a programmer, as was mentioned earlier, requires passion for the art. It also requires the patience to learn and digest things in peices. Sometimes it requires working with only a subset of all the required information being easily available. Luckily with time the larger picture reveals itself to you and the whole architectural elephant is really something to behold.

ojblass
+1  A: 

Regarding your concern about the interview questions. AHA type questions tend to do a pretty poor job of assessing candidates. Either you know the answer or you don't. You could spend several hours scouring the internet looking for these types of questions and their answers and be prepared (knowing nothing else about programming) for this kind of interview. But you don't want that job. The person doing the interview probably doesn't know too much about what your programming gig will be like.

Other bad signs could be a preponderance of questions about minor subtleties of some language. If the entire interview is trivia questions, the interviewier is testing if you know more about the language than he does. You might not want that job either.

Good questions don't have aha answers. The interviewer might ask you a question like "how would you implement, say, an invoicing system, in plain Ansi C99?" Obviously, You cannot provide an implementation in a single interview, But in discussing the design of some of the parts, an interviewer will learn how you solve problems, and get a good idea about the kinds of problems you've tackled before.

TokenMacGuy
+5  A: 

My suggestion is to start with a project in mind. I'd suggest learning Objective-C and developing an iPhone application. Having a project gives you a tangible goal and an end-result that will be both rewarding and something you will be able to look back on many years later and appreciate.

Here are a few things to consider:

  1. Pick something that interests you
  2. Start small, getting something up and running quick is the key
  3. Work iteratively, each time adding a little something more
  4. Pair with a friend. Do you know anyone else that is also interested in learning?
  5. Try to find local User-Groups for the techology you are interested in and attend some meetings.
raiglstorfer
A: 

The most important requirement is self-belief.

The Samurai Coder, Hideo.

A: 

It takes nothing to become a programmer. It takes talent to become a good programmer. The difference between a good coder and a marginal coder is staggering. Some studies say it is as much as a 10:1 ratio in productivity. If you don't have the talent, you can still become a programmer, but you will never be a very good one.

Edit for the naysayers:

Programming managers have long recognized wide productivity variations between good programmers and poor ones. But the actual measured magnitudes have astounded all of us. In one of their studies, Sackman, Erikson, and Grant were measuring performances of a group of experienced programmers. Within just this group the ratios between best and worst performances averaged about 10:1 on productivity measurements and an amazing 5:1 on program speed and space measurements! In short the $20,000/year programmer may well be 10 times as productive as the $10,000/year one. The converse may be true, too. The data showed no correlation whatsoever between experience and performance. (I doubt if that is universally true.)

– “The Mythical Man-Month: Essays on Software Engineering” Frederick P. Brooks, Jr.

JP Alioto
What is this elusive talent? Something that god gives you in the womb? -1 for vagueness and rambling.
Cyril Gupta
Yes...is it nature or nurture that makes some of us ROCKSTAR PROGRAMMERS (http://www.codinghorror.com/blog/archives/000552.html) ...?
Troy Nichols
Neg me down all you want. It's true.
JP Alioto
"Within just this group the ratios between best and worst performances averaged about 10:1 on productivity measurements and an amazing 5:1 on program speed and space measurements! In short the $20,000/year programmer may well be 10 times as productive as the $10,000/year one." The Mythical Man-Month
JP Alioto
It's an interesting study, but all it's telling us about is the disparity between good programmers' and poor programmers' performance. This doesn't really say anything about whether these good programmers' skills were conferred upon them at birth as "innate programming talent" or anything.
Troy Nichols
+6  A: 

Your degree program should help with all the things you're anxious about. But here's some advice:

  • Take the courses with the best professors and the most challenging projects.

  • If a course is not challenging you as a programmer, ask the professor for an extra project.

  • Go to office hours!

  • Brush up on your basic math: sets, functions, relations. If you haven't had that math, get it early. Make sure you take math that requires you to do proofs---in this regard, most required calculus courses are worthless. Find a math course for computer scientists or take the intro calculus course that the math geeks take.

  • Not every professor is a good programmer, but if you're not learning to write programs, design software, or prove theorems, it's not a good course.

I've been a professor for 14 years and I know hundreds of CS professors around the world. Most of them, at colleges of every stripe, will go the extra mile for a returning adult student who really wants to learn. You don't have to be the smartest student; if you are the most interested and the hardest working, your professors will do anything for you.

Norman Ramsey
+27  A: 
Troy Nichols
I'm sorry - I think my answer is longer than your original question...
Troy Nichols
+1 That's a very healthy attitude towards interviews... the kind of positive thinking that interviewers notice and appreciate.
Jarret Hardie
A: 

I agree with you JP.

Mediocre programmers are many compared to the talented ones.

That's just the way it is, even in other professions, i.e. lawyers, doctors, engineers, etc.

Hideo
+1  A: 

I can relate to some of the stuff you say hehe. Now that you will be a CS Major you can apply to REU (Research Experiencie for Undergraduates) sponsored by the NSF. I mean, you get to actually work with CS researchers doing nice CS stuff as an undergrad hehe. That also gives you a better understanding of what kind of programmer or computer scientist you want to become. You will learn a lot, believe me! Check this out: http://www.nsf.gov/crssprgm/reu/reu_search.cfm

jasonco
+3  A: 

The main additional things you need to know/do as a professional programmer (as opposed to a hobby programmer):

  • Communicate with customers or analysts. You'll be writing code for other people to use, and you'll need to get them to tell you their requirements. This is much more difficult than it sounds - the typical "I don't know what I want until you show me soething and then I tell you what's wrong about it" thing.
  • Work with other programmers on huge projects that no single person can even understand entirely. There are lots of different and sometimes contradicting ideas about how to do this "software engineering" - ranging from agile/extreme programming to various heavyweight formal processes.
  • Read other people's code, no matter how horrendous it is. This is always an overwhelming and frustrating experience, for everyone. You just have to be persistent, find "entry points" and expand your understanding from there.
  • Use third party components and API libraries - quite similar to the above. "Reinventing the wheel" is the typical mark of the amateur programmer, but even though it feels like it's more work to understand a complex API library than just rewriting the part you need, it usually isn't.
  • Use high-level tools like debuggers, profilers and continuous integration (as part of an IDE or separate products). They can be hard to configure and get familiar with but can save you hours of work.
  • Finally: stop believing in magic. Barring faulty hardware, the computer always does exactly what you (and the programmers whose code you're using) told it to do. Unfortunately, that is often not what you meant. With enough persistence, any bug can be understood and fixed.
Michael Borgwardt
+2  A: 

Short answer - take the course, enjoy it, do your homework, pass the exams and don't fret about the career side of it until you have to. By then your perspective will be very different. Being slightly older than a lot of your peers will also be a huge advantage at interview time, you'll be able to express yoursefl better and simply appear more mature.

Longer answers to you points:

I'm no good at reading other people's code.

Yeah, this is a skill and will take some learning. People have different styles, different idioms and frankly they might be writting rubbish - it takes a long time to be good at this. And guess what, when you graduate you'll not even be half way to learning this, but then again no one else in your peer group will be either.

I usually have no idea how to approach programmer "interview questions,"

Well, make sure you take algorithms courses:-) And then practise, that's all I can suggest. If you are worrying about the "How would you move Mount Fuji" type question then relax, no sane company uses those any more (including Microsoft), and if you read the book with that title yo'll have them covered anyway.

I know that the computer science degree will not prepare me for a real-world programming job

I'd say it won't fully prepare you, but it's a very good start. Focus on the course for now, focus on the "professional" stuff later, it is far, far more important to get good grades and a solid understanding of what you are taught.

I'm relearning C++ and C#, [...] I know all of that stuff already.

You need to find better books. Seriously, for C# take a look at Jon Skeet's book. For C++ take a look at Sutter and Scott Meyers.

Steve Haigh
+1 for the book recommendations
Phil Nash
+1  A: 

I don't have a degree. I never went to university. I've been coding professionally, mostly in C++, for 17 years now. I'm regarded as a professional by my peers.

In my experience you need two things:

  1. Passion for the genre (sounds like you do have that)
  2. Persistence

Round that out with a professional attitude and always wanting to better yourself and you'll be fine. Ability helps, but not as much as the desire to always do better.

Not all interviews involve puzzle questions. You might have to go to several interviews before you get your first programming job. But once you do your career has begun. Once you start doing this stuff every day you'll overcome many of your initial concerns. At some point you'll have outgrown your first position and will move on - either within the same company or to a new one.

Try to go with a mid-size company. Too small and you won't have enough colleagues to learn from. Too big and you'll just be a number with stuff to churn out.

Also, echoing Steve Haigh - make sure you read the right books. The ones he mentioned really make a difference.

Oh, and join the ACCU. Although it's a UK based organisation it has an international membership, and the respect of people such as Bjarne Stroustrup and Andrei Alexandrescu. The mail forums will give you the combination of high quality tech talk and social community that will draw you out.

Phil Nash
A: 

The fact that you even bother to make a post like this would put you well above my class-average :)

Go for it. Don't worry about all your questions. You'll find the answers in time!

cwap
+1  A: 

I think the best bit of advice I've ever read is this:

Write software. Write lots of it.

I had most of the same concerns as you, particularly about whether I would ever be good enough to cut it as a programmer. I coasted in my first 3 years of university because I wasn't sure whether I wanted to be a level designer, artist or programmer. Going into my final year, I wasn't on the same level as the folk who worked hardest.

However, once I realised that programming was the discipline for me, I worked flat out in the final year and really enjoyed it. As a result, I probably learned more in the final year than I did in the first 3 combined because I wrote code every single day for the best part of a year. A year and a bit of working professionally has taught me just as much again.

If you are 100% sure that this is what you want to do with your life, just stick in and get a decent degree award. Then, once you graduate, follow this routine:

while(!haveJob)
{
   ImproveSkills();
   haveJob = TryGetJob();
}

If you are dedicated, you will more than likely make it. All of your concerns should drift away over time :) Don't worry about interview questions and things like that, either. Broach that particular topic when the time comes.

Best of luck.

Mark Simpson
A: 

If you really like programming, just do it! Not everyone can be a coding hero, but you can make a live with the things you like to do, that's really cool.

Bruce Li
+1  A: 

Interesting post,

I just like to add one point...

You might never become as good as other programmers, there are millions out there some dedicated there live to this topic... if you still want to have a "normal" life and just programming should be your job to make a life, you might never be able to compete with those who live programming 24 hours a day (probably, by shortcutting other social aspects of there live). Nevertheless, you already have some strength which makes you much more valuable to companies. You have a degree in social science!

In your case I would not waste this. Finish up your computer science degree and explicit search for a job where a social science aware programmer is needed. Might be more tricky as to find a standard programmer job, but finally you will perfectly fitting to this job. Your new boss will be happy, since he have a programmer he don't need to tell the basics of social sciences (which might result in a better salary). And you will be happy since you can code in an environment you are truly the best choice.

In simple words... I believe it is always good to work interdisciplinary. That's what make you better then the main amount of all "standard" programmers out there.

During your studies try to combine already as much as possible both disciplines and try to get a feeling what is needed in the software world of social science...

Just my two cents

+1  A: 

You didn't exactly specify your goal as a would-be-programmer, but since it seems you really like this field, here's my suggested path to becoming a good programmer. You can mix it up all you want of course, but this is how I see it after 10 years as a professional programmer.

Learn the fundamentals.

-Take the time to go through the theoretical stuff. Even the esoteric stuff you are unlikely to need ever, like compiler construction and program verification. You'll benefit from it even if you write rather simple enterprisey Java stuff. And you won't have the time to go through that stuff after you have a day-job as a programmer so now is the time.

-Do not "cheat" on the fundamental programming courses and algorithms. Knowing the quicksort algorithm inside-out has value even though you'll never implement it manually.

-99% of the people who try to convince you that you won't need any of that theoretical mumbo-jumbo are not very good at it themselves, so you can ignore them. Haha. Listen very carefully to the 1% should you encounter them though.

Read good stuff.

-Decent web resources are abound these days. I recommend Steve Yegge's drunken blog rants for starters.

-Some books, which you should read multiple times regardless of your language:

  • Structure and Interpretation of Computer Programs,

  • Code Complete 2nd edition,

  • Pragmatic Programmer from
    Journeyman to Master,

  • Professional Software Development,

  • Clean Code.

Notice that I listed books you are unlikely to bump into at the university. This is essential and practical stuff they leave out of your master's degree, which is one reason the university doesn't do that good job at giving you the skills necessary at the "real world".

Write code. A lot of it.

-Throw the old bad stuff away and refactor your mistakes.

-Try different approaches even if you manage to solve some problem.

-Rewrite until it's as good as it gets. Review after six months and you'll notice it wasn't.

Read other people's code.

-Yes it's difficult first. Start with something small and familiar. Your brain will chunk familiar patterns and antipatterns together so that you'll outperform your former-self 40-to-1 later after you know more.

And then just keep doing all that. If you have a job as a programmer, still spend at least 15min each day on one of the topics. Your daily job will not push you forward after the first couple of years.

It will still be a very long path to become truly great, because there are many extremely smart people out there who invest more than 15min/day to get better, in addition to their daily jobs as programmers. This may sound worse than it is. In any area the truly great professionals love their art and invest a lot of time to get better even after they are already good.

And, there are great benefits from this approach. Once you'll become good, you'll get to choose where you like to work and on what kind of projects. You'll be also paid well.

Finally, it will be great if you manage to get decent feedback on your own code and have the guts to digest it. This will not be easy and it is not strictly necessary, but having a good mentor will be very valuable. Most likely you'll get good feedback from your employer, but it can be found in the universities too. Most members of the faculty are hopelessly clueless outside their special niche topic.

lokori