[Edu-sig] FYI: PataPata postmortem link

Paul D. Fernhout pdfernhout at kurtz-fernhout.com
Tue Nov 28 04:12:42 CET 2006


Ian-

Thanks for the comment.

I think the issue you raise is a really difficult one to resolve. If I 
understand the general issue correctly, when you are looking at a GUI 
interface with underlying processes, and a person wants to "see the code", 
the question is what to show them, and also whether to show it to them in 
such a way as they can modify either what they see right then, or what 
they might see if the restarted the program.

One thing I had sometimes dreamed about is mapping every pixel on the 
screen with a programming or debugging equivalent of a "Z-Buffer". But in 
this, call it perhaps an "S-Buffer", instead of storing Z-depth from a 
pixel on a polygon, you could associate a stack trace with every pixel 
from the process that last wrote to that pixel (you might even store the 
stacks of everyone who wrote to that pixel). So, in that way you would 
have a somewhere logical to begin to explore the system related to 
constructing each aspect of the current view. If you see a button on a 
screen, mouse over to it, hit a key, and immediately you are in the 
debugger with a stack trace related to the code that drew the button, 
which presumably would link to the button itself. You would need pretty 
much the entire stack since otherwise you would just end up with 
references to the polygon drawing routines. :-) Possibly not feasible with 
today's technology though -- you might need several K per pixel at least, 
and with a megapixel display, that might mean gigabytes just for that 
storage. Might be possible in a few years though.  Or might be feasible 
sooner for beginners if you restricted the window to, say, a 200 X 200 
size, or if you could do something clever related to not storing 
independent copies of each stack trace, since whole areas of pixels would 
likely be drawn by essentially the same common routines with the same 
underlying stack. Perhaps, considering that overlap, if you skipped the 
last one or two specific frames on the stack, you might be able to store 
such a "S-Buffer" with little more than an extra 10 megabytes or so for 32 
bit pointer for each pixel of a megabit display, plus maybe just a few 
megabytes for the really relevant stack? Something someone in academia 
might want to explore, perhaps as a student project, possibly. Of course, 
if you really wanted to do it right, you should save the state of the 
virtual machine in it's entirety when writing each pixel. So that is 
probably a few megabytes at least per pixel, or probably a few terabytes 
per display. Now I now what I'll be doing with all that memory the 
computer I buy in 2020 will have; storing a million similar copies off the 
same virtual machine. :-) Again though, with clever ideas like 
compression, storing checkpoints (like OCaml does) or using other 
approaches to VM design (the Pointrel System I wrote has a data storage 
approach in some versions which only adds data, never changes or erases 
it), it might be possible to reduce the memory demand for such a "complete 
VM state saving S-Buffer" down to only dozens or hundreds of megabytes per 
display, which is within reach even now. Even if this worked, you might 
still find exploring the system awkward if the system created objects in 
one place, but displayed them at another time in a refresh, as most 
systems do. You would still need then to work backward to figure out how 
the particular object on the screen got initialized. So maybe all you 
really need that is ultimately useful is an association of a graphical 
object doing th drawing with each pixel on the screen? And essentially, 
that is what PataPata does (and many other drawing-composition-oriented 
programs as well); it maps from a pixel on the screen back to a GUI 
widget, and then presents that widget in a browser. Anyway, I think 
perhaps there are some genral ideas to explore here.

Whether changes to anything you explored by picking a pixel from the 
screen were useful to modifying what you saw right then and there would 
have a lot to do with the underlying programming model. In the case of 
conventional Python GUIs, where you have a builder method that assembles 
all the widgets, it would really take a restart of the GUI (or at least 
the modified window) to map back from source to display. And any changes 
just made to widgets would not likely be easily saved with that model -- 
unless you pursued writing out object to source in some fashion similar to 
what PataPata tried. The notion of a Smalltalk image (a saved binary file 
representing the current state of a world of object) seems a much easier 
approach to support this kind of dynamic interface redesign, and I think 
that is one of the reasons I feel more productive programming GUIs in 
Smalltalk than Python; I rarely have to restart a complex Smalltalk 
application the way I often have to do with Python ones (unless you use 
various tricks, some of which I have posted on before to the Jython list).

While I did end up doing things "out of process" a lot in terms of editing 
the source file as text, I think the reasons I did it on further 
reflection could have had more to do with my confidence about the system 
then anything else. I was often making changes to key GUI components or 
other core implementation things (including file writing). If I was 
working as a "user" level instead of a "maintainer" level, I think the "in 
process" editing of windows using the hierarchical browser might have been 
a lot more satisfactory and appealing. But that remains speculation; still 
I think when I used the inspector to change things, I probably was 
thinking more like I was testing the system from a "user" standpoint.
Of course, the whole point of something like PataPata is to blur the line 
of "user" and "maintainer", so the issue is never that simple.

Thanks again for your conceptual help with key ideas in the project like 
using metaclasses to build prototypes; that part of going from source to 
prototypes I was very pleased with. :-)

--Paul Fernhout

Ian Bicking wrote:
> Paul D. Fernhout wrote:
> 
>>Just as an FYI, as a way to wind up the PataPata project (or at least one 
>>phase of it), I wrote a lengthy postmortem critique of the PataPata 
>>project to date, plus ideas for where to go from here. You can read the 
>>critique by following this link:
>>
>>"PataPata critique: the good, the bad, the ugly"
>>http://sourceforge.net/mailarchive/forum.php?thread_id=31111569&forum_id=48729
>>
>>Comments welcome.
> 
> 
> Thanks for putting this together; it's useful to know how this went, as 
> it was a fairly ambitious rethinking of Python development.
> 
> There's some similar issues being considered for OLPC.  Specifically the 
> laptop has a "view source" key, which (unsurprisingly) lets you view the 
> source of what you are doing.  What that means is application (aka 
> "Activity") specific, but a general Python solution is called for.
> 
> Of course it's a little hard to say what that actually should be.  Just 
> a text editor?  Not too exciting.  Really there should be a view of the 
> process.  And some way to manipulate the in-process objects and source. 
>   One thing I was unsure of -- and I think your postmortem confirmed -- 
> is whether it's really feasible to generally edit objects in-process in 
> a persistent way.  I'm inclined not to go so far, perhaps simply relying 
> on UI hints to indicate when the change is likely to be persistent. 
> It's fairly easy to edit a function definition persistently, for 
> instance, or add a function definition.  You can still explore and poke 
> around in the process any way you want, but you don't have complete power.
> 
> Of course, at some point you need complete power, which means editing 
> the source in ways that can only be meaningful when you restart the 
> process from scratch.  I'm not sure how or where to make that break. 
> OTOH, emphasizing clean/fast/easy restarts might be more general and 
> easier to implement than in-process persistent editing.
> 
> I'm also not sure what to build on, or what to use.  It's interesting 
> that you felt out-of-process interaction was successful.  This fits with 
> my own intuition that in-process stuff can be dangerous and fragile. 
> But I'm not that familiar with the details of how the interprocess 
> communication should happen; perhaps IDLE is a good place to start 
> looking.  Perhaps IDLE is a good place to start the development?  I 
> don't believe Tk will be available on the laptops, only GTK, and 
> probably not wx either, so that limits the possibility of reusing most 
> UI, though other bits of code might be fine.
> 


More information about the Edu-sig mailing list