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

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

Don't worry. Rome was not built in one day.

For each P in PeopleYouKnow
  ask/call P for a Job apply for job;
Catch Denial As Exception
  don be worry;
  //you'll get a job later
End Try

 If you haven't found a job yet
  For each programmingJobAd in internet

    apply for job;
    Follow up;
  Catch Denial As Exception
   don be worry;
  //you'll get a job later
 End Try
//Keep trying.
//find a bug from this code.

EDIT: #! diff A B

<   ask/call P for a Job apply for job;
>   ask/call P for a Job job; if job is available apply for job;
>  //(sic)
<     apply for job;
>     apply for programmingJobAd;
< end
> End

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

Although this has probably been said before (7 pages of answers!), just in case it hasn’t — there’s a lot more involved with making software than programming.

No-one’s figured out how to teach people to have good business ideas. Computer science degrees certainly don’t do that. Great programming/algorithm skills can be invaluable to implementing a great business idea, but you need the idea first — you need to figure out what people want, and be the first to implement it right.

From what I know of Stack Overflow, Jeff came up with the idea for Stack Overflow by being a working programmer for 10–15 years, then got a guy who’d already founded a successful software company to help him develop it, and got a couple of his old programming colleagues to help implement it. Without all of his experience, he wouldn’t have known what the internet was lacking (great programming Q&A), and without all of their combined experience, they wouldn’t have known how to implement it successfully.

From what I know of computer science degrees, they’re a bit like English law degrees: they study the subject in a theoretical, academic way — which is great in a lot of ways, but doesn’t teach you how to practise the fields for money in the real world.

So don’t worry. The next ten or so years of bitter commercial programming experience will be what prepares you to write the next Google :)

inspiring post. – abel Jan 13 '11 at 17:59

First of all, pat yourself on the back because yours is not a singular case. This realization occurs to many CS graduates. However, there are a few points in you that are worthy of appraisal:

  1. you look at sites like Google and think about its implementation
  2. you are honest

Curiousity shall be your driving force and especially in a field that needs continuous learning, curiousity may be considered an asset.

Honesty shall be very helpful. When you are working in a group, honesty is essential for the success of the group.

Coming to learning programming, well don't try to assimilate all details of algorithms at a time. It will seem to be a herculean task. Instead pick a task you like and gradually improve your code.

You are skilled in two nice languages: C and python. You can choose projects involving either, read the code of open source projects and try modifying them to your benefit. Reading API and combining libraries together to get them to work is easy; but try to understand the design principles behind the API.

Recently, when I took up a new project, I started doing background reading on it. I had to save important URLs in a file so that I can refer them to my friends. Then it occurred to me to have a button, in my browser, which when clicked would append the URL of the current tab to a pre-assigned file with an optional comment. Its not a very big task; but it will be useful to me and my friends. I have not done it yet; but I have talked to a friend about it and he shall do it soon.


Practice makes Perfect.

And don't be afraid of making errors.
In the past, i caught myself having the IDE opened and ready to code, but instead of coding... I started thinking:

  • "No, i shouldn't do it like this..."
  • "Nah, what im thinking seems ok, but will fail in the long run.."
  • "Maybe, i could just..."

Excessive thinking is counterproductive.

+ I still do that a lot. I think maybe too much even it is simple CRUD operation code.... – THEn Jan 13 '11 at 22:19

Before I graduated I knew that the feeling you now have would come to me as well. The last step of my studies was my thesis. I decided to pick up a difficult and practical thesis, so that I would learn how to write code and I would have something I can present to an interview for a job. My thesis was: "Velocity estimation of moving imagery". I used Visual Studio, C++, MFC, DirectShow. I worked hard for 1 year, but no more. The result was impressive. After that I always felt I can develop anything, even though I am a junior developer. Right now I hate MFC and I prefer Java/C# to C++, but the fact that I started with difficult coding made me stronger. My advice is:

Start a big project for yourself from the beginning to the end. It could be a game, or an app or a web app. Develop something big and practical, that you could present to people. In this project you should try to:

  • be as object-oriented as you can
  • use at least one external library. It is important to feel confident about using coding libraries.
  • do something useful, that you will feel satisfied with
  • really finish it, meaning time optimization, GUI, threads and everything. You will never feel confident about your coding capability if you don't have at least one finished job.

Wish you luck


I think you sound like every person who's ever graduated with a computer science degree without having held a "real" (relatively long-term) job as a programmer. I will first say this and it is the most important part of my answer:

It's obvious that you're dedicated to becoming a programmer. Otherwise you wouldn't have posted such a brutally honest post about yourself in such a public forum.

The "problem" (if you want to call it that) is that you've only seen half of the game and you're trying to draw conclusions about the rest of it. That is, you've seen all the academic code and you feel like you should now be able to create any software project that comes along. Well, here's the first nugget of truth in your post:

it is a long and painful process.

I couldn't possibly agree with you more. You don't think you'll be able to create something like Google or StackOverflow? Even after 10 years of working in industry (as you say)? Well yeah, you probably won't. First of all, Google and StackOverflow were created by TEAMS of developers. Not one dude in his parent's basement. Second, 10 years, if you're lucky is exactly what it will take to be, not just successful, but wildly successful. See the 10,000 hour rule :,000-Hour-Rule&id=2433795

they tend to demand 3+ years of experience I do not have

This is the classic catch 22 of graduating with any college degree. I can't get a job because I don't have any experience. I can't get any experience because I can't get a job.
What's a guy to do?
Well the answer is actually quite simple. Just KEEP APPLYING. Eventually someone will give you an interview and eventually one of those interviews will put you in front of someone who sees the potential in you. Rule number one of achieving almost anything? FAIL! And when you're sick of failing, learn to fail some more. Keep failing until it doesn't feel like failing and before you know it, you'll have mastered the gentle art of Interviewing. In fact, several friends recommend I interview at least 4 times a year (i'm almost thirty, so that number is smaller than how many interviews a year you probably should take). This way, you never forget WHAT your skills are or HOW to present them. Even if you're not after a job.

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.

How do you know this? How do you know IBM won't hire you? The reality is you're probably right. They are usually looking for people with 4.0's from MIT. But that doesn't mean they're NOT looking for people who can program to fill all kinds of roles. Sometimes you apply for a job and a manager sees your resume and says, this kid isn't a fit for me but would be great for my manager friend XYZ, possibly at a different company. Let me forward him this resume. This is called networking. And you can't start networking without that first step of putting a resume in front of someone. Even if they've seen a million resumes just like yours and your pretty sure they're looking for someone with a better GPA, skillset, more experience WHATEVER!

What is the harm in applying? The worst they can say is no.

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

You don't need confidence to write an app. You just need to know how. And it sounds like you know how to write an app. Write a stupid app. Write a bad app. There's a rule of nine in comedy writing that I think applies here. Write nine bad jokes in order to get to one good (or at least workable joke). So go out and write nine crappy, useless apps. You'll learn a lot about how to write apps and it'll get you thinking about what a better app might be.

Finally, and I've said this before but it bears repeating:
Don't give up!
and more importantly:


I was kind of in your position. I understood all the concepts, I just didnt know how to put them together. So I decided to make an Android app instead of a final, so I have NO CHOICE but to program from scratch. Working on this the past few months has taught me A LOT.

Also a lot of people here mention that posting on Stack Overflow if good practice, I would like to say I completely agree!

Coming form my personal experience, not only do I get my questions answered here, but in my down time I look to look at whats being asked. There are so many times when I come across something where I think to myself, "Oh my, I just did this". This usually results in me looking at my projects for a quick refresh so I can post it here.

After doing stuff like this, really helps me be able to process what I know in a much more clearer way not only for me, but hopefully others.

I golden rule, you know you know something when you can explain it to others.

So yeah, I guess I'm just trying to point out that when people say post on SO and code in your free time, they are telling the truth :)


Ah, I felt the same way when I graduated 2 years ago. I didn't go to a great school. What I believe helped me get a good job was that I developed small programs to use a specific library or function that seemed to be useful. Being self motivated worked pretty well....

C# is my preferred language, I always want to use and understand the new functionality in each new .net version, or just be aware of this new functionality and know at a high level how it can be applied, once you see a problem that can be solved by this, use it. Some books (that I read thanks to Jeff Atwood) are Pragmatic programmer and Code Complete, these books really helped me be a better programmer, while another book, Design Patterns, helped me understand higher level solutions to a problem.

As a lot of people say, that best way to learn to program is to program. There are some pretty good sites that provide tests that can be solved by programming (Euler project for example). Google has been a great friend in my career.

As for getting a job, I was lucky (or unlucky) enough to get hired by a programmer sweat shop... being in this environment really really taught me a lot of coding standards, ways of working out a solution, and it actually helped me find my burnout time. Once i left there (underpaid, overworked) it greatly build up my confidence; I am not the best programmer (and every time i look at my old code I get reassured that I really am not the best), but i believe that I can get the job done.

Remember that it is a lot easier to make mistakes while your young, you have more time to make up for those mistakes, so.... make them!

Hope this helps you. (it made me realize what has happened in my career these past 2 years).


Biggest thing to keep in mind is, you went to school to get a degree, not just to teach you how to program. In school, they teach you how to think and how to problem solve. Being a great programmer is up to you :) and it takes lots of practice.


It is the same way as with a drivers licence. Mastery takes much much longer....


Remember that the science of computing is not the same as developing software and so for most comp-sci degrees I would expect there to be a large discrepancy between what you learn and what you apply (and how) in the real world. But its not that important. You'll learn what you need to on the job, and, if motivated, off the job. One of the things I love most about programming is that I'll never run out of stuff to learn.


Graduating from school does not make us experts. It takes about a decade of good work (not just any type of work) for one to become an expert of sorts.

One of the great problems with CS schools nowadays is that they siphon students into a minimal curriculum of 60 credits. Unfortunately, a lot more has to happen for a student to get enough practice to develop a sound base of programming skills (before entering the work force.)

For me, it took me about 1.5 years longer to get my BS simply because I (and many of my peers back then) took a lot more programming courses. The typical student now simply takes Programming 101 and 102 (possibly in Java or C#) before going into data structures. Back then, I took Basic, Pascal I and II, C I and II, C++, x86 Assembly, expert systems, Delphi and Ada before setting foot on a data structures class. I wasn't alone in that.

It was the norm for many of us back then. That is we had 30 credit hours of programming before hitting data structures whereas now a student typically has a meager 6 to 9 credit hours.

This is not counting internships and part-time jobs at the labs (be it tutoring, teaching or programming small projects like reports for a local school department) that we were exposed to.

There was a great selection of programming courses and it was unthinkable not to take as many as possible. Now, all you see are a pair of meager Java courses and a half-ass course combining assembly and computer org (if you are lucky). To me, I don't see how an undergrad can have enough practicum by just following the bare-bone, minimal curriculum. Unless you land a really good job with a really good engineering-oriented, your job won't help you improve your programming skills.

In fact, and this is specially true in the enterprise/e-commerce arena, most jobs are crappy with people not recognizing what good programming habits are even if they landed on their laps and called them "momma". So the saying that one will learn more at work is half true. You learn something, but there is assurance that what you learn is good or bad (there is such a thing as bad learning.)

My advise to people in school boils down to the following:

  1. Take as many programming courses as possible (15-18 credits at least beyond what a CS curriculum requires you.)
  2. Make sure to have more than 9 credits of programming hours before taking data structures. Anything less won't prepare you enough.
  3. Take students loans and eat grass and water if you have to, but do take additional classes as outlined above.
  4. Aim to get internships. Do whatever you have to to get internships on your junior and senior years (preferably with reputable engineering firms and not sh*tty e-sweat shops.)
  5. Independently of whether you get internships, always vie to get a part-time job at a local computer department, be it tutoring, but preferably doing systems administration and networking... or if you are lucky, programming reports or sysadmin utilities for internal usage.
  6. Network, network, network. As professors for potential employers, employers they can recommend.
  7. Take Calc III and DEQ and/or take a introductory course in EE/CE. It will open a lot more doors beyond what the enterprise has to offer.

If you already graduated and feel that you still have a lot to learn (and on-the-job training and work exposure are not cutting it), go back to school, get a MS or get professionally certified (.ie. Sun Certified). Engage local programming user groups. Read DDJ and the Pragmatic Book series; books on Architecture; on algorithms and concurrency; on security, e-commerce, distributed systems; on requirements analysis and engineering; on systems engineering (actual systems engineering as delineated by government agencies.)

Recognizing that you need to improve your skills after leaving school is 90% of the battle. Most people never recognize (or care). But you do. All you need is to sacrifice time outside of work to develop your career. Your job is never your career. Remember that.


According to Malcom Gladwell in Outliers, it takes 10,000 hours of practice to become an expert at anything, whether its figure-skating, painting, or programming a computer. Some use the figure of 10 years instead of 10,000 hours. (Do a Google search on 10,000 hours expert for more on this topic.) I got an MSCS almost 35 years ago, and am still learning.


Like any job, you have to work hard and get experience in the job before anyone wants you doing any serious work. People don't graduate from Law school as an expert lawyer. Doctors don't get out of school and start operating on patients. (Would you want them to?)

There's a good reason why job postings for high level software engineering jobs always want 5-10 years of experience. That means we don't want no n00bs in this job. We want someone who's done this several times before, knows the pitfalls, or, as an interviewer put it to me, someone who has been burned a few times.

The only way around this is to be doing entry level programming for a side job throughout school. This is common in my field of indie development. A lot of guys I know actually end up dropping out of school when they realize they're already pulling in huge salaries after working 3 or more years during school (or simply working for themselves).


This is because you went to a university for a bachelor degree in computer science (maybe an emphasis on programming) and not a technical school for a degree/certification in programming.

You are expected to write some bad code and through: reading some books, taking a training class, and getting coworker feedback, fix the problems and limit the same mistake in the future. As you learn about development, you're going to constantly be wondering if you know enough or whether your code is ever good enough. There will be plenty of new techniques, languages and methodology trends to keep you busy for the rest of your career.

Because anyone that spent that much money, gave up 4-5 years employment, and stayed up all those nights, should have learned how to learn. If not, you will be exposed as the fool you really are and get downvoted frequently (I know, I asked for it.).


Learn How to Program in 10 Years!

You've finished your degree. Congratulations! You're now ready to start learning.

Also, don't worry about what you don't know. Hopefully the feeling that "I know nothing about anything; the more I learn the less I know!" will never go away. If it does, you'll know your brain's stopped working.


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.


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!


I know I'm four months late on this (I don't visit StackOverflow on a regular basis) but I would like to add something:

I graduated with a degree in Computer Science and only learned C++ and Java while I was there. I caught a break doing a programming job with no programming experience because they saw my degree.

The thing is - if you know how to write in C++ you can figure out any language.

C++ is like driving a stick shift and C# is a automatic transmission. All the employers wanted to know was if I had the ability and the drive to learn, if I had a personality that would work well with the team, and if my character and ethics were solid. They knew that what I could do was a lot different than what I had done and so that's how I got a chance to prove myself. Just be confident and emphasize your ability to adapt and learn.

I had previous IT helpdesk and Network Administration experience that showed that I had to learn technologies on the fly and references from managers who agreed that I was surprisingly good at picking things up. Don't count that route out if you have difficulty finding a programming job.

Good luck!


Very few people graduate any discipline being an expert at something they have merely studied. Computer science isn't in any way special in that regard. Nothing beats empirical experience and you only get that from developing fully-fledged software for real clients, with all the demands, time-constraints, changes and teamwork this involves.

Unfortunately, that's true. A Bachelor's is useless except as a badge that you managed to make it through. That said, comp sci curriculum is horrible at the undergrad level. CM's curriculum requires 5 maths, but combines formal language, automata and computability into one course and that is an elective. – MIA Sep 16 '10 at 6:31
Agree 100%. Why would you be an expert in something that you just got qualified for?? – Alex Feinman Sep 21 '10 at 14:20

Khilon's answer is what I was going to answer but with an extra clarification; in my view, graduating with a degree in computer science or engineering or any other discipline qualifies you to begin your apprenticeship in your chosen field.

We don't have formal apprenticeships in the software development field but ideally, during the years following your graduation, you will learn lots of techniques that will help with the final goal of delivering robust code that is maintainable, possible to debug, predictable, understandable by others and generally reliable. This includes topics such as testing strategies, build management, configuration management, version control, defect tracking, quality metrics etc. etc.

If you understand computing theory, complexity theory, algorithms etc. then you will have a strong BS detector which is one of the great things that you get from a good degree. If you can then work with a good team that understands the engineering aspects of software development then you will have a very good combination of knowledge.


Nobody graduates as an expert and that's true for anything, not just programming. You study to know the basics but by working is how you gain real competence. You might become an expert programmer if you do it from 3 to 10 years. In few months you can expect to be able to do something useful. There's no rush and it's a slow process for anyone, so don't worry about it.
In my opinion you really can't demand newbies to spend all their time learning at home. Of course it can speed things up, increase your value and make you more confident, but only if you want to. Otherwise I'd be happy to learn at work.

  • Don't sit on your computer all day/night every day trying to get better. You will burn out fast. I did this, then had to stop programming for about 3 months as I just couldn't care less about it.
  • Read some books, and pace yourself.
  • Learn something mainstream (c# / java) to program in, as there are jobs and knowledge in these. Not VB though. That is evil. (Read fanboy comment below)
  • Do cause problems for yourself and then try to fix them in your language. This is the core of programming. Often these problems come from doing something apparently simple. So do something simple!
  • Learn basic unit testing! This is the fastest way to get better, as your problems become better understood as you learn to break things up into small pieces
  • Realise Fan boys are biased and fairly useless for opinions and that everyone is a fanboy.

While i was doing my cs degree, we used to ask questions on Diodes,Flipflops,imagining an oscillator converting bits to waves and carrier waves, tcp packet . But the answers from our professors were bookish definitions. What is learned is that, take one thing which interests you, know what it does at the higher level, go down to individual components, know how they work, go deeper and finally run a movie in your mind, while an input is given, see where it flows to program better and efficient.

Step 1. write a program

Step 2. think whether there is any way to rewrite better, consistent and produce the same result.

Step 3. do step 2 until your brain does not come up with any idea or just blank.

Step 4. go out,see nature.

Step 5. come back to the same program, see if you get any idea.

Step 6. google about anything mathematically related to the program.

Step 7. Finally ask somebody if they can write better.

Step 8. if they have better way, learn how they do thought process.


Yes, it's reasonably normal- most schools, even prestigious ones, do a great job of teaching computer science and a terrible job of teaching software development. This is getting slowly better, but still has a long way to go.

Anyway, it sounds like you're doing most of the right things:

  • Program outside of work
  • Read books on software development (Code Complete, Design Patterns, Mythical Man-Month, etc).
  • Keep learning new technologies- school should have taught you how to learn languages, not the languages themselves. Learn new frameworks, IDE's, apis, libraries, build tools, etc.
  • Hang around on sites like SO and here. Interacting with experienced people on a regular basis is one of the few semi-shortcuts to wisdom.
Honestly, Mythical Man-Month is a bit overrated, isn't it? (But I really like "* in a Nutshell" kind of books). – Camilo Martin Nov 27 '10 at 12:27
@Camilo disagree. Mythical Man Month is on the subject of software engineering, while the nutshell books are solely about a single technology. Eventually, you're going to need an understanding of peopleware issues with software development. MMM is one of those reads that covers the topic. – Brian Wigginton Feb 12 '11 at 21:09

Where is it written that a CS major has to program for a living?

A fair comment. A lot of CS majors I know, who didn't know how to program, ended up working in a call center or flipping burgers. Knowing how to program is so overrated. – Cerin Aug 27 '10 at 15:06
I'm simply stating there are other opportunities. – Shawn Aug 27 '10 at 16:32

I noticed your skills include Objective-C iPhone and iPAD development is all the rage at the moment. Buy a Mac or get a VM image of the Mac OS X and start building. Think of a game or something you'd love to have on the iPhone and take this up as a hobby project. One of the graduate developers where I work built a few iPhone games and got the job here. Now his a valuable member of our .NET, java, PHP, Objective-C development team.

As everyone has said don't give up just keep applying for all jobs.


The thing about college degrees these days, for the most part, is that they don't actually measure your knowledge of s certain topic. Instead, they give you the tools to think, analyze and solve problems in an efficient manner. I studied Computer Science but dropped out before switching to Technical Communications as a major. Why? Well, because most of the people that were in my computer science classes didn't really get it, or didn't care about programming. They viewed the program as a way to get a high-paying job. I had been programming for 5-6 years before and had read more computer science material in depth than we ever did in college because I love it. It is your responsibility as a programmer (or anything) to continue learning. You do this by trying and failing or trying and succeeding. There is no magic formula for being a good programmer. It's pretty much like anything else; the more you do it the better you will get at it! I also know many great developers that never majored in CS; instead, they majored in topics like English, Linguistics, Music, etc. All you need is the drive and you can learn anything well.

I also noticed that many of the people that were in my classes could not communicate to save their lives. Being able to communicate well in all mediums is very important. I got my first programming job because I was able to communicate well with the interviewers (and I also write all the copy for the site). As long as you can show everyone your skills, at the end of the day you can usually get the job. I would recommend getting involved in some open source projects where you can learn from other great peeps. Also, read "The Passionate Programmer" by Chad Fowler -- it has some pretty good stuff in it.

Best of luck!


But, I can see why OP wants to study algorithms. For the recent graduate in computer science, we're not only competing with each other but also those who didn't take computer science but either took programming in college or are self-taught. For us, our strengths wouldn't be how many languages we know or if we even know these languages well. For the computer scientist, his greatest strength would be his general ability to solve problems. You can always look up a certain class or a certain method later if you need to. It really doesn't matter if you remember everything there is to know in a language, because if you don't know how to use it then you're not going to get the job done.

New languages are created and old ones change but the general principles behind programming, that is the principles behind solving a problem in general, remain the same.