Sehe ich genauso. Gibt vollkommen zurecht auch zahlreiche YouTube-Videos darüber ("how to escape the tutorial hell/trap").
TL;DR: Grundlagen lernt man durch Tutorials, aber eigenständiges Programmieren erfordert Übung. Übung macht den Meister! Code-Challenge-Webseiten und Praxisprojekte können helfen. Bei Tutorials selbst aktiv mitmachen, ggf. Notizen machen. Tutorials sollen dir im Wesentlichen eine Idee geben, wie man gewisse Dinge angehen und umsetzen kann, damit du später darauf gestützt eventuell deine eigene Lösung findest. Richtig Programmieren lernst du aber nur durch wiederholte Übung. Selbstständiges Problemlösen ist dabei entscheidend. Erst zum Schluss sollte man Frameworks und Bibliotheken angehen und dabei auch die Dokumentation nicht außen vor lassen.
Tutorials sind super für die Grundlagen bzw. um sich mit verschiedenen Themen und Arbeitsweisen vertraut zu machen.
Wie du aber letztendlich lernst, auf dich allein gestellt Code zu schreiben bzw. Projekte umzusetzen, ist ausschließlich durch Übung, Übung und nochmal Übung.
Tutorials sorgen für ein gewisses Exposure bzw. Awareness zu bestimmten Themen und Umsetzungsmöglichkeiten; Übung und selbst Projekte umzusetzen, erlaubt es dir, tatsächlich zu lernen, wie du programmierst, ohne einfach stupide Anweisungen von anderen zu befolgen und eine Codezeile nach der anderen abzutippen.
Selbst bei einfachen Grundlagen-Tutorials bietet es sich an, einfach mal den Editor/die IDE zu öffnen und ein bisschen mit dem Gelernten rumzuspielen und verschiedene Dinge auszuprobieren, damit sich das Ganze besser festigt und du ein Gefühl für die Funktionsweise erhältst.
Was auch noch helfen kann, sind verschiedene Code-Challenge-Webseiten. Hier werden zwar weniger realistische Projekte aus der realen Welt umgesetzt, dafür lernst du aber, ein gegebenes Problem in kleine Teile herunterzubrechen und dieses dann mittels Code Schritt für Schritt zu lösen.
Gleichzeitig fördert dies deinen Umgang sowie dein Wissen über die jeweilige Programmiersprache.
Der Fokus liegt allerdings i.d.R. auf Algorithmen und Datenstrukturen sowie teils abstrakten Aufgaben, die du in der Realität meist nicht selbst umsetzen müsstest, da es bestehende Implementierungen, Libraries usw. für häufige Aufgaben wie Sortierung, Filterung und sonstige Arbeit mit Daten aller Art gibt.
Trotzdem kannst du da aber sicher einiges mitnehmen, wenn du mit größeren Aufgaben überfordert bist und überhaupt nicht weißt, wo du anfangen sollst. Allzu sehr sollte man sich darauf aber auch nicht konzentrieren, da diese Challenges im Grunde einen ganz speziellen, separaten Skill trainieren und relativ wenig mit Programmierung in der Realität zu tun haben.
Als Beimischung schadet es aber definitiv nicht, um sein analytisches/logisches Denken zu trainieren und im Umgang mit einer Sprache fitter zu werden.
Darüber hinaus gibt es dann natürlich noch Tutorials oder auch Challenges, die sich mehr auf die praktische Umsetzung von ausgewählten Projekten konzentrieren. Das schon genannte Beispiel To-Do-App, teils gibt es aber auch deutlich ausführlichere und anspruchsvollere Sachen, die dann fast schon professionelle Softwareentwicklung widerspiegeln.
Wichtig ist hier aber immer: Nicht einfach nur angucken und abhaken, sondern auch selbst machen.
Je nach Lerntyp kann man sich das Ganze ja einmal im Ganzen angucken und dann selbst ohne Anleitung drauf los programmieren und/oder Schritt für Schritt mit dem Tutorial voranzuschreiten und alle paar Minuten zu pausieren und es dann selbst probieren.
Wenn man dann fertig ist, kann es auch hilfreich sein, dann mal selbst auf eigene Faust ein Feature zu erweitern bzw. die entstandene App auszubauen, ohne dass man hierfür eine Vorlage hat.
Eventuell hilft es bei Tutorials auch, sich Notizen über die groben Arbeitsschritte zu machen und davon ausgehend es dann selbst zu probieren. Wenn man nicht weiter kommt, kann man immer noch das Tutorial für den konkreten Code zu Rate ziehen. Erstmal würde ich dann aber tatsächlich auch versuchen, mal selbst zu überlegen und ggf. Google nach Lösungen zu bestimmten Teilaufgaben zu befragen.
Das ist letztendlich nämlich auch sehr wichtig, dass man fähig ist zu begreifen, welche Teilaufgaben erforderlich sind, um ein bestimmtes Feature umzusetzen, und dann auch selbst recherchieren kann, wie man bspw. ein Array sortiert oder eine bestimmte Ausgabe auf dem Bildschirm erreicht oder was auch immer.
Wenn man dann irgendwann soweit ist, dass man einfache Projekte selbst mit den Mitteln der Programmiersprache umsetzen kann, ist der nächste Schritt, sich Frameworks und Libraries anzuschauen, die man in der professionellen Entwicklung einsetzen würde.
Hier würde ich auf jeden Fall auch das gleiche Prinzip anwenden: Möglichst viel selbst ausprobieren und umsetzen. Nicht nur Tutorials schauen und vor allen Dingen auch die Dokumentation des jeweiligen Frameworks oder der Bibliothek lesen. Nicht unbedingt in der Fülle studieren, aber die Grundlagen eines Frameworks bspw., wie und warum man das einsetzt, sollte man schon mal gelesen haben. So kann man dann später auch besser unterscheiden, was vielleicht spezifisch ein Problem eines Frameworks ist und was eher mit der Sprache/der Syntax oder ähnliches zu tun hat. Nicht selten versuchen Neulinge, direkt bestimmte Frameworks einzusetzen, weil sie überall davon hören, scheitern aber dann daran, weil sie die Grundlagen nicht drauf haben oder nicht wissen, was im Kontext woher kommt und Framework und Sprache sowie andere Tools und Bestandteile nicht voneinander trennen können.