Learning is a life long pleasure. Programming and Computer Science are challenging and take time but luckily the resources available today make it free to get access to top quality materials.
In the 6 years since I first wrote this article many of the links had to be updated (and some resources are no longer free, goodbye MOOC), hopefully I have managed to maintain this somewhat
Just starting with coding (mostly python)
I've been asked often enough about getting started in software programming that I decided prepend this "guide" from 2019 that I believe is a free and easy way to get bootstrapped.
- Watch a couple of videos from https://www.coursera.org/learn/interactive-python-1 (pro tip, if possible watch at 1.25x or 1.5x speed and pause and go back to replay a specific part when necessary)
- Do about 3 hackerrank exercises: e.g.- https://www.hackerrank.com/domains/python?filters%5Bsubdomains%5D%5B%5D=py-introduction (but stop after doing "Errors/Exceptions" and move onto the problem-solving track https://www.hackerrank.com/domains/algorithms?badge_type=problem-solving , always feel free to skip an exercise if the problem description is too confusing, the key is practice not perfection ;) , https://www.hackerrank.com/challenges/python-string-split-and-join/problem
- Do one "chapter" from KhanAcademy (e.g. https://www.khanacademy.org/computing/computer-science/algorithms start from Binary search and you're "good enough" after finishing merge sort)
- Read one "chapter" from the PythonDocs , e.g. start with https://docs.python.org/3.7/tutorial/introduction.html
- Watch one video from MIT https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-0001-introduction-to-computer-science-and-programming-in-python-fall-2016/lecture-videos/ note this is the same as https://www.edx.org/course/introduction-to-computer-science-and-programming-using-python-3
- Do one exercise from leetcode , https://leetcode.com/problemset/algorithms/?difficulty=Easy&listId=79h8rn6 (easy ones first, then go to mediums or the top100 list)
e.g.
- (if statements for each edge case) https://leetcode.com/problems/valid-parentheses
- (nested for loops and dicts/hashmaps) https://leetcode.com/problems/two-sum
- (nested for loops) https://leetcode.com/problems/valid-sudoku
Then go back to #1 and repeat =]
Of course what I've suggested is really just the minimum. Some good auxiliary learning would be:
- https://exercism.io/tracks/python
- https://www.khanacademy.org/computing/computer-science/internet-intro
- https://scotch.io/bar-talk/a-quick-understanding-of-rest
- https://blog.miguelgrinberg.com/post/designing-a-restful-api-with-python-and-flask
- https://programminghistorian.org/en/lessons/creating-apis-with-python-and-flask
Introduction to Programming by Universities
Stanford
by Mehran Sahami (very fun and Java is an ok starting point - though the world has moved to Go)
- https://see.stanford.edu/Course/CS106A Programming Methodology
- Then algorithms with https://see.stanford.edu/Course/CS106B Julie Zelenski
- And more algorithms https://www.coursera.org/learn/algorithms-divide-conquer Tim Roughgarden
-
And advanced algorithms https://www.coursera.org/learn/algorithms-graphs-data-structures Tim Roughgarden
- https://online.stanford.edu/course/intro-computer-networking-winter-2014
- https://www.youtube.com/playlist?list=PLvFG2xYBrYAQCyz4Wx3NPoYJOFjvU7g2Z
Harvard
- https://cs50.harvard.edu/college/
- https://www.youtube.com/watch?v=y62zj9ozPOM&list=PLvFG2xYBrYATXXCZdUUdh13gG4MEDqm2S
- https://www.extension.harvard.edu/open-learning-initiative/intensive-introduction-computer-science
MIT
- https://www.edx.org/course/introduction-computer-science-python-mitx-6-00-1x now named https://www.edx.org/course/6-00-1x-introduction-to-computer-science-and-programming-using-python-3
Algorithms of course!
- https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-006-introduction-to-algorithms-fall-2011
- (also at https://itunes.apple.com/us/itunes-u/introduction-to-algorithms/id341597754)
- https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-046j-introduction-to-algorithms-sma-5503-fall-2005/video-lectures
- https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-046j-design-and-analysis-of-algorithms-spring-2015/lecture-videos/
- https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/ (listing of all the MIT courses)
Princeton
Algorithms - https://www.coursera.org/learn/algorithms-part1 (aka https://online.princeton.edu/node/201) - https://www.coursera.org/learn/algorithms-part2 - https://www.coursera.org/learn/cs-algorithms-theory-machines
More Courses
Udacity Design of Computer Programs
- https://www.udacity.com/course/cs101 became https://www.udacity.com/course/introduction-to-python--ud1110
- https://www.udacity.com/course/ud036
- https://www.udacity.com/course/cs212
-
https://www.udacity.com/course/cs313 Intro to Theoretical Computer Science
Udemy
Information and Models
MIT
- http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-050j-information-and-entropy-spring-2008/
- (also at https://itunes.apple.com/us/itunes-u/information-and-entropy/id424082281)
University of Michigan
Software Engineering
- https://www.coursera.org/course/security
- https://www.udacity.com/course/ud805
- https://www.udacity.com/course/cs258
Vanderbilt
Software patterns - https://www.dre.vanderbilt.edu/~schmidt/Coursera/spring-2013-posa.html - https://www.youtube.com/playlist?list=PLZ9NgFYEMxp6CHE-QQ040tlDILNcBqJnc - https://www.youtube.com/watch?v=2GZttnHChHo&list=PLZ9NgFYEMxp4ZsvD10uXmClGnukcu3Uff&index=13 (patterns)
Online Masters in CS
There are even now recognized, accredited Masters degrees in Computer Science: https://www.omscs.gatech.edu/
PRACTICE, PRACTICE, PRACTICE
- https://codingbat.com/python (beginner)
- https://www.hackerrank.com
- https://leetcode.com
- https://projecteuler.net
- http://acm.timus.ru
- http://www.spoj.com/problems/classical
- https://codeforces.com/problemset
- https://tour.golang.org Go for a static language to complement Python
- https://www.geeksforgeeks.org/javascript-tutorial/#basics
Interview Resources
- https://github.com/jwasham/coding-interview-university
- https://triplebyte.com/blog/how-to-pass-a-programming-interview
Things Often Not Covered By Universities
For some reasons the "ivory tower" does not include all of the nitty gritty practicalities required to actually ship and run software in the real world.
Here are some of those topics I wish were covered in the first year. (Hint: they also help immensely in being gainfully employed)
Version Control
The fundamental tool of managing change which was strangely ignored for a very long time in the short history of programming
- https://en.wikipedia.org/wiki/Version_control
- https://www.atlassian.com/git/tutorials/what-is-version-control
- https://betterexplained.com/articles/a-visual-guide-to-version-control
Quality and Testing
The practical answer to actually attempting to validate correctness in practice (rather than just logical proofs)
- https://en.wikipedia.org/wiki/Software_testing
- http://martinfowler.com/bliki/TestPyramid.html
- https://testing.googleblog.com/2015/04/just-say-no-to-more-end-to-end-tests.html
- http://www.se-radio.net/2015/04/episode-224-sven-johann-and-eberhard-wolff-on-technical-debt
Build and Continuous Integration
Automation as a solution to the shortage of developer time and the exponential increase in software and complexity
- https://en.wikipedia.org/wiki/Build_automation
- http://www.drdobbs.com/tools/a-build-system-for-complex-projects-part/218400678
- https://en.wikipedia.org/wiki/Continuous_integration
- https://www.thoughtworks.com/continuous-integration
- http://www.se-radio.net/2009/04/episode-133-continuous-integration-with-chris-read/
- https://news.ycombinator.com/item?id=15565875 (Write tests. Not too many. Mostly integration)
Performance and DevOps and Operations
With hardware having kept up with Moore's Law and "the cloud" providing so much elastic compute, performance is now often an afterthought. Additionally, how to quickly and efficiently deliver software has coalesced into the term DevOps.
The big idea being that software that is not actually running is not very valuable ;)
- https://en.wikipedia.org/wiki/Software_performance_testing
- http://jmeter.apache.org/
- https://www.atlassian.com/devops
- https://aws.amazon.com/devops/what-is-devops/
- http://www.se-radio.net/2015/02/episode-221-jez-humble-on-continuous-delivery/
I know it sounds crazy that Computer Science practitioners (or Developers) should sully their hands with "Operations" but to truly understand the problem domains watching the logs or responding to an outage can vastly change how we write code.
Importantly, seeing latency, traffic volume, and environmental issues makes us thankful when we do get back to the keyboard and can just focus on the theoretical aspects of a problem.