Modeling Software Behavior (A Craftsman's Approach)