My Friend Cindy Li

Cindy Li and Brian posing with silly glasses
Cindy Li smiling on top of Twin Peaks in San Francisco

I’ve worked with hundreds, if not thousands, of people over the years.  I’ve liked most of them, been friends with a lot of them, and loved many of them.  Cindy was definitely in the last category.

Cindy Li and I became fast friends and co-conspirators while we both worked at AOL.  We were on the CSS Working Group together.  We went to SxSW Interactive many many times (we had different but overlapping “gangs” at SxSW but we always intersected somehow during the conference – sometimes in the green room, where we’d try to distract each other’s panelists).  We went to countless dinners, lunches and dim sum brunches.  We caused trouble.  With our pal Jason, we built ficlets and came up with a t-shirt that became a bit of a sensation.

Matt Harris, Patrick Haney and Jason Garber sporting the Geeks Love * shirt at dim sum.

Cindy died on Monday, 10/15/2018. Cindy was amazing. She was equal parts creative, silly, kind, funny and smart.  She was a perfect co-conspirator.  She could take bad ideas and make them brilliant.  She effortlessly seemed to rally people to join the Cindy Li Vortex of Fun Adventures.

Cindy and Kevin making stupid faces for the camera.
Cindy tormenting Jason, one of her faaaavorite pasttimes.
Cindy, about to chow down on a steak at Austin’s Hoffbrau

Cindy brought people together.  She was the ultimate connector, and even though she’s gone, the connections she made with all of the people she impacted all over the world will remain.  After she was diagnosed, Cindy organized a small group of friends from all over the world into her support system.  We were all around, talking to each other about how best to help her and her family, and the whole while she was sick, she was there being the life of the party, right up until the end.  Even with her illness, she was connecting people and spreading love, kindness and empathy.

She was a vortex of love, and fun, and whimsy, and adventure, and you weren’t just along for the ride, you were an integral part of it. I don’t think anyone who knew Cindy thought they were anything less than 100% included and in on the joke, and that’s a rare and beautiful thing.  She was that way until the day she left, I imagine riding a Hello Kitty cloud on her way to organize an adventure with St. Peter and redecorate the gates of Heaven.

Her friends organized a site for sharing memories of Cindy as a way to share with her how much she means to all of us, and as a way for her sons to understand what she meant to us when they’re older.  You can share your own memory of Cindy by following the instructions there, read her obituary, and help her kids out if you’re able.

Agile Moderation

I read a lot of advice – on any social media platform it’s hard not to. Everyone spouts endlessly about hustle, self care, the grind, being the best you, on and on forever. There are memes and videos and heartfelt shout outs to gurus and coaches.

All of that advice is fine, but it always leaves me cold. It all feels so extreme and if you fall down one rabbit hole of advice or another, it will probably lead to a lot of unhealthy behavior.

I’m a developer. I’m incredibly hard on myself. I work with people who are also incredibly hard on themselves. They all seem to feel worse about themselves than I do, and I’ve been trying to figure out why – and what I do or what experience I have that tells me when to let up on the self-criticism.

It’s taken a while but I think I’ve figured it out.

I’ve been doing some form of agile development for a very long time. More than a decade but less than two. It’s fine and I’m not going to go into details about it because it doesn’t matter.

My favorite part of that process, though, is the retrospective. It’s where the entire team gets together every two weeks and answers three questions:

  • What went well?
  • What didn’t go well?
  • What are we going to do differently next time?

It’s a chance for the team to refine their process, learn how to work better with each other and improve personally. The best part is that my teams always write everything down so we have a record of our retrospectives over time so we can see our growth over time.

It’s so effective that I now use it on myself. And this is where the moderation from the title comes in. Every time something goes wrong or I’m under stress, I go through those three questions. It’s calming, and a chance to reflect and commit to doing better.

But, it’s not open ended. I can’t spent forever on how badly I messed up or on how great I did, and I always have to finish with how I’m going to improve.

That process allows me to continue to be self critical, continue to hustle and not just love through the grind of startup life, but to love it, take care of myself and be aware of what I still need to work on.

The goal of agile isn’t perfection; it’s constant, sustainable, incremental improvement. That’s a goal I can get behind for myself too.

Coding is a Social Activity

You’ve probably heard about that manifesto that some techbro at Google wrote. This is the response I wish I would have written.

A couple things to highlight and emphasize:

  • Writing software is about understanding problems, and to understand problems, you have to not only know how to solve them with code, but know the root cause of the problem. That requires building empathy. Without it, you’ll never be great.

  • There’s no such thing as “male” or “female” skills. They’re just skills. That people put them in buckets says more about the broken rigid gender roles in our society than the quality or value of those skills. Empathy is much harder to develop than learning how to code.

  • The dude should have talked to some non-bro humans before publishing that crap. They would have, hopefully, gently slapped him around intellectually and convinced him not to be stupid in such a public way.

  • Guys, every single woman you know who’s ever had a job or worked in any situation where men are present has dealt with things you can’t even imagine. Not most. ALL of them. If they haven’t told you about any of them, you probably have a lot of work to do on empathy, because they don’t think you can handle it, or you’re kind of a jerk.

This isn’t totally related, but it’s related enough and I wanted to write about it, so here it goes.

Sara Soueidan tweeted yesterday about other peoples’ productivity tweets, and it got me thinking about how I keep myself motivated and keep myself from feeling too down about feeling stuck. I replied with a couple of things, and I thought I’d share them, because especially early on in my career, they were extremely helpful in keeping me going when I didn’t really have a way to measure my progress.

  • Document your progress, because it’s easy to forget. I’ve kept a work journal in various forms for the last 15 years or so, just a little record of problems I’ve solved, things I’ve worked on, etc.. Why? Because progress is easy to forget and time erases our victories. It’s easy to feel like we’re not getting anywhere when we’re only looking at the last week or so.

  • Whenever I feel down or stuck, I go back 6 months to a year and just randomly pick a day from the journal to remind myself what I was working on. It’s almost always a pretty immediate reminder of how far I’ve come. If I still feel down or stuck, I just go farther back.

In agile development, my favorite part is always the retrospective. It’s a meeting you have every 2-4 weeks where the entire team answers the following questions:

  • What went well?

  • What didn’t go well?

  • What are we going to do differently next time?

Answering those questions is a way to celebrate successes, build accountability by honestly and constructively figure out what didn’t go well and why, and then come up with a couple things to work on for the next time.

That same set of questions works really well for personal stuff too, so I have personal retrospectives all the time after stressful experiences or times I reacted to something in a way I shouldn’t have or, for me especially, when I overreacted to something.

I don’t have personal retrospectives to beat myself up. They’re not pity parties or self-destructive. They’re hopefully the same as a good team retrospective – they exist only to make sure everyone knows the part they play in the team’s success, and so everyone improves.

And that’s where the productivity tweets, and the harmfulness of judging yourself by others’ public projection of themselves, come in. Those public projections are meaningless to me. I might be able to learn some new tactics from them or a new thing to try, but trying to copy someone’s success only by observing the outward result is a recipe for disappointment.

Things to remember whenever reading any personal account of success:

  • The author is an unreliable narrator and will almost always downplay other peoples’ contributions to their success or that luck played a much larger role than they mention.

  • They’re not you. You’re not starting from the same place. You don’t have the same resources. You have different talents and skills. Do not judge yourself relative to someone else’s position because you don’t know where they started.

I was the first web developer in my group when I moved to Virginia to work in the “main office” at AOL. I had no one to measure myself against because no one else did what I did (my manager used to say, “I don’t know what you do, but everyone loves it, so… keep it up!”). I was young, and dumb, and ambitious, and… had no idea what I was doing, but I wanted to be the best I could be at it.

I’m a big fan of the Golden Rule for teams. I try (and fail) to work so the other people on the team have an easier time of things. I fail at this more often than I succeed, but that’s the goal.

After my first couple of projects, I realized that I also have to practice the Golden Rule on myself. So, now, I really only compete against what I call Past Me, and I try to do my work so Future Me doesn’t think Present Me is a jerk.

This framework has worked out pretty well for work over the last almost-twenty-years. I just recently realized that it’s equally applicable to life outside of work too, and am trying to apply it to my health choices too.

I hope this is helpful to someone. Life is hard. Make it as easy as you can on yourself and others.

For Further Learning… Web Development Style

I sent this list out to yesterday’s RailsBridge students as next steps if the introductory class lit a fire and they want to learn more. And then I realized it’s a pretty good list, so I’ll share it here too!

Local Savannah Things

For Further Learning

Yesterday’s class was great. Lots of teachers in the room and lots of people who had no idea that web development was accessible to “normal” people. It was tons of fun and a great way to shake off a pretty terrible week.

Switching Your Primary Google Apps Domain In Not Too Many Steps

My face when we decided we needed to change our primary Google Apps domain.

It happens. You rebrand (like we did at Planted last year) and need to change your email addresses. You use Google Apps because you need video conferencing that kind of works, document sharing and email and… whatever else they do. You figure, hey, it’s Google, how hard can this be? And then you google for how to do it and it turns out it’s a poorly documented nightmare, which you’d think it wouldn’t be because it’s Google and they’re supposed to make hard things easy.

You probably took the easy way out last time and just created an alias domain. Eventually, though, you get tired of people asking about the old domain on calendar invites and dealing with aliases in all your email clients, and you just decide it’s time. Actually, having an alias already set up makes the whole process a lot easier. If you haven’t done that, that’s alright, it just means you can skip the “remove the existing domain alias” step!

It turns out that it’s not actually that bad as long as you do things in the right order. I’m going to share that order with you so I don’t have to remember it later.

Before you make the switch, I’d make sure all of your users who use 2 factor auth have added their phones as a backup because they’ll need to delete and re-add their accounts to the authenticator app, which took me by surprise and don’t remember from Google’s documentation!

I went through several iterations of this list and this is the one I came up with that resulted in the least amount of time where email addresses didn’t exist and the fewest number of steps! Without anymore prevaricating from me, here are the steps:

  1. Remove your existing domain alias. This is when email will stop going to you@newdomain.com
  2. Add your new domain as a “real” domain in Google Apps. Go through and DNS setup or verification needed, but if you already had it as an alias, you should already have all of that setup.
  3. Rename all of your users on the old domain to the new domain. This is where you@newdomain.com starts working again. The benefit of doing it this way instead of just switching primary domains is that it automatically creates aliases for all your users on the old domain, which saves you as many steps as you have users. You should rename yourself last as it will kick you out and make you log back in, which was scary when it happened to me, but not the end of the world.
  4. Rename all of your groups (aliases, y’all) on the old domain to the new domain.
  5. This is the stupid part. In order to change your primary domain, you have to use the API. I went through a bunch of the official clients and had no luck, but then I found the API Test Page and that worked fine.
  6. On the API Test Page:
    • Toggle the “Authorize requests using OAuth 2.0” thing, which will then pop up a window. Make sure you log in with your work domain.
    • For “customerKey”, put in my\_customer
    • In “Request Body”, the field name is customerDomain and the value is your new domain!
    • Now click outside the request body box, and then click Execute.
    • You should get a 200 response.

And now you’re done!

Everything seems to be fine. The only thing that’s still a little weird is gChat, but all of our old Hangout URLs still work and we haven’t noticed any issues with Docs or anything else.

Good luck in your domain switching!

Further Reading:

Update: I don’t know anything else than what I’ve written. If it doesn’t work, I probably can’t help you. If you have a business account, Google’s support is actually really good. Call them. Really.

Letters to My Congressman

My local congressman, Buddy Carter, sends out a weekly newsletter and this week’s was a doozy. I don’t normally write to him, because I’m not sure it does any good, but I had to in this case.

Here’s what I wrote. Feel free to use it and write to your representatives.


In your latest newsletter you say the following: “I believe committing this horrific act removes all civil liberties and they should be investigated in whatever way is necessary. This is now an issue of national security and it is ridiculous that Apple is not participating in the investigation of known murderers and terrorists.”

This paragraph shows an amazing lack of understanding of the Constitution and our fundamental civil rights, and a failure to grasp the most basic facts of not just what the FBI is asking Apple to do, but the FBI’s own actions that led to where we are right now.

I’ll leave the constitutional questions to someone else, but the technical ones are simple:

  1. Creating a backdoor, ANY backdoor, for the FBI means that Apple will have to give that backdoor to any government in any country they do business in. Submitting to this request of our government means that they have to give that back door to repressive regimes in China, the middle east, etc.
  2. Creating a back door, ANY back door, in encryption or security means that back door can be exploited by any one – good guys, bad guys, terrorists, etc.
  3. The FBI wouldn’t be in this situation if they hadn’t asked local law enforcement to change the suspects’ Apple ID password. If they’d left it as is, Apple could have gotten into their account and given the FBI whatever they wanted – as they have done in many many cases.

This isn’t a simple case, but just demanding that Apple do what the FBI asks denies the complexity of the issues and weakens security for everyone.

We need strong encryption, unfettered by ill-informed and ill-advised government demands, for ALL of us to be safer. Any weakness at all can be exploited by the bad guys just as easily as the good – and like people are so fond of using the 2nd amendment as a “check against unchecked tyranny” – strong encryption is an even better check against that tyranny, and not just in the US.

I ask that the government get smarter, that our representatives gets smarter, about thinking about how to perform their duties and catching criminals than asking the innovative companies that drive our economy to get dumber.

Thank you for your time,

Kevin Lawver

On Manly Men

I’m tired of what scared man-children are doing to my industry, to social media, to my country and to women. It’s self-defeating. It’s wrong. It’s violent and it’s cowardly.

SO… Men. Stop being cowards. Stop treating people like crap. Stop threatening them. Stop lashing out like toddlers having tantrums because you’re afraid for no reason. Stop making up reasons to be scared and start living.

Look at your behavior. If you really think that threatening women, doxing them, swatting them, demeaning them, pushing them out of your communities because you’re threatened by them… if you REALLY think that makes you a manly man – you’re an idiot.

Being a manly man means being comfortable with yourself and not being threatened when someone else wants the same.

Being a manly man means being courteous, debating on the merits and not throwing tantrums when someone else wants a turn to speak. It also means admitting when you’re wrong.

Being a manly man means not being afraid of people who are different just because they’re different. It means being curious and adventurous – and not afraid to treat people like you want to be treated – or better, how they wish to be treated.

Bullies aren’t manly men. Bullies, at their core, are afraid and have to use intimidation and violence to project power. But, they have no power. Once a bully is outnumbered, he’s just a coward again.

Be a manly man and welcome everyone into your communities. You’ll find you’ll have more fun, learn more, and your community will be stronger for it.

Let’s make stories like this one a thing of the past.

And in case you’re confused, there’s nothing wrong with being a man. There is something wrong with thinking that your gender means you’re somehow entitled to affection, attention, recognition or leadership. If you really believe in a meritocracy, you’ll judge people by their results and not by what they look like, how they worship or where they’re from – and that means untangling centuries of bullshit about ability, the meaningless signifiers of “success” (for example, all our presidents have been men, therefore to be a good president, you have to be a man – or the funny bit of trivia that almost all Fortune 500 CEOs are white men over 6 feet tall). Just because historically, someone hasn’t been allowed to do something doesn’t mean they can’t. And just because this is how we’ve done it in the past doesn’t mean that’s the best way going forward – especially if it’s a cultural affectation that doesn’t actually have anything to do with the outcome.

So, being a man – it’s not bad. But, it’s not the only thing. Being kind is more important than your gender.

Importing Rdio Playlists (and Your Collection) Into Google Music

My beloved Rdio is dying, and soon. They ran out of money, sold all their assets in a fire sale and have given their users about a week to find a new music home. I tried Apple Music, but quickly ran into limitations (song limit, my patience with their awful UI, horrible apps for importing songs, etc). Asking around, it looked like Google Music was the next best option.

And then the problem was, how to I get almost 5 years of musical history from Rdio into Google Music? All those favorites playlists from 2011-2015, the road trip playlists, the special occasion playlists… all of those will just disappear.

It took a lot of experimentation, but I found a way to export my playlists (and entire collection) from Rdio to Google Music. Here’s what you need (sorry, this is going to require some Terminal time):

  • First, you need to install the Rdio Enhancer Chrome Add-on.
  • Sign up for the Google Music free trial.
  • Install gmusic-playlist – it’s a python library for interacting with Google Music. It has some dependencies, so you’ll need to follow the README instructions carefully.

After you’ve gotten those installed, you need to do the following to save your playlists and collection in a format that’ll work with the importer:

  • Go to Rdio in Chrome.
  • Click Favorites.
  • You should see an Export CSV button. Click it. Depending on the size of your library, this could take a while. It’s going to generate CSV files for your entire collection. My 35,000 song collection took 3 CSV files, and about 5 minutes to generate and download them. Chrome will probably ask you if this site can download multiple files. Say yes and wait for all of them to download (15,000 songs per file).
  • Once you have all those files, it’s time to do playlists!

For each playlist you want to save:

  • Click its link in the left nav bar.
  • Click the 3 dots in a circle button (next to the share button), then “Extras”, then “Export to CSV”.
  • That’ll download another CSV file.
  • You should open up each CSV and delete the first line (the header) or you’ll end up with “Did She Mention My Name” by Gordon Lightfoot in all of your playlists. If that doesn’t bother you, go ahead skip this step.

Now that you have your collection and all the files you want to save, it’s time to set up the gmusic-playlist importer. After you unzip it, open the folder and then open preferences.py in your favorite text editor and make the following changes:

  • username should be your google login email address.
  • Change the track_info_order line to look like this: track\_info\_order = \['title','artist','album','trackNumber'\] (the only change is to change “songid” to “trackNumber”).
  • Change allow_duplicates to True.
  • Change search_personal_library to False.
  • Save the file.

Now you can follow the gmusic-playlist directions to import all those CSVs. Google Music has a limit of 1,000 songs per playlist, so your collection will be broken up, but at least you’ll have all your songs!

Update: I tried to like Google Music. I really did. But, it has some fatal flaws:

  • Their new releases page is bad and not updated with actual new releases.
  • There’s no social at all. It’s awful.
  • The Web UI is just broken enough to be really frustrating, and all the web apps for it are hamstrung by the web’s brokenness.
  • They do very strange things with explicit lyrics.

So, I was going to update this post with instructions on how to import your official Rdio export into Google Music, but… don’t do that.

I’m trying out Spotify Premium again for the first time since I started using Rdio, and they’ve paid attention. Social is better. Sharing is better. The queue is persistent between sessions. They have more music than Rdio did, or that Google Music has. Their new releases page is actually mostly up to date.

Instead of using this process to import things to Google Music, use the official Spotify Rdio Import tool. It takes about five minutes and works really well.

Dealing With Your Kid’s Email: A Nerd’s Approach

My kids both have Google Ed accounts for their school work, which comes with an email address. Some of the parents in the school’s Facebook group were asking how to set up the school email account on their phones, which feels like overkill to me. I don’t log in to my kid’s email – I just have all of their incoming email forwarded to me (which I then filter to get it out of the way so I can read it later).

And here’s how to set that up if you’d like to do the same thing!

  • Go to Gmail and log in as your kid.
  • Click the Gear icon on the top right side of the page and click Settings
  • Click on the “Forwarding and POP/IMAP” tab.
  • Now click the Add a forwarding address button.
  • Put in your email address that you want emails forwarded to and click Proceed.
  • It’ll send a confirmation code to your email. Grab that and put it in the verify field.
  • Now click the radio button next to Forward a copy of incoming email to…, select your email from the dropdown and then choose keep Gmail’s copy in the inbox from the second dropdown.

And there you go. Now you’ll get all your kid’s emails in your inbox. Lucky you!

Now, for bonus points, filtering. I have a ton of filters to keep my inbox nice and clean, and my kids’ emails have their own filters. Here’s how to set one up:

  • After you set up email forwarding, you’ll start getting emails to your kid in your inbox. You need one of those to start with. It doesn’t matter what it is as long as your kid is one of the recipients.
  • In the search box at the top of GMail, search for to:yourkid@whatever.com (replacing “yourkid@whatever.com” with their actual email address).
  • Once the results come up, click the More button and choose Create Filter.
  • The To field should be filled out with your kid’s email address, so go ahead and click “Create filter with this search”.
  • This is where things get fun. Here are the settings I use for my kid’s email:
    • Label it with the kid’s name.
    • Skip the Inbox
    • Mark it as read.
  • With those settings, they never hit the inbox, but, I have to remember to check it periodically, so it’s probably a good idea to leave them in the Inbox to start and not mark them as read – just apply the label.

That should help you keep up with your kid’s school emails without going crazy! Good luck!

Learn to Code By Cheating

My kids love Cookie Clicker. And, only because they can’t stop talking about it, I checked it out. My 14 year-old told me he’s figured out how to cheat at the game so bad that he basically ends up with “infinity cookies”.

Wait, let’s step back. The game is weird and silly and involves clicking a big cookie to get more cookies. You can buy upgrades like cursors that click cookies for you, grandmas who bake cookies for you, all the way up to time machines that go back in time and bring you cookies that before they’ve been eaten – and you purchase all of these with cookies that you, wait for it, click.

Back to the cheating. The game is all done in Javascript and all done in the browser, so it’s really fun to mess around with things and cheat – and learn some Javascript fundamentals while you’re at it (and even some jQuery). There’s even a page on the Cookie Clicker Wiki dedicated to cheating. You’ll notice that all of those cheats are Javascript functions. Here’s one I wrote that is a little longer than the one on the wiki, but makes me happy because it’s all object-notated and is called cookie_monster:

<code>var cookie_monster = {
  gimme:function() { 
    Game.ClickCookie(); 
    setTimeout("cookie_monster.gimme()", 1); 
  }
};
cookie_monster.gimme();</code>

That’s all broken out so you can see what it’s doing. Here it is if you want to just cut and paste it into the Javascript Console in Chrome (the browser made for cheating):

<code>var cookie_monster = {gimme:function() { Game.ClickCookie(); setTimeout("cookie_monster.gimme()", 1); }}; cookie_monster.gimme()</code>

Basically, the cookie\_monster.gimme() method clicks the cookie and then sets a timer to run itself again in 1 millisecond. That ends up being a lot of cookies per second. It also unlocks a bunch of achievements, which is cool (but still cheating).

And here it is as a bookmarklet: Cookie Monster. Just drag that to your bookmarks bar, and click on it while you’re in Cookie Clicker and the cheat will magically start running. I love Javascript.

I’ve been talking to both of my kids now about Javascript and how we can more efficiently cheat at the game, which I think is awesome. If I can get them to think of programming as a game, then I’ve already won.