Ian Hopkinson

Author's posts

Book review: The Rust Programming Language by Steve Klabnik and Carol Nichols

My next review is a small departure, it is for The Rust Programming Language by Steve Klabnik and Carol Nichols but rather than buy the physical book I read this interactive version, which has quizzes and embedded, runnable code.

The Rust programming language is the target for my next Rosetta Stone blog post which identifies all the tooling for a language. For Rust these tools (the compiler, formatter, linter, package management and automated documentation) are pretty much all “built-in” so my job will be easy. The challenge in this case has been learning the language since I try to write a little code for the Rosetta Stone posts to demonstrate what I’ve learned.

Rust is a relatively new language, very highly regarded amongst developers and one of only two approved for developing Linux. Its focus is on “safety” and speed. It has been used to make new, highly performant tools for the Python ecosystem, like ruff and uv, which is how I came to know of it.

For a Python programmer Rust does not look alien in the way that Haskell and Lisp do; admittedly it uses curly braces for scoping, is strongly-typed and supports pointers and references which are not features of Python but are common in other languages.

To me it feels like C but with some object-oriented features; the authors talk explicitly about it having features of functional languages including use of the Option value which contains something or nothing, the compiler enforces the handling of nothing. I think I might start using this more explicitly in Python which allows type-hinting to indicate an Option-like value. The other explicitly referenced functional feature is the use of closures, in Python closures are functions defined within functions or anonymous / lambda functions whilst in Rust they seem to be closer to functions passed as arguments to other functions.

Rust makes what seems an odd distinction between functions and macros in its standard library. Macros are identified with an exclamation mark, for example println! As I understand this is because a macro is implemented using code generation at runtime which allows the developer to supply, for example, a variable number of arguments to println! which would not be possible for a function println. Python doesn’t make this distinction and is very permissive in the arguments that a function can take, allowing both position and keyword arguments of variable number.

I was struck by the way that different languages use the same word for different things. For example in Rust a struct is both a data container but can also carry methods in the way that “classes” in other languages do. In Python an enum is a closed list of values but in Rust those values can have user-defined associated values so that an enum for IP address protocols can contain V4 and V6 (as it would in Python) but in addition it can hold an actual IP address associated with each entry in the enumeration.

My understanding is that Rust is considered an object-oriented language by some but not all. In practical terms the only object-oriented feature missing is inheritance although this can be approximated by the use of generics and traits.

Since I have scarcely used pointers and references in 40 years of programming I found these concepts a bit challenging but I have made progress in my understanding through reading this book. Excited by this new found understanding I was then confused by Rust’s ownership model! Ownership and borrowing are the big, unique conceptual features of Rust. The aim of ownership is to rigorously ensure that code is safe – no writing past the end of arrays, or dereferencing null points. It also means that the performance hit of a garbage collector is not required, this task is pretty much entirely handled at compile time by the borrow checker. The strong ownership model makes concurrent programming easier too.

In trying to understand ownership and borrowing I found some useful tools, the best entry point was the BORIS tool by Christian Schott which lists other visualization tools including the Aquascope tool used in this book. I found the first such tool in RustViz which is used in teaching, it needs the user to put annotations into the code rather than working out the annotations itself. I also read this article by Chris Morgan.

As language books go, this one is pretty readable, and I found the built-in quizzes handy, if only to illustrate my ignorance particularly of the ownership and borrowing model. I think for my next technical book I might read Category Theory for Programmers by Bartosz Milewski. I have felt when applying type-hints to Python, and learning Rust and Haskell that I was missing out by not understanding at least the basics of category theory.

I enjoyed this book and the format worked pretty well for me, although I need to find a way of reading online content like this in more comfort. I’m keen to give Rust a go now!

Book review: Roman Britain – A New History by Guy de la Bédoyère

Following on from my previous review of Echolands by Duncan MacKay on Boudica’s revolt against the Roman occupiers of Britain, this review is of Roman Britain: A New History by Guy de la Bédoyère. Roman Britain has a much wider scope than Echolands covering the whole period of Roman influence in Britain from Caesar’s abortive invasions in 55 and 54BC through to the period after the Roman’s left Britain in 410AD. This is a larger format book with illustrations and photographs on virtually every page.

The book starts with three chapters on the timeline of Roman Britain covering the pre-invasion period, the extended conquest and the later period. Eight chapters follow on different themes: governing Britain, military installations, towns in Roman Britain, industry, commerce and production, the countryside and villas, people and places of roman Britain, religion in Roman Britain and the aftermath.

Britain was know to the Greeks as far back as the 4th century BC, and there was trade in tin from Britain from that time. By the middle of the 2nd century BC ornate burials were being found in Britain containing imported goods, and coinage was starting to be found. Hengistbury Head, where my father lived in his retirement, was an important trade port in this period. This tells us that Britain was not unknown to the outside world when Caesar made his invasion attempts in 55BC and 54BC. These were unsuccessful in the immediate sense but over the intervening years to the invasion proper in 43AD there was a gradual Romanisation of the upper echelons of British society, and increased trade.

Both Caesar’s abortive invasion, and Claudius’s successful invasion in 43AD were driven by politics in Rome, military success were a credit to an Emperor. British politics may well have played a part: Cunobelinus, king of a large chunk of Britain, died in 43AD and the resulting uncertainty over succession was a good opportunity to invade. Claudius’s invasion succeeded because the Roman army were a very efficient, well-equipped military force and their opposition was divided with some on the British side likely supporting the Romans.

The Romans spread to a line linking Lincoln and Exeter by 47AD, and by the end of the 1st century they had reached the limits of Wales and the far North of Scotland. Over the next 50 years there was some consolidation but by 150AD the Roman’s had reached the geographic limit of their occupation of Britain. It seems that the South-East of Britain became fairly well Romanised with villas and towns in the Roman style. North and West of the 47AD frontier life seemed to continue more in the manner of the Iron Age but for the addition of Roman garrisons and forts with related trade and industries.

Most of what we know of Roman life in Britain is based on the inscriptions left by the military, on tombstones and dedications of building works. There are limited number of wooden writing tablets, discovered at Vindolanda by Hadrian’s Wall and in London, which provide a fascinating insight into daily life, trade and interpersonal relationships. The early period of the occupation is discussed in Tacitus’s writings, as well as some other fragments.

We get a very small sample of daily life from from archaeology, only about 0.01% of all deaths are represented in burials and, assuming villas had 40 occupants each, homes for only about 0.01% are known.

Much of the rest of our understanding seems to come from recognising that Britain was being run like any other Roman province and extrapolating across archaeological and historical writings from all over the empire. Roman’s had firm ideas about which people could hold which positions (qualified by property), and Roman towns had a specific set of amenities according to their official type. Britain was seen as a troublesome province and had quite senior governors who typically only had a short tenure – some went on to become Emperor.

The Roman’s seemed to have respected the British as traders, seeing them as taking on Roman ways in this regard. Agriculture was important, and there is a lot of evidence of lead production – unlike iron, lead tends to survive quite well. Coinage was only minted in Britain from the late third century – it would not be used so heavily until the 17th.

There is limited evidence for the health and ethnicity of the Roman Britons, they seem to have increased dental issues. There was certainly the idea of branded medications, particularly for eye conditions. It isn’t clear whether there was a patent system. It is certain that Roman soldiers came from around the Empire but identifying them is hard since typically they Romanised their names.

Most of the writing we find the Roman period relates to religion (shrines, tombstones, altars). For a large part of the Roman period people worshipped hybrid Gods – amalgams of Roman Gods with local pagan deities or even from elsewhere in the Roman empire. Later the Christian church became established – we have written evidence of a church hierarchy from 314AD.

From the beginning of the third century AD the Roman empire was beginning to split up. Rome finally withdrew support for the military occupation of Britain in 410AD. This had an immediate economic impact because there was no longer new coinage coming into the country, or military salaries to spend. Physically Roman buildings decayed over a period of 150 years or so with the now non-Roman occupants no longer having the will or skill to repair them. We can mark the complete end of practical Roman influence with the invasion of the Anglo-Saxons in 577AD although we see the marks of the Roman occupation even now in our landscape and language.

Roman Britain finishes with a chronology and a guide to visiting Roman sites in Britain, I feel in this section insufficient attention is paid to my home town of Chester!

This is a beautiful book, and rather readable.

Book review: Echolands by Duncan MacKay

One book leads to another, after reading about prehistoric Britain I was interested in what came next – the Romans. Someone on social media suggested Echolands by Duncan MacKay subtitled A Journey in Search of Boudica. This is an apt description, the book is part travelogue, part history book. MacKay describes his journey following the path of Boudica to Colchester, London, Verulamium and to a final Great Battle with Paulinus, the Roman governor of Britain at the time. He travels variously by car, foot and bicycle. Initially I was sceptical of this style but it is rather compelling – the journey acts as a kind of mnemonic map for the historical facts conveyed.

Britain’s written history starts with Caesar’s expeditions in 54BC and 55BC. It was written not by the British but the Romans. Caesar did not conqueror any territory in Britain but extracted tribute from one king, and set up another as a client. This seems to have started a slow Romanisation of Britain with the local elites seeing the luxuries available in the Empire, and their sons going to Rome for a civilised upbringing (it isn’t quite clear if this export was voluntary). Britain already made some use of coinage which I find intriguing in a supposedly pre-literate society. There is scant archaeology from this period but a number of hordes of valuable items have been recovered.

The action then moves onto the Roman invasion in 43AD, over a 40 year period something like 250,000 Britons would lose their lives to the Romans, and it is likely 250,000 more were taken into slavery – this is from a population of around 2 million. The initial invasion force was around 40,000. The conquest was a slow process with some outright military victories and alliances or arrangements with the existing kingdoms as well as a lengthy and brutal campaign in Wales. The subjugation of Wales was to take until 51AD, veterans of this campaign retired to Camulodunum (Colchester) where they formed a colony. Relevant from this period is King Prasutagus of the Iceni tribe, whose wife was Boudica.

On his death Prasutagus in 59AD attempted to make his wife, Boudica, heir to his kingdom alongside Rome. Rome did not take kindly to this, Boudica was whipped and her two daughters raped. Subsequent events are recorded by Tacitus in The Annals (English version here, original latin here). There are also some references in Cassius Dio’s Roman History (English version here). These are relatively brief accounts and much of the understanding of events turns on a couple of sentences. Apparently Romans referred to us as Britunculi – “little Britons”!

In 60AD Boudica and her allies attacked the Camulodunum colony, killing effectively all of its inhabitants and burning it to the ground. The destruction can be seen in the archaeological record, and in fact burning has preserved more of the wattle and daub and other wooden structures than would normally be found. The final redoubt of the Roman colonists was the extravagant Temple of Claudius which was besieged for two days according to Tacitus.

On hearing news of the massacre the 9th Legion from set out towards Camulodunum via Cambridge. MacKay thinks they started from Longthorpe (outside Peterborough) whilst others suggested they started from their main garrison in Lincoln. This is where MacKay first takes to the road in earnest, travelling along the A14 to Cambridge, at the time this was the Via Devana (The Chester Road). MacKay is keen on his caligae (Roman hobnailed sandals) with which he walks some of the route. We lived in Cambridge for nearly 10 years and I know the A14 well, now we live in Chester. So this leg of the journey strikes a cord. The 9th legion were massacred somewhere outside Camulodunum, MacKay suggests the Colne Valley as a likely location for the ambush. This seems to be largely on the basis of where he supposed they were coming from and the local geography. There is no archaeological evidence for the battle.

In the meantime the Roman governor of Britain at the time, Gaius Suetonius Paulinus, is invading Anglesey where the last Welsh resistance is holding out. Tacitus notes of the women in the opposing forces ranks:

In the style of Furies, in robes of deathly black and with dishevelled hair, they brandished their torches; while a circle of Druids, lifting their hands to heaven and showering imprecations, struck the troops with such an awe at the extraordinary spectacle that, as though their limbs were paralysed, they exposed their bodies to wounds without an attempt at movement. 

Despite this they are beaten easily by Paulinus’s legionnaires. MacKay travels to the vicinity of RAF Valley on Anglesey to start his retrace of Paulinus’s rapid trip south to face Boudica. We spent our summer holiday in Rhosneigr – a couple of miles away! The site is interesting because a number of artefacts were discovered in the lake there. One of them, a slave chain, was actually used by workers in the 1940s conducting a peat excavation operation and survived the experience remarkably well!

It is thought that Paulinus prepared his invasion boats (likely flat bottomed barges), in Chester and on his trip back to London – on news of Boudica’s rebellion – at least part of his force probably sailed back to Chester. Paulinus then takes his force south to London likely heading down towards Wroxeter (near Shrewsbury) along the now vanished start of the Watling Street Roman road before following it onwards to London along the still existing line of Watling Street. MacKay follows this route by car stopping on the outskirts of London to travel by rail and foot to the area of Monument, the centre of Roman London.

In 60AD London was a thriving trading centre but does not appear to have been an important town to the Romans from an administrative point of view, furthermore it did not have significant defences at the time so on his arrival Paulinus decided to abandon London to Boudica’s forces who were heading down from Colchester. He departed with those able and willing to follow, some may have taken refuge from Boudica on boats in the Thames. In any case London was comprehensively burnt by Boudica’s forces. Paulinus then headed up toward Veralumium (near modern day St Albans) which Boudica also destroyed.

That was the limit of Boudica’s rebellion, MacKay spends some time visiting potential locations for the final Great Battle of which Tacitus just says “…a position approached by a narrow defile and secured in the rear by a wood…“. This location has been the subject of much discussion with locations up into Warwickshire finding favour. MacKay appears to have decided on Windridge Farm close to Veralumium on the basis of the geography of the area, the proximity to a know location for Boudica and the discovery of clusters of Roman slingshot . Wherever it was Tacitus claims 80,000 of Boudica’s forces were killed in a single engagement, for comparison the first day of the Battle of the Somme saw 20,0000 British troops died. This ended Boudica’s rebellion and Tacitus says she died by her own hand afterwards.

The Roman’s lost a similar number of soldiers and civilians during the rebellion. What surprised me is despite these huge battles in the Colne Valley, on Anglesey and close to St Albans there is minimal archaeological evidence from these sites. Part of the problem is no doubt the uncertainty of their location, but also 80,000 dead on the ground surface would likely disappear over a period of a few years. Armour and weapons were valuable and would have been cleared from the battle field. MacKay references reports from other Roman battles, the Indian Rebellion and a battle between the British and Zulus, as to how such locations appeared after a few months or years.

The Romans were brutal occupiers, as evidenced by their own historians, and the carved columns they raised in honour of victorious generals. Boudica’s forces were brutal too. It would have taken the Romans a number of years to recover from the rebellion, furthermore the local population struggled through famine in the aftermath of the rebellion (Tacitus puts the blame for this squarely on the British).

I enjoyed this book, I thought the combination of travelogue and history worked really well and by chance I was familiar with a number of the locations MacKay visits.

Book review: Beautiful Code edited by Andy Oram & Greg Wilson

This review is of Beautiful Code edited by Andy Oram and Greg Wilson, a collection of 33 essays by 41 authors about computer code that the authors consider beautiful. A number of the authors are very well known, including Brian Kernighan, Charles Petzold, Douglas Crockford and Yukihiro Matsumoto.

The chapters vary considerably in length but average a little under 20 pages which works well for me – I find 20 pages is a reasonable chunk to read in one go. Although the chapters are presented without any organization, they are actually grouped into themes.

A few chapters are on algorithms, which is what I think of when people talk about beautiful code. A few chapters are on applications, and their architecture, a couple are on assistive technologies, a couple are on libraries/frameworks. A few are on operating system code: device driver architecture and handling threads. It is fair to say that beauty is in the eye of the beholder, and generally I felt authors wrote about their favourite piece of work rather than something that might be broadly considered beautiful code.

Several chapters I was more interested in the subject area than the actual code. There are a couple of chapters on bioinformatics (I was a lecturer in Biological Physics for a couple of years), a couple on Python (my primary programming language for the last 10 years or so) . The Python chapters are on the implementation of the dictionary in the core language and multidimensional iterators in Numpy (a widely used numerical library). The NASA chapter was a bit of a let-down since it involved strictly ground based code. However, I was excited to learn about the challenges of two Martian time zones as well as earth based time zones!

Pretty much all of the chapters contain moderate amounts of code. The implementing language varies, there are a number written using examples in Lisp. Ruby and Perl have a couple of outings, as does Haskell, also present are Java, C#, Python and C. Reading through the author biographies it seems some of them were involved in the creation or ongoing development of some of these languages.

I gave up on one chapter in part because it was in Lisp (not a language I’ve ever used) with no support except a suggestion to go read the first few chapters of the author’s book on Scheme (a dialect of Lisp) but also because it was about macro expansion which I’ve always considered a nasty kludge. Brian Hayes’ chapter also used Lisp but provides a little schematic diagram showing the structure of a Lisp function which was really helpful. Lisp programmers really like their brackets!

It was interesting to learn about Lisp’s advice functionality which is like Python decorators. Haskell is neat in its very clean separation between pure functions and functions with side effects. I can’t help thinking that both languages are best suited to highly mathematical developers working alone, their notation is exceedingly concise and impenetrable to outsiders. However, ideas from these more esoteric languages are usefully incorporated to more mainstream ones and programming styles.

Binary search and sorting are a feature of several of the early chapters. One author points out it took 12 years after its invention for a correct implementation of binary search to be written, and only 10% of developers get it right first time when implementing it themselves. The core error is an issue with numeric overflow which highlights that the difficulty of coding comes not just from algorithmic design but also lower level implementation details. The later chapter on the numerical analysis libraries from CERN (BLAS, LINPACK, LAPACK) highlight this again, optimum algorithms changed as the underlying machine CPU, memory and network architectures changed. The book finishes with a chapter on algorithms for checking the collinearity of three points on a plane, I liked this one. The twist at the end is that the best algorithm is to measure the area of the triangle the three points form, if it is zero then the points are colinear. This algorithm has the benefit if numerical stability, again a imposition of underlying numerical representation.

I liked the chapter on a logging framework, it made frequent references to design patterns and seemed like a nice example of beauty in higher level design.

In my view Charles Petzold’s chapter describes eldritch code, rather than beautiful! He shows how to generate C# intermediate language (IL) at runtime in order to speed up image processing operations. This involves line by line generation of raw IL using C#’s reflection functions. I’m not saying it is not very cunning or interesting but it isn’t pretty. It is also a personal interest of mine since I spent a number of years working on image analysis.

Some of the applications discussed have stood the test of time, ERP5 is still around as is Emacspeak (accessibility software for the blind). I can find no trace of Cryptonite (an email client) or Elocutor (accessibility software originally designed for Professor Stephen Hawking). Components of the Subversion and Perforce source control applications are included. Obsolesce seems to be a combination of the language used, the change in the web and competition. Beautiful Code was written in 2007, nearly 20 years ago and the web was a very different place then.

A couple of chapters talked about how code appeared on the page – I particularly liked the idea of “bookish” code, code laid out in the manner of a book or magazine to aid readability – interestingly this chapter was in favour of shorter variable names for readability rather than longer ones for description. A recurring theme is that the code is never beautiful in the first instance, it normally reaches beauty by a process of iteration and refinement.

The book was first published in 2007, and its age shows in some places. It finishes with biographies of the authors which could have more usefully been put with their respective chapters. I was sad to see that only one author appears to be a woman, I suspect this would be the case if the book was written now.

I enjoyed this book, most of the chapters struck some sort of cord with me.

Book review: Daphne Draws Data by Cole Nussbaumer Knaflic

I recently reviewed Cole Nussbaumer Knaflic’s Storytelling with data, as a result the storytelling team sent me a (pre-publication) copy of their latest book, Daphne Draws Data scheduled for publication 29th October 2024 (UK) and 4th September 2024 (US). This is something of a change for me in the sense that the book is targeted at teaching data visualisation to the 6-9 year old age group. I am 54 – however, I have a 12 year old son and an interest in education. I have never reviewed a book intended for children before.

The first thing to say about this book is that it is beautifully illustrated by John Skewes. As I write this review Daphne (a dragon) is looking out at me from the cover of the book which has put a smile on my face.

The book follows Daphne as she visits various locations, and helps the creatures she finds there by collecting data and drawing graphs (having first reassured them that she was not going to incinerate them!). This is very much like my own career. I particularly liked the visit to the ocean where she draws a graph showing that shrimp and crabs move at the same speed if you allow for the size of the creature. This is quite sophisticated scaling analysis that I’ve taught to undergraduate physics students.

The book finishes with a glossary of chart types which is reminiscent of the material in Knaflic’s books for adults. I was slightly disturbed to see the caption “Eat a rainbow” close to an illustration of some coloured crayons but it is an exhortation for children to record the colour of the food they eat during a day and make a bar chart, rather than eating the crayons!

A children’s book fits very well with the central theme of Knaflic’s work on data visualisation which is the importance of storytelling. To be honest working out who is eating the monkey’s bananas is more engaging than the usual stories we tell in our business presentations.

I guess a key feature of books for children in this age group is that they are read with an adult, I imagine a lot of adults would learn from it too.

Alongside the book there is a website daphnedrawsdata.com which includes resources for educators, amongst much else. This shows how the book fits in with the Common Core requirements in the US school system, I’m sure this will align pretty well with the UK standards.

I’d have definitely bought this book during the COVID lockdowns as material for home-schooling, not only does it cover some data visualisation techniques but it also encourages the data collection that has been central to my life as a scientist. I’d probably also borrow the illustrations for any presentations (to adults) I might give on data visualisation.