As user @red_car recently commented
There is an irresolvable tension between the poles of highly abstracted code that hides the all details and the elementary basic elements of C++ .
You can't have both at the same time:
easy & quickly to apply code that a beginner can adapt to her/his needs within half an hour
a there is an irresolvable tension between the poles of highly abstracted code that hides the details and the elementary basic elements of C++
A very deep understanding of the C++ programming language
This means there is very finely granulated almost continuum between these two poles where a tutorial can be settled to explain all and everything down to the ground or just explain the surface.
My understanding of the Arduino-project is:
at least at the beginning the intention was: make it easier to use microcontrollers for people who don't know anything about microcontrollers yet. Give them an opportunity to learn a rather small package of knowledge to enable using microcontrollers for small projects or art.
IMHO the arduino-project drifted away from this intention. I'm just stating it. I'm not judging this.
For applying some basic functionalities it is enough to explain the surface. If somebody wants to dive deeper into it; all doors are opened as arduino is an opensource project.
For libraries it is commonly accepted that they are there and that you are just using them
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET 4 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3D ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
as far as I my experience with the forum is: nobody ever claimed "oh! before using these libraries you must learn all the inner details of SPI.h, wire.h etc.. etc.
What is the categorial difference between using these libraries ithout explaining the details and using functions without explaining the details?
To me there is no difference at all. Sure always better to know more details down to how and when does the compiler optimise something in this or that way and what are the consequences out of this optimisation.
But it is not nescessary. If there should really occur a problem the beginner then has a reason to ask.
Forcing all beginners "You have to learn all these details before you can go beyond uploading ready to use binaries IMHO is a bad approach.
A famous example for this "You have to learn this grade of details and this complexity of code before you can apply this kind of functionality"
Is the blink without delay example-code.
IMHO: forcing the user to accept certain kind of programming style that is medium hard to understand for beginners.
Each new beginner-question about how to use millis() is a new evidence that this blink without delay-example is difficult to understand. Almost all of these questions have a general character. I have rarely seen a question about a certain detail.
So my point of view is:
hide away most of the details to make it easy to apply is OK. It is only a gradual difference.
To not explain things like "passing by reference" using the "&"-operator is just the same as not explaining "make sure to keep array-indeing within the defined boundaries".
And still it can be explained demonstrated on an example-code that does it wrong and demonstrates what will happen.
But just repeating posting a link to the blink without understand... ehm sorry blink without delay example is not the worst way but is far away of beeing optimal.
best regards Stefan