Where to start with programming
In running a weekly social get together over the last year at the Denver Central library I usually get asked some recurring questions. I'll attempt to answer some of those questions in this post along with some resource suggestions for those of you wanting to self-learn.
Do I need a computer science degree?
Not necessarily. The deep theoretical knowledge you would learn in a comp sci program would be a great foundation for learning practical programming skills. The issue is the amount of time you have to learn the practical skills while learning the theoretical concepts. Many comp sci graduates I've talked to have also claimed they use a very small subset of what they learned at university.
Stack Overflow conducted a survey a while back in an effort to gain insight into the educational backgrounds of working programmers. A large portion of the participants claimed to be at least partially self-taught.
How much math knowledge is required?
Based on personal experience, I've used little more than basic arithmetic and algebra. Scientific fields will require additional math knowledge depending on the domain. Game development might require vector math and physics depending on the type of game you develop.
I spent a good amount of time on Khan Academy brushing up on early math and algebra. Khan offers free courses on math, science, computing, economics and other awesome topics. I was amazed at how much I had forgot and quite enjoyed the experience. Someday I'd like to go back and try out the calculus material they have, but this would be for fun as it has very little impact on my day to day work. Highly recommend doing this if you are feeling a bit shaky with the old early math skills.
What is the quickest way to learn to code?
There is no quick way to learn computer programming. It takes practice and discipline. Having a goal, such as an application you want to build, should help keep focus and motivation to learn. The idea that it takes 10000 hours or 10 years of deliberate practice to master a skill is widely discussed on the Internet. An article by Peter Norvig, the Director of Research at Google, discusses the topic in relation to programming:
Researchers (Bloom (1985), Bryan & Harter (1899), Hayes (1989), Simmon & Chase (1973)) have shown it takes about ten years to develop expertise in any of a wide variety of areas, including chess playing, music composition, telegraph operation, painting, piano playing, swimming, tennis, and research in neuropsychology and topology. The key is deliberative practice: not just doing it again and again, but challenging yourself with a task that is just beyond your current ability, trying it, analyzing your performance while and after doing it, and correcting any mistakes. Then repeat. And repeat again. There appear to be no real shortcuts: even Mozart, who was a musical prodigy at age 4, took 13 more years before he began to produce world-class music.
How many languages should I learn?
One common misunderstanding, specifically with web development, is the idea of learning HTML and CSS as your first "programming" languages. HTML and CSS are not programming languages. HTML and CSS describe presentation, whereas programming languages describe function.
Types of developers/engineers
There are many different adventures you can take in software development. Some popular high level types include:
- Web development
- Database development
- Desktop development
- Game development
- Mobile development
- Data science
You don't necessarily need to decide what path you'd like to take to get started, but eventually, once you understand the basics you'll probably want to pick one of these high level paths to focus on. I look again to Stack Overflow for useful information about what new devs are pursuing:
So, where do I start
Below I outline some pros and cons of three popular paths you can start with.
- Can find all information for free
- Can learn at your own pace
- Shows passion to others
- Requires discipline to practice and learn
- Must work harder for networking opportunities
- Can complete in short time frame, usually six months
- Most will help with job placement after graduating
- Possible networking and team experience
- Quality varies across boot camps
- Only have experience with specific tools
- Most bootcamps are expensive, especially in-person ones
- Should give a solid theoretical understanding
- Good opportunity to network with other students
- Useful for jobs that require the deeper knowledge
- May need to learn practical skills on your own
- Time commitment is usually four years, longer with a masters
- Can be very expensive
If you have the money and want to be working as soon as possible, maybe a bootcamp is a good fit for you. If you have the time and want to really understand deep concepts, consider a comp sci degree. If you have an opportunity at your current job to up-skill in programming check it out. Any route you take is going to require some self-learning. Here are some free resources you might find useful:
Great for a taste of what programming looks like. Doesn't represent day to day, but will be a great way to see if you like it.
Nice alternative to paid bootcamps. Totally free and will place you with a non-profit to do a project with if you complete the course work.
Nice introduction to basic comp sci concepts. Uses python and will guide you through building a search engine and social network.
This project aims to give you a "complete education in computer science" utilizing only free resources. The curriculum is well thought out and uses some courses from top universities such as MIT and Harvard. At the very least it will give you an idea of what a computer science program looks like.