En perfekt bok för just vad du söker är SICP, aka Structure And Interpretation of Computer Programs, aka Trollkarlsboken.
Boken behandlar områden som kan tänkas täckas av kurser som "Introduktion till datavetenskap", "Introduktion till programmering", "Introduktion till funktionell programmering", och "Programspråksteori". Den besvarar frågor som: Vad är egentligen programmering? Vad har ett programmeringsspråk för beståndsdelar? På hög nivå, hur tolkas kod av datorn? Vad är en funktion? Hur representerar man repetition mha rekursion och iteration? Hur identifierar man mönster i kod, och använder funktioner för att bygga upp abstraktioner för att göra kod mer lättläst och kraftfull? Vad är en algoritm? Vad är det som avgör om en algoritm/funktion är snabb eller långsam? Vad är en högre-ordningens funktion? Vad är en datastruktur? Hur kan man implementera en lista, ett träd? Hur fungerar ett programmeringsspråk egentligen? Hur kan man skriva sitt eget programmeringsspråk? Vad är skillnaden på lat och strikt evaluering? Och mycket mer.
Den första upplagan är från 1985, och med tiden har boken fått något av en kult-status. Den används på flera universitet i kurser för just generell introduktion till programmering och datavetenskap. Bl.a. så användes den framtill nyligen på MIT. Den använder ett simpelt och kraftfullt språk som heter Scheme. Scheme används så att boken inte behöver ägna en massa kapitel på att lära dig massa syntax och features för ett specifikt språk, utan istället fokusera på mer generella lärdomar som applicerar i nästa vilket som helst av senare "verkliga" språk du lär dig, som Java, C++, Python, Haskell, etc.
Jag tycker mycket om den här boken, och det var en av de första jag lästa när jag lärde mig programmera. Hela boken finns tillgänglig online, gratis på MITs egna hemsida.