1050

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.

Robert Harvey
  • 199,517

130 Answers130

533

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 :)
  • 70
    +1 Agreed. And if you don't WANT to do this stuff on your own time, this might not be the best career path for you. If you put stuff together now, you can build a portfolio that can supplement your GPA. – Christopher May 13 '10 at 00:01
  • 68
    @Chris, -1. That's like saying that a lawyer who doesn't do pro bono work for the indigent on his own time is in the wrong career. Many programmers I know would be better off spending less time programming and more time doing almost anything else. –  May 13 '10 at 00:13
  • 21
    actually a lot of lawyers when cutting their teeth, get paid badly and put in a lot of extra hours just to get ahead. –  May 13 '10 at 00:27
  • 22
    You cannot really compare a lawyer job with a programmers job. With programming you can acquire skill on your own; you don't need any employer or clients to improve that part. –  May 13 '10 at 03:02
  • 31
    Really, you need to stop thinking programming is special. Lawyers can work/learn on their own just like we can. They may start off on poor-paying jobs and work long hours, but so do many programmers... the "if you don't program as a hobby you shouldn't be a programmer" line is really very subjective. –  May 13 '10 at 09:07
  • 3
    @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 May 13 '10 at 13:32
  • 3
    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. –  May 13 '10 at 20:17
  • 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. –  May 13 '10 at 22:52
  • 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. –  May 14 '10 at 02:19
  • 11
    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! –  May 14 '10 at 07:52
  • 1
    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. –  May 14 '10 at 08:11
  • 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 May 14 '10 at 13:23
  • In addition to a game or web site, develop a utility library, using good API and O-O design techniques and good documentation. – David R Tribble May 14 '10 at 14:15
  • 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. –  May 16 '10 at 14:21
  • +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. –  May 16 '10 at 21:05
  • 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 –  May 17 '10 at 09:20
  • +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. –  May 18 '10 at 11:43
  • 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 Jun 22 '10 at 17:29
  • 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 Jul 13 '10 at 18:03
  • 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. –  Jul 15 '10 at 18:21
  • Interesting topic: http://gamedev.stackexchange.com/q/5538/2555 – Martijn Courteaux Dec 20 '10 at 11:17
  • This really isn't said enough. If you want to get better or learn to program you must program. That might seem odd, but think of all the things in life that require practice. In general, a CS degree focuses a lot on the math behind computing and a lesser degree the engineering. This only gives you an excellent foundation for applying the science, which is programming. – Dan Feb 04 '11 at 21:43
388

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,368
  • 1
  • 11
  • 15
  • 126
    +1 for glue. Nobody would hire a group of professionals to build a new home and expect them to invent brand new techniques in home building in the process. In fact, anyone interested in managing risk and budget would probably prefer they not do that. – Dan Bryant May 13 '10 at 00:31
  • Depends on your goals. People who work on compilers are in the business of inventing tools for example. –  May 13 '10 at 01:36
  • 1
    @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 May 13 '10 at 02:10
  • 14
    I agree there are some edge cases out there but I would say that 75-80% of the programming jobs out there are the kind where you are just gluing libraries together. –  May 13 '10 at 13:18
  • 15
    And there is nothing wrong with just glueing together libraries. That is what makes you productive! –  May 13 '10 at 16:24
  • 1
    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. –  May 13 '10 at 19:18
  • 10
    Definitely like 90% of my work is either hooking up other people's code (libraries or legacy code) or maintaining older code. But I spend my extra time learning bits and pieces as I go, so that now I do know how a lot of those libraries work, and have a much deeper understanding of what goes on under the hood in general. Be a lifetime learner, and you'll pick it all up eventually. – CodexArcanum May 13 '10 at 20:07
  • 1
    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. –  May 14 '10 at 04:46
  • 53
    When I'm not gluing together libraries, I'm usually making libraries that I will later glue together. –  May 14 '10 at 13:41
  • This is actually the benefit of software reuse we keep hearing so much about. – David R Tribble May 14 '10 at 14:16
  • 1
    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. –  May 15 '10 at 03:07
  • 1
    @Joe maybe they just want to know how it works? – TM. May 18 '10 at 13:28
  • 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. –  May 29 '10 at 00:19
  • gluing libraries up is not a bad thing, however you should have a passion that always want to find out how the fundamental works. –  Jun 29 '10 at 03:28
  • Reusage is most important principle in programming. The ability to find code that does something is even more important that ability to write it yourself. –  Jan 26 '11 at 08:51
  • After you've (re-, re-, re- )implemented (and re-, re-, re-debugged!) a linked list or a dynamically sized array or a hash table dictionary in C / C++ for the umpteenth time, you will cream your jeans when you discover the STL and Boost. I've never (re-) implemented (and re-debugged) a basic container since coming up to speed on the STL. Using libraries as your "primitives", as opposed to just raw code, brings your game up to a whole new higher level, just like using a HLL does over using assembly language. –  Jan 27 '11 at 05:42
  • “If I have seen a little further it is by standing on the shoulders of Giants” (Isaac Newton). There's nothing wrong with leveraging the work done by hundreds of others before, especially when it makes the whole thing go forward. – Lloeki Feb 04 '11 at 13:55
  • +1 for the comment. But that said, there are a lot of alpha-programmers/leads/managers out there who insist on home brew solutions. So who knows, maybe you have to write everything from scratch, which might not be the best thing either because of timelines and parallel work. – iyerrag Feb 04 '11 at 19:54
237

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

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

  2. Start small.

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

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

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

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

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

  8. Never stop learning new technologies.

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

Joey Adams
  • 5,585
  • 13
    Add Clean Code to your to-read lists, it's pretty good. –  May 13 '10 at 23:56
  • 7
    "Knowing one language is good" -> wrong. Knowing one language is not enough. Knowing multiple languages is good, learning even more languages is even better. – Denilson Sá Maia May 14 '10 at 19:20
  • 10
    "Start Small" refers not only to selecting approachable projects, but starting to implement workable portions within a project. A project of mine started with a little experiment in parallax, and me thinking "that looks like a pretty cool star field for a background of a game". Add a ship... add an alien... add a few missiles, keyboard control and collision detection (each simple problems, by themselves) one at a time and soon, I had a commercial game I sold for (what I thought at the time) a good bit of cash. On the other hand "write a game" is a vague, unapproachable task. One bit at a time. – mmc May 14 '10 at 23:06
  • 2
    @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. –  May 15 '10 at 00:51
  • 7
    @Denilson, could you have learnt multiple languages without learning one language first? – Péter Török May 15 '10 at 19:42
  • I would also advice B. Meyer's "Object-oriented software construction" and related books. – Lavir the Whiolet Oct 28 '10 at 06:20
  • I disagree with the comment on knowing one or more languages. Although it cannot hurt to know more than one language, it is not what makes a good programmer. Know logic and how to analyze goes beyond knowing a programming language, once you master these you can apply it to any programming language. –  Feb 04 '11 at 14:21
  • @mrjohn, each language you learn opens up a new way of thinking. If you're a hammer then everything looks like a nail; if you're an OOP programmer than you'll solve all problems using OOP, even if a more elegant solution exists in another paradigm. – Gareth Davidson Feb 04 '11 at 18:56
  • I would also suggest 'The Mythical Man Month' by Fred Brooks. It's more about project management than actual programming, but it will give you an idea of the various constraints facing any project you get involved in. – BrianV Feb 04 '11 at 19:21
  • http://stackoverflow.com/questions/1711/what-is-the-single-most-influential-book-every-programmer-should-read this may be a great list – onemach Jan 18 '12 at 13:20
141

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. –  May 13 '10 at 00:28
  • 5
    +1. I concur completely. Start a small app, and then add functionality as you see you want it. As the building goes on, and you start to realize what more can be done, you can add it in. –  May 13 '10 at 00:31
  • 11
    "The problem domain was well-understood (your professor didn't give you any tasks that didn't fit neatly into your semester.)"

    This is one of the biggest problems with computer science education. There are a few CS or software engineering programs that address this problem, but most don't make you think outside the box. You really need to take on your own projects. If you don't know how Stackoverflow was built, try making a clone yourself. You'll learn far more than any class can teach you.

    – Matt Olenik May 13 '10 at 02:18
  • 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 May 14 '10 at 17:24
  • @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 May 16 '10 at 00:58
  • Personal projects are definitely the way to go. You learn the most when you are responsible for every aspect of the project, including the specification and 'marketing' (telling others about the project). If I could give one piece of advice to new undergraduate cs students, it would be to start a long-term software project, and work on it for a minimum of three hours per week. –  Feb 04 '11 at 14:57
  • Try writing a little one-trick-pony app or script to solve a simple problem and let people download it. I learned a lot about programming from the first application I released, and had to do bug fixes on. – Michael Shopsin Sep 16 '11 at 19:06
106
  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
  • 181
  • 81
    +1 for #2 - don't compare yourself and the knowledge of a crowd. – g.f May 13 '10 at 00:11
  • 8
    StakOverflow itself is a virtuoso product. Not to mention, there are people contributing with many decades of experience in a huge variety of products. –  May 13 '10 at 00:17
  • 6
    I wouldn't consider it a bad thing to measure yourself against StackOverflow, there are a lot of smart people here. Some are smarter than you will ever be. However those are the people that make you want to keep learning. –  May 13 '10 at 00:20
  • 15
    Hey, I know why I'm addicted to SO! It's terrific for a dozen reasons. But it's humbling to be continually exposed to all the things you don't know. One has to be a bit careful not to feel daunted, that's all. –  May 13 '10 at 01:23
  • @Georg -- Nice game-of-go gravitar. KGS Smandoli –  May 14 '10 at 15:10
  • yeah good call, SO gives the impression that all coders are geniuses - definately not the case. – Anonymous Type Aug 25 '10 at 04:06
72

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

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

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

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

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

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

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

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

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

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

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

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

  • 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 May 13 '10 at 02:03
  • 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 =) –  May 13 '10 at 17:04
  • 2
    +1 to build something: it sets you apart from the crowd, especially if it is something that is useful. –  May 14 '10 at 09:23
  • 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 :( ) –  May 14 '10 at 17:15
  • @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 May 15 '10 at 00:07
  • 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? –  May 16 '10 at 23:09
  • 5
    @Alex, never go through HR. If you're lucky, someone you know knows someone where you want to work. – Norman Ramsey May 17 '10 at 04:14
  • 1
    You know, now that you mention it that is the way I've typically found jobs. I guess maybe in the future I should focus more on jobs within (or on the fringes of) my network and spare myself the indignity of the keyword scanners. –  May 17 '10 at 12:53
59

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:

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

  • 4
    I've heard a lot about the site but never had time to attempt the problems, but nowadays it seems like the only thing I have is free time so I might as well keep busy. –  May 13 '10 at 00:13
  • 44
    Project Euler is of very little use to a novice programmer wanting to build programming knowledge. It's oriented towards figuring out how to solve math problems by coding algorithms. You can do a million of those without becoming a good programmer (you'll probably become a great mathematician though). Writing great algorithms isn't a high priority for most programming work. –  May 13 '10 at 16:03
  • 1
    I would disagree Charles - Euler will provide motivation to understand certain concepts and execute upon them. – Broam May 13 '10 at 20:30
  • 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. –  May 13 '10 at 20:33
  • @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. –  May 13 '10 at 21:30
  • 6
    http://www.pythonchallenge.com/ is key! While Euler are math problems to be solved by programming, pythonchallenge are pure programming problems – Xster May 14 '10 at 17:26
  • @Xster: nice one. –  May 14 '10 at 23:32
  • +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 Aug 25 '10 at 04:08
  • I ahve been spending some time on Proj Euler myself. The key is not to solve the problems by brute force, rather to keep trying to cut down on processing times. try things you haven't before. Try running multiple threads etc. Knowledge of multi-threaded applications and coding can be very useful. – Ayush Nov 19 '10 at 17:04
59

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

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
  • 331
  • 6
    Not just a female thing; People who are either already competent, or capable of seeing that they need to grow (Yay you!) tend to question their own competence more than those who do not begin to suspect their own incompetence. There is a name for this phenomenon. The Dunning–Kruger effect. Your experience at school has been a phenomenal success if you leave the school able to continue your lifelong path of learning, in whatever carreer you end up in. I wish you the very best of luck!!! – Warren P May 21 '10 at 16:08
  • 1
    Warren: Absolutely true; a lot of my less outspoken male peers had the same problem. In many cultures around the world, including in North America, little girls are not encouraged to compete aggressively and to show off their skills as much as little boys are, so I've seen that trait more often in women. But it's definitely not just a feminine thing. –  May 21 '10 at 18:20
  • 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...) –  Jun 23 '10 at 19:48
39

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
  • 131
34

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
  • 101
  • 1
  • 4
  • "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.

    –  May 14 '10 at 16:46
  • 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. –  May 14 '10 at 21:58
31

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.

27

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

    But its an good example of self-taugth stuff that you don't/can't? learn at compSci

    –  Jul 15 '10 at 17:47
24

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
  • 4,183
  • 19
  • 31
  • 9
    Humility will serve you well, except when it doesn't -- to get your foot in the door (including on a personal project) you need a certain amount of chutzpa, you may even need to be irrationally confident. –  May 13 '10 at 20:16
  • @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 May 13 '10 at 21:51
  • @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. –  Jul 30 '10 at 16:30
23

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.

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

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
  • 131
22

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

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

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

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

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!

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

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.

  • -1: Could you tighten this up a bit and focus more on the question and less about yourself? – Jim G. Jun 05 '10 at 15:32
  • 2
    It not about 'me', its about how I got from there to here without knowing initially where 'here' is. I'm just using my own experience as an example because I know my experience better than someone else's experience. If you read it as about me, you read it from the wrong perspective. Often if you "tighten" things up as you put it, your provide no background for the viewpoint being expressed and leave the reader confused. I could have written "I had no idea what I wanted to do when I graduated, but now I do blah blah". That wouldn't inspire anyone to continue - no "real reason to believe" (TM). –  Jun 07 '10 at 19:20
  • Good answer, Stephen. Just from a different POV than other answers here. –  Jul 23 '10 at 13:42
18

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

  • I 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. –  May 16 '10 at 16:51
17

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.

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

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

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

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
  • 201
14

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
  • 1,766
  • 11
  • 15
13

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.

  • 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. –  May 13 '10 at 00:24
  • 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 –  May 13 '10 at 00:55
13

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

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

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

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

EDIT: #! diff A B

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

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
  • 131
  • I thought the first version of google was made in a short time? Like over a summer or something like that – Earlz May 13 '10 at 05:22
  • 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 May 14 '10 at 19:24
  • @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. –  May 17 '10 at 01:06
11

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
  • 22,848
9

Learn How to Program in 10 Years!

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

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

Frank Shearar
  • 16,683
  • Exactly, it takes ~10 years (10,000hrs) of good practice and experience, to become an expert at anything – CaffGeek Oct 26 '11 at 19:21
9

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!

9

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

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

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

it is a long and painful process.

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

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

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

My GPA is OK (3.0) but it's not high enough to apply to the large companies like IBM or return for graduate studies.

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

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

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

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

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

Ramy
  • 162
9

Practice makes Perfect.

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

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

Excessive thinking is counterproductive.

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