[Samsung Epic 4G Touch] bbedward:
Here's where I learned my skills, this determines on what you're trying to develop. Most roms here, with the exception of source builds don't require much actual programming experience since they are closed source, primarily they have small tweaks like de-odexing, XML mods, etc.

Hands-On | 90% - 90% of my skills have come from hands-on experience and learning as I go along. For example, say I'm writing an app for the very first time. (Don't start with an app unless you've practiced with the platforms language first) As I went along on my first app I learned an incredible amount about android developing by reading developer.android.com and SO as I went along and came across something I wasn't sure about. Ditto kernel development, years ago I started with no knowledge and then bam I'm half a pro ;). Also, I knew nothing about ASP.NET/MVC/C# about a month ago, now it's kinda fluid to me.

School(Computer Science) | 8% - Yeah, it costs all that money for 8% or less. There can be some unique challenges in a software program, but almost everything you do in school is either so off the wall simple or has no real world application. I also think they spend too much time teaching by the syntax of the language, when really you should group them. Syntax is *mostly* trivial, it's better to group languages. Example: learn the Object Oriented Style (Perl, PHP, C++, Java, C#) which should give you a decent foundation in all those languages. Then learn the Procedure-Oriented Style (C, PHP, Perl, Cobol, BASIC (eww)). Then learn the rising in popularity Functional-Style (F#, SQL (mostly, this ones an exception since you often won't write many SQL scripts save for basic queries), Erlang, Haskell, C#). Notice: I listed some languages in multiple categories as the styles of programming are concepts, and some languages support either concept.

Co-Workers | 2% - Sometimes you learn by asking a co-worker or another developer. It's not how I did it primarily, but I know others who work best and learn best working in a team.

So to recap:

If you're trying to learn software programming itself I suggest starting with common scripting languages which are very easy to learn (HTML, XML (this will help for android), PHP). Then move on to some OOP languages (Java (Android*), C++). Then if you plan on working with kernel source code you should work with C and familiarize yourself with the procedure oriented style. Java is by far the easiest first language to learn OOP because of the wide-range of libraries available (to do almost anything) and the JRE, which gives you a nice garbage collector so you don't have the worry of memory management and freeing objects manually like you do in C/C++, etc.

If you just want to bake a rom with minor adjustments or a closed-source rom, I suggest you learn how to create themes first, as many of those concepts will help in baking a rom. And if you have questions this is a development community last time I checked, although sometimes it doesn't seem like it. So ask questions, ask other developers (I used to get questions :D), ask on the board (if you follow the rules), ask on StackOverflow, etc. Don't be a nuisance to other developers though, I had someone that constantly blew up my phone nonstop all hours of the day asking silly silly questions. I don't mind questions, but i'd be spending time with my GF and my phone would explode with 20 questions that I already answered 20 times each :mad:

Also, some books may not be bad if you have absolutely no idea about programming whatsoever. But nowadays, you can find anything in a book on the internet. The benefits of a book is they include all their source code (usually) and can motivate you more since they give you projects and challenges. I had one Java book, and it drove me crazy because nothing was standardized. Instead of using the Java HashMap methods, or the Java Stack methods they wrote their own APIs for everything it drove me crazy :O