Preview of SharePoint Integration with CS 2008

Do you use both SharePoint and Community Server inside the firewall? Ever wish you could integrate the two? Well, now you can by grabbing the preview release of our SharePoint Integration with CS 2008.

This integration between the two platforms has been one of the most requested items for Telligent, so we're really happy to get this out the door. It's been in the works for several months, with Leon doing a kickass job of getting us this far. So if you're at all interested, download it, try it out, and give us some feedback.

Come Work With Us

Want to work with some of the best and brightest? Want to work on cool stuff? Want to help build products used by thousands upon thousands of people? Well, now might be your chance.

We have recently opened up a couple spots on the product team. One is for focusing on our SharePoint integration and the other is for someone to focus on performance and scalability. If you've got experience in either area and are at all interested, drop us a line and we'll get in touch. And feel free to ping me if you have any further questions or want some additional details.

A Method Should Do One Thing and One Thing Only

As someone who enjoys well-written code like it's nobody's business, I get frustrated when I find methods that do more than one thing because to me, a method that *could* perform several actions is not well-written.

For example, awhile back I came across a method named something like CreateUpdateDeleteItem. The name itself contains three verbs (actions for the grammar impaired), and not only that, but it accepts several parameters, a couple of which are used as flags for conditional logic at different places within the method.

The biggest problem with a method like this is testing. The method itself does not subscribe to the Single Responsibility Principle, and thus contains several nested conditional statements, each of which require their own test permutation to make sure all code paths have been accounted for.

Before I got into unit testing a few years ago, I had a much harder time convincing people of the benefits of splitting a method like CreateUpdateDeleteItem into three separate methods (other than "just because"), but with unit tests I have concrete evidence of why it makes sense to do so. It's amazing what happens when you show someone actual tests because at that point it's no longer theory, it's real. And it's usually only then that the light goes off.

So if you find multi-action methods like CreateUpdateDeleteItem, refactor them appropriately. Your tests will thank you.

Lines of Code Should Be Like a Golf Score

I get really aggravated when I hear developers talk about how many lines of code they write. You know the people I'm talking about. The ones who make brash statements like, "I wrote 25,000 lines of code last month" or "Of course it's buggy, it has 100,000 lines of code".

What those people don't get is that statements like those scare the crap out of developers who know better. When someone makes statements like that, it tells me all I need to know about their approach to writing quality software, which is to say, severely flawed.

One of my favorite things to do is not to write additional code, but to remove code, either because it's no longer needed or by way of refactoring. Nothing makes me happier than shrinking a codebase.

It's not about how many lines of code you write, it's about how many lines of code you don't write (while providing the required functionality). And it's those developers who you want to work with.

Tools for Distributed Communication

When developing software, there are many contributing factors to the success (or failure) of a project, and for me the second most important factor is communication (the first being having the right people). Communication is always critical, in the software industry or elsewhere, but becomes even more crucial when you have teams of people spread out across the country in different time zones.

Telligent is this way. Most people are surprised to learn that the product team is 1) only 10 people and 2) not located together in an office (only two members of the product team are in the Dallas). Naturally this leads to the question "How do you guys do it?". My response is always a two part answer: we have highly talented people and we use a combination of tools to help us.

Email
Duh. No business works without email, and we're no different, but I tend to loathe email because I haven't yet mastered Inbox Zero. I'm getting there, but it's been a challenge. In any case, email is a no-brainer.

Instant Messaging
Many things get done using IM, mostly of the quick question variety. Occasionally you'll get a lengthy conversation going, but it's usually reserved for quick hits so that you and the person you're chatting with can get back to what you were doing.

Skype
Ah, Skype. My favorite tool to love and hate at the same time. I love Skype because it allows me to talk with someone without having to use a phone, and for free. However, Skype is not without its issues when it comes to reliability. It works well most of the time, but its those times when it doesn't that is really frustrating. And it's those times that brings me to the next tool.

The Phone
You remember the telephone, right? The thing with numbers on it that allowed you to talk to people before email took over? It's the thing that allows you to hear another person's voice, old school. Some of you might even remember rotary phones. Of course, it's probably only those people who remember analog clocks too. Sarcasm aside, the point I'm trying to make is that all too often in this day and age people avoid actual human interaction at all cost, instead deferring to email and IM only (along with Twitter, Facebook, MySpace, insert any social network site here, etc). I call bullshit on that approach and would much rather talk to a live human being than use email and IM any day.

SharedView
Not being able to grab someone when you want to have an impromptu whiteboard session or do some pair programming or review some code can be frustrating. That's where SharedView comes in. SharedView has allowed us to collaborate on those types of things when the need arises, and because of that has become a vital tool for working with someone remotely. The cool thing is that it supports up to 15 people per session, so it's not just a 1-1 tool.

Jing
I've talked about Jing before, but it's worth mentioning again because of how indispensable it has become to us. Recording a 5 minute screencast for communication has never been easier.

So with that, what tools do you use? If you have other tools that you like, I'd love to hear about them.

MVP Summit Shenanigans

I had an extremely fun time last week at the MVP Summit meeting everyone and geeking out 24/7. But what really made the week was all the joking with people, so without further adieu, here are some recaps.

I Locked My Laptop and Still Got Pwned

It's Tuesday, the first day we're on the Microsoft campus for sessions with the product teams, and ScottW and I show up to ScottGu's Silverlight talk. As we walk in the door we hook up with Steve Harman and Jon Galloway. We're sitting at a table in this order: Jon, Steve, me, Scott. At one point during the talk I needed to use the bathroom, so as I got up I locked my laptop, which runs Vista. When I come back, I find my laptop completely screwed, and the other three trying to hold back from laughing so hard. It took me a couple minutes to figure out what happened: Steve turned on all accessibility features (except the sound), with one of those being the on-screen keyboard option, which meant the actual keyboard didn't respond. Well, unbeknownst to me, the Vista accessibility features are available on the login screen, so when I locked my laptop, Steve simply clicked on the accessibility button and went to town (I think Escape gave me my keyboard back). The funny thing is that by locking my laptop, I actually called attention to it, which then gave the other three the idea to mess with me. I'm glad we were near the back because the laughter was pretty loud. Lesson learned.

Steve Harman, the Very First MSTest MVP

Naturally after that happened, I had to find a way to get back at Steve. The opportunity came when Scott, myself, Steve, and Keith Elder were in the next session. See, before the previous session ended Steve gave his phone to someone to update the version of Windows Mobile (can't remember who). Well, in that next session the guy who was updating Steve's phone brought it back to him and in his excitement, Steve got up and left his laptop wide open, with Twitter on top. So I pull Steve's laptop closer to me to type something in Twitter as Steve, at which point Keith sees what I'm up to and runs interference with Steve to keep him preoccupied with his shiny new Windows Mobile OS. Seizing the moment, I first tweeted "I hate unit testing" from Steve's Twitter account and then tweeted "I love MSTest", which if you know Steve at all is blasphemy. Steve's all about TDD and loathes MSTest, so for those messages to be posted from his Twitter account was like death to him. Sure enough, there was a flurry of people on Twitter asking what was going on, or saying that his true colors were coming out, etc, etc. From there on out, Steve was known as the very first MSTest MVP.

Jon Galloway Wants to do Bad Things to Keith Elder

It's Thursday, the last day of the summit, and a bunch of us went to The Taphouse Grill for lunch (pics on Jon's blog). We're all having a good time and most of us are Twittering (yes, it's been turned into a verb). At one point Jon gets up to use the restroom and unbelievably, leaves his phone on the table, unlocked with Twitter open no less (you'd think by this point in the week everyone would have learned something). As you can imagine, as soon as he was out of hearing range, Keith was all over that and tweeted from Jon's account something about wanting to have hot passionate monkey love with Keith. I'm not sure there's anything else I can say about it other than that it was damn funny.

Hi, My Name is Doug

Remember a couple of posts back how I wrote about some people not knowing what my real name is, but recognizing Arcware? Well, that doesn't hold true for one special person: Sara Ford. See, Sara and I have been formally introduced 2-3 times and every time she doesn't remember my name (not unnatural, but still). So at the attendee party Wednesday night, I run into Sara and say hi, and I realize she doesn't remember my name, and therefore I introduce myself to her yet again and give her a ribbing for it. Well, about an hour later I see her again, and she says, "Hi Doug". I couldn't help but start cracking up. I applaud her for remembering that my name started with a D but that it's Dave, not Doug. But it gets better. The next night was the Geek Lager at Kells Irish Pub. I'm drinking my Miller Lite, chillin with Steve, Keith, and Scott Koon among others, and Sara shows up. I turn to Steve and tell him I bet she doesn't remember my name, so I ask her if she finally remembers and says, "Yes, it's Doug, but I messed up once and called you Dave". LOL. Classic, just classic.

I've Joined The Lounge

This is a couple weeks over due, but I thought I'd let everyone know that I've joined The Lounge ad network for my blog. My buddy James Avery has taken over The Lounge and has done a great job landing advertisers and high quality publishers (mostly bloggers, small and large) and continues to work on making it better. If you're interested in a limited spot, contact James here.

Hi, My Name is Arcware

One of the best things about the MVP Summit is getting to meet and hang out with all the people you only know in the online world. But what's interesting is that if you use a handle in the online world that is not your actual name, people tend to get this sort of cautious look on their face when you introduce yourself with your real name.

For example, Arcware is my online handle. It's my blog address, it's my Xbox Live gamertag, and it's my Twitter username. Therefore, if someone follows me online in any form, it's entirely possible they have no idea what my real name is. So this week many times when I would meet someone and say "Hi, I'm Dave Donaldson", the person would get this look like "I have no idea who this person is", but then when I'd say "I'm Arcware" the light would go off and the connection was made.

Case in point: Steve Harman and I were in Phil Haack's and Scott Hanselman's ASP.NET MVC talk and afterwards I wanted to make sure I introduced myself to Phil, as we've exchanged emails and had a couple IM conversations before, but we've never met face-face. So after he finished talking to everyone else I introduced myself and he got that look, and then I said "Arcware" and he says (something to the effect of) "Oh of course, we've chatted before; I read your blog". And at that point we went off to find a table so he could show me some REST stuff with ASP.NET MVC, but that's a different topic.

Anyway, I'm not sure there was a point to all this, but it's something that made me think. Of course, according to Steve, it doesn't matter what name I use because people don't care who I am anyway :-)

MVP Summit Rocked

This past week I attended my first MVP Summit and I'm happy to report it did not disappoint. Getting to see everyone (sometimes for the first time) and having great conversations was definitely the best part. Oh, and being shown upcoming stuff from the Microsoft product teams didn't hurt either. Some highlights for me, in no particular order:

- Hanging with other Telligenti (RobH, ScottW, ScottD, JasonA, TerriM). Being remote I don't get to see people as much as I'd like, so it was good to have some face time.

- Pwning with Steve Harman. Steve and I hung out quite a bit this week and had a riot the entire time, mostly taking turns pwning one another over Twitter while sitting right next to each other.

- Geek Lager at Kells Irish Pub. This was the last night everyone was there, and according to The Elder, there seemed to be about 75 people in attendance. Definitely a good time, especially all the ribbing I took for drinking Miller Lite in an Irish pub.

- Seeing my buddy Drew Robbins. Drew moved to Seattle about 6 months ago, so it was good to see him and his family again, and they were gracious enough to let me stay with them on Sunday.

- Meeting people I only knew in online form: Scott Koon, Phil Haack, Scott Hanselman, Jon Galloway, Rob Conery, David Laribee, Rick Strahl, and others I know I'm forgetting.

- Chatting with old friends Don Demsak, Darrell Norton, and Jeff Julian.

- Having Jeremy Miller remind me that we met several years ago in previous lives. That was unexpected. I went to say hello and he asked if I remembered him from a project we were both involved in at Nationwide (he came in for a short time as a consultant in his ThoughtWorks days). Once he said that it dawned on me, but before that I never made the connection that he was the same Jeremy Miller. Small world indeed.

- Riding to the product team dinner with ScottGu. This needs a little setup. At the end of the day Tuesday, Steve Harman, Jon Galloway, and myself were waiting around to go to building 42 with Rob Conery. Jon was on the phone with Rob, who said he was with Scott (Hanselman we assumed) and they'd pick us up. By the time they got there, we had to skip the trip to building 42 so that we could make the ASP.NET product team dinner. So when Rob and Scott arrive, Rob calls Jon to say they are out front in a silver car. As we walk out we see Rob in a brand new Infiniti (high end model), at which point I'm thinking, "Damn, Hanselman has some balls to get that for his rental car". But who gets out of the driver side to open the trunk for our bags? Scott Guthrie, not Scott Hanselman. Rob sort of left out that little detail. Anyway, we rolled with it and enjoyed seeing ScottGu drop some f-bombs trying to figure out his new navigation system. Classic.

- Chatting about TDD with Rob Conery. So later on after the product team dinner, I'm at a place called The Palace (I think) throwing a couple back with Rob, Steve Harman, Jon Galloway, Rick Strahl, and Javier Lozano. Rob and I were sitting on one end of the table and at one point we got onto the topic of his venture into TDD, which turned into one of the best conversations I've ever had about how to approach TDD.

- Having the massive lunch tab for 14 people at The Taphouse Grill picked up by Dustin Campbell. Dustin is leaving for Microsoft in a couple weeks, and I think he blew his entire signing bonus :-)

Community Server 2008 Released!

Yesterday was a big day for us at Telligent as Community Server 2008 finally went out the door. If you've been following this release at all and/or have used the betas, you know this is a huge release for us. It's such a big step forward for the product and for Telligent as a whole; we're really excited to get it out for mass consumption.

You can see the list of new features from Rob's announcement above and you can get the bits here. Let us know what you think!

Use a Single Web.Config for IIS6 and IIS7

As we near closer and closer to the release of Community Server 2008, one of the items that needed addressed was making sure it runs in IIS7 Integrated Pipeline mode. If you're not familiar with it, IIS7 is quite different from previous versions of IIS, and provides two modes of operation: the aforementioned Integrated Pipeline mode and a Classic Pipeline mode. Running an ASP.NET site in Integrated Pipeline mode means you're taking full advantage of all the new features and underlying architecture of IIS7. On the other hand, running an ASP.NET site in Classic Mode basically means you want the site to operate as if it were running in IIS6.

The primary issue with running an ASP.NET site in IIS7 Integrated Pipeline mode is if you have any HTTP modules configured. See, the "problem" is that with ASP.NET under IIS6, there were essentially two pipelines: one for ASP.NET and one for IIS. A request would come into IIS and if the file extension was mapped to the ASP.NET ISAPI extension, the request would be passed off to aspnet_isapi.dll and was then processed by the ASP.NET pipeline, which is where the HTTP modules come into play with regards to events that occur in the pipeline. However, in IIS7 there is only one pipeline for those events, and its used for both IIS7 native modules and ASP.NET modules (once the pipeline events have been taken care of, the file is taken care of by the appropriate ISAPI extension).

Now that we've covered that, if your ASP.NET app has HTTP modules and you want to make sure it runs in both IIS6 and IIS7 Integrated Pipeline mode (from here on out just referred to as IIS7), you need to make some changes to web.config (there are other things to consider as well when running an ASP.NET site under IIS7, so definitely check out this article first for details). The web.config changes needed are for your HTTP modules and handlers. For IIS6, they were configured in the <system.web> section, as such:

<system.web>
    </httpModules>
        <add name="..." type="..." />
    </httpModules>
    <httpHandlers>
        <add verb="...." path="..." type="..." />
    </httpHandlers>
</system.web>

 

However, to get these to work in IIS7 you must *move them* from the <system.web> section to the new <system.webServer> section, which is what IIS7 requires when running in Integrated Pipeline mode (it's not needed for Classic Pipeline mode). So instead of the above you'd have this instead:

 

<system.webServer>
    </modules>
        <add name="..." type="..." />
    </modules>
    <handlers accessPolicy="Read, Write, Script, Execute">
        <add verb="...." name="..." path="..." type="..." />
    </handlers>
</system.webServer>

 

Notice there are a couple slight changes, which means you can't just copy and paste these as-is from <system.web> into <system.webServer>:

  • <httpModules> and <httpHandlers> have been renamed to <modules> and <handlers>, respectively.
  • Each handler in IIS7 requires a name attribute. If you don't specify it, you'll get an error message.
  • The handlers node has an optional, but good-to-define accessPolicy attribute. This value depends on your handlers, so use the ones that are right for you.

Armed with this knowledge, to run your ASP.NET app on IIS6 and IIS7 you could simply create a web.config for each version and then deploy the appropriate version to each IIS web server as needed. That's a reasonable solution, but there is a way to use a single web.config to run your ASP.NET app on both IIS6 and IIS7: 1) configure your HTTP modules and handlers in both the <system.web> and <system.webServer> sections, and then 2) tell IIS7 to skip validation of the Integrated Pipeline mode configuration.

 

The way you do that is by adding a <validation> node to your <system.webServer> section and set its validateIntegratedModeConfiguration attribute to false, as such:

 

<system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <modules>
        <add name="..." type="..." />
    </modules>
    <handlers accessPolicy="Read, Write, Script, Execute">
        <add verb="..." name="..." path="..." type="..." />    
    </handlers>
</system.webServer>

 

If you don't turn that validation off, IIS7 will try to validate the *configuration* of the Integrated Pipeline mode for your app, which would fail if you have your HTTP modules and handlers also defined in the <system.web> section (because for IIS7 they should only be defined in <system.webServer>). But by turning that validation off, IIS7 won't throw the error, thus allowing you to get away with defining your HTTP modules and handlers in both places.

 

The reason this works is because only one set of defined modules and handlers can be loaded. For ASP.NET sites running under IIS6, this will only be the ones defined in <system.web>, which go into the ASP.NET pipeline, while ASP.NET sites in IIS7 will only get the ones defined in <system.webServer>, which actually go into the IIS7 pipeline.

 

And there you go. Configure your HTTP modules/handlers in both the <system.web> and <system.webServer> sections and turn off validation of the Integrated Pipeline mode and you can use a single web.config for running ASP.NET sites in IIS6 and IIS7. I've tested this with IIS6, IIS7 Classic Pipeline mode, and IIS7 Integrated Pipeline mode all without issue (and yes, Community Server will run in IIS7 just fine) so I know it works.

 

Mad props to my friend and IIS7 Evangelist Drew Robbins about this issue as he definitely helped clear some of the confusion.

Meiraware Business

Awhile back, my buddy and co-worker Jayme launched a simple invoicing site named Meiraware Business. The site is perfect for managing and tracking invoices, and makes me *really* wish it was around when I was independent because invoicing was about the only thing I used Quickbooks for. But anyway, Jayme has added quite a bit of polish to the site and recently added the ability for people to use a live demo, which I think is an awesome way to help create "sticky" users.

If you need a simple invoicing solution, you should check it out. Jayme's done a great job and the pricing plans are inexpensive.

CommitMonitor

If you use Subversion for source code control, you owe it to yourself to get CommitMonitor. This little utility monitors any Subversion repository for check-ins and displays a system tray notification popup when a new check-in occurs. Jose tipped me off to CommitMonitor awhile back and it immediately became a must-have tool.

The tool is free and takes up very little system resources. Enjoy.

Community Server 2008 Beta 2

It seems like forever ago since we released Beta 1, so it's great to be able to let everyone know that Beta 2 for Community Server 2008 is now available (official announcement, overview, and downloads here). As stable as Beta 1 was, Beta 2 is even better with a new theme, enhanced functionality, tons of fixes, and of course performance improvements. The communityserver.org site is already running it and I'll be upgrading ScrapNova to those bits in the next couple days, that's how confident we are with this build.

Take a look and let us know what you think.

Microsoft Manual of Style for Technical Publications

Back when I posted about UserName or Username?, my friend Jennifer left a comment about a book named Microsoft Manual of Style for Technical Publications. I'd never heard of it, but if you knew Jennifer you'd know that it's *not* surprising she knew about it.

Anyway, I've been doing lots of API work lately (as usual) and figured it might be good to have some sort of reference on hand for stuff like UserName or Username and was thinking of picking up this book. It's got pretty good reviews; does anyone out there have it? Is it worth picking up?