Fog Creek – Interview with Michael Fogus

In, we chat with developers about their passion for programming: how they got into it, what they like to work on and how.

Today’s guest is Michael Fogus, Software Architect at Cognitect. He’s a contributor to Clojure and ClojureScript and author of ‘The Joy of Clojure‘ as well as ‘Functional JavaScript‘. He writes about life, programming and thinking on his blog.

Michael Fogus
Location: Washington, DC, US
Current Role: Software Architect at Cognitect

How did you get into software development?

I was privileged to receive a Commodore 64 when I was 8 years old and it was my only computer for the next 10 years. Most of the time, I used it only to play games, but I definitely coded my share of BASIC programs (even one that was self-modifying). I remember one time my best friend and I stayed up all night typing in a canoeing game from an old computer magazine (back when they actually contained source code) and when we were done we tried running it and of course it didn’t work. The frustration was exquisite. After a half-hearted attempt to try getting it to work, we gave up and went to bed. Little did I know that I had just experienced what it was like to be a working programmer. My final projects on that lovely computer were my college entrance essays.

I originally went to school with the intent of majoring in Philosophy and Mathematics. However, in my second year my college started a Computer Science program from scratch and I decided to take a few classes. My curriculum was based almost entirely on XLISP and Common Lisp, and I fell in love with both. I suppose you can say that the rest is history. I was one of the first students (of two) to receive a Computer Science degree from my college. Sadly I needed to stay another year to get the Philosophy degree, so I instead jumped ship and went into the (so-called) Tech industry.

After a few years of doing CLIPS, Delphi, C, and C++ programming I switched to Java and did that for a very long time. I also took graduate courses during that time in AI working mostly in Common Lisp, Scheme, and Prolog and the contrast between the day job and course work was not in my favor. I eventually broke down and pushed for projects that were relevant to my graduate work and was fortunate enough to land on some great projects. From machine vision to expert systems development and autonomous agents to distributed simulation. I got a nice sampling of the professional “AI” landscape. I did that kind of work for a long time before discovering Clojure and Datalog and the kind of work that I’m doing currently.

comm64 (1)

Tell us a little about your current role

Most of the projects that I consult on are some kind of web service backed by a distributed architecture. The fashionable term is “microservices,” but in my distributed simulation days we called them “federates” – though they tended to be more coarse-grained back then. What happens on a typical day depends on the project team that I’m working on. In any case, 99% of my time is spent remote. I’ll only say that flexibility is a virtue.

At Cognitect, I’m currently working as a consultant with a company that has the largest Clojure codebase that I’ve ever worked with. My niche with Cognitect has been to work with companies that are looking to use Clojure to build their business, or with companies that have existing Clojure code and would like a thorough code and/or architecture review, or that need a “mentor.”

On Fridays, I’m free (as in freedom) to work on open-source projects and recently the majority of that time has gone toward getting Clojure 1.7 released. Lately, I’ve been screening patches which is a wholly thankless job, but one that I find challenging and that allows me to get a better grasp of the features and bug fixes in the pipeline.

Besides my work on Clojure (and rarely ClojureScript), I have been toying around with little programming languages, libraries, and the toy databases to explore interesting ideas. I call these “code paintings.” The biggest challenge in doing these one-shot projects is that I can take them too seriously sometimes, when in reality they’re meant as a form of play.

When are you at your happiest whilst coding?

Programming is the only activity that I’ve ever done that’s compelled me to jump out of my chair, yelp, and pump my fist into the air while completely alone in an empty house. I guess whatever provokes those reactions is when I’m happiest. Though working at home allows me to write code while singing some Violent Femmes or the theme song to Raising Arizona, so those times are nice too.

raisingArizona (1)

What is your dev environment?

My development environment is pretty humble these days. Though I do have a nice MacBook Air with dual monitors and OSX for my workspace, I tend to spend most of my time in Emacs writing Clojure. I would have a hard time divorcing myself from Emacs at this point, but truly my most important software tools are my pen (a hacked G2 pro) and notebook (Tops quad ruled lab book). I would literally (in the modern sense) die without my notebooks.

What are your favorite books or resources about development?

In no particular order:

  • ‘Out of the Tarpit’ by Marks and Moseley
  • ‘Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I’ by McCarthy
  • ‘LISP 1.5 Programmer’s Manual’ by McCarthy, Edwards, Hart, and Levin
  • ‘META II: A Syntax-oriented Compiler Writing Language’ by Schorre
  • ‘Reasonable LISP’ by Queinnec
  • ‘Open, Extensible Composition Models’ by Piumarta
  • ‘An Association-based Model of Dynamic Behavior’ by Piumarta
  • ‘Open, Extensible Object Models’ by Piumarta and Warth
  • ‘STEPS Toward The Reinvention of Programming’ VPRI
  • ‘The Fundamentals of New Computing’ mailing list
  • ‘The Influence of the Designer on the Design – J. McCarthy and LISP’ by Stoyan
  • ‘Wabi-sabi for Artists, Designers, Poets, and Philosophers’ by Koren (thanks, Sam!)
  • ‘How Buildings Learn: What Happens After They’re Built’ by Brand
  • ‘The Art of the Metaobject Protocol’ by Kiczales
  • ‘Thˆe Early History of Smalltalk’ by Kay
  • ‘Smalltalk-72 Instruction Manual’ by Kay and Goldberg
  • ‘To Trap a Better Mouse’ by Piumarta
  • ‘Are We There Yet?’ by Hickey
  • ‘The Language of the System’ by Hickey
  • ‘Growing a Language’ by Steele
  • ‘Systems that Run Forever Self-heal and Scale’ by Armstrong
  • ‘Programming Should Eat Itself’ by Amin
  • ‘Complex Information Processing: A file structure for the complex, the changing, and the indeterminate’ by Nelson
  • ‘The LISP70 Pattern Matching System’ by Tesler
  • ‘Derivability, Redundancy, and Consistency of Relations Stored in Large Data Banks’ by Codd
  • ‘A Relational Model of Data for Large Shared Data Banks’ by Codd
  • ‘Extending the Database Relational Model to Capture More Meaning’ by Codd
  • ‘Ideal Hash Trees’ by Bagwell
  • ‘Production Matching for Large Learning Systems’ by Doorenboros
  • ‘Soft Stratification for Transformation-Based Approaches to Deductive Databases’ by Behrend
  • ‘Practical Predicate Dispatch’ by Millstein
  • ‘Flavors: Message Passing in the LISP Machine’ by Weinreb and Moon
  • ‘Predicate Dispatching: A Unified Theory of Dispatch’ by Chambers
  • ‘Worlds: Controlling the Scope of Side Effects’ by Warth and Kay
  • ‘BEINGS: Knowledge as Interacting Experts’ by Lenat

I’d love to fit all of these ideas into a programming language one day.

What technologies are you currently trying out?

  • 1. Erlang
  • 2. Quadcopter drone
  • 3. SML
  • 4. Everything else under the sun

quadcopter (1)

When not coding, what do you like to do?

I like to read, and I read a lot. When I’m not reading I play Baseball, tabletop board and card games, dabble in designing the same, and occasionally make music (if you call that screeching that comes out of my face music).

What advice would you give to a younger version of yourself starting out in development?

You don’t know what you’re talking about!


Thanks to Michael for taking the time to speak with us. Have someone you’d like to be a guest? Let us know @FogCreek.

Recent Interviews

Peteris Krumins
Peteris Krumins
Eric Lippert
Eric Lippert
Chris Hartjes
Paul Jones
Paul M. Jones