Hey guys, forgive me for resurrecting this thread but I feel I have something to contribute to this conversation and not sure that a new thread is really appropriate for it.
little_shadow, before I say anything else, I just want you to know that I REALLY admire the drive and passion you seem to have with respect to CS. I used to work in video game development, and let me tell you, it is quite demanding mentally and time-wise, so good on you!
I will preface all of this by saying I only worked in the industry for about 2 years as a programmer.
That said, I feel the most important piece of advice anyone can give you is to keep up that passion you have. That passion, that drive to learn and hunger for more information is what will set you apart from everyone else in the industry. As has been noted, there are SO many people in this field competing for jobs, and they almost all have impressive educations, but not everyone has the willpower to do what it takes to win. You're on the right track with respect to participating in open source projects and whatnot, and getting involved in more of those things will further show your passion to prospective employers.
You also mentioned about a portfolio, and I'm going to expand on that by saying having a strong portfolio is CRITICAL. It can and will make or break you. I can only speak to this from the video games industry perspective, but everyone asked me either what I have been doing lately, or for a website where I could showcase what I've done. Nothing can replace being able to prove your skills through a portfolio (in many cases, this will be all employers will have to go by), and equally as important, your portfolio will also showcase how passionate you are about what you do as well. Make sure your highest quality work is on there.
Another piece that may be important to you (it certainly was for me) is having a strong LinkedIn profile. More and more employers and recruiters are using LinkedIn as a resource to prospect for employees, and there are tons of jobs listed on there as well. It is also a very easy way to expand your professional network, and something like 95% of jobs (please don't quote me on this!), at least in this industry, are filled though personal contacts. There is an old saying that goes "it's not what you know, but who you know", but there really is a lot of truth to it. If you're unfamiliar with LinkedIn, feel free to shoot me a message and I can try to help as best as I can.
The last thing I'll touch on before continuing is the point that was made earlier about being able to read other peoples' code. This is crucial!!!! Nothing wastes time in a team environment like programmers not being able to understand what their coworkers have done. I encourage you to look at complex pieces of code that you can find and try to break down how they work. You can make yourself indispensable wherever you go if you can demonstrate an ability to work efficiently, and this is just one aspect of it.
I'd also like to touch on some of the questions you had in your previous post, since it's been a while since you asked. To the original posters that said questions were directed to: if I have made a misrepresentation of a statement you have made, please forgive me! I will do my best to answer the questions as best as I can.
Could you go into greater depth on "real use cases"?
When it comes to creating small programs that you can show off to people that you do on your own time, it often is best to look at a real world problem and try to solve it.
If you're a genius, you can take a stab at some of these:
http://en.wikipedia.org/wiki/List_of_unsolved_problems_in_computer_scienceOtherwise, for me, the best way to describe what a "real use case" would be is to create a snippet of code that you could reasonably expect to use in a bigger, more relevant coding project. Let's say you were making a video game, and needed an algorithm to efficiently sort items in an inventory. That sorting system would fall under a real use case, at least to me.
There are tons of small example problems available on the internet as well that you can take a stab at, but unfortunately I am failing at Google today.
From what I've experienced so far, learning the "right" way to do something isn't as important as having a method for finding tolerably good ways to do things. Workaround, in short, but ones which make it as easy, quick, and painless to do things.
It's amazing that you understand this now. A very wise man once told me (actually, he's just my former boss, but still an AMAZING programmer) that there is such a thing as "good enough". He told me that in previous jobs, there were programmers that spent hours or days figuring out the best way to do something, when a "good enough" solution that took 10% of the time to plan and implement would have virtually the same result for the end user. Remember that at the end of the day, it's end users that are using what you create, and they're not going to care how wonderful your pathfinding algorithm is, all they will care about is, does it work, and does it run at an acceptable speed.
I'd rather learn to use a C library for mucking about with HTML and CSS than use PHP. I have never heard a good thing about PHP, except for the dubious, "everyone uses it." If I see everyone else is doing something, that's reason enough not to do it.
I understand the point you're trying to make, but I can turn around and say virtually everyone uses C++ at AAA game studios. Everyone using something does not mean it's bad. In the case of PHP, it is, as far as I know, the easiest and fastest way to integrate a web front-end with a database. I would encourage you to analyze the merits of each technology you consider on its own and determine that way whether it's worth using or not. Remember that the best tool for the job is the most appropriate tool available to you, and if that means using a technology that everyone uses, so be it.
If they want a good grade, I do all the work and come up with a plausible story and I feed them their parts of the story for the teacher.
It's hard for me to talk about this without sounding arrogant or like a jerk, so if that's how I come off, I do apologize. That said, I'd like to ask you, as a leader, is doing all the work for people helping that person grow and develop? If they are just there for a good grade, that doesn't necessarily mean they aren't willing to work or learn, and doing the work for them means you will never find out. You may be surprised by how good some people are, but I think it's important to give them a chance to show that. If they are dragging the project down because of a lack of work ethic, I would inform the supervisor and let them fail - that will be a good life lesson for them.
Again, if I sounded like a jerk with that, I do apologize.
Italicized Portion: What should I do when I come up with an idea that I think can make the company more money? I don't think it's ever a good idea to tell my bosses about exciting new ways to lay off half their workforce (especially me), so my guess is that I should file that idea away for later and find a way to automate it. From there I can use it to do my work for me, freeing up time for my own business or I can start another business on the side and compete with my employer until I'm caught or they buy me out.
If you're THAT good, then I think you're probably good enough to start your own business and put everyone else out of business.
When companies compete like that for a better quality product, the end user wins. That said, I wouldn't try to screw over an employer unless you're prepared to pay the hefty lawyer fees to deal with the lawsuit if they find out what you've been doing. This is not me advocating such practices, just to be clear!!
Underlined Portion: How to do things with people?
I think the idea was that a lesson you may learn from other people may simply be, how to better deal with people.
Underlined: Is it better for everyone to work on everything, for everyone to specialize in their one thing, or somewhere in between? Bear in mind that I'm very familiar with SaGa Frontier and I have seen what happens when programmers don't communicate. I can go into greater detail if you want.
I was a team lead on a project a couple of times, once with like 3 other programmers, and my best advice here is to determine what the strengths are of your team members and assign them a position that will put them in the best position to succeed. I don't mean that in the sense of putting that person in the best position for them to succeed to inflate their ego, but to put them in the best position to reach end of project successfully. If everyone succeeds, the team wins. You win or lose as a team.
That's about all I have. Good luck with your career and I hope that you achieve great success in your life!