Learn to Code – A Collection of Programming Tutorials and Resources for Beginners

Published: 10/25/2014. Updated: 5/21/2016. Updated 9/21/2016. Updated 2/19/2017. Updated 3/7/2017. Updated 10/11/2017. Updated 7/7/2018. Updated 12/17/2018.

Because I am often asked by friends where to start as a beginner in computer science and software development, I compiled a list of a few of my favorite resources. This list may be updated from time to time. Have a suggestion? Contact me so I can add it. :)

This is not an exhaustive list. You can find many more coding resources at code.org.

Visual Coding

scratch.mit.edu – free – code blocks / javascript – Designed by the Lifelong Kindergarten Group at MIT. Learn basic programming with animations, sounds, music, and movements. A great way to introduce kids – or anyone – to programming.

Learn to code with Minecraft

ComputerCraft for Minecraft – free, but requires Minecraft account – Lua – Play Minecraft and program computers, robots, and even computer networks in the game itself.

YouthDigital Mod Design 1 – $250 – Java – Learn to use Eclipse to make your own items, biomes, and monsters in Minecraft. While $250 may seem expensive, the testimonials are very positive, and the videos are especially appealing to younger viewers. In the process, you will learn how to use Eclipse and Java, which is a desirable skill in the marketplace.

CodeKingdom – $15/month, or $190/lifetime – Learn to use Java to program various Minecraft mods and games. Test your creations on a server, and friends can play with you, too. From what I have seen so far, CodeKingdom has an excellent toolset, with both block coding and text available, great educational videos, and rapid build and deployment of your code to the server. It’s definitely worth checking out if you like Minecraft.

Make your own games

Cocos2D with Python – free / MIT licensed framework – Python – Use Python to make 2D games for desktop platforms

RayWenderlich.com – free – Objective-C and tools for iOS and mobile development – Use Objective-C to make your own iPhone apps with Xcode.

LWJGL with Java – free – Java framework for 2D and 3D graphics. Minecraft used this framework at one point. – Use Java to make 2D / 3D games for desktop platforms.

Overview of Entity Component Systems – free – comparison and contrast of different versions of ECS, which is a very useful pattern in game design

Unity Game Engine with C# – various prices – Try out some courses on Udemy to learn how to make games with Unity. Unity is a powerful game engine which can deploy to a multitude of platforms. You can make both 2D and 3D games with it. You will also learn how to program in C#.

Web development

w3schools.org – free – Learn to program in HTML, CSS, Javascript, and various server side languages. A solid introduction to designing websites from scratch, without having to purchase any expensive software.

Coding Exercises

CodeCombat – freemium – multiple languages – An RPG where you learn to code to advance through the levels. I think this is a great starting place for absolute beginners.

HackerRank – free – coding challenges in C – A series of exercises to prepare you for interviews with top tech companies.

Codecademy – free – Javascript – A series of tutorials and exercises to teach you to program in Javascript.

Community resources

Khan Academy – free – various languages – Educational website with videos covering hundreds of topics, including programming, complete with progress tracking and other incentives. Self paced.

Coursera – free – various topics, including computer science topics – Educational website with online coursescovering hundreds of topics, taught by top university professors, with some courses including certificates and grades.

stackoverflow – free – Various languages – Ask and answer questions related to software development.

Derek Banas – free – Various languages – A YouTube channel of software development tutorials

Beginner’s Resources to Learn Programming Languages – free – a list of programming/coding resources for various languages. This link was sent in by a guest of this blog in September 2016. Thank you!

Udemy – cost per course – Various languages – Courses aren’t free, but this can be a great way to get up to speed with a new framework. Many of the courses are geared toward beginners in a given language or framework.

Repositories and Version Control

Bitbucket – free for small teams with paid plans available for larger teams  – various languages – Bitbucket allows you to version control (i.e. protect and create backups) your code using Mercurial or Git. Includes wikis for repos. Bitbucket also allows you to have free private repositories.

GitHub – free – various languages – Github allows you to version control your code using Git. Very popular in the open source community. If you contribute to a project on GitHub, you can also put your contributions on your resume.

HgInit – free – a tutorial by Joel Spolsky on how to use Mercurial

Command Line

C Tutorial – free – Learn basic programming with C.

Learn Python the Hard Way – free e-book / paper version available for purchase – Python and shell – Learn how to program Python, with an emphasis on using the terminal or shell. Using the terminal to configure your programming environment is a vital skill for software engineers. This is a great introduction to using the terminal to develop software.

VIM Adventures – free / $25 for full version – Vim – Play a game, and learn to use Vim! Vim is a text editor with shortcuts, and a lot of customization available. This is a powerful editor; programmers who use Vim efficiently in combination with the terminal appear to other programmers as wizards.

VimGolf – free – vim – Learn to use Vim by attempting to complete challenges while using a minimal number of keystrokes.

Vim Cheat Sheet – free – vim – Remind yourself of various Vim commands with this handy reference.

RMS’s gdb Debugger Tutorial – free tutorial – A tutorial on using GDB. GDB allows you to execute C/C++/Objective-C programs (and a few other languages), and then step through each line and print out variables to find bugs.

Valgrind Quick Start Guide – free – A tutorial on Valgrind. Valgrind allows you to find memory errors in your C/C++ programs.

CS Theory

Open Data Structures – free e-book / creative commons attribution license – various languages + pseudocode – Ever wondered what people mean when they say “binary search tree” or “that function will run in O(n) time?” You can learn about data structures for free by reading this book.

Building Blocks for Theoretical Computer Science – free e-book – An excellent introduction to discrete mathematics by a professor at UIUC. This is an important topic in computer science. Easily the best advanced textbook I have ever read. Thank you, Dr. Fleck!

MIT OpenCourseware – free video lectures from MIT – Much of MIT’s core CS curriculum is available for free on their website. You can learn the basics, as well as the highly theoretical by watching these free video lectures.

Brilliant.org – free to try, $10 to $25 per month to continue – A variety of math and CS theory subjects.

My Favorite Books

System Programming by Lawrence Angrave – free wiki book – one of my favorite books on System Programming in C; written by Lawrence Angrave, who is a professor at UIUC.

Programming in Objective-C by Stephen Kochan – Great intro to Objective-C. You can use Objective-C to create iPhone apps.

Effective Objective-C 2.0 – A helpful book to take your knowledge of Objective-C to the next level, by diving deeper in several areas.

Game Programming Patterns – Great discussion of various patterns for game programming. The patterns are also extremely applicable to other types of applications, besides games.

App Empire by Chad Mureta – An introduction to creating iPhone apps from the sales/business owner perspective. No programming tutorials, but a solid introduction to the app marketplace.

Building Blocks for Theoretical Computer Science – Also listed above under “CS Theory”. An excellent introduction to discrete mathematics.

Learning React Native – This book describes how to make cross-platform apps using React Native.

Test-Driven iOS Development – This describes how to create iOS apps using a test-driven approach.

The Vital Parts of UIUC’s CS curriculum

Sometimes, aspiring programmers are concerned that they don’t know what they need to study to be a successful computer scientist or software engineer. And outside of academia, it can be tough to form a complete image of what a well rounded CS curriculum should look like. The CS program at UIUC is excellent, so I believe that if you follow the core curriculum, and learn the material covered, you can be a successful computer scientist or software engineer.

Complete list of UIUC CS courses.

List of required classes to acquire a CS degree at UIUC

CS 125 – Introduction to Computer Science. This teaches basic computer science and programming principles. There are also other great ways to get started on this post.

CS 173 – Discrete Structures. You can learn this material by reading Professor Fleck’s excellent textbook. Prerequisites: CS 125, calculus 1

CS 225 – Data Structures. The class serves as both an introduction to data structures, and an introduction to C++ skills. Check out Cinda Heeren’s CS 225 course website. And here is a free data structures textbook. Alternatively, Google for introductory Data Structures courses. Here is a Coursera Data Structures course. Prerequisites: CS 125, CS 173

CS 233 – Computer Architecture. This is a great class which teaches you how computers work at the level of chip design. MIT has a similar class, 6.004, which is available for free online. Prerequisites: CS 125, CS 173. Prerequisite or concurrent: CS 225

CS 241 – System Programming. This is an extremely valuable class, and I feel it has been instrumental in my early career and internships. It teaches you C and System Programming and some Bash. You can learn most of this by reading Professor Angrave’s excellent open source wiki book. It’s helpful to have access to a Bash terminal. If you’re on Windows, you can now install Bash. You can also check out Learn C the Hard Way. Here is a C programming course on Udemy. (but it isn’t free.) Here is a free Bash course from Stanford. Prerequisite: CS 125, Prerequisite or concurrent: CS 173

CS 242 – Programming Studio. Great class with a lot of hands on work. We spent time each week learning new programming languages, and creating new projects with those languages. It’s an overview of how to work as an effective software engineer. This class’ content is being migrated into CS 126. Prerequisite: CS 241

CS 357 – Numerical Methods. Prerequisites: CS 125, Linear Algebra, Calculus 3.

CS 361 – Probability and Statistics for Computer Scientists. Professor Forsyth’s textbook is excellent. Prerequisites: calculus 1, matrix theory

CS 374 – Algorithms. This is the content you need to pass whiteboard/interview questions at top companies like Google. Read Professor Erickson’s notes. Coursera has free algorithms courses, too. Prerequisite: CS 225, linear algebra

CS 421 – Programming Languages. This class makes you a more efficient software engineer. You learn lambdas and functional programming, and also how interpreters work. A lot of the course’s material can be learned in the book “Learn You A Haskell for Great Good!“, which the author offers as a free web book, or you can purchase it on Kindle. Here is a free course on functional programming. Here is another free course on functional programming. My recommended prerequisite: CS 241. Actual prerequisites: CS 233, CS 374

If you’re looking for more free online courses, this StackExchange answer lists quite a few great resources, including MIT and Coursera.

Tools for Mac

A list of my favorite tools for Mac:

Sublime for C/C++ development. Make for building C/C++ projects. Valgrind and GDB for C/C++ debugging.

Terminal and SSHFS in combination with Sublime for editing files on remote systems

Xcode for iPhone development

Adobe CS6, Adobe Illustrator for graphic design

ShiftIt for window management

Mercurial on the command line is my favorite distributed version control system for new projects. I also use Git and Subversion.

TortoiseHg is a tool to graphically manage your Mercurial repository. It is helpful for complex operations where using the command line could be unwieldy.

Wireshark for network debugging, web development, and socket development. Only use this if you have permission / administrator rights on your network. It may be useful to debug your networking code.

OnyX for cleaning, performance tweaking

Colloquy for IRC chat

iFunBox for iPhone file browsing

PlayOnMac to run Windows software

Mailbox (Beta) for email

Dropbox for cloud storage

TeamViewer for remote technical support on Mac, PC

VirtualBox for Linux and Windows virtualization

Disk Inventory X for hard drive profiling

Netbeans for Java development

Violet UML for UML diagrams

Mount Your EWS Directory As A Local Folder on Mac – CS 125, CS 225, CS 241, CS 398, Computer Science, Engineering Work Stations, University of Illinois

Published: March 30, 2014. Updated: September 21, 2016.

I worked out a way to mount my UIUC EWS directory locally, using SSHFS on Mac. I found it helpful, so I decided to share my notes here.

Note: Commands are in purple. File modifications/contents are in orange.

Mount EWS Directory

First, install SSHFS on Mac.

Once you have installed SSHFS, execute:

cd ~
mkdir school

Make a file called “mountSchoolDrive”:

 vim mountSchoolDrive 

mountSchoolDrive contents:

#!/bin/sh
sshfs yournetid@remlnx.ews.illinois.edu:/home/yournetid/ ~/school

And make a file called “unmountSchoolDrive”:

vim unmountSchoolDrive

unmountSchoolDrive contents:

#!/bin/sh
umount ~/school

Make them both executable:

chmod +x ~/mountSchoolDrive
chmod +x ~/unmountSchoolDrive 

Now, when you want to work with files in your EWS directory, you simply execute:

./mountSchoolDrive
cd ~/school

And when you’re done:

cd ~
./unmountSchoolDrive

Mount VM Directory for CS 241

September 2016 update: A friend in CS 241 tells me that now there is a virtual machine you must use to run your code in CS 241. Unfortunately, you can only access this virtual machine from within UIUC’s internal network. The CS 241 virtual machine is not accessible to the outside web.

However, she discovered a way to connect first to EWS, and then mount her virtual machine directory as a local directory for SSHFS. Here is one blog post she referenced, and below are her modified scripts. Thanks Samara!

You need two make two replacements below. Replace ‘yournetid’ with your net id. Replace ‘VMID’ with your virtual machine’s id. (it’s a 3 digit number)

mountVMDrive contents:

#!/bin/sh
ssh -f yournetid@linux-a1.ews.illinois.edu -L 2222:fa16-cs241-VMID.cs.illinois.edu:22 -N
sshfs -p 2222 localadmin@localhost:/home/localadmin ~/VirtualMachine

unmountVMDrive contents. Note the final command which exits any ssh processes.

#!/bin/sh
umount ~/VirtualMachine
for pid in $(ps ax | grep "ssh -f yournetid@linux-a1.ews.illinois.edu" | awk '{print $1}'); do kill $pid {} 2>/dev/null; done

Use Sublime Command In Terminal (subl filename)

First, make a bin directory in ~:

mkdir ~/bin

Modify ~/.bash_profile:

vim ~/.bash_profile

Add this line in .bash_profile:

export PATH=$PATH:/Users/yourusername/bin

And then create a symbolic link to Sublime, in your ~/bin folder:

ln -s "/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl" ~/bin/subl 

(Sublime symbolic link: https://www.sublimetext.com/docs/2/osx_command_line.html)

Example final use:
(use sublime, and CMD+S to instantly save your work, until you’re finished)

cd~
./mountSchoolDrive
cd school
subl myTotallyAwesomeProgram.cpp

When you’re done editing your file:

cd ~
./unmountSchoolDrive

Quick Command to SSH to EWS

Keep in mind that if you type “make” in your locally mounted school directory, it will use your local g++ compiler setup instead of the EWS configuration, which may be missing resources like the png library to support the -lpng flag. (which will lead to an error when you type “make”)

Instead, I like to run two terminal windows: one which is SSH’d into EWS to run commands like “make” using EWS’ g++ setup, and the other in the sshfs mounted school directory on my local machine for quick access to the subl command.

On Mac, you can create a new Terminal window by using the hotkey combination CMD+N.

To quickly connect to EWS with SSH, here is a file called “connectToSchool”:

cd ~
vim connectToSchool

connectToSchool contents:

#!/bin/sh
ssh yournetid@remlnx.ews.illinois.edu

Don’t forget to chmod +x your SSH script to make it executable:

chmod +x ~/connectToSchool

If you modify files under an SVN managed directory, make sure to only run “svn ci” in the SSH’d terminal, rather than in the local SSHFS mounted directory. If your local version of SVN is different than the version on EWS, it may generate problems or error messages.