What is software engineering
What is software engineering?
Software engineering is the systematic approach to creating software that uses empirical, evidence-based social and practical knowledge to invent, innovate, design, build, maintain, research, and improve software.
Definitions of software engineering generally refer to systematic, develop/implement, scale and quality.
Software engineering is the application of engineering to the development of software in a systematic method. –Wikipedia
The application of a systematic, disciplined, quantifiable approach to the development, operation, and maintenance of software; that is, the application of engineering to software. –IEEE
Software engineering is concerned with developing and maintaining software systems that behave reliably and efficiently, are affordable to develop and maintain, and satisfy all the requirements that customers have defined for them. –ACM
A branch of computer science that deals with the design, implementation, and maintenance of complex computer programs. –Merriam-Webster
Contrast with bespoke approach
While it is perfectly normal and common for an individual software developer or a small team to work in an idiosyncratic style and a unique approach to every project, this becomes more expensive as a project becomes bigger and more people become involved. As with most disciplines, it becomes almost inescapable for a developer to come to the realization that many projects follow a common set of phases, share a common set of challenges, and that development consist of a common set of tasks.
Software engineers attempt to streamline development of software projects such that they reference known norms, best-practices, standards, and patterns shared by many in the field. This makes it easier for new developers to understand how a project works, and make large projects more easily broken down into known types of common sub-problems whose solutions are well-known.
Inclusion of DevOps
As a result of many of the required tasks of building quality software being repetitive and formulaic, much of software engineering has become automated. A relatively new sub-discipline known as Development Operations (DevOps) is focused almost exclusively on automating many of the tasks of software engineering. This is now the norm in large-scale software development environments, and basic DevOps skills should be considered a part of every Software Engineer's training.
Breadth versus depth
Given the seemingly unlimited variation in software domains, from mobile operating systems to printer drivers and virtual communities, from cryptocurrencies to functional magnetic resonance imaging (fMRI) machine interfaces, most software engineers share a common set of high-level processes, but implement them with tools and practices specific to the type of software they are creating. A well-trained software engineer will thus understand the common processes and challenges of software making in general, while being master of tools and practices appropriate to at least one specific domain.
People who practice some or all common software engineering roles may hold a wide variety of different titles:
- Software engineer
- Software architect
- Requirements engineer
- Testing engineer
- ... and many more
From the perspective of this writer, there is no clear differentiation among these terms in industry - titles depend more upon the culture of the organization than on the actual practices of a job. A quick look around will quickly convince you that there are many differing and conflicting opinions on this matter.