Twin Cities Code Camp
I’ll be going to my first Twin Cities Code Camp this Saturday so if you’ll be there, keep an eye out for me. Hopefully I’ll learn a few things I can blog about.
I’ll be going to my first Twin Cities Code Camp this Saturday so if you’ll be there, keep an eye out for me. Hopefully I’ll learn a few things I can blog about.
I’m a Windows guy and I’m not ashamed of it. Despite the problems it has (and what software package doesn’t have problems?) it has been a productive and profitable platform to build a career on. I don’t have anything against other platforms either. Whatever works for you, go use it. Someday I will be cool enough to own a Mac :).
So even though I’m a Windows user, I’m a technology enthusiast at my core so I’m always up for trying new things. A loooonnng time ago (probably 9-10 years ago in my late teens) I set up Linux on a spare machine to see what the fuss was about. I tried Red Hat. I tried Mandriva. Once I got it installed I didn’t know what to do with it. It was nice enough, but it just didn’t grab me. This was also pre-Firefox so the Internet browsing experience was subpar. The biggest hurdle though was installing programs, if I could even find one to do what I wanted. Package managers were sparse and compiling from source was well beyond my capabilities at the time.
Fast forward a few years and I was churning out web sites with ASP/VBScript and some PHP and this new thing called Ruby on Rails came out. I, like many others, was wowed by the famous “build a blog in 20 minutes” video so I got it up and running on my machine but didn’t do anything with it because I was a scripter not a programmer and learning Ruby was well beyond my capabilities at the time.
I’ve been a professional programmer now for 3.5 years. I worked as a sysadmin for a couple years. I’ve used Mac OS a lot more. To save time, let’s just say I’d consider myself a seasoned computer guy with a broad understanding of How Things Work and the ability to figure out almost any new thing. Or so I thought.
I’ve been wanting to learn a new programming language for awhile now. I really like C# and feel I have a pretty good grasp on it so I thought it was time to broaden my horizons. Ruby and Python are en vogue right now and have some philosophical differences from C# so I thought I’d try to learn some Ruby (and Rails along with it). I have an old ThinkPad T60 I just retired so instead of setting up Rails on Windows (which was not that great of an experience the first time around) I decided to go with Linux on the T60. Ubuntu seems to be all the rage lately so I burn the CD and it installs beautifully. No driver issues, in fact, not a single install issue. Awesome! We’re off to a great start.
Time to get Rails installed. I figured the software installing experience had to be better than 10 years ago. It is, but barely. Look what it takes to get Rails installed. Are you serious? I went through all this and encountered a couple errors along the way that I was able to solve with some lengthy Googling. I know what you’re thinking “Lame Windows dude wants a GUI.” Yeah that’d be nice, but I’d settle for an apt-get one-liner. RubyGems appears to be the solution for this, but getting that installed and configured was not exactly straightforward either.
I eventually got it running. In the process of trying to get all the packages installed and configured I had no idea what version of what was installed or how to uninstall Ruby 1.9 after accidentally installing it. I didn’t want to run into some conflict down the road because I had the wrong versions installed.
Worst of all, I felt like I was wasting tons of time configuring everything just to get going and I had no way to really verify I was doing anything right. This feeling would be mitigated with experience so I’m not blaming the platform for that feeling, just pointing out my experience.
With Rails up and running I thought I’d try to find a text editor or IDE with some basic Rails support to at least provide a little structure for messing around with it. Googling around I come across RubyMine but that’s not in the Ubuntu package manager and downloading and installing (still after all these years just an afterthought) requires Java, which is in the package manager. Download Java and try again. No go. This was about the point I had enough with trying out Rails.
Here’s my advice if you want to try Rails: buy a Mac and TextMate.
Not wanting to entirely give up on things, I recalled that there were some big Mono releases earlier in the day. I try following some steps with apt-get to get MonoDevelop 2. No go. Tried the package manager and ended up with MonoDevelop 1. I have no idea what version of the Mono core is installed anyway. Download from the Mono site? Yeah, not so much. Ubuntu, even though it’s the most popular distro, doesn’t have a supported download. So much for that.
How is it after all these years the Linux software install experience is still so awful? Are my expectations unrealistic? Am I still too dumb to get all this stuff? I really wanted to like Linux/Ubuntu/Rails/Ruby/etc and to be energized by learning something new, but apparently I’m just not ready for that yet.
I had a hunch I’d be too tired to write up a day-by-day recap of my first MIX conference which turned out to be exactly right. You’ve probably heard by now all the stuff that was announced, so I’ll try to keep this an opinion piece instead of a news article.
The Good
Prior to attending I had read that the most valuable part of conferences like MIX was not the presentations, but the people. This was absolutely and completely true. There’s no substitute for having conversations with brilliant people and there were a ton of brilliant people at the conference. I had good conversations with Phil Haack, Jeff Atwood and the Stack Overflow devs Jarrod and Geoff, Joel Spolsky (possibly the highlight of my career), Rob Conery, Jon Galloway, Scott Hanselman, Dave Ward from Encosia, Justin Etheredge, some guys from Woot and many more. Learning the how and why of how they do things is educational and inspiring.
Thankfully, Microsoft has realized the importance of these types of interactions and does a great job of facilitating them. They set up a room called “3rd Place” with couches, snacks, free wifi and power strips. It was a great setup and worth the price of admission alone. If you’re at MIX next year and none of the sessions at any given time really inspire you, go hang out at 3rd Place and strike up conversations instead. You can always watch the session video later.
One conversation I’m particularly enthused about is the meeting I had with Rob Conery of SubSonic fame. SubSonic has gone a little stale and needs some freshening up. We discussed some issues getting in the way of progress and some ideas for going forward. I’m going to try to get it kick started again, which I will blog about when that happens. I love SubSonic and am excited to start contributing to it’s future.
I also showed off Managed Assembly when I had a chance and got some good feedback on the site both design-wise and vision-wise. Now that it’s up and running, we’ll see how it goes for a little bit before I make any significant changes.
MIX also does a good job of keeping a good balance of content for designers and developers. I think all devs should have some basic understanding of good design principles and MIX does a good job of exposing that without overdoing it for devs. Bill Buxton and Deborah Adler (she designed the new Target prescription packaging) gave insightful keynotes that had some good design insights for both designers and developers.
The Not-As-Good
One reason 3rd Place was more appealing to me than the sessions is a matter of timing. ASP.NET MVC went final, but there was very little new content that wasn’t already covered at PDC or in blog posts since. Rob Conery’s session stood out because it was the only one that had more stuff in it that I hadn’t seen than stuff that I had seen. It was great. The video has been posted so you should watch it. Almost everything else that was new was tied to Silverlight. Which brings me to…
The ‘meh’
Silverlight 3. Meh. It’s nice. It does cool stuff. It now works out of the browser, which has huge potential. Adobe AIR now has some serious competition for building Twitter clients (ba-dum-dum). I did learn some things about Silverlight I didn’t know (like support for threading), but overall, I just don’t care that much about it yet.
The Bad
IE8. OK, IE8 isn’t so bad, but until IE6 is dead, it’s completely irrelevant. Slices? Yawn. Accelerators? Yawn. I don’t want to write browser-specific code anymore. The IE intro video was pretty funny though.
Was it worth the trip?
Absolutely. If you’re a MS web dev or a designer that works with them, you should be at MIX. You’ll learn a lot from other people and the sessions. You’ll have a chance to talk directly to the people who build the tools that are the basis for your profession and give them feedback and ideas from the real world. You’ll have fun because it’s in Vegas. Try to make it next year. You won’t regret it.
My two favorite programming-related sites right now are StackOverflow and Hacker News. StackOverflow suffers from a lot of “off-topic” questions that are really fit for a discussion group more than a question/answer site. Hacker News is a discussion and social news site for hackers and startups (with a programming bent) hosted on an extremely well-built web app. While the app itself is nice, the community there is even better.
With a site like Hacker News, the value is the community. They act as a filter. I rarely visit a link that comes across the HN front-page news feed without first reading the comments to see if its worth my time. There’s also value in building a place where you can converse with the same group of people for each new topic that comes up. This sounds obvious, but a common question that comes up on HN is “Does Hacker News steal the discussion from the original site/blog/etc that was submitted?” I don’t see a discussion on Hacker News with people who’s viewpoints I’ve become familiar with the same as a discussion with random people in blog comments. I think this is a big part of what keeps people coming back to HN: quality discussion with people you share a collective context with.
Hacker News also succeeds because of the moderation policies, which I won’t cover in any detail since Atwood did plenty of that recently.
Another site I frequent is DotNetKicks.com to get the latest .NET news. Unfortunately, DNK was not built around facilitating discussions which is apparent from the extremely low number of contents posted there. The ‘Shoutbox’ shows hints of “life” (in a discussion sense), but in recent times it’s gone nearly dormant (possible defection to DotNetShoutOut?).
DNK also suffers from an antiquated ranking system that was borrowed from Digg. Stories need a set number of votes to be published to the home page and there they sit until the next story with enough votes knocks them down a notch and eventually off the home page. It’s really easy to game (although, most social news sites are) and there’s not a culture of moderation that can handle the gaming.
I wondered how I could combine the good parts from these three sites into a site targeted to passionate .NET devs where they could get the latest information, take part in quality discussion and be interesting enough to keep them coming back. Building it myself sounded fun, and so ManagedAssembly.com was born.
Managed Assembly was borne out of my desire to combine the best of the aforementioned sites into a site I would actually want to use every day. It borrows heavily from these sites in the following ways:
Hacker News
It won’t take you long to see the inspiration of Managed Assembly in Hacker News. I started with their UI, jQuery-ed it up a little bit, changed some colors, made some other minor changes and off we go. I did this because I think Paul Graham built Hacker News for the right reasons, to build a community for the sake of the community, not for something else. DNK and other link sharing sites fail at building quality communities because they’re designed to generate page views and ad revenue. Paul took his own advice and built HN the way you would build a social news/discussion site if you were doing it for charity. There are no ads. There’s no frills. It just works.
There will be no ads for registered users on Managed Assembly as long as I can sustain it without it. Freeloaders (those not contributing to the community) and RSS feeds may get ads, but not for awhile.
The other big way MA is borrowing from HN is philosophically. HN believes in the ‘Broken Windows Theory’. HN kills off-topic posts with no remorse. Submission titles are cleaned up. Basically, they keep the house in order. Managed Assembly will do the same.
Stack Overflow
While the rep system on Managed Assembly works pretty closely to how Hacker News does, I want it to be more like the Stack Overflow system when it grows up. Users with more rep will get more capabilities. This has not been hashed out yet.
What I’d really like to borrow from Stack Overflow is the user base. I’ve got some ideas in this area, so stay tuned. We’re also going OpenID-only, following SO’s lead.
DotNetSomethingOrOtherLinkSharingSite.com
The only thing we’re copying from DNK and DNSO(?) is the types of links I want to see submitted: anything interesting to the intermediate-to-advanced .NET developer. This includes general-interest programming subjects. Topics that are too basic will be killed at the discretion of the mod(s).
New Stuff
The site isn’t completely a rip off of the others mentioned. I want to add a live aspect to it for events like MIX and PDC. My first attempt at this is a live Twitter tracker for MIX09 content. I wanted to implement a chat so you could have a place to go to discuss the keynotes as they happen, but I ran out of time before MIX. Chat in some form will be integrated in the future.
I also want to integrate Twitter, both into the Live section and other parts of the site. I find Twitter invaluable for keeping up with the latest .NET happenings as they happen, and that gels nicely with the MA MO.
There Will Be Bugs
The site was made by a single developer (me) in ASP.NET MVC. Since I’ve been putting this together in my spare time, I haven’t had the chance to stress test it the way I would like, so you will find bugs. Email me and let me know about them. I’ve also set up UserVoice for handling feature requests.
Check it out, let me know what you think and let’s build a community.
Vacation ends tomorrow and I’m on my way to Vegas for my first MIX conference. I’m extremely excited to be going and can’t wait to meet tons of people and see what Microsoft has in store for us .NET web developers. I haven’t had a chance to read too much pre-conference speculation from blogs and such (my feed reading has been a little behind due to the aforementioned vacation), so I don’t know what all to expect, besides a lot more on Silverlight than I’d probably prefer.
There is one way Silverlight 3 can grab my attention though: proper offline support. We do a lot of work with digital signage and have been using Adobe AIR due to its excellent offline support. Unfortunately that means we run a dual stack in some situations with .NET powering the server-side and AIR/Flash running the client. I’d love to standardize on one stack and the only way we can do that is with Silverlight running offline on Macs. So offline Silverlight support is on my wish list.
I’m also hoping Microsoft lays out their plans for ASP.NET MVC. I really like MVC and find Webforms almost unbearable now. I can’t wait to see where they’ll take it next and I hope they lay it all out at MIX. And I hope its more than just controls. I’m hoping to find out what improvements will be made in VS2010 for MVC.
I’m not looking forward to any IE announcements, unless they announce IE9 is going to integrate Webkit. This will *never* happen of course, but I’m just sayin’ that’s how they could make me care about IE again.
I’m excited for Azure too, but I don’t have any specific needs in this area yet but may so in the future so I’m going to pay a lot of attention to it. If nothing else, I just hope they give attendees some beta tokens so I can try it out.
The biggest thing I’m hoping for is something to be announced that I would have never seen coming. I like surprises, especially surprise product or service launches.
I’m going to try to blog my reaction to what I experience each day, assuming I’m not too tired from being in Vegas with a bunch of other geeks. You can also follow my Twitter stream to get live updates.
Also, check back tomorrow night for a big announcement about the side project I’ve been hinting at for awhile. There will be info on the blog here and on this site.
One of my favorite open source projects is the Argotic Syndication Framework. Argotic makes it really easy to generate RSS (and Atom and others) feeds with .NET. The library has a really clean API and has great extensibility support for RSS extensions like Media RSS.
I’ve been working almost exclusively with ASP.NET MVC the past five or six months and also been doing a lot of RSS feed generation. To make it easier to return RSS feeds from a controller action, I’ve created a new class that derives from ActionResult called RssResult. RssResult takes in a feed generated with Argotic and spits out the appropriate content type and content from the feed. Here’s what RssResult looks like:
public class RssResult : ActionResult
{
public RssFeed RssFeed { get; set; }
public RssResult(RssFeed feed) {
RssFeed = feed;
}
public override void ExecuteResult(ControllerContext context) {
context.HttpContext.Response.ContentType = "application/rss+xml";
SyndicationResourceSaveSettings settings = new SyndicationResourceSaveSettings();
settings.CharacterEncoding = new UTF8Encoding(false);
RssFeed.Save(context.HttpContext.Response.OutputStream, settings);
}
}
And here’s a sample controller action:
public ActionResult Index() {
PostCollection posts = PostService.ListPopular(1, 30);
RssFeed feed = new RssFeed();
feed.Channel.Title = "Managed Assembly : Popular";
feed.Channel.LastBuildDate = DateTime.Now;
foreach (var post in posts) {
feed.Channel.AddItem(new RssItem {
Author = post.User.DisplayName,
Description = post.FeedContents,
PublicationDate = post.CreateDate,
Title = post.FeedTitle,
Link = new Uri(post.FeedLink)
});
}
return Feed(feed);
}
My controller base class has the ‘Feed’ method like so:
public RssResult Feed(RssFeed feed) {
return new RssResult(feed);
}
In this example, the feed would be built up on every request. In some cases, I’ve added caching (using my CacheManager) so that the feed is only generated every 15 or 30 minutes.