Friday, 29 June 2018

On What the Famous John Barnes Rap Can Teach us about Software Engineering Practice

A Short and Tongue-In-Cheek Treatise on what the famous John Barnes Rap (from England's World Cup 1990 official song) can teach us about development and Software Engineering practice.



1) "You've got to hold and give but do it at the right time"

Knowing what and when to delegate is a critical skill of any dev or test lead. Be always aware of the demands placed on your staff and ensure that you delegate work they have the skills and time to finish and no more.

2) "You can be slow or fast but you must get to the line"

There are times when it is understandable to prioritise speed over some quality (i.e. for a new startup with limited resources pushing to be the first to market), however generally it is good to prioritise project quality and delivery over fast completion for the sake of it. Be wary of demands by management for unrealistic or deleterious deadlines. Getting to project completion with good quality is all important.

3) "They'll always hit you and hurt you, defend and attack."

It is true that implementing process change in software engineering may well cause friction in teams. You may face resistance, be it by fearful defensive colleagues or naysayer managers. Influencing skills are crucial.

4) "There's only one way to beat them, get round the back..."

To implement quality principles you may have to alternatively solicit support and resources from PMs, stakeholders and CIOs.

You could also implement a pilot or smaller solution yourself and demonstrate it.


5) "So catch me if you can cause I'm your England man"...

The English software engineering job market is competitive and favours those with quick thinking and the ability to hit the ground running.

6) "And what you're looking at is the master plan"

Overarching master development and test plans are discouraged in agile development but can be sometimes useful. If you do use them, share and explain them with your team and appropriate stakeholders.

7) "We ain't no hooligans. This ain't a football song"

Hooliganism and other antisocial behaviour is deeply unprofessional and should play no part in well functioning software teams. Also remember that loud football chants in quiet workplaces may not be appreciated by colleagues.



Monday, 25 June 2018

10 Minute Rant 2: Ten Skills that are Probably More Important for Testers than Tools and Test Automation

My second ten minute rant blog, designed to break out of a spate of blogger procrastination.

(With credit to Sprint 4: The Bloggers Club on the Club, Ministry of Test)

1) Analysis and Systems Thinking

2) The Ability to Communicate with Tech Colleagues, Support, Management, Business People and Stakeholders

3) Observation, Modelling and Note Taking

4) Curiosity and a Desire for Exploration

5) Tenacity

6) Empathy for the User

7) Business Domain Knowledge

8) Formulating Rational and Consistent Arguments

9) Persuasiveness and Influencing Skills

10) Common Sense

Each of these so-called "soft skills" are critical for testers to truly perform well (IMHO) and yet most generic testing or QA job ads I see these days gloss over the above (if they are even mentioned at all) and involve a checklist of test case management and defect reporting tools, programming and test automation technologies. People can learn tools and how to program - it is much harder to rectify deficiencies in most of the above.

I suspect that the reason for this is that employers and recruiters tend to think that programming and test automation can either overcome deficiencies in the above or that testers are fungible and all have some default level of skill in the above simply by virtue of the fact that they call themselves testers.

Sad really…

Saturday, 14 April 2018

Reflections on the Scripted Test Case



I have my reservations about the pre-scripted test case. I am more happy to use exploratory testing charters, automating the checking part, in my work. Being quite confident in coming up with test ideas on the fly, I find it far more interesting and personally find it results in more defects.
In my career I have only ever worked in one company that used exploratory in a major way (and it was I who implemented it as test lead!). In my experience, where manual approaches are taken the majority of the work is done using pre-scripted tests - based on the examination of requirements documents or user story in some tracking system like JIRA, approved in advance by a test manager or stakeholder and then executed sequentially. The test lead or project manager would monitor the execution of each test, produce lovely graphs and may even set rough targets of “X” tests completed per day.

In fact, according to this 2017 survey on behalf of Practitest, 58% of respondents still used scripted testing (the second highest testing methodology behind exploratory) and 56% created detailed scripted test cases - the latter having actually gone up slightly from 2016.

As a tester I have an uneasy and visceral relationship with this approach, although I have and still do work in projects as a tester with scripted tests. The idea of testing as crossing off a long list of manual checks is a very poor definition – especially in an agile context. When test execution metrics are applied and a daily test execution target set the incentive is not to enquire and investigate but to get through as many tests as possible. We are judged on our efficiency, if this is such a measure of it, and not on our ability to evaluate the product, think outside the book, come up with new real-time strategies – the tasks that should be the “bread and butter” of the testing role. It also relegates our conception and reporting of the product to a sum of minute behaviours taken separately from other. A product is fit for purpose when “enough” of its test pass. Test cases may be regarded as a type of document but as far as documentation goes they are usually pretty poor. If they weren’t then we would be including them in manuals and posting them in our site support section, however this is never done without substantial rewrite.

They also make great presumptions about the product before its release, especially when detailed steps are included. It takes an incredible amount of detailed documentation or a very precise oracle to come up with test case steps that are still relevant at the end of the development process. Done afterwards, the current behaviour of the product can bias their steps and expected outcomes, not to mention the perverse fact that to write the test case steps you have to “test” the product anyway.
Nevertheless, from the perspective of a busy test manager these can be seen as a dream, especially in reporting, communicating and negotiation with the PM, development team and key stakeholders. They provide easy (if somewhat naïve) metrics, almost instant evidence that the test team is “doing something”, and fast answers.

Test cases are a deliverable in themselves (and I have often seen them required as a deliverable to stakeholders before allowing the start of testing).

What are testers doing right now? Writing Test Cases! Are they testing what we want? Take a look for yourself, read the test cases! Is testing efficient? We completed an average of X tests per day! How serious is that defect? It breaks Y test cases, it must be serious! Why do you need more testing staff? Our "velocity" shows that we will only have 75% test case completion by the end of the test cycle, without the extra hands we can’t complete testing!

Test cases, in much the same way as widget creation in factories, act to de-skill the testing process. The real mental effort is involved in coming up with testing scenarios beforehand, however once the cases are done, depending on their detail they can be given to anyone, tester or not, to complete. In this point the tester becomes a pair of hands, an admin assistant with a checklist. Once we decide we want to, we can replace the tester with an automation script – think of all the money saved!

Also, despite its inherent inefficiencies, deskilling, ennui and lack of real depth and flexibility a test strategy of rote execution of a suite of manual scripted checks can be effective and I have worked in successful projects where this has been done. Much of this depends on how much the initial requirements do not change between their elucidation into test cases and the completion of test execution, how “high level” and open to exploration the test scenarios are and the amount of time and human resources available.

The above reasons are why scripted manual tests are so common in IT teams outside of tech companies and those relying on heavy automation, CI and fast regular releases. In fact, where I see a test approach consisting of mostly scripted manual checks, it is nearly always requested from top-down or mandated as part of an overall quality strategy. Otherwise they are enforced by the use of tools such as QTP which have very prescriptive views of testing.

Scripted testing methods are very easy to manage and report on. I do not believe that they are ever going away unless we can apply reporting of exploratory, bug bash and other testing methods that address all of the management communication points above. James Bach and Michael Bolton, in Session Based Test Management, have provided some answers to the reporting challenges above – thus showing that addressing these is not intractable.

Friday, 23 February 2018

On “Testing vs Checking” and other Oppositions - Dialectics and Deconstruction


Software testing appears to be riddled with contradictory narratives argued from opposing sides. We argue about what is "testing" vs "checking", "traditional" vs "modern" testing approaches, "scripted" vs "exploratory" and make arbitrary distinctions to argue about "automated" vs "manual" testing. In these cases, the opposition is not just based on semantics and meaning but also on value (i.e. that one is wholly “better” than the other). Despite efforts of testing practitioners to debate these topics online or at conferences it is arguable that the arguments on either side are not significantly more sophisticated than before and no more likely to be resolved by consensus. In the second of my blogs touching on postmodernism and testing, I look at the nature of oppositional debate and touch on why that could be.

I also, through concepts developed by the philosophers Hegel and Derrida, theorize that we can question the oppositions above when we see them in a text by a process of dialectic and  deconstruction to develop more sophisticated, contextual and progressive propositions.


On Dialectics, the study of Discourse


The reasoned discourse between two opposing arguments being debated is known as a dialectic, a philosophical term dating from the classical Greek period of Socrates and Plato. Among the earliest noted examples are the Socratic dialogues, where statements are clarified via questioning and their logical consequences studied until a contradiction arises that refutes these statements. Socrates' aim was to find truth, therefore he had no qualms about changing his arguments to further that aim. It is closely related to rhetoric (the public defending of beliefs and attacking opponents) but seen as a counterpart to it (notably by Aristotle). In the middle ages it was included within the teaching of Logic.

In modern times the dialectic was revived by the great German philosophers JG Fichte and later, GWF Hegel. Based on ideas by Immanuel Kant, Fichte described the dialectic as the triad Thesis-Antithesis-Synthesis (later misattributed to Hegel), with the definitions below -

• Thesis - Some Statement or Proposition

• Antithesis - A statement that negates the Thesis

• Synthesis - A process in which the Thesis and Antithesis are reconciled to form a new proposition.

In Fichte’s definition, the Synthesis could be used as a Thesis in a future dialectic. The continual synthesis of thesis and antithesis in a chain would constitute more sophisticated understanding and progress.

Credit to https://questians.wordpress.com/2010/12/14/a-dialectical-approach-to-the-bible/

Example 1: Hegel's Being and Nothing


Hegel's book "Logic" provides the following example regarding existence.

•Thesis - Existence must be posited as pure Being

•Antithesis - Pure Being, upon examination, is found to be indistinguishable from Nothing

•Synthesis - When it is realized that what is coming into being is, at the same time, also returning to nothing (in life, for example, one's living is also a dying), both Being and Nothing are united as Becoming.

Example 2: Marx’s Theory of History


Marx and Engels took the Hegelian dialectic from a context purely of ideas to a materialist context (that of the real world of production and economics) to denote how they saw change and progress would develop in societies. In Marx’s theory of history, the thesis and antithesis were different classes within society and the synthesis would be societal transformation resulting from inevitable conflict between these classes.

Image result for marxist dialectic
Credit to https://www.pinterest.com.au/pin/346073552589181632/

Each of the above involves some overcoming of the negation (antithesis), resulting in keeping the useful parts of an idea to develop a more sophisticated proposition (which Hegel called Aufhebung or Sublation). Hegel stated that this "negation of the negation" would result in incorporating the opposing idea into itself. In doing so this was the foundation of the Hegelian dialectic, providing a counter-approach to the skeptical Platonic dialectical method of “reducto ad absurdum”, where following a contradiction the thesis would be rejected, leaving us with nothing. Hegel believed that contradictions were a necessary outcome of reasoned argument, thus only a synthetic approach would bring us to a complete truth.

Semiotics - A Dualist Notion of Words and Signs


Later in the 1800s, Ferdinand de Saussure, the so-called Father of Linguistics, proposed a structured interpretation of the use of words, signs and utterances. He called the word or phrase used the "Signifier", and the concept or object referred to by the Signifier the "Signified". His great contribution was to note that the Signifier did not necessarily have to have a connection to the Signified - this is completely arbitrary and the brain acts to combine the signifier word to the signified concept based on some customary or agreed relationship. In doing so, the brain synthesizes and provides meaning to the sign. This is a sort of application of the Hegelian Dialectic. The study of the relationships between and use of signs and words as described above is known as Semiotics. For the purposes of this essay, “word” and “sign” will be treated as synonymous.

How can a word and its meaning have no actual connection? Saussure made the case that words only have meaning relative to other words. Therefore the word "tree" only has meaning when distinguished from the words "bush" or "shrub" - only having use as part of an overarching structure of synonyms and antonyms. Also the relationship between Signifier and Signified changes over time, such that some words become dated as circumstances change. In this respect, Saussure was considered a pioneer in the field of "Structuralism".

Derrida - Spot the Différance

Jacques Derrida

In 1963 the great French Postmodern philosopher Jacques Derrida took de Saussure's ideas to the next level. He stated that signs (including words) can never in themselves denote what they mean. They can only do so by deferring to a potentially endless chain of other words (signifiers) that they differ from. Also our understanding of word meaning changes with each reading and over time with the changing definition of existing and new introduction of new words.

This results in what he called "espacement" or spacing, stating that this differentiation causes binary oppositions and hierarchies.

Derrida coined the term "différance" (sic), a deliberate misspelling to denote not just the difference between words but the concept of hierarchy and deferral (to defer in French is "differer"). It includes the fact that the word can only have meaning within the context of the text ("there is no outside text").
According to Derrida, this chain of signifiers will never get to a point of a complete meaning that transcends context and is understood at all times and by all parties (the so called "transcendental signified", used in philosophy as an ontological argument for the existence of God).

However, he pointed out that the opposition of words and signs with others express not just meaning but values.

"On the one hand, we must traverse a phase of overturning. To do justice to this necessity is to recognize that in a classical philosophical opposition we are not dealing with the peaceful coexistence of a vis-a-vis but rather with a violent hierarchy. One of the two terms governs the other (axiologically, logically etc.) or has the upper hand.

To deconstruct the opposition, first of all, is to overturn the hierarchy at a given moment, To overlook this phase of overturning is to forget the conflictual and subordinating structure of opposition."

Binary Opposition


Many word pairs in binary opposition have not just logical but also value oppositions depending on their use. Examples include "Christian" and "Pagan", "Left" and "Right" (philosophical/political sense), "Speech" and "Writing", "reality" and "fiction" and "reason" and "passion". Different authors and readers at different times will value one over the other. Depending on their understanding by the reader, their definition at the current time and their use in the text, the differences in meaning and value between the two are variable and changing. Derrida called these discrepancies "traces", thus stating that a word not only denotes its own meaning but, by the its partner in binary opposition, what it does not mean (which he referred to as the "absence of the present").

This "deconstruction" was the ongoing practice denoted by Derrida for all texts to be studied for conceptual and temporal oppositions and these broken down to develop new meaning. It formed his life's work and is heavily influential in postmodern philosophy, law, linguistics, LGBT studies, psychoanalysis and literary theory. Note that the structures of word opposition remain and are required for any sort of communication, however the act of deconstruction allows for them to be broken apart and the gaps between the implied sense of each word in opposition to be analysed and understood within the context of the text.

It must be stated that according to Derrida, unlike Hegel's Dialectic, these oppositions (Thesis and Antithesis) are irreducibly complex and unstable. They could be understood and their différance noted and determined, however they could not be synthesised into a whole as Hegel proposed.

"The oppositions simply cannot be suspended once and for all. The hierarchy of dual oppositions always re-establishes itself. Deconstruction only points to the necessity of an unending analysis that can make explicit the decisions and arbitrary violence intrinsic to all texts."

The above ideas are controversial and have been disputed (particularly by John Serle and Alan Sokal) however they can be used as a model to approach the contradictions and arguments stated in my introduction.

Applications to Testing Discourse



By applying the concepts above we can make assertions about the oppositions so heavily debated in testing. The pairs "testing" vs "checking", "scripted" vs "exploratory" and "automated" vs "manual" testing, in the context of how they are usually debated, are treated as binary opposites. As stated in the introduction, arguments around them also imply not just logical or semantic opposition but value opposition (i.e. that one is "better" or more worthy than the other).

An Example - Testing vs Checking


Let us take a look at the first example, “testing” vs “checking”.

Personally I would define “testing” as a systematic exploration and investigation of the application, less algorithmic and more a constant thinking process. I would equally define checking as a more systematic procedure of experimentation and comparison of a scenario outcome with some expected result or test oracle, then moving on. However my definitions are meaningless without appeal to the implied meanings of the other words in my propositions above - and the words they are related to. I also admit that the simple words “testing” and “checking” are probably inadequate in explaining what I had in mind. In taking sides or commenting on a debate of “testing” vs “checking” it may be that I state or imply a hierarchy of value - i.e. that “testing” is better (or worse) than “checking”.

"Testing" defers meaning in its relation to other words such as "exploration", "analysis", "scrutiny", "thinking", "investigation" - which themselves can only be defined by relation to others. Equally the word "checking" also only has meaning in its relationship to other words such as "control", "find out", "learn", “comparison” - each deriving meaning by relation to other words. At some point the "web of language" (another term defined by Derrida) may overlap and both words may derive meaning from at least some other common words, however this does not necessarily mean that they are the same.

They are (contentiously) defined by what they are not. "Testing" is "not" "checking" (same as "Automated" is not "Manual" etc). Their meanings cannot be determined outside of the context of the text they were written in, the time they were written and the fickle views and understandings of the writer and reader. No transcendental meaning exists outside of this.

These represent a dialectic, and from a Hegelian perspective an effort should be made to synthesize them into a whole. However a deconstructionist perspective would dictate that these differences are necessary (at least until some new words are developed with more sophisticated meanings) and irreconcilable and contain an inherent violence of meaning and value. This may explain why after many years we are still having angry debates online and at conferences about these oppositions.

So what can be done? The way to address this is to deconstruct each use of the words in their context and time.

• For example, when we see the word "testing", does this mean a specific incident of testing or the general practice?

• Instead of testing, what other words can be used to describe what the practitioner is doing? Is the word "testing" adequate?

• Who is apparently doing the "testing" - one person, a machine, a group of people, a context driven tester?

• When was the text written and how was testing defined at that time?

• Can a single word apply to all investigative approaches in every company? What does the author think of testing and what other words are used to describe it? What about the reader?

• Are there instances where "testing" and "checking" could mean the same thing? What may these be?

• Regarding the "value" of testing vs checking, who says that one is better than the other? How is it, and under what circumstances can that hierarchy be overturned?

• What "testing" are they referring to, based on the questions above, and in what context? Has one always been better than the other?

What can those who engage in the debates do to clarify the points above to the reader? One way is to publicly state clear and sophisticated definitions of “testing” and “checking” as one sees them. James Bach and Michael Bolton, in their co-written 2013 article “Testing and Checking Refined”, go to great lengths to do just that - along with their definitions of related words that would fall within each one’s “web of language” (such as evaluation, exploration, learning etc.). Also included are narratives of the definitions along with various implications.

“Testing is the process of evaluating a product by learning about it through exploration and experimentation, which includes to some degree: questioning, study, modeling, observation, inference, etc.

(A test is an instance of testing.)

Checking is the process of making evaluations by applying algorithmic decision rules to specific observations of a product.

(A check is an instance of checking.)“

However, while this is better, from Derrida’s perspective the extensive web of language behind these definitions and their related words, in the specific text and time they were written in, will always prevent these definitions from being perfect and unchanging, the basis of a founding philosophy of software testing.

Michael Bolton, in a follow-up piece on his blog, also attempts to take the hierarchy of value out of the debate. He makes it clear that his (and James’) side of the debate is to reconcile checking in a more complex definition of testing that embodies but distinguishes between the human, reflective and thought driven tasks and algorithmic/mechanical and process driven tasks.

“I would like to emphasize our goals here. Our purpose is not to denigrate checking, nor to disparage the use of tools, nor to deplore those people who are asked to do human checking. On the contrary: we’re attempting to deepen our understanding of our craft; to show that checking is deeply embedded in testing; to emphasize that tools and the skilled use of them are essential to our work in many ways; to realize that humans will always inject human elements into the things they do; to realize the value of those human elements and the risks involved in asking humans to behave like machines. We must be clear on the differences between what humans do and how our processes and tools—media, as McLuhan would call them—do. Or more accurately, the differences between what we do and how our tools affect what we do.”

This removes the opposition entirely by making checking a subset of testing - arguably a successful Hegelian, synthetic approach.

Epilogue


The questions posed in the example of the binary opposition “testing” / “checking” can be applied to texts containing the other contentious testing oppositions mentioned.

The process above is necessary, if not to remove or synthesise oppositions out of the picture, to create propositions and assertions with more contextually accurate and sophisticated meanings. With the debates we are currently having, unless we deconstruct the concepts we are using in the texts they are written in we are arguing over shadows. Then can we make headway in some of the tense binary oppositions that have dogged the testing profession for many years.

Useful Links and References









James Bach, “We use tools” http://www.satisfice.com/blog/archives/1598


Jermais Rossler, “Testing vs Checking, so what?” https://medium.com/@roesslerj/testing-vs-checking-so-what-9eb4c97c166c

James Bach (cowritten with Michael Bolton), “Testing and Checking Refined” http://www.satisfice.com/blog/archives/856

Michael Bolton “On Testing and Checking Refined” http://www.developsense.com/blog/2013/03/testing-and-checking-redefined/










Wednesday, 3 January 2018

Some of My 2018 Learning Goals, and Free Resources to Help in Yours

With us now in January 2018 and the Christmas pies and frivolities becoming a distant memory, it is traditional to see this time as that act of penance and discipline! We enrol for the local gym, take a month off the drinking and increasingly look to improve our skills.

My efforts to eliminate the Christmas gut being beyond the scope of a software testing blog, I wish to detail with you a few of my NY resolutions to develop my skills and achieve my various goals. In the hope that you may find them useful in your learning endeavours, I list various relevant free resources I have come across.


1) Practising Programming


I am studying a part time IT graduate diploma, with the option to articulate to a Masters degree if I choose to. This is already very programming-intensive (and I have used Python, SQL, C, Java, Bash, Prolog and Perl as part of my course), however my last module done in the first half of 2017 was programming-lite and I took the second semester of 2017 off entirely. Not working in an automated testing role at the moment and not having a lot of side projects on, my programming skills are (hopefully temporarily) rusty.

In order to hit the ground running when my course restarts in late Feb, and also to develop my coding generally, I am endeavouring to devote an hour per day to learning coding - for application development and test automation (more on that later).

Whilst there are more online resources for this then I could possibly list, in just about any language existent, I am particularly fond of the professional Massive Open Online Courses (MOOCs) at Pluralsight and Edx.

Pluralsight is my personal favourite of all the various online tutorial sites, and its videos and tutorials are generally of a very high quality. It is not free, however for those with an Office Online email account it is easy to obtain a free 3 month subscription to this via registering on Microsoft's Visual Studio Dev Essentials site.

Edx, a well known academic MOOC provider, contains many courses but I recommend a truly excellent introduction to programming - MIT 6.001x Introduction to Computer Science and Programming Using Python - which is self paced and can be audited (done without certification) for free. Completing it is how I learned and got a grounding in Python. It is not an easy course and the weekly programming challenges and quizzes are quite challenging and need to be completed on time. It is however extremely rewarding. The follow-on course for those who complete the above (and which I have not completed myself), MIT 6.002x Introduction to Computational Thinking and Data Science, uses Python to apply various concepts from Computer Science such as graph optimization and dynamic programming before moving onto statistical methods such as Random Walks and Monte Carlo. I plan to return to MIT 6.002x at some point this year.

2) Test Automation


With respect to test automation resources, I am keen to devote myself to learning API testing before returning to UI automation.

In view of this, since I already have some experience of using SoapUI I will try to learn Postman API. Danny Dainton provides some great tutorials and examples on his Github project, which I plan to work through.

3) Machine Learning


I took an AI module a few years ago and was fascinated by it. It was going to study a machine learning module as part of my degree however am not able to do it this year due to missing a certain prerequisite. I therefore wish to, and coming from a strong maths background should be able to study Machine Learning is my own time this year and see how proficient I can get.

I have been avidly watching and doing a few homework exercises from two courses by Nando de Freitas, a professor of Statistics and Machine Learning at the University of Oxford and the University of British Columbia. His lecture style is engaging and easy to follow and the courses are quite entertaining.

The UBC undergraduate machine learning course from 2012, for which all lectures are on youtube and exercises and projects are available, encompasses material from basic probability theory right up to Bayesian Classification and Deep Learning. With the exercises requiring a knowledge of Python, various tutorials are linked to and included.

As a follow on, de Freitas' Oxford course in Deep Learning goes much deeper into the theory, however whilst the videos are freely available the course notes and exercises are sadly hidden to non-students. It is still worth checking out however.

Summary

The above projects are what I plan to work on for the first half of this year, my academic studies permitting. If you have any ideas of other resources or projects that I could learn from, I would be most grateful.