Advanced inspector middleware for Clojure nREPL

Last night I promoted a new nREPL middleware project, ‘nrepl-inspect’, derived from the javert library.

nrepl-inspector on GitHub

This repository contains:

  • an Emacs client file that extends nrepl.el, and
  • a rich generic middleware inspector that runs under nREPL.

Key features include:

  • ‘C-c C-i’ inspects the var at point, or any value returned by eval of an arbitrary expression in the current buffer’s active namespace,
  • a simple model for recursing into sub-objects based on a value index map maintained in the middleware during serialization of the value, and
  • a rendering method extensible for custom types.

My goal is to be able to stack navigate a Datomic database given an Entity, the example in the repository should support that with just a little more work.

Please note, while I use this in my day to day development, but it’s not yet well packaged and has been minimally tested.  It currently does not truncate maps or sequences, so please don’t inspect ‘(repeat 1)’!

Clojure Debugging ’13: Emacs, nREPL, and Ritz

[NOTE: The release of cider deprecates much of the content here.  I will post an update on Clojure Debugging ’14 early in the near year]

I’m ramping up for a new set of development projects in 2013 and 2014.  My 2010 era setup with slime and swank-clojure is unlikely to remain a viable approach throughout the project.  I’ve decided it is time to join the nREPL community as well as take advantage of some of architecture innovations there which may make it easier to debug the distributed systems I’m going to be working on.

Features I’m accustomed to from common lisp slime/swank:

  • Code navigation via Meta-. and Meta-,
  • Fuzzy completion in editor windows and the repl
  • Documentation help in mini-buffer
  • Object inspector.  Ability to walk any value in the system
  • Walkable backtraces with one-key navigation to offending source
  • Evaluate an expression in a specific frame, inspect result
  • Easy tracing of functions to the repl or a trace buffer (in emacs)
  • Trigger a continuable backtrace via watchpoint or breakpoint

Only the first three of these features is available in the stock nrepl.  The rest of this post will discuss how to setup a reasonable approximation to this feature set in Emacs using nREPL middleware providers as of May 2013.

Continue reading “Clojure Debugging ’13: Emacs, nREPL, and Ritz”

Agile Software Metrics

The rise of dynamic software development methodologies such as Extreme Programming or Agile Programming, reflect the inherent dynamism of modern software design.  The malleability of software, the rapid evolution of consumer and technology driven requirements, the difficulty of writing accurate specifications given all the unknowns, and the sheer complexity of the software ecosystem itself makes the ancient development waterfall from specification through execution and QA to release a hazardous and mostly futile affair.

Most software developments fail.  While the situation has improved over the last decade, this remains mostly true today.   Less than a third of all software projects meet their objectives in approximately the time expected.  Over 10% of all projects fail without deliver anything, and most of the rest under-deliver, are terribly late, or way over budget.

This blog post is a thinking-out-loud exploration of how modern Agile methods address these problems and how my thinking is evolving with regards to how success is defined and the probability of success maximized.

Continue reading “Agile Software Metrics”