Introduction to Programming

Curated list of resources for budding developers

Table of contents

SEE GITHUB PAGE VIEW

Introduction

Goals

Programming and computer science are becoming more popular than ever – major initiatives like the Hour of Code are popularizing learning programming across the world.

As a consequence, there are an increasingly huge number of resources and tutorials being produced for beginners who want to learn to code, ranging from books to online tutorials to interactive websites to massive open online courses (MOOCS) like Codecademy and Coursera.

While this is great, it can also be overwhelming for beginners – there are almost too many resources available, and it’s difficult to figure out where to start.

This page is meant to help solve that problem – to present a curated list of resources for people who are either new to programming, new to a particular topic, or want to advance their skills past the beginner stage. This page doesn’t try and list every single resource available, but instead links to resources that are guaranteed to be high-quality.

Where do I start?

If you know what you want to learn about, great! Jump to that section, start browsing the links, and find something which works for you.

If you’re not sure where to start and which language to learn, some good beginner languages are:

Python and Java are both languages that are commonly used to teach programming to beginners in schools and universities, and there are a wide variety of resources available to help you learn. They’re also widely used in the industry which makes them useful languages to have in your toolbelt.

Web development has been very popular lately, so there are many resources for learning HTML, CSS, and JavaScript, also making it suitable for learning. It requires little to no installation and configuration on your computer. All you need is a text editor to write code – the code will run on your web browser.

Scratch is a little different from other languages. It was designed from the ground up to be easy to use and learn – instead of typing text, you drag and connect together “blocks” to form programs, making it a very visual language. As a result, Scratch is a good language especially for younger children (elementary schoolers, middle school) or for people who dislike typing.

How this page is organized…

This page is subdivided into three parts – first, a “General resources” section that links to sites that tend to deliver high-quality content about a variety of topics, and a “Specific resources” section that provides resources on specific programming languages or topics.

In general, most resources available will fall between two categories – online courses, and books + tutorials. Online courses tend to teach using video lectures, try and be more interactive, and try and emulate the structure of a course similar to ones you might take in college. In contrast, books and tutorials teach via written text and allow you to set your own pace.

Where should I start?

Whether you prefer learning by watching a video or reading text is really a matter of personal preference. I personally prefer visual, but your learning style might be completely different. You may need to explore and browse several different resources before you discover how you best learn.

In addition, you’ll find that most links, whether they’re online courses, tutorials, or books, tend to focus on either one of three things:

  1. Some resources focus on programming, semantics, or computer science theory – in other words, how to use a programming language to write something that works.
  2. Other resources will focus more on coding and syntax – the particular details and rules about how a programming language works.
  3. Other resources focus on teaching idioms – teaching best practices specific to that language, the underlying philosophy of that language, or teaching you about the different libraries available to you: the broader ecosystem.

If you’re new to programming, the first model will be the best. Programming is all about applied problem solving: being able to take a problem, and break it up into smaller and smaller pieces until they’re small enough to translate into computer code. Simply memorizing a collection of rules will not be very useful to you. You also need to learn how to apply those rules.

However, if you already know how to program, then you most likely already know how to do this. In that case, you’re going to want to use the second kind since it’ll be easier to learn about the differences between the language you’re learning and ones you already know.

Once you’ve moved past the beginning phase, then it would be a good idea to try and move on to the third kind of resource, which will help teach you how to actually use and apply that language on a practical and professional level.

When I say that a resource is “heavy in theory” or “is rigorous”, I mean that it leans towards the first category. When I say that a resource “focuses on syntax”, I mean that it leans towards the second. And when I say a resource “focuses on idioms” or “on practical applications”, I mean that it leans towards the third.

WARNING!

This page is still a work-in-progress! Some sections may currently be incomplete, and some links may not yet be fully vetted.

If you would like to contribute, please see CONTRIBUTING.md for details.

General resources

You can find a huge and utterly massive compendium of list of free programming books and resources on github. (It used to be hosted on StackOverflow, but was moved over to Github on October 2013).

You can also find a meta “list of programming resources” aggregator here: http://resrc.io/

Online courses

Online courses are an increasingly popular way for universities and professionals to teach programming and computer science in a structured format. As a result, new online courses will pop up all the time, so it’s worth checking these resources periodically to see what’s new.

The following websites also contain a wide variety of tutorials for many different topics, but require payment and registration before you can access their courses.

In general, edX, OpenCulture, MIT OpenCourseware, and Stanford Engineering Everywhere tend to contain more rigorous, thorough, and demanding courses, whereas Codecademy and Khan Academy tend to focus on giving a more gentle introduction to programming. Coursera and Udacity tend to vary between these two extremes.

Programming Languages

C

Note: C can be a difficult-to-teach language. Although the online courses and books are a good starting point and can take you a long way, the general consensus is that the best way to learn is through reading an actual book.

C++

Note: Similar to C, C++ can be a difficult-to-teach language. Although the online courses and books are a good starting point and can take you a long way, the general consensus is that the best way to learn is through reading an actual book.

C-Sharp

(pronounced as see sharp) is a multi-paradigm programming language encompassing strong typing, imperative, declarative, functional, generic, object-oriented (class-based), and component-oriented programming disciplines.

Haskell

Haskell is a polymorphically statically typed, lazy, purely functional language, quite different from most other programming languages. The language is named for Haskell Brooks Curry, whose work in mathematical logic serves as a foundation for functional languages. Haskell is based on the lambda calculus, hence the lambda they use as a logo.

HTML, CSS, and JavaScript

Note: HTML, CSS, and JavaScript are the three core technologies that runs on every web browser and makes up every webpage.

HTML is a language used to describe the structure and content of a webpage. CSS is used to describe the style and appearance. JavaScript is used to add behavior and interactivity.

The recommended learning order is typically to start with HTML and CSS, then move on to learning JavaScript once you feel you’ve acquired a basic understanding of the previous two.

Also note that HTML and CSS are examples of “markup languages”, not “programming languages” and so will feel fairly different from JavaScript. If your goal is to learn just programming, you might want to jump straight ahead to JavaScript (or pick a different programming language!). However, since the main way to actually use JavaScript is through the web browser, you do need to learn HTML and CSS at one point or another.

Lisp (Scheme, Common Lisp, Clojure, etc)

Java

Java is a programming language designed to build secure, powerful applications that run across multiple operating systems, including Linux, Mac OS X, and Windows. The Java language is known to be flexible, scalable, and maintainable.

Perl

Businesses talk about Perl 5 when talking Perl, but on a far-far land, beyond deep-thinking island, the design-by-committee tribe is still cooking a hefty slab of Perl 6 (and it’s almost ready, with an engine written in Haskell and powered by the tears of the gods)

Ok, that said, what is Perl 5 used for, today?

The extensive CPAN collection is very handy, when dealing with prototypes. (Batteries may not be included, but they’re still right there, on the shelf)

Remember drawbacks, though:

PHP

Note: while PHP can be very convenient, quick, and easy to use, it’s also a language viewed negatively by many programmers. (See PHP: a fractal of bad design). If you do decide to learn PHP and adopt it as your language of choice, just be aware of the fact that people will probably make fun of you at one point or another.

Also, it’s important to first learn HTML and CSS before attempting to learn PHP. PHP is a language which attempts to “extend” and work with HTML, so may not fully make sense if you try and learn it before picking up basic web development.

Python

Note: there are currently two versions of Python that are commonly taught and used – Python 2, and Python 3. Python 3 is the most recent version, but for a variety of reasons Python 2 still is fairly popular among many developers.

If you’re not sure which version to pick, my recommendation would be to pick the resource which looks like the best fit for you, and just use whatever version they’re recommending. Luckily, the differences between the two are very minor (at least from the perspective of the beginner), so there’s really no difference if you learn using Python 2 vs Python 3.

Golang

The Go programming language is an open source project to make programmers more productive.

Go is expressive, concise, clean, and efficient. Its concurrency mechanisms make it easy to write programs that get the most out of multicore and networked machines, while its novel type system enables flexible and modular program construction. Go compiles quickly to machine code yet has the convenience of garbage collection and the power of run-time reflection. It’s a fast, statically typed, compiled language that feels like a dynamically typed, interpreted language.

In addition to the resources available at golang.org there are a range of community-driven initiatives:

Ruby

Note: Ruby is a dynamic, reflective, object-oriented, general-purpose programming language. It was designed and developed in the mid-1990s by Yukihiro “Matz” Matsumoto in Japan. According to its creator, Ruby was influenced by Perl, Smalltalk, Eiffel, Ada, and Lisp.

Scratch

Scratch is a language wherein you create programs by dragging together and connecting “blocks”. Unlike other programming languages, Scratch is very visual, making it a very good first programming language, especially for children and younger teens.

Because not many people may be familiar with Scratch, this section will contain resources that are helpful both for learning Scratch, and teaching Scratch.

There are two


Other topics

TODO: EXPAND AND POLISH

Developing on specific platforms

Please see our FAQ for more information.

Android

Mac and iOS

Windows and Windows phones

TODO: Expand? Don’t want to duplicate too much existing content.

Data structures and algorithms

Unless otherwise noted, all of the resources in this category assume prior programming experience.


Tools

Version control

Git

Mercurial

TODO: Expand, add info on Subversion