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

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.

share

migrated from stackoverflow.com Feb 4 '11 at 15:07

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

locked by Yannis Rizos 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 :)
share
70  
+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
68  
@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
21  
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
22  
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
31  
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

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 :)

share
126  
+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
14  
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
15  
And there is nothing wrong with just glueing together libraries. That is what makes you productive! –  Hans Westerbeek May 13 '10 at 16:24
10  
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
53  
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

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

share
13  
Add Clean Code to your to-read lists, it's pretty good. –  lemon May 13 '10 at 23:56
7  
"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
10  
"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
7  
@Denilson, could you have learnt multiple languages without learning one language first? –  Péter Török May 15 '10 at 19:42
3  
+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

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.

share
5  
+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
11  
"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.
share
81  
+1 for #2 - don't compare yourself and the knowledge of a crowd. –  g.f May 13 '10 at 0:11
8  
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
6  
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
15  
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

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.

share
2  
+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
5  
@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
1  
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

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 github.com 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.

share
8  
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
1  
@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
5  
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

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.

Edit:

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

http://stackoverflow.com/questions/662283/websites-like-projecteuler-net

share
4  
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
44  
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
1  
I would disagree Charles - Euler will provide motivation to understand certain concepts and execute upon them. –  Broam May 13 '10 at 20:30
6  
pythonchallenge.com is key! While Euler are math problems to be solved by programming, pythonchallenge are pure programming problems –  Xster May 14 '10 at 17:26

I am guessing from your user name that you are a woman... If not, feel free to ignore this, or adapt it to your own point of view.

In my experience, women graduating from college in computer science consider themselves much less competent than their male counterparts with similar skills. One might say that women are (or, to be exact, women I know are) simply more honest relative to their own shortcomings, but in the end, they have more trouble selling themselves to employers.

(I spent most of grad school feeling like a total failure compared to my peers, and ended up graduating top of my class. )

So my advice would be to stay honest with yourself and keep on working hard on developing your skills. But do not downplay what you do know when looking for a job, and don't restrain yourself from applying for "reach" jobs.

  • Find a mentor who can give you a real assessment of your value.
  • Conduct fake interviews, and learn how to project confidence, energy and passion.
  • When you do land an interview, talk about your personal projects and ask technical questions. Your drive to learn and your energy is your best asset.

Added as an afterthoughts:

  • When you do land your first job, don't be afraid of negotiating your salary. Too many women just accept the first offer gratefully, and never get what they deserve.
share
7  
+1 - Women certainly have some social hurdles to jump. –  ChaosPandion May 13 '10 at 20:54
6  
Not just a female thing; People who are either already competent, or capable of seeing that they need to grow (Yay you!) tend to question their own competence more than those who do not begin to suspect their own incompetence. There is a name for this phenomenon. The Dunning–Kruger effect. Your experience at school has been a phenomenal success if you leave the school able to continue your lifelong path of learning, in whatever carreer you end up in. I wish you the very best of luck!!! –  Warren P May 21 '10 at 16:08
1  
Warren: Absolutely true; a lot of my less outspoken male peers had the same problem. In many cultures around the world, including in North America, little girls are not encouraged to compete aggressively and to show off their skills as much as little boys are, so I've seen that trait more often in women. But it's definitely not just a feminine thing. –  Kena May 21 '10 at 18:20

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. http://www.codinghorror.com/blog/2010/05/on-working-remotely.html

  • 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.

share

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, asp.net, 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!

share

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.

share

Note: I expect this post to be downvoted. This isn't an answer to the original poster but an observation on most of the comments I've read above.

The answers I'm reading above are really scaring me. There seems to be an almost universal feeling that comp.sci degrees are useless or not relevant, or don't teach you anything. Have comp.sci degrees really become that bad, or is this all just hot air from developers without degrees trying to justify their lack thereof?

Seriously people, what are they teaching people in university nowadays? When you do a CS degree (at least when I was a student) by the time you graduate you would have a good grasp of compiler design, comp. complexity, formal methods and logic, a whole zoo of data structures and algorithms, basic operations research (LP etc), databases, cyptography and security, scheduling algorithms, network protocols, internet development, OS and kernel design, parallel algorithms and data structures, numerical algorithms and a whole lot more. The whole lot is typically topped up by a huge programming project that forms part of the final dissertation. Don't tell me that comp.sci graduates don't get enough practise programming.

I also appreciate the fact that some of the more traditional comp.sci degrees omit some aspects of the software development cycle, you probably won't hear much talk about TDD, unit testing. But let's be brutally honest: it isn't really rocket science, is it? You won't hear about SCRUM or function point analysis either. Teaching detailed courses on such basic issues would be pretty redundant, though many degrees nowadays do have a course on system design where they do give students an idea of how these things work.

Granted, you might not be an expert in .NET, PHP or the other current industry standards but that should be irrelevant. In 5-10 years time the languages of choice will have changed anyway. Just because you learn to drive in a Peugeot doesn't mean you shouldn't be able to drive a Fiat, and the same should apply for programming languages. It should take a few months practice with a few good books to be competent to work in any language.

Surely if anything is a waste of time its these costly "certifications" which basically involve sitting for an electronic multiple choice exam and ask you about (usually pointless) minutiae of a particular architecture or language. They tend to measure a programmer's competence by his/her knowledge of certain pathological programming cases.

I have worked in the I.T industry in various companies and I have also been involved in the interview process for other software developers. We did set out a few of the usual fizzbuzz questions, but there were aimed mainly at people without formal training or trainees. I have never ever met a comp.sci graduate not capable of answering a basic and not-so-basic programming questions.

Note I live in Europe and know only about European university degrees. However I'm pretty sure that the university standard in the U.S is much higher than that in the EU.

share
4  
This is the same way everyone feels about all degrees once they get them. School in general prepares you for a broad array of situations. Once you start working, then you can get more specialized and you'll maybe feel like you wasted all that energy on school, but how did you know what you were going to end up actually doing? Better safe to learn about a lot that you can build upon than to have never learned about it at all. –  iWasRobbed Jul 7 '10 at 13:38
1  
I see both sides of the argument. I've met some really smart CompSci degrees, but I've also met some guys with CompSci degrees who are now working in a call center because they didn't really care about CompSci. I learned a lot in my CompSci courses, but I have to admit most of the technical skills that have landed me jobs I learned out of school on my own time. When I interview for software engineering jobs, they generally test your knowledge for specific technologies, problem solving strategies, and interpersonal skills. None of which are explicitly taught at college. –  Cerin Jul 7 '10 at 14:14
1  
I've met dozens of CS grads - while interviewing them - that couldn't explain any sorting algorithms, even if left to think for five minutes. Perhaps the university standard here in the states isn't applied entirely well across the board. As @Chris S points out, it's easy enough to slide through a degree without learning much of anything. –  Dean J Jul 7 '10 at 14:31
1  
interesting problem, but why would you do normaly a ECC test ;) , except for hardware, of course But its an good example of self-taugth stuff that you don't/can't? learn at compSci –  Quonux Jul 15 '10 at 17:47

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.

share
9  
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

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.

share
6  
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
16  
No, in 5 years you'll realize that you know nothing :) –  Earlz May 13 '10 at 1:34
1  
@Earlz, And the nothing that you do finally know is already obsolete. –  Dan Bryant May 13 '10 at 2:18
4  
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
1  
@Earlz how very Zen :) –  Tullo May 17 '10 at 23:38

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.

share
10  
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

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.
share
1  
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
2  
@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

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.

share
2  
+1 for mentioning the importance of collaboration/communication skills. Most graduates lack them. –  Denis Otkidach May 13 '10 at 14:23
1  
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
1  
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

Okay, so saw this hacker news and I was like "HOLY CRAP THAT'S ME!!"

So I graduated last December with a degree in CS and felt that somehow I had managed to pass my classes and get a degree without actually earning it. It felt like all my classmates had incredible coding skills, and that all I could do was make basic Java programs. Learning how to code and becoming a good coder just takes a ton of time. There is sooooo much stuff out there to learn and my advice is just to take it a little at time. You'll learn things as you go. Like everyone else has sad, the best way to learn is by doing especially with coding. Not to mention there is SO much about building applications that they don't even to bother tell you about in school. Don't feel bad, just know that there is a lot out there for you to learn, and realize that it's gonna take time to learn it.

I think you should definitely look past the city where you grew up. There are a ton of companies out there hiring CS grads, and not all of them require or expect you to be a great programmer right out of school. There were plenty of interviews I went on where I didn't get asked any coding questions (there were also a lot that asked me to solve algorithms and to code). Apply at companies that care more about your ability to learn than what you already know (in my experience bigger companies care more about this because it won't impact them as much if you aren't able to crank out code right away).

I don't know if coding is something you want to do and pursue, but there are also plenty of jobs that are non technical that require a technical background. You could look into those options.

I wouldn't focus on learning the ins-and-outs of one language like C# or Java and focus on the principles of programming. You should be able to transfer good coding skills and apply them in any language (this is important for longevity in your career..Java isn't gonna hot forever). On the other hand, knowing the "hot skills" can help land a job. Interviewing skills are REALLLLLY important. Take every interview you get, even if it's just for practice.

Anyways don't think big companies like IBM are out of your reach. I felt the same as you a few months ago, and I work at IBM now. My GPA was not that great either. I still suck at programming but I know I'll get better with time. Just be confident in your ability to learn!

share
1  
I'd say that big companies like IBM are more in reach than many other places -- they have enough people there that they can train up their pool of talent, unlike smaller places where you'd be expected to hit the ground running. And there's always internships -- it might be a bit late having already graduated, but many government agencies bring in summer interns ... so you could get that 'NASA' or similar on your resume. –  Joe May 15 '10 at 3:27

Wow, what a lot of answer before this one.

How about a completely different response...

Lets reframe your problem in terms of being a human.

"I've graduated conception class and I'm just about to be born. My mother is crowning and I'm due to be delivered tomorrow morning. But when I look at athletes like Usain Bolt I think "how can I ever run that fast?".

But here you are, you are a fully fledged human, you've gone through school, you can walk, talk and if you've done a computing course you're pretty intelligent to boot. Nothing to be ashamed of.

Now, did Usain Bolt get born and then suddenly start putting in insane times on the track, or was it a large amount of getting on with life, finding out what he was interested in, followed by an incredible amount of application and then suddenly "Bam!" he was there.

More likely the latter. So don't give yourself a hard time for not knowing what you should be doing. It takes time to work out what is right for you. That is for you, not what your parents think, not what your peers think. What is right for you. What lights your fire. What makes you think *yes this is cool" even when everyone else thinks that is pants.

Its not uncommon to start (and/or) leave your degree having no idea what you want to do.

For me, I was good at school at the O levels (a UK qualification) but I couldn't give a damn about the A levels (required to get into University to do a degree). So I went to a lesser place to do my degree (and as a result not the degree I would have preferred). But I stuck it out (still not having a clue what I wanted as a career) and learned a lot about electronics and stuff that most software guys never learn. During this time I freelanced as a computer games writer.

The end result? After gaining my degree (with commendation) I walked into a job with a job interview at a higher salary than those doing straight electronics and I didn't have change my hair or wear a suit. What? Well at 23 that stuff matters (looking back now, at age 44 I kind of laugh at it, but thats the vapidity of youth for you).

That company went bust and then I started getting more serious. But it probably wasn't for another few years before I suddenly found (by accident) what really interested me. Turned out to be low level software tools. Should have been obvious - all the computer games I wrote were written in assembly, I always liked the low level stuff that no one else could get their heads around. But to see that as a future, that takes more maturity and no surprise that it didn't really manifest until my mid-20s.

I'm often impressed (and amazed) that young people, often still in their teens, seem to know what they want to do. But the real question is, are they still doing it at age 27? Or have they changed course because their early ideas were not correct for them?

In terms of how do I do something as impressive as THAT (whatever that is, Google, SO)? Well, you do it in chunks, just like you do software and everything else in life. You start with the basics, get experience in it. If you're good enough you carry on and get more experience, etc, or you abandon it because you realise that you're not good enough or that its as boring as hell (thats why I don't do comms even though its always been a gold mine. For me, its boring!).

By all means, look at your peers, look at your elders, examine their choices and interests. But examine your own as well. Often what at first sight seems mad/bonkers is actually the real deal. Doing something that you find interesting (rather than just paying the bills) is SO much more rewarding.

Yeah I know as a 23 year old you're focussed on the Audi TT and the cool flat and thus tempted by money rather than sensible career choices, but seriously at some point you'll realise the cool car isn't all its cracked up to be - that girl should like you for who you are, not what you drive.

Seriously, think about it. The not so cool solution may just be the right answer.

share
2  
It not about 'me', its about how I got from there to here without knowing initially where 'here' is. I'm just using my own experience as an example because I know my experience better than someone else's experience. If you read it as about me, you read it from the wrong perspective. Often if you "tighten" things up as you put it, your provide no background for the viewpoint being expressed and leave the reader confused. I could have written "I had no idea what I wanted to do when I graduated, but now I do blah blah". That wouldn't inspire anyone to continue - no "real reason to believe" (TM). –  Stephen Kellett Jun 7 '10 at 19:20

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.

share

Follow the 10,000 hour rule.

In order to become a master of something, you need to practise for at least 10,000 hours. So spend 10,000 hours programming, and you will become a master of it. If you have not spent 10,000 hours programming and you don't feel like a master of the craft, don't be disheartened, just spend more time coding.

Also note that it will probably take you around 3 and a half years to do this if you program for 8 hours a day. If you only program during business hours it will probably take you about 4 years. If you haven't spent this much time during your 3/4 year degree programming, then you probably won't feel like a master.

share
1  
and you have to make sure you are not doing the same hour over and over again! Push yourself to keep learning. –  Froome Jan 13 '11 at 17:03

Just a couple of thoughts, if I may.

Wendy says that one can graduate with a CS degree, yet have little idea of the practice of programming. Isn't that hugely troubling, even horrifying? It's as disturbing as the fraud that submerged English departments in the '70s: literature is not a collection of ideas that one can understand and integrate, but rather a bunch of 'texts' that the student must abstract and 'deconstruct' ( http://www.answers.com/topic/deconstruction ). Happily, that fetid tide is ebbing, maybe because the instructors who wiped out in its weedy surf are retiring now.

Years ago -- decades ago -- my first course in CS taught me assembly language (before C was invented) using actual problems like sorting, hashing, and searching (and, yes, recursion). My second course taught the design and realization of a real live working compiler. I was a part-time student at MIT and those two courses were all I needed to begin getting paid as a programmer; and to become just somewhat productive two or three months later.

So this morning, hearing Wendy's cry, I'm thinking that surely MIT, of all places, cannot have diluted its offerings and deluded its students with (in the context of programming practice) pretty-much-useless crap. But when I look at MIT's EE/CS curriculum, I see that's just what's happened:

http://student.mit.edu/catalog/m6a.html

I particularly notice that the the department uses Python as a/the teaching language! I mean, really! It looks like a CS degree at MIT means to qualify a student to become a teacher of CS at MIT. Talk about recursion!

Then I came across this contribution to Coding Horror ( http://www.codinghorror.com/blog/2006/07/separating-programming-sheep-from-non-programming-goats.html ) and thought it very much to the point of this conversation:

"I'm a latecomer to this discussion [about predicting success in programmer candidates], but in my experience as a late-blooming 30 year old CS undergraduate senior, I've found the programming classes to be useless, and less badly taught as un-taught. I've only been to a community college and then the University of Illinois in Chicago, but the introductory programming classes were:

"1. Object-oriented, which left students with little or no understanding of procedural methods, and

"2. Weed-out classes. The classes consisted primarily of descriptions of different types of problems and the mathematics behind them, rather than ayntax and structure, for which people were told to just read the book.

"Code was barely directly acknowledged until the Data Structures core, and then it still depended on which instructor you got, some being very code light and some being nicely code heavy. You could tell that it was a big temptation for teachers to be code light at this point, because if they concentrated on code, they would also have to concentrate on teaching students who had been in a computer science course for two years how to program.

"Since coding is a hobby for many young people, I think that educational institutions have relied on that to establish their expected learning curves, leaving people who had little to no experience programming when they entered school no choice but to cheat like crazy, spend all of their spare time studying code, or switch majors. And it isn't a necessarily a deficit in abstract thinking in my experience, because everyone I know who dropped out of CS ended up in Electrical Engineering, which is nothing to shake a stick at on the abstract front. They still don't know how to program, while doing math that I can't make heads nor tails of. Most absurd memories:

"1. Java as the required programming language. I'm not going to bash Java here, but wouldn't it be nice for students to have to learn their own garbage collection? And wouldn't pointers be a nice thing to learn, even if we never decided to program in a language with them again?

"2. Taking a core class on operating systems theory, after being being deluged with Java, and finding out it was in C (of course) without even one C class on campus?

"Of course, I'm thirty, and also one of those people who always programmed, so I had no problems, but I saw plenty of people who I knew were better at abstraction than me (from Calculus, DiffEQ, and physics classes before) and their total agony at trying to finish a program that had been stacked against them."

Just a couple of data points but, as others have said, haunting.

-- Pete

share

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.

share

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.

share
1  
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
4  
Agree 100%. Why would you be an expert in something that you just got qualified for?? –  Alex Feinman Sep 21 '10 at 14:20

I found this wicked site the other day http://99designs.com/ 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.

share

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

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

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

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

EDIT: #! diff A B

3c3
<   ask/call P for a Job apply for job;
---
>   ask/call P for a Job job; if job is available apply for job;
9a10
>  //(sic)
14c15
<     apply for job;
---
>     apply for programmingJobAd;
20c21
< end
---
> End
share

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 - http://www.coulix.net/blog/2006/aug/17/ip-country-flags-django-comments/). 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.

share

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)

share

Well, here's MY two cents... coupled with quotes from a few other sources.

A surprisingly large fraction of applicants, even those with masters' degrees and PhDs in computer science, fail during interviews when asked to carry out basic programming tasks.

-- Dan Kegel via Jeff Atwood

http://www.codinghorror.com/blog/2007/02/why-cant-programmers-program.html

This is a problem that I've seen plenty of, even down to the point where people with years of "experience" on their resume not being able to perform simple tasks. Personally, I think the educational institutes are largely responsible for this, from the faculty who don't know the subject matter or can't teach it to the counselors who should be steering students that only want to get into a particular for the money without a reasonable interest in the field itself.

From the sound of your question, you're coming out of college feeling like you just got screwed out of a few years of your life to get a piece of paper. That's how a lot of hiring agencies view a degree these days for programmers. They want people who have proven that they can program, not just someone who has a piece of paper. But the fact that you're asking this question in the first place shows me a desire to actually learn to program.

One of the best things you can do to learn has been pointed out several times already, which is programming stuff. Unfortunately, while this absolutely will increase your knowledge and understanding of the technology, it's not incredibly likely to help you find work unless it's something you can put on your resume.

I suggest that you start by building yourself a few applications with specific purpose, figure out what you can do and what will challenge you to move forward, then go to some places where you can pick up freelance work. Don't expect to get paid a huge amount for freelance work you pick up on the web, you're looking to add it to your resume, not your wallet. Once you've got 3-5 items that you can point to and say "I built that" or "I designed that functionality for them", then list all that stuff out, and find a hiring agency (they're EVERYWHERE... the headhunters) and work with a few of their people to streamline your resume so it highlights your education and resourcefulness in finding work to do, and minimizes the aspect of your lack of experience.

The biggest thing to remember when you're talking to potential employers (that I see people mess up all the time), and something that ANYONE IN ANY FIELD should pay attention to, is that while you absolutely don't want to sell yourself short or minimize what you CAN do, don't OVERSELL yourself and make them believe you can do things that you have no clue how. Employers always have a knack for asking you to do things you don't know how to, and it's your job at that point to figure it out, but if you tell them you already can, you're inevitably going to eat your words later.

Best of luck to you!

share