まず電子回路に親しみます(は?)
トランジスタを知り、増幅作用とスイッチングへの利用を知ると、論理回路素子、特に AND/OR/NOT などがわかるようになるので、論理回路を勉強します
そのうち記憶回路とかクロック同期とか整数演算とかがわかるようになるので、コンピュータの仕組み(主記憶、入出力デバイス、 CPU 、など)を簡単に学んで C 言語を触ります
メモリや論理回路がわかっていると、手続き型的に書いた C のコードが機械語列に翻訳されて CPU がレジスタとメモリを弄りながら動くのがわかるので、そのまま今度は構造化プログラミングの概念を習得します。ポインタにも特には苦労しないはずです(この段階では)。
そのうちオブジェクトの内容によって動的に挙動を変えたくなるかもしれません。
最初は enum と union と struct と switch-case で静的に実現しますが、そのうち関数テーブルを構造体に突っ込むようになります。
或いは、libz だか liblzma だかその辺りの有名ライブラリで、関数テーブルに値を設定することを要求されたりもします
また、データ構造をいろいろな型に対して実装したくなるかもしれません。
この辺りが C++ に手を出すいい機会です。
最初は素朴な template と class 、そのうち仮想関数や継承や STL を使って慣れていきましょう。
C で関数テーブルや擬似的な動的型を書いたことがあれば、そこまで理解に苦しむことはないはずです(多重継承周辺を除く)
そのうち template では足りないコンパイル時計算や型による条件判定をしたくなるかもしれません。 type_traits などを使った TMP に手を出してみましょう。将来的に実装されるはずの concept や Rust の trait bound の理解に役立つはずです
それはそれとして、λ計算をやりましょう(唐突)
λ計算はコンピュータにおけるアルゴリズム的な概念を、数式のような「式の簡約を進める」ことのできるタイプの記号列で表現できる、スゲーやつです。コンピュータ方面だけでなく、数学方面から興味を持つこともできます
λ計算に慣れてきたら、 Scheme とかその辺りをやります。 cons セルによるデータ構造の実現とかはλ計算の段階でいじることも弄ることもできますが、実用するなら Scheme の方が楽なので、(純粋ではないけど)関数型言語でのアルゴリズムの実装方法の理解が捗ります
慣れてきたら C++ に戻るとあら不思議、ただの匿名関数にしか見えなかった lambda の使い方がわかるようになっています
この頃には js とか Java とか近い言語はひととおり「ちょっと勉強すればとりあえずどうにかできる」段階になっているので、気の向くままにやりましょう
あとは C++ の細かい仕様がだんだん気になってきて型推論とか未定義動作とかいろいろな概念が勝手に目につくようになります。
C++ に懲りたら Rust をやりましょう