Redux: New Synchronisation Idea Overlooked By Microsoft

I promised earlier I'd look deeper into microsoft's products around Synchronisation -- here's the first thing I want to make clear:

FolderShare and SkyDrive are completely different

or to put that another way:

folershareDOES NOT EQUAL
FolderShare
SkyDrive
SkyDrive
 

But wait a second... are you retracting your earlier claims?

Yes and no. There is a massive fail here -- i'll get to that in a moment.

But first I want to clear up the differences between these two products.

SkyDrive is just online storage, and it has nothing to do with synchronizing those files to any location. There's no client side components (no shell extension, no explorer integration) no developer API -- nothing like that. But on the plus side it's 5 GIG, and it's deeply integrated with the spaces.live.com "on line presence" system.

FolderShare, on the other hand, is all about synchronizing files via the internet. There's no online storage at all. Instead you download and run a small client application (from here) on each of your machines, including Mac OSX. And thus, peer to peer connections can be established (i think they're encrypted and then proxied via microsoft servers) for synchronizing folders.

Each of these are very strong products, and very useful. You can find a lot of people who use and love these services.

Microsoft did a commendable thing when they bought foldershare, and made it free. Thank you!

But the massive fail belongs to...

The massive fail here belongs to the "cut and paste marketing" that's been used to push these two products.

It's a new term I'm coining for Marketing-Communication teams who plagiarise their own work.

Compare and contrast the difference in these two messages:

"Sharing with friends, co-workers, and family is easy..."
Folder Share marketing

"Sharing with friends, co-workers, or family is easy"
Sky Drive marketing...

And compare these two:

"access your personal files from anywhere online"
Sky Drive marketing...

"Access your files from any computer."
Folder Share marketing

The lesson for me is that while re-use is a Good Thing when writing code... it's not so good in the world of product positioning.

 

New Synchronisation Idea Overlooked By Microsoft Live team

folder sharemeshsky drive

Microsoft's Live team have lots of different offerings that let you synchronize your information from one place to another.

They've got Live Mesh, for sharing 'your digital world' here there and everywhere.

They've got Sky Drive, which lets you share files with yourself, your friends, anyone.

There's folder share, the start up company they bought out which does more or less the same thing.

There's something called office live workspace which lets you sync and collaborate and something else.

There's synctoy, which uses Sync Services for File Systems. It's a kind of Robocopy on downers, with a UI.

And then there's the grand daddy of all of these -- Ray Ozzie's offering, Groove.

Holy Fracking Jesus, Microsoft!

There's clearly one Synchronisation concept that escaped them completely.

They could've gotten together as a team, shared their ideas, and realized: Oh Crap! We're all building different versions of the same thing.

Instead of creating a tangle of overlapping and unmergeable products, why didn't they synchronise their thinking and work out what problem they're trying to solve.

And then build one compelling product, that's a joy to use, and which clearly solves that problem.


Not to mention sharepoint which let's you, well, share. Up to a point.

And, microsoft/ford sync for talking to your cars.

Or Microsoft Sync Framework.

Or, Live Labs Listas which helps you share lists.

Or, ActiveSync, which well, sows frustration and despair on mobile devices everywhere.

groovelive workspacessynctoy
 

Visual Studio UX Taskforce, Office UX Taskforce... etc.

Long Zheng's Windows UX Taskforce is amazing.

In the space of a few days, what started as a blog post has turned into a web phenomenom. He put together the digg-like site in a couple of days, apologizing all the while how long it was taking. (It's actually based more on a site from Dell called IdeaStorm but calling it 'digg-like' gives it an instant familiarity).

The amount of content now available is stunning. Long is awesome -- but so are the people who follow his blog. The recurring theme is that little things add up.

This is a point that Joel Spolsky makes over and over on his website (when he's not telling you to learn C)

"Another tiny frustration. These things add up; these are the things that make us unhappy on a day-to-day basis. Even though they seem too petty to dwell on (I mean, there are people starving in Africa, for heaven's sake... ), nonetheless they change our moods."
--Joel Spolsky in User Interface Design for Programmers

I think we need more of these UX Task force sites. What I'd love to see:

  • Office.UXTaskForce.com

    a community site for improving usability in MS Office
  • VisualStudio.UXTaskForce.com

    improve Visual Studio
  • IE.UXTaskForce.com

    improve Internet Explorer

...and so on for any software that has sufficient surface area to maintain its own independent site for focusing on user experience.

Obviously my own needs are too limited to the microsoft realm -- such is my burden in life.

I checked if the UXTaskForce.com site was available, with the idea of donating it to Long (he's a fellow Australian after all)

The website has been registered, and only a few days ago -- hopefully it's Long himself who grabbed it.

Domain Name: UXTASKFORCE.COM
Registrar: ONLINENIC, INC.
Updated Date: 08-jun-2008
Creation Date: 08-jun-2008
Expiration Date: 08-jun-2009

If there was a community-backed Visual Studio UX Taskforce (rather than the paltry connect.microsoft.com/VisualStudio), here's something I'd contribute (from the last few minutes). It's really small, but... well, little things add up.

Close button on Trial Dialog should be called 'Continue'

Submitted by secretGeek on June 10, 2008

The 'Trial' nag screen offers two choices: register and close. As a user you pause and think Close will cause the application to shutdown. But actually it doesn't, it just allows you to continue.

Low

Low

Not fixed

 

How to be Jeff Atwood

atwood, blog, color, commandline, css, games, google, html, UX,
jatwood circa 2004the real jeff atwood

Jeff Atwood writes CodingHorror which has been steadily building an audience over the last few years and is now a very popular destination for programmers.

I'd like to share my current opinion of the formula for creating Jeff Atwood style articles, in the hope that it may inspire someone, somewhere to do something, somehow.

Here it is:

1. Get an opinion

Uncover some ugly half-baked opinion in the dank underground of your tortured soul.

Or, stumble upon some small yet intriguing factoid in the narrow side-streets of computing.

2. Resist the urge to blog at this point.

99% of bloggers would dash out their hideous wretch of a thought at this point.

Jeff holds back.

3. Research the classics

Remember: if you steal from one source they call it plagiarism. Steal from many, they call it research.

First, turn to books. What does Steve McConnell say? Tufte? Brooks?

Highlight any well written phrases you may wish to quote.

4. Beyond the classics

Ah, but the classics so often fall short. Particularly on contemporary topics.

Turn to the words of reputable bloggers, or better yet, wikipedia. Branch out from there.

Again, highlight phrases with a quotable turn of phrase.

But be ruthless and perfectionist in your approach: quote no trash.

5. Look for opposition

Actively seek out contrary opinions. Every topic has naysayers, and amongst such sayers of nay must be people who express valid concerns.

Be prepared to change your mind.

And again --

Highlight any well written phrases you may wish to quote.

6. First Major objective satisfied

Now you've collected the meat around which the gravy of your narrative shall flow.

Crack knuckles, sit straight, for now you can write the text itself. Lay out the quotes before you and choose only the best and most worthy.

7. Reader is ignorant yet intelligent

Assume the reader knows nothing about the specific niche topic at hand.

And yet -- here's the hard part -- treat the reader as your intellectual equal. Talk across to them, not down to them. They are exactly as smart as yourself, but it so happens that they have not, just moments ago, finished reading the very best writing on the topic at hand, and as such they need some friendly coaxing.

If new terms are introduced -- define them. Or failing that, provide a link to a definition.

8. Take a side - for now

Be willing to take sides, by all means. But present both sides of the arguments in a fair light: hence, do not try to make either side appear worthy of ridicule.

Amongst your readers are many informed people who may bring to light information that changes your opinion. So be honest in your opinion, but not dogmatic.

9. Why choose that heading?

Choose a heading that is open to misinterpretation.

The heading should raise questions, not answer them. Answers are complex things, and readers shouldn't trust any article that answers everything in the heading.

10. Google Search for images

It's near the end of this article and you are hardly reading now -- which is a shame, because the best tip is the final one.

Perform a google image search for something entertaining (or disturbing) to accompany and lighten your research. Your own biases will probably come into play here and you'll adorn your article with pictures of computer games, console apps and kittens. But you can't be perfect. After all, you're only Jeff Atwood ;-).

Scan over your writing one more time. Ensure the tone is friendly and informative: capable of causing upset, yet never quite, exactly "wrong".

Hmmm. To be honest, just go read his site and make up your own rules. He breaks these ones all the time.

The only absolute rule I know he follows -- is to be Atwoodistic. I would define Atwoodism as follows

When you mention a topic you've covered previously, provide a link. Always.


 

Reuse good -- Abstractions better!

[code], functional, html, productivity, sql,

I posted something about the word 'Upsert' recently -- and I was kind of surprised by the comments.

My real feelings about the concept of coining a new term 'upsert' are simple:

Don't do it!

Upsert is a bad name. An evil name. And not because it is a silly portmanteau.

Coining a term upsert, to embody the concept of "Update or Insert" is bad because it fundamentally misses the point of "Why We Code".

Let's get back to basics

Just say you discover that your code is frequently peppered with this little snippet:

If (this.State != New) {
this.Update();
} else {
this.Insert();
}

So -- you decide to extract that code snippet and place it in its own routine.

Routines are nice, routines are great.

"Aside from the invention of the computer, the routine is arguably the single greatest invention in computer science."
  Why You Should Use Routines, Routinely

This is what you create:

private void Upsert() {
If (this.State != New) {
this.Update();
} else {
this.Insert();
}
}

Now -- any instance of those fives lines becomes instead:

  Upsert();

Great! You've achieved one of the primary goals of routine construction: code reuse. Your code is now shorter, and thus hopefully cheaper to maintain. It's more versatile because now if you change the way "update or insert" works you only need to change it in one place.

Life is sweet. The birds sing and the flowers bloom once more.

But there's something amiss. Something foul remains.

You've failed on the other goal of routine construction -- you've failed to hide away the implementation details. You've failed to "raise the abstraction level!"

The user/programmer still has to think about the inner concepts: update and insert. Every time they see that words "upsert" -- the details "Update and Insert" are staring them in the face.

You lose sleep. Your dreams are troubled. Dark clouds follow you everywhere. And in quiet moments you hear the ominous echo of Alfred North Whitehead whispering:

"Civilization advances by extending the number of important operations we can perform without thinking."

--Alfred North Whitehead

Did you read that? What? You missed it -- here it is again:

"Civilization advances by extending the number of important operations we can perform without thinking."

--Alfred North Whitehead

By choosing the name "Upsert" we've failed in our duty to advance civilization! We want the user (the programmer who uses your routine) to perform these two important operations without thinking about both of them.

Let's think of a better name -- a name that alleviates the consumer from having to think about the constituent parts of the routine they're using.

How about this: Save.

private void Save() {
If (this.State != New) {
this.Update();
} else {
this.Insert();
}
}

Isn't that nicer? And civilization has taken another tiny step forward.


Incidentally -- it seems this 'Alfred North Whitehead' was a functional Programmer in the 1800s -- before Church and the Lambda calculus that gave rise to functional programming. Here's a comment about him:

"There are no fundamental "things," or "objects" in the world of Whitehead. Whitehead's ontology, or parts-list of the universe, contains only processes."
--Richard Lubbock in 'Alfred North Whitehead: Philosopher for the Muddleheaded'

 

Word of the day: Upsert

sql,

I've found a new word, buried deep in the internals of dot net.

(this is a real word)

"Upsert."

It means "update if you can, or insert if you have to."

It also looks a lot like a combination of the words "Upset" and "Berserk," and it sounds much like "Absurd."

All up, it's a keeper.

 

Return from an offline sojourn

blog, color, microISV, productivity, social network, tools, twitter, UX, visual basic,

I was offline for a few days over the past fortnight, and found it really refreshing. Without the continual distraction of the internet I was able to concentrate on achieving a lot of things that had been niggling me for a while.

Amongst those was the addition of some long overdue 'luxury features' for TimeSnapper that I hope will make it more meaningful for a lot of users. (No doubt I'll bombard you with the details when we release the next upgrade).

With the internet out of the way, my 'at home' productivity went from its usually mid-40's mark to a whopping 98%.

There were a lot of blog entries I jotted down notes for, but now I'm just happy not to contribute too much to the hyper-noise of the internet for one more day ;-).

But here's an example of an 'awesome Atli tooltip' found deep inside the codebase for TimeSnapper.

        Me.Label4.Text = "Productive Applications:"

        Me.ToolTip1.SetToolTip(Me.Label4, "Productive Applications are those that relate to your work." & vbCrLf & _

                                          "Solitaire, for example, is NOT a productive application, " & vbCrLf & _

                                          "unless you are working on becoming the world champion of " & vbCrLf & _

                                          "solitaire.")

It's these kind of gems that help me enjoy work on this product more and more with every version.

Now, back to the usual un-productive fare:

If you too have been tricked into using twitter, you can follow me here.

 

Leaky Abstractions? Try Asp.Net!

blog, color, css, hanselman, html, javascript, linguistics, podcast, security, tools,

First here's a code example:

Single line 'TextBox':

<asp:TextBox ID='dd1' runat='server' TextMode="SingleLine" MaxLength="10"> </asp:TextBox>
                                                                                    ^^^^This 'MaxLength' is respected!

Multi line 'TextBox':

<asp:TextBox ID='dd1' runat='server' TextMode="MultiLine" MaxLength="10"> </asp:TextBox>
                                                                                    ^^^^This 'MaxLength' gets ignored!

Now here it is in pictures:

max length ignored on multi-line TextBox

The single-line TextBox respects the maximum length property. The multi line textbox does not. We see other differences too: these two 'TextBoxen' differ from each other in far more than the number of rows.

The cause here is a classic 'Leaky Abstraction' - and asp.net is riddled with such leaks.

The 'abstraction' of "TextBox" is used to emit either one of three underlying html elements -- "TextArea", "Input type=text" or "input type=password" -- depending on the 'TextMode' property. The three controls are wildly different animals.

"Solutions" to this problem tend to use javascript to stop input once the maxlength is reached.

Edge cases are frequently missed, for example:

That's pretty nasty stuff to have to perform -- and worse, you're given no warning that you need to perform it.

The API tells you that there is a maxlength property you can use... but the API, in this case, is lying.

I'm not really concerned with this problem technically. And I think the asp.net abstraction is so extreme that it's admirable. I'd like to know how to patch this kind of leak.

Here's what I'm wondering:

Is there a way the text box class could have been implemented so that you get a compile error for setting the maxlength property when the textmode is multiline?

That would be enough to make it a safe abstraction in my books. It's more extreme than the static typing afforded by most static type systems.

I expect that such a constraint could be achieved with a language/tool like Spec#.

An alternative would be to throw an exception when setting the maxlength property if the textbox type is multi-line, and vice versa. But that seems like quite a faulty approach.

I'm just not happy about this at all. I think I will need to write a very stern letter to Scott Guthrie.

 

A truly original thought

commandline, games, movie,

"Everything of importance has been said before by somebody who did not discover it."
--Alfred North Whitehead

Yet, once in a while, a true genius will strike upon a genuinely original thought.

Here's some such wisdom from JCooney:

"Who would you back in a fight: Cab Calloway or Darth Maul?"
--JoCo Loco

Tell me there isn't a multi-million dollar best-selling console game and movie franchise in that question?

cab calloway -- you may know him from blues brothers where he sung minnie the moocher with its catch cry hi de hi de hi de hidarth maul -- you may recognise him from the phantom menace or else just because hey! he sure looks like your mother

(see also.)

 

Throw New VirtualMachine();

[code],

Today's crazy idea.

For serious exception handling:

throw new VirtualMachine();

...immediately spins up a new virtual machine, identical to the currently running machine, only with a debugger attached and paused on a breakpoint at the currently active line of code which caused the exception.

The development/operations team are notified and given a url with which to connect to the new virtual machine. A bug is lodged in your support system.

Meanwhile, execution continues essentially 'uninterrupted' in the original machine.

 
 

All articles: The complete archive.