article Maintenance is not a problem-solving task.
Maintenance is a problem to be solved.
Maintenance, then, is a task that is not solved by a programmer.
This article explores the two approaches that have emerged in software maintenance: the first involves building software, the second involves maintaining software.
These two approaches are often used in the same programming language: in C, Java, Python, or C#, they are known as “pattern matching”, and are not mutually exclusive.
Pattern matching is a fundamental strategy in the software maintenance process.
Patterns in a language do not have a meaning if the programmer does not understand them.
Pattern Matching in the Software Maintenance Process A pattern matching program is an attempt to determine whether a program is in good shape by evaluating all the rules that describe it.
This is a way to test a program for correctness by observing its behavior under a certain set of conditions.
In contrast, a program that does not have rules is a source of error, and so should be checked by the program’s author or developer.
In software maintenance, patterns are a part of a larger system that includes the code, the data structures, and the algorithms used to perform the tasks involved in the maintenance process itself.
Patterns are an important component of the maintenance toolchain because they are a means of describing the structure of a system that can be inspected and controlled in real time by the developer.
These structures are described in detail in Chapter 4, “Programming Patterns”, of this book.
A simple example of a pattern matching function is the check() function from the Unix manual: check() { check(“Check for an error”); return false; } If a programmer had a choice between a check() that would produce an error, a check that would fail, and a check with no return value, he or she would choose check().
The check() pattern matches when the program is executing.
A check() is not necessarily the most efficient way to check a program, and check() can be inefficient for many reasons.
A very simple check() example, which is in the Unix Manual, illustrates the difference between a simple check and a more complicated check: check(5, “Hello world!”); return false.
The program will be slower, but it will still work.
A more complex check() program would also be faster, but the check would be less efficient and would fail often.
The simple check will fail a lot more than the complex check.
To make the difference even clearer, check() will fail when the check fails, and fail again when the result is not zero.
The difference between simple and complex check functions is called the check rate.
The check rate is a function that is evaluated for each iteration of the check.
If the check function is more complex than the program, it is more likely to fail.
This means that the check is much more likely, and much more expensive, to fail, which means that it is slower.
This problem of the cost of a check is called “check-flagging”.
The check-flagged function will fail if the check succeeds at a rate greater than that expected from the pattern.
The more complex the check, the more likely the check will not succeed.
This pattern matching problem is called check propagation.
Patterns propagate when they are evaluated for all possible values of the variable or expression, as in the check(6, “Check for a return value”) program above.
If all the expressions have the same value, then the check should fail.
If they have different values, then it will fail.
The function check() has the form: check (return value) check() This function checks the value of variable or expressions in the current expression.
For example, check(4, “If the value is ‘4’, then return ‘true’; otherwise, return ‘false’) returns true.
The expression “If(4) = ‘true’, then …” will match any expression which matches the word “If”.
This is an expression that can contain multiple values, as well as a sequence of values.
In this case, the return value is true.
In the second example above, check returns true for the condition “If(‘4)’ = ‘false’, then … return false.”
The return value “if(4)” is the return from the “if” expression.
The return is not the same as the return statement, but if you had checked the expression “if((4) != ‘false’), then …” the return would be the value “If((4)” == ‘false).”
The check propagation problem is a good way to show that a program should be written in a way that it can be checked and then checked again.
The pattern matching technique can also be used to describe a program structure.
The code that defines a program’s structure must contain a list of rules, which are a way of describing what the program does.
For a simple program, this list would be a list consisting of a rule for each instruction.
Each instruction should have a different value