Programming for Engineers: A Foundational Approach to