I started writing software professionally late in 1997, if you consider the first real web site for which I was paid. There really wasn’t a lot of architecture or process that went into that first site. I had been reading on Perl and Javascript and wrote some very simple email forms, picture slide-shows, and did some Photoshop work.
I got going in earnest in the spring of 1998 when I was hired on as a web developer at a local Internet Service Provider. At first what I did was more hacking that software engineering. Maintaining Perl scripts written before my time (that had not been that well thought through to start with) and writing Classic ASP (we just called it ASP back then) that was more about getting it to work than getting it to work well. But I had a background in computer science, and I soon started buying books to gain the Microsoft Certified Solution Developer credential. This is where I was introduced to software engineering as a profession. I distinctly remember reading about the roles Microsoft used for software development, and a matrix about who could wear multiple hats. For example, a manager might also be a lead programmer, a designer might also be a developer. But a developer could not also wear the hat of tester. Microsoft was very, very clear on this point.
Of course we did not have a Quality Assurance department at our little ISP. Hell, the web development department wasn’t even profitable the first year I was there so we weren’t about to spend money on someone just to test our stuff. And we really didn’t need it at the scale we were at. I had, at most, two or three other developers on my team during my tenure. These were mostly part time; we simply weren’t building huge web applications. Software engineering for me at this point didn’t include a lot of process; what I was doing really should not be called software engineering and I certainly wasn’t calling it that then.
After getting my MCSD and realizing that the entire software industry was booming I took a job with the State of Wyoming making the big cash. The first big project I worked on had about 40 developers; there was no QA. We tested our own stuff and occasionally each others stuff. In hindsight this is surprising because Anderson Consulting (now Accenture) was running the project. There were several individuals, including the manager, that had over 10 years of experience. They should have known better. I know I didn’t at the time.
Over the next couple of years I did a lot of contracting. There was never any QA. During this time I was really beefing up on .Net and my programming skills in general. I noticed my skills increasing sometimes week by week, and definitely month by month. I was optimistic, but I was still inexperienced. I thought that quality programming was all that was needed to create quality software. This myth had started for me in my early programming days, and had solidified at Wyoming, and was reinforced by the fact that I seemed to be writing better and better software and didn’t seem to need QA to do it. However, I was also digesting a lot of books at this time that said the exact opposite of what I was thinking.
In 2003 we moved to Austin, and I started a full-time job with a local medical software company. I had come a long way in the 6 years I had been in the field. I was now convinced of the need for QA, for unit testing, and for other, industry proven methodologies. I was fortunate to find a job quickly in a down economy. I was unfortunate to go to work for a friendly, but completely incompetent manager. She basically ran a cowboy coding shop. There were no formal requirements to look at, there were no processes in place. Even though we had a relatively small team information was poorly distributed. We had no QA, and unit testing was downright discouraged. I was beginning to think that QA was a myth; no one seemed to actually do it. Was I wrong? Had I been right earlier in my career?
During this time I continued reading about process; in the I realized that what we were doing was very wrong. For the first time in my career the software was complex enough that the lack of QA was obvious in the final quality. Here I had the proof in front of me. Although it could have been all the other things we were doing wrong – I am sure When I had a chance to leave the company when even worse management took over I did. And I found some QA.
I went to work at a second medical software company in Austin about 3 years ago. There was an entire, dedicated Quality Assurance Department with Quality Assurance Engineers. I was excited. I thought I had finally found someplace with individuals that understood software development methodology and applied it to testing of software. Boy was I wrong. As the weeks and months rolled by I was moved from my initial R&D role doing framework development (no real QA interaction) to one doing production software (lots of QA interaction). I soon learned that the vast majority of our QA “Engineers” really didn’t have any clue about software development. In fact, they really didn’t know a lot about computers. There were a few bright spots, and a few bright people. There were definitely some hard working people. But no real methodology was employed, and leadership in the QA department was horrible from the top down.
My first real experience with dedicated QA showed me a QA effort that only hindered the development of quality software. Now I really reconsidered my stance. Was I really, really right early in my career? Is this why so many shops lacked QA, because QA just got in the way? I had a hard time believing that. There were a couple of stand-out QA people that did catch a lot of bugs and did help produce better software. Most of these stand-outs lacked a background in software, and they all lacked any real empowerment from their management. What would it be like to have a QA department with smart people that used good process and good management? What would quality, Quality Assurance be like?
I got the answer last spring when I was laid off and quickly found a job with my current employer. I ran into my second, real QA department in my career. And this time I ran into the real deal. We have engineers that all have a significant background in software development or IT. I can think of at least three QA engineers at my job that know much more about networking and servers than I do. I think they all know more about the product that I do.
Over the last year and a half I have come to the startling conclusion that not only is good QA important, but it might be the most important thing in software development of any significant complexity. It is Quality Assurance Engineers, not Software Engineers, that have the most significant impact on Quality Software. When this dawned on me a few weeks ago, I felt a bit lost. The control had been taken out of my hands. As a software engineer I realized I was not necessarily the most important portion of the product development. It is the QA engineer that keeps me honest. It is the QA engineer that tests my software in ways I would never have thought to test it. It is the QA engineer, writing automation tests that pushes my software far past anything I could simulate. At my current employer, our QA engineers vastly improve the quality of our software.
I continue to strive to learn new skills and to become a better software engineer. But something I know is that I will never be a good QA engineer for myself, and am thankful for the people we have. I think back on all those previous experiences. I think of those managers at previous jobs that were hopelessly lost. This is just one more lesson for me. Trust the experts. Trust your instincts. And quality, Quality Assurance is really important.

I’ve become convinced that not only is QA essential, it needs to happen simultaneously with development to be effective. I think (and have read from some professional testers with years of experience – see Lee Copeland in May/June Better Software magazine, “Time To Let Go of Obsolete Jobs”) that the division between developers and testers is becoming blurred into developer/tester at any shop that does effective, affordable testing.
Sadly, most managers that weren’t developers seem to think you can hire any Joe off the street, put them in front of a computer, and they’ll find lots of defects.
We have more of a traditional waterfall methodology where I work now, so the hand-off the QA is a formal process. However, certainly work hand-in-hand. Software engineers and quality assurance engineers sit together. We also do a substantial amount of integration testing, and just plain-out testing each others stuff (the developers) before handing off to QA. This is my 3rd release here, and we haven’t failed acceptance testing yet.
I personally think that I make a lousy tester, and so project that onto developers in general. I really appreciate the difference in mind-set that a developer and a tester has. I think that is an important part of the quality involved in our product.
Jason, I liked your post. I was gonna post a reply earlier but got sidetracked after making an account on your blog.
I worked with the Software Quality Engineers at Rockwell Collins during one of my summer co-ops. It was a good introduction to software development process that you cannot match in an academic setting and gave me an edge over other new hire software engineers because I knew the process and why it was important when it was implemented correctly.
But that is the catch… it must be implemented correctly. Quality Assurance as just another hoop to jump through is a waste and the person in that job is helping nobody by signing off on anything put in front of them. The best SQEs were the ones that could actually read some code or raise questions that made the developers squirm a bit. If a developer was not confident in the answer then they would probably have some extra action items to work on later.
The check and balances that software developers can do for each other is important as well. If you have two developers working on different modules but in the same coding language, it is helpful to look over each others code for readability and documentation. This helps out the next developer who has to modify this code to either fix or expand upon it.
The biggest obstacle to this process is the ego of some older developers that were lone wolves too long. They tend to be overly defensive and very reluctant to help others trying to reuse their code or even dare fix a bug in their precious creation (or hack job… depends on their preferred method or limitations from management such as money and time). Getting comments or helpful object names in their code is a miracle. The newer code might be a bit better but the stuff before a good process was in place is minimal such as a comment with the author name and some meaningless date (create? release? revise?).