Last updated: January 23, 2017 10:22 AM (All times are UTC.)

January 23, 2017

In which the quantity 1/"booleans per module" is proposed as a software quality metric, and readers are left hanging.

January 18, 2017

Be Humble by Shaun Finglas (@ShaunFinglas)

Some of the best developers I know treat everyone with mutual respect. Not only this they are open about what they do know and what they don't know. In fact they'll often proclaim I don't know and go about finding out how they can answer your question or solve a particular problem.


A past mentor of mine had a wealth of experience in both the domain and software development itself. In contrast I had no domain experience and very limited practical ability. Despite this gap I was treated as they would treat an equal. No matter how stupid or basic my questions.

However our roles switched one day when I explained about my background in games programming. My mentor decided to have a go, a topic on which he knew nothing. He was both humble and happy to be led and openly admitted his shortcomings. In the end we were able to build a basic game. Here I answered what I considered basic questions, while he gained experience.

Opposite Example

On the other hand some of the worst developers I've worked with are the opposite of the past example.

  • They won't admit they don't know the answer.
  • They won't ask for help.
  • They won't treat others as equals.
  • They won't admit they were wrong.


Software languages, tools and techniques rapidly change. You can't know everything. You can be the expert of one topic one day, and the beginner in another area the next day. Embrace this and learn as you go. Just be humble about it.

  • Admit it when you don't know the answer. Find out if you can.
  • Ask for help.
  • Treat everyone equally, as you would like to be treated yourself.
  • Admit it when you are wrong.

January 15, 2017

You’ve probably already heard about mastermind groups and how great they are. I know I kept hearing about them. So, last year, I started a mastermind group to find out what it was all about. And the verdict?

Being in an active mastermind group – with the right people – is one of the best ways you can invest in yourself and your business.

In this two part blog post, I’ll share what I’ve learnt about mastermind groups. In this post I’ll explain what mastermind groups are, why you should be part of one, and how you might go about starting one. In the next post, I’ll share the format we use in our mastermind group.

Let’s start with the obvious question:

What is a mastermind group?

A mastermind group is a group of like-minded people who share a common goal. They meet (physically or virtually) on a regular basis to discuss what they’re working on and what problems they’re facing.

You could think of it as a circle of professional friends. They might not be people you know to start with but over time you will become friends. You’ll help each move forwards by holding each other accountable and by providing support.

Epictetus, the Greek Stoic philosopher, wrote “the key is to keep company only with people who uplift you, whose presence calls forth your best.” And in a nutshell, that’s what a mastermind group is all about.

Mastermind groups come in all shapes and sizes. I’ve heard of groups ranging from 3 people to as large as 15. Some are held weekly, others monthly. There’s no one format that will work for everyone, so each group will need to experiment to see what works for them.

Why be part of a mastermind group?

Earlier I remarked that mastermind groups are one of the best ways you can invest in yourself and your business. Why is that? Well, here are some of the benefits I’ve found from being in a mastermind group:

An incentive to be more intentional about your business

As freelancers or business owners, it’s all too easy to get caught in the trap of “working in the business, not on the business”. We spend all of our time working for our clients, but very little time looking at the big picture or asking important questions. Regular mastermind meetings are a great way of breaking this habit and encourage you to start working on your business.

Makes you accountable for your actions

During each mastermind meeting, we share the things we want to accomplish by the next meeting. We write down these goals and they’re the first thing we review at the next meeting. You don’t want to be the one missing their goals. It’s a great incentive to not only make sure you’re setting the right goals, but also making time in your schedule to work on them.

A private support group

If I have a difficult situation with a client and I need some advice, or I need some feedback on something I’m working on, my mastermind group is the first place I turn to. It’s far more powerful than asking for advice from people you don’t know in forums or online chats who can only offer generic advice (that may or may not be useful). Over time, your mastermind group will learn more about you, your business, and your goals. They can then offer their own experience and expertise against your current situation.

A place to have deep discussions about your business

While I have lots of friends in the industry, there’s very few people I feel I can chat about the intimate details of my business with. Being able to vent and speak about things on your mind with others who have similar problems is both therapeutic and immensely valuable.

It’s motivating and encouraging

Working for yourself is difficult. We all encounter difficult days or weeks. Sharing small wins with the group can really help you see the bigger picture. Everyone in a mastermind group wants you to succeed and they’ll both help inspire and encourage you. I often come out of our mastermind calls excited about what I need to work next.

Moments of clarity

When you’re in the trenches, it’s hard to see the bigger picture. The path to where you want to be isn’t linear and it’s often hard to know what to work on next. It might be through the entire group brainstorming around a problem you’ve got, or might just be during a private session of exploration, but a mastermind group will help you find moments of clarity. The fog suddenly shifts and the path becomes clear. Sounds dramatic but this happened to me several times last year.

Starting a mastermind group

Sold on mastermind groups? Great. So, how do you become part of one?

You have two options: you can either join an existing mastermind group or start a new one. I took the latter option and started my own, and, unless you know of an existing mastermind group that you’d like to join, that would be my recommendation.

Find the places where the kind of people you want to connect with hang out and go ask. Freelancers Hub, for example, is a group of freelancers on Facebook and would be a great place to find like-minded people. You could also try on forums, Slack groups, or at conferences/meetups.

I tweeted asking if anyone was interested in starting a mastermind group. I had 5 responses and that was it; our group was born. It was that simple, so just go ask.

It’s important, however, that you find the right people. Your mastermind group will only be as strong as your weakest member.

Here are some thoughts on the kind of people you want:

  • Reliable and punctual. You’ll be meeting on a regular basis so you really don’t want anyone that’s flakey and keeps missing meetings.
  • Driven and motivated. The group benefits from positive energy. You want people who are getting things done, because that motivates everyone and helps drive the group forward.
  • Are already in business. You want people who are already running a business and not wanting to start a business. If they’re not yet running a business full-time, they’ll have a different set of problems and priorities.
  • Similar businesses. If one person runs an online store and another runs a brick and mortar shop, there’s a good chance that they won’t have enough overlapping experience to help each other. You’ll want to find others that run similar businesses, so you can share problems and experiences.
  • Diverse skills. You’ll want to find people with diverse skills and interests. The more diverse the skills are within your group, the better the group will be at problem solving, giving feedback, and providing solutions.
  • Make sure it’s the right time for them. A mastermind group isn’t right for every business owner, all of the time. People have personal lives and personal issues. There are times in one’s life when joining a mastermind group isn’t the right thing to do. Make sure they have the time and energy to invest in the group.

You’ll also have to consider how many people you’d like in your mastermind group. I would recommend a minimum of 3 people. Our mastermind group of 4 works well. If one person can’t attend a meeting, there’s still 3 of us. As the group gets larger, you’ll have less time focused on you and your business. I would recommend setting a limit of 5 people – at least in the early days while you get the group started.

Running your first mastermind session

Once you’ve found a group of people to start a mastermind with, schedule your first meeting. Your first meeting will be about setting expectations. Here are some things to consider:

Have a facilitator

One person needs to keep an eye on the clock, keep discussion focused, and move the discussion along when needed. We rotate the facilitation role for each meeting.

Set the group rules

Our own group is very relaxed and we have very few rules. But you do need to make a few things clear. You need to turn up regularly. You need to do a little prep work before each meeting. And it’s important that what’s shared in the mastermind group remains in the mastermind group. To get the most value, you have to be honest and that means sharing sensitive information from time to time. You have to be able to trust those in the group. If you’ve set the group up with people you don’t know, this trust might take a while to establish. Straight forward stuff, but worth making clear.

Have a cooling off period

The only way to know if a mastermind group if right for you is to try it. For that reason, make it easy for people to leave the group if the fit isn’t right. The general rule I have is: make it easy for people to leave, but hard for new members to join.

Find a fixed meeting date

Find a set date that you can meet on that works for everyone in the group (ours is every other Friday at 9:30am). Don’t deviate from that time unless absolutely necessary. Trying to schedule each individual meeting is a nightmare and will lead to missed meeting. Set a time and make sure everyone in the group sees it as a priority on their calendar.

The first meeting agenda

I suggest keeping the first meeting agenda short and sweet. Write up a set of questions and send it to everyone in the group so that they can prepare. Some questions could be:

  • What do you want to get out of the mastermind?
  • What are you working on?
  • What do you need help with?

Wrapping up

I’ve found that being part of a mastermind group is absolutely worth the time and effort it requires. If you’re an independent worker (freelancer, consultant) or running a small business, I really think you’ll get a lot from it. Not only is the insight you’ll get incredibly value, it’s also inspiring to see the behind-the-scenes of others on their journey.

If you have any questions, or if I missed anything, drop me a line at

January 14, 2017

I discovered by searching the interwebs that a significant number of people who try out GNUstep get stuck at the “I wanted to do Objective-C on my Linux so I installed GNUstep…now what?” stage. There are some tutorials for GNUstep around, but they’re not necessarily easy to find, and not necessarily pitched at beginners. Otherwise, you’re told to look at the Cocoa documentation, and as Xcode’s user interface turned into a combine harvester, Apple moved to Swift, and other changes happened, the relevance of Apple’s documentation to GNUstep has been on the wane for years.

Therefore today I’m launching the GNUstep Developer Guide. It’s not yet pretty, it’s not yet complete, but it is a place to look for GNUstep documentation written for GNUstep programmers. The first guide is up: the introduction to ProjectCenter and GORM.

Let me know if you find it useful!

January 12, 2017

This post on semantic versioning reminded me that we’re making a future in which Ubuntu 01.04 will be newer than Ubuntu 99.10.

This is fine.

January 11, 2017

Your tests all pass locally. One test fails in your GitLab CI build. Sound familiar? Of course it does. This is painful work to resolve. You have to make single changes to your GitLab CI build file and push them to your origin one at a time until your builds pass or you give up […]

Most projects have some form of convention. Examples would include:

  • Attributes/Properties for REST API's
  • Inheritance for third party base types
  • Assemblies/Packages for third party code that is loaded dynamically
  • Folder or namespace conventions
  • And many other forms of conventions

In a few of these examples static analysis can detect issues, but the majority of these problems would resolve only at runtime.

A technique I've used in the past to great success is the concept of convention based tests (CBT). These are tests that ensure a particular convention is followed. As a general practice CBT tend to be written after the discovery of a problem as it is preferable to rely upon higher level tests initially. The good news is that CBT ensure that such problems never return and if a convention is broken you'll be notified during your test run.

In terms of quantity there will be a very small number of these tests, and unlike typical tests that focus on behaviour rather than implementation, these tests are focused on implementation.


Tests generally should favour readability and clarity over the removal of duplication. Additionally the use of programming constructs such as loops or conditionals within tests are usually a bad idea. Using reflection is not recommended in most cases though the opposite is true for CBT.

Reflection allows the previous examples to have tests written in a fairly flexible and dynamic manner. Future changes would automatically be tested.

  • Tests to ensure particular types within a namespace have the correct attribute/property applied.
  • Tests to ensure particular types within a namespace have the correct base class.
  • Tests that assemblies/packages required at runtime are present within the bin directory.
  • Tests that folders/namespaces match a team/project naming standard.
  • And so on.

Simpler Tests

In some cases reflection is not a suitable tool for convention based tools. In this scenarios a simpler style of test is required. These are essentially convention based tests that ensure additional tests are written. These simple tests act more as a prompt to the developer reminding them to add a test for a particular convention.

This test would first detect how many types exist within the namespace and then detect how many tests have been written for those types. While this style of test does nothing other than really count the number of expected conventions versus the number of tests, the failure of this test provides a hint to the developer that they have forgotten something.

The key with these simple detection tests is to provide a good failure message that includes details on why the test failed, and more importantly why and how a new test should be added.

These simple CBT work when the use of reflection is difficult. While they may seem primitive, they do provide value as simple reminders to add future tests. Despite this it's worth remembering they provide no guarantee of the quality of the additional tests that are written. Here peer review is required.


  • Add convention based tests if a convention cannot be detected by static analysis or you cannot detect issues with higher level tests.
  • Reflection is a valid tool to write a single CBT that covers many areas.
  • If a CBT is hard to write, use a test to prompt you to add further tests in the future.

January 10, 2017

Remember that the abstractions you built to help you think about problems are there to help. They are not reality, and when you think of them as such they stop helping you, and they hold you back.

You see this problem in the context of software. A programmer creates a software model of a problem, implements a solution in that model, then releases the solution to the modeled problem as a solution to the original problem. Pretty soon, an aspect of the original problem is uncovered that isn’t in the model. Rather than remodeling the problem to encapsulate the new information, though, us programmers will call that an “edge case” that needs special treatment. The solution is now a solution to the model problem, with a little nub expressed as a conditional statement for handling this other case. You do not have to have been working on a project for long before it’s all nubs and no model.

You also see this problem in the context of the development process. Consider the story point, an abstraction that allows comparison of the relative sizes of problems and size of a team in terms of its problem-solving capacity. If you’re like me, you’ve met people who want you deliver more points. You’ve met people who set objectives featuring the number of points delivered. You’ve met people who want to see the earned points accrue on a burn-down. They have allowed the story point to become their reality. It’s not, it’s an abstraction. Stop delivering points, and start solving problems.

January 08, 2017

The book “NeXTstep Programming Step One: Object-Oriented Applications” by Garfinkel and Mahoney said this about Controllers in 1993:

A good rule of thumb is to place as little code in your controller as necessary. If it is possible to create a second controller that is only used for a particular function, do so – the less complicated you make your application’s objects, the easier they are to debug.

Later, on the same page (p131):

Before you start coding, it’s a good idea to sit down and think about your problem.

Both of these pieces of advice still apply. Neither has been universally internalised 24 years later.

January 07, 2017

I’m going to FOSDEM next month, maybe I’ll see some of you there. This gives me motivation to solve one of the outstanding problems on my laptop: I currently, as has been mentioned here multiple times, use Windows 10 as a bootloader for my GNU/Linux installation. I would rather boot straight into Linux. So I can set myself a milestone: I would prefer, by the time I get to St. Pancras International train station on Friday 3rd Feb, not to have Windows on this laptop any more.

The laptop is a Alienware 15 R3, although weirdly the processor my laptop contains (Core i7-6820HK) is not one of the CPU options listed on the Dell website, so maybe they changed the configuration without updating the model, or had a spare old CPU knocking around when they built my laptop and decided to use that. Anyway, this is computering, so this is fine. You’re not expected to know or care that you don’t have the correct bits in the computer, just that it’s “Late 2016” (even though they still sold the R2 in late 2016, too).

The problems I have seem to fit into one of two categories: either the wi-fi (a Qualcomm Atheros chipset) doesn’t work, or the CPU/motherboard chipset (see above) isn’t supported and all hell breaks loose.

The wireless situation is that the wireless should be fully supported: Qualcomm Atheros integrated the driver into the Linux kernel back in version 3.11-rc1, in July 2013, and supply the firmware binaries. And so it doesn’t work in modern Linux kernels (or doesn’t reliably work, or fails for different reasons).

The chipset situation is that Intel integrated the driver into the Linux kernel back in version 4.3, in November 2015. So it doesn’t reliably work in modern Linux kernels.

I could go into the specific problems I’ve seen and the specific things I’ve tried to work around them, but I won’t. I won’t because well-meaning but unengaged people will ask me infuriatingly basic and irrelevant questions (yes, I have already turned Secure Boot off; no, it doesn’t change the fact that the ath10k module hasn’t loaded), or suggest unjustifiable solutions. The most common is the Distro Pimp: you should try [Debian/Debian testing/Arch/Ubuntu/openSuSE/Fedora/Mint/wait, which one did you say you’d already tried?]. Well that’s nice, but the distribution I tried (that didn’t work) is made of GNU and Linux 4.8, and the distribution you’re suggesting is made of GNU and Linux 4.8, so what specifically is it about your distribution that makes you think it works where this other one doesn’t? Oh, they focus on [stability/cutting edge/purple desktops/compiz effects/bible-reading software] do they? And how does that solve my problem where the kernel doesn’t work, despite being newer than all of the bits I need to have a working kernel?

This is the reality of Linux on the Desktop, the one that computerists say the world is ready for. Of course, it’s also the reality of everything else on the desktop. Something that occasionally happens in my Windows 10 bootloader is that it reboots while I’m using it to install some updates, because I stopped moving the mouse for a couple of minutes between 6pm and 9am (you know, the time when I’m at home, using my home computer). Some colleagues at work use Windows as an actual operating environment, and have things like Skype (made by Microsoft) popping up a notification when they’re presenting in PowerPoint (made by Microsoft). Something that apparently happens to people that have Macs is that the built-in PDF software doesn’t work well and they have to buy somebody else’s PDF software, except that they have to check whether that other PDF software is based on the built-in stuff or is something written by somebody else only they can’t because without the Four Freedoms they don’t have the freedom to study how the program works, and even if they could fix the problem they’re not allowed because they lack the freedom to redistribute and make copies to help their neighbours, or to improve the program so the whole community benefits.

This is fine.

January 05, 2017

On 2 January 2017, I half-heard on Radio 4, ‘The New World. Nothing but the Truth’, presented by Jo Fidgen of the BBC World Service and produced by Gemma Newby. It lasts 45 minutes and is available on BBC iPlayer Radio for 1 year, at, so if you don’t listen to it after reading this, I want a note from a grown-up to explain why.

“Are we really living in a post-truth world?” or is ‘post-truth’ a new label for liberal angst, due to loss of control? It even asked us to consider whether Michael Gove was misrepresented by the media (He was. I’ve seen the transcript.) Sadly, there are a lot of experts in the program, so perhaps you shouldn’t take it as seriously as I want you to. Listen for yourself, in case I can’t be trusted.

It finds that people are not rational in their analysis of facts that challenge their beliefs. They believe The Wrong Thing even harder.

‘Truthiness’ was coined by Stephen Colbert to refer to “what we feel to be true.” Another parody of right-wing politicians, Donald Trump said, “Fact is not always the same as Truth”, though 70% of what he says has been shown not to be true by fact-checkers. People are looking for “a deeper level of truth, their identities”. Trump’s facts are rhetorical tools, not actual information to be taken seriously. He is only President Elect of the USA.

We wear our beliefs as a badge of membership of our group. “We determine the truth by the people and sources we trust. That’s how we know truth.” When faced by ‘an alleged fact’, we decide how we feel about it then look for evidence of how right we are. Educated people are not immune. Numerate people were shown to be better at assessing data but to lose their intellectual advantage when faced with facts related to their political beliefs.

At the end, the programme presented a 10 minute Drill:

  1. Ask the opinion of someone you disagree with and don’t interrupt
  2. Don’t assume they are stupid
  3. Resist forwarding to all you echo chamber buddies that article that proves how right you are
    [ I would add “unless it contains new information, but not without fact checking first” ]
  4. Bear in mind that just because you like the story, doesn’t mean it’s true

What first caught my attention in the programme on first listen was use of the word ‘truthiness’ which the programme has in common with the functional programming language Clojure. Falsiness is ‘nil’ or ‘false’. Truthiness is everything else.

If we imagine ‘nil’ as being a bit like the Scottish legal verdict ‘Unproven’, we should demand higher standards than “You can’t prove I’m lying, yet.” from our politicians.
We need to demand truth, not either value of falsiness.

In hospital statistics, ‘Deaths = 0’ is different to ‘Death data was not measured’. We expect politicians to attempt to try to lead interviewers away from the second option with weasel-words like, “there is no evidence of deaths” and we expect journalists to destroy them whenever they do. Accepting falsiness gives us corrupt politicians and journalists. No politician stands in front of a bus promising £350M per week to spend on the NHS when they known it is not true should have any further input to UK politics. No newspaper calling people who point this out “Remoaners”, to silence them, has any interest in their readers knowing the truth. Resignations are long overdue and it’s almost too late for them to be honourable.


January 04, 2017

Keeping focussed by Ryan Dean-Corke (@RyanDC)

  • Focus Keeper app
  • Email
  • Twitter, Facebook,
  • Pointless jobs
  • News, Blogs, Autotrader, houses pointless consumption

The post Keeping focussed appeared first on RDC.

Back at the start of 2016 I set about sorting my personal finances out, inspired by Soft Skills. The book makes a point to consider passive income as a viable solution to wealth building. The reason for this is simple, software developers tend to get paid well if working professionally. Like most professionals though, during school or university you won't be guided on how to handle money until you are thrown into the deep end.

Assets and Liabilities

At the start of February we listed all our assets versus liabilities and were rather shocked. Our net worth (assets minus liabilities) was negative. Not only was it negative, it was negative by a rather large number. This scary realisation forced us down the path of personal finance. Most of this knowledge came from a handful of books and took no more than a few months to really get to grips with the basics. For the small cost of a few books and your time the return on this investment is huge. In summary you want to maximize assets (things that give you income) and reduce or eliminate liabilities (things that take your money away) as much as possible.


Despite knowing nothing than the basics of the stock market and investing, investing in stock (sometimes known as equities) is one of the ways to maximise assets. Again a few simple introductory books and some online research was all that was required. Having explored individual stocks, we settled on low cost index funds as our main investment solution. Before we could invest though we had to attack our debt. Without eliminating the debt we were unable to maximize our investments. Paying off debt is also considered a guaranteed return, something you cannot get with investments, hence it should be your first target.


Attacking debt took up the whole of 2016. Thankfully there was an easy system to follow. The difficult part is sticking the course, though you will quickly start to see benefits. The best solution we found is the debt snowball, which is part of Dave Ramsey's Baby Steps. Steps 1-3 must be completed in order, sequentially. While steps 4, 5 and 6 can be completed in parallel.

Baby Steps

  1. Save £1,000 in an emergency fund.
  2. Pay debts down from smallest to largest using the debt snowball method.
  3. Save 3-6 months of living expenses for a fully-funded emergency fund.
  4. Invest 15% of income into retirement.
  5. Start funding higher education for children.
  6. Pay off the mortgage early!
  7. Build wealth and give!

You Need a Budget

I was actually advised to create a stick to a budget by a friend while in university, however I ignored her wise advice. A budget is a crucial tool to paying off debt and in turn staying out of debt. The best budget to use with the baby steps is a zero based budget. In this case you run your personal finances like you would a company such as a bank. At the end of each month (or whenever you receive income) your balance should be fully allocated to equal zero pounds available. All of your money is either paying of debt or working hard in investments, while the rest is allocated to expenses.

A written monthly budget is single handedly the best piece of personal finance I can recommend to others. Once you tell your money where to go, and have a audit trail of where you are spending you have control. How we lived prior to a monthly budget is a mystery, though it does explain the shocking net worth we amassed. To be blunt, get and use a budget. You need to.


Previously I thought of retirement as something you do when you're old. Think of your parents or grandparents. However this is not the case. Retirement is simply being able to do what you want to do, whether or not this includes work. Being able to wake up each day and do what you want is a powerful thing.

Another shock discovery was the fact that becoming financially independent in order to retire can be done in ten years, instead of the traditional thirty of forty year window. A whole community exists that prove this is the case - FIRE (Financially Independent - Retire Early). To summarise this process, instead of doing what the norm do and investing 10% of your income, invest 50%-90% and you can shorten the process dramatically. FIRE is a long term goal that requires minimized expenses and a strict budget, but the pay off will be more than worth it.


Our personal goals for 2017 include completing our six month emergency fund, followed by aggressively paying off our mortgage, with the goal to complete this within two and half years versus the remaining twenty year window. Without the basic concepts above this would have not been possible.


  • Eliminate all debt, and stay out of debt.
  • Create and use a monthly budget.
  • Use the baby steps to get out of debt and build wealth.
  • Low cost index funds are a recommended way of simple investing.
  • Retirement isn't a thirty or forty year process.
  • No one will teach you personal finance, it's up to yourself to get to grips with it.

January 03, 2017

I’ve read a few articles over the last week or so that point to the Mac having lost its shine among developers. There was a time when the first things you did when you wanted to be a developer on the Free Software platform Ruby on Rails were that you bought an Apple PowerBook and the proprietary TextMate editor. There was a time when even Sun’s employees programmed Java on Macs. But now, I read things like this:

Right now, the only real option Apple has offered [vocal developer supporters] is the iMacs, which seems to be their answer for high end machines. That may work for some, even thought it won’t be their first preference for many. It’s clearly left many disgruntled and some thinking of jumping ship to other manufacturers, either running Linux or Windows. Source: Apple’s 2016 in review

Apple’s review process for [Safari browser] extensions is disorganized, arduous and quite frankly insulting Source: What Apple gives you for $100 as a Safari Extension Developer

the current state of the Mac has me considering whether it’s still the right platform for me. Source: Finding an Alternative to Mac OS X

It seems like Apple has either lost its way, that it has lost touch with what (some of) its customers want, or that it simply doesn’t care about those customers. Developers are a captive audience, and creative professionals can switch to Windows, I guess. Apple no longer considers them core. Source: New MacBook Pros and the State of the Mac

For me the sheen was long-gone back in November 2014, and in January 2015 I posted about switching (back) to Linux. That was around the last time the blogosphere was telling us all that Apple had lost their way – funny how these badly-run companies manage to sell more of their shit than their competitors for years on end, non? Anyway, it was the popularity of the meme that led me to post, but my story about falling out of love with their treatment of Free Software and the make-work associated with being in their developer programs which you can read about in that post is personal to me.

There’s a problem, though, and that problem is consistency. NeXTSTEP, more or less, can be summarised as “let’s make an Alto, but compromise on using technology that already exists”. So you get your Alto technology like OOP and ethernet and laser printers, but you also get the compromises – Display PostScript, UNIX, GNU, and C. There’s one system to learn (Objective-C and the various object “kits”), and then a few subsystems (UNIX and GNU, Mach, NetInfo, DPS) that make themselves known if you dig in.

Mac OS X is less of a NeXTSTEP than NeXTSTEP, but the romance of consistency still exists. I can tell myself, partly because it’s true but also because I invested over a decade of my life in working around the flaws in the model, that OS X is still Objective-C and kits with a wider selection of kits (Core Data, GameKit, PDFKit etc) and a few more compromises.

You definitely can’t say that of Linux, particularly as a developer. The application my group works on now is written in Qt, which is itself a nice framework (Qt with its meta-object compiler is to C++ as Objective-C is to C, in a way that GTK+ is not), that for the most part just sits on top of Linux (and other platforms) as a Qt application. The problem is, when you want to do something that isn’t in Qt’s equivalent of the app kit, you may not only have to choose one of a few different alternative technologies but actually choose all of them if your users might not all have chosen the same one.

Even on my own laptop that’s true. It is…well, for reasons that I just haven’t put the effort into solving, it’s actually running Ubuntu 16.10 in VirtualBox in Windows 10 (whomp!), but what I see is that it’s running Ubuntu 16.04. Now I could, and do, use GNUstep as an application development environment, and get my Objective-C and kits running on something like Unix just as I’m used to. But that inconsistency is always there, always at the forefront, always chipping away. Because the window manager does not use the Objective-C runtime, and uses weird X things to communicate with processes rather than Objective-C messages. The browser is Firefox, because while there is a GNUstep browser, it’s not very good (mostly because its WebKit is not up to date, but then WebKit is itself not Objective-C either). My Linux uses systemd to start processes, your Linux uses rc files/init files/upstart. My GNUstep is drawing with Cairo, yours is drawing with X intrinsics.

There’s a problem with that problem, though, and it’s that the consistency of Mac OS X is a fiction.

Are Dashboard widgets made out of JavaScript because of a compromise, or an aborted change of direction? Is the lack of consistency between the same API’s names for things in Swift and in Objective-C a cognitive overload that’s worth carrying around? Do I ignore the funky dialect of C++ that drivers are written in (I have written IOKit drivers and edited a book on the technology, so this isn’t a hypothetical concern)? While some ObjC APIs use message-sending and others use block callbacks, am I right to call them both the same thing? Does this process communicate with that process using XPC, Mach IPC, UNIX pipes, sockets, signals, or distributed notifications?

The romance turns out to be based on a lie, but on a powerful and compelling lie that’s easy to believe, and easy to miss even if you’re unsure whether it ever existed.

Change Time by Andy Wootton (@WooTube)

After some time trying to think about almost nothing, the last 24 hours have been an alarm call. As others come out of hibernation too, they post interesting stuff and Radio 4 provoked me with a discussion on facts and truth. Now Marc Cooper is at it, with difficult  links about computation and I’m all on Edge
Before I read about “discrete tensor networks”, I need to write down my own ideas about time, so I will know in the future what I thought, before my mind was changed.

I am ill-equipped for this task, having only 1 term of university maths to my name so I intend to talk in vague, abstract terms that are hard to argue with.

Much of physics is very dependent on Time, like almost all of computer science and business management theory. You can’t have change without time, it seems. Einstein talked about space-time, mostly in the language of mathematics. I can just about order a beer in math(s) but I can’t hold a whole conversation. I know what the first 3 dimensions are: left-right, up-down and back-forward. My personal model of the 4th dimension is that same space in continuous state-change through time. There are a few things I’m not happy about:

  • There is no evidence that time is either continuous or constant.
  • We only have evidence of time being a one-way dimension.
  • What the heck does ‘continous state-change’ mean? Is state a particle or a wave? Make your mind up, physics!
  • There’s that troubling many-worlds interpretation of the universal ‘WAVE’function (which I don’t understand either) which says that everything that might have happened did, in other universes. I don’t like this. Yes, that’s my entire justification – I don’t like the conclusion of a thought process I don’t even understand. It doesn’t feel right.

I’ve been learning about the functional programming language Clojure which does not ‘mutate (change) state’. It doesn’t have ‘variables’ like the more common imperative languages such as FORTRAN, BASIC, C, Java or Python. In Clojure, data flows through functions and is transformed from one form to another on the way. It is basically magic. In a pure functional program, no state is changed. State-change is called a “side-effect”. Sadly, side-effects are required to make a program do anything useful in the real world. Arguably, the purest magic is encapsulated in the world of mathematics and the physical world is a messy place that breaks things.

Clojure models time. It does not model the real world by replacing the current value in a variable and throwing the old value away but by chaining a new value onto the end of a list of all previous values.

Now let us extend this idea ‘slightly’ in a small thought-experiment, to a 3-D network of every particle state in the universe.

Space-time now has 2 regions:

  1. The past – all historic states of those particles as a theoretical chain of events
  2. The future – all possible future states of the universe; effectively an infinity of all possible future universes that could exist, starting from now.

Which brings us to what I mean by ‘now’ – a moving wave at the interface between the past and the future, annihilating possible future universes. Time becomes a consequence of the computation of the next set of states and the reason for it being a one-way street becomes obvious: the universe burned its bridges. Unless the universe kept a list, or we do, the past has gone. Time doesn’t need to be constant in different parts of the universe, unless the universe state ticks are synchronous but it seems likely to be resistant to discontinuities in the moving surface. I imagine a fishing net, pulled by current events.

It’s just an idea. Maybe you can’t have Time without change.

[ Please tell me if this isn’t an original idea, as I’m not very well read.
I made it up myself but I’m probably not the first. ]

In Resolution: Subscribe Self I said I’d share my list of feeds. The nice thing to do would be to document a blog roll detailing why I subscribe to each blog, but for the moment here’s an OPML file you can import into your reader, and consider the feeds you find therein.

January 02, 2017

2017: Fighting back by Andy Wootton (@WooTube)

2016 was an excellent year for the progress of Evil. It’s time for those of us who believe there ‘is such a thing as society’ to start pushing back harder, for a happier 2017.

I plan to take on fascism, corrupt media, lying politicians, hierarchy in general, fixing democratic reform, climate chaos and replacing the failing socialism and capitalism systems, as the year warms up; but for now lets warm up with open communication protocols. This article recommends the Franz messaging application: It says:

“The days of multi-protocol instant messengers are long gone, with (mostly) proprietary mobile-first services now ruling the roost.

Want to chat on WhatsApp, Facebook Messenger, Telegram or another well-known messaging service on Ubuntu, without using your browser? Try Franz.”

Or don’t. Ask why Google needed to assimilate XMPP into Google Talk, in order to destroy it, so it could launch Hangouts to compete with Skype and Apple and control yet another market. It got beaten and left us with the current fragmented mess. When will we all learn the lesson to choose open protocols not products and suppliers that do what is good for us rather than for themselves? We will only progress in software if we stop throwing everything away every few years and starting again with something worse. Customers and governments must start demanding this. We must NOT Brexit or Trump on international communication. Tribal thinking is Bad, kids!

Can anyone recommend a good XMPP service provider that serves the UK which REALLY believes in open standards and privacy, like Google, Facebook, Apple and (occasionally) Microsoft pretend to? Maybe with an old-fashioned SMTP/POP email service that isn’t Gmail. Liars must be punished, or they’ll keep doing it… and we’re back to politics.

This week I mentioned a product in a closed Slack group and received targeted marketing next time I logged into Facebook. What else is being snooped on?

January 01, 2017

This feels important
Your old PCs and Macs are being aPIXELated. Cambridge computer science hippies are helping us back onto the right path to Freedom.

Those nice Raspberry Pi people are trying to give us a standard Linux that runs on old hardware, as well as new. I remember when we all thought that was Ubuntu, before they decided they wanted to be better than all the other distros. I’m not sure competitive communities are the way to go. That way lies tribalism, nationalism and eventually fascism. 2016 is OVER. We get it, Time Lords: power corrupts.

I have, at least temporarily, stopped using the social media to find news. I publish an RSS feed here, and your other favourite sites probably do too, so we can all discover the things we want to read without having to wade through a morass of things we don’t.

Soon, I’ll collect some recommended feeds together. What are yours? Which are the high-quality, low-volume feeds you make sure to catch every post on?

December 31, 2016

As the year draws to a close, I like to look back at what was and looking forward to what might be. This is my second year in review post, the first being last year. This post also marks my second year of self-employment.

I’ve split this post into 4 sections:

But first, a word on 2016. Quite a year, right?

It felt like there wasn’t a week that went by without something that really sucked happening. If it wasn’t another celebrity death, it was another damaging post-truth article from a mainstream publication, or an Orwellian law being passed, or another extremist attack.

I’ve always casually followed politics but this year it has consumed a much bigger part of my life, as it has for millions of others. I’ve followed with both intrigue and fear.

This year has highlighted a divide that exists in society, a divide which is far bigger than many of us ever realised. It’s shown how fragile our world is and how unpredictable our world can be.

I’ve wanted to bury my head in the sand and pretend that it doesn’t matter or that I don’t care. The problem is, it does matter and I do care. I’ve been trying to understand what has happened (because I don’t) so that I can be more empathetic towards those who obviously see the world differently to how I do. This tension (between hiding and seeking) has taken more energy than I care to admit.

Anyhow – this post isn’t about politics or world affairs. Let’s move on, shall we?

What went well


Business wasn’t great (compared to last year), but it would be remiss of me not pull out some positives. I’ve worked with some great clients and together we’ve produced some great work. Referrals are up, as are leads from my website. I’m also still enjoying freelance life. Overall, and all things considered, a thumbs up.

The 30 Day Writing Challenge

Those that know me or have followed me know that I’m a proponent of daily writing. I’ve often encouraged friends to blog or journal because I’ve seen so many of the benefits first hand. In response, I’ll often hear “I’d love to write more, but I don’t have time/I don’t know what to write about/I have nothing to say/etc.” Writing is difficult because of the many mental blocks we put in place.

It was for this reason that I created The 30 Day Writing Challenge. I wanted to encourage others to push past these mental blocks. The response was fantastic. 134 people signed up and took part, with many of those blogging 2-3 times per week. It’s something I want to run again next year, but with a new and improved format. If you’re interested in joining the challenge next time, jump on my mailing list to hear about it first.

Inline-Block Community

One of the unexpected outcomes from the 30 Day Writing Challenge (30DWC) was the community that came from it. I invited participants from 30DWC to a private Slack team. It started with a fairly small group – around 30 people – and it’s grown to be a positive community of around 130. Topics include writing, design and development, photography, productivity, books, and more.

It has become a place I really enjoy hanging out in. Working from home can be lonely, so these online communities have become increasing important in keeping me sane. I’ve really enjoyed the discussions that have taken place, and there’s some brilliant and smart folk in there. If it sounds like your thing, you can join here.

Mastermind Group

In the closing stages of last year, I started a mastermind group with Andy, Alex, and Darren. Every fortnight, we jump on a Google Hangouts call and discuss the problems we’re facing, what we’re working on, etc. This has been a fantastic success this year. Although we’re in different phases of business (Andy and Darren have employees, while Alex and I are solo), we’re in similar phases of personal growth. We’re changing the format for 2017, splitting the year into 12-week sprints. I’m really excited about this new format and I’ll be writing about it in the future.


Although I’ve read far less than last year and failed to meet my goal of publishing book notes for 12 books, I’ve stumbled across some really stunning books this year. I’ve learned that reading for me is a quality over quantity thing. I’d much rather read a handful of life-changing books, than dozens of mediocre books. Here are a couple of books that I’ve read this year that are worth a shout out:


In my review last year, I wrote: “I’ve not really attended any local events all year. It’s something I need to make more of an effort with next year.” I did make more of an effort and went to a number of meetups throughout the year.

I’ve also been involved in organising Homebrew Brum with Dave Redfern and Paul Tibbetts. It’s a small meetup that takes place once a month, with the focus on attendees working on their own websites. I’m excited to see how it develops next year.


In November, my wife and I travelled to Sri Lanka and The Maldives. It was a much needed holiday, where we got the chance to eat great food, explore new cultures, and unwind. Sri Lanka, in particular, was incredibly beautiful and a place I’d love to revisit some day. My photos are here.


The big house project this year was a new kitchen. We finished the kitchen in June and we’re really happy with it. I got my own whisky shelf, too.

What went badly


I wrote about my experience of burning out for Geek Mental Help Week. It was the first time I’d experienced burnout. Since writing the article, I’ve had a lot of people ask if I’m ok and if I’m taking better care of myself. Yes and yes is the answer.

Lessons learnt: I’ve got a better understanding of what my own limitations are now. Sometimes you have to push too far to know where the boundaries are. I’ve also learnt this year that a creative professional’s life has seasons. There’s a time for intense work and there’s a time for family and a social life. But you can’t do both simultaneously and that was the mistake I made. I now have a better understanding of the seasons of my work, and thus when it makes sense to push, and when to slow down.


I wrote 38 blog posts this year, which isn’t a bad number by any means. But I’m still lumping “writing” as something that went badly this year. 30 of those posts were posted in one month, during April, which I did for the 30 Day Writing Challenge. I have really neglected my newsletter this year and that’s something I want to fix next year.

Lessons learnt: I do the majority of my writing in the early hours of the morning, so my lack of writing is due to not protecting my evening and morning routines.

Business growth

Last year I set a goal of growing my businesses revenue by 15%. This number was more or less plucked from thin air. I didn’t have a plan to execute against. I naively assumed that more effort and more time invested would give me a bigger return. This assumption was wrong. Business was slower this year and revenue is down about 10%. Not catastrophic by any means, but certainly an eye opener.

Lessons learnt: I think I set the wrong goal here. If I focused instead of working with the right clients, improving my marketing, and charging the right rates for projects, my revenue would have increased as a by-product. I don’t plan on setting monetary growth goals in the future. I hope that by setting other goals, increased revenue will be a by-product.

Find a place to work away from home

Another goal I set last year was finding a place to work away from home. Working from home can be a lonely endeavour, and switching up my work environment can help with creativity. I have attended a local co-working space twice, but I need to do more. More coffee shops, more co-working spaces, more changes of scenery. Possibly even a hot desk, if I can find a suitable place.


Towards the middle of the year I reached 78kg, and I went down to 72.8kg at the start of November. My target for the end of the year was 70kg, and I’m now just over 75kg. So this year wasn’t terrible, but it wasn’t great either. Something to work on next year.

Not building assets

A typical freelancer does project-based work. A client pays a fee, you deliver the work, and then you both move on. The problem with this is that they’re one-offs. You need a constant stream of new clients. I had hoped to build some assets – things that would deliver a steady stream of income over time. This is something I have completely neglected this year, and something I really want to make progress on next year.

My goals for 2017

Launch first product

This is the big one for me and one I’ve been sitting on and procrastinating over. I have a product that I’ve started planning, but it’s too early to announce. It might change (and that’s ok), but a big focus for me in 2017 year will be releasing my first product.

Goal: launch first product


Writing is such an instrumental tool for my business, and I need to be more consistent at it. I want to get back to emailing my list every two weeks. I also want to get my morning routine back on track and write at least 500 words every morning.

Goal: write to my mailing list every two weeks


Same as last year: read better, not necessarily more. I want to have 12 book notes published by the end of 2017.

Goal: publish 12 book notes


In 2016, I cut into some of my savings. Not in a critical way, but it’s certainly something I want to reverse this year. The bigger the buffer I have, the more creative freedom I have moving forward.

Goal: save 4 months salary

One movie night per week

We started this at the start of 2016 and it was great, so I want to keep it up for 2017. Doesn’t matter which night, and it doesn’t even have to be a movie, but I’d like to have one night a week where I spend time with my wife. No mobile phones, no distractions, just quality time together.

Goal: 1 night in per week

Themes for 2017

These are the things I want to remind myself about during 2017. They don’t have tangible goals, so they don’t fit in the section above. I’ll be reviewing these themes every month.


Many of my goals and much of my day-to-day productivity will be achieved through my morning routine. Protecting my morning and evening routines, and honing them, will be an important part of my year.

Deep Work

This isn’t just a habit you develop, it’s a practice. Throughout the year, I’ll be practicing deep work, removing distractions, and training my brain not to wonder.


I’ve been interested in meditation for the past year, but I haven’t committed. My Mastermind buddy Andy Henson wrote a great introduction to Meditation earlier in the year and has an impressive 160+ day streak going. It’s encouraged me to get my act together and start practicing mindfulness.

Output over input

Derek Sivers once said “if information was the answer, then we’d all be billionaires with perfect abs.” Over the past few years, I’ve overloaded on information. I’ve filled every free moment with podcasts, books, and articles. But this year, I want to reverse that. I want to go on an information diet and spend more of my time and energy on making things.


In the book Essentialism, it describes an Essentialist as “someone who deliberately distinguishes the vital few from the trivial many”. I hope to continue cutting through the noise across all areas of my life: from digital minimalism, to the clothes I own and the things I buy, to the projects and clients I take on. That’s not to say I’ll only have 10 possessions by the end of the year, but I do think that by being more mindful about the things I buy and the things I spend my time on will have a positive impact on my life.

Experiences not possessions

Related to minimalism, I plan to invest more in experiences. More travelling, more live music, more comedy shows, more good food and nights in with friends.


Focus on helping more people. Be a better husband, son, brother, godfather, and friend. Spend more time with the people that matter.

Right, that about does it for me.

All the best to you and yours for 2017.

December 22, 2016

This is fine by Graham Lee

The BBC micro:bit is a tool for introducing young people to programming. It’s a little embedded computer with a few inputs and a matrix of LEDs for output, as well as some control lines. In principle it’s quite easy to use, I made a 1d6 simulator:

from microbit import *
from random import randint

class Die:
    ONE = Image("00000:"
    TWO = Image("00000:"
    THREE = Image("00000:"
    FOUR = Image("00000:"
    FIVE = Image("00000:"
    SIX = Image("00000:"
    def throw(self):
        return self.ALL[randint(0,5)], delay=100, wait=False, loop=True)

while True:
    if button_a.is_pressed():
    elif button_b.is_pressed():, delay=100, wait=False, loop=True)

Simple (I mean, simple if you know what the word randint means (hint: it means “random integer” as long as you know what an integer is), that programming languages that aren’t Fortran call the first element of an array element zero, even though it’s obviously ONE as far as a die is concerned, and you’re OK with the word classmethod).

Here it is in action: woo! I AER PROGRAMMER!!!

And here’s the litany of things I did to get there:

  • I opened the “details.txt” file on the micro:bit, which tells me a load of build numbers and flash dates. I don’t know what I’m supposed to do with that. This is hard.
  • I opened the “microbit.html” file on the micro:bit, which redirects me to, which tells me that as part of the BBC’s restructuring of its online content, I will be redirected to I decided this was probably OK, and ended up looking at the same site but with a different URL (whatever one of those is).
  • I clicked on the introductory video and was told that I need an Adobe Flash Player, whatever one of those is.
  • I eventually found enough buttons to find a website that is a python editor that lets me write code for my micro:bit, and a tutorial for writing Python for the micro:bit. I know what a python is, but do not know why I would want a snake for my micro:bit.
  • The tutorial tells me to use a thing called a “mu”, which is apparently not the website python editor but is another python editor. I do not know what a mu is, but I must download it.
  • There are three different download buttons, depending on whether I have a Windows, a Mac, or a Linux, whatever they are.
  • If I have a Windows, then I to enable the REPL (whatever that is) I must download a serial driver (whatever that is).
  • The driver site tells me that if I have a Windows 10 (whatever that is), then I should not download the serial driver.
  • If I have a Mac, then the first time (but maybe not other times, that’s not clear) I open the mu I have to right click it.
  • If I have a Linux, then I must chmod u+x the mu and make sure my user (isn’t that me?) is in the dialout (whatever that is) group (whatever that is).
  • Now I can write my python. To put it on the micro:bit, I must “flash” it. I guess that is because I have an Adobe Flash Player from earlier.
  • The micro:bit shows me helpful messages when I get something wrong. It scrolls the message “id=41 SyntaxError: invalid syntax” when I flash my python. I do not know what this means, but I was told that it’s helpful. Therefore I am stupid.

I am not singling out the BBC, the micro:bit makers, the mu creators, Microsoft, or any of the other individuals or organisations involved with creating this easy-to-use educational environment. This is fine. This is how computers work, nay this is how computers work when we are making it easy to work them. This is our industry.

To quote Freddie Mercury: is this the world we created? We made it on our own. Is this the world we devastated, right to the bone? If there’s a God in the sky looking down what can he think of what we’ve done to the world that we created?

December 21, 2016

Reading List by Bruce Lawson (@brucel)

It’s the last Reading List of 2016. Happy Consumerfest!

December 20, 2016

Our plan was pretty simple; Fly to Bangkok then make our way through Laos, Vietnam and Cambodia, before returning back to England via Bangkok. We had the first 10 days booked, but everything else was left pretty open ended except for a rough plan on the places we wanted to visit. Neither of us had done anything like this before, and whilst initially a little nervous, we quickly got into the flow of booking travel and accommodation and loved the freedom it gave us.

We  decided to create and keep a blog of everything, so instead of reiterating everything here again, you can head over to it and check it out:

I will be writing up an overview of tips and info about our trip, such as costs, what we’d do differently and what not/to bring etc, but I’ll post that separately soon. In short though, if you’re thinking about doing it, just do. You won’t regret it!

The post I went to South East Asia. It was rad. appeared first on RDC.

December 19, 2016

By the river by Graham Lee

My home stands near to a bridge over the Avon, the same river that lends its name to Stratford-on-Avon. By walking to the end of my street then through the churchyard, I could stand over the river and watch it flow beneath me. But I didn’t. I elected to walk a few kilometres upstream to the grounds of the big house, and stand on that bridge instead. Walking is something I do, apparently. My phone tells me that I walk more than the average man, an achievement I can claim as my own.

It was raining, so I took an umbrella. In theory, I was listening to the patter of the rain on the umbrella, and watching the water flow through the reeds as it washed underneath me, then past my house and the church, past Shakespeare’s birthplace and onto Tewkesbury and the Severn. In fact I did nothing of the sort. The river and its reeds must have been there, and I was pointing in their direction. I was vaguely aware at one point in my half-hour stop of a car on the driveway, approaching me, stopping just short of where I was, then carrying on over the bridge and on to the road. I did not acknowledge the driver, and if that person acknowledged me I failed to notice it.

Of things that I saw, the one that sticks in my mind is the notification light on my phone. It is my beacon to the outside world, letting me know when somebody wants my attention. Twice I remember looking at it, and twice I remember seeing the blue blink that signifies contact via email. Twice I read this link to society at large, to discover that somebody wanted to sell me the world’s most powerful flashlight and that somebody else thought I would be interested in a walk-in bathtub. Isn’t technology a marvel?

Of things that I heard, probably the car had some sort of engine and tyres that rumbled as it made its way past, and presumably the dual carriageway a few hundred metres away was contributing some white noise. The only sound that I remember hearing is my internal monologue. It’s a toxic sound, reminding me as it does that I have no reason to be pleased about anything, but it is my constant companion. I struggle to hold back tears as it reminds me that my home life, my social life, and my work life, are all in flux at the moment, all out of my control, and the common thread running through them all is the person who lost that control. It goes on to tell me that anything else I might try is doomed to failure, too.

I consider using that phone again, not to look at the notification light, but to tell somebody how I’m feeling. Why would you want to do that, asks the voice? These people have their own things to deal with, why burden them with your problems too? Why spoil somebody’s evening by telling them that you’re upset, when they’ve done nothing to upset you? Why are you so selfish? You’re a grown-up, a man who walks more than the average, you’re supposed to look after yourself now. You’re not supposed to be a mess with a state-sponsored Citalopram habit.

I turn the phone around, thinking of taking a picture of the trees silhouetting the clouds, stained Sodium-orange by the streetlights of the nearest town. The screen remains resolutely black. Of course it did, you idiot, it’s much too dark to take a photo with that phone. You’re supposed to be some kind of expert at smartphones, don’t you know how their cameras work? I vaguely consider whether to fetch my SLR camera, but of course that’s been in a box for over a year and it’s doubtful the battery is even charged. Maybe it’s time to sell it on eBay, but of course you won’t get a good price for it and then it’ll get damaged in the post and the buyer will want a refund and you won’t even have kept that money. Why bother?

It took effort to walk the twenty minutes upstream to the other bridge. My voice told me that I would be just as useful to the world if I didn’t take the walk, if I had stayed in bed and waited until it was time to go to work tomorrow. Well, voice, I took everything you told me and made a few hundred words of blog post out of it, so I have done something after all. The joke’s on you.

Stuff I've made

This week's creations and recommendations

Today was the final episode of my Brum Radio show for 2016. It was a fun-packed Christmas special - naturally - in which I read some poetry, go over some of the year's highlights and lowlights, and announce the future of the show.

Today's Mood Elevator episode was a shorter one, but with.a couple of nice stories, including one about Ikea renaming their furniture after relationship problems. True!

Sunday night's Distraction Engine was a great big Christmas-themed round-table, with guests Marcel Smith, Phil Davis and Paul Hadsley. Lots of fun, lots of swearing, lots of drink, plenty of Anglo-American bants.

For some reason, starting in 2013 I got into making mashups around this time of year, so sticking with this weird new tradition, here's one I made of Smash Mouth and Jackson 5.

Follow my doings

At work

I've been very, very busy of late, and am definitely looking forward to a break, to reboot my brain. I'm hoping to finish work this Friday and down tools completely until 4th Jan.

And that's about it. Busy week!

December 14, 2016

A Functional Mindset by Andy Wootton (@WooTube)

When I started learning Clojure, I thought I knew what functional programming was but I’ve learned that the functional paradigm is now more than I expected.

Everyone agrees that it’s a computational model based on evaluation of mathematical functions, which return values. This is generally contrasted with imperative programming languages such as FORTRAN, C, JavaScript or Python, which are also procedural and some of which are object-oriented but may make functional coding possible, in a hybrid style. I wouldn’t recommend learning functional concepts in a language that gives you short-cuts to stray back  to more familiar territory.

Clojure is a member of the Lisp family, first specified in 1958. The unusual feature of Lisps is their homoiconicity – code and data are the same thing. Learning Clojure has informed my thinking about business process change.

Some modern, functional languages such as Clojure use immutable data whenever possible, to eliminate side-effects. This allows better use of multi-core processors but requires a complete change in thinking, as well as programming style. ‘Variables’ are replaced by fixed ‘values’, so loops have to be replaced by recursive functions. New data can be created but it doesn’t replace old data. Yesterday’s “today’s date” isn’t automatically wiped when we decide today has happened.

Objects with their methods and local data were designed for simulating the current state of real-world objects by changing (mutating) object data state. The object model, like relational databases, has no inbuilt representation of time. Functional programming splits these objects back into separate functions and data structures and because values can’t change, they may be transformed by flowing through networks of functions, some recursive, to keep doing something until a condition is satisfied. Eventually, code must have a side effect, to tell us the answer.

Rather than computation being a conditional to-do list with data being moved between boxes, it becomes a flow of data through a network of ‘computing machines’; and the data and machines can be transformed into each other.

I hear that map, reduce & filter data transformation functions will change my world again.

Answer: none of them by Graham Lee

A question programmers frequently ask when they’re considering career growth or personal learning is “which programming language should I learn next?”

Why would learning another programming language help? If you only know one programming language and it is provided by a single vendor, then learning another will decouple your success from theirs, but that might not be such a common situation. Well, a book like Seven Languages in Seven Weeks makes the point that it’s not about learning the language, but about learning the model and thought process enabled by using that language. OK, so why don’t I learn that model or thought process, using the tools that are already available to me, instead of having to add fighting unfamiliar syntax to the problem?

And if what I’m truly trying to do is to learn to think about problems in a different way, a week-long effort at dabbling in a side project isn’t going to change my way of thinking. Those years of learned processes, visualisations and analyses are going to take more than a couple of hours to dislodge. I’ve worked through Seven Languages, and the fact that I spent a couple of hours solving the Eight Queens Problem in Prolog (or in fact telling Prolog what a solution to Eight Queens looks like and letting it solve it) doesn’t mean I now think about any other software problem as if I’m using a logic programming tool, or even as if I have such a tool available. I’ve spent much longer than that studying and using the relational calculus and SQL, but don’t even think about every problem as if it should be a collection of tables in the third normal form.

It may be that it would be useful to learn something that isn’t a programming language, shock horror! It turns out that programming is an activity embedded in a socio-technical system comprising other activities, and you might need to know something about them: software security, testing (I think I can count on my noses the number of programmers I’ve met who haven’t responded to the phrase “equivalence partitioning” with a blank stare, and I wouldn’t use all of my noses), planning, business, marketing, ethics…I even wrote a whole book on the things programmers should know that aren’t programming.

And then there’s the thing that your customers, clients, colleagues, or victims are trying to do with the software. Learning something about that would make it easier to empathise with them, to evaluate your solutions in context, and to propose better ways of working and better ways for your software to enable their work. Rewriting your code in Elixir would…not do that so much.

Becoming Functional by Andy Wootton (@WooTube)

I’ve been playing with the idea of doing some functional programming for a while now. I’ve been trying to learn and paddling around in the shallows but this week I dived right in the emacs/CIDER pool. I was aware of some dangers lurking beneath the surface: recursion, immutable data structures and the functional holy trinity of map, reduce & filter, so I came up with some ideas to face my fears. I’ve also realised my maths has got rusty so: Some of That Too.

  1. I’ve ‘done recursion’ before but I thought I’d read that my chosen weapon Clojure didn’t do tail-end recursion. This isn’t true. What it can’t do is automatic optimisation of tail-end  recursion, to stop it blowing the stack after a few thousand iterations but Clojure has a ‘recur’ expression to manually signal tail recursion and fix that. I knocked off the programme in a couple of hours and went to bed happy. My code was happily printing the first n numbers of the Fibonacci sequence but a day later I still couldn’t get it the return the numbers as a sequence.
  2. I was finding out about immutable data the hard way. You can’t build up an immutable vector, 1 element at a time. You get to keep the empty vector you created first. It’s a big mind-set change to not have variables that can vary. In my next post, I’ll try to say what I’ve learned. On this occasion it was lazy sequences.
  3. I mentioned the Algorave in my last post. I only found out about that because of an idea I had for improving my theoretical understanding of music. I realised that I could write, for example, a function that would return the 1st, 3rd and 5th notes in a major scale, using a map function.While working the theory out, I found out that Lisps are already popular in the live-coding world.
  4. At Algorave, I was inspired by the live-coded graphics to try automatically generating some graphics too, to work out the maths of mapping triangular grids onto Cartesian co-ordinates. I need that for another idea.

Three basic working programmes in about a week. They aren’t ‘finished’ but is software ever? They have delivered value via increased Clue.

December 12, 2016

This week's creations and recommendations

The second in my old-school "what I did this week" series of blog posts, to be taken as an antidote to constant tweeting about the latest piece of content I've shat out of my brain or mouth.

Stuff I’ve made

Today's radio show was a fun one, where I covered a film called The Survivalist and played a Christmas song written by an AI.

The latest episode of the Mood Elevator is one of my favourites in a while. It's funny but with some nice heartwarmers too, and I'm pleased with the writing and delivery.

My Sunday night show with co-host Matt was a corker, too... if I do say so myself! We talked Trump and Star Wars, explored an old game from the 90s made by Robert de Niro, and looked at a 99 million year-old dinosaur tail.

My new super-secret project is taking shape, and I'm beginning to collect feedback from beta users. Fun!

Follow my doings

In my pocket

My friend Dave Pitt shared this video of Ian Hislop - a man I admire - giving the George Orwell Lecture:

At work

I'm pleased to say the launch was a broad success, and the big new site - the largest I've ever dealt with in terms of footfall - is live. There are still plenty of things to work on and a few bits to fix, but it's standing on its own two feet.

At play

You Suck at Cooking: Modified macaroni


I'm giving a talk tomorrow at HydraHack. all about side-projects. I don't know yet if it'll be available anywhere, but if you're coming to that, I look forward to seeing you!

Previously, on SICPers, I wrote that I make mistakes for a living. But making mistakes is no good if nobody’s cleaning up after them, so I also fix things. Whatever gets in my team’s way, it’s my responsibility as their lead to make sure that it’s no longer in their way.

Whether it’s a process we instituted that slows us down, some technical debt that gets in the way of new development, or some infrastructure not behaving itself, it needs to go, and I either need to clear it out or find somebody to do it for us. On my team I’ve been nicknamed “Mister Fix-It” as a result of my policy of getting rid of everybody else’s impediments before doing my own work, and we even have a Fix-It support queue just like our customer support queue. Except it’s not our customers I’m supporting, it’s my colleagues. Tickets in my queue range from “this script doesn’t handle this case and did the wrong thing when I tried to do a build” to “merge these three repos into a monorepo”. It doesn’t matter, it’s in our way, so it needs shifting.

Or does it? Is it, in fact, in the way, or are we solving the wrong problem? Some of the tickets in the Fix-It queue magically transmogrified from “Fix This” to “Measure This”: let’s discover where the problem really is before we solve something else.

December 11, 2016

I wrote, a couple of years ago, about the fact that you can’t ignore ethics in software engineering. Your software is built for a reason, it’s used for a reason, you need to be aware of those reasons and whether you’re supporting or enabling them.

That goes for politics too. That hacker news declared this week to be politics-free week shows an immaturity and unprofessionalism that makes it a dangerous place to learn about making software from. Making software is the act of some people producing things for other people, it is inherently a political act. Choosing a framework or programming language is political. Attending a meet-up is political. Being paid is oh-so-political. Publishing your side project under an OSI-approved licence? The OSI is a political organisation, the courts that will determine whether the terms of your licence are binding are political, the officials of those courts are selected by a political process.

And, anyway, let’s have a look at the front page of hacker news now, roughly five days into their politics-free week.

What they probably mean is not “political stories are off-topic”, but that political stories that stray from the default politics are off-topic. Anything that doesn’t sound like I agree with it must be subjective, whereas things I agree with are objective. Just as the default narrative in society is often white, male and affluent, so it is those things in the Valley and neolibertarian. Anything else is just politics.

December 09, 2016

Reading List by Bruce Lawson (@brucel)

December 05, 2016

My First Algorave by Andy Wootton (@WooTube)


On Saturday night I went to ‘Algorave Birmingham’, curated  by Antonio Roberts at Vivid Projects. I said I might write ‘a review’ but I’m not going to, because I wouldn’t know how. This is ‘a reaction’ – a digital feedback loop, an emission from the event horizon (should have worn my ‘Big Bang’ T-Shirt – the noughties Brum band, not the nerd show.)

My background is information technology. My current work is writing. I use the word ‘work’ in the artistic sense: something I spend my time on but may never get paid for. Themes recur. Are science and art actually different things? Is maths real or a model? Is software any different to magic, existing only outside the physical realm and communicating via intermediary objects?

Q: How much can you strip away from music and it still exist as an idea: melody, scales, pitch?

I came to Algorave via my functional programming experiments. I’m trying to learn Clojure, a member of the Lisp family of languages but with added time-travel. It messes with whether time is a wave or a set of discrete steps that can be retraced. Not real time, obviously but the model of time our software deals with. Time travel outside of the magical realm would be crazy-talk.

Dance music is often first. Drum machines. I got really frustrated the first time I saw how hard it was to programme beats. Where was the programmatic interface? Sampling, pitch-shifting, the ‘sound’ being manipulated by code. Digits being manipulated by digits, like the higher order functions of functional programming. I wondered a few weeks ago if processors had got fast enough to generate live noises. They have. A Raspberry Pi has http://sonic-pI From there I discovered Clojure has, via ‘Overtone’ on ‘SuperCollider’, which resonates with my theory of a super-massive idea colider to mash-up memes.

Algorave Birmingham presented live coders generating sound and visuals. At times I felt that the graphics were pulsing to the beats but I don’t know if that really happened. I saw two pixelated women on the screen typing on ‘real’ laptops and a live drummer on digital drums. Virtuality virtuosos. I had a chat about how to make a hit record and forgot the name of the Kaiser Chiefs but remembered Black Wire who were the first band with a drum machine that I actually liked, because it didn’t sound mechanical, then The Kills who insisted everything was analogue, but now I’m looping.

A: I enjoyed the pulsing white noise. Software can do things that aren’t possible in Reality.

This week's creations and recommendations

I wanted to start writing this as a way to combat the unfollowable mess that has become my personal Twitter and Facebook accounts. I put out so many different things on a given week that I believe it all just becomes noise. So I’ve taken to levelling things out by writing a weekly update of what I’ve been making, along with some of the things I’ve seen and enjoyed. Y’know, like we used to do, back in the day.

Stuff I’ve made

I got back into the swing of the Mood Elevator on Thursday - 1st Dec - and the podcast is now back in full swing after a short break. The latest episode is a bit political.

Yesterday I made a rather delicious soup and wrapped up episode 47 of the Distraction Engine with my co-host Matt. It was a very funny episode although it does feature a pretty heavy trigger warning up top.

Homey, don't be steppin' up; my roasted butternut squash soup don't play dat

A photo posted by Steadman (@iamsteadman) on

There’s no radio show today but you can check out last week’s show:

I'm also starting on a new seekrit project, more of which you might hear later... about... of.

Follow my doings

  • My radio show is on Mondays, 2-4pm on Brum Radio and you can catch up on older episodes via our listen-again facility or subscribe to the podcast
  • The Mood Elevator is Mondays and Thursdays via podcast, and coming soon to Amazon Echo in the UK (once I fix the bug reported by a US user). Also follow @elevatorpod on Twitter for a mention in the next episode
  • The Distraction Engine is my Sunday night show with Matt Smith, available via podcast and live (7pm GMT) on TuneIn. Also follow @distractionpod where we share stories and sometimes get mistaken for more popular podcasts

 In my pocket

Pete Ashton recommended this article on Birmingham's homeless.

Also I'll be reading this piece on Instagram vs Twitter marketing, as recommended by Ammba.

At work

I've got an exciting site launch coming this week, and I got a four-star review for the Jay Northcote audiobook I recorded.

I've also started a hefty new project which will see me pretty busy for the next few months, and I have some voiceover work coming with my Sudovo project.

At play

A shocking discovery about the fifth housemate in The Young Ones

The Walking and Rubbing Up Against Table Legs Dead

December 02, 2016

Reading List by Bruce Lawson (@brucel)

My first Reading List since leaving Opera, and it’s a biggie!

November 30, 2016

As a team lead, my job is to make all the mistakes on my team. I’m responsible for each one of them. I’m also responsible for deciding what we do about them, whether that’s to ensure that they can’t happen again or ignore them because they’re easy to recover from.

That time someone on my team built a feature that didn’t ship because of a bug? I could have made sure the requirements were clearer, or they had more access to the product owner, or a more useful design review, or a more useful code review, or a better test plan. Or all of those, or none of those, or something else. I could have – should have – got the problems out of their way.

They don’t make mistakes, I do.

November 28, 2016

On the front page of Hacker News at the moment is a post on The Three Software Freedoms. It does away with the Free Software Foundation’s Freedom Zero:

The freedom to run the program as you wish, for any purpose.

On the basis that it “is just silly I mean of course I can use the program as I wish.” Of course you can. Except, of course, that’s not in fact true, and because software companies are licensing – not selling – you software, you’re actually bound by their terms and the limitations they impose. Picking just one example, here are some snippits from the Apple Licensed Application End-User License Agreement, relevant to apps bought (sorry, licensed) through the iTunes App Store:

The Products transacted through the Service are licensed, not sold, to You for use only under the terms of this license

The licensor (“Application Provider”) reserves all rights not expressly granted to You.

This license granted to You for the Licensed Application by Application Provider is limited to a non-transferable license to use the Licensed Application on any iPhone or iPod touch that You own or control and as permitted by the Usage Rules set forth in Section 9.b. of the App Store Terms and Conditions (the “Usage Rules”). This license does not allow You to use the Licensed Application on any iPod touch or iPhone that You do not own or control, and You may not distribute or make the Licensed Application available over a network where it could be used by multiple devices at the same time. You may not rent, lease, lend, sell, redistribute or sublicense the Licensed Application. You may not copy (except as expressly permitted by this license and the Usage Rules), decompile, reverse engineer, disassemble, attempt to derive the source code of, modify, or create derivative works of the Licensed Application, any updates, or any part thereof (except as and only to the extent any foregoing restriction is prohibited by applicable law or to the extent as may be permitted by the licensing terms governing use of any open sourced components included with the Licensed Application).

If You breach this restriction, You may be subject to prosecution and damages.

Your rights under this license will terminate automatically without notice from the Application Provider if You fail to comply with any term(s) of this license. Upon termination of the license, You shall cease all use of the Licensed Application, and destroy all copies, full or partial, of the Licensed Application.

You agree that any Services contain proprietary content, information and material that is protected by applicable intellectual property and other laws, including but not limited to copyright, and that You will not use such proprietary content, information or materials in any way whatsoever except for permitted use of the Services. No portion of the Services may be reproduced in any form or by any means. You agree not to modify, rent, lease, loan, sell, distribute, or create derivative works based on the Services, in any manner, and You shall not exploit the Services in any unauthorized way whatsoever, including but not limited to, by trespass or burdening network capacity. You further agree not to use the Services in any manner to harass, abuse, stalk, threaten, defame or otherwise infringe or violate the rights of any other party, and that the Application Provider is not in any way responsible for any such use by You, nor for any harassing, threatening, defamatory, offensive or illegal messages or transmissions that You may receive as a result of using any of the Services.

You may not use or otherwise export or re-export the Licensed Application except as authorized by United States law and the laws of the jurisdiction in which the Licensed Application was obtained. In particular, but without limitation, the Licensed Application may not be exported or re-exported (a) into any U.S. embargoed countries or (b) to anyone on the U.S. Treasury Department’s list of Specially Designated Nationals or the U.S. Department of Commerce Denied Person’s List or Entity List. By using the Licensed Application, you represent and warrant that you are not located in any such country or on any such list. You also agree that you will not use these products for any purposes prohibited by United States law, including, without limitation, the development, design, manufacture or production of nuclear, missiles, or chemical or biological weapons.

So don’t claim, through malice or ignorance, that Freedom Zero is not worth making explicit, and doesn’t need protecting.

November 26, 2016

I’ve recently been talking about software engineering economics, in a very loose way, but so have other people. And now I understand that it’s annoying when people talk about it, and have decided to continue anyway. I’ve decided to continue because what I see is either inaccurate comparisons being made, or valid comparisons that have questionable applicability outside their immediate domain. The world of IT cost comparison is still run by marketing, not by operations.

Recently, I read Don’t Build Private Clouds. Subbu says that the sticker prices (up to $10k for a server that will last four years, vs. up to $1500 per month for a public cloud machine) should not be compared because there are additional costs to self-hosting:

  1. Engineering costs
  2. Network automation costs
  3. Loss of agility
  4. Opportunity costs

Fine, but what are those costs? Why do I not need to do any engineering or automation if I use a public cloud provider? If I do, what is that going to cost? What agility and opportunity do I lose by tying my infrastructure to any one cloud vendor, and what will that cost?

Subbu’s blog says that he is a “cloud helper”, and that goes a long way to explaining why we didn’t get a straight answer on the cost comparison. We’re not being told that cloud services are cheaper, instead we are being told of the Fear, Uncertainty and Doubt involved in choosing the less-favoured path.

Similarly, an IBM employee recently said that Macs are cheaper than PCs by up to $543 per user (remember that’s “up to”, not “as much as” – the lower bound given is $273). Let’s ignore the conflict of interest arising from Apple’s global partnership with IBM: IBM wouldn’t say that their partner systems are cheaper so that they could drum up interest in their partnership services, surely. Surely. I mean, this isn’t the IBM of 1984, is it?

What IBM’s VP says is that over a four-year lifetime, among employees who are given the choice of which platform and model computer they want, the Macs are cheaper. That’s of course a figure about which it’s possible to make realistic comparisons: given IBM’s approach to desktop support, IBM’s level of staffing, IBM’s applications, IBM’s approach to working, IBM’s budgeting for IT support operations, it’s cheaper for people who choose Macs to use Macs than for…well, it’s not clear, but it seems to be than for the “everybody else” bucket: not only people who chose PCs to use PCs, but people who weren’t given a choice to use PCs.

So before you make a textexpander macro for that link and insta-reply to anyone who uses the phrase “Apple Tax”, just how similar is your environment to IBM’s?

November 23, 2016

DDD - Events by Shaun Finglas (@ShaunFinglas)

The act of something happening is one of the most crucial aspects of implementing Domain Driven Design (DDD). I missed the importance of domain events when first exploring DDD.


Most requirements come in the form when something happens, do this. Something in this case would be an action, and this would be the result taken afterwards. Most domain events can be discovered when requirements use this sort of language.

Another important consideration is that most requirements are evolutionary. They are often added as the feature is developed. What may start off as a single piece of behaviour, may evolve into something much more complex. Events allow this evolution in a decoupled manner.


When a blog post is published, update the authors statistics. In code this may have a signature similar to:

The publish method is responsible for the publishing of the post. This entity holds responsibility for the pre-conditions and post conditions of such action. Also the method takes a domain service that will update the authors statistics as this is not the responsibility of the Post entity itself.

A new requirement may be to automatically send out a tweet with the post title and description. Without events this could be added in a similar manner.

Again the service will do the right thing once invoked, in this case send a tweet out. As you can see we could repeat this sort of enhancement over and over. While this does indeed complete the functionality that the business requires, the solution is far from elegant. A much better solution is to rely upon domain events.


The difference here is the publish method does nothing other than its internal logic. However it does publish (raise) an event to indicate a post has been published. Subscribers (listeners) to this event can then perform their corresponding actions.

Using the previous example two subscribers would be configured to send tweets and update author statistics. Each of these subscribers (handlers) would run in process by default, so their internal implementation should be as simple as possible. In other words record the request, and process this in the background. The code to raise the event is relatively simple, and can simply forward to any registered subscribers based upon a type. Any failure should not cause the publish to fail. Alternatively external subscribers could also handle this event, though this implementation would require the use of resilient and durable storage such as message queues or databases.

Ultimately domain events allow for extremely loosely coupled code, that is open for extension. Each handler can be developed and tested in isolation. The use of composition means that new features should become easy additions, with low risk.

One aspect that may stand out is that the use of this pattern uses a static class to publish events. While in most cases this would be poor for testing, this is not the case here. For tests prior to each step executing you can simply clear any registered handlers and configure what is required. If no handlers are configured, then nothing occurs. Also test handlers that simply report that fact a message has been raised are more than adequate.


While this refactored example is loosely coupled, and open for extension, the intent of what happens after a publish is somewhat lost. Before it was clearer to see what the Publish method would do. This is a trade off, though the pros outweigh the cons here. Most IDE's have a way of showing you the use of all types, so we could easily see any handlers that consume the PostPublishedEvent.

Even with IDE/editor support, the loosely coupled nature of Domain Events can be tricky to debug at runtime. For example I once accidentally configured a game engine to handle events triggered from player movement. This meant that each frame of the game executed the collision detection algorithm twice, instead of once. Without a clear audit of what handlers are being executed upon what events, the use of domain events can be tricky to debug.


  • Domain Events are a key area of DDD.
  • Use events to write loosely coupled code.
  • Ensure you have a method of auditing with handlers respond to which events.

November 21, 2016

We have always been interested in working with the Health sector, and have delivered several projects over the years which whet our appetite. Earlier this year came our big opportunity to give the sector the attention we’d hoped for… The Prime Minister’s Challenge Fund was created to support primary care, improving service and accessibility to […]

November 19, 2016

Can’t you just… by Graham Lee

Continuing the thoughts on vexing problems, one difficulty when it comes to discussing software is talking about the size of software. I’m not really talking about productivity metrics – good or bad – like source lines of code or function points, rather the fact that the complexity of a problem looks different depending on who’s doing the looking.

Sometimes, a problem that’s very simple from a business perspective can be incredibly complex technically. One product I worked on could be summarised very quickly: let people interact with marketing campaigns by sending and receiving messages on their mobiles. The small amount of logic between send and receive – allowing the campaigns to operate as quizzes, votes, or auctions – could be detailed on an index card.

But that simplicity was backed by a huge amount of technical complexity to make it work. “Can you just send this message to everyone who got the quiz question correct?” Well, yes, but as it’s a picture message we need to work out how to make it look good on the recipient phone, change it to fit those criteria, and then send it. What makes it look good – and indeed how we can get the information to make that decision – depends on the device, but also which network it’s on, and maybe whether it’s on pre-pay or post-pay and whether they use HTTP, WAP or e-mail to send messages to that device (which might be different from how they send to other devices on the same network). And even after we’ve gathered that information, it may be wrong as some devices claim to support image formats that they can’t render, or image sizes that they’ll actually reject or fail to display.

On the other hand, sometimes the business problem is a lot more complex than the technical problem. If you’re a mobile app developer, any length of problem definition about exciting disruptive apps can be reduced to “so you want to display data from a web service in a table view”.

And then at other times, “can’t you just” gets stymied from left field. Why yes, we could simply do that, and it would be good for the business, but this regulation/patent/staff shortage means we need to do something else.

None Of Us Are Free by Stuart Langridge (@sil)

Well you better listen my sisters and brothers,
‘Cause if you do you can hear
There are voices still calling across the years.
And they’re all crying across the ocean,
And they’re cryin’ across the land,
And they will till we all come to understand.

None of us are free
None of us are free
None of us are free, if one of us is chained
None of us are free

And there are people still in darkness,
And they just can’t see the light.
If you don’t say it’s wrong then that says it right.
We got try to feel for each other, let our brothers know that we care.
Got to get the message, send it out loud and clear

None of us are free
None of us are free
None of us are free, if one of us is chained
None of us are free

Now I swear your salvation isn’t too hard too find,
None of us can find it on our own
We’ve got to join together in spirit, heart and mind
So that every soul who’s suffering will know that they’re not alone

None of us are free
None of us are free
None of us are free, if one of us is chained
None of us are free

If you just look around you,
You’re gonna see what I say.
‘Cause the world is getting smaller each passing day
Now it’s time to start making changes,
And it’s time for us all to realize,
That the truth is shining real bright right before our eyes

None of us are free
None of us are free
None of us are free, if one of us is chained
None of us are free.

Application of this to the year 2016, how you should deal with everything that’s happened this year, and how you should stand with your friends and the people around you… is left as an exercise for the reader.

November 18, 2016

I’m conflicted. Part of me says that ‘us old timers’ shouldn’t assume ‘the way things were when we were kids’ were better but we know the Raspberry Pi was an attempt to recapture the spirit of the BBC Micro Model B and that seems to have gone quite well. I got a Pi 2 and I’ve worked out that it is more powerful than the first computer I worked on, a DEC VAX-11/780 which supported about 16 terminals, most used for teaching college level computing. Having that machine to myself would have been an unimaginable amount of processing power for one developer. Banks ran their financial modelling software on boxes like that. So why does the Pi feel so slow? We wasted our gains on GUI fluff.

When I started computing you learned just enough of the command language to get going. So, that’s bash on a pi. Then an editor. For reasons that should become obvious, let us choose emacs. When I first used the VAX/VMS operating system, it didn’t have command line editing. If you made an error, you typed it all again. Getting the facility to press up-arrow, edit the command and re-execute it was a big advance. We should keep it. Bash has that, using a sub-set of the emacs keys, so that’s a way into emacs.

The next big improvements I remember were X windowing and symbolic debugging. We got debugging first but it became far more powerful with multiple terminal windows. The GUI was OK, I guess but DEC didn’t give us many free toys so the main advantage to a developer was having lots of terminal windows. emacs can do that, without the overhead of X.

When I decided to re-learn coding a while back, I got my shortlist of languages down to Python, Java and JavaScript but picked Python because I was already learning a new language and the Object paradigm, so I didn’t want to have to learn web at the same time. I heard about the modern Lisp dialect Clojure and changed horses mid-stream. I’m convinced by the argument that functions and immutability can save the universe from the parallel dimension.

Last night I deep-dived into emacs and found myself in an editor session with 4 windows. Why do I need more than that to learn about computation and data transformation? This guy seems to have come to a similar conclusion I’ve also wondered whether a purely functional OS might make Sun’s ‘the network is the computer’ dream a little easier. emacs is written in Lisp.

I think a dedicated Lisp machine may be a step too far back. How would you browse in the world-wide hypertext library when you got stuck? But a Linux with bash, emacs, the Java Virtual Machine and libraries, Clojure via Leiningen and Cider to plug everything together might make a fine Lispbian Pi! Is all this chrome and leather trim completely necessary in the engine compartment?

It is unfortunate that the Raspbian upgrade left Leiningen broken.

November 17, 2016

Since I started to use Markdown, I’ve found it helpful to use the ReText editor in ‘Live Preview’ mode (Ctrl-L) so I can write Markdown markup language in the left-hand window and see What I Got in the right-hand window. It’s easy to forget that there is no official standard for Markup, so when you want to do something ‘none standard’, different implementations may have handled your problem their own way. Some answers I found didn’t work.

I wanted to force a page-break when I print out a cheat-sheet I’ve written and intend to update, as I  learn emacs key-bindings. There are several already but things weren’t arranged in an order that was helping me to learn which keys work in the Linux bash shell (another command-line editor option is available but emacs is the default.)

ReText supports something that appears to be based on HTML/CSS. Other interpreters use LaTeX syntax. In ReText, page-break-before style is applied after the text you want to appear at the top of the new page.

"...some text from the previous page

## New Section Title {: style="page-break-before: always" }

Text on new page"

Leaving Opera by Bruce Lawson (@brucel)

After Opera’s consumer products (browsers and Opera Max) were taken over by a Chinese consortium on 4 November, Opera and I are parting ways by mutual agreement. I’m no longer a representative or spokesman for Opera products, or the Opera brand.

In my eight and a half years at Opera, I’ve done well over 150 conference talks, visited the USA numerous times; Norway dozens of times; Netherlands seven times; Spain and France four times; Poland, Germany, Romania and Russia three times; India three times (once for nearly a month, once for three days!); Indonesia, Italy, Denmark twice; Japan, Australia, Bulgaria, Sweden, Israel and South Africa.

Opera gave me the freedom to experiment with HTML5, and co-author a book with Remy Sharp; to play around and agitate for responsive images (now in all browsers!); to mentor my friend Lu Yu to become a speaker; to donate speaker fees to an NGO to buy computers for a Cambodian village school, and to sponsor conference diversity tickets so our industry can maybe become less of a white male club.

I’m hugely grateful to those who hired me and managed me for allowing and encouraging this freedom: thank you, Live Leer, Jan Standal, Andreas Bovens, Karin Greve-Isdahl.

I’m proud of the products I worked on, and hope they’ll be stewarded well in the future. I’m proud that Andreas Bovens and I got Progressive Web Apps into Opera for Android. I’m proud of the work I’ve done educating Western developers about the rest of the world. It’s been a joy to meet and work with many, many great people in Opera (shout out to Devrel and PR/ Marketing!), friends in other browsers, and across the industry. Thank you to all of you.

I wish all my ex-colleagues —those who are also leaving, and those who are staying— every success. I’ll be cheering you on.

Yesterday was my last working day. And now, as it’s the first week after my 50th birthday, I’m taking a short break to get over a mild flare-up of my Multiple Sclerosis, and to think about what comes next. Top of the list is training to be a buddhist monk while teaching poor/refugee children in South East Asia, or reprising my 1990s life on a beach earning money playing guitar and reading tarot cards. But those won’t pay my kids through university.

I most enjoy being a public face of an organisation that aims —however modestly— to increase the sum of human happiness via the Web and tech. If you have a job opening that you think would be suitable, and you’d like to rent a Bruce of your own, please get in touch (bruce @ this domain). I’ll still be avidly keeping up with the web industry, and conference talk invitations are still encouraged.


Addendum 30 November 2016. It makes me sad to announce that a group of colleagues – Andreas Bovens, Mathias Bynens, Shwetank Dixit and Vadim Makeev (the entire Opera Developer Relations Team) – who, over the course of the last eight years, have become friends, are also leaving. I wholeheartedly recommend each to any future employer.

The Unvexing by Andy Wootton (@WooTube)

This post comes to you courtesy of Graham Lee at: who reminded me about Value. We agilists (people who believe in agile software development) talk about value a lot but haven’t  agreed on a consistent definition of the word. As an illustration of two of the options:

“The value of this car is £9,500.” Is that to a seller or a buyer? Unless there is a difference, no trade will take place. Or is it a market rate? The long acquisition dance between Yahoo! and Google makes an interesting case study. This is: a value. A ‘fact’, right or wrong. It is the kind of thing developers in imperative programming languages put into variables and mutate but pure functional programmers squirrel away for ever, to embarrass themselves at their past Wrongness.

In contrast, “This car cost £9,500 pounds. I think that was quite good value but the model that costs £1,000 more is even better value.”, is a relative benefit:cost calculation, yet the manufacturer may market a ‘value’ model, which is just cheap. This is: a value judgement. An explicit or implicit comparison relative to something else, followed by a decision. It is a computation.

When Graham says, the most vexing problem of software product  developers is their inability to “compare the expected value of their work to the expected cost of the work.”, I think he means  ‘business benefit of their work’, and cost normally equates closely to development time. All the customer really wants to know is: “Is this the best investment I could make now?”

Graham goes on to say that we are very bad at estimating how long something will take. This is true but we are much better at estimating small jobs accurately than large ones.  Uncertainty increases exponentially with length of sequence of actions, to slightly corrupt Shannon’s Information Theory. This is why the Fibonacci sequence is often used as a sizing tool.

Agility accepts this reality. It addresses the list of things the customer currently wants, in highest benefit:cost ratio order (guessed by a business domain expert, based on guesses by an agile develooment team.) It doesn’t yet know whether the ‘whole job’ is worth doing. It decides only whether to risk the next small, cheap step and keeps doing that, as long as the ‘value’ is Good Enough. While value is high and risk is low enough, keep going.

A journey of any length starts with the first step, so why worry about whether or not it is going to be 1000 Miles? The hard part is to make it a journey, rather than simply wandering about, lost.

Then there are: our values. Our personal decisions about what matters most to us. Do we go home to read our children a bedtime story or work late and win that promotion so they have greater financial security in the future? What do we really care about and what are we willing to pay for it? This too is relative. Politics is the art of persuading you to modify your personal values. Currently, cheating is allowed.

November 16, 2016

In the vexing problems, I dismissed the hard problems of computer science as being incidental to another problem: we can’t say what the value of our work is. That post contained plenty of questions, precisely because the subject is so unknown.

There are plenty of ways in which the “value” of something can be discussed, but let’s stick with economic value for the moment. Imagine you have the opportunity to write some software, but only if I pay you for it. And not even then, but only if you can make me reasonably confident that I will get some return; that having the work done is worth more than the cost of you doing the work.

A corner of the software industry just cowered and stuck its head in the sand. “#NoEstimates!”, they cry. This problem is hard, so why should we solve it?

That’s a really interesting perspective. You should come and talk about #NoEstimates at my conference. It’ll be on sometime, in a place, and there’ll be a flight that can get you there. Maybe. That’s enough information to be going on for it to be clear that you should commit to it, so I’ll see you there.

At the other end are the folks who would literally write whole books about the topic (and given that books are themselves literary, that “literally” is itself meant literally). I pulled a few likely titles off the shelf to see what they would tell me, and ended up with:

We have to wonder how some people can be certain that estimates are worthlessly inaccurate, while others such as Barry Boehm (the author of Software Engineering Economics and the COnstructive COst MOdel it describes) have built careers out of explaining how to do it well.

Here’s one hypothesis: Boehm is a charlatan, and the COCOMO doesn’t work at all. Let’s see whether there’s evidence for that.

A likely source is COCOMO evaluation and tailoring by Miyazaki and Mori from Fujitsu. The authors of that paper, applying the COCOMO (’81, not the later COCOMO II) model to a corpus of projects undertaken by Fujitsu, conclude:

The original COCOMO overestimates the effort required to develop software in our environment, but its tailoring methodology is applicable. […] The resulting model fits 68% of the projects with less than 20% relative error, after the deletion of two outliers.

That’s maybe short of brilliant – the median project effort in their paper seems to be over 10 person-years, so they’re saying “there’s around two chances in three that we can tell you what this project will cost to within twice a developer’s salary” – but it’s much more precise than “#NoEstimates!” and only quite a lot less accurate.

It might be interesting to track the application of COCOMO through time, and see whether a larger corpus of projects and refinement of the model has improved its accuracy and applicability. Unfortunately, that goal is in conflict with a general industry observation, noted in the introduction of the Fujitsu paper:

We have the impression that software people prefer to start from scratch rather than improving upon the work of others, which seems to be slowing down the progress in this field.

And indeed much of what was written in the sources I’ve been talking about here is no longer applied. All three of the books I mentioned up top talk about Earned Value (EV) Analysis, recording the actual rate of delivering on a project against its Planned Value (PV). For example, Hughes and Cotterell recommend plotting earned value using the “0/100 technique”:

where a task is assigned a value of zero until such time as it is completed when it is given a value of 100% of the budgeted value

Agilistas will recognise the resulting plot: it’s a burn down chart, where a story is not delivered until it has been accepted according to the definition of done, at which point it is completely delivered.

Ultimately somebody in the Agile community must have noticed that they accidentally borrowed a software engineering concept, because the burn down chart is now unfashionable.

If the team starts with a very full, prioritized, and estimated backlog with the expectation they will burn down all tasks to zero — does this not sound like a Waterfall mentality?

Oh noes, the dreaded W word! Run away from this thought, for it is a thought that somebody in the past has already considered!

And that is why I consider these problems to be vexing: when potential solutions are proposed, they are by necessity existing ideas from the old school that must be rejected in favour of…whatever is not those solutions. As Craftsmanship is post-Agile is post-Software Engineering is post-Crisis thinking, surely it will soon be time for post-Craftsmanship thinking. And then post-whatever-comes-next thinking. And we still won’t know how to compare expected value to expected cost.

November 13, 2016

I admit it, I’ve been on the internet for quite a while (I could tell you that my ICQ number is 95941970, but I haven’t logged in for years) and my habits haven’t changed. I still regularly get technology news from slashdot, and today was no exception. An interesting article was Here Be Dragons: The 7 most vexing problems in programming. Without wanting to spoil the article for you by giving away the punchline, there are indeed some frustratingly difficult problems mentioned: multithreading, security, encryption are among the list.

All of these problems are sideshows to what I see as one of the largest and most vexing issues in programming: the fundamental rule to business administration is that your income should be greater than your costs, but software makers still, by and large, don’t have a way to compare the expected value of their work to the expected cost of the work.

The problem in space

Different software teams – and individuals – do work in different contexts, and in different ways. The lone wolf micro-ISV is not the same as an individual contract developer. The in-house IT team does not have the same problems to solve as the shrinkwrapped software vendor, and those developing web services for public consumption have yet another context. The team with core hours all working in a single office is different from the distributed team inhabiting multiple time zones.

How much of this variety is essential, and how much is accidental? How much of it is relevant, when considering some intervention, process change, or technique? Consultants speaking at conferences (another context with its own similarities and differences from the others) don’t tend to talk about what researchers in fields such as psychology would recognise as “threats to validity” of their work, but given all of the ways in which software is made, we need to know whether some proposal applies to all of them, or to some of them, or whether it has been applied to some of them and might be applied to others, and what would assist or confound that application.

The problem in time

What are the accepted, tested and validated ways to identify who will be using and otherwise impacted by our software systems? To know whether they can use the system we propose, and whether it is the best system for their intended use? To ensure that our proposed software systems treat those people ethically? To understand the cost (to ourselves and to others) of constructing those systems? To deliver the systems to the people who will interact with them? To choose which people are or aren’t entitled to access? To build a representation of the problem to be solved, to validate that representation, to validate the solution against that representation?

Where an answer exists to those questions, what are the contexts in which it is valid and what are the threats to its validity? How has that answer been compared with other possibilities? How has it been confirmed? How has it been challenged? How can I find out about those confirmations and challenges? How can I find out about any alternatives? What techniques exist to weigh up those alternatives quantitively, rather than relying merely on the persuasiveness of the conference speakers promoting those solutions (and, by the way, the books/screencasts that describe the solutions)?

The lack of a problem

Why should I care? There’s enough money in software at the moment to mean that I don’t need to be any good at knowing what works or doesn’t work, I just need to get out there and sell some software. In the rare situation that I don’t make my money back, that’s just the market forces at work, and I can go and get a high-paying job somewhere while I lick my wounds, and pick another programming language/framework/platform/whatever it is that’s going to make my next attempt definitely succeed.

Clearly, this bottomless pit of money that arises from society’s unwavering faith in software and its ability to cure all ills is never going to run out. There’s no need to worry ever about whether we’re doing it right, because there’ll always be someone out there willing to pay for us to do it wrong. Life as a programmer is like some kind of socialist utopia where whether we’re making a valuable contribution or not, the rest of society is looking out for us.

That’s going to last forever, right?

November 11, 2016

Reading List by Bruce Lawson (@brucel)

This week I’ve been reading lots of stuff about the (possible) future of the Web: Virtual and Augmented Reality, Context-Awareness and other interesting stuff.

We are Very Sorry by Andy Wootton (@WooTube)

We know you don’t understand why we won’t stop moaning and make the best of it. We know you took your country back or took back control or whatever lies you believed, but the people you took it from weren’t a rich elite, it was us. While you think you are on the way to achieving your dream of a better life, for you, your family and your nation, against all the others trying to steal it from you or suck you dry with taxes, we lost our dream of greater equality, fairness for all, an end to prejudice and warfare. We lost a huge slice of human culture in the swamps again; mostly the  good stuff. You chose the sole protection of wolves on a barren island when you burned that bridge to Europe or believed the vague dreams of proven fantasists.

So, right now, bottomless cynicism is all we have. It is the natural response of rational thinkers who believe in evidence before the rhetoric of slime-balls, to the tragedy that has befallen everyone who doesn’t think they are worth more than everyone else in the world and competition with sworn enemies is the only way to make progress. We don’t see any progress, just a slipping back to survival of the fittest. If you were really the fittest, why did you feel like losers on a level playing field?

We must eventually win or we all die, because the planet isn’t safe in your hands. You just made it very much harder. Your thoughtless positivism will be the death of us one day.

November 10, 2016

I’m a big fan of predominantly audio experiences in real spaces.  Staying connected with the real environment while augmenting it with audio can be powerful.  Definitely preferable to being distracted by a mobile screen! You can see this in some of my recent projects: Farmer George’s Flock A Moment of Madness   Take & Make […]

November 08, 2016

£32 – £38k Based in Birmingham or London Monday to Friday, 9 – 5 We are looking for a talented and motivated individual to help us establish and deliver the company’s client services function. Over the past couple of years Substrakt has experienced rapid and sustained growth in both the number and size of new clients. We […]
[While I’m on a blog posting roll – here’s some details of another project that I’ve been collaborating on – again with interactive theatre makers ‘The Other Way Works’] The idea: Cuddly Sheep as the Game Controller We were fortunate to win a competition earlier in the year to develop a ‘playful experience’ to bring […]

Two other stand out topics from POODR were the use of tests and inheritance. The first set of higlights covered dependencies and arguments.


A conclusion that I agree with is that in general most programmers write too many tests.. A great quote in the book sees tests (as) the canary in the coal mine; when the design is bad, testing is hard. Sadly too many poor tests are often written. Examples such as property or construction tests, framework tests or tests that are coupled to the implementation are all common problems. Instead we should aim to get better and more value out of our tests by writing fewer of them, but of higher quality. In short test everything once and only in the proper place. A first step is to simply focus on the ROI that tests give, and focus on the high risk areas.

The test categories are broken down into two core types of tests.

  • Incoming Public Messages (public API)
  • Outgoing Public Messages (To public API of another object)

State based tests should be used for incoming public messages. While verification based tests should be used for outgoing public messages as the state is tested on the receiver, elsewhere. The distinction between commands and queries is also highlighted. In summary incoming messages should be tested for the state they return. Outgoing commands should be tested to ensure they get sent. Outgoing query messages should not be tested, merely stubbed.

These testing rules are nothing new, but the summary and importance of following these guidelines is nicely summarized within the chapter covering testing principles.


Inheritance is widely abused and misunderstood. Either inheritance is the solution for all problems, or you're advised to never use inheritance. POODR takes a more pragmatic approach. Inheritance is a tool that can sometimes provide an excellent solution, however you are better off duplicating code and defer such decisions until you know more.

The wrong abstraction is harder to work with than duplicated code as duplication can easily be removed. A bad abstraction that is used in many places is much harder however. The application of the Rule of Three can help here.


  • Tests are hard - write less but focus on the quality.
  • Minimize the number of tests you write by using boundaries via incoming/outgoing messages.
  • Inheritance is not all bad.
  • Defer or hold back using inheritance until you understand the problem.

November 07, 2016

Agent in a Box – spy thriller game / theatre experience Some time ago I was collaborating on an exciting real-world game ‘Agent in a Box’ with interactive theatre company ‘The Other Way Works’.  The observant among you may have already found (one of the very few) blog posts I wrote about this very project.  […]

On Friday’s reading list I linked to Google’s HTTPS Usage report which said that

Secure web browsing through HTTPS is becoming the norm. Desktop users load more than half of the pages they view over HTTPS and spend two-thirds of their time on HTTPS pages. HTTPS is less prevalent on mobile devices, but we see an upward trend there, too.

(The report is undated, but as the data continues after October 2016, I assume it’s current. As an aside, please put dates on research and stats you publish!)

Erik Isaksen tweeted me asking “I’m wondering why ‘especially on desktop”. I replied with my speculations, reproduced here in longer form :

Despite the rise in mobile use, desktop numbers aren’t declining, and perhaps many people do as I do: I might search and compare products on my mobile, but I actually do the purchases on my desktop machine. It’s a lot easier to type on a full-sized keyboard than a virtual keyboard, and purchases on the web are still laborious. I doubt it’s just me; generally, users abandon mobile purchases twice as often as desktop purchases. (That figure is from Google’s tutorial on the Payment Request API. I’m eagerly awaiting completion of Opera’s implementation.)

Similarly, I never do online banking on my mobile, I always use my desktop machine which has a direct line into it. (Even though I know that my bank’s website is HTTPS. But when I visit my branch, I notice their internal systems are all using IE6…)

It’s also worth bearing in mind that many of the regions that are mobile-first are home to large populations of unbanked people, or populations who don’t use credit cards much. There’s a lot less imperative to offer local websites securely when there is no money changing hands through them, while the services that are popular everywhere (Gmail, Facebook etc) are already HTTPS.

I’m told that HTTPS is comparatively expensive for site owners in the developing economies, and advertising revenues are declining as more and more people use Ad-blockers: 36% of smartphone users in Asia-Pacific use ad-blockers; two-thirds of people in India and Indonesia (source) and statistics from Opera’s built-inn ad-blocker shows that Indonesia has the most ads blocked per person in the region.

I suppose the crux of my speculation is: do people perform different kinds of tasks on mobile and desktop? Some tasks – banking, purchasing – require more convoluted input and are thus more suited to desktop devices with a full-sized keyboard, and such tasks are performed on HTTPS sites.

But this is only speculation. Anyone have any hard data on why HTTPS is more prevalent on desktop than mobile?

8 November 2016: Amelia Bellamy-Royds suggested on Twitter “No hard data, but my guess: secure websites for social media, email, etc., are replaced by native apps on mobile.” This certainly maps to my own experience, as I used the Gmail and Twitter apps on Android.

November 04, 2016

Reading List by Bruce Lawson (@brucel)

Around a year ago, I bought a OnePlus X phone. I was given a whole bunch of warnings by a whole bunch of people that their customer support was terrible and if the phone broke, I stood no chance of getting it repaired.

Well, it broke. Specifically, it stopped charging. I had to wiggle the connector, charge it by holding the lead at different angles, the works. That was really annoying. So I thought: they should fix this. Here’s what happened.

Tuesday evening, at eleven pm, I used the “Live Chat” thing on OnePlus’s website, and was put in touch with a service engineer named “Irish”. I explained the problem. Irish said: OK, we’ll fix that; if it turns out you broke it you’ll be charged, if not we’ll fix it. A pleasant conversation, in which he talked me through setting up an RMA request on their support site. Shortly thereafter, I received by email a DHL dispatch note, which I printed out and glued on the outside of a jiffy bag with my phone in it. DHL rang me up the next morning to arrange pickup; I arranged that for this Monday. A chap arrived and picked up the phone. Today, four days later, I’ve just got the phone back, delivered back to me by DHL again, and it works.

It is hard to imagine how customer service could be any better than this. My thing broke, they picked it up from my flat, repaired it, and delivered it back to my flat at their expense, with no complaints, in four days. This is excellent. Thank you OnePlus, thank you Regenersis the OnePlus service centre, thank you Irish. Maybe I’m unusual; maybe OnePlus have upped their game in the last year; maybe this is just luck. But this is a sterling example of how interaction with a company should go. OnePlus: exemplars of customer service. I am impressed.

The right-wing newspapers today have hit a new low in their attempts to mislead and whip up anger. “Enemies of the people” the Daily Mail headlines, saying that the high court judges “defied 17.4 million Brexit voters”.

Let’s be clear what happened. From the first paragraph of the judges’ summary of their ruling: “The court is not concerned with and does not express any view about the merits of leaving the European Union: that is a political issue.”

A member of the public, Gina Miller, asked the court to review whether the UK government could remove her rights without going to Parliament first. Any citizen can ask for a judicial review; this is because we live under the rule of law. This is a Good Thing, but the right-wing press are trying to undermine this.

The ruling goes on to state (paragraph 2) “It is accepted by all sides that this legal question is properly before the court and justiciable; under the UK constitution, it is for the court to decide”. (Note “all sides” accepted the legitimacy of putting the question before the court.)

The judges decided that triggering Article 50 would fundamentally change UK people’s rights – and that the government cannot change or do away with rights under UK law unless Parliament gives it authority to do so.

Whether or not you approve of this ruling (and, for the record: I do) it is dangerous nonsense to say that the judges are “blocking Brexit” or “enemies of the people”. On the contrary, they are champions of the people: they are upholding British law, upholding the British Constitution, protecting Parliamentary democracy and restoring sovereignty to the people’s representatives.

Addendum: Some rushed and barely coherent thoughts on today’s Article 50 judgment by Matthew, a barrister.

November 01, 2016

I was very fortunate to be selected by West Midlands Museum Development to work with and mentor museums across the West Midlands.  This began by museums attending one of three different workshops and then applying to be one of the 10 museums to get further mentoring from me. The introductory workshops were broadly defined by […]
Back to Top