Good design: driven, but not constrained, by specifics

From a set of notes by Chris Heathcote on Donald Norman’s new The Design of Future Things:

We’ve been taught to design systems for a purpose – preferably one purpose – collected through use cases and designed against them. Use case collection never really includes crazy ideas or tries to foretell unexpected and unplanned uses. Good design, in my mind, is designing enablers or tools that include the use cases given, but have breathing room, rather than designing strictly to the use cases. It could be said that this reduces usability, and it often does, but with the flipside of user value.

Too-narrow design is a substantial risk for Agile projects. Part of the reason for making a ubiquitous vocabulary part of the everyday project conversation is that it keeps people’s heads a bit in the problem domain, not just in the solution domain. That gives them leave to think in terms of more-general tools rather than whatever makes this story’s tests pass.

Refactoring is another technique that helps, since it tends to push the code toward generality. But it can’t be taken far enough, I think, unless there’s explicit slack in the project pace. You need breathing room to refactor, get an idea from that refactoring, use that idea to think again about the problem, and put the results of your thinking to some sort of test.

Controlling iTunes with Ruby (alternate take)

Here’s a different version of the same playlist-generating script. This one uses rb-appscript rather than the built-in Scripting Bridge. (Raw source here.)
Read the rest of this entry »

Controlling iTunes with Ruby

In working on Ruby Scripting Leopard, I’ve been helped by searching for AppleScript examples, such as those at Doug’s AppleScripts for iTunes. To pay it forward, I offer an example to some future searcher after the jump. Since WordPress (or something) is turning quotes into “smart” quotes, follow this link if you want plain text.

This should work on stock Leopard.

I run it via launchd, the replacement for cron(1). Lingon is a convenient way to create a launchd configuration file.
Read the rest of this entry »

Programming retreats to its niche

Eugene Wallingford wrote a depressing post two months ago. (Note: to find the article, you’ll have to scroll down.)

I occasionally write about how students these days don’t want to program. Not only don’t they want to do it for a living, they don’t even want to learn how. I have seen this manifested in a virtual disappearance of non-majors from our intro courses[…]

Eugene point to a post from Mark Guzdial:

Mike is running a trial section of 140 students. The day that he introduced the programming aspect, a dozen students applied to drop the course. Note that: nearly 10% of the enrollment. They had to talk to Mike to drop, because of the trial nature of the section, and the common reason was that they didn’t want to do any programming in Physics.[…] Students dislike programming so much that they are dropping a required course[…]

This trend is important to me for two reasons.

  1. I’ve written a book, Everyday Scripting with Ruby, to help non-programmers learn to script. That book’s outsold expectations, but I have an anecdotal impression it’s not because testers (its primary audience) are swarming to pick it up. Rather, it’s because other audiences are. (Good thing we changed the name away from Scripting for Testers.) And I’m writing another book on using Ruby to script your Mac.

  2. I’ve completely failed to entice my children into learning programming. A Squeak summer camp: nix. Programming a Lego Robotics robot (in the Lego visual language or Ruby): nix. They find it boring. There are many more immediately gratifying things to do with the computer, the “wow!” factor of even game-oriented programming doesn’t compete with what you can find easily on the net, and Sims 2 and Civ IV are better at satisfying the need to compulsively twiddle with something for long periods of time.

I’ve delayed writing about this for so long because I find myself without anything useful to say. But at least you now have the links.

Questions about submitting to Agile 2008

Some questions on the submission process for Agile 2008, passed along by an Example stage committee member.

What the heck is a “stage” anyway?

I am thinking of a stage as a “conference within a conference.” It’s like a stage at a large music festival, where there’s a particular physical location where you might go to hear blues. (Plug here for Karen Carroll.) Buy a pass to the music festival and you can wander among the stages, seeing what you like. Or you might decide to hang out at a particular stage with people who share your particular obsession.

The “stage producers” have a lot of leeway in how they organize their own particular stage. That’s why the answers below should be considered specific to our stage.

How will the submissions be reviewed? What constitutes a good submission?

The first stage reviews will be public, on the submission website. The purpose of the website is to help the submitter hone the submission into its best possible form.

After submissions are closed, I’m planning to have something similar to what’s done at many software conferences:

  1. Everyone votes on the submissions she’s read, using a four point scale:
    A: I will champion this submission (argue vigorously for its inclusion).
    B: I support this submission, but it wouldn’t break my heart were it not included.
    C. I think this submission should be rejected, but I could live with it being accepted.
    D. You have got to be kidding! Accept this?

    Most submissions will have a near consensus. The interesting cases are those where you get one A and four C’s (or A’s and D’s).

  2. It’s possible that the number of clear accepts fits exactly within the space boundaries we have. More likely, we’ll need to make some choices. These get made in a phone conference. The structure of the conference depends on the submissions and how they match up with our available space. Here’s one possible scenario:

    We have five open slots. There are also five interesting disagreements. We discuss them. In two cases, the negative votes agree to accept. In one, we decide that we’ll provisionally accept if the proposer adds some particular improvement.

    Now we need three other cases (two definite accepts, one if the provisional accept falls through). People propose sessions from among the pool of ones that no one’s either strongly for or strongly against. Which sessions do they propose? Probably it depends on how they stack up against the already-accepted sessions: does a not-yet-accepted session complement or nicely contrast with one we’ve already got?

What keeps this from being a popularity contest, where only the most well-known names get accepted?

All of you reviewers do. The visibility of the submission process should help. If some Big Name writes a sketchy submission that displays no effort (which happens more than I’d like) and we accept it, the shame of it will follow us the rest of our lives.

There is an argument for accepting Big Names: it draws attendees to the conference, some attendees (especially first-timers) are more likely to listen to them, and it gets people who most likely are Big Names for a reason to the conference, where they can wander the hallways dispensing wisdom. Since this stage is for an oddball topic where there are no big names, that argument does not apply to us.

How will the sessions be compensated? Do they all get the same
compensation?

This is supposed to be on the website (there’s text saying so), but I couldn’t find it. Bug has been reported. Here’s what was once the correct information:

2. Here's the compensation for speakers, it's still based on session type.
  * Tutorial/Discovery session: 90 min: USD 250, up to 2 free
registrations, 5 night hotel, 1 room ; 180 min: USD 500, up to 2 free
registrations, 5 night hotel, 1 room
  * Experience Report/Research Paper: 1 free registration
  * Panel: moderator: free registration, 5 night hotel; panelists: free
    registration
  * Main Stage presenters (formerly known as talking heads): USD 700, free
    registration, 5 night hotel, 1 room
  * Free registrations and free hotel nights are non-transferable and
non-accumulatable.

 

This does not cover “other.” Compensation for other will be handled case-by-case. Here’s the way I think about it:

  1. Things that are normal for conferences (presentations) get one free registration.

  2. Things that require substantial extra work or require special expertise in crowd management or are popular enough that they will help sell the conference get free registrations and some amount of hotel rooms and money.

  3. Panels get compensation way in excess of the effort required. But they’re popular among attendees, so they’re worth paying for.

How complete should a proposal be when I first submit it? What’s
considered to be “complete”?

It should be complete enough to entice a modestly public-spirited committee member or interested reader to take the time to write helpful suggestions.

“Complete for final consideration” means that every idea you (the submitter) have for improving the session or improving your argument for the session seems like more trouble than it’s worth.

That sounds like I’m being flippant, but I’m not. I don’t think completeness is something you can know a priori. You construct what completeness means by moving toward completion.

A more helpful answer might be this: does the submission describe enough that a reader can imagine what it would be like to attend that session? what they can (best case) leave with?

What’s the definition of the various “session types” - Demonstration, Experience report, Panel, Talk, Tutorial, Workshop? Does my submission have to be one of these?

Here are my understandings:

  • A demonstration is where you show an audience something. The thing is traditionally a tool in use. (”Here’s how Watir works.”) It can also be a demonstration of a technique. (”Watch as I use session-based testing on this here app.”)

  • An experience report is the result of some personal experience over an extended period of time (most typically a complete project). The goal is that the audience understands what happened and what the presenter learned, and that they can map that experience onto their own.

  • Panel is a moderator plus N people, all sitting on the stage at once. What happens then is up to the moderator. Typically the moderator explains the topic, then each of the N people says something about it. Then the moderator may ask provoking questions, and the panelists talk about them. Typically questions are taken from the audience, and the panelists try to say something interesting and profound.

  • A talk is a presentation like a demonstration or experience report, but it doesn’t fall into one of those categories. Like them, audience participation is usually limited to questions after the talk.

  • A tutorial is a longer session where the presenter is someone specially qualified to teach a particular topic (preferably both an expert in the topic and with considerable experience teaching). Tutorials usually have some “experiential” component where people practice what has just been explained. Participants come to a tutorial to learn, in some detail, what someone else already knows.

  • A workshop (aka Discovery Session) is organized by someone who thinks not enough is known about a particular topic and wants to do something about it. So, in contrast to a tutorial, there’s not the metaphor of knowledge flowing out of a teacher’s mind into the minds of a pile of students. There is a group of more-or-less peers creating new knowledge. Sometimes this is through some form of structured discussion. But there’s often an experiential component: a lot of learning by doing.

I am personally most interested in workshops and experience reports.

[The] consensus [of people she was speaking to] was that this year’s process heavily favors previous presenters, more so than in other years. They felt the lack of definition of sessions, lack of criteria by which sessions will be reviewed, and wide reviewership makes this year’s game nothing but a popularity contest; new folks need not apply.

Now that I think about it, what I see is a bias toward regular conference goers more than regular presenters. I think the (implicit) persona is someone who’s been to conferences and has had one of these reactions:

  1. Why did no one talk about X? I guess I’ll have to do it.

  2. I know as much about Y as anyone who presented. I guess there’s an audience for what I know.

  3. I’ve got this fuzzy idea about Z. As far as I can tell, everyone’s fuzzy about Z. But at least there will be thoughtfully fuzzy people in Toronto next year - I need some mechanism to get them together so that we can figure this thing out better.

Whether a particular stage turns into a popularity contest depends on two things:

  1. Do people just vote on proposals or do they make helpful comments?

  2. Does the selection committee pay more than passing attention to the votes, or do they spend time reading and thinking about the comment threads to reach an informed opinion?

I don’t think our stage will.

When to write test helper code

On the agile-testing list, I answered this question:

So for the first time in many, many years I’m not in a test management position, and I’m writing tests, automating them, etc. We’re using a tool called soapUI to automate our web services testing–it’s a handy tool, supports Groovy scripting which allows me to go directly to the DB to validate the results of a given method, etc. One feature of soapUI is centralized test scripts; I can create helper scripts to do a bunch of stuff–basically, I write the Groovy code I need to validate something and then I often find I’m moving it into a helper function, refactoring, etc.. My question is, how do you know the right balance between just mashing up the automation (ie, writing a script as an embeded test script) vs. creating the helper function and calling it?

Bret Pettichord suggested I blog my answer, so here it is:

I use these ideas and recommend them as a not-bad place to start:

  1. At the end of every half-day or full-day of on-task work (depending on my mood), I’ll spend a half an hour cleaning up something ugly I’ve encountered.

  2. I’ll periodically ask myself “Is it getting easier to write tests?” If it’s not, I know I should slow down and spend more effort writing helper code. I know from experience what it feels like when I’ve got good test support infrastructure—how easy writing tests can be—so I know what to shoot for.

  3. I have this ideal that there should be no words in a test that are not directly about the purpose of the test. So: unless what the test tests is the process of logging in, there should be no code like:

    create_user "sam", "password"
    login "sam", "password"
    ...

    Instead, the test should say something shorter:

    using_logged_in_user "sam"
    ...

    That tends to push you toward more and smarter helper functions.

    Unsurprisingly, I often fall short of that ideal. But if I revisit a test and have any trouble at all figuring out what it’s actually testing, I use that as a prod to make the extra effort.

What was something of a breakthrough for me was realizing that I don’t have to get it right at this precise moment. Especially at the beginning, when you don’t have much test infrastructure, stopping every twelve seconds to write that helper function you ought to have completely throws you out of the flow of what you’re trying to accomplish. I’ve gotten used to writing the wrong code, then fixing it up later: maybe at the end of the task, maybe not until I stumble across the ugliness again.

Soliciting reviewers and advice-givers

I’ve begun work in earnest on Ruby Scripting for Leopard. I’d like to assemble an audience who can review drafts and tell me what people like them need. I’ve set up a mailing list.

The one sentence description of the book is “How to do anything AppleScript can, but in Ruby.” That is, the main focus will be using Ruby to control other apps like Mail or Safari. It’ll also show you how to write code that makes use of Mac framework features (like sending Growl notifications and putting controllers for your scripts in the status bar). It won’t be your definitive guide to RubyCocoa, though. Most likely I won’t talk about Xcode or Interface Builder at all.

The book will assume no experience scripting Macs (or anything else). I’d like some helpers who fit that category, but also people with lots of experience.

Readers should know Ruby, but I haven’t decided how much. Certainly you needn’t be an expert. Anyone who knows Ruby to the level of my earlier Everyday Scripting with Ruby is definitely in the audience.

Thanks.

Ruby to Growl, with callbacks

I wanted to write a script that used Growl to notify a user. That user could click on the Growl sidle-up, and that would make the script do something. It took me a while to figure out callbacks from Growl to the originating app, so I thought I’d write it down.
Read the rest of this entry »

Latour 5: Disliking the divide

A transcript of an OOPSLA talk: Table of contents

A post by Clarke Ching finally nudged me to finish this Latour series. Here’s the key excerpt:

The bad news is that I think we are about to fuck it all up because (according to my jaded view of the world) we - the agile community - are focusing on the wrong things. We are focusing on optimising our technical skills (the bits we are naturally good at), but we are ignoring the skills we really need to foster within our community. What are these skills? I’d like to call them marketing and sales skills, but I think they’ll be better received if I call them “influencing” skills.

I’d like to disagree in the sense that I think things are even worse. Latour shows how.
Read the rest of this entry »

Pharmaceutical database online. Medications. Drugs Ingredients. ATC classification.

Maintenance & Optimization download

Folic Acid containing products.

Mouse Drivers download

Video Forum

Photoshop Plugins & Filters download

Zydos pharmaceutical products

Firefox Add-ons & Plugins download

Video Forum

Video Forum

Video Forum