Determines computer user needs, advises hardware designers on machine characteristics that affect software systems such as storage capacity, processing speed, and inputoutput requirements, designs and develops compilers and assemblers, utility programs, and operating systems