Computer Science Principles for Practicing Engineers
Course discipline: Computer Science
Units 12 units
Lecture/Lab/Rep hours/week Lecture (3h/w), lab(1.5h/w), rec(1h/w)
Semester/year offered (fall/spring, even/odd years) fall semester
Pre-requisites some experience in writing software
Many organizations today are incorporating computer hardware and software into the products that they design and build. Most of these organizations’ primary competencies are not computer science or software engineering, but rather they find that automation makes their products smarter, more capable, and more appealing in the market place. Because deep domain knowledge is needed to build these products, these organizations often hire engineers from traditional engineering disciplines to design and build the product platform, in many cases requiring them to write software to make the product actually work. These are capable engineers from many disciplines other than software engineering and unfortunately they usually learn software engineering on the job. This process typically involves considerable trial and error and often results in poorly designed and documented systems, defect laden software, bloated product development costs, unmaintainable software, and missed opportunities to leverage software development investments. In addition to developing mere functionality, some application domains are often highly constrained and unforgiving in their quality attribute needs such as performance, safety, and availability. These systems intimately depend upon software to provide these capabilities in addition to basic functionality. Designing software intensive systems with these properties in a cost-effective way requires first-class computer science and software engineering expertise. While many practicing engineers often have many years of industrial experience writing software applications, many lack a formal background in computer science principles. These engineers may have had a few courses or technical training in specific computer languages or technologies, but in general they often lack formal training in algorithms, computing theory, data structures, and design among other key topics. The result is that many of these engineers are not fully realizing their potential as software engineers. This course is designed to bridge these gaps in formal computer science training.
The primary objective of the course is to provide engineers without formal training in computer science, a solid background in the key principles of computer science. The key purpose of this course is to complement the experience that engineers may already have in writing software with formal computer science underpinnings, making those engineers more capable in developing software intensive systems. Specific learning objectives include:
- Preparing students for immediate competency so that course material can be directly applied in real world situations
- Improving the student’s ability to recognize and analyze critical computational problems in the course of their work, generate alternative solutions to problems, and judge among them
- Enabling students to better understand, analyze, and characterize those factors that influence algorithmic computational performance and memory consumption
- Increasing student’s awareness and understanding of detailed code structures and their underlying strengths and weaknesses
- Improve the student’s ability to performed detailed, code-level design and document the design in an understandable way.