Source: https://web.stanford.edu/~ashishg/cs261/win21/notes/10steps.pdf