I am a CS student. When I first came to school, I thought that programming was to make a software. Now I found I was wrong. Now I want to know what the difference is, and what is the difference between a programmer and a software engineer. I hope people can give me some advice. (forgive my broken English)
Expanding Pradhyuman's answer. From Wikipedia:
Software Engineering can be divided into ten subdisciplines that correspond to distinct phases of the software development process. They are:
- Software requirements: The elicitation, analysis, specification, and validation of requirements for software.
- Software design: The process of defining the architecture, components, interfaces, and other characteristics of a system or component. It is also defined as the result of that process.
- Software construction: The detailed creation of working, meaningful software through a combination of coding, verification, unit testing, integration testing, and debugging.
- Software testing: The dynamic verification of the behavior of a program on a finite set of test cases, suitably selected from the usually infinite executions domain, against the expected behavior.
- Software maintenance: The totality of activities required to provide cost-effective support to software.
- Software configuration management: The identification of the configuration of a system at distinct points in time for the purpose of systematically controlling changes to the configuration, and maintaining the integrity and traceability of the configuration throughout the system life cycle.
- Software engineering management: The application of management activities—planning, coordinating, measuring, monitoring, controlling, and reporting—to ensure that the development and maintenance of software is systematic, disciplined, and quantified.
- Software engineering process: The definition, implementation, assessment, measurement, management, change, and improvement of the software life cycle process itself.
- Software engineering tools and methods: The computer-based tools that are intended to assist the software life cycle processes, see Computer Aided Software Engineering, and the methods which impose structure on the software engineering activity with the goal of making the activity systematic and ultimately more likely to be successful.
- Software quality: The degree to which a set of inherent characteristics fulfills requirements.
As you can see, programmers are mainly required for software construction and maintenance.
A software engineer should have strong knowledges of all the software development phases and should be a good programmer, too (actually most programmers employed in big companies are engineers :-).
Obviously for small software projects some phases may overlap (or may be ignored) and programmers may be involved directly in many of them. For large software projects (like an operating system) there can be hundreds (thousands) of software engineers and programmers involved.
1) A "program" is a kind of "software". "Software" is a somewhat broader concept than just "a program".
2) Here's a good definition of software:
3) You can find other definitions, and they may or may not agree precisely with this one.
But I like this part of the definition:
Software is created with programming languages and related utilities
This implies that, depending on how broadly you define "software" and how specifically you define "programming languages", you should be able to "create software" without necessarily knowing a programming language or using a compiler.
This is purely an accidental property of the English lexicon.
In French and other languages, software is apparently a countable noun. In English, it is not: you cannot not say a software any more than you can say a hardware or a garbage. You say a program instead.
For the difference between programmer and s/w engineer check out this history. It says, "many practitioners called themselves software engineers to escape the stigma attached to the word programmer".
As for the question in the title, there is no difference. Both mean a set of instructions to a computer/computer's processor. You can find this too on Wikipedia.