It's a simple question: Is the software you or your team is building throw-away?
Really, the question that should be asked is a bit more complex, and the answer arrived at is one that should be shared with the team openly and candidly, and it should serve as guidance to many of the decisions made throughout.
Many of the very talented and skilled software development professionals I've worked with want to be part of a team creating a superior product, doing very high quality work. It instills a kind of artisanal pride, and there's an allure to being part of an effort to create a lasting piece of software development mastery. An enduring triumph, if you will.
I would argue that there is, in fact, a tendency for most teams undertaking the creation of a software product to veer toward overbuilding software in lieu of clear guidance as to how much quality and sophistication is enough. By the same token, I have also seen a great number of overzealous product managers push an agenda of supreme quality at the risk of project viability. And, of course, we've all seen the opposite, as well: rushing a project out the door, only to pay the price in spades later.
In my experience in solution and enterprise architect roles, some of the most important factors that have weighed in on the architecture and design decisions have been cost-benefit criteria. In short:
- What are the costs to the business of delays of the system's roll-out?
- What are the costs to the business of delays in making changes later?
- How long will the system be in production, and how does that translate to maintenance costs over the product's life?
- What are the impacts of errors in the system?
- How likely is the technology to change in the near future that the product is built on, and will the company look to follow prevailing technology change cycles?
- How tied to core functions of the business is the software?
- What is the realistic likelihood of the system needing to be adapted to a new setting? (i.e. new country, new line of business, new language, corporate spin-off or merger, etc.)
Without answering these questions and more, you can never be completely certain that you're building the system in the right way. What is perhaps a little tougher to crack in this cost-vs-effort calculus is whether your current thoughts on any of these issues accurately reflect the future.
There are a lot of proponents of formal processes - formal requirements gathering, formal architecture, formal design, formal QA, and so on. Anyone who knows me and has worked with me knows that I believe a certain amount of all of these things should be consciously chosen based on the best-informed answers to the questions above. But, choosing the right amount is a delicate art much more than a science.
A friend recently asserted that I might not mesh well with a particular company we were discussing because that company didn't have a level of process rigor that he had come to associate with me. In truth, though, I think there's an appropriate amount of process that should be associated with each undertaking. It just happens that on recent engagements I've been part of undertakings that were to serve as core business function enablers, which meant we needed teams and processes that were more disciplined in nature, probably trending toward the median of the complexity range or perhaps just a little to the high side. I've also been on projects in the past that had well-understood short shelf lives, and these projects received much less process rigor, but it's always based on context and a conscious, calculated decision.
Focusing some of this discourse on the requirements, architecture and design pieces, the key reasons for performing these exercises in the first place in my opinion are:
- Communication
- Organization
- Thinking through problems "on paper"
- Project and corporate memory
Communication is paramount when dragging product visions and requirements out of people, when conveying design concepts, and when articulating plans. Formal communication is sometimes not necessary, though. If you're a lone developer working directly with the lone user of a very small, very simple system, it may suffice to capture requirements from meetings, log them somewhere so that the next poor sap who has to maintain the code can find them, and move on. If you're directly connected to the customer, with no middleman so to speak, then communication is a bit more natural and of course direct. There are obvious trade-offs down-stream to short-changing formal communication, which is a key issue some have with XP, Agile, etc., but the important question is not "if", but "how much is the right amount, both now and for the future".
Organization is vastly more important in cases of regulatory compliance, contractual obligations, in large and/or complex projects, or with a distributed workforce. Organization can be done by the team itself (think scrums, XP, etc., in the vein of self-orchestrating mechanisms), or can be done using heavy-weight processes with product lifecycle suites that can manage all artifacts related to the project in one place even with a distributed workforce. You would likely use a different organization approach to adding a page to your portal than you would to creating a multi-product, multi-vendor, multi-team, multi-million dollar health care system which lives would depend on and that would be subject to regulatory scrutiny.
All software projects involve R&D, thought-problems, uncharted territory, investigative research, and puzzle-solving. If people already knew how to build it, it probably would already be built and you wouldn't be reinventing the wheel (or one would hope - I know that's not always the case). But, how important is knowing
why the team made a decision? How important is being able to track a series of decisions or actions? If the product will have a steady owner for years, maybe not terribly important. If it will pass through many people's hands, it may be critical. Tactical decisions made after release 1 of a product tend to be the force that erodes otherwise good architecture. Those decisions can be made for any number of reasons - laziness, time crunch, unfamiliarity, incompetence, you name it. Sometimes the documentation is there but nobody bothers to read it before making changes, so the formal documentation of why and how within a particular design would be ignored anyway. And, for some, formal modeling using UML or Visio's amalgam of elements is more constraining than simply drawing on a board. Knowing what the dynamics are today and in the future will help guide how much thought process should be captured and saved, and how much time and money to spend on the process of designing formally vs. designing on the backs of cocktail napkins. It'll happen one way or another, since it's an important part of the creative process for many, but the question is rather how much you care about formally representing it and making it consistent among projects and teams, and how you want to ensure it is leveraged in future actions.
And, finally, project memory. All of what I just mentioned speaks to this fourth point. How important is it to retain the "why" and "how" of your software systems? In some cases, it may not be that important. If you have a highly stable group of cross-trained professionals who are deeply familiar with the systems, it may show relatively little value to spend more than the minimal amount of time focusing on capturing formally the information and gyrations that went into creating them. This also assumes, of course, that the company will remain a static size and that your employees will never go elsewhere. However, the right answer here usually comes down to answers to the questions asked above. The importance of project memory goes up significantly in cases of outsourcing or partner-led initiatives, complex/large systems, systems that enable core business functions, reusable or composable functionality, in companies with high turn-over or frequent reliance on contractors, and with systems that are likely to enjoy a long life.
Understanding what the business is looking for out of the system, how much that's worth to them, and bringing that into balance with what the IT department needs in order to make a respectable return on the investment both in the near term and in the long run are tall orders to fill. But, to create synergy between the business that the technology serves, and the practitioners bringing it to life, this is an area that should be focused on with each new undertaking. When it's a whopper of a project, make sure everyone knows the level of specificity and attention to detail and historical record required. Likewise, when it's a one-off that will only be justifiably pursued if it can be brought to life with minimal expenditure, have a plan in place that is rational and has the minimum expectations in each area clearly spelled out in order to ensure that the business gets what it needs and the IT department can still make sense out of it toward the end of its life when maintenance or integration is required, as is almost always the case.
This ignores all of the factors that swirl around leveraging and feeding enterprise architecture, but for projects that are in-flight, hopefully this offers food for thought on how to right-size the project to meet everyone's needs, both short-term and long-term.