Jaran Flaath

Thoughts on life, work and the universe. Sometimes writing in English og noen ganger på norsk.

This is a repost of the original from my previous blog at https://world.hey.com/jaran.flaath

Inspired by Simon Sineks chat with Seth Godin, I started reflecting on how we talk about the people using the things we make.

“Users” is a very common concept in the world of software and services. What if the way we talk and think about the people using our products and services impacts how we see them and our empathy towards them – and in turn the quality of what we offer?

Talking about people as users automatically creates a distance and an unempathetic relationship with the entities that are interacting with what we are making. This in turn makes it much easier to blame them for things that goes wrong. “It's a user error” is much easier to say than, “this person is using my product incorrectly”. The former is creating a much greater distance between us, our product and the person using it. The latter makes it harder to put the blame on the other part because we are talking about an actual person.

We should start talking about the people using the things we make, instead of calling them users. We should consider them humans, rather than an ID and collection of metadata in our database.

There is no user error, there is a human using the thing you have made to the best of their knowledge. If they experience something not working, it's a product error, it's a usability error – not a human error.

We talk about human errors in lots of cases. A driver accidentally hits the accelerator instead of the brakes and crashes their car. We call this a human error. I want to challenge this misconception. This is ultimately a product error, or a usability error. We should have made the product so that it was not possible to get into the faulty situation in the first place.

This is obviously a lofty goal: To eradicate any opportunity for humans to make mistakes when using any product or service. However, stretching for it – to make everything for the human and not the user – don't you think it could help us improve the things we make? And, with greater empathy as an added bonus?

For your next product carry out an experiment: Instead of creating a User-database, create a Human-database, with a humanId, a humanname – not a userId or a username.

And remember, we are also the human. Countless times every day.

This is a repost of the original from my previous blog at https://world.hey.com/jaran.flaath

I have done something radical. I have deleted my entire Goodreads “Want to read” list. All 164 books. Well, almost. I have 8 books left, but the rest is gone.

We keep making never ending lists. We create todo lists of everything we want to do, but never get around to doing. We create bookmarks of internet sites we will never look at again. We create vast list of films and series to watch which we will never get around to, and: Lists of books we'll never get around to reading.

We humans have a tendency to collect stuff we believe is, or will be, useful. And it makes us feel good. It gives us the feeling we're organised and doing something valuable. However, in most cases we're only setting ourselves up to feeling miserable and guilty in the end. I will never get around to reading those 152 books I found so interesting. Those 583 bookmarked articles you have saved in your browser will never see the light of an open tab again.

It's probably some form of FOMO driving this, and it may even turn into guilt for not reading all the works the authors has put so much effort into.

From now on, whenever I need something new to read, I will do the research for the next book there and then. No more piling up what I should read in 6 months time.

There will always be a new book from one of my favourite authors, there will always be a new topic I find interesting. What I want to read will have shifted by the time those 6 months has passed, so better leave it to future me to decide.

The only exception to this “No more Want to read-listing” rule is a couple of highly valued fiction series I want to keep up to date on, and a few philosophy books I don't want to forget. That makes 8 at the moment. Pretty radical.

This is a repost of the original from my previous blog at https://world.hey.com/jaran.flaath

Following up my previous rant on signups, I am proposing a new tool into the lean product development toolbox: The Minimum Viable Signup.

We often focus on the process of signing up and onboarding users, but I want us to focus more on the information we collect during the signup and onboarding instead, and let that drive the process.

Let's focus on the absolute minimum of information we really need to ask for in order to get users in the door and on to what they are here for – perhaps to give us their money.

Our Minimum Viable Product is bust if we place it behind a MICS (a Maximum Information Collection Signup, a term brilliantly coined by yours truly, thank you). We will never actually know if our MVP is floating, because many of our users jump ship before we’ve even left shore.

Don’t hide behind authentication database requirements. If our backend can’t accommodate a signup that favours our customers, then we do something about that backend. We should not place the burden on our users by requesting a two page schema of information, just “because the database requires it”.

We are not in a position to make our users go through an audition to be let in. We are the ones on stage, needing to prove that we are worthy of their time and money. We should not waste the chance by asking for the names of their pets.

Next up: Minimum Viable Offboarding.

This is a repost of the original from my previous blog at https://world.hey.com/jaran.flaath

Too often is onboarding about getting as much information about users as possible, before they are given access to what they actually came to you for.

We take our users through screen after screen, asking for contact details, adresses, names, newsletter preferences, interests. You name it.

There is an opportunity in turning this on its head. Ask for as little as you can possibly need to get the user in the door and on to the bits of your product that they are after, perhaps interested in buying. Figure out the rest later.

Your users are much more likely to favour you over the competition if you don't waste their time.

Less is more. That also goes for user details.

This is a repost of the original from my previous blog at https://world.hey.com/jaran.flaath

I often wonder where we would be today, if all the effort we put into making products and services whose only goal is to enable and enforce junk values, were instead put into solving real problems for humanity. If we instead created products whose purpose was to enable humanity to be the best we could possibly be. Imagine that.

Why do we have this obsession with creating things that by design appeal to the weaker parts of our mind? Why the focus on creating products that tie us in and create a demand for more, more and ever more? Whether it's money, shiny things, or ever more attention in social media.

We don’t need this. We need tools, services and products that are enabling us to be the best humans we can be. Both to ourselves and our neighbours. Tools and products that work towards solving our important issues rather than enabling infinite new ones.

I would love for the tech world to start putting the following ethical question as the base of every decision to create something new:

Will this make the world a better place? Will the thing I am proposing to create enable humans to be the better version of themselves and a better human towards others? Or, am I creating something that enables more junk values and exploits my fellow humans, only to profit?

Instead, we too often ask ourselves:

How can we exploit this opportunity to secure our piece of the market and maximise profit?

That is not what the world needs. We should really start reconsidering our priorities. We need to make technology for people – not to people.

This is a repost of the original from my previous blog at https://world.hey.com/jaran.flaath

Being a parent is hard.

It's easy to fall into strict, rigid patterns in your parenting strategy. We're blasted with articles, books and know-it-all parents that want to tell us the right way to do parenting.

It's easy to believe you have to find the correct stance on every aspect of parenting and stick to it.

What's become clear to me is that similar to many of my other areas of life, things are constantly shifting, new information comes up and you gain new perspectives.

Don't stay on your path just because you decided so way back at the edge of the forest. Explore. Stray from the path to gain new perspectives and adapt to whatever challenges you are faced with.

It's important to be a dependable parent for your kids, but it's two very different things to be dependable and to be adamant in your approach to parenting.

Kids – humans of any age for that matter – have basic needs that needs to be in place. As long as those are in place, attempt to approach parenting with an open mind and curiosity. You don't have to have a rigid regime on every part of life, and your parenting style.

I am not promoting free upbringing with no limits or restrictions. I am a believer of solid guidelines and passing on your definition of being a good human being to your little ones.

My realisation is that with an open mind and curiosity towards parenting, you will give yourself more headspace and fewer chances of feeling inadequate.

No one has all the answers. Be open to changing your mind. Do the best you can with the information you have at hand.

Realise this and you will have a better life as a parent.

This is a repost of the original from my previous blog at https://world.hey.com/jaran.flaath

It is no news that the online debate climate is polarised, aggressive and more focused on getting your point across at the least possible characters, than actually engaging in a healthy debate.

Many topics benefit from being discussed in the open, and there are still arenas for open civilised discussions. For most online media today though, the boat has sailed and has long disappeared off the horizon.

When you are about to enter a discussion, consider whether you, the person you are entering into the discussion with and the topic at hand benefits in any way from having the discussion in the open. Even if the answer should come back “Yes”, I would urge you to consider taking the debate private first before moving it to an open forum.

The thing is, when you conduct the discussion in private, without a thousand eyes watching, analyzing, considering every word you type, every punctuation, the focus of the debate and how you enter into it changes dramatically. You’re also free from the reduction of your communication into simple, single dimensional measurements such as likes and retweets.

Suddenly you are writing for the sake of debating, for trying to get your point across in a way that can be understood.

From my experience it is also so much easier to be considered under the best possible intentions, rather than the opposite – which is usually the case with most online communication. You are likewise more open and understanding towards the views of your opponent, which is a huge benefit for everyone.

Next time you’re about to enter into a discussion, consider moving it to a private channel. I am sure you will be positively surprised about the outcome.

This is a repost of the original from my previous blog at https://world.hey.com/jaran.flaath

Changing our minds is one of the most difficult things we human beings do. We very easily marry our beliefs, and this bond grows stronger and stronger with more evidence to the contrary of our stance.

As David Heinemeier Hansson points out in one of his recent posts, this is perhaps even more difficult when your opinions has been filling up your social feeds for years. How will it look if your blatant stance on something changes to the opposite? “I'll come across as a huge hypocrite! Better dig in deeper and ride the storm.”

Changing your mind is in fact a great way to build trust. You should welcome any opportunity to be converted to a different view in face of new information. There is little more trust building than presenting someone with new information and have them admit “You know what? This changes everything. Thank you for showing me this and changing my mind”.

There is no weakness in changing your mind. Quite the opposite; it's a huge show of strength. And it shows that this is a person you can trust. In the face of information they will not cling to their beliefs, but consume and consider the information. If evident they were wrong, they will change their mind.

This obviously goes both ways. Your current beliefs may be just as wrong, and should be changed in face of new information.

I believe this is also the case when interacting with your kids. There is no greater way to build trust with your kids than to admit you were wrong and change your mind. Not to forget you are also giving them an invaluable trait in teaching them it is OK to be wrong.

As a parent it's easy to react harshly, stand too firm, or react with disproportionate punishment. Parenting is hard, and it's difficult to process feelings, information and navigate parenting best practices at the rate the kids grow up. Being faced with arguments from your kids and admitting you were wrong, and they right, can be a huge trust builder. It's not a display of weakness, it's a huge show of strength.

Don't dig in deep. Be open and curious. It will build your trust in others and their trust in you.

This is a repost of the original from my previous blog at https://world.hey.com/jaran.flaath

The last two years I have been reading the Culture series by Iain M. Banks. It's a grand space opera set in an incredibly immersive universe – in fact quite overwhelming at times.

As a kid I used to love reading fantasy, dreaming away into magical worlds filled with heroes and monsters. Becoming older, I have a hard time immersing in those fantasy worlds to the same extent, and only a few series has really managed to grasp my attention.

Sci-fi and space opera has in many ways become the replacement for my childhood dives into far-away imaginative worlds, and has given me many of the same delights and escapes from reality.

The Culture series has so far been the number one sci-fi experience. Much because the universe is both so far away from reality that you can enjoy it for its fiction, and at the same time there are plenty of ties to todays society and social structures – which makes it feel not that distant at all.

The Culture is an advanced constellation of both human and alien species coming together to form a solidarity galaxy-spanning society, run in large by Minds. Minds are highly sophisticated AI's. Sophisticated to the point where they can't really be labeled artificial anymore. Minds can run space ships and Orbitals, which can be hundreds to thousands of kilometers wide and long. Massive things, where billions of beings can spend their entire lives, travelling through the universe. It is immensely entertaining when Banks explores these concepts, and especially when he connects them with more primitive civilisations – similar to, or even less developed than todays inhabitants of Earth.

I think the top factor that makes this series so appealing to me is the way it gives hope for a prosperous future, beyond the challenges we are currently facing on planet Earth. Environmental issues, energy shortages, poverty, disillusioned and spurned leaders waging war for no reason, are still all factors in the less developed civilisations, but there are also clear paths for advancement to a more advanced, more civilised version of their societies.

The concept of Change Agents that are silently injected into civilisations to (unknowingly to most of them) bend and groom them for first contact and the next steps. It's mind boggling to think upon, and vastly entertaining to read about. Consider this in the context of our own civilisation, you quickly start to look at Elon Musk in a very different light...

It's really a fresh breath of air, which at the same times gives a good sized sliver of hope for the Earth based civilisation most of us are a part of – for the time being.

This is a repost of the original from my previous blog at https://world.hey.com/jaran.flaath

The official Android documentation gives little in terms of best practices around versionCode, apart from that it has to be an ever increasing integer.

We have been using the Git commit count as the versionCode, on the projects where I have been involved. This has been a success in most cases, however there are a couple of issues with this approach:

  • It requires external command line tools to generate the number
  • It does not work well with Github Actions (even if the workflow can be configured to resolve this, if you really want to use the Git commit count), and we have increasingly been moving projects to Github Actions
  • If you should deploy bundles from different branches with different commit counts you can run in to problems

The best would obviously be if we could have an automatically generated versionCode which require no external tools and no special configuration, that would be for ever increasing for every build.

The Proposal

The latest proposal on the table: The Time Based Semantic Version Code 2000 (TTBSV2K)

TTBSV2K attempts to turn the versionCode into something which can be decoded (relatively easy), is automatically generated and does not require any external tools.

TTBSV2K has the format:

YYDDDMMMM

where

    YY is the current year (last two digits): 22, 23, 24
    DDD is the day of the year, 0-padded: 001, 056, 366
    MMMM is the minute of the day, 0-padded: 0001, 0790, 1440

This gives you a more easily decodable versionCode: 220590790

The Code

For your Kotlin DSL app/build.gradle.kts file, add these imports to the top:

import java.time.LocalDateTime
import java.time.ZoneId

and put this somewhere else in the file:

fun generateVersionCode(): Long {
    val now = LocalDateTime.now(ZoneId.of("UTC"))
    val versionCode = "${now.year - 2000}" +
            now.dayOfYear.toString().padStart(3, '0') +
            (now.hour * 60 + now.minute).toString().padStart(4, '0')
    return versionCode.toLong()
}

If you're using the Groovy DSL, add the following snippet to your app/build.gradle file:

import java.time.LocalDateTime
import java.time.ZoneId

static Integer generateVersionCode() {
    def now = LocalDateTime.now(ZoneId.of("UTC"))
    def versionCode = "${now.year - 2000}" +
            now.dayOfYear.toString().padLeft(3, '0') +
            (now.hour * 60 + now.minute).toString().padLeft(4, '0')
    return versionCode.toInteger()
}

The generateVersionCode function can then be called where you set the app's versionCode:

android {
    defaultConfig {
        versionCode generateVersionCode()
        versionName "1.0"
        ...
    }
}

✉️ Feel free to email me your thoughts on The Time Based Semantic Version Code 2000.

Disclaimer: This versionCode scheme will no longer work starting January 1st 2100 00:00:00. If you believe your app will still be in production and on the Play Store on that date, you might want to add some form of warning for your future team mates – so they can prepare.

Enter your email to subscribe to updates.