Some thoughts on Anthony Bourdain, suicidal ideation, and the “switch.”

Those with “good neurotics’ calendars” (HT J.D. Salinger) will remember the first week of June 2018, when both Kate Spade, an internationally beloved designer, and Anthony Bourdain (whom I probably need not introduce) took their own lives. Something seems to have been in the air: suicides often come upon us like that, in small clusters, for no apparent reason (although there does seem to be a cluster effect for suicides, which may or may not have tipped Bourdain’s own hand). I can vouch for there being something unusual about that week, because that was the week I came as close as I ever have to taking my own life.

The shock and grief brought on by the deaths of Spade and Bourdain took some familiar forms. Over and over, you would hear that these two people were beyond accomplished, had love in their lives (or so it seemed), and by all accounts were in no financial trouble. There’s no reason to doubt that any of that is true. And yet.

I know Bourdain’s life and work far better than I know Spade’s, so I’ll focus on Bourdain in this piece.

Anyone who has personal and extensive experience with depression will find ample evidence of the black dog in Bourdain’s writing and spoken word. Fortunately for Bourdain, he appears to have found a way to enjoy what his life had to offer, up to a point. No one can know how often Bourdain had contemplated suicide, or for how long that had been going on. I suspect he’d dealt with suicidal ideation intermittently for years: turning one’s face determinedly to the good things in life can be a way of denying one’s thoughts of suicide. I should know.

Despite best efforts at self-care, the years 2017 – 2018 brought me the most intense and frequent suicidal ideation I’d ever experienced. (I’ll refer to suicidal ideation from now on as “SI.”) That period has passed, probably permanently, for reasons I’ll get into later. But for a while it was grueling and almost proved to be lethal.

I have a classic setup for SI: I’ve been moderately depressed since my teens (I’m now in my fifties). I also happen to be one of those older non-men who, once their parents die, do not have stable, close relationships to sustain them, and, what’s more, can’t form them. This despite therapy, medication, recovery groups, prayer, reiki, a great education, lots of interests … bla, bla, bla.

My mother died in 2015; my dad had died years before, and I have no siblings, no partner, and I placed my only child for adoption in 1999. I spent a lot of time after my mother’s death trying to “fix” a lifelong tendency toward isolation. I wondered dozens of times a day, in good obsessive-ruminative fashion, why my life had come to this point: the physical feeling was of being hunted and something finding me. The intensity of the feelings of isolation and the despair that came about because of them led (for me) inevitably to suicidal ideation. All the while, of course, I was working fulltime at tech jobs and getting great reviews, involved in recovery, seeing a counselor….

At the end of May 2018, I embarked on yet another “fix” attempt: a mettabhavana retreat, where you sit quietly for a few hours a day (with breaks) and attempt to summon feelings of lovingkindness. For some people, this type of meditation is fruitful. I. Felt. Nothing, other than my habitual anxiety and restlessness. I looked around, saw people feeling peaceful. I heard them talk about the feelings of lovingkindness that seemed so easy for them to invoke. All I could muster were lists of things I wasn’t getting done, and lists of people who were no longer in my life. Once again: what, the hell, is wrong with me. Why am I so different from so many people.

So: I left the retreat early, and unsurprisingly a bout of SI came on. I bought a plane ticket to a city where I knew on good authority that a good means of suicide was available legally, cleared out my fridge, made sure my will and my account beneficiaries were in order, and boarded that plane on June 3. I fully intended at the time to execute on a crystal-clear plan.

But … for me the experience of SI is like a switch: up until quite recently, it flipped on and off beyond my control. As I waited at an airport gate during a layover in the early morning hours of June 4, I looked up from my book and around me at the other people at the gate and …. I no longer felt like taking my own life. Nothing about my life had changed: I simply lost interest in the project in the blink of an eye. I still felt hollow and entirely alone, but, being the resourceful fruitbat that I am, I knew that my destination had quite a bit to offer to a traveler other than a reliable means of suicide. So I got to my city of choice and started to explore.

I hopped around, I ate well, I stayed hydrated. I don’t drink or use street drugs (sober 17+ years in a fellowship), so the influence that those substances can have on the formation of SI was not a factor. The city was lovely in a rugged way and people-watching was superb. Dogs roam the streets there, a few of which are friendly, and picture-taking opportunities abounded.

I got up on the morning of June 5 and refreshed Twitter, where I learned that Kate Spade had taken her own life. When I hear about a suicide, I generally look for the presence of alcoholism first, since the abuse of alcohol increases the risk of suicide attempts. I did not have far to look: Spade was candid about her abuse of alcohol and it’s not likely that she ever was able to find any recovery. I’m not that familiar with Spade’s work, but as a fellow alcoholic, I felt bad for her that she didn’t have the extra chance that sobriety would have given her.

I continued to hop around, eat well, and drink a lot of water. And on the night of June 5, the SI returned. Nothing happened to provoke it. For me, SI is a fast-moving storm of thoughts and feelings. Once again, I resolved to get what I ostensibly had made the trip for. Is it possible that the news of Spade’s death influenced me? Maybe. It’s hard to say. But it’s not worth it to put suicide down to being influenced by other’s suicides: there’s too much else in the mix. And it also leads to blaming people who take their own lives.

I got up the morning of June 6, determined to find my quarry. I drank some water, got out on the street, and … up came some spite against a Problem Person in my life. Just like that, I lost interest in killing myself. Because, you see, then he Would Win, and I couldn’t have that. But if it hadn’t been that thought, it would have been another: the switch simply flipped back. And it stayed in the off position for the remainder of the trip.

On June 7, I went on a wilderness excursion, before which I ate some of the local produce. This led to my getting a nasty stomach bug. So. I got to the top of the mountain (barely), found privacy by tucking myself into literal nooks of the forest, held on to vines to keep from falling downhill as, mere feet away from other tourists, I shat violently and uncontrollably, and then got myself back down the mountain (my guide had left me in his dust). I settled my very smelly person in a local restaurant and realized I was too sick to make the return trip back to my base. I asked for help from my waiter in a second language, who walked me to the cheap and quiet hostel where he was living for the summer. I checked in, made a trip to the pharmacy across the street for electrolytes and an antibiotic, and began a physically miserable night. Absent and unaccounted for: depression and SI.

That evening, I had to go to the train station to get myself a train ticket back to my base. As the attendant mansplained to me why it wasn’t practical for me to do that, a small child found me and started jumping up and down in the bit of space between me and the top of the ticket counter. Why this child would have picked slouched-over, smelly me as a target for hijinks is beyond me. At any other moment in time, I would have found this incredibly annoying, especially as sick as I felt: instead, I found it comical and, in a weird way, affectionate. The child grabbed for my glasses, which I’d laid on the ticket counter, and I quickly moved them out of the way. They jumped up and down for a little while longer, then moved on, perhaps to another hapless yokel. Sadly, I didn’t make eye contact; at the time I didn’t want to egg them on, but now I’m sorry I didn’t look at them. I am not sure I didn’t hallucinate this child: I was running a slight fever. Either way, I’ll never know. And in the meantime I had carped at the agent with sufficient force to secure a train ticket for the next day.

After I got back to my room, I rolled around most of that night between the bed and the toilet, and my WiFi connection was poor. So I listened to the audiobook of Angela Davis’s “Freedom Is A Constant Struggle,” which I can recommend to anyone who needs some spiritual, realist sustenance in the late Anthropocene. I didn’t have WiFi till mid-morning, and when I refreshed Twitter I saw the news about Anthony Bourdain. That day, Twitter was a good place to be, just to be among the many who grieved him.

I thought: how odd, and not odd, that Bourdain and Spade, who seemingly had everything to live for, are now gone, both by their own hand. And I, who have very little in terms of close human connection and nowhere near their level of creative success, am still here.

Bourdain aptly described himself as an “enthusiast” in his Twitter profile. I watched his first show for quite a while in the aughts, then left off when I stopped subscribing to cable. By most accounts I’ve read, he became a gentler and more expansive presence after that. He could have taken a gentrifying, neocolonialist outlook on the world, as people of his ancestry and wealth so often do. His show would have gotten great ratings anyway, because many white U.S. TV viewers lap up scorn against the poor and people of color. Instead, he tried to be a student of and friend to the people in the countries he visited, especially the poor and uncelebrated. And grownups all around the world responded to him as children had done to Mr. Rogers. There are no doubt people who still bear some resentment against Bourdain; his wit, and the anger behind it, could be savage. But he mostly punched across or up, rarely down. And anger frequently hides grief.

Part of the reason I am still alive when Spade and Bourdain are not is because I no longer suffer from active alcoholism. Bourdain may have walked away from heroin, but it’s clear that he was not able to do the same with booze, and what looked to many like fun party times in the last few years of Bourdain’s life looks very much to sober alcoholics like active alcoholism. I am quite sure that alcoholism contributed to Bourdain’s suicide, and I’m having a really hard time with talk online about Bourdain’s “successful” recovery. If you move from heroin to alcohol, it’s not your fault, but you are not in successful recovery. I am not faulting Bourdain here at all: he kept his demons at bay as long as he could. Alcoholism is a treatable disease, not a moral flaw, and I wish keenly that Bourdain could have found his way into recovery and stayed there. The world was a far better place with him in it. But it didn’t happen that way.

I returned to the States a few days later with a deep sense that my life was worth living: I kind of marvel now at my ability to navigate that trip up and down the mountain, deal with people in a second language (especially while I must have stunk like a latrine), and find something to laugh at in the tricks of a child (real or hallucinated). I will say right now that the locals did not bat an eye at my stench (setting them apart from a lot of white Americans), and they were helpful to me without looking for return.

I’ve had one more bout with SI since my return, brought on by failure to see that one of my old scripts with respect to human connection was running in a destructive way. I didn’t make a plan, though. Since that time, I have not experienced SI at all, and one critical aspect of my recovery is due to reducing my carb intake greatly (<100 g a day). Like alcohol, but even more insidious, diet is an immense factor in mood regulation. For me, low carb eating works really well, but for others, it can backfire.

This spring, I was assessed for autism and had my suspicions in that realm confirmed. Perhaps I’ll write more about that topic later but for now, it’s sufficient to say that seeing myself as an autist has reduced some of the self-blame I have had regarding my lack of intimate relationships. I have started to see myself as one of those people who belongs to the world, and who draws comfort from social interaction with other people in recovery, online friends, and literal fellow travelers whom I meet in faraway places with strange-sounding names. I’m also very, very good at spending time alone, and generally prefer it (as do many autists). What’s mostly gone is the self-recrimination that I should have been another way.

If you suffer from SI: you are not a bad or weak person. Use of alcohol or street drugs is something to look at, as is your diet, and of course seek help from a medical care team if you have not already done so. I do not take psych medication (although I used to) but each person is VERY different with respect to the efficacy of meds. If you are experiencing SI, you’re not drinking alcohol or using street drugs, you’re eating well, and you haven’t tried psych meds…. you in particular should consult your doctor right away. Hell, do it anyway.

People take their own lives every day. It’s my firm belief that they have the sovereign right to do exactly that, no matter what. We can’t know how much they’ve endured to stay alive or how tired they are. There is no valor in excessive suffering.

However, the “switch” of SI is something, in my experience, that is susceptible to treatment and prevention. For me, keeping the switch in the off position has saved me literal days of mental and emotional suffering: even if the suicide attempt is not completed, the bouts are exhausting. I’m fortunate that I don’t have to deal with them any more. Sadly, that is true of Bourdain and Spade as well.

Peeling the onion: getting an autism diagnosis late in life, part one of many.

I gave notice at work yesterday with the intent to retire from full-time waged work. This leaves me a lot freer to talk about personal matters on this blog; I won’t have to worry about some prospective employer finding it and using it as a reason not to hire me.

Maybe I’ll write about retirement some other time: there certainly will be pictures, since I plan to travel. Today I’m going to start writing about my recent assessment for autism, and how I’m settling (or not) into the fact that apparently I am one of the autism “collective,” as Tania Marshall, author of I Am AspienGirl and I Am AspienWoman, puts it. I’m 53 years old and just got assessed with autism! (Now what ….? )

Doubt? Of course I have it; it’s a standard operating feature of my system. And I think I’ve always had it. I was assessed in the middle of April, so the diagnosis is new… and was a long time coming, since I’d suspected for several years before that that I was on the spectrum. So, doubt. But as the weeks go on, I remember things about how I was as a kid and how things have (or haven’t) changed.

Case in point: motor skills. I just reread Temple Grandin’s The Autistic Brain. While I think her approach isn’t always helpful in terms of the need to accept certain limitations, she writes about difficulty with certain physical activities, and that jogged my memory. It was helpful for me to remember just how much my lack of motor skills impeded me as a kid and young adult:

  1. I couldn’t do a lot of “simple” things like cartwheels, pullups, hula hooping, throwing a ball in the right direction. It was a frequent source of shame, because I … didn’t know why.
  2. I was always winded and out of shape, consistently last to finish running laps consistently. I was a bit overweight but not enough to explain the exhaustion and difficulty of doing a few laps.
  3. I had a hard time with penmanship, tying shoes, etc.
  4. As an adult, I took voice lessons, but I could never coordinate all the moving parts well enough to progress much.

One exception: learning and playing piano. I was a decent pianist by the time I was in high school, but I was never that interested in playing, sadly: I think the classical repertoire and the fact that (as always) I was playing by myself left me cold. I played harpsichord in a trio one semester and that was more fun.

I also learned to ride a bike, which in retrospect is miraculous. But it was a trial … at least until my parents took off the training wheels, and then I was fine. I have the same problem with kayaks with rudders: too many moving parts to control, let me do it all myself.

Out of fear of being fat I started jogging in ninth grade, and for whatever reason that changed things a little bit for me, for the better. I started lifting weights too, again, not to the extent that a lot of people do. Today, I have an excellent sense of balance and of my body in any physical space, to the point where if it’s “off” due to something like vertigo, I can pick up even minute differences. So I’ve acquired a good sense of myself in my body over the years, but it wasn’t always that way.

But you know what? Even though I almost never fall or lose my balance, and even though I lift weights and can ride a bike, I STILL have trouble with motor stuff.

  1. Handiwork around the house (anything involving a drill, for example) is likely to send me into a meltdown. I just hate it and outsource it whenever I can.
  2. Mountain biking: even out-of-shape people leave me in their dust because I am so terrified of rocks, ravines, etc. I can do a relatively flat trail with some curves, small rocks, etc. but if I see that there’s ANY real danger from taking a fall, I’ll walk the bike. The sensory craving part of me loves the thrill of going around curves fast, though. So it’s the sport I love to hate.
  3. My handwriting is absolutely terrible: it’s degenerated with time and anxiety.

So I still have some profound limitations. But I live my life: I’m able to live independently, and my flavor of autism has led to lucrative long-term employment. We’ll talk about the masking necessary for autists to do full-time waged work some other time, too.

Reflecting on these limitations and changes has been a useful exercise for me:  it’s helping me to see myself as absolutely a part of the autism collective. Sharing with and listening to other autists is immensely helpful: it was another non-man autist in tech, @heartpunkk, whose power of example and advocacy helped lead me to assessment.

By the way, if you’re looking for an assessment and you are Aussie-based or if certification for US disability is not of great importance to you: Tania Marshall is a clinical and research psychologist who specializes in studying and working with non-men with autism. She does thorough, objective assessments for people either in person or over Skype, and her fee is far less than what you would pay in the good old US of A. I highly recommend working with her.

 

 

 

 

Reauthorizing the Violence Against Women Act: is there really reason to cheer?

Many U.S. citizens greeted yesterday’s reopening of the U.S. federal government with public cheers and private relief, and many also cheered the news that reauthorization of the Violence Against Women Act was part of the short-term funding plan. But is the Violence Against Women Act really doing what those who sincerely decry cis male violence against women want it to do?

To near-unanimous fanfare, the federal government re-opened for business yesterday, for “three weeks” according to the White House. According to McConnell spokespeople, within the short-term funding bill lies a line item to re-fund the Violence Against Women Act (VAWA). This legislation, signed into law in 1994 by Bill Clinton, directs millions of dollars into the arrest, prosecution, and incarceration of domestic violence offenders.

It is an unassailable fact of life in the United States that many cis men routinely commit physical violence of all sorts against cis and trans women, particularly those women whom they know intimately. (The law applies regardless of the gender of the person who was abused.) In this country, nearly 20 people per minute are abused by a domestic partner, and the majority of the abuse is at the hands of cis men. Women of color are targeted much more frequently than white women: four in ten Black women will experience domestic partner violence and are 2.5 times more likely to be killed by men than white women. Native American women fare badly as well: 4 out of 5 Native American women have experienced violence, and rates of domestic violence against them are up to 10 times higher than against non-Native women.

Domestic violence was not always criminalized. In fact, for most of the recent and distant past, women could expect little in the way of help from the police or their community in any kind of acknowledgement that the perpetrator was in the wrong, much less justice from the legal system.

However, modern Americans have looked more and more frequently to the legal system, not to their communities, to address wrongs. In the case of domestic violence, it has long been the case for communities not to listen to women whose partners are violent… and so the seeming need for the “impartial” hand of the justice system was strengthened.

As a result, VAWA was and is generally seen as a victory for women against domestic violence. Seemingly, it marked, then and now, recognition by the federal government that cis men routinely perpetrate violence against women, and that stemming the tide of that violence via the legal system is a matter of grave national importance. More ominously, the law was definitely a victory for conservative law-and-order types. It was part of the Omnibus (Biden) crime bill, and at the time its chief sponsor bragged of “put[ting] another 100,000 cops on the street.”

In a recent interview with Jessa Crispin, Leigh Goodmark, Professor of Law and Director of the Gender Violence Clinic at the University of Maryland Carey School of Law, points to several problems with VAWA as it stands today:

  • The vast majority (85%) of VAWA funding goes into the carceral system. (At the time of VAWA’s passage, 38% of funds went to social services.) This creates a focus on a (questionable) solution rather than on the causes of domestic violence, such as unemployment or past trauma, or noncarceral solutions such as job creation or parental support that might stem the tide of partner violence.
  • Even though the partner who was abused may not want to press charges, “no-drop” state laws make it possible for prosecutors to press forward with criminal charges against abusers. In many cases they subpoena the partner to testify and if the partner doesn’t appear, they are arrested.
  • Men who abuse are demonized under the law and in popular culture in general. Conversely, the women who are their targets are expected to be angelic; women who fight back against their partners meet with scorn, derision, and lack of support.
  • It is likely that those who commit domestic violence have histories of trauma. Imprisoning these people results in more trauma to them, and at the end of their incarceration they are returned home to their families with no therapy or support. An inevitable result: more domestic violence.
  • It is unclear whether the law has resulted in a drop in domestic violence. Crime rates in general have declined over the last 30 years. However, from 2000 to 2010, domestic violence crimes declined less rapidly than other forms of crime, suggesting that VAWA was not having its seemingly intended effect.

Goodmark, who has worked with families affected by domestic violence for 25 years, suggests that VAWA funding go instead to:

  • Job creation. Underemployed men commit more acts of domestic violence on average than do men with steady, well-paying jobs.
  • Resources for women who have been abused. Paying for shelters is just a start: helping women get on their feet economically helps the whole family.
  • Parental and community child-minding, to lighten the burden of childcare on stressed parents
  • Community- and survivor-led restorative justice programs, such as Baltimore’s Gather Together
  • Pilot therapy programs such as the Veterans Administration’s Strength at Home, which offers cognitive behavioral therapy for those affected by PTSD to help them avoid violent acts against themselves and their loved ones

There is good news: the most recent version of VAWA has some funding earmarked to the study of alternative measures, such as restorative justice, as a factor against recidivism. Also on the docket is S.171, which would require a trauma-informed response to the initial investigation of domestic violence crimes.

However, VAWA’s continued focus on funding the carceral state has devastating effects on communities of color. According to the FBI, Blacks represent 23% of all spouses and 35% of all partners arrested for partner aggression, resulting in 300,000 arrests per year for allegations of domestic violence. And the arrest of an African-American in this country leads to incarceration much more often than it does for a white person.

VAWA funding, as it largely stands now, is a tool to increase the power and reach of the carceral state. Whether or not it helps families work their way out of domestic violence patterns is much less clear.

Recommended reading:

Codes of ethics for software craft?

A funny thing happened in the testing Twitter community this week. First off, Pedro Gonzalez tweeted a link to an article describing a recent multimillion-dollar settlement against Toyota for lethal bugs in embedded software. (This informative, interesting tweet was not unusual in itself… it’s what I’ve come to expect from testing Twitter.)

There is an industry standard for embedded software in motor vehicles … which is voluntary. According to the article, Toyota declined to follow that standard, and its software developers apparently proceeded to write “spaghetti code” much of which was untestable and unmaintainable.  The testimony of expert witnesses was compelling enough that had the case gone to a jury verdict, a much greater award for punitive damages would probably have resulted.

As I read the article on the Toyota case, I quietly wondered: even if your company declines to follow a standard, don’t you as a craftsperson have SOME kind of ethical responsibility to write solid code (or to test it with thought and care)? Many years ago, my law school classmates and I were required to take a course on professional responsibility and ethics, and were assured that if we behaved in a way contrary to ethical rules, discipline up to and including disbarment could result. If attorneys (and doctors, and accountants…) are bound to a code of conduct, why aren’t those involved in software creation?

Well, just as I was thinking that, another, separate conversation started on Twitter. “Uncle” Bob Martin has advocated recently for a code of ethics for software developers… in fact, he’s proposed a nine-point oath.

Just after Pedro tweeted the Toyota link, Lanette Creamer wondered (rightfully) about the rationale for and effect of such an oath. Why aren’t we routinely taking corporations like Toyota to task when they deliver bad software? If we impose codes of ethics and oaths for individual craftspeople, would we wind up making those people bear the cost of what often are corporate decisions? Why should an individual worker bear the brunt of the responsibility?

Why indeed? The reaction to Martin’s proposal has been mixed. Martin is working to raise the bar in general: he notes in an interview with Matt Heusser, “…you can be hired as a programmer if you tell someone you know something about computers.”

My honest response to that is … yes and no. Many software development shops strive for high standards in hiring. The developers I work with review each other’s code in detail. These practices are entirely voluntary and discretionary, though. I have been in the field as an observer (or tester, or documenter) of software for nearly 20 years. I have never heard of anyone being let go for writing substandard code. EVER. Aspersions about “spaghetti code” get cast but that’s about it.

I’m a software tester. Some people want to impose standards on testers that would minutely prescribe the way I do my work. Like Uncle Bob, I consider myself a craftsperson, and I think that far-reaching standards can inhibit the kind of creative thought that I need to be able to do as a tester. (It interests me that there is a set of standards for embedded software: it was in part by those standards that the expert witnesses for the Toyota plaintiffs established liability. I don’t know whether such standards have a chilling effect on creativity in software development.)

I’m not sure that highly specific standards work when it comes to a craft. But a code of ethics like the one Martin proposes is simultaneously less specific and more compelling than a set of standards. As an attorney, keeping a code of ethics in mind helped ensure that I took my work seriously.

In the United States, the doctrine of respondeat superior ensures that the financial penalty for civil litigation due to negligent acts by an employee (like creation of subpar software) is borne by the employer of the person who wrote the code. I don’t think anyone wants to see an individual software developer or tester be sued for millions of dollars (except, maybe, for some corporations who would otherwise be liable themselves!) But with a code of ethics or an oath comes an opportunity for a mechanism like a Board of Bar Overseers, which takes complaints against individual attorneys and imposes discipline (up to and including disbarment) where appropriate.

Software is everywhere today: in the cars we drive, in the medical devices that help us stay alive. I consult an attorney only on rare occasions and I see a doctor only a handful of times a year. I don’t have the same luxury when it comes to subpar code. None of us does. As we well know, many corporations will avoid successfully the consequences of their actions if they get a chance. As individuals, we might want to be better actors.

It takes a shtetl: a bevy of diversities and notes on Adacamp too.

Michael Wex, in his wonderful book Born to Kvetch, introduces those who can’t speak or read Yiddish to its vast palette of character archetypes. (I am one of those illiterates, so if I get any of the following wrong, don’t blame Michael Wex.)

If you have roots in Yiddish-speaking Europe, any one of your ancestors might have been called: a mentsh (righteous dude), a kohkhem be-layle (a “sage at night” a/k/a an idiot), a nudnik (professional bore), a pempik (short, squat person), a kochleffel (cooking spoon, or pot-stirrer/troublemaker) or a treyfener haldz (a glutton, or sometimes just someone with a sweet tooth who otherwise kept kosher). The list is just about endless.

There was also the beyre, or a skilled specialist. More on him or her later.

Many of these words and phrases aren’t exactly compliments. But the impression you get from reading the book is that most people to whom these epithets applied were accepted, if not always feted, denizens of the shtetl. Admittedly, the book describes a world that no longer exists. But there seems to have been real joy (or wicked glee) in naming and describing so many types of people… or facets of behavior and talent. Modern American English seems to pale in comparison. Perhaps it’s just a linguistic difference. But I think it goes deeper.

In the nineties, I was a tech writer at an ecommerce startup many of whose employees were… types that I don’t see around much anymore, at least at work. The UX department featured Wayne*, a whitebearded Unitarian Universalist in his fifties who padded around the office in bare feet or Birkenstocks and who gave me one of my all-time favorite questions: “What problem are we trying to solve here?” There was Terri, who had a doctorate in human factors and was one of my favorite people to laugh with offsite when we were faced with an especially backward UX design proposal. Marcia, another tech writer, and I kvetched about schedules or rhapsodized about Mandy Patinkin. Katie, the engineering manager and official company crazy cat lady, threw huge X-Files parties and later went to law school to specialize in patents.

Among the developers was a bona fide (local) rock star as well as a couple of vocal women who held senior positions. Many of us took the nerd purity test and got low scores (I was among the lowest scoring people, even among the tech writers — so was the rock musician, who was also a very well-respected lead programmer.)

Demographics: I was in my thirties at the time and was the youngest by several years of the tech writing group. The group numbered around 15 at its largest and was split 50/50 between men and women, most of whom did not have formal engineering educations. Same with the QA group, which probably numbered at least 50 people.

So… the company was a shtetl of sorts. It featured a welter of talents and types, and I believe the diversity was actively sought. (My college thesis in Romanian history played a major part in my hiring, or so I was told.) The company is no longer around, but few startups from that era survived.

In the early aughts, tech writing jobs dried up and I started doing software testing instead. Flash forward 15 years: I recently went through a job search… and the range of testing jobs I saw advertised even a few years ago had narrowed significantly. Most of the jobs in my geographic area were for “software developers in test” or automators. I was fortunate enough to find a job with a QE group that welcomes thinking testers of various backgrounds who may or may not write code.  But it seems that those jobs have all but disappeared in the United States.

The bottom line: your skills must now fit into a very narrow range, preferably backed by a C.S. degree, for you to have a decent shot at most jobs associated with software development (even testing jobs). Even 7-8 years ago, this was not the case. I wonder what we’ve lost.

As a palate refresher, I had the great pleasure and honor of attending the Ada Initiative’s Adacamp April 13 and 14 in Montreal. It was absolutely thrilling to see 100+ women gathered to discuss issues of open culture, technology, gender politics and equity, and… anything that was of interest to the group. Many of the women were highly placed technical leaders in software companies, but we also had a few linguists, a full-time employee of a feminist bookstore, several doctoral students, lesbians, straight women, genderqueer and trans folk… there’s a Yiddish word that almost fits what I’m talking about. (Sadly, Yiddish is more than a bit sexist.)

At Adacamp I gave a presentation on my life as a software tester and I spoke about the value of different mindsets on a dev team. There was enthusiastic discussion and interest, and I heard well-founded frustration from some of the developers in the group on how to go about hiring good testers. That frustration has led them to… hire junior developers as testers. I gently reiterated my point about different mindsets, but I fear it may not have been heard.

It is difficult to hire good technical people – I heard the same thing from the young developers with whom I had dinner the night of April 13. But… hiring the same species of beyre, over and over, to do jobs of different types? Focusing 99% of our efforts to get more women into the world of software on … teaching girls and women to program? It is critical to get girls and women who WANT to program into the field, but aren’t there other skills, talents, and mindsets that are of value in software development? And which groups of women are most likely to clear these hurdles?

Recently featured on Metafilter was an article about the “full stack employee.” Community member divabat wrote in response:

I – an interdisciplinary generalist type, which isn’t uncommon in the arts and activist worlds – has trouble getting jobs because my experience wasn’t “specific enough”. The tech industry has been especially flummoxed at why someone with my background would want to join in. Full stack but only in certain flavours?

(divabat, a/k/a Creatrix Tiara, would be thought of as “full stack” in a sane world. She is a gifted artist, writer, and community organizer. She just finished an MFA in Creative Inquiry and is open to new work opportunities. If I were a hiring manager I would contact her posthaste.)

A shtetl inhabited only by one type of beyre would be a very dull, oppressive place. Software, or any type of product or service, that comes from such a place? We’ll see more of it if things keep going as they are today.

*Names changed for privacy.

Transparency: listening to yourself.

It’s snowing here on the New England coast today. Great day to stay in and catch up on the Amazon Prime series “Transparent,” which is streaming free of charge today. I’m not so sure about a Prime membership right now – I wish Amazon treated its workers better – but I’m not above a free binge-watch opportunity for this great show.

I rewatched the “Transparent” pilot last night. Each character was dealing in some way, skillful or not, with some issue of authenticity. Maura, played by Jeffrey Tambor, was struggling with how best to come out as a woman to her family. Unspoken, but palpable, were the years of tension and alienation in Maura’s family, to which Maura’s long-silenced need to live as a woman probably contributed. For example: Maura’s ex-wife (the ever-interesting Judith Light) speaks frankly of her complete lack of trust in her ex-husband. Their three grown children seem to be waiting for their father to die so one of them can grab the valuable real estate that is the family home. Eldest sister Sarah is married to a wealthy man but clearly is still in love with her lesbian ex-partner Tammy. Maura feels the distance from her children very keenly, and you sense that one of the linchpins of a closer relationship to them might be to come out to them as a woman. I look forward to seeing how the characters interact in subsequent episodes.

I continue to assess what my right livelihood is. For someone like me, there may be no one right livelihood. I have a very broad skill set, the deepest wells of which are probably in writing and research. I’ve had several job titles in different fields and there may be more to come. But it’s fascinating to me to see how the quality of my work rises when something really engages my spirit. Conversely, if there’s something about a situation to which I’m moderately averse, I might still work at it, but the verve may well be lacking.

So, as I assess, I look forward to seeing how Maura’s efforts to be more transparent to herself and others play out. Perhaps I can learn something.

Web services performance testing: a pilgrim’s progress. Part 4.

I have SoapUI Pro from SmartBear at my disposal at work, and I’m quite comfortable with it. So it was my tool of choice for creating load and recording details about the results.

SoapUI’s first cousin LoadUI, a free version of which comes with the SoapUI Pro install, was also an option. However, I chose not to explore it for this testing mission. (A road not travelled, admittedly.)

My first load tests sent requests to the middleware Web services described in Part 3 of this series. Because of our NTLM proxy at work I had to use Fiddler to do the handshake between my desktop and the Web services.

Fiddler records a lot of interesting information about Web service requests, including response times and bytesize. So I copied that data from Fiddler, pasted it into Excel, and created time-series graphs from that data. I was able to create some pretty graphs, but copying and pasting the data over and over got to be a real time sink. I am not and will never be a VBA whiz, so I knew I had to find a better way.

I was forced into finding that better way when it came time to test the performance of the .NET services that USED the middleware Web services. Because of the .NET Web server’s configuration, I could no longer route requests through Fiddler and see the data. What seemed to be a hindrance turned out to be a blessing in disguise.

The solution I arrived at was to use SoapUI to record several aspects of the request and response transactions to a flat file. I could then bring that flat file into R for graphing and analysis.

The SoapUI test case for the .NET services is set up as follows. Apologies for the blurriness of some images below: I haven’t done HTML-based documentation in quite some time.

  1. Initial request to get the service “warmed up.” I do not count those results.
  2. Multipurpose Groovy script step.
  3. // I am registering the jTDS JDBC driver for use later in the test case. See below for info on using third-party libraries.

    import groovy.sql.Sql
    com.eviware.soapui.support.GroovyUtils.registerJdbcDriver( "net.sourceforge.jtds.jdbc.Driver" )

    //Get the time now via Joda to put a time stamp on the data sink filename.

    import org.joda.time.DateTime
    import org.joda.time.LocalDate

    def activeEnvironment = context.expand( '${#Project#activeEnvironment}' )

    def now = new DateTime().toString().replaceAll("[\\W]", "_")

    // Construct the file name for response data and set the filename value of a Data Sink set further along in the test.

    testRunner.testCase.getTestStepByName("Response Size and Time Log").getDataSink().setFileName('''Q:/basedirectory/''' + activeEnvironment + '''_''' + now + '''_responseTimes.csv''')

    If your Groovy script uses third-party libraries like jTDS and Joda, you have to put the jar files into $soapui_home/bin/etc.

    Putting jars where SoapUI can see them.

    Note that jTDS has an accompanying DLL for SQL Server Windows-based authentication. DLLs like this go in $soapui_home/bin.

    Putting DLLS where SoapUI can see them.

    This is how you set an activeEnvironment variable: setup happens at the project level:

    Creating environments at the project level.

    Then you choose your environment at the test suite level.

    Choosing environment in the test suite.

  4. Run a SQL query in a JDBC DataSource step to get a random policy number from the database of your choice on the fly. You can create your SQL query for the DataSource step dynamically in a Groovy script.
  5. // State Codes is a grid Data Source step whose contents aren't shown here.

    def stateCode = context.expand( '${State Codes#StateCode}' )

    testRunner.testCase.getTestStepByName("Get A Policy Number").getDataSource().setQuery("SELECT top 1 number as PolicyNumber FROM tablename p where date between '1/1/2012' and getdate() and state = '" + stateCode + "' order by newid()")

  6. Here’s the JDBC data source for the policy numbers.The query (not shown) is fed over from the preceding Groovy script step.
  7. JDBC DataSource step.

    You will have to set your connection properties. Your connection string for jTDS might look something like this. For more information about jTDS, see the online docs.

    jdbc:jtds:sqlserver://server:port/initialDatabase;domain=domainName;
    trusted_connection=yes

  8. I feed the value of PolicyNumber returned by the SQL query to my SOAP request via a property transfer.
  9. I have a few assertions in the SOAP request test step. The first two are “canned” assertions that require no scripting.
  10. Assertions in SOAP request.
    The third SOAP request assertion, which is more of a functional script than it is an assertion, captures the timestamp on the response as well as the time taken to respond. These are built-in SoapUI API calls. The properties TimeStamp and ResponseTime are created and initialized in this Groovy script – I didn’t have to create them outside the script (for example, at the test step level).

    import org.joda.time.DateTime

    targetStep = messageExchange.modelItem.testStep.testCase.getTestStepByName('Response Size and Time Log')
    targetStep.setPropertyValue( 'TimeStamp', new DateTime(messageExchange.timestamp).toString())
    targetStep.setPropertyValue( 'ResponseTime', messageExchange.timeTaken.toString())

  11. Another Groovy script step to get the size in bytes of the response:
  12. def responseSize = context.expand( '${Service#Response#declare namespace s=\'http://schemas.xmlsoap.org/soap/envelope/\'; //s:Envelope[1]}' ).toString()

    responseSize.length()

  13. Yet another Groovy script step to save responses as XML in a data sink, with policy number, state code, and active environment as the filename:
  14. def policyNumber = context.expand( '${Service#Request#declare namespace urn=\'urn:dev.null.com\'; //urn:Service[1]/urn:request[1]/urn:PolicyNumber[1]}' )

    def stateAbbrev = context.expand( '${Service#Response#declare namespace ns1=\'urn:dev.null.com\'; //ns1:Service[1]/ns1:Result[1]/ns1:State[1]/ns1:Code[1]}' )

    def activeEnvironment = context.expand( '${#Project#activeEnvironment}' )

    testRunner.testCase.getTestStepByName("DataSink").getDataSink().
    setFileName('''B/basedirectory/''' + policyNumber + '''_''' + stateAbbrev
    + '''_''' + activeEnvironment + '''.xml''')

  15. Some property transfers, including a count of policy terms (see part 3 of this series) in the response:
  16. Property transfers.

  17. DataSink to write the response XML to a file. The filename is set in step 7 above.
  18. File DataSink step.

  19. DataSink to write information relevant to performance to a CSV whose name is set on the fly. The filenames and property values come from the steps above.
  20. Response properties DataSink step.

  21. Don’t forget a delay step if you’re concerned about overloading the system. (Note that you can configure delays and threading more precisely in LoadUI. This test case, like all SoapUI test cases that aren’t also LoadTests, is single-threaded by default.)
  22. Delay step.

  23. And of course a DataSource Loop.
  24. DataSource Loop step.

  25. The whole test case looks like this:
  26. Whole test case.

  27. And now I have a CSV with response times, bytesizes, policy risk states, and term counts to parse in the tool of my choice. I chose R. More about that later.

Web services performance testing: a pilgrim’s progress. Part 3

This particular blog series is probably going to take me as long to finish as it did the medieval Muslim residents of al-Andalus to make a Hajj. So the “pilgrim” in this blog series title is apt.

It’s easy enough to set up a “load test” in a testing tool. It’s a little more challenging to frame the questions you want to ask about performance.

The services whose performance I was testing request data on policies that vary by insured risk state. The policy data resides in an IBM z/OS mainframe system and Datacom databases. The architecture works something like this:

  • .NET Web service request for policy data is made
  • Request is routed through middleware Web services that scrape mainframe screens or query Datacom
  • Middleware Web service returns policy data, or a SOAP fault, to .NET
  • .NET passes back the data to the requestor as XML

The team was especially concerned about the performance of the components that scraped the screens. Screen scraping can be slow, and our code would be sharing the subsystem that scrapes the data with a finicky Java messaging framework. Also, the middleware in question is very much due for an upgrade.

After thinking about these issues as well as some consultation with the project team, I designed my performance tests to record:

  • Response time in milliseconds per request
  • The risk state of the policy data being requested
  • The number of policy terms in the response: the usual number is two but the minimum number is one when the request is successful. If two terms are present, the number of screens that needs to be scraped doubles.
  • The size in bytes of the response. It is possible that a single-term response could be as large or larger than a two-term response in some cases, depending on the amount of data per mainframe screen and whether certain screens were used for that policy.

I made a couple more decisions based on the fact that I was testing in production (see part 1 of this series).

  • Requests would be made every 30 to 60 seconds over a period of a couple of hours for a total of 200 or so. Earlier tests at a higher frequency did not always go well (the aforementioned Java messaging framework was a rather feeble canary in the coal mine).
  • The team felt that the volume of requests (one or two a minute) was a realistic prediction of actual production load. The static frequency is not realistic, but my concern was again to avoid interfering with other production usage.
  • I felt that a sample size of 200 was “decent.” Since prod support staff had to monitor the production systems as I ran the test, a run time of anything over a couple of hours would not have been reasonable.

In the next posts I’ll review how I recorded and reported on data using SoapUI, Groovy, and the R statistics language.

Easy peasy emails from SoapUI test cases to you

As a sophomore-level programming autodidact, I’m on an ongoing quest to bootstrap my test automation with SmartBear‘s venerable SoapUI. You can script SoapUI as heavily as you want to with the Groovy programming language. Or you can use SoapUI’s built-in GUI elements to reduce your programming work. For example, it can be a simple matter to let SoapUI consume your project WSDL and build out a request for you… and then display the incoming response in an easy-to-read form. Or you can use groovy-wslite to start you off on the same road, but it may take you longer to write the code yourself and might not yield you any richer results.

I really wanted SoapUI to email me a simple text message when a test ended. I’d already written and tested a Groovy class that used Apache Commons’ multipart email capabilities. However, I wasn’t sure how to use that class in SoapUI. After some Googling and experimenting, here’s how I got the whole thing working today.

  1. I pointed SoapUI’s script library to the folder that contained my .groovy file with the class definition.* The sixth entry on the right in the image below takes a folder location.
    Inline image 1
  2. I dropped the Apache commons.email jar into $SoapUI_home/bin/ext, otherwise known as the bin/ext directory in your SoapUI installation folder.  (Hat tip to Saurabh Gupta for this pointer.) I would imagine that putting it into $SoapUI_home/lib would work just as well, since that’s where the SoapUI installer puts a lot of the other Apache libraries.
  3. For this test case, I wanted to record all my pass/fails and email myself at the end. So I put the following code into the setup script for the test case. The setup script window is visible at the bottom of the test case GUI in SoapUI.
    context.scriptResultsList = [] // List to hold pass/fails
    context.email // to be initialized later
  4. Later in the test case, a Groovy script checks one XML file against another and records “PASS” if they’re identical, “FAIL” if not, and adds the “PASS” or “FAIL” string as a list item to the scriptResultsList context variable defined in the test case setup script.
    if (xmlDiff.identical()) {
       scriptResult = 'PASS'  
     }
     else {
       scriptResult = 'FAIL'
    }
    context.scriptResultsList << scriptResult
  5. In the teardown script for the test case, I call my email class by attaching it to the context.email variable I created in the setup script. I send an email whose text depends on whether any of my test cases failed. I could attach a results file with a little more work.
    if ( context.scriptResultsList.find {it == 'FAIL'} ) {
    context.email = new ApacheMultiPartEmail("", "", "", 
    "Failure: SoapUI Regression Test", "At least one of your 
    test runs failed. Check detailed results.", 
    "recipient@blarg.net")
    }
    else {
    context.email = new ApacheMultiPartEmail("", "", "", 
    "Pass: SoapUI Regression Test", 
    "None of your test runs failed.", 
    "recipient@blarg.net")
    }

* Here’s my email class definition, which closely resembles the example in the Apache Commons online docs. It was written to send emails via an Exchange SMTP server. Note that Apache Commons also offers a SimpleEmail class that would have worked just as well for this limited purpose.

import org.apache.commons.*;
public class ApacheMultiPartEmail {
public ApacheMultiPartEmail(attPath, attDescription, attName, msgSubject, msgMessage, msgRecipient) {
if (attPath != '' && attDescription != '' && attName != '') {
EmailAttachment attachment = new EmailAttachment();
attachment.setPath(attPath);
attachment.setDisposition(EmailAttachment.ATTACHMENT);
attachment.setDescription(attDescription);
attachment.setName(attName);
email.attach(attachment);
}

Email email = new MultiPartEmail();
email.setHostName("smtp.yourhostname.org"); // I hardcode this
email.setSmtpPort(yoursmtpport); // also hardcoded in the class definition
email.setFrom("desiredSenderEmailAddress"); //I hardcode this value in the class always to send the message from me. You could pass it in as a parameter too. 
email.setSubject(msgSubject);
email.setMsg(msgMessage);
email.addTo(msgRecipient);

email.send();
}
}

Big data technology for absolute beginners: a meetup report

After years of reading-intensive formal education, I’ve come to the conclusion that I’m actually best at hands-on learning. You can talk to me till next year about technical concepts but until I can see them in action, they often don’t make much sense to me. That’s why this morning’s Boston Data Mining meetup was so valuable: we worked directly with an Amazon Web Services Elastic MapReduce cluster and an AWS Redshift database. Once you can make those connections, the learning opportunities are probably boundless.

The good people of Data Kitchen (Gil Benghiat, Eric Estabrooks, and Chris Bergh) first gave us high-level overviews of Hadoop, AWS EMR (Amazon’s branding of Hadoop), Redshift, and associated frameworks like Impala. Also covered at a high level were MapReduceHive and Pig, which you can use to retrieve data from a Hadoop/AWS EMR cluster. Each technology has its strengths and weaknesses, and the DK guys gave some expert advice in those areas too. Questions from the 50+ people in the room were of high quality and brought up some good discussion points. Also on hand with deep subject matter expertise and critical helpful hints for newbs like me was William Lee of Imagios.

Before long it was time to try connecting to an AWS EMR cluster. Setup for these connections is not a trivial matter, but fortunately there were good instructions posted on the DK blog before the meetup convened. Amazingly, even though many people arrived at the meetup without having completed the setup prerequisites, and all three major desktop O/S were well represented in the crowd, most people were able to run a SQL query against an AWS EMR cluster by the end of the morning. Yes, even me. (My biggest challenge was trying to get SQL Workbench to run on Debian without gnome or KDE installed. FOSS and I have a Stockholm syndrome type of relationship. Long story short, make sure you have one of those desktop environments installed before you try to use SQL Workbench on Linux.)

The Data Kitchen guys and William Lee also put in a few extra hours to make sure we all could put together a Redshift database to which we could connect from our desktops. I was flabbergasted that I was able to get up and running with the AWS technologies for a couple of cents on the dollar. Last week I enrolled in an online Hadoop course that promised I could run labs in the cloud, only to find out after the first couple of lectures that there was no cloud and that the desktop software I would need required a six-core processor at a minimum. Needless to say, I quickly unenrolled from the course.

You can create an AWS EMR cluster that costs a few cents an hour to run. The configuration options you choose during cluster creation apparently can affect the price greatly, so be careful. (The Data Kitchen slides provided specific information on this point.) Also critical: if you’re not going to keep using the EMR cluster or Redshift database you create, remember to terminate it (EMR) or shut it down (Redshift), or face a big credit card bill later. Another great thing for us cheapskates: public big data is only a Google away.

Slides from the workshop will be posted to Slideshare – I would imagine that Data Kitchen will announce the postings on their blog. All told, this was a morning well spent. My lunchtime visit to Tatte Bakery on 3rd Street didn’t hurt.