Metaphors and Analogies in Programming: Their Power and Limitations