What were you thinking?I’ve finally come to realize that I kind of like being a newbie. I’ve learned a great deal that I really didn’t need to know by admitting I know nothing and seeking information to answer my (often rather random) questions. Besides, you can learn a lot about people based on their reaction to a really simple question.I’ve also learned that there are a lot of superior people on the web. Everywhere you turn, someone knows everything and is perfectly willing to explain why they don’t need to explain anything to you as a result. On the other hand, there’s not much that you can’t learn enough about to at least get started with a new skill, so the tradeoff is fair enough—and in many cases, you can find just as many people who are quite happy to share their knowledge with you. It’s all good.I know this because I decided to learn a bit of programming, and figuring out where to start has been among the most labyrinthine processes I’ve ever engaged in. Sure, I imagine that if I were a CS grad, or otherwise computer science savvy, it’d have been easy—but for a reasonably tech-savvy but non-programmer type like myself, it’s been surprisingly hard to figure out where to begin.Of course, you can ask questions, but the answers you’ll receive will vary extremely widely depending on who or where you ask. Why is this? Well, it’s because apparently the hyper-rational engineering aspects common (and useful) to professional programmers also encourage dogmatic adherence to certain things. If you ask someone who has a peculiar bent, well, they’re not likely to say, “a lot of people do it this way, but I find that this is the way to go about it. Try that first.” No. That would be too easy. Instead, you might get, “this is the way to do it—believe me, you’re wasting your time doing it any other way”, regardless of the truth of that statement.Now, I don’t mean to imply deception or malfeasance, and this certainly is not always the case, but for whatever reason it does happen a lot. You may or may not have heard about religious wars among geeks? Well, apparently a question asked by a newbie is often considered an opportune moment to score a point for the team, rather than to solve the problem the question was meant to address. But I’m not bitter.Anyway, I do as much as I can for myself, and if that means learning a touch of plumbing, wiring or carpentry in analog life, then so be it. In digital life, I learned a bit of html and css, along with the associated technologies and steps to get a few websites up and make them passably purty. The results are self evident, and I’m pleased with them, both here and there among others, though a strict standards person would probably quibble with my choices. It’s been fun, and I’ve learned a skill set that people normally pay handsomely for, though they’ll never pay me for it ;-)Now it’s on to the next thing—software. I haven’t been able to find a program that will do what I want in a simple and clear manner, so I’m writing it myself. I’ve surveyed and demo’ed all of the possible options on the Mac for what I want to do, and none do what I need, which really isn’t complicated. If everyone weren’t trying to solve clever problems I don’t have (and can’t imagine need solving), maybe that would have occured to them in their design. But I digress.This little endeavor may take a very long time, but again, it’s fun, and what more could you ask in life than lots of fun projects. What it’s not, is a clear path or in any way easy, especially compared to web design. Why? Web designers are often accessibility/usability wonks, so enough of them pride themselves on being clear that they leave an easy trail to follow. Not so with software writers apparently.Just Doing ItWriting software for the Mac these days can mean using a large variety of tools, which doesn’t simplify things. If you boil it down to the clearest path and most long-term-useful method, what seems to be the best route is to use the native tools on OS X, which are free, and then use the Objective-C language with Cocoa, which is what most modern Mac software is migrating toward if not already using. For some dissenting opinions, see the always well spoken and emotionally balanced commenters at Kuro5hin.Cocoa is essentially a library of code that OS X progammers can use for software development. In short, it means you can quickly create glossy programs whose appearance will be familiar, but which can only be used on recent (10.2 or later) versions of Mac OS X. I decided on Cocoa because it offers a lot of “built-in” features, so you can actually have full featured programs without coding every line yourself. This provides an important feeling of success with even the simplest program, even if it’s not totally earned. Instead of details, your focus will be on the “unique” features of your program, and the rest Apple takes care of for the most part. You should know that you can also use Java and Perl to work with Cocoa, but for me there were more resources for Cocoa combined with Objective-C.Basically, if you choose this route here are the steps you could take:
- Learn C (or not) – many recommend this prior to learning Objective-C, but enough people say it’s not vital that I think it’s worth skipping and going straight to the meat.
- If not, go straight to Objective-C – read an overview of the language, Apple has several online
- Get an Understanding of Object Oriented Programming
- Read an Overview or start in on one of the Objective-C books
- Download Xcode tools from Apple (free)
- As you read the book(s), work through all the tutorials you can find online
- Download other people’s projects from Sourceforge or wherever
- read ‘em, run ‘em and try to understand how they work.From there, you can go a number of directions, but you’ll probably want to start hacking on your app. Finally. It took me a long time to figure all that out though, which either speaks poorly of my intelligence or means that it’s just not very clear outside of a classroom setting, so I’m going to put up a number of links which have been helpful to me should someone else decide to go this route. These links are most pertinent if you’ve decided to go with Cocoa and Objective-C. Which is the only way to go and you’d be stupid to try any other route … ooh, I feel like a coder already.On being a programmer in theory:A personal essay by Robert ReadThe tools and where to start with them:Xcode and the Apple development process – lotsa Apple links there. The secret to the Apple documentation is, there is almost always a paper to tell you exactly how to do what you want to do, but finding it is damn near impossible. Try lots of search term variations and if possible, code snippets.The Book Breakdown, or, Which ones will help you get started and which ones are for “real” (see: experienced) programmers only:Programming in Objective-C – One of only 2 books that purport to teach without prior knowledge of C or Java. A great place to start.Cocoa Programming for Dummies – the other newbie book, much simpler and less comprehensive, but another ok starter. If you can stomach the title and the obnoxious color.Building Cocoa Applications: A Step-By-Step Guide – you’d think, wouldn’t you? But no, you have to have some C background to get anywhere with this one. This should be the next step when you understand how a program works and need to understand the concepts more fully and implement with good examples.Cocoa Programming for Mac OS X by Aaron Hillegass, one of the original NeXT developers of Cocoa. This one is really well written but again requires a significant understanding of programming concepts and C before you start.Cocoa Programming – have to have a programming background for this one too. A much more reading oriented book than some of the others that focus on tutorials.Cocoa in a Nutshell – good reference, won’t help you learn from scratch. It’s a cheatsheet, not a manual, but worthwhile as such. Ditto for Objective-C Pocket Reference, but you knew that.Links with a Cocoa flavor:Variety of subjects here, though some links are dead.Where to go to see if someone already asked your question:Search the cocoadev mailing list archives. It’s a good idea to subscribe to this once you have a sense of what’s going on—‘til then, subscribe to the student-dev mailing list instead. Or just do both.About Object Oriented Programming Generally and Objective-C specifically:OOP at CocoaDev – OOP is what you’ll be doing with Cocoa. Forgot to mention that.An Objective-C faqTutorials to try, ‘cause learning is doing:A very simple Cocoa App – dive right in.BYOB Build your own web browser in just a few minutes.How to write a text editor in 15 minutes the ease of text services is one of the many big pluses of programming for the Mac with Cocoa.HTMLX, a basic HTML editorSome tutorial variety from CocoaDevCentral, but not many beginning to end projects.Sourceforge Cocoa:‘Cause reading other people’s code will help you understand. Download a project, load it in Xcode, and read the code and comments. Run the program, read the feedback. Try to isolate what each block of code is doing.Working on a document-based application:A great FAQ on the ins and outs of working with documents in Cocoa.Resources/Communities that don’t mind Newbies:CocoaDevCentral – good tutorialsCocoaDev – good glossariesWeblogs of OS X developers, for color:Stevenf of Panic, makers of Transmit, the best OS X FTP program among other things.Brent Simmons of NetNewsWire fame.John Gruber of, well, Daring Fireball fame.Buzz Anderson an Apple developer and PodWorks author.Michael Tsai of SpamSieve fame.I’ll add to this as necessary or as I come across useful resources. Have fun!