November 2005
Monthly Archive
Monthly Archive
Posted by Chris Sterling on 29 Nov 2005 | Tagged as: Java
After working on many projects in which I was not the original developer, configurator, tester, or whipping boy, I have come to some realizations regarding legacy system maintenance. Since this is merely a blog entry, I am not feeling inclined as of yet to map out legacy system maintenance techniques for a large set of systems out there in the wild. If you want to research this in gory detail then check out a book (that I have not read but was recommended to me by Paul Dupuy) called “Working Effectively with Legacy Code” by Michael C. Feathers.
When we begin a project that contains legacy code, tools, and deployment situations, a common path is followed to tackle the seemingly insurmountable project learning curve. This path consists of the following:
With the recent rise of TDD (Test-Driven Development) as a way to manage complexity and quality within systems, it only seemed natural to use it as a way to manage legacy system maintenance issues. If you have tried such measures in your own legacy system maintenance efforts you may already know that this is a daunting feat. There are many issues to overcome when writing test harnasses around legacy code such as:
Recently, I was informed about a set of tools which have changed my software development methods forever. Paul Dupuy, who also recommended the “Working Effectively with Legacy Code“ book, introduced me to the “acceptance test” category of tools. These tools are not neccessarily for the end of a project iteration, but are used to improve communication between the business customer and the team before implementing features or bug fixes. Here is listing of the tools:
These tools are essential for delivering features and understanding when the user story and/or feature is finished from the customer‘s perspective. We have found this to be an effective means for discussing details of a user story from the customer. By developing acceptance tests with the customer which portray the intended results, we are able to definitively show when the story is finished. Finished is a bit misleading, but if you think of user stories as a description based on your current intentions or understanding, then a user story may finish but a new user story could be introduced to replace or enhance the original story.
Now, what does this have to do with legacy system maintenance? Earlier in this blog entry I asserted a typical path for dealing with legacy systems. With the new understanding about acceptance test frameworks I believe that we can now reconstruct this path to be more efficient. Here is the updated path:
I am sure that I have not thought of all the permiatations in legacy system maintenance and am well aware of the added complexity that system integration issues add into the fray. I believe that acceptance testing frameworks can help in combating this complexity along with effective software development methodologies, diligent continuous integration procedures, and the creation of supporting utilities such as test fixtures and performance monitoring tools.
Please comment on this blog entry if you want to add, modify, or question anything contained within. I am eager to hear other experiences and ideas on how we can make our legacy system maintenance better.
Comments Off on Test-Driven Development on Legacy Code
Posted by Chris Sterling on 29 Nov 2005 | Tagged as: Distributed Computing
Not that I wish to be apologetic regarding the title of this entry, but I feel it needs some explanation. The title by no means is intended to suggest SOA (Service Oriented Architecture) is simple or without merit. The intent of this entry is to assert the importance of SOA as a means to improve enterprise architectures and their extended maintenance complexity. Given this assertion, I contend that SOA must be a critical part of computer science programs and corporate training strategies for software development. Also, SOA is extremely complimentary to agile methodologies in the delivery of high quality and valuable software assets in small calculated chunks.
The rise of layered architectures, such as those presented in J2EE blueprints and MVC (Model View Controller) based frameworks like Spring and Struts, has been integral to a design which contains a middle layer for business logic. This layer, also known as the “service layer”, provides valuable support and accelerates delivery of business products and services. A problem which has persisted with these architectures is their lack of complete service decoupling. Teams must combat coupled designs through slices of the layered architecture with pre-defined interface documentation, technical requirements documents, coding standards, and code reviews.
In my opinion, the frameworks mentioned above are not at fault. I believe that the problem of service coupling is due to our training techniques for developer application design over the past few years. A shift in software development design must be made such as those made when structured, function prototype, and object-oriented design were introduced. I should mention a friend of mine who has wrote a white paper, “A View-Oriented Approach to SOA” by Scott Came, which attempts to define an appropriate method for SOA design. I agree with many of the points made in his white paper and would like to describe effective programming models which facilitate good SOA design.
The following image depicts the high level systems within an SOA implementation:
Each component within the SOA has a role in the effective design:
In my experience, there is an initial barrier to entry for SOA development which seems obvious at first glance but derails many developers, including myself at one time or another. When creating a desktop or console application, most of the time we are working with in-memory models which can be passed around in graphs easily between components. SOA-based applications or systems revolve more around message passing between clients and services.
The difference in paradigm brings some different design philosophies such as the amount of data and the frequency we communicate between components or services of the system. We might not think twice about making a call for each item added to our order if it is inside our desktop application. If we are adding these items to our order over the network you may fall pray to “The Eight Fallacies of Distributed Computing”. A possible way to combat this is a local persistent cache and guaranteed delivery options such as those found in JMS.
Many times, SOA-based applications or systems are a step away from overly evolved OO designs. Since a service tends to contain finer grained slices of functionality, developers can focus more of their efforts on handling the task at hand. For example, adding an item to an order may only entail finding the order by a unique identifier and then adding the specific item passed into the service via a message. In a service grid or bus there may be any number of services which can perform this action. And all of those services may just be copies of each other and therefore handle the message in the same manner.
To be continued…
Comments Off on SOA is for Kids
Posted by Chris Sterling on 29 Nov 2005 | Tagged as: Java
What is the role of the “bit flipper” nowadays? We all have friends who seem to be the best programmer you have ever seen. You may even be that person who everybody says is a great programmer. It‘s the programmer who can come up with elegant algorithms to solve any issue. Squeezes out the most performance possible from their system functions. Actually attempts to win encryption breaking contests. With the recent updates in software development which have paved our way toward systems integration and further away from the actual bits, does a “bit flipper“ stand a chance?
I have a theory that “bit flipper” types have an enormous chance to become quite valuable to these recent software development practices. I think the key is in automated testing and especially test-driven development. I believe this may be the last frontier for manipulating bits and solving interesting algorithms. In the world of systems integration we tend to work on business level objectives and logic. In the testing of these systems there still is a need for creative thinking and extremely performant harnasses.
What do other people think about the role of the “bit flipper”?
Comments Off on Role of the Bit Flipper