Jerry Yoakum's thoughts on software engineering and architecture from experience working with code, computer science, python, java, APIs, NASA, data mining, math, etc.
Thursday, April 26, 2018
Build Throwaway Prototypes Quickly
Build the Right Features into a Prototype
"When constructing a throwaway prototype, build only features that are poorly understood."You can think of it like this - you have started development on a big project and thought you understood all the features. Unfortunately, when you start on feature X you realize that you need more feedback from the customer and you need to provide them a prototype to use to frame the problem.
- Make a branch from Master.
- Build feature X in the new branch; we'll call it branch X.
- Share it with your customer and gather feedback.
- If the customer is happy with what you did then merge to Master and stop following this list.
More likely, you continue on along this list. - Make another branch from Master; we'll call it branch XY.
- Build feature X in branch XY using the feedback that was gathered. Pulling in code from branch X where possible.
- Make sure that the customer is happy then merge to Master.
- Finally, throwaway that branch X prototype.
By the way, until you are finished with the project, the code you have in your Master branch is really an evolutionary prototype. You want to build the features that are best understood and merge them to Master once you have customer approval. The thing to note is to never merge a feature to Master before it is well understood and approved. Anyone could make a branch from that bad code and you risk it being merged back into Master after you correct the mistake.
Build the Right Kind of Prototype
- Throwaway
- Quick and dirty. Given to the customer for feedback then thrown away once the information has been gathered.
- Used when critical features are poorly understood.
- Evolutionary
- Quality. Given to the customer for feedback then modified once the information has been gathered. This process is repeated until the product is completed.
- Used when critical features are well understood but how to combine or present them needs customer feedback. Also used for feedback on minor features.
Communicate with Customers / Users
"Never lose sight of why software is being developed: to satisfy real needs, to solve real problems. The only way to solve real needs is to communicate with those who have the needs. The customer or user is the most important person involved with your project."It may feel like it is easier to develop in the sweet silence of a vacuum but will the finished software be something that the customer likes or even finds useful? If your customer or product manager is not easily accessible then designate some people on your team to be advocates for your customer. Ask them to imagine being the customer and get their feedback. If possible, have them use the software as if they were the customer and document the good and bad points.
Productivity and Quality are Inseparable
Productivity and quality have a clear relationship in software development.
- Demand for increased productivity will decrease quality (i.e. increase the number of bugs).
- Demand for increased quality (i.e. fewer bugs) will decrease productivity.
This is not a bad thing. Accept it and plan for it. Do not agree to deadlines that are unreasonable and will result in poor quality.
Quality is in the Eyes of the Beholder
It needs to be realized that quality is not the same for all parties. A developer might think it is high performance code or an elegant design. A user might think it is a lot of features. A manager might think it is low development cost. These three examples could be described as speed, features, and cost. Optimizing one might detriment another. Because of this, a project must decide on its priorities and articulate them to all parties.
Tuesday, April 17, 2018
Build Flexibility Into Software
A software component exhibits flexibility if it can be easily modified to perform its function (or a similar function) in a different situation. Flexible software components are more difficult to design than less flexible components. However, such components are more run-time efficient than general components and are more easily reused than less flexible components in diverse applications.
Labels:
architecture,
design,
Singapore,
software-engineering
Location:
Singapore
Monday, April 16, 2018
Build Generality Into Software
A software component exhibits generality if it can perform its intended functions without any change in a variety of situations. General software components are more difficult to design than less general components. They also usually run slower when executing. However, such components:
- Are ideal in complex systems where a similar function must be performed in a variety of places.
- Are more potentially reusable in other systems with no modification.
- Reduce maintenance costs for an organization due to reduced numbers of unique or similar components. Think about the hassle of maintaining multiple different repositories and build plans.
When decomposing a system into its subcomponents, stay cognizant of the potential for generality. Obviously, when a similar function is needed in multiple places, construct just one general function rather than multiple similar functions. Also, when constructing a function needed in just one place, build in generality where it makes sense - for future enhancements.
Labels:
architecture,
design,
software-engineering
Location:
Springfield, MO, USA
Friday, April 06, 2018
Transition from Requirements to Design Is Not Easy
Requirements engineering culminates in a requirements specification, a detailed description of the external behavior of a system. The first step of design synthesizes an optimal software architecture. There is no reason why the transition from requirements to design should be any easier in software engineering than in any other engineering discipline. Design is hard. Converting from an external view to an internal optimal design is fundamentally a difficult problem.
Some methods claim transition is easy by suggesting that we use the "architecture" of the requirements specification as the architecture. Since design is difficult here are three possibilities:
- No thought went into selecting an optimal design during requirements analysis. In this case, you cannot afford to accept the requirements specification implied design as the design.
- Alternative designs were enumerated and analyzed and the best was selected, all during requirements analysis. Organizations cannot afford the effort to do a thorough design (typically 30 to 40 percent of total development costs) prior to baselining requirements, making a make/buy decision, and making a development cost estimate.
- The method assumes that some architecture is optimal for all applications. This is clearly not possible.
Labels:
design,
software-engineering
Location:
Springfield, MO, USA
Thursday, April 05, 2018
Trace Design to Requirements
All these needs can be satisfied by the creation of a table with rows corresponding to all completed software components and columns corresponding to every released requirement in the software requirements specification (SRS). A check in any position indicates that this design component helps to satisfy this requirement. Notice that a row void of checks indicates that a component has no purpose and a column void of checks indicates an unfulfilled requirement. Some people argue that this table is very difficult to maintain. I would argue that you need this table to design or maintain software. Without the table, you are likely to design a software component incorrectly, spending exorbitant amounts of time during maintenance. The successful creation of such a table depends on your ability to refer uniquely to every requirement.
----
STOP. Do not dismiss the above because it doesn't sound like an agile practice. There is nothing to stop you from creating, maintaining, and using the above table within the framework of scrum. This is really about design and documentation. Being able to document where work for specific requirements is to be, and was, done will drive development toward modular (in its many forms) design.
I have worked with development teams that track this.. kinda. The specification for a project is stored in JIRA with each issue representing each requirement. When an issue is marked resolved the issue is linked to the commit history, code review, and test documentation. It lacks a high-level view but a sufficiently large table would also suffer from the same difficulty. Anyway, it is immensely useful to be able to query JIRA for issues related to a specific feature and have a subset of commits to look at first.
Labels:
design,
software-engineering
Location:
Springfield, MO, USA
Subscribe to:
Posts (Atom)