Cool story bro

posted by Jeff | Wednesday, May 22, 2013, 10:40 PM | comments: 0

I realized today that two-thirds into the month, I've written exactly 8 blog posts. That's some kind of historic low for me, going back nine years. Diana has written more on her new blog this month. Since people seem to interpret online action, or in this case the lack thereof, in strange ways, I figured I should do some splainin'.

First off, I'm fine. My little family is fine. Things are generally good. Highlights include sharing great moments at Cedar Point with Simon, working with Diana on a new project, reading more and actually participating in the communities I help run.

So why you no write? Two reasons, actually. First, I honestly don't have the mental bandwidth. I've been feeling completely spent lately. It's mostly in a good way, but when I would typically write, late in the evening, I just don't feel like I have anything left. The second reason is that there are a lot of awesome/cool/hard/ridiculous things that, for now, I want to hold a little closer to the vest.

I suspect I'll ramp up again soon. After lots of travel and special events, things are starting to be a little more routine. Plus, I have many topics to share, like Diana's hair, home improvement, career stuff, preschooler tales, and of course, a whole lot of personal projects.


Building something enduring

posted by Jeff | Sunday, May 19, 2013, 11:27 PM | comments: 0

Om Malik had a great post about how venture capitalists are so hung up on quick return and scale from startups that they would never fund some of the greatest innovations we now take for granted. I also made the point that it isn't just the VC's, but people who do start new businesses are more interested in the funding events and potential pay-outs than they are in building something enduring and important, regardless of scale. It's my chief complaint about technology and Silicon Valley.

I'm not a hater. If I had some not-that-brilliant idea like Tumblr that I could have executed on for a billion-dollar buyout, I'd certainly be OK with that. It seems to me though that no one is that interested in investing in the smaller thing that could be awesome, occupying a particular niche. I was catching up on my Fast Company subscription when I read an article about Kevin Rose, who correctly states that there are many "lifestyle businesses" that could clear a couple hundred grand a year, but no one invests in those.

There is a certain danger in all of this, as I see it. Technology, especially involving the Internet, has driven a portion of our economy when other areas have struggled or entirely gone away. There are big bets that had huge payoffs in the last decade and a half, like Google and Facebook, but I worry that not enough people are interested in the long tail of smaller plays. Do you know how thrilled I would be to have a quarter-million in revenue every year?

These smaller, niche businesses also have another benefit that the big bet chasing doesn't have, in that they're likely to endure a lot longer. My own business is more hobby than lifestyle business, but since forming my LLC, more than $300k has changed hands that may not have otherwise. (Don't be impressed by that figure... the profit margin has not been very high!) I never had visions of being the next Google, but I didn't end up like Pets.com either.

My hope is that more people pull their heads out of the bay area and think a little smaller, a lot longer term. To me, it's all of those smaller things that last that will add lasting value to the economy and to our culture.


Everyone else is doing it (incorrectly)!

posted by Jeff | Saturday, May 18, 2013, 4:19 PM | comments: 0

Innovation is hard. You can definitely foster it, but you can't really force it. It's completely fascinating when people innovate in a massively disruptive way. While you can't make innovation happen, it's something I try to strive for. There are certain ways that I've had a great deal of success innovating, and others where I haven't. Professionally, it's easy to get into the rut of doing things a certain way, because everyone else does it that way. The first step to doing it in a better way often requires questioning the establishment. While my inner rebel is all about that, it's also an exhausting practice.

Coaching volleyball is one of those scenarios where the questioning comes easy. For example, before a match, you're given several minutes of court time to warm up (the actual time depends on the governing organization). Since I was in high school, that time was always used by coaches to send perfectly tossed balls into the air for hitting, while your one or two short defensive specialists tried to dig those hit balls. This results in a lot of "whoo-hoo's" and pleasure on the part of your athletes, but I wasn't sure if it was constructive.

Attacking the ball is always step three in volleyball. Someone has to expertly pass the ball first, then someone has to set it for the hitter. Without those two things, there is no hitting. So after a season or two, I thought, why am I wasting time on this, especially when my kids can't pass to save their lives? So despite the protest of the kids (and parents, who always have the answers), I ditched the hitting lines. I put six kids on the other side of the net, and tossed balls in for them to pass, set and hit. I rotated them around. This exercised all of the skills necessary to score, including the ever important transition on and off the net. It was real, core to the game, and made a huge difference. It also happened to be noisy and menacing in appearance, which freaked out the other team, so that was a plus.

I tossed out what everyone else was doing, and tried something that seemed to better serve the scenario. I try to do this with all things in life. And yes, it can be exhausting questioning everything, especially if you end up where you started, and "everyone" had it right.

It's a lot harder to innovate your way out of the norm in my line of work. In terms of the actual computer science, sure, there are a lot of things that have been thought to death and they're good ideas. It tends to be the process and the associated people issues that are harder to change. There is an important parallel though to the volleyball warm-up. It turns out that process is almost always wrought with wasted time for things that don't matter, that don't get to something real and valuable. Even in celebrated (capital "A") Agile practices, teams have a hard time identifying the things they do that aren't adding value, let alone innovating.

Innovation isn't easy, but you can get practice at it. It starts when you stop accepting sheep behavior and ask if there's a better way.


Simon's best amusement park day ever

posted by Jeff | Thursday, May 16, 2013, 4:52 PM | comments: 0

Despite feeling like I've been through a ringer yesterday, after a solid week and a half of travel, illness and awful sleep, the weather was simply too awesome to stay home. We packed up the boy and headed for a day at Cedar Point.

This is the new thing for us, where we don't over prepare and just roll with it. No stroller, just a snack and a water bottle. We got there around 1 and had lunch at Famous Dave's, which is one of our favorite things to do. Simon was digging it too because we had a window seat, where he could see Blue Streak running.

Inside the park, we let Simon lead. He knows where everything is and how to get there, and we were perfectly happy to follow his agenda. On opening day, he asked to ride the carousel, and that's what he did this time as well. We did six rides total between the two carousels, and by the time we were done, he was totally comfortable riding without one of us standing with him. It was really awesome to see a little independence.

His eagerness to try rides did not end there. He did a number of others, with varying degrees of success. The trucks were no problem at all. Sir Rub-a-Dub's Tubs were OK too. The Lolly Swings he did not care for, and since he and Diana were the only ones on the ride, the operator was kind enough to stop it early. Camp Bus was no problem. We did that Zamperla mini-whip-style ride, and he really didn't like that until it was almost finished. He had Snoopy Bounce all to himself, but just walked around the perimeter.

Simon's Jr. Gemini lap count was one, plus another time he sat in the train but wanted out immediately. This time, we let him see it, and he seemed to get sucked into the enthusiasm of the other kids. This time, Diana went up with him. He mostly did OK, but the last turn seemed to alarm him a bit. He opted out of the bonus lap.

Simon was very patient about riding bigger stuff with us. He loves the train, and insists on sitting on the outside. He also waited for Giant Wheel for 20 minutes (as they loaded 8 of 36 cars). He was a little unsure at first, but seemed to otherwise be OK with it.

We ended the day in Coasters, where we could have milkshakes and he could have a little dinner while he watched Power Tower go up and down. It was the most fun we have had as a family probably ever, because he was so engaged with riding. Ten rides is a record!

There were other great things about the day, including the sheer will Simon had to carry on, without a nap. Six hours walking around Cedar Point, and we never picked him up or carried him. He also remembered ride names, and pronounced them correctly. He actively asked to "see the show" at Red Garter, but they're still in rehearsals. He was a little disappointed.

It was fairly adorable that when we left around 8, he was asleep in his car seat by the time we got to Cleveland Rd. What a great day for our little guy, and for us.


The incomplete picture of our lives

posted by Jeff | Sunday, May 12, 2013, 11:50 PM | comments: 0

I've had a number of interesting conversations today about the picture that the social Internet paints of us. It was suggested to me today that I appear blissfully happy and completely miserable. I'm generally not that concerned about what people think of me, and maybe I should be, but I should go on record as saying that the only time I've really considered myself unhappy was in 2005, when I was going through my divorce, and in 2001, when I got laid-off for the first time. Even with those unpleasant times, I'm well aware of how awesome my life has been.

There is some degree of filtering that goes between real life and the Internet, as there should be. On one hand, you might see hundreds of photos of my kid on Facebook, and people will say things like, "He always looks so happy." Well of course, I don't post the photos of him throwing a fit. OK, well, sometimes I do, but I'm sure my mom doesn't want to see that. Conversely, when something really irritates me, I'm likely to rant about it in a blog post or drive-by status update. If you know me in real life, you know I'm not one to candy-coat what's on my mind. Neither of these scenarios is grounds to declare a well-formed opinion about my life, or anyone else's for that matter.

The funniest thing, if a lesson learned entirely too late, was that a story from my previously analog life makes more sense than ever now. Back in college, a friend of mine had a hot tub. No one knew he had it, and he didn't want people to know. My thought at the time was, "How cool is that? Why would you not want people to know?" It wasn't until after it got out that he explained it. If he had a hot tub, it was implied that he made more money than other people, or had parties of ill repute, or any number of things that would be unreasonable to assume. Sometimes sharing the most innocuous things can have totally unintended outcomes.

I've generally presented myself as WYSIWYG, because the bluntness of that approach means I don't really have to explain where I stand on things. Still, there are a lot of things that I don't share with people in real life, let alone online, so you never get the complete picture. Go through my blog from 2005, and you won't likely find anything about my crumbling marriage.

I suppose I could easily write the incomplete context problem off as everyone else's problem, but it wouldn't help. I try not to assume anything about people based on their online persona, but that doesn't mean others work that way.

What's really important to remember is that online life is surprisingly not as different from offline life as people like to think. You will undoubtedly encounter people at work or school that you think you totally have nailed down, only to find out they're not at all like you thought. Insert book/cover metaphor here. A hundred years from now, anthropologists are going to look back at our time and say, "Humans began to socialize more and more by electronic means, and in their rush to declare it as different, overlooked that the same social contracts applied online."


Lessons from live blogging with Azure (nothing bad happened)

posted by Jeff | Sunday, May 12, 2013, 1:57 PM | comments: 0

I wrote previously about how I built a "live blog" app in Azure, so we could use it for PointBuzz during last week's festivities at Cedar Point. Not surprisingly, it worked just fine. As I expected, the whole thing was kind of overkill. Sweet, over-provisioned overkill.

The traffic loads we encountered were not a big deal. At one point, we were close to 300 simultaneous connections. We didn't really need Azure to handle that, but the truth is that I wasn't entirely sure what to expect in terms of SignalR and its effect on the servers. What better reason to spin up virtual machines in Azure? I still think that's the biggest magic about cloud services, that you can turn on stuff just when you need it, and pay just for that. It sure beats having to buy or rent a rack of equipment.

The performance was stellar. Average CPU usage never went over 1.5%. I ran two instances of the MVC app as a Web role. I chose this over straight Web sites because of the distributed cache that comes free with it. Of course I didn't really need it, but why not? I didn't do any page rendering timing at the server, because grabbing a few objects out of the cache and making them into a simple page was probably stupid fast, but testing from the park's WiFi, the time from request to last byte (not counting images) was generally under 200 ms. The AJAX calls on scroll for more content were just slightly faster.

The CDN performance was similarly pretty solid. I did a few unscientific tests on that prior to our big day, comparing the latency of the CDN to direct calls to blob storage. Predictably, the first hit to the CDN was always slower as it grabbed the data from storgage, but after that, they were about the same. Again, this was not scientific, and I also can't control which point of presence I was hitting on the CDN. This was another feature I certainly didn't need, but figured I would try it since it was there.

We moved a total of 6 gigs of photos that day, which was a lot more than I expected. This isn't a big deal for a few days of activity, but if I were using this (or any of the cloud services) long-term, bandwidth costs would be a concern. They're still a lot higher than the "free" terabytes of transfer you typically get when you rent a box in some giant data center.

At the end of the day, the app proved two things. The first was that SignalR imposes very little overhead, even with hundreds of open connections. The service bus functionality, still in beta, works great, to shuttle messages between running instances of the app. The other thing that it proves is that I bet you could throw this simple thing up for a big live blog event like an Apple product announcement and it would work just fine. I need to find someone willing to take that chance now. :)

So what does all of this overkill cost?

166 compute hours (2 small instances): $13.28
6 gigs out of the CDN: $0.60
18,000 CDN transactions: $0 (it's a dime for a million)
11,000 service bus message: $0 (it's a buck for a million)
1.2 gigs out from app: $0.10
200 MB storage: < $1
SQL database: < $5 for a month


Days are rarely this awesome, at Cedar Point or anywhere

posted by Jeff | Thursday, May 9, 2013, 10:38 PM | comments: 0

Today was the media event for GateKeeper at Cedar Point. The park hasn't had a serious media event since 2006, the year that Skyhawk opened. The opening of Maverick in 2007 was kind of a makegood, since the park was already open and the ride was delayed. This particular one was epic: They invited enthusiasts of any club to come, for free, with tons of food and refreshment. If that weren't enough, we were invited to stay in Breakers the night before, even though it's not really open yet. That was particularly nice, since the event started at 4 a.m.

I've done a lot of these events, but the last really special one was in 2000 at Cedar Point, when they opened Millennium Force. I was just starting to forge the friendships that persist today at the park, and I spent the entire winter watching the ride literally grow up from a parking lot full of track sections and support pieces. This one was special for different reasons. I got to see the actual fabrication of the track, joining the CEO (who I would place at the top of my list of people I would treasure as a mentor) in seeing how they make these things. Perhaps even more importantly though, this was the first real chance that I've had to share with Diana the perks of being a big roller coaster nerd with a Web site. Not only that, but I got to share it with Simon, too. He might not really know what's going on, but he can say that he was there!

A day like this also gives me a chance to tell stories with video. I may not do it for a living anymore, but I still enjoy it. Time and circumstances kept me from accomplishing everything that I wanted to do, but I may have a chance to make up some of what I missed. I did get some night time stuff of the new ride, which doesn't exactly tell a story, but it sure is cool to see!

I also got to pull off a great technical experiment, building a simple "live blog" app to send updates out to the world in real-time. I built it in Windows Azure, what I would describe as a hero platform in terms of scalability. It performed flawlessly, never breaking a sweat. At one point it had several hundred active, open simultaneous connections, which isn't a huge deal, but one that worked well given my knowledge of the platform. It gave me a lot of technical validation.

One of the great things about a day like this is the convergence of great friends. There's a great deal of humility that comes from a day like this, given the breadth and depth of people I encountered. I ran into a college classmate I haven't seen in probably 18 years, working the satellite truck. A 20-something thanked me for the work I put into the Web sites, who probably wasn't old enough to sign up for the site when it launched. A guy I knew only virtually a dozen years ago is now a creative giant in the industry, and when we first talked, I was giving him advice on pricing his lucrative side business. A younger friend has struggled with the same issues that I did regarding broadcast work. Oh, and the general manager of the world's greatest amusement park trusts me with his cell phone number. It's not lost on me, and I don't take for granted, that I am surrounded by a lot of amazing people.

Some days I wonder if I shouldn't be working in some kind of capacity in the amusement industry. If I had this kind of network in the software industry, I'd be doing anything I wanted. I just don't know that there are specific roles that would be right for me. "Director of software" isn't really a big title in an industry that took forever to embrace the Internet.

By the time we got back from lunch, I realized that I had been in the park for nine hours already. Insane as that is, I've never had that much fun. And if that wasn't awesome enough, I got to share it with my little family. Simon got to high-five my hero CEO. Days this good are something of a rarity, but I'll be smiling about this one for a very long time.


Building for Web scale is a different skill

posted by Jeff | Monday, May 6, 2013, 11:37 PM | comments: 0

There are a lot of things that one can find satisfying about building stuff for the Web. For a lot of people, it's probably just the act of building something cool, pretty and useful. These are certainly things to strive for, but for me, the interesting thing has always been to build something that can scale.

Like so many things in life, this particular desire grew out of experience. Very early on, before I was technically getting paid to be a software developer, I learned about scale problems. In the wild west of 2000, I launched CoasterBuzz and did some advertising for it. I was on a shared hosting plan, and the site started to get slow in a hurry. There were a number of things I did poorly, including some recursive database queries, and worse, fetching more data than I needed. You live and learn, as they say, and I got better at it over time.

Many years later, I would have the chance to work on the MSDN/TechNet forums, which served well over 45 million pages per month. It's not lost on me how rare it is for anyone to get to work on a Web app that has to scale to that size. My team was actually there to try and rope it in a little, because it required a huge number of servers to run. There was a lot of low-hanging fruit, and some really hard things to do as well. I didn't directly do a lot of the performance enhancing stuff (though I did pair for it), but I still took a lot away from that experience.

With my own sites, they collectively do 12 to 15 million pages per year, depending on what's going on that year. Respectable, but under any normal circumstances, not a lot. At peak times, that works out to be between 6 to 10 pages per second, and less than 1 in off-peak times. It's very rare that my server ever gets pushed beyond 25% CPU usage (it doesn't hurt that it's total overkill, with four fast cores).

Still, I've noticed that people who work on Web applications don't always think in Web terms. By that, I mean it's not uncommon for them to think in "offline" terms, where time is not nearly as critical. For example, someone who works a typical job doing line-of-business applications doesn't care if they build a SQL query that has a ten-way join over two views. It might take a few seconds (or minutes) to get results, but it doesn't matter for the report it's going to generate. For the Web, that timing matters.

So here are a few of the things that I think people building apps for the Web need to think about. If there are others you can think of, I'd love to hear them! This is not an exhaustive list...

  • Denormalize! Disk space is cheap, and disks are huge. Really, it's OK to duplicate data if it means you don't have to do a bunch of expensive database joins. This is even more important now, in an age where we might use different kinds of data storage, like the various flavors of table and blob storage.
  • Calculate once. This is perhaps the biggest sin I've seen. You might have a large set of rules on whether or not you should display some piece of data. You have two choices: You can make those calculations every time the data is requested, or you can do it once and store the outcome of that decision. Which is going to be faster? Calculating once, probably in an infrequent data writing situation, or calculating every time, in a frequent read-only situation? I think the answer is pretty obvious.
  • Use caching, but only when it makes sense. Slapping an extra box with a bunch of memory on your network to store data is a pretty quick way to boost performance. There are some pitfalls to avoid, however. If the data changes frequently, make sure your code to invalidate the cache is well tested. Beware giant object graphs that serialize into gigantic objects that are many times larger than their binary counterparts. If you're caching because of expensive data querying or composition, fix that problem first.
  • Don't wait until the end to understand performance. I'll be honest, premature optimization annoys the crap out of me. Developers who waste time on what-ifs and try to code for them drive me nuts. That said, you can't pretend that performance is a last mile consideration. Fortunately, most shops these days are working with continuous integration environments at least as far as staging or testing, so problems should become apparent early on.
  • Use appropriate instrumentation. I worked with one company that had a hard time finding the weak spots in its system, because it wasn't obvious where the problems were. Big distributed systems can have a lot of moving parts, and you need insight into how each part talks to the other parts. For that company, I insisted that we had a dashboard to show the average times and failure rates for calls to an external system. (I also wanted complete logging of every interaction, but didn't get it.) Sure enough, one system was choking on requests at one point every day, and we could address it.
  • Remember your HTTP basics. I'm being intentionally broad here. Think about the size and shape of scripts and CSS (minification and compression), the limits in the number of connections a browser has to any one host, cookies and headers, the very statelessness of what you're doing. The Web is not VB6, regardless of the layers of abstraction you pile on top of it.

These are mostly off the top of my head, but I'd love to hear more suggestions.


Busy weeks of Pointness

posted by Jeff | Saturday, May 4, 2013, 12:07 AM | comments: 0

I have to say, for all the years to be living in close proximity to Cedar Point, whilst co-operating a big fan site for it, this is pretty much the year. We haven't really had a year quite like this since 2000, and that year was just a new ride, not a huge facelift for the entire front of the park.

GateKeeper is certainly a headline worthy roller coaster, and it really is quite good, but to me the striking thing is that entrance makeover. It was still a bit of a mess when I was there the other day, but the difference compared to the way it looked for 40 years or whatever is stunning. It's modern and classic at the same time, and with the ride looping overhead, completely iconic. There are some parks that have amazing entrances, like Magic Kingdom and Epcot, or the Kings parks with their fountains. Perhaps the Great Americas with their carousels. But this is something to behold. You really know you're entering a special place when you approach the gate.

Walt and I were hoping to re-do PointBuzz by opening day, but that just didn't happen. We're getting there, and certainly the new forums are an important feature, but we're not done. I did, however, whip up a live blog app that we're going to use, starting on the media day, and going through opening weekend. I'm really excited about it, as it will update in real time, running in the cloud with a CDN and lots of caching... total overkill. I even wrote a little Windows Phone app to upload photos.

Cedar Point remains the only thing I really like about living here. So many great friends there. PointBuzz has been around in various forms now for 15 years. That's nuts. I'm glad I don't have to run it by myself anymore.

The next week should be super fun. I'm really glad I get to share it with Diana and Simon. Even though he doesn't get to ride, there's no doubt that he'll be thrilled just to see those trains roll out of the station.


The EST I needed

posted by Jeff | Tuesday, April 30, 2013, 11:36 PM | comments: 0

Diana went out right when I got home from work for a haircut, so I engaged in a little exclusive Simon time and took the boy to the Lizard for dinner. It was exactly what I needed.

Simon has really challenged us both lately, as he has constantly been testing us over every little thing. No matter how much you try to stay calm, he can really get under your skin. I think we're finally starting to keep our responses measured, fortunately, but it has been quite a journey. I needed him to be awesome tonight, and he delivered.

We went to the restaurant without a parachute... no toys, familiar snacks, etc. We started with a little popcorn, picked out letters on the kid menu word search, and before you knew it, our dinner arrived. Grilled cheese and mandarin oranges. He hasn't been a fast eater at restaurants, but he mostly goes the distance. Tonight he was chatty and physically affectionate, and a total saint.

When we got home, he quietly played with his cars without any freakouts (he gets pissed when he can't park them precisely), and then we went up for bath time. He volunteered to go, and did so enthusiastically. In the tub, he was totally cooperative, and didn't complain when I toweled him off.

Then we watched a little Sesame Street, while he snacked on the remainder of his grilled cheese. Lately his enthusiasm has led to jumping on us on the couch, but he was mostly good tonight. He climbed right up on my back, and we brushed teeth, read books, cuddled on the floor, and he crawled into bed, snuggling with Tiger. He was perfect.

Like I said, this was the kind of time that I needed with him, after all of his drama. I know every day won't be like that, but it's good to see him be sweet and well behaved. I worry about him lately, because his speech delays in some ways seem like they're getting worse. He's actually dropping syllables from words he knows. I'm not a speech therapist, so I don't know what to do with that. He has been reevaluated for the subsidized preschool, so hopefully that works out.

Tonight it felt good to be Simon's dad. I need more times like that with him.


Building a live blog app in Windows Azure

posted by Jeff | Sunday, April 28, 2013, 11:21 PM | comments: 0

If you're a technology nerd, then you've probably seen one technology news site or another do a "live blog" at some product announcement. This is basically a page on the Web where text and photo updates stream into the page as you sit there and soak it in. I don't remember which year these started to appear, but you may recall how frequently they failed. The traffic would overwhelm the site, and down it would go.

So I got to thinking, how would I build something like this? We've got a pretty big media day at Cedar Point coming up for GateKeeper, and it would be fun to post updates in real time. Ars Technica posted an article about how they tackled the problem a couple of months ago, and while elegant, it wasn't how I would do it.

My traffic expectations are lower. I don't expect to get tens of thousands of simultaneous visitors, but a couple thousand is possible. The last time we even had the chance to publish real-time from an event was 2006, for Skyhawk. Maverick got delayed the next year, and that event was scaled back to a few hours in the morning. Still, the server got stressed enough back in 2006 with a lot of open connections, in this case because I was serving video myself, and I didn't write the code that I write today. Regardless, I still wanted to build this using cloud services, as if I was expecting insane traffic. The resulting story, from a development standpoint, is wholly unremarkable, but I'll get to why that's important.

So the design criteria went something like this:

  • Be able to add instances on the fly to address rising traffic conditions.
  • Update in real-time with open connections, not a browser polling mechanism.
  • Keep as much stuff in memory as possible.
  • Serve media from a CDN or something not going through the Web site itself.
  • Not spend a ton of time on it.

The first thing I did was wire up the bits on the server and client to fire up a SignalR connection, and have an admin push content to the browsers. I won't go deeper into that, because there are plenty of examples around the Internets showing how to do it with a few lines of code. Later in the process, I added the extra line of code and downloaded the package to make SignalR work through Azure Service Bus. This means that if I ran three instance of the app, the admin pushing content out from one instance, will have the content go via the service bus to the other instances, where other users are connected via SignalR. It's stupid easy. Adding instances on the fly and make it real-timey, check.

Next, I needed a way to persist the content. Originally I toyed with using table storage for this, because it's cheaper than SQL. However, ordering in a range becomes a problem, because while you can take a number of entities in a time stamp range, and then order them in code, there's no guarantee you'll get that number of entities. After thinking about it, SQL is $5/month for 100 MB, and I was only going to be using it for a few days. Performance differences would likely be negligible, and since I was going to cache the heck out of everything, that was even less important. I used SQL Azure instead.

Instead of using the Azure Web Sites, I used Web roles, or "cloud services" as they're labeled in the Azure portal. These are the original PaaS things that I was originally drawn to. Sure, they're technically full blown VM's, you can even RDP into them, but I like the way they're intended to exist for a single purpose, maintained and updated for you. More to the point, they have Azure Cache available, which is essentially AppFabric spun up across every instance you have. So if you have two instances up, and they use 30% of the memory of these small instances, that adds up to around a gigabyte of distributed cache, for free. Yes, please! I had my data repositories use this cache liberally. The infinite scroll functionality takes n content items after a certain date, which means different people starting up the page at different times will have different "pages" of data, but I cache those pages despite the overlap. Why not? It's cheap! Keep stuff in memory, check.

The CDN functionality is pretty easy too. I probably didn't need this at all, but why not? Again, for a day or two, given the amount of content, it's not an expensive endeavor. The Azure CDN is simply an extension of your blob storage, so there's little more to do beyond turning it on, adding a CNAME to my DNS, and off we go. CDN, check.

I stole a bunch of stuff from POP Forums, too. Image resizing was already there, the infinite scrolling, the date formatting, the time updating... all copy and paste with a few tweaks. I didn't do the page design either. Granted, most of it wasn't used, but my PointBuzz partner Walt did that. Total time into this endeavor was around 10 hours. Not spend a lot of time, check.

Here's the Visio diagram:

As I said, if this sounds unremarkable from a development standpoint, it is, and that's really the point. I'm whipping up and provisioning a long list of technologies without having to buy a rack full of equipment. That's awesome. Think about what this app is using:

  • Two Web servers
  • Distributed cache (on the Web servers, in this case)
  • Database server
  • A service bus
  • External storage
  • A CDN

For the four days or so that I'll use this stuff, it's going to cost me less than twenty bucks. This, my friends, is why cloud infrastructure and platform services get me so excited. We can build these enterprisey things with practically no money at all. Compare this to 2000, when the most cost effective way to run a couple of quasi-popular Web sites was to get a T-1 to my house, where I ran my own box, and paid $1,200 a month for 1.5 mbits. Things are so awesome now.

I'll let you know how it goes after the live event on May 9!


The stuff no one teaches you

posted by Jeff | Thursday, April 25, 2013, 11:55 PM | comments: 0

After making some remark about my senior year of college, my roommate from that year made a comment about how much we benefited from seeing the campus counselor/therapist around that time. I think she and I started to see him now and then during our junior year. I don't recall either one of us thinking we were totally screwed up, but it didn't hurt to get a professional perspective on how we were living our lives.

I've often joked about how there should be a manual for life, because for some reason, the experience of our elders never gets passed down to us in a meaningful way. I'm not talking about stuff like how to change your oil or build an f'ing bird house, but the really important stuff about relationships and work.

Let me give you a perfect example of how clueless I was. At the start of my sophomore year, during RA training, there was this girl that I ended up making out with at camp. She was a senior. My sum total of intimate experience with women at that point was embarrassingly limited. This particular one was a cross country star, but with unusually ample frontal proportions for a runner. I don't know if others would find her cute, but there was no question that she was attractive.

The making out occurs every day, going into the first week of school, and generally involves her being on top of me. She's aggressive, but I don't know what she's really after. One night, after watching Letterman in her room, oops, a boob comes flopping out of the giant T-shirt she's wearing. I'm so stunned by this that I really have no idea what to do. I mean, I know how sex works, but I have no idea what I should be doing.

By the second week of school, we "break up," which might be an exaggeration since I'm not sure that we were a coulpe in the first place. I don't think there was much of an emotional connection. I get to be good friends with a guy on my hall staff, who happened to date this girl the entire previous year. They were pretty much together most of the time, and he shares that she may have had nymphomaniacal tendencies (he was a psych major). She wanted it on demand, and frequently. That's when I started to put it together that just a little bit of cooperation with her, and she would have likely been a great teacher of many things.

Yes, it seems completely obvious in retrospect, but why didn't anyone ever teach me that breasts don't randomly fall out of T-shirts? In fact, I had a series of even more intense encounters my junior year, and I still didn't get it. It really didn't matter that these were not long-term relationship opportunities. At that point in life, the emotional maturity we have is awful to poor at best, so we might as well start learning the physical skills.

Here's another story. I'm at my first real non-retail job after college, running a government and school cable access facility. Truth be told, I had a lot of flexibility to do as I saw fit, which is probably not the best thing for a 23-year-old know-it-all to have. Early on, while I was figuring out what equipment to buy and get rolling, I started to reach out to certain people around town, and took over the basic bulletin board channels. About six months in, the committee I had to report to called me out for being an arrogant dick and refusing to work with people. I couldn't figure out why they were accusing me of this.

Over the next few days, I started to put it together. The secretary in my office, who used to handle the bulletin board requests in her specific way, was sabotaging me at every turn. She was telling people who called that I wouldn't do things, and it was generally not me at all. She felt like she was being replaced, so she set out to destroy me. In the end, they moved her out to one of the schools and replaced her, but it took months to undo that damage.

Again, why didn't anyone ever tell me that sometimes people are easily threatened in the workplace? I mean, I've honestly seen it in almost every job, and now I can identify it and deal with it. I'm sure I'm not the first person to encounter it.

Ah, these are the lessons we learn. I'm just not convinced that it has to be that way. Someone should prepare us for life's weirdness.


Parental push-pull

posted by Jeff | Monday, April 22, 2013, 10:54 PM | comments: 0

I'm not sure how many times I've written about the push-pull cycle that Simon engages in. I think I first noticed it when he became adept at walking, and it gets more extreme every month. In fact, I don't know how anyone considers 2 "the terrible 2's," because 3 is much worse. So many tantrums and constant boundary testing!

What's more interesting at this stage is that we, as parents, are constantly pushing and pulling. On one hand, we often try to leave him to his own devices, to fail and be forced to figure stuff out. On the other hand, we want so much for him to be "our little boy" and need us and give us hugs. It's funny how that works.

I can see how being a parent is going to get harder before it gets easier. Sleep deprivation aside, the earlier years were pretty straight forward. If he's hungry, feed him. If he's tired, put him to bed. If his diaper is full of shit, change it. You don't need to be parent of the year to pull that off. Now it's harder, with challenges around eating, potty training, exposure to the right learning resources... there is a lot to consider. It's harder to decide when to intervene in his latest tragedy, or let him flail around a bit.

Personally, I also push and pull in other ways. In the general sense, I feel like I don't get to spend enough time with Simon, and it bothers me. On the other hand, sometimes I think what he's doing is so mundane that I just want to do anything else! I'm trying to see what the really important things are to him, and be engaged for those moments. If there's anything that bothers me about my early childhood, it's that no one really care that much when I built a pinball machine out of my Erector set, a cardboard box and a giant marble. I don't want him to ever feel like adults don't give a shit about what he's doing.


Somewhere around 25, bizarre becomes immature

posted by Jeff | Friday, April 19, 2013, 10:59 PM | comments: 0

Diana and I watched Singles again recently. Aside from having one of the best soundtracks in the history of music, I just found the movie to be brilliant when I bought it in 1994. It wasn't just the snapshot of grunge style in Seattle, but the struggle to meet and connect with people just struck me as something we can all identify with. It's one of my favorite movies.

There's a part early on where Janet is talking to the camera about the desire to really embrace your youth. She says:

"I think time is running out to do something bizarre. Somewhere around 25, bizarre becomes immature."

Cameron Crowe's script really grabbed me with that line. Second only to Steve's drunk speech near the end in awesomeness, that line sums up everything that we seem to lose as we grow up. It was profound to me when I was 20, and it kind of freaked my shit out to hear it 20 years later.

When we are 20, the thing that seems most wild, making us feel alive, is going out to party and get drunk. OK, not everyone thinks that, but as infrequently as I did it, I have to admit that it was one of the things that made me feel like I was living life. Even if you are the club rat type, you eventually start to grow out of that.

So what is the value of doing things you or others might consider bizarre? Is it really being immature? At the ripe young age of 32, I had adventures in body piercing, and another at 37. Heck, I'm still thinking about poking more holes in my body. Is that wild? Why would I want to do that?

Others jump off of tall structures with a rubber band tied to their feet. Some travel to remote places where they put their lives at risk. I suppose some people might even go to an open mic night and sing. Is that wild? Why would anyone want to do that?

I think being bizarre in some outwardly obvious way is something we do to combat boredom, and also to keep life interesting. I don't think most people do it for attention whoring reasons, as an outside observer might suggest. There's a broad spectrum of reasons to break out of your comfort zone, ranging from dissatisfaction with your life to a deep understanding that there isn't that much at stake or risk to try new things. The former might be a little destructive, but the latter is really healthy, I think. I hope I can be healthy in that way.


The rapid evolution of video technology

posted by Jeff | Friday, April 19, 2013, 10:21 PM | comments: 0

When I bought my first professional video camera back in 2006, it was kind of a big deal. It was a big deal because it cost less than $10k, it was high definition, and it recorded to solid state media. That was only seven years ago, and it sounds quaint when I describe it out loud.

After six years, last year, I finally replaced that camera. The replacement cost less than half of the original, recorded in more HD formats, and it was smaller. The compression is kind of high, but the media is dirt cheap. Last year at NAB, manufacturers were all showing various "inexpensive" cameras. For the hobbyist video nerd and full-time professional hired gun, it was like a dream come true.

Then at this year's NAB, Black Magic starts showing two impossibly awesome cameras. The first is a "4k for $4k" camera. All of a sudden, they're offering a camera that has four times the resolution of cinema standard 2k for a few grand. Remember, it wasn't that long ago that shooting in regular "old" HD required a camera that was close to $100k. If that weren't enough, they're also going to offer a tiny camera that shoots conventional HD, with micro-4/3 lenses, and a completely ridiculous 13 stops of dynamic range, for a grand. A grand!

I'm cautious to point out that tools don't make up for experience, and that even in the ugly old days of fake 24p NTSC video, one could get decent enough results out of a cheap camera if they knew what they were doing. Lighting, exposure theory and production knowledge still go a long way to getting high quality stuff. But my point is that the barrier to entry is practically gone. Christopher Nolan and his film snobbery can suck it. College kids hungry to tell a story are going to make great films, even if their distribution is largely on the Internet. That's really exciting.

I don't have any excuse for not having something in the can at this point. I've got the tools, and I have a little bit of talent at least. I just need to write something, or have someone else write something I want to make. I don't know how many years I can go before I'm just a do-nothing douche in that regard!


One interface to rule them all

posted by Jeff | Friday, April 19, 2013, 8:31 PM | comments: 0

Software nerd rant here... skip if this isn't you.

I'm not shy about telling people that I'm not much of a computer science kind of guy. It's not that I don't respect computer science or understand it, I'm just not one to get academic over it to the point of not building anything. And while I can't always remember what the hell SOLID stands for, I do remember that the "I" stands for the "interface segregation principle." It says, "Thou shalt not force everything to use one interface, because specific interfaces are better."

I've seen this principle violated many times, but twice in the last six months I've seen projects that just abuse it to death. The big problem for me is that trying to force everything into a particular interface leads to pain and suffering whenever you want to change something. While developers are in the general sense understanding what dependency injection is, I find that they're often doing it a way that violates the interface segregation principle.

For example, I've seen several instances where people are passing in the dependency resolver itself (for MVC, this is one of the IDependencyResolver interfaces) to various classes, and then those classes new up instances of whatever they need. This is bad for two reasons. For one, you're then coding on One Interface to rule them all, and for another, the overhead of mocking and verifying in testing gets bigger. That's no fun.

Another anti-pattern, related to the ISP, is the master do-it-all abstract class. These drive me nuts, too. While an abstract class isn't exactly an interface per se, it ends up being used as one. In an effort to keep the interface concise (as if it's easy to change when it's used in a thousand places), it ends up having one or two methods in order to conform to the base type. This is suboptimal because it keeps you from grouping similar functionality together, it abuses generics (which are fun when you have to bounce between value and reference types), and more to the point, that single interface isn't single for any really good reason. I would rather see you inject whatever functionality you need by way of a specific interface than force One Interface.

Think about it in terms of the mature frameworks that you've used. There aren't a lot of interfaces to be had that are widely used, because they would be hard to change, and force-feed members that don't need to be widely used. When there are widely used interfaces, they're pretty sparse (think IDisposable).

Specific is better. Don't try to cure cancer with an interface.


That summer vacation feeling

posted by Jeff | Thursday, April 18, 2013, 9:18 PM | comments: 0

While out for lunch today, with sun, 80 degree temperatures, and a healthy dose of humidity, I had what I could only describe as the "summer vacation feeling." You know what I'm talking about. It's that feeling you had right after school let out, when you didn't have to be anywhere in particular. It was probably one of the best feelings of being a kid.

Last summer, I found myself having that feeling a lot, and for a moment, I thought, "Gosh, I sure wish I could have this feeling whenever I wanted." After a little more reflection, I realized that I've actually been fortunate enough to have that feeling most of my adult life. I never really lost the ability or opportunity to have that feeling.

In adulthood, we measure freedom in completely different ways, and probably associate it with happiness to some degree. It was in last summer's reflection that I realized that the freedom actually has little to do with what you do for a living, and more how you do it. I've worked for companies large and small, and I've worked for myself during various times (deliberately and involuntarily). The freedom can exist in any of those situations, but it's predicated on three conditions:

  • You have to like what you're doing. This might seem obvious, but when you like what you're doing, it doesn't feel like work. There are a lot of people who will argue, especially from the Baby Boomer generation, that work can't be something you like, it's just something you have to do. Perhaps rejecting that makes me an idealist.
  • Whatever the situation you're working in, whether it's for a company directly, for yourself, or indirectly for a mass of customers, the freedom requires trust from your "boss." I say "boss" figuratively, because even if you're self-employed, you're still accountable to someone in order to make money. If that entity trusts you, then you're bound to results, not face time or something else unrelated to results. When it's a relationship of trust, you can use your discretion to have your summer vacation feeling.
  • You have the right amount of work. This part is a little trickier, but again, it doesn't matter if you work for The Man or for yourself. If there's so much on your plate that you can't schedule in a little time for something that makes the summer vacation feeling, you aren't really free.

When I look back at my work life thus far, there were only two times that I lacked the summer vacation feeling. One was in a job that I knew wasn't going anywhere, I wasn't learning, and I had no office window. They worried about face time. The other time was far more brief, when a job was starting to sour because the company was going down in flames. That was one of the times it just felt like work.

Maybe I've been lucky, but I have had quite a streak of work where I had lots of summer vacation feeling. I love that feeling.


Exciting times to develop Web stuff

posted by Jeff | Wednesday, April 17, 2013, 11:19 PM | comments: 0

I posted the latest version of my open source forum app today, which is to say I marked it as an "official" release (you could already download the source). I'm pretty excited about sharing this version, in part because it was more heavily influenced by CoasterBuzz users than any previous version. It was great to have such an awesome feedback loop.

This was a fun thing to build because it's mostly the real-time stuff that used to be hard. Now you can download a package, do a little wiring, and suddenly you're baking in neat features that people are totally in to. We in the Web world used to have to figure all of this stuff out on our own. Now we rely on open source developers. I think this is the reason that I've become so passionate about open source, and committed to running a project (even if it is "just" a forum app): You should give a little when you're taking so much.

We live in a pretty exciting time to develop Web stuff, because the gap between what we can imagine and what we build keeps getting smaller and smaller. If you build stuff for kicks in your spare time, you can appreciate the awesomeness of this condition. Even if you build boring internal stuff for Big Dumb Inc., it's great because you're not constrained the way you used to be.

My hope is that all of the awesome sauce dripping out of the series of tubes is making developers really want to dig in and learn about the very platform they write code for. We're finally getting to a point where we aren't trying to build abstractions around the Web itself, and we're instead embracing it for what it is. People not in my line of work have no idea what that means. :)

Now that the forum is done, it's time to move on to PointBuzz v3, and our quilting community site. Onward!


Open source composition

posted by Jeff | Wednesday, April 17, 2013, 5:15 PM | comments: 0

One of the fantastic things about software development right now is that you can compose solutions by combining a lot of different blocks to build an awesome block tower. I've noticed in the last few years that designing these solutions with all of these toys is actually something I enjoy more than in-the-weeds coding. Sometimes they involve a lot of bigger, connected moving parts, and sometimes they're a bunch of components all bundled into one thing.

I've said before that an important skill for a developer is to understand how to compose all of these free and open source pieces into something that is cohesive, maintainable and supportable. I value those skills over something that is hardcore, algorithmic computer science. It's great if a dude can write a device driver or a 3D rendering engine, but can he take a series of already invented wheels and build something great, quickly? More and more, I think that's where a developer can add the most value.

Let me be clear that I don't think you can just hack stuff together in a completely unmaintainable way and call it a day. Just the opposite, I'm suggesting that understanding basic design patterns and applying them to the composition of these fantastic tools is where it's at.

There are certainly some pitfalls associated with this. It's easy to simply copy what you've seen elsewhere, and assume that it's the "right" way to do something. That's the same problem you encounter with the in-the-weeds code. Conversely, it's easy to want to over-engineer or extend something that an open source developer came up with, and that can have unintended consequences with regard to complexity and leaky abstractions. Those problems can be just as painful as the copy-and-paste issues!

In the .NET development space, we've come a very long way as far as open source goes. There wasn't a lot of choice or really useful stuff out there even five years ago. I think we still have a little ways to go to make things easier, especially when it comes to the installation and configuration of these building blocks. I spent much of today swimming up stream, trying to make things work on a client project, and those are never fun days. Fortunately, things like NuGet are making life easier.

There will always be hard problems to solve, but we don't have to come up with giant, home-grown solutions for everything the way we used to. It's as exciting as ever to work in this profession, provided you hold on to your desire to keep learning.


What you do with what you can't explain

posted by Jeff | Monday, April 15, 2013, 10:38 PM | comments: 0

Today's violence in Boston is shocking and tragic. The weird thing about the Internet is that it gives people a voice, often unfiltered, to react to the tragedy. You never quite know what you'll see. Sometimes, you end up dropping them off of your social networks (I'm looking at anyone who made it a political issue within the first hour). Then you get things out of left field, like the Mr. Rogers meme around showing the good in the middle of the bad.

Most of us never deal with intense violence directly, but as human beings, we're certainly affected by it. It's far more likely, however, that we deal with extraordinary loss or tragedy on a more personal level. There is a broad category of events that we inevitably deal with that are difficult to explain, and often impossible to rationalize. There are different things that different people do to deal.

At one end of the spectrum, people might use their faith to write a bad thing off as, "God's plan," or a more agnostic credit to some kind of fate. I tend to just attribute something like this to, "Bad people sometimes do bad things." It's not particularly satisfying, but I try to base as much as I can in tangible facts. For me at least, I find comfort in what might be an uncomfortable reality.

At the end of the day, comfort is ultimately what we seek. That there are bad people sucks, but I'm always amazed to see what everyone else does when something bad happens. People help each other out. The fear is ultimately trumped by love. If that doesn't give you comfort, I don't know what will.