Software Engineering Practice

People who create computer software practice the art or craft or discipline that is software engineering. But what is software engineering “practice”? in a generic sense, practice is a collection of concepts, principles, methods, and tools that a software engineer calls upon on a daily basis. Practice allows managers to manage software projects and software engineers to build computer programs. Practice populates a software process model with the necessary technical and management how-to’s to get the job done. Practice transforms a haphazard unfocused approach into something that is more organized, more effective, and more likely to achieve success.

Core principles
The dictionary defines the word principle as “an important underlying law or assumption required in a system of thought” throughout this book we discuss principles at many different levels of abstraction. Some focus on software engineering as a whole, others consider a specific generic framework activity (e.g., customer communication), and still others focus on software engineering actions (e.g., architectural design) or technical tasks (e.g., write a usage scenario). Regardless of their level of focus, principles help us establish a mind set for solid software engineering practice. They are important for that reason.

First principle: the reason it all exists

A software system exists for one reason: to provide value to its users. All decisions should be made with this in mind. Before specifying a system requirement, before nothing a piece of system functionality, before determining the hardware platforms or development processes, ask yourself questions such as: does this add real value to the system? If the answer is no, don’t do it. All other principles support this one.

Why a Career As a Software Engineer is Not Sound

I believe the value (or pay) of a person in the market is defined by the following factors:
1) innate qualities
2) knowledge & experience
3) people skills & network

Innate qualities are born with, including appearance, intelligence, personality, etc. And educational background, academic performance, etc, are closely related with one’s innate qualities. But since it’s almost impossible to improve this aspect, it’s useless to say too much about it.

Knowledge & experience, people skills & network are the two aspects that differentiates people’s value (pay). However, a career in IT excels in neither fields on the long term.

The following are my reasons. Now and then, I will refer to the three factors mentioned above.

1 IT is a fast-changing industry by its nature, so in most domains of technology, knowledge is hard to accumulate steadily. A 20-year software engineer is likely the same as a 10-year software engineer in terms of knowledge (but inferior in terms of energy level).

1.1 Some might argue that a good software accumulates a set of knowledge (such as desgin patterns, algorithms, debugging experience) that survives the fast-changing industry, but the fact is that these account only for a very small portion of knowledge required for real projects.

1.2 Also, some might argue that there are domains of technology that changes slower, such as system-level programming (compiler, OS). This is true, and one might be lucky enough to accumulate a huge amount of expertise. But the risk of such a career is still high. Since one is very deep into one technology, once the technology is out-of-date the penalty is severe. This is the nature of technology, it will be out-of-date sooner than many other things such as people skills & network.

1.3 Well, going deep in one technology is risky, then what about going wide in many technologies as a generalist engineer? But rarely are there any projects need such kind of people instead of experts of each individual domain of technology.

2 In addition to the fast-changing nature of the IT industry, limited personal influence also contributes to the low ceiling of the career. A good engineer cannot directly make other people on the team better software engineers, while a good manager can directly make the whole team, divsion, or even the company succeed. With many other careers such as sales, surgeons, traders, the vital difference is that sales, surgeons, traders play a greater role as an individual, while a software project requires a team of 30 to 3000 people.

2.1 Moreover, sales, surgeons, traders also deal with people, that makes them potential people managers in future, while software engineers deal with technology which hardly leads them to people management roles. In fact, most senior managers in IT are not previous software engineers. The point is that software engineers accumulate little in terms of people skills & network.

3 The IT industry is also infamous for its locations. Since the nature of the career requires little interaction with customers, software engineers often have to work in remote locations with lower rent or undeveloped districts with lower pay. The suburban sci-tech parks in China and the outsourcing trend in the U.S. are respective evidence of such claim.

4 Software engineers are not very much respected. The reason could be comprehensive. I personally believe that it is closely related with the low pay growth.

The Software Engineer Today

Who is the programmer today?

If we ask somebody in the street “Who is the programmer?”, what does he or she answer? I believe something like “A person who sits behind the computer and creates program code” or “A person who programs actually! What a stupid question?”. Not everyone exactly understand that successful software development requires many different activities besides code construction. The approach that includes all such activities is called Software Engineering. Let’s see the important stages, that all together form software engineering.

1) Requirements.When a project starts, we have to elicit requirements for it, thoroughly handle them and create the document that is known as Software Requirements Specification. Requirement specialists start collecting requirements in the very beginning of the project and update them until the projects is ended to keep them relevant and correct mistakes that occurred during the implementation. Software Requirements Specification is a result of this process. The document contains information obtained from users, technical standards, and business rules and other.

2) Design. The other important activity is design. It includes overall planning of the project, building models and prototypes. Software Engineering standards distinguish two separate activities within the design stage: software architectural design and software detailed design. The first one is planning of the whole system, when the second one is more thorough planning of its components.

3) Construction. The next activity is actually code construction. Most people consider this thing as programming. Engineers create program code using different programming languages and software construction tools that dramatically improve the speed of the process.

4) Testing. When the code is created software engineers must test them. Testing is an activity of product quality assessment and improvement. This stage is often performed by a separate team of testers. It also can be outsourced, because external testers can check the quality impartially.

5) Maintenance. Even when all implementation activities are completed, the work on the project is not. The maintenance stage starts then. It is necessary to provide cost-effective support to software. However, even now we are talking about only post-delivery stage, which includes such things as software modifications and user trainings. However, there is another one known as pre-delivery maintenance, which includes planning of actions for post-delivery stage.

Now I think that even if you are not closely connected to programming, you know the main activities it includes, and I am sure that you realize that the programmer must do much more than only code construction.