Saturday, November 21, 2020

The Point of 'No Return'

The Point of 'No Return'
Welcome to \new world

I believe that life is important...
...and way too much of it has been wasted on dealing with issues arising from inconsistencies between line endings.

A modest proposal:
In today's world most programs can handle the line ending \n correctly.
The 'No Return' movement seeks to make inconsistent lines ends a thing of the past.
There are 3 practices on the path to achieve this:
  1. By default never use \r\n line ending in anything that it outputs.
  2. Have a toggle to turn this off for people stuck in the past
  3. (optional) On reading, replace all '\r\n' with a '\n' on any file used by the program

Don't most programs already have the ability to toggle?

Yes, but they tend to default to the version of the system. Meaning Windows perpetuates the line ending inconsistency problem.  If you have dealt with this issue (which you probably have) this is why.
Most people don't change the defaults. We need to start making inconsistent line endings a very rare exception

It's just two options, is it really such a big deal?

It shouldn't be. But I personally have spent weeks of my life dealing with this issue. If you were to total up the hours of all programmers it's lifetimes of people, and it isn't going away. Our current path is pass this problem on to the next generation. We need a path to end it.

But isn't there a reason for \r\n?

Yes, it was based on the way typewriters worked. We are still dealing with legacy from type writers.

Ok, you've convinced me, how do I signup?

Simple, copy the above logo and add it to your site, link to this article and add the 3 rules to your code base.

note: I originally wrote this in august of 2014. For some reason I never published this. I'm finally doing it in November 2020 because I'm still dealing with this issue....

Thursday, October 22, 2020

Online Remote Training: Lessons Learned

By Llewellyn Falco and Clare Macrae.

Here is what we learned about how to do effective online training, to help you run better courses yourselves, or to help you choose better courses to attend.

TL;DR: Take advantage of being able to spread classes out over time. When meeting virtually, don’t pretend that you can replicate what you do at in-person training. You will need to scale back and make accommodations for the added problems of remote training.

See it for yourself at our November 2020 class “Testing Legacy C++ Code effectively with Approval Tests


Over the last 6 months, we have been intensively learning how to create online training with a similar level of quality to in-person training. In this post, we share what we’ve learned so far. 

Note: Skills vs knowledge. There are multiple types of training: many are focussed on transferring knowledge. But we believe that one of the big advantages of training is the ability to transfer skills. Teaching skills requires a lot of hands-on work from the participants. This is a different, and slower, process, but the one we are talking about today.

Benefits over in-person training

Fortunately, there are some advantages to online training, which can make them better than in-person courses. Let’s start with the positive.

Multiple Shorter Time Slots

If you remember back in school, we didn’t do a week of arithmetic, followed by a week of literature, followed by a week of physical education, followed by a week of art. This is by design. Humans learn better by doing a little bit every day. Part of this is how much we can learn in a given day, but the other part has to do with the need for periods of rest in between. Time in-between is where we can absorb and incorporate those skills into our being. Remember, exercise does not build muscles, it destroys muscles. It’s the rest afterwards where the muscles rebuild.

Spreading out a course of short periods on multiple days is never done during in-person training courses, because these typically involve the time and costs of hotels and planes. So instead we batch-up into a full day or a full week, with 8 to 40 hours of training. Sometimes we try to spin that as a good thing, with a title like “Boot Camp”.

We have found that, rather than teaching an 8-hour class in a single day, it is better to teach an 8-hour class, split up into 2 hours per week over 4 weeks. This yields much better results for the students. It not only gives them more time to absorb the information, and revisit it if needed. More importantly, they get to try out these skills during their normal activities.

Other bonuses are that it also makes it easier to maintain focus for the entire session, and even makes it easier to deal with time-zones. (I can easily wake up early for 2 hours every Monday without it disrupting my entire week. If I have to wake up early every day, my entire week is shot.)

This is true for both attendees and instructors.


There are lots of benefits to homework, in deepening an understanding. Unfortunately, it is not practical to assign homework after an 8 hour day, that has to be completed by the next day.

With short, weekly sessions, homework is now practical, useful and accessible.

We have found these useful types of homework:

  1. Repeat the exercises that we did in class, to make sure that you can understand them, and get them working on your own computer.
  2. Homework that expands your absorption, such as actively trying to use the techniques you are learning, in your day-to-day work.
  3. Supplemental reading and videos. Use this sparingly.

You cannot make homework essential, so we do not try to introduce new concepts via homework. This means that if a concept is introduced in supplemental reading or a video, we will always re-introduce the concept in class, as though it is the first time students are seeing it. This is important to not disadvantage students who don’t have the extra time to spare.

A powerful motivation for doing this week’s homework is the fact that other students did last week’s homework. Be aware that even with very motivated people, some will still not do the homework because other important things took priority. So you do not want to shame anyone for not doing the homework, but at the same time, you want to make visible that the other students are. We have found this to be a better motivator than your instructor telling you to do your homework or grading the homework.

To this end, these are the things that make it easier for the homework to be done:

  1. End each session with a clear and consistent assignment. It’s easier to do something if it’s clear what you have to do.
  2. Begin each session with a check-in, where the students can see that (usually) the majority of the other students are doing the homework.


Of course it’s not all better. We have found some serious constraints when running online courses.

The need for video

One of the things we noticed is, as an instructor you are often helping people to accomplish tasks. Without video it’s almost impossible to tell the difference between “I’m not doing something because I have no idea where to start” and “I’m right at the edge, ready to jump, and i just need a little bit of encouragement to move”. These are huge extremes, and how you help an individual student at these moments greatly depends on where they are.

We have found it to be so important that we have made video a requirement for attending our courses.

Protocol: At the beginning of each course we state that, if for any reason you need to step away from your computer, that is OK. Simply turn off your camera and mute your mic, and we will assume that you are out of the room.

Smaller classes

While it is possible to run a lab with 20, 30 or sometimes 40 people in a room, we have found it very difficult to handle class sizes greater than 12 online. The issue here is the inability to split the instructor’s attention. If you put people into break-out rooms, you are effectively blind to everyone, or blind to everyone else but those in the room you are in. If you keep them all in the same room, you can’t do small-group work. This is not the case in the real world, where you can see the whole room, and the tables can just focus on themselves. Some of this can be mitigated by having an extra person co-facilitate, but this also complicates things. You need to have smaller classes.

Have backup options

“Anything that can go wrong will go wrong” (Murphy). Things go wrong all the time, even at in person events. But I’ve never been in a physical class where I just disappeared. Online, I have.

You can lose the internet, your computer can die, you can be region-blocked, the student’s computer and internet can die, servers and services can go down. What do you do when this happens?

The best advice we have is to have backup options. Two instructors means one of you can lose the internet (if you make the other one a co-host). Having multiple channels of communication (Google docs, email, Zoom, remote-desktop to shared computer) not only means that you have a way to communicate when something goes wrong, but also makes it easier to figure out what went wrong, when the inevitable happens. Also have a second internet connection (usually a phone). 


Backup options don’t work if they are not set up and tested. We have found that we need to make a checklist of things to do before we start each class. There are usually only 4 or 5 items, and we usually won’t remember to do all of them without the checklist.


Allow time on both sides

In the real world, many instructors and students arrive early to the room, and sometimes they hang around after the class has finished. But because of the ability to instantly teleport into a Zoom call, we have a tendency to start an 11am call at 11am, and to book a 12 o’clock call right after. From the instructor’s point of view, we recommend that you open the call 10-15 minutes early, to allow people to arrive at leisure, and to ensure you can start on time. Also, clear your schedule for another 30-45 minutes after the class, to you to allow questions and discussion with students. 

We also recommend that our students don’t book anything for 30-60 minutes after the class. This isn’t so that they can have discussions with us (although that’s a benefit). It’s because they’re tired after the class, and they need a break before jumping into whatever their next thing is.


An advantage of the real world is that while you are in class, the rest of your life is out-of-sight and out-of-mind. This is not true in the virtual world. The cognitive load we all feel from the rest of our household weighs on us, and we need small releases at regular intervals. For example, it is easier to tell a child “wait 10 minutes and I can take care of it” than “wait 2 hours”. We recommend a 5-10 minute break every hour, without fail.

When we are running breaks, we usually display a count-down timer in a web browser, so everyone knows when to return. Just Google “5 minute timer”.

Need for Activity

You are simply not as charismatic and engaging on video as you are in person. Remote calls need more activities, and shorter periods of you talking. This is good advice for skill-based training anyway, but is 10 times important when training remotely. We suggest breaking things down into small exercises, that you can start almost immediately. We try to use frequent changes in how the students are interacting, to introduce variety and hold engagement.

Not Seeking Volunteers

Asking for volunteers tends to unintentionally exclude a fair amount of your class, and you may find one or two voices tend to dominate. This is true in-person, but it’s significantly worse in virtual classes, where it is easier to hide, and harder to jump in.

We suggest using systematic methods of selection. For example:

  • Rotate in order: from a list
  • Randomly select: the key here is make the random selector visible. For example, assign everybody a number, and use an online random-number generator.
  • Mechanistic selection: break into groups of two, and the person with the shortest name will go first, and then you will rotate.
  • Call on people who have not yet contributed.

Requirements and Geographic Locations

It’s easy to think that now we are virtual, anyone from anywhere can attend a course. But this is not always true. Many software products and web sites are blocked or not available to certain geographical areas. Our best suggestion is to have a very clear list of requirements to attend the course, and let the attendees determine it for themselves.

For example, our current course lists this at the top:

Course Requirements

To attend this course, you will need to be able to use the following:

  1. Zoom, with a microphone and camera.
  2. AnyDesk
  3. Google Docs
  4. Basic understanding of C++ (creating strings, creating call functions, variable, loops, etc…)

Cloud-hosting and AWS

Having people work on virtual environments in the cloud is a huge help, for remote training. This is not as doable for in-person training, as reliable internet is not something that you can count on at a conference, but is something that you have to rely on, for people to attend a course virtually. To learn more about this, check out “How to setup a Windows AWS EC2 instance for remote mobbing and pairing

See for yourself

If you would like to experience how we are doing virtual training yourself, you can always sign up for our November 2020 classTesting Legacy C++ Code effectively with Approval Tests

Alternatively, if your company would like a private course, we offer them in Java, C#, C++, JavaScript and Python, on a variety of topics relating to Agile Software Development and Code Quality, such as Unit Testing, Refactoring and Legacy Code.

Contact us at: and 

Wednesday, July 29, 2020

Modified STUK storage to fit under a SÖDERHAMN Ikea couch

With the pandemic, I've been spending a lot more time in my house. One of the things I've been watching to entertain myself is the tiny house videos on youtube. While I don't think I would want to live in such a small space, it has gotten me thinking about the space I do live in, and how to make it better suited to me and less cluttered. And, of course, it's gotten me thinking about storage.

In my home office I have an ikea SÖDERHAMN couch.
And I couldn't help notice that there is a decent amount of space under it that I could use for storage. Especially of the things I don't use very often. But with a height of just 5.5 inches there isn't many options I could find.

At Ikea, the salesperson did say that the STUK storage would work. I should have doubled checked, but I was tired and just bought them.
Unfortunately, it's too tall. But having already gotten it, I decided to look into modifying it to fit. My first hint came from the assembly itself.
I realised I could cut these to shorten it. It turns out to be easy to do with i sharp knife. Cut the top down the grove. Then bend it backwards and slice the knife between to fully separate it.

Now the only thing left to do is the 2 panels that are sewn into the walls of the box. For this I just cut them out, but I found it work better to cut a bit away form the edge so there is a little flap to hold it in when you replace it. 

Then just reassemble and it slides nicely under the couch.


I think the edges could be nicer, also more permanent.  They sometimes slide out depend on how I'm holding it, but since it's mainly out of sight, this isn't something I'm worried about or planning on fixing.  Likewise, the cuts to the fabric could have been cleaner, or repaired. but since no one ever see this, I'm not bothered.

Wednesday, March 25, 2020

Recovering a lost code base

Twice in my career I have realized that the code that was in production at a client did not match the code that was in source control. Of course if you have any type of automated deploy process this will not be the case, but if you have a manual deploy it can be.

Yesterday, Simon Cropp told me of an amazing technique to recover from this. I am writing this in the hope that it will never be of any use to anyone, ever :-)

First, let's go thru my history of what I did.

The First Time: we found the code in the closet.

The first time this happen was over a decade ago. We were fortunate that the company was being sued and a court order forbid the destruction of data. The employee in question had been let go a month or two before but their computer was in lockdown storage. We were able to find the code and check it in to source code control. This is the ideal solution. We get everything we needed. The original source.
We were lucky. Very lucky. The code hadn't been modified, since they weren't there to modify it. There was only 1 place the code could be because that module was only worked on by them. We didn't have to guess between versions. And, we didn't delete the code.

The Second Time: we decompiled the code

The next time we weren't as lucky. This was a VB.NET project and the latest in source control didn't match what was in production. Was it very different? Who knows. The employee in question had also been let go and when we realized this we ended up just decompiling the code that was in production. This creates very bad Visual Basic code, so we took advantage of it to create reasonably bad C# and move languages. This was nice, but we lost a lot of intent that was in the original source code. It would have been better if we could have gotten it back. However, we cut our losses and moved on.

The Next Time: decompiled to detect and recover the source

Here is a better way. It's a mix between the first two.
  1. Decompile the production source
  2. Also, compile and decompile the possible sources you have found.
  3. Compare the decompiled sources with source control.
    1. Maybe there's a match? 
      1. Yay! Then you have got the original source or it's equivalent 
    2. Maybe you have partial matches?
      1. Create a new code base of patches from the matching places.
      2. Repeat
    3. Maybe you have a section with no matches
      1. You can try to reproduce the code manually
      2. or, you can copy and paste those sections into the new code base and small sections of decompiled code in large sections of original code.
      3. repeat