3 ms·
I'll let the parent answer you (though I have similar sentiments as someone with language implementation experience, and FWIW, I have professional experience wi
by cstrahan 9y ago
I'll let the parent answer you (though I have similar sentiments as someone with language implementation experience, and FWIW, I have professional experience with Go, Ruby, JavaScript, Clojure, C#, and I've used Haskell, F#, and much more in my free time).
I will, however, point out that you're likely using a different definition of simple ("easily understood or done; presenting no difficulty.
") than is often used in technical circles ("composed of a single element; not compound"). Simplicity and ease are distinct, and one does not necessarily imply the other; it's not hard to find convoluted designs that feel easy due to familiarity, while a much smaller, consistent design will feel difficult because the concepts (while fewer in number) are foreign.
Rich Hickey (creator of Clojure) gave a great talk on easy vs simple: https://www.youtube.com/watch?v=rI8tNMsozo0 https://www.youtube.com/watch?v=rI8tNMsozo0
Here's something familiar to most professional web developers: JavaScript.
But it's also complicated: https://www.destroyallsoftware.com/talks/wat https://www.destroyallsoftware.com/talks/wat
Here's the spec: https://www.ecma-international.org/ecma-262/8.0/index.html https://www.ecma-international.org/ecma-262/8.0/index.html
And here's something unfamiliar and often considered difficult: lambda calculus.
And yet it's very simple. Here's the entire definition of lambda expressions (lifted from Wikipedia):
---
Lambda expressions are composed of:
* variables v1, v2, ..., vn, ...
* the abstraction symbols lambda 'λ' and dot '.'
* parentheses ( )
The set of lambda expressions, Λ, can be defined inductively:
1. If x is a variable, then x ∈ Λ
2. If x is a variable and M ∈ Λ, then (λx.M) ∈ Λ
3. If M, N ∈ Λ, then (M N) ∈ Λ
Instances of rule 2 are known as abstractions and instances of rule 3 are known as applications.
---
So, while JavaScript programmers might find the lambda calculus unapproachable, it would be difficult to argue that the former has fewer gotchas than the latter, as the former is wildly complicated and the latter is so simple that you could fit its definition on business card. Once you appreciate the difference between simplicity and ease you can better evaluate your options, as it might be worth investing time in learning an intimidating, foreign solution if you believe that it will provide better stability/correctness guarantees/etc. Also, simple things are generally easier to work with compared to complex things assuming a similar degree of experience -- so investing in unfamiliar-yet-simple things will often save you a lot of effort in the long run. Strictly adhering to familiar things is a recipe for being stuck in a local optimum.
To take this full circle, Go being easy doesn't mean that it's simple.
- christophilus 9y agoThis is a better answer than the one I gave. And is also a good explanation of why leaving Clojure for anything else always feels so icky. :)
- logicallee 9y agoThank you, this was excellent and very informative. You weren't kidding about the lambda calculus definition! https://en.wikipedia.org/wiki/Lambda_calculus#Formal_definition https://en.wikipedia.org/wiki/Lambda_calculus#Formal_definit... With that said, your comment seems quite technical, about the single point of simplicity. You don't talk much about Go at all, and although the other poster has also answered, I'd be curious in your answer as well (if you've worked with Go): You've given a definition of simplicity (correcting mine). Did you find Go simple? What other thoughts did you have?