Skip to content

Instantly share code, notes, and snippets.

@levand
Last active November 20, 2023 07:50
Show Gist options
  • Save levand/b1012bb7bdb5fcc6486f to your computer and use it in GitHub Desktop.
Save levand/b1012bb7bdb5fcc6486f to your computer and use it in GitHub Desktop.
Why I don't use cider

Why I don't use cider.

This is all personal opinion and a matter of taste. I'm putting it here because people have asked - I'm glad Cider exists and that a lot of people are obviously using it to great effect. This is not an attack on Cider or a an attempt to negate the experience of those who like it, just my own experience.

Also some of the critiques are more properly aimed at nRepl than Cider - I don't use nRepl either, in Emacs. For some reason I have fewer issues with it in Cursive (though I still do have some).

  1. With Cider, there's too much "going on" between Emacs and Clojure. When something glitches, hangs, doesn't return a value, throws an excption, etc (as it does, multiple times a day), I don't know whether the problem is in Emacs, in the Cider client, the nRepl server, one of any of the default middlewares or in my actual program. I run Emacs in inferior lisp using lein trampoline -m clojure.main - if something goes wrong, it's either in Emacs (which is usually obvious) or my program. Middleware is especially bad about this - when something goes wrong in middleware its extremely annoying to debug and completely breaks flow with me and my program, which is an absolute deal-breaker. I have a very low tolerance for environmental failures when I'm in the middle of debugging a complex issue.
  2. Cider sends different output to different places. System out and system err don't show up in the REPL. Exceptions are piped to special buffers. I don't like keeping track of that and switching buffers all the time is awkward, and I don't like worrying that I missed something becase it was running in a different thread where its output isn't captured. I like everything inline in one REPL buffer. I dislike new buffers popping in and out all the time, as Cider error buffers tend to do.
  3. When eval'ing an individual form in a file, Cider shows the results in the minibuffer. I'd rather it showed up in the REPL window so I can refer to the history. Typing a form in the REPL and evaling it from another buffer should be identical operations, in my opinion. This is true of inferior lisp mode.
  4. The client/server nature of Cider/nREpl introduce complexity I don't need. I've never personally found remote REPLs to be very useful (nor, in my opinion, are they safe or secure). I only need one JVM, I only want one point of failure.
  5. Cider/nRepl's encoding/decoding of forms and IO is good. Not great. Occasionally I'll hit an encoding error (particularly when there is IO in non-UTF8 formats), or a form that doesn't make it over the wire intact (especially with tons of data). It doesn't happen frequently, but when it does it is incredibly annoying (and again, I often can't tell the difference with a bug in my program, immediately.)
  6. It doesn't actually give me anything over what inferior-lisp does. All I want to do is have a REPL, eval forms in it either by typing them or hitting a key in an existing buffer, and load files with a keystroke. That's it. Cider introduces 1000% more complexity for 5% benefit (for my workflow).
  7. I would like to have good auto-complete and inline documentation, but I really don't like that Cider actually has to talk to the Clojure process to make it happen. Not only does it require that I have an active connected process before any of my contextual things will work, it means they're sometimes slow, sometimes crash, and sometimes just don't work for some non-apparant reason. Having something available and working maybe 30% of the time is more distracting than not having it at all.
  8. Subjectively, it seems to make my emacs slow. This one is hard to quantify, sorry.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment