So you think this whole programming thing is pretty cool, and you'd like to be a part of it, huh? One thing I often like to tell people right out of the gate is this: if you love programming, then this is the absolute best job you can have; it would be hard for me to imagine anything I would really rather do than create. On the other hand, if you just like programming, or are indifferent, this is the absolute worst job you could possibly find because you're entering into a competitive arena where obsession is almost a prerequisite. Software development is almost like a race, where your life is on the line, you're running as fast as you can, and you have no idea what the terrain in front of you looks like; but with almost total abandon you plunge ahead just as fast whether you face an open plain or cliff. Oh, and if you stumble, it's all over, and it's all your fault. Sound a little scary? It should, but don't let it discourage you; I just don't want to paint some wonderful storybook picture where you type happily away in fields of green with white puffy clouds in a crystal blue sky... The reality is it's probably raining, and your machine keeps crashing because of it; but this same sense of uncertainty, challenge, and pressure is what makes it so exhilarating.
Still reading? Wow, I guess you are serious about this! Ok, now that I've given you a glimpse of what's ahead, let's talk some tech, then talk about the fun.
What's it take to be a programmer?
I don't think there are any specific traits that exclude you from being a programmer, I honestly think just about anyone with a little (ok, maybe a lot of) desire can do it, it's just a matter of how much time you want to spend. That being said, I think there are several common misconceptions about skills that are a big plus. First off, you don't need to be some sort of math whiz to be a programmer; it's certainly important to understand the basics, and to feel comfortable with algebra, but that's about it. Of course, there are exceptions to this; for example, if you are interested in graphics or game programming, having stronger math skills will definitely go a long way. Another common misconception is that you need to be some sort of Spock logic monster; I've also found this generally to not be true as well, although once again, it certainly doesn't hurt to have a sense of 'order'. So, what traits are desirable? Being motivated by challenge is definitely a BIG plus, since you're basically entering into a game where you are challenged on every corner. It's also very important to be relentless in pursuing your goal, but at the same time being able to remain flexible enough to not be blinded by perceived limits. Finally, I think a helping of obsessive-compulsive disorder tops things off well, giving you that extra motivation to take things well beyond where any sane person would! :)
What about school (college)?
College is a great place to learn about fields, but technology is not one of them. Don't get me wrong, I'm not saying that I don't think school is important; on the contrary, I DO think school is important, but not to learn programming. What you should really focus on in school is learning to work together with others on projects, in particular learn how other people approach problems and how they differ from your approach. College also forces you to do things you might not normally consider doing; for example, I remember when I took 'Compiler Design', I thought to myself "Boy, this is about worthless! I'm never going to need to do this!", and guess what, most of the time I was right (although I have actually had to do this in the real world)! BUT, what I did learn is how to solve a completely different set of problems, and this knowledge translates to MANY different applications.
One other advantage that you get from college is networking; I'm not talking about that ethernet cable in your dorm room, I'm talking about meeting other people who share your interests, and will one day be working in the same industry as you. The programming industry in many regards is much like the film industry; when someone becomes involved in a cool project, they invite their friends to participate. If you don't know them, you're not going to get invited (hired), and college in many cases is where you meet them. Another aspect than cannot be overlooked is the whole education side of things; I mean, c'mon, they teach quite a bit more than tech, things like history, psychology, etc... And while these may not SEEM to directly relate to programming, you would be surprised at some of the sources of inspiration I've had.
First off, I would recommend getting your feet wet before making any life decisions here; as I said before, this line of work can be fun, but it can also be really miserable, so don't just jump in. The first thing to do is go to your local bookstore, and buy a book on programming... But there are soo many books, and what's with all these different languages? I would recommend sticking with one of the following languages: C or C++, Visual Basic, Pascal (Delphi), or Java. Stay away from any others, since they are probably not going to give you the same level of flexibility that these will, plus these languages will have the largest amount of books to choose from. But whatever you do, don't just pick a language now! We're just testing the waters out, right? We're not writing the next Microsoft Office, so this isn't important yet; and regardless of what anyone says, those languages are all very similar, and very powerful, with commercial applications being written with any of them. Ok, so we need to select a book, now here's the method I recommend... Pick out 2 books using each one of the languages I've mentioned above, and find a place you can check them out in the store. Go through each book, and just flip through it, looking in particular at the programming examples (source code) that is listed. Once you get a rough feel for each language, go on to the next book; make sure not to spend more than a couple minutes with any one book. After you've finished this, pick the book that you have the best feelings about; whichever language that book details should be the one you start out with. Now, go back to the bookshelf, and pick out a couple books just covering the language you've chosen... Take each book and read part of the first chapter; does it make sense to you? If not, toss the book and go on to the next; if so, then jump about halfway into the book, and read the beginning of a chapter from there - does it still make sense? Don't try to understand exactly what they're trying to explain, but see if it still seems to make sense to you. If so, then you have yourself a winner; just keep eliminating books using this method until you have one you're really happy with, and get ready for some reading.
The tools of the trade...
Let's face it, the right tools can make the job a whole lot easier; and no where is this as true than in software development. One upside is that Microsoft has made arguably the best development environment around; Microsoft Developers Studio. So, if you're using C or C++, Visual Basic, or Java, this is probably going to be the platform you'll be using. There are some free alternatives out there for some of these languages, so you might want to check them out, but for the most part they are nowhere near the tool that DevStudio is.
There's one other tool that is very important, and that's the code editor, or what you actually do all your programming in. DevStudio comes with an editor build in, and this is what many people decide to use; I personally don't like to be tethered to a specific development environment, so I prefer to use an editor called MultiEdit
, which I've been using for several years, and I can wholeheartedly recommend it to anyone who wants a great
alternative to DevStudio.
Being the eternal optimist...
I've heard it said that the biggest optimist in the world is the software developer - no one in their right mind would possibly think that writing just about ANY program would be possible when you look at the 'big picture'. For example, look at all the programs up here on the website; how long would it take you to write them all? It's a pretty daunting prospect, isn't it? So how did I do it? By some sort of super-human drive to keep me plugging away, even though it seemed impossible? No way, even the biggest optimist still has their limits! The key is looking at things not as the whole, but as the parts; for example, how long would it take for you to make one of the programs on my site? It doesn't seem that impossible, does it?
To a large extent, that's what software design is all about; cutting up a project into nice little bitesized pieces... If you don't spend enough time, you're not going to be able to eat the whole thing, or worse, you'll choke on one of those big pieces! :) When you start off making your first 'real' program (ie, one that actually does something people might want), make sure to spend a reasonable amount of time planning out how you are going to do things, what order, and what you want the end result to be. If you do this, you will find that things go much faster than you thought possible, and much easier than you might have anticipated.
It's all about teamwork baby!
If you're planning to be a lone gun programmer, think again, 99.9% of the projects out there involve TEAMS, and as such you need to be used to working with, and relying on others in a project. Once you have your chops down on your own small projects, it's probably time to start looking into becoming involved in a team project of some sort. This could be a game, demo, or whatever; just make sure it's something that you're interested in, and that everyone else is into as well. There are several ways to find projects; you can join existing ones, look around for teams that are just forming, or even start your own. The important thing to look at learning from this is what it's like to work with others...
Reading is fundamental... And I don't think it's more apparent than in software development; if you don't like reading books, then consider doing something else, because they are key to you improving and realizing your potential. Ever wonder just how I can write so much software, in such a short period of time? There are three reasons; experience, brilliant people I've had the pleasure to work with, and the books I've read. I can't help you with the first two, but I can help you with the last one, so here are my top recommendations:
- Code Complete
- This is hands down a MUST for any software developer, regardless of what programming language they use! It covers many different practices and techniques related to coding style in a very unbiased fashion. Top notch!
- Rapid Development
- The followup to Code Complete, this book is geared more towards how to plan a project, spotting potential pitfalls, etc. Another solid book loaded with insight into what software development is really about.
- Dynamics of Software Development
- This book takes a different approach to development, focusing instead more on the team and its dynamics instead of the mechanics of programming. This is something often overlooked, and the results are apparent in many of the programs released these days. Make sure to check out his website, and in particular Teamworx; worth EVERY penny.
- The Mythical Man-Month
- This is really the book that started it all; even though it was written more than 20 years ago, almost everything in it still applies today.
- Programming Windows
- If you're going to be programming Windows (in C or C++), then you need to buy this book. Period. There is NO better book on Windows programming out there.
- The Art of Ware
- I'm a big fan of Sun Tzu, so I have to say I was thrilled when I saw this book. A very enjoyable read, with some very interesting lessons to be learned in applying the Art of War, to the Art of Software Development.
I also want to take a moment to point out something you might have already noticed; a large amount of those books come from Microsoft Press. There's a reason they're #1, and it's due in large part to the amount of time they spend trying to figure out how to do things better. In general, I've found just about every book from them to be insightful and well worth the cover price, plus they are written by people who are in the trenches, and know how things really work.
Hopefully this has given you some insight of what is required to be a programmer, not just from a technological standpoint, but from a psychological standpoint as well. I personally find programming very rewarding - there's nothing quite like seeing someone using something you've written to make their life just a little bit better. So, if you decide to pursue software development, I wish you luck, and hopefully in the future I'll get an opportunity to download something YOU write, from YOUR AnalogX site! :)