Friday, May 28, 2010

Are you the one holding you back?

I talked to my sister tonight. Like some other times I've talked to her, she was feeling frustrated at the walls that she has run into while trying to chase her dreams. What concerned me, however, was the tone in her voice that sounded like she had given up. She seemed to have decided that since she does not have a degree from a 4-year university, she was never going to be able to pursue the career she wants.

The conversation both made me sad and frustrated me. Although she has encountered some pretty big obstacles, I did not feel like they were impossible to scale. At one point, I told her, "Go get yourself some rock climbing gear, and let's get you over that wall!"

She feels like I don't understand how hard it is to not have a degree, because I have one. Maybe, she has a point. Though I know that when I am hiring, I don't even notice if my candidates have a degree. I look for skills, passion, pursuit of what they feel is right. I know that at least some others do the same.

I do, however, know what it's like to feel that the odds are stacked against you, and to feel like you might as well not try.

At age 19 I found myself single, pregnant, and a sophomore in college. The semester I found out I was pregnant, I was already struggling with a Biology curriculum. I had barely passed my first year and a half of school, and with a baby due in June, my spring semester was atrocious. I missed most of my classes that semester. By the time I asked for a medical leave, I had missed the deadline to do so by a week. That semester, I failed out of every single class and was placed on academic suspension.

After my son was born, I landed a temp job as a secretary for the Computer Engineering department at Clemson (where I had been attending classes before the baby). I worked for them for several months. When I started talking about going back to school, they were very encouraging of me. They encouraged me to go back and study Computer Science (because I "seemed to be pretty good with computers"), and they walked me through applying again. I was able to get the college to accept me back as a student, but as the summer before classes started began to fade away, my hopes for getting financial aid began to fade with it. I was told that I simply did not qualify for financial aid because I had been placed on academic suspension.

I had no money. I was a single parent, living with my parents. My parents had not saved for my college, so I had been relying fully on financial aid in order to go to school. Panicked, I thought this one barrier of money was going to stop me from going back to school.

(Edit from my original post because I realized I glossed over the most important part!)

(Let's pause here for a second. This situation looks pretty bleak at this point, right? I could very easily have stopped right there and given up. I mean, they told me, "Those are the rules, academic suspension = no financial aid when you come back until you prove you'll do better." Seems like a deal breaker to me. **That**, however, is the point of this post. I didn't let it be a deal breaker. I kept trying to go after what I wanted anyway. So, let's get back to the story....)

I really felt like the circumstances that lead to my academic suspension should be forgivable. I felt like they were pretty extreme and that I should still be able to finish my education and get the degree I wanted. I talked about it *a lot*. Apparently, the professors that I had been working with felt the same way.

All of the professors that I had been working with in the Computer Engineering department wrote letters to the financial aid department at the school. All of them made an argument to the school that the opportunity they gave me would be well worth it, that an investment in my future would pay off for the school in a shining star. I gathered several of these letters and took them to the financial aid department. I was shocked when they offered enough aid to get me back into school!!

My first semester back to school, I made Dean's List. Three and a half years later, I graduated from Clemson with a Bachelor of Science in Computer Science. I spent those three and a half years supporting myself and my son in a home of our own, working full time, and taking full-time computer science classes. My senior year of college included 7 comp sci classes and a physics class.

Me? I know barriers.

But I don't see them as showstoppers. They exist, and they are big, and at times I am really intimidated by them. At times, I don't think I can get past them. The truth is, sometimes I can't. Sometimes, "over the wall" doesn't work, but it turns out, if I scale the wall long enough, I can find a small crack that has crumbled enough for me to squeeze my body through. The point is, I just have to *keep trying*.

If I give up, the result will always be the same -- I definitely won't accomplish what I want. But if I try, and keep on trying, and look to others for ideas, something just might happen. Maybe it won't be exactly what I want, but maybe it will be better.

Monday, May 17, 2010

Building a test team ...

I told this story recently and was asked to blog about it, so here I am.

I have worked on several teams over the years, usually teams where I am starting testing departments from almost nothing, or revamping them from a place of failure to a place where they feel more valuable and are valued more. Frequently, I think back to the first major position I had out of college.

I started out during my senior year in college working as a part-time software tester at a bioinformatics company (software for genetics researchers). About 6 months in, I was given the opportunity to lead the testing effort (we had 2.5 testers) for a small turnkey project we had for a government agency. It was difficult, but I enjoyed it. When I graduated from college (about 11 months in), I was given the opportunity to hire 2 full-time testers and lead the QA team for the company.

My first 2 hires spent the first week or two in training (that I instructed) about the domain -- I taught them about bioinformatics and the algorithms that the software used (I did it because I loved it, but it was good for them to learn). There were maybe a dozen different genetic matching algorithms. At one point, my team was able to run the major genetics algorithms *by hand*, and knew *immediately* when some result set was incorrect.

Within about a year, I encouraged each of them to specialized in some aspect that interested them: the software itself, testing, the domain, etc. One of them enjoyed unit testing, so she did that. Another was interested in the back-end processing so he focused on that. Each of them also focused on specific types of algorithms.

We met regularly to teach each other what we were learning. Each "specialist" would give some sort of presentation to teach all of the other team members what we all needed to know to be able to effectively test. As new developers came on, they lacked the domain knowledge to understand *why* something was wrong. I was proud to see my test team able to understand the problem deeply and be able to explain it to the development team.

Before long (about a year), it became time to hire 2 more testers. Once the new hires came on, my existing team members helped to teach the new hires about the domain and the algorithms. The company had expanded the systems that it supported to 5 platforms for the client and 3 for the server. We maintained large whiteboards across the QA "hallway" to coordinate with each other on configuration management and testing efforts (in the days before I spoke words like "big visible charts").

At one point during this time, my software development lead conducted an experiment on us -- he purposely inserted 5 issues into a build and we had 2 days to knock away at it. We found 4 of those 5 issues in just 2 days.

In general, we struggled with test automation and never quite got it to work (though I became intimately familiar with WinRunner and TestDirector). We got offended when we were reprimanded for talking to each other too much (I valued that then, just as I do now). We communicated with each other via big whiteboards that let us know what everyone was doing at any given time and how it was progressing. We talked through test techniques with our dev leads, who were incredibly skilled people.

Looking back, at the time, I thought we were doing so many things wrong. In hindsight, however, we really were doing a *lot* of things right, and I am proud of that team.

Sunday, May 16, 2010

Hiring misses: When we turn someone down for the wrong reasons

Filtering through hundreds of resumes can be a daunting task. Some people use recruiting agencies to help them filter the obvious misses, some go through all of them manually (I tend to fall into the latter group). Since I've recently been filtering through resumes again, I am reminded of a time when I learned first-hand just how much I missed out on when I didn't hire someone for something that today, I would find fairly minor.

It was 2007, and I had just gotten a job with a local nonprofit, starting their QA department from scratch (they had *zero* testers before me!). I sat across the cubicle aisle from a guy, let's call him Steve. Steve was a DBA, somewhat systems guy, overall smart guy. On my third day, we were all across the street at the pool hall playing pool at lunch time, when Steve finally decided to out me. He looked at me and said something like, "Okay, I waited until your third day. You don't recognize me, do you?"

Panicked, I am sure that I spent a few seconds (felt like minutes), trying to figure out who the heck he was. Why should I recognize him? ("Oh jeez, did I go on a *date* with him?!?!")

Finally (out of sympathy for my obvious flailing around a bunch of people I'd only known for 2.5 days), he said, "You interviewed me at (company x). Obviously, you didn't hire me."

WHAT?!?!?! I interviewed this guy and didn't remember him.

I said, "Oh, God, please tell me I was at least courteous and professional with you about it." (Not that I would be anything but....)

He laughed and said that I had been (Thank *goodness* for that!), and that he had been lacking in scripting skills. There was much joking about the incident for a while (I told him he was lucky, that I had done him a favor, that the company had since gone under.)

Over the next year and a half, I had the opportunity to work closely with Steve. I got to know the way he thought about the world, the way he approached problem solving, the way he thought through everything that he did, and the pride he took in his work. We spent many long hours and late nights working on problems together. We had a blast doing that, of course -- calling in pizza, having fun, coming up with private memes ("red is bad, makes angry grr"). It wasn't long before I realized just how dumb I had been for not hiring him when I had the chance. To this day, I'd sacrifice a lot to convince him to come into testing (he likes this DBA thing), and I'd hire him in heartbeat, without hesitation, any where, any time.

And I didn't hire him because he didn't have enough experience with scripting (something I could have taught him in a few days, likely....).

I realize that it's probably rare that people end up later working with someone they chose not to hire after an interview. Even rarer, I think, is compounding that with learning that they would have been a *fantastic* hire.

To this day, I think very carefully about what skills I choose not to hire over. I talk a lot about looking for the "testing mindset", and I feel that there are very few skills I cannot teach someone in a reasonable period of time. In fact, when I think of the kind of people I look to hire, their inquisitiveness and desire to learn usually mean that they can learn technical skills in a fairly short time (certainly a lot shorter than trying to teach someone with all of the technical skills I need to be inquisitive and have a desire to learn!).

Sunday, May 2, 2010

Executable Specifications using FitNesse and Selenium -- STAREast 2010

At STAREast 2010, I presented a session called "Executable Specifications using FitNesse and Selenium". To set up the system I was using, you will need 3 pieces:
  • The sample blog engine as the application under test
  • The FitNesse files (here, these contain SeleNesse for convenience)
  • Selenium RC server

Optionally, you can find my slides here

In that talk, I used a sample set of english-readable tests against a locally installed Microsoft blog engine, available via the Web Platform Installer. This was the application under test.

Blog Engine .NET Web Platform Installer

Below please find a link with a zip file that contains the directory structure with all of the FitNesse and SeleNesse files needed. To begin investigating, download the zip file and extract it somewhere that you can find it.

Executable Specifications using FitNesse and Selenium

Then, open that folder and execute the "runFitnesse.bat". In the resulting command prompt window, you should see the following:

FitNesse (v20091210) Started...
port: 8080
root page: fitnesse.wiki.FileSystemPage at ./FitNesseRoot
logger: none
authenticator: fitnesse.authentication.PromiscuousAuthenticator
html page factory: fitnesse.html.HtmlPageFactory
page version expiration set to 0 days.
That will tell you that the FitNesse server is up and running. The most common causes of trouble are the JRE version on your machine (make sure you have 1.6+), or the port that FitNesse is starting on. If that appears to be the case, edit the runFitnesse.bat file and change that port number (8081 might work, for example).

As soon as the FitNesse server is up, open up a browser window and enter the following URL: http://localhost:8080/.

That "front page" will also direct you to download the Selenium server -- my favorite way to take care of this is Sauce RC, found here: http://saucelabs.com/downloads. It makes running the Selenium server dirt simple.

The FitNesse front page has a brief description of the system and how it runs. The "TestBlogEngine" link will take you to the tests themselves.

For further exploring, the FitNesse and Selenium systems have established communities for support and learning. You can also follow the SeleNesse project, and join the user group to learn more.

I am more than happy to help with any questions or trouble setting this system up. It can be confusing or overwhelming at first. I would suggest starting off on the examples that exist and making small modifications to learn how the system works.