Edit: Provide pointers to where others can learn about those concepts
The gist of it: you program procedurally without thinking too much about the code and only add "compressions" when the need for them arises. The compressions can take various forms like encapsulating data types within objects, behaviour within functions, extracting often-repeated operations into separate libraries and then loading and referencing them when needed, etc.
Typed arguments as strong pre requirements to intent, and the cost/benefit of typechecks.
What do I actually do? Boring imperative python3.
I wish I'd learned LISP as my first language. It was literally a left door right door choice to do Fortran on cards, and then Pascal. Two people teaching the induction classes. I went through the Fortran->Pascal door.
If I'd turned left, I would have entered the other cohort who started with LISP.
Thinking of the stupidest way we can get it done and then ruthlessly refactoring until the resulting algorithm / system is as simple as possible.
Edit: point 1 comes from A Philosophy of Software Design. One of my fave programming books of all time.
This is a profound insight. It totally changed how I think about the nature of multithreaded and multiprocessor based programming.
Also from Kevlin - Refactoring to immutability[2], which showed me exactly why you would want immutable "variables"
Procedural is fine and simple and it works. You can refactor later if you have the time and money.
Related listening/watching: Jonathan Blow.
2. linters like eslint forces best practices and readability in my code
3. security is learnable from online sources like latacora blog and owasp cheatsheets
4. reading latest docs and github issues helps a lot in debugging.
5. reading readme file and getting started guides is more reliable than watching video tutorials.
6. videos however are good at getting comparisons and seeig presentations of ideal use cases of particular tool software or database or framework
I now think much more about immutable, append-only data stores as a result.
Instead of :
If foo then
bar
Else
baz
Endif
Now I write: If foo then
bar
return
Endif
baz
Exit early makes the code easier to read and understand
Technically 2 concepts but they’re highly related.
Basically, allow the consumer of a component to pass in something, rather than the component needing to contain that logic.
It’s great for front end systems, but also apples to backend and general systems programming… an invaluable concept
Basically, it boils down to this: F(A . B) = F(A) + F(B)
(F,A,B, ., +) could be anything which you found suitable.