The gap between User and Programmer

A sharp distinction is often drawn between “using a computer” and “programming”. Using a computer might involve a simple action, like opening a web browser and reading the news. Programming might involved something like creating the web browser itself.

These seem like two different worlds. Clearly there is a significant difference in accessibility and learning curve. However, I wonder if this difference is only one of scale and magnitude or is there some more profound separation between using a computer and programming a computer.

We occasionally see features in mainstream applications that put the ordinary user in a role closer to that of a programmer.

  • Macros in word processors, for example, are a (sometimes) simple programming language. A spreadsheet program like Microsoft Excel can be seen as an entire development platform alone (I have a theory that if we could have somehow invented Excel 50 years ago, we’d be living on Mars and we’d have a cure for cancer).
  • Rules in email program. Outlook or other email programs allow users to setup simple conditionals to file or perform other actions on email. This relatively simple set of rules turns out to be quite powerful.

I wonder if we may be pushing this distinction too far. I’m not suggesting that my parents should be learning C++. They are quite content with email, web browsing, and word processing. Still, I worry about the unforeseen repercussions that may arise from the idea we have burned into our minds that programmers are programmers, users are users, and never the twain shall meet.

Are we building our systems in such a way that re-enforces the gap between users and programmers? Are we building systems that have a bias that makes it difficult or impossible for users to create their own functionality?

I don’t expect all Joe Hotmail to start writing device drivers. However, there are technologies that have been biased in the other direction: where the user is often the creator. HTML, for example was a simple-enough language that, even if it didn’t make it all the way to the average end user, it did enable a far larger circle than “programmers” to do interesting and creative things.

DOS batch files were simple enough that a lot of users who would not consider themselves to be “programmers” could do all kinds of powerful things (though it may have been out of cruel necessity). I remember an old high-school friend wrote a simple batch file that ran off a floppy disk on our school network. It displayed a prompt that looked exactly like the real network login screen. When an unsuspecting user typed in their username and password, it would output a realistic looking error message, and write the username/password to the disk (a “floppy-in-the-middle“ attack?). The confused user would move on to another machine, and my friend would come collect his disk full of network passwords at the end of the day. The key point is that this was possible with very little understanding of “programming”.

Here are a few tasks that someone might want to perform:

  • Notify me when the Canadian/American currency exchange rate drops below a certain points. How would you do this? Excel can grab the exchange rate from a variety of web sources. Now we need a way to check this regularly and pass on the info to a notification of some kind (IM or email).
  • Take all of those emails I get from my old-school co-worker with WordPerfect 5.1 attachments and convert them into Rich Text Format documents. How would you do this? Get all WordPerfect attachments from that particular sender, open them, and save them as RTF files with the same name in a destination directory.
  • Have the top 5 New York Times front page stories print off at 6am.

These are a few examples of relatively simple tasks that would be difficult or impossible for most people to setup. Is it possible to put this kind of power in the hands of novice computer users? The individual components of these example tasks are all relatively simple with common applications. It’s the glue to tie them together that’s too difficult.

Is this a case of professionals conspiring to keep common-folk from trampling their sacred realm, or is it just hard to do well?

On a related note, Alan Kay gave a talk at the recent Emerging Tech conference that included video of children “programming” simple physics behaviour for learning purposes (QuickTime video of the presentation is available).

UPDATE: Soon after I made this post, I came across Matt Jones’ post on the topic.

 

31 thoughts on “The gap between User and Programmer

  1. I think there may be a difference not so much due to a conspiracy as desires. I as a user want things made simpler, hide more steps in a function. Ultimately, I want the internet, for example, to be more than a library but a researcher, too. A programmer is more of a hobbist and wants to display the steps, increase the options and, I think as well, maximize the “Neato! Look what I did” factor. This is fine with ham radio antenna amongst the Morse code brethren. It hit a wall with the common people and, unfortunately, makes the immune to real possibilities.

  2. I’d agree with Alan, to some degree…

    I, as a professional “programmer” (technically I’m a “web architect”, but who cares?), find that users, whilst wanting power and customisability (yes, I’m English, hence the ‘s’ spelling) can’t often cope with a truly open-ended scheme.

    This, then, begs the question “where does a user stop and a programmer begin?”. Many professional programmers shun “scripting” languages because they are powerful and (relatively) easy to come to grips with, but lack refinement available in such god-sends as C++ (or assembler, for those of us who have way too much time on our hands).

    Most “scripting” languages, however, can be very useful, in a tightly defined scope. VBScript, for example – great for small, “throw-away” apps, but not really for enterprise level work (much as people try to use it in this way).

    I would say that, really, all users need on top of what we’ve already got is a fairly simple IDE (Intergrated Development Environment, for those who don’t know), which is extensible, for a given scripting language. Give users the option to drag and drop pre-defined algorithms into their system, manually edit code if the need strikes them, and download new algorithm components from a central repository (which we shall call, for the sake of argument, the internet 😉 ).
    This sort of system might well be an open source project, spanning all platforms, and it would enable most users with some semblance of an idea to put together simple systems to meet (fairly) simple needs.

    I think, personally, that a good interface approach is like that of the Mac OS – hide functionality in plain sight. The functionality is all there to be used and customised, but isn’t made completely obvious to the layman, for fear of scaring them (like the algorithm-block model above).

    Power to the people. But not too much.

  3. If you use Excel (or, for that matter, any Office product) that’s from Office XP or above (for those of us that’re Office System 2003 testers) and have Smart Tags switched on, enter a stock exchange symbol (MSFT, for example) anywhere on the page/spreadsheet/whatever, and hover your mouse over it, you can get the option to add up to date stock quotes for that symbol.

  4. Re: Steven Marshall – Excel has all kinds of powerful web-data importing tools, but that’s beside the point. This is one step in a multiple step process (in the example above). Each individual step can be done relatively easy – it’s tying them together that requires some kind of cross-application scripting.

    Re: Giovanni – I’m always amazed at what you can do with Excel (or maybe any spreadsheet, but I’m mostly familiar with Excel). The power to extract meaning from large amounts of data can be striking.

  5. That’s kind of what I was hinting at with my IDE concept in my first post (on this thread and on this site – hurrah!) – being able to tie all the simple steps together in one easy to use manner.

    The problem that, as far as I know, most people face, is the cumbersome nature of tools like the Visual Basic for Applications script editor, and the poor documentation (or lack of, in some cases) for the APIs and interfaces for the programs themselves. When I say “poor”, of course, I mean from a user’s point of view – how many regular users know how or why you should dimension a variable in VBA?

    Most of the ideas put forward in the original article are easy, but only for a given value of easy. By this, I mean that probably 3/4 of all users wouldn’t or couldn’t do them without help from a much more experienced computer user/programmer, 1/8 would be able to do something resembling like what was required, and the other 1/8 or so would have little difficulty. My numbers are very likely way off, but you get the idea – systems to enable users to carry out those sorts of tasks need to be targeted primarily at the 3/4, then at the rest, but designed in such a way that “the rest” don’t get irritated by being forced to work this way.

    And then, once I’ve built that system, I’ll go out and cure world hunger and instigate world peace.

  6. It’s not two distinct groups: user and programmer. It’s a continuum of users each at different levels. Each user uses the tools provided by the group of users below them. No level is inherently more complex, in fact the act of splitting the overall complexity into levels is the way we are able to build such complex system. You can work at whatever level is appropiate for the task at hand. This is closely related to layers of abstractions that Steve has written about before.

  7. Right on Nathan. There’s also the danger of dividing interfaces into “expert” and “novice” modes. Donald Norman argues (correctly, I think), that you cannot make this distinction since all users are expert in some areas and novice in others with infinite variation. Google is a great examle of an interface that works as well for expert users as it does for beginners.

  8. But without aggregating tools how do we move from one layer to the next? How do you become the awfully described “power user”?

  9. The main cause for the gap between users and programmers is that the user by definition isn’t interested in the backend: he/she has better things to do than learn a (simple) scripting language or figure out and master a specific tool in some program (for instance, message rules in Outlook Express, which is really cool and powerful, but only if you’re somewhat like me).

    The popularisation of scripting languages you describe, dPhilc, is only among those who already liked the idea of ‘getting good at it’. Users just want to use, and even if you give them great power, they still won’t use it. I mean, how many people do you know that actually make decent, intelligent use of the macros in Office? I know zero.

    Let us take my dad. Schoolbook example of a user. Displays a reasonable interest in the backend of things purely out of curiosity, but does not aim his efforts at truly mastering any kind of software. He does not use the message rules in Outlook Express. He doesn’t use the macros in Office. He doesn’t even look at the status bar in his browser when he points to a link to see where it goes.

    All this ‘easily usable’ power, such as in a system Steven Marshall proposes, would be wasted on him, for he has other interests. It would not be wasted on me, but I’m part of the ‘intermediate’ group. I’m in love with HTML/CSS, Photoshop’s actions and to a mild degree, scripting for web application purposes, but heavy-duty programming like with C++ is too much for me.

    I share my fathers sense of curiosity, though. I am interested in how things like DirectX, GI renderers and JPEG compression algorithms work, but I don’t want to really learn: I have other things to do, which is precisely the point.

    It’s like a coffeemaker with web access. It may have a well-designed browser system, but I just want coffee! And that’s why you cannot bridge the gap between programmers and users.

    “And then, once I’ve built that system, I’ll go out and cure world hunger and instigate world peace.”

    I rest my case.

    “How do you become the awfully described “power user”?”

    A well-designed interface will make easy things easy, but will also not attempt to hide advanced things.

  10. Yes, I think it does come down to usability. Hide a function three tables down or behind advanced options and you lose a user because the presence of the function and the related opportunity to learn is not apparent.

  11. Willem – I don’t think I agree with the premise that users “just want to [insert activity here]”. Of course that’s true, but don’t most programmers “just want to write a utility that does [insert activity here]”?

    I think this comes down to variations on the same type of activity.

  12. Willem: That’s exactly why I say there is not a gap, but rather a continuum of users at different levels. The programmer wants his tools to “just work” the same way the writer wants his wordprocessor to “just work”. For any given task on a computer the user wants to focus on the task and expects the underlying compenents and required tools to “just work”. A programmer is just a user at another level.

    I think this also applies to other areas of technology too, but is just very apparent with computers due to the large number of rapidly evolving levels. The rapid change at so many levels is what causes the higher levels to be so unstable at times.

  13. Much as I hate to sit on the fence, I think all of us are right, to a certain degree. We’re all making sweeping generalisations, and, while true for some percentage of the populus, there’s almost always going to be different. As [designers]/[developers]/[crazy people who’re trying to scare as many users away from computers as possible] (delete as applicable), we should try to accomodate the largest percentage of our target audience as possible.

    If you’re designing a web browser for the mainstream, it’s got to be easy for most web users to be able to use.
    If you’re designing a system to model the fluctuations in electrical current across a given type of diode, there are other assumptions about the user-base that you can make.

    Oh my god, that actually sounds like I might know what I’m talking about.

    There’s always a first, I suppose.

    As I intimated before, no system can be all things to all men (or women, or other computer using beings), and anything that tries to be will almost invariably fail. Anyone who claims to have such a system working is either very silly or very high…

  14. Spreadsheets are very to-the-point on this question, because they can be seen as an instance of the dataflow programming model. If you think about _many_ of the original tasks for which computers were used (ballistics calculations, tide tables, actuarial tables, statistical analysis), the spreadsheet provides a programming alternative that is so much more powerful that it _appears_ to not be programming at all.

    And Back In The Day, the average spreadsheet and word processor user was absolutely comfortable writing some amount of macros — you could “program” Lotus 1-2-3 by writing strings like “/FOE” that would activate the menu corresponding to the character (like what we call “accelerator keys” today). If you needed to add a branch in your programming, it was a very short step to move from this type of macro to a slightly more complex scripting routine. The problem then (in rough terms, the 80s) was that there was a significant jump between the macro scripting languages and programming languages. When Word and Excel became dominant, though, macro programming virtually disappeared, as the new GUI-based programs introduced complex programming models. So instead of having a simple transition from user to macro-programmer followed by a hard transition from macro-programmer to application programmer, you had a fairly easy transition from macro-programmer using Visual Basic for Applications to application programmer using Visual Basic. But you lost the common transition from user to macro-programmer.

    It’s not really about whether a given person is a user or a macro programmer or an application programmer; it’s about whether a given person can apply the knowledge they have today and, with a little learning, be more productive and creative tomorrow. It is just as much a shame that most programmers are unable to write their own spam filters for Outlook as it is that most users of Outlook are unable to write a program to highlight messages from their boss in red. There _has_ been and continues to be a gap between the two worlds of programmers and users, but the problem is in the tools we use and the imagination with which we use them.

  15. I am always amazed between the gap between computer users. There is my Father, I bought him his first computer 3 years ago before travelling to Chile so we could email each other, now he is emailing and googling to his delight. But never show my Dad a piece of code, he does not even know the correct name for his task bar or start button. Well thats my Father. But where I work people who use computers everyday do not have a real understanding of what they are doing, it surprises and baffels me, how can they not really understand, it must make things so difficult for them.

    And then to myself and UNIX sysadmin. I can script and code. But I cannot write a piece of C without a lot of trouble, and I still cannot my head around object orientated.

    So I think its down to levels of abstraction, where you are in that picture. I think there will always be a gap though between those who code and those who do not.

  16. It is just about a tool – I do not need to know about the internal combustion engine other than I have one which makes my car go.

  17. Exactly, Alan.
    Most people don’t care about how their computer works – they just want it to do what they want, when they wany. Programmers/Hackers*/Power Users, however, are more like the petrol-heads and mechanics – we revel in “getting their hands dirty” with the underlying structure of systems.

    As is often the case in this life, everyone’s different. We’d soon get bored if we weren’t.

    *I use the term ‘hacker’ in the ’60s MIT sense – to mean someone who takes pride in, and excels at making, elegant, well-designed code – as opposed to it’s mass-media-bastardised usage – someone who ‘hacks’, or breaks systems.

  18. Wasn’t hacker originally the term for the guys who, just for kicks, made the black boxes who could get into the telephone system from phone booths and had a hobby of calling around the world or better calling techs in the phone system and have them forward service manuals or put sections of the system into different status?

  19. Stephen Marshall said: “Programmers/Hackers*/Power Users, however, are more like the petrol-heads and mechanics – we revel in “getting their hands dirty” with the underlying structure of systems.

    I disagree. Obviously this is the case for many programmers, but I don’t think it is always so. There are plenty of programmers who want their development environment to “just work”.

    I’ve been using computers for years (I even had a short-lived brush with formal computer science education) and I have always made the distinction that I was more interested in the computer as a tool to acheive other means than I was interested in the computer itself.

  20. I agree with Garrity. No matter what level of the abstraction you’re working at, you want your tools to “just work”. I think the real gap might be between people who have a desire to learn how to use their tools well vs those who have no such desire. Again this can occur at any level.

    Now that the car-computer analogy has been started, I have to add this:
    People have to learn to drive a car. The existance of this learning curve is generally accepted in society. When you learn how to drive a car you learn how to interact with the controls in order to make the car do what you want. You do not learn how an internal combustion engine works.

    You can learn how to use a computer the same as one would learn how to drive. You learn how to interact with the controls to make the computer do what you want. This does not mean learning about the inner-workings. Why is this computer using learning curve generally not accepted?

  21. Great topic

    my buzz thoughts…

    * hypercard filled this role well for educators, until computing became internet-centered

    * jon udell discusses this often — the principle of Recombinant Growth. his libraryLookup idea is simple and user-centered. I imagine users have new app ideas all the time, with even javascript too complicated for them

    * there are tools emerging to wire together webservices, xml, instant messaging. look at Spring

    * visual is key. here’s a suggestion
    that powerpoint could be a platform for devising business processes. lego mindstorms is quite powerful and understandable

    * Key is, building such a platform on top of portable data (XML) so that this user-built apps can live on the network, be exchanged and modified.

  22. I suppose a difference in car and computer is that to drive you have to pass a minimum standards test where you don’t to send email.

    PS [I don’t know if this is a geeky joke – if it is tell me I was funny.]

  23. Since you’ve seen Matt’s short posts on the topic, you should also check out Dan Hill’s thoughts on “Adaptive Design” which addresses the idea of user-malleable products in a longer and more thought-out way. I don’t have the URL, but search his blog at cityofsound.com/blog/

  24. Steven, I hate to be picky, but it’s with a ‘v’, like yours.

    Also, I would tend to think that you may have missed what I was suggesting about programmers liking to “get their hands dirty” – “There are plenty of programmers who want their development environment to “just work”.” – this is analoguous (sp.?) with the fact that there are plenty (if not all) of mechanics who want their spanner/whatever (I’m no mechanic) to “just work”. I don’t dispute this, I’m just saying that a programmer typically needs to at least understand how the system he’s working on should work.

    Of course the mechanic is a little less likely to have the necessary skills/equipment to redesign and re-make his own tools, but the analogy is a fairly good’un.

    Alan: I’m all for introducing a minimum standards test for computers… Yes, I know the whole idea has been fully explored by the occasionally-sadistic, always funny Dan (“Do you have a license for that Athlon?”). It’s still a sound idea. And yes, I can double clutch.

  25. I’m guessing that this distinction between “programmer” and “user” will become less pronounced among younger generations who seem far more at ease with technology than many of us do. A great many of them will get underneath the hood to make, modify or extend the range of their games or social applications because it will be “fun.” I don’t have a background in CS and I’ve never taken any programming classes, but looking at the work of John Maeda and Golan Levin has inspired me to give it a go. for fun!

  26. ONE OF THE FIRST COMPUTERS EVER BUILT WAS THOUGHT TO BE ENOUGH TO SERVE THE COMPUTATIONAL NEEDS OF THE WORLD FOR THE REST OF ALL TIME. PROGRESS HAS PROVEN THAT PREDICTION TO BE LAUGHABLY WRONG. PROGRESS, TECHNOLOGY AND EVOLUTION WILL ALWAYS BE PRETTY MUCH LINKED FOR AS LONG AS WE ARE AROUND, I BELIEVE. I SOMETIMES WONDER IF WE HAVEN’T COME FAR ENOUGH ALREADY WITH THE TRADE-OFFS BETWEEN EASE OF USE, AND REAL POWER OVER THESE DEVICES.

  27. Steven: “Give users the option to drag and drop pre-defined algorithms into their system, manually edit code if the need strikes them, and download new algorithm components from a central repository (…).”

    There’s a problem here: there would need to be a central application that would keep track of all the abstraction levels employed. Second: take Microsoft as an example. I don’t think they’d release their code to the public. Also, why give the users the option to re-create their working environment creatively, when You can seel it to them? (At least that’s how any software company would/should think, in order to be in any way profitable.)

    There is already a way to do simple customizations. More advanced changes often require a working knowledge of the system You’re modifying. This isn’t that easy – and I consider myself to be “on my way” from a power user to a “designing user” (or, in older terms, a “programmer” who wants his tools to “just work” for the time being). I, too, was once a clueless beginner, as everyone is at first.

    The thing is: many people just want their work done. And that’s it, finito, end. I believe that the way things are done today is rather well: the “noble user” who wishes to “just do” his work can do it, and the ones that share the curiosity will find the advanced options. You can’t make everyone happy. Think about it: the noble user would like to simplify his tasks, but doesn’t want to know how to do it? I call that ignorance. And an ignorant user is the worst, in my opinion.

    But let’s forget about this for a moment and go back to the idea of that repository etc. etc. Let’s see… Does anyone from the so-called “hardcore programmers” group have an idea how to write self-scalabe and yet efficient code that’d be easy enough to be managed by our noble users? Computers can do a lot, they run the world now, seeing as the key currency is information, but … a computer will do exactly what the Programmer tells it to. Nothing less, but nothing more. And please, don’t give me the “do what the user wants” crap. The software is designed by programmers, and it’s them who decide what the program will do. Sometimes it’s based on user input (see also “open-source” :P), sometimes not.

    But let’s say our Programmers group is full of best intentions and wishes to create the system that’d work like this, and on top of it do it just for the kicks and being famous. Tell me – how do You write a program that can consider each and every software combination the user would like to implement? Furthermore, how do You write one that’s already aware of what software apps will be used in the future? How about we write software that predicts the future while we’re at it? it’s just NOT possible. And what’s more, You’d need a Programmer to design the application to do that, so in the end there will be limitations, no matter how You look at it.

    In order to glue two things together You have to know how. You can try without that knowledge, but You’ll most probably end up with Your thumb glued to the desk, as I did on my first try. 😉 There are simply things You MUST learn in order to do more. It’s only plain logical, I think. I mean, I could become a mechanic while I’m at it, why not? I’d combine two different cars and get much more power and speed and all that, just with my driving knowledge… 😉

    And lets not forget about those who simply refuse to learn, but keep bitching about how their programs are simply uneasy to use, cluttered and so on, and so forth…

Comments are closed.