Category Archives: Pals

Week 3000

Still adjusting to working with offshore developers. There definitely is a pattern of setting up a request, expecting it to be all done in the morning, and having to answer a few questions or concerns the next morning. If you don’t get to those questions immediately, you miss another day cycle.

Speaking of cycling – I took a day off of biking to work on Monday. Tuesday I went again and hit tons of personal bests! I’ve given in and started using Strava and it’s interesting to see how there is a an actual trend of improvement. For example, here’s my times on the Manhattan Bridge.

It is cheesy, but all these personal records and gold medals against myself are very rewarding.

Another takeaway: maybe rested legs are stronger!  Due to rain and hangovers, I’ve only done 24 miles this week . Hope for more next week!

Also at work, we’ve whipped up some backpacks for kids that can’t afford school supplies.

I did some virtual phone banking at lunch on Thursday and Friday for Danny O’Connor. Mostly leaving messages, but every bit helps. There’s a special election on Tuesday in Ohio and I want to make sure I do what I can for it. I invite you to join me – these things are easy, they don’t take time and they make a  difference.

On twitter, I really like the #InvisibleNetworks tag. @ctrlcreep is running 30 days of story prompts and people are replying with weird imaginative little stories.

Max is writing a book. He’s done 2 chapters about a bunch of robots in space. Cute Bun, AVX and their pals are all fighting and using lasers and it’s awesome.

Zelda is still working on her walking. 3 or 4 steps at a time now.

This week I got to dig in a bit on some performance profiling.

While doing some performance testing I found I needed to put in a bunch of temp log statements, but ugh… So I just created a decorator that will log the docstring of any python function and voila!

It’s hard to know exactly where your performance hits happen – so Robert Kern’s line_profiler is a great help.

I set up a terminator session with a few open terminals (different terminals allow you to take advantage of multiple processes and cpus). Then I used entr in each one to run profilers and timers and linters on the scripts.

ls *.py | entr -cs 'kernprof -l ; python -m line_profiler

This tells entr that whenever any python file changes

  1. clear the screen “-c”
  2. profile the code: “kernprof -l;”
  3. then display the saved profile of the code: “python -m line_profiler’

In other terminals I put in

ls *.py | entr -cs 'flake8 *.py'
ls *.py | entr -cs 'pylint *.py'

This way I keep my code clean – with a dash of autopep8 -a -a -i  to solve the easiest pep8 errors automatically. It’s also really something how much easier it is to reason about the code as I break it down into smaller chunks.

I’ve installed PyCharm in the linux workspace, and it is definitely a step up. Comes with vim emulation built in and it’s got some nice refactoring tools.

Week 2099

This is the 6th week at my new job.

I’m really enjoying the new toys to work with there – there are so many smart folks and they’ve been doing the right thing  for years. I’ll suggest a clever solution and they will point out they’ve got that in their plan or that they considered it and it doesn’t work for good reasons.  The tools, the documentation, the culture, it’s all really impressive.

I’m working in tighter boundaries – instead of nobody caring about performance I find myself in meetings with high level people where we are talking about differences of 200ms. We’re hiring! Get in touch if you’re interested and I can refer you in.

There’s no dress code and that’s been really nice. It makes it much easier to bike in – so I’ve been doing that way more than usual. I skipped a few days due to rain and I’ve still done 36 miles this week. Since I joined Strava I’ve ridden 100 miles.

I’m sweating less for a 6 mile ride and I’m noticing differences in how fast I can go up bridges and such. I also don’t have as much energy just waiting around in my legs – they get more tired and I’m not giving them much rest at all.

I’m doing weight watchers with Sam and it’s definitely affecting my choices. Now that there’s points I’m eating way healthier. And the sous vide machine has been helping – it’s easy to pop something in when I get home and then finish the cooking after putting kids to sleep.

The boy got sick this week and we had to take him to the urgent care center because his heart rate seemed very high.  He refused to take anything to bring down his fever, I think that’s what caused it. So we go to the urgent care and they say take this medicine to reduce your fever and he refuses to drink it. Ultimately they say, then we have to give a suppository.

That’s no fun. But when they came back in a few hours and said it’s time for more medicine he looks up and says “I’ll do it the easy way. Bring me the cup!”

I’ve had a chance to volunteer on the texting team for the Beto O’Rourke campaign and it was fun and easy. I HIGHLY encourage you to give it a shot because Ted Cruz can be beaten.  If you can’t donate money, these days it is super easy to donate time.

Closer to home I found that since I am partially domiciled in NY-19 I can register to vote there and there’s a good candidate in a toss-up race in House. I’m going up this weekend to learn how we can volunteer to get Antonio Delgado in and John Faso out.

Baby Z is taking her first walks and she points at her belly if you ask her where it is! She also is playing with Max. This morning they both had fruitsicles (to keep Max hydrated) and she kept leaning over to wack him with it! It’s so wonderful to see them loving each other.

Sous Vide Machine Reaction

I got an Anova sous vide machine because I’ve been wanting one for ages and now it seems silly not to get it. Some reactions for you.

It is bigger than I expected. We don’t have tons of space, so I was surprised that it is about the size of a big hand blender.

Sous Vide eggs are amazingly perfect but I never eat eggs with a 45 minute plan ahead.

Sous Vide filet mignon at 130 for 1 hour then put on a very hot skillet for 2 minutes each side is very doable and reasonable and that is a perfect damn piece of meat. Already this thing is seeming pretty good.

Also, Aperol Spritz is the drink of the summer.

DreamHost is making my life way more complicated

Argh – normally I like everything DreamHost does. They had a history of just making my life easier over time. Their plan was simple: unlimited email and storage for your website, a reasonable price.

But now, for the second time, they are taking away a feature that I use heavily! DreamHost is killing catch-all emails! This is terrible for me.

The short version: I own this domain and I get or send email from from anything@morelightmorelight – so honeybooboo@morelightmorelight gets to me and I could send you a mail from DarkCrushingVoid@morelight… This is fun, but where it is really useful is in dealing with all the damn signups online.

Everyone online wants you to sign in or sign up! The reason why isn’t always that they love you and want you to be a member, it is sometimes that they want to track you and sell your details to other businesses. Imagine that! Sometimes they are nice but they just don’t have great security and someone steals your email address from them. That’s how you get all that spam!

Stop for a minute and give Have I Been Pwned a check for your email address. Yeah.

The emails I use for talking to people I love and care about don’t show up here. For example:
Image showing that my primary email hasn't been in a data breach
But when I am forced to register with a service, I just make up an email address with their name in it and I make up a password just for them. When they get breached by hackers, they hackers can’t use that email or password on other services to get into more stuff. For example:
Image showing that an email and password associated with adobe was stolen from the adobe servers

The password with adobe and the the email address are disposable to me.
I filter out emails from places that have been breached by hackers.

And all is good! I have unique emails per place to log in, I have unique passwords per place to log in, and I have a way to respond to data breaches. But now, DreamHost is turning off this feature for me.

They will delete my email account in October if it isn’t converted over to a different email account. I have to figure out a way to create email accounts for all the logins I’ve had over the years or go change them on every site. It is going to be an incredible pain in the ass. So now, I have to start figuring out how to respond.

My likely plan:

  1. learn how to download all of my emails and get a way to analyze them.
  2. Figure out all the unique email addresses I get email at and mark them as keepers and personal. This will take coding.
  3. Create a main personal account
  4. Upload all my history back to this account and figure out how to sync that back with Thunderbird
  5. Create all the other personal accounts and forwards from all the other personal accounts to the main personal account. This will take coding.
  6. Create business accounts and forwards for each of them. This will take coding.
  7. Create a general new throwaway scheme for login emails
  8. Investigate whether it’s time to move to hosting that gives me more control or adapt to this and concentrate on other things in my life.

That last one is also important. When I was younger I did a lot of flexing in tech to do things myself so I could be super independent. This taught me TONS of things and is great! However, I can’t do everything, so I now make compromises so I can spend time on what matters most.

That’s the part that irks me. I am fine with adapting to the new business reality at DreamHost – but they don’t have a plan for me. I’m going to have to build my own tools and figure out my own way. I can do this, but I don’t want to! I’d rather spend this time building a website or helping people or being with my family.

How to not fail at support

Support is a really neglected part of a lot of development jobs. You want to just keep writing code and making releases. It’s easy to get into the code and forget that the users are the reason you get paid to write it! If you find you’re doing your best and solving problems, but don’t seem to get the credit or positive results to show it, this might help you. Also, the title is “How to not fail at support” – because this is not about solving the problem or techniques for doing the fix – this is about how to not lose the encounter even when you solve the problem.

All Code has Bugs

You’re going to have them. Nothing is perfect. Your plan for any software has to include support or you’re gonna have a bad day.

Why people get angry at you when you are trying to help them

People need help and when people need help they are vulnerable. They are trying to do something and it is important to their ability to succeed at their job. If they don’t need it to succeed at their job, they won’t bother you about it. If they do need help, they want it as soon as possible and they want to get back to doing their work.

H.A.R.E.M solves the problem

The best way method I’ve found to keep sane and make sure every user is happy with support is to follow the H.A.R.E.M method. There is no silver bullet for software development, but there is definitely a silver bullet for handling human beings who need support without them getting angry about it.

It sounds stupid simple, because it is. Doing it is harder than understanding it.

  • Hear the request
  • Acknowledge the request
  • Restate the request
  • Estimate how long until you will get back to them.
  • Meet or beat your estimate.

That’s it! It handles the customer service part perfectly. Do this and all you have to do is go find that race condition that disappears when a debugger is running!

Hear the Request

You need to have someone actually monitoring incoming support requests. This is harder than it sounds. Not hearing the request is a terrible problem – because they’ve reported an issue and no one is actually working on it.

If you don’t have a clear, easy dedicated, and monitored pipe for users to tell you about their problems, you need to fix that immediately. When someone doesn’t know where to go for help or when they go for support and no one looks at the queue, you have a big problem. Your users will hate you, and you’ll deserve it. If you’ve ever called for help and it hasn’t arrived, you understand the feeling of betrayal and hopelessness that you are associating with your labor.

Poor software with excellent support is a better deal for users than good software with no support. We know, because they actually use poor software with excellent support more.

Think through the experience of asking for help. You are trying to get help. It’s bad enough so that you can’t fix it yourself – so you are helpless. You want to get help – to ask for support. If you don’t know where to go to reliably get help, you will feel despair and anger.

Acknowledge the request

If someone tries to get support but they feel like they are shouting into the darkness, that’s the same as if they aren’t getting support. One of the big reasons people call instead of entering a ticket is that people don’t know if the ticket is getting looked at. If someone is calling, they know that a person has heard them.

Think yourself through the experience of asking for help. You are trying to get help. It’s bad enough that you can’t fix it yourself – so you are helpless. You want to get help – to ask for support. You ask for the support and hear nothing. You will feel anxiety until you know that someone has heard you. You’ll “check in on them.” You’ll call to follow-up. You’ll do anything to make sure that someone is actually going to work on your problem.

When you acknowledge the request – you just say “I heard you and I’m working on the problem.” That is such a soothing thing to hear. Someone knows the house is on fire and help is coming!

This is super important!

  1. Users can chill out and go work on other things until you solve the problem
  2. If people know that submitting an email or ticket online gets acknowledged, then they can do that without tying up someone on the phone.

A script

“Hi Allie, I saw your ticket and we’re re-imprinting Asimov’s three rules on the floor robot’s positronic brain.”

“Hi Bob, I saw your message. I’ve unlocked your account for you and you can reset your password at the help portal. Happy to help, let me know if you’ve got any more issues with it.”

“Hi Carla, I saw your request. You’ve hit the hard drive limits under our policy.  I’m attaching a quick guide to how to slim your hard drive footprint that other folks have found helpful. If that doesn’t work we can send a note to your manager and the CTO to see if they will approve an exception.”

Restate the request

Support requests are difficult. Don’t work on the wrong one. I’ve spent hours troubleshooting the wrong problem because I didn’t understand what they were trying to tell me. This waste is a waste of your time and the poor person who is waiting for you to fix their problem. They don’t care about the time you just spent and how hard you worked. No one benefits.

Always. Restate. The. Requests.

It sounds stupid. It sounds awkward. Do it anyway. It’s a “check for understanding“. In conversation you can just say “I want to make sure I’ve got this right, so let me restate what you’ve told me.” That language usually helps them understand why you insist on saying back to them what they said to you.

Think yourself through the experience of asking for help. You are trying to get help. It’s bad enough that you can’t fix it yourself – so you are helpless. You want to get help – to ask for support. You ask for the support and hear that someone will help. Relief.. Then they tell you the house isn’t on fire – but you are seeing the flames! Or they say they’ve fixed the water leak, but you are seeing a waterfall in your bedroom. Are they insane or incompetent or lazy or lying? You will feel angry, frustrated or betrayed.

A script

“Hi Allie, I saw your request – I just to make sure I understand. You’re saying the floor robots are ignoring Asimov’s 3rd Law – that they are killing themselves out of boredom?”

“OH MY. Sorry, you’re saying that they are ignoring Asimov’s 1st Law and killing everyone on the floor out of boredom! I’ll send Will Smith over immediately. Please shelter somewhere safe.”

“Hi Carla, I saw your request to increase your hard drive size – you’re telling me that you have to use a program that only works with large files on your primary drive. You’ve hit the hard drive limits under our policy.  I’m attaching a quick guide to how to slim your hard drive footprint that other folks have found helpful. If that doesn’t work we can send a note to your manager and the CTO to see if they will approve an exception.”

Estimate how long until you will get back to them.

A key metric for user satisfaction is “First Call Resolution”. FCR makes people happy. For phone calls that means getting solved during a conversation. For emails and tickets, that means someone resolves the issue within 1 hour of the request coming in and while in the first response to the request. Yay – those are automatic wins!

But there are plenty of issues that are bigger than a single call or take more time. This is where real rancor and unhappiness can develop even if you are solving problems and doing everything else right.

Tell people how long until you will get back to them. This isn’t a guarantee that you’ll have the problem fixed – just a message of how long they should expect until you can update them. This is very important because it gives them a chance to make decisions and be empowered. Just telling them this lets them be less helpless.

If you think this reporting issue will take 1 hour, and someone has to be on the phone with a client in the next 20 minutes, they can decide to calculate the numbers themselves or to postpone the call. Letting someone know enough to seek other solutions is good for them.

An estimate is basically a promise to the user: You can bug me if I don’t come back to you before this time. If that isn’t soon enough you can seek other solutions. If it is ok, just relax and work on something else until I call you – I’ve got this.

A script

“Hi Zelda, I’m not sure why the delivery drones are returning to the warehouse without releasing the payload. Just to be clear – the address is correct, the payment is fulfilled and they order hasn’t been cancelled, but the drone just goes to the address, circles, and comes back with the package? This is tricky. I know you are under a time crunch. I’ll start looking at this and I’ll get back to you by 2pm with either a solution or I’ll let you know how much longer it will take me.”

Meet or beat your estimate.

When you make an estimate, you’ve made a promise. Keep your promises.

Don’t break your promises. Do what you say. Be clear. Meet or beat your estimate. That’s why your estimate includes a statement saying you might come back with another estimate. Do that if you think it might take longer than your original estimate. Better to keep the user in the loop and up to date than to have them know that they can’t trust you.

A script

“Hi Zelda – Just calling to check in with you. This is trickier than we thought. The GPS system connected to the drones doesn’t show the address! That’s something we are working with a vendor to correct, but it won’t be fixed by 2pm. I’ve asked them to keep us up to date and I’ll chase them. I’ll get back to you by 4pm with either good news or I’ll get you a better estimate.”


The reason this works is simple: it’s humane, it respects the needs of the person asking for help and it treats them with good manners. It won’t solve problems for you – you’ve still got to do that, but it will get rid of feedback that your people feel abandoned by your support team or that they don’t want to bother reporting issues.