Little Go 2.0.0 released

Little Go 2.0.0 has been published on 10 May 2024 on the App Store, 18 months after the previous release 1.7.1. The release notes are available in the App Store update notes or on the GitHub release page.

The main user-facing changes in version 2.0.0 are two things:

  1. The app now supports game variations.
  2. An overhaul of the in-game user manual, plus the publication of an online version of the manual.

While these changes do not sound like much, they are effectively a huge step forward for the project, and accordingly I decided to increase the major version to indicate this milestone.

The remainder of this post are some of my memories of how v2 came to be and why I think a major version update was in order, so it’s perfectly safe to stop reading now 🙂.

Game variation support

After I had added support for more SGF properties in the previous release of the app, it was finally time to tackle game variations.

This was a major endeavour, first of all because it meant I had to make some fundamental changes to the data model on which the app operates. The vision with which I had started the project in 2011 was to let the user simply play a game of Go - nothing less but also nothing more. Consequently the app’s data model was designed to capture a linear sequence of moves - nothing less but also nothing more.

With the introduction of game variations, the linear sequence data model now needed to be changed into a tree node data model. This was achieved relatively fast, to a certain extent thanks to cloning-and-owning of code I had previously written for SgfcKit and libsgfc++. The more time-consuming and tricky work, though, was to adapt various parts of the code base that made assumptions based on the linear sequence data model.

The second, even bigger part of the job was to visualize the tree of game variations in the user interface. A new tree view with custom drawing had to be developed, integrated into a user interface that on iPhones is already short on screen estate, and fitted with ways how the user can interact with the view (resizing, scrolling, zooming, tapping). Fortunately the concept of layered drawing of a view that is split into tiles could be largely reused from the existing board view, but a lot of time still went into the nitty gritty details of writing nicely scaling Core Graphics drawing code.

Wholly unforeseen were the consequences of my desire to replicate a nifty feature I had seen in the SmartGo One app: When many consecutive moves are made it can make sense to render the nodes in between the start and end of the sequence smaller than other nodes, because they represent mostly uninteresting, repetitive content of a game. In Little Go the setting is named Condense moves. This setting caused the already complex algorithm, which transforms the node tree data model into a view model that the drawing code can consume, to explode into a difficult to manage mess. I estimate that this algorithm alone took weeks of (spare time, not full time) effort to get right, and at almost 3000 lines of code it’s not something that I’m very proud of. Eventually this will have to be refactored into smaller chunks.

Hiatus

At the end of April 2023, after 7 months of steady work, I had finished maybe 90% of the game variation feature. Unfortunately I then decided that I needed a break before I could forge on to complete the release. Similarly to how it went in the previous version 1.7.0, it took me 8 months before I was again able to gather enough energy to continue.

Update project build / Silicon Mac support

After resuming work, I decided that before I could finalize the game variations feature I had to upgrade the project from Xcode 13 to Xcode 15. As is usual for such upgrades, things did not go smoothly. Eventually the issues I had forced me to change the build of the third-party dependencies Boost/Fuego and libsgfc++/SgfcKit so that they are now consumed as XCFramework instead of as regular framework.

Two good things came from this rather unpleasant work:

  1. The project should now be ready for the switch to Silicon Mac.
  2. A side-issue with libsgfc++ forced me to drop support for quite a range of old iOS versions. As a consequence many chunks of backward compatibility code could be removed from the code.

After this renewal work, the project was more or less ready for release. But then I remembered a promise I had made in December 2022…

The user manual

From the start of the project I was always convinced that thoroughly documenting the features of the app is an important activity of the project. Not only does that documentation help the end user (when made available to them in the form of a user manual), it also serves me - the developer - as a reminder how features are supposed to work, or even that certain features exist at all.

I happen to like writing documentation (hence also the - some might say excessive - source code documentation), therefore writing a user manual was not that much of an effort. However, the more I wrote the more I began suspecting that a text-only user manual would not be appreciated by many users. It was not just the lack of illustrations, but also the missing capability to navigate directly from one section of the user manual to another that was an issue. Over time my suspicions that the user manual was not universally helpful were confirmed, when I received feedback from users who, for instance, were not able to find the “Pass” button, or who did not understand how they could place a stone, or start a new game, or change the board size…

In the first years I placated my bad conscience by saying that these users lack imagination - why could they not just try out a few things, surely the app could not be that complicated? Those users who contacted me by email I was usually able to help by providing screenshots and detailed explanations, but when responding to negative App Store reviews I was severely limited and so my responses were probably not a big help.

Eventually, in December 2022 the day came when I received a message from Andreas Fischlin. In a friendly tone he clearly pointed out where the current user manual was lacking. When I responded with a semi-lame excuse he did not give up, but insisted with even more clarity that a change was in order. This insistence finally gave me the push that I needed to take on the long overdue task of overhauling the user manual, and for that push I want to give a BIG THANKS to Andreas!

The simple “overhaul”, by the way, turned of course into a complete rewrite from scratch 🙂.

Next up

For the next feature release I intend to add time-based play, which is the last major gap that Little Go has to most other Go applications. In addition there will for sure be some quality-of-life improvements related to creating and editing nodes and game variations.

For the rest, let’s see…