HN Companion◀︎ back | HN Companion home | new | best | ask | show | jobs
Ask HN: Where to learn software engineering fundamentals?
10 points by mstank 1 day ago | 5 comments
I have an open question for software engineers out there:

As someone that has never studied CS but has written basic code most of my life (accelerated now with AI), where is the best place to learn software engineering fundamentals?



Difficult to give exact recommendations, but explore the materials left from the MOOC era, roughly 2012-2017, when high quality online education was provided for free. For example:

- https://ocw.mit.edu/courses/6-0001-introduction-to-computer-... (https://learn.mit.edu/courses/course-v1:MITxT+6.00.1x) and https://ocw.mit.edu/courses/6-0002-introduction-to-computati... (https://learn.mit.edu/courses/course-v1:MITxT+6.00.2x) which are introductions to thinking in terms of algorithms and to numerical analysis in Python. The code assignments with tests are still available, but I don't know whether they run standalone, and how much work they'll need to update them to newer Python

- https://www.edx.org/learn/coding/university-of-british-colum... and https://www.edx.org/learn/coding/university-of-british-colum... which is an introduction to functional programming where you build space invaders game (or at least that was the game you built in early runs of these courses) in Racket (Lisp/Scheme like language)

- https://computationstructures.org/ this course builds a CPU from the basic gates, and introduces many of the computer science topics. The site even has the lab simulations available, but I don't know whether they are still working

- https://learn.mit.edu/courses/course-v1:MITxT+18.01.1x https://learn.mit.edu/courses/course-v1:MITxT+18.01.2x mathematical analysis


One thing I would add to the excellent suggestions above is that it can be surprisingly useful to go one level below what is usually considered “software engineering fundamentals.” I teach mathematics students, and over the years I've become increasingly convinced that understanding some of the machine underneath makes many higher-level concepts much easier to understand later: memory and addresses, a simple CPU, assembly, calling conventions, and eventually how a compiler translates a programming language into something the machine can execute. There is a pedagogical principle I like: don't learn the solution before you know the problem. For example, pointers become much less mysterious once memory and addresses are concrete. Many programming-language features also make more sense once you have encountered the problems they are designed to solve. This is one reason I like the Computation Structures recommendation above. I've been experimenting with a similar bottom-up approach in an undergraduate course at Ulm University. We eventually go as far as writing a small compiler, and then rewriting a smaller version of it in its own language so that it becomes self-hosting. I've started putting the material in English here:

https://github.com/michael-lehn/not-abc


> when high quality online education was provided for free

Is it not still happening?


Not anymore. In the years 2012-2017 platforms like coursera or edx provided full courses for free, including graded assignments and exams, teaching assistants hours in the form of discussion forums, and even completion certificates.

From around 2017 these platforms started limiting free access, so now in most cases you can only see the lecture materials, with no access to assignments. From watching alone, learning is incomplete for many people.

In addition, many high quality courses (by MIT, Stanford, Berkeley, Caltech, etc.) disappeared from the coursera and edx platforms.