If I am asked about my profession, I say that I am a software developer. For most people, that is all they want to know. But sometimes the conversation continues into what I actually do. Then I say that, primarily, I manage complexity. I think this answer surprises people because it is not how they think of software. My longtime boss, Jeff, used to say that “Complexity is preserved.” What he meant was that the complexity was moving from the person into the software that they used. Or to put it another way, the job of the software developer is to understand the complexity and to create an application that simplifies things for the users. Even though the software might seem simple to the user, behind the scenes the complexity is preserved. The complexity is still there–it is just in the code now instead of in someone’s head.
Software can become very complex very quickly. This is due to the fact that the problems we are solving are usually complex. The simple problems have been solved. For example, if you want to add some numbers together, you don’t need to write a program to do that, you just open your spreadsheet, type in the numbers and click the “Sum” button. And in the world of business applications things are only becoming more complex. In addition to the primary uses of an application there are increasing requirements surrounding industry rules and regulations, audit requirements, security requirements and so forth.
There are many ways to manage complexity in software development. Two primary tools that I think most important are object oriented design and layering. They both help in the same way: by helping the developer focus on only part of the problem at one time. With object oriented design and with layers we create abstractions that help us sub-divide code into meaningful chunks.
One of the problems that I frequently see in development efforts is a focus on the shortest path from the database to the screen and back again. This causes the code to be structured in very procedural ways. It is a vertical perspective on coding. And for small applications, it might work well. But it does not scale well into large, enterprise applications. In an object oriented design, the perspective is more horizontal–primary importance is placed on the relationship of the objects to each other. And layers are added to help with things like moving data to and from the database. But by focusing on the relationships of objects with each other we better represent the real world. And by doing so we better understand and mange the complexity of the application.
Using an object oriented programming language is not sufficient. To truly achieve the goal of managing complexity it is also important to understand object oriented design. I don’t know that this is a prerequisite for enterprise application development, but I think it will always help.