Manage Non-Functional Requirements using Table Filter and Charts for Confluence

Managing Non Functional requirements is not easy.

Owning and managing the Business Goals is typically a responsibility of the business, but often this responsibility is delegated to architects and engineers as they identify the key things that influence how a solution may scale, identify processing & storage requirements and ultimately drive the cost and performance of the solution.

Typically, if Non Functionals exist they are generally contained within spreadsheets, with complex formulas, encapsulating many assumptions that under pin the modelling. These spreadsheets become territorial, difficult to maintain, have a tendency to morph and evolve which ultimately erodes the sharedness at the broader context.

If lucky, key NFR volumes can be negotiated early on in a project. The luck however seems to run out when these numbers need to be revised due to negotiating delivery scope or dealing with internal or external changes.

My hypothesis is, NFRs will be owned & managed if they can be:

  • easy to share
  • easy understood
  • easy to change

This blog post will provide a working example using Table Filter and Charts for Confluence to remove/reduce reliance on spreadsheets and provide a number of networked graphical views.

Volumes & Projections

For demonstration purposes, the focus here will be based on key use case requirements with volumes estimated at yearly granularity.

YearLoan OriginationLoan ServicingDeposit OriginationDeposit Servicing
202230015010,0001,000
202360030020,0002,000
202490045030,0003,000
20251,20060040,0004,000
20261,50075050,0005,000
UseCaseVolumes Table Excerpt

Attribute ownership and any underlying assumptions are made.

In my example, the business are predicting yearly growth figures to double each year. And the number of Loan Servicing Use cases will scale proportionally. For simplicity I have made it 50%.

The above table is wrapped inside a table excerpt macro and can then be referenced in other confluence pages using the table excerpt insert.

The Chart from Table macro help paints a picture.

Model what matters

From the Use Case volumetrics, we may want to calculate the number of accounts.

Where the following assumptions have been made:

  • 2 accounts per deposit package origination
  • 50% of deposit servicing request will be to close an account
  • 50% of Loans will have an offset facility
  • 50% of loan servicing request will be to close an account

Adding the following code to the SQL transformer macro:

SELECT T1.'Year'
,FORMATNUMBER(
      T1.'Loan Origination' - 
      (T1.'Loan Servicing'*0.5)) 
      as [Loan Accounts Added]
,FORMATNUMBER(
      (T1.'Loan Origination' - 
      (T1.'Loan Servicing'*0.5)) *
      (0.5)) as [Loan Offsets Added]
,FORMATNUMBER(
      T1.'Deposit Origination' * 2 - 
      (T1.'Deposit Servicing'*0.5)) 
      as [Deposit Accounts Added] 
FROM T1

Where T1 is the referencing the Use Case Volumes table via the table excerpt include macro.

Add Use Case Variables

Next step is to replace the hard coded calculations with the following table.

The following table uses the handy slider macro from Handy Macros for Confluence and Interactive UI.

Use Case Variable Table

Handy Slider presents the current setting as a string which requires to be parsed before it can be used in the use case calculations.

With a bit of help from the STILTSOFT Help Centre the following SQL code used to resolve slider value.

The following transformer SQL code utilises the use case variables.

SELECT T1.'Year'
,FORMATNUMBER(
    T1.'Loan Origination' - 
    (T1.'Loan Servicing' *
    (Select T2.'Value' from T2 where T2.'ID'="L2")/100)) 
    AS [Loan Accounts Added]
,FORMATNUMBER(
    (T1.'Loan Origination' - 
    (T1.'Loan Servicing' *
    (Select T2.'Value' from T2 where T2.'ID'="L2")/100)) *
    (Select T2.'Value' from T2 where T2.'ID'="L1")/100) 
    AS [Loan Offsets Added]
,FORMATNUMBER(
    T1.'Deposit Origination' *
    (Select T2.'Value' from T2 where T2.'ID'="D1") -
    (T1.'Deposit Servicing' *
    (Select T2.'Value' from T2 where T2.'ID'="D2")/100)) 
    AS [Deposit Accounts Added] 
FROM T1

And to please the right brain sided folks, visualise the numbers with a chart.

Yearly Delta Chart

Year on Year Volumes

The following SQL introduces yearly accumulated totals.

SELECT 'Year'
,FORMATNUMBER(SUM(TT2.'Loan Origination' - 
    (TT2.'Loan Servicing' * 
    (Select T2.'Value' from T2 where T2.'ID'="L2")/100))) 
	AS 'Total Loan Accounts'
,FORMATNUMBER(SUM(TT2.'Loan Origination' - 
    (TT2.'Loan Servicing' * 
    (Select T2.'Value' from T2 where T2.'ID'="L2")/100)) *
    (Select T2.'Value' from T2 where T2.'ID'="L1")/100) 
	AS 'Total Loan Offsets'
,FORMATNUMBER(SUM(TT2.'Deposit Origination'* 
    (Select T2.'Value' from T2 where T2.'ID'="D1") - 
    (TT2.'Deposit Servicing' * 
    (Select T2.'Value' from T2 where T2.'ID'="D2")/100))) 
	AS 'Total Deposit Accounts'
FROM T1 AS TT1
JOIN T1 AS TT2 on TT1.'Year' >= TT2.'Year'
GROUP BY TT1.'Year'
ORDER BY TT1.'Year'
ORDER BY TT1.'Year'

The simplicity of this appeals to me.

With the help of Table Filter and Charts for Confluence you too can easily share, easy to understand and ultimately easy to update Non Functional Requirements.

Leave a comment