Monday, September 20, 2010

Moving On

Not that many people probably read this blog (which is no fault but my own) but for anyone that still does I thought I'd let you know that I'm moving on.

You see I'm starting my own Rails firm called ProtectedMethod here in Columbus. Therefore any future blog posts I write will be posted on the company blog here.

Friday, April 23, 2010

Learning The Dark Arts of Debugging

Several months ago I had the opportunity to record an episode of

with Chris Woodruff and Keith Elder. The idea for the podcast started way back at Devlink 2009 where I ran into Keith at the speaker's VIP dinner. We'd both had a couple of drinks by that time and got to chatting about a lot of different subjects, one of which was the talk I was giving at the conference about production debugging. Keith thought it sounded like an interesting and relevant topic that they hadn't had on the show before so we struck a deal to get an episode recorded.

I put quite a bit of time and effort into synthesizing some of the most important information into a form I thought I could talk about over the phone. Even with all that prep work though I must say I was still pretty nervous on the night of the actual recording. I feel like at this point I'm pretty good in front of a crowd giving the talk when I've got slides and examples to show. I found out that trying to explain it all with just words can be a much more difficult endeavor!

All that aside though I think the end result turned out quite well. Probably thanks in no small part to some great editing work by Chris and Keith! ;) If you've already seen my talk in person there probably isn't a whole lot new to hear on the podcast, but if not I encourage you to check it out! I think there is definitely some useful info there in regards to where to get started on solving your next big customer problem.

Thanks again guys for having me on and keep up the good work of spreading tech knowledge to all your loyal listeners!

Monday, January 4, 2010

OS X: Essential Software for Developers

Favorite Mac Software

TextMate - The indispensable, extensible, text editor for all your programming and text editing needs.

MacPorts - Package / application management system. Easiest way to install thousands of apps and required dependencies without having to pull source recompile, yada, yada...

QuickSilver - Can't live without this if you are a keyboard junkie.

CleanMyMac - OK... I admit it... I'm *totally* OCD when it comes to PC cleanliness. The fact that I know that uninstalling apps doesn't get rid of all their related junk drives me nuts. CleanMyMac will fix that problem as well as many other routine maintenance tasks.

Evernote - You take notes right? Keep em in the cloud and synced across all your devices. With plugins for all major browsers, there is no better note client than this.

MacLoc - I like to be able to lock my machine without logging out and closing all my apps. Seems like something that should be built into the OS, but it doesn't appear to be there in OS X. This program solves that problem.

OmniGraffle- If you do any significant form of diagramming this is the tool for you.

p4Merge - This is the merge client I'm currently using and have setup with GIT. I hear Araxis Merge is the bees knees, but it's also not cheap. Really wish BeyondCompare had a mac version. *sigh*

Pixelmator - My photoshop replacement. It's an absolutely gorgeous (and affordable) app for those times when you need to get your hands dirty with some image editing.

SizeUp - One of the features I *love*, *love*, *love*, about Windows 7 was the new shortcut keys for sending windows around the screen. Either to certain positions / sizes, or to other monitors. Also one of the hardest things I've had to get used to on OS X is the non-windows way in which window management is handled. SizeUp solves this issue for me by giving me back the windowing features of Windows 7.

Tweetie - My twitter client of choice. No holy wars here, just the one I like the best.

Growl - Get notifications of events happening on your system in an unobtrusive way.

iStat Menus - Ever want to know what the hardware on your mac is doing? This program will tell you at a glance on the menu bar.

VMWare Fusion - Great virtualization app for running your Windows VMs. One mistake I made was not creating a partition for my windows installation thereby allowing me to boot into it natively using bootcamp, or as the VM from inside OS X. One of these days I'll correct that.

Visor - Gives you a globally available terminal window available from a hotkey. This one is the hotness for developers who find themselves using the terminal a lot.

AutoTest + Growl - Not really an application per say, but I love the autotest/zentest tool as a way to help guide my TDD. This will automagically monitor a folder containing some ruby specs and run the corresponding specs every time you save either the spec, or the source file. Set it up with growl and you will be notified by growl about whether your specs passed / failed. Also recommend setting up the fsevent library to reduce CPU overhead and save yourself some battery life.

Wednesday, September 23, 2009

Software Engineering Conference 101

Today I was honored to be a presenter at the Software Engineering 101 Conference organized by Jim Holmes in Columbus OH. This was a great little conference idea put together and organized by Jim as a way to get back to some of the basics people need to know about developing good software. There were sessions on things such as OOP, SOLID, TDD, and of course my talk on debugging.

The great thing that set this conference apart for me from many others I've attended in recent memory was that there was a very high degree of new faces in attendance. I attend a fair amount of events and so have come to at least be familiar with a lot of people in this region so I was surprised by this. The same sentiment was echoed by my fellow speakers who all agreed with me that this is a great thing! These are exactly the people we want to be reaching out to as speakers and helping to learn new and cool things that they can then take back and share with their coworkers and peers.

I can't claim to know everyone's thoughts on the subject, but for me that is the reward I feel from giving back to the community through speaking... The sense that maybe I served as the spark that started a fire that will continue to grow and spread carrying good engineering practices with it. The more we all pitch in to educate each other, the better all of our lives are going to be.

Slides for the talk can be found here. These are the Devlink specific version, but 99% of the content was the same I talked about today.

Thursday, August 27, 2009

Dayton .NET UG Presentation Followup

Big thanks to Joe Wirtley, Jim Holmes, and Justin Kohnen for hosting my talk on Production Debugging last night at the Dayton .NET User Group. Thanks also for all the attendees that came out to learn something new! The feedback was tremendously positive, which makes the experience for me as the speaker very rewarding.

During the presentation Joe suggested that I post some links here about how to setup Symbol/Source server, which I think is a fantastic idea. So the best links I've come across to get all this stuff working can be found here:

Setting up a Symbol Server
Setting up Source Server

In addition for more great reference material on symbols, debugging, windbg, etc... please see my del.icio.us bookmarks here. I have many items tagged with "debugging", "windbg", "symbols" and other terms I talked about last night that represent the best links I've found from across the web over the years I've been doing this.

For presentation content please see the link in my post about my presentation at Devlink, as the content is 99% the same.

Saturday, August 15, 2009

Devlink Conference

Got back a few hours ago from the Devlink conference in Nashville TN. Kudos to Jon Kellar and all the other folks that worked extremely hard to put together a great conference. Thanks again to those same people for giving me the opportunity to speak to other passionate developers at such a great venue. My experiences at this conference opened my mind in some ways I wasn't expecting (which I'll blog about later once I find the right words to say what I want to say).

As a followup to my presentation I wanted to add the answers to the two questions that were asked that I didn't have good answers for at the time.

1) What permissions are required to use ADPLUS.vbs to get memory dumps?

Extensive searching on google for the answer to this question turned up no results. I know that for visual studio remote debugging however things tend to work much more easily with admin privileges. I imagine the same would be true for ADPLUS. If anyone does happen to find a definitive answer to this question please post it in the comments for all to share!


2) Do these techniques work for the .NET Compact Framework?

From the research I did I could not find reference of anyone using WinDbg to debug memory dumps of .NET CF applications. I did however find this blog post describing how one could go about finding memory leaks in a .NET CF application that I thought might be useful.

Thanks to everyone who gave feedback on my presentation! I had a great time doing it and I hope that everyone in attendance was able to learn something useful from it. You all are the reason I keep doing this so I can't say thanks enough for all the kind feedback I've received.

The slides / example scripts can be found here. (Note that the virtual machine is too big to host anywhere, but you can always download the BuggyBits application source from Tess's website.)

Saturday, July 25, 2009

A Programming Renaissance Affair

So I've been experimenting a lot recently with Ruby during my free time. Writing some simple applications and exploratory tests to help learn the many interesting nuances of the language. The feeling that has consistently struck me throughout this period is one of profound... freedom. At first I thought that this feeling was merely a reflection of the expressiveness of the syntax, the abundance of helpful libraries available, or the way things just seem to work. I still think those things are a part of that feeling, and I'll dive into those with more detail later. After significant further reflection though, I'm starting to believe that there is a much deeper reason for those feelings as well...

In my daily work I primarily write .NET code using all the fancy visual tooling of Visual Studio and R#. The work I've done in Ruby thus far has been something of a programming Renaissance for me. For the Ruby work, I've been working with primitive tools (SCITE, command line, etc...), and as a dynamic interpreted language, Ruby necessarily lacks a lot of the static type trappings and compile time warnings of languages like C# or Java. This has been quite a change for someone like me whom has said on numerous occasions that I don't know how I would live without R#. It's been a very different experience programming with almost no fancy visual tooling. Most strange indeed because I haven't missed any of it one bit! I've heard similar phenomenon described by other rubyists, but never understood or believed it until now.

Which brings me back to the main point I'm getting to. I've been reading Uncle Bob Martin's clean code tips of the week recently which have had me ruminating quite a bit on the various topics of code quality. It was Clean Code Tip of the Week #9 however that really got me thinking. In this tip the intrepid adventurers are recounting tails of a time in the past when it took 24 hours to run a program on punch cards. Because of this they spent inordinate amounts of time manually reviewing their code to make sure things worked right, and consequently they had very few defects. We live in a golden age compared to that were compute resources are cheap enough and fast enough we can let the computers do a lot of that heavy work for us. This all seems great on the surface, but I'm beginning to wonder if all these advancements in technology don't have a much darker un-talked about downside.

One thing I have definitely experienced during my renaissance affair with Ruby, is that I've felt myself thinking much more carefully about the code I was creating. Without static typing to warn me at compile time about type mismatches, and things like intellisense to easily discover parameter and method return types it becomes much more important to pay attention to the details of variable naming, parameter counts, object orientation, etc...

All of this begs the question in my mind of: have advancements in technology, and visual tooling actually been making us dumber or lazier by allowing us not to exercise our brain? Biologically / psychologically speaking, as I understand it, our higher-order brain functionality is one of th key characteristics of what makes us humans. If we offload too much of that processing to machines, what is left to define us as humans? Not directly related to programming, but I certainly know I'm not alone in thinking about these issues. Some time ago Rick Strahl blogged about how he felt as though the rise of search technology has been diminishing his mental capacity. His blog post (which I can't seem to find at the momemnt) very closely echoed my own thoughts on the matter. If we can search anything at a moment's notice why do we need to remember it? Are we stifling our own creativity and innovative capacity by having any answer we desire readily available at our fingertips? Are we as programmers (and indeed society in general) doomed to head down a Wall-E esque path of increased technological oversight leading to humanity's complete inability to do anything for ourselves without assistance?

Perhaps more importantly, or at least more approachabble is the question of are these tools really needed? The claim of course is that they are productivity boosters, but is that really the case? Having witnessed some true Ruby experts at work it was nothing short of amazing what they could accomplish in an hour with nothing more than VIM. As another example, I used to work on software written in an obscure language called DIBOL on VAX/ALPHA systems. There was no such thing as a GUI on these systems so your only option was to use a good text editor such as TPU. When I first started that job, coming from a windows background I railed at the lack of intellisense, etc... and sought ought and found a windows based text editor that would at least give me syntax highlighting for this obscure language. I convinced the company to buy me a copy and spent several painful weeks working with it. It was a ridiculously painful process because I would edit the source on windows and then have to FTP it to the VAX to compile and run it. After witnessing my boss crank out some code like nobodys business with TPU I finally broke down and decided to learn the tool. Within a few weeks I whipping out DIBOL code like I'd never done before and my productivity only continued to increase as my familiarty with TPU became greater. I know that Jimmy Bogard recently had a similar experience at the NFJS conference where he witnessed Stuart Halloway a Clojure master complete an absolutely insane amount of work in an hour using Clojure. I certainly think that there is some evidence at least to suggest that these so-called productivity boosting tools are just a band-aid for deficiencies in some of our common programming languages.

Don't get me wrong, there are some *great* things about R#, VS, etc... and certainly people can use these tools effecively without writing crappy code. I do wonder however it wouldn't be better to make these tools something that people have to earn over time through demonstration of mastery without. If we give new programmers in college all these tools right from the get go, and they become dependent on them to help them write clean code, will they still be able to stand on their own when the crutch has been removed? Will allowing tools to point out all the smells in their code for them cause them to be blind to the smells they create when the tools are not present?

An exercise for the reader is to create a reasonably complex system using your statically typed language of choice and your favorite visual tooling. Then create a reasonably complex system using Ruby and a basic text editor. Come back to both after a few months and see which is easier to reabsorb. Another exercise is to spend some time watching someone who is a true expert with an alternative language at work for a while without all the fancy tools we have in .NET. I think the results might be eye opening.

All that being said, I am totally loving the Ruby language and all the tools that have sprung up around it. As I said to someone else recently, once you pierce the veil of static typing as being some kind of safety blanket you can stop worrying about angle brackets and interfaces and just get down to business. Ruby is just that... a language designed to get out of your way and help you get things done. Rarely have I found what amounts to reading a reference novel for a language an enjoyable experience, but the Pickaxe has truly been a fun read. Also some of the frameworks built-up around Ruby are completely amazing in their simplicity and power. Things like Sinatra, Heroku, etc... make it incredibly easy to get a site up in running (the way YOU want it) in no time flat.

Along with Ruby has come my first exposure to GIT which at least from my limited experience thus far seems like "source control done right". I've got a lot more reading to do on the topic, but so far I think TFS and heavy-handed SCMs are for the birds.