Programmers Stack Exchange is a question and answer site for professional programmers interested in conceptual questions about software development. It's 100% free.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I'm graduating with a Computer Science degree but I see websites like Stack Overflow and search engines like Google and don't know where I'd even begin to write something like that. During one summer I did have the opportunity to work as a iPhone developer, but I felt like I was mostly gluing together libraries that other people had written with little understanding of the mechanics happening beneath the hood.

I'm trying to improve my knowledge by studying algorithms, but it is a long and painful process. I find algorithms difficult and at the rate I am learning a decade will have passed before I will master the material in the book. Given my current situation, I've spent a month looking for work but my skills (C, Python, Objective-C) are relatively shallow and are not so desirable in the local market, where C#, Java, and web development are much higher in demand. That is not to say that C and Python opportunities do not exist but they tend to demand 3+ years of experience I do not have. My GPA is OK (3.0) but it's not high enough to apply to the large companies like IBM or return for graduate studies.

Basically I'm graduating with a Computer Science degree but I don't feel like I've learned how to program. I thought that joining a company and programming full-time would give me a chance to develop my skills and learn from those more experienced than myself, but I'm struggling to find work and am starting to get really frustrated.

I am going to cast my net wider and look beyond the city I've grown up in, but what have other people in similar situation tried to do? I've worked hard but don't have the confidence to go out on my own and write my own app. (That is, become an indie developer in the iPhone app market.) If nothing turns up I will need to consider upgrading and learning more popular skills or try something marginally related like IT, but given all the effort I've put in that feels like copping out.

EDIT: Thank you for all the advice. I think I was premature because of unrealistic expectations but the comments have given me a dose of reality. I will persevere and continue to code. I have a project in mind, although well beyond my current capabilities it will challenge me to hone my craft and prove my worth to myself (and potential employers). Had I known there was a career overflow I would have posted there instead.


migrated from Feb 4 '11 at 15:07

This question came from our site for professional and enthusiast programmers.

locked by Yannis Mar 13 '12 at 19:46

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.

130 Answers 130

Best way to learn to program is to write programs.

Two suggestions :

  • develop a game
  • develop a web site

Algorithms, while useful, and should be understood, actually play second fiddle to software design. TDD / Design Patterns / Architecture / Refactoring / Unit Testing / The process of putting code together / etc tend to be far more important skills.

Also, far better to do this in your own time. Don't wait to work this stuff out on the job. I find the people who tend to do better are the ones who early in their careers put the effort in to develop their skills in their own time. Usually because they are genuinely passionate about software development

  • One more thing is to "Read books and samples" and don't be ashamed to ask. If you want to learn you should ask :)
+1 Agreed. And if you don't WANT to do this stuff on your own time, this might not be the best career path for you. If you put stuff together now, you can build a portfolio that can supplement your GPA. – Chris May 13 '10 at 0:01
@Chris, -1. That's like saying that a lawyer who doesn't do pro bono work for the indigent on his own time is in the wrong career. Many programmers I know would be better off spending less time programming and more time doing almost anything else. – David M May 13 '10 at 0:13
actually a lot of lawyers when cutting their teeth, get paid badly and put in a lot of extra hours just to get ahead. – Keith Nicholas May 13 '10 at 0:27
You cannot really compare a lawyer job with a programmers job. With programming you can acquire skill on your own; you don't need any employer or clients to improve that part. – Anonymous May 13 '10 at 3:02
Really, you need to stop thinking programming is special. Lawyers can work/learn on their own just like we can. They may start off on poor-paying jobs and work long hours, but so do many programmers... the "if you don't program as a hobby you shouldn't be a programmer" line is really very subjective. – John May 13 '10 at 9:07

Have you looked at ProjectEuler? I taught myself Python by doing the problems on that site. :] If you're after learning Java or C#, you can try that out. Also, I recommend trying your hands on GUI programming as well.


Here's a great topic on SO for many links you can look into for coding practice:

I've heard a lot about the site but never had time to attempt the problems, but nowadays it seems like the only thing I have is free time so I might as well keep busy. – wp123 May 13 '10 at 0:13
Project Euler is of very little use to a novice programmer wanting to build programming knowledge. It's oriented towards figuring out how to solve math problems by coding algorithms. You can do a million of those without becoming a good programmer (you'll probably become a great mathematician though). Writing great algorithms isn't a high priority for most programming work. – Charles May 13 '10 at 16:03
I would disagree Charles - Euler will provide motivation to understand certain concepts and execute upon them. – Broam May 13 '10 at 20:30
6 is key! While Euler are math problems to be solved by programming, pythonchallenge are pure programming problems – Xster May 14 '10 at 17:26

Start a personal project. The trouble with school is that the most complicated thing you did there was a project that took 15 weeks to a year and involved a couple other people. The problem domain was well-understood (your professor didn't give you any tasks that didn't fit neatly into your semester.) This is not a luxury the real world affords.

If you have to do something major, start-to-finish, that you can be passionate about, your brain will start to wrap around the process. As long as this is just a career and you don't have a love for it, you'll still feel like you haven't made it yet.

+1. I concur completely. Start a small app, and then add functionality as you see you want it. As the building goes on, and you start to realize what more can be done, you can add it in. – mmr May 13 '10 at 0:31
"The problem domain was well-understood (your professor didn't give you any tasks that didn't fit neatly into your semester.)" This is one of the biggest problems with computer science education. There are a few CS or software engineering programs that address this problem, but most don't make you think outside the box. You really need to take on your own projects. If you don't know how Stackoverflow was built, try making a clone yourself. You'll learn far more than any class can teach you. – Matt Olenik May 13 '10 at 2:18
  1. Start on one of those in-demand languages,using a project as K. Nicholas says.
  2. Don't measure yourself by StackOverflow. That will discourage you unnecessarily.
+1 for #2 - don't compare yourself and the knowledge of a crowd. – g.f May 13 '10 at 0:11
StakOverflow itself is a virtuoso product. Not to mention, there are people contributing with many decades of experience in a huge variety of products. – Andrew McGregor May 13 '10 at 0:17
I wouldn't consider it a bad thing to measure yourself against StackOverflow, there are a lot of smart people here. Some are smarter than you will ever be. However those are the people that make you want to keep learning. – R0MANARMY May 13 '10 at 0:20
Hey, I know why I'm addicted to SO! It's terrific for a dozen reasons. But it's humbling to be continually exposed to all the things you don't know. One has to be a bit careful not to feel daunted, that's all. – Smandoli May 13 '10 at 1:23

Programming isn't all about your understanding of algorithms or your GPA during college. Programming is about having the ability to think outside the box, desire and willingness to learn and most important of all, creativity.

On a personal note, I had just graduated college last May and I had a terrible GPA. I had focused more on my social life than academia and I paid the price.

However, during my recent job interview out of college, (which had took me less than a year to land) I showed off my creativity, passion for learning and analytical skills, which had helped me get the job.


There was a scene on an old Law & Order in which a DA complains that she learned nothing about how to do her job at law school, that she didn't learn anything about the real world. The professor to whom she's complaining replies, "It's a law school, not a lawyer school."

The same applies to computer science. Perhaps you didn't learn how to contribute immediately to some project you see online, but you probably developed the foundation you need to be successful in the long run.

First, get a job, any job. Become self-sufficient. Particularly in the current economy, I would never fault any candidate for working at a bookstore or whatever while they look for more appropriate employment. I do have questions for people who sit around doing nothing.

Find a project, any project. There are many applicable projects on for instance.

The good news is that a lot sooner than you think, no one will care where you went to school, what your GPA was, or anything like that.

Hang in there! It can be tough going, but you'll be glad of the experience one day.

We recently have a discussion at job about this. Do you really think getting an unrelated job to your career is going to help your cv at all? If you need to pick up fruit for financial reasons, fine but I don't think it has a place in your cv if you are trying to build a career as a programmer. If you don't have financial constraints better to participate in a project without economic compensation or trying to set up your own business. Participating in open source projects or something related to the field, even as a field technician is much better in my opinion. – piotr May 14 '10 at 8:23
@piotr - You said it yourself - "If you don't have any financial constraints." Any recent college graduate is going to have this problem unless they live with mom and dad. I agree with David M - if you can't find a job directly in your field, get some job. Show that you don't just sit around. Then, when you aren't working at your day job, continue learning at night and understanding your field through projects, etc. Of course, be calling and sending out resumes as well. – JasCav May 14 '10 at 15:50
piotr: "Do you really think getting an unrelated job to your career is going to help your cv at all?" Yes, absolutely. I'd think much more highly of a programmer working construction during downtime than of a programmer sitting at home all day. It shows a work ethic. I've never ended up wanting to hire a lone genius who sits at home writing code alone. They don't tend to know how to work well with others, or do the dirty part of jobs. – Ken May 19 '10 at 23:50

I found this wicked site the other day Under website design or other design you can probably find some software related projects.

This would be a great way to get coding, develop some new skill, meet some new people who may be potential employers and you may even make some money.

I have found there is great value to employers in showing that even though you didn't have a job you weren't sitting on your arse. Show that you got out there and did some projects, preferably ones you can show off at an interview.


I felt like I was mostly gluing together libraries that other people had written

While I understand why you feel like this wasn't "real programming", the truth is that integration work makes up a significant percentage of the typical workload for a corporate programmer. Your experience might be a little more valuable than you think :)

+1 for glue. Nobody would hire a group of professionals to build a new home and expect them to invent brand new techniques in home building in the process. In fact, anyone interested in managing risk and budget would probably prefer they not do that. – Dan Bryant May 13 '10 at 0:31
I agree there are some edge cases out there but I would say that 75-80% of the programming jobs out there are the kind where you are just gluing libraries together. – b_richardson May 13 '10 at 13:18
And there is nothing wrong with just glueing together libraries. That is what makes you productive! – Hans Westerbeek May 13 '10 at 16:24
Definitely like 90% of my work is either hooking up other people's code (libraries or legacy code) or maintaining older code. But I spend my extra time learning bits and pieces as I go, so that now I do know how a lot of those libraries work, and have a much deeper understanding of what goes on under the hood in general. Be a lifetime learner, and you'll pick it all up eventually. – CodexArcanum May 13 '10 at 20:07
When I'm not gluing together libraries, I'm usually making libraries that I will later glue together. – Atømix May 14 '10 at 13:41

Firstly, hang in there!

Secondly, here are some things that helped me:

  1. Keep your job search up beyond your region of interest. Definitely be ok to re-locate. Great chance to get out and see a new place!
  2. Because experience is low, I think interviewers want to make sure you're someone that will be excited and energetic about working and solving problems. So I made sure I was interested in coding for the company. Which I was ;)
  3. Ask your interviewer questions. Research the company and have some material ready during the interview. What design patterns do you use? Why X technology instead of Y technology? I feel this rounds you out as a person during the interview and gives you a chance to take a break.
  4. Code for fun at home! It doesn't have to be successful, but just write code that maybe utilizes a technique you've read about or a technology like a database.

Thirdly, I was in a similar boat as you when I graduated so again, hang in there and keep searching. Your first job is out there.


Graduating with a comp sci degree no more makes you a great programmer than graduating from a music program makes you a great musician.

There's no substitute for practice, practice, practice and experience. Program 8 hours a day and in 5 years you might have that understanding that you lack right now.

That's a catch-22 isn't it? Program full-time to get the job you want. – Jim Schubert May 13 '10 at 0:16
No, in 5 years you'll realize that you know nothing :) – Earlz May 13 '10 at 1:34
@Earlz, And the nothing that you do finally know is already obsolete. – Dan Bryant May 13 '10 at 2:18
Indeed -- with all the "Java schools" (which may or may not have been the case here), it's easy to forget that computer science is not programming. I know people who took a CS degree and went to med school, and biologists who ended up as programmers. Yet nobody ever asks why a biology degree didn't make them a surgeon: everyone knows that studying biology is not practicing medicine. – Ken May 13 '10 at 2:24
@Earlz how very Zen :) – Tullo May 17 '10 at 23:38

Let me join the chorus of people shouting the obvious "Practice". It is definitely the primary way to really learn to program.

But, if you are looking for practical advice in getting that first programming job, let me recommend certifications. There are a lot of people out there that bemoan their flaws, and most of them are right. Certifications are flawed. With that said, many employers look for them. When applying for jobs when I first entered programming I was flat out told that my certifications helped me get the interviews. When I started doing the interviewing, someone with a significant certification always got an interview. A certification will probably not help you get a job, and it should not, but it will help you get the interview, especially when you are first starting out.

Also, do not be afraid, especially in this economy, to take a non-programming job while you continue to sharpen your skills at night. I would recommend trying to get it in something computer related such as in help desk or software QA, but that will help keep you financially stable while you look for a programming job and it will build your resume and hopefully develop contacts.


First, thank you for an immensely honest question. There are a number of ways to tackle the issues at hand. Here are a few tips, which I considered very helpful for me in the past and still continue to use them to broaden my knowledge.

  1. Learn, Learn and Learn some more. This is probably the single most important tip I can give you. Never stop learning. Knowing one language is good, knowing multiple is even better. Having knowledge of other languages will make you a better programmer and will make it easier to tackle certain tasks and will help you gain a better knowledge of common data structures.

  2. Start small.

  3. Start a hobby project in your spare time. Don't do something you can accomplish fairly easily. Take on a project wherein you have no idea where to begin. Throw yourself in the deep end. The benefits of this is that you will learn things you never knew existed and when you do complete it, you will feel an immense pride and satisfaction. This is what keeps me going.

  4. Have a genuine passion for what you do. Although people will disagree with me on this one. I do not believe you can excel in this field if you simply consider it a 9-5 job. There has to be a passion to do it.

  5. Help out other people on SO! The best way to understand is to try to teach it to other people.

  6. Study other peoples programs and try to figure out how they work, then implement similar techniques in your own programs. Try to read it and get a understanding of it, then do it yourself based of that understanding, rather than copy and paste.

  7. Keep at it. Things can get very frustrating at times, but very rewarding when finished. If you do not understand something, take a break, clear your thoughts and try again. Ask us at SO! We are a willing bunch :)

  8. Never stop learning new technologies.

  9. Read some books. I understand being a student, you would have done a tonne of reading. Here are a couple of practical books that you might find handy… hopefully -- The Pragmatic Programmer: From Journeyman to Master -- Code Complete: A Practical Handbook of Software Construction

Add Clean Code to your to-read lists, it's pretty good. – lemon May 13 '10 at 23:56
"Knowing one language is good" -> wrong. Knowing one language is not enough. Knowing multiple languages is good, learning even more languages is even better. – Denilson Sá May 14 '10 at 19:20
"Start Small" refers not only to selecting approachable projects, but starting to implement workable portions within a project. A project of mine started with a little experiment in parallax, and me thinking "that looks like a pretty cool star field for a background of a game". Add a ship... add an alien... add a few missiles, keyboard control and collision detection (each simple problems, by themselves) one at a time and soon, I had a commercial game I sold for (what I thought at the time) a good bit of cash. On the other hand "write a game" is a vague, unapproachable task. One bit at a time. – mmc May 14 '10 at 23:06
@Denilson, could you have learnt multiple languages without learning one language first? – Péter Török May 15 '10 at 19:42
+1 for Code Complete and Pragmatic Programmer - two of the most influential books in my early career as well. – GalacticCowboy May 18 '10 at 15:22

First, don't worry that you can't code google. Google was made over a number of years by a lot of very experienced programmers. That's like finishing a visual arts degree, and wondering how you could make The Last Supper.

For job hunting, don't sweat the requirements. Just call them, and say that you don't have the years, but you would still like to apply. If they really want the experience, ask if there are more junior positions available - they might be able to create a new position just for you. Most jobs are created for a specific person. Make sure you contact the project manager, not the HR department. HR doesn't usually create new jobs, they often just screen applicants for existing jobs. Google is your friend in this case ;)

Don't try to code a web app (like google or stack overflow) unless you want to invest about 6 months. It's a huge learning curve. You need to learn to manage a VCS, run a web server, HTML JS and CSS coding, a database system, and the web app language. It's brutal. Most of these technologies aren't transferable unless you want to do web work.

If you do want to do web apps, you might look at installing a simple web app (like this django-based IP to country lookup app - You could shop around for a $90 dreamhost discount code (so you can work on a real web server), and try to set things up. Don't worry too much about security or performance (but do use ssh) - it's just a learning project.

If you want to do stuff on the desktop, you could have a look at pygame.


You can read all about programming, but you won't learn how to really program until you well.. start programming!

I would recommend you start a personal project. What's something that you want to create? a game? A blog? It doesn't matter. Just make something!

Then, after doing some real coding for a bit(few weeks or months) I recommend trying to contribute to open source projects. The personal project helps you to figure out how to program when the goal is not already laid out for you(knowing how to actually design something is not often taught in school). Contributing to existing projects teaches you to work in a team and to follow code standards.

I wouldn't waste my time reading a whole lot else. I'd say at most you should probably read about 20% of the time and write code the other 80%. (of course, by time, I mean your time set aside for programming related things)


Your humility will serve you well. The Beginner's Mind is helpful for all kinds of learning, no matter how much education and experience we have.

Work through exercises, as others have suggested - at Project Euler and elsewhere.

Work out solutions to help others here on SO. The exercise of understanding the question, determining what you know that can apply, and finally articulating an answer will help build your confidence, as the exercises build your skills.

Stick with it; you'll be fine.

Humility will serve you well, except when it doesn't -- to get your foot in the door (including on a personal project) you need a certain amount of chutzpa, you may even need to be irrationally confident. – Ian Bicking May 13 '10 at 20:16

Writing games is always a win, assuming you like games. Of course in my day, our idea of "advanced graphics" was Rogue. Nowadays, I don't know how folks make games without a large set of graphic assets. At least games that don't utterly depress you because they look yucky.

Truth be told though, if you're caught up in the coding part, what it looks like is actually rarely important. But it can be discouraging.

Writing a web app gives you real experience working with other services, notably databases, and that can be invaluable. Knowing SQL is really important I think, but it's the most boring thing in the world if you don't have any data. 10 row tables are no fun.

If you want to experience "programming" at its core, write a compiler or an interpreter. These programs have the benefit of pretty much touching on every major aspect of modern computing. If you're really motivated, write it in C or C++, but DON'T use the multitude of libraries out there. Implementing your own symbol table for example. With a recursive descent compiler, you can skip having to use a YACC or LEX program, and do it all yourself.

If you're tired of stitching libraries together, then start coding up your own, within a larger project.

Modern libraries, notably in Java and C#, are very powerful and really enabling. But I find it disturbing that it's the first thing folks look for for even some of the most mundane tasks. Some are very complicated and really powerful. Others? Perhaps not so much.

Writing lots of junk is always helpful. Practice makes perfect.

Writing $foo is always a win, assuming you like $foo (for any value of $foo). :-) – Ken May 13 '10 at 2:29
"Write a compiler or an interpreter": and design a language you think is cool. It makes you understand why certain choices are made in other languages too, and helps you look very close at a lot of languages and their (possible) implementation. I suggest writing an interpreter first, as compiling (as with every translation process, e.g. translating French into German) requires more knowledge (e.g. you need to know both languages), while interpretation lets you "build on" an existing language, which you can expose as a library :-). – Pindatjuh May 13 '10 at 3:05

I can't help with your job situation, but I hope I can help you develop your skills and also put your feelings about your own skills into perspective.

I'm graduating with a Computer Science degree but I don't feel like I know how to program.

It's possible that your instructors have something to be ashamed of. It's also possible that your feeling about not knowing how to program are natural and appropriate to this stage of your life and education. Here are some ideas that may help:

  • Many employers don't care what courses are on your transcript or even what your GPA is. Instead they want to know what you can do, and especially what have you built. For a good job, what you have built is more important than the technology (C, C#, what have you) on your resume.

  • If you didn't get the chance to build a number of interesting projects during your education, shame on your instructors. But you can build those projects now. Scour web sites for interesting problems. Our second-semester students are just finishing "Song Search"—we pulled a huge amount of lyrics for a web site, they build an inverted index, you feed it keywords and it shows you lyrics that contain those words, in context. It's not Google but it's made on the same principles with similar data structures, and you can start building it now.

I've worked hard but don't have the confidence to go out on my own and write my app.

Maybe you haven't worked hard on the right kinds of problems? It's good to find problems that

  • Are open-ended
  • Have more than one good solution
  • Have plenty of bad solutions

If you tackle these sorts of problems, you learn to make choices, to live with the consequences, and if things don't work, to go back and revisit your choices. You'll learn more from your failures than from your successes, but you'll gain more confidence from your successes than your failures.

Good problems—with properties like the ones I list above—are like gold, except that if you get a good problem from somebody else, they don't lose anything. Scour the web for good problems, and practice, practice, practice. If the Euler problems are where you have to start, well they are OK for beginners. But soon you will want to build small or medium-size projects that you think are really cool. If you are excited about something you've built, that will impress potential employers. If you are not excited, it's hard to hire you.

Peter Norvig reports that it takes ten years to become an expert. Of course you don't feel like an expert right after getting your degree. I will let you in on a little secret: Most members of the Harvard faculty (I was one for eight years) feel like they don't really belong at Harvard, they don't know enough, and it must have been some mistake that they were hired. These kinds of feeling are very, very common for people making the transition from school to the workplace, or from one kind of job to another. So common there's a name for it: "the impostor syndrome."

Even though you have your degree, your university will still talk to you. If you had any really good professors, they probably still care about you. They certainly care that one of their students has graduated with a B average and yet feels she hasn't mastered the basic skills of her trade. So seek out one or two of the most energetic, most sympathetic professors from your program, and get some help finding good problems. Then put yourself in charge of your skills, your knowledge, and your feelings about them. Build a little somethingi every day, and don't waste any of your precious building time on anything that isn't really cool. Eventually, I promise, you will recapture a sense of excitement about programming, and following that, you will be able to build confidence in yourself as well.

+1 to build something: it sets you apart from the crowd, especially if it is something that is useful. – penguat May 14 '10 at 9:23
@Alex, never go through HR. If you're lucky, someone you know knows someone where you want to work. – Norman Ramsey May 17 '10 at 4:14
You know, now that you mention it that is the way I've typically found jobs. I guess maybe in the future I should focus more on jobs within (or on the fringes of) my network and spare myself the indignity of the keyword scanners. – AlexCuse May 17 '10 at 12:53

Such a candid question, great answers - I'm gonna chime in briefly :)

The answers so far made me lol a bit - they potentially celebrate our own greatness a tad ironically. I come to SO because of poor documentation and bugs in frameworks. There is obviously other gold here but it is worth retaining your humility, even if you do become a great dev - and I say that from the perspective of personal historical(?) arrogance.

Keep in mind that you may not (are probably not) being hired by a techie though better HR people and managers will use a techie to assess you.

Employers have a plan for their employees, try and perceive that plan the whole way through and slot yourself into it respectfully, perhaps giving it a bit of personal spin and enhancement. Difficulty and opportunity can arise when an employer doesn't really have a specific plan - asking good questions and helping them specify the plan can really make you stick out in these situations.

Business people can be (rightfully) paranoid about devs patronizing them as we often have to manage their perceptions a bit to help them with decisions they don't understand - and I say that, tongue in cheek, to show you the perspective NOT to have or develop of your non-tech co-workers. I humbly think that understanding that this is often the essence of relationships between techs and non-techs is important - and it's hard to avoid, what we do is obtuse.

Being professional, open-minded and respectful does get jobs - if you're fuzzy on what professional is, I'm sure there are places to work it out on the web - I wish somebody had pointed that out to me when I started. :)

The final thing that I would say is that, as you get better at development and architecture, and you already sound like you've stepped onto this path, you may find your professional code can become intensely dis-satisfying, even if it is the appropriate solution.

I'm not sure what the solution is there but try to find an outlet and be less emotionally involved in your work, it'll help you pace yourself and live a better life - be especially careful about trying to put in extra effort to make something "right" - a lot of the time you will be creating complication for your co-workers and you'll almost never be able to put in the amount of time you need to realise it within the timeframe of your project. A symptom of this is "going dark" - when you don't want to explain what you want to do to anyone. Many of the best devs can explain the essence what they're doing to a lay person - this is a great skill to learn and I've found it intellectually liberating to practice.

Heh, and when estimating, to start with, divide your task up into bits, total up the time and then double it (it's called, divide, conquer, march home ;)

Good luck! I left school expecting to be a ski instructor and ended up a lead dev. I'm sure you'll do well at whatever you end up doing too.

Your first sentence said you would chime in briefly... yet you have one of the longest answers here. ;) – John Y May 13 '10 at 2:27

Really great question. I'm sure there are a lot of people who are going through exactly what you've described in all walks of life and job markets.

First - no more worrying about things that are out of your control. You are not allowed to stress or even think about school, what you did or didn't learn or how well you did academically.

Second - specialize. There will always be demand for people who are really good at what they do even if what they do happens to be obscure. You need to pick your favorite programming language and resolve to completely master that language and “make it your own.” You already have a lot of great advice about how to improve programming skills but at the end of the day nothing compares to do finding an authoritative book on the subject and locking yourself in your room for a few days while you do nothing but read every page and write out every example the book gives.

Third - advertise yourself. In this history of computer science this step has never been easier than it is today. The answers that you give and the questions that you ask on SO are your resume. Take it upon yourself to become the leading authority on SO for that language you've decided to master. Take responsibility for any question that comes through this server with your tag on it, even if it means hours of extensive research and coming up with late answers. Search the archives and read through every question ever asked on SO on your topic. Fix misinformation, provide your own answers and variations to answers and combine a few existing answers into one better answer. Flooding SO with an endless stream of your comments, answers and edits, should be your raison d'etre (plus its fun because you get reputation points).

Fourth - work on your public image. Self-confidence is essential for landing the best job. Companies want people who are great coworkers, collaborators and communicators. If you think this might be a problem, tell your friends that you need them to boost your ego and shower you with endless complements then go to your local library and pick up one of these.

+1 for mentioning the importance of collaboration/communication skills. Most graduates lack them. – Denis Otkidach May 13 '10 at 14:23
I do not agree with specializing, every technology will die some day so if you specialize too much you end up without work... ok, some technologies (=> COBOL) die very slowly, allowing you enough time to specialize in a new technology but it's still risky. – dbemerlin May 13 '10 at 21:27
Specialization has its place, but I'm not sure that right out of college is the correct time. I'd also argue for supply and demand -- part of the trick to specializing is finding the niche that's in need of filling, not the one that's already full. (and on the COBOL front -- a couple of years ago, my seat-mate on a plane looked to be in her mid-to-late 20s, but was dealing with a project porting a legacy system ... and as I understood it, they were still sticking with COBOL, just had to move to new hardware -- so there's potentially a new generation of COBOL programmers out there) – Joe May 15 '10 at 3:22

A lot of people have said that you should start a personal project. In my opinion, this is the best advice on here. I would add some things I didn't see when I read the other answers...

  • Pick something in an area that you are passionate about. The best place to find this is maybe in your interests outside of computer science. That could be a non-profit you're involved in, a hobby that you're passionate about, a sport that you do.

  • Find a collaborator. Coding alone is hard, so another thing that would help enormously is if you found a buddy to collaborate with you on this project. This makes it so much more fun and keeps you motivated. In his recent blog post Jeff Attwood talks about this exact thing in his experience of building SO.

  • Pick something modest (initially). The ideal project would start with something small. If the goal out of the gate is too ambitious then it will become too daunting. Having done development for PCs, phones, embedded systems and the web, I would say that the web is best place to look for something achievable that other people could start using immediately.

  • If possible, pick something that other people will use. Even if you only have ten "customers", the feeling of having other people use the thing that you have built is like a drug. Incredibly satisfying. Learning from customers and responding to them is also such a valuable learning experience.

If this project is a labor of love that you happily work on deep into the night, and then leap out of bed the next morning to get back to it, then good things will follow. You will learn, the confidence will grow. And once you have something out there that people can see, it becomes the beginning of your portfolio. Nothing impresses programmers and (decent) hiring managers than something real.


I remember when I graduated and had my shiny new degree. After the first month with not even a call-back, I became a tad depressed. After six months had gone by, I was discouraged and stopped seriously trying to look. It wasn't until a year after I had graduated that I wound up interviewing for a position that I thought was way outside my skill set. I've been here for almost five years now and I'm very happy with the challenges and experiences it offers.

Life will take you in stranger directions than you can even being to foresee, so don't let discouragement get the best of you. Focus your energy toward your passions, whatever they may be; the rest will follow. Is this your passion?


In addition to the great advice given by others, I would add participating in developer events in your area. Look for meet-ups, user groups, bar camps, code camps, etc. This will help you network with other developers, get job leads, keep up with new technologies, and provide a realistic peek at the skill levels of other developers.


I think that many students have been told fairy tales: get your diploma and you would get a job quickly.

That isn't true any more as IT market is becoming industrialized. With outsourcing it will be all the more true in the future.

So you will have to acquire really good skills to be able to survive in this job or compensate with other skills like management skills.

That is my case, I'm not really a technician, I rather manage projects (but to take some decisions I code sometimes for proof of concept); but management is rarely for beginners so you'll have to get a technical job then later target management.

That is if you are just average technically like me you'd better switch to something less technical otherwise you'll be rather incompetent or not competitive enough.

Problem is there are many more average technical people so it's not so easy to go elsewhere either as it is very crowded :)


I have started my career 3 years ago and, was 6 months at home after my post graduation. Nothing to do. I never liked programing but finally I have to do. I then decided to start with C# as .NET was everywhere. So I opted a very simple book from Dreamtech Publication of an Indian writer. That helped me a lot in building C# fundamentals. Later on I asked some more guys who were in programming, some suggested Wrox Beginners and some Complete Reference, I then bought Complete Reference as its language was very easy going with lots of examples. Later on Apress Pro C# 2.0, 3.5. And still I am learning and wants to learn a lot.

To begin career in Programming, you need a good logical and analytical sense. Everyone has the two things but are in deep inside. They come out after a long hour of practice and the most important the dedication and interest while practicing.

To make a start, I don't suggest to start with creating games or website. Instead start with basic mathematical calculations like algebraic, trigonometric, based on your mathematics books. This will help in building algorithms logically. You can also develop your skills by following algorithms or pseudocode instead of jumping into actual programming.

Regarding study materials or reference from the books, if you are Non-English guy like I am an Indian and but I know English too, what we do here is generally we start with books of our Indian writers as they use pretty simple English that is commonly used in our day to day life. Or if there is book in your own mother tongue that will be a better [but we don't have any C# or VB.NET books in Hindi]. I hope programming books must be published in language other than English too.

When we have enough knowledge to move further then we opt the Foreign Writer books on the basis of their contents. Generally guys like me do this. Most guys begins with books like WroX, Apress, Microsoft, etc. too.

So this was mine staircase of programming career, hope this will help.


Come up with some simple ideas on your own... anything really, e.g., create a digital clock or an image viewer.

At your stage, it doesn't particularly matter which platform you go for; one of the most accessible platforms is Microsoft.NET and Visual Studio Express.

Then I recommend buying something like C# Microsoft Visual C# 2008 Step by Step (I learnt from the equivalent one in 1998).

Go through the lessons, then go back to your original idea and try to develop that. As you go, you can ask very specific questions on Stack Overflow.

Rome wasn't built in a day. It took me 2 years to become any good. Avoid working for as long as you can! (My parents supported me, whilst I pretended to do college work, but really I was doing software development!)

Let your passion guide you.


You might probably want to build upon what you already know (Python).

Give this free book a shot: Python for Software Design - How to Think Like a Computer Scientist, by Allen B. Downey ( and broaden your horizon towards something more concrete, e.g. web development with Django (

But, most importantly, find a project of your own and start working on it. The only way to learn from your mistakes is to make them in the first place.


A few comments, from the perspective of someone who has been a developer for 20+ years:

I see websites like Stackoverflow and search engines like Google and don't know where I'd even begin to write something like that.

They are the product of teams, mostly building on libraries and infrastructure (.net, java,, etc) produced by other teams, and backed by experience and resources. That you, individually, don't know where to begin to do something similar is completely understandable. Don't worry about this.

During one summer I did have the opportunity to work as a iPhone developer, but I felt like I was mostly gluing together libraries that other people had written with little understanding of the mechanics happening beneath the hood.

A lot of development work is now like that, I'm afraid. But there is a lot of scope for doing interesting work 'on top' of those libraries. And don't worry about finding algorithms difficult - you'll almost certainly never have to implement a quicksort, linked list, or whatever during your career. That's what libraries are for.

Basically I'm graduating with a Computer Science degree but I don't feel like I've learned how to program.

Knowing how to program, and knowing how to function as a professional developer are two very different things. You just need some experience, preferably working with other developers on real-world systems. Try to add either C# or Java to your skillset - there isn't much difference between them so the knowledge is transferrable. Beware of becoming too specialised too soon. You may have to accept that you won't earn much money immediately, so keep your personal costs low for a while if you can.

Start working on the project you mentioned, but as well as increasing your programming knowledge, try to use it was a way to get experience of related skills like version control, unit and integration testing, and even writing simple documentation. These sort of skills are what distinguish a developer from a programmer, and are a good showcase for a prospective employer. There are lots of free tools available (the express editions of Visual Studio, github, nunit, Google apps) that can help.

From what you've written it sounds like your CS degree has taught you how to think about technical problems. You also seem to have a good level of self-knowledge, including about your current technical limits and experience. Use these as advantages. Now isn't a good time to be entering the job market, but if you work hard at it you'll be okay. Don't worry, learn, get experience, stay up-to-date, try to do things you enjoy.

Good luck!


A couple of things to note, in addition to the useful comments posted by others:

1) Big picture: Learn how business works, not computers. Most commercial programmers are doing precisely what you said, tying together libraries to solve business problems. The way you learn about business is to step back, and take a big picture view of what happens in a company, and think about how code improves people's work. Inevitably, over time, you learn how the business works, and how to improve it. Programming is just a modern organisational tool.

2) What you learn in academic university is not what people do at work. At uni, there's a much more theoretical focus. At work, you focus on getting things done. This is why you feel you can't program. You're right to feel that way, but it isn't reading more algorithms and O notations that will make you better. It's immersion in a business environment that will.


There is a path to learning everything. It is normal to feel like that at first. But it is not bad. Keep trying new things. You say that you lack some confidence but to improve you need to go out of your confort zone. Try doing it in controled and small steps but avoid doing always things that you already know.

How to be an expert is a good read.


Ok, I'm just playing devil's advocate for a second here: Do you really have to know how to program to be a good computer scientist?

I'd say no! There are so many fields in computer science where you're not hacking together code from 9 to 5. I admit that these fields are usually also the ones with the highest mathematical influence (primarily data structures, algorithms and graph theory) but also networking, administration, and the whole hardware stuff (CPU architecture, bus systems, SoPC, and so on) are a part of computer science as is the whole design & architecture & project management work.

Perhaps it is because I graduated in Computer Engineering but to me computer science is much more than "just" coding. And just because you think you're a bad coder doesn't necessarily make you a bad computer scientist. I think you just need to find a field that fits you better. Either that or - as others have said - start on improving your coding abilities.

But always remember: without the math nerds designing sorting algorithms that run in O(n log n) instead of O(n²) computer science really wouldn't be where it is today. ;-)