I'm an independent contractor / consultant programmer living and working in Cambridge, UK. I like challenges.
I'm good at understanding and solving difficult problems. Having solved them I'm good at explaining the answers.
I've programmed commercially in many languages, from assembler on the bare metal to LISP on the JVM. I can see computer programs in terms of high level abstractions and in terms of nanosecond by nanosecond machine instructions shuffling bits. I can work at various levels of abstraction, and I can translate fluently between levels.
I'm talkative, literate, lucid and friendly. I'm a good communicator and I write programs that are intended to be read by others.
I have a degree in mathematics from King's College Cambridge.
I've been fascinated by computers since I was a child. In my spare time I program for fun.
When it first came out, I was really interested in the new language Clojure, and started putting programs I found instructive on a blog: http://www.learningclojure.com. Slightly to my amazement, this used to get about 25,000 readers every month, and made me a name in the community.
I've twice been one of the 'language gurus' for the dev8d academic developer's conference in London
I regularly give lectures on computer science to bright teenagers at Villiers Park (http://www.villierspark.org.uk).
I run my own limited company (J.L. Aspden Ltd) and can be engaged through it. Please get in touch if you have something difficult to do!
My favourite computer books are: The C Programming Language, Structure and Interpretation of Computer Programs, Structured Analysis and System Specification, The Practical Guide to Structured Systems Design, The Mythical Man-month, Peopleware, Information Theory, Inference and Learning Algorithms, Machine Learning: a Probabilistic Perspective Dive into Python, and the 1979 TRS80 Basic manual.
"John recoded some of our research algorithms for brain imaging almost a decade ago that are still in use today. Without doubt, outstanding value for money." -- Professor John Suckling, Brain Mapping Unit, University of Cambridge
"I've had the good fortune to work with some very gifted people over the years and he is certainly one, a fine mind." -- Tony Purnell, Head of Technical Research, British Cycling
"Very passionate and very knowledgeable" -- Anonymous student feedback from one of my courses at Villiers Park.
2020-2021 Samsung |
WiFi, 802.11, multithreaded embedded C, python, ccache, make, refactoring, comby, parser combinators, grep, sed, awk, bash, data plane, git, gerrit, jenkins, remote working Samsung needed extensive refactoring done on an enormous code base that took more than three hours to build and unit test. They were planning to do it by hand. I managed to get the build process down to ten minutes and automate the boring bits, writing tools and scripts to implement provably correct transformations on their code, and managed to pour thousands of changes into their codebase every week without breaking anything or violating their strict coding standards, all while working remotely during the pandemic. |
2019 Copperleaf |
Clojure, MATLAB/Octave, GNU Linear Programming Kit, GLPK, Non-Convex Optimization I took a large real world non-convex optimization problem, reduced it to a simple model and worked out how to solve the model problem and prove the solution optimal. [ This involved using the following techniques, which I list for the benefit of persons seeking CVs using search algorithms: operations research, management science, mathematical modelling, numerical analysis, numerical algorithms, decision science, machine learning, reinforcement learning, mathematical optimization, linear programming, simplex algorithm, MILP, mixed integer linear programming, convex optimization, non-convex optimization, logistics, planning, dynamic programming, policy evaluation, value iteration, tabular methods, and markov decision processes ] |
2018 Knowledge Leaps Disruption |
machine learning, R, gradient boosting, Python, xgboost Engaged to explain and then implement the gradient boosting algorithm, I taught them how it worked, wrote several demonstration programs, and instead showed them how to use a perfect existing open-source library which did everything they needed much better than I could ever have hoped to do. |
2017 Solarflare Communications |
multithreaded high-performance C for Linux networking, Python, Octave, gdb, nose, unittest, SolarCapture, wireshark I designed, implemented, tested and debugged a line-rate packet timestamp reconstruction module for a new Cisco switch, the mathematics of which turned out to have many weird subtleties, as part of the SolarCapture network traffic capturing application. I also wrote a custom packet dissector for wireshark. |
2016-2017 Solarflare Communications |
embedded C on MIPS, Python, Verilog, tcl, expect, bash, QEMU, PCI Express, verdi, Precision Timing Protocol, mercurial, vnc, reviewboard, bugzilla Investigated a new silicon implementation of the Precision Timing Protocol, which turned out to be broken and bug-ridden. I fixed it. At one point I found a subtle bug in all the computers in the world, and sent Synopsys a patch, which after much discussion was accepted verbatim, and should be somewhere in your computer today. |
2016 Solarflare Communications |
Embedded C on MIPS in network card, Python, Verilog, PCI Express, Vendor-Defined Messages, MCTP Initially engaged to investigate the possibility of using vendor-defined PCI messages to allow network cards to communicate with other PCIe devices in servers. Ended up proving beyond doubt that it couldn't be made to work, hunting down the various problems, and fixing in silicon the ones that were under our control. All is now well. |
2016 Kemuri |
Clojure, web, friend, selmer, generative testing, quickbooks online api, oauth I advised Kemuri on various aspects of their web server and database, and wrote some code for them to use as a basis for further work, including writing a library to communicate securely with their online accounting package, Quickbooks. |
2015 Knowledge Transmission |
Clojure, webserver, rapid prototyping Knowledge Transmission urgently needed a small gui to allow teachers worldwide to enter exercises, and their development team had quoted them six months. I made them a prototype in three days, and spent a couple of weeks hacking it around until they liked it. They seemed happy. |
2014-2015 Engineering Department, University of Cambridge / English Institute of Sport |
MATLAB, Octave, Python, Physical/Mathematical Modelling I helped the Engineering Department to 'turn the Manchester Velodrome into a Wind Tunnel', creating a physics model and an associated program to interpret live telemetry from races and training sessions. British Cycling's startlingly good and somewhat unexpected performance at the Rio Olympics was directly enabled by this work. |
2013-2014 University of Cambridge (Guest Lecturer) |
maxima, MATLAB, Octave, teaching, public speaking I taught the course "Mathematics for Natural Sciences" as a long series of seminars for the department of Computer Science and the department of Psychology. My group of students did extremely well, and I got personal thank-you letters from around half of them. |
2011-2012 Solarflare Communications |
embedded C, encryption, IPSEC, verilog, system verilog, verdi I wrote software to control the Authentec EIP-190 encryption core in Solarflare's latest very-high-speed networking silicon. I also ended up diving into the chip design itself to correct problems with the way that the core had been wired into the chip, invented a new way of getting the chip simulation to sanity check its internals in minutes rather than weeks, and redesigned the scheduling algorithm in a way that speeded up the simulations without impacting on the real performance. |
2010 Cambridge Temperature Concepts |
Clojure, R, data mining, graphical report generation I wrote a script to generate odf documents, with graphs, from statistical input. I also allowed the two halves of the company to continue using their favourite tools by making a data mining tool to find inconsistencies between a CRM database and an ad-hoc hand-maintained Excel spreadsheet. |
2010 Chemistry Department, University of Cambridge |
Clojure, Java, Maven, DVCS, Mercurial, Git I acted as consultant for a team using Clojure as a language to glue together their vast amount of legacy Java code. I advised on setting up and using the language, and on functional programming and modern DVCS, and particularly on the design of the Lensfield project, and I wrote a library for finding files and transforming filenames according to simple user-specifiable patterns. I prepared and gave some talks on the language for the dev8d academic developer's conference in London. |
2007-2008 Xensource |
Python, OCaml, R, Java, PLT scheme, lisp, C#, bash, expect, make, Xen API,metaprogramming, code generation, mercurial, XMLRPC, UNIX (daemons, .rpm and .deb packaging, networking, nagios, mail), text UIs (curses, newt & snack), apt, yum I made Java bindings to the Xen API, automatically generating them from the XenServer OCaml code. I wrote examples of how to use the bindings, which I re-used as automatic regression tests. Once I'd done this I wrote corresponding examples for Python, and made them into a tutorial introduction to the Xen API. I wrote various little Python scripts to do useful things for a VM farm, including a pool monitoring plugin for nagios, and daemons to monitor hosts, and if necessary to restart them as gently as possible. I packaged these daemons for Debian and Red Hat Linux together with a curses based configuration UI. |
2007 Brain Mapping Unit, University of Cambridge |
R, littler, small world network analysis, wavelets, HTML generation I wrote a system of interoperating programs to take brain scanner data, perform small-world analysis and wavelet transforms, and produce web sites detailing the processed data with pretty pictures. As part of this I wrote an option parsing library for R. |
2006 Brain Mapping Unit, University of Cambridge |
Python, C, SWIG, Signal Processing (wavelets, Hurst exponent), MATLAB, Octave I wrote software to calculate various statistics on the output of a brain scanner. The prototyping and tests were in python for speed of development, and then I translated the core of the main program into a C library, using SWIG to keep the original unit test framework and aid the correctness of the translation. |
2005 Sepura ( 3 separate contracts ) |
Embedded C, Python, Visual C++, make, Subversion, CVS, Frontpage, Windows Comms, Unicode, CJK fonts, LGPL I solved some mysterious bugs in a project to split DSP code across several code pages, and then automated the build process and dependency generation. I debugged, modified and version controlled a browser-based error tracking/change control system. I converted an ancient program to use Windows Comms and work with Chinese, Korean and Japanese scripts. |
2004 Alphamosaic |
Embedded C, Assembler, SIMD/Vector Processor, VideoCore, WMV9, Video Codecs I ported the Microsoft WMV9 Codec to run on 'VideoCore', an embedded parallel graphics chip that eventually found its way into the video iPod. |
2003 Sepura |
Embedded C, Assembler, AVR, Mega128, Codevision, High Speed Serial Comms, Device Drivers, Delphi I wrote the software for an AVR chip embedded in a dashboard mounted police radio console, as well as a PC test harness in Delphi. Part of this involved writing a 900kb serial link protocol to work over a 10 metre cable in conditions of heavy interference (lots of fun with oscilloscopes!). This software is currently in most British police cars, as well as in many other countries, and no bugs have ever been found. |
2001 Simoco Digital Systems ( 2 separate contracts ) |
ClearCase, HTML, UI Design, Toolbook Instructor I was engaged to implement a new user interface for a portable radio used by the emergency services. Intuiting from the design documents that the new interface might be worse than the old, I wrote a PC simulation first, so that marketing could work out whether they really wanted it. The project was cancelled, saving the company approximately £20,000,000, partly at my own expense. In an unconnected second contract I evaluated the ClearCase version control system, recommended against it, was overruled, wrote recommendations for its use, wrote an html tutorial and gave some training. |
2000 European Telecom/ET Voice | Java, Swing, MATLAB, Mathematica, Speech Recognition Research, TESPAR I ran a small research project into embedded speech recognition using TESPAR, a newly discovered signal processing technique. |
1999 Advantra | Delphi, UI Design I designed and wrote a GUI application to test and configure pagers in shops. |
1999 CLMP Software Research | Java, Solaris I wrote a library of graphical java objects to display financial time series data in a project for Salomon Brothers. |
1998 Green Cathedral | C++, HTML, Linux I wrote a program to translate very large web server log files into readable html statistics and graphs. |
1997-98 Philips Paging | Keil C and Assembler for 8051, Structured Analysis & Design, Protocols, Tight Time and Space Constraints I helped design the software architecture for a pager. I implemented the store manager component (A tiny filesystem which was considered for patent.), and then shrank it from 6k to 2k of compiled code. In my own time I wrote a memory map and stack analyzer for the Keil C compiler which saved the project. [It shortened the software development time by several months by directing our optimization efforts, and allowed us to use the CPU we'd originally planned to use, avoiding prohibitively expensive redesign and re-tooling. When I'd originally suggested it, it had been vetoed as impossibly speculative and difficult, so I wrote it as a hobby project and then sold it to the company for the time-only cost.] I'm told they made millions of copies of my store manager code, and never found a single bug. |
1996-97 Philips Telecom | Borland C, Serial and Wireless Comms, ClearCase I maintained and extended a vast, undocumented C program. I introduced automated regression testing and version control. |
1989-96 King's College Cambridge | dBase IV I designed and implemented databases for the college hardship fund, teaching activity (including my own) and admissions as three separate fixed price contracts over six years, while I was still a student.They were in constant use for something like fifteen years, until the University centralized its accounts. |
2013-2018 Coursera / EdX | Probabilistic Graphical Models, Algorithm Design I & II, Model Thinking, Machine Learning, Automata, Greek and Roman Mythology, Game Theory, Music Theory, Quantum Computation All courses offered by Stanford, except for Model Thinking from the University of Michigan, Music Theory from Michigan State University, Greek and Roman Mythology from the University of Pennsylvania, and Quantum Computation from Berkeley. |
1992-96 Imperial College London | Finite Element Analysis, Financial Analysis, C, Fortran I investigated computer solution of non-linear diffusion problems in Fluid Mechanics and Financial Analysis, using Functional Analysis and the Finite Element method. I taught mathematics and Fortran in London and microeconomics in Cambridge. |
1988-91 King's College Cambridge | Degree in Pure and Applied Mathematics (2:1) |
1981-86 Abbeydale Grange School | 8 O Levels, 5 A Levels (AAAAB), 3 S Levels Maths(1) Physics (1) Further Maths(1). The usual stuff with TRS80s, ZX81s, Spectrums, BBCs and Amstrad 1640s. |