"Design" as practiced today by computer people tends to be heavily based on the idea of negative space: that good design is what's NOT in a system, and by extension, what is NOT ALLOWED TO BE ADDED to the system by a user.
A "design-heavy" system, then, is inevitably highly restrictive about user actions, lest they "ruin the cool design" by adding their own desired features that "make it messy".
But users WANT control over their own space.
Is there a "design" that empowers users?
@natecull I've built a few tools for users.
when you need reliability of tool, you wind up tending to limit the choices. and most prefer that sort of thing. reliability and choice are intrinsically linked.
When you kick off the shackles, you basically wind up accepting radical unreliability and the cost of fixing it yourself. Knowledge has a price basically.
Genuine wizard UIs are things like the CLI, emacs, autodesk, and a few others. They are unpopular.
@natecull now I want to be uber-clear. I prefer being a wizard, and having wizard tools, knowing enough to recover when I summon the bugs. There aren't a lot of tools like that because they aren't popular, and I recognize that preference, even though I think it's fundamentally problematic in a technological society.
@natecull Oh yes. The UI paradigm I am fascinating by but havn't explored in enough depth is the dwarf fortress paradigm. it's implemetned badly, but I think - I think! - it points to a possibility of interface that is substantially more powerful and profound than is currently in the WIMP paradigm, while retaining graphical power.
well, I can't explain what pnathan thinks is interesting
but I can tell you what *I* think is interesting!
in things like the overmap view, four keys match to up/down/left/right, and the chording involves another key
IIRC (I have to look this stuff up EVERY time I start playing DF again), lowercase moves around in the current zoom-in on a section of the overmap, uppercase for moves to adjacent sectors of the overmap
it's allllll keyboard, all of it. all.
and I will be honest, I don't play it often lately, but sometimes I get these stretches
there's a section of the basic interface that shows what options you have at this level of menu/submenu/etc., because DF KNOWS it's not rote learnable, really. way too complex for it. but after a while you don't need to 'see' the guide of what the commonly used keys do at this menu level, because muscle memory.
in a way, it's like Elite: Dangerous, but easier to get started with! ^_^
hypercard was an amazing thing and i still miss aspects of it, but language-wise hypertalk suffered a lot from mistaken ideas about english-like ergonomics, i think.
right, but that's not using X *as X* or to interact *with* CLI. It's using X just as a set of terminals for CLI that's completely unaware of X.
X, the system (as I understand it), does not use CLI. It sends and receives messages of its own devising and format but doesn't expose these to the user or use the CLI or pipe system to do it (except for some command options for programs which are mostly now ignored)
Tcl/tk, though, I think does use Unix pipes?
and yeah, X is a giant weird beast and i've never actually written code against it in any meaningful way, but i use stuff like xclip, wmctrl, dmenu, rofi, etc., to control facets of it pretty routinely, so it's at least situated in a cli & scripting-driven environment that i use to control my own space.
surely not one without substantial design flaws and a gnarly learning curve, but i refuse to accept systems that lack many of its properties, especially the ones that let me add and re-shape features.
Well, because X is about *graphical components* of which 'windows' are just one tiny, tiny subset
Like you might want your program to accept input from and send data to buttons? Grids? Charts? Images? Textboxes?
None of that is even really possible with the 'a simulated VT-100 running just inside a window' use case of X.
So CLI is not interfacing with X 'as X', just X 'as a VT-100'.
@dredmorbius @pnathan @brennen all of that though is probably possible with Tcl/tk and maybe with some of the oldschool CLI tools you mention? (which really, really don't get much press at all even among hardcore Linux fans)
like to properly represent the state of X as CLI I think you'd need at least an object model? cos things on the screen ARE objects, they have persistence and state
Maybe all I want is a modern Tcl/tk that works with all the shiny GUI toolkits and OOP systems?
@natecull @pnathan @brennen NB: I'm massively hampered in all this discussion principally by /never having really grokked GUI application design in the first place/. My sense of "application" has always been "something that works on a stream of inputs or polls regularly for state", but not "and presents this with a bow and cherry on top".
I could use pointers on some good books on GUI UI/UX. Don Norman seems to be one source. Brett Victor another.
It seems quite hard to think of how to encapsulate the IO flow and state of a GUI component.
ie the input stream could be a stream of events (mouse/keyboard or underlying widgets, data model) and a similar output stream... but it all seems a bit confused and intertwined compared to a simple script that reads a stream of records and writes a stream of updated records.
Could *maybe* separate the IO flow into 'channels' like 'standard output' and 'standard error'
and maybe MVC could be pictured at toplevel as:
(stream of view-modification requests + stream of model updates) --> UI component --> (stream of view-updates + stream of model updates)
but it still seems not right. It's a whole nonlinear *data* flow. And that nonlinearity is what makes it hard to modularise. Too many wires snaking out in all directions, all needing precisely matching sockets.
There is also the distinction between "nodal" utilities and "complexity hubs". The latter do stdin/stdout poorly, if at all (though some do in fact do it). Most complexity hubs have *multiple* inputs and outputs.
For sufficiently simple stuff, I write utilities that I'd otherwise use a spreadsheet for. E.g., summing a sequence, or generating univariate moments.
excel is a funcprog environment that
1., normal people use, and normal people use to great effect to get things done
2. actually offers a non-linear way to do programming; instead of a linear program, you operate on cells of a 2D space containing either data or formulae, and operating on ranges is easy
adding VBA was a terrible mistake that added complexity and inelegance
What if the whole GUI was like an Excel spreadsheet, and widgets were cells? They have a value, the value can be changed, it doesn't care how the value changes but if it does, that change propagates to all observers.
http://www.haskellforall.com/2014/06/spreadsheet-like-programming-in-haskell.html introduces this, http://www.haskellforall.com/2015/11/haskell-native-spreadsheets.html goes over the initial release of that lib, and http://www.haskellforall.com/2015/11/interactive-and-composable-charts.html goes over diagrams using it.
I'm contesting that it's a /good/ FPE.
It is *VASTLY* too error-prone and difficult to debug. Not to mention awkward. OTOH, *it is often the only tool available since "real" programming tools are denied to front-office workers.*
Ray Panko, Univ. Hawaii, has studied Excel errors since the 1990s:
Excel offers a *grid of code* model. That's hard to see, visualise, debug, QC, validate, etc.
It's *possible* to write Very Robust Excel. It's not *easy* to do so.
I'll also note that I'm talking of my own personal use: I'm not saying that *everyone* who has an Excel-like task should use Excel. I'm saying that when I've got a simple "accumulate a store of values, compute something, kick out report", I prefer awk.
I suspect this is because spreadsheets don't offer *grouping* constructs, which are pretty important for humans to organise information.
A 2D grid gets you a long way, but not really far enough.
If you had a sort of web of nodes which you could expand or shrink, and had a natural mapping TO a 2D grid if you wanted it...
the achilles heel is how bound the physical structure of the data is to the representation & interface, but maybe that's what makes it approachable. there has to be some way for a serious db to be as approachable as excel is, but i don't know what it'd be.
I think perhaps copying ideas from SQL for structure and drilldown would be interesting (another funcprog environment with good ideas, but clumsy tooling; SQL feels like funcprog if it were implemented by programmers who only used COBOL, and half the functions are missing - i'm convinced SQL is also why people swear of RDBMSes to the point of using Mongo et al)
those caveats do matter, though. my hunch is that mostly people get lured into garbageware like mongo because sql rdbms systems make manipulating schema a difficult, largely out-of-band sort of task relative to most of their interface.
@brennen @natecull @dredmorbius @pnathan see, I always think talking about "schemaless" is a red herring when it comes to NoSQL - it's really about SQL as a query language & about making the DB just plain ol' serialization of Plain Ol' Objects - this is easy for a programmer, and it's a *schema*, typed language or not
SQL is only lovable if you're a 70s DBA. I'd want a modern RDBMS protocol of sorts, that makes queries and serialization easy - with strict schemas, since the other end has those
@brennen @pnathan @dredmorbius @calvin yeah, a database where defining a schema is an out-of-band operation seems a little like a functional programming language where you can't pass functions to functions.
One of the defining characteristics of data is that it exhibits recursive structure: things inside other things.
RDMBSes in the SQL model, however, are built assuming that there are certain Things (databases, tables) which May Not Ever Be Put Inside Other Things.
@natecull @brennen @pnathan @dredmorbius well, hierarchial DBMSes exist (a lot of NoSQL can be considered as such) but then you lose the advantages of RDBMSes. the problem is that mappings in SQL between tables are clumsy. what if RDBMSes had typed pointers between objects that made it easier to related between objects between tables?
Relational 2D data is convenient. It does /not/ fit all sets of circumstances. Normalising hierarchical data may or may not be possible. And often you're dealing with a cross of "what is present state" and "what is most recently-added transaction" (or "what is the full transaction history"?)
At which point you realise that it was easier for the programmers *then* to simply duplicate the paper record in electronic form than to rationalise it.
so it's naturally a lot simpler to work with 'an object full of objects full of objects'
'a database, which I gotta get my RDMBS administrator to spec a server and provision for me and define a schema which if I ever then change I gotta file a helpdesk request to do it and butwhooops the user just put a new data type in and crap...'
ANYWAY, this thread is a lot of fun but now i'm going to go fuck around with a pile of music gear i don't understand, which is probably also a good place to think dark thoughts about the state of interfaces and modularity.
yes and yes.
I keep thinking that JSON is the new '80-column IBM card'.
It's terrible, but it's at least a defined 'plug shape and pinout'
so data stores are gonna assume it as the 'shape' of the data they store, just like 80-column screens and text files stayed the standard well into the disk and VDU era
@natecull @calvin @dredmorbius @pnathan @brennen To me, many of the problems of SQL arise because of how we use it: 1. Very restrictive with permissions. How much easier to solve problems if you can creat a ton of temporary tables. How much easier the queries. 2. Embedding it in apps. It’s like embedding vi in an app. Useless! But using it directly is cool. Like having awk and creating new files is cool. But better.
@kensanata yeah, perhaps. i do use (and like) sqlite for some stuff, but the limitations are real. i really haven't followed up on these thoughts by incorporating a relational db into much of my personal stuff, so i'm not honestly sure how much i'd feel those constraints if i just used sqlite for more things.
I think the argument is that SQL is a tool for working with and analyzing data like vi(m) is a tool for working with text files. So embedding SQL into a program artificially solves the problem by shoehorning in a tool's "interface" (magic strings) and at the same time introduces tons of second order concerns (sanitization, etc) as well as domain-specific middleware.
@dredmorbius @wrenpile @kensanata I think your statements/questions are orthogonal. SQL and RDBMS aren't coupled. No one is arguing against "SQL is a general data language". But is embedding SQL into binaries a good thing? Does that answer depend on ORM support for the language? Or sanitization libraries? Or sharding libs? I'd argue SQL-RDBMS coupling and SQL-as-a-general-data-language are orthogonal to these concerns.
@wrenpile I don’t mind embedding SQL in apps given that I don’t want two different ways to access data in a database. Being able to copy and paste SQL statements from source code and trying them in a general REPL is great for debugging. For people who come from a strict programming background (Java only for example) the embedded SQL (strings, no type safety, no compilation) is abhorrent. That’s why we have Java based QL now and it makes debugging hard. 😒
@wrenpile Haha. Well, what can I say. At the office they are all gung-ho about getting rid of SQL statements and replacing them with a QL that generates the statements and thus guarantees type safety (database tables generated from interfaces and bind variables generated from the same interfaces). I tell them that this catches the kinds of errors I don't make and makes my life more difficult regarding the errors I do make, but it's not helping.
So it's not /all/ that bad.
And there are any number of CLI / scripting languages that promote Very Bad Habits. PHP is notorious for this. Perl can definitely get you there. I've even heard C occasionally causes problems.
And, for that matter, contrast "X Power Tools" to "Unix Power Tools" The latter was indispensable, and even today remains highly useful despite being first published in 1993 (there have been 3 editions, through 2007). The former was ... dispensable, and seems only to have seen 1 edition.
Since you're dealing with what a person can *see* and *manipulate*, both *directly*, there's only so much bandwidth for information or control.
CLI has a vastly larger interface surface, if you will. The options are far vaster.
I have 1,000s of commands available to me from the OSX or Linux bash prompt.
My OpenWRT router: 660.
@dredmorbius @pnathan @brennen One reason for this is probably that GUI actions tend not to be joinable or linkable; there's no fundamental GUI 'grammar' for anything like the concept of 'two symbols separated by a space' in CLI.
other than 'drag icon1 onto icon2' for a kind of primitive 'apply icon2 as argument to icon1 as function', but it executes immediately, it doesn't give you a third object which is the result of combining the two.
Ironically: if you /start/ with CLI and toss a GUI wrapper around the elements, you can address some of this. I'd argue that a problem (and, more to come, quite probably advantage) is that one GUI tool cannot /easily/ "become a keyboard or mouse" to provide inputs.
First: think of the malware possibilties.
(X11 already had this problem: grabbing mouse/keyboard inputs.)
This is also usually test/QA stuff.
@brennen @pnathan @natecull That is, tools that /can/ automate GUI bits are generally used for testing and/or QA. I've used a few briefly a long time ago -- can't even remember names. OK, Selenium was one I recall.
The other problem is sorting out /what element you want to talk to / hear from/. You've got a bunch of crap on screen, there's no sense of pipelining or stdin/stdout/stderr.
Named sockets /might/ work.
I remember hearing that Amiga, and OS/2, and maybe NeXT offered much of this, but I've never really seen any particularly convincing demonstrations.
(OS/2 seemed to have a sense of "workspaces", though they seemed underwhelming to me.)
There's also the problem of preserving user state *within* GUI apps. *Even if I can fire up all the shit that I had open now, on reboot, I'd lose massive amounts of state.* Which fucking sucks.
(There's also the month+ old problem of a nuked Chrome Browser extension's user state that's been on my to-do list for that month+, though I have to dig into the fucking headspace of Chrome and the extension to see how that happens. The developer of the extension himself *does not know and isn't interested in finding out.* Fucking sigh.)
@natecull I'd argue restricted designs are more about supporting system growth/evolution and testability, validating options can be supported without weird edge cases, & that users won't suddenly lose favorite features, than it is about "coolness"
various web protocols have approached being as useful as bash CLI, but interoperability standards (like XMPP, RSS/ATOM) have tended to lose popularity just as soon as they've achieved mass penetration for inexplicable reasons
@natecull Unix? :P Seriously though, language-based design has always fascinated me, because humans invent words, subvert them, and expand them. We've tried to "design" them--e.g. grammar school, and on a whole 'nother level, esperanto--but always fail. It seems like when computers catch up to us, there will be something here for us to work with.
Basically any programming language is a user-control-oriented design. I only very rarely see graphical ones, because of artificial user/programmer divisions.
(There are a few I've used, coming out of Xanadu. Like, take a look at gzz. ZigZag is, from a user perspective, an overgrown note-taking system with too much flexibility, but the UX is very much for power users looking for a whole lot of control.)
@natecull My view of great design may well be described as a compromise between what you describe.
I'll practice the "restrictive" view for each individual component, in large part to avoid duplication of features. But the overall system should allow components to be freely combined.
Then again that design vision is very much what underlies the Unix shell, and it's "do one thing and do it well" mentality.
well, to be fair
> But users WANT control over their own space.
while true, think back to every designer/programmer complaining about clients who "want" things
a lot of time people "want" things they don't ACTUALLY want under any circumstances
I think it's why the "simple/advanced" settings paradigm has become so entrenched -- there's going to be people who wanna tweak everything, here you go
but for most people, going into settings is to switch one thing off or on, nothing else
and I'm not critical of the simple/advanced paradigm, either. I think it's a good idea. everything should have an easy mode, in a perfect world -- just as everything should be customizable if someone really wants to get in there and fiddle around.
it's just that, well: if most people tried to do car maintenance, it would be a catastrophe
@natecull I'm going to *STRONGLY* challenge your premise, though I /personally/ agree that /I/ want control over my systems.
*MOST USERS DO NOT.* The level of user sophistication is *exceedingly low*, and *well over half the population has effectively abysmally bad or no computer literacy at all.* Says research:
Hence: the tyranny of the minimum viable user:
@natecull So, this gets to a few related concepts:
1. *Interfaces* are the human end of a tool. (The other end is the working end.)
2. *Ideas* themselves are interfaces.
3. There are cognitive complexity limits that extend through a population.
4. Protocols and conventions themselves are a sort of language, and the ubiquity of these is a component of a system as a whole. There's a whole class of tools which are described as horrible ... other than the fact that everybody uses them.
@dredmorbius #2, 'Ideas are interfaces', is something that resonates strongly with me.
Turning that around (inside out) is a reasonably good explanation for what I would like to see in software:
* software interfaces which map cleanly to ideas *
I want a system that's an 'idea processor'.
* is something created by the user
* should not be a priori restricted or distorted by the system
* is composed of smaller ideas joined in a regular manner
* can be communicated to others
@dredmorbius This particular use case is where the 'big design up front' problem really grates.
A 'heavily designed system':
* does not let the user create arbitrary ideas but only ones approved and understood by the designer
* very much restricts and distorts ideas to fit the design, and sees this as a benefit
* prefers a small set of monolith preapproved components and often disallows linking and joining
* very often prevents communication for commercial reasons
@natecull There are "heavily designed" (though not necessarily "big design up front") systems that _do_ offer a great deal of flexibility. But they have to be designed to accommodate just that.
A key comes from one of my most underappreciated uni courses: linear programming. *The system's components and interactions must /lift/ rather than /add/ constraints.*
Any system of *increased* dependencies <coff>systemd</coff> will *increase* constraints and *decrease* options.
With one key exception.
@natecull A *useful* and *powerful* system of *protocols* and *standards* /does/ increase constraints, but does so *in the interests of interoperability*.
In doing so, it *lifts* the constraint *of inter-component compabibility*. That is, you don't have to go through a massive decisionmaking process *for each and every motherfucking element* trying to sort out if it will work with others.
"It just works."[tm]
(Debian Project unofficial motto.)
@natecull Well, /the fact of their near-universal ubiquity is itself a major element of their value/. It's one of several socialised / network effects (and means that rent can be extracted as a consequence, @garbados ping).
Ubiquity itself has value.
@natecull Then you get the dynamics of GUI vs. CLI systems that I mention in my Tyranny piece, that play into this.
CLIs have persistence largely because of their scriptable nature, and the facts that 1) scripts will break and 2) sysadmins REALLY FUCKING HATE THIS. So you Don't Break Scripts.
GUI doesn't have that constraint (though retraining costs are Very Large -- but also highly externalised).
So that's one angle on all of this.
@natecull Designs that empower users are generally modular, extensible, and show what Steve McConnell notes as strong cohesion and weak coupling ("Code Complete").
Look to architecture, housing, and mechanical systems.
Houses (and offices, at least in theory) are designs which empower users: they provide a basic /framework/ within which multiple tasks and activities can be supported. They don't generally restrict or limit what can be used within or placed within them.
@natecull They're highly customisable.
If you look at, say, specifically a kitchen, the types of things you can obtain that are very high utility tend to be very modular. Start with a heat source (cooker and range), water taps and sinks, a refrigerator, and storage for food, cutlery, crockery, and cooking tools themselves.
A chefs basics are knives, bowls, whisks, spoons, measures, scales, graters. The more general the better. *Avoid single-purpose gadgets unless the purpose is essential.*
@natecull The result is a highly capable, generally uncluttered, space.
Automobiles are complicated but to a fairly large degree rely on interchangeable components: tyres, spark plugs, oil filters, various light bulbs, batteries, etc., are bog standard and are highly interchangeable. You don't rely on the auto manufacturer for them.
Even manufacturers often come up with a standard powerplant, transmission, etc., and build multiple models around these. The "differences" are mostly cosmetic.
@natecull A huge problem with the software / systems space is that the manufacturer alignments are strongly *against* standardisation. If you're an ISV of some major piece of software, *you want its use to grow to consume all available user tasks.* The problem isn't in the software engineering, it's in the software *market* economics.
So look to that for the source of your problems.