Author: Bojan Bjelić

  • Software quality

    Before working in an architect role, software quality seemed to me like a very abstract measure, based on ones subjective perception and experience.

    While hard to define, there are some attributes commonly used to evaluate quality of a software component or system.

    Note: as some other articles on this blog, this is a living document that will change in time.

    Quick attempt

    I think everyone would agree that well written software should have the following attributes.

    • It does what it is supposed to do,
    • It does not contain defects or problems,
    • It is easy to read, maintain, and extend.

    While true and well intentioned, this list expresses what I meant with abstract and prone to subjective perception.

    Detailed approach

    Even though (I find) the standards can be abstract and overly dry, the “Product quality model” of the “ISO/IEC 25010:2011” pretty well defines the attributes.

    Aside the specialised ISO audits, I think with a pragmatic approach such attributes can be measured and improved.

    Most of these can be regarded as non-functional attributes, and only the first addresses the functional requirements that arguably brings value to a software product. On the other hand the product worth can quickly erode if the other attributes are not covered as well. This is important for everyone involved to understand, which can be especially hard for non-technical stakeholders.

    Here’s the list with notes and potential ways to measure and improve each.

    Functional suitability

    • Functional completeness
    • Functional correctness
    • Functional appropriateness – how well specified tasks and objectives can be accomplished

    Notes

    This is the only (!) set of attributes that addresses the fulfilment of functional requirements, even if these are the ones that arguably bring value to a software product. On the other hand the product worth quickly erodes if the later attributes are not covered as well. This is important for all the stakeholders to understand. (I know I am repeating myself on this one)

    Measuring

    This can be measured with manual and automated functional testing, fulfilment of acceptance criteria, and user feedback.

    Apart from bug reports, in practically all systems I worked with, this could not be followed nor measured in operation.

    Improving

    Based on user feedback, bug reports, and internally measured usage KPIs.

    Performance efficiency

    • Time behaviour – the response and processing times, and throughput rates of a product or system
    • Resource utilisation
    • Capacity

    Measure

    The performance can be measured by performance testing and resource monitoring during those tests. Of course, operational monitoring will also bring insights, but this is in most cases too late.

    Improving

    Static code analysis tools can help, but profiling is still irreplaceable to improve.

    Compatibility

    • Co-existence
    • Interoperability

    Notes

    This becomes extremely important in system architecture and large systems.

    Measure

    A set of questions that can help evaluate a system are:

    • Is there a very specific set of requirements for deployment?
    • How about operational requirements?
    • Does the system have its own way of integrating with other systems, unlike the others?

    With the container and serverless deployment and execution models, the co-existence becomes less of a problem, where the performance efficiency becomes important.

    Improve

    Interoperability is all about the API design, choreography/orchestration, and system openness. Smart endpoints and dumb pipes principle applies here as well.

    Usability

    • Appropriateness recognisability – how well can the user recognise whether a product or system is appropriate for their needs
    • Learnability
    • Operability
    • User error protection
    • User interface aesthetics
    • Accessibility

    This set of attributes is oriented to measure the fit with the end user. Software engineers (architects as well) are notoriously bad at this, and cooperating with UX/UI designers/engineers is crucial.

    Measure

    This is somewhat dependent on user technical orientation, subjective relationship to the product and previous familiarity. There are tools and platforms like UserTesting or Accessibility Insights that have defined a clear set of measurements (no affiliation or promotion, just the ones I am aware of).

    Improve

    Align the product implementation to the feedback and measurements. Introduce UX/UI design if not present. Introduce accessibility experts. Promote disability inclusion.

    Reliability

    • Maturity
    • Availability
    • Fault Tolerance (recovery)
    • Recoverability (data)

    Notes

    This is about system design, deployment and operations models, network and product configuration.

    Measure

    Documenting your system with reliability block diagrams and performing fault tree analysis.

    Improve

    Chaos Monkey, redundant deployment, reduced dependencies.

    Security

    • Confidentiality – authorisation
    • Integrity
    • Non-repudiation – how well actions or events can be proven to have taken place
    • Accountability
    • Authenticity

    Notes

    Too often, this is taken as an afterthought, but is absolutely essential in having a system run properly and preserve the data as intended.

    Measure

    Security audits, code analysis, penetration testing, bounty programmes. Identify critical business data and business risks.

    Improve

    Use coding standards, especially take care of potential attack vectors and keep the attack surface as low as possible. Do not expose to the internet anything that is not absolutely needed.

    Maintainability

    • Modularity
    • Reusability
    • Analysability
    • Modifiability
    • Testability

    Notes

    Again, too often, this is taken as an afterthought, but is absolutely essential in building a sustainable system. This will have a hard impact on time to market, especially in the long run.

    Measure

    Code test coverage, code audit, pull requests, documentation (!), architecture, static code analysis, profiling.

    Improve

    Increase code test coverage, create unit tests, run tests in CI/CD, do code reviews, run

    Portability

    • Adaptability
    • Installability
    • Replaceability

    Notes

    Again, too often, this is taken as an afterthought, but is absolutely essential in building a sustainable system. This will have a hard impact on time to market.

    Measure

    Are the components using standard mechanisms of integration and

    If you have a mobile app in the stack – what is the device and operating system compatibility.

    Improve

    Increase code test coverage, create unit tests, run tests in CI/CD, do code reviews.

    Further reading

    https://martinfowler.com/

    W3C Web Accessibility Initiative (WAI).

    Fault Tree Analysis (Wikipedia)

    Hexagonal architecture

  • Encounter: The Backbone

    This page provides a single entry point to all the posts in the story of how the world got online. The Backbone: Introduction One System, Universal Service? The Unraveling, Part 1 Discovering Inter…

    Source: The Backbone – Creatures of Thought

  • Encounter: 365 RFCs

    Super interesting details on internet (standards) beginnings.

    Commenting on one RFC a day in honor of the 50th anniversary of the first RFC.

    Source: 365 RFCs — Write.as

  • Encounter: How Much of the Internet Is Fake?

    Encounter: How Much of the Internet Is Fake?

    Turns out, a lot of it, actually.

    Source: How Much of the Internet Is Fake?

    The article is from 2018, and I have to confess I didn’t look for more recent statistics, but I can imagine it only got worse. I did a quick of search on this topic, and a lot of articles date from 2018, so it seems the attention just turned to other topics, but I don’t think the actual problem went away.

    Also relevant

    The Fake Web: How Nonhuman, Fraudulent And Invalid Traffic Is Taking Over The Internet (18 Feb 2022)

    The ‘Dead-Internet Theory’ Is Wrong but Feels True – The Atlantic (31 Aug 2021)

    All the levels of redirection (Rant 14 Sep 2012)

    ~

  • Encounter: Visidata

    A terminal interface for exploring and arranging tabular data.

    https://www.visidata.org/

    Short review

    Wired:

    • Very fast on big datasets
    • Easily get the data overview hitting Shift+I (hide irrelevant columns using “-“)
    • Reformatting dates by using regexs (for grouping by day, month etc.)
    • Quickly get an aggregation by choosing a method and hitting Shift+F (hide other columns)

    Tired:

    • UI, or lack thereof
    • Specifying the delimiter in the command line when invoking the tool

    Grouping docs

    https://www.visidata.org/docs/group/

    Github

  • Reference: Import existing source code to GitHub

    If you’ve got local source code you want to add to a new remote new git repository without ‘cloning’ the remote first, do the following (I often do this – you create your remote empty repository in bitbucket/github, then push up your source)

    1. Create the remote repository, and get the URL such as git@github.com:/youruser/somename.git or https://github.com/youruser/somename.gitIf your local GIT repo is already set up, skips steps 2 and 3
    2. Locally, at the root directory of your source, git init2a. If you initialize the repo with a .gitignore and a README.md you should do a git pull {url from step 1} to ensure you don’t commit files to source that you want to ignore ;)
    3. Locally, add and commit what you want in your initial repo (for everything, git add . then git commit -m 'initial commit comment')
    4. to attach your remote repo with the name ‘origin’ (like cloning would do)
      git remote add origin [URL From Step 1]
    5. Execute git pull origin master to pull the remote branch so that they are in sync.
    6. to push up your master branch (change master to something else for a different branch):
      git push origin master

    https://stackoverflow.com/a/8012698/61902

  • Encounter: untools – Tools for better thinking

    https://untools.co/

    Collection of thinking tools and frameworks to help you solve problems, make decisions and understand systems.

  • Encounter: I’m a very slow thinker

    Original post: https://sive.rs/slow

    Quotes:

    I’m a disappointing person to try to debate or attack. I just have nothing to say in the moment, except maybe, “Good point.” Then a few days later, after thinking about it a lot, I have a response.

    People say that your first reaction is the most honest, but I disagree. Your first reaction is usually outdated. Either it’s an answer you came up with long ago and now use instead of thinking, or it’s a knee-jerk emotional response to something in your past.

    When you’re less impulsive and more deliberate like this, it can be a little inconvenient for other people, but that’s OK. Someone asks you a question. You don’t need to answer. You can say, “I don’t know,” and take your time to answer after thinking. Things happen. Someone expects you to respond. But you can say, “We’ll see.”

  • Encounter: Monocle

    “a pocket sized AR device for the imaginative hacker”

    A new packaging for AR et.al.

    Source: https://www.brilliantmonocle.com/

  • Encounter (again): This Person Does Not Exist

    This person does not exist

    With the flood of AI generated imagery, can we still distinguish what is real and what is “fake”? Is it really fake if it was generated by an algorithm?

    This website shows a new face every time it is loaded, and that person does not actually exist. It’s using StyleGAN2 and was created in 2019, but I ran into this again and was fascinated (again).

    With each load, a new face is shown, and that person does not actually exist. This was created in 2019, but I ran into this again and was fascinated (again).

    It is actually still a very good algorithm, very few flaws, at least to my untrained eye (see how can you tell below).

    https://thispersondoesnotexist.com/

    Related

    Have I Been Trained

    https://haveibeentrained.com

    Reverse identification of images used to train models.

    Search 5.8 billion images used to train popular AI art models

    Which face is real

    http://www.whichfaceisreal.com/

    Our aim is to make you aware of the ease with which digital identities can be faked, and to help you spot these fakes at a single glance.

    How can you tell

    https://www.whichfaceisreal.com/learn.html

    TLDR; Potential tell offs

    • Water-splotches
    • Background problems
    • Eyeglasses
    • Asymmetries
    • Hair
    • Fluorescent bleed
    • Teeth

    Stable Attribution

    https://www.stableattribution.com/

    Stable Attribution’s algorithm decodes an image generated by an A.I. model into the most similar examples from the data that the model was trained with.