My personal project can be found here: <https://gi...
# thinking-together
d
My personal project can be found here: https://github.com/d-cook/Objects But is perhaps better described here (at the specific entry linked to in this URL): https://www.cemetech.net/forum/viewtopic.php?p=270092#270092
s
Interesting stuff. I've been following the SomethingNew collaboration as well. The blurb on Objects resonates well with me.
Have you written up more details on the semantics of the object system?
d
It's been hard to keep up with the flood of connections that came out from SomethingNew, but I've just rediscovered this space (thanks to Ellen Chisa of Dark (go check it out)), and it seems to be the most prominent & active community so far, so I'm hoping to be more involved here. I might just keep SomwthingNew as a catalog. Of the catalogs I've come across, I've found Ivan Reese's visual programming codex quite interesting and useful for discovering new things (it may be how I found Dark)
I've struggled for years to describe what I'm after in a clear & concise way, perhaps because there's so much I want to do with it. But I can start with what makes my effort different from most others: It's about bootstrapping. There are endless ideas and tools that might improve software & programming in ground breaking ways. But each has its own strengths and limited context, and it takes phenomenal effort to "shoot for the stars", over and over as we explore one different avenue after another (the progression of Eve is a good example). Part of the problem is that in trying to (improve things), we are stuck with the same limitations that we are trying to break free from (e.g. those imposed by current languages & tools). Another part is that even for the successful few, that success is trapped in a limited context (e.g. the tool or the target language). Take Apparatus or Sketch-n-sketch for example: both make it MUCH easier to create dynamic visualizations than by hand or by code ... so why am I (or anyone anywhere) still resorting to anything else still? It's because: (1) How do I get that into MY program, or other project, or to interop with (or compile to) whatever rendering API I need to target? And (2) Those tools don't do everything in the world (nothing does!), so what do I do when I need to do something new (e.g. blurring)? I can't change the tool! This is where my approach to bootstrapping comes in, which I'll describe in my next reply
(continuing from previous) It might seem that the "escape" would be to create some tool (or language, etc.) to improve software/programming, and then remake the tool using the tool itself. However, this standard definition of "bootstrapping" does nothing to break free from the limited context of the tool. As a user, I still cannot plop the gains of your tool into some other context, nor can I alter the tool for my needs ... unless I want to work at the source code level, but then we're back in the same world we started in. Perhaps a magic tool-making tool? Nope, because that tool will have IT'S limited scope, and now you've just moved the problem up a level. The problem here is relying on one tool to edit another tool, ad infinitum. Thus, the solution I'm after is a tool that (1) can model or simulate essentially anything (e.g. Turing complete from a code and a visualization & user-interaction standpoint), (2) is the the engine is it's own modification, and (3) can interop with, or translate to, or port itself, to any other context (e.g. execution environment or language or data format). Once 1 and 2 are fulfilled, then 3 can be done using the tool itself. Now the whole point is really to allow the user to model whatever they what, however they want, in whatever context they want. But that's only possible if the end user has that same power over the tool itself. One thing I hope this provides is an environment in which many ideas can be cross-applied to immediately benefit from each other, and thus rapidly increase the rate at which new ideas & tools can be developed & explored. Moreso, I hope to provide such capabilities to people using software, so anyone can create & control the (software) world that they live in ... which is essentially what every facet of society is built on. That's the "Computer revolution [that] hasn't happened yet", as Alan Kay puts it -- imagine what literacy has done for humanity, and picture the same thing for computing (see also BV's "The humane representation of thought"). And it's also Christopher Alexander's address to restore "Living Structure" to the world (which he made at OOPSLA '96 -- find it on YouTube). I'll describe the mechanism in my next reply
❤️ 4
t
You seem to be describing a Smalltalk system :). You can already play with one at https://pharo.org. On top of that we built https://gtoolkit.com to enable the end user to put arbitrary interfaces on any object in the system. This creates a complete new experience through which you can both manipulate and understand the different parts through custom views.
👏 1
🤩 1
d
(Note: I just made my final edit to previous)
I get that a lot, and it's hard to explain, but ST only brought us half way there. Kay himself said that the point of ST was not to have ST itself, but to allow you to replace it with something better and throw it away. Kay realized early on that it had become too much of a language and strayed from the original Object Oriented goal (OO today does not mean the same thing -- it was about enabling user composition of software components, NOT as a programming mechanism involving classes). However, he was unable to change the momentum of the other devs, and by the time it was commercialized the battle was already lost (read "A brief history of smalltalk"). So although, yes, the underlying system is directly accessible and modifiable by the user (which is vital and a HUGE step forward), that model is still just textual code. From a manipulation standpoint, that is not fundamentally different from any other Turing Complete language (or at least any dynamic one, like JavaScript). That is not the kind of direct manipulation or literacy needed to spark the computer revolution. I'm not trying to rain on the ST parade -- it was one of the best things to ever happen in the history of software. But Kay himself is adamant that we are still decades behind what should have been possible, even then. He's one of my biggest inspirations, and I'm excited about exploring how to "get there"
... Now that I look closer at that link, I see that you have a tool that may be in the same vein as what I'm after. That's awesome, I'll give it a look! (and thanks for sharing)
(Sorry for all the edits; I simplified my response quite a bit)
(continuing about "the mechanism", as I said I would before) So now we're past the "what" and "why", here's the "how" (in answer to Shalab's question about semantics): Such a tool needs a way to represent arbitrary data & code, including its own. Textual "source code" will not do, because it must be parsed into structure before it can be dealt with in any meaningful way. Instead we need a direct representation that structure (e.g. an AST) to begin with. Essentially, a JSON / Lisp -like structure (lists, dictionaries, and simple values like strings and numbers). Thus, all that is needed is the minimum possible of the following: * A user interface for viewing & manipulating that kind of structure. * An interpreter and/or compiler, so that structure is actually runnable as "code". * All of the above is coded / stored in that "structure", and thus also exposed for direct user modification. (A small amount of low-level code is needed to make it work at all; but it is either embedded within and/or compiled from the high level structure). In my next reply (sorry, it will have an end) I'll explain the semantics of the built-in interpreter / structural code.
t
The model of an Smalltalk system is not textual code. It's objects, and the compiled code is captured as objects as well. You are correct in that a key aspect of Smalltalk is to be bootstrapped and deeply reflective. Pharo is a Smalltalk, but its model is different from the original Smalltalk. For example, the AST is the key element. It can be annotated directly. The textual representation is an input format, but it is not an essential one from the machinery point of view. Glamorous Toolkit is a development environment that extends the base language with a visual and interaction language to allow you to construct custom visual representations while you are using the interface.
d
(continuing from previous) The semantics of the built-in interpreter / structural code are straight-forward: Since everything in the tool (and anything that could be in the tool) consists of the same structural elements, the only possible actions that the code can take, is all the operations that can be performed on those structural elements. At the most fundamental level that's the basic CRUD operations (set, get, has? / exists?, delete), and basic arithmetic and logical operations. Tada! ... Ok, so maybe it's not entirely straightforward, since there are limitless ways I could have chosen to represent such operations. But I will say that after exploring different approaches and trying hard to derive the simplest model, I essentially arrived (unintentionally, but seemingly inescapably) at the standard LISP representation. Put simply: * Anything other than a list ("array") evaluates to itself. * A list is evaluated by evaluating each item in it, with the first item being the operation to perform, and the remaining items being the arguments for that operation. * The interpreter knows NOTHING about which operations can be performed, and instead looks them up by name from some "context". * The interpreter can be invoked with different "contexts", which allows for context-specific code / DSLs Furthermore, the same set of operations can be invoked either by code or by user interaction. I've since started a new project, "Interact", which is essentially the same thing, but is starting with the UI and working downwards, whereas my "objects" project is working from the ground up. In my next reply, I'll say a bit about intentions for this tool
(continuing from previous ... sorry, I mentioned that I am not concise) It might sound like I've invented a "language" with a LISP-like structure. However, that structure is NOT textual, nor is it intended to be "source code". It is just an underlying representation of generic code (i.e. an AST), of which the operations / commands / etc. are entirely customizable. Sure, it's executable within the tool, but it's also a stored representation that can be processed as data, generated dynamically, or sent as JSON. The point is to make the development, visualization, representation, or execution of software (or other entities like videos or images), completely moldable from top to bottom -- and the tools for doing the molding are also moldable. And not just for making and editing things, but this can actually BE the environment that one thinks of as "the computer". For example, the tool can be used to: * Build other programs * Be an execution environment itself, and add, inspect, or modify anything running in it * Alter the tools that the tool gives you to do any of these things. This can include how code/data is built, visualized, manipulated, and/or compiled or serialized to something else. This can include "languages", UI widgets, or whatever. * Immediately inspect or run / invoke any piece of code (and then do the same with the result that it generates). * Compile a common code format to any (or multiple) target languages, environments, or data formats. * Model & simulate full-stack (distributed) applications all in one place ("sandbox"), and then compile / generate to its constituent parts to be installed elsewhere. * Same as above, but actually host the application in itself. * The tool itself can serialize / compile itself (and all its contents) into another context. The result can be, a program that bootstraps the tool into existence in a new place (e.g. web browser or JVM / CLR); or code that can be embedded in another program; or a message sent to another copy of the tool somewhere else (e.g. on a different machine), which then recreates itself on the other side. These are just examples, and note that anything that can applied to a program can also be applied to the tool itself. This means that any other tool or approach for making, visualizing, or representing software or data, can be added to the tool and applied to anything else, and perhaps be combined with each other.
(revoked comment -- I had a false understanding of SmallTalk being text-based. I stand corrected! Thanks, Tudor. I am leaving the below portion as it was) Consider that the web is based on REST messages, and compare that to the user experience that actually comes out of a web browser. I think the same kind of thing can be done to change how we interact with code. The current state of programming is like replacing a web browser with a really good JSON viewer / editor, combined with the ability to send arbitrary REST requests. We'd still have access to the same "information" and the same ability to process"data" -- isn't that good enough? The only reason that we (as an industry) tolerate that for software development is because we don't know what's missing. And there is SO much more good visualization / UI of the underlying data, than spitting out a 1:1 representation. BV elaborates really well in his "Magic Ink" paper (link below), and I hope to open the door to exploring (with ease) that same space for code. http://worrydream.com/MagicInk
It looks like there is a lot of overlap between what I've described, and the Glamorous Toolkit that @Tudor Girba has created and mentioned earlier. I'm excited to see where it goes! Thanks again for sharing it! Also, my apologies for misunderstanding that ST (or at least Pharo) is not modeled atop textual code. It sounds like it is a prime foundation for developing a moldable system! Thanks for being patient & professional. I've run into "that's SmallTalk" or "that's Lisp", etc. quite a bit. I guess it's not that the technology was ever missing, just that the way people think about (and go about developing) software has been limited to a much smaller box than such systems make possible.
Hey Tudor, have you ever considered how what you are designing matches up with C.A.'s description of "Living Structure", or "unfolding wholeness" (as opposed to an unadaptable "good configuration")? Here is a video of his OOPLSA '96 address:

https://youtu.be/98LdFA-_zfA

And here is a modified transcript of it, with my highlights of what I find relevant (might be easier / more direct, but also biased by my interpretation): https://github.com/d-cook/SomethingNew/blob/master/Christopher%20Alexander.pdf?raw=true
t
First, please do not apologize for making mistakes. We are all here to learn, and making mistakes is a natural part of that process. And in this case, please also consider that when someone does not understand an explanation, the main problem might lie with the explanation. The work of Alexander had quite profound impact on my thinking. Smalltalk is the closest high-level programming model to the living structure idea (the other one would be assembler): you can only change a Smalltalk system from within the system. This paves the way to fine grained piecemeal evolution and it offers the environment for unfolding wholeness. However, as opposed to the real world, where the physical shape is tied with the physical thing, in the digital world that constraint does not exist and we can take advantage of that. A related concept that I find fascinating is that of habitability, coined by Richard Gabriel in Patterns of Software (https://www.dreamsongs.com/Files/PatternsOfSoftware.pdf): given that we spend most of our time inside a software system, it should follow that the software system should be habitable. Much like with the quality without a name concept of Alexander, habitability is not measurable. We need to feel it, and we recognize it when we find it. The way we feel about things is linked with the way we perceive, and the way we perceive is related to the shape of things. That is why I find the shape to be essential, in particular when it comes with software. From the outside, Glamorous Toolkit is a tool. However, we see it as a language with which you can mold that shape continuously, in an ever living structure.
s
Hi @Dan Cook, Thanks for the detailed response - the ideas are quite interesting and similar to things I've been thinking about. Sounds like you're working towards a VM environment that works with a structural substrate that is lower level than any specific programing language but higher level than byte arrays. This substrate can represent any (tree like?) structure, but the meaning of any depends on the context it is evaluated in. Also the structures could be visualized many different ways and visualizations could be shared between structures of many different kinds? Yes the ideas do have an overlap with the Smalltalk systems - they are VMs with persistent objects, as @Tudor Girba pointed out. Yet there are differences - it seems you are proposing the nature of the substrate is list/tree like, not classes/methods/objects? Also something like modeling a distributed app and then auto-partitioning it doesn't exist afaik. Yes, it could be built on Smalltalk but currently in ST the world you work with is still your local VM and nothing else. We'd need a network of VMs that can talk to each other easily and ship the software substrate around. Ideally this network would be presented as one unified world (MPORG style). Once you log in to this world, you have quick access to all the elements that exist and you could even 'view source' on any part of the tool itself to quickly jump to visualization (text or non-text) for the underlying structure that represents it. You could then modify it in place and publish it. Provenance on these elements would be automatically maintained. I don't think ST is quite there yet. For instance, how do you enumerate all the classes that exist? How do you create a new object? You can't just browse to a class and click a 'new instance' button - it takes a little reading, learning and writing code to do these things. Tudor said "the main problem might lie with the explanation" - this is true. But also do we need explanation? What does Pharo look like when you launch it? Does it even look like a collection of objects, or classes? Ideally the richer UIs would automatically be generated based on the structure they are trying to visualize, or some annotation (yes gtoolkit is getting closer.. 😄 ). Still, I think the biggest boost will come from this 'network of VMs' - we really want one shared world where we can easily share our ideas and artifacts. Consider how clunky it is to share a new class/object I create in ST compared to how easy it is to share a web-app that I publish. There are a lot of unexplored ideas here.
❤️ 1
👍 1
k
Thanks @shalabh, that was very helpful for understanding this thread.
A more tightly scoped citation on @Tudor Girba’s mention of ‘Habitability’: http://akkartik.name/post/habitability
❤️ 1