about
|
about hsh |
| |
this whole thing is about me paying attention to software development, project management, and testing. i hope it suits you as much as it suits me.
|
aggregation
toolkit
what is
RSS
RSS
introduction
RSS for Python
sources
wazmo
joel on software
WebWord Usability
focused performance
raelity bytes
ross mayfield
webcrimson
links
XML.com
|
|
Notes from Enterprise IA discussions (Sydney) ( Column Two ) |
| |
I presented at the Oz-IA conference today in Sydney on "Succeeding at IA in the enterprise". I'll share the presentation file as soon as I work out why it won't let me upload the file to my site. In the... 2006-10-01T16:56:24+10:00
(link) [ Column Two ]
|
|
Presentation: Oz-IA conference (Sydney) ( Column Two ) |
| |
I gave a presentation today at the inaugural Oz-IA conference in Sydney. The topic of the talk was on "Succeeding at IA in the enterprise", covering: Reworking our methodologies Taking a strategic approach Tackling organisational change Understanding technology Taking a... 2006-10-01T17:23:11+10:00
(link) [ Column Two ]
|
| |
Many intranet teams see themselves as battling resistance to change when attempting to grow the intranet or deliver new functionality. The challenge is perceived as overcoming these barriers to a successful intranet. In practice, though, the real enemy of intranets... 2006-09-30T14:44:18+10:00
(link) [ Column Two ]
|
|
The intranet homepage, protect it with a policy ( Column Two ) |
| |
The intranet homepage can be the most coveted piece of online real estate in your organisation. Everyone will have their own firm view as to how the homepage should be used to drive organisational imperatives. Managing these competing priorities is... 2006-09-30T14:37:57+10:00
(link) [ Column Two ]
|
| |
There are two major elements to most web redevelopment projects: the redesign of the existing site, and the selection of a new (or replacement) content management system (CMS). These two elements reflect the underlying issues that typically drive web projects:... 2006-09-30T14:50:28+10:00
(link) [ Column Two ]
|
| |
Scott Berkun has written an article on the ideal designer and project manager. To quote: One question I'm often asked is what is the ideal designer? - I get this from managers or VPs in tech companies, trying to figure... 2006-09-30T15:32:48+10:00
(link) [ Column Two ]
|
| |
I'm going to experiment with splicing ads in my RSS feed. I've joined Explore Social Media (a FeedBurner Network). If any subscribers object to this, please let me know in comments and it will weight heavy in my decision. I'm... 2006-09-28T18:55:34-07:00
(link) [ Ross Mayfield's Weblog ]
|
| |
This week I participated in a workshop with the CIA on blogs and wikis. What was fascinating was not just that the participants included Clay Shirky, David Weinberger, Jerry Michalski, Eugene Kim, Marcia Conner and Jay Cross. The agency perhaps... 2006-09-28T07:54:13-07:00
(link) [ Ross Mayfield's Weblog ]
|
| |
Toby Ward has written an article on branding the intranet. To quote: Does this mean though that the intranet home page should look like the Internet home page? No it doesn't. It should not be a replication of the external... 2006-09-28T11:41:42+10:00
(link) [ Column Two ]
|
| |
The only public class I’m giving in the U.S. this year will be in Wisconsin, on October 18-19. It will be a version of my Rapid Software Testing Class, focusing on Exploratory Testing.
Details can be found at http://wisqa.org/bachclasses.htm
Wed, 27 Sep 2006 18:57:05 +0000
(link) [ James Bach's Blog ]
|
| |
My examples below use a simple rule for deciding what values
of a boolean expression to test. I should probably describe it and
justify it.
Given an expression with all ands like X1
and X2 and ... and Xn, you use these
test values:
One case: all the Xi's are true.
N cases. In each, all
the Xi's are true except
for one that's false. (A different one every time.)
The way I think about it is that, for
each Xi, there's an example that shows the
whole expression is false exactly and only because of it.
So the table for (A and B and C) would be this:
|
A and B and C
|
|
A
|
B
|
C
|
|
expected result
|
t
|
t
|
t
|
|
t
|
F
|
t
|
t
|
|
F
|
t
|
F
|
t
|
|
F
|
t
|
t
|
F
|
|
F
|
|
The case for or-expressions is similar: just flip all
the trues and falses:
|
A or B or C
|
|
A
|
B
|
C
|
|
expected result
|
f
|
f
|
f
|
|
f
|
T
|
f
|
f
|
|
T
|
f
|
T
|
f
|
|
T
|
f
|
f
|
T
|
|
T
|
|
The reasoning behind these rules is based on mutation
testing, the name for a long thread of academic research on
testing. The way I state it (which is different in an unimportant
way from how it's usually put) is that mutation testing involves
assuming that the code is incorrect in some definable way, then
asking for a test suite that can distinguish the incorrect code you
have from the correct code you should have.
Now, for any given program, there are an infinite number of
variants, so mutation testing depends on picking a
definition-of-incorrectness that (a) lets you generate a reasonably
small set of alternatives, but (b) gives you confidence that you've
caught all the plausible errors. The usual approach is to
assume one-token errors.
For example, suppose you are given (A and B or C). Maybe
it should be (A or B and C) or (A and not
B or C) or (A and (B or C)).1
One-token errors aren't the only ones you could make. For example,
you might completely forget that D ought to be involved in the
expression—it should be (A and B and C and
D). That's
a fault of
omission, and mechanical techniques aren't good at
them. Nevertheless, one-token errors seem to work pretty well for
boolean expressions.
Suppose you have the original (A and B or C) and a
variant (not A and B or C). The test
value (A=true,B=true,C=true) distinguishes the two,
because the given expression yields true while the
possibly-more-correct variant would yield false. So,
when you run the original program and its variant2, that test case will produce
one answer in the original and a different one in the variant. One
of them's got to be wrong. If it's the original program, you've
found a bug. If it's the variant, you know that variant cannot be
the correct program (the original is not incorrect in that way). In
the jargon, the mutant is killed.
Trying all the possible combinations of variable values will either
find a one-token error or kill all the mutants. But you never have
to try all of them. There will be some test inputs that don't add
anything: any mutant they kill will be killed by some other test
input. So you can construct a minimal set for any given expression.
If you look at the table below, you can see that the rule
for and-expressions I gave above is justified; the
cases I give kill all the mutants. (In the table, the first row is
for the expression as given; each row below it is a mutant. The X's
in a cell means that column's test case kills that mutant.)
|
|
|
|
|
|
|
|
|
|
|
A && B && C
|
T |
f |
f |
f |
f |
f |
f |
f |
|
!A && B && C
|
f / X |
f / |
f / |
T / X |
f / |
f / |
f / |
f / |
|
A && !B && C
|
f / X |
f / |
T / X |
f / |
f / |
f / |
f / |
f / |
|
A && B && !C
|
f / X |
T / X |
f / |
f / |
f / |
f / |
f / |
f / |
|
A && B || C
|
T / |
T / X |
T / X |
T / X |
f / |
f / |
T / X |
f / |
|
A || B && C
|
T / |
T / X |
T / X |
T / X |
T / X |
f / |
f / |
f / |
|
A && B
|
T / |
T / X |
f / |
f / |
f / |
f / |
f / |
f / |
|
A && C
|
T / |
f / |
T / X |
f / |
f / |
f / |
f / |
f / |
|
B && C
|
T / |
f / |
f / |
T / X |
f / |
f / |
f / |
f / |
|
Remember all this assumes that tests powerful enough to catch
one-token errors will catch more complicated (but still plausible)
errors. A way to convince yourself is to try and find a variant
of (A and B and C) that won't be caught by these test
cases. Ask yourself if it's at all plausible that you'd make such an
error. (Remember: we've already conceded faults of omission.)
These rules are easy to memorize. The cases for expressions that
mix and and or are not. A long time ago, I
wrote a program that generates probably-minimal test sets for any
given boolean expression (including relational operators
like a<b). Timothy Coulter and Curtis Pettit,
students of Cem Kaner, made it
more capable and gave it a web UI. Here it
is: http://www.oneofthewolves.com/multi/applet.html.
When using the style I described earlier, I don't think you need
multi, because I'm tentatively advocating always breaking tables that
combine ands and ors into separate tables
that do not.
1 I can't remember if the transformations I used when
working all this out included substituting one variable for another
(like (A and B and A)). Multi, described after this
footnote, doesn't. I don't think it would make a
difference—certainly it doesn't in this particular example—but I'm not
going to bother to check.
2 I'm leaving what it means to "run
a program" vague. That gets to the difference of whether the
mutation is "weak" or
"strong". See this post
by Ivan Moore. I didn't find
much in the online literature about mutation testing; if you want to
know more, you'll have to go to the library. There are some starting
references at the end
of this
paper (PDF).
( link) [ Exploration Through Example ]
|
| |
I'm too sick to write what I should be writing, and I can't sleep, so
I decided to
collect my thoughts and references about a current political
topic I've been studying as I have time. The normal sort of
posts will return shortly, but for the moment I'll use whatever reputation I have for careful-but-sympathetic
thought to push back against an all-but-inevitable failure.
My understanding is
that habeas
corpus is a method by which prisoners can challenge their
imprisonment before a judge. The idea has worked pretty well
for 700 years. It fits with John Adam's phrase
"a government of
laws, not men": no one has exclusive power; everyone is subject
to being checked and balanced.
It is now due to be removed in
a hastily-considered
bill. Despite
what some say, the
idea of habeas is not to "give terrorists rights"; it is to preserve
the rights of those wrongly accused as terrorists or unlawful combatants. There have
been many
such people already. Sometimes people are just detained; some
are sent
to Syria and tortured.
The bill allows for review of detentions by military commissions, but to date
only ten have
been held. People can be held forever without any
recourse. (Some people have continued to be held even after review found them innocent, though a large number have
been released.) In newer versions of the bill, "people" can
include US
citizens. Unlike the military's current definition of unlawful combatant, which covers only
"those who engage in acts against the United States or its coalition
partners in violation of the laws of war and customs of war during
an armed conflict," the new one covers anyone who "has engaged in hostilities or who
has purposefully and materially supported hostilities against the
United States" or its military allies. Who are our allies? What does
"material support" mean? I guess some of us might just find out.
During detention, what? It is simply not the case, as the President
stated, that Geneva Convention Common Article 3 is impossibly
vague about the treatment of prisoners. Ironically, on the same day as that statement, the US
military released
its new
procedures, which explicitly conform to the Geneva
Conventions. It's not surprising that, in over fifty years, we've
been able to come to agreement about what the Conventions require. But now we're
going to replace them with new language that will have to be
freshly interpreted. Everyone, save the people who'll actually be
making the decisions—who refuse to commit themselves—is running around saying
"waterboarding
is allowable" or "waterboarding is not allowable", but that's
silly. In the absence of court review, what's allowable is whatever's
done. The legal principle is that
"there is
no right without a remedy."
(Stories about what's being done will leak, I suppose, as they always
do. That could lead to some sort of remedy. I wonder if
leaking, receiving, or reporting leaks counts as "material
support"?)
The pros
apparently don't think torture
is effective:
I am absolutely convinced [that] no good intelligence is going to come
from abusive practices. I think history tells us that. I think the
empirical evidence of the last five years, hard years, tell us
that. . . . Moreover, any piece of intelligence which is obtained
under duress, through the use of abusive techniques, would be of
questionable credibility, and additionally it would do more harm than
good when it inevitably became known that abusive practices were
used. And we can't afford to go there.
Some of our most significant successes on the battlefield have been --
in fact, I would say all of them, almost categorically all of them,
have accrued from expert interrogators using mixtures of authorized
humane interrogation practices in clever ways, that you would hope
Americans would use them, to push the envelope within the bookends of
legal, moral and ethical, now as further refined by this field manual.
We don't need abusive practices in there. Nothing good will come from them.
(From the announcement of the new procedures, above.)
But there's no institutional check on the non-professionals or the
rogue professionals. We'll just have to rely on
the moral character of everyone involved. That's of course entirely
opposed to the American tradition of rule by laws, not men, but
<sarcasm> apparently we face a threat more grave than the 45,000
nuclear warheads the Soviet Union had at its peak and a struggle
more threatening than World War II, and so cannot afford the
traditions that have
worked for more than two hundred years </sarcasm>.
We certainly face
threats—always have, always will—but I don't see any
reason to give into the "this time it's
different" fallacy.
All this matters to me because my parents grew up in Nazi
Germany. I grew up knowing that cultures can descend into
madness, and that it can happen without the majority ever really
explicitly willing it or being really conscious of it. No, I'm not saying that America is
just like Nazi Germany; I'm saying that men like my
grandfather—not politically involved, just trying to live
their lives—somehow, through fear or anger or depression or
just passivity, let decency slip out of their grasp.
It also matters because I grew up knowing that the Americans were the
good guys. My father (in the German Navy) was captured near
Marseille. He didn't mind; he and his fellows didn't fight
back. They wanted out of the war, and they wanted to surrender to the
safest force: the Americans. Prisoner of war camp (American and
French) was no picnic—my father weighed 130 pounds when he got
out—and there was abuse, but it was not institutionalized
(except in one camp, for a short time). He got what he expected, and
he believes he has no cause for complaint.
In contrast, my Uncle Paul was captured by the Soviets on the
eastern front. I imagine he fought harder than my father to avoid
capture, because everyone knew what happened to Russian prisoners. And it
did happen: it was 1950 before he even knew the war was over, and he
came home broken for life.
There's practical value to being seen as the good guys, the just
guys, the humane guys. That's not just true when fighting Germans;
it
works in the middle east, too.
Out of fear or anger or depression or
just passivity, we're letting our elected representatives—our
employees—reinforce hysteria to no effective end.
If that bothers you,
here
is your Senator's contact information,
and here is
your Representative's.
Although this bill is being pushed by Republicans, I believe it
should not be a partisan issue. The bill does not square with
the conservative tradition
of Chesterton's
gate. It's being rushed through because what being a Republican
politician
today means is all about winning at domestic politics. (Just as
being a
Democratic politician appears to be all about not losing.) I
can echo the
the author of this
fantastic essay: I miss Republicans. I miss Eisenhower;
he'd surprise
you.
( link) [ Exploration Through Example ]
|
| |
Steve Yegge: “Up until maybe a year ago, I had a pretty one-dimensional view of so-called ‘Agile’ programming, namely that it’s an idiotic fad-diet of a marketing scam making the rounds as yet another technological virus implanting itself in naive programmers who’ve never read ‘No Silver Bullet’, the kinds of programmers who buy extended warranties and self-help books and believe their bosses genuinely care about them as people, the kinds of programmers who attend conferences to make friends and who don’t know how to avoid eye contact with leaflet-waving fanatics in airports and who believe writing shit on index cards will suddenly make software development easier.”
See also Extreme Programming Refactored: The Case Against XP.
Not loving your job? Visit the Joel on Software Job Board: Great software jobs, great people.
27 Sep 2006 19:33:11 EST
( link) [ Joel on Software ]
|
| |
“If you limit your choices only to what seems possible or reasonable, you disconnect yourself from what you truly want, and all that is left is compromise.”Over the past couple of weeks, I've reached my Gmail storage limit, currently 2768... 2006-09-27T07:48:42-07:00
(link) [ Ross Mayfield's Weblog ]
|
|
Introducing collaboration technologies to the enterprise is a challenge ( Column Two ) |
| |
Dennis McDonald has written a piece on the challenge of introducing collaboration technologies in the enterprise. To quote: Successful collaboration tool introduction is based less on the characteristics of the tool itself than on the motivation users have to use... 2006-09-27T13:26:59+10:00
(link) [ Column Two ]
|
| |
Shrini writes: How does a good tester keep his testing abilities sharpened all the times. compare it with keep our body fit as we grow old ( walking, jogging and going to Gym, eating healthyfood etc) - what you suggest for keeping “Tester health” in ‘fit and sound” condition?
Testing is analysis and problem solving. Here [...] Mon, 25 Sep 2006 06:56:04 +0000
(link) [ James Bach's Blog ]
|
| |
Using Fit to describe boolean (yes/no) decisions can be much
clearer if you just insist that all decisions be expressed in
multiple, uniform, simple tables. No boolean expressions in the code
may mix ands and ors, but that's not a bad
idea anyway in this age of small methods and ubiquitous languages.
Suppose you're given a jumble of three packs of cards. You are to
pick out every red numbered card that's a prime, not rumpled, and is from
either the Bicycle pack or the Bingo pack (but not from the Zed
pack). Here is a way you could write a test for that using
CalculateFixture:
|
which pack?
|
color?
|
prime?
|
rumpled?
|
|
select?
|
|
Bicycle
|
red
|
3
|
no
|
|
yes
|
|
Bingo
|
red
|
3
|
no
|
|
yes
|
|
Zed
|
red
|
3
|
no
|
|
no
|
|
Bingo
|
black
|
3
|
no
|
|
no
|
|
Bingo
|
red
|
4
|
no
|
|
no
|
|
Bingo
|
red
|
Queen
|
no
|
|
no
|
|
Bingo
|
red
|
Ace
|
no
|
|
no
|
|
Bingo
|
red
|
3
|
yes
|
|
no
|
|
I bet you skimmed over that, read at most a few lines.
The problem is that the detail needed to be an
executable test fights with the need to show what's
important. This is better:
|
which pack?
|
color?
|
prime?
|
rumpled?
|
|
select?
|
|
Bicycle
|
red
|
3
|
no
|
|
yes
|
|
Bingo
|
red
|
3
|
no
|
|
yes
|
|
Zed
|
red
|
3
|
no
|
|
no
|
|
Bingo
|
black
|
3
|
no
|
|
no
|
|
Bingo
|
red
|
4
|
no
|
|
no
|
|
Bingo
|
red
|
Queen
|
no
|
|
no
|
|
Bingo
|
red
|
Ace
|
no
|
|
no
|
|
Bingo
|
red
|
3
|
yes
|
|
no
|
|
That highlights what's important: any card must
successfully pass a series of checks before it is accepted. This test
better matches what you'd do by hand. Suppose the cards were face
down. I'd probably first check if it were rumpled. If so, I'd toss
it out. Then I'd probably check the back of the card to see if it
had one of the right logos, flip it over, check if it's black or a
face card (two easy, fast checks), then more laboriously check if it
matches one of the prime numbers between 2 and 10 (discarding Aces
at that point).
The code would be slightly different because it has
different perceptual apparatus, but still pretty much the same:
return false if card.rumpled?
return false if card.maker == 'Zed'
return false if card.color == 'black'
return false if ['2', '3', '5', '7'].include?(card.value)
return true
|
It does bug me that the table looks so much more complex than the
code it describes. It still contains a lot of words that don't
matter to either the programmer or someone trying to understand what
the program is to do. How about this?
|
All the following must be true to accept a card:
|
|
description
|
example
|
counterexample
|
|
the right manufacturer
|
Bicycle, Bingo
|
Zed
|
|
the right color
|
red
|
black
|
|
the number is prime
|
2, 3, 5, 7
|
4, Ace, Queen, etc.
|
|
the card is unrumpled
|
yes
|
no
|
|
From this, the Fit fixture could generate a complete table of all
the given possibilities, run that, and report on it.
(Side note: why did I pick Queen as a counterexample instead of Jack
or King? Because if the program is storing all cards by number, the
Queen will be card 11. Since I'm not going to show all
non-primes—believing that more trouble than it's worth—I
should pick the best non-primes.)
The same sort of table could be created for cases where any one
of a list of conditions must be true.
Now, many conditions are more complicated than all of
or none of or any one of. However, all conditions
can be converted into one of those forms. Here's an example.
Suppose
you're allowed to pay a bill from an account if it has enough
money and either the account or the "account view" allows
outbound transfers. That would be code like this:
class Account
def can_pay?(amount)
balance >= amount && (self.may_transfer? or view.may_transfer?)
end
|
However, that could also be written like this:
class Account
def can_pay?(amount)
balance > amount && is_money_source?
end
def is_money_source?
self.may_transfer? or view.may_transfer?
end
|
I claim that code is just as good or even better. It's better
because there's less of a chance of a typo leading to a bug
(writing a && b || c instead of a && (b ||
c)). It's also arguably better because a new word and perhaps
idea have been introduced into the project language: "money
source". I think finding the right words is often important.
The corresponding tables would be like this:
|
All of the following are required to pay a bill:
|
|
the balance must be sufficient
|
|
the account must be a money source
|
|
One of the following is required to be a money source
|
|
the account may transfer
|
|
the accounts view may transfer
|
|
In this particular case, I left off the Example
and Counterexample columns because they're obvious. I'd
expect the fixture to fill them in form me. I didn't include a table about
the balance being correct because I wouldn't think the programmers
would need it, nor would others need it to believe the programmers
understand it.
One thing that worries me about this is that the table doesn't rub
your nose in combinations. Such a table is more likely to force
you to discover business rules you'd forgotten about, that you'd
never
known about, or that no one ever knew about. (Well, it does that for
a while - until the
tedium makes your mind glaze over.) In a way, this fixture makes
things too easy.
On the other hand, there's something to be said for protecting later
readers from the process through which you convinced yourself you
understood the problem.
I'm tempted to launch into implementing this, but I have other
things to work on first.
( link) [ Exploration Through Example ]
|
|
Melbourne, Sydney, London and Rotterdam ( Column Two ) |
| |
It's going to be a busy few weeks in terms of conferences, four in three weeks: Southern Currents (Melbourne) I'm going to be giving an extended presentation to a room full of legal librarians on the design and enhancement of... 2006-09-24T20:17:12+10:00
(link) [ Column Two ]
|
| |
Toomas Hendrik Originally uploaded by MukiFuki. The first Estonian diplomat I ever met, Toomas has been elected President of Estonia. Back when I worked at the U.S.-Baltic Foundation and through when I worked for Lennart Meri, Toomas was the ambassador... 2006-09-23T19:32:52-07:00
(link) [ Ross Mayfield's Weblog ]
|
| |
Press! I have a 50mm macro lens for my camera, and it's a joy to work with. What I love the most is being able to make extraordinary photos out of the most mundane of situations, such as this... 2006-09-23T23:31:21+10:00
(link) [ Column Two ]
|
|
The compelling business reason for a global intranet ( Column Two ) |
| |
Jane McConnell has written a piece on the compelling reason for a global intranet. To quote: I was recently asked to help a company define the compelling reasons they should have a global intranet. In other words, why not just... 2006-09-23T17:06:27+10:00
(link) [ Column Two ]
|
|
The importance of user experience: the poster ( Column Two ) |
| |
Frank Spillers has posted details on the poster presenting the importance of user experience. To quote: Here's a poster that reflects some thoughts about user experience...all of the bottom row items (outcomes of positive user experiences) in the poster are... 2006-09-23T18:58:07+10:00
(link) [ Column Two ]
|
| |
Maria writes:
A) Your presentation “Test Strategy: What is it? What does it look like?” applies to creating a test strategy for a specific application (I’ve also read Ingrid B. Ottevanger’s article on “A Risk-Based Test Strategy”). How can I apply the idea to an overall test strategy for the company that I’m working for? Is [...] Fri, 22 Sep 2006 20:46:00 +0000
(link) [ James Bach's Blog ]
|
| |
I read Tom Wolfe's The Right Stuff a zillion years ago. One
passage hit me then, and it's stuck with me. The time is somewhere
in the beginning of the Mercury program:
Asking
Gus [Grissom]
to "just say a few words" was like handing him a knife
and asking him to open a main vein. But hundreds of workers are
gathered in the main auditorium of the Convair plant to see Gus and
the other six, and they're beaming at them, and the Convair brass
say a few words and then the astronauts are supposed to say a few
words, and all at once Gus realizes it's his turn to say something,
and he is petrified. He opens his mouth and out come the words:
"Well... do good work!" It's an ironic remark, implying "... because
it's my ass that'll be sitting on your freaking rocket." But the
workers start cheering like mad. They started cheering as if they
had just heard the most moving and inspiring message of their
lives: Do good work! After all, it's little Gus's ass on top
of our rocket! They stood there for an eternity and cheered their
brains out while Gus gazed blankly on them from the Pope's
balcony. Not only that, the workers—the workers, not the
management but the workers!—had a flag company make up a huge
banner, and they strung it up high in the main work bay, and it
said: DO GOOD WORK.
That came to mind when I
read this
abstract:
This paper presents a fully independent security study of a Diebold
AccuVote-TS voting machine, including its hardware and software. We
obtained the machine from a private party. Analysis of the machine,
in light of real election procedures, shows that it is vulnerable to
extremely serious attacks. For example, an attacker who gets physical
access to a machine or its removable memory card for as little as one
minute could install malicious code; malicious code on a machine
could steal votes undetectably, modifying all records, logs, and
counters to be consistent with the fraudulent vote count it
creates. An attacker could also create malicious code that spreads
automatically and silently from machine to machine during normal
election activities—a voting-machine virus. We have constructed
working demonstrations of these attacks in our lab. Mitigating these
threats will require changes to the voting machine's hardware and
software and the adoption of more rigorous election procedures.
Since this is by no means the first report, I feel safe in saying
Diebold is not DOING GOOD WORK.
I wish people who could matter—that especially means
you, Fourth
Estate—cared. We're all on top of the freaking
rocket. (Not just the US, since the size of our military and economy
puts much or all of the world on the rocket too.)
I'm sure there are people at Diebold who feel embarrassed or even
humiliated by what their company is selling. If any one of them wants
throw caution and good sense to the winds and hang up a DO GOOD WORK
banner, I'll buy it for you. Seriously.
( link) [ Exploration Through Example ]
|
| |
This morning we announced Socialtext 2.0. Techcrunch has the story. This screencast gives an overview of the first major enhancement, the UI: Charlie Wood highlights the second part, Wiki Web Services.In addition to UI enhancements, SocialText 2.0 adds what the... 2006-09-21T12:07:44-07:00
(link) [ Ross Mayfield's Weblog ]
|
| |
Remember when I complained that my Mac kept freezing with bouncing beach balls?
A lot of people suggested it might be a hardware problem, but the diagnostics on the setup disks didn't find anything.
Well, Daniel Jalkut over at Red Sweater Software suggested that I look in the console app to see what was going wrong, and lo and behold, there were lots and lots of messages that said:
Sep 19 22:56:39 joel-spolskys-computer lookupd[711]: NetInfo connection failed for server 127.0.0.1/local
This totally corresponded to what I was seeing... suddenly any app that tried to do a DNS lookup of any sort would go into permanent beachball mode and never recover.
Some Googling around led me to a page by John Bafford that said "Lookupd has a bug (rdar://3632865) in its cache cleanup code that causes it to randomly crash. CrashReporter, the system crash log agent, does not properly handle lookupd crashes, and as a result, when lookupd crashes, the process is not terminated. Since lookupd has not terminated, mach_init does not respawn lookupd. From this point, any application that attempts to access lookupd, either directly or indirectly, will hang."
Hmmph. Kindly, John provides Unlockupd, a daemon that watches lookupd and restarts it if it gets jammed up.
I'll try this for a while and see if it helps. In the meantime, if it's true, it's odd that Apple hasn't fixed this bug in over two years. If somebody inside Apple wants to peek into that bug (link only works inside Apple) and let me know what they see there, I'll update this article!
21 Sep 2006 16:18:36 EST
(link) [ Joel on Software ]
|
| |
Lou Rosenfeld has published the results of IA surveys conducted over the last few months. To quote: For the new edition of the polar bear book (almost done!), Peter Morville and I conducted five surveys of the information architecture community.... 2006-09-21T20:16:16+10:00
(link) [ Column Two ]
|
|
Introduction to the Intranet Leadership Forum ( Column Two ) |
| |
As revealed a few days ago, we've embarked on a brand new initiative, the setting up of the Intranet Leadership Forum. We're still pulling together all the details, but I can provide a sneak peak into the structure of the... 2006-09-21T20:45:02+10:00
(link) [ Column Two ]
|
|
Why people don't use collaboration tools ( Column Two ) |
| |
I've been invited to
the Software
Practice Advancement Conference. The idea appeals: expense-paid
trip to London, opportunity to rouse the rabble along some lines
I'll be previewing here as I have time, and a conference that's said to be
good (I've never been). On the other hand, I hate overseas flights
because I can't sleep on planes, and Dawn almost certainly can't come
with.
Here's what would tip me over the edge. There are lots of people I
could learn from in London. If there are teams there who do
something really well (making small stories, writing FIT tests,
release planning, etc. - anything), I would like to come work with
you for several days. Not just visit and watch, but act as much like
a team member as I can. Let me
know.
P.S. The idea of visiting practice is part of what I want to rouse the rabble
to, something that lives in the same space as
the MFA for
Software, something that's part of my formal discussion of Jim
Waldo's OOPSLA essay
On
System Design, which will be titled something
like Surviving in a World of Ever-Looming Malignity: Or,
Monasticism for the Married.
( link) [ Exploration Through Example ]
|
| |
If you use Blogger.com for your blog, you’ve just lost a subscriber. Sorry, I really liked your content, but the constant and random switches that Blogger makes between full and partial feeds has finally broken my will.
Several times a day I end up with dozens of “new” items in my reader simply because the feed contents changed from a full to a partial feed or vice versa. For a while, I just told my reader not to re-display updated feed items, but it seemed that every time a feed was actually updated, Blogger decided to show a partial item.
Blogger was a pioneer — even I used Blogger for a year shortly after starting this blog. But it seems that Google’s ignoring their acquisition. Things aren’t getting better, they’re getting worse.
See also:
Blogger Pro,
Introducing Feed Crier,
Radio Blogger,
Projects need leadership
Tagged as: blogger bubblegeneration feed missrogue mitadlab
Wed, 20 Sep 2006 15:51:42 -0800
( link) [ Adam Kalsey ]
|
| |
Scott Berkun has posted the results of an innovation survey that he conducted. To quote: Last month I ran an open survey on innovation to help with my book in progress. Nearly 100 people from scientists, to programers, to writers... 2006-09-20T10:19:10+10:00
(link) [ Column Two ]
|
| |
One of the techniques I use for my own technical education is to ask someone a question or present them with a problem, then think through the same issue while listening to them work it out. As it proceeds, I ask handfuls of Socratic questions. As I ask each question out loud, I answer it [...] Wed, 20 Sep 2006 01:58:15 +0000
(link) [ James Bach's Blog ]
|
| |
Over the last six months, Sprint has been trying to get bloggers (like me) to write about their new Power Vision Network by sending us free phones and letting us download music and movies and use the phones for free.
That’s rather nice of them, but honestly, I have a really strong aversion to writing about things just because some PR person wanted me to. Basically, there’s no better way to make me not want to write about something than to ask me to write about it. I accepted the free phone because, gosh, well, it’s a free phone, but I decided that I simply wouldn’t write about it no matter how much I liked it.
As it turns out, I had the opposite problem. The phone they sent me, an LG Fusic, is really quite awful, and the service, Power Vision, is tremendously misconceived and full of dumb features that don’t work right and cost way too much. So I’m going to review the dang phone anyway, even though if anybody from Sprint is paying attention they’re going to lose their lunch and some executive bonehead over there is going to go nuts and I sincerely hope that this doesn’t put an end to the entire free-phones-for-bloggers boondoggle, because I’d hate to get beaten up at Etech next year by all the other bloggers who would hate me for spoiling all the fun.
Now, on to the review. I was pretty excited to try out this phone because I’ve been longing for one that could double as a decent MP3 player. Most days, I get to work via a combination of subway and walking, which takes about half an hour, and listening to podcasts makes the commute much more pleasant. So I’ve been carrying a phone (a Motorola RAZR) and an iPod (Nano) with me everywhere. Merging the two into one device would be great.
When it finally arrived, the physical appearance of the phone was rather disappointing. If you’ve been spoiled by Motorola’s latest phones, or the seamless, screwless, elegant iPod, the LG Fusic will strike you as butt-ugly. Where a Motorola RAZR has a solid case made out of almost sensual matte-black steel that just feels great, the LG Fusic is made out of the cheapest kind of gray plastic, the same material you find on a $3 toy. Where Motorola goes to great lengths to hide the screws, and minimize bumps and seams, the LG Fusic has dozens of ugly protuberances, gaps, holes, screws, seams, etc. Worst of all, the LG Fusic has no less than three of those evil, flimsy, rubbery plug-caps that are connected to the phone by the thinnest of filaments. You know, those stupid rubber plugs that you have to pull away to plug anything into the phone, and then they just dangle there like chicken wattles (when they’re not getting in the way of the thing you’re trying to plug in) for a couple of weeks until they finally tear off. The phone is almost twice as thick as a RAZR. It comes with a break-offable front plate which can be used to change the accent color of the very front of the phone. Your choices are Barbie Pink, Barbie Green, Barbie Blue, and Black which would be the only stylish choice, if only it didn’t clash so badly with the rest of the phone. (Believe me, it is hard to make black clash with anything, but LG did it.) Overall this phone seriously looks like a Fisher Price toy, not a top-of-the-line cell phone.
OK, maybe you’re not so vain that appearances are a big deal. I tried to get over it. I really did. I promise I won’t talk about the style thing any more.
I opened the clamshell and turned on the phone.
The screen lit up instantly! Wow, something about this phone is nice.
Oh, wait a minute. What’s going on there?
The main screen shifts between pictures of Mount Fuji, the Eiffel Tower, etc. That’s charming. But what’s that bus?

There’s a cheezy little black and white child’s drawing of a bus bouncing up and down in front of the cheezy tourist pictures. Again with the Fisher Price Toy theme. The first thing I try to do is find a better screen saver. Everything looks like some kid’s 6th grade BASIC graphics project. Oooh, look, colored squares flying around. Terrible clip art of a “DJ”. One of the screen savers is called “Funny.” You get a silhouette of a lizard climbing around on a pink background. Bwa ha ha! That is funny. TO TWO YEAR OLDS.
OK, ok, I promised I’d stop talking about style. On to UI design.
The main menu was really, really confusing.
The first thing you see when you click on the Menu button is that you missed some alerts:

Although, it turns out, you didn’t, that's just the name of the menu item that comes up first.
You can’t see all the icons at once because someone had the bright idea of using a weird 3-D perspective, and the currently selected icon comes zooming out in front, covering up some of the other icons. All the unselected icons are shown in silhouette, so at first they just look like a background. It took me quite a while to figure out just what the menu was and how to find things I wanted from the main menu.
But don’t worry… there are random bits of sparkle that fly around on the screen. That’s the important part. The random bits of sparkle, again, a 6th grader’s BASIC graphics project.
Now, on to the whole reason I wanted this phone: the MP3 player.
There’s no desktop integration, no ITunes integration, no feature for subscribing to Podcasts, nothing like that. When you plug the phone into your computer using the supplied USB cable, it thinks you want to use the phone as a modem. Yes, one day I might want to do that, that’s true, but for now I just wanted to get MP3s onto the thing. Somehow, somewhere, I managed to stumble on a menu that made the phone act like a USB hard drive. Tada! The phone pops up on my computer looking like a hard drive. And then there was already a MUSIC folder there, and I could drag MP3 files in. Yay! I downloaded TWiT episode 69 manually and headed off to the subway to listen to it.
Wait… I need headphones. Ahh, here they are. Wait a minute. The headphone cord is only about 8 inches long. Am I supposed to hold the phone up to my chin to listen to music?
Oh, I see, there are two cords. You have to plug the headphone cord into the microphone cord and plug that into the phone. Now it’s long enough. OK, it’s awkward, but I can live with that.
To listen to the MP3s you’ve downloaded:
- Hit the MENU button
- Find the ON DEMAND menu item (I demand to hear MP3s!)
- Nope, that’s not what you wanted
- Hit BACK
- Nothing happens (darn!)
- OK, try END
- Do you want to exit this application?
- YES is already highlighted. Click OK.
- Huh? The application didn’t exit.
- Click END again.
- YES is already highlighted… oh… wait a minute! Maybe NO is highlighted? There’s no way to tell the difference. There are two choices, one is white and one is blue, it’s hard to see which is highlighted.
- Fool around with the cursor keys until you’re pretty sure that YES is highlighted. This is confusing, because the two-item menu wraps around, so the up button moves down and the down button moves up, or vice versa.
- Remove the battery and put it in again. That should get you back to the main menu.
- Media player? Is that what you want?
- Yeah, there’s something in here called Music…
- It has about 50 options. What do they mean? SIRIUS hits? MUSIC CHOICE? SIRIUS MUSIC? Some of them are listed as My Channels and some are listed as Available Channels. Which is which? The UI here is really getting confusing.
- OK, none of those options lets you listen to MP3s. It turns out there’s something called MUSIC on the Main Menu.
- Ahh, that brings up the happy “booting Java” screen which is so heartwarming. Thank you Sun Microsystems for bringing programming language advertisements into consumer electronics.
- The Java applet has two tabs, “Store” and “Player.” Try buying a song. It’s $5 for 3 songs. That’s a ripoff, Sprint. Apple already established that the fair price for one song is $0.99.
- OK, I just want to listen to Leo Laporte, dammit. Maybe the Player tab?
- Gotta choose between “All My Music” and “Create Playlist…”.
- W00t! THERE’S TWiT!
- Click on it, and listen to TWiT.
All right. TWiT is more than an hour long, and I only listened to half of the episode by the time I got home. Luckily, there’s a handy PAUSE button on the outside of the clamshell. Unluckily, it doesn’t work. Pressing it once informs you that the buttons are locked, and you have to press and hold the pause button to unlock. So you do that, and the key guard goes off, and you press the pause button again, and nothing happens, so you press it again, and finally you’ve paused the music.
In the meantime, if, say, hypothetically, you were pausing because you live in a country where the police brutalize people, and a policeman was brutalizing you, and you wanted to stop the music so you could try to figure out what the policeman wanted and perhaps there was some way if you could just hear him that you could get him to stop beating you with a riot bat, you’re already DEAD by the time you figure out how to make the pause button actually pause.
While the MP3 player is paused, the backlight on the external display just won’t go off. So inadvertently, the phone almost completely runs down its battery overnight staying in “Pause” mode.
Why not turn the phone off overnight? Well, because then I’d have to listen to the first half of TWiT all over again. Can’t you fast forward? No. Doesn’t it remember where you’re up to like an iPod? No. Pause is your only hope.
The next morning, with a single bar of battery juice left, I got into the subway and resumed listening to the podcast, and I’m a wise guy, so I decided to see what the battery looked like, and of course, the phone lost power, oops, lost my place in the Podcast.
Put back the battery. Turn on the phone. Go into the MP3 player again. There’s no signal, and, guess what? You can’t get into to the MP3 player unless you can establish a network connection to the Sprint Music Store. Even to play your own MP3s!
OK, so this is an MP3 player that doesn’t really work on the subway and won’t work on a plane, the two places I’m most likely to listen to MP3s. Not very appealing.
A little bit more exploring and I discovered that there’s another entirely separate MP3 player on this device. It’s hard to find. You have to go to Tools, then Memory Card, then to the Music folder, and another MP3 player starts up which you can use to listen to your MP3s. For this player, you don’t have to be on the network, so it works in the subway, but—get this—the minute you close the clamshell, the music stops! I am literally not making this up. There are two bad MP3 players on this device, neither one of which remembers where you’re up to, neither one of which can be used on the subway with the phone folded in my pocket, neither one of which has a fast-forward feature.
I have literally never seen such a useless MP3 player.
OK, onward. Yes, you can watch movies on this phone. For example, for $5.95 a month, you can get something called mFLIX. Until you pay the money, there’s no way to find out what mFLIX is or what it is you’re getting for your $5.95. I’ll tell you what you get: a bunch of garbage film-student videos that nobody would ever vote up on YouTube, in a tiny blurry window that reminds you of QuickTime 1.0 (“look! It’s on a computer but it’s moving!”).
That was disappointing. I thought this thing was supposed to have full length movies somewhere. Ah yes, how about “MSpot Movies?” It says I’m going to get “Full-length Hollywood movies.” Only $6.95 a month. Yes. Buy buy buy. (Thankfully Uncle Sprint is paying for this). Oh look… you can preview before you commit to spending! Clicking Preview brings up a page that says PREVIEW with a “Done” button. That’s it.
OK, maybe they don’t want me to preview. Fine. After you click Buy, you’re thrown back to a main menu somewhere and then you have to remember what the hell you bought and go find it again. Annoying UI, again.
OK, MSpot Movies. A menu comes up with a bunch of folders:
- Animaland
- Classic Cartoons
- Freestyle Motorcross
- Nightmare In Blood
- The Projectionist
- Heart of a Champion
- One Love
I don’t understand. Are these movie titles? Not movie titles I’ve ever heard of. Yep, it’s true. What you get for $7/month is about 10 movies that seem to be in the public domain. Literally nothing worth watching, least of all on a smudgy 1 5/8” (diagonal), pixelated screen. I did, actually, as a part of my sacred duty as a reviewer, try to watch a whole movie. I could only stand about the first 1/3rd of it, and the battery was dying, and the phone was getting too hot to hold. I cannot imagine anybody finding any value in MSpot Movies. If Sprint makes any money off of them, it’s probably by mistake. This service is literally as much of a scam as those X-Ray glasses they used to advertise in comic books to steal a few bucks from some little kids.
The only kind of content you might really want to watch on this device is the stuff you find on YouTube, or video podcasts like The Show with zefrank. But that’s not what Sprint gives you. Instead they give you $7/month, ripoff, non-previewable scammy garbage.
A long time ago, I was working on MSN 1.0, and there was a long line of content providers working to make deals with Microsoft to put their content on the Microsoft Network, but in those days, it wasn’t clear exactly who should be paying who, so hardly any deals got made. In the meantime, the whole Web thing happened, where anybody could provide content without signing a deal with a Microsoft executive, and there was tons of content, and some of it was garbage, yes, but some of it was good, and we found the good stuff, and it floated to the top, and all was well, but Sprint doesn’t get this. They relish their ability to serve as the gatekeeper to what they hope will become a new medium, because the gatekeeper gets to charge tolls. And it’s 2006, and I almost can’t believe I’m writing this, because way back in 2000 I wrote almost exactly the same thing about WAP, and how cell phone companies keep failing to insert themselves as toll collectors because they’re so darn clueless about how the Internet works, and about the value of many-to-many networks instead of broadcast networks.
And now suddenly someone at Sprint read some book by Scoble and then they read Malcolm Gladwell’s theories of tipping points in the airport and Hey Presto! Maybe we can make this work by finding the tipping point people! You know, the bloggers! And all the bloggers get free cell phones, and Sprint gets tons of publicity, but frankly all the publicity in the world is not going to help them foist on us a product that is utterly pathetic. The phones they send us are so lame there is literally no area you can go into without being disappointed and shocked at just how shoddy everything is and how much it costs and what a rip off scam they’re trying to run here with the music that costs too much and the movies that you don’t want to watch on the screen that makes them unwatchable and you just KNOW that if you call to cancel the extra $7/month, their customer service department is going to give you the phone menu runaround and then put you on hold for an hour and then you’ll get some cancellation specialist with an incomprehensible accent who will spend 15 minutes trying to talk you out of canceling the useless service until you just give up and let them have the goddamned $7 a month. No amount of pampering bloggers and calling them Ambassadors is going to get around the fact that you’re sending us plastic junk phones that look like bath toys. (Hey, does it float?) All the “tipping point” theories in the world won’t protect Sprint from the basic truth that the LG Fusic user interface could basically serve as an almost complete textbook for a semester-long course in user interface design, teaching students of usability exactly what NOT to do.
Wait a minute.
Wait just one minute.
Maybe I completely missed the point.
Maybe this phone is for four year olds!
It all makes sense now!
The nonsensical menus don’t matter—four year olds can’t read! The toy-like appearance—duh! The ripoff movies—who cares, as long as the kids press BUY by mistake and the parents keep paying the bills!
Now I get it.
So really the only stupid thing that Sprint did is to send this phone to a bunch of know-it-all, hipster-wannabe, pretentious early-adopter engadget-reading 41-year-old bloggers, with our pretentious black iPods and our sleek gun metal RAZRs and our MacBook Pros and our so-called “Podcast” listening habits, watching zefrank tell potty jokes about The Decider.
No no no no no. This phone is for 4 year olds, albeit spoiled 4 year olds with rich parents. They’ll love the colors, the plastic, the impossible UI, they can watch the one 1936 movie that inadvertently fell into the public domain in class when the teacher is getting boring, and they sure as heck aren’t going on a subway with that thing.
Ohhhhhhhhh kay.
I gave the phone to a friend’s 4-year-old.
NEVER MIND!
19 Sep 2006 17:08:03 EST
(link) [ Joel on Software ]
|
| |
MarkDown is a simple processor that converts text to HTML. For example, it converts &42;text surrounded by asterisks&42; to italics.
SmartyPants replaces "straight quotes" with “curly quotes” and makes a few other typographic improvements.
EditPad Pro is a very respectable text editor for Windows. It’s fast and contains scrillions of useful features. It’s not the fanciest thing in the world, but if you’re still using Notepad for the occasional bits of text, it’s a fine drop-in replacement.
Here’s what it takes to get them all working together on a typical Windows setup:
- Install Perl, if you don’t already have it. For Windows, the easiest way to do this is from ActiveState’s download page. Just download the Windows MSI package and run it. Make sure to choose the option to associate .pl files with Perl.
- Go into c:Perl and make a directory called markdown.
- Download Markdown and SmartyPants. Open the ZIP files and put Markdown.pl and SmartyPants.pl in the directory you just made, c:perlMarkdown.
- Also in that directory, make a little batch file named md.bat:
@echo off
c:perlmarkdownMarkdown.pl %1 > %~dpn1.tmp
c:perlmarkdownSmartyPants.pl %~dpn1.tmp > %~dpn1.html
del %~dpn1.tmp
"C:Program FilesMozilla Firefoxfirefox.exe" %~dpn1.html
- (You may have to change the path to the web browser you want to use to preview).
- In EditPad Pro, choose Tools | Configure Tools. Click New. Set the Caption to “MarkDown”, and set the Command Line to
c:perlmarkdownmd.bat %FILE%. You may want to check the box in the Files tab that says “Save the current file if it has unsaved changes.”
- Now you have a menu item Tools|Markdown which will save the file you’re working on and generate an HTML version of it (replacing the extension you used with .html), then it pops it up in a web browser so you can check it.
19 Sep 2006 11:21:40 EST
(link) [ Joel on Software ]
|
|