You are viewing archived messages.
Go here to search the history.

Konrad Hinsen 2024-05-16 08:09:21

In this tweet , Simon Wardley compares making software systems explainable via moldable development (my expansion of his reference to Glamorous Toolkit) to creating maps. That sounds like a very useful metaphor to me. Many of us are interested in or even working on visual coding tools, and I wonder what their take on this metaphor is. Maps are inherently visual, but they are not the territory, i.e. the code with all the details. To me, visual tools are obviously the right choice for creating maps, but I remain unconvinced about their appropriateness for code.

I am thinking in particular of Orion Reed’s recent demo of infinite canvasses as user interfaces. For making multi-faceted maps to software systems, that looks like a very appopriate representation.

Alex Bender 2024-05-16 11:21:06

can you please point me to that demo of Orion? I can not find it

Alex Bender 2024-05-16 14:20:48

thanks!

Alex Bender 2024-05-16 15:16:38

nice, thanks a lot!

Stefan Lesser 2024-05-17 13:58:56

Frederick P. Brooks in No Silver Bullet seems to have a perspective on that:

The reality of software is not inherently embedded in space. Hence it has no ready geometric representation in the way that land has maps, silicon chips have diagrams, computers have connectivity schematics . As soon as we attempt to diagram software structure, we find it to constitute not one, but several, general directed graphs, superimposed one upon another . The several graphs may represent the flow of control, the flow of data, patterns of dependency, time sequence, name-space relationships. These are usually not even planar, much less hierarchical. Indeed, one of the ways of establishing conceptual control over such structure is to enforce link cutting until one or more of the graphs becomes hierarchical.

I’ve been struggling with this before, and still haven’t found the time to put what I said here into a more concise and readable format, but the gist is: Maps are powerful because they help us navigate… ha… I guess I should just end the sentence here… but I wanted to say… navigate multiple dimensions at once. Wardley defines maps as visualizations where position and direction have meaning, so these encode additional information in a spatial way that we are very well adapted to intuitively understand. So not everything visual qualifies as maps in his (and my) view, especially the now ubiquitous infinite canvasses rarely encode meaning in position deliberately.

That power of such representations, however, can cause us to overlook that they all are just models of a reality that has more dimensions than included in the representations we are looking at. That’s why it’s easy for Brooks to just casually list a few different visualizations we can easily create for software which all highlight and leave out different aspects of the same thing. In conclusion, as long as we are not trying to look for the one ultimate representation but accept various different ones for what they do and don’t do, it’s a magnificent tool in our toolbox.

Brooks continues saying:

In spite of progress in restricting and simplifying the structures of software, they remain inherently unvisualizable, thus depriving the mind of some of its most powerful conceptual tools. This lack not only impedes the process of design within one mind, it severely hinders communication among minds.

Konrad Hinsen 2024-05-18 05:07:50

From the Moldable Development perspective, the question is not "can we create maps for software systems" but "can we create mappable software systems, by making the maps as part of the design and implementation process".

A meaningful use of the directions is indeed a major challenge, and I hope that Wardley will come up with something in the course of his work with Glamorous Toolkit.

Mariano Guerra 2024-05-17 11:33:35

An interesting video: The 100 Games That Taught Me Game Design

I would like to see "The 100 Applications That Taught Me Application Design".

Which ones are yours?

Eli Mellen 2024-05-17 13:10:06

I could list a whole bunch, but two that come quickly to mind are

  • Burning Monkey Solitaire (which yes, I realize is a game, but the way that it incorporated all kinds of noninvasive feedback mechanisms influenced my early thinking about UX design)
  • the Bonsai static site generator opened my eyes to a non-standard but still predictable way of designing command line UX, and showed me that maybe we can make programs that are more like an Emily Dickinson poem, and less like a dictionary.
Daniel Sosebee 2024-05-17 20:42:21

Loose set of thoughts:

  • could you make a type system that somehow captures all information possible about every value in a codebase? Like where the following is true: if typeof(a) === number, then typeof(a + 1 + 2) === number+3 !== typeof(a) …
  • I might want to “pin” and “unpin” my types - e.g. before refactoring a function, to “pin” its return type. If I had a more powerful type system like described in part one, I wouldn’t want to have to write out the whole type, I would want to just say “pin this such that whatever changes I make could not possibly effect the outcome of the function for any input, or else give me errors describing exactly what part of the input space no longer maps logically the same to the output space”
  • Another way to think of this might be to say, rather than writing tests, to be able to say “assume infinite test coverage of this codebase (and all tests are passing), now let me refactor things”.
  • I have no idea how this would work, but it makes me think of getting fractions into “simplest form”. Maybe you could get two functions into “simplest form” to test their similarity?

I wonder if anything like that exists, or if this is gesturing at some existing area of research?

Joshua Horowitz 2024-05-17 23:34:14

Some pointers which may (or may not) relate to your interests here…

re #1: Dependently typed languages let you put a ton of information about a value into its type. For instance, in Idris you can have a type Vect n a meaning “a vector of n elements of type a”, and then you can write an “append” function with type Vect n a -> Vect m a -> Vect (n + m) a . Using functions like this, you propagate information about the lengths of vectors as you perform computations on them.

re #2: Neat idea. This may be less ambitious than you’re thinking, but I can imagine an IDE feature saying “turn the inferred type of this value into an explicit type annotation”. That way, you can make types explicit before a refactor to make sure you’re not changing types as you refactor.

re all: Your interests here seem related to software verification and other “formal methods”. In case you haven’t seen that stuff, I’d suggest Dafny as an accessible starting point. It lets you write functions accompanied by logical specifications the functions are supposed to satisfy, and then to guide the system to proving that the functions satisfy these specifications. (Most systems like this cannot be automated in the same way that type inference is automated, because once you want to prove general properties of programs like “functions f and g do the same thing”, you get into things that are not computable in principle.)

Nilesh Trivedi 2024-05-18 01:40:24

Adjacent to this: There's even an extension of dependent typing, called quantitative typing that let's you track how many times (0,1 or more) a value has been consumed. Idris2 uses this: idris2.readthedocs.io/en/latest/tutorial/multiplicities.html

Konrad Hinsen 2024-05-18 05:15:41

a type system that somehow captures all information possible about every value in a codebase

First thought: "all possible information" about a value includes the value itself. And then you quickly get to dependent types, as Joshua Horowitz suggested.

A more difficult problem is exploiting all that information in a useful way, i.e. come up with useful inference rules. I doubt that a single set of rules, i.e. a single type system, can capture all useful inferences while remaining usable. Unfortunately, the dogma of "thou shalt not have any type system other than the one of your one and only programming language" is rarely challenged.