
We are a 9 year old boutique technology consulting firm. We care about the impact that we make in the world. As an employee-owned cooperative, we all are stakeholders in how nilenso is run and can prioritise employee happiness: we don’t need to justify how happy employees impact the bottom line. We’re currently a fully remote team of friendly people across India with one member in Canada, and are hiring folks based in either of these geographies.
We have designed, built, and delivered complex, distributed, scalable backend systems for the web that have stood the test of time. We have written production code in Clojure/ClojureScript, Haskell, Elixir, Ruby/Rails, Python, Go, and Javascript, and are partial to a functional approach to programming. You can read about some of our work[1][2] and check out the talks[3] we’ve given to know more.
We’re looking for senior engineers to work with us. View our full job description at https://nilenso.com/jobs/senior-developer/, or email us at careers@nilenso.com to apply!
[1] https://github.com/nilenso/media/blob/master/presentations/g...
Another great book on FP is "The Functional Approach to Programming" [2], which is a bit like SICP but using Caml (OCaml without the O) instead of Scheme.
The Functional Approach to Programming (Cousineau)
A confusing sentence I noticed in the first chapter:
> ...then the only thing cost was some time, if they do it wrong, the cost is usually a bug.
I am guessing you mean "only cost was some time" (without the "thing")?
As for the topic, my hypothesis is slightly different — adopting functional approach to programming — even in imperative languages — leads you to the best patterns (or as you put it, "makes it inevitable") when combined with "evolutionary" architecture, and DoP is certainly one of them.
However, for a majority of software, in my experience, data "attributes" are really "leaf nodes", only to be consumed for display, and types do not really matter much there (eg. I don't mind `firstName` being a simple string). What we want to get right is types we do operations on, and most critically, relations between different data models. Accepting "evolutionary" principles in architecture also means that you welcome change and build for it, so getting any definition of data right from start is not an imperative.
But the topic certainly seems intriguing, so I look forward to learning more from your book and seeing how you apply it in a more imperative/OO way and what language features you found critical to success there.
Congrats again and good luck!