March 2006 Entries
In case you were wondering how such a loudmouth as myself could be so quiet for four days and three nights, my wife and I were in Puerto Vallarta enjoying a real vacation. By “real” I mean completely devoid of work. I didn’t so much as walk into a cyber cafe (though I did peer real hard inside).
Probably the closest thing to “work-related” I did was chat up a couple of school teachers on a boat getting their input into some software my company is building for labor unions.
We stayed at a wonderful bed and breakfast named Casa Amorita in the downtown area of PV, if you can call it a “downtown”. The picture on the top left is the view from the patio/pool. The B&B is built on a steep hill so there is a pretty nice view from everywhere.
It also has a nice rooftop honor bar as you can see me on the right, attempting to draw upon my inner Tom Cruise in the movie Cocktail.
If you are viewing these pics in a browser with javascript enabled, click on the pics to see larger versions.
Although PV is pretty heavily developed, it still retains some of its rustic charms. The streets in the downtown area are cobblestone and fun to explore. We endured one of those “We are not a time-share but we are still trying to sell you something you don’t need and can’t afford” sales presentations in order to get some free loot. We actually enjoyed the tour of the resort, got to spend time on their beach, and then took a nice boat over to Yelapa.
I put up a few photos on Flickr if you are interested.
I apologize for writing up a roundup for the Mix06 conference several days too late, but I was not in a good condition to blog during the conference. In part it was due to a cold I was fighting which left me unmotivated to blog. You might think that the lack of sleep and drinking would have contributed, but the strange thing about Vegas is that the less I slept, and the more I drank, the better I felt.
When you are having interesting conversations with folks, you start to lose track of just how many beers you’ve downed.
Web Standards For Real
In any case, I was impressed with the conference less due to any particular session (though there were some good ones), but more due to the reflection on what appears to be true change happening in Microsoft.
One session in particular, the IE7 Future panel, struck me with who Microsoft invited to attend. They had Molly Holzschlag, the group lead for the Web Standards Project, Eric Meyer, noted CSS guru up on stage. I sat next to David Shea, creator of CSS Zen Garden.
These are not your typical Microsoft conference attendees and perhaps have been some of the harshest critics of IE6. In part, this shows the confidence that the IE7 team has in what they are trying to accomplish. Several of these leading experts walked away from the conference with a better feelings about what Microsoft is doing in this space.
Fellow Bloggers
Of course the best part of the conference is meeting my fellow bloggers. Almost immediately Jon and I ran into Jeff Atwood who is quite funny in person.
I also ran into the dynamic duo, Adam Kinney and Erik Porter. I met these guys at Tech-Ed 2004 in San Diego when they both worked at the same company in Indiana.
Also met up with Andrew Stopford who is a class act. We talked a bit about MbUnit and wondered how do we get the word out about MbUnit. NUnit has a much larger penetration simply because it was first (which is a big deal I suppose) and because of its name. It falls under the so called “N-Series” of open source tools.
MbUnit, in my humble opinion, is much superior and definitely worth trying out. I may try and prepare a talk to give at my local users group on it someday.
Also hung out at the tables with Steve Maine and Clemens Vasters. Steve and I had a great run at the craps table only to lose much of it at the BlackJack table. Meanwhile, Clemens taught us an interesting travel game that involves people watching at hotel bars. I won’t divulge the details nor the name of the game, but just know it was quite interesting.
I’m sure I am missing someone, but it doesn’t matter. I had a great time and am looking forward to Mix07 in whatever incarnation it may appear.
So the missus and I are heading over to Puerto Vallarta this Sunday for a short mini-vacation. For me it is a chance to recover from Mix06. It was kind of unfortunate that the two events are so close together, but that was pure coincidence.
We are staying at a nice small bed and breakfast and looking forward to exploring the local area, lounging on the beach, and generally enjoying an itinerary and agenda free few days. I am not bringing a computer so I will be totally disconnected, which will be a nice feeling.
I think.
I do get a bit panicky without my blogs after a few dayshours minutes, but the missus promises me I will be ok.
You Europeans ought to appreciate this one.
I’ve mentioned before that I joined a fairly competitive league here in Los Angeles. The other day I found out that the team we are playing this Saturday fields Frank Leboeuf. He played on the 1992 World Cup Winning France National team and was a former starter for Chelsea.
His pro career must be over, but it is still a surprise that he is in the same league. He still looks like one bad mofo. I also hear that Jurgen Klinsmann plays for an adult league team in Orange County. Seems like Southern California is the place to be if you are a retired World Cup Footballer. ;)
Scott Hanselman asks the question, Is Open Source a Crap Idea. I sure hope not.
One thing to consider is that the type of open source projects that we are involved with are very niche market and hobby oriented. I have a feeling that the Subversion project will continue to do well because they make a product that is essential for many businesses.
CollabNet for example sees the value of the open source model and of Subversion as a source control tool so much so that they provide full time employees to work on it. I doubt we’ll see that happen with RSS Bandit or Subtext any time soon (though I welcome any company who wish to become sponsors).
The sad truth is that most open source projects I’ve seen are pretty much pushed forward by the efforts of one or two ultra committed people. I think the important thing for these projects to look at is a succession model for who will push the project forward when they burn out or move on. Or they need to really focus on marketing to bring in more developers.
I don’t have the answers to this one. I personally started Subtext because I wanted to tweak .TEXT to my liking and I thought it would be a great forum to try out new coding techniques and new technologies. Lately though, I found that I enjoy the product management and team lead aspect of running Subtext as much as I do the coding aspect. In that respect, I see a long shelf life for me on this project.
I doubt I would stop working on Subtext unless I just plain stopped blogging. Despite building a great distributed team, we are all busy and checkin activity is steady but not very active (though our mailing list is involved in some great discussions). I have tempered my expectations for what I can accomplish and realize that even if I was the only one plodding away at Subtext, it’s a fun and relaxing hobby with an outcome that I personally benefit from.
I was involved in a 5 AM breakfast conversation (a little late night snack before we all turned in for the evening) with Clemens Vasters, Steve Maine, and some others at Mix06 in which they explained how streaming content works with WCF (code named Indigo).
They pointed out (as I mentioned in a tongue-in-cheek context in my last post) that with streaming content such as streaming videos, the consumer of the media is really concerned about headers and start tags, because they plan on using the content as it flows over the wire.
In effect, streaming works because WCF promises to send the end tags eventually. Might be hours from now. Might even be years from now. But they will get sent and the message (as everything is a message in WCF) will be well formed and complete.
Clemens then pointed out that even if they never did send the end tags, what would it matter? The consumer of the feed, if he or she is exceedingly anal, could decide to throw an exception then. But at that point, the content has already served its purpose and has been consumed. Remember, we are talking about the streaming content use case.
This struck me with two thoughts. This is a software scenario where the intent is more important than the execution. The fact is that they intend to send the end tags is very important, but whether they actually do or not is of less importance.
Secondly,
with streaming content, the valuable deliverable is not a whole message but a partial message. By message I mean the entire content and whatever SOAP envelope it may be wrapped in.
Of course, the key to streaming content producers is to make sure to send any meta-data and commercials at the beginning of the message and not after the streaming part. But you knew that already. ;)
My Wife! The comedienne. Honey, still don’t quit your day job.
Exhibit One: My post on Mix06 in which I mentioned...
Maybe, if things are going well, I might have a date with destiny at the Let It Ride tables.
Her comment...
destiny called. she now works at the crazy horse. ; )
Exhibit Two: My recent and slightly rambling post on Lo-REST in which I talk about REST and POX over HTTP. Near the end I state...
Lets elevate the respectability of the term POX a bit and retire the term Lo-REST. It is POX, let's leave it at that and call it what it is.
And her comment in response...
yes. Lets elevate the respectability of the term POX.
Finally, my wife is taking an interest in the work that I do. I am sure she’ll now enjoy a long and intellectually stimulating dinnertime conversation as I explain to her how streaming content works with IndigoWCF. As long as the start tags are all correct, you can consume the streaming content relying on the intent that the end tags will arrive some day in the future. And if they don’t arrive, will you care as you have already consumed the content? With streaming content, the valuable deliverable is not a whole message but a partial message. Discuss amongst yourselves.
Ok, so I accidentally ran into that pregnant woman photo that the on10 team used to hint at what was coming next. It is in the third row of search results for the same free stock photo site I use. Thought it was kind of funny as I was searching for the term “rest”
UPDATE: Ok, so being away from RSS Bandit has put me out of touch of some of the other discussion on this topic. As Dare writes, Don isn’t the first person to make the Lo-REST distinction.
Well it looks like Dimitri beat me to the punch. It also struck me as odd to hear Don Box coin the term Lo-REST. It also struck me to hear it repeated at Mix06 and described as really just POX over HTTP. I had an interesting conversation with Steve Maine (who is one cool cat by the way) about it at Mix06 that got me thinking.
The thing is, REST is an architectural style, and to some degree it is well defined. What is not well defined is exactly how you build real world web services using this style. If you perform a search for the term “xml” within Roy Fielding’s Dissertation (pdf) you will find zero matches. REST does not require nor really have anything to do with XML. However, XML is a viable tool that can be used with a RESTful service.
Now Don is a very smart guy and I have immense respect for his work. I am more likely to second guess myself before I disagree with him. This is why I want to give him the benefit of doubt and try to look at what he was trying to accomplish in this post, though I obviously can’t speak for him so this is mere conjecture. The question I have is whether Don is “prescribing” or “describing”.
It seems to me that rather than try and prescribing a new form of REST, he was merely describing the reality of service oriented implementations that exist in the real world. Fact of the matter is that many companies are unveiling RESTful services that end up being nothing more than attempts to tunnel REST verbs through HTTP GET (Amazon is one example).
The problem is that if this is indeed the case, I can see the usefulness of the term from an academic viewpoint. Lo-REST can usefully describe what services that are labelled as REST, but are really not. Rather, these services are actually POX based services.
Even so, attaching the term REST to a POX service is problematic in two key ways (if not more). First, it dilutes and obscures what REST is, which not only gets the RESTafarians all up in a tizzy, but also can make the conversation around this topic more difficult. Second, it seems to undercut the significance and usefulness of POX by implicitely indicating that POX needs to be attached to the term REST in order to be taken seriously.
Ideally, we should take a step back and realize that significant web services are being written and will continue to be developed using POX. Let’s elevate the respectability of the term POX a bit and retire the term Lo-REST. It is POX, let's leave it at that and call it what it is.
DISCLAIMER: I am not what you would call a RESTafarian. I think I understand what REST is, but I am on the fence on whether web services SHOULD all be implemented as REST. I tend to take a more pragmatic approach and think that some services will benefit from a REST style approach and others will benefit from using SOAP. What I do care about though is that for the purposes of the grand debate, that we keep our terms clean and as well defined as we can and not dilute what one or the other is.
It is unfortunate that I haven’t been able to blog much about the Mix06 conference so far, as there is so much worth writing about. Unfortunately I have acquired a bad cold on top of a splitting headache that will not go away. Such is the price one pays when partying with the hard charging Microsofties (particularly with such Indigo team members such as Steve Maine and Clemens Vasters).
When I get a chance, I will write more, but I wanted to drop a note in here about Microformats. With Bill Gates on stage saying that “We Need Microformats”, there is a pretty good chance that Microformats are here to stay.
I attended a Birds of a Feather (BOF) session on Structured Blogging and Microformats with Tantek Çelik and
Marc Canter
I asked a question on whether or not there is an autodiscovery story for Microformats. Consider how an aggregator finds an RSS feed for a site. In general, the aggregator scrapes the HTML looking for a several common indicators of an RSS feed. Ideally the web page adds a <link /> tag using the RSS autodiscovery format.
But I am not aware of any such mechanism for discovering my Microformat contacts. Let’s say that I do not want to have all my contacts on my home page. How would an aggregator find my contacts short of spidering my whole site. Tantek’s answer was that they are essentially working on it and there is nothing set yet.
One problem he pointed out is that sites may end up hosting a large number of microformats. Adding an autodiscovery link in the HEAD section of a page for each format supported could get unwieldy. One idea I had would be to work on a “Table of Contents” microformat (I am sure someone else will have a better name) that would serve as an index for where my site hosts certain microformats of interest.
This would be an optional format. For example, for a site that uses very few microformats. The site can make do with autodiscovery links within the HEAD section of the home page. But if the site uses an exceedingly large number of formats, it could have a single autodiscovery link to the page that contains the Table of Contents Microformat. Aggregators would then know where to find specific microformatted information.
Thoughts?
Luciano Spiguel just posted a partial translation of my post entitled Does Mort Know We’re Talking Smack About Him Behind His Back in Spanish. I’m actually quite honored that someone saw that as being worth a translation.
As a reminder, my content is published under a Creative Commons license Attribution license. What that means is that you may feel free to republish and translate my content as long as you attribute me properly. I do appreciate that people tend to ask me before they do so. It is a nice consideration, but not absolutely necessary.
Scientific American has a fascinating article this month on Computing with Quantum Knots. In particular, it focuses on using topological properties of a two-dimensionaly confined particles called anyons. Needless to say, the only thing they’ve managed to tie in a knot so far is my brain. But the research is very promising.
I never studied topology in college, though I did try and audit a topology class in Hungary. After a couple classes I decided it was over my head and focused on Number Theory, which is more my thing. Reading this article is spurring a newfound interest.
In essense, one of the difficulties with Quantum computing is that it relies on the superposition states of individual atoms. These states are exceedingly fragile, which make building a real Quantum computer difficult. The benefit of using topological properties is that they are more resistant to change.
The classic example of a topological property is to think of a string in a closed loop. You can twist the and deform the loop all you want, but it retains the same basic topological property of being a loop. You cannot twist or deform it so that it becomes a closed loop with a knot tied in it. You would have to cut it, tie the knot, and then rejoin it, thus changing its topology.
What caught my attention in the article were the number of researches mentioned who are now at Microsoft. The article mentions Michael H. Freedman, Zhenghan Wang, and Alexei Y. Kitaev, all of whom have made advances in the concept of using quantum knots for computation.
The article mentions that these researchers are part of Microsoft’s Project Q. It’ll be interesting to see if Microsoft makes a splash in Quantum computing as it moves forward.
Lazy Coder Scott snickers when he reads blog entries decrying the existence of “Mort”. As he points out, we are all Morts to some degree or another.
I snicker when I read these posts because they dont get it. The entire POINT of writing code is to abstract away the difficulty that is inherent in using computers.
Which is true. The history of software development has been all about heaping one layer of abstraction on top of another.
However, I don’t see many blog entries decrying the existence of Mort. What I see are blog entries from “Not-So-Mort” upset about what happens to their programming tools and languages when tool and language providers accomodate Mort. Perhaps we see these tools as being made for the “Not-So-Mort” set, when the reality appears that these tools are being built for Mort. Perhaps the “Not-So-Mort” set would like separate tools.
Consider this, all abstractions are leaky. However, when an abstraction is well implemented, it hardly matters for the majority of the population. I believe I drive just as well in an automatic transmission car as I would in a manual transmission car, though my car has reduced the leak in the abstraction a bit via its sequential shift so I can switch to a manual-like mode, but that’s beside the point.
But many times, an abstraction is created in haste and causes problems for those of us who need finer grained control. A classic example is WebForms designer in Visual Studio.NET 1.1. I'm fine with the webforms designer. It is a great productivity tool and makes it quick and easy for Mort to build web pages using RAD techniques.
But now, take a Not-So-Mort who wants to use something like Microformats for example, which requires clean markup. He marks up his pages just right, but the pages get all FUBAR because the designer decides to rewrite his code. That's problematic.
The problem here is we’ve exchanged long-term productivity gains (the maintenance cycle) in exchange for short-term gains in initial productivity.
Because these abstractions are leaky and poorly implemented, they convolute the implementation details they are meant to hide and make long term maintenance that much more difficult.
Whereas well implemented abstractions tend to promote good code. I’ve read several people state that a developer would have a difficult time writing more optimized Assembler than a good C++ compiler generates in this day and age, especially on a grand scale. It can still be done, but the fact that it is so close shows that C++ is a great abstraction on top of Assembly.
I’ve written about Mort too, but I am not hating on Mort. As Scott says, we are all to some degree a Mort. However one characteristic of a Mort as I have seen commonly defined is that Mort does not care to constantly learn. Mort isn’t striving to improve.
I do still think we should expect more from Mort. Understand that though the tools we have at our disposal make computing easier every day, computing at its core is a complex problem. Be sure to gain some small understanding of what these tools are doing for you and a general idea of what happens under the hood.
Back to my car analogy, I couldn’t take a wrench and fix my timing belt for the life of me. But I do have a general idea of what an automatic transmission is doing and what limitations it causes on my driving (I can’t seem to redline!). I would never ask Mort to understand assembly, but do take the time to understand some general principles.
My former neighbors who are now in Iraq helping the reconstruction efforts write about their St. Patrick’s day celebration in the IZ, aka “The Compound”.
Chris and Susan used to live a few doors down and my dog Twiggy was a huge fan of their dog Nelson. In fact, Nelson still comes by every now and then to visit, which turns Twiggy into a little excited doggy groupie.
My neighbors are working with USAID and the Army Corps of Engineers, hopefully helping to make some small good come out of a terrible situation.
Susan finishes the post with a funny St. Paddy’s day joke.
Chris and Susan, good luck and here’s a joke right back atcha.
Well maybe not all of you. For example, I know Jayson isn’t going. Sucker. (Oooh, I just had to rub it in, didn’t I?). ;)
For you others that are going, I know there a few people I hope to meet because you promised to buy me a beer, or did I promise to buy you one? Here are the lists of people I plan to see:
Buying Me Beer
I’m Buying
No Exchange of Beer, Just Saying Hello
Normally, when I go to a conference like this, packing is a last minute afterthought. But this time, I will plan one specific article of clothing for the first day of the conference. I’ll wear a retina scarring bright orange Aloha shirt so that those of you who owe me a beer can easily spot me. If I owe you a beer, I will be wearing green and I have blonde hair. Ignore the rest of this post.
Figure 1: Eye burning shirt at BurningMan
Just look for the guy who looks like a cross between Kim Jong Il and Samuel Schmid. You can probably find me at the Craps or the Blackjack tables. Maybe, if things are going well, I might have a date with destiny at the Let It Ride tables. Assuming she still works there.
And of course, if time permits, I will be at some of the sessions.
[Listening to: Walk Like an Egyptian - The Bangles - Greatest Hits (3:24)]
Security expert Bruce Schneier writes about a humorous, cruel, yet very clever social engineering hoax inflicted on a USC basketball player in the lead up to an important game.
Apparently the ruse worked, the player, Gabe Pruitt, put up a miserable 3-for-13 game from the field.
Here is a shot of Pruitt as he realizes he’s been owned.
I feel for the guy.
I have had it up to here (imagine my hand on my head) and I am ready to fire the damn QA department for my blog. Unfortunately I am the QA department, so things will be a little awkward around here till I find a replacement willing to take zero pay with no benefits.
I read this recent post on The Joy of Code that describes how to defer the execution of a javascript that is slowing down the rendering of your site.
So I go ahead and try it out, test in Firefox, and deploy to my hosting provider. The next day, I notice that hits to my site are way down. Strange. Everybody must be taking a break from blogs.
It wasn’t till today that a kind soul sent me an email saying my blog acts funny in IE.
Funny? I’ll say. Visitors using IE would get a scripting error and then see my Flickr Badge. Only my Flickr badge.
I have gotten so comfortable with Firefox that I completely forgot to test in IE, which the majority of web users are still using. It is fun to be on the bleeding edge, but never forget your audience. In the meanwhile, I am going to try and patch things up with my QA person because there are no resumes coming in.
UPDATE:
As far as I can tell, the reason IE broke and not FireFox is that IE seems to actually honor the “defer” attribute while Firefox ignored it. This was not a bug in IE, but a bug in my head in applying the defer to scripts that should not have defer applied. And the Joy of Code article warned me too.
So a little while ago I mentioned a new site named On10. I didn’t know what it was at the time, but I was assured by Erik and Adam that it would be cool.
And then it was released and I have to admit, I was not blown away. In truth, I was a bit confused. It looked to me like Channel 9, but highlighting the use of Microsoft technology outside of Microsoft.
But this channel 9 video sheds some light on the site and I am impressed. Not so much with what the site is itself, that may take time to grow on me, but what is going on under the hood.
Some interesting points:
-
First of all, their site validates as XHTML Transitional. Good job guys, as the Mix06 site did not validate.
-
Judicious use of AJAX to provide a rich experience.
-
The site works fine with a rich experience in Safari, IE, and Firefox.
-
You can add comments next to a video while the video continues playing.
-
Hackable URLs. Ex... http://on10.net/people/haacked/
-
Trackbacks are treated as first class comments. So they are free with their traffic. I hope their spam filter is strong.
- XBox Live integration via you can select your XBox Live avatar as your On10 avatar.
All in all, On10 is an “enthusiast” site that looks to participate in and give back to the community.
Several people have complimented the live comment preview used in my skin. Try leaving a comment and notice the preview mode underneath. It now even supports a few HTML tags. Unfortunately I haven’t updated the comment page to tell you which tags are supported. Doh!
I did not write the original script. It was borrowed from the Asual Theme for blojsom and used in our Piyo skin.
However as I like to do, I spent a little bit of time trying to improve the script and turn it into a Markup Based Javascript Effect Library.
Now, by simply referencing this script, you can add live comment preview to any blog in three easy steps.
- Reference the script.
- Add the CSS class
livepreview to a TextArea - Add the CSS class
livepreview to a div
The textarea is of course the form input into which the user enters a comment. In ASP.NET it would be a TextBox control with the TextMode property set to MultiLine like so:
<asp:TextBox id="tbComment" runat="server"
Rows="10" Columns="40" width="100%" Height="193px"
TextMode="MultiLine" class="livepreview"></asp:TextBox>
The <div> is the tag used to display the preview. There is a good reason to choose a div as opposed to allowing a <p> which I will talk about later. In my blog, that div already had a CSS class applied so I simply added the livepreview class like so:
<div class="commentText livepreview"></div>
And that’s it!
Well not exactly. I fibbed just slightly. There is actually a fourth step for the discriminating blog author. If you crack open the script, you’ll notice the following section on top:
var subtextAllowedHtmlTags = new Array(7);
subtextAllowedHtmlTags[0] = 'a';
subtextAllowedHtmlTags[1] = 'b';
subtextAllowedHtmlTags[2] = 'strong';
subtextAllowedHtmlTags[3] = 'blockquote';
subtextAllowedHtmlTags[4] = 'i';
subtextAllowedHtmlTags[5] = 'em';
subtextAllowedHtmlTags[6] = 'u';
In the next version of Subtext, that snippet is actually generated within an ASP.NET page (specifically DTP.aspx) as it is a list of HTML tags allowed by the blog engine. Since this is configured on the server, I needed some easy way to pass that information to the javascript. I chose to dynamically render javascript. I could have used an AJAX approach, but why bother at this point?
You can edit that array to specify your own tags. Note the preview only currently renders tags that contain something between a start and end tag. So for example, <b></b> won’t show up, but <b>Text</b> will.
For example if you add hr to your list of allowed tags, <hr /> won’t get rendered properly in the live comment preview. It will get rendered properly when it is actually posted as a comment. This may change in a future release.
Now it is up to you to apply some CSS styling to actually make the preview look good.
This is a follow up tip to my post on Implementing CSS Based Printing.
One technique that served me well on a project recently was to implement a very simple print.css for the print stylesheet. In fact, it looks like this:
.noprint
{
display: none;
}
Make sure you declare the stylesheet properly:
<link
rel="stylesheet"
type="text/css"
href="print.css"
media="print"
/>
And now simply add the css class noprint to any elements in your HTML you do not want printed as in the simple example below.
<html>
<head><title>example</title></head>
<body>
<div id="main">
<div id="header" class="noprint"></div>
<div id="sidebar" class="cool noprint"></div>
<div id="content"></div>
<div id="footer" class="noprint"></div>
</div>
</body>
</html>
This is useful especially when retrofitting a complicated html page to use CSS based printing.
In my last post, I mentioned that even in high pressure situations, I would take my time and follow certain practices I believe lead to better code, even if it meant taking longer to complete the code.
I took this approach because I felt secure enough in my career that I was not likely to get fired outright. Or at the very least I wouldn’t mind a bit of severance to fund a short vacation. I was confident that my overall time spent on the code, when taking into consideration time to find and fix bugs, was less than others who rushed through the code and spent the majority of their time debugging it.
However, there is another key fact I realized that kept me from rushing headlong into code oblivion. Many deadlines are totally and completely artificial, and I was tired of that bullshit.
“Tell me how you really feel Phil.”
Oh don’t get me started.
An artificial deadline is nothing more than a comfort blanket to satiate a stakeholder’s need to feel in control over a process he or she refuses to understand. See the image on the left, that’s the stakeholder in charge of your project.
Most executives have a pretty solid understanding of corporate accounting. Yes, they trust the CFO to handle the specifics, but they understand the basic principles. This makes sense of course. A CEO who runs a company really ought to understand how the money is flowing in and out of the company.
Unfortunately, this same principle seems to apply less to software development. If a company undertakes a software development project, arguably one of the more expensive engagements a company can take on, it would make sense for the executive in charge to obtain a basic understanding of how real software development occurs.
Barring that, at the very least, trust your CTO or lead tech person, whomever that may be.
When given a deadline, I like to probe a bit and see if I can ascertain whether it is a hard deadline, or completely bogus. Bogus deadlines hurt morale, unless your team just plain decides not to care about them. My advice to anyone in charge of a software project is that the right way to gain control over a software project is to take the time to understand the software development process or completely cede control to your head tech person and trust them.
As for the developers and other tech people, we are not without culpability. As a commenter pointed out in my last post, we need to be ready to communicate the business case for why we want to institute certain practices. We have to speak up and speak clearly, or there is no chance for improvement.
UPDATE: James Avery points out the necessity of deadlines lest developers gold plate like they are decorating the sistine chapel.
And I agree. Deadlines are important. This is the comment I left in his blog.
Well I do believe in deadlines. However, deadlines should be set based on realistic deadlines in which the developers give input and feedback. A deadline should really be an agreement between developers and management.
“Artificial” deadlines are those that are not informed by realistic estimates, but by wishful thinking.
It never ceases to amaze me how short sighted management at many companies can be with software developers. Jeremy Miller mentions a discussion he had at the Austion Code Camp in which several developers were really unhappy with their work situations for very legitimate reasons.
I am reading a book called Beyond Software Architecture and just finished a short section on Design Debt. I’ve read and written on this topic before, but I focused on the cost to change code that is in debt. Luke Hohmann takes it further, noting that by not paying off that debt, a developer’s attention to quality is deadened. If the management does’t care and won’t allot the necessary time, what can we do? Not only that, allowing the code to remain and incur more design debt chips away at developer morale.
As Jeremy points out, there are two solutions, try and be a leader, institute good practices, and convince management to allocate the time, or move on to greener pastures.
And you know what?
Management doesn’t care. Many of them see developers as plug-and-play. We’ll just get another one. Ignoring the cost to recruit and hire a new developer, they’d rather just plug in a new developer than make difficult systemic changes. Changes that would ultimately lead to the benefit of the bottom line, but does not do so immediately in a manner they can show off to their shareholders, bosses, whomever.
So what is the solution? Unfortunately I do not have much more to offer than what Jeremy points out. Personally, I make all efforts to refuse to compromise on certain practices in the first place. I am not always successful, but I have worked in high pressure situations where I simply refused to lower my attention to quality and still took the time to write unit tests and spend time refactoring. My successor at one job even IM’d me out of the blue to congratulate me on the quality of code I wrote in such a chaotic situation. That felt pretty good.
And the funny thing is, it did take a bit longer to reach code complete, but I do not think the overall time to release was extended. “Code Complete” usually meant to now find and fix all the major bugs introduced from rushing it in the first place.
I don’t know about you, but when I find something wordy but really worth reading on the web, I print it out. Sure, I could try reading it on my tablet, but do you really want to deal with your tablet while reading in the...er... “office” if you know what I mean? *wink wink* *nudge nudge*
Unfortunately, the experience of printing many blog posts typically includes an ink draining header graphic, an unecessary space wasting sidebar or two, and the main fixed-width content being truncated off to one side.
If you click through to an individual blog post from my blog using a browser, you will notice that I now have a Print button. Go ahead and click it. It should bring up the following dialog.
Getting that dialog to display is quite simple. Here is the HTML.
<a href="javascript:window.print();">Print</a>
However if you actually follow through and print a page, you can see that the result only includes the contents of the post and does not include my top navigation nor the sidebar. To test it out without actually printing, try turning on print preview for your printer if your printer driver software supports it.
The other thing you’ll notice is that the printed view displays the urls for links alongside the link (if you are using a CSS2 conformant browser such as Firefox). The image below is a screenshot from my poor quality print preview.
So the obvious conceit here is that I expect to someday write something worth printing. In the meanwhile, I have the print icon there to give people the impression that my content is worth printing.
And setting this up is quite simple using media specific CSS. My blog has a separate css stylesheet for printing. The changes the stylesheet makes to the layout include changing from a fixed-width layout to a 100% width layout as well as setting the display of certain elements to none. Note that this print specific stylesheet works whether a reader clicks on the print icon or uses the browser’s print button.
My inspiration for setting this up was this article in A List Apart by Eric Meyer. His article provides several tips for better web printing.
Setting This Up For Subtext
For those of you with a Subtext blog, how can you set this up for yourself? Glad you asked.
One enhancement we made to the skinning engine over .TEXT is that we added more options to the Skins.config file located in the Admin directory.
A skin can now specify one or more script and css files. For script files, you may specify the language, though javascript is the default. For css files, you can specify the media type.
Here is a snippet from my Skins.config file. Haacked is my personally customized skin not included with Subtext.
<SkinTemplate SkinID="Haacked" Skin="Haacked">
<Scripts>
<Script Src="scripts/ExternalLinks.js" />
<Script Src="scripts/LiveCommentPreview.js" />
<Script Src="scripts/tableEffects.js" />
</Scripts>
<Styles>
<Style href="IEPatches.css" />
<Style href="print.css" media="print" />
</Styles>
</SkinTemplate>
As with .TEXT, the skinning engine just assumes that there is a style.css in the root of your skin’s directory, so it does not need to be specified here. However, now you may simply add additional css files for your skin to reference. In the snippet above, you can see I have a separate file for IE CSS hacks as well as a separate css file for printing.
The declaration for print.css includes a value of “print” for media. Other allowed values include, all, aural, braille, embossed, handheld, print, projection, screen, tty, tv, though for everyday use, most developers will stick to print and screen.
After setting a reference to your print.css file in the Skins.config file, simply add a print.css file to your skins root and you are on your way to better printing.
Kent Sharkey comments on the necessity of marketing and advertising in general in response to Microsoft’s recent viral marketing efforts.
Blah Blah Blah
What grabbed my attention was the new word he coined (or if he didn’t coin it, he brought it to my attention and that is good enough).
Whorosity
I just have to add it to my vocabulary. I’ve tried to coin terms in the past such as blogtegrity that I hoped would catch on, but I realize now that I’m just stooping to linguistic whorosity.
Scott over at LazyCoder called me out in my comments for participating in Channel 9’s viral marketing campaign for On10.net, whatever that may be.
I have never met Scott in person, yet he challenges me about this. And this is exactly what I love about the blogosphere1 .NET blogging community. That despite never meeting, it really does feel like a community in which we know each other well enough through our writings and feel empowered to challenge each other if need be.
On his blog, he writes (and my ego leads me to believe this is a response to my post) a promise statement that everything he says will be genuine. This is a statement of his blog’s integrity or blogtegrity for short (sorry, but I like making up words). Think of blogtegrity as being kind of like journalistic integrity, but with much more integrity to the truth and not beholden to the government or large corporate interests (ooooh, I went there).
I love this and it gave me an idea to take it to the next step. For a while now on the top navigation of my blog I have had a link to my privacy statement. I have now added a link to my blogtegrity statement. It is a promise similar to Scott’s that I will maintain my Blogtegrity to the best of my ability.
As for me being a Microsoft Shill, here was my response...
I have a couple of friends I know personally (I knew them before they were assimilated into the borg) that work there who are very excited about the work they've been doing and told me about this, but couldn't give me details.
This is just friends helping friends. I trust their judgement.
In a follow-up I mentioned
Ha ha. Oh ye of little faith.
Scott, after writing this post (Better Developers Through Diversity) critical of "Microsoft-Think" you'd still think I might be a Microsoft Shill? ;)
Till next time, Goodnight and Goodluck.
1 Apparently it is no longer de rigueur to use the term "blogosphere". I have never personally had a problem with the word, despite the fact that it is ill-defined. The term “architecture” is ill defined as well but useful in discussing software.
How many words describing a community are well defined?
Meaning of words are hardly ever set in stone, they are an ongoing negotiation. Much like grammar. Otherwise meaning would never change to fit the changing context in which we live.
So those crazy cats at Channel 9 are up to something new and somewhat secretive so far.
A mysterious source who will go unnamed (but will receive a beer at Mix06) showed me the picture to the right on Jeff Sandquist’s Flickr site. At first I wondered if he was having a child and naming it Channel 10. But I dug a little deeper and saw a link to on10.net which includes a videocast.
From the video and the thumbnails which represent further clues that will be unveiled this week, it looks like they are producing some sort of television show (for developers?) hosted by some woman and Cl@y Aìken.
Actually, upon further review of the video, I don’t think that is Cl@y after all1.
Seems like Microsoft is really on this let the cat out of the bag slowly style of viral marketing these days. I believe this is quite independent of Origami, but I can’t help noticing the parallels in how they are taking advantage of the blogging community to slowly build out hype from the grassroots level. I personally think its neat, though I realize I am providing unpaid advertising for something I have no idea what it is. It had better be good! ;)
As an aside, I wonder when they’re going to be rebranded as Channel9 Live™. Their URL still contains MSDN but it’s only a matter of time. ;)
1 UPDATE: So I was right, it is definitely not Cl@y. In the beginning of the video, there was a bit of uncertainty, but at the very end, it is obviously someone much better looking and more female. Someone named Laura Foy who was on G4TV, which I’ve never seen but I heard about. Wasn’t it a show about computer games for geeks? Maybe On10 is going to be an XBox show.
This past week was a particularly good week and weekend for me and my wife. First of all, I was happy to announce the release of Subtext with only a few minor hitches which is a great feeling.
Also during the week, my wife received a huge raise from her boss. In part this was a response to an impressive offer made by a large clothing company she was on “loan” to as a pattern maker. The fashion district in Los Angeles is known for being quite stingy with the employee pay, so this came as a bit of a surprise. Basically this means we can upgrade from Ramen to some pricier noodles for our three squares.
In truth, it means the risk we took in me taking a large paycut to start a company with Micah is largely mitigated. We can start putting money back into our savings.
On the soccer front we finally had the opening game of the season for the competitive league I joined. Up until now, we’ve been playing a few pre-season practice games.
We opened up the season with a 2 to 0 win with a goal from yours truly. In the other league, we won 4 to 1 in a game where I flubbed two good chances. So I had exactly one day to relish and replay the goal in my head before it was completely replaced with the two I should have put in.
In any case, it was a much better soccer weekend than the previous weekend’s pummelling.
PS: The term “Haackayamas” is a term our friends use for me and my wife. It is a mashup of my last name and hers.
The Boondocks cracked me up today.
Click on image for full size comic at UComics
UPDATE: Ok, this is totally my fault. I took a perfectly good NAnt script another developer wrote and tried to add a few things in there and made a dumb error. I should have a unit test for our NAnt script. ;) I’ll write up a post later describing the issue.
So I guess my fears of the release weren’t totally out of order. The first major bug report has come in. Fortunately it is an extremely easy fix.
The emoticons.txt file appears to be missing from the webroot in the distribution package. I looked at our codebase, and it is there. I run an NAnt script which automates creating a distribution package. I see the line where it is supposed to add the emoticons.txt file into the package, but it has decided that it would rather not. I need to dig into this.
In the meanwhile, I just updated the distribution in SourceForge. For those of you who already downloaded Subtext, please download and unzip this file into the root directory of your Subtext site.
For those of you about to download Subtext, SourceForge has the corrected version.
Via Slashdot, I recently read an article entitled What Corporate Projects Should Learn From Open Source by Andrew Stellman and Jennifer Greene.
This article is a wonderful complement to the book on managing open source projects I mentioned recently as it focuses on what corporated projects can learn from successful open source projects.
Among many factors, one key factor they discuss is how the lack of strict hierarchy and transparency in an open source community is a key component to an OS project’s success.
Features and changes cannot simply be added or changed on the whim of some VP who has no clue about how software development works and is unwilling to expose his or her reasoning. If someone proposes a big change, it gets discussed and weighed on its merits in an open forum. The marketing team does not drive the schedule in an open source project.
Another striking quality of successful open source projects is that despite the tendency towards an agile approach to development, they are at the same time very disciplined. Every project profiled had fairly well documented and detailed rules about the procedure for committing code, how a release is packaged, how a bug is triaged, etc...
I believe this turns the notion that open source projects are undisciplined chaotic bucket of bolts endeavors while commercial projects are finely tuned tightly run machines on its head. In fact, it is the commercial projects that could stand a bit more discipline.
Unfortunately, I believe that some of these lessons may never reach the right ears, as pride and arrogance tends to bring about the downfall of many a corporate project.
In any case, I encourage you to read it and sneak it under the door of the stakeholders of your various projects.
I have never worked as part of a shrink wrapped product team, which makes working on Subtext the closest thing to the experience. When a product team releases a product, they often stamp it with the acronym RTM, Release to Manafacturing, which is more and more becoming a misnomer as the only manafacturing being done is the manafacturing of hyperbole by the marketing team.
But I digress...
The other thing a product team does when they release is throw a release party! With an open source project with no funding, that is a bit more of a challenge. The party sort of gives double meaning to the word “release”. Shipping a product and the release party provides a release from the stress of getting the code ready for RTM.
At least that’s how I imagined it. I thought that after the release, I would feel contentment, euphoria, and relief, all without the help of a drug. Instead, I feel foreboding, anxiety, and fear.
Yes fear.
The fear that there we left something important out. The fear that there is yet some hidden but treacherous bug left in the code that will jump out at the wrong moment and eat the first born child of a user (or it might run format c:\ if the user is childless).
I am guessing this is pretty typical of the actual experience of releasing a product. This is the real feeling one gets, which is why they resort to getting really sloshed at the release party, to quell these disturbing thoughts.
Fortunately there are a few things that allay these fears. First is the extensive testing we performed (along with the nice suite of unit tests). As with any product, there will definitely be a few bugs that get uncovered, but they aren’t likely to eat anybody’s kids.
Secondly is the great team of developers from all over the world that participated in getting this first release out there. It is nice to know that when I hit the sack for some shuteye, somebody in Italy, Turkey, New Zealand, etc... is just getting around to taking a look at the code. Eyes are on the prize 24 hours a day. :)
An old saying I’ve been using a lot lately is the old saw “A shoe cobbler’s kids go shoeless”. Basically, it points out how difficult it is to keep one’s own affairs in order when it is one’s job to do so for others. As an example, my company is in the business of building fantastic technology solutions, but our own website is rather neglected. This is something we see as a real problem and will address soon.
In truth, falling into this trap is understandable, but a bad idea. What better advertising for the shoe cobbler than to have his kids in fantastic shoes? But the fact that there is even a saying about this reflects just how common this is. When starting a business, your first priority in the early stages is to get the cash flow going and make sure your customers are happy and well fed. Only then can you take the necessary chunk time to really focus ony our own needs. But until then, you shouldn’t totally neglect yourself. You wouldn’t want to hurt future growth for near term gains.
The point of all this is that I have updated my blog to the latest release. I was running an older internal build of Subtext for a while which had a couple bugs that would make themselves evident. The last thing I wanted is for someone to see the announcement on my site, notice the bug, and make a judgement based on that.
The noticeable difference is that there is now a comment preview feature as well as a recent comments display on the right. I’ll probably be tweaking my skin in the near future adding a few fun goodies.
Well it took a bit longer than I thought it would, but we’ve finally put the final touches to Subtext 1.0, code named “Nautilus”! One of the primary goals of this release was to make it much easier to setup and use than .TEXT, and I think we’ve accomplished that.
Acknowledgements
It is a LOT of work delivering an open source product, especially given that all this work is done in our spare time. A big thanks goes out to all the contributors: those who submitted code as well as those who contributed ideas and encouragement (especially my wife who has been very understanding of my code obsession and made me a fantastic cup of tea last night as I tried to finalize the release). All of it is helpful and appreciated.
In particular I want to give much credit to the team who have put in a lot of effort lately to get this ready. Robb, I am ready for that homebrewed beer!
I also want to highlight TurboMilk, the creative folks who designed our logo.
Installation
Check out the installation guide on our project site for a walkthrough of the installation. There are also a couple screen casts if you are the more visual type.
New Features
There are many small improvements both under the hood and in the UI. Here are some of the highlights...
- Web Based Installer - Installs the database schema and stored procedures.
- BlogML Support - Import and export your blog data to and from other blogs that support this new standard.
- .TEXT 0.95 Import Wizard - This is a direct database to database import.
- Host Admin Tool - Use this to manage multiple blogs
- Improved multi-blog support. Read the configuration docs for more details.
- Improved Documentation - We’ve gone out of our way to improve documentation as much as possible.
- Logging Console - The first iteration of this console displays error messages in the admin section. You can update the Log4Net.config file to change logging levels.
Interface Improvements
These were designed to spiff up the look of Subtext and remove some of the headaches in .TEXT
- New Skins - We added some spiffy new skins for your blog delight.
- Recent Comments Skin Control - Display recent comments on your blog (requires editing a skin if it doesn’t have the control already).
- Multiple Comment Deletion - Rather than deleting comments one at a time, check them off and delete them in bulk.
- Single Web.config file - There’s only one web.config file to worry about.
- Comments disabled after N days - Where N is an integer of your chosing zero or larger.
- Comments throttling - Specify a delay between comments as well as filter out exact duplicates. This is good for those repetitive spam bot attacks.
- Edit Link Control - when logged in as an admin, an edit link appears next to post titles (requires editing a skin if it doesn’t have the control already).
Under the hood
This is for you developers out there. Holla!
- Unit Tests - We added a bunch of unit tests (using MbUnit) to the codebase. We are by no means where we want to be regarding code coverage, but it is a step in the right direction.
- NDoc - We included an NDoc file and compiled help file of the code base.
- FxCop - We have way too many FxCop violations, but at least we know we do via our FxCop project file.
- NAnt Build File - Build the entire solution from the command line. Choosing the “doc” target builds a compiled help file.
- RFC3229 Delta Encoding - Potentially saves on bandwidth once clients start implementing their side of the protocol.
- RSS GZIP Compression - Compress that baby.
- Fixed MetaBlogAPI - Fixed a few bugs with the MetaBlogAPI implementation. You can now edit blog posts via w.Bloggar.
What’s Next?
The next version of Subtext code-named “Daedelus” will focus on delivering a Plugin framework along with a few plugins. That will be the key deliverable. You can view the Roadmap to see other planned features, but be aware that we may revise this list soon in order to keep the next release tightly focused. Deliver early and often I always say.