Showing posts with label Waterfall. Show all posts
Showing posts with label Waterfall. Show all posts

Thursday, September 22, 2016

Murphy's Laws of Software testing

Taken from my facebook wall. Here goes:

1) Bugs can easily be created. They cannot however, be easily destroyed. But they can easily get transferred from one platform to another.
2) There is no such thing as a bug free application. But yes, bugs do come free with every application. :)
3) Bugs do not get reproduced when you demo them to the developer / project manager.
4) But will magically reappear from nowhere when you demo your product to the client / customer.
5) Your most bug-free product version will reside in your developer’s local machine / session. Bugs never happen there.
6) The more the number of developers working on the product, the more bugs there will be to find.
7) Bugs which have been deemed fixed and closed always reoccur in Production.
8) No matter how extensive your test coverage is, you will always miss / overlook one aspect of the product.
9) And that’s where the bug will usually occur in production.
10) No matter how many critical bugs you find, you will be pilloried for the one bug you failed to detect.
11) The PM and delivery manager will always consider the testing team as dead weight.
12) The bug which takes the maximum amount of time to reproduce will always take the least amount of time to fix.
13) The bug which causes the maximum amount of damage always requires the smallest of fixes.
14) Customers / End users usually find more bugs than your testers’ do.
15) Bugs will never be apparent if you keep looking for them, but when you are not, they will pop up from every nook and corner of the application and will hit you in the face.
16) Automation might get things done quicker, but the amount of time it takes to script the tests and run them will make you think of running the tests manually.
17) The most critical and time consuming bug for the developers to fix will always occur at the fag end of the testing cycle or when the product is ready to ship.
18) You will spend a huge amount of time and energy in detecting a bug only to find that it now not reproduced.
19) Even if you do reproduce the goddamn bug and file it, it inadvertently turns up not to be in scope.
20) Even if it is in scope, someone else would have already filed it a long time back.
21) The product / feature for which you have detected the maximum number of bugs will most certainly be de-scoped.
Developers’ ultimate justification for bugs:
“But it does not happen on my local machine!!” :)
"This issue is not in scope."

Murphy’s Ultimate Law of all products:
“It just won’t work!”

Friday, February 5, 2016

The death of the Testing specialist



In many QA Job opportunities and postings these days, I have observed that almost 90% of the job descriptions specify coding and automation knowledge as mandatory. This does seem natural, going by the logic that IT and software companies do require a certain amount of computing cognizance. But as a hard-core QA professional who’s spent more than 12 years trying to break code, it really doesn’t make sense.

And why you ask? Surely a good tester should know how to code? I beg to differ. While I agree that knowledge of coding is definitely an advantage for a tester; a feather in one’s cap, it is no substitute for hard-core testing and QA skills. It takes a fair bit of creativity, instinct and effort to find critical bugs in software. In today’s highly complex software scenario, testing has evolved into a highly specialized and viable career option rather than an offshoot of development and coding which many sadly perceive it to be even today. It is a mistake to ask your tester for coding skills. If the testers start to code, then what will the coders do?

In the good old days of yore, software project teams were split into specialized teams based on their job functions: BA teams for requirement gathering and liaising with the client, A technical architect for designing the software architecture, DBA teams for setting up and maintaining the Database,  Development teams for coding and unit testing, a QA team for preparing Test cases, RTM and testing the application and an Application Maintenance team for providing support after product Go-live. Each team had a manager for guidance. Each team had their defined boundaries and everyone had a clear cut task and skill. The work was well-defined and everyone was happy.

But the scenario is changing fast. Software is growing in complexity day by day. The landscape has become very competitive, especially for IT service providing companies based in India who look to add value to their clients by delivering high quality software in a reasonably quick time. Newer and more dynamic methods of Software delivery such as Agile have replaced traditional software models. In a bid to maximize revenue, many companies actually take testing very lightly and look to reduce the head count of the testing team. In many teams, the developer to Tester ratio is highly skewed in favour of the dev team. Many project and delivery managers sadly have a very biased opinion about testing. “Testing?!! Mehhh ….. anybody can do that!” they say. Very little priority and thought is given to testing these days and this is the prime cause of software failures. When software fails, the credibility of the organization and the team which built the software takes a hit and this results in numerous other complications.

Which is why you need specialized testing teams for detecting bugs before deploying the application and going live or before UAT. The art and science of detecting defects in code is a very specialized skill which requires a lot of patience, perseverance, skill, creativity, instinct and experience. No amount of coding experience can substitute it.

Let’s take a simple example. Lets’ say you’re a newly appointed chef in a reputed hotel and you have just rolled out a new signature dish. You will of course, taste a bit of it to check if all the ingredients have the right consistency. Too much sugar or too little salt, a dash of chilly and pepper to boost the taste. If you’re satisfied, you can send the dish out to the customer. But you would be taking a great risk in doing so. A wise and experienced cook will always have the maturity to let a specialist taster and sampler to sample the dish before sending it out. Let’s face it, we’re human. If we were in the cook's place, given the time and effort we have spent in making the dish we will tend to feel a bit biased towards it. Deep in our heart, we would like to believe that our dish is perfect. This unfortunately, is an ideal scenario. Something which is non-existent in the real world. Therefore, we would need someone experienced, neutral and unbiased for tasting our dish. Someone who can rightly detect any inherent flaws we might have inadvertently made in preparing the dish. Someone who understands what cooking and good taste is all about and also understands the customers’ needs. This would go a long way in ensuring that your dish is well received. The flip side is: if your dish isn’t well received, you can always blame the taster ... :)

The same is the case with Software Development. Software Developers and Managers must realize that no matter how expert they are in interpreting the requirements and coding and despite their best efforts, bugs and critical errors inadvertently creep in. Some might be minor or cosmetic issues, but some might be show stoppers and might ruin the software’s performance, costing the company a huge amount of money to make a fix. Like I said earlier, we’re only human. And developers do have the tendency to think that their code is infallible. Every Software team needs a good amount of specialized and experienced testers who can detect an inherent amount of bugs in the application. Like the specialized tasters, testers (pardon the synonym) help in reducing errors and improving software quality by making sure your software product performs as per specifications and meets the end users’ requirements. As I mentioned earlier this kind of testing is a full time job which requires loads of patience, perseverance, meticulousness, creativity, a sharp eye for defects and various other positive adjectives. Having a good knowledge of coding makes you a good programmer but does not necessarily make you a good tester. And of course; if things do go wrong in production … you always have the QA team to blame …. :).
There are of course some areas where coding expertise is required, such as Automation testing. But there again, a good record and play tool eliminates the need for complex scripting. And as I mentioned in an earlier blog post (Manual V/s Automation), a good round of manual testing is required before you can proceed for further testing such as Automation and performance.
So whether you like it or not, Dev guys; wake up and smell the coffee. You will need testers to examine your code.

Asking your tester to code is like asking your number 11 batsman to score a century each time he comes out to bat. When there are runs required to be scored and wickets are few in hand, your batting skills will come in handy. But that's not always applicable. You have specialist batsman to do the job and if they have let you down then you cannot blame the tail-enders for not scoring runs always. As in software, each person in a team should have a core skill (batting, bowing, wicket keeping) and he should stick to it and develop it well.  

This is an open request to all IT companies, big or small to let go of their obsession for testers with coding knowledge. This attitude has made testing an endangered profession as it is. If this attitude persists the day is not far off when testing and QA will be added to the extinct professions’ list. You ignore specialized testers at your own peril. In the long run, the effects on Software Quality will be there for all to see.
   

Friday, November 20, 2015

Don' be Fragile! Be Agile! - Part one



The latest buzzword that’s doing the rounds in the Software industry is ‘Agile’. Even if you are not directly connected to the Software and IT industry, chances are that you must have heard this term a number of times. More and more software companies and teams are using the Agile method to develop and test software. Agile Scrum coaches and practitioners, developers, testers and managers who have experience in ‘Agile’ methodologies are in great demand these days.

But what is this ‘Agile’ methodology and why is it so popular? Why are so many IT organizations big and small switching over to the ‘Agile’ way of doing things? How exactly does ‘Agile’ function and what are its inherent advantages which make it so favoured? If you are new to Agile then I’m sure that these questions will be popping up in your mind frequently. With this blog, I aim to explain the ‘Agile’ way of doing things and unravel the reasons for its popularity.

To fully understand ‘Agile’ we have to look at the following points:
a)      The software methodologies used before Agile came into practice (Ex: the Waterfall model)
b)      How the ‘Agile’ model originated. What its’ salient features are (the Agile manifesto).
c)       What benefits do organizations, companies and teams derive by using this methodology.

Let’s define ‘Agile’ first. What exactly does ‘Agile’ imply? The dictionary defines ‘Agile’ as the physical ability to move quickly and easily. In mental terms, it means to think and understand things quickly. In the broad sense, it means to be positively responsive towards changing conditions and to adapt quickly. In other words, it implies flexibility and quick acceptance of change. This feature is the crux of Agile and the foremost reason why it is so popular nowadays. In today’s rapidly changing and evolving software landscape Agile helps teams respond to change more effectively by being more flexible and adaptable to changes in the product. And how exactly it does that is what I will cover later.

To understand how Agile came into place, let’s take a look at how software was developed before Agile. Before Agile, Software companies mostly followed the Waterfall methodology of developing software. The waterfall method is a linear way of designing and developing software in which each phase of the SDLC is an independent process which follows a linear path. After one phase is completed, the next phase starts and so on and so forth until the last concluding phase is reached. As indicated, Waterfall follows a straight path. Each phase starts only after the preceding phase ends. There is very little scope for phase overlap. The ending of one phase signals the start of the next phase and so on till the last phase is done. The figure below shows a typical waterfall process flow:



In the early days of Software development, requirements were more or less static and there was very little scope for change, if any. Well not exactly, but Software was more or less simple and the requirements were more or less straightforward those days with no frequent changes in scope and functionality. In a typical waterfall scenario, the effort would have proceeded in this manner:

a)      Requirement Gathering:

-          Client or BA(Business Analyst) team prepares the requirement documents containing details of the application / product to be created
-          Project team liaises with the Client / BA team to discuss the following app / product
-          Queries are raised by respective teams (Dev / QA / DB) etc. which are resolved by the Client / BA team.
-          Client signs off the requirement document after all queries have been successfully resolved.
-          This acts as the trigger for the next phase.

b)      Planning:

-          Planning phase is kicked off after requirement sign-off.
-          Dev / QA team create plans for their respective objectives.
-          Plans are reviewed and approved by stakeholders.
-          Planning phase ends. Next Phase starts.

c)       Design:

-          Design process starts after plan is approved.
-          Dev team starts coding / QA team starts preparing the test cases
-          Dev teams creates prototype of the app and runs unit tests.
-          Product is released for testing after Unit tests pass.
-          QA team reviews and sends test cases for sign off.

d)      Execution:

-          QA team conducts a sanity test and starts testing if sanity is cleared
-          Defects are logged and sent to development team.
-          Defects are resolved by Dev team.
-          After acceptance criteria has been met, testing stops
-          QA team prepares report and releases app for UAT testing.

e)      Closure: The QA team prepares a test summary report for reference to all stakeholders. The software is released for UAT after which it is deployed to Production.

-          QA team prepares Test summary report for all stakeholders.
-          Software is released for UAT and sub-sequent go live.


So as can be seen, Waterfall is a fairly simple and straightforward process.

Let’s take a real world example. Let’s say your company has got a project for making a desktop calculator application. You are the project manager and have the choice of choosing the workflow for making this app. Which approach will you adopt? The requirements have been clearly spelt out by the client. You have an experienced Dev and QA team to handle the proceedings. In such a case, the waterfall method is the best way. So you proceed in a phase to phase manner.


-         Your project team sets up a project kick-off meeting with the client. The client outlines his product scope and vision and provides the high-level requirements.

-         The BA team liaises with the client and prepares the calculator requirement / scope document.

-         Based on the high level requirements and the scope document, the project team clarifies requirements with the client. Once all requirements have been clarified, the client and the project team signs off on the requirement.

-         After Sign-off, the Project team begins planning phase. Respective teams prepare estimates and start the planning process. Risks and mitigations are identified and strategies are made for coding and testing respectively. Architects plan and prepare the architecture for the app.

-        The design process starts after the Planning phase. Development team starts coding and the QA team starts preparing the test cases. The dev team makes the first prototype of the app and releases it to QA after unit testing. Design phase ends.

-        Execution phase starts. QA team conducts a sanity test and based on outcomes determines further testing.

-     After execution is done and the test completion criteria is met, execution stops and the QA team prepares the test summary report.



It looks perfectly simple and logical right? I mean, what could go wrong with this one? Why all the hullabaloo over Agile when you can develop the product in a simple and straightforward means by Waterfall? Well, that’s because the software requirements were not very complex. Application requirements were clear from the start and there was very little scope for change. The team knew what to work upon and could thus, plan and strategize effectively for developing and testing the product.


But what if any change request came about from the client? Let’s say, the client requests another new button or tab or new functionality to be added. What then? Two factors would come into play in such a case:

a)      The Nature of the change request (How big is the request, how will the scope be impacted, what is the workaround required)

b)      When the Change request is made. A change request (or CR as it is abbreviated) introduced earlier can be effectively integrated into the cycle without too much workaround. If introduced at a later stage, it could be a cause for concern as it might lead to more product rework, re-coding, re-scripting of test cases etc.

Usually, the earlier the change request is made the better. If the CR comes in the early stages, the project team can calculate the necessary rework and impact to the current scope and schedule (which probably won’t be much since much of the work has not started anyways). The team makes the necessary changes in the plan for incorporating the new CR and work starts again.


If however, the CR comes at an intermediate or late stage of the project, then incorporating it would look a bit dicey. Here, the factors a and b mentioned above would come into play. If the CR is either too large in scope and / or comes very late in the project (ex: a scope change during the testing phase), the PM should not hesitate to point out to the client that incorporating this CR is a huge risk and should recommend adding it in the next release.

The typical risks associated with attempting to incorporate the new CR at a later stage of the project include:
-         Team will waste precious time in understanding the new requirement instead of focusing on existing tasks. Release timelines might get impacted.
-         It will lead to additional rework on the team. Attempting to add the CR within the given time-frame could lead to stretching the teams’ efforts to late nights. This would result in fatigue and low team morale.

-         The quality of the application will surely take a beating.  


All this will impact the PM and the teams credibility. It all boils down to the PM and his team on how firm they are in dealing with CR’s.

Taking the above example of the calculator, let’s say the client has come up with a change request. He/she wants a new button/function to be added to the calculator. You as the PM get together with the team and analyse the CR. On the surface, it seems to be a simple change. I mean, just adding a new button should not be much of a change right? Maybe, but there could be a lot of hidden factors involved. This small change might require some big and complicated changes in the Database architecture, code etc. So, after a fair amount of Brainstorming, you decide to add the CR. Your team says it’s a piece of cake and won’t take much effort. You know this team is experienced and have led this team before. So you agree to their decision. The CR gets incorporated and fortunately, things work out as planned. The new functionality gets added and the client is happy.

If the CR did require some serious amount of rework, the PM would have taken the call to postpone the CR to the next patch request or to add it to the current scope if the client was willing to accept the change in the delivery timelines due to the CR.

As seen above, the waterfall model can also add change requests pretty well. So why all the fuss over Agile? Well, in the above CR you must consider the following factors:

a)      The CR was not a complicated one. The team was experienced enough to handle it and the CR got integrated smoothly.
b)      This was a one off case and there were no regular and frequent CR’s requested by the client.
 
But what if you were developing a complex application? Let’s say for example, a web and mobile based social networking application (Similar to Facebook, Hi5 etc.). Such an application is complex in scope and is subject to various change requests. Would the waterfall model work well in such a case, or would it make sense switching to Agile?

That’s what we are going to analyze in Part two of my Blog.

Thanks for taking the time and patience for reading part one. Stay tuned for part two.

Regards,

Srinivas Pavan Addanki