9.8) Briefly describe the three main types of software maintenance. Why is it sometimes difficult to distinguish between them?
As discussed in section 9.3 the three general types of software maintenance are fault repairs, environmental adaption, and modification or addition of functionality. Fault repairs are error corrections to a system in terms of coding, design, or requirements. Environmental adaption is the modification to an existing system according to changes to the environment it exists in. Functionality changes are based upon a change in requirements of a system coming from an updated organizational need. There is no clear boundary between these categories because they often cause each other and/or appear in conjunction. A maintenance case of environmental adaption could be necessitated only because an external change results in a code error inside the system. In this case, would it actually be environmental adaption or rather a fault repair? It could be both or either one depending on how the engineer would like to solve the problem.
9.10) Do software engineers have a professional responsibility to develop code that can be easily maintained even if their employer does not explicitly request it?
I do not believe that a software engineer inherently has the responsibility to develop code that is easily maintained in all cases. A software engineer only is responsible to the direct socio-legal requirements that are demanded of them. This means their base line responsiblities come from who they work for and what they specifically agreed to create for a client. So if a single software engineer signed a contract to create a specific product, they are only responsible fufill the requirements of creating that product according to specifications. This means it would be the responsiblility of the client to require easily maintained code. However, the more realistic case is if an engineer works for a company that values maintainable code and if the engineer agrees to create a product for a client, then they are now responsible for creating maintainable code because of the social pressures of the company. Regardless of the responsibility, it is in the best interest of the engineer to create maintainable code to increase their proficiency, productivity and to make themselves a more valuable asset.