> Not in any way, only that we explain the context in which we consider the approach ‘better’.
The context is the code William initially shared with the list. I will not write a long response as I think this is getting off-topic for this list. You are very welcome ping me at my email if you would like to continue off-list. On Tue, Nov 24, 2015 at 11:21 AM, Colin Yates <colin.ya...@gmail.com> wrote: > Hi Atamert, good challenge. > > TLDR: every choice is about weighing the pros and the cons and I am > suggesting that the criteria we use is very very subjective and context > sensitive > > waffly comments inline. > > > in this industry there are hardly any unambiguous and objective > statements > > Either you contradict yourself or the following is ambiguous and/or > subjective: > > > Or both :-) I know! Isn’t this industry great :-) > > I was too broad with my original statement - let me try again. I am > suggesting that we are continually forced with making decisions/reasoning > about things with very few objective and quantifiable metrics or tools to > use to reason with. This leads to claims being made around something being > ‘better’ or ‘worse’ without any agreed definition of the domain being > discussed. Without any ubiquitous language if you will. Thus, many > discussions lead to multiple inputs all claiming “this is right, that is > wrong” but those choosing different things to be ‘right’ or ‘wrong’ about. > And they are all right, and they are all wrong. They are all right for the > person making the claim as these claims have to be context dependant > because there are very few ‘global truths’ in this industry. They are > (almost always) all wrong because they assert what is useful for them is > useful for everybody. > > Often what happens in these discussions is that somebody agrees with a > principle (complecting is bad) and then proposes an approach which for them > reduces it _for them_. Others, with different contexts and perspectives > agree with the principle but see the proposed approach as either not > reducing it or actually increasing it. At which point, until people are > clear what their values are, the conversation ends at best with a "well > chaps, let’s agree to disagree” or worse, people get offended. If people > didn’t make such wide-ranging assertions then the discussion would be more > fruitful. > > > pragmatism throws it all out of the window > > > because "this is all well and good but I need to get on with stuff". I > suggest that most of us continually live the dilemma of ‘do it now’/‘do it > later’. A variation of which is ‘do it now with the tools I know > about’/‘learn better tools and do it better, later’. > > Almost everything we (or at least I) do is a compromise of some sort > because where the real world meets the computer is a mess of ambiguity, > time pressure etc. So a programmer’s life is full of decisions which are > trade-offs between choosing A and B. Static typing/dynamic typing, > protocols/fns, which of the gazillion frameworks and libraries to use, > kanban or sprint, unit testing? and so on and so on. > > > ----- > > > One man’s complexity is another man’s simplicity and so on. > > Can you please give an example? > > > Sure: > - a big ball of mud is a single coherent domain model > - micro services are nicely encapsulated and can introduce exponentially > increasingly fragile deployment plans > - design patterns are great and cause enormous bloat to a lot of code > bases > - dependency injection frameworks enable components to be ignorant and > break encapsulation > - static typing adds a whole level of safety and type signatures are > bewildering > - abstractions allow me to describe something I couldn’t before and add > layer and layer of noise > - lots of little namespaces keep things manageable and make navigation > painful > - lots of large namespaces keep things management and make navigation > painful > - DSLs bring capability to the user and add complexity to the code base > - OO - what can I say here :-) > > The point, the only point I am making is that all of the above is true > depending on your view point because yes, complecting is bad, complexity is > bad, and what makes something complex for me is different to what makes it > complex to you. Where you see a number of things complected together I > might see an example of encapsulation. > > ----- > > Are you suggesting we don't discuss merits and shortcomings of different > approaches to design software? > > > Not in any way, only that we explain the context in which we consider the > approach ‘better’. I also wish we did discuss the merits and shortcomings, > too frequently we don’t, we only discuss the merits. > > The reason I posted initially is because I have wasted so many months > arguing details with other developers and having a black and white view of > things and it almost always turned out that we were agreeing with the > general principle but the application of that principle meant different > things in each of our different contexts. We were ‘violently agreeing’ :-). > > TLDR(2): there is no ‘better’ only ‘better in this context' > > I hope that clarified my view point. > > > > > On Tue, Nov 24, 2015 at 10:11 AM, Colin Yates <colin.ya...@gmail.com> > wrote: > >> I think this discussion has run into the age-old problem of ‘subjective >> interpretation’, namely, multiple people all agreeing with a principle >> (i.e. complexity sucks) but then having _different_ interpretations of >> where that principle is challenged/upheld. Unfortunately in this industry >> there are hardly any unambiguous and objective statements because most of >> what we do is more artistic than engineering (zips up the flame suit now). >> >> And, as ever, pragmatism throws it all out of the window :-) >> >> One man’s complexity is another man’s simplicity and so on. >> >> >> >> On 24 Nov 2015, at 06:34, Atamert Ölçgen <mu...@muhuk.com> wrote: >> >> Hi William, >> >> How is this different than Yo-yo? ( >> https://groups.google.com/forum/#!topic/clojure/PvCc5sSeSRY) >> >> > Justifying things is generally impossible. >> >> Actually, no. It is possible, at least when you are dealing with >> reasonable people. And when you make claims like "lightweight" or >> "ultralight", people will naturally ask "oh, interesting, how so?" >> >> ----- >> >> Some functional programming folks are allergic to exceptions. They go out >> of their ways to prevent any and all exceptions and they end up >> unnecessarily complicating their types for little or no gain. >> >> It seems to me, you are trying to avoid using protocols like it's a >> plague. >> >> > I am tired of doing ongoing refactorings interrupted periodically by >> complete rewrites. Class hierarchies are the worst... >> >> When your ultralight function based components get out of hand, you will >> have a worse time refactoring. With component you only have two functions, >> your lightweight design will end up having (* n 2) functions. >> >> Also, looking at a component's code (it's defrecord form I mean) I can >> see what other components it depends on. Your design would bury them inside >> functions making it harder to read. >> >> >> On Tue, Nov 24, 2015 at 6:57 AM, James Reeves <ja...@booleanknot.com> >> wrote: >> >>> Have you watched Simple Made Easy >>> <http://www.infoq.com/presentations/Simple-Made-Easy>? >>> >>> I mention it because you remark about being tired of refactoring. It's >>> my opinion that's a symptom of complexity, in the Hickey definition of the >>> term. >>> >>> - James >>> >>> On 24 November 2015 at 03:31, William la Forge <laforg...@gmail.com> >>> wrote: >>> >>>> James, >>>> >>>> Being fun is important but not a justification. We should strive to >>>> keep things fun, but there are plenty of thing worth doing and our >>>> resources are always limited. And if it is not fun, you are not going to do >>>> your best work. >>>> >>>> Justifying things is generally impossible. If vanilla clojure meets >>>> your needs, then vanilla clojure it is. If macros solve the problems you >>>> have been dealt in the past, then three cheers for macros. If unifying >>>> client and server addresses your needs, then Om Next may well be a major >>>> blessing for you. >>>> >>>> For me, the winner is avoiding static structures. I am tired of doing >>>> ongoing refactorings interrupted periodically by complete rewrites. Class >>>> hierarchies are the worst--being the largest, they are the least stable. I >>>> like small files that I can put to bed as finished. And self-defining >>>> aggregation. Because these meet my very real needs. I constantly >>>> reconceptualize what I am working on while bringing projects to completion. >>>> So having a programming style which keeps code relevant in the face of such >>>> an onslaught is very helpful and also a genuine delight. >>>> >>>> --b >>>> >>>> On Mon, Nov 23, 2015 at 10:08 PM, James Reeves <ja...@booleanknot.com> >>>> wrote: >>>> >>>>> I feel you might be barking up the wrong tree with this approach, as >>>>> it seems to complicate things without providing any compelling advantages. >>>>> >>>>> That said, if it's fun then by all means continue to experiment. Maybe >>>>> I'm wrong :) >>>>> >>>>> - James >>>>> >>>>> On 24 November 2015 at 02:45, William la Forge <laforg...@gmail.com> >>>>> wrote: >>>>> >>>>>> I think you have read too deeply into my thoughts on reserving the >>>>>> first argument of a function. I haven't actually written any polymorphic >>>>>> functions relating to this. >>>>>> >>>>>> Really, the take off point for me is being able to operate on an >>>>>> object by implementing it as a map of functions and data. That is to say, >>>>>> making objects data. Implementing multiple inheritance becomes trivial >>>>>> and >>>>>> without having to define any classes or any interfaces. And with full >>>>>> support for circular references without needing to do declares. >>>>>> >>>>>> What I like about it is that I get separation of concerns and maximal >>>>>> reuse without, I suspect, the usual usage coupling. The small maps which >>>>>> define traits can even participate in the lifecycle of the aggregate, so >>>>>> they start taking on the characteristics of components. >>>>>> >>>>>> My biggest problem with writing code over the decades has been the >>>>>> constant desire to do rewrites--which are costly and devastating in their >>>>>> impact. That is *why *I am fascinated with this approach. >>>>>> >>>>>> A second *why *is that when I have clear separation of concerns and >>>>>> the pieces of code can be easily tested independently, documentation >>>>>> becomes clearer and more fun to write. And keeping code fun is a critical >>>>>> driver for open source. >>>>>> >>>>>> On Mon, Nov 23, 2015 at 9:24 PM, Timothy Baldridge < >>>>>> tbaldri...@gmail.com> wrote: >>>>>> >>>>>>> So I feel compelled at this point to ask..."why?". The whole point >>>>>>> of functional programming in Clojure is to de-couple state from data. >>>>>>> When >>>>>>> you need polymorphic dispatch on the contents of a map, you have access >>>>>>> to >>>>>>> multi methods. Sure this is a fun thought experiment, but I don't >>>>>>> understand the design goals. It's a fairly verbose way to write more >>>>>>> complex code to accomplish what we already have good tools for >>>>>>> (protocols/multimethods, etc). Maybe I'm missing something. >>>>>>> >>>>>>> Timothy >>>>>>> >>>>>>> On Mon, Nov 23, 2015 at 7:15 PM, William la Forge < >>>>>>> laforg...@gmail.com> wrote: >>>>>>> >>>>>>>> James, when I used the term mixin I was referring to a map that >>>>>>>> acts like a trait that gets merged into a larger map. You would define >>>>>>>> several such smaller maps that can then be used in various >>>>>>>> combinations to >>>>>>>> compose "objects". The identity of the composite object (this) is the >>>>>>>> map >>>>>>>> which holds the merged contents of the smaller maps. I.E. The entries >>>>>>>> in >>>>>>>> the smaller maps get copied into the larger map. >>>>>>>> >>>>>>>> When executing functions held by a map, the last parameter is >>>>>>>> always the map itself, i.e. the "this". On the other hand, when placing >>>>>>>> closures into the map, the self reference is no longer needed as it is >>>>>>>> implicit in the closure. But this means that a closure can only >>>>>>>> reference >>>>>>>> the contents of the map when the closure was created, while a function >>>>>>>> can >>>>>>>> reference any of the contents of the map passed as its last argument. >>>>>>>> >>>>>>>> Why did I make the map reference the last argument for functions >>>>>>>> held by the map? So that we can do type polymorphism on the first >>>>>>>> argument >>>>>>>> passed to the function. But we should make an exception to this. To >>>>>>>> facilitate threading, functions which return an updated map should take >>>>>>>> that map as the first argument. But that is an API change and needs to >>>>>>>> wait >>>>>>>> for release 0.6.0. >>>>>>>> >>>>>>>> -- >>>>>>>> You received this message because you are subscribed to the Google >>>>>>>> Groups "Clojure" group. >>>>>>>> To post to this group, send email to clojure@googlegroups.com >>>>>>>> Note that posts from new members are moderated - please be patient >>>>>>>> with your first post. >>>>>>>> To unsubscribe from this group, send email to >>>>>>>> clojure+unsubscr...@googlegroups.com >>>>>>>> For more options, visit this group at >>>>>>>> http://groups.google.com/group/clojure?hl=en >>>>>>>> --- >>>>>>>> You received this message because you are subscribed to the Google >>>>>>>> Groups "Clojure" group. >>>>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>>>> send an email to clojure+unsubscr...@googlegroups.com. >>>>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> -- >>>>>>> “One of the main causes of the fall of the Roman Empire was >>>>>>> that–lacking zero–they had no way to indicate successful termination of >>>>>>> their C programs.” >>>>>>> (Robert Firth) >>>>>>> >>>>>>> -- >>>>>>> You received this message because you are subscribed to the Google >>>>>>> Groups "Clojure" group. >>>>>>> To post to this group, send email to clojure@googlegroups.com >>>>>>> Note that posts from new members are moderated - please be patient >>>>>>> with your first post. >>>>>>> To unsubscribe from this group, send email to >>>>>>> clojure+unsubscr...@googlegroups.com >>>>>>> For more options, visit this group at >>>>>>> http://groups.google.com/group/clojure?hl=en >>>>>>> --- >>>>>>> You received this message because you are subscribed to a topic in >>>>>>> the Google Groups "Clojure" group. >>>>>>> To unsubscribe from this topic, visit >>>>>>> https://groups.google.com/d/topic/clojure/7Q7QvlSUGL4/unsubscribe. >>>>>>> To unsubscribe from this group and all its topics, send an email to >>>>>>> clojure+unsubscr...@googlegroups.com. >>>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> You received this message because you are subscribed to the Google >>>>>> Groups "Clojure" group. >>>>>> To post to this group, send email to clojure@googlegroups.com >>>>>> Note that posts from new members are moderated - please be patient >>>>>> with your first post. >>>>>> To unsubscribe from this group, send email to >>>>>> clojure+unsubscr...@googlegroups.com >>>>>> For more options, visit this group at >>>>>> http://groups.google.com/group/clojure?hl=en >>>>>> --- >>>>>> You received this message because you are subscribed to the Google >>>>>> Groups "Clojure" group. >>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>> send an email to clojure+unsubscr...@googlegroups.com. >>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>> >>>>> >>>>> >>>>> -- >>>>> You received this message because you are subscribed to the Google >>>>> Groups "Clojure" group. >>>>> To post to this group, send email to clojure@googlegroups.com >>>>> Note that posts from new members are moderated - please be patient >>>>> with your first post. >>>>> To unsubscribe from this group, send email to >>>>> clojure+unsubscr...@googlegroups.com >>>>> For more options, visit this group at >>>>> http://groups.google.com/group/clojure?hl=en >>>>> --- >>>>> You received this message because you are subscribed to a topic in the >>>>> Google Groups "Clojure" group. >>>>> To unsubscribe from this topic, visit >>>>> https://groups.google.com/d/topic/clojure/7Q7QvlSUGL4/unsubscribe. >>>>> To unsubscribe from this group and all its topics, send an email to >>>>> clojure+unsubscr...@googlegroups.com. >>>>> For more options, visit https://groups.google.com/d/optout. >>>>> >>>> >>>> >>>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "Clojure" group. >>>> To post to this group, send email to clojure@googlegroups.com >>>> Note that posts from new members are moderated - please be patient with >>>> your first post. >>>> To unsubscribe from this group, send email to >>>> clojure+unsubscr...@googlegroups.com >>>> For more options, visit this group at >>>> http://groups.google.com/group/clojure?hl=en >>>> --- >>>> You received this message because you are subscribed to the Google >>>> Groups "Clojure" group. >>>> To unsubscribe from this group and stop receiving emails from it, send >>>> an email to clojure+unsubscr...@googlegroups.com. >>>> For more options, visit https://groups.google.com/d/optout. >>>> >>> >>> >>> -- >>> You received this message because you are subscribed to the Google >>> Groups "Clojure" group. >>> To post to this group, send email to clojure@googlegroups.com >>> Note that posts from new members are moderated - please be patient with >>> your first post. >>> To unsubscribe from this group, send email to >>> clojure+unsubscr...@googlegroups.com >>> For more options, visit this group at >>> http://groups.google.com/group/clojure?hl=en >>> --- >>> You received this message because you are subscribed to the Google >>> Groups "Clojure" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to clojure+unsubscr...@googlegroups.com. >>> For more options, visit https://groups.google.com/d/optout. >>> >> >> >> >> -- >> Kind Regards, >> Atamert Ölçgen >> >> ◻◼◻ >> ◻◻◼ >> ◼◼◼ >> >> www.muhuk.com >> >> -- >> You received this message because you are subscribed to the Google >> Groups "Clojure" group. >> To post to this group, send email to clojure@googlegroups.com >> Note that posts from new members are moderated - please be patient with >> your first post. >> To unsubscribe from this group, send email to >> clojure+unsubscr...@googlegroups.com >> For more options, visit this group at >> http://groups.google.com/group/clojure?hl=en >> --- >> You received this message because you are subscribed to the Google Groups >> "Clojure" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to clojure+unsubscr...@googlegroups.com. >> For more options, visit https://groups.google.com/d/optout. >> >> >> >> -- >> You received this message because you are subscribed to the Google >> Groups "Clojure" group. >> To post to this group, send email to clojure@googlegroups.com >> Note that posts from new members are moderated - please be patient with >> your first post. >> To unsubscribe from this group, send email to >> clojure+unsubscr...@googlegroups.com >> For more options, visit this group at >> http://groups.google.com/group/clojure?hl=en >> --- >> You received this message because you are subscribed to the Google Groups >> "Clojure" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to clojure+unsubscr...@googlegroups.com. >> For more options, visit https://groups.google.com/d/optout. >> > > > > -- > Kind Regards, > Atamert Ölçgen > > ◻◼◻ > ◻◻◼ > ◼◼◼ > > www.muhuk.com > > -- > You received this message because you are subscribed to the Google > Groups "Clojure" group. > To post to this group, send email to clojure@googlegroups.com > Note that posts from new members are moderated - please be patient with > your first post. > To unsubscribe from this group, send email to > clojure+unsubscr...@googlegroups.com > For more options, visit this group at > http://groups.google.com/group/clojure?hl=en > --- > You received this message because you are subscribed to the Google Groups > "Clojure" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to clojure+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. > > > -- > You received this message because you are subscribed to the Google > Groups "Clojure" group. > To post to this group, send email to clojure@googlegroups.com > Note that posts from new members are moderated - please be patient with > your first post. > To unsubscribe from this group, send email to > clojure+unsubscr...@googlegroups.com > For more options, visit this group at > http://groups.google.com/group/clojure?hl=en > --- > You received this message because you are subscribed to the Google Groups > "Clojure" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to clojure+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. > -- Kind Regards, Atamert Ölçgen ◻◼◻ ◻◻◼ ◼◼◼ www.muhuk.com -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.