Einfache Fragen, auf die es viele Antworten gibt. Zunächst mal sind Programmiersprachen - genau so wie Mathematik - symbolische Sprachen. Sie helfen dir, komplexe Gedanken strukturiert zu erfassen, und sind nur das Werkzeug, mit dem du deine Denkprozesse niederschreibst.
Dementsprechend ist es wichtig, dass du viele Konzepte der Programmierung verstehst, dazu zählen hauptsächlich Algorithmen und Datenstrukturen (unter dem Begriff "Algorithmen und Datenstrukturen" findest du viel Videomaterial auf YouTube). Diese Konzepte bilden die Basis, sie helfen dir, kritisches, abstraktes und logisches Denken zu gewinnen. Um auf diesem Gebiet Erfahrung zu sammeln, gibt es viele kostenlose Aufgaben auf Seiten wie bspw. HackerRank oder LeetCode.
Solltest du mittlere, bis schwere Probleme mit Leichtigkeit lösen, solltest du ein kreatives Projekt beginnen. Was wolltest du schon immer mal programmieren? Eine Webseite? Einen Alexa-Skill? Such es dir aus. Es ist wichtig, schnell produktiv zu werden, denn nur wenn du reale Projekte programmierst, lernst du wichtige Eigenschaften einer Programmiersprache kennen. Konzepte wie die parallele Verarbeitung von Sequenzen oder asynchrone Benachrichtigungen sind sehr wichtig, lernt man aber oft nur, wenn sie zur Lösung eines bestehenden Problemes beitragen. Projekte sollten mithilfe einer Versionsverwaltung verwaltet werden (siehe Git).
Später dann, ist es wichtig, zu verstehen, wie man nachhaltig programmiert. Code muss wartbar, lesbar und erweiterbar sein (Clean Code). Ansonsten läufst du in das Problem, welches man "Big Ball Of Mud" bzw. auf einer tieferen Ebene "Spaghetticode" nennt. Eine chaotische Ansammlung von Codezeilen, wo das Beheben eines Problemes nur weitere verursacht und man den Überblick verliert.
Dafür muss man verstehen, wie Softwaresysteme aufgebaut sind, welche Architekturen es gibt und welche Charakteristiken diese besitzen (Sofware Architecture, Sofware Engineering).
Code wird später mit sogenannten Entwurfmustern (Design Patterns) strukturiert, welche abstrakte Ansätze für gelöste Probleme in der Objektorientierung bieten (falls es dich interessiert, kannst du dich auch mit Programmierparadigmen auseinandersetzen, es gibt nämlich nicht nur die objektorientierte Programmierung). Man kann auch ganze Teile eines Systems nur mit Diagrammen darstellen, ohne eine Zeile zu programmieren (UML).
Programmiersprachen gibt es allerhand, für das Lernen von Algorithmen bietet sich wahrscheinlich eher eine dynamisch typisierte Sprache wie Python oder JavaScript, für Projekte empfehle ich C, C++, C#, Java oder jegliche andere Sprache, die statische bzw. explizite Typisierung aufweist. Datentypen sollte man nie vernachlässigen.
Du merkst, das Themengebiet ist wirklich allumfassend, das bedeutet aber auch, dass es sehr viel Zeit beansprucht, bis du an den Punkt kommst, an dem du gute Software schreiben wirst. Du solltest dich auf keinen Fall von Frustration überwältigen lassen, auch wenn es oft so scheint, als ob man keinen Fortschritt machen würde. Ich wünsche dir viel Erfolg!
Ich habe versucht, so viele Fachbegriffe wie möglich einzubringen, damit man danach sofort googeln kann.