Software engineers design and develop many types of software, including computer games, business applications, operating systems, network control systems, and middleware. They must be experts in the theory of computing systems, the structure of software, and the nature and limitations of hardware to ensure that the underlying systems will work properly. This is different from computer hardware engineers, who develop computer systems and components, like processors, circuit boards, memory devices and networks.