Gresham’s Law

mox_press

We were working with another consulting group at a client, recently, and to resolve a dispute one of the consultants at the rival firm pulled out his trump card – he had authored a book.  Of the various things that might impress a software developer – certifications, technical blogging, Microsoft ranking, article writing – book authorship is well at the top of the list.  Writing a technical book carries so much metal in part because everyone knows what an extraordinary accomplishment this is.  One not only must demonstrate mastery and facility with one topic, but must be able to maintain this level of loquacity over a dozen or so chapter topics and in the end pull it all together in a fluent manner.  This can be so difficult a feat that for each major Microsoft technology one may find only four or five books each year, each of which, unless it fails completely, becomes a sort of master reference for the topic at hand.

Upon returning to the office, we naturally looked up our friend the author on the Internet.  In researching his bona fides we discovered that he was in fact the thirteenth author on an obsolete Microsoft technology for a technical publisher that, trading on its good reputation, had almost thoroughly trashed its name a few years ago by flipping poorly edited tomes written by laundry lists of authors on hot topics in order to be the first to press.  This publisher at a certain point became notorious for awkwardly photoshopping portraits of the myriad authors of each of their books onto the book covers to give the impression that some of them had ever actually been in the same room together.

This is a shame because many of the early authors with this particular press have gone on to be thought-leaders in the Microsoft programming world and continue to publish important books through other publishers, among them Rocky Lhotka, Dino Esposito, Joe Mayo, Scott Guthrie and Scott Hanselman, to name a few.

This may be a prime example of Gresham’s Law.  Gresham’s Law is a 16th century economic theory concerning currency which states “Bad money drives out the good.”  The general idea is that if a certain currency is in circulation, for instance gold coins, and another is introduced with a lower real value but an equivalent exchange value, for instance copper coins, those with gold coins will end up hording their currency rather than using them to make purchases and consequently the gold coins will be removed from circulation.  For a fuller explanation you might consult the wiki.

I first came across the theory in a book by Albert Jay Nock called The Memoirs of a Superfluous Man (1942) in which the author uses it as the basis for a Rousseauvian theory of cultural decline and progress.  I found out about the book, in turn, from a list Louis Lapham published in Harper’s in the early nineties of his alternatives to the Great Books – Alan Bloom’s pop philosophy book on cultural malaise was a bestseller at the time –  a list which also included Mark Twain’s Life on the Mississippi.  It took me another two years before I was able to track the book down to a small shop in Cambridge, MA where I was visiting my brother (in those times before Amazon.com and the Kindle when tracking down an obscure book was a true labor of love) and read it voraciously as a mimeograph produced for a small class at one of the local universities.

The book is a series of contrarian ruminations on the author’s life and his failure to accomplish anything of general value.  Rather than pursue the sorts of endeavors in public life by which he could have made a name for himself, Nock recounts a dilettantish private life guided by a desire to amuse himself rather than impress others – yet it was a career which left in its wake both a book on Thomas Jefferson as well as one on Rabelais, in addition to various books and essays on politics and pedagogy. 

I have owned two copies of Nock’s memoirs in my life and have managed to give them both away.  Besides the general tone of the book, I remember only two things with any clarity.  The first was Nock’s dismay when he was offered the chair of the newly founded English department of a distinguished university.  Nock regretted turning the position down but he simply found it a bit of a put on to try to teach a subject that anyone could learn by showing up at the public library. 

The second was his attitude towards his alma mater.  He lauded it as possibly the best sort of education any undergraduate could avail himself of – the sort that prepared him for everything and nothing at the same time.  As a sign of his respect for those who taught him, he never returned to his college.  He felt that his teachers would be insulted if, after preparing him to go out into world, he at some point returned to the nest.  Their job, after all, was to push their students forward, not welcome them back.  He consequently found odd the growing trend among his peers and on the part of universities to host sundry homecoming events year after year.

Nock felt himself to be a man out of his own time and, like many people in these circumstances, felt that it was the world that was out of kilter rather than himself.  Because the things valued by the world — specifically America in the 20’s and 30’s — were not the things he valued, he tended to see “progress” as a sort of fool’s errand.  The improvements people tried to make in education and government seemed, through his particular lens, to be merely making things worse and – if those things were the things deemed to be most valuable – then he was a superfluous man.

I lack the skill to evoke Gresham’s Law quite as artfully as Albert Jay Nock does.  I can only apply it in this small case of a particular technical press.  A publisher with a strong reputation, thanks to concerted efforts to cultivate the best young talent available, eventually squandered its capital by going after easy money.   Determining that they could be more successful if they only increased the volume of their output, they lowered the value of their currency by publishing low quality books written in a couple of months by a legion of authors.  In the process they discovered that quality holds its value better than quantity does.

Yet all is not lost.  There is a scene in Elia Kazan’s Viva Zapata! in which Marlon Brando tries to save the Mexican economy by printing his own currency.  While the execution was not the best, the theory appears to be sound, and said publisher can revive its relevance by doing the same.  For instance, there is currently a growing industry of self-publishing on the Internet.  The publisher of the yellow and red technology books can lend its reputation to this trend by publishing the best efforts of would-be authors on Silverlight, Oslo, Azure or any of the other trendy new technologies.  Not only will this help the careers of these authors but, on the evolutionary principle that great things can be achieved given enough time and enough monkeys, something valuable may come of it.  To offset the cost of this effort, the publisher should charge its authors for the right to be published, thus producing a Covey-esque win-win situation.

Even better, said press could do away with the tedium of actually writing a book altogether and offer would-be authors the opportunity, for the right price, to simply have their names appended to the list of authors for one of the books in the back catalog.  After all, in that long list of superfluous authors, what harm would there be in adding just one more?

Alternatives to returning Void: Continued

“If you look long enough into the void the void begins to look back through you." – Nietzsche

Returning types rather than void on methods that do not necessarily require a return value, as occurs in the implementation of the Append methods on the StringBuilder, allows us to do some interesting method chaining in our code.

Bill Wagner suggests doing something similar with collections in More Effective C# .  My examples are a bit more contrived, however.

Suppose – for the sake of the premise if for nothing else – that we have a business requirement to take a decimal collection of prices and then add 6 percent to each collection member.  We could write the following custom collection to do this:

    public class Prices: IEnumerable<decimal>
    {
        private List<decimal> _mySequence;
        public Prices()
        {
            _mySequence = new List<decimal>();
        }
        public Prices Add(decimal d)
        {
            _mySequence.Add(d);
            return this;
        }
        public IEnumerator<decimal> GetEnumerator()
        {
            foreach (decimal d in _mySequence)
                yield return d;
        }
        IEnumerator IEnumerable.GetEnumerator()
        {
            foreach (decimal d in _mySequence)
                yield return d;
        }
        public Prices AddSixPercentAndWrite()
        {
            foreach(decimal d in _mySequence)
                Console.WriteLine(string.Format("{0:C}",d * 1.06m));
            return this;
        }
    }

Which we would then call thus:

        var prices = new Prices();
        for(decimal d = 0; d< 20m;d++)
        {
            prices.Add(d);
        }
        prices.AddSixPercentAndWrite();
 

The business is initially happy with this, but then comes back a week later to say that the six percent tax is nine percent in a different store. Additionally, while sometimes the business wants to see the final price, they also sometimes want to see the original price alongside of it. 

Besides our original output, we now also need to be able to push a list that looks something like this:

$0.00 $0.00

$1.00 $1.06

$2.00 $2.12

$3.00 $3.18

$4.00 $4.24

$5.00 $5.30

$6.00 $6.36

$7.00 $7.42

$8.00 $8.48

$9.00 $9.54

$10.00 $10.60

$11.00 $11.66

$12.00 $12.72

. . .

Seeing where this is headed, we realize that to handle all foreseen and unforeseen scenarios, we should come up with a way to chain up our methods in order to make the code more flexible.

We could restructure the AddSixPercent method to take a parameter; we could then break out the Write method so we can call it multiple times if needed.  We could also change the signatures on our methods to return our Prices collection instead of void, allowing us to chain the methods together.

There’s a hitch, however.  While returning Prices would allow us to do some chaining, we still wouldn’t get the right results since each method would iterate through the whole collection before returning.  Consequently we would end up printing out all the items in the first column before getting around to printing the items in the second column (the calculated cost with tax), which isn’t what we want at all.

. . .

$12.00

$13.00

$14.00

$15.00

$16.00

$17.00

$18.00

$19.00

$0.00

$1.06

$2.12

$3.18

$4.24

$5.30

$6.36

$7.42

$8.48

$9.54

$10.60

$11.66

$12.72

. . .

By using iterators, on the other hand, every method in our chain would act on a particular iteration rather than on the whole sequence.  Besides getting the output that we want, this would also happily give us much more efficient code since we only have to iterate through our collection once rather than once per chained method call.

If we are to use iterators, however, we can’t return the Prices type.  Instead we have to return an IEnumerable type.  Leaving the rest of our Prices custom collection class alone, here’s what that new code would look like:

public static IEnumerable<decimal> AddXPercent(IEnumerable<decimal> sequence
    , short percent)
{
    foreach (decimal d in sequence)
        yield return d + (d * percent * .01m);
}
 
public static IEnumerable<decimal> WriteToConsole(IEnumerable<decimal> sequence)
{
    foreach (decimal d in sequence)
    {
        Console.Write(string.Format("{0:C} ", d));
        yield return d;
    }
}

Our calling code, in turn, would look like this:

    foreach (decimal d in Prices.WriteToConsole(
        Prices.AddXPercent(
        Prices.WriteToConsole(
        prices), 6)
            )
        )
        Console.WriteLine();
 

We’ve managed to achieve chaining, but not so elegantly, all things considered.  First, we have to include the name of our Type in order to chain our methods together.  Second, the chaining is done with nested methods instead of the clean With-like syntax I was extolling in the previous post.  Finally, the sequence of activity isn’t particularly clear.  Because we are chaining our methods by using nesting, the innermost nested method occurs first, while the first shall be processed last.

Fortunately extension methods allow us to alter the way our methods are called.  In order to get the sort of syntax we want, we just need to pull our iterator methods into an extension methods class like so:

    public static class PricesExtension
   {
        public static IEnumerable<decimal> AddXPercent(
            this IEnumerable<decimal> sequence
            , short percent
            ) 
        {
            foreach (decimal d in sequence)
                yield return d + (d * percent * .01m);
        }
 
        public static IEnumerable<decimal> WriteToConsole(
            this IEnumerable<decimal> sequence
            )
        {
            foreach (decimal d in sequence)
            {
                Console.Write(string.Format("{0:C} ", d));
                yield return d;
            }
        }
    }

Giving us the results we were looking for:

$0.00 $0.00

$1.00 $1.06

$2.00 $2.12

$3.00 $3.18

$4.00 $4.24

$5.00 $5.30

$6.00 $6.36

$7.00 $7.42

$8.00 $8.48

$9.00 $9.54

$10.00 $10.60

$11.00 $11.66

$12.00 $12.72

. . .

 

We can now call our code like this:

    foreach(var d in prices
            .WriteToConsole()
            .AddXPercent(6)
            .WriteToConsole()
            )
            Console.WriteLine();

This alternative to returning void involves three tricks:

1) Returning an IEnumerable type instead of void.

2) Taking an IEnumerable type as a parameter.

3) Using these signatures in extension methods rather than the custom collection class itself.

If the syntax looks familiar, this is because this is also how LINQ to Objects is implemented.  For that very reason, we could have accomplished similar results by using LINQ:

    foreach(var d in prices
        .Select(d => { Console.Write(string.Format("{0:C} ", d)); return d; })
        .Select(d => d + (d * 6 * .01m))
        .Select(d => { Console.Write(string.Format("{0:C} ", d)); return d; })
        )
    {
        Console.WriteLine();
    }

It’s funky code, no doubt, but I also find it highly compelling.  I know that as I loop through my prices, I am writing out the original price, I add 6 percent to it in the following line, then I write out that result in the final line.  Inside the foreach block, I then perform any follow-up operations: in this case, writing a new line.

Waiting for the Windows 7 Release Candidate

A colleague of mine from Magenic, IM tag Estragon, just IM’d with news that the Windows 7 RC had been released for MSDN subscribers.  I did a quick google search for the official announcement which took me to this Microsoft Partners site https://partner.microsoft.com/US/40084742:

linkpage

I was naturally curious and followed the Download link, which redirects to the MSDN subscription site.  Unfortunately, there was nothing about the RC on the downloads page, which I found very odd.  I kept refreshing the page, hoping something would change, but this is what I continued to see:

downloads

My colleague then IM’d me that he didn’t think he could go on like this.  We’d been waiting for the RC for so long and this was just a remarkable let down.  We began to question our very faith in Windows 7 at this point.  Sure, it looked great in beta, but did we in fact know anything about it?  Was it even worth waiting for anymore.  The rest of the IM chat went something like this:

Estragon says:
I can’t go on like this.
Vladimir says:
That’s what you think.
Estragon says:
If we parted? That might be better for us.
Vladimir says:
We’ll hang ourselves tomorrow.
Vladimir says:
Unless the release candidate comes.
Estragon says:
And if it comes?
Vladimir says:
We’ll be saved.
Estragon says:
Well? Shall we go?
Vladimir says:
Pull on your trousers.
Estragon says:
What?
Vladimir says:
Pull on your trousers.
Estragon says:
You want me to pull off my trousers?
Vladimir says:
Pull _on_ your trousers.
Estragon says:
True.
Vladimir says:
Well? Shall we go?
Estragon says:
Yes, let’s go.

But we didn’t go anywhere.  IM chats are sort of silly that way.  Maybe the RC will come tomorrow.

Alternatives to returning Void

I was playing with the Unity Framework recently when I came across the following C# code sample on msdn:

    IUnityContainer uContainer = new UnityContainer()
        .RegisterType<IMyInterface, FirstObject>()
        .RegisterType<MyBaseClass, SecondObject>();
    MyObject myInstance = uContainer.Resolve<MyObject>();

This looked so much like the VB With syntax that I uncharitably assumed that the authors at MSDN had somehow confused C# and VB.  After all, they had written this the standard C# syntax elsewhere:

    // Create container and register types
    IUnityContainer myContainer = new UnityContainer();
    myContainer.RegisterType<IMyService, DataService>("Data");
    myContainer.RegisterType<IMyService, LoggingService>("Logging");
 
    // Retrieve an instance of each type
    IMyService myDataService = myContainer.Resolve<IMyService>("Data");
    IMyService myLoggingService = myContainer.Resolve<IMyService>("Logging");

C# developers with more than 8 or so years of experience can generally be broken down into two types who are mutually suspicious of one another: those who came up through the VB6 programming ranks and those who came up through C++ or Java.  I did the former, and for the most part have never looked back.  I don’t even get involved in disputes between C# lovers and VB lovers.  They’re both nice language.  I just happen to use the former for most things.

The one thing I do miss from VB, however, is the With command.  It always seemed an elegant piece of syntactic sugar and easier to read when you find code that manipulates the same object repeatedly.  My “you can’t do that on television” moment over the msdn sample code came out of that longing for something I thought I’d simply had to leave behind.

It took me a while to realize that the sample code was taking advantage of a trick that has always been available to C# developers but just not extensively used. (I even had to show it to several colleagues just to make sure I wasn’t just being slow – everyone’s first thought, blessedly, was that it was somehow a VB-to-C# translation mistake.) The trick is that the RegisterType method is returning an IUnityContainer object.  Because a C# statement, unlike a VB statement, can be spread out over multiple lines in the editor until a semicolon delimiter is encountered, the code can be made to take on this VB-ish cast.  In fact, the Append method of the StringBuilder type similarly returns its own container type, making the following code blocks equivalent:

    StringBuilder sb = new StringBuilder();
 
    // this code ...
    sb.AppendLine("one");
    sb.AppendLine("two");
    sb.AppendLine("three");
 
    // is equivalent to this ...
    sb.AppendLine("one").AppendLine("two").AppendLine("three");
 
    // is equivalent to this ...
    sb.AppendLine("one")
      .AppendLine("two")
      .AppendLine("three");

This trick won’t work for properties, of course, but it is still pretty fun, and I’m kicking myself for never having come across it earlier.

WCF REST Starter Kit Complete Twitter Library

 

Source

Binaries

Ingredients: Visual Studio 2008, .NET 3.5 sp1, WCF REST Starter Kit 2

The HttpClient type, included with the WCF REST Starter Kit 2, is intended to make it easier to consume RESTful services.   One of the most widely used publically accessible REST API’s is the one provided by Twitter, making it an obvious target for trying out these new Microsoft bits.

Retrieving statuses from Twitter, as well as sending updates, is extremely easy using the WCF REST Starter Kit, as I posted earlier.  This led me to want to see if I could build out a client library for the rest of the Twitter REST API. 

This projected one night effort ended up taking about a week and a half over several evenings.  For the most part, this was because actually building and testing the various contract objects is remarkably labor intensive.

The Windows Twitter Foundation (source code and binaries above) can be used as a reference application for anyone trying either to build a client on top of twitter or for those simply interested in seeing a relatively complicated implementation of the WCF REST Starter Kit.

If you want to just consume the binaries, you will need to download the WCF REST Starter Kit Preview 2 separately, if you haven’t already done so, and include the following assemblies in your project – Microsoft.Http.dll, Microsoft.Http.Extensions.dll, and Microsoft.ServiceModel.Web.dll .

The Windows Twitter Foundation library has several features I’m rather proud of:

1. It reads both XML and JSON formats.  The client application included with the source code switches between these two API’s with either the /XML command or the /JSON command.

2. The library covers the complete Twitter REST API, including direct messaging and photo uploads.  The photo uploads are particularly finicky and took a couple nights alone just to figure out.

3. The library also consumes the Twitter Search API.  The data contracts for Trending was a bit too strange for me to figure out, however.

4. The CLR classes used for deserializing Twitter messages is included in a separate assembly.  They are decorated for both XML and DataContract deserialization.  If you are building your own Twitter client and are running into problems figuring out how to cast the Twitter messages, then these should help you out without obliging you to sniff out all the messages coming from Twitter in order to figure out their structure.

5. I built most of it in my installation of Windows 7.  Visual Studio worked like a charm.

Things I feel bad about:

1. I couldn’t figure out how to deserialize the Trends service messages. 

2. I used waaaay too many yellows and greens in the Console Application that comes with the source.

Please use this code freely and in any way you like.  Be sure to consult the WCF REST Starter Kit 2 license on codeplex for any rights reserved by Microsoft.

Future plans:

I would like to expand the library with additional wrappers for tinyurl and tweetpics and all the other little services that make up the Twitter ecosystem.

I also plan to add helpers to support caching downloaded tweets and manage service calls to lighten the load on the Twitter servers (as the public API documents recommend).

My immediate goal, however, is to start building a nice WPF UI around the Windows Twitter Foundation library (if you haven’t gotten the joke about the name, yet, just give it a moment).

I’ve been enjoying the TweetDeck client, but so far haven’t seen anything in it that can’t be done using WPF.  I should be able to make a UI that is at least as attractive (glossy black controls are pretty straightforward in PF, right?).  Then I want to extend that design with carousels and some of the more interesting UI concepts that are part of the WPF development world.  Using Prism would also be fun, but we’ll see.

The big gain in building a WPF client is that it can do things with the OS which are much more difficult in Adobe Air – for instance, hooking into the speech recognition features of Vista and Windows 7.  Enabling users to start talking instead of typing their tweets may have interesting ramifications if it ever catches on.  For myself, however, it will simply give me an excuse to start digging into speech recognition in Windows 7, which I hear works extremely well.

The next few posts will cover some of the more interesting things I found while digging through both the Twitter REST API as well as the WCF REST Starter Kit – for instance, that the HttpClient class isn’t actually based on WCF, but is instead a wrapper for the HttpWebRequest and HttpWebResponse objects – or that the Twitter API embodies some strange notions about what a “friend” is and what  a “follower” is.

Again, enjoy the code.

Twitter and Postmodernism

barthelme

That’s a pretty pretentious title. 

First, a word of clarification.  While most articles and even dissertations that use the snowclone “X and Postmodernism” attempt to explicate X through the prism of postmodernism, this post will move in the other direction and attempt to elucidate postmodernism with X.  By the end, I hope to convince you that not only is the title modest but that a more accurate title would have been something like “Twitter as the Fulfillment of the Postmodern Project.”

To accomplish this we just need to bring two Dons into juxtaposition: Don Browning and Don Barthelme.

 

Don Browning, an MCA architect and Director of Technology at Turner Broadcasting, made the following Tweet a few days ago:

“You know how people create books made up of blog posts, I want to put together a blog made up of tweets..”

It’s a fascinating idea.  The first successful instance of the blog-to-book genre I ever came across was Joel Spolsky’s Joel On Software book, which is the tree unfriendly version of his popular tech blog.  He quickly followed this up with – naturally enough – More Joel On Software.   Other exemplars of the genre include Chris Anderson’s The Long Tail, Christian Lander’s Stuff White People Like and Jay Louis’s Hot Chicks with Douchebags.

Why would someone want to pay for articles they can already look at for free on the Internet?  And why would an author not feel dirty about repackaging his day-to-day musings and then charging for it?

Turning a blog into a book is a cultural uptrade.  A blog is a lowbrow version of the traditional book of essays. Being asked to convert one’s blog into a book is like being told that what one had been doing all that time one thought one was blogging was, in actuality, merely literary slumming in an alternative medium – one was always writing a book but just didn’t realize it.  The book form is the cultural recognition of this fact.

Cultural legitimacy comes at a price.  What makes a book a book and confers cultural legitimacy upon it is the not that trees were killed in its production but rather that people must pay money in order to own it.  A book is a commodity in a way that a blog is not.  People are used to paying for the privilege of reading something in their hands, while they resent paying for permission to read it on the Internet.  We all accept that we get what we pay for as well as the corollary that while there is value in a bargain, there is no ‘real’ value in something that is free.

The difference between a picture of a soup can and Andy Warhol’s picture of a soup can is that someone will pay millions of dollars for the latter.  Andy Warhol’s soup can is “art” because it has a price.  It has cultural value — rather than, say, use-value – because of its price tag.

soup

Without the price tag, what is the difference between a blog and the book version of that same blog?  The book version is less convenient to read while the content is basically the same.  The only justification for — the only value added of — paying for the book form of something one could read for free appears to be simply that: the privilege of paying for it.

This is, of course, also the strange world of Twitter, the plan for monetizing which is currently still in research, according to the official FAQ:

“Twitter has many appealing opportunities for generating revenue but we are holding off on implementation for now because we don’t want to distract ourselves from the more important work at hand which is to create a compelling service and great user experience for millions of people around the world. While our business model is in a research phase, we spend more money than we make.”

Twitter is currently a mechanism for not generating revenue, though it is so good at this that there is a lot of buzz about its potential value. 

According to TechCrunch:

“Some analysts have suggested that Twitter has moved past and consumed RSS at the center of the information machine. As newspapers and other print vehicles appear to collapse, the common concerns expressed about the permanent loss and funding of the fourth estate ignore the rise of a superclass of information creation. What some call the fallow ego-driven spew of the Warholian elites is more likely to be seen in the rear view mirror as something more akin to body painting and ultimately jazz.”

. . .

“What’s exhilirating is that the vague assumptions, arrogant exploits, twinkling of an ephemeral joke, they all are being ratified in a swirl of innovation that is dazzling in its ability to masquerade as superficial and childish.” [sic]

The coming fourth estate, however, is made up of disjointed observations about what one had for lunch and, occasionally, the sorts of “inarticulate grunt or roar” that William Rehnquist would argue is not protected speech.

John Scalzi (who, by the way, published his first science fiction book online and has now been nominated for the 2009 Hugo Award) provides a good description of Twitter which, though not the first, has the distinction of at least being the latest:

“[I]t’s even better than blogging for quite a lot of people, because when you’re limited to 140 characters, you don’t have to feel bad about not having all that much to say.

“That most Twitter communication is aggressively banal should also not come as a huge surprise. First, news flash: people are banal. Yes, all of us, even you (and especially even me). Even the great minds of the world do not spend all their time locked in the contemplation of the mysteries of the universe; about 90% of their thoughts boil down to ‘I’m hungry,’ ‘I’m sleepy,’ ‘I need to poo,’ ‘Check out the [insert secondary sexual characteristics] on that [insert sex of preference], I’d really like to boink them,’ ‘I wonder what Jennifer Aniston is doing right now, John Mayer can no longer tell me on his Twitter feed’, and, of course, ‘Look! Kitty!’ That the vast majority of Twitter posts encompass pedestrian thoughts about common subjects like food, music, tech, jobs and cats is entirely unsurprising, because this is what people think about.”

One could have a lot of fun coming up with ways to describe the banality of Twitter but unfortunately we’re all already too good at doing it.  Thanks to Twitter, it is a private joke that is being shared with millions of your Twitter friends. 

The social experiment for which Twitter lays the groundwork is to see how we can collectively uptrade Twitter’s cultural status.  Can the acknowledged irrelevance of Twitter be made relevant?

Returning to Don Browning’s opening comment about aggregating individual tweets and presented them as a blog — something like this has already been done by Don Barthelme, the postmodern literary figure, back in the sixties.  He developed a technique for amalgamating fragments of conversations into a literary form which he perfected in a 1969 short story called The Viennese Opera Ball:

“The judicial form contemplated in the agreement is that of a free trade zone to be transformed gradually into a customs union.  As Emile Myerson has said, ‘L’homme fait de la metaphysique comme il respire, sans le vouloir et surtout sans s’en douter la plupart du temps.’  No woman is worth more than 24 cattle, Pamela Odede B. A.’s father said.  With this album Abbey Lincoln’s stature as one of the great jazz singers of our time is confirmed, Laura La Plante said.  Widely used for motors, power tools, lighting, TV, etc.  Generator output: 3500 watts, 115/230 volt, 60 cy., AC, continuous duty.  Max 230 V capacitor motor, loaded on starting – 1/2 hp; unloaded on starting – 2 hp.  Control box mounts starting switch, duplex 115 V receptacle for standard or 3-conductor grounding plugs, tandem 230 V grounding receptacles, and wing nut battery terminals.  More than six hundred different kinds of forceps have been invented.  Let’s not talk about the lion, she said.  Wilson looked over at her without smiling and now she smiled at him.  This process uses a Lincoln submerged arc welding head to run both inside and outside beads automatically.  The rate of progress during the first stage will determine the program to be followed in the second stage.  The Glamour editor whose name was Tutti Beale ‘moved in.’  What’s your name girl?  she said coolly.  Carola Mitt, Carola Mitt said.  The Viennese Opera Ball continued.”

The story was published in a collection called Come Back, Dr. Caligari which you cannot buy on Amazon.com.  It was later republished in Flying to America: 45 More Stories which you can purchase for $10.85 plus shipping.  It has an Amazon sales rank of 76,601*.

Louis Menand, the Critic at Large for the New Yorker, recently wrote in his analysis of Donald Barthelme’s career that there are two senses of postmodernism.  According to the first, postmodernism is an acknowledgement that modernism was so successful that we are now all modernists.  Postmodernism, in this sense, means accepting that we are living in the age of modernism as initiated by James Joyce and Picasso (who, it is said, used to pay for his meals after he became famous by scrawling on napkins and handing them over in lieu of cash) and simply making sense of their linguistic and visual experiments. 

In the second, modernism was a failure and we are all now doing something else.  Instead of trying to make culture more erudite and less accessible, the goal of postmodernism is to remove the artificial boundaries between “high” and “low” art.  This can be accomplished in two ways: either by kicking high culture down or by kicking low culture up.

Kicking high culture downwards requires an unmasking.  Someone accomplishes the difficult task of being accepted into the vaunted ranks of culture and then proclaims that they were just faking it.  This is actually the easier of the two paths, and you’ll see that it happens quite often if you just look for it.

The second, kicking low culture upwards,  is the harder path and the holy grail for most postmodernists.  Making shit look interesting — and then making a convincing case for it — is harder than it looks.

Menand cites jazz as the epitome of this cultural upkick.  It fails to fulfill the postmodern project in two ways, however.  The first is a technicality – chronologically it developed before the postmodern movement was an inkling in anyone’s eye.  It lacks the ironical self-awareness of itself as a postmodern art form.  The second is a more substantial problem, though perhaps only in retrospect – despite its lowly and popular origins in clubs and bordellos, it has both visceral and intellectual merit.  The form lends itself both to the easily hummable tunes of Dave Brubeck as well as the challenging mathematical complexity of Thelonious Monk.  It was always potentially high art, in this sense, whether we realized it or not.

To fulfill the postmodern agenda, the low culture platform targeted for uptrade must lack these qualities.  It must be so clearly lowbrow that it survives transformation into a high culture artifact without anyone relinquishing this ironical awareness of its cultural banality.  If Twitter is the long anticipated postmodern medium, Twitter must succeed without losing the qualities that make it Twitter.

There are currently rumors of Google interest in purchasing access to the wealth of grunts and roars that is Twitter.  Twitter, in turn, has already turned down Face-book’s offer of half-a-billion dollars, and seems to be valuing itself at well over twice that. 

A billion dollars, of course, buys one a lot of cultural legitimacy.

 


* By way of comparison, Joel Spolsky’s book Joel On Software has a current Amazon sales rank of 22,865.  Hot Chicks with Douchebags ranks at 12,809.

Presenting at CodeStock 2009 dot dot dot question mark

CodeStock, which will be held on June 26th and June 27th in Knoxville, TN, has an interesting way of selecting speakers.  While a speakers committee ultimately decides who will speak at the event, all registrants (it’s $25 this year) also have a say in who they are interesting in hearing.

I’ve submitted two presentations this year but at the moment still have no idea if I’ll ultimately be delivering either.

The first is a version of the pleasantly successful REST-ful WCF presentation I did at Atlanta Code Camp, with additional material covering the release of the WCF REST Starter Kit 2.

The second is an overview of the MVC, MVP, and MVVM UI design patterns.  There are lots of good articles available on the net about how to use each one individually.  I want to give a more synoptic view of how they are related, and their advantages and disadvantages with regard to particular .NET platforms.

I don’t know anyone in Knoxville, so if you are planning on attending CodeStock this year, please drop me a line in the comments so I can make plans to meet up with you.

What kind of consultant are you?

A few Magenic colleagues  and I happened to be in the office at the same time today and were discussing what makes a good software consultant.  We arrived at the idea that there are certain archetypes that can be associated with our profession.  Consulting and independent contracting require a peculiar combination of skills which are not always compatible: leadership, salesmanship, problem solving, commitment, patience, quick thinking, geekiness, attention to detail, attention to vision, and so forth. 

As a consultant, one is often both the salesman and the product being sold, and it requires a bit of a split personality to pull both off well.  Most consultants are able to do well with certain aspects of consulting but not others.  It seemed to us, however, that if we could identify certain “types” of consultants rather than try to identify the particular skills that make up a consultant, we would arrive at something approaching a broad spectrum of what consulting is all about.

After a bit of work, Whitney Weaver, Colin Whitlatch, Tim Price-Williams (who needs a blog because he knows too much about the entity framework not to share)  and I came up with the following list of consulting archetypes and the qualities that exemplify each one. 

For our unit test, we then tried to match consultants we know first with who they think they are and then with who they actually resemble.  It worked out pretty well, and so we thought we’d turn the idea loose.  (I turned out to be a weird mix of MacGuyver and the Jump-To-Conclusions-Guy, though I also have a savior complex.)

See if any of the following archetypes matches people you know.  And if you think we’ve left an important archetype out of our catalog, please let me know in the comments.

 

jack

Jack Bauer

Jack is the ultimate get-things-done guy.  This is in part because he takes the full weight of any project on his own shoulders.  He is admired by everyone he encounters for his dedication and competence. 

He also comes across as a bit harsh, however, so we can’t really say he has good soft skills.  Some consider consultants like him to be a bit too good to be true.

 

house

House

House is great at diagnosing any problem.  He is methodical and thorough while at the same time he is able to think well outside of the box. 

He is also a bit of a dick and will turn on you when you least expect it.  On the other hand, when he throws you under the bus, at least you’ll know it wasn’t personal.

 

TOP GUN

Maverick

Maverick is charismatic as well as intensely competitive, though his arrogance tends to put people off.  If you think a task will take two weeks, he’ll claim it can be done in two days.  If you estimate that something will take two days, he’ll insist he can do it in two hours.

He always manages to be successful though no one is sure how. 

 

sarah_connor

Sarah Connor

Sarah thinks quickly on her feet and is an extraordinary problem solver.  She has a great mix of soft and technical skills. 

Sadly, she tends to get the people around her killed.  Consultants with skills like hers seem to take on a lot more risk than the rest of us would, and we all reap the consequences.

 

don_draper

Don Draper (Mad Men)

Don has infinite charm and is a perennial winner.  Women love him and men want to be his friend.

He is also clearly hiding something from everyone, and is haunted by the notion that he is ultimately a fraud.

 

neo 

Neo

Neo can re-program reality.

Some consider him to be wooden.  He also has a bit of a savior complex.

 

terminator3

The Chick from Terminator 3

Pros: She’s smokin’ hot.

Cons: She will kill you at the drop of a hat.

 

macguyver

MacGuyver

MacGuyver is a jack-of-all trades, the kind of consultant you want on any project.  He also has great hair.

He tends to be a bit of a one-man-show, however.

 

kramer

Kramer

Kramer has the “vision” thing.  He’s the one who will envision and lay out the entire architecture of the project in the first few days despite other people’s misgivings.

Unfortunately Kramer has poor follow-through.  You’ll be living with his architectural decisions long after he’s moved on to bigger and better things.

 

ben

Benjamin Linus

Ben has excellent soft skills.  He is a master manipulator.  He can turn any situation to his own advantage.  In a tough negotiation, he’s the consultant you want at your side.

On the other hand, he is pure EVIL and cannot be trusted.

 

baldwin

Alec Baldwin in Glengarry Glen Ross

“Second prize is a set of steak knives.”  Alec is a motivator.  Other people quiver in his presence.  We all know that sometimes you have to be an asshole to get things done.  Fortunately a consultant like Alec loves that part of the job.

We can assume that he will eventually flame out, as people of this type always do.  Sadly, no one will really feel sorry for him when this happens.

 

cartman

Cartman

Eric Cartman has strong survival skills and is highly self-confident, both of which enable him to accomplish his sometimes overly ambitious schemes. He also aways has a private agenda.

Because of this, he tends to make himself a bit of a target, while his single-minded pursuit of his own ends can cause serious problems for other consultants.

 

george

George Costanza

Everything always seems to blow up on George.  He is also high maintenance.

On the upside, he is generally considered non-threatening, which can sometimes be a very good thing in consulting.

 

jump_to_conclusions_guy

The Jump-To-Conclusions-Guy

This guy is eternally optimistic.  He considers himself to have excellent people skills.

He does not have excellent people skills.

 

 vanilla_ice

Vanilla Ice

Vanilla Ice is the archetypal one-hit wonder. 

He did something important back in 1990 and has been living off of that one success ever since.  Then again, not everyone gets even that one success, so don’t judge him too harshly.

 

lumburgh

Lumbergh

Lumbergh is the anti-Jack Bauer.  He is a human deflector shield, and while you’re not looking he’ll manage to blame you for his screw ups.   When he throws you under the bus, you’ll know that it really was in fact personal.

The best that can be said of Lumbergh is that you don’t run into too many Lumberghs in software consulting.

 

 

We are so happy with this catalog of consulting types that we are thinking of using it in our local vetting of new-hire candidates.  Given the broad range of technical skills people can have, it seems rather unfair to try to label new-hires as “senior” or “junior” or anything like that.  What we’re looking for, after all, is a good fit for our local office, and the best way to do this is to, say, determine that we need another Maverick or a Sarah Connor or a Neo, and to try to find the right person following the guidelines above.

Moreover, when we tell our clients that we are sending them our A-Team, we can mean it literally: they are getting one Alec Baldwin, one Don Draper,  a MacGuyver and a Jump-To-Conclusions-Guy.  On the other hand, if someone wants the cast from Seinfeld, we can fill that order, too.