Wednesday, September 19, 2007

Usability by Inspection

Doing code reviews? That's good! Code reviews are a big help. They ensure uniformity of code, teach people new design patterns, and often even help to avoid bugs.

Doing usability reviews?

real-time usability problemMe either. But if you've got a product that has a UI, an easy thing to do to improve the product is to just sit down with a few people, maybe some that will actually use the product, maybe some managers, or maybe just some people that you can pull in to see what they think. That's more or less the gist of what I got from Larry Constantine's session on Usability Reviews.


Now, the first thing to realize is that a "usability review" is different than a "grouse session". I was once doing a demo for an internal tool my team was working on, and after I'd showed how the tool worked, during the Q&A period one guy spoke up to say, "Boy, does that interface ever look like it was designed by a programmer."

"Interesting," I said. "How would you improve it?"

"Oh, you know. It just doesn't look as sharp as it could."

Well, yes. Nothing ever does; but it wasn't too helpful to tell me that. So, when you do a review, you have to be specific.

But how can you be specific about a UI? A UI is just a UI, right? It either looks good or it doesn't.

Not at all! There are lots of basic principles of design that the people who make web sites for a living know about. Even if your organization really is full of web pages designed by programmers, there's no harm in teaching the programmers some basic principles of design. I have a couple of books on that subject, one by Mr. Constantine himself, which I didn't even realize until I'd gone in to the session. But the organization or team should probably lay down the fundamental precepts of design that they want to follow. The usability defects will be easier to objectively identify with that list in mind. Some examples of good design principles are: Availability, Feedback, Structure, Reuse, Tolerance, Simplicity. Check one of the books for some guides as to the specifics, but a usability defect violates one of these principles, or you could also say it is a probable cause of user delay and confusion. But it's not a usability defect if you just don't think it looks good!

So here's how you prepare for a usability review: First, organize a few use cases. You may already have them as part of your project, or you may just have to make some up. What you'll be doing is telling the users what they're trying to accomplish.

Then, get the folks together. At a minimum, you should probably have:

  • A leader, to make sure everything moves along smoothly;
  • A notetaker;
  • A Continuity Reviewer. This is someone who is reviewing the UI specifically to make sure it is consistent with overall project guidelines, and with the other pages in the project.
  • Users - people who will attempt to use the page. They can be actual customers; agile-style customers; or just people who were walking down the hall at the wrong time.
  • A Designated Driver. This is someone who will perform actual mouse clicks or typing at the request of the users. This will depend on the exact situation - do you have a real application, or just some mockups? Do you have a big meeting room and a lot of users, or not? If not, the Designated Driver might as well just be the user.
  • Developers/Designers. Developers and designers who worked on the page must never explain or defend design, argue with users, or promise anything. They may only find problems. Users do not count as problems.
It's an important point for reviewing anything that if a reviewer doesn't find problems, he's not doing his job. I always have to remind myself of that. But the people who worked on the application; the programmers, the designers, the developers; they will always be able to give a reason for why it works the way it does. Don't listen! Mr. Constantine suggested a "virtual air horn" - you get to pretend to be a big truck and blow the horn to get people out of the way. You must blow the virtual air horn whenever excuses, explanations, or rationalizations are made.
Next, have the users go through the use case or scenario you've designed. Introduce the scenario with an overview of context and user motivation. Read one step of the scenario at a time, and ask the users what they would do next. Users take lead in proposing actions. Never guide or prompt users! Help is limited to simple description or clarification. If the user has to ask for help, you've automatically got a usability defect.
For each defect that you find, the notetaker should note:

  1. The feature or function that the defect is in;
  2. The location; which web page it is or a screenshot of the GUI
  3. Which design principle is being violated
  4. A short description of the problem
  5. The estimated severity of the problem. (nominal, minor, major, critical )
Ideally, these would be on a form the notetaker would be able to fill out.
You should probably allow one to three hours for the review. So that's it! Get out there and say goodbye to applications that look like they were designed by programmers!

Web Application Risk Modeling

"Reverse" model - take the business case of the system and work down to threats.

A threat is not a vulnerability. A threat is what someone might try to do to your system; a vulnerability is how they would do it successfully

What risk drivers are there?

Application overview: Documentation drill; models; dataflow
Decompose application: break it down into well-defined "chunks".

Identify threats against the security objectives

Identify vulnerabilities "Vulnerability Assessments"

A threat model helps you to define, categorize, and prioritize vulnerabilities

Make sure to fix vulnerabilities, not exploits - understand all nuances, attack potential, exploit paths

STRIDE / DREAD

Other factors:
Ease of use, mitigants, timing, visibility,
monitorability (can you watch people doing stuff?),
forensics,
access required( even for internal apps, what are the chances of a bad guy infiltrating? )

XSS: Take user-inputted data and display it back without filtering. Nuances to XSS (Reflective Script Attack, Persistent Private Vectors)
POST based attack would not show up in server logs

Tuesday, September 18, 2007

xUnit Test Patterns and Smells

This comes from a really good session by Gerard Meszaros on Test Patterns at SD Best Practices 2007.

Here's my history on test-driven develoment: Back in the nineties, I first read Martin Fowler's Refactoring. I thought it was a good idea, and attempted several refactorings on the code base I was working on, with good success. I think it was one of the better-coded applications to come out of that company. But I was always annoyed, because the instructions for the refactoring would always say something like, make your changes, and test. Testing is hard, man! Especially when you're testing a bit of the application that takes two minutes to get to from application launch and relying on a Direct3D driver to do the right thing.

So I added refactoring to my arsenal but didn't think too much more about it, until about five years ago, when I ran across an article on TDD in, I think, Dr. Dobbs, but it may not have been. The article mentioned some ideas about testing and mock objects, which turned out to be exactly what I needed for the project I was working on then, which was a business-level client API with a wrapper lib for calls to the server - the ideal thing for a mock. I played with it for a while, and it worked beautifully! Pretty soon I presented a proposal for moving to TDD to the team I was working with.

There were a couple of quotes that I put in my presentation (probably from the magazine article) that I really liked:

  • Tests must be easy to run. If they aren't, people won't run them.
  • Tests must be easy to write. If they aren't, people won't write them.
This session was all about the second quote.

The problem is, tests are easy to skip. Comment out. Ignore. If you do that, your code isn't being tested. But the client doesn't care about that...at least in the beginning. Later on, if your code isn't being tested, bugs will start to crop up. You'll make a change in one area that you never in a million years thought would affect this bit of code over there. But it does, and you've introduced a bug. The client will sure care about that! So you really have to put the effort in to write tests.

But at the same time, you're selling the production code, not the tests. If your team is spending more time on the tests than on the code itself, your velocity is sure to suffer.

So what's the solution? Go back and look at the second quote again. Tests must be easy to write. How do we make them that way?

The first thing to notice is that your objectives for test code are probably going to be a little different than for the production code. For example, execution speed is crucial for production code. You can't have your users twiddling their thumbs while they wait for your web page to load. But for test code, not so much. Go ahead and add ten seconds worth of tests to your build; think anyone will notice? Or, add four hours worth of tests. Sounds good! Just make sure to run them overnight when no one needs to watch them.

On the other hand, is simplicity important for production code? Well...it can't hurt, of course. The smaller and cleaner you can get the code, the better. But sometimes there's nothing you can do about it; you have to add that cache for speed; or denormalize the database so you don't have to make calls across a dozen tables. But for test code? Let's say it again: Tests must be easy to write.

What else? Is correctness important for production code? Of course...but users will put up with small bugs. But correct test code is an absolute requirement. If you don't have the tests right, you'll be writing incorrect production code to satisfy the bad tests. What about flexibility? Code should be flexible, right? Not really, not test code. In fact, there will probably be enough hard-coded test values to make it hardly flexible at all.

This is getting long. I'll add more later.

Software in the large

Here are my initial notes on the Jutta Eckstein presentation on scaling agile development across large teams. Cleanup may follow :)

Scrum of Scrums
Crystal

Iteration Duration: larger the team, shorter the development cycle
per week, count on a half day of retrospective (two week cycle = 1 full day retrospective)

Expectation: plan/develop/deliver.
Difficult - activity-oriented planning or component-oriented planning?
Therefore: Result-oriented planning. Focus on the features! Comes back to the Agile Manifesto: Our highest priority is to satisfy the customer.

Plan for accomplishing a valuable feature: integration, test, documentation.
A feature is a brief statement of functionality, from the user's perspective
How does one deal with architecture issues?
A feature produces a measurable result.

Iterations are steered by features, but defined by tasks

Tracking tools: PPTS, TRAC
Someone also mentions they use Sharepoint
Or just three checkboxes: working on it, untested, done done
Tools support communication, not replace it

Release Planning

Iteration review (Demo)
Present software, recognize & extract best practices, learn from failure

Measurement: Acceptance tests, planned functionality, is the product owner satisfied?

Retrospective after every iteration. Likely problem that people try to make large-scale changes

- Cross-functional or feature teams
- A large project might have tech teams; the customer of a tech team is a feature team

An ideal team is self-organized; this ensures whole features and good knowledge sharing. Managers must provide environment allowing teams to gel. This is like my ACG posts from a few months ago.

Trust

Agile development is a trouble detector. Bad news is also good news. Integration of departments (Projects are customers) Close customer relationship ensures rapid feedback.

Discussion of implementing practices a few at a time. Ping-pong implementation!

Synchronization: Face-to-face is preferred. Sync across subteams daily (Scrum of scrums). If your team is self-organizing how does that work?

Communication via wiki

Just one "Chief architect" - pulls the strings, makes technical decisions, "guiding light". Relationship of chief architect and customer?

Starting: take baby steps. Start small. Use skilled people. Develop a few features and make sure to do iteration retrospectives. Grow slowly.

Don't finalize architecture before growing team; use retrospectives. Domain teams must formulate new requirements. (But you might have to finalize to eliminate fear...or at least say it's finalized!).

Avoid hot technology. A large project has enough problems on its own without trying to train developers on something new at the same time.

Refactoring: technical excellence is doubly important. If a developer sees a needed refactoring on another team, they have to point it out to them.

Large projects may have exponentially greater test time. 10% of dev effort for integration/build. (If something is difficult, do it over and over until it's not difficult any more.)
Q: Special iterations for integration? A: no
Nor a special integration team; rather people from each team who specialize in integrating

Reviews:
Special review team. People should jump around between teams, and be on a team strictly for the purpose of reviewing the code. Everyone should do this.

Knowledge transfer (via Daily Scrum and pair programming). Scrum master ensures the process; product owner ensures business value).

Q: Agility in a distributed environment. A:

Monday, September 10, 2007

Could not load type 'Global'

The comments on Harish's blog entry from two years ago give a lot of different solutions to the 'Could not load type "Global" ' problem that you sometimes get in ASP.Net. My solution to the issue was an interesting twist on one of those answers.

I had recently upgraded an application from ASP.Net 1.1 to ASP.NET 2.0, but to keep supporting old versions of the application, I branched it off in Subversion. To make sure the old version still worked, I checked out the old code into a new folder, then I went into IIS and simply moved the location of some virtual directories to point to the old code. It all worked and forgot about it.

Until later, when I came back to make some changes to the new application, started it up and got the message:

Parser Error Message: Could not load type 'WebApplication1.Global'.Source Error: Line 1: <%@ Application Codebehind="Global.asax.cs" Inherits="'WebApplication1.Global'" %>

I couldn't make heads or tails of it, but a web search led me to Harish's post and lots of different answers, several of which I tried, but none of which worked. One suggestion was to make sure the application was set in IIS to use ASP.Net 2.0 rather than 1.1, and even to set it to 1.1, click Apply, set it to 2.0 again and click Apply, just to make sure it took. Another was to make sure the application was compiled. If there's no assembly built for the application, it won't load.
I checked the ASP version, and it was indeed set to 2.0; I said, "Duh!" to compiling, but made sure there was an assembly in the bin directory, and there was; so I was at a dead end.

But I'm sure by now you see where this is going. As I opened up IIS to check the ASP.Net version configuration again, I happened to glance down at the local path for the virtual directory on that tab. And what did I see? The directory was still pointing at the path to the branched directory; a perfectly legal application, but one that was built using ASP.Net 1.1, and also had been cleaned sometime in the not-too-distant past. So the version I had configured in IIS was neither compiled, nor a 2.0 application! No wonder the error came up.

So I have an additional solution for this problem. Check your virtual directory location and make sure it's pointing to the application you're expecting it to be.

Thursday, September 06, 2007

Pair Programming with VNC

Dietrich Kappe writes on the Agile Ajax blog on surmounting the difficulties of pair programming when part of your team is offshore. Interesting stuff, but Dietrich, you also made the offhand comment that Test Driven Development is one of your commandments as well. What's your process for writing Ajax unit tests, and if you're not always doing continuous integration, how do you know your tests are always passing? I'd be curious to know!

Monday, August 27, 2007

School Daze

Wow, Amy Makice is stressing me out with her story of a second-grader stressed out in the first two weeks of class. I'm looking forward to hearing the resolution as I don't doubt I have similar experiences ahead - and of course, there are also the ramifications of putting the story online for everyone to see. My incessant questioning of a kindergarten teacher got my wife called to the principal's office at registration time, I think to reassure her that it was all going to be OK. I don't know if that was the direct result of the blog entry or not, though. But, my unsolicited advice, Amy, is to do all you can to resolve the issue before putting it online, just in case the subject of your entry ever has to read about herself on the net. People who aren't in the habit of writing for public consumption can be unreasonably angry when that happens!

Tuesday, August 21, 2007

Deconstructing the Wiki Decision

Educator Christian Long writes on using Wikis in the classroom. I'm not an educator, and my kid isn't one of Mr. Long's students, but I sure would like to see similar tools used in my kid's school. I'm not sure how particularly useful they would be in kindergarten, but editing that linked article as a class project would be fun.

That said, how likely is it that students are interested, under their own power, in editing a wiki? Based on my experience that only about 5% of readers tend to be contributors, I think it might be difficult - but of course, the percentage in an English class might be higher. Students around here are asked sometimes to edit Wikipedia or Bloomingedia as a class assignment; for example this article:

http://www.bloomingpedia.org/wiki/Amused_Clothing

was obviously written by a local teen. But if you look at the contributor's history, he copied in the bulk of the article on March 30th, came back and fiddled with it a few days later, and then never came back again.

Now, Mr. Long isn't having his kids put their essays on the wiki - at least not yet! But if, or when, it occurs, I wonder whether an English class discussion wiki would really work on its own terms without constant prompting by teachers. I suspect it could, if it is linked to the real world somehow. I'll be following the experiment with interest.

Wednesday, August 15, 2007

Bloomington not yet a'Twitter

Lots of interesting stuff going on in the Bloomington scene this week. James Boyd, who I've written about before, sat down to watch and interpret the 36 hours in three days of Monroe County budget hearings, and posted them on a dedicated comment thread on the newspaper's web site...I mentioned that on Twitter. Some of my coworkers wandered off to the Agile2007 conference and sent reports back on speakers they liked; I added a couple of people to my Twitter list and blogroll due to that. My kid started kindergarten, so I've been ramping up my list of educators as well (too bad there are no local ones as of yet!).

While James was posting his updates, I tried to follow along with his numbers on a Google spreadsheet, with only a fair amount of success. (Of course, my job was easy since all I did was read the comment threads. James had to try to interpret everything and post and try to keep up with details on the numbers - all in real time.) My goal was fairly self-centered: I wanted to understand exactly what they were voting on and why. But certainly if what I was doing was useful at all I wanted to share it - why keep it private? (A former boss asked me that once. Why did I blog about my trip instead of putting it in an email and sending it to the six or seven people in my group? All I could do was stare at him blankly.) All in all, I'd say that my, and probably a lot of other people's, information stream had gotten a lot wider this week.

Thinking along many of the same lines, only way more articulately than I could ever be, Kevin Makice wrote an piece on the future of local social networking. Kevin wants everyone to center around Twitter, which I doubt will happen. The Herald-Times has taken a real leadership role in this process, and they of course have a vested interest in bringing people to their site instead. Councilmember Sophia Travis pointed out that it was way too tough for her to actively participate in the discussion as well as listen to the issues, although she did manage a couple of notes.

So where do we go from here? Here are a few things I notice:

  • It took a professional, not a blogger, to (a) generate interest and (b) pull off the budget updates with the right amount of elan to keep everyone interested. Is this a requirement? I'd say no, but the fact is that I wasn't about to take several days off work to go down there and watch. It's a lot easier to do it if someone will pay you.
  • With the exceptions of Councilmembers Travis and Marty Hawk (who posts to the HT occasionally) there are few enough politicians in the general conversation, to expect that there will be many in the live conversation (by which I mean Twitter, or the running comment thread). It would be nice if this changed.
  • I had to ask early on in the process for copies of the spreadsheets the council was using. Apparently the auditor was running around with them on a thumb drive, handing out copies to whoever needed them. It would have been nice to just stick them on a web page at the beginning.
  • I want a budget expert available to answer questions from the public. I probably had a dozen questions over the three days - granted, I always have questions, it's because I don't know anything - but many of them James couldn't answer, and probably many he could have but didn't because he didn't have time. Wouldn't it have been cool if the auditor's office could have somebody sit and monitor the thread and explain stuff?
  • Let's not wait for next year's budget to do this again. Send the junior copy editor to update us on the Redevelopment Commission meeting. Let's get a volunteer blogger to liveblog the Planning Commission. Let's keep the government exposed!
  • Budget hearings are a really moronic way of doing things. A bunch of exhausted people sitting in a room voting yea or nay at random on a couple of grand so they can get it over with and get some lunch? Tell you what, next time let's get all the line items out on a nice wiki page and hash it out that way. I realize I'm text-centered and maybe others prefer the face-to-face, but then how about over NetMeeting or something?
  • Now, I'm not trying to grouse and say that things should have been done differently. Or to be more precise, of course they should be done differently, but we never know precisely how until afterwards. This has been a great learning week for me, and I hope, for everyone else as well.

Sorry, Kevin, I didn't get that Bloomingpedia article on the budget written; the hazards of citizen journalism :) But maybe now we all see a little bit more of the possibilities that are opening up before our eyes. Hey, follow me on Twitter!

Monday, August 06, 2007

Dare Obasanjo on Open Social Networks

Dare writes on Open Social Networks. One thing he doesn't bring up, though, is the existence of specialized social networks and how they fit into the whole. He uses Flickr and YouTube as examples of sites that have good API's for getting and setting data, but part of the point of those is that they exist solely to allow users to push around specific types of content: images on Flickr, movies on YouTube. Facebook and MySpace have lots bigger fish in mind, wanting to take over your whole mindshare. It's an interesting evolution, isn't it? For a long time we talked about Microsoft and how they wanted to control everything on your desktop; then Google came along and we talked about how having everything in your browser was better than having everything in your desktop. Now it's not enough to have everything in the browser; we have to have it all on our social networking site. The one thing this really points out to me, though, is the fragility of these sites - for a while MySpace was the hot toy, but now it's Facebook. Is there any reason to think Facebook will be the place to be in six months or a year? I don't see one.

I learned via TechMeme, though, that Jeff Pulver is leaving LinkedIn for Facebook. I think it's a mistake, Jeff. LinkedIn is specialized; it exists for business contacts. It will probably be around in a couple of years, linking up business contacts. Facebook will probably be gone as people move on to the Next Big Thing.

To sum it up, it appears to me that the real evolution of social networking is going to be LinkedIn for business contacts; Flickr for pictures, LibraryThing for books, and then maybe a few small sites like Facebook and MySpace that aggregate all this data into a coherent whole for people who aren't interested in creating their own websites that aggregate all this data, or are nervous about being outside of the walled garden. But Facebook ain't the future. Don't expect it to be.

Saturday, August 04, 2007

Your code is suboptimal!


Check out Eric Sink's blog for a nice, and almost free, T-shirt. Eric runs SourceGear, a version control company, which I'm sure is very nice software, but I've never used it. But the T-Shirt is good quality, and the package comes with a copy of the SourceGear comic book, which is hilarious. And like I said, it comes almost free. In payment, take a picture of yourself wearing the shirt in an appropriate pose, post it on your blog, and give them permission to use it, which I hereby do. This picture is on the Indiana University campus alongside a statue of chancellor Herman B Wells, who, as you can see, is doing the comic book pose too. Thanks, Eric!

Friday, August 03, 2007

Out of the Theater, Into the Courtroom

Boy, doesn't this stink? (Thanks, Vorlath). As a rule, I don't like commenting on outrageous stuff; yes, it's outrageous, yes, those darned company/government/media droids, there oughta be a law. Or a law repealed, or something. What makes this one a bit different is that there oughta be protests. Can't someone get a group together outside the theater and picket, or something? This is a clear clase - assuming the facts in the Post are correct - of an overreaction and the movie theater in question ought to be the target of a big negative publicity blitz. That's what I'd be doing if I were the girl's lawyer. I hope Indiana movie theaters have more sense, though.

Wednesday, July 25, 2007

Javadoc Clutter

Ed Gibbs, one of my favorite bloggers, writes on the usefulness of javadoc comments. (I meant to write on Alfred Thompson's thoughts on the issue last month as well, but didn't get to it.) Here's my take: If you're coding properly, you have lots of little methods, as Ed says, and they should be just about self-documenting and not really in need of comments. But, when you have code organized like this, it becomes even more important that the big picture be kept in mind somewhere. This partly means working on good class-level documentation - how the class is intended to be used for example, but it also means having good diagrams of the entire application. With this, you may realize not only how the class is intended to be used, but how it's being used in an unintended way, or how it's duplicating the functionality of this other class over here and they need to be merged into a single class.

So where do the diagrams come from? As Alfred mentions, you can use class designers like the one in Visual Studio, but my feeling is that that is only a starting point. There are so many different diagrams you can make: dataflow, inheritance, etc., but you have to keep in mind that the point of any diagram is to help the reader grok the system. What I like to do is keep a documentation wiki around, and generate some diagrams that can be added as pictures, and as a starting point for some user-defined text to help explain them.

But when you do that, eventually you're going to want hyperlinks in the text that lead back to the class, and its description, and its methods. And this is where Javadoc comes in. In the build, throw in a step that generates HTML pages from the Javadocs, and make them available to the users of the project wiki. I think this gives you the nicest combination of high-level overviews and class-level references, both of which are essential to a well-managed project.

Monday, July 23, 2007

The 20 Dumbest Words in Software Development

Brandon McMillon writes on doing it right. (Thanks to Alfred Thompson for the link.) He doesn't touch on the agile side of software development - although I can guess his opinion by his planned article "Pair Programming is for Morons" - and so the article has a lot of stuff about Objectives and Requirements and Spending Design Time Up Front. The tricky bit about commenting on this sort of article is that I don't really disagree; his straw man comparison is that one group who just goes off and starts coding so they can get it done faster. That is bad. He does mention how getting sign-off and buy-in from users and stakeholders is valuable, and here's where we might differ: getting this sort of data is important throughout the life of the project, not just somewhere near the front. Because once a user gets some working software in his her hands, she's immediately going to have ideas to improve it, and they'll probably be good ones. So, while it's nice to do some designing up front, it's more important to have your code in a state where you can make changes easily and quickly, to respond to the inevitably changing user requirements.

What I have written here is short, and therefore oversimplifies the many issues. But the full range of agile practices can answer most objections, in my experience.

Saturday, July 21, 2007

Should Newspapers Become Local Blog Networks?

Scott Karp at Publishing 2.0 writes about newspapers jacking up their blog count. I think the thing that most people are missing when it comes to whether newspapers should be more like blogs, or should bloggers be more like reporters, is that we, as blog readers, are really, really interested in who's writing the story we're reading. It's why there are columnists. After a while, people would read anything Dave Barry wrote because, as soon as they saw his name on the column, they knew they were in for a funny article.

But it's the same thing with real news. Our local paper just had a bunch of articles on the competence of the county auditor, many written by a reporter named James Boyd. They're good, if controversial, articles, and ended with the online version having dozens of comments along the lines of, "the real story is...", "what the paper needs to do is...", "why on earth didn't they report on...", and finally Mr. Boyd, possibly tired of all this, chimed in with his side of the story and explained just why he reported on what he did, and what kind of feedback he got from the auditor. The comments immediately became much nicer.

Why? Because people then realized they weren't just trashing a corporation, they were trashing a real person, and one willing and able to defend his actions. It created a conversation rather than a soapbox. So, even though Mr. Boyd is a reporter, I think what I'd really like to see on the site is his pseudo-blog: maybe nothing more than a list (with, of course, RSS feed) of all the stories he writes. When we know who's on the other side of the pen, the story becomes a lot more interesting.

Friday, July 20, 2007

Learning from Joel Spolsky (and Dave Winer)

Here are my comments on Joel's comments on Dave Winer's comments concerning comments. I think Dave is dead-on, but the whole issue is really more of an A-List issue than it is a general concern. I bet there's some sort of law that states that the amount of garbage increases exponentially to the number of participants; if there isn't, there should be. If you have a small blog where just a few people comment - or none, like this one - the quality of the discourse tends to be pretty high, but when you start having thousands of readers, the number of people who have their own agenda to push starts to outweigh the number with interesting feedback. I have comments enabled, and I expect to have them for the foreseeable future :)

But I still want some way to do trackbacks. I don't think the existing trackback system is able stop spam well enough to be useful, but the fact is, no one who reads Joel's post will ever find out about this one, as far as I can see; especially the casual reader who only stops by for a few seconds.

Thursday, July 19, 2007

Jobs of the future, #1: Online Community Organizer

Seth Godin suggests that an up-and-coming job description will be Online Community Organizer; that would be someone who can gather together everyone in an industry and make them feel like they have to be part of the conversation in this forum. I could see it coming someday, but my feeling right now is that all of the successful online communities are happening more or less by accident. Facebook, MySpace, Twitter. What makes Twitter a more dynamic online community than Pownce? Not much, I hear; maybe some sort of first- or second-mover advantage? But is there really somebody out there capable of moving from one job of this type to another and being successful at both? I have my doubts.

Tuesday, July 10, 2007

Marc Andreessen's Eleven lessons

Marc's disabled comments on his (excellent) blog. Marc, I see at least two issues with that: First, a lot of times I only have a sentence or two to add to a post and it hardly seems worthwhile to create a brand new article on my own blog. Second, if anything it's even easier to spam trackbacks than it is comments! Although I don't have enough readers to bother about any spam-blocking besides the Blogger default captcha, surely you could come up with some mechanism to ensure a human is the one entering the comment. And isn't it a shame to restrict comments only to those who have their own websites?

Thursday, July 05, 2007

Evaluating Javascript in an NUnit test

Adam Esterline posted his solution to javascript testing. He uses WatiN to run tests, which I wasn't excited about; I was hoping for a way to test where I didn't have to install any more software anywhere. Here's the solution I came up with:


static object Evaluator(string code )
{

ICodeCompiler compiler;

compiler = new JScriptCodeProvider().CreateCompiler();
CompilerParameters parameters;

parameters = new CompilerParameters();
parameters.GenerateInMemory = true;
parameters.GenerateExecutable = true;

parameters.ReferencedAssemblies.Add(Assembly.GetExecutingAssembly().Location);

CompilerResults results;

results = compiler.CompileAssemblyFromSource(parameters, code);
if (results.Errors.Count > 0)
throw new Exception(results.Errors[0 ].ErrorText);

Assembly assembly = results.CompiledAssembly;

MethodInfo entryPoint = assembly.EntryPoint;

return entryPoint.Invoke(null, new object[] { null } );

}

[Test]
public void EvaluatorTest()
{
Evaluator( "Context.Current.Data = \"Craig\"" );
Assert.AreEqual( "Craig", Context.Current.Data );
}


This seems elegant and able to handle a lot of things like side effects. Unfortunately I've been back on the server side for the most part and haven't really tried to put this code through its paces.

Thursday, June 07, 2007

Lawn sign in the Forbidden City

Mark Hurst's great This Is Broken website gives examples of bad user interfaces, both on the net and in the meat world. You can't argue with most of the entries, but I love this sign. The grass is quietly asking us, "Please Do Not Disturb Me". The extra "Me" on the sign gives a really dreamy, tranquil, and above all Chinese feel to the landscape; much better than the harsh "DO NOT DISTURB" or "KEEP OFF THE GRASS" signs we Americans are used to. (I'm posting this here since you have to be a registered user to add comments to the site).

Sunday, May 20, 2007

Frames Per Second in birds

I had occasion to visit Hardin Ridge yesterday for the International Migratory Bird Day celebrations. They had several stations, and it was fun for the kids, but one thing I thought was interesting was during a presentation on birds of prey. They displayed a peregrine falcon and talked about its remarkable vision; here's what Steiner has to say about it:

They are equipped with full-color vision and with eyes specially adapted to permit rapid adjustment of focus while moving at speed, and from four to eight times the resolving power of the human eye. Hovering may be compared to looking into a field from a car moving at twenty miles an hour or from one which comes to a standstill every few yards. It would be possible for a human being to see an individual rabbit or large game bird at a range of 600-700-yards; a bird of prey, with about four times the resolving power of the human eye, should therefore be able to see it at a range of nearly two miles.

What particularly caught my attention, though, was when they said that the peregrine can perceive significantly more events per second than humans can. I don't know if it's exactly the same concept, but I assume we're talking about frame rate here; they commented that even when cameras have been attached to these birds as they make one of their amazing, 200 miles-per-hour dives onto some unsuspecting pigeon, all humans can see is blur.

Now, the frame rates they mentioned seemed surprisingly low to me they suggested 18-20 events per second for humans and maybe two or three times that amount for the birds. But I suppose it's an example of flicker, and syncing, where if you perceive the wrong couple of frames in a videogame the action seems all wrong, or maybe the afterimage in the eye causes the slowdown.

So I'm not sure where all this is leading, except maybe that a really cool videogame would be Peregrine: The Stoop for a Pigeon. But I suspect there's a lot of basic science to be done before any game can simulate the visual experience of this amazing animal.

Friday, May 11, 2007

Choosing a Kindergarten

It's a funny thing, but I'm pretty used to being marketed to. When I needed to get a gym membership, the gyms that I went to had someone there to give me a tour; show off the machines and the hot tub; in general make me excited about going there. Or when my wife was checking out nursing homes: she had a very similar experience with people who wanted to make her comfortable and get her interested in coming back, offering her cups of coffee and things.

So when we got the letter about coming to a kindergarten open house, that's sort of the thing I expected. I thought the people would be interested in showing us around and getting us excited - like the gym or the nursing home, trying to sell their product to us, sell us their school. I guess the first warning I should have had came straight from the informational packet, though: there was really nothing there except lots of information about "your child" - "your child" should be able to tie his shoes. "Your child" should have lots of time to read with you. "Your child" needs to be independent enough to go potty all alone. Not a word about this big, new, mysterious place he'll be going to.

So I was expecting some more information on the school at the open house. Unfortunately, what they had for us was another informational packet explaining what "your child" had to do in order to be ready for kindergarten. And who was running the open house? One kindergarten teacher. The school has two, but the other was busy - and I understand she just lost a family member, so that was okay - and the principal apparently had decided that some interviews he had to do were more important than meeting the new parents. I disagree.

So it's very clear when you leave the private sector, even for a heavily regulated industry like nursing homes. We obviously had some amount of choice over our kindergarten, but once we made the important step of purchasing a home, we were pretty much stuck with this one, and I think that the information we got reflected that. I'm not even saying it's intentional - simply that no one's ever thought twice about having to sell their school, because no one has to.

That in a nutshell is the biggest problem with the school system, IMO. It will be interesting to see if this pattern continues or whether some more wholehearted attempts will be made at engaging us.

Monday, April 30, 2007

Precociousness

Hey, dad?
Uh-huh?
How many hours are there in a day?
There are 24 hours in a day, son.
Oh.
So how many hours are there in a night?
I meant, there are 24 hours in a day and night together.
Even in wintertime?
Huh?
In wintertime the nights are longer.
Yes, but the days are shorter too.
Oh.
So there aren't 24 hours in a day in winter?

What?
Well, you just said the days are shorter.
Well, that's true, but...say, why don't you go play with your toy cars for a while?

Friday, April 13, 2007

FastTrack seminar, part 2

Second session at the seminar was on the new features of SQL Server 2005; since I was at the launch party in Indianapolis I didn't feel like there was a whole lot that was really new; but since I'm currently employed at an Oracle shop it was interesting to compare the two. This session was given by George Huey, a Microsoft "Architect Evangelist", whatever that is; but he knew his stuff. The most interesting new feature from my admittedly database-illiterate perspective is the ability to write code in .Net and turn it into stored procedures and code that runs inside the server process. You can also set the code permissions: Safe, Unsafe, or External Access, which I believe means, "hits the file system", but regardless I don't know if anyone actually uses that feature. Another interesting feature is the ability to run "recursive queries", which sounds pretty handy: he gave a demo of calculating the number of levels of management by recurring up the tree until you find the guy with no manager.

A few other features he went over were: Native XML store; Pivots; Top; and Rank; they all seem very nice but I'm not really in a position to judge how useful they would be in my work. I guess we'll see.

The final session was on "Business Intelligence". I didn't have any idea what that might involve, but it turned out to involve reporting. I wasn't aware that you can configure SQL Server to give you a project type of "Report" in Visual Studio fairly easily, and there's also a "Report Viewer" control that you can add in to your own ASP pages. I have to admit that I lost some of this lecture, as the presenter was having some trouble with his computer and the wireless was working nicely - for a change - so I took the time to mess around with some more of the AJAX demos that I was really interested in.

The seminar was held in the Glick Center, where the Indy NDA holds its meetings. It was a good venue to hold the couple of hundred people who showed up. Microsoft sprung for donuts and pizza, and I liked the idea of having a couple of arcade games for people to check out between sessions. I would have traded them for better wireless, though. There were also only power outlets on one end of the room. But there's only one really important highlight: through the door prizes, I am now the proud owner of a Zune :) Welcome to the social! (Hello? Is there anyone else in here?)

FastTrack seminar

I’m blogging today from a Microsoft FastTrack seminar. Perpetual Technologies in Indianapolis is putting this on in some sort of collaboration with Microsoft. It’s a free seminar – and I’m always up for a free seminar – with a keynote and six sessions in three time slots.

The keynote was OK. Steve Thompson from Microsoft gave a roadmap presentation of where they expect enterprise technology to go over the next several years. The majority of audience were DBA’s rather than developers, so they may have had more interest than I did. As important things, Steve brought up Office, Microsoft Server, and mobile applications; and also Microsoft Business Solutions, about which I don’t know much. The goal, I guess, is to get enterprises on the Services Oriented Architecture bandwagon, and also to move towards virtualization as an important technique for scalability. He also discussed voice and VOIP near the end of the presentation, and how our standard voice data paradigm – blinking message lights and busy signals – is really out of date. This is something I’ve known since Interactive Intelligence was trying to get everyone out of that as well; don’t know how that effort is going, but we still have the copper wires at my last couple of jobs.

First session was on the Ajax.Asp.Net control library, which looks pretty cool. It was given by a younger guy from - I think - Crowe Chizek, and he did a creditable job, although I would have happily spent a couple of additional hours learning the subject, given the opportunity. It's interesting that most of the effects it allows you to create are already implemented in Javascript in the application I'm currently working on - a tribute to the skills of the original writers of this app, I think. But, you could certainly write a lot less code to get the same effects using this library. It looks pretty easy to use, although .Net 2.0 is required: one msi to install on your machine, and one zip file with controls and demos. It'll definitely be useful in my own web applications, anyway!

Monday, April 02, 2007

Javascript testing with NUnit

I've been looking around for a good way to test Javascript functions.

There are at least two if not more versions of JSUnit, one here and the other here. But there is one fundamental requirement I have for any unit testing framework, and that is that it has to integrate into an automated build script. For example, suppose you're using CruiseControl. It's got an NUnit step in it; once you write up your tests, it's the matter of a few minutes' configuration to get them running as part of the build, and it's very satisfying to watch the test counts grow as more builds are done. 117 tests run, no failures. 123 tests run, no failures. 135 tests run, no failures.

So if the framework doesn't work with automated builds, it's no good to me. Do they? I'm not sure. Edward Hieatt's version seems primarily to require a browser, although he does provide a JSUnit Server which appears to be designed to work from Ant or Java, but doesn't have any particular support for Nant or ASP.Net that I could find. Jörg Schaible's version is even less able to work in Windows; starting from the download which is only provided in tar.gz format. The documentation states that it can be run from the command line; if so that's easily adaptable to an automated build, but I didn't even take the trouble to download it, suspecting that it wouldn't even run on Windows.

So I was looking around for other alternatives, and I ran across this post. I'm sure that not everything you can write in Javascript can be evaluated by the .Net Javascript evaluator, but when you write a lot of tests you get used to keeping functionality nicely isolated.

I'm not sure what the best way to use this is. My first couple of tests have the Javascript in the ASP.Net codebehind file, where they can be unit tested at test time and Response.Write-n at runtime; but there's a few other possibilities; keeping all the Javascript in a separate file to be read in at test time, and using it as an include at runtime perhaps.

So I have a lot of work to do on this technique. But it seems promising!

Wednesday, March 14, 2007

Sports and power ranking systems

I've had an interest for a long time in the science of sports team rankings, for various reasons, which was forcibly brought to mind when I was filling out my tournament bracket. I'm always extremely mediocre in such game-picking contests, and when one blogger whom I respect said something similar, I started to think about how rankings could be done for college basketball. I looked a little closer at the Pomeroy Rankings, which seem pretty nice, although if Ken reveals his exact formula for creating them, I couldn't determine it. IMO a ranking system can't be taken seriously if the method that is used isn't known. Take Jeff Sagarin: Everyone always prints his rankings up very seriously, but we don't know what he's doing, so he might as well be making them up and just pretending it's math.

But Ken has something much more valuable on his site than a ranking system: a game database. For the most part, this information is not available in any easy-to-get-at-form, so if you want to create the rankings, you have to get down and do the data entry every year, which is why I've never created any system that lasted more than a year. But now, with Ken's files, maybe something useful could be done.

So I did a little research, thinking that the most effective system probably was going to be some kind of balance between a single-game Pythagorean expectation and strength of the opponent, repeating until the numbers converged. I'm sure I read a paper about that some years ago, but I can't find it now. Instead, I found this, a technique which doesn't take into account the scores at all!

But it's interesting, because it's based on the age-old theory of game commutativity; to wit: my team beat team X and team X beat your team, so my team is better than yours. Yah. It's a principle that's been widely derided for years, and people make hobbies out of finding weird cycles of games proving that Prairie View A&M is really better than Michigan after all. But there's obviously a kernel of truth in it. The paper goes into a lot of detail about setting up the graphs and putting weights on things and, you know, math, but really the principle is pretty simple. It works like this:

For each game that my team wins, it gets partial credit for each win the team it beat has.
For each game that my team loses, it gets partial debit for each loss the team it lost to has.

That's it. The questions are, do you want to go deeper and credit my team for a third or fourth level, and just how much credit do you give for each "indirect win"? The second question is easier for our purposes, because the authors of the paper do a lot more of that math stuff and come up with a simple equation for us:

Let k equal the average number of games played by each team.
The credit is (2k) / ((k^2) - k ).

For a third level, you'd square the credit, etc. But do you want to do the third level? Say the credit is .1, or 10% of a win. For the third level the credit would be .01, which doesn't seem like much, but you're talking quite a few games, too. So I'm going to have to use Ken's game database and do some research on this. Any code I create will be open-source, of course. I won't be able to do anything useful before this year's games start, but next year, watch out!

Monday, March 12, 2007

Generating classes from XML in .Net

The Oracle version of SQL has some nice keywords for returning your data in an XML format. (I suppose the other servers do too, but I've not used that feature.) When I get the XML back, I want to turn the XML into a set of business objects for easy serialization. XSD is the tool for that. Write the XML to a file, run XSD on it to generate a schema, then run XSD /c to generate the C# class file, and you've got a nice class. You can muck around with the XMLElement and XMLAttribute attributes to create nice field names, and 30 seconds to put together a static Get() method that returns a class from the XML.

Except it didn't work. The serializer threw a File Not Found error. When the XMLSerializer class has a new type it needs to serialize, it just generates the code on-the-fly and throws it into a new assembly with a name like olkdzxc.dll, and returns the class from it; but when I called the serializer, it told me that olkdzxc.dll wasn't found. Very mysterious.

Luckily, I remembered Chris Sells' old tool that was made for debugging exactly this problem, XMLSerializerPreCompiler, which lets you see the compiler errors that occur while the code is being serialized, and one of those led me to the problem: When generating the class code for an array of objects, XSD was adding an extra set of brackets in. So instead of having a class member myFoo[], I had a member myFoo[][]. Why did XSD do this? I have a hard time believing it's just a silly bug. I'd love to hear if anyone knows.

Thursday, March 08, 2007

Online and offline communities

I wrote earlier about creating online communities around business-to-business applications, with a vague promise to add more, but didn't. What rejuvenated my interest in the topic was going to a lecture and buying a book by one Joseph Myers, who lectures on creating small groups for churches. Churches generally don't like to be impersonal - it kind of misses the point - but there's no real alternative once the congregation grows beyond 100 or so people, so they like to subdivide into smaller groups so everyone has a group they can be comfortable with. What Joe Myers pointed out, as I understood it, is that it's very hard to create this sort of a group from the outside - intimacy generally arises from a group of people who like to be around each other. So, if you are a corporate executive, or a church leader, who is tasked with creating a community, how do you go about it? On the one hand, it's our job to create these communites, on the other, we know that they're not created, they just appear.

So the recommendation, for church leaders at least, is to define more exactly what groups already exist in the church. Church leaders want every small group to provide intimacy, but that's really only one way to relate to a group: the group can be more of a public group, or more of a social group, or just a personal group, and churches can take advantage of knowing how these groups relate to each other to encourage more fellowship in the church.

Is it applicable for online groups? I'm not sure. Here's the issue: at least if you're working with a church congregation, you can call a meeting, bring everyone in, discuss the issues, maybe figure out what the existing groups are and what they're doing. You can't do that online. Maybe the best thing someone tasked with creating an online group can do is simply to monitor the group, or groups, and make sure that the company is willing to go wherever the group takes them. Seems obvious, but is it? Check out Yahoo's handling of Flickr accounts, or Facebook's decision to allow non-college students to join. Or check out a lot of different online forums that die because people thought they were cool at first, but then they never changed again and everyone left for more responsive pastures.

I don't know the answers. But it's an interesting bunch of questions.

Tuesday, March 06, 2007

Quality of Local Political Blogs: Compare and Contrast

I've been writing various articles for Bloomingpedia in the last month or so, in an effort not so much to improve that site as to understand better the town in which I live. One of the keys to understanding a city, I think, is to gather a lot of different perspectives from a lot of different individuals with a stake in the matter. Take Indianapolis, for example: there are a lot of places you can go to get an impression of how the city is doing. Ruth Holladay; Matt Tully. Taking Down Words; Indy Undercover. You have to gather them all together before you can make a critical analysis of what's really going on; but they're there, that's the important thing.

Or you could read the Indianapolis Star. But I don't have much trust in the Main Stream Media. Their goal never seems to be so much the truth as it is finding someone who disagrees, no matter how foolish or inane that person may be, and unless you already know the subject matter pretty well, you can't tell from the way the article is written which is the inane perspective and which is sensible. So that leads you back to blogs.

Here are four local politicians who have been on my mind lately: Marty Hawk, Dave Rollo, Scott Tibbs, Sophia Travis. How easy is it to get their perspectives on local issues?

Far and away the best online writer in this group is Sophia Travis. If you just looked at the MSM, you wouldn't think much of her except that she's a little flaky (an accordion player with political aspirations? Weird!) But when you read her blog, not only is she talking about the tough political issues, but she's following up on comments people leave; leaving comments on other local blogs; sending in questions to local online chats; really being a part of the conversation about what Monroe County is, and what it should be. It would be great if every politician had an online presence like Sophia's.

Second best is Scott Tibbs. I actually started this post thinking about what I don't like about Scott's blog: there's no real comment area on it, just a link to a bulletin board, which I assume is also run by him, and which you have to register on before you can comment. He says that's to avoid spammers, but obviously a lot of bloggers manage to allow real comments without going to that extreme. But the point is, he writes, and discusses, and allows discussion of his views in some form. So I can't take too much umbrage, especially compared to:

Dave Rollo. He's got a web page; it's a start. The page is very static; the main page has a "last updated" date on it, but there's nothing to find what was there before. There's only a few paragraphs discussing his views, and there's no way to leave public comments, and if he's ever left a comment online I haven't seen it. Start a blog, Dave. He did participate in an online chat recently, and having a web page puts him ahead of:

Marty Hawk. Not much to say here, because I really couldn't find out anything. She gets quoted in the local paper from time to time, and you can go read the minutes of the Monroe Council meetings and find some things she said. But right now, the number 2 hit on Google when you search for her name is the article I wrote on her last week. So we really don't know too much about her at all. It leaves me defining her, rather than having her defining herself. If that's what she wants, then that's fine.

So that's where we are in online local politics in Bloomington. It's a start. But I wish there were a lot more politicians in the conversation.

Thursday, February 22, 2007

Bookplates

(Hey, this is my 200th blog post! And it only took me three years!)



One principle of agile development that doesn't get a lot of attention is Sitting Together. The point of the principle is simple: agility requires communication, and there's no faster communication than shouting over your shoulder to the guy behind you! I think it's a bit overblown; communication is hugely important, but with the advent of instant messaging, not only do you know that Dan down the hall is sitting at his desk, but you even know that Mike down in Dallas is, and they're just as likely to respond to your ten-second query as Jennifer two desks away is. The participants have to be in pretty close time zones, though; Suresh in India just isn't gonna respond to your IM no matter how many times you check his status during the working day!



In my new company we sit together, which is something I've never done anywhere else. I've found that one disadvantage is that my desk doesn't have space by half for my programming library, which I like to keep at the office for easier reference. (Okay, so I haven't referred to the Differential Equations textbook since I left the videogame industry. Nevertheless.) So I'm taking over a couple of shelves nearby, but instead of just writing my name in all my books, I thought it would be more fun to make bookplates for them. Here's the design I made:

I'm no graphic designer, but I thought it was OK. If you want to modify it for your own use, feel free; I've made a Word template available for use with the Avery labels that come six to a page; you can get it here, or download the Avery bookplate for the four-a-page labels. Hey, my favorite book site LibraryThing, why don't you provide some of these? I'm sure there are dozens of people who can do better!

Friday, February 16, 2007

Government RSS Feeds

Sophia Travis is a Monroe County Council member - and, remarkably, one who is sophisticated enough to have her own blog. On one post, she asks what information we'd like to see on the Monroe County web pages. I would like to see an RSS feed. Here's why: Government business does not lend itself well to the regular web page format. The people's business does; the most important thing for the web site will always be ways to contact government officials; how to apply for permits; pay parking tickets; vote, etc. But government business consists mostly of a neverending string of public meetings, each one with an agenda beforehand and minutes afterwards. The best way to present a stream of information like that is with a feed. For example, I've already created a feed for the Council meetings using the very nice, if complex, Feed43 service. My feed will do the job, giving me an update through my feed reader whenever a new meeting agenda or minutes are posted, but it's pretty content-free, as the feed can't do much except monitor each row of the table of meetings on the page. But suppose the county tech services people set up an easy way to post updates using TypePad or Blogger - suddenly it's easy for them to update the site and there's a good description of the update in the feed. Then, perhaps, it could be expanded using the same feed, to give information on other public meetings, notice of events the council members are participating in, and any other kind of information that has a time element. I'm thinking this is actually a time saver, at least for that one poor soul whose responsibility it is to go in and edit the HTML table on the page whenever new meeting minutes are available!

What would you like to see on your local government web site?

Thursday, February 08, 2007

Change is good

I've accepted a new job with Envisage Technologies, a small software company in Bloomington. I'm excited about it as it's a company with a firm interest in agile principles:

Do ideas by the Gang of Four, Steve McConnell, Martin Fowler, Tom DeMarco and Kent Beck resonate with you? Join an experienced team of developers in an Agile environment...

So I'm no longer working in Indianapolis for the first time in more than ten years - I'm not sure what I'm going to do with all the extra time!

(I've also set up a LinkedIn account as per Guy Kawasaki's suggestion. Drop me a line if you want to connect to me.)

Tuesday, February 06, 2007

Prius anti-skid props

The problem with having six inches of snow dumped on us is that the hill that leads to our house has a slope that isn't quite a vertical wall, but that's pretty close. So as I was heading home my wife assured me she'd seen the plow go by, and I decided to take the hill, which in good weather would be five minutes, as opposed to going the long way round and taking half an hour.

Up I started, accelerating to about 25 MPH and getting at least 30 or 40 yards before realizing that the plow hadn't been by recently enough to make a difference. It was easily the worst snow I'd ever tackled on the hill before, and it's not fun having to back down that slope, let me tell you. Especially with the literal vertical drop on the side that sends you ten feet straight down before the drop is conveniently stopped by a tree.

But here's what the Prius does, straight from the brochure:

Motor Traction Control (TRC) – TRC uses sensors which automatically apply the brake to any slipping wheel while delivering more power to the wheels with greater traction.
Vehicle Stability Control (VSC)* – VSC senses oversteer (tail slide) and understeer (nose pushing forward), and managing the power delivered to each wheel.


It was a beautiful thing. I kept the accelerator right around 25 and the car took over from there. It never slipped sideways, never fishtailed, and actually applied acceleration to the wheels in bursts of a couple of hundred milliseconds at a time, followed by coasting to grab what little traction it could, and then accelerating again, and I was at the top of the hill as nice as pie. I only felt guilty for not stopping the cars I passed and telling them, "Your car got TRC? Got VSC? Then DON'T try the hill tonight! Just because my car can do it doesn't mean yours can!" What a beautifully engineered vehicle.

Thursday, February 01, 2007

WiX installer and Error 2708 (No entries found in the file table)

I had to add different versions of a file to my installer today. Seemed easy enough to do - the files were available in the right places and everything, so I added a version number on to the old file ID, added a new file with the new version number, and called it a day, right?

Not so fast. Compile up the install and run it:

Error 2708: No entries found in the file table.

Say what? Must have been a file system glitch. Open up the MSI with Orca and check the file table; well, yes, it has lots of entries, no trouble there. What's going on here?

Buried deep in the search results for the error code I found this page. The comment from Jane D pointed out that she'd seen this error while having problems with the Duplicate File table rather than the File table - and that jogged my memory. In a separate component I had a CopyFile element that was pointing to my file, and it still had the old file ID reference, now orphaned. Update the reference, recompile, and bingo. Working install.

I see this as a bug in the WiX linker: why did it build the MSI with this unresolved reference? I'll have to post something to the mailing list at some point.

Thursday, January 25, 2007

Credibility redux

Y'know, I'm not affiliated with Microsoft at all, although I own some stock and use their products happily. So I'd like to think that when I say something like, this Microsoft employee has credibility, it's because the employee actually has credibility and not because I'm biased or brainwashed towards the Borg.

I've been a loyal subscriber of Dare Obasanjo for at least a couple of years now, and a happy user of RSS Bandit, although I'm now evolving a bit into Google Reader for its mobile capabilities. So when I read his article about changing Wikipedia I didn't think much about it; mildly interesting but not a big deal, and his changes in the TechCrunch entry certainly deserved reverting under the Wikipedia "No experimenting" clause. But Michael Arrington's reaction was out of line:

A Microsoft employee, who took issue with this blog post, vandalized the TechCrunch Wikipedia entry and wrote about it on his blog.

That is a misuse of the word vandalized by any stretch of the imagination. Dare added maybe a couple of sentences with a dry, unemotional tone. He put up an apology in the comments, too, but in two or three comments (which have now disappeared) Arrington repeated the vandalism charge, and he's showing no signs of backing down. IMO, there is a serious credibility gap in repeating an emotionally charged word like that in response to some rather minor issues. I'd never heard of Arrington before, or read TechCrunch. This little flap doesn't make me want to, either. Michael Arrington joins Andrew Orlowski in my credibility book.

Wednesday, January 24, 2007

B2B 2.0

Chris has left LibraryThing. I don't know him, but apparently he's done some really good work for one of my favorite Web 2.0 plays; a social site based around book collecting.

There are lots of definitions of Web 2.0, but at least one of the principles that seems to define it is "Online Community". Flickr, YouTube, Yahoo! Answers. Online communities have been around since the beginning, of course, at first through mailing lists and NNTP servers, later through applications and, eventually, web sites. When we at Sunstorm were working on a version of Deer Hunter that was going to have a multiplayer mode - we had only the vaguest idea how that might work - I went to a seminar at the Game Developer's Conference on the topic of building online communities. We did a little work towards it; our web site ran some decent forum software, but in 1998 the Deer Hunter target market did not actually overlap with people who spent a lot of time online, which was hampering.

At least we had a good size target market. Combine the lush outdoor scenery of Deer Hunter 3 with a visionary concept of online communication, and we might have had our own version of Second Life on our hands, five years before anyone else. But of course, we didn't have the vision thing. It's still the hardest part of launching a consumer oriented web site. Wal-Mart tried it. Xanga was hip for a while. Not much there there, now.

But what about an online community as part of a B2B play? Not a corporate MySpace, but a self-selecting group made up of users of your product. If your target is geeks you might have a leg up here; Kinook has a nice online forum. Axosoft has forums and bloggers. The forum we put up at Interactive Intelligence seems to be buzzing along nicely. When I was there the customer base was very technical; that may be less so as their customer base has grown. But I think an actual, product-based online community is very workable for a business-to-business company. More later.

Thursday, January 18, 2007

The blogging split

I got into a discussion with someone concerning the blogosphere and its effect on corporations today. Here's something I hadn't really thought about in a couple of years: when was the last time someone was dooced? It's been a while, I think; or at least when it does happen it's not much of a story and the mainstream media doesn't pick it up.

So what happened? Did everyone just sort of "get it" ? I would say more that the world is sort of partitioning itself off now. On the corporate side, corporations are splitting into sort of "New Media" companies, Microsoft and Sun, where bloggers are allowed almost free rein, and "Old Media" companies, Wal-Mart say, or GM, where they feel it's very important that the company try to keep absolute control of the image of the company and don't allow their employees much say. That's not to say there isn't crossover; I understand one Microsoft division wanted Robert Scoble fired after he said something critical about the company, while GM actually has a blog...a rather corporate-oriented one, to be sure, but it does allow comments and they don't appear to censor them for criticizing the company.

On the other hand bloggers, or better I should say people, are splitting off as well. You see a lot of blogs around where someone started the blog, posted a few things, then apparently dropped off the face of the earth. Or possibly they write an article once a month or so apologizing for not blogging more and promising to do better from now on. Hey, blogging is hard, and most of us aren't getting paid for it. I've been known to go a month or two without posting. So there's more of a split between people who blog and people who read.

So I suspect what's happening is that people who blog, are moving over to work for companies who support blogging! Maybe not a momentous insight, but I can't think of anyone else who's come out and said it. People who don't blog, can stick around with the companies that are trying so hard to control their messages. That's why, I suspect, that you haven't heard much noise about doocing recently. People have sorted out where they belong; companies have clearer policies about what they expect and employees have a clearer understanding of what they're looking for.

(If they don't, I guess they'll have to buy Shel Israel's new book to clarify things.)

Wednesday, January 10, 2007

Building a cathedral

A traveler visited a city where many stone cutters were working. Approaching several, he asked the same question: "What are you doing?" The first stonecutter he met replied, "I'm cutting stone. It's dull work, but it pays the bills." A second stonecutter responded, "I'm the best stone cutter in the land. Look at the smoothness of this stone, how perfect the edges are." A third pointed to a foundation several yards away, and said, "I'm building a cathedral."

Thanks to Grady Booch and Joe Marasco for the story!

Wednesday, December 13, 2006

New Technology High School

This High School is a model for high tech high schools that's being pushed by the Gates Foundation and probably some other places, and they're thinking about trying one out in Bloomington, or at least they've gotten 50 G's in order to study the possibility. Some of the money went to bringing in a speaker to discuss the possibility, so along with a couple of hundred other people, I went to check it out. My initial reaction is, Groovy. I hated high school, and it's only ten years from now that my son will start it. I'd like him to have some choices about where to go, and this model seems pretty nice. They want to keep it to 400 students, as opposed to the thousand or so at each Bloomington high school now. I've commented elsewhere about not really understanding the Indiana charter school system; I suppose this would be one of those.

I'm hearing some contradictory things about the school, though. For example, a questioner asked last night about the per-student cost of the school. The response was that the school doesn't get any more from the state than any other school would get, and that technology was the biggest expense. But the little handout we got actually says, small school and class size allows students to take responsibility for their own learning...So I wonder which it is. I'd guess that any school would find that graduation rates would inversely correlate to class size. Also, two separate articles in the paper (subscription required) tell us that the school (a) caters to students in the job market, and (b) most graduates go on to higher education. What the heck does that mean?

The speaker explained a little bit of what the school was about; all very nice; focus on communication skills and working as a team, computers for everyone, community internships. I think you can have two kinds of high schools: the kind where kids are motivated and enthusiastic about doing stuff, and the kind where the kids are biding their time until they can get out and go do something else. When you have the first kind, the students are going to be self-selecting - they have to want to go to the school. This is why I think charter schools and school choice are good ideas. So for that reason alone I think this school would be a good idea.

But the audience had a lot of good questions; some sublime; some ridiculous; all very practical. The inevitable "What about sports?" question was asked, which of course really means, "What if my kid wants to go there but he's also a basketball star?" The responder didn't really pick up on that dynamic, mentioning that the schools in California play Ultimate Frisbee against each other. Yeah, great. But the local guy did mention that allowing the students to play on the big school teams was a possibility.

A lot of the questions made me think, though, that either by state law or by educator attitudes, the school system isn't really ready to shift paradigms. I don't necessarily blame them; it's not an easy thing to do. But there were questions about honors degrees and demographics. The California panelist pointed out that an honors degree is a pretty divisive thing, and how can you teach teamwork in that sort of environment? The local panelist said that he thought the demographics would have to mirror those for the local high schools, so this school would have the same proportion of special needs students, minorities, gifteds, etc. I don't see how they can do that and still have the students be self-selecting, not to mention I find it extremely irritating when people are classified into "black", "poor", "special ed" or groups, even when the goal is to create balance.

So there's plenty to think about still. But I hope they do it. And if I'm still around town in ten years, I'll probably be pushing my kid to go there. If you see a chance, take it.

Thursday, October 26, 2006

The Guerrilla Guide to Interviewing

Joel's latest article on interviewing is up. It makes some good points, although he continues with the down-to-the-metal idiosyncracy that I posted about last year. But here are the things that I thought were really good points:
  • Hire/No-Hire . Make a decision. If you don't know, the answer is No Hire. I've run into this before when interviewing an entry-level guy for a position that required more skills than that. We recommended he be hired for Support instead. I'm not sure that that wasn't the right decision, but as a principle I like this one.
  • You want people who are smart, and who get things done. Joel describes people who fail at one or the other, and I think I've worked with most of them before.
  • A programmer should understand pointers, and recursion. Joel comments that a lot of people are coming out of school without learning a language that requires pointers, which is a problem. Less so with recursion. He says that pointers are an aptitude rather than a skill.

At the end he says, confidently,

If your resume and phone-screening process is working, you’ll probably have about 20% hires in the live interview.

True at FogBugz, no doubt. I've not really seen it here in Indianapolis, where the local talent pool is so small. But you never know, we might get lucky!

Want a job at an up-and-coming medical imaging company? Drop me a line!

Wednesday, October 25, 2006

Bloggers are people too

Ordinarily for me, reading and writing blogs is an intellectual exercise. I'm more comfortable and interested in discussing software processes, languages, testing than I am with the emotional appeal of the typical network news sob story. So when worlds, and cars, collide, I find it affects me especially. I envision my own five-year old son coming home from his karate class and I feel like crying. Good luck to you, Nick and Josh.

Tuesday, October 17, 2006

IQAA: Regression Testing

Dr. Hanna's Practice #8: Perform regression testing that is based on impact analysis. The first practice in the list that you can't just nod your head at, since you have to have a good idea of what regression testing is (I do) and what impact analysis is (I didn't.) But I did like Practice #7: Testers should attend design and code reviews. It's not something I had heard before, but it's obviously a good idea if you are interested in faciliating communication within your company.

So what should a tester do at a code review? Primarily they will want to come up with test ideas; examine the code paths; ask how each one can be exercised. But also they can ask a very fundamental question: What other parts of the code is this project going to affect? This is an impact analysis. If I remember correctly, it was recommended that this analysis be done formally, as in developers have to write up a statement or report analyzing what other parts of the product will be affected. Not a bad idea, but probably not for smaller companies like Prosolv.

So based on the Impact Analysis, testers should be able to come up with a set of requirements that need to be retested, and there's your regression suite. Of course, every build that goes to testing should be tested on the critical path (or as I prefer, the "Happy Path"). Dr. Hanna suggested a 90% pass goal, but I'm not sure why that should be. Some tests will be showstoppers, others will be...well, whatever. I suppose if you have more than 10% "whatevers" failing, you've got an issue, though.

Just a couple of other notes:

- Regression testing doesn't do any good if you do it at the beginning of a project - it is certainly to be hoped that there will be few failures then!

- Impact analysis is also necessary when a requirement is changed. Go to a developer if necessary!

- Which led to the question, what if the developer doesn't know? Dr. Hanna's response: Find new developers ;)

Monday, October 16, 2006

IQAA: Integration Testing

Dr. Hanna's Practice #3: Test for both functional and quality requirements. I would have thought state charts and truth tables were familiar to everyone, but I think the typical Indianapolis tester has a lot less experience than, say, one in San Jose, so there were a lot of people who they weren't familiar to. But Dr. Hanna had some good advice on turning a requirement, written in English, into a model by splitting it up into actions and results. He took a typical requirement statement, teased four predicates and four consequences out of it, and showed the truth table that it resulted in, with the 16 possible states of the predicates and the expected consequences of each. I was a bit itchy here, because I always feel that you can go through and test your application like this, but then go through and test a separate bit of your application which contradicts it. To help my understanding, I went on the second day to a talk on integrations testing, which I thought would more or less cover my confusion. You've got one requirement, you've got another requirement, testing them both is integration testing, right?

Well, no. Integration testing is the actual bit where you take two components of the system and make sure they talk to each other properly. Testing the input/output of one component is mostly a unit test, since they usually are easily testable and verifiable based on the automated testing that should have been written by the developer. But you need integration testing to avoid the "operation was successful but the patient died" phenomenon, where the interface of component A is not clearly understood by the developer of component B, so he writes and tests a very nice component that doesn't do at all what component A expects.

But with that clarification, I guess I see the real issue: the thing that is worrying me are two contradictory requirements. Given a clear requirements document, it is no longer the tester's problem, and it is no longer the developer's problem. It's a business problem, and someone with knowledge of the problem domain is required to clarify the contradictory requirements, which allows us to update the requirements doc, and guess what - now the testers can redesign their test plan and the developers can redo their code.

Here's a list of books recommended at the conference.

Friday, October 13, 2006

IQAA: Changing Requirements

The whole conference I was at this week for me revolved around the requirements management process. Partly because many companies I've worked at had trouble with this part of the process; that is, they followed the process of creating a requirements document, then they shut it away in a drawer and never look at it again while developers and testers go along their merry way and code up a mishmash of the requirements, what they think the requirements might mean, and any customer requests that aren't too difficult and/or are from important customers.

But I think a main thrust of Dr. Hanna's talk was that the requirements document is very important. I'm used to this very static, dull requirements document, and so I kept wanting to raise my hand and say, "How can you do that when the requirements phase is already complete?" But I have to conclude that he doesn't think it is static at all, and that it has to be dynamic and updated continually. (It was interesting that he said several times that testing is a process, not a step in the process, but he never said requirements were too.)

The typical software company tends to communicate rather informally. Write up a vague requirements document, then have the developers implement it any ol' way that seems right. If they're good, or at least social, developers, they'll talk to customers or managers or somebody that can clarify the requirement. A lot of developers will just guess, though. (Combined with receiving fast feedback from a Customer, this is just fine, of course.) But this is why the developer/customer communications need to be with testers (in a typical software environment ) or part of the process (in a regulated environment or one with traceability requirements. When it is part of the process, the correct process, I think, is to modify the requirements doc based on the customer communication. This gives testing a chance to update their tests. Dr. Hanna came back many times to the diagram:

Requirement -> Test Scenario -> Test Case -> Script

So if the Requirements are up to date, the tests can be up to date as well.

I'm not sure that every attendee thought this was the emphasis, but I also went to a couple of talks on this topic.

Thursday, October 12, 2006

IQAA: Quality enrichment conference

I've posted about the IQAA before, and I regret that I haven't been able to make it to their talks regularly. There is a bit of a disconnect between the organizers and the members, I think, because the organizers are creating a fair amount of high-quality content, and I'm not sure that the Indy software testing scene really is vibrant enough to appreciate it. Today I'm attending a free seminar given by Dr. Magdy Hanna of the IIST on Software Testing Discipline and Software Testing Management, and it's very good.

The intent was for Dr. Hanna to give two seminars, one in the morning more or less aimed at testers, and one in the afternoon aimed at test managers, but in practice they all sort of collapsed together. The majority of attendees were there for both sessions; which was good, because they ran together pretty much. Dr. Hanna is a good, knowledgable, and confident speaker, and when you have one of those you're guaranteed to run over. We got to hear a little more than half of the practices before lunch, and a couple more afterwards, so what was billed as the "afternoon session" started around 2:00. But it covered basically the remaining practices anyway, and around 3:15 he looked up, said, "How much time do we have left?" and burned through the rest of his slides as if they were a kaleidoscope :) I'll put together a few posts over the next few days on my impressions of the conference and speakers. I'm not going to summarize all of the practices he named; just some of things that made me think. For example,

Practice 1: Requirements are crucial, with the couple of subheaders: You can't test what you don't know, and Users will always change their minds, and this was the point when he went all Steve Yegge on us, and explained how he was opposed to the agile movement. Of course, as is usual in such cases, we find out that he's not actually opposed to the practices of agile, or at least many of them, but only to calling it agile, or something. (I've never been quite clear on what exactly the opposition is to).

I mention this in passing because it seemed to me that those two headers absolutely contradict each other. How do you know what to test, when the users are calling the developers daily with new requirements? But his overall point, I concluded, was that (a) requirements documents should be kept accurate and up-to-date, and (b) they should be your main avenue of communication between developers and testers. I had assumed, when he said he didn't approve of agility, that he wanted nice static requirements docs before testing ever started. This, of course, never happens in the real world. More later.

Thursday, October 05, 2006

WIX, IIS, and CPPUnit Nano

Shoutouts to a couple of pages that have made my life easier in the last few days. We use CPPUnit to run unit tests on some of our VC6 applications, but now it's time to start compiling those applications, and their tests, in Visual Studio 2005 . I messed around with trying to get CPPUnit to compile and link in in VS2005 for a while, but was unsuccessful; and in any case CPPUnit isn't getting any love from anywhere any more. So what's a unit tester to do? Enter Nano CPP Unit, a little unit testing page with all of the source right there on the page. Copy it in to the correct files, change a few other lines, and a bunch of tests were running right off. Very handy.

Second, trying to configure IIS through an installer built with WIX. The docs explain more or less clearly how to set up the custom actions, so I did that using the codes below, ran the installer, and...nothing.

<WebSite Id="MyWebServer"
Description="My Web Server"
Directory="MyLicenseServer">
<WebAddress Id="LicenseManagerWebAddress"
Port="80"/>
<WebVirtualDir Id="LicenseManagerVirtualDirectory"
Directory="MyLicenseServer"
Alias="LicenseServer">
<WebApplication Id="MyLicenseServer"
Name="MyLicenseServer" />
</WebVirtualDir>
</WebSite>


I ran across this Strange Blog entry detailing more or less how to do the same thing, but a comment in the post also mentioned the bit I hadn't seen before: Link in the provided object file sca.wixlib to set up all the custom action scheduling the way you need it. Thanks to that commenter, the Strange Blog author, and the author of Nano CPP Unit for their help!

Friday, August 04, 2006

Evidence open source project

I got a CodePlex project approved, whee. I'm pretty sure I must have grandfathered in since I submitted my request a couple of weeks ago - it's just an idea in my mind, not an actual project, and therefore it probably doesn't come under the latest requirements:

Most project requests that we approve have two or more project admins, two or more committed developers, and a recent history of active check ins, opened and closed work items, and at least one release. We sometimes make exceptions for individual project applicants (with or without code) who have a proven history of success in creating successful online development projects, or startups.

Uh, yeah, that's me all right. But, my project idea has to do with genealogy and collaboration; it's an attempt at raising the standards of online genealogical research. As I wrote on the project wiki:

The typical Internet genealogical researcher today works as follows:
  1. Search on genealogy sites for published databases that have matches for someone already in their database
  2. Copy the information to their database
  3. Publish the database

So there's a lot of room for improvement. I'll write more about my ideas soon - right now I have to go figure out how one checks in code using Team System...

Drop me a line if you're interested in the project!