Just as a gut check: does everybody here subscribe...
# thinking-together
k
Just as a gut check: does everybody here subscribe to the following?
The Perfect World
• All users write their own code
• We can use reflection to code unanticipated scenarios
• Local reflection happens in real time in response to outside world events
• Self-organization is the order of the day
(From https://www.infoq.com/presentations/Reflection-OOP-Social; thanks @Dan Cook: https://futureofcoding.slack.com/archives/C5T9GPWFL/p1550261759102100?thread_ts=1550087972.037900&cid=C5T9GPWFL)
i
I do not subscribe to the notion that any of those 4 ideas are supportive of a "perfect world" of programming, and what's more, I find the pursuit of the notion of perfection to be patently absurd, haha. The latter, chalk that up to me being an artist, where there is of course no such thing as a perfect symphony, a perfect painting, a perfect concept — to have such a thing would be to have a society that is frozen in place.
👍 1
I'm not convinced that code (as we know it) requires the same sort of literacy as the written word. For instance, it might be something for which fluency or participation takes other forms than "you must be able to create to be considered _able_". I think I agree that reflection is a good tool for handling unanticipated scenarios, and that local reflection allows us to incrementally adapt. But I don't think this is a complete vision. In fact, I see it as a remedy for an incomplete vision — reactionary rather than visionary. And as for self-organization, well... as we all know and all agree, (central) planning is the most efficient way to allocate resources, and self-organization at scale is anarchic and wasteful. (Come at me!)
(Disclaimer — I didn't watch the talk, because I live in a part of the world that doesn't have broadband, so if my hemming and hawing is cleanly parried preemptively by the speaker, kudos to them, apologies to you for the conjecture.)
w
@Kartik Agaram I like this idea of a gut check. It's a good way to jump right to people's values. For example, I can ask myself, do I want "all users [to] write their own code?" I imagine that world, and instantly realized if by "code" we mean the kind of programs we currently write, what with syntax errors, I do not wish for that world at all.
🍰 2
💯 1
t
I do subscribe to "all users write their own code" if we have a more expansive definition of what code is. I think self-organization is probably the most humane way to do that, though it makes understanding a whole system's behavior near impossible. (Probably a good thing. There are both good and bad surprises.) I don't know if reflection fits into my "perfect world". I could imagine a self-organizing system composed of little immutable atoms that can't view the innards of other atoms in the same system.
d
(For @Ivan Reese or anyone what who didn't watch the video, this response sums up a bit (although not all) of it) My understanding is that the list is Jim Coplien's understanding of the "perfect world" assumed by Alan Kay's original vision for OOP & SmallTalk (which, btw, didn't come to fruition as envisioned). I don't think that Jim necessarily subscribes to this as is, since he goes on to talk about how the Objects vision has failed. He suggests that that vision assumes that a system (s) can just "emerge" from many objects, rather than having a holistic top-down design (because that's what happens in biology: amazingly complex and adapted systems emerge and evolve from these amazing structures called cells). Essentially, if all the objects just "do the right thing", the whole system will just work (and hence SmallTalk being centered on editing / reflecting on individual objects -- oops, I mean classes). Much traditional "OO" code is built this way: all the objects (er, classes (oops!)) are designed to "do the right thing" (play their part on the whole system), which means that the behavior of the whole system is exploded into pieces, and divided up about the different (classes) (you do part A, you do part B), and the result is that there is no clear model for the system (or any one behavior/ use case) that can be reasoned about as a whole. He makes the analogy between all these classes, and an Egyptian pyramid which is "just all the building materials stacked on top of each other" (e.g. as compared to a cathedral, which is mostly empty space). He proposes DCI as a (temporary -- "finger in the dike") fix to the OO vision by offering a "context" container to house behaviors that span multiple objects, with the roles that each object-participant plays being defined as part of the context, rather than as part of the class that each participating object.
... But anyway, that's not why I shared this; the main reason is how he focuses on humanity and the original human-centric vision of OO, and how he talks about using the human model to shape our code design. I subscribe to what DCI is trying to do, but not DCI itself. I try to capture system behaviors (i.e. pieces of the human model / use cases) as single coherent whole pieces rather than chopping then up along classes; but I don't see a need to try to do that in an OO way, e.g. still associating each piece with an individual role. I just let the "context" (which might be an object, or just a function) own the whole behavior itself
But anyway, I think Ivan & Jim Coplien are asking the same question: does anyone actually subscribe to these ideas? Where does it hold up, and where is it a dead end? Something in my gut tells me there's something seriously wrong / missing here (paraphrasing Jim, although I feel the same way).
...and to answer them myself: * All users write their own code: Maybe any user should be allowed to do so if so inclined; but I think that's the wrong question or thought, in the first place. All so should be able to own & shape their own tools & environment in whatever way (and to whatever extent) makes sense. That can (and should) mean LOTS of things other than dealing with raw code. * We can use reflection to code unanticipated scenarios The intent is that code already written (and compiled) can be supplied with a new "instance" that was not defined previously, and still work. So there's code saying "give me some X that has behavior Y, and I'll tell it when to do Y". You can then give it some new definition of X that it never heard of, even long after it was built & compiled, and it works. Traditional class-based-OO does this with interfaces & abstract base classes / virtual methods; but there are other ways, such as dynamic types, ST-style message passing -- heck, even HTTP REST qualifies as that style of message passing. For me, that's more about how do you properly design a system in terms of composable units, rather than using some clever polymorphic mechanism. I think that a lot of times the latter is an over-used / abused substitute for the first. E.g. using inheritance and interfaces to glue parts of code together that should have been coherent whole units to begin with. Or having poor software design such that one thinks that inheritance and overrides are necessary to be able to change the code in the future, versus having coherent code that is easy to understand and make direct modifications to to begin with. * Local reflection ... similar to the above. * Self organization is the order of the day I agree with Jim that this is a dead-end substitute for actual concrete system design. But I highly believe in creating an environment that the user can own psychologically and do as they please with
... I don't do it on purpose, but I think the appearance of my reply might start triggering an automatic need to find a comfortable place to sit down for a while :)
p
Code and the ability to write it are not intrinsically valuable. It is bad that the state of software prevents most individuals and communities from developing (that’s a continuous process) tools that are well adapted to local needs, resources, and values.
For any kind of tool, it’s maybe 1-2% of users that actively shape the tools themselves. Those 1-2% should be distributed across communities of practice, not sequestered in rich, urban, western bubbles.
For me, design requirements for software flow directly or indirectly from there.
So this is a core decision for me in the “maze”. I want to start by designing for the things only “non-IT” people can do—solve real world problems—and then steadily push to see how much of what’s currently relegated to professionals can be accomplished by users.
👍 1
❤️ 2
Rather than change programming as it’s currently practiced so it’s more accessible, lighter, etc. I expect many of the core ideas to be the same, but not all, or in the same order, or realized in equivalent ways.