In my spare time Ive been involved in mentoring a couple of people with little to no prior programming experience. Since Ive had the initial conversiation on how do I start learning how to program or how do I get a junior programming job or internship more than once, I thought Id write here about my take on it and what I generally tend to tell people when they ask about it.
In general, I wrote it for people who are seriously considering getting into programming either as a hobby or to get an entry level job or an internship at some point. Now, you wont become a coder overnight but investing your time and effort is worthwhile, I can promise you that.
Some of the many options to start out is starting with a tutorial on programming like the briliant Learn Ruby The Hard Way or Learn Python The Hard Way. After that, building a simple webapp with the help of an application framework like Ruby On Rails, Django or Meteor by following one of the abundant tutorials on one of these technologies listed here. Its perfectly fine if youre confused about what choices to make. If so, go here and start learning Ruby. Then start building a simple app following The Rails Tutorial. You really cant go wrong here. Numerous people have proven that Ruby and Rails are viable choices and both are a lot of fun to learn. Read more arguments on why rails at the bottom of this page.
In short, NO, youre not. But before we go any further though, we must establish a rough baseline.
While I belive that you can learn to program without prior knowledge, if youre serious about learning to code, its still important to know the basics of computing and hardware architecture. You dont have to know the internals and mechanics of how computers work from top to bottom, but general working knowledge of using and interacting with a computer is kind of obligatory.
In this article, I am assuming that you have good working knowledge of using computers and generally understand the technology stack. If you can barely tell apart the browser, internet, operating system, hard drive memory, ram memory and the difference between the two, windows, linux, macs, etc, you might want to check out those basics first.
Some very good books have been written on the subject and these include:
There are also some very good video resources out there, like the very popular CS50 from Harvard University.
So, having that long intro behind us, lets start with the actual things you should consider when planning your learning strategy.
While it might be quite intimidating at first, youll soon realize that it can actually be a lot of fun. The fact that pretty quickly, you could be building something useful or entertaining is really compelling. The sheer idea, that you could just build something, out of absolutely nothing, show it to others and recieve feedback is a very empowering thing to think about in the context of programming.
First of all, prepare to work hard. Be ready to put in the hours of work, study, sometimes periods of frustration and many times awe and fullfillment. Programming a computer is just not the easiest things you can learn. Its very rewarding, but its a nontrivial task. I cant stress enough how self motivation is important here. Ive seen many people quit after being stuck on some problem for a while or who were just not prepared to work that hard. Its not that obvious. You really have to find the motivation to keep going, and not many people stress that enough. You need to hussle and push through it. Having said that, its not as difficult as it seems at first and now is truly the best time to start. It really has never been easier to learn how to code. The amount of tools, resources, knowledge, examples, open data and so on are so abundant that it makes my brain hurt. Use that. Capitalize on virtually all the human knowledge that just sits on you laptop. We live in truly empowering times when it comes to knowledge and technical skills and its almost your duty to humanity to use that opportunity well!
Make the programming experience relevant and fun to you. Definitely start small, but also start with a bigger picture idea about what you could possibly be able to bring to life if only you could know how to code it. Relevance and well defined goals are key to success. Make your goals achievable, but be bold on your vision to retain motivation.
This is a huge one and really touches the subject of mentors as well. Being proactive is reaching out to find the knowledge and foundation out there. Also it means coming up with your own little projects and problems to work on. Seeking your areas of interest basically. Use Wikipedia intensly, stackoverflow.com, plain old google, social media, newsgroups and irc channels. Ask questions but be prepared to put the work into research by yourself instead of recieving ready solutions.
This one is actually most beneficial if you have a little knowledge already, but Ill still mention it because I think that this is not emphasized enough in most of the resources out there.
If youre just starting out, just get on it and do your research as you go along. You can find my starting point recommendations at the bottom of this post.
Having mentors is one of the crutial steps on the path to mastery. Most successful people of this world claim they had a mentor and as an aspiring programer you should consider finding your mentors as well. After you dive in and start to get the main ideas and more importantly - start to realize what you dont know yet (which is almost everything), start reading famous programmers books and code and seek out more experienced people in your area. Real world interaction with smarter and more senior hackers will be very influential and will make you progress faster.
There are many resources out there, that will be far more comprehensive that I wish this post would be. For starters, check out Jeff Atwoods Recommended Reading for Developers.
The process of learning never really ends. It sounds trivial, but its true. Stay hungry for knowledge and keep improving. Take on harder and harder tasks. Once you learn something new, you start to see how it unfolds a new rabbithole of further questions and ideas. Keep going deeper and remember that mastery is a constant progress. Like with most hard things, its a marathon, not a sprint.
Ok, preaching aside, how do you actually start?
First of all, although many people would probabily disagree, you dont have to become a computer scientist in order to create software. I wouldnt go down the road of reading tons of theory books before trying to write simple programs first. Many successfull coders have proven that you can just dive in by following tutorials and start filling the knowledge gaps as you go along and discover more about the craft.
Having said that, one of the strategies that has always worked for me is immersing yourself in as many tutorials, articles and videos on the subject as you can possibly can. No matter what language and/or framework youll choose. The main point being here is to just start and do your best to stick with it making adjustments as you go along.
I am attaching a list of noteable resources at the bottom of this post, that you can go through.
Among the vast amount of choices presented above, one definitely stands out in my opinion. It is Ruby On Rails framework.
Ruby On Rails uses the Ruby programming language, which is modern, easy to use and expressive. It does a good job of abstracting away the complexities of building a web application, so at the beginning of you journey you can focus on messing around and building simple things without going deep into techincalities. Of course, later on youll want to dig deeper and actually get to know the theory and engineering under the hood. But for now, you just dont need that, as your goal is to create something and make it publicly available.
Rails has one of the most active communities of hackers and builders out there. Most of the beginner questions can be easily found online on forums, Q&A sites like stackoverflow.com blogs and mooc courses.
Rails is quite popular among new and existing startups, because it significantly cuts down the time of shipping a Minimum Viable Product. It lets you quickly build a prototype of something real and go from there.