Mike Bland


Most recent posts

139 posts total. See Filtering and Navigation for tips on how to find the bits in which you're interested.

At this point, I don't think I'm making an unreasonable request for a very specific birthday gift that would delight us all.

- Alexandria
Tags: personal, philosophy, politics
Discuss: Discuss "A birthday wish" on Google+

At my ripe old age, there’s not much I actually want in the way of birthday gifts anymore. I don’t need stuff. I’m not much for gift certificates outside of anywhere but iTunes and Starbucks. My goal is to divest myself of material things I have to manage and one day move or otherwise account for. All I want, typically, is to spend some quality time with a few good friends.

This year, however, I do have one very specific, very big request, from a very specific group of people: Congress.

Congress, it’s beyond time to end this, and if ever a line has been crossed that necessitates removing the chief executive from office, it was crossed yesterday.

The tone deaf, shameful, disgraceful remarks made by Donald J. Trump yesterday, while consistent with remarks and tweets he’s made ever since the inception of his candidacy (and earlier!) outdo them all to a degree I don’t think anyone thought possible. Drawing a false equivalency between anti-racist protesters and the coalition of the alt-right—comprised, as best I can tell, of the KKK and other white supremacists and sympathizers, not good-natured citizens concerned with historical revisionism as a matter of principle—is not only a painful insult to the victims of racially-motivated prejudice and violence, but an affont to the very identity of anyone who was once unquestionably proud to call themselves an American.

Like I said, this is just the final straw, on top of all these others—and I’m sure I’m going to forget some of the most outrageously dangerous and offensive things DJT has said and done, given my inability to recall them all:

  • He has trolled our first African-American President, Barack Obama, for years, by first claiming that he wasn’t a natural-born citizen, then claiming that he wiretapped his phones.
  • He has appointed departmental administrators that are either egregiously underqualified for their positions (Rick Perry at the Department of Energy, Betsy DeVos at the Department of Education), or outright hostile to the departments they are sworn to lead (Scott Pruitt at the Environment Protection Agency).
  • He has objectified and disparaged women continuously, whether it’s fat-shaming a former contestant on one of his shows, accusing a reporter of “bleeding out of her wherever”, or bragging about how he can walk up to any woman and just sexually assault her. (Side note: I remain mystified as to the psychology of Kellyanne Conway, Sarah Huckabee-Sanders, and the millions of women who supported and continue to support him in light of his unchanging attitude and incessantly sexist remarks. I even wonder why his own wife and daughters still stand by him.)
  • He has stoked nationalistic fears over immigration, particularly from Mexico and Muslim-majority countries (in which he does not hold any phynancial stakes), specifically playing to people’s fears over economic and physical safety by exaggerating the threat posed to Americans by members of non-white tribes, as it were.
  • He has encouraged brutality against those who disagree with him (including practically the entire press outside of Fox News and alt-right outlets), and against those under arrest by law enforcement—many of whom are disproportionately black or otherwise non-white.
  • He’s expressed the clear desire to risk allowing millions of underprivileged Americans to die due to lack of access to health care for the sake of personally undoing the legacy of his predecessor, Barack Obama, rather than doing so based on any genuine economic principle—because, after all, who knew health care could be so “complicated.”
  • He openly admires strongman dictators in other countries, most especially Russian President Vladimir Putin, whereas he can’t resist blasting political opponents, political allies, and any random person on TV or the Internet, using Twitter of all damned things as his weapon of choice.
  • He’s blithely brought us to the brink of nuclear war with North Korea, only because he always has to have the last word and wants people to think he’s the bigger badass.
  • He has actively sought to undermine faith in not only the free press, but in many of our other institutions of democracy, most notably the FBI and the Department of Justice, both by firing James Comey as FBI director and publicly shaming his Attorney General, Jeff Sessions—who, to be sure, is not a stand-up character, but people deserve direct criticism rather than passive-aggressive humiliation as a matter of principle, especially when they occupy an office that’s bigger than any individual who holds it. More on that in a moment.
  • He has abdicated American leadership in the world, by actions such as raising questions regarding our commitment to our NATO allies and withdrawing from the Paris climate accord—though the latter provided a silver lining in so far as many cities, states, legistators, companies, and citizens openly reaffirmed their commitment to climate change goals despite this boldly ignorant and damaging maneuver.
  • He refuses to shut up about how he won the damn election—and still hasn’t backed down from the thoroughly-debunked claim that millions of illegal immigrants cost him the popular vote, yet another move which plays to the suspicion of his white, undereducated “base” that “those people” are threatening our democracy…
  • …rather than a pathological liar who has actively attempted to undermine the mechanisms of federal justice attempting to uncover the extent to which Russia, a hostile foreign power, actively attempted to influence our election and favor DJT’s chances of winning the election…
  • …representatives of which were invited to the Oval Office shortly after after Comey’s firing, along with members of their media (while the American press was shut out)…
  • …when Trump decided to hand classified information from a trusted ally over to said adversarial government without them even trying to get it…
  • …after admitting to obstruction of justice for the second time (the first being on a national NBC News interview), in that he fired the FBI director to stop the Russia investigation.

This is not intended to be an indictment of people who voted for Trump—well, not the majority of them anyway, I hope—but of the man himself and those who directly enable him to continue driving our country down this dangerous path. Indeed, there’s much I’ve been thinking and sketching out about how to solve this problem in the long-term, this problem of mistrust and miscommunication that allowed this political powderkeg to build up and get set off.

And I’m rather critical of the political left with which I’m aligned, as we’re certainly guilty of some degree of groupthink and politicking that we need to do a better job of managing. But make no mistake about it: The crimes of the left are orders of magnitude less severe in degree and in consequence—save for the fact that we provided the opportunity for this completely unfit candidate to ascend to power and take the entire world, regardless of political affiliation, down this dark and dangerous path.

So Congress, I implore you, as a birthday gift to yours truly, if for no other reason: Make America great again! Remove this racist, sexist, xenophobic, anti-intellectual, authoritarian, dishonest, idiotic, ruthless, treasonous, narcissistic, sociopathic, dangerous monster from office. Introduce articles of impeachment today!

Some wheels were meant for reinventing—if sometimes only because we need to teach ourselves how they work!

- Alexandria
Tags: programming, technical, testing
Discuss: Discuss "Custom Links" on Google+

Like I mentioned in my previous post, I’ve been consumed with a passion project as of late. Not go-script-bash this time, though I did have to investigate why my coverage builds started failing due to some sort of deadlock—which led me to submit SimonKagstrom/kcov#211 to fix it, naturally. (Thanks to Simon Kagstrom for providing such a useful tool, and for merging my fix so quickly!)

Mostly, though, I’ve been working on a new project I call Custom Links, which is an application that for creating and accessing custom URLs. It allows authenticated users to create short URLs with meaningful names that redirect to longer URLs, or to easily create canonical URLs that you can redirect to different target URLs over time.

A wheel by any other name
So much for serverless
The hard part
The end(-ish) result
Future development

Why did I write this? Doesn’t something similar already exist?

First, I got the idea after the Schibsted Eng Prod team decided—before I arrived and independent of my direct involvement—to publish their own Schibsted Testing on the Toilet series. Clearly you can’t expect “users” to “click” on URLs from a paper flyer; and while QR codes are possible now (which we did use), there’s still a lot of value in using short, memorable URLs like go/tott, as we used so often on TotT episodes at Google.

So I started looking around for an open source solution—and couldn’t find one! The closest I found was YOURLS, and at least when I tried setting it up in mid-April, I couldn’t figure out how to get it to create actual custom URLs instead of automatically-generated short URLs. (To be fair, the current home page does make it look like it can do that, but I haven’t deeply investigated it since.) Plus, it requires setting up PHP and MySQL, and uses its own user account system.

In the meanwhile, Luis asked Kenneth to set up a bit.ly account to create custom links. The URLs all begin with some form of bit.ly/, which isn’t as nice as go, but it was enough to start publishing TotT episodes.

However, as Kenneth found out, Bitly apparently won’t let you change the target of a custom short link after you create it. Hence, the use case of providing a canonical URL that can be updated as needed isn’t met using this solution.

When I couldn’t find any other open source alternative, I figured writing such a server shouldn’t be too hard, and set out to do so. At first, sensing an opportunity to put what I learned from Serverless Single Page Apps into practice, I spent a couple days trying to think through how to implement it in a serverless fashion. However, trying to design a general-purpose application raised one gigantic problem I couldn’t devise an answer for: redirects. Yes, people have used S3 buckets to set up their own redirect “databases”, but for seemingly custom internal services that require some degree of specialized maintenance, rather than being mostly self-serve.

Confronted with this, I fell back on Ken Thompson’s old bit of programming wisdom: When in doubt, use brute force. Being a backend developer, and one who generally avoids SQL databases, I decided to bang out the backend using Node.js, using Redis as a backing store, and using the Passport authentication framework to support user authentication via Google OAuth 2.0. Learning the Redis API was easy, and getting things set up with Passport took a bit of archaeology, but all in all the backend largely came together over a weekend or so—tested six ways from Sunday, of course.

“Users are a frontend problem.”—Written on the whiteboard of former Google colleague Matthew Simmons

While I had a functional server that would efficiently provide short link redirections, and I could easily update the Redis database directly, I accepted the reality that most users, even technical ones, expect a more user-friendly interface. Also, since I’ve done very little frontend development—and even less frontend testing—I decided I’d use this project to teach myself a few things about browser-side JavaScript and browser-driven end-to-end testing.

The first thing to decide upon was a framework. Influenced by Serverless Single Page Apps, I decided not to use one, opting to embed template elements in my single index.html page, and to use JavaScript to instantiate and update them. On top of that, I went one step beyond the book and eschewed JQuery in favor of Vanilla JS.1 I’m not sure I’d do this again for every project—as much as I hate to accept it, React and GraphQL appear to be the new hotness2—but I think it was a great exercise to go through before resorting to higher-level abstractions in the future.

Of course, me being me, I made setting up my environment to “make the right thing the easy thing” (i.e. automated testing) my top priority before going full-bore into development. Since Schibsted was using bit.ly, and this was a personal project, I could afford to force myself to learn a lot about JavaScript testing tools and frameworks rather than rush to deliver a product.

And man, did I learn. Rather than enumerate the details here, check out the Custom Links listing on my portfolio page if so inclined. The punch line, however, is thanks to creative use of go-script-bash, I managed to make it really easy to run browser tests that automatically run after a file save, to run them on the command line via Phantom JS, to collect coverage reports that can automatically open in the browser or get shipped to Coveralls—and, finally, after all of these years, to run Selenium-WebDriver tests.

I wound up setting up these environment pieces and debugging tooling issues—such as the lack of nonblocking connect crashing PhantomJS on the Windows Subsystem for Linux (also enumerated in the portfolio listing)—all the way until my second trip to Europe. After that, I didn’t write a line of code for the entire rest of June and for the first couple weeks of July.

Finally, after fixing the aforementioned kcov issue, I dove back into Custom Links on July 21, and finally completed what I hope is a reasonably functional user interface this past Tuesday, August 8. In terms of tests (all times for my 2015 MacBook Pro with a 2.9GHz Intel Core i5 and 8GB RAM):

  • The server test suite (./go test server) contains 143 test cases and runs in two seconds.
  • The browser test suite (./go test browser) contains 123 test cases and runs in about 700 milliseconds.
  • Running the browser test suite across Chrome, Firefox, Safari, and PhantomJS simultaneously using Karma (karma start) takes about 4.5 seconds.
  • The end-to-end test suite (./go test end-to-end) contains nine test cases and runs in about twelve seconds.
  • Running all of the above at once (./go test) takes about 30 seconds.

I updated the README with basic installation and configuration instructions this past Wednesday, August 9, and now finally consider the basic product ready to try out by other humans.

There’s lots of room for improvement, of course. For starters, I may try switching from PhantomJS to Headless Chrome. I could implement other auth providers, and perhaps add a landing page to select which one to use. The code could probably be slightly reorganized, with function, class, and module comments. (I’ve leaned heavily on descriptive function, object, and test case names up until now). Perhaps I could clean up and test my scripts. Certain components and test helpers could be extracted into npm packages. The README can almost certainly be improved.

And of course, of course, I should look into Docker-izing it.

Still, even now, I think it could be useful to folks. So if you’re inclined to give it a try, I’d love to help you get set up if needed, and get your feedback on how it could be improved!

Even if no one uses it, at any rate, it really challenged me to shore up my skills in an area that I’d neglected for the better part of my career. That experience alone made the whole project worthwhile!

1The Vanilla JS website is a tongue-in-cheek illustration of how modern, standardized JavaScript performs much better than popular frameworks, and doesn’t really require much extra code.
2My reluctance is due to my blood feud against teh twitbooks.

Despite the silence, I've had a few things going on since returning from Europe—and there's still so much to do!

- Alexandria
Tags: Rainbow of Death, testing, Testing Grouplet
Discuss: Discuss "Catching up" on Google+

I can’t believe my last post was in late June. Going by the frequency of my posts, you’d think I was dead, or at least lazy. Quite the contrary; I’ve been keeping fairly busy with a number of talks and a particular pet project since then.

Since there’s so much to catch up on, I’ll stick to my speaking updates in this post, and announce my new project in the next.

A fond farewell to Europe
No rest for the wicked
Goin’ back to Cali
Just when I thought I was out…

A fond farewell to Europe

For starters, the week after the Schibsted Testing Fixit, I finished my tour of Europe by visiting Krakow and Vienna, for a total of twenty-five talks in nine offices across eight countries—Spain, France, Italy, Norway, England, Sweden, Poland, and Austria—between June 6 and June 29 (all accounted for on my presentations page). Of course the travel was a bit intense, and I wish I could’ve spent at least a week in each country; but it was still an amazing experience, I’m ever grateful for the opportunity, and the ultimate impact was beyond my expectations!

I can’t thank enough Luis Peralta of the Eng Prod team for setting me on this mission; Sverre Sundsdal for putting me in touch with Luis in the first place; and Toni Lopez for being such a capable Testing Grouplet lead, Testing Fixit Walrus (Organizer), and engaging travel companion for most of the journey. And of course there’s Kenneth Ocklund, Fabyanna Eriksson, Nic Infante, Eric Lefevre-Ardant, Jakob Alander, and so many more incredible Instigators that made real change happen!

Speaking of beyond expectations, Agnieska Steczkiewicz, Robert Fijalkowski, and the Schibsted Tech Polska team in Krakow really went above and beyond in organizing my presentation of The Rainbow of Death for the first-ever KRK Tech Talks Meetup. The video evidence, announced in their follow-up blog post How Google implemented automated testing, speaks for itself:

Video of The Rainbow of Death from the KRK Tech Talks Meetup sponsored by Schibsted Tech Polska. Probably my favorite video so far!

I mean, they thought of everything! A backline matrix of high-def monitors! Top-notch video production! And local beer so good I couldn’t put it down, instead opting to leave my iPad Mini with my speaker’s notes on a table!

No rest for the wicked

You’d’a thought I’d’a been all talked- and traveled-out. You’d’a been right, but whenever I get opportunites to connect with fellow Instigators, I will always muster the will and make the time to do so.

A week and a half after my return, I delivered The Rainbow of Death, USPTO Edition at an internal DevOps event on July 11 for the U.S. Patent and Trademark Office, organized by resident Instigator and good friend Alan Kraft. Thanks to input from Alan, Simmons Lough, Terry Scalsky, and others, the talk became jam packed with so many good USPTO initiatives already underway, I could barely fit them into the talk—much less fit them all onto the RoD slide!

Goin’ back to Cali

Two days later I flew to Sacramento to deliver The Rainbow of Death twice: first at the Agile Government Sacramento Meetup hosted by the Hacker Lab; and the next day at the Child Welfare Digital Services office for their brown bag speaker series. Much thanks to Henry Poole and Aaron Pava of CivicActions for inviting me and making it happen!

Video of The Rainbow of Death from the California Child Welfare Digital Services brown bag lunch speaker series. First video with the Schibsted Fixit pictures, commitment model slides, and roles slide.

As noted in the caption above, for these talks I added slides containing pictures from the twelve Schibsted offices participating in the Testing Fixit, and slides talking about something I call the “commitment model” and about Fixit roles.

Just when I thought I was out…

The following Monday, I hung out as a volunteer at DevOpsDays DC at the CapitalOne auditorium in McLean, thanks to the kind permission of my friends Ramez Mourad and Nathen Harvey. It was a refreshing change to be at a conference for once and not be speaking—though, honestly, I do really like speaking a lot.

And sure enough, just like Michael Corleone, somehow they [managed to] pull me back in. That low-key gig turned into another speaking opportunity, as Victoria Guido recruited me to deliver Automated Testing—Why Bother? Part One: The Why at last night’s DevOpsDC Meetup, hosted at Excella Consulting’s Arlington Tech eXchange. Much thanks to Victoria and Peter Burkholder for inviting me and organizing the event!