Typically, graduate students in science and engineering (with the exception of computer science) enter graduate school with limited software skills – mainly programming in interpreted environments, such as MatLab. While these environments are quite useful for small-scale problems, they are not the best platform for building large software systems, particularly for high-performance computers. In this talk, I will give an overview of a course that Brian Van Straalen and I have developed at Berkeley intended to provide the basic software skills required to work effectively at this level. The areas that we cover in this course include: (i) Introduction to C++ class design; (ii) algorithms and data structures; (iii) the “plumbing” for large software projects, e.g. build systems, revision control, and debugging; and (iv) a smattering of information on how the hardware works. A recurring theme in this course are the seven “motifs” (Colella, 2004) that arise in scientific and engineering simulation.