views:

46042

answers:

183

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. Thanks again!

+379  A: 

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 :)
Keith Nicholas
+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
@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
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
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.
+1 Experience I've gained from personal projects is priceless.
Ben
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
@David M: There's two questions here: should you be programming while unemployed (ideally, yes), and should you be programming on your own time while holding down a full-time programming job?
David Thornley
*sigh*. We've seen the "you must love programming away from the job, or you're not a 'real' programmer" argument many times, and there's no resolution to it. I think it's safe to say that if you like programming in your spare time, because you're so enthusiastic about it, that enthusiasm will take you far. Beyond that, I wouldn't read much into it.
Beska
+1 for the game example, I think that games are the most "complete" type of software that you can make and learn a lot of things in many areas.
eMgz
I love SQL to death, and it's mainly my job, but I don't go near it outside of work unless it's stackoverflow and that's pushing it. I love fireworks outside of work but wouldn't dare mix those two. :D. I have learned though, that the more you're involved the better you tend to understand it (but this is not always the case, look at tensor analysis... UGH!). so, yeah, program, something you like, and something you had troubles with in school. +1 for the game example too. That's what really helped me get good at embedded programming.
KSimons
Writing algorithms isn't a bad idea. I like coding contests both for Apps and Algorithms. They force me to use what I've learned.
Jacob Lyles
I'm a programmer, but I don't write any code at home. 7-8 hours a day is enough for me - too much of anything will bore me after a while!
TabbyCool
I totally agree with TabbyCool. Before I got my current job, I was doing personal projects all the time. But now I have a project graveyard in my Visual Studio folder that I'd rather not think about when I get home from a hard day's work of coding.
Codesleuth
I would add, don't be too ambitious, especially on your first project. For instance, if you build a web app, build something incredibly simple such as a blog with extremely basic functionality, then put it on the web. Then add features to it releasing them as you go. It's far more rewarding that way, you get more regular feedback and a feeling of achievement. You don't get depressed/despondent that your overly ambitious project is taking too long, leading to you eventually giving up.
Sunday Ironfoot
In addition to a game or web site, develop a utility library, using good API and O-O design techniques and good documentation.
Loadmaster
Wait, did someone just say they "love SQL to death?" Whatever you have, I hope not to contract it.
Marc Bollinger
Not only that, but web development gives you something to show off to non-techies. I know it's the wrong way to look at it, but having that tangible thing to quickly glance at and say "Wow, I really do have talents that most people don't have" helps me out a lot.
Kyle
+1 for games. I didn't learn to program until I had to make a game myself. Design patterns, language idioms, source control, exception handling -- I didn't use any of these (or know how to use them) until I started making my own game.
rlbond
i'm a programmer and i don't go home and write code. but this is only bcause i have a job where i spend 8 hours a day writing code. if i didn't spend this time every day writing code i might have other ideas about how to spend my free time
zeocrash
+1 for dont be afraid to ask. Too many people are afraid they will look silly if they ask a question, but asking a question - whether it be a technical question or something about career progression (as in this question) - is an invaluable way to learn.
Ben
+1 for "If you want to learn you should ask", like my prophet say "every knowledge has a key, and the key to open the knowledge is asking"
Nazmin
develop a game ON a website :O:OLO (make it non flash, text based w/ graphics and ajax) then you win. no page refreshes, just seamless.
Make a game so you can also show it off to your friends!!
thyrgle
I started making a game in Java, that was all I knew. I decided to try and remake Theme Hospital in Java from scratch at the end of my first year. I learnt more Java that summer and the following year than I did from Uni. Continuously thinking, "there must be a better way to do x or y", and there was, and I often used Stack to find the answers :) Do your own projects, have fun, and get stuck in!
Relequestual
One more addition to those still in university: participate in programming contests - you don't need to be the best to do this and you will learn a lot if you take it seriously.
Dennis
You don't /need/ to program as a hobby to be a programmer. But don't expect to be a better programmer than the guys who do it at home too.
Tom Dignan
+48  A: 

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

Xavier Ho
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
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
I would disagree Charles - Euler will provide motivation to understand certain concepts and execute upon them.
Broam
Using it as Xavier Ho did seems interesting and useful. That is, making yourself master the basics of a new language. I suspect that PE will help you with either programming (on the tiny scale) OR math; so you can plunge in either way. These points aside, I agree with Charles.
Smandoli
@Charles: Yes, PE doesn't cover everything. It doesn't allow you to practice class design. It doesn't provide ways of doing generic programming. It doesn't tell you how to provide clean code. Every application is different, and the only reason I suggested PE is because Wendy mentioned she may want to learn a new programming language. If you already have some background in mathematics, PE is perfect for such a goal.
Xavier Ho
http://www.pythonchallenge.com/ is key! While Euler are math problems to be solved by programming, pythonchallenge are pure programming problems
Xster
@Xster: nice one.
Xavier Ho
+1 for project Euler - have to disagree with Charles, maths + programming is a lethal combination, you'll always benefit from it. it indirectly improves your brains logic gates ;)
Anonymous Type
+111  A: 

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.

I've been dividing my days between 1) sending resumes 2) reading books but it seems like 2) could be better spent writing code. I think a lot employers do not want to take the risk of hiring someone with very little industry experience so that internship I didn't take looks really appealing right now.
wp123
+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
"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
excellent idea. But start with something small with core functions and slowly add to it. It will be more motivating this way than trying to get one giant perfect app. I also think that you will never find as much information and tutorials as the wealth of information in books
Xster
@Xster, that's what I mean. The task of writing a "question and answer" application that has very basic functionality is a good place to start.
Matt Olenik
+78  A: 
  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.
Smandoli
+1 for *#2* - don't compare yourself and the knowledge of a crowd.
Georg Fritzsche
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
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
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
@Georg -- Nice game-of-go gravitar. KGS Smandoli
Smandoli
yeah good call, SO gives the impression that all coders are geniuses - definately not the case.
Anonymous Type
+1: reading SO will get you discouraged.
Ankit Jain
+26  A: 

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.

Anthony Forloney
+48  A: 

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.

David M
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
@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
Any job looks better on a resume then a gap does.
Jim C
At the beginning of your career, an unrelated job is better than no job, in my opinion. However, I don't agree that any job is better on a resume than no job. If there's a good reason for "no job," then it can be better than "any job." I've voluntarily undergone long stretches of unemployment, but I had sound reasons that I can explain coherently.
David M
@Jim C -- nah, you just fill the gap with 'independent contractor' ... but I still leave the gap, so I can regale people with the story of being fired for 'use of sarcasm'. (and you have to be care if you were collecting unemployment for a period ... but most of us can fill that gap w/ volunteer work, etc. if we wanted to.)
Joe
I don't know if the law/lawyer comparison is totally valid, but the sentiment that most Comp Sci programs in general will not prepare you for the workplace is a fair assessment. The transition from academia to practice in programming exists, but it is less of a leap.
Jasconius
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
+10  A: 

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.

Jacob
I've been dividing my day between 1) sending resumes 2) reviewing books but I haven't been working on any projects. That's an very interesting site by the way. It looks targetted more towards artists and designers than software developers but I will have to investigate further.
wp123
I wouldn't worry so much about the books. As mentioned elsewhere, the only sure way to learn is by doing. Don't be discouraged by it taking a while to find a job. It's unfortunate, but sometimes finding the right one takes many months. Keep trying :) I agree with you, the site is more targeted towards art/design, although if you are interested in websites, there are some of those. The advantage is you can do a project without having the idea yourself, and you may get paid, otherwise you can look at http://sourceforge.net for other project ideas
Jacob
+283  A: 

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

dbyrne
+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
Depends on your goals. People who work on compilers are in the business of inventing tools for example.
R0MANARMY
@R0MANARMY, there's definitely always room for innovation and improvement. The key, in my mind, is never to forget the goal that these innovations are meant to further: a happy customer. There's merit in novel accomplishment and there is also merit in the skillful integration of the supposedly mundane.
Dan Bryant
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
And there is *nothing* wrong with just glueing together libraries. That is what makes you productive!
Hans Westerbeek
Any integration work is an opportunity to learn more about what your are gluing together. If you can learn the why, not just the how, it can put you a step ahead. Become the person on the team who understands the library, then you can become the person who extends it or creates something really new with it.
AngerClown
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
echoing the comments of others, you spend a fair amount of time gluing together libraries because no one pays you to solve the pristine, simplified problems you train on in school. That training helps though, often in ways that are hard to predict. Like any other mature discipline there's a large body of existing work that you leverage to produce results.
Arnshea
When I'm not gluing together libraries, I'm usually making libraries that I will later glue together.
Atømix
This is actually the benefit of *software reuse* we keep hearing so much about.
Loadmaster
8-5 coding for food,5-*coding for fun
mcaaltuntas
Almost all of my 'real programming' jobs have had 'analyst' or 'engineer' in the title (a few had 'programmer/analyst'), but the point is -- knowing the libraries so you can identify what's already been solved so you're not coding from scratch every time. I want to scream every time I see a question of the form 'how do I do X without using Y_library?' without a good explanation of why Y_library isn't a valid solution.
Joe
@Joe maybe they just want to know how it works?
TM
A lot of programming is knowing how to find and evaluate libraries to address commonly-encountered problems. e.g., if you're writing an XML parser from scratch, you're probably just redoing work that someone else has already done better.
Frank Farmer
gluing libraries up is not a bad thing, however you should have a passion that always want to find out how the fundamental works.
James Lin
+10  A: 

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.

Robb
+16  A: 

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.

Larry Watanabe
That's a catch-22 isn't it? Program full-time to get the job you want.
Jim Schubert
No, in 5 years you'll realize that you know nothing :)
Earlz
you don't need to have a job to program 8 hours a day. but if you don't have a job, it is especially important because you don't *have* to program so you might even get rusty.
Larry Watanabe
@Earlz, And the nothing that you do finally know is already obsolete.
Dan Bryant
as an aside, learn java :) I used java in 97 and hated it until 96. But the language has improved immensely, the tools (eclipse) as well, and the hardware (to make eclipse bearable :). It's a whole new ballgame.
Larry Watanabe
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
@Earlz how very Zen :)
Tullo
+7  A: 

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

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

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

TimothyAWiseman
+182  A: 

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 and teach it to other people.

  6. Study other peoples programs and try and figure out how they work, then implement similar techniques in your own programs. Try and 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

Russell Dias
Add Clean Code to your to-read lists, it's pretty good.
lemon
"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á
"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
@Denilson OP has stated that she does not feel she knows how to program. Knowing one language for someone who is unsure about programming is good. My list is only applicable to this context.
Russell Dias
@Denilson, could _you_ have learnt multiple languages without learning one language first?
Péter Török
+1 for Code Complete and Pragmatic Programmer - two of the most influential books in my early career as well.
GalacticCowboy
I would also advice B. Meyer's "Object-oriented software construction" and related books.
Lavir the Whiolet
+9  A: 

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.

wisty
I thought the first version of google was made in a short time? Like over a summer or something like that
Earlz
Apache running under Linux on your desktop is a "real web server", no need to spend money. What do you think hosting companies are running?
TMN
@TMN, by web server, I meant a production hardware and software stack. I know that DH uses Apache and MySQL, but developing on a production server has advantages (everything is set up, including tricky things like mail, and they do the domain registration for you) and disadvantages (like no root, and you have to get used to remote development). Using a production server makes you dive into web work.
wisty
+8  A: 

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)

Earlz
+18  A: 

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.

Carl Manaster
+1 for Beginner's Mind
Andy Johnson
Humility will serve you well, [except when it doesn't](http://www.shirky.com/weblog/2010/01/a-rant-about-women/) -- 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
@Ian, I humbly accept your correction. ;-)Seriously - it's a good point, and a good article. I don't like the conclusion, that women should be assholes just like men, but it's hard to argue with the practicality of it.
Carl Manaster
@Carl -- too-quick of a conclusion :-) Hiring staff / managers eat that arrogance / self-promotion up. Especially when evaluating candidates for technical positions that they don't begin to understand the requirements of. I've seen many very qualified males in the same boat as these poor females, when that one over-confident, self-promoting person shows up and steals the show. I don't think we can consider it a win to encourage more females to be over-confident. The place where we can do the most good, IMHO, is by training HR folks to make better decisions, or by re-vamping the process.
dave
+7  A: 

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

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

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

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

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

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

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

Will Hartung
Writing $foo is always a win, assuming you like $foo (for any value of $foo). :-)
Ken
"Write a compiler or an interpreter": and design a language you think is cool. It makes you understand why certain choices are made in other languages too, and helps you look very close at a lot of languages and their (possible) implementation. I suggest writing an interpreter first, as compiling (as with every translation process, e.g. translating French into German) requires more knowledge (e.g. you need to know both languages), while interpretation lets you "build on" an existing language, which you can expose as a library :-).
Pindatjuh
very nice, especialy the compiler part, you need a great brain-toolset to do such a thing and you can learn increbile much(parsing, trees, graphs, assembler stuff, optimization stuff ...). And your post do have a fun bonus "Writing lots of junk"
Quonux
+61  A: 
Norman Ramsey
I have to agree. Go out there and prove to your prospective employers that you KNOW C, Python, Objective-C and build an independent application that does something. People often choose games because depending on the game, they can involve challenging design and implementation, and a lot of the libraries around are free. If you make a game for Windows, GDI/+ or DirectX are all free libs for you to use, etc.
DeadMG
The part "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. " reminded me of Dunning–Kruger effect =)
kolistivra
+1 to build something: it sets you apart from the crowd, especially if it is something that is useful.
penguat
The rest of the answer is great, but sadly this statement isn't true for the majority of jobs out there: For a good job, what you have built is more important than the technology (C, C#, what have you) on your resume. (though upon further reflection, it could be that the majority of jobs out there are crappy ones :( )
AlexCuse
@Alex: There sure are a lot of crappy jobs out there. I'm lucky in that most of the students I teach get to interview for good ones (although they don't always get offers).
Norman Ramsey
Sounds like the students are luckier :) I'm curious as to how the good ones pull it off - do they have more technically minded people reviewing resumes instead of HR people scanning for keywords?
AlexCuse
@Alex, never go through HR. If you're lucky, someone you know knows someone where you want to work.
Norman Ramsey
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
+20  A: 

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.

Seth
Your first sentence said you would chime in briefly... yet you have one of the longest answers here. ;)
John Y
+1 for "divide your task up into bits, total up the time and then double it (it's called, divide, conquer, march home ;)"... eventhough in many jobs you should quadruple it as managers will expect it done in half the time and add another project that should be done in the same timeframe without allowing the extension of your estimate. I even heard of "multiply by two and increase the unit (1 hour => 2 days, 1 day => 2 weeks, 1 week => 2 month, 1 month => 2 quarters, 1 quarter => 2 years, ...) and after some real work experience it's not as funny as i always thought
dbemerlin
+18  A: 

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.

Ami
+1 for mentioning the importance of collaboration/communication skills. Most graduates lack them.
Denis Otkidach
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
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
+32  A: 

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.

Greg
+7  A: 

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

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

Dan Bryant
+16  A: 

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.

Leslie
I want to chime in on this one. Do this. I was fresh out of a tech school working in medical records at a hospital. I started going to local .NET meetings. Took some time, but finally landed a position at a development firm doing server and application support. While not my final goal in life it beats the pants off of scanning medical files.
percent20
+4  A: 

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

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

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

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

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

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

+1 for the fairy tale. So true.... so sad.
Paul Nathan
+3  A: 

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

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

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

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

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

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

Amit Ranjan
Mathematical skills will only take you so far. What's more important for many developers these days is how to meld business and programming. You can't just be a code-monkey and expect to have a good career out of it.
Atømix
+1  A: 

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

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

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

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

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

Let your passion guide you.

Boomerangertanger
+2  A: 

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

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

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

Sean Buttinger
+27  A: 

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!

Andy Johnson
"you'll almost certainly never have to implement a quicksort, linked list, or whatever during your career"In my current position I've had to implement a quicksort for a custom written linked-list. I didn't have to implement the list though. There is definite value in knowing how basic things work.
Daedylus
I agree that a good developer should know how these basic data structures and algorithms work, and be able to implement them. I've had to roll my own linked lists a couple of times but never (luckily for me) had to write a quicksort. My point was that that the OP shouldn't worry too much about the algorithms she may have studied during her degree because many languages/platforms (.net, Java, C++, etc.) will probably include pre-written implementations.
Andy Johnson
+6  A: 

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

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

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

Carlos
+1  A: 

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

How to be an expert is a good read.

borjab
+1  A: 

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

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

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

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

Baelnorn
computer scientist != developer
Andy Johnson
@andyjohnson: I know. And the OP only mentions the term "developer" twice: when talking about a summer job and as an example of what he could perhaps do. On the other hand, the OP graduated in Computer Science - which is, as I had pointed out - much more than coding. So, what exactly do you want to tell me? ;-)
Baelnorn
OP and the rest of the thread is clearly talking about advice for a career in development, not computer science. Thats all.
Andy Johnson
Care to explain the downvote? Or is it that SO suddenly redefined Computer Science to only consist of coding? :rolleyes:
Baelnorn
+1, good point, and I agree. A computer scientist doesn't have to code. E.g. designing an efficient data structure or algorithm, which will be implemented later, has nothing to do, and is a valuable skill too.
Pindatjuh
"Computer" jobs that don't (necessarily) involve coding: Software Architect, Systems Engineer, Software Tester, Tech Lead, Database Designer (sometimes), Tech Writer, etc... (many more)
Ogre Psalm33
A: 

Depending on where you live, the job market can be extremely frustrating. That goes for any profession. I'd say try other cities and see what you can find. Just hang in there. Lots of uncertainties at graduation and just remember that it's your first time out in the "real world" so give yourself some slack and don't take it too hard on yourself. Also, don't misjudge how much you learned. Just go with what you have, and always find room for improvement based on what you know.

Daniel
A: 

If you don't feel that comfortable professionally programming, you could look at positions just outside of that,e.g. look at testing positions or support where your problem solving skills could be used initially and you acquire a bit more knowledge of how professional development is done as you may be shocked to see how it is done in some places.

I was in a similar position when I graduated in 1997. I barely passed the courses requiring programming in my third year of Computer Science and managed to take a lot of theoretical fourth year courses that didn't require using C or C++. I graduated and it took 4 months for me to get a job, and then came the shock of not knowing how to do what I was asked but I got through it. There will be a lot to learn but you just want an opportunity you aren't trying to come in as a rock star programmer. Now, I'm kind of like a fish to water when it comes to code, but this takes some practice as well as recognizing that languages and tools will change but this is a good thing. Better tools means better solutions, or at least I'm hoping so. My first job out of university had me moving over 2,000 miles away so do consider casting a wider net to try to find something to start building your career.

JB King
A: 

There was very little I actually did through school that helped me get far in programming. It set me up with a good foundation but it wasn't until I actually looked into my own projects that I was able to get ahead. It is difficult to learn something until it comes to a point where you need to learn it.

kilrizzy
+1  A: 

I felt the same way when I was finishing up school. Get a job and fight to keep it. You will learn a TON from programming 9-5 every day. It can be hard finding a job but good interview skills can get you a long way (that and NOT technical knowledge got me my first internship). The fact that you at least have some experience puts you ahead of a lot of fresh graduates in the job market.

Abe Miessler
This was exactly my experience when I've had internships. Talk about a paradigm shift when entering the workplace. Some experience with Unix or Python can blossom into a great understanding far faster than one might think when it's your day-to-day job and you're faced with actual, practical problems.
Sean O'Hollaren
+3  A: 

I was recently in your situation - I graduated with a degree in computer science, and relatively low confidence in my programming.

Getting the first job is going to require good interview skills - and write a good cover letter. Also make yourself a decent portfolio and hand that in with your application.

To get confidence - build your own software, from design to creating the installer and beta testing it. Following the development cycle here will prepare you for the workplace.

Once you start working - the confidence will come in quickly enough.

Don't worry about learning algorithms, you will learn them as you need them. You also need to consider your employer will most likely allow you to use the internet as a resource - learn from tutorials for specific problems.

If you want to increase your odds of getting a job - familiarize yourself with the .NET framework, with C# or Java. Object-oriented languages are in high demand and employers like using them because of their high productivity potential.

Until you get a job your job should be building your portfolio. Just keep adding to it, building different solutions and testing them.

Don't worry about getting a job either - you will get one, the industry is still growing rapidly and we need all the developers we can get.

Xoltar
A: 

I don't have time to read all the replies (sorry) but I'd like to say that 9 years ago I graduated with a CS degree and almost everything I did in college was Java. I NEVER write Java at work. I learned Perl, PHP, & SAS (ugh) on the job and now write in PHP more than anything else. I love it too and it was fairly easy to pick up between php.net and my Java knowledge. Some of my original programs suck but now I have the challenge of slowly going back through them and improving them as we add requirements to our site.

NatalieL
+4  A: 

Target where you want to be and what you want to do in 1 year. Focus on learning those technologies and start and complete a 'cool project' with those. Promise yourself that you'll release the project with X,Y, Z features. Purchase Code Complete by Steve McConnell. Learn mercurial (or git) and use it from day 1 with the cool project. Release the code on bitbucket or github and focus on keeping the project moving.

Some other things I recommend:

  • Learn web development and offer some basic pro bono work for a local non-profit.

  • Pick a technology that is in demand.

  • See if you can find a internship. You might be able to swing one since you just graduated.

  • Get a job - any job - to pay the bills. There's no shame in working some crummy job to pay rent while you look for work and polish your skills.

  • Watch Stackoverflow and learn. It's the accumulated wisdom of thousands of man-years. You're not going to beat it until you're, y'know, Knuth. :-)

Paul Nathan
A: 

As far as I know you can pursue your masters degree with a 3 GPA in many universities, maybe it's just your university? why don't you check in other universities, even in a different country?

Noona
I could but I've missed the deadline for Fall applications. I'd really prefer to get into the industry but if doesn't work out I can go back to school but a Master's degree is a big commitment.
wp123
I noticed that some universities offer Msc programs that can get you to the industry, an example can be found here: http://www.ncl.ac.uk/postgraduate/taught/subjects/computing/courses/so maybe until next semester when you can apply for MSc you can try to implement what other options people here have been suggesting. I myself am about to graduate and still don't know what my options are regarding a job, so I am keeping the MSc option just in case.
Noona
To be honest... this is my opinion... but a Master's degree is more an ego thing. I have more respect for people who actually create something useful... than someone who wanted a few extra initials on their business card.
Atømix
I think it depends on what you really are interested in, and on the program that you take in your MSc, some programs offer industrial projects over the course of the study, some focus more on theory and research, speaking about myself, I would really like to try the industrial part after all the theory that my uni crammed me with, but eventually I think I like the academic and research field, so I am thinking to do that too.
Noona
A: 

Not finding a job may also be related to the current economic climate :-)

As long as you don't have a job, you are free to code whatever you like! This is a good time to practice and build a portfolio. Have fun and whenever you are stuck, this is a perfect site. I have been learning iPhone development for some months now, and most of the answers I need come from stackoverflow.

So, good luck and have fun! (And don't forget, learning this skill is pretty hard! So give it some time.)

MrMotionBlur
+5  A: 

"Winning means you're willing to go longer, work harder, and give more than anyone else." Vince Lombardi

Saurabh
+1  A: 

Start writing hacker news. Use python or php, and don't stop until you've done 75% of it. Don't worry about the parts that are still broken, just write out all the features and do one feature after another until you have most of them.

Get a server by signing up at rackspacecloud.com for 11 a month, and get going. Sure, you may not get what a cookie is.

Now I'm going to let you on a HUGE part of our industry: No one knows how to do all the project they have to do in front of them. The secret is learning how to do it by reading about it.

Michael Langford
+4  A: 

I've been in the same boat. I left university not really knowing what I was supposedly prepared to do and lacking confidence in my ability to do it. I worked at a Home Depot for 8 months after graduating and it was one of the best decisions I've ever made. Somehow things started coalescing while I was there. Topics and ideas from school began fitting together; I put the pieces together.

Part of the problem with school is that you get lost in the trees and lose sight of the forest. Take a step back, do something different and relax. You've got the toolbox and some of the tools, don't beat yourself up because you don't know everything about them or feel you are missing tools. The missing pieces will come. University isn't just about learning to do something, it's about understanding how to learn. Keep yourself sharp by reading and thinking about problems. Brainstorm ideas on how they could be solved, maybe even write some code (if you feel like it).

You'll still be green when you enter your first job, but your employer should be expecting it. There are junior positions for a reason and the developers who are more senior are there to help guide you (at least they should be). Provided you're open to teaching and not afraid of a little failure, you'll be fine.

Follow your gut. This worked for me, it won't work for everyone.

TheClair
I took an IT support job after college -- definitely not what I wanted to do, but not a bad choice either; I learned a lot from it (mostly about communication, not about computers). I suspect the original poster feels there's a stigma to taking a job like that; **there isn't**. But don't get comfortable! Better to take a kind of crappy job and move on, than a vaguely okay but soul crushing job where you don't move on.
Ian Bicking
Good point. You definitely don't want to become reliant on a transitionary job. That's why I took the Home Depot job, it wasn't a position I wanted to be in for long, it just paid for some bills in the interim.
TheClair
+4  A: 

Read this: Teach yourself programming in 10 years.

Long story short, learning to program is like building a house. A college degree is a foundation. Thinking you know how to program after getting a degree is like thinking you have a house when all you have is a foundation. Therefore, it takes patience and dedication to become a programmer.

The only other advice I have to give is to not limit your curiosity. Avoid thinking in terms of black boxes. Don't say "well, I'll just connect library a library which magically does x to another library that magically does y and that's it!"

You need to understand how they work (at least at a high level). Otherwise, when something breaks, you won't have any clue how to fix it.

Jason Baker
+1 for the link. My answer exactly to the "I don't feel like I know how to program." It's all about perspective.
tylermac
A: 

It sounds like you have a thirst for seeing the big picture on all of your projects. Do not lose that thirst, it's your ace in the hole. If you continue to ask questions that transcend the project you're working on, you will transcend your peers.

brian
+2  A: 

I don't have the reputation to comment, so here comes another 'answer'.

timothyawiseman alluded to the fact that many employers value certifications while many in the field don't. Without going into all reasons why that might be, the certification can play a valuable role in your education. Let's take your situation where you find lots of C# and Java work but little in your actual areas of expertise. If you set up an appropriate development environment and pick out a few decent books that are not designed specifically as 'brain dumps', you should be able to work toward a certification and learn a whole bunch along the way.

I have some personal experience with that. When I was moving away from trucker to 'anything in IT' while having nothing more than a high-school education that pre-dated computers, I decided that getting a Microsoft certification would be useful. I picked Windows 3.11 and Excel 4.0 as the most marketable of the bare minimum certifications. I started by sitting for both exams. Naturally, I flunked badly, but that told me what they were looking for. I went out and bought a few books that seemed to address the issues and spent 3 months of part-time but intensive study. When I tested again, I passed with flying colours. The certification helped me get a job and the real knowledge and skill helped me keep the job. The self-training skills I acquired were behind the fairly rapid advancement I made through that company.

I've never done a degree, but the people I know with degrees seem to be pretty good at teaching themselves new things in their field, so I doubt that you'll have any trouble tackling a Java or C# based certification.

jadero
A: 

After I graduated with a B.S. in C.S., I still had no real world programming experience. I lived with my parents for a month and that was enough to drive me to drive to Borders every day to learn Java, JSP, Tomcat, Apache, MySQL, etc. I devoured books with my coffee, then landed a small contract gig (on craigslist) with somebody who wanted to crawl and scrape McKesson's medical supplies database.

After a gig I was able to land a full time job quite easily at Alexa. Again, I found this job through craigslist. Look out for job posting that are looking for junior programmers. These guys have the resources to hold your hand while you learn on the job.

Eventually I moved on (culture misfit), and 4 years later I'm working with Ruby/Python in one of the coolest gigs in SF, with some well known works under my belt (like one of the first iPhone apps in the Apple app store). I was able to negotiate a part time job deal with my employer so that I can start on my own startup.

  • Location is key. Move to San Francisco, or at least find a tech hub close to you.
  • You need to love programming.
  • If you love programming so much, and you keep working on something that interests you, you will eventually find a way to monetize your interest.
  • Develop good habits first. Use Git or Mercurial (easier) to manage your codebase, and don't lose your code. Get into the habit of writing tests early. Document your code because in 6 months you will forget.
  • Prepare for your interviews. Never BS. Be clean but don't wear a suit/tie unless you're interviewing for a big firm.
Jag the Reducer
+2  A: 

Don't worry about not being able to recreate Google or Stack Overflow. Most commonly used websites today did not start as you find them now. Take Facebook for example, it started as a simple application for uploading photos of people and rating them (think hot or not). It was only after a long iterative process, developed by many different people did Facebook become what it is today.

If you think about it, very rarely (if ever) do full featured new startups ever become successful, this is because the developers usually over-speculate about what the users will need and this causes some serious design issues down the road (not to mention that actual users were not brought into the process).

Most popular applications and sites start off with a single, small set of simple features that compel users to try it and then as users make suggestions, then you add features to improve the product.

So think small, this should remove the apprehension about busting your chops on some real world stuff.

Your computer science degree must have given you a good place to start developing more specified skills; growing you capacity should not be a problem so long as you keep coding.

QuomoPete
A: 

I remember when I started my first job (about 4 years ago) right out of college. The very first project that I worked on, I was asked to update some HTML code in an ASP.Net project. I hadn't worked on ASP.Net before, and had done some simple HTML (enough to know how to change words, images, styles, etc). I was able to successfully modify the HTML, but also got a chance to see the structure of the web site, view the code, ABSORB what was already created, and how it all fit together.

Two years after this, I became the technical lead on this project, and have been working hard to get it to be as usable as possible.

I do feel that after college, I had no real "big" coding experience, all the little vignettes and small problem solving functions. But the real win from the college education came from understanding why stuff works, how it can be fit together, and how to interact technically with others. With time, you eventually learn to see the big picture, learn how to create a larger system from scratch, determine how a large system is fundamentally flawed.

Good luck in your search, and definitely don't be afraid to apply for jobs that you don't think that you will get. If you show a good work ethic, you can get in there, learn, and improve your coding from some of the best.

Adam
+40  A: 

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.
Kena
+1 - Women certainly have some social hurdles to jump.
ChaosPandion
This relates....
Paul Nathan
+1, all good points. I encountered similar sentiments with fellow female colleagues when I was in school.
Heather
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
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
Awesome answer, I totally agree. Also, I noticed in my graduating class, the women who did stick it out were often top students. (Meaning, sadly, a lot of women who dropped out could have made perfectly competent programmers...)
Brandi
what a great post. awesome really.
Anonymous Type
+4  A: 

I felt like you once early in my college career, not at the end. My solution was to re-take some classes even though I had passed and allow it to really sink in. In my case re-taking was a simple choice because I only had 2 classes to retake. In your scenario you would be considering re-taking an entire college worth of classes.

While I find your lack of confidence unfortunate, the only advice I can give you is to: A) Ask questions (this is easier when you're in school as you have someone dedicated to you that by job title must answer your questions).

B) Practice writing programs. So you don't know how to write a website. Do you know how to write a program? If so, think of something interesting (like the previously mentioned video game) buy a book if necessary, but sit down, learn what you need to implement it, and write something. Then when you've written it, re-write it in a new language, perhaps one of the more alluring languages that employers are seeking.

C) If you can get one, get a job. When you get there and you're new, don't be afraid to be real with your experience from the get go. Tell people if you don't know what you're doing when asking for help (even if you feel stupid doing so) and do it early on.(This does not mean run around telling everyone you're an idiot - it means be honest with your skillset when you ask for help, it will allow the developer to give the amount of detail necessary to teach you the concept). For one, you'll be a new hire and most questions will be ok when you're new (. If you hide the fact you don't really know what you're doing for a year or two and then you crack and start asking questions, people are going to wonder wtf your deal is. Furthermore when they explain something make SURE you understand it - DON'T just say ahhh ok and let them walk away. If you tell that developer you understand and then he's back helping you on something else and realizes you don't actually still don't know what you're doing on something he already "taught you" - it will not look good for you and it will also discourage that developer from wanting to teach you in the future.

Best of luck to you, the best advice I can offer is be passionate about your studies. This is a very in depth career and a very rewarding one. The more you learn the more you're rewarded and ironically, the more you know, the more you realize you know so little.

Russ
+1  A: 

Importance of open source


Overview:

I wonder why people haven't expounded upon reading open source code that much here. It is a practice that has been very helpful for me, but then again I am quite a zealot (not as much as RMS though lol). I try to use only FOSS programs and I release all the source code I've written.

Advantages of reading code

  1. You can understand good programming practices, good style, and how to write maintainable code.
  2. You can learn how things work, and there are many other advantages.

What to do

Download the source code of an entirely open operating system such as Ubuntu and spend a day to browse through everything, that will teach you so much about how things work... Just get a general idea of the structure of the operating system, that will be very informative.

If you have any questions along the way, the open source community is very helpful. In fact, you can usually get an instant answer on most of your questions by going on IRC channels such as #ubuntu.

Responses

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

I was in that predicament once, fortunately there is a solution! Check out the source code of some high quality open source websites.

Do you use Wikipedia? Well it is run by MediaWiki which is open source, so you can start there. Ever hosted your code on Launchpad.net? You can check out its source code as well as the source of countless other websites!

little understanding of the mechanics happening beneath the hood.

To understand what's going on under the hood you should read the source of an open operating system!

Since we were talking about web stuff, here are two open source projects to check out: Firefox and Apache.

Links

Launchpad coded in Python: http://bazaar.launchpad.net/~jtv/launchpad/recife-548805/files/9136

Firefox's JavaScript Engine: http://mxr.mozilla.org/mozilla/source/js/src/

Firefox's JavaScript Error Messages: http://mxr.mozilla.org/mozilla/source/js/src/js.msg

Firefox's JavaScript Arrays: http://mxr.mozilla.org/mozilla/source/js/src/jsarray.c

jhuni
+1  A: 

Unless your CompSci program was woefully negligent you probably know more than you think.

What you lack is experience applying it. Early on, development does feel a lot like gluing other people's libraries together. That's a good place to start. Eventually you'll want to do something the existing libraries don't do - and you'll crack open their library and take a peek at how they're doing things. You may improve it, you may even submit back a path to them. With each step of enlightenment like this things get easier.

You have under your belt, one would assume, 4 years of classes teaching you all sorts of things - you'll probably find that knowledge unfolds as you need it and get enough experience to understand how to use it. But you can't expect to dive in and understand everything all at once. You definitely will need to cast the net out wider than just your immediate hometown to find opportunities but they exist. And they understand as a new graduate you have knowledge but not experience. A good firm will find ways to leverage that and make you feel confident about your abilities.

You may even want to consider entering in other areas of the tree like QA, where you'll get a chance to work with applications and try and break them. This will teach you how to perceive what's going on behind the scenes, write quality bug reports and deal with a production system and development cycle. Just make sure if you go that route you make clear to the place you apply that your goal is to be a developer. They may be able to make use of you as such and give you a chance to move sideways into their dev group.

Brendan W. McAdams
A: 

Interesting thread, read K&R and SICP, follow through with the exercises. You probably have a distorted mental model, as do many.

blackhat
+1  A: 

I "really" learn to program in one course "Data Structure and Algorithm". By the end of that course i had 123 small C++ programs on my hard drive.

These programs include programs with few lines of code to complete applications. Prominent programs were:

  • Several Maze problems (With Recursive and Non-recursive implementation)
  • MS Paint clone in DOS
  • Breakout clone in DOS
  • Minesweeper clone in DOS
  • Several April fool jokes for example on program when executed run in full screen DOS mode and simulate formatting of hard drive.
  • Several simple command line Math tool (Simple equation solver, Matrix manipulation)
  • Several File manipulation program written to itch my scratch for exmaple organizign my picture collection based on file pattern in a some sort of directory sturcture.
  • Lot of simple programs to calculate different sort of math series (Fibonacci, Look-and-say, etc)
  • Lot program to render different shapes with and on command line (number pyramid, Squares, diamonds, etc)
  • And lot more ...

I since than worked on different platform, languages and solved complex data problems. But i never have felt i had got chance to work as hard as i had in that one semester.

Yes i failed rest of the courses in that semester, except for Data Structure and Algorithm.

T-H
A: 

Look on the bright side, at least you got great responses. I'm still waiting on some, but I'm not holding out any hope! http://groups.google.co.uk/group/uk.jobs.wanted/browse_thread/thread/d1ac3c22dfc0cc91/6a58073f2add02ba?hl=en&ie=UTF-8&q=erinacht

Bright side is that I got a job soon after that post and have been in gainful ever since.

blissapp
people read google groups? :)
Tony
google bought deja news... check the date o_o
blissapp
A: 

Well I'm trying to get a master degree now and I'm not happy either with my programming skills. I know Java and doing web development in interpreted languages is not a problem for me.

However when it comes to something more complicated like a C++ code for a physics simulation (or some more complicated algorithm which involves an implementation in CUDA), I get in trouble and spend hours with debugging..

I guess I still need lots of patience and to gain some more experience.. I'm also hoping to get a challenging job later.

Nils
I would also like to mention that according to the dreyfus model it requires 10 years of diversified experience in a field to become an expert.. so unless it took you 10 years to finish your cs degree you should not bother too much ;)http://en.wikipedia.org/wiki/Dreyfus_model_of_skill_acquisition
Nils
If you think you know Java and interpreted languages after a plain old degree and no professional experience, then you have bigger problems than physics simulations in C++...
jacko
Disagreee Java code is much easier to debug than a complex C++ code
Nils
My point was that it takes a lot longer to become a true craftsman at a language than simply a bachelors degree and a few algorithms...
jacko
+18  A: 

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!

Donna
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
+1  A: 

Props to this very genuine question. I've encountered kind of the same issue (corporate programming job) not meeting your needs of trying to grow as a programmer. As someone already mentioned, if you're not working at a start-up, researching a new technology, or building features from the ground up, changes are you're probably not going to be doing really "exciting" creative stuff, the stuff that requires really analytical thinking of algorithms and use of data structures.

At my current entry-level web dev analyst job (I'm a Sophomore in college but on a break), MOST of the stuff we do is fix bugs, work with templates, "glue" existing libraries (that can have up to 10 years of lifetime) to make a web channel, etc. Managers generally don't encourage experiments on existing stuff. Why would they? Result and meeting deadlines is way more important than an elegant and efficient solution, especially when it's an extremely high traffic website. You should be at least glad that you had some real world experience before graduating. Having exposure to teamwork is really important too. Since I'm not doing the things at work that I ideally want to do, I'm forced to do little projects in my own time.

Now with the World Cup approaching, my coworkers and I are working on a "sweepstakes" website and trying to get as much people in the company involved. It's fun, people will be using it, and there will be rewards. You can learn a ton from simple things like this.

chiurox
A: 
  • I would try to get a job as a junior programmer and program or learn every single day.
  • Start a hobby project that you are interested in and work on it every day.
  • Try to specialize in one area while learning the ropes on everything else related to your specific focus area.
  • You will never know it all, the best you can shoot for is to be proficient at most, and and an expert in a few things.
Snives
+1  A: 

Computer science is also not really that much about programming. Computer science is mostly a subfield of math about the computational power and about the theories of all stuff you need to know in principle. Many people always wonder that you really don't know that much programming skills in computer science. It is a common missunderstanding that computer science is about programming.

Of course, most jobs and work you want to do with such a degree is about programming. Most companies know that when you come from a university with a CS degree you often don't really have that much experience.

The point is, all this knowledge you got in that degree is very useful and in my opinion even very important to become a good programmer. Also you will probably learn much faster about a new programming language, about some new programming paradigm or whatever other new than someone without that knowledge. And this is an important skill (to be able to adapt fast to new things). So even if you lack some experience, your skills are of some value. Companies also know that. Lacking some experience is probably a bad thing for a company who is searching for someone who can just start right away and don't need some time first to get into it.

I am not sure how you plan your future. If you want to get a job right away - just try it. It is not uncommon in your situation to not have that much experience yet.

Otherwise, if you want to get more experience: Like most people said here, just code. And also adopt to some new architectures - you will learn a lot by that. For example write some application / game / whatever and try to port it to all major systems like Mac OS X, Windows, Linux, maybe other Unixes, maybe also iPhone / Android (not that hard actually). Get used to tools like Git or SVN. Also get used to work in a team. If you don't find people to join you on your own project, maybe just join another existing project yourself. Most Open Source projects can really need help and you will be very welcome.

In can also make some advertisement here: The OpenLieroX project can also need some help! :) It's a 2D game, kind of realtime worms shooter. It is written in C++ (kind of big source code base already, about ~300k loc), uses SDL, OpenAL (and other libs) and supports Windows, Linux, Mac OS X and a few other systems. Also has multiplayer, is fully multithreaded, some some artificial intelligence (for the bots) and has a lot of more stuff inside - most of it very usefull knowledge. You would learn basic graphics stuff, multiplayer/network, how to write in a portable way, some AI knowledge, how to manage such a medium big project, how to work with Git, etc. (After all, a game is some really good project to learn about really a lot of different topics all at once.)

Albert
+1  A: 

Maybe programming is not what you're cut out for? Maybe you ended up doing CS, drifted along and assumed things would work out when you qualified, college was fun after all. However much of a failure you feel now you'll feel a lot worse if you're stuck in the wrong job ten years from now. You may feel old now but you're not, you're still a kid and it's not too late to change tack. Work out what your strong points are, find what you love and do that. You might even end up writing domain specific software for your chosen field. The main thing is not to be afraid to think outside programming altogether.

kjack
+1  A: 

Lot of great advise. I would add: Learn SQL. I mean really learn SQL. Learn how to dig data out of a database. You don't have to be a DBA, but you need to know how to make queries, views, and stored procedures. The different types of joins, how to get data from a Many to Many join. Learn Oracle, MS SQL Server, and DB2's idiosyncrasies.

Write someone an application. Any non-profit organizations that need help? But write something. It becomes part of your resume and if you're unemployed for a while you have something to show for your time.

+1  A: 

I was in exactly the same boat about a decade ago now. I spent the whole summer after I graduated, about 4/5 months looking for a job. Eventually a small firm hired me to do classic ASP work. From university I had acquired C and Perl skills; I've never used them again.

The most important thing is to keep your interests up I find that most people will learn some new skills based on what is required for the job and if you have a fundamental interest in learning how to program that will take you a long way. I've moved from classic ASP to .NET to SharePoint development and now from PHP, MySQL to programming Word 2007. The technology will always vary.

Finally, you say it will take you a decade to learn from that book but some people don't even learn that in a decade. Persevere and eventually I hope you'll find a job that is fullfilling and will confirm that you are a programmer.

Chin up.

Dave
+1  A: 

I had a similar issue, and went 8 months without finding work. It can be tough, but just persevere. You may have to take a lower paying job as a stepping stone to build experience, but I agree 100%, make that 1000% with others who say you have to program on your own for practice, even after you have a job.

Other things that helped me:

  1. Join a users group. The experience is great, you get to see free talks from some really talented people, make connections, and sometimes even win free swag!
  2. Go to local seminars/code camps. While the big ones like Microsoft DevDays, or whatever, are insanely expensive, if there is a good users group in your area, they often put together free seminars and code camps. The Code Camps are especially great. There happens to be a branch of Microsoft a couple hours away from me, and they put together amazing code camps in conjunction with the local users group.
  3. Get a subscription to Safari Books Online. 10,000+ books and videos (and counting!) for about $40/month. I've gotten my money's worth there many times over. Any computer book/topic you can think of is there.
  4. If you are more of a visual learner, there are also video tutorial sites, but they tend to vary in quality. Do some research first before purchase. I personally use Tekpub and LearnDevNow.
  5. Read Blogs. I have learned an insane amount of stuff from reading blogs from really smart people.
  6. Learn Design Patterns and SOLID principles. Actually, this should be number 1! Look up "Uncle Bob" Martin. Also, Head First Design patterns is a good book for learning, and available on Safari Books Online along with the original 'Gang of Four' design pattern book, which is a tougher read to begin with, but the classic text in the field.
  7. It takes years to really learn programming intuitively. Don't be afraid to make mistakes, that's how you learn. Refactoring code is an essential skill, because it's rare to do it just right the first time.

Hope this helps.

--Alex

adimauro
A: 

About the job, get involved in a local group of programmers or such and starting making friends. That is how I landed my first programming job a friend left one job for another and put my name in as his replacement and I got hired.

dburmeister
A: 

It's almost 21 months that I've been working as a software developer but I still feel the same. There is so much in this industry to learn. This thirst for knowledge is never quenched. I keep developing hobby projects for myself. It gives me a sense of satisfaction and makes me wiser by the day.

Sourabh Verma
A: 

I would suggest you try learning more about object oriented programming. Get a good book on object oriented programming, and actually code the examples, do not just read the book. I think this will help you understand more about what is going on. Another good technique is to step through the code using a debugger, and set lots of break points. Look at the value of the variables as the code executes, it might help you understand a complicated algotrithm.

Bob
-1 I dislike the business analysis that dont at the very least understand programming. This is because they will come up with some crazy that I have to code someone even though it may not be possible.
Tony
Bob, this is not constructive.
Jim Fell
There may be a lot of truth to this, but throwing bitter sarcasm at a person asking an honest and candid question is, as Jim said, not constructive. Please consider withdrawing your answer.
Brandon
@Brandon: I seriously don't see the sarcasm. Could you explain it? @Bob did you mean to sound sarcastic? EDIT: just viewed the revision history. @Stephanie I suggest you do to.
Wallacoloo
@Stephanie Page: calling people "jackasses" for expressing an honest and constructive opinion is EXTREMELY unconstructive. As wallacoloo suggests, please read the revision history, so you know what you're talking about before calling people names. I'll include it here for your convenience. Here's what Bob originally wrote, that a few of us responded to: "I would suggest you try business analysis, that is where most IT people who can't code go. Then there is a clear path to project management. Just smile a lot and say yes to everything!"
Brandon
@Bob: kudos for editing your answer, by the way.
Brandon
+1  A: 

A Computer Science or CIS/MIS degree does not a programmer make. In my opinion a College Degree doesn't generally teach you things these, but it does or should have taught you how to teach yourself. Your skill grows with experience. I would suggest that sitting down and writing actual code will make you a good programmer.

If you don't know how to do something hopefully your College career has given you the skills to ask the questions or do the research that will give you the answer.

I graduated College with a CIS degree, and the only job I could find at the time was writing device drivers. It was a painful experience, but one that ultimately increased my ability as a programmer. Just stick to it and don't quit, and in that path lies success.

Scott Lance
A: 

The best answer I can offer is a reference back to Stack Overflow's own CodingHorror's blog. Just start writing code and it doesn't matter who it's for. Do some pro bono work for a charity. Work on Open Source Software projects. Develop your own site or application, especially for mobile these days. As someone that has interviewed and hired developers of all skill levels, I'll tell you that all of those things count.

When hiring, I'm looking for passionate developers that can work well within a team. If you're going to be writing enterprise software, your softskills matter as much as your coding ability. Don't give up and don't worry if your first (or first 3) job isn't your dream job. This is an industry that understands the value of experience.

Above all, be aware that career security is the only way to stay ahead of the game. Job security means nothing in the end. Always be learning, the rest of us are certainly doing that.

ant
A: 

Go to the mainstream!!! Learn C#, java, silverlight etc and get any job you have chance. Here in my country, work as developer can be really frustating becouse you have no choice other than working with tools that marketing is asking for, in the worst case, you can be lead to work with requirements, testing and customization, such boring stuff, always with a low payment at the ond of the month :)))

I think learning mainstream tools can lead you into an easier way to find a job and pay your bills.

Sorry for my poor english..

Flavio
A: 

I can't agree with anyone suggesting to "program to learn programming". You don't become a dentist by drilling holes in someones teeth. You don't become a heart surgeon by cutting people open. In almost any profession you start by studying the basics. Software development is an engineering job. You've got to know the basics to do it only halfway right. Not even talking about doing it correct since there is as of today no such thing as "correct" in software development. We live in a world where "it works and has the minimum number of known bugs" is considered "good software".

We see all the time with how magical solutions people come up in software development, yet if you look at the person or people behind it, more often than not they hold a doctors degree in one or more areas and have a vast background in sciences.

After 25 years of development in various areas and with many languages I can tell you that I still don't know half of what I'd like to know and not a quarter of what now seems required to produce quality software. There are so many areas of science involved in software you simply can't teach that in 3-5 years.

We'll have to start specializing on one area become real good in it, just like it happened in other professions. Take medicine for example.

So my advice is: study but don't study programming. A programming language is the least to learn, it's a tool and not the raw material to shape a solution from.

Uniwares_AS
that's not a great analogy. dentists don't become dentists by drilling holes in people's teeth because there is a shortage of people willing to volunteer their teeth for dental practice. The same for heart surgeons. With software development it's a lot easier to learn the basics if you have the context of a development project to see how they are used best
zeocrash
+1  A: 

Wow... a lot of interesting comments most are good.

I learned programming all by myself that does not mean you have to. My son is going through college and about to finish. Finding a job is always hard when you first graduate.

When you did the simple programs during class did you like them? If you did at first then you might be in the right place, if not look into doing requirements if you like typing documents.

It sounds like you want to learn more since you did not like the iPhone experience of just gluing things together. That is a good sign not a bad sign.

Next finding a job depends on if you are in a Large city or living out in the country.

Learn HTML by creating your own little site. Pick a web language... (PHP, ColdFusion, DotNet) Build a few simple sites.

Take ANY web development job or programming job that will offer you a job. Do not worry about $$ at first. Your goal is on the job programming. It is hard to program at home on your own project. However at work when you are required to get something done you tend to work much harder and if you find it is not fun pick a different IT carreer. It does happen.

Take ANY job... you will learn... if you like it you will overcome.

I never felt like I knew how to program, that is a very good sign. I hate working with those who feel like they know everything they tend to code very badly and do not document anything they do.

I hope my comments help you with all of these other great comments.

Nathan Stanford
+1  A: 

You get to begin your software development career with a foundation in computer science and a degree to show for it?! How awesome!

While you may be concerned about finding a job and not having the requisite skills for software engineering with a CS degree, imagine being in the same place without a CS degree. That's exactly where I was a year ago.

I cut my teeth in programming by creating monolithic macros in Excel and Access using VBA and managed to pick up a little SQL along the way. About a year ago, I decided I wanted to begin a career in software development, but I couldn't imagine how I would find a job without a CS degree (I have a BA in philosophy, of all things) and with zero "professional" development experience. Who in their right mind would hire me?

I decided to focus on getting a job whose focus would be writing business applications, so I decided to hone my skills in .NET and C#. Before 9 months ago, I had never written a single line of .NET code. But I dove in; and I got in over my head; I struggled; I went to as many user groups as I could find; I read blogs about coding; I embarrassed myself (and still do) on Stack Overflow; I listened to tons of podcasts just so I could become familiar with what is out there. Still, I felt behind, but I had finally gotten over my fear that I was unable to do something.

2.5 months ago, I landed my first job as a professional developer (I wrote about how I found the job on my blog, in case you're interested). I'm now coding in VB.NET, VB6, and javascript and continue to learn tons about programming every single day. But if I can find a job without a CS degree, I am confident you can build up your skills and find one as well.

Ben McCormack
A: 

I graduated not knowing what to expect. I'd successfully competed in programming contests (not necessarily winning) so I knew I had some sort of knack. I spent the first few years of my career doing maintenance of other people's software. It was completely uninspiring, but I learned most of what I know about the languages used and software design doing maintenance.

Many have suggested a personal hobby-project. My variation: dig into an open source project. Study it, learn it, fix or enhance it. There are thousands to choose from. You will expose yourself to some pretty good code and can possibly, hopefully, eventually, make a contribution to something worthwhile.

Lynn.wallace
+3  A: 

A few things: a good Computer Science (or any science and engineering) program should not really teach you how to program, but how to think and solve problems. "Programming" is an unbelievably huge topic with dozens of languages in use (hundreds of niche ones), dozens of platforms, a constant moving target of technologies (web, db, mobile, linux, embedded, game, scientific...). You will NEVER feel like an expert if you compare yourself to what people are saying on the web. There is just too much to know! No one knows it all!

  1. So, for finding a job, I would suggest crafting your personal "story" about how you learned to think and solve problems, communicate your thoughts, etc. in college. Every company has their own unique flavor of programming and areas of specialty. You will NEVER be fully qualified to start working at ANY company, and no one expects that. Instead, they want people who can be trained, are pleasant to work with, will "fit in" with their corporate culture.

  2. Don't work on your own as a substitute for working for another company. Any new graduate needs years of surrounding him or herself with people from whom they can learn. When interviewing, it's a good honest strategy to tell them that you want to learn from them.

  3. Learning C is important. If you can write good C code, you'll pick up any other language they throw at you. My mentor in a high-school internship told me that in order to be a C programmer, I had to be able to write a "linked list", add, remove, and find objects in a list. Learn to do this in C in your sleep and you'll be as good a programmer as anyone!

  4. While looking, spend lots of free time just writing little programs, working through examples, reading books (and when you read a C book, work through EVERY example). Don't bother with Kerningham and Ritchie (they wrote "THE Book" on C, but it's outdated).

Don't get frustrated. You picked a bad year to graduate.

Stuart
A: 

Can I suggest you hone your skills the same way a lot of other specialties do? Volunteer for a non-profit. Even though it doesn't bring in a paycheck, it will be an entry under the "experience" column on your resume.

Something I tell my kids and "probys": Learning is not something you do in school and once you graduate you stop. Learning is a lifestyle. Once you stop learning, your lifestyle will decline.

Getting the CS degree is admirable but it is not the destination. Graduation is the key to unlock some doors of opportunity. Graduation doesn't entitle you to a job. Then, once you get into the building, programming is not about knowing everything... its about how well you can learn and then apply what you've learned to solve the problems at hand. Experience will come with time and your best learning experiences will be from your failures. Welcome to life. :)

J Palmer
+3  A: 

Try not to get frustrated after just one month of job searching.

Your math and CS training are a great foundation, one I wish I had (my degree is in Russian). However, fortunately for people like me, most commercial programming doesn't involve algorithms.

Learn assembler and machine code. All other languages are just syntax.

Unless you're really creative and passionate about something, a hobby project won't do it. Find a non-profit (church, fire company, local government, etc.) that wants a web site and build it for them. In addition to learning HTML, CSS, SQL, and .NET or Perl or PHP or Ruby/Rails ... you'll learn how to deal with customers, and their specifications and expectations (which are rarely related). Some of these organizations may actually pay you. Remember that a programmer is never really unemployed; s/he just becomes a consultant.

Get a job doing anything in IT at any salary; show them what you can do; learn.

Nobody writes applications from scratch any more. Learn from others. Besides, it's not efficient. Whatever library or framework you use won't do it exactly the way you want or need, so you'll have to code around it anyway.

This business never stops changing, and you should never stop learning. Most of what I have written in over 30 years of programming is long since obsolete. I started with COBOL and JCL, moved to PL/I, then Assembler, then C, with some APL, BASIC, Pascal, Java and others along the way; not to mention a host of scripting languages. By far, Assembler was the most important in the long run, although I haven't actually used it in years.

It's true that, unless you're applying only to Google, Microsoft or somebody who develops microcode, firmware or compilers, once you've been in the business awhile, nobody will care that your degree was in music, or even that you have a degree. Certification is overrated, and very soon outdated.

"... in 5 years you'll realize that you know nothing" -- best one yet

Take as many interviews as possible: practice makes perfect. Research the companies and make the interview a conversation.

Read and heed all the other advice in these answers.

Ted Brewster
A: 

First: relating to your confidence

After graduating with a degree in Computer Science, I didn't feel like I knew how to program either. I felt like I hadn't learned anything from my degree other than how to fling together a Java program that could read a file. I certainly didn't understand what a BufferedReader was, or why I had to wrap so many classes around so many other classes to do something like read a file. I guarantee you that the majority of the people you graduated with, the ones who seem so confident, don't know this stuff either and feel the same way.

It wasn't until I started doing this stuff every day, 8 hours a day that things started making sense. And it took a couple of years. It took me trying and failing, and making a bunch of mistakes before I understood things I think are simple now. You may not understand a lot of your teaching because you don't have any context in which to place it. It will come with time.

Second: relating to your job search

The only thing stopping you from learning C# or Java is yourself. If they're looking for Java developers, spend a weekend learning Java, then put it on your resume that you learned Java in an academic setting. It's all part of playing the game. Most employers hiring entry-level CS grads won't expect you to have an encyclopedic knowledge of a language. They'll expect you to understand basic things like how to create classes and objects in that language, how to handle loops, and some basic containers like arrays and dictionaries.

Third: relating to your confidence

I assure you, every single great programmer has felt the same way at one time or another. Nobody pops out of the womb as a great programmer. Nobody graduates with a degree in CS as a great programmer. Great programmers aren't created, they're forged in a long, eye-straining, curse-word filled march of failure, frustration, and broken code. The only way you'll get better at programming is trying and failing. It's going to be frustrating looking at your code, knowing it should work and not knowing why. But the frustration of that is unmatched by the triumph and euphoria you'll feel when you figure out the reason the code didn't work and fix it. The only way to gain more confidence is to program, and the only way to do that is to walk to the edge, close your eyes, and take the plunge.

Hooray Im Helping
+1  A: 

I don't know if this will actually get read, but I feel the need to sill put it out there.

College did not teach me a whole lot. Some basic programming and data structures. Nothing mind-blowing. However it did show me how I learn best. I learn by doing which is in line with a lot of the posts here. I also learned that I like to create stuff via code much like a wood worker likes to create stuff out of wood. So between those two things, I took the time to do something to learn it.

An employer knows what they are getting from a college graduate. They know that the graduate does not know a whole lot. However some employers love that because then they get to mold the new person to their culture and mind set. They will teach you the ropes to get you rolling. Just be ready to learn. This has its ups and downs.

Don't sweat it. The IT industry was one of the least affected by the recent downturn. There are jobs. The company I work for just hired a bunch of new graduates. The trick is finding them.

Good Luck.

Tony
A: 

I would agree that Python is coming back in a strong way. It is still a niche area somewhat not being as ubiquitous as .NET or Java. However, it's that very nature that makes it such a popular tool for scripting custom code in larger projects.

There are several great products out there that use Python and, now that IronPython is out, there are many industry products that are revamping themselves. As a Python developer, even an entry level one, you could find that this is a great time to get in the game. Just keep looking, don't limit yourself either geographically (within reason) or financially as there are hundreds of others out there looking for jobs too. It's just that kind of market.

Good luck!

Matt Penner
+2  A: 

I believe you won't get any where if you keep on thinking like you are now, look the world is not finished if you couldn't understand developing iphone application or couldn't understand some of the hardcore algorithms, but you did at least understand some right because after all your are going to graduate in computer science!

Oh do you remember when you were a kid in 2nd grade and you though how the third graders knew division or what ever else for that matter, it was because they passed the first and second grade, so everything comes gradually. not in 1 day learn how to be patient, at the same time have some dedication.

Computer science is a huge subject(networking, programming, grpahic designing, imaging, 3d, cnc, cad/cam, embedded systems........). Do your self a favor choose 1! I chose web development and targeted .net specifically.

I hope I am little bit help and inspiration, Concentration is a big thing if you can be consistent.

fzshah76
A: 

I was in a similar situation when I graduated from college, except I thought that I knew how to program. You're already one step ahead because you at least know what you don't know. I studied computer engineering and had a very difficult time finding a job. Eventually, I ended up taking a job delivering pizzas. Work like that, when nothing of choice is available, at the very least, shows prospective employers that you are willing to work and that you are a good, hard worker. The next three years were spent doing applications (i.e. technical) support and software verification. For last three years I have been employed as a full-time software engineer.

Stick with it; you'll get there. Keep coding, if only for fun and the personal enrichment of it, and set goals for yourself. Decide on your target job title and go for it. In my case, I wanted to do embedded programming, which was why I transitioned from applications support to software verification. The position dealt with an embedded application and provided opportunity for some embedded software development, albeit test-code. Steer clear of applications/technical support, if you can, because it is usually a resume killer for engineers/developers.

Something else you can do is show your resume to a lot of people, friends, family, etc., and ask them to critique it. Take their advice seriously. That doesn't mean that you have to accept it, but think seriously about the feedback they do give. If you know anyone who is in management, HR, or a senior developer with lots of experience (anywhere), ask them if they'll give you a mock interview (and critique afterwards), so that you can practice your interviewing skills. Many times, especially for entry-level positions, hiring managers are more interested in candidates who communicate well and easy to get along with. Be sure to stress that you are a team-player, as well as your sincere interest for the job for which you are applying.

Jim Fell
A: 

Why don't you try a different line of work? I have been writing code for about 12 years now, and it's in my personality. After reading your dillema, it doesn't sound like you are really interested in software anyway.

A: 

Get a job, any job, even if you have to work for free to begin with.

It will take you at least 5 years before you become somewhat of a craftsman, and even this is dependent on the places you'll work, so in the meantime, just take anything you can...

...even Flash.

jacko
It will take 5 years if you put no effort into it.
ChaosPandion
Thats exactly what someone who has 2 years experience says... The longer you code the more you'll realise exactly how much you don't know, just like most things in life really...
jacko
+2  A: 

User Groups, Developer Events, Blogs, and Podcasts

I've been working in software development for 10 years and attending user groups is probably one of the best things I have done to advance my skills.

It's very easy to get stuck in a rut where the only code you see is what appears on your monitor day after day. The truth is that there is a large community of developers who are actively engaged in learning and finding development practices that make our jobs rewarding and fun.

Attending free developer conferences such as code camps, give camps, and open-space conferences is a great way to get exposed to a lot of different development paths that you haven't yet explored.

Community Megaphone is an excellent resource for locating developer events and user groups near you.

I would also recommend searching out blogs and podcasts that connect with the kinds of development you're interested in. Podcasts offer highly customizable content and are great to listen to during a long commute.

By the way, you're likely to come across a lot of information and ideas that doesn't necessarily relate to you. Software development is a highly innovative industry and every developer has a different approach to solving a problem. It's the nature of the industry to produce and compare many different technologies and APIs, weighing their pros and cons. Bite off what you can chew and use the "Law of Two Feet" for everything else: If at any time you find yourself in any situation where you are neither learning nor contributing, use your two feet, go someplace else.

Most importantly, don't allow yourself to be siloed. Sometimes you just have to get out from behind the monitor and explore. Good luck!

Technobabble
A: 

You have just expressed what I feel for my own. I'm almost graduating in Computer Science and as many of us I've just learned theoretical algoritms and developed very few interesting projects. But as Keith Nicholas said

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.

I missed this important point and I've just done what they've asked to me to do at the University. It will be the first step I'll move into.

For the moment when I try to do something more I feel again as well as you said:

I felt like I was mostly gluing together libraries that other people had written with little understanding of the mechanics.

I'm grateful for your post and for many answered, advice and links they wrote to "us".

soneangel
A: 

I think this is fair normal.

I'm a new grad, and I think that getting a degree taught me the process of learning, rather coding or than anything else.

born to hula
+6  A: 

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!

md5sum
+4  A: 

One of the problems with graduating from computer science is that you probably were not trained to be a software developer. While there are some universities that do teach software engineering, most CS courses are not intended to produce people to be industrial software designers. There are zillions of coders out there but the real need is for someone who knows how to design software systems.

Nobody would want a biology grad to take out their appendix or a chemistry grad to design a chemical plant or a physics grad to design a jet airliner.

In the same way, nobody should want a CS grad (who was taught by the science faculty) to design software. That many software developers are CS grads is due to the fact that the alternatives are electronic engineers and people with a masters in Eastern European Folk Dancing (I kid you not). So if you really want to work in software development, learn UML and take a course in Software Configuration Management.

Tom
You can do fine in software development without UML. You can not do fine without design skills. Maybe learning UML might cause you to examine design, but you can do the work without the formalisms.
Warren P
A: 

Let's all face reality. The reason why you are having a difficult time finding a job is because of outsourcing. It's costing a lot less to hire a programmer overseas than in the US. In these economically tough times, companies are choosing to go overseas even more and being very careful in who they hire in the US.

Also, I'm speaking from real observation. The current company I work for has half of their employees in India. While they are slow to hire in US, they are aggressively hiring technology people in India.

ktasy
A: 

The more you learn, the more you will realize that you actually didn't know anything! :) This should not discourage you but increase your passion to learn more! Starting to worry about it first will make you just sit and wonder where to start...start small... you cannot expect to know everything in the world when you graduate. Choose your programming languages...You possibly cannot learn all the programming languages in the world or learn all the functionalities of a programming language. Learn the libraries! By gluing together libraries you are not committing a crime but you are making sure you are not reinventing the wheel :) My last advise is to love what you do and make programming a passion and a hobby. Then you will not feel that you are working for an employer but engaged in a hobby :)

Ranhiru Cooray
+1  A: 

I believe you can accumulate more experience when you have good imagination in less time.

Imagination is more important than knowledge. For while knowledge defines all we currently know and understand, imagination points to all we might yet discover and create. Albert Einstein.

In other words "With great imagination comes great achievement/success".

Improve your imagination, meet more people, and do more.

THEn
A: 

Check http://greatmaps.codeplex.com/. In the beginning I had no idea how to do it ;} So you do it simply by doing it.

PS. I have no 'official' degree, time waste.

radioman
Radioman, did you write this? If so, I suggest you work a bit on the interface - it looks like a very useful program (whatever it does), but the interface is god-awful.
BlueRaja - Danny Pflughoeft
A: 

Great Question

  • Are there any state\federal government agencies looking for people in your area? They don't pay that well, their budgeting process is insane and you will probably need to buy books with your own dime, but it may get you over the two year mark. It worked for me.

  • What about part-time working doing maintenance on someone's website?

  • Have you advertised on Craig's List or some other service offering cheap programming work?

  • How about sites like Rent-a-code doing some not very well paying small software jobs? I never tried it but you want to ask around.

  • Any local charities looking for fee part-time help? May not pay but it may get you some experience in web technology. Having some projects on your resume will help. It may also help you stay motivated - they may challenge you. And they can't complain too much because it's free labor, will not cause anyone's business to fail, and will not kill anyone.

  • Read like crazy. Knowledge is ammunition for life.

  • Pay attention to best practices. You may find your self working alone without guidance. No one wants to be pay to un-screw your bad habits.

  • Work your face off. Persistence counts. I did every crappy IT job: ran fiber in sewer systems, ran cable in offices, taught Microsoft Office, did help desk work, etc. Smart, hard working people who can learn are always in short supply.

  • I found that my willingness to work 60, 70, 80, 90 or 100 hours a week opened up doors for me. It was also the extraordinary learning experience in my life - I found that my rate of learning accelerated over time, I out distanced my peers, and ended up in a tech lead position. Do this while you are young - because I'm 40, just finished a 103 hour week after a couple of RAID controllers failed just before rolling out 3 integrated systems, you don't bounce back as quick and the wife is not exactly pleased :)

  • Resume advice experts generally don't recommend that you put your GPA on your resume unless you have a high GPA. If you are asked during an interview, be honest.

  • Have you had someone who knows what they are doing review your resume?

Good luck.

Some great ideas here, but don't under any circumstances work 100 hours / week. It's not worth killing yourself. (I once had to regularly work around 70 hours, and I was basically the walking dead.)
Brandon
+1  A: 

+1. Interest is very important, and coding sometimes need more patience!

Fisher
A: 

I've had the privilege of working with some really great programmers on their first assignment after getting out of school, and I'd say none of them had any idea what to do the first day on the job. Like them, you obviously take your craft seriously and I would be willing to bet you're going to be an accomplished programmer. As noted by Norman Ramsey above, your assessment that it will take a decade to master the art of programming is right on the money. Your humility and the courage you've shown by posting this question tells me that you've got a great career ahead of you.

Paul Keister
A: 

Always be on the lookout for things to code. It can be hard to practice when you restrict yourself to large projects, or 'things that would sell' or 'resume pieces'.

Last week our security guy brought a report to a managers meeting that identified me as having racked up 34k hits to Facebook in 3 days. This is obviously impossible, but my managers aren't terribly bright. It was left to me (seriously) to prove my innocence.

I went home and wrote a program that night to calculate total time spans for repeating processes. I was able to demonstrate that it was essentially mathematically impossible for me to have done that. But just as importantly, I learned a few things writing that code (such as working with the new .NET TimeSpan stuff). I've continued to expand on the program and it's getting pretty nifty now, with random seeding and such.

The hard part for me is finding new stuff to work on that I can progress in and gain chunks of knowledge that are useful to me in my job. I tend to get caught up in the trap of not wanting to code something unless it's really large and challenging. But I think I learn more overall by choosing little things that I can actually accomplish, and then expanding on them as my understanding of that area grows.

So, look around and find something you can knock out in an afternoon or two. Do this as much as possible. You'll be surprised how many ideas you come up with and how much you learn in the long run.

Superstringcheese
A: 

I don't see anyone else mentioning this, but holy frijoles Batman, if you know Objective-C and have experience doing iPhone development, why not come up with a modest idea for an iPhone app (even if it's not completely original) and write it? Better yet, find a collaborator. There are meetups for iPhone development in most major cities, I'd be willing to bet, so you could find others who'd be interested in joining you.

You would be able to do work that you feel satisfied with, without a psycho project manager complaining that some feature wasn't delivered yesterday. And you could release your program for (say) $1 and very possibly make a tidy sum.

Brandon
A: 

Just start doing it. Get as many tutorials and books on a programming language you wish to learn and do it, do it and keep doing it. You will not understand much at first but keep at it and you will soon have a portfolio of work to display. Then the jobs will come. Good Luck. -Nolan

nolan campbell
A: 

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.

In my experience your portfolio and experience are equally as valuable as your qualifications or background.

My life experience is to learn by doing. Try to surround yourself with people smarter than yourself, and experiment to see what kind of work works for you. Most of the older people I work with in this fields have had multiple careers paths, e.g. I know one talented programmer who has been a DBA, .NET programmer and later a Unix administrator and PHP programmer.

P.S. did you enjoy programming for the iPhone? If you have experience in mobile, I would consider pushing this in your job applications. The company I work for is getting an increasing number of requests for this type of development, so this might be a good way to launch your career. Focus on what you already have.

Aaron Newton
A: 

What to do:

Find 3-4 people EXACTLY like you. Start meeting up 2-3 times a week for 2 hours (not more, it turns from work to party really fast) and start a project. No homework, you all just work at the same time. The rest of the time do not work on the project, just think what you can bring next time and discuss with the others.

If you fail and the project blows over, you get a lot of experience and actual information from the others ( some of the things, you would have never discovered by yourself)

If you build something worthwile, welcome to the startup world. Build something easy at first... a blog... from scracth. DO NOT USE external help. For a seasoned developer, it takes 1h to build one. It will take weeks for you. After 3-4 projects like this, about 4 months, you'll be able to build very complicated stuff.

As a sidenote... working for IBM or Google or whatever is NOT fun. P.S. I'm not pro Microsoft. But learning Visual Studio 2010 Express, with a focus on ASP.NET MVC and a Linq2Sql backend is easy to learn. (check out www.asp.net) The "express" gives away lots of "free" stuff. And windows hosting is on par with linux hosting.

basilmir
A: 

Hey
I started programming when I was in the first grade. I learned writing on the keyboard before writing with a pen on a paper. Now I'm 18 and I'm still not good enough but the important thing is to keep trying. I always search for good articles and try to understand more and more about how the computer works as a whole.
For example I love programming graphics with OpenGL. You should find something similar that you really enjoy and alawys try to take it further than anyone has. You won't succeed today, nor tomorrow but if you try there's a chance one day you will be able to say "I was the first to think of this".
Look for work on different websites like GetAFreelancer. That's where I started to earn money out of this passion. Also I'm working on a game engine right now. It's the third time I started from scratch but now I can safely say it's better than most I've seen. I coudn't say that the first time nor the second time. My adivice is that you learn by doing.
Try to make programming a fun pleasure not something you have to do to earn your bread(if this is the case then maybe programming isn't for you).

Sanctus2099
A: 

First of all, when you're just graduated it's normal that you don't feel like an adequate programmer yet. It's not called Junior for nothing. The most important thing we look at when hiring developers is experience, for good reason: you are not alone in this.

There are several ways to better yourself faster than just random just doing it:

  • find someone to learn from and pair with that person
  • commit to an open source project
  • answer questions on forums (like this one)

All these tips enforce learning through Peer Instruction, which I've found to be extremely effective. The more you do publicly the more you are motivated to learn from your mistakes. A nice side effect is that you will build a curriculum and get some google juice in the process.

iwein
A: 

You will want to get yourself involved in a small project taking on some junior role and build up your confidence out there. There are plenty non-paid projects that will not only help with your portfolio but give you the necessary experience to the game development lifecycle and not to mention all the skilled developers you will work with. Have a look for projects on gaming sites (http://www.gamerservices.net/, http://www.gamedev.net) and get involved you won't regret it. Also there's a bunch of prjoects on sourceforge - I find that the best way I learned was to find something I was interested in that would give me the drive to learn.

Hope that helps

Mike
A: 

Wendy- I am in the opposite (sort of) situation. I was in another field of work (education) and am now trying to teach myself obj C. It is very difficult for me. I have a small, very little "action" app planned out / designed and would love some help. If you want to talk more, email me at *removed (I don't check this website as much as I should as a Loy of it is waaaay above me, so if you're interested, email me directly). This could be an opportunity to work on a real life app and I'd be happy to talk about compensation / credit.

Good luck and kudos for such honesty.

Rebecca
You never want to post your email. If you do make sure it points to a trash account.
ChaosPandion
+1  A: 

Keep in mind two things:

  1. You don't learn how to program (applications) in a Computer Science program. Real life applications aren't one week or two week "bite sized" homework problems. It takes a lot of planning and coordination to get a real life application up and running. It's a different mindset than what you're used to, but trust me you'll get there.

  2. Maybe things are different now; but when I went to university only two or three of my professors actually worked as programmers (undergrad AND graduate). So perhaps you feel unprepared for application programming because you were taught be people who never worked on real applications. That's not to say that what you learned is useless... there's a lot more to creating applications than programming. It just means that you still have a lot more to learn. And that's OK, you're entering a field where you never stop learning.

Giovanni Galbo
Those who can't do, teach!
thedp
A: 

Hey man you are Computer Sciencer! and there isn't one way in this job, maybe DBA, Network Administrator, etc., etc. will be good for you. So it is not big problem, there is no rule about the fact that every computer sciencer can write code. But still you want to learn how to obtain good coding skills. You should learn:

  1. Object Oriented Programming

  2. Test-Driven Development

  3. GRASP Patterns (Read Craig Larman's Object Oriented Analysis and Design)

  4. Design Patterns

  5. Refactoring (Read Bad Smells in Code)

  6. Extreme Programming (Read Extreme Programming Explained.)

  7. Learn one presentation style which is ideal for you (Web, Windows, Embedded.)

And don't forget that techology is temporary. Learn first 6 properly and you will learn 7. in your job :) Good Testing Coding and Refactoring :) and follow Stack Overflow's questions. It is really big resource.

ibrahimyilmaz
A: 

Investigate some Open Source projects, find one that you think is useful or you like, and try to start contributing. This will benefit you two-fold. Firstly, you'll get experience developing for a product that people use. Secondly, you'll be able to read other peoples' code and see how others approach problems.

I think you'll find jobs that require Python experience are usually targeted towards people with experience which is a bit unfortunate. Java, C#, and PHP seem to have the biggest market for the non-experienced. I'd suggest looking for an open source project that target one of those three languages to get some brief exposure to increase your chances of being hired for a graduate position. This will at least get you in the door, and you may find that internally they are using languages that you're already familiar with anyway.

Josh Smeaton
+12  A: 

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.

barkmadley
A: 

Just trackback when you're still young, you even knew how to laugh, you even knew how to cry, you even knew how fell bad, sad and happy, you even knew to walk, dance and talk.

Until the time came you crawl and stand up little by little then, suddenly step your foot one time and another. Day by day you're getting older until the time you went to school from prep until college.

All of this we don't know, but we are free to learn from others and by your own efforts. Just think all of this stuff. All of us are born from nothing, then little by little we've learned a lot by our parents, environment and from ourselves. Just believe in yourself dude, I know you can "DO IT". "JUST DO IT DUDE". There's a lot of stuff you can learn on Internet, books, ebooks, people behind you. And don't forget GOD is always here beside you. Trust him always dude.

+1  A: 

Just keep on learning and you will gain your confidence :)

joven
A: 

For me, it's the same as learning how to drive a vehicle. The lessons tell you how to do it, but the experience you need to be good at it only comes after time. Not to mention the difference between a school project and a real life project. The latter will introduce to you all kinds of problems that your education likely hasn't prepared you for.

I've graduated years ago with a Bsc in computer science, and ever since I've developed software (well, web sites and applications mostly) and I still have so much to learn from the real experts.

Don't worry about not being an experienced programmer, it's nearly impossible for you to be that at this point, and you are SO not the only one. If you can find a way to focus on staying on the road to becoming an expert, you are going to be fine. If you beat yourself up unfairly over this, you risk settling for a job that isn't going to challenge you for long and that could be a roadblock.

Bottom line: be realistic but by all means, also be ambitious toward your knowledge and skills. I think you have the former covered, and you surely have the latter in you. You wouldn't have asked the question otherwise. :)

Rob
A: 

How about unfunded startups that give shares for your work. You will be on the front line of software development, gain experience that most developers will never have.

But it's all about how much can you survive without a paycheck...

thedp
A: 

I've been coding professionally for fourteen years and still have days where I feel like this. You'll feel differently once you land a job and have done six months coding.

hang in there, it gets better :-)

5arx
A: 

I think you need to measure what it is that will satisfy conditions for being successful. If you seek a position at a company where you can create new solutions or are integrations of existing libraries, then you may want to concentrate more on casting your net wider outside the region where you live. You have a tough time now with the economy in its current state, as there are a lot of people with technical experience who are looking for work. This means you will need to develop other skills such as ingenuity, character, personality, resilience and other facets that will differentiate you from others.

More than likely you will adjust what direction your career will take after you have worked a year or so. The only way to judge what you are cut out for is to work for a while and re-assess. It may be that you choose an ancillary field like testing, or project management. No shame in that as long as you are the best that you can be at those endeavors.

If you are worried about being a better coder, then you should seek out someone who has proven work experience and could mentor you. Many times you will pick up very important thought processes and methods that you will not read about.

David Robbins
A: 

Don't give up is the first thing, and by posting here it shows you are not only committed to your craft, but know you don't know enough.. many don't.

The stuff you have learned will pay off when you apply it, you just need to get your start. It will come!

Binny
A: 

No one expects a computer science major to be an immediately perfect fit into an application development role; they're two different tasks. The big thing is that having a computer science degree gives you a big step up on folks who don't; you have a strong, strong background, you just don't have the day-to-day skills yet.

The things that we teach to new hires range from "how and why to use version control", "writing maintainable code", "planning for scalability", and databases in general.

If it helps, I'd recommend two books strongly;

  • The Pragmatic Programmer, which is a hands on, informal walk around the job. It's just random advice from folks who have done development for years, on how to be a better developer. Absolutely worth the money.
  • Code Complete, which is a hands on guide to writing better code. Absolutely worth the money.
Dean J
+1  A: 

I'll be in your exact same boat my friend in about a year (graduating roughly 2011/2012). While our school teaches development in Java, I spend a lot of my free time reading up on other languages such as ASP.NET, PHP, Ruby, TDD, MVC, DDD etc... because I just love it. There is something about the ability to take code, and mold it into something that can potentially help millions of users, while making you money. Its like an art if you ask me.

You can only get better with practice. At any given time I have web projects, winform projects, WPF, and more projects going all at once, so I don't get bored. These projects don't even have to be marketed products (but they potentially could be). They are mainly to help me learn different technologies.

Good luck to you!

Jack
A: 

I felt the same exact way when I graduated from College. It seems like the professors give you a general overview of programming and programming languages, but do not actually teach you how to do it. However, I have found that the aerial view given by my professors, though useless at the time, has actually helped me when navigating through actual programming. You come out of college with a basic understanding of what is going on, a simple foundation. And over the years you will find that you are building upon that foundation. Don't lose hope, I can guarantee you that there are many companies out there who would love to hire someone with a CS foundation that they can train up themselves. I think the key to any job is the desire to learn and to be trainable.

Good luck with your search! Remember, you have everything you need to program. Everything else will come with time and practice.

jeremysawesome
A: 

Become a PHP script kiddie, then you don't have to know how to program instead of copying and pasting code.

marko
A: 

Your short time in school is best spent learning the theories and frameworks. Don't worry about the implementation details until you get out in the real world.

Vagrant
+2  A: 

I read all their answers and I see they were great advisers. I agree that learning from school are too basic that most student taking it for granted. But it is important to learn the basics to get to the next step. It's not too late to learn, make learning a habit. Love your job, is there you can find the best answers. If find difficulty, Stack Overflow is here.

XBasic3000
A: 

Ask your question on Stack Overflow and get the best and great answer. I had have the same situation like you but I got too much confidence with the help of the member of Stack Overflow by getting their answers. Stack Overflow is a very good site for programmers and many people has started from here by asking question and now they are giving now great answers and help each other.

Harikrishna
+1  A: 

I'm another one who's going to recommend getting stuck into a personal project or two.

I personally have no official programming qualifications whatsoever, apart from a couple of undergrad programming courses for non-computer-science students - my area of expertise is actually in mechanical engineering.

The reason I mention this is because I'm actually currently working as a software engineer for a large research organisation, where programming is my one and only responsibility. How? Because I picked up a phenomenal amount of experience simply programming as a hobby. I can't stress enough how much tinkering in my spare time has helped me land my job.

What I'm trying to get across is that what you'll learn doing actual programming is one of the most valuable experiences you can get - and it doesn't matter whether it's part of an official course, or simply messing around in your spare time.

That's also not to say that what you've learned as part of your course isn't important - it does form a valuable framework for you to build your experience upon. I certainly know that I'd be much better off with a formal computer science background - I've lost count of how many times I've been stuck on something simple, or lost track of what my boss is talking about, simply because all that was missing.

I think you'll do just fine in the "real" world. You will gain experience simply by working, and any decent employer knows this and will expect no more from you than your best effort and a commitment to learning from your experience. Many employers (mine included) specifically look after their graduate recruits, using mentors and training programs to enhance that experience. And if you feel that you could use more experience, then I heartily recommend doing some tinkering in your spare time.

I'll finish by pointing out that we never really stop learning. You might be just starting on your career, but you will continue to learn and gain experience through your job, your employer, your mentors and on your own. Don't be afraid that you haven't learnt it all yet - there's plenty of time yet to be picking up experience.

All the best with your future career! Hope to find you swamping SO with job-related questions soon!

Mac
+1  A: 

Just a short note, something I am missing in the other wise answers you already received. If you do follow the useful advice "do something", I would suggest you make yourself things easy. I like using the joke "walking on water and developing software from a specification are easy if both are frozen"...

So if you decide you are going to "do something",

  • decide what your program is going to do (requirements)
  • which way it is going to behave (functional)
  • how you are going to implement it (technical)

and write it down!

If you change the papers during the play, don't forget to check the cascading consequences.

Have fun and be prepared to be (very) patient.

mariotomo
A: 

Keith Nicholas wrote:

Best way to learn to program is to write programs.

Two suggestions :

* develop a game
* develop a web site

If you really have no idea where to start from, I would suggest you to take a concrete project (website) to develop. Try searching over the net to see if there is any interesting web you'd like to develop on your own (make a local copy of it and use their html so that you can focus on back-end code and by the time you'll learn html). Second suggestion would be to find someone who needs new website and build him one for free. It should be a good practice and it will give you opportunity to communicate with client.

The most important thing is that you DECIDE to take things to the end, be persistent and not to give up. It's an unknown area to you, but you can ask anything on forums (especially here) and be sure that you will get answer to 90% of your questions (you just need to ask "properly" - describe your problem in details).

If you ask me, two key factors are decision and persistence :)

Regards,
Ile

ile
A: 

I'm working at IBM for the summer and I have a 3.13 cumulative GPA, and I'm pretty sure I'm on the higher end of all the interns. I also am not a C++ wizard or anything, I just know the fundamental concepts. Don't feel afraid to set your bar high and apply to big companies. I have a lot of web dev projects I've undertaken in my free time as well as some cool projects from school that I think impressed my current manager who interviewed me. As long as you have a good personality and show potential as a coder, you should be fine.

Keep at it and don't be afraid to take on small self-projects and brag about them to potential employers - it impresses them!

vette982
A: 

Hhmmmm. It is really brave of you to put this. Well, one suggestion I would like ti make is that do your master's degree, it will help you learn and gain your confidence :)

Good Luck :)

A: 

Work for the government. It is the best place for job security. Most of the time youll be a maintance coder which is the easiest type of coding to do .You can get away with doing very little and in all the free time you have you can continue to teach yourself coding so eventually you can do real work in a non gov organization.

punkouter
+1  A: 

First, if you feel like you're not ready to be a professional programmer, that's about the right feeling. That's how I felt when I was about half-way through my CS degree, and had I not worked my way through uni, I'd have crossed the stage unqualified to code my way out of a paper bag.

But you will improve your skills fairly quickly and even a bit predictably as you get that first job and start learning from others how this "software engineering" thing is done. The key to success is to understand that you will learn from others, including others you might disagree with or not get along with so well. At the peak of my CS career (I've since moved on to other things), I lead a team of 12 developers for a major software vendor. All the new hires thought they were really smart. The ones that listened advanced rather well and the ones that kept thinking they were really smart didn't.

But enough of that. Let me share with you my observations after 31 years in the software business.

When I first started, I slung code. And that's pretty normal -- most of your assignments in uni were probably very small and that's what a lot of people do with small coding projects. They sit at their computer and they keep on typing until the problem is solved. There's nothing wrong with that and if you develop some good rapid prototyping skills, the ability to sling code will pay off well in the future.

After about five years I had a fairly large body of work -- some of it had been open sourced (we used to call it "public domain" -- sticking a notice in the source code that says "this software is in the public domain"), some of it was "No commercial use" or "You can do anything but sell it." There was no GPL. But what I learned after about five years is that my code stank because I couldn't make sense of anything I'd done more than a few years ago. And from this you'll learn that comments are your friend -- code I wrote in the late '80s had a nice code-to-commentary ratio. Code from the early '80s -- not so much. But this gives you an idea of the problem -- a four year uni degree isn't enough time to learn what you're doing wrong.

After ten years I started needing to reuse my own code in ways I never imagined. Some of the code worked out, some of it didn't, and over the next few years I got tired of reworking my code and learned how to be a software architect. I have code in the open source world that is now 23 years old and some of the original structure is still in there. That is what a good design and a solid architecture looks like -- old code that has stood the test of time, because computers today are nothing like computers 23 years ago. My phone is more of a computer than the PCs I had 20 years ago. So, you'll start to learn how to actually design software, and that's really not something you can learn in a 14 to 18 week CS class that meets 3 hours a week. Right? When I was an architect I'd take months to design the software that was going to be developed in the next release. So, start to look for patterns -- and that's one of the things about object oriented languages that makes them attractive (if used properly). They make you think more. Every time you write something, think about the future.

From years 15 to 25, I lead a team of developers. Some were new hires, some were experienced, and I had to deal with what I had because I wasn't a manager who could go hire just the people I wanted. Somewhere along the line that's what you're going to have to learn to deal with -- different people on your team are going to have different skills and abilities. I had guys with good networking skills, guys with good multi-threading skills, and guys who were just generic developers. The people who moved forward in their career were the ones who got along with others and were able to learn from them. When you get that first job, find a mentor. Don't go for the brightest or whatever, find someone who is senior enough to you that you can at least understand what you're being taught. But whatever you do, learn from others around you.

In the last few years I tired of being in the software business as a business. I still develop software (my current application is about 100KLOC of Java -- all written by myself), but I'm working mostly outside the software industry. It's a great career field, and 30 years was a nice ride.

Julie in Austin
A: 

It may not earn you any money mate, but contributing to Open Source projects and gaining screen credibility will also help kick start your experience points.

I think that if you choose to develop your own, small project, make it publically visible and attach things like the Stack Overflow 'Flair' thing, and created a LinkedIn profile and such community-based things like that.

If nothing else, it makes you look like you're interested in the technologies you've studied.

Danjah
A: 

I wanted to say that that was a great question to ask, and I am at roughly the same point in my degree.

I am a little anxious about entering the workforce; when I see elegant coding solutions (many upon many on Stack Overflow!) I feel a little humbled as to my skill. I think the best way to approach the situation is, if indeed you do wish to pursue a career in the field, keep at it until you get a position and make it known that you want to learn. If you are enthusiastic, and indeed want to learn, your skills will evolve over time.

Remember that a master craftsman starts off sweeping the workshop floor, as with anything in life all you need is patience, perseverance and modesty.

I hope all turns out well, perhaps work on a small project yourself at your own pace, or get involved with an open source project.

pharma_joe
A: 

All of the answers given to this question are very good, but as a graduating computer science student myself, I feel that the two things that help the most in learning to actually program are:

  • work on your own projects: webpages, games, small utilities, plugins. Even the smallest project will teach you something new.

  • participate in Open Source projects: you don't have to be a coding god to work on Open Source software! Lurk on IRC, start helping out with documentation, translations and you will slowly understand how the project works. Soon you'll be able to start making contributions and you will learn a lot doing it (and from all the amazing people around you!)

ergelo
A: 

I feel I'm in the same position. I finished my bachelor last year and I'm currently working as a project engineer. But it is taking its toll since I only live where I work during the week and I go home to my family on the weekends.

The way I feel now is that school did not give me what I wanted. During 3 years at the University we went quickly through Java, C#, ASP.NET and C++ but I feel I'm left with nothing because there is no depth. I know enough about programming to pick anything up and do "Hello World" but I don't know any language specific traits. What I would like to have done differently was to learn one language through the three years and really got to know it.

My tip is to move on to one of the more popular languages and build up experience and a showcase. I'm working with C#/.NET/WCF and hopefully I'll get a job a bit closer to home :D

Jason94
A: 

Do not get depressed. Try to learn day by day as much as possible. Solve some basic problems you can use, consult some well known programming judges (for example UVa and Spoj), etc.

kingh
A: 

I felt that way too. I like the suggestion of building a website.

T Step
A: 

The best thing you can really do is to just get out there and start programming. You mentioned the big name companies like IBM. If you target a specific company, let's take Google for example, you should go do a project on your own that you can show them. If you wanted to work for Google maybe you would write an Android application or something like that. Your GPA doesn't matter one bit. Just be confident and show a passion about the subject and I am sure you will do fine.

You should also look into a project manager type job. They don't do as much programming but do a lot of the design work. It's not managing people, it's managing the project. So they would maybe design the GUI and run user tests on it or something like that.

Mike
A: 
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.

I think this is true for pretty much any field: new algorithms that one hasn't worked through logically and then used to get something done frequently seem difficult. I would take a different approach or expectation than "mastering the material in the book." Mastering a book does not make you a good programmer, nor is it essential for being one. Instead of trying to soak up all of that theory before using it to make implementations, just start working on implementations.

Find an interesting project to start, or join in on an open source project. You'll probably find that as you work on it, you'll find that you need different tools for different purposes, and you can dig around for the methods that seem appropriate when you find the need. Also, don't worry if you later discover that some approach you used was the wrong one, these moments of clarity will help you in the future to know where to look for a good solution.

A key aspect of learning is understanding the value of the knowledge being applied. There are plenty of classes that I took that I hardly remember anything from, because the information didn't seem relevant beyond the scope of the class. As you dig into interesting problems, however, you may rediscover some of these concepts and methods and they will stick much better after you've needed to apply them. Like so many other endeavors, it's not about how much stuff you can cram into your brain, it's more about knowing where to start and where to look when you're confronted with a new problem.

James Snyder
A: 

Follow sites like, Stack Overflow, try to find out answers for the questions of your area, and finally, try to do some mini project, anything, might be a site, game or a tool or desktop application, anything silly will be good. Good luck!

Deena
+1  A: 

A fantastic question. To some level your question made me think how I was thinking when I was graduating from college.

Since you said you know C and Python, my suggestion will be to start participating in any open source project that uses these languages. Goto sourceforge.net or code.google.com and search for projects that use C or Python. Some projects will have mentors too. The beauty of open source projects is that you can start contributing in whichever part you feel comfortable and grow from there. As you become more comfortable with the code, you can take up more tasks.

Good luck with your ventures. I am sure you will find some nice projects that might need your help. The best part is you get your experience and you can show it as evidence in your job hunt.

anand.arumug
A: 

The simplest advice is usually the best one: Learn&Code.

Btw, I've learnt a lot when gluing libraries together. Always finding some new interesting facts which enrich my expert knowledge.

Zdenek F
A: 

I took the first job that would take me while allowing me to write code 40 hours/week. Use forums like this and MSDN, read books, try to find a mentor(s). My mentors were and still are online. If you are a good developer, you will likely exceed most of the people you work with, as most developers at small companies are not adept at OO, design patterns, and other critical skillsets. But the Internet is an excellent refuge where you will be able to locate your peers.

The best advice I can offer is to keep at it. If you love it you will succeed.

P.Brian.Mackey
A: 

College is nice and all for your resume, but without some real world experience and know-how you're pretty much setting yourself up to fail the moment you enrol in that course without already having some self-taught knowledge.

Might not be the best advice ever given, but I would really suggest that you know a programming language or two before you decide to get a CS degree. I've got a programming / development position and have never attended college in my life, I'm self-taught the Internet has all you could ever need to learn.

The downside is of course I earn less than that of someone with a degree (CS degree for example) but I might know more then them. It's how the world works sadly. So your best bet is to ride it out for a few months and learn a bit more about the languages you have already got a small grasp on.

Dwayne
+3  A: 
Jack
A: 

I'm stretching a bit because I have no programming training, but a general understanding of what's possible and a solid understanding of how you can streamline a business process is incredibly valuable and could lead to a business analyst consulting role. I went from a sales background to business analyst and I know first hand if you can sell the benefits a program can offer to a business you can make yourself incredibly valuable and never look at a line of code. If you don't find a programming opportunity in the fast paced, cutting-edge iphone market, pick the most conservative/backward industry you can find, identify a real life problem and pitch yourself as a technically trained solution provider and get on board as a consultant.

Like most other forms of strategic sales, you will fail way more often than you succeed so focus on improving your odds and don't get discouraged when you don't win every time. Find a software development company that can make your vision a reality then get out there and learn from your mistakes.

This is a high risk option so find a low level tech position to get you by but if you're not comfortable coding straight from college this is a realistic alternative. If regular exposure to failure isn't your thing, pick an in demand programming language, start at the lowest rung and learn on the job. Software design or UX might be another good alternative if you're comfortable with it.

If you feel burnt out and can't even find a basic entry level position, check the freelance sites and build a portfolio of successful freelance experience to boost your resume.

Best of luck! Stay positive!

Crutch
A: 

Programming is a tool. Most CS degrees just teach you how to program. It's like learning how to use a hammer without learning how to build anything. If you have little knowledge about a problem's domain you will have a hard time writing a program to solve it. The true value you will provide will be in solving problems, not being a programmer.

After I got a job out of college, I bought many books related to the problem space the company worked in. Now I'm considered an "expert" in an area mostly unrelated to my computer science degree.

dwayne963
A: 

I think that you should continue to put your effort. Every successful people have gone through this process, i mean what u are feeling rightnow but persistent efforts definitely brings the beauty of mind. Be focussed on a particular problem at a time, search the solution with planning to efficiently utilize your time.

Subodh
A: 

I agree with timothyawiseman. Get certified!

I recommend [link text][1]. Internet skills are absolutely necessary, and their Foundations exam tests you on the fundamentals. The Javascript and Perl exams will then get you their Professional cert.

Also, download Microsoft's free web developer and sql server express editions, and build web sites. Practice and practice, then get MS textbooks for, and take, their exams 70-536 and 70-562 to get the MCTS (MS Certified Technical Specialist) cert.

Good luck.

[1]: http://ciwcertified.com/certifications/program.asp CIW

Hal Noyes
A: 

They really, really don't teach you what you need to know in college. Now, I've been studying computer science and doing programming for about 7 years now - since I was 11 or 12. I just completed my first year of college, and I learned absolutely nothing in class (which wasn't really a surprise with my background), but what I was most disappointed with was what the other students learned. I thought, after my Programming II final, "That's all they learn?".

The final exam, after a year, only contained simple questions about linked lists and stacks, like, "if we push 'cat' and pop 'dog', what does the stack contain?", and had the student implement the push and pop methods.

I learned probably 50 times more (wouldn't that technically be infinitely more since 0 * x = 0? ;)) working on personal projects out of class, or by going far above and beyond on class projects because their basic requirements were too boring. Not a single one of the programs I wrote for class in the past year are of any use to anyone... except the Windows Mobile game I wrote with graphics and sound and music and a lot of interactivity, but the assignment was just 'write a game' - I could have done 'guess the number'.


I want to quote Keith Nicholas:

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.

I strongly agree with this. Learning algorithms starting out is not going to be useful to students. My classmates have spent a year in school and most of them don't know how to build a GUI application in Java. It's far more useful to beginning students to be able to create an interface with some widgets on it for a program that actually completes a small task, rather than implementing linked lists just because and then having a program that is totally useless and not really learning anything.

They also don't teach you really good documentation skills. Maybe they'll tell you a little, but you could take one or two entire courses on documentation. They certainly don't teach you about unit testing or most of the things Keith mentioned.

Another thing I don't like about universities today is that they're all Java. You are deprived of knowing what pointers are, deprived of knowing how to responsibly manage memory, the overhead that comes with copying, buffer overflows and how to prevent them... all that great stuff. I'm not trying to undermine the capabilities of managed languages, their features are in many ways a great advantage, and for projects where that technology is appropriate, then use it by all means.

But you're still deprived of knowing how it all works behind the scenes. A Java programmer would be lost in C++. Their programs will crash because they try to use uninitialized memory, they will wonder why MyType type = new MyType(); doesn't work and they won't understand why their programs are using 500 MB of memory when they haven't used the delete operator at all. Definitely a bad thing. Joel Spolsky has a great article on this topic: http://www.joelonsoftware.com/articles/ThePerilsofJavaSchools.html

In my opinion, the best way to prepare yourself for a career in computer science is to teach yourself. When you get out of class (do your homework), start investigating on your own. Make small programs, write code for fun, read stack overflow, look at the code of open source software. Immerse yourself in the field in every way and you can't go wrong. Of course, you've got to enjoy it, too.

Jake Petroules
A: 

I remember feeling something similar at the end of my 3rd year of university. I knew how to build toy programs in a bunch of languages that people didn't really use commercially (see. Ada, smalltalk etc). I was really worried about finding someone who was going to pay me to use my piddling skills.

It was only after getting my first job (12 years ago build a Java GUI for a big CORBA project) that I realized the knowing how to code is not really the key to a successful career in IT. Its more a mindset. A healthy attitude of not giving up in the face of problem is probably the best thing you can carry with you. That and an ability to research answers when you hit barriers. As long as your college has given you a guide through the basics, you will also find courses like data-structures, software-engineering process, and even compiler-design will be useful when you hit particular problems. Its a lot easier to come at some problems with an understanding of the basics rather than trying to pick them up from scratch.

Anyway, a recession is probably the hardest time for people to get a job as a grad. I know people with good GPAs who were out of work for a year or more before finding a job in 2001/2002. Don't be picky. Get on the ladder somewhere. As a grad you normally get a bit of leeway with what you do, so find ways to integrate the things that interest you into your job.

Good luck.

Trevor
A: 

I actually learned nothing in college that could be applied to my career. However, I had been doing this as a hobby since I could read and write. For me, at least, going to college was more about "going through the motions", because it was what is dictated by society.

The absolute best way to get over your malaise is going to be to get hands on. Remember, you are at the beginning of your career. Don't be afraid to start at a "junior-level" position. When you are at this point in your career, you will also find yourself outgrowing your jobs faster than the rate of promotion. Don't be afraid to keep actively looking once you land a position.

One thing that holds true in this industry is that it is generally the people with a passion for it that excel. I have seen mid-level developers that have been doing it for twenty years and just punching the clock. You will not learn everything you need to know to grow your skills while sitting at a desk in an office. There is a level of commitment that extends outside of normal office hours that can help to propel you forward.

Getting the first job can be daunting. My path was a little different than yours, but needless to say, I worked outside of the field for almost two years before breaking in. The experience was great for me, though, because I tried to figure out how I could apply what I was doing to what I wanted to do - i.e., management training, etc. I had the added benefit of working graveyard shifts, which allowed me to keep pushing the boundaries of what I thought I knew through "fake" projects, where I would come up with generic requirements and code against them - basically pretending to be a product owned and the IT organization. Just don't argue against the requirements too loudly, or people look at you strangely. ;-)

Best of luck! Hang in there - it will happen.

joseph.ferris
A: 

First, I think we all feel like that when graduating college or job hunting. Experience doesn't happen overnight.

But what can help you gain experience quickly is to be naturally curious and be a willing self-starter. You'll learn very quickly when you take the time to learn on your own and find personal hobbies that sharpen your skills. Always be willing to learn and you'll come a long way.

If you're currently job hunting, I'd recommend creating a personal website with a portfolio. Upload projects you've made based on what you've learned. Make it really cool looking. I'd also recommend Indeed.com in your search.

MattB
+1  A: 

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.

Your skills may be more valuable than you think. Look into the web framework Django. It is a framework for web development that is built around CPython. It is fairly easy to use and is extraordinarily powerful and is used by many big name companies for quick development.

SC Ghost
A: 

If I were you I wouldn't despair, it's always very hard to get your foot in the door with a lot of IT companies when you're looking for a development job. I was in a very similar situation as yourself when I graduated with my degree, nowhere would take me without experience. I found I just bombarded companies with CV's (Resume's in europe :-) ). Even going into the company and asking to speak to someone in IT with your CV and cover letter ready. Eventually something will turn up, and if you're only looking in the city that you're living in, perhaps you really need to look further a field.

Also one thing that will really make you stand out is have a good project, if you can get your name to one of the Apache or decent open-source projects, this will really stand to you. Since you've such experience in Objective-C I'd seriously give writing an i-phone app a go, if that's not for you then if your java is any good, give writing an Android app a go as well (very easy to get started).

What ever you choose, best of luck!

toby
A: 

If you want to develop logic and thinking for programming learn programming using languages such as C.

Read and understand the examples in the C book by Kernighan & Ritchie. Search google, you will find the ebook.

when you are comfortable to think solutions to problems (small programming problems), then you may try to learn different tools, frameworks, or whatever.

You can also try to prepare for SCJP exam and read all the topics. Try out all small programs that you encounter and experiment with them. If you read sun site on SCJP resources you will find many small programs, try to understand them, try to write similar on your own. Then when you are comfortable move to swing, JSP, Servlet, Struts, or Spring or whatever. You need a very good foundation first.

You may consult ACM programming contest related programming problems and try to solve them. if you cannot, checkout the solutions by others. That way you will build strong logic and thinking.

When you are comfortable then you can try to memorize library and practice on that.

http://justetc.net/knowledge/index.php?table=Articles&categoryID=32&category=Java

Try to build an application. Think about a small personal or business problem and try to write a complete application for that.

May be you could invest in a better CS program

Sayed
+1  A: 

Just because you graduate with a degree in computer science does not mean you must program for the rest of your career. Did you ever take any classes in systems analysis and design?

Dan
Have you ever seen a job advertisement for a systems analyst or designer?
Pete Wilson
+4  A: 

Feel confident about yourself. Don't give up.

I'm sure you're smart and capable to learn how to program.

danflu
+4  A: 

I'm 6 months into my first job after graduating from an IT degree, and what I've learnt in this time feels like it nearly tops what I learnt from 3 years at university.

What worked for me:

  • Find a good recruiting agency and preferably a recruiter who specialises in IT. They are very good at targeting the skills you have towards positions. They also have personal relationships, access to employers that can help give you a foot in the door and local knowledge about the industry in your area.
  • Be prepared to be thown in the deep end and work extremely hard - harder than you ever had to work at university. I'm still doing work at night after working 8-9 hrs because I want to get ahead and prove that I belong here.
  • As others have said, believe in yourself!
Span
Good answer Span, I am sure you have a great career in your future.
Justin
+1 for emphasis on GOOD recruiting agency. There are definitely bad ones out there, too.
Dubs
+1  A: 

When I've interviewed junior programmers (i.e., recent college graduates), I always ask them what projects they've worked on, especially class projects involving multi-person teams. After all, that's the kind of work they'll typically do in a real job.

If a person has never worked with other programmers on a project, that could require a steep learning curve.

The way to learn how to program is the way to learn just about anything: practice doing it. A lot.

Loadmaster
+4  A: 

Well, in essence you are right - you don't get to be a programmer (surely not a good one :-) ) when you graduate with Computer Science. As the title of the degree says, it's a Science and not a practical skill. Computer Science is actually a branch of the mathematics division and most of it is theoretical.

What this degree does give you are tools - efficiently create good algorithms, know how to analyze them, approach advanced fields (graphics, OS, networks...), basics of other areas (object oriented development, functional program, UNIX...) and so on and so forth.

I personally enjoyed my studies. Did it give me anything professionally? Well, not directly. There were times I implemented stuff I learned but my current pay grade and practical knowledge are thanks to my experience and not my degree (which haven't quite yet completed :))

Good Luck!

Guy
+4  A: 

PLEASE READ THIS CAREFULLY!!

I'm getting in on this discussion late. OP, what you have is what a lot of us do not: a degree in CS. That will get your foot in the door. Take a look through careerbuilder--what all the postings list is 'CS DEGREE.' The disadvantage is they're not serious about it, they'll take experience. But if you have the degree, they'll look at you.

That degree gives you two things: you show that you can do the work, that you can do what's required of you for 4-6 years and get the qualification. Second, you have a stronger theoretical background than the clowns you're competing with. I know--I've interviewed them. People are overselling themselves badly. They're sending in resumes saying they've got CS degrees, MCP certifications, and they can't answer basic questions about the language.

Do what the previous posters have recommended and don't despair! You know more than you think you do.

I'll add a couple things: atm Objective-C is backing the wrong horse. Occasionally I'll do some data-gathering to see what companies are hiring on. Last one I did I scanned about 70 postings:- DBM's (SQL-Oracle): ~10 postings- Objective-C: 1- Cold Fusion: 2 or 3- Access: 1- Silverlight/WPF: 5 or 6- ALL THE REST: asp.net
+12  A: 

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.

Stephen Kellett
-1: Could you tighten this up a bit and focus more on the question and less about yourself?
Jim G.
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
+1 for another cool life story at SO
Quonux
Good answer, Stephen. Just from a different POV than other answers here.
Pete Wilson
+4  A: 
Try and try and you will succeed.

I remember a saying, "no human being on earth is a master but every one is a learner".

For the instant a person says he/she has attained anything that is when a stagnation sets in. Remember a stagnant pool of water is stinky but a running water in a river is always fresh.

So keep on striving for mastery.

abson
Have you been watching too much Karate Kid?
Codesleuth
In C, there is no `try`, there is only `do`, or `do while`
maxwellb
+1  A: 

Experience is what you got by not having it when you need it.

Xaqron
+1  A: 

Remember that, a thousand mile starts from the first step. Everything starts from beginning your college degree is just only a bridge which brings you to the first step of life. So you are just started, put all actions in every plan you got, one day you will be at the place you wanna be. Good luck my friend.

Vicheanak
+1  A: 

I had the same feeling when I graduated in computer science but I kept reading books (hs, started from Visual Basic 6) and then Oracle and Java. The more you read the more you get to know to try. After four months of reading and practising, I solved those alogrithms with which I was so poor in graduation.

klusner
+4  A: 

Great question, Wendy, and SO is a great place to ask it. I wonder how many thousands of CS grads feel just as you do but are too embarrassed to admit it? Everybody on this group has felt the exact same way.

Many have said that the way to learn programming is to program. But how to find and solve a real-world problem? When others are counting on you? When you're facing deadlines and functional specs and meetings and code reviews? You know how hard it is, in your living room, to invent an interesting problem and then write a program to solve it. It's a boring waste.

I was astoundingly lucky to start out at DEC when it was DEC. Nobody was thrown merely into the pool but right over Niagara Falls. It was wonderful in those days: one had to learn and had to deliver. That kind of environment, if I hear you right, is just what you're looking for. I don't know where to find another 1967-type DEC, though. So what's the next-best thing?

The need for developers is heating up again. Projects are starting again. Managers are beginning to panic. There's an actual market again! How to exploit it?

I propose that you get in touch with any of the hundreds of software recruiters that are in the business of contract assignments. I wouldn't worry about a full-time job -- that ain't gonna' happen very soon, as you know. But all kinds of companies will take a chance on a contract programmer, where they don't have to worry about benefits or how you'll work out over the next decade. Instead, they're worried about tasks they have to complete in six months, say, and need somebody -- rather, some body -- to begin yesterday.

Google "contract software development recruiter" and you'll find tons of these guys. Call them up or email a resume. You'll get a call back and an interview. You might end up with a software testing assignment. Or you might get a junior development position. But so what? It's only a few months and you'll finally have some actual experience that you can sell. And you're not stuck in some huge bullpen at Wal-Mart or Prudential Insurance or something, writing COBOL for the next ten years.

I have used Oxford International for years and I like them. There are many other good ones.

-- Pete

Pete Wilson
+1  A: 

Hey!
Your question is very good, and it is the real life scenario for many just examined students. I also just graduated and during my entire time of the education, I felt the school gave me to little valuable knowledge, and to much pointless information.

The thing with college is that it does not have time to give you a very deep knowledge. In most of the courses, you only have time to focus on the foundations of one specific area inside the are of the area (yes, it's that fluffy). The approach is either that, or just try to give the students an overall knowledge about the area (this is of course different depending on the degree of difficulty for the course).

Myself had the luck to get a development job just after graduation. Many felt this was unfair, because I'm not an incredible programmer. I know the basics, and I know some area a bit deeper. What I generally think I'm good at and that people should be is HOW to get the knowledge. According to me, this is the most important knowledge school gave me. Like many says, you can't know everything. What matters is that you in the end do know what you are suppose to know. Therefor, knowing how to achieve the required knowledge is much more important, than in fact knowing it from the beginning.

One thing that shouldn't be underestimated is the value of social skills. You can be a really good programmer, but socially handicapped. You do not know how to promote yourself, or work together with people. Specifically the last thing, work together with people. In a project, you are (most of the time) forced to work with people. If you have big problems with this and actually got the job, you will probably have a hard time staying there.

Very interesting subject!

Fredrik_jakob
+1 for "HOW to get the knowledge" and "the value of social skills".
Jim G.
+6  A: 

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

Finnally
 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
THEn
+10  A: 

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

Pete Wilson
I'm so tired of this jaded viewpoint.
Andres Jaan Tack
Python is one of the best teaching languages in existence
Casebash
@Icplben, Pete or Jamaal from codinghorror.com?
Zaki
+21  A: 

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.

Il-Bhima
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
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.
Chris S
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
You're mixing up two things here. I found doing a degree incredibly useful — I *know* it made me a much better coder, but I can never work out exactly why (presumably a combination of a little knowledge and a better approach to problem solving). That said, there are plenty of graduates out there (from a fairly prestigious university) who can't even figure out how to implement (9,5) ECC with a 512-byte lookup table. The good coders are the ones who go beyond “I don't understand this, but I can do the exam questions”.
tc.
interesting problem, but why would you do normaly a ECC test ;) , except for hardware, of courseBut its an good example of self-taugth stuff that you don't/can't? learn at compSci
Quonux
+1  A: 

Shoot for the moon and you'll land among the stars. Don't hesitate at applying for big companies, you never know what they are looking for, and I do believe that when you just graduate you really don't know much about anything, you will gain most of your experience at the job. Just jump in and in time you will be a great programmer.

Harry
+5  A: 

Good question. First of all if you are still in school read Joel Spolsky's (Advice for Computer Science College Students. This is a must. http://www.joelonsoftware.com/articles/CollegeAdvice.html Then you can also read this book 'The Passionate Programmer - Creating a remarkable career in software development - Chad Fowler foreword by David Heinemeier Hansson'. Although the author didn't really do computer science he spent alot of time learning to program on his own and really knows what he is talking about.

Chiddy
+1 for linking to a interesting article
starcorn
Agreed - great read. I am a CS student myself and a few of his articles make a lot of sense.
Jack
+1  A: 

user30997:

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.

I don't know if I can agree completely with you on that subject. I do know that from my own personal experiences in my software engineering classes that that wasn't the case for us. In those classes, it seeemed that the expectation was that we would teach ourselves whatever we would need to know for our projects while our professors stuck to teaching UML diagrams which we usually ended up throwing away once we actually got to coding.

But, I'm guessing that your school was probably different from mine. I just wanted to point out that school projects aren't always so easy as you might think. It just depends on the professors and their style of teaching.

Liars_Paradox
A: 

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.

Liars_Paradox
+4  A: 

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!

StevenE
+1  A: 

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.

Nick
+1  A: 

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

Shawn
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.
Chris S
I'm simply stating there are other opportunities.
Shawn
+2  A: 

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.

Suresh S
+4  A: 

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!

hyprsleepy
This also assumes that you know the basic building blocks and theory. The theory is what allows you to adapt to any language because the ony thing that really changes are the built in libraries and the syntax.
hyprsleepy
+1  A: 

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.

damstr8
+3  A: 

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

isc_fausto