• Stars
    star
    429
  • Rank 101,271 (Top 2 %)
  • Language
  • Created over 8 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Resources for budding developers

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:

  • Golang (Go is an attempt to combine the ease of programming of an interpreted, dynamically typed language, with the efficiency and safety of a statically typed, compiled language.)
  • 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 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

Links to other big lists

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.

  • Codecademy - offers free online courses in several different languages. However, Codecademy does have a tendency to teach only basic syntax, so you may need 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.
  • Springboard - offers several free programming resources and mentored workshops on data science, UX design and more that can teach you Python, R, data science, and SQL with the help of an expert who works professionally.
  • 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 requires 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.
  • Learn Code - offers free online courses hosted on YouTube focusing primarily on greater JavaScript ecosystem. Covers everything from basic JavaScript, front end Web Apps, NodeJS and some of the more popular frameworks. Also covers other topics such as basic Git usage, and SSH.
  • Do What You Love (DWYL) - over 150 tutorials in the form of Github repositories, covering languages such as JavaScript, HTML5, Elixir and Elm; platforms like AWS, Digital Ocean, and Azure; other tools like CodeShip and Github; and also covering basics on architecture, security, and test driven design
  • Object-Oriented Reengineering Patterns - Object-Oriented Reengineering Patterns collects and distills successful techniques in planning a reengineering project, reverse-engineering, problem detection, migration strategies and software redesign.
  • Computer Musings (lectures by Donald Knuth) - The Stanford Center for Professional Development has digitized more than one hundred tapes of Knuth's musings, lectures, and selected classes and posted them online.
  • NASA Software Measurement Handbook
  • Introduction to Functional Programming (class lectures and slides) - Introduction and Overview Functional and imperative programming: contrast, pros and cons. General structure of the course: how lambda calculus turns out to be a general programming language. Lambda notation: how it clarifies variable binding and provides a general analysis of mathematical notation. Currying. Russell's paradox.
  • Guide to the Software Engineering Body of Knowledge - The Guide to the Software Engineering Body of Knowledge (SWEBOK Guide) describes generally accepted knowledge about software engineering. Its 15 knowledge areas (KAs) summarize basic concepts and include a reference list pointing to more detailed information.
  • Programming Languages: Application and Interpretation - Programming language ‘‘paradigms’’ are a moribund and tedious legacy of a bygone age. Modern language designers pay them no respect, so why do our courses slavishly adhere to them? This paper argues that we should abandon this method of teaching languages, offers an alternative, reconciles an important split in programming language education, and describes a textbook that explores these matters.
  • Producing Open Source Software - Producing Open Source Software is a book about the human side of open source development. It describes how successful projects operate, the expectations of users and developers, and the culture of free software.
  • 97 Things Every Programmer Should Know - 97 Things Every Programmer Should Know project, pearls of wisdom for programmers collected from leading practitioners. You can read through the Contributions Appearing in the Book plus the Other Edited Contributions, browse Contributions in Progress, view the list of Contributors, and also learn How to Become a Contributor. If you would simply like to comment on a contribution, please also read How to Become a Contributor as some of it applies to you.
  • Type Theory and Functional Programming - Constructive Type theory has been a topic of research interest to computer scientists, mathematicians, logicians and philosophers for a number of years. For computer scientists it provides a framework which brings together logic and programming languages in a most elegant and fertile way: program development and verification can proceed within a single system.
  • Operating Systems and Middleware (PDF and LaTeX) - Operating Systems and Middleware: Supporting Controlled Interaction by Max Hailperin

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.
  • General Assembly - also includes courses on design, animation, video, business, and more.

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.

  • 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

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.

  • Online courses:
  • Interactive tutorials:
    • Try Haskell An interactive guide that teaches basic Haskell.
  • Video tutorials:
  • 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.
    • 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.
    • 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:
    • 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):
  • Books (paper):
  • Exercises:
    • CSS Diner A series of exercises on using CSS selectors effectively.
    • DevProjects DevProjects is a community with free and unique real-world projects in multiple coding languages and tech stacks. The website also includes solutions from other developers and discussion board for all users to participate in.

Lisp (Scheme, Common Lisp, Clojure, etc)

  • Online courses:
  • Interactive tutorials:
    • Try Clojure An interactive tutorial for basic Clojure.
  • Video tutorials:
  • 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. Very good 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

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.

  • Online courses:
  • Interactive tutorials:
    • Learn Java An interactive tutorial that teaches basic Java.
  • Video tutorials: N/A
  • Books and tutorials (online):
    • Introduction to Computer Science using Java An introductory text on Java. Moves a bit slowly, but covers everything in great detail (including setup).
    • Learn by Doing An introductory text on Java. The tutorial is exercise-driven.
    • Think Java Another introductory text on Java. The content is based on the "How to think like a Computer Scientist" series.
    • Thinking in Java, 3rd edition Note: the fourth edition is the latest one, but currently is not free. The website can also be a little hard to navigate -- the direct download link is here. Assumes some basic prior programming experience.
    • TutorialsPoint's Java Tutorial An introduction to Java. Tends to focus mainly on syntax. May also make a good reference.
    • The Java Tutorial The official Java tutorial, produced by Oracle. Tends to focus on language features and syntax.
    • More free books
  • Books (paper):
  • Exercises:
    • Practice-it A series of exercises hosted by the University of Washington, starting with basic Java and finishing with data structures and algorithms. Requires (free) registration first before you can view or work on the exercises.
    • DevProjects A commnuty of free and unique Java projects that focus on both mobile and web apps. Created by Codementor, a paid mentorship platform, DevProjects offer projects, solutions from other developers, and discussion board for all users to participate in.

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?

  • legacy web systems / intrawebs - some just won't die

  • data mining / statistical analysis - the perl regex engine, even if slightly outdated, (PCRE, a spinned off library, tops it up in any possibile way and it's the default PHP engine) is still good for simple analysis

  • **UNIX system administration **- Perl shall always be installed on UNIX. You can count on it being readily available even on Mac OS X.

  • **Network Prototyping **- many core network experts learned Perl when it was all the rage; and they still do their proofs-of-concept with it.

  • Security - many security experts, too, need fast prototyping. (and fast automated fixes) Perl can, and does, cover for that.

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:

  • Object support in Perl sucks hard, you bless references and do unholy stuff in the name of objects, then wonder why you took all the trouble in the first place.

  • Reading other people's Perl is more than a craft, it's science, and a painful one, too.

  • Perl is nifty, it makes you think nifty, it makes you feel nifty, you become a programming rockstar. Now, think about getting up, and going to work in a office full of rockstars: it's a "boat that rocks" hard. Expect wild fluctuations.

  • Online courses: N/A

  • Interactive tutorials: N/A

  • Video tutorials: N/A

  • Books and tutorials (online):

    • Beginning Perl A comprehensive and thorough introduction to Perl.
    • Modern Perl A guide on writing clean and idiomatic Perl code. Very good for teaching the philosophy and fundamentals of Perl. Comprehensive and thorough.
    • Impatient Perl An accelerated guide for impatient people or people with prior programming experience.
    • Learn Perl in about 2 hours 30 minutes Another accelerated guide for the impatient. Geared towards people who have prior experience in another programming language.
    • More free books
    • Perl.org also hosts a list of recommended books, many of which are available online for free.
  • 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'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.

  • Online courses:
    • Codecademy's PHP track
    • 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:
    • DevProjects A growing list of PHP real-world projects that is free for all. Solutions and discussions can be found in most projects. Paid help to complete the project is optional through related product, Codementor.
  • 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 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.

  • 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):
    • Learn Python the Hard Way Part of the "Learn X the Hard Way" series. Despite its name, this is one of the easiest introductions to Python available.
    • 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 useful, 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.
    • Think Python Another comprehensive introductory text on Python.
    • The official Python tutorial (for Python 2 and Python 3). Moves a little quickly, but is very comprehensive and thorough.
    • 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 An accelerated introduction to Python. Warning: do NOT use "Dive into Python 2". It's 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 does not actually teach Python itself).
    • pycrumbs A huge list of many useful articles, tutorials, and snippits 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.
    • DevProjects A list of growing, free Python projects that cater to web development and data analysis.

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:

  • Orgs:

    • GoBridge: Building Bridges That Educate & Empower Underrepresented Communities
    • Women Who Go: We are women of the Go community.
  • Starter Books:

    • The Little Go Book: The Little Go Book is a free introduction to Google's Go programming language. It's aimed at developers who might not be quite comfortable with the idea of pointers and static typing. It's longer than the other Little books, but hopefully still captures that little feeling.
    • An Introduction to Programming in Go: This book is a short, concise introduction to computer programming using the language Go. Designed by Google, Go is a general purpose programming language with modern features, clean syntax and a robust well-documented common library, making it an ideal language to learn as your first programming language.
    • Go Bootcamp: This companion book contains material initially written specifically for this event as well as content from Google & the Go team under Creative Commons Attribution 3.0 License and code licensed under a BSD license.
    • Learning Go: A online book to start learning Golang. It features numerous exercises (and answers).
    • Go for Javascript Developers: This book helps Javascripters become Gophers. Outlining the differences between these languages makes it easier to switch back and forth, and can help mitigate potential issues when doing so.
    • The Go Programming Language: The Go Programming Language* is the authoritative resource for any programmer who wants to learn Go. Alan A. A. Donovan and Brian W. Kernighan show you how to write clear and idiomatic Go to solve real-world problems. The book does not assume prior knowledge of Go nor experience with any specific language, so you'll find it accessible whether you're most comfortable with JavaScript, Ruby, Python, Java, or C++. The book features hundreds of interesting and practical examples of idiomatic Go code that cover the whole language, its most important libraries, and a wide range of applications. Source code is freely available for download from the book's companion web site and may be conveniently fetched, built, and installed using the go get command.
    • Go in Action: Go in Action introduces the Go language, guiding you from inquisitive developer to Go guru. The book begins by introducing the unique features and concepts of Go. (We assume you're up to speed with another programming language already, so don't expect to spend a lot of time rehearsing stuff you already know.) Then, you'll get hands-on experience writing real-world applications including web sites and network servers, as well as techniques to manipulate and convert data at speeds that will make your friends jealous. In the final chapters, you'll go in-depth with the language and see the tricks and secrets that the Go masters are using to make their applications perform. For example, you'll learn to use Go's powerful reflection libraries and work with real-world examples of integration with C code.
    • Go Programming Blueprints: Build real-world, production-ready solutions in Go using cutting-edge technology and techniques. Intended for seasoned Go programmers who want to put their expertise in Go to use to solve big, real-world, modern problems. With a basic understanding of channels and goroutines, you will hone your skills to build tools and programs that are quick and simple. You need not be an expert in distributed systems or technologies in order to deliver solutions capable of great scale. It is assumed that you are familiar with the basic concepts of Go.
    • Programming in Go: Creating Applications for the 21st Century: Programming in Go brings together all the knowledge you need to evaluate Go, think in Go, and write high-performance software with Go. Summerfield presents multiple idiom comparisons showing exactly how Go improves upon older languages, calling special attention to Go’s key innovations. Along the way, he explains everything from the absolute basics through Go’s lock-free channel-based concurrency and its flexible and unusual duck-typing type-safe approach to object-orientation.
    • Introducing Go: Build Reliable, Scalable Programs: Perfect for beginners familiar with programming basics, this hands-on guide provides an easy introduction to Go, the general-purpose programming language from Google. Author Caleb Doxsey covers the language's core features with step-by-step instructions and exercises in each chapter to help you practice what you learn.
    • Learn Go: Learn Go is a beginner’s guide to the Go programming language, aimed squarely at hobbyists and new developers. It’s chock-full of exercises that you can tackle with nothing more than a web browser. Move forward each day with succinctly written chapters punctuated by elaborate challenges. By the end you will have cracked ancient ciphers, discovered the wonders of cellular automatons, planned a vacation on Mars, and directed rovers to gather weather data. This is just the beginning. What you build next is up to you.
    • Go Programming by Example: Go, commonly referred to as golang, is a programming language initially developed at Google in 2007. This book helps you to get started with Go programming. It describes all the elements of the language and illustrates their use with code examples.
  • Web Development Books:

    • Building Web Apps with Go: A good resource for start Building Web Apps with Go.
    • Build Web Application with Golang: Another awesome book for learning Web Development in Golang.
    • Mastering Go Web Services: This book will take you through the most important aspects of designing, building, and deploying a web service utilizing idiomatic REST practices with a focus on speed, security, and flexibility. You will begin by building your first API in Go using the HTTP package. You will look at designing and building your application including popular design structures like Model-View-Controller. You will also understand methods for deploying code to staging and development. Finally, you will see how the security features in Go can be used for protection against SQL injection, and sensitive data compromise.
    • Level Up Your Web Apps With Go: This book gives you all you need to use Go in your web applications. You’ll learn the basic concepts — language structures, the standard library, and Go tools — then tackle more advanced features like concurrency concepts, testing methodologies, and package structures. At each step, you’ll get advice for better coding in Go. You’ll see how to structure projects, how to use concurrency effectively, and best practices for testing—as well as many other hints and tips gleaned from real world experience of developing web applications with Go.
    • Go Web Programming: Go Web Programming teaches you how to build web applications in Go using modern design principles. You'll work through numerous examples that introduce core concepts like processing requests and sending responses, template engines, and data persistence. You'll also dive into more advanced topics, such as concurrency, web application testing and deployment both to barebones servers and PaaS providers.
    • Build webapps in Go the anti textbook: This book was written to teach how to develop web applications in Go for people who know a bit of Go and have basic information about web applications in general. We (you) will build a webapp without using a third party framework and using as few external libraries as possible. The advantage is that you'll learn a lot when you code without a framework.
    • Cloud Native Go: Building Web Applications and Microservices for the Cloud with Go and React: Today, companies and developers need to respond to changing markets at breakneck speeds. Organizations that aren't built on highly-available, rapidly-evolving software are going the way of the dinosaurs. Cloud Native Go brings together the knowledge developers need to build massive-scale cloud applications that meet the insatiable demands of today's customers and markets.
    • Web Development with Go: Learn to Create Real World Web Applications using Go : Web Development with Go was written to teach both beginners and experts how to create and deploy a real web application. You won't be building a boilerplate TODO list, but will instead be creating and deploying a production ready photo gallery application, similar to Pixieset, from scratch. The book assumes no previous web development experience and covers everything you need to know to successfully build your own web application.
    • Go: Building Web Applications: This course is an invaluable resource to help you understand Go's powerful features to build simple, reliable, secure, and efficient web applications.
  • Advanced Go Books:

    • Test-driven development with Go: A short guide to Test-driven development in golang
    • Network Programming with Go: An e-book on building network applications using the Google Go programming language. Free to
    • Mastering Concurrency in Go: This book will take you through the history of concurrency, how Go utilizes it, how Go differs from other languages, and the features and structures of Go's concurrency core. Each step of the way, the book will present real, usable examples with detailed descriptions of the methodologies used. By the end, you will feel comfortable designing a safe, data-consistent, high-performance concurrent application in Go.
    • Go in Practice: Go in Practice guides you through dozens of real-world techniques in key areas like package management, microservice communication, and more. Following a cookbook-style Problem/Solution/Discussion format, this practical handbook builds on the foundational concepts of the Go language and introduces specific strategies you can use in your day-to-day applications. You'll learn techniques for building web services, using Go in the cloud, testing and debugging, routing, network applications, and much more.
    • A Go Developer's Notebook: A developer's experience in golang.
    • The Go Programming Language Phrasebook: Tested, easy-to-adapt code examples illuminate every step of Go development, helping you write highly scalable, concurrent software. You’ll master Go-specific idioms for working with strings, collections, arrays, error handling, goroutines, slices, maps, channels, numbers, dates, times, files, networking, web apps, the runtime, and more.
  • Videos:

  • Exercises:

  • Workshops:

  • Learning resources for specific topics:

  • Further reading:

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.

  • Online courses:
    • Codecademy's Ruby track For beginners. Tends to focus on syntax.
    • 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 very good.
    • DevProjects A compilation of free and unique Ruby projects for developers of all levels of expertise.

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

Data

Neo4j and Graph Databases

Neo4j is an open source NOSQL graph database, implemented in Java. It saves structured data in graphs rather than in tables. Graph databases simplify and speed up access to data that is complex and contains many connections. They use graph structures with nodes, edges, and properties to store and access connected information, and can traverse parts of the data without touching the whole graph.

Neo4j is widely used for:

  • Highly connected data

  • Recommendation

  • Path Finding

  • Data First Schema

  • Schema Evolution

  • A* (Least Cost Path)

  • Online courses:

    • Neo4j Training - free course, completely online
    • GraphGist - geek out on real graphs on finance, sports, politics, or even The Hobbit

MongoDB

MongoDB is an open-source NoSQL database engine built in C++.

It's a document-store database which means it stores data as a "document" inside a collection, with multiple collections inside a database. Multiple databases can exist for each server. The document data is stored as BSON which is JSON (JavaScript Object Notation) in a binary format for performance. The data is schema-less which means each document can have as many keys and values as you want with no restriction on the type of data.

It's easy to think of documents in collections like rows in a relational database table, except that these documents can have any arbitrary amount of properties (like columns for rows) and they can be different for each document and include lots of nesting like arrays of more properties. This is very powerful way to store complex data and matches up well to the object-oriented nature of most programming languages.

MongoDB runs on both Windows and Linux servers and has lots of documentation and years of production usage now so it's considered a stable and useful database, although there are continuing issues with durability and an overly-complicated replication setup to keep in mind.


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

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:

  • Golang (Go is an attempt to combine the ease of programming of an interpreted, dynamically typed language, with the efficiency and safety of a statically typed, compiled language.)
  • 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 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

Links to other big lists

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.

  • Codecademy - offers free online courses in several different languages. However, Codecademy does have a tendency to teach only basic syntax, so you may need 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 requires 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.
  • Learn Code - offers free online courses hosted on YouTube focusing primarily on greater JavaScript ecosystem. Covers everything from basic JavaScript, front end Web Apps, NodeJS and some of the more popular frameworks. Also covers other topics such as basic Git usage, and SSH.
  • Do What You Love (DWYL) - over 150 tutorials in the form of Github repositories, covering languages such as JavaScript, HTML5, Elixir and Elm; platforms like AWS, Digital Ocean, and Azure; other tools like CodeShip and Github; and also covering basics on architecture, security, and test driven design

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.
  • General Assembly - also includes courses on design, animation, video, business, and more.

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.

  • 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

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.

  • Online courses:
  • Interactive tutorials:
    • Try Haskell An interactive guide that teaches basic Haskell.
  • Video tutorials:
  • 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.
    • 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.
    • 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:
    • 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):
  • Books (paper):
  • Exercises:
    • CSS Diner A series of exercises on using CSS selectors effectively.

Lisp (Scheme, Common Lisp, Clojure, etc)

  • Online courses:
  • Interactive tutorials:
    • Try Clojure An interactive tutorial for basic Clojure.
  • Video tutorials:
  • 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. Very good 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

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?

  • legacy web systems / intrawebs - some just won't die

  • data mining / statistical analysis - the perl regex engine, even if slightly outdated, (PCRE, a spinned off library, tops it up in any possibile way and it's the default PHP engine) is still good for simple analysis

  • **UNIX system administration **- Perl shall always be installed on UNIX. You can count on it being readily available even on Mac OS X.

  • **Network Prototyping **- many core network experts learned Perl when it was all the rage; and they still do their proofs-of-concept with it.

  • Security - many security experts, too, need fast prototyping. (and fast automated fixes) Perl can, and does, cover for that.

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:

  • Object support in Perl sucks hard, you bless references and do unholy stuff in the name of objects, then wonder why you took all the trouble in the first place.

  • Reading other people's Perl is more than a craft, it's science, and a painful one, too.

  • Perl is nifty, it makes you think nifty, it makes you feel nifty, you become a programming rockstar. Now, think about getting up, and going to work in a office full of rockstars: it's a "boat that rocks" hard. Expect wild fluctuations.

  • Online courses: N/A

  • Interactive tutorials: N/A

  • Video tutorials: N/A

  • Books and tutorials (online):

    • Beginning Perl A comprehensive and thorough introduction to Perl.
    • Modern Perl A guide on writing clean and idiomatic Perl code. Very good for teaching the philosophy and fundamentals of Perl. Comprehensive and thorough.
    • Impatient Perl An accelerated guide for impatient people or people with prior programming experience.
    • Learn Perl in about 2 hours 30 minutes Another accelerated guide for the impatient. Geared towards people who have prior experience in another programming language.
    • More free books
    • Perl.org also hosts a list of recommended books, many of which are available online for free.
  • 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'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.

  • Online courses:
    • Codecademy's PHP track
    • 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 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.

  • 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):
    • Learn Python the Hard Way Part of the "Learn X the Hard Way" series. Despite its name, this is one of the easiest introductions to Python available.
    • 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 useful, 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.
    • Think Python Another comprehensive introductory text on Python.
    • The official Python tutorial (for Python 2 and Python 3). Moves a little quickly, but is very comprehensive and thorough.
    • 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 An accelerated introduction to Python. Warning: do NOT use "Dive into Python 2". It's 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 does not actually teach Python itself).
    • pycrumbs A huge list of many useful articles, tutorials, and snippits 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.

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:

  • Books (online):
    • The Little Go Book The Little Go Book is a free introduction to Google's Go programming language. It's aimed at developers who might not be quite comfortable with the idea of pointers and static typing. It's longer than the other Little books, but hopefully still captures that little feeling.
  • Books (paper):
    • Go in Action: Go in Action introduces the Go language, guiding you from inquisitive developer to Go guru. The book begins by introducing the unique features and concepts of Go. Then, you'll get hands-on experience writing real-world applications including websites and network servers, as well as techniques to manipulate and convert data at speeds that will make your friends jealous.
    • The Way to Go: A Thorough Introduction to the Go Programming Language: Pros - Book is very relevant and up-to-date, well-structured (maybe too well-structured at times), covers virtually everything in Go language, has a myriad of useful code examples. Cons - Author is not a native speaker and it shows. At times it is a bit hard to understand his writing - proofreading was definitely needed.
    • Introducing Go: Build Reliable, Scalable Programs: Perfect for beginners familiar with programming basics, this hands-on guide provides an easy introduction to Go, the general-purpose programming language from Google. Author Caleb Doxsey covers the language’s core features with step-by-step instructions and exercises in each chapter to help you practice what you learn.
    • The Go Programming Language: The Go Programming Language is the authoritative resource for any programmer who wants to learn Go. It shows how to write clear and idiomatic Go to solve real-world problems. The book does not assume prior knowledge of Go nor experience with any specific language, so you’ll find it accessible whether you’re most comfortable with JavaScript, Ruby, Python, Java, or C++.
  • Videos
  • Exercises:
  • Workshops:
  • Learning resources for specific topics:
  • Further reading:

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.

  • Online courses:
    • Codecademy's Ruby track For beginners. Tends to focus on syntax.
    • 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 very good.

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

Data

Neo4j and Graph Databases

Neo4j is an open source NOSQL graph database, implemented in Java. It saves structured data in graphs rather than in tables. Graph databases simplify and speed up access to data that is complex and contains many connections. They use graph structures with nodes, edges, and properties to store and access connected information, and can traverse parts of the data without touching the whole graph.

Neo4j is widely used for:

  • Highly connected data

  • Recommendation

  • Path Finding

  • Data First Schema

  • Schema Evolution

  • A* (Least Cost Path)

  • Online courses:

    • Neo4j Training - free course, completely online
    • GraphGist - geek out on real graphs on finance, sports, politics, or even The Hobbit

MongoDB

MongoDB is an open-source NoSQL database engine built in C++.

It's a document-store database which means it stores data as a "document" inside a collection, with multiple collections inside a database. Multiple databases can exist for each server. The document data is stored as BSON which is JSON (JavaScript Object Notation) in a binary format for performance. The data is schema-less which means each document can have as many keys and values as you want with no restriction on the type of data.

It's easy to think of documents in collections like rows in a relational database table, except that these documents can have any arbitrary amount of properties (like columns for rows) and they can be different for each document and include lots of nesting like arrays of more properties. This is very powerful way to store complex data and matches up well to the object-oriented nature of most programming languages.

MongoDB runs on both Windows and Linux servers and has lots of documentation and years of production usage now so it's considered a stable and useful database, although there are continuing issues with durability and an overly-complicated replication setup to keep in mind.


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