How I learned programming

My self-taught, tortuous, nontraditional journey into programming as a career.

I get asked this a lot, given my non-traditional background (not computer science or computer engineering; not even any science or math). Many people today are trying to learn programming with backgrounds similar to mine, but it is freakin' difficult to get past the beginner phase.

By no means do I consider myself an expert. I repeatedly tell people and myself that I know very little. And yet I should give myself credit where it's due: I have two years of relatively solid professional experience in software development, and in that time I've read many books, taken many courses, and even shipped out hundreds or thousands of lines of code into production. I've mentored a few peers who are more junior than me. I plan to keep up this momentum to get even better and help out those who struggled just like me.

Here are my two cents on what worked for me to begin programming and overcome those Cliffs of Confusion (I still can't tell whether I'm in the Desert of Despair or the Upswing of Awesome; maybe it depends on what I am trying to learn at the time). I add approximate number of years I did this stuff, but I fully recognize that learning is lifelong, especially with technology that never stops evolving.

Note: being autobiographical, this list centers on me becoming a software developer primarily using Java, but I'm sure you can find some of the advice useful for other OO languages. Tone shifts as well but I'm too lazy to fix that right now.

My story

  1. Get comfortable with HTML and CSS. (8 years on and off as a preteen and teen)
    • Download free HTML/CSS templates and see how they work.
      • You'll be more motivated to do this and have more direction if you have a personal project in mind. An easy one is designing your own portfolio site. For my first sites, they were anime and video game fan sites on Angelfire. D:
      • Keep in mind that a lot of templates, especially free ones, may not exactly follow best practices. You probably won't be able to detect bad code just starting, but that's fine. tl;dr always scrutinize.
    • From those templates, look up code you don't understand from easy-to-understand places:
      • W3Schools
        1. People give this place a hard ass time (see W3Fools), but I used it extensively before and still come back to it occasionally. I like that I can play with the concepts/syntax I am learning right on their site.
      • CSS-Tricks
      • HTML5 Rocks
    • Do Free Code Camp*
      • *Wish I had this earlier. But it guides you through front-end, JavaScript, and maybe more with projects you do that can directly benefit non-profits.
    • Extra: get into graphic design :0
  2. Getting into programming: try some JavaScript. (4 years on and off)
    • (Programmers will be quick to tell you that HTML and CSS are markup languages, not programming languages.)
    • You'll inevitably run into JavaScript with front-end stuff. It's getting even more popular with back-end development. (I need to get back into JS myself for Angular2.) Some places:
    • Keep going if this is the language in which you want to specialize!
  3. Diving deeper into back-end: Learn some PHP. (4 years on and off, 1 year a bit more rigorously)
    • Again, this is what I did; it seems people aren't recommending this anymore (they usually say go for Python, Ruby, or even Java). I jumped into PHP because I was administering message boards (e.g., Invision Power Board, vBulletin, and Simple Machines) for my anime and video game sites. ;0 I also was curious about WordPress. The practical value was clear to me. Plus, as I began to host my own sites with fewer training wheels, I noticed that all cheap and free web hosts provide support for PHP (not so with, say, Java). So, I still think it's a good idea to learn some PHP. It's a bit easier IMO than the more robust OO languages.
    • If you're into the stuff I was into, download and install WordPress and/or a message board system. Then play around with them.
    • Some sources to learn in conjunction:
    • Build projects!
    • Tools:
      • XAMPP: lets you quickly and easily run PHP on an Apache server.
      • Notepad, until you get a hand on the syntax....
      • Then find a dedicated IDE for PHP. Sublime Text, Notepad++, etc. have good syntax highlighting and auto-completion for PHP.
  4. Learn SQL and database stuff.
    • No matter what programming language you learn, you will most likely have to mingle with some data management system. Understand databases, normalization, and the most fundamental SQL statements.
    • Tools:
      • XAMPP: goes hand-in-hand with your PHP development. Lets you run a MySQL database and manage it via phpMyAdmin.
      • Those message boards and WordPress blogs.
  5. Learn Java. (1 year rigorously)
    • Two simple words but f***in' hard to follow. I benefited from my job:
      • being surrounded by 12 other professional Java developers who could help me out
      • having a huge incentive to learn because it meant I would get a promotion
      • it was just the thing people talked about all day, every day
    • Still, much of my learning was due to my effort. I tried *Head First Java *but was honestly bashing my head at it. I luckily found this course that got me moving forward:
    • Maybe halfway through Purcell's course, I went back to Head First Java, and things clicked better for me. I continued both the tutorial and the book.
    • One of my colleagues then let me borrow his OCA Java SE 7 Programmer I Study Guide (I'll link the latest here for Java 8 though) because he planned on getting certified. It was still confusing to me but much less so than before the Purcell and *Head First *resources. I also got a better idea of what Oracle expects of a junior Java developer. I did not end up pursuing my own certification, though... but maybe I will, one day.
    • IDE setup with Eclipse or IntelliJ
  6. Learn Java EE and web development. (1.5 years rigorously, overlap with #5)
    • I took courses at Learning Tree International: one on Design Patterns and Best Practices, and one on Spring and Hibernate.
      • Admittedly the courses were so fast-paced and condensed that I couldn't follow them well (plus I got sleepy). In retrospect I wish I took these courses later. But I had to take them to trigger my promotion. Also, looking at the materials a year later (as I write this), they are a lot more useful to me, so not a big waste at all.
      • ~~Unlike online courses, Learning Tree courses are expensive and take up four work days. Most students there have their employers pay for them. ~~Striking out because this was useless to me in terms of learning. The promotion was necessary, though.
    • I got more hands-on experience at work with the promotion.
    • I continued with more online courses and books:
  7. Learn software development.
    • Software Development Lifecycle (SDLC) of your company
      1. Again, I was fortunate to already have a developer job to see and practice this stuff first-hand. I also had a great boss eager to teach me the project management side of things and to help revamp SDLC documentation.
      2. Head First Software Development
    • Version control
    • Command Line/Bash
      • No serious programmer worth his or her salt can function without the command line. It's not that scary, but be careful. 🙂
    • Test-Driven Development
    • Practice what you learn with your own projects. Develop an SDLC, tweak it, stick to it.
  8. Learn some computer science.
    • Why this order (learn programming languages and software development and THEN CS)? Learning the language and development process were more readily practical for me at the time (get promotion! churn out some deliverables!). In any case, I was able to build off of my budding programming knowledge when taking one of the hardest yet most fulfilling courses I've ever taken:
  9. Get into algorithms and data structures.
    • (Related to #8.) The course above did a great job at introducing me to algorithms and data structures. But it was my job to take this knowledge further. Some courses and books:
    • If necessary, brush up on your math skills.
      • This guy on Quora said he did all the math courses available from Khan Academy, i.e., Early Math for toddlers to Differential Calculus and beyond. This is one of my goals for 2016. I won't be as strict as him with completing all the early stuff, though.
      • I recently read a Quora discussion that argued that you need nothing beyond pre-algebra to do most programming stuff (this is why I think algorithm-centered interviews are not good, though some algorithms aren't too math-advanced), and from my limited experience so far, I agree. Still, learning math is just one of those skills and mindsets you can only benefit from obtaining. It is always useful.
  10. Keep diving deeper into Java and its related frameworks.
    • As a liberal arts grad and someone originally starting out in front-end development, I greatly appreciate* breadth of knowledge*. At the same time, it's super easy to get lost and overwhelmed in the technology industry with learning all the latest languages, etc. I want to become more intimate with my main language to understand its intricacies and how best to use it. This deep understanding will help me develop better Java-centered applications (since they're still highly relevant today) and then approach other languages better.
    • Keep working at architecture.
      1. Master Object Oriented Design in Java
    • Keep reviewing and learning new best practices.
    • Take head on those more advanced Manning and O'Reilly books!
  11. Explore other languages and frameworks useful for your projects.
    • I am learning from my SuperLearner course that a key aspect of effective adult learning is to find what you learn relevant to your needs. This guideline can help you sift through the countless technologies that come out each day. Still, you may find that you're left with big number of techs. 🙂 Just do your best, try not to get overwhelmed, and don't let your learning completely new stuff override #10.
    • For helping with Java:
      • Groovy -- like Python and Ruby but can be compiled in a JVM
      • More JavaScript stuff because of how great it's becoming
        • Node, Angular, maybe React/Meteor
      • Expression Languages and templating languages like SpEL, Thymeleaf, Velocity
      • Keep up with latest HTML5 and CSS3 trends. Unless you're using a back-end framework that completely replaces your front-end (like Vaadin), you'll always need these tools polished in your belt.
        • Also, don't reinvent the wheel. Embrace Bootstrap and other front-end frameworks.
      • Android!
  12. Explore other languages/techs for fun and to challenge the paradigms you've developed from Java, etc.
    • If you have time and a good mastery of the above... That is my thought, at least (as is everything else here).
    • Things I'm considering (based on my Udemy backlog): Swift, Ruby, Haskell, more Python
  13. Get better at Vim.
    • This is a to-do for me. Learning to get things done with just your keyboard is awesome. It's just also so easy to get frustrated and grab that mouse (or reach for that trackpad).
  14. Find more mentors.
    • Another to-do for me. I've joined a lot of meetups and am reaching out to people with whom I've networked. But I still haven't found the one or two people I'm most comfortable sharing in my vulnerabilities and becoming better as a programmer (not including my colleagues). This step is the key I know I am missing to accelerate my learning. I'm proud that I've mostly sailed solo in this journey, but I know I could be moving much faster with some consistent help.
    • Related to mentoring.

General tips

  • Always look for books/courses/sites that are appropriate for your level. Do not be ashamed about starting from very simple or slow-going materials.
  • Your best resource is a mentor who can translate what you're trying to say or understand and then either answer you or point you in the right direction.
    • Two of the things you have to learn are what questions to ask and how to ask them. StackOverflow is lovely but only if you know for what you're looking and whether you can understand the answers.
  • Keep building projects. You get better at human languages by writing, speaking, and making mistakes. Same with computer languages (except maybe the speaking--though trying to explain technical stuff to someone else is a great way to stretch your understanding of the materials). Theories and hand-holding courses will only take you so far.
  • After you have a decent grasp of a technology, take a stab at reading the official API documentation. They're vital to software craftsmanship.
  • Don't give up.

This has been my journey. It will never end. It was probably not the most efficient journey**--I often wonder whether I could've gotten to where I am now at a much faster rate with the many 12-week (or so) coding schools out today, and I sometimes waver at the feeling of regret in majoring in the humanities.*

But the fact is, I "made it", without needing to spend thousands of dollars to go back to college or even to go to a coding school. I didn't need to miss a single (unpaid) day of work. I love where I work now, and I just hope that I'll continue to have an awesome, supportive development team who is open to the newest technologies and shaking things up. I can't control whether my team will one day leave our company, but I can control my performance. (I still worry that I'm an imposter and will one day be fired.) So I keep increasing my value. I want to give up sometimes, but no. Writing this post has helped me see how far I've come, and and it has helped me get excited and more confident in my potential. Because I CAN.

And since I don't think I'm that great, you very likely can as well. So DO IT!

If any of you have advice on how to better my learning, please let me know.

*And really, I can't stop loving the humanities.

**Consider coding schools if you can afford the time and money. The networking and close bonds you form look invaluable, along with the post-job hunting support many of them offer. Otherwise, you can try out my tortuous route.