I'm a year away from university/college at this point in time, I'm currently 17 years old and practice programming as a hobby. I'd like to get a job one day in the market, I -love- programming. And I was wondering what would be my best course of action at the moment to get myself ready for a potential career in programming? I've talked to a couple comp sci majors and it doesn't seem like what they're doing isn't terribly hard (although, I'm sure it differs from school to school). I kind of feel like I'm in an odd limbo where it's gotten a bit stale, because I don't feel like I'm making 'progress'. As far as programming this is my current skill set:

Languages: Lua, I know this one very well, I'd put myself at least a little bit past 'moderate' with Lua, I know how to use it's features and what to do, and not to do. C, I know C in a way I'd call a bit below moderate, I can write C but I don't know the best practices, and I often find myself consulting documentation on C.

Projects: I've made a couple toy interpreters, I shipped a roleplaying modification for a Garrys Mod (while this doesn't sound like much, I and my friend have produced at -least- 20,000 lines, including comments and such), and I've made a couple small games.

Experience: I'm fairly familiar with GNU tools and Linux, I can write a basic makefile etc. I know how to use command line tools, and I use Linux as my day to day operating system, but also have years of experience with Windows. I know how to use Git and SVN (I'm a master at niether, but I can use them well enough to maintain a project.)

So if there's anything you guys could suggest? Should I be actively doing things now or just kind of waiting it out for university? I'm feeling lost.

Edit:
I put "is" instead of "isn't" terribly hard. What I meant to say is all the Comp Sci major I've talked to said that the material isn't terrible hard if you've got a bit of experience programming.

This question appears to be off-topic. The users who voted to close gave this specific reason:

"Questions seeking career or education advice are off topic on Programmers. They are only meaningful to the asker and do not generate lasting value for the broader programming community. Furthermore, in most cases, any answer is going to be a subjective opinion that may not take into account all the nuances of a (your) particular circumstance." – MichaelT, gnat, Bart van Ingen Schenau, Kilian Foth, Dan Pichelman

Elegant solutions mean designing and you need more experience to do that well. I would suggest you look into learning how to write excellent documentation (not for end-users, for peers) as this is very important for team work.
–
user1249Aug 26 '11 at 9:21

2

as long as I don't end up mindlessly putting out lines of code, I think I'd be fine. Good luck with that. At some point in your future career you'll be doing exactly that.
–
Joel EthertonAug 26 '11 at 15:02

16 Answers
16

learn to write, not write code* but to write text. The ability to write English well and to enjoy doing it will make you stand out. For example if you did a Major in CS with a minor in Writing or communications you could really stand out. Even more so if you can say write a good blog about programming or something else of interest.

Being able to speak well and give a talk can also be useful. Getting up in front of a user's group and giving a good talk can be very valuable.

Edit: Also take a business class, as a programmer you will be working in Business cultures. Understanding how what you do fits into the organization is really important.

I would like to add to the ability to write and communicate that being able to chart and draw flow and use-case diagrams as an invaluable skill. Learning UML is a good idea too if for no other reason than to be able to interpret UML diagrams when you encounter them.
–
maple_shaft♦Aug 26 '11 at 10:57

1

I actually do very much enjoy writing, and speaking in front of people, whether I'm good at it? I don't know haha. Thanks for the advice :)
–
Matthew BlanchardAug 26 '11 at 11:59

4

Being able to write and speak clearly, and to distinguish between small technical details and big technical issues is very important. This skill will get you A LOT in life, not just at work. Being able to communicate with people who don't know what you know is going to help you with users and customers, too. (Not to mention socially... ;) )
–
Jennifer SAug 26 '11 at 12:27

As long as you can get into a degree program and live in an area where there are opportunities, you should be able to get a job, but you sound like you want more.

Here are some ways to assert yourself into this profession:

Start a software project or find one to join. Always be coding.

Contribute to Stackoverflow and build a CV.

Get a part-time job in another industry: Bag groceries, park cars,
mow lawns, pay attention to customers, managers, coworkers and the
usage/potential for technology. Owners of small businesses sometimes are willing share their insights.

Find or start a developer group in your area. You have to be able to
identify and work with other developers. You'll be more successful
if you can build a team.

As others have mentioned, work on written communication: blog, email, join discussions, create documentation.

Coding is absolutely required, but there is no reason not to build other skills and relationships to advance yourself in this profession.

+1 for StackOverflow. When I'm hiring a senior, I'll appreciate someone who has lots of good answers. But for a junior, it may be even more important to have asked a number of good questions. The most important quality for a junior is how fast they'll learn.
–
MSaltersAug 26 '11 at 11:23

I presume that you are asking here because you want to be programming as a career.

Although I am now more sysadmin than programmer, I was a programmer many moons ago and started following Joel Spolsky more than a decade ago. He has a lot to say on the matter of what makes a good programmer and how to hire good programmers.

First, Write Code. Lots of code. Don't play around, or flit from language to language. Pick a language/platform, and work with it enough that you can confidently answer hard questions about it on StackOverflow. Which language matters little, although today I would pick the .NET stack. Then, and only then, would I start learning other languages.

Second, Complete Things. That alone will make you stand out. Someone who can start but not finish is not just useless, but is dangerous. Get into the habit of FINISHING. I don't mean be a perfectionist, in fact I mean just the opposite. Learn to get things done enough to be useful quickly, and when you make an improvement, get it done and release quickly. Get involved in an open source project or two and get changes incorporated into the released version. Make a web application, all the way, until it is a finished product.

I think the single most important thing, at least for me anyway, was being able to secure an internship. If you have the opportunity, to take a year away from your degree, ideally between the 2nd and 3rd year, and work as an intern then I would grab it with both hands.

You will immediately have much better prospects than a vast majority of other fresh grads.

Obviously, you will need to learn skills and be able to demonstrate those in order to acquire an internship. So as others will no doubt tell you, code a lot, look at opensource, maybe look at publishing small apps on phone market places, etc etc.

You are too inexperienced yet to be allowed to make design decisions, which is where "Elegant solutions" come into play.

In my opinion the single most important virtue of a programmer, is the ability not to explain what he thinks to the computer in form of code, but to explain it to others humans. Especially those who will inherit your code, but preferably others too! This is called "Documentation" and being able to do this well (which is a rarer skill than you might think), will make you much more interesting to future employers.

Zachary has already talked of communication skills which are very important, so I will give another advice : build a portfolio of your work during your studies, so that you can show to your potential employers that you got things done. And if you did personal projects alongside school assignements, don't forget to include them because it shows that you like programming enough to do some in your free time (just hoping it won't give them the ideas that you somewhat are okay to bring work home...).

Your story is similar to mine, except back in my high school days I was toying with VB 3.0 on Windows 95 and writing simple web pages for text based browsers.

The single most important advice I can give you that hasn't been given in previous answers to this point is do independent research or projects.

When you do make it to university you will encounter a lot of students in your class that rarely if ever do any kind of programming or independent learning outside of the curriculum. When opportunities pass them up because they never encountered 'X' in their course work and you are familiar with it then you look MUCH better to potential employers.

Another piece of advice to give you is that you will learn more in your first two weeks at a good internship or job than you will in your first two years of university, or at least this was true for me anyways (possibly because I went to a bad school?). Do everything in your power to land that awesome internship, even if it means taking an unpaid one where you will be doing big stuff rather than doing data entry for a wage.

When it comes to landing that first entry level job you want to get it right as well. Pay close attention to what your responsibilities will be, make sure that you will have a mentor or be a member of a team so that you can learn from others and make sure that it is a type of development job that you will be interested in (EDIT: Also forget about salary on your first job, it should be your last consideration. Focus on getting good skills and in a couple years you can leave for more money if you need to). Your first job will teach you invaluable skills and define you for the rest of your career.

Zachary is absolutely right; developing good communication skills is hugely important and greatly underrated. I certainly have found that being able to explain and persuade via writing has been an advantage.

Try to find an internship; when I was 17 I was a summer intern at WATCOM (which you have never heard of probably, but they had some of the best compiler technology in the world back in the day). Having the opportunity to learn from real world-class compiler and database professionals when I was a teenager was tremendously valuable.

To that good advice I would add:

If you want to study computer science as opposed to merely learning programming, try learning a language that is more computer-sciency. Haskell, for example. Or, since you already know LUA pretty well, try learning Scheme; they have a lot of the same ideas but very different syntax. Unconventional books like "The Little Schemer" might help here as well. You'll certainly have a head start over your peers if you know a functional language before you start a CS degree program.

Don't worry too much right now about the job you might get years from now. Focus on doing your best in school, and by all means go to college/university if there's any way you possibly can. When you're there, too, focus more on your studies than on what future employers might think. If you do that, future employers will think: "Here's a smart guy who learned a lot in school and got good grades! Quick, hire him!"

You're at a time in when you have the enormous luxury of being able to focus on yourself. You can figure out what you like, decide (eventually) what you want to do, work on projects mostly of your own choosing (whether that's writing code or writing poems). Don't just "wait it out," do the things that you want to do! Have fun! Build stuff! Enjoy your freedom!

You've got a great start, and you've already written about projects that you've worked on, which is a heck of a lot more than most "programmers" your age.

I've read a number of suggestions telling you to go to college and get your degree. I agree that that should be a top priority, but I wont focus on that in this answer.

I highly recommend getting an internship as soon as possible. You've already got more programming experience than most sophomore CS students. Find a bunch of job listings, and apply apply apply. The job market isn't as nice as it used to be, but good programmers are hard to find, so you shouldn't have much of an issue getting an internship or co-op somewhere.

As important as my college classes were for my education, my internships showed me what I wanted to learn when I went back in the fall. The sooner you start a career-focused internship, the sooner you'll know whether you're learning the right things.

Additionally, if your employers like you enough after a couple internships, they're likely to hire you as soon as you graduate. If you take advantage of your time in school to learn about the things that directly beneficial to your employer, you'll be significantly more valuable to the company.

One important thing to realize is that when you fresh out of school apply for your first programming job, few employers will expect you to be a great programmer. They know it takes years and years to become one. As you have no proven work experience, other things than the actual programming skills may be just as important: personality, commitment, ability to learn things, ability to work independently, communication skills as already mentioned, etc etc.

The mistake many fresh graduates make is to only focus on tons of technical, in-depth stuff to have what they think are the best possible merits, and forget all those other things mentioned. No matter how hard and how much you study, you will still likely not beat the technical merits of someone with years of work experience.

All these folks gave you some really good advice, kudos to them and to you for asking. What you will be doing 10 or 15 years hence won't be what you started out to do. A flexible out look is a good thing. You mentioned that you'd like to tackle problems that keep you up at night. Select a field of study that has such problems. It could be Comp Sci or EE but it could also be genetics, music or public policy. I learned programming in order to solve problems in physics and ended up in finance and then went onto genetics ( Similar skill set different domains.)
I think that you're on the right track from what I read.
My big thing was to hack hardware and build games or a small compilers because that gives insight into limitations of code and hardware. Add to that a good math foundation esp stats is now important. Select one great teacher, keep an eye out for her/him get into that program and do the work and then pass your skills on to others. And Enjoy your Life!

I was in a similar boat to yourself two years back; plenty of experience programming, plenty of knowledge of architectures and design practices et etc, waiting to go to university.

The one thing every employers likes is experience. Especially as a junior, having some experience in the field makes you infinitely more employable than the next junior with the same skill set and no experience.

You might find yourself bored to tears by the content of the first year of a CS degree, but you should stick with it then try and get some work experience over the summer

I see in other answers that getting an internship/work experience has already been suggested, but I feel I've got some useful advice from recent experience, so here goes:

Put an eloquent, well written CV together. In it, talk about your extra-curricular interests in programming and the types of things you've worked on. Be prepared to talk about those, and the processes involved.

Email your CV to local development houses. Tell them up front about your position: tell them you're at university doing your first year in whatever major you choose. Tell them you're looking for some work experience over the summer.

Ask if you can come talk to them about it. This one I found to be key. It shows a potential employer that you're motivated and really want to pursue it. Talking to somebody face-to-face also brings you the added element of personability that you don't get in emails, and to some extent phone calls. Example: I went for an interview where it turned out they couldn't take me on for as long as I'd like. Instead of saying sorry and sending me on my way, the interviewer gave me the contact details of a friend of his, saying I would be better suited there and to say I was referred by him. Long story short, I now work there.

Payment isn't too important. Whilst it's nice to get paid for work experience, the experience you'd be getting is far more valuable than the wage. If the employer is willing to pay you, all the better. If not, don't worry about it. Of course, I'm not saying you should go take a job that's going to cost you $50 a week in train fares - unless you have some other source of income to pay for that!

Be confident. That one should be self explanatory, really :)

Oh, and find something else to do outside of programming, and away from computers. Working with computers all day, every day is a quick way to burn out. Play sports. Go to the pub. Read. Take up gardening. Anything.

By all means, get a degree in Computer Science or similar. But it sounds like you've got the itch.

Buy used copies of classic software development books online. There is a lot of material you likely won't cover in your undergraduate career. You might have an interest in something like Artificial Intelligence, only to find out that the professor of that at your university isn't very good.

So I say teach yourself. Read books like Code Complete, Design Patterns, Test-Driven Development and anything else that interests you. And after reading some of this information and digesting it, make something. Anything. Interested in game development? Teach yourself some OpenGL or Direct3D and make a game. Android or iOS development? Do it.

You have more time available to you between now and graduating from university, so take advantage of it. But most importantly, enjoy life. Develop a few hobbies outside of software/computers and pursue them.