From time to time I read articles or tweets or watch talks from @hillelogram or @pressron or @sebmarkbage (in no particular order) and realize that those people have much deeper understanding. They are not stuck in one paradigm or one programming language, they can bring paradigms from different languages to current languages.
For example, @hillelogram talks about inheritance at the whole new level I used inheritance for many years, yet never thought about it from this angle, never questioned it. Or for example, @sebmarkbage brought the idea of algebraic effects to JavaScript, yes in limited form, yes only for React, yet this idea started to spread across different frameworks, and it is quite intuitive and powerful. Or for example, how @pressron explains that imperative paradigm has its pros (people typically prise functional paradigm and not often otherwise).
Even more, they not just understand it, but also able to make it accessible for others. They are able to explain it - which proves again dipper understanding.
Dr. Hoenikker used to say that any scientist who couldn't explain to an
eight-year-old what he was doing was a charlatanfrom Kurt Vonnegut's novel Cat's Cradle
I guess they have been exposed to many different programming paradigms, or maybe they studied some arcane, but very clever programming languages or they had pretty good CS education (not all degrees are the same).
Recently I stumbled on this quote:
If you don't know how compilers work, then you don't know how computers work.
-- Steve Yegge
And this made me think: are there specific topics in CS which will significantly improve understanding of CS in general? Should I write my own Lisp, or should I learn E programming language, or should I learn about branch prediction, should I read Types and Programming Languages or SICP, should I know answers to Entscheidungsproblem?
What are the most effective ways to gain real deep understanding? What is the required knowledge?
Photo by Samuel Zeller on Unsplash