A computer scientist is a person who has acquired the knowledge of computer science, the study of the theoretical foundations of information and computation and their application. Computer scientists typically work on the theoretical side of computer systems, as opposed to the hardware side on which computer engineers mainly focus (although there is overlap). Although computer scientists can also focus their work and research on specific areas (such as algorithm and data structure development and design, software engineering, information theory, database theory, computational complexity theory, numerical analysis, programming language theory, computer graphics, and computer vision), their foundation is the theoretical study of computing from which these other fields derive. A primary goal of computer scientists is to develop or validate models, often mathematical, to describe the properties of computer-based systems (processors, programs, computers interacting with people, computers interacting with other computers, etc.) with an overall objective of discovering designs that yield useful benefits (faster, smaller, cheaper, more precise, etc.).