Modeling Software Behavior: A Craftsman's Approach