Last week I told our technical writer, a music expert, a video games enthusiast, a good father to his young daughter, and a loving husband to his wife, that I could build him a small tool that could quickly update a master file of local translations, so he could focus his precious time on more important matters other than the job of laboriously cross-referencing and manually updating such a document. That was a passing comment while some of us were suddenly randomly discussing the process of how he was currently maintaining the file. However, the passing comment also felt like a pitch to a software development project that had some sort of value to a very specific customer, and an easy one at that. It was a fascinating experience; it makes you think about how caring for the well-being of someone is very much a part of building software of value, and that good software connects people for the better.
Let’s see how that tool works out this week.
Ultimately what makes software testing fun and challenging is because it needs you to interact with people. You have to talk to both the software development team and the application users. You have to understand what they care for and why. You have to ask questions and the answers to those questions guide what you do when you test. You can test in a silo but that doesn’t help you learn anything deeper, you can’t thrive if you stick to the things you already know. You grow because you take in all these perspectives and beliefs that other people have and test them against your own, for the goal of making better judgments about how to test the thing your testing and why you’re testing them in the first place. It’s not easy, because you have to care. The challenge is that you have to learn a great deal of many things, you have to regularly check the landscape of where you are, and you often need to reflect about what you’ve done and what you want to do next. And on the journey of overcoming the challenges you set for yourself is where the fun is.
I’m currently in the midst of a test code overhaul, a re-writing project of sorts. It started about a week ago and so far I’ve made considerable progress on what I’ve wanted to achieve with the rewrite, which is basically cleaner and more maintainable code, mostly in the sense of test data management and test description language. The number of tests running everyday in our Jenkins system has grown noticeably and I’ve felt that it’s been difficult to add certain tests because of how I structured the test data in the past, which I have not upgraded since then. The two possible avenues for running tests – on the UI and HTTP layers – also adds a bit of complexity and it’d be nice if I can integrate the two smoothly. It’s an interesting development because I did not plan on any re-writing to be done anytime soon but I guess at the back of my mind I knew it’ll happen eventually. And so I decided to take a step back from writing more tests and do some cleanup before it gets tougher to change things. I plan to finish everything in about a month or so.
At the moment, I’m reminded of the phases I’ve gone through in learning to code and writing automated checks in the past few years:
- Early 2014. It all begins with Selenium IDE, with giving the self some time to study the basic Selenese commands for writing automated checks and (more importantly) understand how to properly retrieve the page elements you want to manipulate.
- Mid 2014. Test management in Selenium IDE becomes difficult as the number of tests grow, hence the decision to switch to Selenium WebDriver. The only programming language background I had back then was C++, which was limited to only functions and logical/conditional operators, so I chose Java to work with to lessen the learning curve.
- Late 2014. Familiarized myself with Git, which hooked me on making daily commits and appreciating version control. Along the way I learned the concepts of classes and objects.
- All of 2015 up to Early 2016. I was in a trance, writing code daily and pushing myself to create all the automated checks that I wanted to run for our apps before every release. Tests run on the Eclipse IDE using TestNG and I was happy with what I had, except that those end-to-end tests are really slow. Running everything took overnight to finish, which was okay for my employer but annoying for me personally.
- Mid 2016. Re-writing existing tests in Ruby with Cucumber integration started off (when I found Jeff Morgan’s “Cucumber & Cheese” book online) as a side project for fun and testing my skill level in programming. And I did have buckets of fun! The experiment told me that there’s still a lot I need to practice on if I want to write better code, and it also told me that I can be more productive if I switch programming languages. There’s a bit less code to type in when writing code in Ruby than Java and I liked that, plus all the interesting libraries I can use. I switched to Sublime Text and used both Jenkins and the command-line interface more extensively too.
- Late 2016. As I was looking for ways to speed up end-to-end tests total execution, which by then takes about 4 hours to complete, I ended up exploring testing apps in the HTTP layer instead of in the UI. That took a lot of studying of how our apps actually behave under the hood, what data are being passed around, how images are actually sent, how to view pages without a browser, how redirections work, among other things. After years of testing apps via the user interface, this was such a refreshing and valuable period, and I completely wondered why I never knew such a thing existed until then. It wasn’t being taught extensively to testers, perhaps because it all depends on how the app was structured to run through an API.
And these phases brings me to now, where there’s a healthy dose of API and UI layer tests all checking major app features. It’s all good, just several pieces needing a cleanup, a little parallelization, better test description language, and great documentation. It’s all good, because the lessons in both programming and testing keep piling. The two practices differ in mindset but I think they complement each other, and I think that there’s no reason anyone can’t do both.
How does one become a creative person? Are we only being creative when we’re delving into the realm of the arts? Why do we say that some people are more creative than others? Does creativity contribute to success? We admire accomplished illustrators, actors, programmers, singers, writers, painters, dancers, poets, and designers of all kinds because of their creativity in their chosen fields of endeavor, because we feel they have good taste in whatever it is that they do, and often we desire to be like them, wishing to churn out great pieces of work too in our lifetimes. But what does it really take to be creative? Scott Berkun gives his take on his latest book, “The Dance of the Possible: The Mostly Honest Completely Irreverent Guide to Creativity“.
Personally, I don’t think much about what it means to be creative. I feel that thinking about its meaning doesn’t practically help me, because I’ve learned through experience that that only way to create good work is to do it, failing multiple times, learning along the way, and then succeeding. That’s what creativity has always meant for me – building things or solving problems that matter (to me or to other people I provide service to), whenever the itch is there or if the problems bug me enough. And reading Scott’s book felt like a confirmation of some sort of the beliefs I’ve had about creativity, plus a reminder to handle some of my habits better.
Here are some favorite lines from the book:
- It’s far wiser to think about the effect you want an idea to have. If the goal is to make someone laugh, fix their car or increase the revenue of the widgets their company makes, that matters far more than how “creative” an idea is or is not.
- We always have more freedom than we think, we just forget. We spend so much time trying to be efficient that doing anything interesting feels like a waste of time. And in this tendency is another misconception: creativity is rarely efficient. It always involves taking chances and trying things that might work but might not. The question then is: are we willing to spend time to be interesting, to think interesting thoughts and make interesting things? We all have the power, but perhaps not the willingness.
- To create means to make something new, at least for you, and to do something new is like going off of the map, or more precisely, deliberately choosing to go to a part of the map that is unknown. In this case it rarely matters where or how you start.
- You will, no matter how talented you are, have your finished works challenged and called not-so-good names. Good is surprisingly subjective, and the more creative the domain you work in, the more subjective it is.
- The ability to see an idea, or a thing, from many different perspectives is among the greatest assets a thinking person can have. Of course you don’t have to agree with someone else’s perspective, but you owe it to yourself to try to see what they do. They may see something important you’ve never noticed before, however small, that can improve what you’re making or what you make in the future.
- I don’t know a single productive creative person who doesn’t have a scrap pile of unfinished projects at different states of completion. This is not waste, but a precious archive of projects that might need to breathe, or of spare parts that may be perfect for other projects.
- Some movies and books are poorly received when they’re released but become popular decades later. Others are big hits at first but fade over time. What is good? The answer depends on what your goals are and what problems you choose to solve.
- No matter how great your idea is, there will be energy you have to spend, often on relatively ordinary work, to deliver it to the world.
- Take pleasure in making things for the sake of making them: what a gift to have the time to make at all! If you were born 200 years ago, or to different parents in a different country, you wouldn’t have the time to feel bad about your work, because you wouldn’t have the wealth and time required to try. If you feel love for your craft, honor it by showing up, even when it’s hard. Especially when it’s hard. Working when it’s hardest often teaches rare lessons that will earn you easy rides now and then. Take pleasure in small progressions when you see them, and know those hard-won gains are the only way anyone in history has ever achieved anything noteworthy—for themselves or for the world.
- If you truly love your craft, there is an infinite number of projects in your future. There will be other chapters. There will be other canvases and other songs. Perfection is a prison and a self- made one. Whatever you’re making, it doesn’t have to be perfect. Perfection is an illusion.
- Expect to be rejected. You will be. It will happen no matter how successful you are.
- Do one project for commerce and one for art. It’s an interesting approach: maybe the best work can only be made if it serves only one master at a time. It’s a healthy exercise to both make something entirely for yourself and entirely for other people. In each case you will stretch your boundaries for what you are capable of, as so often those conflicting desires of satisfying ourselves and satisfying other people bind us to conservative choices.
- Too often we are distracted away from what we say is important by things that are more pleasurable or convenient. This means a central skill any creative person needs is a mastery of time, which means a mastery of habits. There will always be easier things in our lives than creative work. There will always be demands on our time that are more logical and lucrative than chasing an idea. If you are truly passionate about something you must be willing to make sacrifices to make it possible. What good is that passion if you can’t use it to help you do the work? Merely saying you are passionate, or feeling passionate, is not enough.
- The simplest habit is to work on your project every day. If you don’t have a project, go to your private journal or drawing notebook daily until you do. It can be for ten minutes or an hour, but you must touch the work at least once a day. It can be in the morning, or late at night, or during your lunch break at work. At first when and where won’t matter. All that counts is that you commit to the discipline of honoring your ideas.
- We all have the same time limit of 24 hours every day, which means the difference between a productive creative person and an unsatisfied dreamer is in how they choose to use it. Most of us forget how much of our time goes to entertainment, things we do purely for pleasure. We have plenty of time—it’s just we have to protect it for the things we claim are most important.
- “Will anyone care about my work?” people often ask. Yes—you. It starts with you.
If it feels difficult, exhausting, and inconvenient to update an existing test (or system) code, it may be that you don’t completely understand what the code does or it may be that the code really is written badly. Either way both situations present a learning opportunity: the former to fully grasp the business rules for the particular code you want to change, the latter to review the purpose of the code and to rewrite it in a way that’s helpful to the team.
Complaining doesn’t help; it only prolongs the agony. Care instead, discuss with the team to check if the change is actually necessary, and, if you think that it is, leave the code better than when you found it.
One of the great ways to be updated with what’s happening in the testing community is to attend software testing conferences, talk to the speakers and attendees, and ask questions. But if you don’t have the budget to fly over to where the conference is (like me), the next best thing is to wait for the conference recordings to be uploaded online. That’s how I’ve kept up with the latest news in test automation, following both the Selenium Conference and Google’s Test Automation Conference. All these recordings on YouTube paints a picture of what experiences and opportunities are currently out there for software testers.
And recently, I decided to free some time to follow Agile Testing Days and see what went on over at Potsdam, Germany. It was my way of checking out what’s happening in the agile testing community someplace far away from where I am. And today I’d like to share some of my favorite talks from that event:
- Designed to Learn (by Melissa Perri, about testing product ideas, experiments and safe spaces for them, and learning what customers want and need)
- Snow White and the 777.777.777 Dwarfs (by Gojko Adzic, about factors that may likely change testing policies and practices in the coming years as a result of computing power getting cheaper, such as third party platforms, per-request payments, multi-versioning, machine learning, mutation and approval testing, testing after deployment and failure budgets)
- Continuous Delivery Anti-Patterns (by Jeff ‘Cheezy’ Morgan, on eliminating branches, test data management, stable environments, and keeping code quality high)
- NoEstimates (by Vasco Duarte, about leaving out estimation in software development projects)
- From Waterfall to Agile, The Advantage Is Clear (by Michael ‘The Wanz’ Wansley, on software testers being gatekeepers of quality, growing up in a waterfall system, and the wonderful experience that is software testing)
Whenever there’s an issue in production that I can’t seem to replicate quickly in our development environment, the problem reminds me that I have not tested everything in our software, that there are gaps in the model I’m currently using to test our application. The mistakes I make in diagnosing a problem helps me improve but also tells me that I have not explored our systems enough, or that maybe I have forgotten something that should help me test, or that perhaps there are modules that have changed since I last visited them.
More importantly, such scenarios prompt me to remember that I literally can’t know or test everything, that I need help in these cases, and that is precisely why it takes a whole team always extending continuous effort to bring quality up to a point where customers love our app. That means everyone’s testing skills need to stack up, salespeople, testers, programmers, product owners, everyone.