This page is a growing compilation of free resources for learning to use various technologies, tools, and skills that I find interesting, fun, productive or essential. Most if not all of them are those which I’ve used myself. I attempt to list them in order of relative complexity to a new programmer.

Note: arguably the most important thing on this page is the While Learning to Program … section. Please check it out, if nothing else.

Pre-Programming

There are some things that you might want to know about, learn about, set up, and/or install before beginning to program. These are my recommendations. While some of them are definitely not as “necessary” as others, I believe that they are all worthwhile.

  • How to Become a Hacker - ESR
    • Good overview of open-source philosophy and an ideological guide to getting started. Serves as good motivation and provides a clear path of progression.
    • This is not an endorsement of ESR or his beliefs. And that’s all I’ll say about that.
  • Installing Python/Editor Set-Up - RUCS24 Set-Up
    • Only the two sections specified, providing relatively thorough instructions for installing Python 3 and a productive environment for writing Python programs.
  • [Optional] Learn Enough Command Line to Be Dangerous - Michael Hartl
    • Thorough and informative introduction and tutorial to using the Unix command-line. Maybe a little too thorough for beginners who are excited to learn how to program and don’t want to spend an hour or more learning how to use their computer through a terminal. It is worth learning to use a terminal, however, so if you aren’t familiar already, read it in bits and pieces, and come back to it when you are lost or confused.
    • Windows users will not have a Unix command-line installed by default, but the Windows command-line is inconvenient and lacking in features in comparison to the Unix command-line. Look into setting up Windows Subsystem for Linux and make sure you install Ubuntu 20.04 LTS. Once you do so, the Ubuntu Linux command line for beginners tutorial might be of additional help to you, particularly Part 7: The Command Line and the Superuser.

Learning to Program

I believe, for a variety of reasons, that Python is the best and most approachable programming language for beginners to learn as their very first. I explain this opinion in a little more detail here if you’re interested in my reasoning.

If You Know Java

  • Python for the AP CS A Student
    • Provides reasoning for learning Python over Java, as well as syntax comparisons and a learning project at the end to solidify knowledge.

Otherwise …

  • A Byte of Python

    • A short and concise tutorial on programming in Python intended for beginners. Well written, simple, and can be completed quickly. It is rather lacking in the kinds of projects you might find in Automate the Boring Stuff, but that may be ideal if such an approach isn’t presently of interest to you.
  • Automate the Boring Stuff with Python

    • A project-based approach to learning how to program in a way that will enable you to automate away all the menial tasks you perform with computers. Of course, it is not necessary that you complete the entire book. Chapters 1 through 6, Part I, are enough to get you familiar with Python itself. It is a great introduction to programming for those who prefer to learn through practical examples.

      Do note that the book provides its own suggestions and instructions for setting up an environment for writing Python code. My suggestion is to ignore them and instead install Visual Studio Code as recommended in the Pre-Programming section, as it is an editor that is widely used by both casual and professional software developers, and you will find lots of information on the internet about how you can use it.

Regardless …

Consider checking out the Interactive Edition of How to Think Like a Computer Scientist if you are in fact studying computer science, or are simply curious as to how computer scientists approach programming. The Interactive Edition is full of code examples you can run in your browser, as well as videos to help guide you through them, and little quizzes to check your understanding. The sub-sections are numerous, so each chapter gives off the illusion of immense length. However, you will find that each sub-section is actually rather small, and so the book is much more approachable than it might seem at first.

While Learning to Program …

The Missing Semester of Your CS Education

I can’t stress enough how important I believe this series of mini-lectures by some members of the CSAIL group at MIT is to new programmers and computer science students. If there is anything a CS student and/or a programmer should ask themselves to do, it is this: learn how to use your computer really well. Knowing how to make the most out of the incredible machine on/under your desk will improve your life by a substantial margin, and open up a world of fun to you, since you’ll know better how useful your skills can be. This course covers a range of topics, few of which are really about CS or programming directly, but rather they explore how to take advantage of the various tools that you will no doubt be exposed to as a programmer, and will no doubt not regret putting in the time to learn. Please consider investing your time into this short series of lectures and exercises.

Developing Applications

If you know how to program, or have just recently learned, it’s likely that you’re itching to begin developing cool and practical applications that you or others will want to use. I would not have recommended Python if you could not use it to do these things. It is, in fact, one of the most popular languages with which web applications (e.g. YouTube, Google, Reddit, Spotify, etc.) are developed today. It is not so suitable for the development of mobile applications, but it will have provided you with a lot of the knowledge and understanding necessary to quickly learn a programming language that can enable you to comfortably develop high-performance mobile applications if you wish to do so. Here are some resources for getting started.

Fundamentals

  • Python API Tutorial: Getting Started with APIs
    • A one-page tutorial on accessing and working with RESTful web APIs in Python. APIs, as the tutorial explains, are Application Programming Interfaces. Most popular services such as Imgur, Discord, Twitter, and maybe a service you write in the future, have well-documented and accessible APIs so that anyone can easily write a program that taps into their service and requests data from it or performs actions on it programatically.

Chatbots

Chatbots are a really simple and practical way to learn how to develop software applications that do more than take input from and print output to your terminal window. They are easy to get started with, and if you have a group of friends who end up making use of it, you will learn some of the responsibilities that come with developing software, such as making sure it is easy to use (and to learn how to use), free of confusing error messages, etc.

Web Application Development

  • The Flask Mega-Tutorial
    • A thorough multi-part tutorial on developing fully-featured web applications in Python with Flask.
  • Writing your first Django app
    • The official introductory tutorial for Django, a popular web framework for Python that comes packed with many, many features. Try learning how to use both Flask and Django. Both are valuable, though Flask is much simpler and therefore may be more approachable as a beginner.

Mobile Application Development

I cannot speak at all on iOS development since I did not, until my university provided me with an iPad, own any iOS devices, and either way do not own a computer with macOS installed and therefore cannot develop and test iOS applications. I have experimented with Android development using Kotlin, so I will provide the resources I found useful here:

Functional Programming

As I’ve mentioned elsewhere on this site, functional programming is a subject about which I’m particularly enthusiastic. These are the resources I’ve made use of while learning functional programming in the order that I used them.

  • F# for Fun and Profit - Scott Wlaschin
    • It is no secret that F# is one of my favourite programming languages. One of the reasons for this is the fact that Scott Wlaschin has compiled what may be the best beginner’s resource for getting into functional programming that I’ve had the pleasure of consuming. “F# for Fun and Profit” is a near-exhaustive blog full of content designed to get the working programmer up to speed with what functional programming is, how to do it, and how to make it practical and useful. Too many people approach FP with the misconception that it is inherently mathematical and complex, and is best left to complex and “interesting” tasks that imperative and object-oriented languages are not designed to handle. Wlaschin takes the time to show how this could not be further from the truth. For further evidence of this, please consider checking out the various scripts I write in F# and upload to my [gist] (https://gist.github.com/rosalogia/).
  • Real World OCaml
    • I learned OCaml after F# to find that they are quite similar in many ways, and that F# takes much direct inspiration from OCaml. If using a functional programming language that runs on the .NET platform is uninteresting or unfeasible to you, I highly recommend learning OCaml as it’s just as approachable, equally powerful, widely used, and has a long history. Real World OCaml is a beautiful book that will get you exactly where you want to be with the language.
  • CIS 194: Introduction to Haskell (Fall 2016) - Joachim Breitner
    • This UPenn course (or, at least, the part of it that’s available for free online) is incredibly popular in the functional programming community, but I didn’t take the time to complete it until last summer. I found it incredibly enjoyable at times, and terribly challenging at others. I completed the course and its exercises with a friend of mine, and found that this was a good way to stay motivated and follow through. The course covers various functional programming topics using Haskell. If you have been using an FP language for a while but have stayed away from functors, monads, applicatives, etc. in fear of their complexity, but finally want to take a crack at them, I highly recommend attempting this course. The exercises are difficult but stimulating, and are well worth your time.