UI Tests: The Illusion of Quality at the Cost of Quality

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....

May 9, 2022

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....

April 21, 2022

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%....

December 8, 2021

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....

November 20, 2021

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....

August 25, 2021

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....

May 5, 2021

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...

May 4, 2021

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....

April 22, 2021

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?...

March 31, 2021

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....

March 26, 2021

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....

March 9, 2021

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:...

March 5, 2021

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....

February 26, 2021

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....

February 26, 2021

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....

January 4, 2021

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....

November 18, 2020

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....

November 2, 2020

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....

September 30, 2020

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....

August 23, 2020

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....

July 11, 2020

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....

July 6, 2020

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....

July 3, 2020

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....

July 2, 2020

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....

July 1, 2020

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....

June 29, 2020

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....

June 29, 2020

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....

March 19, 2020

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....

February 26, 2020

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....

February 22, 2020

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....

February 17, 2020

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:...

January 1, 2020

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....

December 30, 2019

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....

September 19, 2019

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....

September 15, 2019

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....

August 14, 2019

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....

July 25, 2019

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....

July 23, 2019

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....

July 22, 2019

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?...

February 12, 2019

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....

February 1, 2019

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....

January 25, 2019

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?...

August 13, 2018

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....

April 1, 2018

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....

December 16, 2017

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....

December 12, 2017

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....

December 1, 2017

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....

December 1, 2017

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....

November 22, 2017

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....

November 20, 2017

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....

November 18, 2017

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....

November 5, 2017

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....

September 9, 2015

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....

August 13, 2015

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....

June 3, 2015

Archive

archives