First experiences with Windows after 6 years of Mac

tl; dr: I’ve rarely had problems with Mac, but have multiple disappointments with Windows, and it’s software and hardware partner products.

I still have a Mac and sometimes work on Linux environments.  On these systems I have never had a catastrophic failure, or only occasionally (less than 10 times in 6 years) had the equivalent of the Windows blue screen of death.

I thought I’d try out Windows 10 on a 1 year old Asus to see what I’m missing.  I’m missing quite a lot of turns out… mainly the intense frustration and increased risk of heart attack that Windows brings.  Instead of having an empty rant (I forget easily) I thought I’d write down my first 5 minutes of experiences.

T minus 1 second;  Power supply:  Neutral:  The power cord is frayed after a year of use or abuse, I’m not sure which.  After a year, my mac power cord was also distorted and the plastic sheath had frayed.  Score: Mac is -1 to Windows/Asus of -1

T 0; launch:  Negative:  I received a functioning fully charged laptop.  As with Mac I closed the lid after I was done with it.  Unlike Mac it managed to drain it’s battery flat within 48 hours of sleeping… Mac: 0 Windows: -2

T +1; launch recovery:  Negative:  Unlike Mac which will retain enough power to display a message saying there’s not enough power to turn on, the Asus/Windows just stared blankly back at me as I politely pressed the power button and waited and repeated and waited.  Mac: +1 Windows: -3

T +2; startup:  Positive:  Power cord in, power button pressed, the machine quickly comes to life, no more 5 minutes of boot time, finally!  Not quite as fast as Mac but reasonable speed so +1 to both.  Mac: +2 Windows: -2

T +3; login:  Negative:  The login screen flashes up with my user name and box for password.  Then is hidden by a cover screen.  Why?  Why would you make some one hunt for the “login button” then not focus the password box.  Mac: +3 Windows: -3

T +4; entry and apps:  Positive:  The previous apps I was using are loaded and waiting.  Mac: +4 Windows -2

T +5; pointless message:  Negative:  An offensively large modal box is plastered over the top of everything saying: “Your battery is low, please plug in your computer”.  … 300 pixels down and to the right there’s a power charging battery symbol… it’s already plugged in.  Who ever is in charge of Window UI/UX needs to be fired.  Now.  Mac: +5 Windows -3

T +6; Edge – search:  Positive:  We now stray away from Mac vs Windows to “other options” vs Microsoft.  In this case Chrome vs Edge, Google vs Bing, etc.  There’s a search box front and centre that takes me to Bing.  Bing’s not bad vs Google which is provided on Chrome by default.  Other +1 Microsoft +1

T +7; Edge – bookmarks:  Negative:  I wanted to bookmark a Google spreadsheet.  I click the bookmark icon, in the background the sheet finished loading and Edge let it steal focus from the bookmark name box.  I’ll need to check but I doubt this is the same behaviour on Chrome.  Other +2 Microsoft 0

T +8; Edge bookmarks part 2:  Negative:  I have a lot of bookmarks so I save space by not giving them a name and instead remember their position… Edge doesn’t allow you to have a bookmark without a name.  No one knows why.  Other +3 Microsoft -1

T +9; Edge spelling:  Negative:  Type google, microsoft, chrome, bing and it only highlights Microsoft and Bing as “errors” even though bing is a legitimate word in it’s own right.  Other +4 Microsoft -2

microsoft errors

That’s five minutes in.  Not a good start.  Microsoft/Windows: -5 Mac/Google/Other: +9   Granted some of these points may have work arounds.  Some of these are just “the windows/Microsoft way”.  When I first started developing on Mac I was shocked how large and painful XCode was to use to develop software with… though we haven’t got to that yet with Microsoft I’m expecting it to be a lot smoother with more powerful tooling for software engineering.

A brand new machine

*update 1* 2018 A brand new machine dies

I had to buy a new hp windows machine.  It’s running windows 10.  I took it home and switched it on.

Negative: The first thing it showed me was a error message about corrupted bios and that it was going to try to restart to repair it.  Wow.  That is pathetic.  It’s so bad it’s impressive.  I can’t reproduce the error message for you because in classic style the error was only shown for a brief time before it moved on.

Once the machine was working…

Edge crashes, reproducibly.  I have a window with 5 tabs.  I want to open another window for my second monitor.  Clicking to create a new tab then dragging off to form a new window works as expected.  Clicking back to the first window crashes edge.  Other +5 Microsoft -3

*update 2* Does Microsoft employ anyone in UX?

Negative: When a new program tries to access the internet / network for the first time Windows 10 helpfully prompts with a message so you can allow or deny access for the program.  There are two optional checkboxes (TODO insert screen shot):

  • allow on private networks only
  • allow on public networks

The latter comes with a helpful message along the lines of: “this is not recommended as public networks can have little or no security”.  Which one do you think the default is checked for?… that’s right, public networks… the not recommended option.

Negative: Automatic updates force you computer to restart.  You don’t get to choose when.  Neutral: It seems you can disable the automatic updates.  Negative: Well no I was just forced to update: “Update then sleep” or “Update then shutdown”… and this probably eventually bricked the machine, see update 4 & 5 below.

Positive:  Mac has really broken their audio stack with their Sierra update.  Windows gives you a fuller though initially confusing control options.

*update 3*

Negative:  Trying to uninstall a piece of software using Windows “Add Remove programs”.  Stops me by saying something is already installing and to try again later… I did not start anything else installing.  What is it installing?  Why has it not informed me of this?  Why does it stop the user from doing something based on an arbitrary decision by another program?  How long should I wait for?  Why does it not offer to prompt me once it’s ready for me?  Very poor UX.

Negative:  Edge not remembering anything about an email address let alone the password for a site I use very often.  Perhaps the HTML is not sufficient to prompt it to use the input fields as email and password fields but Chrome is smart enough.  Poor UX.

*update 4* 2019-07

Negative: I was using the windows successfully. Upon attempting to “sleep” it I was forced to updated it. This took time that I would otherwise not have chosen as I was in a rush to leave.

Negative: Upon turning on the machine it booted slower than normal as it had to finish the installation but otherwise was fine. The mouse moved. But nothing else worked. I was forced to use hard power off.

Negative: On switching it back on the screen was black for minutes after the initial boot loader messages.  Eventually a tiny loading icon appeared.  After another few minutes of no progress I hard powered off again.

Negative: I switched it on and held down shift+f8.  It booted straight into windows.

Negative: I tried to type into the “Type here to search” box to try to find process explorer.  It’s not installed anymore?  Did I imagine it.  On Mac you get activity monitor bundled in.  No matter; the act of typing in “process” has caused the whole search pane to become unresponsive.  It incessantly showed the little loading blue dots at the top and nothing else.  This was doubly annoying as I thought I would manually look through the program list but this was displayed under the search pane so I couldn’t do that either.

Negative: I eventually realise this is a separate program that you now have to install: https://docs.microsoft.com/en-us/sysinternals/downloads/procmon .  And surprise surprise, on maximising the Process Activity Summary window the column headings disappear but reappear when you mouse over them.  Everything windows is beyond unpolished it is corroded, creaking.

*update 5* 2019-07-31

Part 1: Windows self destruction and Automatic Non Repair

When I last left my Windows machine on the desk it was working.  Now when I open the lid it says

Automatic Repair

Followed by

Automatic Repair couldn’t repair your PC

LogFile: C:\windows\System32\Logfiles\Srt\SrtTrail.txt

Wow we didn’t even make it to the end of the month… Meanwhile my MacBook Air of 10 times the age is still working. It’s travelled across town multiple times and run multiple different bits of software. All the Windows machine had to do was not spontaneously break itself.

Part 2: Want to see the LogFile?… it’s gunna cost you.

Try to debug via command prompt (buried deep in some advanced options menu). It loads a command prompt with X:\Windows\System32 … what is the X drive? And why is there no Srt directory in the X:\Windows\System32\LogFiles directory?

This answer solved it: https://superuser.com/a/1117593/148811

Hilariously now the key which has both \ and | is seemingly broken… which is pretty fundamentally limiting when it comes to trying to type in a path to the log file or trying to pipe from one command to another. I don’t think you could write such a comedy catalog of failures. And people use this in critical systems?

Part 3: The error

Boot critical file C:\efi\microshit\boot\resources\custom\bootres.dll is corrupt. How did it get corrupted?

Tried various approaches. No \ or | key makes it very hard so have given up and selected the option to reinstall windows (wipe it clean). After 10 minutes it’s on “Resetting this PC 2%”

Windows: -1000

Part 4: The final nail

After over 2 hours of waiting it’s got to 49% and I go to sleep. In the morning I see it has the hp logo on the screen, I foolishly let a brief moment of joy wash over me, then a second later it powers off, then it powers on, the hp logo, then it powers off. Ad infinitum.

The machine is dead. windows / hp has lost. It will be returned to the shop. I’ll buy a MacBook at twice the price thanks (except I won’t for now as my 6 year old MacBook Air is *still working*). You get what you pay for.

Update 2019-08

John Lewis thinks this level of stability is normal for Windows machine so I can’t return it yet.

Update 2019-10

I’m working on a Mac and the PC and pushing code between the two. It’s 2019, it’s Windows 10, and it still chokes on file names longer than 260 characters.
I take it back. The registry key to allow longer file names was already set but the git for Windows tool defaults to not allowing the longer file names.

Update 2019-10-01

Updates. During EGX games conference I interacted closely with 3 teams. I either directly witnessed or heard after the fact that all 3 teams had to battle to keep their computers running their demo games during the conference in the onslaught of Windows aggressive automatic updating.

Apart from the unnecessary anxiety this inflicted and the poor UX of having to dismiss the dialog every 10 minutes (you only had 90 seconds to do it before it restarted your computer and took almost an hour to process the update) the additional poor UX was the “friendly” dialog that would not suspend your previous program but block you interacting with your game / presentation / video until the dialog was dealt with. Why would you a) plaster it in the middle of the screen and then b) make it modal. You wonder if Window’s actually has UX designers at all.

Needless to say everyone finished the conference successfully as would have been the case if the update was delayed a while.


Update 2020-02

I’ll stop updating this after this last list of fails. There are too many bugs or poor or absent UX decisions in Windows or it’s related hardware or software partners.

  • News App. It refreshes articles periodically. Good. But it will show you an old (interesting) picture and then the new news article with it’s image rolls into place followed by the new headline. If you try to click on the first image it won’t take you to that news article. It will take you to a random news article. I’ve removed the news app. Far simpler.
  • My almost 7 year old Apple machine was working away crunching 12 Gigabytes of data. I accidentally moved the mouse of the windows machine. It woke then immediately went back to sleep. Then showed the HP logo but I couldn’t interact with it any more. Completely unresponsive. Hard power off. Power back on. Shows HP logo & loading icon for 1 minute then 3 minutes of loud fan and a completely black screen. Nothing. 0 user feedback. No loading icon. Just darkness.
  • Paint 3D. You can’t increase the canvas size by crop drag or number.
  • Working using the laptop, on my lap. It’s not plugged into mains. It’s at 20% battery. Periodically checking the battery, it’s going down quickly. At 7% you’d think it’d be fine. No it just powered off. Forced to stop working for the evening and plug it into power. In the morning it starts up and says it’s recovering from a hardware failure then classic completely dark start up screen for 10 minutes. During which time 5 minutes in I moved the mouse and the fan tries to get the computer airborne.
  • Type “virus” into the start bar to find the security settings. Get shown “Virus and threat protection” from “System Settings”. So far so good. Try click on it. Told you need an app to open “Windows Defender”. Didn’t accept that. Navigated through a System settings menu to the “Virus and threat protection”. Works as expected. Repeating steps above then it started working without ever needing to install an app.

It would be difficult to imagine so many fails. And this is at most 10% of them.


Update 2021-01

Opening the settings menu after turning on the Windows computer took 30 seconds to render the settings screen.

Then without asking it to do anything, the fan was flat out for 30 minutes.


Vipassana meditation

I was fortunate to have three separate people mention Vipassana meditation to me over the course of several months a couple of years ago.  I can’t remember what prompted me to sign up last November.  I finally managed to go this September.  It was a fascinating experience.  Very weird compared to our usual way of life or holidays.  But for me at least incredibly rewarding.  About 3 of the 30 males on the course decided to leave early.  This is about normally apparently.  It can at times be terrifying, mentally demanding or perhaps just not what they were open to or expecting right now.  Of the 20 females on the course I don’t know how many decided to leave early but it wasn’t a noticeable decline.

All of the people I spoke to in depth had strange experiences, but all thought it was either a rewarding or very rewarding use of 10 days.

This gives a good partial snap shot of what Vipassana is about. The only disappointing thing about the course was although it claimed to be secular and open to everyone it did have a sprinkling of Buddhism, chiefly the belief in reincarnation. Out of the thousands of things said in the recorded videos, there were 2 or 3 references to it. I spoke to many Christian, Muslim, Atheists, etc afterwards and it was almost universally commented on and for some was a large and disappointing detraction. For most I think it was a minor annoyance that was easily out weighed by the simplicity, secular and helpful power of the technique.

2020-02

I am now hesitant to recommend everyone try it. I’ve now heard multiple first or second hand stories now of those with existing neurotic or mental health challenges who went on the course, misunderstood the technique and made themselves worse. Because it is such a profoundly different way of viewing the world and life, it is really easy to misunderstand the technique. It’s like bad posture. You might know the right way but you’ll catch yourself falling into the old pattern again and again. The technique makes you a lot more aware of your whole body, more sensitive. But without the corresponding equanimity, it can amplify sensations and the old bad habit patterns. It can be very easy, at least initially, to fall back into the same rut of thought processes. And although the technique should be working to lift you out of it, for a small number of people it’s easy to get it wrong and do yourself more harm.

“What the health” – a partial review

I was recently recommended to watch the film “What the health”,  available on netflix: https://www.netflix.com/watch/80174177

Bias:  I’m starting from a position skepticism so I will be looking to pick holes in everything and figure out if it’s reasonable what the directors / writers (Kip Andersen and Keegan Kuhn) are intending to convey. When I hear something that I don’t understand, doesn’t fit with my existing understanding of biochemistry / limited medical knowledge I will try to be as objective as possible in assessing it.

Method:  I will use their data, assess it’s provenance, try to take into account any biases I think they may have and known biases I have and unknown ones I may have. I will try to evaluate their data / observations and those of others as objectively as possible.

[UNASSESSED] Point 1: @~15:40 heterocyclic amines are mentioned as being ?bad? [recheck this].  [Are they?]

[UNASSESSED] Point 2: [follow up on paper and see if it supports what they’re claiming] @~16:13 “Intake of meat, fish, poultry and eggs and risk of prostate cancer progression” -> Richman … et al… Chan

[UNASSESSED] Point 3: [follow up and see if you can find paper to support their claim that] “consuming 1 egg a day is the same as smoking 5 cigarettes per day” [in terms of what, CVD, stroke, cancer?]

[UNASSESSED] Point 4: [follow up and see if you can find paper to support their claims that] Cholesterol and fat “coat” red blood cells and muscle cells.  This:

  • stops muscles cells uptaking sugar
  • changes hormone levels [-> I’d hope it does… you’re levels of Leptin might rise, that’d be good.  But if not Leptin, which hormones?  And is this bad?]
  • Makes blood viscous… [So what?, increases change of Heart attack, stroke?]

[Assessed: NEUTRAL] Point 5: @~18:03 It shows the title for “Meta-analysis of prospective cohort studies evaluating the association of saturated fat with cardiovascular disease” doi: 10.3945/ajcn.2009.27725. He correctly claims it was supported by “National Dairy Council” though it’s not clear from the paper what that means.  From the paper it does say it was:

Supported by the National Dairy Council (PWS-T and RMK) and made possible by grant UL1 RR024131-01 from the National Center for Research Resources, a component of the National Institutes of Health (NIH), and NIH Roadmap for Medical Research (PWS-T and RMK). QS was supported by a Postdoctoral Fellowship from Unilever Corporate Research. FBH was supported by NIH grant HL60712.

So there’s clearly scope for definite bias in their work and findings, but I’d prefer it’s stated as if it’s unstated then you have no idea.

[Assessed: DAMAGING] Point 5: @~18:03 He goes on to quote from another paper: 10.1016/j.ijcard.2003.11.028 “Egg consumption and endothelial function: a randomized controlled crossover trial” which states that:

Subjects first presented for baseline brachial artery reactivity studies (BARSs), lipid panel and weight measurements following an overnight fast. Subjects then returned
for 3 consecutive weeks and underwent BARS following oatmeal ingestion, egg ingestion and ingestion of a sausage and cheese sandwich (comparable to McDonald’s Sausage McMuffink) [15] high in saturated fat, in random sequence.

But he said:

The egg industry similarly funds studies that confuse consumers by making claims that eggs don’t negatively effect heart function.  That is, only when compared to eating a McDonald’s Sausage McMuffin? [exclamation]

So what they’re really saying is eating eggs is just as bad as eating a McMuffin.

Let’s analyse this:

  1. The paper does not compare eating eggs to “eating a McDonald’s Sausage McMuffin”.  It compares the difference between eating oats and eating eggs over 6 weeks.
  2. It finds (according to their statistical analysis and I’ve done stats so I know you can fudge stuff but this paper actually finds) that there is statistically significant a drop in LDL and cholesterol when eating oats vs eating eggs.  Though there is no statistically significant change in flow-mediated vasodilation (FMD) in the brachial artery… which apparently supports the statement that “that eggs [consumed over the short term] don’t negatively effect heart function”… but he doesn’t say that.
  3. Finally he says “So what they’re really saying is eating eggs is just as bad as eating a McMuffin” which is like saying eating eggs is as bad as eating eggs… which is what you’d hope as the McMuffin is meant to have egg in it.  What’s he actually doing is playing off our gut reaction (perhaps correctly) that anything McDonald’s is bad for you… these are weasel words.  He’s not the side of rigorous debate.  He’s a very effective politician.

[Assessed: SEEMINGLY DAMAGING] Point 6: @~18:18 Dr. Michelle McMacken M.D. who it seems is presented as another expert seems to be saying that along with things that sounds bad the first thing she mentions is “heme iron”.  Now everything is toxin in the wrong quantity, even water, but this is not the most obvious of things to highlight.  Are they mis quoting her, did she make a mistake, is she actually an idiot, is heme iron… which is sold as a supplement and present in all your red blood cells in enormous quantity actually bad for you as a supplement?  Who knows.  I thought it was weird to mention it though.

[Assessed: DAMAGING] Point 7: @~23:00 Mike Ewall, Energy Justice Network, Executive Director states:

Dioxins being the most toxic, man-made chemicals known to science

Wrong.  Simply completely wrong. What about VX, or a huge host of other brutal chemical weapons.  Counter: perhaps he doesn’t mean per volume or per weight.  Perhaps he means the effective contamination? i.e. there are millions or billions more tonnes produced so even if it’s 100 thousand times less toxic then when you multiple by a huge volume becomes a big number.

[Assessed: NEUTRAL] Point 8: Mike Ewall continues:

… cause all sorts of things.  They cause endometriosis,

Cynic in me says he’s just chosen a long sounding word.  It’s actually the growth of womb tissue in the wrong place.  Which although potentially very unpleasant / horrific for females… endometriosis is not the first thing to mention when discussing the effects of dioxins on humans and isn’t even mentioned on the WHO site directly.

[Assessed: SEEMINGLY DAMAGING] Point 9: Mike Ewall continues:

… they cause cancers, they cause endocrine disruptions problems. [says stuff about incinerators, doesn’t mention “global” food supply chains are / are hopefully heavily monitored for dioxin levels].  Men have no way in their bodies to get rid of dioxins, but, women have two ways.  They’re both involving having a baby.  One is that dioxin crosses the placenta into the growing infant and the other is that it comes out of the breast milk.

From my limited research it seems true that dioxins have a frightening long half life in the human body.  Obviously we have had limited exposure to these chemicals in our evolutionary history so have no / poor mechanisms to deal with them.  It seems they come from forest fires in huge amounts so I wonder why we’re so bad (biologically) at dealing with them. But if it was true that dioxins were never lost then they would have an infinite half life.  But they don’t.  They have a finite, although long half life in the order or 1 to 10 years according to: http://www.dioxinfacts.org/potency.html  Interesting also according to the same site, the emission of dioxins is predominantly from forest fires now with the reduction due to regulations and technology.  [TODO: cross reference this]

[Stopped at 18:24]: TODO watch the rest.

Node Javascript time between nextTick

Curious to how long node might spend “between ticks”?  The following script gives some insight by using Node’s process.hrtime and process.nextTick (which ensures it is run as soon as event loop is able to accommodate it) vs setImmediate which runs only at a certain part of the Node event loop:

    function run_calc_average(nextFunc) {
        var counter = 0;
        var average_tick = 0;
        var current_time;

        function calc_average() {

            if (counter > 1000) {
                console.log(`average_tick: ${average_tick} ns`);
                return;
            }

            if (counter === 0) {
                current_time = process.hrtime();
                counter += 1;
                nextFunc(calc_average);
                return;
            }

            var diff = process.hrtime(current_time);
            var time_diff = diff[0] * 1e9 + diff[1];
            current_time = process.hrtime();
            var new_count = counter + 1;

            average_tick = average_tick * (counter / new_count) + time_diff * (1 / new_count);

            console.log(`${time_diff},`); //, average_tick);
            counter = new_count;

            nextFunc(calc_average);
        }

        nextFunc(calc_average);
    }

    run_calc_average(process.nextTick);
    // run_calc_average(setImmediate);

The comparison to setImmediate shows it is indeed run “sooner” in the node event loop. Interesting also are the large occasional pauses, sometimes up to 1e6 ns, 1 milli second. Presumably this is the v8 GC kicking in but it would be good to verify.

Some more javascript quirks, function hoisting

What is alerted in each case?:

Q1.

function foo () {
    var bar = function() {
        return 3;
    };
    return bar();
    function bar () {
        return 8;
    }
}
alert(foo());

Q2.

function foo () {
    function bar () {
        return 3;
    }
    return bar();
    function bar () {
        return 8;
    }
}
alert(foo());

Q3.

function foo () {
    function bar () {
        return 3;
    }
    return bar();
    (function bar () {
        return 8;
    });
}
alert(foo());

Answer: 3, 8, 3.

Reason? In Q1, `function bar` gets hoisted to the top of function foo and then overwritten by the function expression of `var bar = …`. In Q2, both `function bar` are hoisted and the second overwrites the first. In Q3, the parenthesises turn `function bar` into a function declaration inside a function expression which prevents it from being hoisted.

Inspired by Function Declarations vs. Function Expressions and confirmed by Hoisting in JavaScript

Low pass filter in Python

The following code shows both a (single pole) low pass filter and a two pole low pass filter.

import pandas as pd
import matplotlib.pyplot as plt

data = list(map(lambda v: [0 if v < 20 else 100, None, None], range(100)))
df = pd.DataFrame(data, columns=['input', 'single_pole_low_pass', 'two_pole_low_pass'])


def pas(df, i, output, alpha=0.1, input_column='input'):
    input_i = df.loc[i][input_column]
    output_i_1 = df.loc[i-1][output] if i > 0 else df.loc[0][input_column]
    output_i = output_i_1 + alpha * (input_i - output_i_1)
    return output_i

for i in df.index:
    output = pas(df, i, 'single_pole_low_pass');
    df.loc[i, 'single_pole_low_pass'] = output
    output = pas(df, i, 'two_pole_low_pass', alpha=0.02, input_column='single_pole_low_pass');
    df.loc[i, 'two_pole_low_pass'] = output

df.plot()
plt.xlabel('time')
plt.show()

Ansible – remote_user and ansible_user

There are multiple ways of setting the user which is used when accessing the remote machines.

Ansible will use:

  1. remote_user set in a role / task
  2. remote_user set in a playbook
  3. remote_user set in an inventory file
  4. -u  on the command line
  5. remote_user set in the config files, of which according to the docs for v2.0 the precedence is:
    • ANSIBLE_CONFIG (an environment variable)
    • ansible.cfg (in the current directory)
    • .ansible.cfg (in the home directory)
    • /etc/ansible/ansible.cfg
  6. If your ~/.ssh/config file contains the Host with a User also specified
  7. Your current user

remote_user is not accessible but is settable and inside tasks ansible_user isn’t settable but it is accessible.  For example in a `playbook.yml`

---
- hosts: all
  remote_user: root
  gather_facts: no
  pre_tasks:
    - debug:
        msg: "remote_user is not accessible, ansible_user is {{ ansible_user }}"

I’d guess / I hope the core team will move to one name and drop the other given time.

What and when should you add another feature?

How do you choose what feature to add (or to remove) next from your product?

The democratic approach

If you have access to them then you can ask your users directly. Including a short video, animation or at minimum a description of what the feature is, and how they might use it. Then you can ask them how valuable it would be to them and how often they might use it. Given this data a direct inference of which features to prioritise may be made.  However the data will still have a statistical skew towards those willing / able to answer your questions. Additionally these are not “questions your Mum could not lie about”, i.e. they are not asking the person about their actual behaviour.  There are therefore two better approaches that may be possible.  The first relies on establishing trust with your customers and asking your questions in a way that encourages dissenting opinions to be expressed: “When was the last time you drank orange juice? – Two years ago? – Ok so you don’t like it then.”.  The second more reliable but even more resource intensive approach is to implement the feature and release to a subset of users with the explanation above.  If they use it and come back to use it then their actions are irrefutable endorsements of the feature.

A second avenue for prioritising features is available if you have people writing in, say on a support email, via twitter or a community Q&A site. You will need to remember to correct for the fact that there will be a signal bias towards people trying to find a solution coupled with their level of commitment to your product to date. In other words even if the most requested feature is talked about 10 times more than the one below, it might only represent 5% of your user base and does not mean they are representative of your whole user base.

The product designer lead approach

The “democratic” feedback lead approach is very powerful but it struggles in at least three areas.

The first is in visionary step changes.  Sometimes a new approach to a problem becomes obvious which is completely different from the old ways of doing things, the classic: “If I asked my customers what they wanted they would have asked for a faster horse, not a motor car” – Henry Ford.  In these cases a flourishing business may be built upon a niche market. This requires the early adopters to be those with similar vision and with money, influence or both.  Given these early adopters the company has a good chance of surviving long enough and being able to educate and create larger markets for their products.

The second scenario where democratic product design fails is in the silent majority.  Those who do not express an opinion even if asked directly.  For simple products this is still a problem as if the direction of the product goes even slightly awry, the product may fail to reach mass adoption.  For complex products, it is necessary to weigh up and favour simplicity over complexity.  The former aiding:

  • explaining your product to new customers
  • on boarding new customers (it being detrimental to be presented with an initially much more complex environment)
  • maintaining your product for existing customers
  • enabling existing customers to sustain the productivity they find with your product
  • enabling existing customers to explain your product to new customers

The third area is the “one-size-fits-none monstrosity“, where thoughtful segmentation of the product allows for several main or niche use cases to be fulfilled without unnecessary product bloat.  This however can rack up large technically debt if not architected correctly.

Default .octaverc for viridis colormap

Use the following as your Octave config file to get viridis colormap and a few other things which in Octave allow you to:


>> A = ones(100,1)*[1:1:100];
>> imagesc(A)
>> vir()

octave-viridis-colour-scheme

Which for most applications yields a better image than the default jet colour scheme:

octave-jet-colour-scheme

Place .octaverc file (place in your home directory ~/):

setenv("GNUTERM","x11"); % get gnuplot to work
PS1('>> ');

% + SET UP VIRIDIS COLORMAP
function _ = vir()

% + FROM https://raw.githubusercontent.com/Gnuplotting/gnuplot-palettes/master/viridis.pal
VIRIDIS = [
0 0.267004 0.004874 0.329415;
1 0.268510 0.009605 0.335427;
2 0.269944 0.014625 0.341379;
3 0.271305 0.019942 0.347269;
4 0.272594 0.025563 0.353093;
5 0.273809 0.031497 0.358853;
6 0.274952 0.037752 0.364543;
7 0.276022 0.044167 0.370164;
8 0.277018 0.050344 0.375715;
9 0.277941 0.056324 0.381191;
10 0.278791 0.062145 0.386592;
11 0.279566 0.067836 0.391917;
12 0.280267 0.073417 0.397163;
13 0.280894 0.078907 0.402329;
14 0.281446 0.084320 0.407414;
15 0.281924 0.089666 0.412415;
16 0.282327 0.094955 0.417331;
17 0.282656 0.100196 0.422160;
18 0.282910 0.105393 0.426902;
19 0.283091 0.110553 0.431554;
20 0.283197 0.115680 0.436115;
21 0.283229 0.120777 0.440584;
22 0.283187 0.125848 0.444960;
23 0.283072 0.130895 0.449241;
24 0.282884 0.135920 0.453427;
25 0.282623 0.140926 0.457517;
26 0.282290 0.145912 0.461510;
27 0.281887 0.150881 0.465405;
28 0.281412 0.155834 0.469201;
29 0.280868 0.160771 0.472899;
30 0.280255 0.165693 0.476498;
31 0.279574 0.170599 0.479997;
32 0.278826 0.175490 0.483397;
33 0.278012 0.180367 0.486697;
34 0.277134 0.185228 0.489898;
35 0.276194 0.190074 0.493001;
36 0.275191 0.194905 0.496005;
37 0.274128 0.199721 0.498911;
38 0.273006 0.204520 0.501721;
39 0.271828 0.209303 0.504434;
40 0.270595 0.214069 0.507052;
41 0.269308 0.218818 0.509577;
42 0.267968 0.223549 0.512008;
43 0.266580 0.228262 0.514349;
44 0.265145 0.232956 0.516599;
45 0.263663 0.237631 0.518762;
46 0.262138 0.242286 0.520837;
47 0.260571 0.246922 0.522828;
48 0.258965 0.251537 0.524736;
49 0.257322 0.256130 0.526563;
50 0.255645 0.260703 0.528312;
51 0.253935 0.265254 0.529983;
52 0.252194 0.269783 0.531579;
53 0.250425 0.274290 0.533103;
54 0.248629 0.278775 0.534556;
55 0.246811 0.283237 0.535941;
56 0.244972 0.287675 0.537260;
57 0.243113 0.292092 0.538516;
58 0.241237 0.296485 0.539709;
59 0.239346 0.300855 0.540844;
60 0.237441 0.305202 0.541921;
61 0.235526 0.309527 0.542944;
62 0.233603 0.313828 0.543914;
63 0.231674 0.318106 0.544834;
64 0.229739 0.322361 0.545706;
65 0.227802 0.326594 0.546532;
66 0.225863 0.330805 0.547314;
67 0.223925 0.334994 0.548053;
68 0.221989 0.339161 0.548752;
69 0.220057 0.343307 0.549413;
70 0.218130 0.347432 0.550038;
71 0.216210 0.351535 0.550627;
72 0.214298 0.355619 0.551184;
73 0.212395 0.359683 0.551710;
74 0.210503 0.363727 0.552206;
75 0.208623 0.367752 0.552675;
76 0.206756 0.371758 0.553117;
77 0.204903 0.375746 0.553533;
78 0.203063 0.379716 0.553925;
79 0.201239 0.383670 0.554294;
80 0.199430 0.387607 0.554642;
81 0.197636 0.391528 0.554969;
82 0.195860 0.395433 0.555276;
83 0.194100 0.399323 0.555565;
84 0.192357 0.403199 0.555836;
85 0.190631 0.407061 0.556089;
86 0.188923 0.410910 0.556326;
87 0.187231 0.414746 0.556547;
88 0.185556 0.418570 0.556753;
89 0.183898 0.422383 0.556944;
90 0.182256 0.426184 0.557120;
91 0.180629 0.429975 0.557282;
92 0.179019 0.433756 0.557430;
93 0.177423 0.437527 0.557565;
94 0.175841 0.441290 0.557685;
95 0.174274 0.445044 0.557792;
96 0.172719 0.448791 0.557885;
97 0.171176 0.452530 0.557965;
98 0.169646 0.456262 0.558030;
99 0.168126 0.459988 0.558082;
100 0.166617 0.463708 0.558119;
101 0.165117 0.467423 0.558141;
102 0.163625 0.471133 0.558148;
103 0.162142 0.474838 0.558140;
104 0.160665 0.478540 0.558115;
105 0.159194 0.482237 0.558073;
106 0.157729 0.485932 0.558013;
107 0.156270 0.489624 0.557936;
108 0.154815 0.493313 0.557840;
109 0.153364 0.497000 0.557724;
110 0.151918 0.500685 0.557587;
111 0.150476 0.504369 0.557430;
112 0.149039 0.508051 0.557250;
113 0.147607 0.511733 0.557049;
114 0.146180 0.515413 0.556823;
115 0.144759 0.519093 0.556572;
116 0.143343 0.522773 0.556295;
117 0.141935 0.526453 0.555991;
118 0.140536 0.530132 0.555659;
119 0.139147 0.533812 0.555298;
120 0.137770 0.537492 0.554906;
121 0.136408 0.541173 0.554483;
122 0.135066 0.544853 0.554029;
123 0.133743 0.548535 0.553541;
124 0.132444 0.552216 0.553018;
125 0.131172 0.555899 0.552459;
126 0.129933 0.559582 0.551864;
127 0.128729 0.563265 0.551229;
128 0.127568 0.566949 0.550556;
129 0.126453 0.570633 0.549841;
130 0.125394 0.574318 0.549086;
131 0.124395 0.578002 0.548287;
132 0.123463 0.581687 0.547445;
133 0.122606 0.585371 0.546557;
134 0.121831 0.589055 0.545623;
135 0.121148 0.592739 0.544641;
136 0.120565 0.596422 0.543611;
137 0.120092 0.600104 0.542530;
138 0.119738 0.603785 0.541400;
139 0.119512 0.607464 0.540218;
140 0.119423 0.611141 0.538982;
141 0.119483 0.614817 0.537692;
142 0.119699 0.618490 0.536347;
143 0.120081 0.622161 0.534946;
144 0.120638 0.625828 0.533488;
145 0.121380 0.629492 0.531973;
146 0.122312 0.633153 0.530398;
147 0.123444 0.636809 0.528763;
148 0.124780 0.640461 0.527068;
149 0.126326 0.644107 0.525311;
150 0.128087 0.647749 0.523491;
151 0.130067 0.651384 0.521608;
152 0.132268 0.655014 0.519661;
153 0.134692 0.658636 0.517649;
154 0.137339 0.662252 0.515571;
155 0.140210 0.665859 0.513427;
156 0.143303 0.669459 0.511215;
157 0.146616 0.673050 0.508936;
158 0.150148 0.676631 0.506589;
159 0.153894 0.680203 0.504172;
160 0.157851 0.683765 0.501686;
161 0.162016 0.687316 0.499129;
162 0.166383 0.690856 0.496502;
163 0.170948 0.694384 0.493803;
164 0.175707 0.697900 0.491033;
165 0.180653 0.701402 0.488189;
166 0.185783 0.704891 0.485273;
167 0.191090 0.708366 0.482284;
168 0.196571 0.711827 0.479221;
169 0.202219 0.715272 0.476084;
170 0.208030 0.718701 0.472873;
171 0.214000 0.722114 0.469588;
172 0.220124 0.725509 0.466226;
173 0.226397 0.728888 0.462789;
174 0.232815 0.732247 0.459277;
175 0.239374 0.735588 0.455688;
176 0.246070 0.738910 0.452024;
177 0.252899 0.742211 0.448284;
178 0.259857 0.745492 0.444467;
179 0.266941 0.748751 0.440573;
180 0.274149 0.751988 0.436601;
181 0.281477 0.755203 0.432552;
182 0.288921 0.758394 0.428426;
183 0.296479 0.761561 0.424223;
184 0.304148 0.764704 0.419943;
185 0.311925 0.767822 0.415586;
186 0.319809 0.770914 0.411152;
187 0.327796 0.773980 0.406640;
188 0.335885 0.777018 0.402049;
189 0.344074 0.780029 0.397381;
190 0.352360 0.783011 0.392636;
191 0.360741 0.785964 0.387814;
192 0.369214 0.788888 0.382914;
193 0.377779 0.791781 0.377939;
194 0.386433 0.794644 0.372886;
195 0.395174 0.797475 0.367757;
196 0.404001 0.800275 0.362552;
197 0.412913 0.803041 0.357269;
198 0.421908 0.805774 0.351910;
199 0.430983 0.808473 0.346476;
200 0.440137 0.811138 0.340967;
201 0.449368 0.813768 0.335384;
202 0.458674 0.816363 0.329727;
203 0.468053 0.818921 0.323998;
204 0.477504 0.821444 0.318195;
205 0.487026 0.823929 0.312321;
206 0.496615 0.826376 0.306377;
207 0.506271 0.828786 0.300362;
208 0.515992 0.831158 0.294279;
209 0.525776 0.833491 0.288127;
210 0.535621 0.835785 0.281908;
211 0.545524 0.838039 0.275626;
212 0.555484 0.840254 0.269281;
213 0.565498 0.842430 0.262877;
214 0.575563 0.844566 0.256415;
215 0.585678 0.846661 0.249897;
216 0.595839 0.848717 0.243329;
217 0.606045 0.850733 0.236712;
218 0.616293 0.852709 0.230052;
219 0.626579 0.854645 0.223353;
220 0.636902 0.856542 0.216620;
221 0.647257 0.858400 0.209861;
222 0.657642 0.860219 0.203082;
223 0.668054 0.861999 0.196293;
224 0.678489 0.863742 0.189503;
225 0.688944 0.865448 0.182725;
226 0.699415 0.867117 0.175971;
227 0.709898 0.868751 0.169257;
228 0.720391 0.870350 0.162603;
229 0.730889 0.871916 0.156029;
230 0.741388 0.873449 0.149561;
231 0.751884 0.874951 0.143228;
232 0.762373 0.876424 0.137064;
233 0.772852 0.877868 0.131109;
234 0.783315 0.879285 0.125405;
235 0.793760 0.880678 0.120005;
236 0.804182 0.882046 0.114965;
237 0.814576 0.883393 0.110347;
238 0.824940 0.884720 0.106217;
239 0.835270 0.886029 0.102646;
240 0.845561 0.887322 0.099702;
241 0.855810 0.888601 0.097452;
242 0.866013 0.889868 0.095953;
243 0.876168 0.891125 0.095250;
244 0.886271 0.892374 0.095374;
245 0.896320 0.893616 0.096335;
246 0.906311 0.894855 0.098125;
247 0.916242 0.896091 0.100717;
248 0.926106 0.897330 0.104071;
249 0.935904 0.898570 0.108131;
250 0.945636 0.899815 0.112838;
251 0.955300 0.901065 0.118128;
252 0.964894 0.902323 0.123941;
253 0.974417 0.903590 0.130215;
254 0.983868 0.904867 0.136897;
255 0.993248 0.906157 0.143936;
];
% – FROM https://raw.githubusercontent.com/Gnuplotting/gnuplot-palettes/master/viridis.pal

colormap(VIRIDIS(:,[2 3 4]));
endfunction

% – SET UP VIRIDIS COLORMAP