It wasn’t real until I saw my name on the schedule.
Monthly Archives: March 2008
‘I’m pleased to let you know that the following sessions have been approved:
- An Introduction to Castle ActiveRecord, or Stop Writing CRUD
- Ouch, that hurt! Lessons Learned from an Agile Project”
I think I’ve been to Indianapolis exactly once and that was just passing through a few years ago on my way to St. Louis. I’m looking forward to giving my talks, meeting new people and checking out some great technical sessions. I’ll most likely be in town a day early, so if you’re in the area and want to get together and shoot the breeze, let me know!
From the website:
“The Indy Code Camp will consist of 70-minute sessions. There are four tracks with six sessions per track. Simple math results in 24 sessions to be delivered by a sterling group of developers from Indiana, Ohio, Michigan, Tennessee, and Kentucky.”
“We are able to accomodate 250 people at Indy Code Camp. This event will definitely sell out. Register today to ensure admittance!”
If you’ve never been to a Code Camp and are within a few hours of Indy, I really suggest you check it out. These are not your typical vendor-sponsored conferences with lots of marketing fluff. Code Camps and the Days of .NET are jam-packed with technical content from top to bottom. The talks are almost always given by local developers that have no agenda other than to help make the world of software development a better place.
Wow. What a great time!
My friend Jeremy and I headed to Livonia Monday night so we could avoid getting up at 5am and making the 2-hour drive. After checking into our hotel, we headed over to Docs Sports Retreat and met up with Keith Elder and some of his Quicken Loans buddies. Did I mention it was St. Patrick’s Day? We got to the bar around 9:30 or so and didn’t leave until 1:30. Good times, although getting into a deep technical discussion after a few drinks is not recommended. Even with the alcohol, Keith couldn’t stop talking about his love for NHibernate. Just kidding. Actually, we managed to carry on a pretty coherent conversation about CSLA, the 80/20 rule and scale of development.
Tuesday morning we were out the door by 8 and were in the Ren Cen and registered by 8:30. I spent the first hour or so hanging out at the Sogeti booth talking to my friend Mike. I also made the rounds checking out the vendors — it seems like at the 2005 launch event there were a lot more…who knows. After the keynote, I ran into Joe Wirtley and ended up hanging with him and Jeremy most of the day. Throughout the day, I ran into a bunch of people from my twitter/blog list including Jason Follas, Dustin Campbell, Jay Wren, Steven Harman, David Redding, Michael “the artist formerly known as MichaelDotNet” Letterle, Josh Holmes, Jeff Blankenburg, Jeff McWherter, Jim Holmes, James Bender…ummm….god, I’m sure there were more…sorry if I missed you. Did I mention that it’s always cool to have someone come up and say, “hey, I follow you on twitter!”
I ended up sitting through a couple of the developer sessions including one given by Brian Prince and Jeff Blankenburg which was pretty entertaining. I saw a couple of new things, but for the most part, I had heard it before. Keith Elder’s session at the end of the day was good, if not a touch too long, but since Brian and Jeff went long, that pushed everything back a few minutes. By the time Keith’s session ended, we were all ready to head out for the Geek Dinner, but it took about 30 minutes for a small group of us to finally get our act together and head out of the building.
50 geeks in a room, talking tech, eating pizza and drinking…it doesn’t get much more fun than that. I sat with MichaelDotNet (dude…you will *always* be known by that name no matter how hard you try), Corey Haines, Jeremy and one other guy….ugh….forgot his name – I know he drove up with Michael and Corey. While the food was good (oh, BTW, a HUGE thanks goes out to Microsoft for picking up the food tab!), the conversation was better. The brainpower in that room was staggering and that was just with Jay, Steven and Dustin. I got a chance to talk to Steven Harman and MichaelDotNet (see…I told you) about an idea I’m working on and finally scored some time (tough to do) with Josh Holmes to discuss the same idea (a follow-up from when I spoke at NWNUG). Look for more on that in a future post. Huge thanks go out to Keith for organizing the geek dinner!
After dinner, about a dozen of us headed over to the MGM for what we hoped would be a long night of winning, but no such luck. Keith, Dustin, Jason, Jeremy and I shared a cab…Keith in the front seat and the rest of us crammed in the back seat like sardines (or clowns). Our time at the casino was short-lived. The craps table was cold, I wasn’t about to sit at a $15 blackjack table and I don’t play slots. After about an hour or so, the group started dissolving as people hit their threshold for losing and hopped back in their cars to head home. The five of us grabbed a cab back to the Ren Cen — this time we scored a van, so it was much less cramped that our trip to the casino. Jeremy and I ended up getting home just after midnight
While the launch event itself was ok and I did score some free software (including Vista Ultimate), 99% of my reason for going was the people I knew I’d see. I was not disappointed. The cool thing is that I’ll probably see most, if not all, of those people on April 19th.
As I mentioned in a previous post, I was selected to speak at the Central Ohio Day of .NET. The session list was recently released and it looks like it’s gonna be an awesome day! As Dan mentioned recently in twitter, it’s a “who’s who of twitter”. I’m excited to finally meet some of my twitter friends in person and to soak up lots of knowledge.
April 19th is coming fast! Registration is still open, so if you haven’t signed up for this free event, do it now!
In May 2004, I wrote a post titled ‘Writing 16-bit code in 2004‘. A few days later, I followed up with this post, ’16-bit development in 2004 revisited‘. Another post followed that one: ‘More 16-bit fun revisited‘. These posts discussed an application I wrote using Delphi 1.0 in early 2004. The application I wrote was supposed to be in production for no more than a year since it was simply a stop-gap while my client pushed ahead with upgrading Windows and implementing a full 3rd party solution.
While that client and I still keep in touch, we haven’t really discussed that application in quite some time. I’m not sure how the topic came up, but I found out at lunch yesterday that the application is STILL being used today even though all of the systems have been upgraded to 32-bit operating systems. For some reason, that 3rd party solution was never implemented and they have continued to plug along my solution. I heard they just put some money in the budget to replace my app. Hopefully I’ll be part of the RFP process because I’d love to re-write it using current tools.
After submitting two sessions late last week, I just received confirmation that one of of them was selected and I will be speaking at the Central Ohio Day of .NET on April 19th. The topic will be “An Introduction to Castle ActiveRecord, or Stop Writing CRUD!” I’m really looking forward to giving this talk and introducing people to this great tool!
See you in April!
Every town has at least one “computer repair” business – you know, the guys that charge $100 to clean your PC of viruses, install programs, add new memory, etc. I’m “lucky” enough that my town has a few such businesses, but you know what? They’re clueless. Yep, I said it. They. Are. Clueless.
Let me explain how I reached that conclusion.
A few days ago, my wife got into a conversation with the helper in my son’s pre-school class. She had mentioned how she took her computer to one of the local repair places to get spyware/adware/viruses cleaned up. It cost her a couple hundred dollars by the time she was done, but she gladly parted with the cash in order to get her computer in working order. Guess what? Shortly after getting her computer home, she noticed a tray icon that kept popping up a message that her computer was at risk and she needed to get it fixed. Clicking on the toast that popped up took her to a web site that tried to sell her software to “fix” the issue. Whatever.
She called the repair guy back and complained. His reply? “Wow, you’re just unlucky I guess. Bring it in and I can take care of it.” She said, “will I still have to pay the $80 to get it fixed?” Believe it or not, the guy said, “well, it might cost up to $90.” WTF? Wow. Uncool. Shouldn’t this guy have said, “wow. I missed something. I’m sorry. Bring it in and I’ll take care of it.”? It was at this point that my wife asked if I’d take a look. While I generally dislike doing stuff like that, I said I’d see what I could do.
A newish Dell desktop computer was dropped off at my house along with a description of the problems she was having. I hooked it up to a monitor, keyboard and mouse, but did NOT connect it to my network. I booted the system, and when XP finally loaded, noticed there were 6 accounts on the system – 2 adults and 4 kids. None had passwords on them and all were “admin” accounts. Ugh. Ok, moving on. Logging in as any one of the users, I was almost immediately presented with 2 things: McAfee AV was installed and the message she complained about popped up. I poked around a bit, seeing what apps were in the startup group, what apps were being started from HKLM/Software/Microsoft/Windows/CurrentVersion/Run and HKCU/Software/Microsoft/Windows/CurrentVersion/Run. Nothing unusual in either place.
Since the computer wasn’t hooked up to the network, I clicked the toast that had popped up (and continued to pop up every few minutes) so I could see where it was trying to go. Once I knew that, I headed to my computer to see what a search would come up with. Within a few seconds of searching, I found details on the virus (because that’s what it was), printed out instructions for manually removing it and headed back to the Dell. Guess what? None of the files listed in the instructions were there. Hmmm…
After some more searching, I decided there must be something else going on, maybe a rootkit had been installed. Off to sysinternals to grab some of the great utils! I copied rootkitrevealer and autoruns to a USB key and once again headed back to the Dell. I wanted to see if I missed something in a startup location, so I ran autoruns first. Unfortunately, I still didn’t see anything out of the ordinary, so I ran rootkit revealer which ended up finding NOTHING. Hmmm…interesting.
Having already spent more time on it than I wanted (less than an hour), I started killing off processes hoping I’d figure out which one was displaying the tray icon. No luck. Ok, back to sysinternals to grab process monitor. My plan was to click the icon in the tray to see what processes were involved. Before doing that, I excluded several known processes from the display so I could better focus on the issue at hand. I noticed that when I clicked the icon, iexplorer.exe was about the only process that was launched, but guess what? I could view the stack to see exactly what files were involved.
As I scanned through the list, I found one of the files listed in the original removal instructions. Hmmm…I had already checked sys32 and couldn’t find the file, but here it was, big as day, being used by this process. I hit the command line again, but this time, instead of just doing a cursory “dir”, I did an “attrib” on the filename and found it — marked as HS (hidden and system). I removed those attributes and then tried to figure out how to get rid of it. I couldn’t delete it since it was being used, but I was still curious how in the hell it was being started to begin with.
I fired up autoruns again and went very slowly through the list. GRRR…I had actually missed something on my first pass. Once I disabled the item so it would no longer run on startup, I rebooted. Aha! Once the machine restarted that tray icon was no longer there, so I hit the command line, navigated to sys32 and deleted the offending file! Just to make sure I didn’t miss anything, I rebooted again and then logged into each account (did I mention that none of them had passwords?) Everything looked good!
Before giving the computer back to her, I talked to her about locking the system down a bit. She agreed, so after some other cleanup (temp internet files), I set each of the kids accounts to be “limited” and I placed a password on the two adult accounts. That way, the kids would have a much tougher time installing crapware and they’d have to go through mom or dad. Hopefully limiting those accounts will stop this from happening again. Of course, it could have been mom or dad surfing some questionable site, but that’s none of my business.
Ok, so back to me saying the local guys were clueless. It seems to me that if you’re going to be in the business of cleaning up computers for people (which, BTW, I’m not), you should know how to track this stuff down and fix it. Don’t tell your customers, “oh, you’re just unlucky” and then charge them $100 to fix something which should have been fixed to begin with! Maybe I’m wrong.
What do you think?
I wanted to let any RSS subscribers out there know that in the next day or so, I’m going to be switching my feeds to use FeedBurner. It should be a quick and easy transition, and if all goes well, you won’t notice the switch or have to change any settings.
A few days ago in twitter, Justin Kohnen said “I really don’t like having to touch the production database. It goes against my core principles.” Almost immediately I replied with “my last W2 position…1st day. me: ‘where’s the dev/test database?’ boss: ‘yea, we don’t have one of those. use prod.’”
A couple of tweets later and I was inspired to write about that particular gig and how I was able to bring some order to an extremely chaotic development environment. When I left it was still chaotic, but I can definitely say I did my part to make future developers’ lives easier.
Note: Once again, I am NOT using real names.
In early 2005, I decided to take what I hoped would be a long-term break from consulting. The company I joined isn’t much more than 5 minutes from home, the pay was really competitive and the work itself looked promising. I was actually hired to move them into the .NET world since, in 2005, they were still actively developing in Visual Basic 6. After my initial orientation and training, I was looking forward to diving in and contributing to the development effort.
The conversation I related in twitter did happen. Shortly after my training was complete, I went to my bosses office (Jon) to ask about getting started. After some hand-waving and scribbles on the whiteboard to show me how extremely complex the application was (typical of most meetings with this guy), he told me to get with one of the other devs (Mary) for instructions on grabbing the source code. Cool.
I gave Mary a call and said something to the effect of, “Jon said you could help me grab the latest source so I can start digging in.” Silly me. I was expecting something simple like “point your VSS here and get latest”, but noooo….that was not to be. Instead, I was told to connect to the “enterprise” server (which was actually a ratty-ass old desktop that was on its last legs, but that’s another story), copy all the sub-folders from “enterprise” to my workstation and open the project I needed. Keep in mind, this was a VB6 application that consisted of 50+ projects (mostly COM objects ala Windows DNA). Anyway, by this time, my head was about to explode when I said, “what? you guys aren’t using any source code control?”
Here’s where it gets bad…her response? “Source code control? What’s that?”
I asked her what happened when two developers needed to be in the same *project* at the same time. Notice I didn’t say “file”, I said “project”. She replied with, “oh, we don’t do that.”
I have *always* used some kind of source code control, so I was completely blown away by this. As crazy as it sounds, I actually had a tough time sleeping for a couple days after that.
Ouch. Ok. What’s next?
Not too long after that experience, I was given my first real assignment — figure out why a report wasn’t working correctly. I don’t remember the specifics, but at the time, I was chomping at the bit to get some real work done, so I said “no problem!”
I “got latest” — yea, I copied code from the so-called server to my dev machine and started digging into this particular issue. In order to gain better understanding of this issue specifically and the overall system in general, I checked to see where the report was getting its data. I figured once I knew what stored proc the report was using, I’d be able to dive into the database, run some queries and figure out why the report wasn’t working.
Ok. Easy enough, right?
Boss: How’s it going with that report?
Me: Fine. Uhh, I want to run some test queries. Where is the test database, or better yet, the development DB?
Boss: Yea. We don’t have those. You’ll have to use the production database.
Me: Ummmm, ok. I’ll let you know how it goes.
So, within my first two weeks, I discovered they didn’t use SCC and they had no real development environment. Not cool.
Note: At this point, I’m sure there are some readers saying, “dumbass…didn’t you ask questions during the interview?” Yea, I did, but honestly…in 2005, who the hell wouldn’t be using source code control or understand the importance of having a development / test database? Geesh, give me a break.
Making things better
I pushed on and fixed the report issue, making sure to do a diff before “checking my code in” (lol, that sounds so stupid when all I was doing was copying my files back to the server). At my status meeting that day, I asked why they didn’t have dev or test databases to work on? In fact, I went so far as to ask about the lack of SCC too. Oh, did I mention they had no issue tracking system in place either?
While I can understand his answer, “we’re all too busy”, I had a hard time accepting it. I mean, c’mon, I know everyone was busy, but how tough it is to setup SCC (even it it was just VSS)? How tough is it to grab a SQL backup and restore it somewhere else?
As it turns out, the SQL backup was an issue since the production database weighed in at around 80GB, but I knew I could come up with something. From that point on until the day I left, I made it my mission to improve things as best I could.
Source Code Control
It actually took a lot of convincing to get my boss and the other devs to see the value in source code control, but I kept pushing (gently, of course). Finally, my boss relented and told me to provide a recommendation. I knew I didn’t want to use VSS, and at that point, I wasn’t familiar enough with CVS or SVN, so I picked SourceGear Vault. I liked Vault because it uses SQL Server as its back-end instead of being file-based like VSS.
The easiest part of the whole process was importing all the existing code — that took about 20 minutes. The hardest part was convincing the team how important source code control was and explaining all the benefits. My boss was an easy sell, but a couple of the other team members took more convincing. I provided everyone with ample notice of when the file share would be closed. Over the course of a few weeks, I provided everyone with a written tutorial for using Vault as well as providing them with in-person training. It was a huge mindset change for them, but eventually everyone bought into it and started using it. Since everyone was so new to the concept of scc, I wrote a small app that emailed everyone a list of their checked out files each morning.
Along with Vault, I also convinced my boss to invest in SourceGear Dragnet for issue tracking. The only issue tracking they had in place when I got there was the IT Help Desk web site and notes my boss took during meetings. Neither was acceptable in my opinion because a) the developers almost never looked at the help desk web site and b) notes always got lost. Dragnet allowed us (the devs) to have full control over our issue list. I wrote a small app I scheduled to run every morning which emailed all the devs their open issues. This really helped!
A Dev/Test Environment
Getting everyone to use source code control was a huge victory, but it wasn’t enough. I had to get them away from their old practices of using the production database to test against. One of the first things I did was grab a SQL backup (yea, all 80gigs) and began trimming away all the fat I could. Since it was also used for testing, there was a “metric buttload” of temp tables I was able to drop. I also trimmed some of the larger tables down to a few hundred rows instead of millions. In the end, I was able to get my copy down to a reasonable 20GB. I also scripted the entire database and checked the scripts into Vault.
Once I had the database trimmed down, I had to figure out where to host it so the other devs could use it. My first thought was to use one of the existing servers, but decided to go the virtual route instead. I ended up building several virtual machines (using Microsoft Virtual PC / Virtual Server) including:
I also built a couple VMs for client testing.
By the time I left, I had taken them from no development environment to a full-blown virtual environment that included development, testing and staging servers. I had made it possible to fit a copy of the database on a laptop, brought in a great issue tracking system and most importantly of all, gotten them to use source code control.
You know what’s crazy about the whole thing? While I was brought in to help move them to .NET, when I left they were still actively developing in VB6. I personally worked on several projects while I was there that used .NET, but my boss never let me work on moving the main application to .NET. I heard they finally did move to .NET, but it was at least 6-8 months after I left before that happened — and they ended up outsourcing/offshoring most of that work. :-\
If you read my blog on the web (and not through a feed reader), you may have noticed that I recently removed the adSense ads and replaced them with a single ad from The Lounge. What you should see right now (March 3, 2008) is a quote from Pulp Fiction, but soon you’ll start seeing real ads.