Life, especially software development life, is never without constraints.
- The software has to be released on a certain date, set well in advance. The only option is to plan based on the time budget.
- Given that I have this much time, what can I fit into this time?
Software Correctness (or Incorrectness) Constraints
- The software that you work with has flaws in it.
- How many flaws?
- Are the flaws of the software making it unusable? This is not any different than any other software you are trying to use. Windows has flaws in it, however once a problem is discovered, you are always trying to use the program in a way as to avoid that particular flaw.
Incomplete Knowledge Constraints (Requirements -> Problem -> Solution)
- The understanding of the requirements will evolve as you move through the project. More so, even the understanding of the folks who specify requirements will evolve.
- Your understanding of the problem evolves.
- Your understanding of the solution evolves.
Each constraint requires a different treatment. Each poses risk, therefore each needs to be dealt with, or the project will get into jeopardy. The questions to ask about each are:
- What can I do in 2/20/200 hours?
- What % of my time should I spent on a given activity?
- What is the activity that only I can do?
- What is the activity that I can do that is visible?
- What are those activities that I can do to reduce other’s dependencies on me?
- What can I finish now to unblock to others?
- Do I have proof in form of running code that this API I want to use works in the way I want to use it?
- Given that I found a problem with this API, is there a workaround that I can use?
- What are the requirements that are at risk to change because of real or perceived lack of clarity/definition/etc.?
- Is the problem formally described? If not, why not?
- Is the solution presented on paper proven to be correct (empirically or mathematically/logically)?
- Does the solution provide flexibility to cover for the risk of changing requirements?
People’s Skill and Knowledge Constraints
- What are the skills available in the team?
- What are the growth goals for the people on the team?
There is no constraint-free state. Our job as software engineers is to figure out a solution that can be completed within the constraints of time, people, money, etc. that we have. It is not an easy task, but that’s what makes it fun.