Scientists measure their results against nature. Engineers measure their results against human needs. Programmers ... don't measure their results. As a final overarching deep principle, we need to teach students to constantly measure their results against the end-user experience. Anyone can build a Web service. The services that are successful and have impact are those whose data model and page flow permit the users to accomplish their tasks with a minimum of time and confusion.
We are hoping to teach some of the more important skills of an experienced engineer, notably rapid application development and dealing with extreme requirements.
What deep principles do they need to learn?
object-oriented design where each object is a Web service (distributed computing)
about concurrency and transactions
how to build a stateful user experience on top of stateless protocols
about the relational database management system
We'd like our students to be able to take vague and ambitious specifications and turn them into a system design that can be built and launched within a few months, with the most important-to-users and easy-to-develop features built first and the difficult bells and whistles deferred to a second version. We'd like our students to know how to test prototypes with end-users and refine their application design once or twice within even a three-month project. (Greenspun)