This was my first time attending CodepaLOUsa, and I was not disappointed. The always entertaining Carl Franklin got things rolling with a nostalgic keynote on his history in development. The highlight was a hilarious story involving well chosen pictures that you really must see to appreciate. I even got a chance to visit with Carl afterward for awhile. I’ve enjoyed listening to Carl on .Net Rocks for years so it was great fun to finally get to talk tech with him in person. He’s a genuinely nice guy for sure.
The Class that Knew too Much: Refactoring Spaghetti Code
Matthew Groves’ talk was particularly interesting for me since I’m leading a refactoring pre-compiler next week at KCDC with a couple friends. I picked up some new jargon I haven’t heard before: Sawtooth code. I’ve typically called this arrow code based on an old Jeff Atwood post, but I really like Matt’s analogy for picking the “biggest tooth” for refactoring to a method first. You knock out the deep indentation one step at a time. Matt had a thought provoking point about considering what would have to change to impact a given class. I liked his example of asking “If x changed, would this class be impacted?” It’s a handy way to sniff out when you’re breaking the single responsibility principle or your abstractions are leaking.
As a PostSharp MVP it’s no surprise that a big focus for Matt’s refactoring session revolved around Aspect Oriented Programming. I really admired his balanced and methodical approach to considering when various approaches to AOP make sense. Making decorators by hand before moving on to dynamic proxies or IL weaving via PostSharp assures that you understand the benefits of the more powerful and automated approaches. I’m looking forward to Matt’s upcoming book on Aspect Oriented Programming for a more in-depth discussion on the merits of these alternative approaches.
Using SignalR to Build Real Time Applications
I had an epiphany in Kevin Griffin’s SignalR talk. I’ve always thought of SignalR as a tool to augment a “traditional” AJAX app in places that need server push or real-time client-side updates. But he pointed out that the decision may come down to an either/or. Once you have a continuous pipeline setup through SignalR, creating and maintaining ad-hoc calls to a RESTful API doesn’t make much sense. It’s extra work with lower fidelity! Kevin chose a great example app that steered clear of the cliché examples in this realm, and I loved his idea of having the class vote with their devices to see the app respond real-time. This was such a fun use of a unique responsive technology.
Kevin momentarily stumbled over casing issues in JS while configuring his SignalR hub real-time, and it was no surprise to me. Like many, I still struggle with switching between JavaScript and C# casing conventions, and SignalR really tempts you to copy and paste between the two to save typing, which exacerbates the problem. That said, it’s very impressive how little code you have to write to get cross-browser responsive apps via websockets, server sent events, and long-polling in SignalR.
Finally, in an unrelated note, Kevin mentioned the new Wijmo extensions for jQueryUI. This library looks really impressive and adds a significant amount of polish and functionality on top of jQueryUI that appears to rival KendoUI.
Functional Testing with ASP.NET MVC
As a big fan of Los Techies and AutoMapper, I was excited to see Jimmy Bogard’s talk on functional testing. Jimmy is methodical and he consistently finds novel ways to keep his code dry. His session on functional testing was an eye-opener for me and covered techniques I’ve never seen before. While I’ve used Selenium in the past, I ultimately abandoned it after seeing how brittle my tests were. Jimmy didn’t give up like I did. He wrestled an app with over 300 controllers into an automated functional testing suite and showed up to share lessons learned from the battle. He addressed core problems I’ve had with brittle functional tests using Selenium and Watin in the past.
I loved the idea of creating a static class containing constants that are leveraged by both the UI and the testing code, and leveraging separate tags like rel that are semantically the right tool for the job. They’re also far less likely to change than text or even the id. Placing the data in a static class also assures the references are strongly typed (and thus, easily refactored and DRY). Jimmy also outlined a novel approach for leveraging your ViewModels in MVC to hold the properties necessary for testing in a central spot. Sadly, my session immediately followed his so I had to step out early and couldn’t chat, but thanks for contributing good stuff to the community Jimmy!
Becoming An Outlier – Career Advice for the Developer Mind
I closed out the conference with my “Becoming an Outlier” session, and I was really excited about the response both during and after. This talk is easily my biggest risk so far since it’s only generally technical and there’s no actual code involved, but it was a big relief to have so many people come forward and share their excitement for the topic of continuous deliberate improvement. Many expressed excitement about a message they could relate to and assured me that they’re like-minded. I even landed a great dinner out of the deal – Nathaniel Jones and his uncle James took me out to a great local restaurant afterward. Thanks again guys!
Wrap up
If you’ve never participated in Carl and Richard’s 64-bit Question, you’re in for some fun. This was a hilarious way to end the day and I enjoyed this novel approach to giving out prizes.
Chad Green picked an excellent venue for the conference and all the rooms we’re well sized and equipped with large screens. The food was exceptional and the schedule allowed nice amounts of slack time in-between sessions for conversations. Kudos to Chad on organizing a really successful conference!
Thank you, you’re very kind. I had a great time speaking, and was amazed that there was so much interest and lots of good questions and discussion.