Become a fan of Slashdot on Facebook

 



Forgot your password?
typodupeerror
×
Programming IT Technology

Complex GUI Architecture Discussion? 367

XNuke asks: "I have been searching for intelligent discussion (on dead trees or otherwise) of the issues involved in designing very complex GUIs. Things on the level of TecPlot, AutoCad, 3DS, etc, where there may be very many different views of the same data and there are many degrees of freedom for the user. I am not interested in 'where to put the buttons', but rather the nuts and bolts of making the 'Well Designed UI' work. I guess I am looking for a sort of 'Design Patterns applied to a big deskptop application' sort of discussion. It is no problem to find discussions of Model-View-Controller concepts at the component level, but at the application level there seems to be nothing. Too often the architectural level discussions encompass non-interactive, server side design issues and not the extremely chaotic problems a client side application with many degrees of freedom has. Short of wading through megabytes of source code for KWord et. al., does anyone know of any digested information? There is obviously no 'One Solution' to this, but there must be something out there."
This discussion has been archived. No new comments can be posted.

Complex GUI Architecture Discussion?

Comments Filter:
  • Human Factors (Score:2, Offtopic)

    by denubis ( 105145 )
    I'd recommend starting with Norman's The design of every day things. Then, if you're still interested, look over human factors resources. There are very large books that have been written on this question.
    • by Anonymous Coward
      Ive found Edward Tuftes books to provide a good basis for this kind of development. His focus medium is print (mostly) but I think the message is applicable to computer display as well. All Implimentation details considered, your biggest problem is the meaningful display of multivariate data.

      http://www.edwardtufte.com/290901521/tufte/books _v dqi
    • Re:Human Factors (Score:2, Informative)

      by kherr ( 602366 )
      Apple's got some great stuff in their Human Interface Design [apple.com] guidelines. And before anyone screams about hating Aqua, there is a lot of general-purpose information there regarding why things should be done certain ways.
    • by jaaron ( 551839 ) on Wednesday October 16, 2002 @03:55PM (#4463997) Homepage
      I've seen about 50 comments so far and all think the question is about User Interface design in terms of "Human Factors" as you mention. While Human Factors (and the book you mention) is important this is not what the poster is asking.

      The poster is asking about software archecture and design patterns. Think of it this way: Okay I want to code a new IDE, but I want to code it well. So what's the best way to get the UI to talk to the code that actually compiles the source code. Or another example: a database management suite. How do I best seperate the UI code from the code that actually talks to the database. And once I have them in seperate modules, how do I get them to talk to each other? This is a question about computer software design, not UI design (although, UI design is very important). The advantage to thinking this way though, is that when software is coded this way, people who do understand "Human Factors" and proper User Interface Guidelines can tweek and adjust the UI without modifying the underlying code that performs the logic of the application.

      The Model-View-Controller design pattern mentioned is a good start, although I'm not sure how well it scales to larger, more complex programs. (I'd love to hear from someone who has experience in this.) And of course the "Design Patterns" book by the 'Gang of Four' has other designs that might be more appropriate. Also, most complex applications will incorporate multiple design patterns.

      This is a very interesting question, one I've had before and I haven't found any good resources yet either. Perhaps the best resource would be to actually go through the code of a complex program like Mozilla, OpenOffice, or the like. Fun? Easy? Probably not, but you'd learn a lot.
      • How do I best seperate the UI code from the code that actually talks to the database.

        Actually, in this question lies the answer. On a sheet of paper, draw a line separating the paper into two halves. In one half write "UI Module" and in the other half write "Database Interface Module".

        These two modules can be written, so that the UI module uses only the public interfaces of the database module. This is the high level design of the application.

        Designing each module well is an entirely different challenge, since the quality of the database module's interfaces determine how resilient the application is to changing requirements.

        I guess the lesson here is that the really high-level design is trivial, but the design of each module is very hard and should be done by someone experienced in such things. Reading good books on the subject is only the beginning.
        • by badavis ( 83139 ) on Wednesday October 16, 2002 @04:25PM (#4464217)

          On a sheet of paper, draw a line separating the paper into two halves. In one half write "UI Module" and in the other half write "Database Interface Module".

          Actually, this is considered bad form in an OO design. The UI "Module" (classes) should only talk to the Model classes, while the Model classes may or may not talk directly to database classes. They may be mapped to database tabels thru an indirection layer.

          There is some great discussion of this at Martin Fowlers website [martinfowler.com].

      • The Model-View-Controller design pattern mentioned is a good start, although I'm not sure how well it scales to larger, more complex programs.

        What do you define as a large, complex program? A lot of enterprise software work done for F500 companies are built as web applications (Struts-esque) using the MVC pattern. These applications scale to 10,000 users (and more) and obviously run on some serious hardware setups. Most of the applications aren't that sexy...they really just streamline business processes and help (hopefully, but the cynic in me says doubtfully) save money.

        Anyway, back to the original question by the OP, there really is a dearth of information on the areas between architectural level patterns(MVC, blah blah blah) and the high level interaction-design/usability/experience world. I've found that in the software industry most of the nuts and bolts tend to be one-offs and specialized solutions, sort of whatever-it-takes-to-build-the-bridge. There are definitely existing toolkits, but when in comes down to it there's a buttload of unrefined work that needs to be done. Of course this is the case in any part of a significantly complex application.

        In my experience I've built some pretty nifty ways of building UIs and in some cases I've abstracted out a lot of the nitty-gritty. The interesting part, though, is that most of the clever stuff I came up with was already pretty much expressed in existing design patterns (GOF) or done the same way decades ago, just with different paradigms (web vs. mainframe, which addmitedly aren't too different). I guess my point is that these problems have been repetitively solved over time, but so little of it has been truely formalized in the same manner that other aspects of computer science and software engineering have.

        But honestly speaking user interfaces have really taken 2nd (or 3rd, or 4th, or -gasp- Nth) place to other topics in the ivory tower of computer science. Most kids coming out of CS undergrad programs are more excited about things like optimization, scalability, or building complex software like OSes and databases. After all, these are the hardcore, tried and true, well formalized product hallmarks of computer science.

        To get back on topic again, the OP mentioned being reluctant to wade through the source of KWord. It's a tedious activity, but studying how existing or even historical applications were designed can be highly beneficial. As I said above I've invented a new wheel quite a few times only to find out that it only mirrored a previously built solution.

    • Re:Human Factors (Score:2, Informative)

      by BohKnower ( 586304 )
      Look at what you shouldn't do, it is funnier.

      http://www.iarchitect.com/mshame.htm [iarchitect.com]
    • "I'd recommend starting with Norman's The design of every day things...."

      I wish the Slashdot coders had read that book. I got my butt jumped because I used ['s to encapsulate a bold tag instead of the typical HTML greater-than signs. According to some, my being used to VBulletin syntax (used by several forums I vist) is a sign of how truely stupid I am. I think it's a sign of how unfriendly Slashdot's interface can be.

      It's not a poke at Slashdot, but rather an observation that book helped me make about UI. Slashdot's just a handy example. Now, when I write web pages, I have a better perspective of the things I should do to prevent mistakes like the bracket example from being irrecoverable.

      Anybody who's interested in design should read that book, it helps you understand why humans make the mistakes they do and what you can do to accommodate them. Hint: It's not because we're all too stupid to read a manual.
    • Re:Human Factors (Score:5, Insightful)

      by bhforj ( 617963 ) on Wednesday October 16, 2002 @04:09PM (#4464080)
      Read his F'ing post man: "I am not interested in 'where to put the buttons', but rather the nuts and bolts..." [Do you moderators even read the posts carefully?]

      He doesn't want fluffy designer stuff. He wants to implement a complex U/I with multiple views on the same data. Designing the interface is trivial. Implementing it is the problem. His question has no obvious answer other than: "just jump in; you'll get it right on the 2nd or 3rd try like the rest of us."

      BTW, MVC is crap. It falls down for much smaller problems than what you're looking at.
  • by Zero_Satisfaction ( 242060 ) on Wednesday October 16, 2002 @03:14PM (#4463710) Homepage
    C:>
  • Re: (Score:2, Informative)

    Comment removed based on user account deletion
    • Re:HCI (Score:3, Insightful)

      by tomhudson ( 43916 )
      <quote> Lots of research on Human Computer Interaction. Google it and also check out the digital libraries at ACM </quote>

      Actually, Google's interface is one of the best examples of design and functionality going.Check out their cleanly laid out News area.Beats CNN, etc.

      That's got to have had something to do with its' universal appeal

  • For UI Reference (Score:3, Informative)

    by airrage ( 514164 ) on Wednesday October 16, 2002 @03:18PM (#4463737) Homepage Journal
    I've liked The Humane Interface: New Directions for Designing Interactive Systems, written by Jef Raskin. He was one of the early Mac engineers. This maybe a little higher-level than you are looking for though.
    • Re:For UI Reference (Score:2, Informative)

      by bluethundr ( 562578 )
      Jeff was a little more than one of the early macintosh engineers. He was the originator of the Macintosh project. The guy who decided to call the Mac a "Mac". Though he originally wanted to call it the McIntosh, there was a high level audio component manufacturer [mcintoshlabs.com] of the same name and Apple's lawyers decided to change the spelling of the name to "Macintosh". Though as Theodore Nelson pointed out in his classic geek opus Computer Lib/Dream Machines [digibarn.com], the name "Macintosh" if you actually followed the rules of English syntax would be pronounced "Mah-Sin-Tosh".

      I'm on a reading tear at the moment of old computer books where they are talking about the design of the interfaces that we have all come to know and love (books from a time when these were all new ideas). I plan on topping it off with Jeff Raskin's new book. [barnesandnoble.com]

      As far as actually designing interfaces goes, several of my friends who actually design interfaces for a living have claimed that this book [barnesandnoble.com] has been a tremendous help in providing a direction and design philosophy. Most people who design interfaces for the web, for instance, don't seem to ask themselves questions like "How would I design a telephone if I had never seen, never heard of what this device was or was supposed to do".
  • by Faggot ( 614416 )
    Macintosh gets UI design right with Interface Builder [apple.com] (which came from NeXTSTEP). I cannot recommend it enough.

    • Actually MacOS itself gets it wrong in quite a few places, for instance the muscle memory destroying zoomable Dock and the visually noisey stripes everywhere. They also vary the theme between aqua and brushed metal seemingly at random in their apps collection. This goes flat against their own HIG.

      Also, iirc Interface Builder is based on absolute positioning mostly, with guidelines to let you line things up. The technique used by Glade/GTK/XUL, box packing, has several advantages like being able to scale the GUI up to any size you like (good for resolution independance) in any aspect ratio and still have it look right.

      Anyway, I digress. I don't think this guy is talking about desktop design. He's talking about fantastically complex pieces of software, probably specialist stuff.

      I'd suggest he exames emacs and vi. Given that they have practically no GUI elements, they nonetheless expose a lot of functionality via the keyboard (and mouse too). It may be worth considering having a "lite" graphical UI and a heavy duty keyboard based UI for this question.

      • by Faggot ( 614416 ) <choadsNO@SPAMgay.com> on Wednesday October 16, 2002 @03:35PM (#4463888) Homepage
        iJesus God, please don't look to Emacs and vi for insight into good UI design.^[ZZ^J
      • by ZxCv ( 6138 ) on Wednesday October 16, 2002 @04:10PM (#4464089) Homepage
        They also vary the theme between aqua and brushed metal seemingly at random in their apps collection. This goes flat against their own HIG.

        If you would read the actual Apple HIG, they say that apps which are meant to replace a real-world item/function (such as Calculator, iCal, iTunes) should be built with the brushed metal look. All other apps should use the default, untextured look. Just thinking over the apps included in OS X, it seems to me like they follow this guideline fairly closely.
        • Hmm, interesting. I hadn't realised that was the connection.

          Still, it seems rather arbitrary. What does this distinction gain the user, when nobody other than those who know their HIG inside out can figure out the connection? Also, some of those app connections are somewhat dubious. What does QuickTime replace? A VCR perhaps? What about iChat. The closest analogy in the real world is a phone, but that's very rough indeed. If the Address Book is a replacement for a real world item, why is the text editor not (replacement for notepad)? I dunno, and don't really care to be honest. I was just pointing out that Apple are not the gui design gods people often assume they are.

        • by edremy ( 36408 )

          If you would read the actual Apple HIG, they say that apps which are meant to replace a real-world item/function (such as Calculator, iCal, iTunes) should be built with the brushed metal look.

          They break this numerous places: in fact, virtually everywhere.

          By the definition above, *everything* should be brushed metal. Word processor replaces pencil/typewriter. Spreadsheet replaces graph paper. Sherlock replaces phonebook/dictionary. Photoshop replaces sissors/paste/darkroom.

          If you try and tighten it down to obvious objects like iTunes replacing a radio, then why is iChat brushed metal? Why is iMovie brushed metal and Final Cut Pro Aqua? They do exactly the same thing!

          This is one area where Apple is just out to lunch. The HI folks had nothing to do with brushed metal: it's clearly a Steve "That's cool: go with it" decision.

    • Interface builder lets you place buttons and assorted widgets in dialogs. It doesn't design software architecture for you.

      Congratulations. You didn't understand the question at all.

      This is like somebody asking "Speilberg makes great movies - how do i learn how to do that?"

      And you reply "get a Panavision camera. Thats what he uses. They're the best."

      A tool is a tool, not a solution.

  • Map it out (Score:3, Funny)

    by PhysicsScholar ( 617526 ) on Wednesday October 16, 2002 @03:20PM (#4463752) Homepage Journal
    Use self-organizing maps for clustering.

    These work well with the visualization needs that you and your group have as well for the upcoming project; search the Web for the Kohonen learning algorithm and apply a simple summation over each term in the respective vector, remembering to square each quantity as well.

    This way, the topological view of your program's user interface will be well-refined, easy to navigate, and of a very high resolution (for CRTs, at least -- LCD monitors refresh too quickly and you may get relics [blurs] from high-oscillating models).
  • by Anonymous Coward on Wednesday October 16, 2002 @03:20PM (#4463753)
    I have been searching for intelligent discussion

    So you wrote into Slashdot expecting that? Please!

  • by fosh ( 106184 ) on Wednesday October 16, 2002 @03:22PM (#4463768) Journal
    Here at CMU [cmu.edu] they have a whole school in the school of computer science to deal with this issue. Check them out at http://www.hcii.cs.cmu.edu/ [cmu.edu] .

    They seem to have a bunch of projects relating to what you are doing here [cmu.edu]

    Good luck,
    --Alex
  • by paulfwilliams ( 410508 ) on Wednesday October 16, 2002 @03:24PM (#4463793)
    One common theme I've seen is observers and adapters. Your application components can be Observable. Observers register interest in them to get notified when the object changes. One problem of this approach is specifying the extent of a change. Just saying "I've changed!" isn't specific enough if that update would take a long time to process. If you can specify exactly what changed, then the Observers can process only what has changed.

    Adapters allow standard UI controls to embed domain objects without either layer knowing about the other. For example, say you want a tree to list Employee objects. The tree does not understand what an Employee is. However, you can make a tree that takes a TreeAdapter object that knows how to provde its name, subitems, handles renaming and drag-n-drop, etc. You can then make an EmployeeAdapter subclass of TreeAdapter that wraps an Employee and knows how to make a tree node out of it. If the EmployeeAdapter observes the Employee, it can handle changes to the Employee object.
  • by VisualVoice ( 592060 ) on Wednesday October 16, 2002 @03:27PM (#4463817)
    Find a good model and see where your needs diverge. When we started on a project like this, the UI was a mess until we based the initial design on an existing piece of software where the user interactions were similar in nature (e.g. office productivity app, multiple views of data = MS Outlook). So if your app has similarities to AutoCad, Photoshop, or any other commercially successful UI, use it as a starting reference model for your UI, and see where the needs of your users diverge from the UI model that app presents. To do this you need to generate typical usage cases, and rank them in terms of how often they will be performed, and make sure those operations are obvious and easy to perform. The other advantage to this approach is users will appreciate that it works just like "software app X" and won't need much additional training.
    • That's mostly true, and in general not a bad idea. Typically, consistency is good. Your example of Photoshop isn't a great one, though. Photoshop has one of the worst user interfaces I've ever had the nonpleasure of using. It's so bad I ran to the store to buy Paint Shop Pro. Photoshop may be powerful, the screens may be pretty and/or unique, the filters do what you want, etc., etc., etc., but it's so interface-challenged that it's operationally impossible FOR ME to pick up and run without practice and/or training. It may be fine for the devoted Photoshoppers, but it was not fine for me, and I suspect not for the average casual user. (And I'm not interested in a flamewar or Photoshop usage tips. I switched to the Gimp first but it's missing quite a few features I need. So I bought Paint Shop Pro and I now use it instead.)

      But again, the original question was not "how should my UI look" but "how should I architect my complex GUI application?" A previous poster mentioned Observers and Adapters, which I think is the best way to go with a multiple viewpoint app like his. I'd work to make this division occur at the highest level possible. I'd have Observers "register" with the viewed object requesting updates only when it changes. And I'd want this separation be so wide that it would even be possible to have the Observers running in a different process, or even connected via sockets from a different machine.

      Of course, that's just my opinion. I could be wrong.

  • by bubbha ( 61990 ) on Wednesday October 16, 2002 @03:27PM (#4463823) Homepage
    ...try "Constructing the User Interface with Statecharts" by Ian Horrocks. If the complexity you are dealing with is logic complexity rather than "...put the buttons here" then this methodological approach to UI/application state design may interest you.

  • by frank_adrian314159 ( 469671 ) on Wednesday October 16, 2002 @03:29PM (#4463841) Homepage
    ... especially if it is a very complex application that exists to do a single logically coherent - but complex - task. Instead of trying to fit into a WIMP/Menu/Command line paradigm, think of yourself building a control panel for the action. Look at information on industrial designs. But for God's sakes don't look at GUI guidelines for the platform you're building it for. The main argument for this is that you then have to train the user in your GUI. But, if the task is complex enough to need a complex interface, it's complex enough to require training to use. Finally, link the panel to conceptual actions, events, or information in the conceptual task space.
  • /. search (Score:4, Funny)

    by Anonymous Coward on Wednesday October 16, 2002 @03:31PM (#4463852)
    Welcome to slashdot.google.com!

    Too lazy to do a search yourself?

    Just have a thousand geeks search for you!
    • Re:/. search (Score:3, Insightful)

      by Hornstar ( 588411 )

      Welcome to assholeforum.slashdot.com

      The guy's already said he's looked everywhere for something similar, now he's come to the 'enlightened' forums of slashdot where the most helpful post some people can muster is RTFM. Since it isn't clear that there even IS a FM, maybe you can cut someone a little slack, offer a helpful suggestion or shut the fsck up.

      Technological eletism helps no one. If you think what he's looking for can be found on Google... find it and prove us all wrong. If it isn't exactly what he's looking for, you can go crawl back under your hole where we will all leave you to peacefully revel in your astounding ability to program in assembly, while your festering glee grows with your ever-expanding intellect.

    • kid: Mom, how do I spell "elitist" ?

      mom: Google it, you lazy sot!

      Boy I'm getting tired of hearing posts like yours every ask slashdot....
  • by Anonymous Coward
    I think some of the other suggestions miss your point. Peruse some of the Ben Shneiderman's books. They will probably give you more practical, specific, and useful help in this case than some of the other experts cited so far. Stuart Card deals with complexity as well, but some of that would be less practical.
  • by sapgau ( 413511 ) on Wednesday October 16, 2002 @03:34PM (#4463875) Journal
    I'm amazed sometimes on how easily a GUI is considered trivial or non-critical.

    For redundancy or performance reasons you want to have the same business rules executed on the GUI as well as verified on the server. The work required to set a trigger on the database is not the same for representing that on the GUI to the user. The amount of detail that goes on interactively with the user could hardly be managed directly by a server. Because of these I agree that more patterns besides the model-view-controler are needed.

    Currently I am on a project where a 'web' form takes 20 days to build but the store procedures that manage the data take 2 or 3 days.

    • by Angst Badger ( 8636 ) on Wednesday October 16, 2002 @03:49PM (#4463969)
      Currently I am on a project where a 'web' form takes 20 days to build but the store procedures that manage the data take 2 or 3 days.

      This is typical of UI issues in general, and I wish to heck more non-technical managers would realize this. The amount of coding and hard thinking that goes into making an interface reliable, idiot-proof, and easy to use can be truly astounding, and is often the largest part of implementing an interactive application. A ratio of 85% UI code to 15% non-UI code isn't at all unusual. Nor should this be surprising: interfacing with a database using a set of well-defined logical rules is almost easy compared to interfacing with the unreliable sack of semi-random chemical reactions sitting at the keyboard. Even when they're not clueless and stupid, people are among the most complex real-world phenomena any programmer will ever deal with.
      • by captaineo ( 87164 ) on Wednesday October 16, 2002 @07:15PM (#4465411)
        My experience definitely agrees... I've found that constructing an interactive (not necessarily graphical) interface to non-interactive code takes 2-10 times longer than writing the non-interactive code itself.

        I attribute this to the huge difference between batch processing and running an event loop. Programming languages are very well suited to "do this, then do that" style batch programs. But it is much more difficult to handle interactivity ("on click, do this, on keypress, do that") since you have to keep track of dependencies between internal data structures and the external interface.

        e.g. say you have a rule that when MyApp::toolbar_visible == true then the toolbar must be shown. But most programming languages don't allow this kind of declarative specification. Instead, you have to track down every line of code that modifies MyApp::toolbar_visible, and tack on extra code to hide/show the toolbar depending on its new value... Or, if you have a slider control that is supposed to reflect the value of some variable. You again have to track down every point where that variable can be modified, and insert code to update the scrollbar.

        MVC helps here, but it's still annyoing - instead of the simple "MyApp::toolbar_visible = true;" you end up writing something like "MyApp::toolbar_visible = true; MyApp::notify_toolbar_change();" Ideally you should only need the "= true" part, and the language runtime should figure out that the toolbar needs to be shown.

        I've seen some attempts to use declarative specifications for interface elements, like NeXT's interface builder and TCL's "watched" variables. But none of these are really mainstream. (I don't have much Visual Basic experience - is that declarative?)
        • by servo8 ( 572 ) on Wednesday October 16, 2002 @09:07PM (#4466048)
          Why not use accessor methods instead of exposing the variable directly? Then you could call your notify method in the setter for toolbar_visible.

          Some languages (such as C#, VB.NET, or Python) even provide built-in support for accessors -- this uses the same syntax as a regular field access, so it is transparent to the user.

          For example, in C#, you could write this as part of MyApp:

          private bool mToolbarVisible = false;

          public bool ToolbarVisible
          {
          get { return mToolbarVisible; }
          set {
          mToolbarVisible = value;
          NotifyToolbarChange ();
          }
          }

          and then later:

          MyApp app = ...
          app.ToolbarVisible = true;

          and it would call notify automatically.
    • For redundancy or performance reasons you want to have the same business rules executed on the GUI as well as verified on the server.

      I really hope those business rules are well-specified and documented. Otherwise the GUI and the server will never be in sync and no one will agree on the implementation. Sometimes, a development group must concede that they are incompetent at documentation and architect a system that favors simplicity over performance. Unfortunately, such self-realizing development groups are not common (if they are common, where?).
  • MVC is the pattern (Score:3, Interesting)

    by Anonymous Coward on Wednesday October 16, 2002 @03:35PM (#4463892)
    MVC is the pattern at a high level. There are generalized approaches which you mention in your question. The "complicated" UIs you are talking about - for graphics programs etc. are geared towards the sophisticated, committed and very busy professional who is using a vast number of tools and techniques to get their job done. A well designed interface of this type uses the "Direct Manipulation" approach on top of a large complex model (see Visio).

    Other common approaches are essentially Use Case driven and can be very directed (see Installshield). Or more generalized (see phpAdmin, /., many others).

    Also people are VERY particular about the kind of interaction they like for a given set of tasks. When I design a UI I use MVC (or more usually M VC) and map out my UCs very carefully and in a fair amount of detail. Then I do prototyping to prove the design/UCs (often the users cannot give a good description of what they want until they are sitting down and using something).
  • by t_hunger ( 449259 ) on Wednesday October 16, 2002 @03:36PM (#4463897)
    I really like the book "The Humane Interface" from Jef RAskin.

    I found it on amazon where one reader stated that "Once you read this book you will know why you have the programs you hate." He is right... I absolutly loath vi now (not that emacs is that much better of going after Raskin;-).
    • You say you "absolutly loath vi" after having read this book. Did you like it before? Because I find vi to be an excellent editor; it lets me keep my fingers on the keyboard where they belong and gets a lot of work done with relatively few keystrokes. And if you also liked it before reading the book, I would think it's sad to change your opinion just because a book told you so.
  • by Krelnik ( 69751 ) <`moc.gnirpsdnim' `ta' `yelrafmit'> on Wednesday October 16, 2002 @03:36PM (#4463899) Homepage Journal
    Check out anything by Alan Cooper [cooper.com]. His "The Inmates are Running the Asylum" is more of a rant than a guidebook, but still excellent reading. "About Face" is probably more of what you want.

    He would call what you are talking about "interaction design" not "interface design". The Inmates book makes a good case for how the two are different and why interaction design is a better approach.

  • by jukal ( 523582 ) on Wednesday October 16, 2002 @03:38PM (#4463907) Journal
    a couple of days ago we ended up thinking something like this with my work mate. This might be sci-fi, sorry :) but: What if, in the beginning, there would be no GUI at all. In the beginning, all of the users would only work with shell - they would whip in commands like "useradd -u 120 -g dls -d /apps/dls -s /bin/ksh -c "comment" -m dls " and after doing this they would tell the computer: I did this to achieve this. There would be some kind of fuzzy logic to make the computer understand how to utilize this in future - to make it generic. Then suddenly, you would only need to tell the system: do this. Well, the discussion did not end here, it included a kind of evolution model in which the operating systems would be connected in kind of P2P network - the new things that each of the computer users had taught would be distributed, evaluated and ranked. Some ideas would be killed, some would stay alive and evolve... the discussion did not end here either: how about, if in the beginning there would be no operating system at all - just the very raw beginnings of a kernel, and then the users would for example teach the system to boot....

    it must be something that we ate.

    • by Big_Breaker ( 190457 ) on Wednesday October 16, 2002 @04:00PM (#4464025)
      That is a great idea but its implementation would be extremely difficult.

      GUIs try to present the subset of options that are meaningful to the computer in a consistant manner.

      For instance if option B is only available if option A has been selected a GUI can help enforce that constraint. A shell type command line can't help the user make acceptable choices (generally).

      The graphical framework helps the user organize his internal thought process to work in harmony with the interface. That the interface pushes the user to think a certain way is part of why interface preference is very personal.
      • > GUIs try to present the subset of options that are meaningful to the computer in a consistant manner

        Yes, exactly. That's why I think the sci-fi story I presented should be called CUI (chaotic user interface :) it would use subsets of options to describe supersets of the options. Yes, very hard to implement but I consider this SETI@home :) in both cases we try to search for something that we know should be there but have no idea what and where to search for :)

  • by chaboud ( 231590 ) on Wednesday October 16, 2002 @03:39PM (#4463912) Homepage Journal
    Whenever you are visually representing data, and providing a means by which to manipulate the representation, consistency is paramount. If you have three object types: A, B, C that are represented in the same visual space, an action on A should have an equivalent effect if taken on B or C.

    This was the primary concern we had when I was working on Vegas Video [sonicfoundry.com]. At first, we treated audio and video differently, thinking that different media types would require different interfaces, but we quickly realized that most actions for one media type had a corresponding action for the other (i.e. Fade out). When a coherent interface element did not exist, we extended the user interface for the given media type. We never allowed an interface element to exhibit different behaviors for different media types.

    Of course, Vegas Video is not the end-all of user interfaces, but I learned a lot about simplicity and consistence in interface design.

    It's the difference between a complex application and a powerful one.
    • by sahala ( 105682 ) <sahala@@@gmail...com> on Wednesday October 16, 2002 @04:07PM (#4464065)
      Just to piggy-back on the parent... Whenever you are visually representing data, and providing a means by which to manipulate the representation, consistency is paramount. If you have three object types: A, B, C that are represented in the same visual space, an action on A should have an equivalent effect if taken on B or C.

      Jef Raskin (who wrote the Humane Interface) referred to this as using "modes". He strongly recommends that modes should be *avoided*. A lot of software developers build UIs that *wrongly* expose the internal representations of the data used by the application.

      In the Vegas Video example obviously sound and video are quite different types of data. To users, however, both are just media that they want to string together in some dramatic order. Users don't want to worry about whether they're in Audio Mode or Video Mode.

      I saw a few posts above that mentioned Raskin's The Humane Interface, and I strongly recommend the book. Some of the book can get a bit dry (particularly the usability testing methodology) but the higher level conceps are very sound.

    • by Anonymous Coward
      I'd actually been searching around for something like this too and havent' found it, so it's been a trial and error thing figuring out a pattern for my app.

      What i've found to work is to use MVC in spirit but split up my application into

      + Tasks
      + Models
      + Controlers
      + Actions
      + Views

      That's supposed to be a tree. This design came out of planning, reviewing the app's purpose, and environment constraints. I am developing my app in java/swing and i took the strengths it had but combined them into higher-level structures to help me make the app more modular.

      Basically,
      Tasks are general tasks that the user will perform. For example, an administrator managing customers of a web store.

      Views represent the actual UI: trees, tables, text areas, fields, etc. Views register with the Tasks for appropriate model change notifications. I can provide a variety of views for my tasks and data, and incorporate tasks into higher tasks with complex views.

      Actions represent the actual actions that a user will perform in that task's domain. for example, in the Administer Customers task, the user can "Delete", "Add", "Search For", "Edit" customers.

      An object for each of these tasks is created and given a string representation, an inconic representation, and it implements the ActionPerformed function. this is taken straight out of swing.
      Actions are then registered into the views and ui elements.
      for example, in my customer manager window i provide a menu, but also buttons across the bottom. So now one action can provide the title of the menu or button text, the icon for the button, and the state for both menu and button.

      finally, when either the item or the button are selected my one action gets the notification.

      The action then trickles the command up into the task where the logic for enabling/disabling ui elements resides.

      The Task then notifies the model (my data) so that proper manipulation can take place. Finally the model notifies the task and the task notifies the uis and actions for appropriate state change (enable disable commands) and view updates (change data in tables, etc.)

      it works pretty well, and i've managed to extend things without having to code complex application state notification or validation so close to the UI. it works nicely in java/swing because up until recently most UI coding had to be done programmatically (didn't use resources like a windows rc) so i can tie UI objects fairly easily to controls. but i'm still not happy with it. however, it was the best i could come up with in a pinch.

      hope this helps. /r

  • One Word (Score:5, Insightful)

    by Quirk ( 36086 ) on Wednesday October 16, 2002 @03:44PM (#4463931) Homepage Journal
    Emacs
  • UI Resources list (Score:5, Informative)

    by tbonium ( 521815 ) on Wednesday October 16, 2002 @03:48PM (#4463962)
    I found this list to be very helpful:
  • maryland HCI lab (Score:2, Informative)

    by Anonymous Coward
    pretty big HCI lab at univ. of maryland, college park, with lots of research publications and such. check it out at http://www.cs.umd.edu/projects/hcil/index.html
  • Some useful links (Score:2, Informative)

    by PetiePooo ( 606423 )
    I'd check out material from Google [google.com], Amazon [amazon.com], The HCI Bibliography [hcibib.org], NASA [nasa.gov], the W3C [w3.org], and Joel [joelonsoftware.com] for starters.

    While some may scoff, the ACM [acm.org] has an article on the Windows 95 interface, a little bit aged by now. Though many in this forum dislike Microsoft for its other faults (the constant crashes, draconian business practices, etc.), a big part of their current success comes from the fact that their user interface is simply easy to use. They do their homework [microsoft.com] when it comes to that.

    My mom couldn't spell WWW when I set up my parent's computer for them a couple years ago. She complained that IE wouldn't go to the website after she typed in the address. It took me a while to realize that she wasn't pressing Enter when she finished typing the address in. That's why they have that little "Go" button next to the address box that I always get rid of right away.. Duh!

    This is a noble quest, young hero. God speed.
  • by Scott E. Johnston ( 524335 ) on Wednesday October 16, 2002 @03:52PM (#4463982)
    Looking for Design Patterns for complex interactive applications with multiple views? Take a look at the thesis work of John Vlissides, one of the Gang of Four: http://www.ivtools.org/ivtools/unidrawinfo.html [ivtools.org]
  • by Fnkmaster ( 89084 ) on Wednesday October 16, 2002 @03:55PM (#4463998)
    Okay, the moderators are on crack today. Read the question - it's NOT a question about "where to put the buttons" (i.e. HCI/UI design) from a UI designer's perspective. The question is about proper development and coding practices (including design patterns more interesting and complex than just MVC) for building complex GUI apps, presumably from the perspective of a software developer working with a designer, or given a UI design that is already known to be good.


    I think part of the reason such discussions seem to be lacking out there is that each GUI toolkit has its own way of conceiving of event-based GUI interaction, and separating the presentation of a GUI element from the logic that handles it. Thus there is no real standard set of design patterns for GUI implementation (there are tons of sites I found using Google on GUI "Design Patterns" which are basically just HCI best practices for communicating certain kinds of concepts). For example, Qt uses the signal-slot mechanism. wxWindows uses EVT_ macros to associate an event with an action method. These encourage different ways of structuring GUI code.


    I am not saying it's impossible to come up with a set of rules of thumb for general GUI development and implementation in the same way that general design patterns for OO development exist to solve certain kinds of problems that are commonly encountered, but I'm doubtful they would be as useful as you would think.

  • Some references here (Score:5, Informative)

    by JAS0NH0NG ( 87634 ) on Wednesday October 16, 2002 @03:56PM (#4464001)
    Here are some references:
    • Dan Olsen's Developing User Interfaces. Dan Olsen is a professor of Human-Computer Interaction, formerly at Carnegie-Mellon, now at Brigham Young. his book describes the nuts and bolts of the internals of GUIs, including rendering models, event queues, event handling, graphics, and so on. Depending on your level of expertise, it may or may not be useful.

    • If you have access to ACM's digital library, check out the proceedings of CHI and UIST. CHI stands for Computer-Human Interaction, and is the main conference in that field, and looks more at design issues and evaluation. UIST stands for User Interface Software and Technology, and looks more at the implementation issues. There are several papers there describing the design and implementation of several complex systems.


      (If you have access to a university library, you can find those proceedings there as well)

    • Following up, check out the work of Bill Buxton. He and his students at Toronto have done a great deal of work with 3D interfaces. In fact, Bill Buxton also works at Alias | Wavefront, who create lots of tools for 3D modeling and rendering.

    • I'd also suggest looking at the Virtual Reality work done by others. I suspect that they have many issues in common, although the interaction is clearly different. Check out Alice by Randy Pausch and others (at Carnegie Mellon). Alice is sort of like Logo for 3D worlds. Fred Brooks, of Mythical Man-Month fame, also does work in this field. (I don't study virtual reality, so I'm not as familiar here)

  • by tswaterman ( 575957 ) on Wednesday October 16, 2002 @04:00PM (#4464021)
    Look guys, the question was about application architecture, not about GUI design, button layout, color schemes, etc. So, in that vein...

    You mention MVC. This is a very useful abstraction, but you're right in saying that it doesn't address the larger question of application architecture. One kind of global abstraction that seems to help for large interfaces is some kind of messaging system. For example, you can use a global queue of update events (sent by Models when things change) which all interested Views can lsiten to, and react accordingly.

    Some real problems come when you want views to react to changes so some other view (but NOT the underlying model data). e.g. changing from 2d to 3d display, you might want various menus to appear, disappear, or have entires change/gray-out. This breaks down the MVC abstraction to varying degrees.

    At the end of it all, I also haven't seen much in the literature on architectures for large GUI apps. I think this is because very few of them are really ever produced. Most apps you see are, at the base of it all, fairly simple, and require only one or two views with pretty straightforward control architecture.

  • Let your users do it (Score:2, Interesting)

    by Anonymous Coward
    If my experience is any indication, people who implement complex applications are not necessarily the best people to figure out what the user will do with them or how the user will wish to interact with them. You can write an initial GUI, but expect it to be lacking.

    One strategy to address this is make your whole GUI scripted. Implement all GUI commands with script language bindings, and implement your GUI as a script in this language (this can be done with Perl, Python, Tcl/Tk, etc.). Provide hooks for your users to create their own comands and extend the GUI as they wish. Now you don't have to figure it all out, because your users will.

    This model is used by many complex applications, such as IC design CAD frameworks (with which I am familiar). Just make sure you don't fall into the trap of thinking you need your own scripting language. Use an off-the-shelf language.
  • My thoughts (Score:5, Insightful)

    by estar ( 261924 ) on Wednesday October 16, 2002 @04:11PM (#4464095)
    I am a designer for a CAD/CAM program that is used to control and make parts for metal cutting machines. The first thing you will need to realize that these types of application are considered vertical market applications.
    Everyone has a use for a word processor but not everyone has a use for one this programs but when you do you need it bad. When you design the architecture and the UI you need to keep flexibility in mind. This is not so much for the user but for you so you can met the needs of a SPECIFIC customer. It is my experience that customers really want the vertical market software they buy to aid their current way of doing things, not to change what they are doing to meet the needs of the software.

    A specific industry has a lot of common needs but there is enough variation that if you don't design flexibility in mind it will drive you crazy with tech support and lose buyers who can't get the software to do what they exactly want.

    There two things you need to consider for such programs. The architecture and the UI.

    I following many of the standard advice on designing UIs but here are a couple that I try to keep in my mind.

    1) Keep the focus of the screen in the center of the screen. Try to add widgets to the top AND bottom to keep the screen's focus in the center. For example there was a version of my software where the sheet of metal was bumped down so that it's center was a lot further down then the center of the screen. This is bad. The next version I redesigned that screen so that the widgets were equally distributed between the top and bottom. This way the user's eyes when they move to the monitor has the sheet exactly where it is needed.

    2) Work-flow, you should provide either a means via keyboard or mouse to accomplish common tasks. You can do one, the other, or both. However what you shouldn't do is mix the two. If the task has keyboard components you should try to enable the user to complete the task without moving from the keyboard. The same for tasks involve the mouse. Tasks that involve a lot of moving from mouse to keyboard leave user unhappy.

    Try to have a keyboard way and mouse way to do all tasks. Sometimes it isn't possible but if it is do it.

    3)Softkeys, toolbars are nice it is my experience that users respond better to text then icons. User like big fat buttons on the screen. What I come up with the idea of softkeys. If you look across the top of your keyboard it probably has 12 function key arranged in groups of 4. What I do is have eight buttons on the top or bottom of my screen split into two groups of four. The first four correspond to F1 to F4 and the second four to F5 to F8. I use F9 to F12 for special actions. F9 is generally used for "flipping" the softkeys. This give me room for 16 commands per softkey group.

    On the more complicated screen I have multiple groups of softkeys. For example Zoom, Cut, Edit Path, Sketch, Rotate, etc. Each having up to 16 commands. I also provide a way to switch between the groups.

    The advantage of this that the user can see exactly what they can do in front of them. They can use the mouse to click on the command or use the corresponding function keys. While I do use some toolbar buttons most of commands are accessed through the softkeys.

    4) Make important tasks very easily accessible. Use single letter or buttons to tie into the task. For example Edit Cutting Parameter is a command often used in my software. So I tie it into not only a softkey but a toolbar button accessible no matter what softkey group you are in.

    Architecture.

    First get Design Patterns and Refactoring Software, regardless of what langauge you use they will be very useful.

    The goal of Architecture is to have flexibility to meet customer needs without introducing a lot of bugs into your software because you changed something. I am not sure what to call what I use but it builds heavily on Design Patterns.

    Data Structures
    Application Structure
    UI Interface
    Commands/Installable Libraries
    UI Implementation
    Graphic Framework

    Data Structures (Sheets, parts, etc)

    Application Structure (I use an idiom of Jobs comprised of sheets with parts, with a separate Shop Standard that is refered too by all Jobs, and a list of installable libraries ).

    UI Interface (nothing but Interfaces)

    Commands (these use the command pattern to implement )
    Installable Libraries (like reports, part creation, file types, etc)

    UI Implementation (implements the UI interfaces with methods accessing commands and libraries).

    Graphic Framework (Delphi, Qt, KDE, Gnome, VB Forms, etc).

    The reason for UI Interface -> Commands -> UI Implementation is so that commands that just manipulate the UI (switch screens) can be written. The actual implementaion is last because the implementation needs to know what commands are available to assign to various screens and widgets.

    I hope this helps

  • GOF Design Patterns (Score:3, Informative)

    by jimmyCarter ( 56088 ) on Wednesday October 16, 2002 @04:11PM (#4464097) Journal
    I guess I am looking for a sort of 'Design Patterns applied to a big deskptop application' sort of discussion.

    Then The GOF Design Patterns [hillside.net] may be what you're looking for. The case study used for most of the pattern illustrations is that of designing a word processor -- which is no simple feat. A lot of these can be extended to any type of a UI architecture.
  • Fitts's law (Score:3, Informative)

    by golrien ( 528571 ) on Wednesday October 16, 2002 @04:12PM (#4464101) Homepage
    I haven't seen this URL posted yet (I thought it came from Slashdot a while ago, but I guess I was mistaken :) Be sure you can answer all of these questions [asktog.com] before you even start to think about GUI design. I agree with pretty much everything the guy says. One other thing, be sure to keep to conventions wherever possible. For example, people are used to having the Exit command at the bottom of the File menu, so (unless you're doing something completely different, as you may be) don't stick it anywhere else. Little things like that make programs more intuitive. And one other thing: make it as unlike Blender as possible :)
  • KPT (an Adobe Photoshop plugin) had a revolutionary GUI illustrating some of what you mention. Unfortunately, it wasn't as intuitive as one would hope, but, like anything after using it for a while you get used to it. Somethings actually worked more intuitively than others. Perhaps you should give it a look.

    It was sold by MetaCreations to Corel/ProCreate, and you can get info here:

    http://www.procreate.com/product/kpt/ [procreate.com]

    Good luck!
  • You should check out the developer docs for Alias|Wavefront Maya, it is the most complex GUI I know of, and their hotmenus and marking menus are totally awesome (and patented so you can't use em, unfortunately). I think there's some docs in there on APIs for the menus and the overall design structure, but there's so much junk in there, I've forgotten.
    You should probably also go through past issues of the SIGGRAPH annuals, there is a ton of GUI discussion in there, albeit scattered around everywhere, sometimes buried in nonGUI-related articles.
  • Hmmm...I don't know where to see this information documented so I can't point you to a book or website - sorry.

    When implementing semi-complex interfaces, certainly not on the level you require, I've created multiple controllers and not just relied on one. I've placed the controllers at the process level so that not only processes know how to manage and update themselves and their views but they know how to interact with other processes sending messages back and forth for other processes to update themselves and their views. In fact, on a number of projects I've started with a base class ProcessManager and created specialized managers from there.

    I know this is only cursory information. Perhaps it will help you while you think about your direction.

  • Interesting GUIs (Score:2, Interesting)

    by FuzzyDaddy ( 584528 )
    Some of the more interesting GUI interfaces exist on "niche" software for engineering.

    One example of this (among many, I'm sure) is SolidWorks. It's an expensive (few ~k$) piece of design software for drawing 3-D pieces and assemblies. What makes it distinct from AutoCAD is that, rather than keep track of where each vertex is, you keep track of relationships between parts. It turns out this is a bitch to learn but a real pleasure to use. When doing a mechanical drawing, the relationships are the critical piece. The genius comes when you want to change one aspect of a design (the length, say), and it automatically ripples through the entire thing.

    I mention this long winded example only to point out that an interesting GUI is one that tackles an interesting problem. And these are often found in software that is sold to designers and engineers (smaller market, bigger cost). The few times I looked at an interface and thought it was very well done, it was because it was well tailored to the particular problem at hand.

  • by djohnsto ( 133220 ) <dan.e.johnston@gm[ ].com ['ail' in gap]> on Wednesday October 16, 2002 @04:18PM (#4464154) Homepage
    Apps like 3DSMax, Maya, and even MS Office and Visual Studio use scripting on the back end of most of their GUI's. The application is nothing more than than a large script interpreter with compiled modules exposing their interfaces to the scripting language. The GUI then just binds dialogs and pretty pictures (buttons) to various script methods. This also allows one to write macros and other small programs in a resonably complex language. In Maya at least, you can open up the script window and look at the commands and output of everything you do!
  • by jdrumgoole ( 576839 ) on Wednesday October 16, 2002 @04:20PM (#4464176) Homepage

    I appreciate the original authors appeal. There aren't any good books on complex GUI design and implementation, unlike for instance the UNIX Operating system. In the Demon Book ( The Design and Implementation of the 4.3 BSD UNIX Operating System, Karels et al) they delve into all the ugly detail of the design, the history, the mistakes and the many attempts to fix the mistakes (particularily in the memory manager). The strengths of the Linux kernel derive significantly from this book and other similar tomes (there is one for System V whose name escapes me at the moment).

    However in UI design if you've got a map and compass you can consider yourself lucky, but you still have no idea of the terrain or the topography. Throw the concept of MVC at a novice user interface designer is about as useful as saying "demand paged memory" to a budding OS designer. It just doesn't reveal the true challenges of the problem.

    In order to get your head around that you need to consider what the users conceptual model is e.g. how are they going to approach the problem you software plans to solve. Both AutoCAD and Word have a head start in this regard as they could draw on the experience of the users who lived in those domains (technical drawing, and writing and editing) prior to the entrance of those programs. (AutoCAD also has Ivan Sutherland to thank for his ground breaking work in Computer Graphics, this is the man that invented rubber banding as a line drawing concept). Visicalc on the other hand had to invent a concept from scratch in order to provide the desired utility.

    Once you understand the basic model you need to understand that the model changes as you move from user to user and also changes as users try to achieve different things with the software. It also grows with their experience. The stuff you need to get started as a novice Word user you almost never use once you are proficient with the program which is why all us dyed in the wool slashdotters constantly bemoan the Word animated paper clip. However the big bad world of first time users love that stuff.

    Therefore you program needs to grow with your users, starting simply and revealing itself slowly as their knowledge grows. At its most complex it must allow skilled users to perform their jobs effectively while still remaining true to the unifying paradigm defined by its conceptual model.

    The best research in this area can usually be found in the ACM conference proceedings particularily those associated with User Interface design. You should also check out Mark Lintons work on "Interviews" (try http://www.berlin-consortium.org/docs/papers/toolk it.pdf for starters)

    I have to admit tho' its a hole in the technical literature in general...

  • Architecture Answers (Score:2, Informative)

    by badavis ( 83139 )

    Check out Martin Fowler's Enterprise Architecture Patterns [martinfowler.com], some of them can apply to any type of GUI. The MVC pattern does not just have to apply to single components of a window. But there is a difference between creating the GUI architecture for a CAD type program as opposed to a Business type program. For example: CAD programs can have thousands (or more) of objects on the screen at the same time; so modelling each as an object will bring your program to it's knees (using the Prototype pattern [c2.com] can help here).

    You might try searching google for 'CAD GUI' or something similar; I've seen articles / web pages that discuss GUI's that are not database backed / business related, but I don't know the addresses off-hand.

  • Take a look at the OpenAPI's exposed by great tools such as Borland's JBuilder, JetBrains IDEA, JEdit and Emacs for an idea of how these marvels are built. Common techniques used to produce a product with complex functionality include: 1. A plugin design. It must be possible to "add/register" new functionality without changing features. The core concepts should be small and form a stable core. 2. Observer/MVC pattern (of course). Decouple that sucker... 3. One thing in one place (avoid duplication). If you've a toolbar button, a menu item, a context menu item, and they all invoke the same functionality using the same presentation names, icon, etc - all of these on-screen locations should be contrived from a single source "action" object. 4. Internal languages Use scripting languages to expose common components (both for internal and external consumption) so that they may be reused in unforeseen ways. Good luck...
  • my 3 cents (Score:2, Informative)

    by xmnemonic ( 603000 )
    Context sensitive seems to be a significant trend. Macromedia relatively recently revamped their GUI's in their software to make heavy use of a primary context-sensitive panel, allowing them to remove several superfluous panels. Adobe in Photoshop 5 I believe added the context sensitive top bar, which displayed some options for whatever tool was being used. 3ds max is perhaps the piece of software featuring the heaviest usage of context-sensitive interface- the righthand bar automatically displays the relevant tools for what you're working on, i.e. polygon tools if you've selected a polygon object, inverse-kinematics settings if you've selected an IK-related object etc. Context-sensitivity is a great help since it basically does work for you, finding the stuff you need when you need it.

    Right click menus are a major part of the GUI's in Maya (which otherwise has a very poor interface due to the excessive menu switching and poor menu item organization) and 3ds max, with Maya's being its trademark "hot box", displaying tools in a radial fashion and letting users access sub-groups of items just by rolling over them. 3ds max simply displays a whole lot of stuff in its right click menus, plus pretty colors. Right click menus are in my opinion still under-used... I find it incredibly convenient to access stuff in a single level menu accessible through a single click rather than searching through endless menu items, among different menus and different menu sets (in the case of Maya and Softimage, the former even having a menu item search tool).

    One thing to avoid imo is a too linear GUI design. Lightwave features such a thing, in which one must frequently switch between different tabs of different tools depending on the situation. The scapegoat might be that Lightwave has clear and numerous keyboard shortcuts, but that does not alleviate all of the problem. A user should be able to use the software efficiently in whatever way appears intuitive, and not have to suffer learning some specific, somewhat esoteric and assumingly "better" method in order to be the most productive.

    Avoiding that though could lead to redundancy in interface, which is another problem. In 3ds max, there are about 3 ways to create a parametric primitives I believe, cluttering the UI unnecessarily with menus, toolbars and tabs. In many other 3d graphics packages similar situations exist.

    Overall, I would say the best GUI for very complex software would be one which makes extensive use of automation (context-sensitivity), clear unambiguous methods (make the user aware of what the workflow should be, without making it too strict), and simply a direct and clean organization (no superfluous crap, don't display many tools that can't be used at all in the situation).
  • there are too many highly complex GUIs out there. most of them are unnecessarily complex.

    if you apply Occam's Razor at every opportunity, take every chance you can to cut down on the number of degrees of freedom, eliminate all choices that are not absolutely necessary, you will usually end up with something that is more intuitive, more powerful, easier (= cheaper!) to implement and has fewer bugs to boot.

    in these days of 20 million LOC word processors, and "pile on every feature that we can think of" applications, simplicity is an underrated virtue.

    think minimalist!

  • Well, not quite, but still close enough to qualify I think.

    What I wrote [google.com] (try to /. Google Groups :-p) was an idea of how to be able to use any computer to interface with any other computer (adhering to my ideas), without having to change your habbits with regards to Window Managers, shortcuts, mouse gestures and so on, wether the computer is running Mac OS X, Windows 3.1, BeOS or if its a CLI only. If correctly implementet, using Wordperfect shortcuts in VI on a system, you've never accesed before should be possible to the extent that VI supports the features, you're trying to access. Heck - if you were patient enough to set it up, you should be able to replace your entire keyboard with a mouse and use gestures for everything including typing. Weird, but possible.

    I know it's a brilliant idea, because the thread on Usenet has total of 8 posts, 1 of which is asking if comp.human-factors is the right group, 2 telling me that it is, 1 is the abstract and four are replys relevant to the abstract.

    Can't beat that kind of feedback, can you?
  • by north.coaster ( 136450 ) on Wednesday October 16, 2002 @05:03PM (#4464499) Homepage
    Seems like one possible source would be the User Interface Research Group [parc.com] at PARC [parc.com]. These are the same folks who invented the Windowing user interface.
  • My tip: (Score:3, Insightful)

    by j3110 ( 193209 ) <samterrell&gmail,com> on Wednesday October 16, 2002 @05:05PM (#4464515) Homepage
    about complex GUI's is: don't! :) I still like pov-ray because I can just enter what I want in a text editor rather than a modeler like 3D-S. Several smaller GUI's built for specific purposes would probably be better than one big GUI. Just break the GUI down into easy ways to do specific tasks. Try to have a consistancy among them. Really, this would be a great place to put object-oriented methods to use. Make consistant components that are groups of other UI elements. It's easy to do in Java using interfaces, but you can do it in C++ as well with inheritence and virtual functions, or call-back functions in C(ech!). I'm sure .Net has a sane way to do it(err, no I'm not really... they probably want you to drag components to a form and use cut and paste, but then you have to update every component to fix a bug, add font settings, etc.), but I really don't know. Any GUI architecture worth it's size in bits has some kind of control grouping whether it's OO, or just faking OO.
  • what to read (Score:3, Interesting)

    by scrytch ( 9198 ) <chuck@myrealbox.com> on Wednesday October 16, 2002 @05:42PM (#4464778)
    Start by reading every book you can get your hands on about designing user interfaces for the common user.

    Then burn them. In a big roaring bonfire. Okay, don't -- donate them somewhere, but pretend you burned them. Picture 'em burning in your mind.

    You are not designing an interface for the common person. Those are designed to be immediately accessable, with a slow gradual learning curve, with lots of consistent easy to grasp metaphor. That is the mac, and usually they do pretty well at it. Metaphors and graduality will drive your power users insane, and you're designing an app for them.

    You want something more like emacs. Or, if you're doing CAD, you want something more like AutoCAD. You want an interface with power. You want one with usability. You want consistency, you still want to keep things like Fitt's Law in mind, but by no means should you feel compelled to make the damn thing intuitive. Neither vi nor emacs are in the least bit intuitive, but boy are they usable, meaning the interface really squeezes maximum use out of itself.

    If I did have to throw in one piece of pithy advice, I'd say that since you're probably going to have to implement some sort of language to express the actions of the interface in, make the API self-documenting, like emacs. I can't tell you how amazingly useful the apropos command is in emacs, how it just searches through the names and documentation of every function and every var in the system, and I don't have to rely on compiled API documentation that may or may not tell me what I need.
  • GUI architectures (Score:5, Insightful)

    by tomlord ( 473109 ) on Wednesday October 16, 2002 @05:50PM (#4464856)
    It's a shame the post with the correct one word answer got categorized as "funny".

    Emacs is the right programming architecture for GUIs. The Emacs command set and visual appearence are, obviously, not that great for many users -- but the programming architecture is right.

    By being interactively extensible, emacs makes it easy to fine tune an interface while you play with it.

    By being lisp based and by having many fine abstractions, emacs let's you do a lot with very little code.

    The emacs architecture provides some very fine bits and pieces for achieving excellent accessability features.

    By being interactive and self-documenting, Emacs is good at helping people teach themselves to program.

    View-tree toolkits, such as underlie Gnome and KDE are inflexible dogs that leaded to bloated yet feature-anemic tools. You know what they're good for? They're good if you have a command-and-control army of drone programmers who can write reams and reams of code. That's why Microsoft apps will remain far more featureful than their free competition until that competition switches to an architecture that works for a society of free individuals.

    Yes, it's true: the way you structure your programs has political implications. It defines jobs. It defines the power of managers and project managers. It establishes the degrees of freedom your users have to extend or customize their tools.

  • by Spy4MS ( 324340 ) on Wednesday October 16, 2002 @06:20PM (#4465058)
    I haven't found design patterns to work as well as rule-based coding.

    A philosophy I build into all of my GUI applications is "show the user as much useful information as possible". Users make thousands of decisions a day and informed decisions are easier to make. To that end, I eliminate useless information as much as possible to make room for the good stuff.

    There are simple facts that need to be remembered while designing a UI:
    - eyes move more easily than fingers
    - buttons don't provide useful information (but can!)
    - scrolling is useless and should be avoided
    - minimize clicks, mouse moves and keystrokes
    - informed decisions are better decisions
    - context-based mouse clicks make sense
    - keyboard shortcuts save time
    - don't invent new keystrokes for old functions
    - everything should work as expected
    - file managers should show more files, db apps should show more data
    - people can't choose from more than 7 items unless they are grouped

    BTW There's no such thing as information overload. There's only useless information. If everything you show on a GUI is well organized it's all useful.
  • Congratulations! (Score:3, Insightful)

    by Qbertino ( 265505 ) <moiraNO@SPAMmodparlor.com> on Thursday October 17, 2002 @04:28AM (#4467541)
    You've brought a rare thing to "Ask /.":
    A good question that can't be answered without advice, that doesn't score a bazillion howto-hits on Google and that isn't shure to be absolutely above the heads of the slashdot crowd.
    Nice to have some good question asked. Thanks.

    Now for my shots at closing in on answers:
    I have no larger mentionable expierience in UI design apart for the fact that I do have some webdesign expierience and a professional artist training, but I have used and operated a wide range of professional tools in the professional manner in which they were meant to be used and operated!!!
    And that's a very important part of my/the answer allready:
    All extremly complex professional GUI-tools each have their very own distinct, standards-pushing look and feel acustomed to their application family more than, let's say, the CUAS. And that's what makes up a good tool.
    People who use Avid use it almost exclusively and for hours and years on end - and often on special hardware too. Same goes for Softimage or Houdini. Or check out the difference between Freehand, Illustrator and Corel Draw. The distinct, special funtionality of vector-drawing apps is approached in a different way by each. That's the same reason why you've got a wider range of Video NLE apps that do all the same but with often different workflow aproaches.
    See what I'm saying: If you're tool is gonna be complex due to very special funtions that only a few people will need or even know, there is no point in trying to find a standard for GUI design. You won't be able to apply it properly.
    What to use? Photoshop layers or Photopaint objects? How to join vectorcurves: Corel connect and combine or Freehand extend and join? The latter is a very good example: 2 totally different but valid approaches to a very important problem. For those that need solid vector graphics power.
    Bottom line:
    Programms that are so complex that they are most likely to become stand alone tools (maybe even with custom hardware!) *can't* follow design standards - because there are none! Such a programm gains recognition by having a distinct character and one team of professionals in it's userfield that really know what they're doing and set up their own set of rules and preferences as to which way the app has to work, behave, look, feel and is intended to be operated.
    And believe me, nothing sucks more than trying to make a complex powerapp like, let's say, a 3D modeler, instantly 'usable' for people who only know office gui standards. Check out kpovmodeler to see what I mean.

Remember to say hello to your bank teller.

Working...