Some Clojure Design Considerations - olange/learning-clojure GitHub Wiki
Don't be too clever with the features of the language: macros, protocols, ...
Tests: when starting a program, there is almost no data; rather than writing unit tests, get to the point where your data structures are in place, and capture the flowing data. Rather do integration tests and let this captured data flow thru the complete pipelines.
Concentrate on data structures, they are your «API» and should be well defined. Use validator functions to ensure you're dealing with the correct data. Prismatic Schema may come to help to document and validate. Validators can be extracted from unit test.
Defrecord: efficiently packs data in memory. Hinting actually only useful when doing Java interop. Rather don't do it intra-code.