As you are yet not so experienced you should not mix-up delay() and millis().
Understanding non-blocking timing and how to avoid each and every delay() requires more than just looking at the classical blink without delay-demo-code.
After having understood the real nature of non-blocking coding you wil RE-recognise the principle inside the blink-without-delay-example. In short "BWD"
But IMHO only looking at the BWD-example makes it hard to understand the fundamental difference between delay-ing and non-blocking-coding.
It is not just a matter of 20 minutes playing around with the BWD-example.
Depending on your talent and how long you want to learn on it per day
it is realistic to estimate learning the basics of non-blocking coding will take some hours or maybe some days.
Me myself I haven't found a textbased online tutorial that would explain it all in a way that
with judging with my personal criteria I would say "very well explained"
Some parts are epxlained in two tutorials I have written.
This is about non-blocking timing
This is about state-machines (written by me though not in the quality that I myself would say all details explained in sufficient deepness)
I have some ideas how to give the overview about non-blocking-coding = multitasking without an RTOS but not yet written.
best regards Stefan