Interesting! This same problem occurs in calculus as well. Leibniz's notation is pretty offensive, for example: in basic calculus, d/dx is an operator. In differential equations, you suddenly begin treating dx as a separable algebraic term — and way too many teachers suck at explaining why this is suddenly permissible.
I recommend Elementary Calculus: An Infinitesimal Approach to those interested in calculus. It treats dx as a term from the start, and matches my (and I suspect most people's) intuition of the subject much better than epsilon-delta. And it is actually completely rigorous, not hand-waving infinitesimals.
My high school has a relatively progressive math program, and we never learned d/dx as a function. We began calculus with limits, then started solving Lim[dx->0](dy/dx), then we started using d/dx as a shorthand so we did not need to pull a nested expression out to take its derivative. I never thought to think of d/dx as a function until I started doing functional programming.