Question: Can anyone explain the difference between `use` and `require`, both when used directly and as `:use` and `:require` in the `ns` macro?

Answer: 
It's idiomatic to include external functions with `require` and `refer`. You avoid namespace conflicts, you only include functions you actually use/need, and you explicitly declare each function's location:

```
(ns project.core
    (:require [ring.middleware.reload :refer [wrap-reload]]))

```

I do not have to invoke this function by prefixing it with its namespace:

```
(wrap-reload) ; works

```

If you don't use `refer` you'll need to prefix it with the namespace:

```
(ring.middleware.reload/wrap-reload) ; works if you don't use refer in your require

```

If you choose `use` instead, (pretty much) always use `only`:

```
(ns project.core
    (:use [ring.middleware.reload :only [wrap-reload]]))

```

Otherwise you're including everything, making it both an unnecessarily large operation and very confusing for other programmers to find where the functions live.

Also, I highly recommend [this blog](https://8thlight.com/blog/colin-jones/2010/12/05/clojure-libs-and-namespaces-require-use-import-and-ns.html) as a resource for learning more about Clojure namespaces.
As has been mentioned the big difference is that with `(require 'foo)`, you then refer to names in the lib's namespace like so: `(foo/bar ...)` if you do `(use 'foo)` then they are now in your current namespace (whatever that may be and provided there are no conflicts) and you can call them like `(bar ...)`.