Alongside Nigel, Clive Tong is the resident technical mastermind of .NET Reflector – the Go-To Guy, if you will. Widely respected for both his depth and breadth of technical knowledge, (not to mention his patience), Clive is also the only other member of the team (besides Ruchika) to eschew the use of Nerf guns. In our eyes, this basically makes him into some kind of kung-fu monk (a status he actually has some qualifications towards). He also regularly blogs about developments in .NET, technical book reviews, and the latest interesting thing he’s learned.
When it comes to computer science and software development, Clive’s been around the block, and so he’s got a lot of interesting tales to tell.
If you’d like to get to know the rest of us, come and meet the team:
What’s your background?
When I was a schoolboy there weren’t any computers on the school premises. The senior students were allowed to submit programs on green sheets which were sent away, transcribed and then executed on a mainframe at a college 30 miles away; after two days you got back a paper tape and a printout of the results. I got hold of a book on FORTRAN and managed to persuade some of the seniors to submit the programs for me. This modern generation have it easy.
When I was in the third year, I convinced my parents to buy a TRS-80, though had to get a holiday job to contribute towards it. Using this, my school kindly let me take computing exams on the understanding that I taught myself, which I did. I also wrote to ICL and they sent me a book on 2900 assembler, so I also got to play with low level stuff. After this it was a BBC-B micro and an obsession with writing chess programs, in a combination of BASIC and 6502 assembler.
I was lucky to get sponsorship for my university days, and hence spent a year before university working on a dual array processor – a machine with two grids of 32×32 processors which could efficiently run lots of algorithms written in FORTRAN (in the manner of modern graphics card). During the year, I was mainly writing test programs, so spent time learning C and reading about compilers and Lisp, and hence wrote my first Lisp interpreter in C and my first compiler. I also came across the lazy programming language Lispkit Lisp.
I started a Maths degree here in Cambridge, but spent the summer and Christmas vacations working in Manchester. This time I was in a team working on a multiprocessor machine programmed using functional languages. The actual processors worked using a low level language, DACTL, and I had a lot of interesting work on benchmarking and writing about efficient optimisation of DACTL. I was also lucky enough there to be introduced to computational mathematics such as type theory and denotational semantics.
After a maths degree, I realised that I wasn’t the one who was going to solve the Poincarre Conjecture. I decided that computing was my future, and so took the one year conversion course and then got a job for a local company.
It’s hard to describe how fantastic a place Harlequin was. During my time there I wrote large chunks of an ML compiler, ported the Common Lisp system to the DEC Alpha (which taught me loads about low level debugging, link loaders and compilers), ported the garbage collector and compiler from Unix to Windows and wrote most of a CORBA ORB which allowed objects written in Common Lisp to interact with objects implemented in languages like C, and Java. I got to travel to various trade shows in Europe and the US, and they even re-employed me after I left to start a Phd in Computer Science (though I only managed a year of work on generating programs from constructive mathematical proofs). The best part of working in Common Lisp is that we had to implement all sorts of stuff – link loaders to allow us to interact with C (this was before the days of shared libraries), GUI libraries and full compilers. A modified version of the Lisp system also ran on a space probe.
After Harlequin, I worked for another Cambridge company, adding COM support to their scheduling system. This eventually extended to writing an OLEDB layer which exposed the internal object model via a set of COM objects, and via a set of table objects which you could query via OLEDB using an SQL interpreter (which I also wrote). During my time at this company, .NET came along, so we started implementing things in a mixture of C# and Common Lisp using various methods to bridge the gap.
What are you working on at the moment?
Reflector – all of it, including the extensions that make up Reflector Pro like Visual Studio integration and pdb generation.
If you could make one change to the .NET Framework, what would it be?
I’d implement all of it in managed code. In my days of working on Lisp systems, the garbage collector, for example, was written mainly in Lisp with a small amount of portable assembler (much like IL) – the only C was the code that passed various library entry points into the system start-up code. There’s nothing more annoying that following a trail using Reflector only to find that the framework branches out into external code which you can’t see. I’d have written the C# compiler in C# from the early days, something that Microsoft are only just doing now as part of the Roslyn project.
From a C# standpoint, I’d also have wished to find a better pattern for extending the language. The F# team seem to have done well by having a notion of a computational workflow, a pattern that can be used to implement many extensions such as sequences and async. In the Common Lisp world, the core language is very small and hence easily understandable, and macros can be used by libraries to extend the syntax, with macroexpansion allowing you to see the transformations that the compiler is making.
What’s the most interesting / satisfying project you’ve worked on, and why?
The most exciting three months’ work I have ever done was porting the Harlequin Lisp system to run on the Dec Alpha. This involved lots of very low level detail. First you wrote a description of the machine language for the Alpha, and then wrote translations of the intermediate language into this machine language.
You then had to cross compile the system using the Common Lisp system running on a different architecture.
You then spent time debugging this in order to get a base amount of functionality, such as the compiler, running.
You then implemented the parts of the link loader that were specific to the architecture so that you could load the “C” code for talking to X Windows.
Then you sat back and watched the system start up and display windows on the screen. And you did all of this in an exciting, fully engaging three months of effort.
What do you do to relax?
Sport! I started out as a competitive swimmer when I was 9 and have done some swimming ever since. Over the years, I’ve also practiced martial arts of various kinds, typically up to three times a week when I was in my 30s. My current favourites are squash, 5-a-side football, cricket (on the two days a year the weather is suitable in the UK), table tennis and running (10km).
At Harlequin we used to juggle most lunchtimes, and I still do a little juggling, but very badly.
I love hill walking in the Lake District, and have recently discovered chess, though I’m truly hopeless at it. For the last ten years I’ve also vainly tried the monthly IBM ponder, which has a fantastic range of puzzles.
What’s your favourite book (technical and / or non-technical), and why?
My favourite book around the subject of philosophy, mathematics and proof is Goedel, Esher, Bach, though I admit to last having read it 20 years ago. It is a fascinating mix of ideas of around proof, symmetry and intelligence.
The Science Fiction story that had the most effect on me (when I was 8 and the teacher read it to us) was A Sound Of Thunder, which contains the time travel paradox idea and the Butterfly effect that you see everywhere these days.
A few years ago I really enjoyed The Life Of Pi, though sadly it turned out not to be a book on mathematics.
Do you have any advice / suggestions / questions for other developers?
First, always be willing to help others. Not only does that help them, but you usually learn something new yourself, either from the way they work or from their mental model of whatever you are trying to debug.
Second, if you don’t know something, say you don’t! Making up unsubstantiated rubbish just confuses other peoples’ mental models and isn’t helpful.
Third: read, read, read… new ideas help clarify the ideas you already have. Podcasts can be useful but it’s harder to skip to the interesting bits without sitting through all of the filler. Read a computer science paper every now and then from http://lambda-the-ultimate.org/
Fourth: you can achieve a reasonable level of skill in almost everything, though you need to be willingly to put the effort in.
Oh, and don’t worry about getting old – lots of ideas from the old days are finding their time as we speak.