If there is one thing that I have learned throughout my career, it is that I need to do what I do because I love it. I need to do what I do for me. There can be no other reason: not because someone else wants me to do it, nor because of recognition from another person or organization, nor for the money or the stature. Wherever direction I take in my career, it must be because of my passion for the craft and my drive to improve. Awards, money, and fame are all welcome side-effects that let me know that others like what I do and think I do it well—this recognition is still rewarding, and even more so, is an essential component to self-improvement—but that is all for naught if I don't like what I am doing or I don't think I am doing it well. Awards, money, and fame should purely serve as feedback, and not as motivation.
I first got into computers because I wanted to see how they worked. My mother bought the family's first computer while I was in high school, and I ran all of the little programs that inexperienced users are never supposed to run. I ran them simply because I wanted to see what they did, what purpose they served, and what would happen if they were run by a novice user like I was at the time. I didn't stay a novice for long, and I became quite adept at fixing broken systems, including everyone's favorite command: format c:. I had to; it was the family computer, and if I broke it, I had to fix it quickly or suffer the consequences.
Soon, the door to programming was opened to me, and an entirely new frontier was available for me to explore. With a shiny new copy of Visual Basic 3, I now had an opportunity to write my own programs to learn and manipulate that computer to an even greater degree. Now instead of black box programs doing bad things for unexplained reasons, I had the opportunity to create my own evil-doings. Whether it was creating sprite-based side-scrolling video games to blow up baddies or an investigation into "I wonder what this module does," the opportunities—and the imagination—were endless. Memory management and boot configurations for optimizing frame rates in Doom transformed into a passion for performance optimization of enterprise-level applications. Finding better ways to mail-bomb friends' AOL accounts without getting banned led to an obsession for managing resources outside of immediate control. And those awful GeoCities and Tripod sites filled with animated lava lamps and blinking text instilled both a drive for a better user experience and a need to expertly manipulate the search engines in my favor; I wanted users to find my little flag in the internet sand and to enjoy their stay once they arrived.
But somewhere along the path, I lost my way.
I don't know how it happened, but it did. I lost my focus on pursuing the craft for me, and was guided by external influences. I experienced burn out, an inability to engage, and a complete lack of drive for what I had grown up doing. My passion was gone. Blogging became more about keeping a schedule than it was about learning new things. Community involvement became more about the pursuit of recognition than it was about giving back to the community from which I had learned so much. Development became a chore rather than a thrill. Work became…well…work.
Last summer was my epiphany. I was one of the development leads for a client that I was working with, and my fellow leads and I were interviewing candidates for a development opening. Endless weeks of candidate after candidate left me feeling very uninspired. One night I came home and was discussing with my wife that I just wished one candidate—just one—was truly passionate about their craft; they would get my vote right away. I remember saying "I can teach them to code, but I can't teach them to want to code." And I remember that sinking feeling when I realized that I was describing myself, too. I was the uninspired developer.
I wouldn't hire me.
Since that time, I've been slowly re-energizing. I eased off of community involvement, my speaking engagements, my writing, and my pursuit of technology. I needed to assess my entire plate, and identify what I was doing for Me and what I was doing for Them. The items for Me were the only items that were kept. These Items For Me were the only items that could be kept, else it was a futile exercise and I would never reclaim my passion for my craft. It has taken a long time to process everything, to figure out what I loved and what I didn't, what was important and what wasn't, and above all how my passion stems from executing the plan with people and not for people.
Executing the plan with people, and not for people.
Early on in this process, I was working late at a client one night and a developer that I highly respect spoke simply over the cube wall, "it's good to have you back in the game, Jay." I had a long way to go on the new path, but at least I knew it was the right one. I wish that I could tell you how I did it, how I rediscovered my passion, but I think it would only dilute the message that it happened in the first place. You have your own thing, your own love, your own approach, and your own nuances. But you also already know each of those intimately, and you have either already found that passion, or are ignoring it in favor of what's easy, what's comfortable, what is expected of you, or worse, what has always been.
I challenge each of you to find your own passion. Pursue it. Realize it. Live it. Thirteen colonies proclaimed to the world that everyone has the right to pursue happiness, but do not confuse this with an entitlement to actually be happy; that part is entirely on you. Your right—your responsibility—is to go after it. Or as the Great Morpheus put it, "I can only show you the door. You're the one that has to walk through it."
Pursue your happiness. You already know what that thing is, and you already know how to do it. The only person not allowing you to be happy is you. So stop working against yourself, and walk through the door.
Knock, knock, Neo.
After seeing yet one more link on the internet attributed to Captain LoadTest, I figure that it is time to put a face to the nickname, plus associate it with any other mindless drivel that might spew out of my head in the next 10 minutes.
I am Jay Harris, the software developer. Not to be confused with Jay Harris the sportscaster on ESPN or Kay-Jay Harris the football player of the New York Giants. I am a senior software consultant, blogger, community advocate, and Microsoft Certified Professional in southeast Michigan, where I specialize in ASP.NET development and automated developer testing. Prior gigs, at least since moving to Michigan in 2003, include SRT Solutions in Ann Arbor working as a senior software consultant, a few years at Latitude Consulting Group in Howell as a Senior Developer and Performance Specialist, and time at Novations Learning Technologies in East Lansing as a Presentation Developer and Performance Specialist. Before moving to Michigan, my path includes several developer and developer-in-test positions at various companies throughout Western New York, and four years as student at Clarkson University, where I hold a Bachelor of Science in Technical Communications and a minor in Computer Science.
Throughout my career, I have focused on the full user experience. I am not only driven towards providing usable interfaces but I am also a strong advocate of practices and processes that improve quality through code, such as automated testing, continuous integration, and performance analysis. I am also active in the developer community, speaking at area user groups and conferences, serving as President of Ann Arbor .Net Developers user group, and organizing local study groups to help area developers pursue Microsoft .NET certifications.
- I enjoy restoring wooden furniture. I like bringing old, discarded, unloved furniture back to life. It fits well with taking existing code and making it better, taking a poor performing application and making it faster, or even when I was a kid rebuilding Legoland after yet another natural Lego-disaster.
- I am an endorphin junkie. Combine that with a high tolerance for g-forces, and I have an addiction for fast vehicles, extreme roller coasters, and crazy amusement park rides. I hope that I can soon add bungee jumping and sky diving to the list.
- I am not a Michigan Native; I am originally from Western New York. I was born and raised near Rochester, New York, and I moved from Syracuse, New York to Lansing, Michigan in 2003 with my wife so that she could attend law school at Michigan State. We like Michigan, but still consider ourselves tourists, and probably always will.
started it, and it sounds interesting, so I'll jump on the bandwagon, too. I need to post something
, and maybe this will be a good writing exersize to get the posts flowing again. So, in 500 words (exactly, not counting the bold questions), how I took a flying leap into software development. And feel free to post your own answers, too.How old were you when you started programming?
When I was 13 (1992) on the family's first computer: a shiny new 486DX2-66, with 8MB
of RAM, and those big-honkin' VLB I/O and Video cards.How did you get started in programming?
Before that computer, I had never used one before, other than typing class in school or playing
MathBlaster or Oregon Trail in the library. I destroyed that machine a quite few times by running every .com or .exe on the machine just to see what it did. (FDisk is a very bad application for the uninitiated to play with.) Knowing how the thing worked led to manipulating it for my own motives: a full set of startup configurations in config.sys/autoexec.bat to eek out every last Kb of base memory. Anything to make Wolfenstein or Doom run just a little faster. And the obsession with video games led me to start writing my own when VB3 launched in '93. Woo-hoo, I could write games!! And I could trash that computer even faster.
My mother bought a Iomega Ditto drive
to back up her files every night, so that when I trashed it she wouldn't loose anything.
I started playing around with web programming in mid-94 with my AOL account, and completely bailed in Windows programming in favor of Web in 1995 when I signed up for one of the first accounts on GeoCities
.What was your first language?
Batch Language. Or Visual Basic.What was the first real program you wrote?
A vertical scrolling shoot 'em up in VB3, similar to Raptor
(I loved that game) or Tiger-Heli
. Even made my own sprites and bitmaps in Paint!!What languages have you used since you started programming?
Classroom-only: C++, Perl, PL/SQL, Scheme
, and QBasic.
The first code-for-food was in 1995; I got about US$150 for building a few web pages Baypoint Communications.
The first full-time gig was in 1999 at Navistream in Rochester, NY (Now BrandLogic) as a New Media Developer. My college's career center didn't have any positions for Web Development, and I was having a tough time finding an internship. I weaseled my way onto the Career Center web site for RIT (near my home town) and found a posting for Navistream. I contacted the company directly and landed an interview. When the interviewer asked me how I found out about them, I told them the story. They were impressed with my initiative and I got the job.If you knew then what you know now, would you have started programming?
Yes. Absolutely. It is a little difficult at times, but it is definitely something I love doing. Unless I could have been a professional racecar driver.If there is one thing you learned along the way that you would tell new developers, what would it be?
Do it for You, not for Them. In this business, it is essential that you keep the passion and spirit that made you like programming in the first place, otherwise it becomes a chore. Find a company that will encourage that passion, and stay connected with other like-minded people through things like user groups, conferences, or even Twitter.What's the most fun you've ever had...programming?
I particularly enjoy projects that are off the reservation. Amazing things happen when developers get some down-time to go code whatever they want.
I need to just make time to blog. I’m finding that I am getting behind, further and further, as the bleeding edge of technology pulls out ahead of me. [sarcasm]Keeping up to date is hard.[/sarcasm].
I am working on a few things to try to get myself back up to speed, beyond just the on-going procrastination over Microsoft .Net 2.0 certification. Last month, I attended Jay Wren’s talk on IoC with Castle at the Ann Arbor .Net Developers Group. Though we’ve been using Castle within our LMS for a few months now, patterns is definitely one of my weak points in developer-land, so I did pick up a few concepts on Dependency Injection. It was a great talk, and I got some swag!
Last week it was back to AADND for Michael Wood’s talk on Windows Workflow Foundation. I haven’t had much any exposure to Windows Workflow Foundation other than to not call it WWF. This stuff blows me away, and makes me even more jealous that we haven’t converted the LMS out of .Net 1.1. I wish I could have made it to the GANG meeting tonight on WF, just to learn more.
Tomorrow is another meeting, and another “Geek Fest” as my wife so lovingly refers to it as. Heading west to MSU for GLUG’s meeting on C# 3.0 by Bill Wagner. There’s going to be a bit on Code Rush, too (I love CodeRush!). Maybe I’ll win more swag!
I’m finally leaving the apartment world and entering the brotherhood of the house-poor. The process is exciting, interesting, and oftentimes overwhelming. However, last week when the home inspectors came to check the place out, I was amused by yet another situation where my QA skills applied. Functional testing, automated testing, performance testing: it was all done.
Ways to Performance Test a House:
The water system
Turn on every water faucet in the house at the same time. Can the system handle it? Does the water pressure drop? Can the well pump keep up? Turn on the outside water faucets and the sprinkler system. How does it do now? If the house can handle it, you should not have to worry about the shower getting cold when the toilet is flushed.
The electrical system
Similar to the water system test, what happens when you turn on every light in the house? How about if you also start the dishwasher and the clothes dryer? The air conditioner, too? Maybe do the water test at the same time, since the well pump draws from the power system, too. Get some electrical system meters to make sure the power does not die down when the load is high.
Ways to Functional Test a House:
The electrical system
Aside from making sure that the lights to actually turn on, the outlets work, and that the doorbell actually dings, there are some other cool tricks that were done against my house. I forget the name of the toy, but the inspectors had this cool gadget that would simulate a short in the system, like someone splashing water on an outlet or getting frisky with a fork. The gadget would test that the GFCI outlets would actually trip under such a scenario. Purposely overloading the system to make sure that the safeguards did their job. It’s like pulling the network cable from a MSCS Cluster to make sure that the servers would actually fail over. I thought this one was the most fun of all the night’s tests.
Ways to Security Test a House:
I used to carry a long expired medical insurance card in my wallet. Sometimes I would lock myself out of the house, most commonly when I took the garbage out, and I would use the card to pop the door and get back in. (I would always have my wallet with me, even if I forgot my keys.) I wasn’t thrilled that I could do that, but it did come in handy from time-to-time.
I’m sure there are other ways to test a house. Anyone else have any creative tasks?
In yet another post on the Xbox 360 and associated games and accessories, I am excited about the upcoming game lineup for Xbox Live Arcade. Contra has to be one of the coolest video games in the history of video games. I lost weeks of my life to that game. In addition, Frogger, Galaga, Dig Dug, Pacman, Defender, Sonic, and Street Fighter have all been announced. I’m going to be glued to my television, with nostalgia oozing out of my pores, once these things hit XBLA.
It is a bit old news by now, but this is all from E3. You can read all about it on microsoft.com.
Last weekend was the wife’s birthday. She hates having 14 different remotes to control the entertainment center; none of the “universal” remotes that came with any single component are really universal. The Comcast PVR universal remote cannot change inputs on the receiver. The receiver’s universal remote cannot access the PVR functionality of the Comcast box. So, for her birthday I got her a Logitech Harmony Advanced Universal Remote for Xbox 360. She loved it—or at least, the idea—but it sucked, so we returned it the same day.
I have heard great things about the Harmony remotes. The Harmony 360 is just another choice in the product line, with a few modifications:
- It controls the Xbox 360, out of the box
- It contains Y, X, A, B buttons to ease use of the Xbox via the remote
The Harmony 360 is nearly identical to the Logitech Harmony 550, except for different colored display (green vs. blue), different color casing (Xbox White vs. Black / Grey), and a few button changes (Y, X, A, B replace the Info / Guide buttons, though Y is sub-labeled ‘Guide’ and B is sub-labeled ‘Info’).
This is, or was, my first experience with the Harmony remotes. I am not a fan of this remote. Most of my distaste lies from the programming / editing software for the remote that is installed to your computer.
The interface is unbelievably slow
After all, performance is important to me. The installed application (not a browser application) would regularly take 5+ seconds to switch between screens.
The “future proof” codes were incorrect
For my A/V Receiver, my Comcast PVR cable box, and for my TV, the codes were incorrect. Though it identified my receiver, a brand new Panasonic SA-XR57 released only a month ago, it didn’t even know the receiver had a DVR input. As the only other component-video-equipped input on my XR57 besides TV, I use it for my Xbox. The problem here is that the software forces you to choose an input for the Activities macros, after which you can specify additional custom commands. My “Play Xbox” activity macro included ‘Turn on the Receiver’, ‘Set the Receiver to TV Input’, then a custom ‘Set the Receiver to CustomInputDVRCommand’. A kludge. A hack. I’m not a fan.
The “smart help” wasn’t so smart
The remote comes complete with a Smart Help feature via a Help button right on the remote that assists you when things go wrong. Because of my incorrect codes, the remote would do things wrong, but the Help would retry in an infinite loop. “Is your TV on?” No. [Sends IR command] “Did this fix the problem?” No. “Is your TV on?” No. [Sends same IR command] “Did this fix the problem?” No. “Is your TV on?” …
It is quite annoying.
The remote went back into the box after 2 or 3 hours of trying to get it set up correctly. It was more hassle than the 14 other remotes. It was not worth $129.99. I am just going to save some cash, and pony up for a Pronto TSU7000. Touch screen, configure my own button layout using my own bitmaps (for the UI side of me), more programmable interface (for my Developer side of me), and a lot more control over how I want my remote to be.
The folks over at SvN found this gem. In another case of “Let’s all point and laugh” or “Don’t be that guy,” I direct you to Usability.gov, courtesy of the U.S. Department of Health and Human Services. Note the side-nav article on “Navigation: Left is Best.” Note how the navigation is on the right side.
Hanlon’s Razor. “Never ascribe to malice, that which can be explained by incompetence.”
If you haven’t bought an Xbox 360
, yet, stop reading this and go buy one. Even if you do not play video games–I certainly don’t have much time to play them–then you still need one.
I finally convinced the wife a week ago. We picked one up from Best Buy with a copy of Need For Speed: Most Wanted. It is a great game, and I am quite addicted to it, but I’m more impressed with the non-game features.
Windows Media Connect 2.0. (Sell your CD player)
I have already disconnected my CD player. It is going in a box, and I will probably sell it at the neighborhood garage sale next weekend. All of my CDs were long ripped to MP3, so that they can be played on the computer or on the iPods. The only bad thing is the home stereo system has always been the best in the house, expectedly better than iPod headphones or the computer speakers. However, now all that has changed. The Xbox 360 will stream all of my music from my computer. I no longer have to pick 5 CDs and toss them into the player. I can just turn on the 360 (wirelessly, via the remote or controller) and play whatever music I want to play. I’m not even sure if I will ever even buy a CD, anymore, instead opting from some sort of digital media, like iTunes.
One of my favorite “Cool Features” with this is that you can play your MP3s while playing a game. You can replace the in-game music with tunes to fit your current mood, yet it does affect the other sound effects in the game (like the sound of the police car behind you in NFS: Most Wanted). Through the 360, you can also control the volume of the MP3s independently of the other game sounds.
I plugged in my iPod. They had a chat for a few seconds, and I was instantly able to play anything off my iPod, just as if I was playing through the iPod UI. There was no setup, no drivers, and (my favorite) no iTunes installation. The 360 just knew what it was, and that was that. It even uses the iPod name that you gave your unit for iTunes. So, in the 360 Dashboard, I have “Jay’s iPod” or “Amy’s iPod.” This was the system I used in the 2 or three days before I got my 360 on the network. Though it is really cool, I no longer needed it thanks to WMC2.0 and streaming MP3s from the computer, since all of my MP3s are on the computer.
It’s all Wireless!
This may seem small, but it is the feature to beat all other features: the unit is totally wireless. The controllers are wireless, and the controllers can turn on the unit. I no longer have wires running across my livingroom (well, I do when I play GameCube or PS2). And if I’m going to be playing the same game I just played, or if I want to play some tunes while I’m sitting on the couch reading a book, the controller can turn on the unit, so I can be lazy and never have to get off the couch.
Xbox Live Arcade
There are over a dozen (and growing) small, downloadable games you can buy from Xbox Live Arcade. My wife loves Hexic, a small Bejeweled-like game that came with the unit (I got the fully-loaded package), though it can be purchased on the Arcade. She is addicted to it. Soon I will also buy Bejeweled 2, Gauntlet (”Warrior needs food badly.”) and Joust. This feature was available on the original Xbox, though not as fluid. There are a bunch of cool Xbox-only games that I hope come over to the 360, soon, like Pacman.
As for the games:
Need For Speed: Most Wanted
I love this game. It is a mix of NFS: Hot Pursuit and NFS: Underground. I like this much better than either one. It has the city-based racing of NFS:U, without some of the street-racing types that I didn’t like, such as URL or street-X, and above all, drifting. The pursuit is much better than NFS:HP, as the cops are much smarter, and will tag-team you to box you in using 4 or 5 cars.
I did download the demo of Project Gotham Racing 3, and I liked NFS much better. PGR3 was too touchy for me.
The next games on the list to buy are Fight Night and Oblivion.
An old lady calls the power company, and tells them that the power is out. The tech on the other end says “The power is on here. It must be your fault.”
I’m experiencing some very severe technical problems with my site. Please bear with me.
The site was down most of yesterday. WordPress was having trouble accessing my database server. I could access the database from remote administration tools, as well as through the control panel from my host. My site could access the database some of the time, but not reliably and not consistantly.
One of the technical support personnel, “Doug,” was convinced that the problem lay in my code. However, if the problem was with my connection strings, why would it connect even some of the time? Shouldn’t it not connect at all. Doug was very assanine; I think I was inturrupting his afternoon break and he was a bit put off.
The second tech I spoke with, whose name I don’t remember, was convinced I had used up my 20 available database connections. He said that the problem lay with my pconnect commands. 1) PHP’s pconnect is designed to reuse opened connections, so if that was the case, then WordPress should have been able to reuse one of those existing connections. 2) WordPress is the only code on my site right now, and it doesn’t use pconnect. Again, another case of “it’s your code.” Furthermore, genious tech #2, when he was trying to drop the non-existant connections to the database, instead dropped the database. Everything was gone.
The third tech I spoke with, “Dennis,” was actually helpful. He did the extra work to restore my database from the previous night’s backup, so I only lost a day of data. He also put a Brinkster (my host) approved database test page on my site, and tried to access it. Lo-and-behold, he couldn’t access the database. Imagine that. And, since this was a Brinkster-approved page, he couldn’t blame the code. So, Dennis did a little research. It turns out that the routing tables for one of the web servers in the farm I am on had an incorrect IP address for the database server in question.
Huh. I guess it wasn’t my code. Not that I thought that it was, considering the site has worked fine for 8 months now on the present code, and the code hasn’t changed.
Update: Everything should be working now. The database was restored last night. The IP address issue has been resolved. I’ve corrected the header problem (caused by a space in one of the php files). Everything seems to be wworking correctly again.
Must Have Tools
- Notepad2: A vital, essential, notepad replacement. Color-codes your text using syntax schemes identified by the file’s extention. I followed Scott Hanselman and “renamed ‘Notepad2.exe’ to ‘n.exe’ which saves me a few dozen ‘otepad’s a day.”
- PsExec: [blog entry] Execute remote applications, remotely. Great for installing an MSI on a remote box without resorting to Remote Desktop. Also great for launching solitaire on your buddy’s machine and harrassing him for slacking at work.
- Screen Hunter 4.0 Free: [blog entry] Free screen capture tool that is a requirement in any tester’s toolbelt.
- Watir: [blog entry] Web Application Testing In Ruby. An automated functional testing tool for automated browser tests in IE. Scripts are written in Ruby.
Continuous Integration Tools
- CruiseControl.Net: Monitor your source. Can be used to manage automated builds, build status, and reports from NUnit, FXCop, etc.
- NAnt: Free build tool for .Net. Use with CruiseControl.net to automatically build nightlies or whenever a code change occurs.
- NantContrib: An extention for NAnt. Adds some useful tasks that NAnt does not include, such as integration with VSS.
It’s not all about Internet Explorer any more. Yet, I am surprised at the number of web houses still coding specifically to IE. Much to my dismay, even my own company does it. Though we have a little bit of an excuse—our client only supports IE in their organization, and the app is internal—it still bothers me that we are abandoning everyone else.
New figures released a week ago place IE’s market share at 89%. That means more than 1 in 10 users are not using IE. (Read the Article) By coding specific to Microsoft, you are abandoning 11% of your potential users. That is astonishing and disturbing.
Pay particular attention to Firefox. Its user-base is growing exponentially, and doubling every 9 months. I’m a fan of the application. It is much easier to use than IE, and much more solid. I’ve converted all of my friends and almost all of my family. I even have my in-laws using Firefox. (Get Firefox)
As the IE behemoth continues to fall, you and your organization should be paying more and more attention to standards and multiple-browser testing. Check that your HTML is compliant, and test your sites in at least IE and Firefox, if not others. Don’t force your users to use a particular browser; chances are that if they can, they will just go somewhere else for their information.
My favorite part of my job is most definitely that I get paid to break things.
As a kid I had a playroom that was filled with legos. Legoland lived on two 8′x4′ sheets of plywood, and covered them both with roads, hospitals, race tracks, and restaurants. But it would be impossible to recall all of the horrible, terrible tragedies that happened to Legoland. Every weekend there was a new disaster: a high-speed police chase that would end with the perpetrator crashing into the gas station, and the ensuing explosion would level every building within 4 base plates; a tornado that blew the truck stop clear over to the other side of the Cantina; an earthquake–perfect when Legoland exists on two sheets of plywood–would split the town in half. Every weekend Legoland would get completely destroyed, leaving just an assorted pile of legos strewn across sixty-four square feet of what once was a happy little town. I would spend the next week reconstructing each building in true make-believe fashion, construction vehicles and all, just to repeat it all again come Saturday. The perpetrator was always the same guy, too, in the red helmet and the little blue dune buggy. You’d think that the Legolanders would revoke his driving privileges after the twenty-sixth time.
“Find something you love doing, and find someone that will pay you to do it.”
I break things. And, they pay me for it.
yes. I know. I should have done this long ago. People keep harassing me
to put my thoughts out on some odd web site, essentially exposing
myself to the world. I’m not an exhibitionist. I don’t like doing this.
But, I will try it. Maybe I will like green eggs and ham.