あまりも当たり前過ぎて21世紀に入ってから言葉にだしたことはあまりないのですが、当然のことながら、プログラムというのは、マシン語を理解したからって「書ける」ものではないのです。
プログラムが書ける、という状態は「物事の仕組みを抽象化する」という状態の延長線上にあるべきで、それを理解していないということは仕組みを理解していない、つまりプログラムを理解していないのとほぼ同じだと思います。
最近はLLと呼ばれる、いわゆる軽量スクリプト言語がメインになってきていますし、僕も普段はRubyでプログラムを書くことが増えてきましたが、このおかげでますます、コンピュータというのはマシン語で動くものではあるが、プログラムはマシン語というバッドノウハウの塊から脱却して、やりたいことそのものを表現できるようになったと思いを強くしています。
その意識がないと、たとえRubyやJavaScriptのコードを書いていても、不可解な動きをしたり、あとから自分や他人がコードを見直したときに「なぜこんな風に書いたんだろう?」ということがピンとこないことになります。
まだ大学に入って無くて、趣味のプログラミングを楽しんでいる若い人たちには、ぜひアルゴリズムとデータ構造を勉強してみることを勧めます。
最近は素晴らしい時代になったもので、ごく初歩的なアルゴリズムとデータ構造は言語の標準ライブラリでも使うことができます。
しかし本格的にこれらで遊びたくなったら、内部実装を読んだりポインタだけで書いてみるのがお勧めです。
(中略)
さらにいえば、これらのさらに下のレイヤーである数学を理解しているとさらに理想的です。
最後に参考文献をまとめておきます。
ただ読むだけでもとても面白い本ばかりです。
・SICP
・解析概論