Category: development

  • Climbing Mountains or Digging Coal

    I was talking to my manager today about what I want to do, specifically about how much of my time I want to spend coding and I came up with a new metaphor!

    Coding, especially in Ruby, isn’t the same challenge it used to be. Do I still like it? Sure, it’s fun, and I fear obsolescence so I’d like to stay current as much as possible, but, I’m not scared of any problem I’ve faced in the last… 5 years? 10 years? I’ve been pretty confident I could solve them all.

    With code, I’m not climbing mountains anymore, I’m digging coal. It has its dangers, but it’s mostly the same thing over and over again, no matter how much gets delivered or how happy people are, I’ve done it before, and am capable of doing it again.

    I used to try something new on every project, and I still do that, but it’s less about code and more about how I work with other people. Mentoring and building people up feels way more like climbing mountains now. Seeing other people flourish and get to the next step of their careers is way more fun than solving technical problems.

    What does that mean for my next career steps? Who knows, but it’s exciting to come to that realization.

  • Browsing For Work

    I have a lot of personas when I’m at the computer. There’s me, the person, who has social media accounts and personal email and an Amazon account and various streaming services. There’s work me, who has gmail and a million github tabs open. There’s TechSAV me, and several SKTCS versions of me.

    All of them have their own GSuite accounts, and various other things for getting things done.

    I think I’ve finally got the setup for managing all of them without them running into each other too much! This post is very Mac-centric, but the guidance for Chrome still applies.

    The trick is to stop trying to do everything in the same browser. Thankfully, with Chrome, you can create multiple profiles so you can keep your various identities distinct!

    In Chrome, as long as you’ve logged into a Google account with it, will have your little user icon in the top of the menu bar. It should look something like this:

    A screenshot of my Chrome menu bar showing my bald head… that’s my user icon!

    If you click your icon, you’ll get a menu that shows your current Google account and then a list of your other profiles. If you don’t have any, it’s time to create some!!

    The Google profile window from Chrome

    If you click the + Add button, you’ll be able to set up entirely new profiles that give you a “clean” browser experience so you can keep your various personas separate so you don’t end up trying to join a Google Meet with your school account or wonder why you’re not seeing that email from your boss when you’re in your personal GMail.

    That’s great in isolation, but I get links that open browsers from email, text messages, etc… and I need a way to route them to the correct browser so I can handle them with the right persona. That’s where things get Mac-like (I know there’s something similar for Windows but I don’t know what it is because I don’t use Windows)! I installed Choosy a few months ago and it’s made this part of my life so much easier!

    Choosy lets you choose which browser to open when you click a link from another application, and the coolest feature is that you can set up rules to open a specific browser based on the URL, which app you clicked on it from, etc. For example, I have a rule that says to open any URL with “outvote” or “impactive” in it in my Impactive Chrome profile, so I don’t have to choose which browser to open every time I click a link to a Github ticket. Another rule is to open any link I click in my feed reader (the wonderful NetNewsWire) in Firefox, which I use for personal stuff (I like that it fences Facebook things by default, and I love an underdog).

    With this setup, I can keep my personas separate and make sure things open in the right place.

  • Developer Vocabulary Additions

    This is my 20th year as a full-time professional web developer. I’ve learned a lot over the years… and at this point, forgotten more than I remember.

    My favorite thing about being a developer is that we’re the heroes and villains of our story at the same time. We create the bugs and then get celebrated when we fix the bugs we create.

    I’ve had a couple great bugs in the last week and my new response to the thanks I get from my Planted fam when I fix them is:

    I’m sorry and you’re welcome.

    It’s easy, concise, and both apologizes for creating the issue in the first place and acknowledges the gratitude for fixing it.

    Elegant. That’s me.

  • I’m on Team #OfficeHours

    I’m on Team #OfficeHours

    Inspired by Matt’s tweet, I’m trying out offering office hours. You grab half an hour of my time and we can chat about whatever you think I can help you with.

    https://twitter.com/mattmay/status/1075126400317673472

    If you’re in Savannah, I also like to do coffee meetings weekdays between 8-9, but you should email me about those.

    Some rules, because it wouldn’t be official without some:

    • Please don’t try to sell me anything. If you want to get feedback on your pitch, great, but I just… I don’t want to.
    • You set the agenda. Some things you might ask me about:
      • Savannah’s tech scene, TechSAV, or codebar Savannah.
      • Savannah restaurants
      • Baking bread
      • Technical leadership
      • Ruby on Rails or CSS (or databases or javascript or whatever)
      • How to create a guerilla organization that actually gets things done.
      • How to write a resume that a robot can read
      • Being on a board
    • I guess “no sales pitches” is really the only rule.

    And while you’re at it, why don’t you set up your own and share what you know! It’s ridiculously easy to set up either Calendly, Fantastical’s new Openings feature or a Public Calendar on Google so people can talk to you.

  • My Friend Cindy Li

    My Friend Cindy Li

    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