Wednesday, November 26, 2008

On Being Public

Nathan Kaiser's nPost blog had a few interesting posts recently. Rather than posting his opinions, Nathan asked a few questions which are important to the community -- on what defines a startup, what a startup should have on its to do list, and whether you should sign an NDA. I won't repeat my comments here, but I encourage you to check it out.

In the last case, Nathan didn't ask if you should ask for an NDA, which I think is another important question. In case it's not obvious, my answer is No. If I wanted NDAs from everybody, I wouldn't be blogging about what I'm doing. Clearly, there are pros and cons of being public and I haen't been public about every single detail, both because it would be overwhelming to everybody else and because I want to keep some things to myself. When I do share more details, I just tell the recipient that it's confidential and I trust them. And, if I didn't trust them, would an NDA make a difference?

Overall, I'm happy with my decision. I just look at all the advice I wouldn't have gotten if I'd been secretive. And I also look at my attempt to start a company around some search technology that I built after I left Microsoft. I was very secretive, insisted on NDAs from everyone, and basically isolated myself from the world for a year and a half. I had some great ideas and technology, but I didn't succeed in actually getting a company started, and my secrecy had a lot to do with it.

I had a reasonably productive day today. Completed a bunch of tasks and made some progress on others. I refactored my model definitions after my schema change and made the code 20% smaller, simpler, and easier to read. I feel like I can see the light at the end of the tunnel, but I still have a few boulders in the way.

Update: Somebody pointed out to me that the x-axis was labeled incorrectly on my graphs -- the graph is only showing days I'm working, but the labels showed consecutive days. Fixed here and on the last two days.

Tuesday, November 25, 2008

Checking Stuff Off

Great talk on security by Damon Cortesi of Alchemy Security tonight at StartPad. The good news for me is that I'm already doing everything he mentioned as the first line of defense. That doesn't mean that my security is perfect, but I'm doing ok and I'm hoping that the Google App Engine infrastructure will take care of some other issues, like protection from Denial of Service attacks. One thing I thought about while Damon was talking and that was changing the way I'm doing authorization for AJAX requests. Afterwards, Damon, Mike Koss, and I chatted about how to simplify and I'll probably make the change tomorrow.

As mentioned yesterday, two meetings and Damon's talk took big chunks of my day. I worked on security & permissions most of the time, but I took out a few minutes to knock off a few other things, including the schema change I'd been contemplating. This lets my graph move in the right direction, even if I didn't complete any security tasks today. I'm now under 20 tasks in 4 buckets.

Update: Corrected x-axis.

Monday, November 24, 2008

Waltzing Toward The Finish

Two steps forward, one step back. I knocked off a couple tasks but added one. Too much going on today to write very much.

Trying to make this week a no meeting week, but I have two meetings tomorrow on the Eastside plus Damon Cortesi's talk on Security at StartPad in the evening. Should be a great talk and I've been looking forward to it, so I'm driving in after my afternoon meeting. I will be taking off Thursday and having a low-key Thanksgiving day with the family. I have a side project I need to work on that I started tonight and will be working on full time from Friday through Sunday.

Here's the current progress chart. At least the Permissions & Security slice is getting smaller.

Update: Corrected x-axis.

Friday, November 21, 2008

Must Do Security

Must do security. Must do security. I'm trying to make that my mantra so I get it out of the way. I did spend most of today on permissions & security, but (don't tell anyone), I spent part of that time on finishing up the permissions UI, which I like a lot better now. It's now (mostly) Ajaxified like the rest of the site, which makes it feel a lot better. I worked on a bunch of tasks today, but I only completed one.

I mentioned the other day that my board of advisers is basically anyone who wants to offer advice. And I mean that seriously. Comment on my blog, send me email, grab me in the hallway -- it's all good. I'm looking for feedback of all types -- kudos, suggestions, and criticisms. If I'm doing something dumb or missed something obvious, I want to know. Just yesterday, Scott Blomquist commented that I'd missed something obvious (it's great how things are obvious after they're pointed out). Now that I'm in the end game, a great way to visualize progress is with a chart. So, here goes. I'll update this in each blog post until I launch.

Note the uptick in Large Tests. In doing the security work, I realized another test I have to do. Basically, if my server goes down, the client can get confused. I already have fixing that on my list of things to do, but I realized that testing it could be a big deal.

I probably won't blog this weekend as I'm going to Seattle Mind Camp. In fact, I'm stopping work for the day to create a mini Puzzle Hunt to bring. I'll be giving away a cool Puzzazz hat as a prize.

Thursday, November 20, 2008

Remove Risk First

Yesterday, in my list of remaining tasks, I noted that I had 11 Client tasks to do. I used to have a lot more, but that's what I've been working on. Meanwhile, I only had 7 tasks for Permissions & Security. I really want to keep working on the Client code. After all, it's more interesting -- I get to see the effects immediately. But, launch, one of the things I need to do is remove risk and I identified the Permissions & Security as the biggest risk area. So, I managed to tear myself away from the client in code and knocked off two Permissions-related tasks. Here are the current counts:

Area# ItemsChange
Permissions & Security5-2
Large Tests2

Wednesday, November 19, 2008

Advice, Ads, and Tasks

I had a meeting with my advisory board today. Well, not exactly. At the moment, my advisory board is pretty much anyone who will offer advice. Fortunately, that includes a lot of smart people.

So, at lunch today with a few people from StartPad and Faves, I brought up the issue of showing ads on Groupthink. I'm currently showing ads for the free version, but I had been thinking about dropping them. I think that ads would be a small portion of the revenue and, by dropping them, I would make the service feel more professional. On the flip side, hiding ads could be an incentive to upgrade to the paid service, and that's something that a lot of web services do. Obviously, any decision that I make today doesn't have to be permanent. As long as I haven't made any commitments to customers, I can always change my mind later.

The interesting thing was that everybody at lunch agreed -- if I don't think they're going to be a significant portion of my revenue, drop them. So, I have.

In other news, I worked on on client side code today, plus I spent some time figuring out what I have to do to finish. I knocked four items off the list today. Here's what I have left:

Area# ItemsNotes
Server3The server's working pretty well. I have some performance improvements I've deferred to post-launch. It shouldn't affect users but will affect my scale.
Permissions & Security7This is the biggest risk area and I really have to get it right.
Client11This is the largest number of tasks, but the risk here is much lower.
Schema1I'm considering making a schema change because it's so much easier to make a schema change now, before I launch.
Large Tests2This doesn't include testing of individual changes as I make them.

Tuesday, November 18, 2008

Back to Work, Back to Blogging

Everything takes longer than you think it will. It's been a bit harder getting back into Groupthink than I thought it would be. Obviously, I couldn't keep up my earlier pace, but, even so, I made way too many commitments for my time in the last week, both at work and at home. Plus, I had an opportunity to possibly earn a little money, which I couldn't really turn down, given that Groupthink is currently cash flow negative.

Yesterday and today I rewrote a lot of my client-side JavaScript. When I wrote the first version, I was a lot less familiar with jQuery, so I cleaned it up and made it a lot better. Given that I was switching to the jQuery way of doing things, I also rewrote the Ajax code on the other side that returned the JSON results from Ajax queries. Previously, it had returned a script file and now it returns just JSON. Of course, nothing worked after the rewrite and I had to wade through poor documentation before I get to my own bugs. About five minutes ago, I got it all working again, so I'm back to where I was yesterday morning (save one little new bug I introduced that I'm going to fix just as soon as I finish this blog post). But, the code is cleaner and the next few things I need to complete the Ajax code should go smoother now.

I haven't actually counted items on my task list, but it seems to me that I have about 20 items, split into three groups: must haves for "group" (sharing), must haves for "think" (tasks and organization), and the things I really want to get in but could possibly launch without. It's all about the task list at this point -- how long it'll take me to launch depends on how long it'll take me to knock items off.

Tuesday, November 11, 2008

Downtime Is Good

I'm back from the Hackers Conference, where I spent three days getting almost no sleep. Before that, I spent six days getting way too much sleep due to my illness and the codeine-infused medication I was on. So I guess it all balances out and I'm back to normal.

In the first two days of my illness, I would literally wake up, sweaty and delirious, dreaming of code I'd either already written or was about to write. Groupthink was occupying so much of my brain that it took over my dreams as well. That was one of the reasons (other than being sick as a dog) that I knew I had to take a break. But, it wasn't until a full day later that my dreams returned to normal. Though I haven't stopped talking about Groupthink and I have demoed it biefly, it's now been almost a week since I've looked at the Groupthink code. I have to say I feel energized and ready to get going.

When I was working on FullWrite Professional at Ann Arbor Softworks, we were all working crazy hours. I used to joke that we had a totally flexible schedule -- you could work any 20 hours a day that you wanted. I wasn't working quite that much on Groupthink, but my 12 hours a day / 7 days a week schedule certainly took a toll. I have no regrets about launching an intense project like I did. But, if I do it again, I'll also schedule some downtime.

Yesterday, I spent some time working on my todo list (in Groupthink, of course). Today, I'm working on a talk on Puzzles that I'm giving tomorrow at Google Kirkland. Tomorrow, I'm giving that talk and have a couple of other meetings, all scheduled when I thought I'd be done by now. So, Thursday, I'll be back in earnest. I feel I'm only a few days away, so it shouldn't be long now.

Tuesday, November 4, 2008

Health Update

I'll resist making this blog into a personal one, but a few people have sent me "get well" wishes, so I thought I'd provide a quick update. I left the house for the first time since Friday to go to the doctor's office, where my doctor said she thought I have a chest infection of some sort. She prescribed antibiotics and thinks I'll be well enough to go to California on Friday. Entrepreneur University on Thursday is a bit less likely, but I'm hopeful.

While I was out, I also voted. If you haven't voted yet, there's no time like the present.

Monday, November 3, 2008


Reluctantly, I have to say: timeout. I'm still sick and my number one priority has to be getting well. I'll spare you all the details, but I'm still running a fever, thought it's not as high as it was yesterday. Even when I've found a few minutes when I've felt alert enough to go to my computer (like now), it doesn't last long. It also occurs to me that being sick might be related to working too much, pushing myself too hard. Last week, I had some persistent congestion that I chalked up as allergies and pretty much ignored. Maybe it was the start of this cold and, if I'd paid more attention, I could have avoided this. I certainly don't win any awards for work/life balance last week.

I feel like I have just 2-3 days worth of work on Groupthink Projects left. I thought those days would be Sunday, today, and possibly tomorrow. If I pushed things, I might be able to restart tomorrow or Wednesday. But, there are other factors. Friday, I'm going to the Bay Area for a conference. I'm running one session that I haven't finished organizing and speaking at another one. And, on Thursday, I'm hoping to attend the Northwest Entrepreneur Network's Entrepreneur University.

Those who know me closely know how driven I can be. In the last two days, I have literally woken up from a nap thinking/dreaming of code I'm working on. It's that hard for me to back off, but it's what I have to do. So, between now and Thursday, I'm going to concentrate on getting well. I'll probably spend a little time planning the conference session I'm running, but, otherwise, I'm not going to work. If I'm well enough, I'll go to EU on Thursday, then the conference, and, on Monday, I'll restart finishing Groupthink Projects.

Sunday, November 2, 2008

2 Days: Chicken Soup For The Developer

A good rule for any company is to make sure that there's nothing that only one person can do. It doesn't have to be the case that everybody can do everything, but avoiding bottlenecks is a good idea. When you don't do this, disaster can occur -- paralyzing the company -- when a single person is unavailable, or leaves the company. Of course, with Groupthink, there is only one person, so there's no chance to spread the knowledge right now.

And, right now, I'm sick. Although it's just 5PM, it feels like night to me, I'm congested, I've had a massive headache all day, I've taken three long naps, my wife forced me to have chicken soup, I've worked a grand total of about an hour today. I didn't even get the benefit of the extra hour this morning!

Nobody else in my family is sick, so I'm hoping this is just a 24-hour bug and I can be back at it tomorrow. But, this certainly puts a crimp in my launch plans, which were already shaky. And it illustrates, again, just how difficult it is to have a date-driven schedule.

Saturday, November 1, 2008

3 Days: Basketball Time

Have you ever noticed that the last part of any project seems to take much longer than it ought to? I call this phenomenon Basketball Time.

A typical college basketball game has a 40-minute clock and most games take about two hours of real time to play. But, the last 2 minutes of clock time takes about 20 minutes of real time. In other words, 5% of the game takes 17% of real time. Whereas the first 38 minutes run at a rate of 2.1 real minutes per clock minute, the last few minutes run at a rate of 10 real minutes per clock minute. It's like the game is heading toward a black hole and there's time dilation or something.

At the end of a software project, the same thing happens. Right now, my todo list isn't very large, but it seems that every time I remove something, I add something else (or two). And all sorts of little things take much longer than one thinks they will.

A case in point: The hours I just wasted trying to do something that I thought should be trivial -- creating a Django custom tag. The custom tag is the clean way to do it and I estimated that the alternative (code I probably would have had to throw away later) would have taken me an hour to get right. So, the custom tag seemed the way to go. But, as is frequently the case in open source projects, I was hampered by poor Django documentation, which left out some details. I found a number of blog posts about the problem, some with their own misinformation. Fortunately, it turns out that GAE provides an (apparently undocumented) mechanism which makes things easier.

For the record, here's how to set things up so that you can have a set of custom filters available to all templates in your Google App Engine application. Create a file that looks like this:

from django import template
from django.template.defaultfilters import stringfilter
from google.appengine.ext import webapp
register = webapp.template.create_template_register()

@stringfilter              # If applicable
def myfilter(value):
    return value

myfilter.is_safe = True    # If applicable
Then, put the following at the bottom of
# Register custom Django filters so they're available to all templates
from google.appengine.ext import webapp 
If you put in a module, make sure to specify the module name (as in 'common.custom_filters').

P.S. I have looked for references to "Basketball Time" that predate my usage, but I have not found any. If you know of one, I'd be interested in hearing about it.