One thing I don't do is update my web pages regularly.
In my spare time I write software, read books, watch films, and take photographs. I also read too many web sites.
I currently work as a software engineer at Codethink,
After completing my university studies in June 1998, I began to make a serious search for work. Although I had made some efforts earlier, I had not got to the stage of having interviews. Two months of applications and interviews arranged through agencies led eventually to a post as Software Engineer at Laser-Scan, where I worked from September of that year until March 2000. This brought me to Cambridge, where I stayed for many years. At Laser-Scan I got some experience of the real world of software engineering, which as I expected was very different from both my personal programming experience and my academic work. I worked on a range of software more or less related to the company's core business of Geographical Information Systems (GIS), but touching on graphical user interfaces, databases, and vector graphics. The core code is all written in C but for higher level programming I mostly used C++. I was already familiar with C and I learned the basics of C++ by intensive reading in the first month.
I became somewhat bored by my work at Laser-Scan, and was often frustrated by the design of its core software environment. I wanted to work on rather more `sexy' software that would exercise my programming skills and give me some more freedom to design what I wrote. Therefore I applied for and gained a job at Roundpoint where I worked for 2 years until being made redundant at the end of July 2002 as the company ran desperately short of money. I worked on the design and implementation of many different programs relating to fetching, converting and viewing web pages and images and also ended up doing some system administration toward the end of that period. This software is mostly portable but I also worked on the underlying platform-specific layer for Windows, Windows CE, Solaris and Linux, including porting the Boehm garbage collector to Windows CE. I continued to use mostly C++; I also used small amounts of C and Perl; and I learned Python and used it to write a build system and some system administration tools.
After leaving Roundpoint, I got a well-paid contract with Symbian in London for the last 4 months of 2002 among the many temporary workers used to complete SymbianOS 7.0s (used in version 2 of Nokia's Series 60). This required me to make a long commute (about 2 hours each way every day) which was a pain but manageable by sleeping on the train. I worked for the System Libraries group that maintains the kernel and other low-level components of SymbianOS. I was initially set to work on the development of a completely new API, but this project was cancelled after a few weeks. Following that I was given the task of researching binary compatibility (BC) testing. Binary compatibility means the ability to combine two parts of a program that have been built separately, possibly based on somewhat different definitions. This is a very important concern for an OS developer that provides most functionality in the form of DLLs that are linked together with user programs at run-time. The OS developer needs to extend functionality over time while still supporting old user programs. That can be particularly challenging with C++ since it's easy to make unintentional incompatible changes to the layout of objects or function arguments (which, furthermore, are compiler-dependent). Symbian has rules for avoiding incompatible changes but they have not historically been enforced due to the lack of tools. There were a couple of tools already in existence to do some basic BC checks when I got there and there was a very general code analysis tool in development. Given the need to release SymbianOS 7.0s in the short term I thought it was necessary to develop a more sophisticated BC testing tool and I was authorised to do so. I spent the remainder of my time there writing this using Perl, which is not exactly my favourite language but is ubiquitous within Symbian. I learned object-oriented Perl in order to model the C++ type system and I used Parse::RecDescent to parse the "stabs" debugging information and mangled names produced by GNU C++. The latter choice was a mistake since Parse::RecDescent is amazingly slow; however I was able to speed it up by a factor of 2 by removing some features I didn't need. Frustratingly, I was not able to see this put into use or to deal with any maintenance issues due to the limited term of the contract.
In February 2003 I started working for the very generically named Business Web Software (later Firmstep and now part of Granicus), a company that produced web applications based on a proprietary application server. I carried on using C++ and implemented large parts of the next version of the application server (Firmstep 2) including database access code and date/time manipulation (harder than it looks). I also worked on the Boehm garbage collector again, adding support for incremental/generational garbage collection on Windows; and I ported Firmstep 2 to Linux.
Around 2004 I became aware of discussions around the need for C and C++ to properly support multithreading. Of course I had worked with multithreaded C++ code for years at this point, but multithreading facilities were mostly implemented as libraries and not integrated with the language. This turns out to be extremely unsound - a compiler that does not consider multithreading can introduce data races into code that seems to be properly synchronised. So I joined in the discussions, and ended up hosting them on the "cpp-threads" mailing list. Over the following years discussion gradually moved over to official channels of the ISO standards committees, and resulted in new "memory models" for the 2011 versions of C and C++. I'm pleased to have played my limited part in facilitiating that development.
From January 2006 until January 2014 I worked at Solarflare Communications (now part of Xilinx), which produces 10G/40G Ethernet controllers and boards, with both regular kernel drivers and a high-performance userland TCP/IP stack for Linux (OpenOnload)). I started out working on test automation: adding new test types, options and operating system support to the in-house 'Runbench' automation framework. I later moved into driver development and pre-silicon validation, working on Linux and FreeBSD drivers and helping to validate the SFC9000 and SFC9100 controller families. I became the lead developer of the Linux driver (sfc), maintaining Solarflare's own driver packages and the 'in-tree' version included with the Linux kernel.