in reply to Appropriate amount of abstraction
If your primary concern is "getting it done", using a high level of abstraction (for instance, Class::DBI rather than plain DBI and hand-written utility functions) will probably result in cleaner, more easily maintained code... as long as the abstraction you pick is the right one. On the other hand, if you're more interested in learning how something works, thick layers of abstraction can get in your way.
From a pedagogical standpoint, I don't know whether it's better to start by teaching a high level of abstraction and moving to lower and lower levels, or to start with the low-level basics and build on those.
Yours in pedantry,
"Anything you put in comments is not tested and easily goes out of date." -- tye