UI-based tests are often the de facto method of verifying software correctness in many organizations. It involves deploying the software, making sure all the integration points are hooked up, and then having people attack the UI using tests cases that were developed (often in isolation) to ensure the software meets specification. Much has been written about the downside of this approach which ends up resulting in slow and brittle tests. It is the main reason why automation pyramids suggest that UI-based tests be the smallest number of tests written in a suite....
5 Story Mapping Anti-Patterns
Source: beliminal.com Story Mapping can be a valuable planning exercise which can help prioritize work while centering the conversation on the customer. It can help a team align on an MVP, create releases, identify dependencies, prioritize stories, and generally lean out the product. It does this by bringing about a multitude of opinions and ideas in how to deliver value to the customer, and having a healthy discussion around the possibilities....
Simple Practices to Improve Software Development Teams
This assumes a team where we have the following roles: Product Owner, Developers, Quality Assurance and a Business Analyst. QA tests from the same spec as developers Whatever verification QA does should already have been done by developers. 95% of things that QA checks should not be undergoing a test for the first time, but developers should have already checked it. The remaining 5% are exceptions and should ultimately be reduced to 0%....
Leading Indicators
There are two main types of indicators that we use to measure products. The most common method is to build something and then measure how effective the product was at achieving its goals. These are lagging indicators because they’re only available once the investment in the product has happened and its built to a degree where it’s available to users. Thus they are expensive. The second method is focusing on metrics which can predict whether what you’re thinking about building is viable....
Using Gherkin for Acceptance Criteria
I’ve had a mixed experience working with Gherkin and Cucumber, and the culprit has usually been the step definitions. Consider the following scenario: GIVEN the client is logged in WHEN the client accesses their portfolio THEN the client sees their balance AND the client sees an option to transfer funds This requires four methods to be declared which implement each step. The implementation of these methods tends to result in UI-tests as that is often the natural way to look at software....
The Backend and Frontend Story Divide
In this post I will tackle the idea of splitting user stories based on role, i.e., back-end user story, front-end user story. What is and isn’t a user story? To start this discussion we first have to agree on what a user story is. At the highest level, it is an invitation to a conversation. That conversation is where people (i.e., developers, business people) can examine the value proposition, discuss implementation complexity, evaluate cost/value trade-offs, identify dependencies and come up with a general approach to a solution....
Avoiding Duplication in State Management
State management is where small bugs grow up to become evil villains, rendering applications a nightmare to maintain. This is especially true when writing JavaScript to maintain UI state. It is tempting to create instance variables which maintain state which are then queried in template logic. For example: my-component.ts class MyComponent { language: string constructor(private myStore: MyStore) {} changeLanguage(lang: string) { // set this.language based on myStore } } my-component.html...
Mocking and Spying with Jest and TypeScript
I have found that the easiest way to mock TypeScript objects using Jest is by simply doing this: const obj = { prop1: "some string prop", prop2: 50 } as any as MyType Now we can use obj anywhere MyType was expected and can use jest.spyOn(obj, ...) to the heart’s content. Frameworks like jest-mock-extended do similar work but I find that they’re an unnecessary abstraction that prevent the test from being expressive and obvious....
Evaluating Metrics
Good Continous Delivery podcast where they talked about how to evaluate metrics and their suitability to the situation. If you don’t know how to respond to a metric, don’t measure it. This is a quote from How to Measure Anything) and is a clever way of asking why we need to measure something. If we’re not willing to act when we see a metric, what’s the point? If there is additional work needed to create the metric and it isn’t a natural byproduct of the work, then we have to ask the question whether the effort of creating an observable metric is worth the opportunity cost?...
Shock Doctrine
The most effective time to impose drastic change on a system is when it is disoriented due to an unexpected shock. During this period events are unfolding faster than information is made available to explain those events, thus leaving people vulnerable to accept any remedy to their condition. With people at their most vulnerable the shock period becomes an invitation for drastic change. The change applied depends on the ideas that are present during the shock....
Waiting for a Crisis
I’m currently reading The Shock Doctrine by Naomi Klein where she repaints the impact of US economic influence on South American policies. A quote from Chicago School economist Milton Friedman: Only a crisis - actual or perceived - produces real change. When that crisis occurs, the actions that are taken depend on the ideas that are lying around. That I believe, is our basic function: to develop alternatives to existing policies, to keep them alive and available until the politically impossible becomes the politically inevitable....
OS Privacy Controls
The challenge with maintaining privacy is that when one provides information to a trusted party, that party unintentionally relays it to other parties. For example, you give your number to a friend who has no intention of relaying it to marketers or any other third party. Yet, when that friend performs a “Login with X”, they will send your information to X without intending to do so. Looking at it a level deeper this is the flow of information:...
On Estimation
This post is updated with the discussion here. Estimation and/or pointing has three purposes: To generate discussion within the team so people have an idea of the complexity of the work and are aligned on what it takes to get the job done, and what the general approach will be. It’s the main reason we have story points - to see how aligned people are in their view of the work....
On Planning in Kanban
The “backlog refinement” time is the planning time to see what we should be working on next. This is like sprint planning except there is no idea of commitment and it’s just planning what’s ahead without dealing with when things should be done because we acknowledge that things will take what they take - we try to be as fast as possible and seek to continuously improve. To plan effectively in Kanban one has to make good use of the this time....
Is Scrum suitable for complicated bug fixes?
A podcast listener asked how to use Scrum when the primary responsibility of the team is software maintenance and fixing complicated bugs which are hard to reproduce and take a long time to fix. How do we measure value when all we do is fix bugs? Here’s the podcast and my response to the question. Sprints are a good mechanism to get a team that is used to delivering in long cycles (i....
Architectural Tension
I was trying to understand how an app that I intend to contribute to was structured and was scanning through its many Git repositories. The path of least resistance was well worn. Some were forks of other with a few classes changed, others were more or less duplications with deployment parameters modified. In general, the preference to create a new repo to avoid the baggage that any code brings with it was preferred....
Dissonance of Using Functional Concepts in Non-functional Stacks
Side-effect free functions (i.e., pure functions) lend themselves to easy unit testing. If the ability to test software is key to creating quality then it stands to reason that the more pure functions a piece of software has, all other things being equal, the higher its quality. Taking this idea a step further we may posit that to achieve high quality we must maximize the amount of pure functions in our codebase....
The Definition of News Has Been Legally Changed
A tipping point has been reached in what is legally considered news. Critiquing a news source by questioning the facts presented, the manner in which they were communicated, the source’s validity, the broadcaster’s motivations or any inherent biases that may exist, is no longer a fruitful activity. That line of critique has been swept aside by legally muddying what news is. The presenter is no longer required to convey any truths and the onus of verification has entirely shifted from the news source to the audience....
TDSB Survey Results Can Be Misleading
If you plan on making data-driven decisions and that data is being collected via faulty techniques, you’re going to have a bad time. This week the Toronto District School Board announced that it was re-planning how students would return to school after survey results showed that more parents than expected were planning to send their kids back to school. Whether classes are at 50%, 75% or 100% capacity makes a big difference in how you might plan this....
A Short Analysis of an Analysis: YouTube Trending Videos
People have been trying to peek underneath “black box” algorithms for decades. The most popular one is the quest to crack how Google’s search ranking algorithm works so your article/product is as high as possible. With no knowledge of how the internals of these algorithms work we are forced to observe the output of the algorithm based on the inputs in hopes of observing trends and tendencies. Though sometimes companies provide guidance on how content is prioritized their precise workings have been a mystery....
Mining for Side-Effects in Complex Adaptive Systems
A complex adaptive system (CAS) is a system in which a perfect understanding of the individual parts does not automatically convey a perfect understanding of the whole system’s behaviour. Most systems where humans play central roles are CAS including teams and organizations. In such a system we cannot confidently make statements such as If we do A, then B will happen. We can only hypothesize about how doing A will impact the evolution of the larger system....
Serverless Architectures and Storing First
If software development is about trade-offs then one of the ones made by an asynchronous serverless architecture is that between architectural complexity and user experience. The user wait time when invoking heavy operations is reduced and architectural complexity is increased. Instead of a synchronous call where request/response across all layers are queued up and waited for, we store the information on disk and process it later. The user interface polls the system to return processed results....
Autonomy, Maturity and Chaos
We rely on evidence, experience, advice and intuition to make decisions. If there is hard enough data that indicates a path we use it. If not we rely on our previous experience in the matter (or related matter) to guide us. When that is not possible we ask for advice from people who may have that experience. And when we don’t we use our intuition, which is aided by data, our experience, knowledge gained through consultation, etc....
Compliance Metrics
People will try their best to follow a framework, especially if it is prescribed by someone who is seen as an expert. Though the framework can itself be useful, religious compliance to the framework’s metrics can distract from the goals that the framework is supposed to help with. Velocity, throughput, cycle time and any other metric should be subject to this scrutiny. If the goal is to continuously deliver value to your customers then the evaluation of value must happen outside the framework’s scope....
Dissorienting Dilemma
The dissorienting dilemma is caused when you have an experience that fundamentally does not align with your view of the world and forces you to reconsider what you had assumed tacitly to be true. It is the shifting of a core assumption or belief that forces you to alter your perception because without doing so the world does not make sense. Disorienting dilemmas do not pose a choice for you where you can turn a blind eye to this new information and continue on your path....
Women's Rights in Islam
The treatment of women in Islam as characterized by the “West” has been a source of great sadness for me. It is an unfortunate consequence of a multitude of factors including the lack of differentiation between cultural practices of a region and Islamic beliefs. This misunderstanding is amplified by media and political structures which value simple explanations to complex phenomenon by leveraging ingrained biases. Women have been mistreated and viewed as second-class citizens throughout history....
The Continuous Delivery Podcast
I’ve always been fortunate to have worked with people who had more experience and knowledge than me. Some of these mentors include Dennis Grant who showed me what Object Oriented Programming truly meant, Haroon Rafique who taught me how to be a professional programmer, Rob Lokinger who taught me about people and Mark Samson who coached me on delivery. Currently I’m colleagues with Csaba Bereczki, Gino Marckx (who I worked with at EPAM as well) and Jeff Morgan, some of the best coaches in the industry....
BusyBusyBusy
“How’s it going?” “Busy busy busy”. How busy one is has become a symbol of worth and even pride. The thought goes like this: if you’re not busy then you’re not utilized. If you’re not utilized then you’re wasting your time. If you’re wasting your time then the money you’re making is also being wasted. If money is being wasted then why not spend this money somewhere else? So maybe we only need half of you so you’re 100% utilized therefore more efficient....
FakeDone
Accomplishments feel good. Ticking something off a to-do list and seeing it struck out is a feeling of progress. In the huge heap of things that need to be done, seeing one of them disappear may just provide the momentum to tackle the next one. At times you encounter a situation where you badly want to tick something off that list and you’ve completed maybe 80% of it, or even less....
TheDigitalOrg
The digitization of customer experiences is a central focus for organizations. These efforts lead to the creation of new organizational constructs, roles, systems and ways of working which are centered around enhancing customer experience. Whether it be an insurance company digitizing their renewal process or a retailer providing contextual product recommendations, the organizational sub-structures created are quite common. The most common one is the creation of a “digital” unit within the organization tasked with solving these problems....
TeamAroundTool
There’s a pattern of organization sub-structure that has become a warning sign of deeper dysfunction. It’s the idea of assembling a team to manage access to an enterprise asset, e.g., a tool. Common examples of putting a team around a tool include analytics software, API gateways, performance testing tools and application security software. Once you peel back the onion there appear to be two common reasons why this approach is taken:...
Feature Toggle Design Patterns for Front-End Development in Typescript
Feature toggles have many uses including hiding unfinished work, performing A/B testing and more. One of the most valuable benefits of feature toggles is that it enables Continuous Delivery and Trunk-Based Development, where code is merged into trunk without the use of long-lived feature branches and then shipped safely to production. Feature toggles allow us to differentiate between a deployment and release, the former shipping hidden code to production with no impact to end users, and the latter making those features available to users....
Contract Based Testing with JUnit5, Pact, WireMock and Spring
Contact-based testing allows service consumers and service providers to stay in continuous sync so that any breaking changes are immediately visible. For example, when a team responsible for designing user experiences (i.e., the consumer) is dependent on the team providing data and services (i.e., the provider), with the latter having many consumers, it is difficult to keep track whether producer changes break consumer applications. In general, there are two types of contract-based testing....
List of Coaching Questions
“How are you complicity in creating the conditions that you say you don’t want?” - Jerry Collona I like this question because it forces you to look inwards rather than outwards on why something might be the way it is. “Let’s flash forward to a week or month from this <event?. What would make this a home run for you? What does “successful” look like? - Tim Ferris This question forces you to think about the outcomes that you’d like to achieve, the accolades you’d like to receive, the impact that you desire to have....
Inferring interfaces in statically typed languages based on object shape
Dynamically typed languages such as JavaScript allow for implicit interface definitions based on object shape. If you have a Country object and a State object which both have a capital attribute, you don’t need to explicitly declare the classes using implements PlaceWithCapital. You may define the following interface and treat any object containing a capital as a PlaceWithCapital. interface PlaceWithCapital { capital: string; } This is very convenient when dealing with data and object definitions that are not under your control....
Embedding quality in software through slack
Teams usually have a list of features that they need to develop. Call them stories, tasks, experiments, product backlog items…it doesn’t quite matter. Basically, code needs to be written for the software to do something. If you’re using Scrum or a similar framework you go through this list in somewhat linear order. As you complete Feature A along comes Feature B and you’re onto the next thing. What gets lost in the mix is time to inspect and adapt on the software increment that is Feature A....
Impactful Refactorings: Replace Conditional with Polymorphism
Twenty years on Martin Fowler released the second edition of Refactoring. Packed with plenty of examples of code smells and what to do about them, the book is a must-read for professional programmers and enthusiasts. Of the many refactorings described the Replace Conditional With Polymorphism remains one of my favourites. I will explain why. I’ve generally observed that object oriented programming is being bastardized. There is a strong tendency for programmers to slap procedural code inside a class and think they’re writing object oriented code....
Examples of the hidden wastes of software development
The Toyota Production System’s take on manufacturing processes changed the global automobile market and has been the subject of thorough analysis by researchers and academics. The application of those principles to software development included a focus on waste elimination which has always fascinated me. The thought of doing less to achieve more is beautiful on many fronts, and as I’ve gone from engineering to architecture to management to whatever-I’m-doing-now, it has stayed with me....
The Tricky Business of Managing Technical Debt
Photo by Alice Pasqual on Unsplash It’s not thaaat tricky, but it can be. Consider the following contrived Python program which replaces all instances of the lower case letter ‘z’, with an uppercase one: def convert_z_to_uppercase(word): new_word = '' for letter in word: if letter == 'z': new_word = new_word + 'Z' else: new_word = new_word + letter return new_word Has the implementation of this simple feature resulted in the accumulation of technical debt?...
Drawbacks of Pull Request Reviews
There is ample quality material on how to effectively review a pull request. This post is not about how to do a code review but what the purpose of a code review is, how most people do it, what the drawbacks of the most popular approaches are, what other techniques we can use to supplement or replace a traditional review process. The main purpose of a code review is to provide feedback to your peers so that the quality of the codebase, and in turn the product being built, is increased, or at the very least, not reduced....
Prototyping can get in the way of software delivery
Image Credit: https://mediatemple.net/blog/tips/how-to-use-customer-feedback-to-improve-user-experience/ I’m trying to form a perspective on how we can improve getting feedback from end users, so that it can be incorporated into software products sooner. Infusing design expertise into engineering has always been a complicated topic, especially when you consider the context of popular agile delivery methods like Scrum, which enforce timeboxes and demand that shippable product increments be delivered very frequently. This has very often been in tension with design where activities such as user testing and research take longer cycles....
A Theory of User Story Sizing
Creating small user stories has been seen as desirable for reasons such as easier estimation, scope control, and early value delivery. This idea sometimes encounters friction from product developers (e.g., engineers) who see smaller user stories incurring higher overhead costs such as increased time spent creating documentation, test cases etc. After all, why would you need to split a user story about a contact-us form into three stories about viewing the form, validating it, and then sending the data to an external party?...
The reason for prep meetings, adding more people “in the loop” etc.
The reason for prep meetings, adding more people “in the loop” etc. is to spread the accountability of the decision so that in the event that things go south, the blame is spread and you aren’t blamed. Most decisions of reasonable quality don’t require a lot of data points or a tremendous amount of insight. It’s just that the perceived consequences of a screw up are high enough that people would rather prolong a decision until “everybody’s on the same page” while at the same time decreasing the quality and increasing the cost of the decision....
A Model for Measuring Productivity
Disclaimer: this model is wrong. At its core, productivity is a measure of an amount of output divided by the number of inputs used to create the output. That is essentially it. Depending on if you’re an economist, a pharmaceutical plant manager, or a software developer, the numerator and denominator change based on context. Leaving metrics aside, there is a heuristic that we can also use to measure productivity. In this model, if productivity is on one end of the spectrum, danger is on the other....
The Enterprise Ecosystem Already Exists — They’re called EUCs
We all know of the intern who ended up hacking something over a summer only for that tool to become something of a necessity in day-to-day business. I even know of one business unit which relies on a tool created in Microsoft Excel ’95, which has become so important that a Windows NT machine is still kept around just so it can be run every week. If you’ve worked in business units of medium-to-large organizations, these stories are common....
Giving Enterprise Innovation a Fighting Chance
Organizations are facing external pressures which necessitate innovation for long-term relevance, if not present day survival. Traditional business models in industries such as finance, automotive, and energy, are being challenged more than ever, forcing organizations to look inwards for ideas on how to compete. Organizations rely on their human capital to generate ideas which can be turned into either stable business models, or be used to gain a competitive edge in existing models....
Giving Enterprise Innovation a Fighting Chance
Organizations are facing external pressures which necessitate innovation for long-term relevance, if not present day survival. Traditional business models in industries such as finance, automotive, and energy, are being challenged more than ever, forcing organizations to look inwards for ideas on how to compete. Organizations rely on their human capital to generate ideas which can be turned into either stable business models, or be used to gain a competitive edge in existing models....
Framing Back Office initiatives
Every time I hear the phrase “back office”, the image of the Office Space stapler guy comes to mind, which is not great brand association. Projects which seek to eliminate back office inefficiencies are low on the radar of executives because they don’t carry the cachet of competing projects. Hey, would you rather roll out this cool new iPhone app or reduce mortgage approval duration by two days? One certainly sounds like it’s more likely to get you a promotion....
Reducing friction in structures
Organizational structures have existed since one caveman told the other to go hunting while he fished. It was a natural distribution of work where resources needed to be organized to produce greater output. Then a third dude strolled along and the first guy asked him if he could make fire. Turns out he could, and he could hunt too, but the thing he did best was to make fire so he was called the fire guy....
Improving architecture decision velocity
We’re in a lot better place than 15 years ago when I recall reputable people talking about how software architecture was similar to building a house. That never quite sat right with me because the cost of iterating in construction is insanely higher than the cost of iterating in software development, where agile architectures must iterate. Thankfully, we have generally accepted that good architectures emerge over time and the severely underrated Refactor=Design movement has helped people release their strenuous grip on UML diagrams in favor of having real life dictate what software architectures should resemble....
We must recognize unplanned work
I hate waste. Whether it’s waste of food, time, money, effort, or energy, it annoys me to no end. If there is one thing we should do as a people for humanity, it’s strive to reduce waste. And on a complete tangent, it’s why I liked the final scene in Season 3 of Fargo where V.M Varga used it to end the conversation. Specifically, I’m referring to unplanned work which continues to be seen as the norm rather than a significant problem....
I ain’t got no standards
In 1789, Thomas Jefferson fired up a letter to James Madison. It was basically the equivalent of a Twitter rant of the time, only that during those times rants had to be coherent, researched, and had to read like op-ed pieces from the New York Times. So spoke Tommy J: “…it may be proved that no society can make a perpetual constitution, or even a perpetual law. The earth belongs always to the living generation....
The Phoenix Project, i.e., The Goal for IT
I finally got around to reading the Phoenix Project, a book that’s quite hot right now thanks to the buzz around ‘DevOps’, a term that is catching up with ‘Agile’ when it comes to being misunderstood. This is a 345-page read which could have been condensed down to about 10 pages. Granted, those 10 pages are significant and I’ll get to them in a bit, it’s just that I found the author’s desire to mimic the style of the groundbreaking and seminal book, The Goal, slightly overbearing....
Let's retire Agile
Poor agile. It started off with good intentions rooted in simplicity and common sense. It wasn’t long before it got productized, scaled, enhanced, sold, bought, and a few years later agile became Agile. The difference is only the case of one letter, but that betrays just how drastically different the two are. The main victim and perpetrator of this crime remain organizations looking for a quick fix to solve deep-rooted problems, who turn to Agile as a way to make things better, faster, and cheaper, without ever willing to take a look in the mirror and truly change....
Archive
archives