Skip to content

Latest commit

 

History

History
1110 lines (846 loc) · 54.5 KB

resources.md

File metadata and controls

1110 lines (846 loc) · 54.5 KB

Curated Programming Resources

Table of contents

Introduction

Motivation and goals

Currently, we're living in a sort of "programming renaissance." Programming and computer science is becoming more popular than ever—major initiatives like the Hour of Code are popularizing learning programming across the world, and the number of people interested in majoring in computer science is growing exponentially.

As a consequence, there are increasingly more 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 is challenging 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're 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 that works for you.

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

  • Python (general-purpose; scientific and mathematical computing)
  • Java (general-purpose; Android development)
  • HTML/CSS/JavaScript (websites and webapps)
  • Scratch (for younger children)

Python and Java are both languages that are commonly used to teach programming to beginners in schools and universities and so will have a wide variety of resources available to help you learn. They're also both widely used in the industry and so are 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 also 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 "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 schoolers) 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 many 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.

Which resource should I pick?

Whether you prefer learning by watching a video or reading text is really a matter of personal preference. I personally prefer reading, 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.

When possible, I will try and leave a description for each resource describing what their goal is, and what audience they're suitable for. Some resources focus on trying to give a comprehensive introduction for beginners, other resources are more suitable for people who're already somewhat experienced in a language and want to learn more.

Warning

This page is still a work-in-progress, and will be updated slowly, time permitting. 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

Links to other big lists

You can find a large 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).

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 is worth checking these resources periodically to see what is new.

  • Codecademy - offers free online courses in several different languages. However, Codecademy does tend to teach only basic syntax, so you must work through more tutorials after finishing Codecademy. Focuses mainly on web development, Ruby, and Python.
  • Coursera - offers free online courses in many different fields from several different well-known universities. New courses are added every quarter, and content from old courses is typically archived. Because many courses appear to be new/may be a one-time thing, this page will not link to courses on Coursera unless it appears to be stable.
  • Udacity - offers free computer science courses taught by industry experts. Udacity offers two kinds of courses—regular courses and nanodegrees. Regular courses are free. Regular courses with one-on-one tutoring/code review require a monthly fee. Nanodegrees are typically for people with some prior coding experience and cost more money.
  • edX - a joint effort between MIT, Harvard, and Berkeley to provide free online versions of some of their courses.
  • OpenCulture - similar to all of the above. Video lectures are typically available on iTunes or YouTube. Typically does not require you to complete assignments, unlike many other online courses.
  • MIT OpenCourseWare - static course materials taught at MIT. Unless otherwise noted, most content from this website tends to be very rigorous and fast-paced.
  • Khan Academy - contains a few courses on programming and computer science; does contain many more courses on all kinds of topics (especially math).
  • Stanford Engineering Everywhere - static course materials taught at Stanford.

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.

  • Team Treehouse - focuses on web and iOS development.
  • Lynda - also includes courses on design, animation, video, business, and more.
  • PluralSight - similar to Lynda, but with a focus on developer and IT 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 finicky and challenging-to-teach language. Although the online courses and books are a good starting point and can take you a long way, the consensus is that the best way to learn is through reading an actual book.

In particular, I would strongly recommend that you follow the recommendations on StackOverflow's C Book Guide and List, and use only the resources listed here if you're unable to get the books in the link.

C++

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

As with C, I would strongly recommend picking a book on StackOverflow's C++ Book Guide and List.

C#

  • Online courses:
  • Interactive tutorials: N/A
  • Video tutorials: N/A
  • Books and tutorials (online):
    • C# Programming
      One of Wikibook's featured books. For beginners. Tends to focus on syntax, and would also make a good reference.
    • The C# Yellow Book
      The introductory text used by the University of Hull.
    • C# Essentials
      An introductory text on C#. Also includes information on Windows Forms, Visual Studios, and making GUIs.
    • Visual C# resources
      Microsoft's official series of tutorials and guides on C# and .NET.
    • More free books
  • Books (paper):
  • Exercises: N/A

Haskell

  • Online courses:

  • Interactive tutorials:

    • Try Haskell
      An interactive guide that teaches basic Haskell.
  • Video tutorials: N/A

  • Books and tutorials (online):

    • Getting started with Haskell
      A comprehensive meta-guide that suggests the recommended order for following Haskell tutorials from beginning to advanced.
    • Haskell Programming from first principles
      An extremely detailed and comprehensive guide to Python, suitable both for complete beginners to programming and more experienced programmers who want to learn Haskell. This is probably one of the best resources on learning Haskell to date—the only downside is that it isn't free.
    • Learn You a Haskell for Great Good
      A beginner's introduction to Haskell. Tends to focus on syntax.
    • Haskell
      One of Wikibook's featured books. Covers basic to advanced Haskell. Very comprehensive.
    • Real World Haskell:
      Covers how to use Haskell for practical applications. This is a good second book to read, after completing one of the above tutorials.
    • State of the Haskell Ecosystem:
      An overview of popular 3rd party libraries for achieving various tasks in Haskell.Not for absolute beginners, but more people interested in using Haskell to write practical and non-trivial applications.
    • More free books
  • Books (paper): N/A

  • Exercises:

    • H-99
      A collection of 99 problems designed to increase your proficiency in Haskell.

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.

  • Online courses:

  • Interactive tutorials:

    • freeCodeCamp
      A beginner's introduction to HTML, CSS, JavaScript, and other web technologies. Contains a large number of exercises.
    • The Odin Project
      A beginner's full stack course. Contains a large number of exercises.
    • CSS3, please!
      An interactive website that lets you dynamically change CSS rules to style an element on-screen. Not for beginners, but is a good way to discover advanced applications of CSS.
  • Video tutorials: N/A

  • Books and tutorials (online):

    • Mozilla Developer Network (MDN)
      A series of tutorials covering HTML, CSS, JavaScript, and more. Some tutorials are appropriate for beginners while other tutorials will be more advanced.
    • HTML Dog
      Similar to the above, but targeted more specifically to beginners.
    • Eloquent JavaScript
      A book that teaches you how to write idiomatic and clean JavaScript. Assumes prior experience with JavaScript/another programming language.
    • A Re-introduction to JavaScript
      A guide which gives a thorough and detailed overview of JavaScript.
    • More free books:
  • Books (paper):

    • JavaScript: The Good Parts
      A short book that covers the core aspects of JavaScript as well as info on writing idiomatic and clean JavaScript.
  • Exercises:

    • CSS Diner
      A series of exercises on using CSS selectors effectively.

Lisp (Scheme, Common Lisp, Clojure, etc.)

  • Online courses: N/A

  • Interactive tutorials:

    • Try Clojure
      An interactive tutorial for basic Clojure.
  • Video tutorials: N/A

  • Books and tutorials (online):

    • The Nature of Lisp
      Not really a tutorial on Lisp, but is instead an article on why so many people advocate Lisp and claim it will fundamentally change how you view code. Great at explaining the philosophy of Lisp.
    • Structure and Interpretation of Computer Programs
      SICP is the canonical introduction to Lisp, and used to be part of MIT's introduction to CS course (before they switched to Python).
      • SICP in Clojure
        An amended version of SICP which uses Clojure instead of Scheme.
    • How to Design Programs
      A competing book and philosophy of teaching to SICP. SICP tends to focus more on CS theory whereas HTDP tends to focus more on writing how to go about writing programs/analyzing problems.
    • Build Your Own Lisp
      Walks you through how to write a Lisp interpreter in C, teaching both languages simultaneously.
    • Practical Common Lisp
      An introductory book on Common Lisp. Covers practical and real-world applications of Common Lisp.
    • Where to learn how to practically use Common Lisp
      An aggregation of books and resources on effectively using Common Lisp for programmers coming from an imperative world.
    • Learn Clojure
      A website collecting many links related to learning Lisp.
    • More free books:
  • Books (paper):

    • Land of Lisp
      A book that teaches Lisp (specifically Common Lisp) via making games. For beginners.
  • Exercises:

    • L-99
      A series of 99 problems designed to increase your proficiency in Lisp.
    • 4Clojure
      A series of exercises geared around learning Clojure.

Java

Perl

  • Online courses: N/A

  • Interactive tutorials: N/A

  • Video tutorials: N/A

  • Books and tutorials (online):

  • Books (paper):

    • Learning Perl
      An introductory text on Perl. Teaches on focusing syntax/the details of Perl, and not so much on how to program. Pragmatic and practical.
  • Exercises:

    • Perl Quiz of the Week
      A mailing list which sends out a new quiz/prompt once a week. Archives of past prompts are also available.

PHP

Note: while PHP can be very convenient, quick, and easy to use, it is 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 is important to first learn HTML and CSS before attempting to learn PHP. PHP is a language that 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.

  • Online courses:

    • Team Treehouse's PHP course - allows a free 14-day trial, but later requires payment.
  • Interactive resources:

    • Learn PHP
      An interactive guide that teaches basic PHP.
  • Exercises:

  • Video tutorials: N/A

  • Books and tutorials (online):

    • PHP Manual The official tutorial on PHP. Tends to focus on language features and syntax.
    • TutorialPoint's PHP Tutorial
      An introduction to PHP. Tends to focus on syntax. May make a good reference.
    • PHP The Right Way
      A comprehensive guide that covers modern best practices in PHP and attempts to address common flaws, misconceptions, and errors that many beginners (and many tutorials) seem to possess. Assumes some prior knowledge of PHP.
  • Books (paper):

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 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 is really no difference if you learn using Python 2 vs. Python 3.

That said, when working on your own programs, I would always pick Python 3 unless you have good reason to otherwise. The Python community, except for a few holdouts, is moving towards Python 3 and abandoning Python 2.

  • Online courses:

  • Interactive resources:

    • LearnPython
      An interactive online guide that teaches basic Python.
    • Try Python
      Another interactive online guide.
  • Video tutorials: N/A

  • Books and tutorials (online):

    • Automate the Boring Stuff with Python A book for complete beginners. It is aimed at office workers, students, administrators, and hobbyists who want to learn how to write practical programs rather than necessarily become software engineers. From the Invent with Python author.
    • How to Think Like a Computer Scientist (Python 2 version and Python 3 version)
      A comprehensive introductory text on Python, focusing on teaching computer science fundamentals and problem-solving skills through Python. Suitable for beginners.
    • Think Python
      Another comprehensive introductory text on Python, with a similar focus as the previous resource. Suitable for beginners too.
    • The official Python tutorial (for Python 2 and Python 3). Moves a little quickly, but is very comprehensive and thorough. This is probably the best resource for experienced programmers who want to learn Python, since it doesn't linger for too long on basic material.
    • Problem Solving with Algorithms and Data Structures
      A fantastic introduction to data structures and algorithms and other traditional computer science concepts using Python. While it does briefly cover Python syntax, it assumes that you already have some basic prior experience.
    • Dive into Python 3
      A faster introduction to Python. Warning: DON'T use "Dive into Python 2." It is very outdated.
    • Program Arcade Games With Python And Pygame
      A fantastic and thorough introduction to Python via making games. For beginners.
    • Invent with Python
      Teaches programming through the creation of computer games with Python and Pygame. For beginners.
    • The Hitchhiker's Guide to Python
      A comprehensive introduction to the Python ecosystem. Covers how to properly configure and set up a development environment in Python, best practices, writing idiomatic code, what the best 3rd party libraries are for different tasks, and shipping your code. Useful for both beginners and experts (however, the guide doesn't actually teach Python itself).
    • pycrumbs
      A huge list of many useful articles, tutorials, and snippets on Python, ranging from basic to advanced.
    • More free books
    • PyMOTW A tour of the Python standard library through short examples.
  • Books (paper):

  • Exercises:

    • Pyschools
      Exercises and challenges in Python. Challenges require (free) registration.

Ruby

  • Online courses:

    • Team Treehouse's Ruby course
      Allows a free 14-day trial, but later requires payment.
  • Interactive tutorials:

    • RubyMonk
      A collection of interactive tutorials to help you learn basic and advanced Ruby.
    • TryRuby
      An interactive online guide that teaches you basic Ruby step-by-step.
    • Learn Ruby
      A downloadable set of interactive tutorials.
  • Video tutorials: N/A

  • Books and tutorials (online):

  • Books (paper):

    • The Well-Grounded Rubyist
      A comprehensive and thorough introduction to Ruby. For beginners.
    • Eloquent Ruby
      A guide on how to write Ruby idiomatically and cleanly. This book assumes that you already know Ruby or some other programming language.
  • Exercises:

    • Ruby Quiz
      A series of exercises on writing programs in Ruby. New exercises are no longer being written, but the existing exercises are still great.

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 great first programming language, especially for children and younger teens.

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

  • Online courses:
  • Interactive tutorials: N/A
  • Video tutorials:
    • Video tutorials from Scratch's website
      A collection of video tutorials on Scratch for absolute beginners. Very comprehensive.
  • Books and tutorials (online):
  • Books (paper): N/A
  • Exercises: N/A

Other topics

Note: this section of the guide is very much work-in-progress.

Developing on specific platforms

Mobile apps (Android and iOS)

Due to my lack of experience working with mobile apps, I don't feel particularly comfortable recommending any particular resources regarding mobile development. This section of the guide might be expanded in the future, but for now, I would recommend the following recommendations listed here:

Data structures and algorithms

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


Tools

Version control

Git

Mercurial

TODO: Expand, add info on Subversion, add Lua, revamp C#, add Penguinmod to Scratch, revamp Git