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 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!
Yeah, I can relate to this. I decided to quit an Information Systems degree that was almost complete, in favor of a CSE degree at a better school. And it's daunting.
But there's some hope. I don't know if this is generalizable industry-wide, but based on my experience at my first software job over the last year, I'd say the fact that you've worked on the projects you mentioned (on your own and for no other reason than that you just wanted to) and checked out an open-source SVN repo at all means you've got a leg up on about 90% of the developers I work with, at least in terms of being engaged (so does being able to use SVN competently as a matter of fact). That and the fact that you are reading and posting on SO :-)
Ok, so that said, let me try to assuage your anxieties about the world of software work (based on my limited knowdege). As a disclaimer, hopefully it's not like this everywhere, but at some places it's definitely going to be.
Ok. Done. Final word of advice is PLEASE get the CS degree and PLEASE get a job in the software industry. From my seat, it desperately needs people who actually give a sh*t about programming (better yet people who love and are obsessed with programming!).
The most important thing is a passion for the art. Everything else is secondary.
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 [1] (and other related challenges) by the time you're done.
[1] http://www.codinghorror.com/blog/archives/000781.htmlYour 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.
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:
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.
The main additional things you need to know/do as a professional programmer (as opposed to a hobby programmer):
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 [1] 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 [2]. For C++ take a look at Sutter [3] and Scott Meyers [4].
[1] http://rads.stackoverflow.com/amzn/click/0316778494I 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:
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 [1]. 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.
[1] http://www.accu.orgI 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
I think the best bit of advice I've ever read is this:
Write software. Write lots of it. [1]
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.
[1] http://www.codinghorror.com/blog/archives/001160.htmlRegarding 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.
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
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.
The most important requirement is self-belief.
The Samurai Coder, Hideo.
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.
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.
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.
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!