I started programming before I learned algebra, and was a couple years ahead of the class because solving algebra problems was just "running the computer" as I used to call evaluating code in my head.  Substitution was just expanding an inline function (at the time i thought of it like copy+pasting the gosub...)<p>I think that abstract symbol manipulation within a set of constraints facilitates skill transfer between math and programming.  Learning to see paterns, to perform abstractions of statements for simplification, to construct something larger out of component parts bottom-up (like simple proofs,) these are all useful skills in both.