I think a lot of the constraints can be relaxed during the development phase.
379 karma · joined November 26, 2010
I think a lot of the constraints can be relaxed during the development phase.
I prefer clojure.spec to guard significant (ns, api) boundaries.
* Use consistent, unique namespace aliases - agree. This helps tremendously when consistent across projects given the varying tooling capabilities. We even have a dictionary of namespace -> alias mappings that is expanded as new commonly used namespaces appear.
* Use long namespace aliases - agree partially. I have a few favourite namespaces present in pretty much every project that get a single letter alias.
* Choose readability over compactness - agree partially. Another part of the solution is keeping the functions small and all the types explicit. However, there's a fine line between that and having to use something like a hungarian notation for the local variables.
* Don’t rely on implicit nil-to-false coercion - agree. However, I never find myself in this situation. Mostly because I just don't use plain booleans. Pretty much always you can use an enum (keyword) instead to better express the intent. When used locally - in the scope of a single function - I find that boolean-nil problem doesn't cause any issues.
* Avoid higher-order functions - agree completely. `comp` and `partial` in Clojure are awkward. If you find yourself using them, you're probably nesting too many lambdas with hash (#) notation - move some of them out into a `let`.
* Don’t spare names - agree partially. The suggestion is definitely more readable. I just love writing threading expressions.
* Don’t use first/second/nth to unpack tuples - agree completely.
* Don’t fall for expanded opts - agree completely.
* Use * as prefix for references - agree. This needs some sort of a blessed reference in the Clojure documentation. Something to syntactically mark constants, e.g. `+constant+`, something to mark refs, e.g. `+ref`.
* Align let bindings in two columns - this is purely a matter of preference. I don't care either way.
* Use two empty lines between top-level forms - also a matter of preference. I prefer a single line.
Asking, because I do most of my development in Clojure and find it much nicer than Node both for POC and production. There's also self-hosted Clojurescript now that runs without a dependency on JVM.
The good thing is that you can adapt the event store to your performance requirements and do the simplest thing possible in a huge amount of cases.
(defn deps [the-deps]
(merge-env! :dependencies the-deps))Activity of the core project seems to be low, but that's true for many other mature Clojure projects. You can still use them successfully.
https://github.com/hoplon/hoplon
It requires a certain shift in thinking when coming from pretty much any other framework. However, it avoids all of the unnecessary complexities of React by exposing the DOM elements directly as functions. The mindshare behind it might be low compared to Om or Reagent, but the people that are using it are pretty active at Clojurians slack channel #hoplon and on IRC (freenode, #hoplon). It's also FRP-based and pretty efficient. Highly recommend!
The things I loved:
* helm mode - autocompletions for the commands
* consistency - SPC + ... everywhere
* REPL in a buffer
I understand that a month with Emacs isn't remotely enough to make up for years of VIM, but I didn't find enough benefits to stick with it.[1] http://www.bloombergview.com/articles/2015-01-23/high-freque...
In short, the way the plea bargaining system developed was due to the jury system being too ineffective and time consuming in producing convictions. Thus the workaround which forces innocent people into accepting charges.
The truth is, DDD consists of two parts: tactical patterns, such as Entity, Value Object or Aggregate Root and strategic design patterns such as Ubiquituos Language, Bounded Context or Context Maps. Tactical patterns are much easier to understand and apply, but most of the benefits claimed by DDD are provided by the application of strategic design.
Sadly, most people starting with DDD focus on the tactical patterns and technology, then get demotivated when the benefits do not appear.
Netflix is known for opensourcing a whole suite of infrastructure components which allow to run a microservices architecture on AWS (https://github.com/Netflix). These include various configuration management tools, event buses, monitoring solutions and much more.
To my mind, the most important benefits of a microservice architecture are a clear separation between teams working on different services and the ability to upgrade said services autonomously without stopping/breaking the consumers which allows for fast iteration. The important point is you don't just replace services, but introduce new versions and automatically retire old versions when all of the consumers upgrade to the new ones.
Most of the stuff people are describing here as REST would be classified as HTTP-based Type I/II according to the above resource.
Do you imply that corn had negative effect on Indians? From what I've read [1] it actually allowed Indians to maintain their population levels without having irrigation technology comparable to one developed in middle East and Europe.
[1] http://mitpress.mit.edu/books/technology-world-civilization
Type classes can be mimicked via multimethods or protocols.