Carnegie Mellon University

17-643 Hardware for Software Engineers

Hardware for Software Engineers is a 12 unit full semester course.

In modern software engineering and computer science curricula, large, net-centric application development dominates the classroom. Topics in networking, security, transaction processing, n-tiered systems, and so forth are focus topics in many courses. While important topics, this leaves huge software markets underserved - particularly the embedded software domain. In these domains, a working knowledge of hardware is very useful for software engineers. Unfortunately, most undergraduate computer organization courses are too high level to be useful. As a result, organizations building embedded software intensive systems often hire hardware savvy engineers and teach them software engineering on the job. Fraught with trial and error, this can result in poorly designed, defect laden software. A lack of software engineering expertise can result in missed opportunities for reducing development and long-term lifecycle costs. The goal of this course is to provide an understanding of electronics beyond the average computer organization course to enable software engineers to be more effective in domains where software and hardware are closely coupled. Examples of these domains include robotics, avionics, automotive, process control, and many others.

More course details can be found in the Hardware for Software Engineers syllabus.

After completing this course, students will:

  • be able to read and interpret basic circuit diagrams and schematics;
  • be capable of differentiating between general and special purpose CPU architectures, and be able to discuss various features in embedded controllers;
  • understand sensing concepts and specific techniques for selecting and interfacing CPUs with sensors;
  • appreciate control system design, key concepts and principles in signal processing, and field programmable gate array technology;
  • better appreciate the hardware environment, understand the subtle regions where software and hardware meet, and more effectively communicate with hardware-oriented engineers.


  • Students should NOT have a hardware background. They should, however, have a solid computer science background including: languages, data structures, discrete math, operating systems, and computer organization.
  • It is highly desirable for students to have project experience - preferably real-world experience. However, project course work or internships will suffice. Undergraduates need instructor approval (