Programming is an art form where we ask a question, and then write out very detailed instructions on how to answer that question. The instructions are written in a very limited subset of words, with a very precisely defined grammar. From this foundation, we can eventually end up at Microsoft Office or the latest XBox game.
Of course, there is a long, long road from writing out your first “hello world” tutorial to the latest word processor or Portal adventure from Valve. On this road, the byways will include a bewildering array of languages, options, tools, and a seemingly insurmountable mountain of functions, libraries, and bizarre vocabulary you’ve never seen before.
It’s very easy to get discouraged if you allow yourself to. The trick is to break the process down into chunks that you can manage, that give you some feedback, that let you go “Yes, I succeeded!” so you don’t feel like you’re churning away without making any progress whatsoever. This comes under the header of “Choosing your projects wisely.”
Actually, the first trick is to remember that trying to program gets you nowhere. You’ve actually got to do it.
What Have I gotten Myself Into?
A challenge. Like all worthwhile challenges, it will not be easy. The good news? You don’t have to invest a lot of time or money to get started. So first choose a goal – a mid-term one.
What are you interested in creating? An iPhone app? An android app? A web-based app? The next Twitter? That will determine your starting point, your choice of starting languages, and what tools you need to pick up.
The path is not straight.
Keep in mind that programming, like math, depends on you learning concepts and then building on them. Programming as a process though, is not the same as programming as a language. Don’t get hung up on mastering PHP first if you really want to develop in Ruby “on Rails,” for the web. You don’t have to master HTML to start learning scripting languages for web programming, but you do need to know enough to build a webpage using those languages. Learn enough of the current toolset to start being proficient, and advance to the next one. Once you’ve learned the basics of a couple languages, the rest is mostly a matter of syntax and available functions. It’s how you learn to think about the problem, and break it down, that’s important.
For the web
For web-based applications, the baseline is to learn HTML. No, its not a programming language, but it IS a structured language that defines what kind of information you’re putting on the page, and where. It is used in combination with CSS: stylesheets that allow you to separately define how that information looks once it is on the screen. Since any programming for the web will involve manipulating and modifying HTML and CSS, you need to know these. HTML is also a subset of XML – which is used as a document and information storage format by many programs.
Mobile and Desktop
Unless you’re building low-level driver code, this will eventually require you to learn a set of daunting “API’s” that allow you to open windows and otherwise graphically manipulate data. For Macs and iPhones, you need to learn Objective-C. For Windows, check other people’s recommendations, but you’ll end up learning some variant of C, C++, or C# and the .net libraries. For Android based devices, and a number of other applications, you will need to learn Java.
Again, the real trick is to learn to think like a programmer. All else is syntax, and understanding what will happen when you type out any given command. The choice of languages here determines what types of features are already wrapped up for you, which ones you have to program yourself, and how quickly and flexibly you can write down the concept you’re thinking.
There are arguments for starting in Java. If you’re planning on making a living outside of the Mac or Windows world, you definitely need to learn it. That said, I personally prefer Python as a starting point. It comes pre-loaded on Macs, it’s easily available for Windows, it has a very clean syntax, and it easily bridges the gap from simpler, “procedural” languages to learning object oriented ones. While relatively slow performance wise, it has been repeatedly used by experienced programmers to prototype out software for later optimization, or even tackle projects they never would have dreamed of in high-performance languages like “C”.
Either way, there are plenty of good sources of information and starting tutorials. Once you get your feet wet, you can start progressing into more complex languages that require more attention to details like memory allocation, but give you better performance in the tradeoff, or start learning the basics of creating Mac, Windows, Android, or iPhone apps.