What I have trouble (or at least I think I have trouble with) is the actual design and architecture of programs, like how would you go about deciding what classes and functions to make, and how to go about writing code that's clean and extensible without being too verbose.
What you pointed out does ring true to me in that code is easy to write, but good code isn't always so easy.
You may want to take a look to SOLID principles and GRASP patterns.
I highly recommend Sandi Metz's book Practical Object Oriented Design in Ruby (aka POODR). (The choice of Ruby is not essential to the content.) It deals with exactly the themes you ask, and gives ways to think about such decisions. The central criterion guiding the book is not "how to write perfect code you can set in stone and never change", but "how to write code that will be easiest to evolve".
The book is surprisingly concise but very clear. I've been programming for ~2 decades, and still it was interesting & refreshing to read.
She has many lectures online if you want to sample her style.
That sounds like exactly what I need, thanks! I'll check it out soon.
Also, do you know any analogs to this for functional programming?
We're a place where coders share, stay up-to-date and grow their careers.
We strive for transparency and don't collect excess data.