How I Try to Mentally Unblock Myself

It’s Tuesday at 3 PM. I have a few hours of good work left, but get stuck on something pretty basic. Without thinking, I flit around on the internet for a little while doing fruitless research or goof off or grab a snack, and then return to the problem at hand ten minutes later. I then proceed to fix it in two minutes.

Did it really take me twelve minutes to fix it, or could I have fixed it more quickly by taking the right approach?

I find being able to unblock myself important because I work fairly independently. Bouncing ideas off of others is useful, but perhaps no one else is not around or it would be pretty distracting to bother them. Obviously, it’s important not to overlook coworkers or experts who might know the answer to the question I’m having. These strategies also help others become unblocked.

(Most of the examples and fixes here apply to software development, but they could also apply to business strategy or other domains. I had a subset of this post in The 20% Difference post, but I thought there were more strategies than I outlined there.

Unblocking Myself

One of the most helpful things to think about is: can I clearly state the exact problem I am having? If it’s an error code or a specific condition, at least realizing this can provide me with concrete information to think about or to search for an answer for. Which of these would be more useful:

  • some pages are not being served correctly versus
  • when we access HTTPS pages in the production environment, they are not being served correctly by our application

Ambiguity in my wording points to things that I need to understand better to be able to solve the problem effectively.

Writing in plain English what the problem is will either point to a lack of knowledge of what the problem is, or another set of search terms or things to think about. If I lack knowledge of what the exact problem is, sometimes inspecting the logs or tinkering around to see if I can get more information or a different failure helps me to clarify what the issue is.

Another example is getting more fine-grained to increase motivation:

  • revise website versus
  • improve home page by adding two testimonials I have in my email inbox (and so on)

I think the second one is more actionable. So if I am getting hung up, breaking up the problem can be pretty useful.

They Want the Report in Green!

I find it hard to get motivated to start when I don’t fully understand the intent for something. In this case, I try to think through who might need this feature, and if I still can’t figure it out, I ask a stakeholder. Generally I trust my gut on this. There are times when the person who wanted the feature did not think through everything, or the system can already do what they need it to do. Or sometimes the feature request itself is vague, and needs to be clarified, at least on my end.

Punt for Prosperity

Do I need to solve the “problem” under consideration right now, or could it be deferred and worked on as part of another task? Perhaps it’s just worth finishing what I am working on and polishing the edge cases later. This allows me to deliver any value more quickly. Especially if I don’t know if my general approach will even work, getting bogged down in the small details is a good way to lose motivation. Maybe this is a good time to write a note to revisit the problem or reach out to someone asynchronously to get clarification.

Zooming Out and Zoning Out

Often I take a step back to unblock myself. Are there other things on my mind right now that are causing me to be unable to focus? Maybe I am hungry or worried about something coming up soon or work that is unfinished on another project. In this case, basic journaling can point out where I am blocked and allow me to address it or realize that I can safely ignore the issue for now.

At other times it is best to just take a dedicated and perhaps timeboxed break. When I look back after mindlessly wasting an hour on the internet, I often ask myself, if I could have gone for a walk outside or meditated or read a book instead, would this have been better for me? Usually the answer is yes. So when I realize that I would like to take a break, if I can channel that break energy into something either mildly productive or totally relaxing and fun, then it’s a small win.

How do you mentally unblock yourself?

I’d be interested to hear anyone else’s experiences with getting over small humps.

The Tech Behind My Wedding

I got married in April of this year. I’d like to share the tech we used to make planning and communicating a little easier. Then I will get all mushy at the end.

Project Management

Setting up any large social event takes a bit of planning. We were initially pretty overwhelmed by the amount of things that needed to be done (invitations, ceremony planning, cake tastings, music coordination, and the list goes on and on.) It felt like every time we talked with someone else, there was another thing to consider, and we figuratively chased our tails a lot. What’s more, remembering key deadlines and keeping ourselves on track and motivated was pretty important.

So I thought to myself, “what tools do I know that can help with this?” We need some sort of tool to see what needs to be done and to keep us organized. Pivotal Tracker came to mind, but seemed a bit too geeky and software-specific.

Then I thought of Trello. That seemed lightweight enough, and would provide us with a good dashboard of what needed to be worked on. So step one was to take our list of tasks that started to pile up and put them into Trello.

The next step was figuring out what sorts of columns to do. After some experimenting, we went with the following, from left to right:

  • two months after the wedding
  • every month leading up to the wedding, in reverse chronological order
  • what we are doing this week
  • all done tasks

When a new task came to our attention, we tried to slot it based on the other tasks or when it really needed to be done by. For example, getting a dinner tasting needed to precede deciding which dinner options to choose. Then all tasks hopefully flowed from their month to “this week” or “done”. When a given month was over, we could see what tasks still were not complete and to move them to the subsequent month.

A picture of our Trello Board after the wedding

Trello was a great fit for our situation. It allowed for us to see what the progress on various things was pretty quickly. When you comment on a card, the other person gets a notification, which facilitates asynchronous work. It was easy to use and visually appealing.

The nice thing about keeping cards that could be done later was that we didn’t have to think about them much. “Don’t worry, we don’t need to finalize the DJ until March, let’s focus on something else.” Also, the visual nature of the board allowed us to see that a lot was getting put in the March bucket, so we should probably get some more things done this month to clear some room.

Some Getting Things Done strategies helped to organize things. GTD-aficionados will recognize some of the following. Capturing everything in our trusted system (“If it isn’t in the Trello, then I don’t know about it.”) Asking “what is the next action on this task?” helps to clarify how to unblock a ticket or break it down into sub-tickets. Having a dedicated weekly review so we can review how things are going and reassign or reprioritize tasks.

Overall, I think this approach was a big win. I secretly both loved and hated taking a project management approach to the wedding.

Logistics

A basic flow of keeping track of guests with addresses and formal names, responses, gifts, thank you cards, and so forth was fairly challenging. To manage this, we ended up using some shared Google Docs spreadsheets. Arguably I could have made some sort of web app, but I think that this got the job done in a decent manner.

At one point, our caterer asked for a list of guests at each table, with what meal they were having. However, we had this information spread across a few spreadsheets. So I copied them to a plain-text file and made a Ruby script to join the lines together. I have no idea how long it would have taken or how many errors I would have made doing this manually, but the Ruby script just generally worked and I was able to do this in like half an hour.

There were probably dozens of times that I cursed the lack of better free tools for these problems (that I could find.) However, I can understand why developers probably don’t want to spend too much time working on things like this.

Wedding Website

One of the tasks was to create a wedding website to give guests a way to see more information about the event. Being the software developer of the couple, I happily fell on that grenade.

There were various wedding website generators out there, but I was not happy with the look of any of them. Since the content of the site seemed simple enough, I decided to try my hand at using a static site generator. I don’t think that I had used one up to that point before, and it was a positive experience.

Quick overview of using a static site generator: basically you write in markdown or some other markup language, and then the generator takes your markup and converts it to plain HTML, CSS, and JavaScript. The benefit of this is that you get extremely fast page load times since you can serve static assets that can be cached or served over a CDN.

A picture of the wedding website

Overview

I used Jekyll because I know Ruby and it seems like the best static site generator for Ruby. Jekyll was very easy to develop with, and definitely beat setting up yet another WordPress site. I hosted it on S3, which is pretty easy to do and is very cheap.

One of the use cases of the website was to be viewable on mobile devices. I have too often tried to go to a wedding and look up details on the way and the site was hard to use. Using a style framework ensures that the site remains responsive to different screen resolutions. Skeleton seemed to be a very basic but functional set of CSS files to ease responsive development.

The site lacked style for a little while, and then I embedded some Google Web Fonts to spice things up a bit. Basically this was the styling for the “logo” of the site (just swirly text that I gave a bit of offset to to make it run together a bit.) You can actually select text from the “logo” and it kind of looks funny, but I thought it was a pretty cool effect overall.

Awesome Controller sprite art creation taught me how to use Pixen, so I used that tool to create a custom favicon that looks like two rings that go together. Maybe not the best favicon ever, but hey, it was fun.

Dynamic elements

It was interesting to me how many things on the static site were actually interactive or dynamic. Most of these were taken care of by using JavaScript libraries to do the work on the client-side, or to offload work to another service.

The navigation was actually handled by a Jekyll script that looks at the current URL and sets the selected page correctly at compile-time. I found a decent responsive JavaScript slideshow plugin to show off our engagement photos.

We wanted to ask people what their music choices for the reception were, but I couldn’t think of an easy way to do this at first. Then it hit me. Use a Google Docs Form! Then the answers would be aggregated and I didn’t need to set up any sort of form handling.

Mushiness

OK, so enough technical stuff. :)

I am very excited to be married to a wonderful woman, and we had a fantastic day. It was everything we had hoped for. I think the day was very emotionally memorable, in a positive way. I think the planning helped us to grow stronger together as a couple. I think that it is great to be married, and I love Monica more every day!

A picture at the wedding

Quick Tip: Audio Reminders for Better Posture

Basically the tip is: find some way of playing a sound every fifteen minutes or so, and when this happens, check my posture. I have found this useful for better ergonomics and posture while using my computer.

I’m using the Mindful Mynah app on Mac, and have it set to chime every fifteen minutes or so. When I hear the chime, I quickly check my posture and often find that I can improve it. I think this increases my mindfulness of how I type and sit, as the bell reminds me to check it more often. Even without the bell, I realize that I have incorrect posture more often. The nice thing about automating this process is that I just need to have the intention to have better posture once, and then I can automatically lock in that benefit over time without needing to expend much effort.

The chimes do sound strange to others if I am on a non-headphone Skype call, and sometimes I forget to turn the app on or have the volume high enough, but for the most part it works. I actually notice sometimes when it has been a long time since I have heard the chime and then I remember to turn it up or on.

I’m sure there are other apps on other systems like this, and you could probably set your phone to vibrate to do the same thing. The nice thing about that is that you can practice better posture wherever you are.

The 20% Difference

Today I want to talk about something I read about in GTD-creator David Allen’s book Ready For Anything.

A key quote for me from his book is: “Nobody will even try to absorb and manage two hundred percent of what they can do. But they will take on enough to let themselves get ten percent behind their curve. And when you are ten percent behind, you feel like crap. But on the other hand, if you can manage to get ten percent ahead, you’re transformed and on top of your world.”

The idea he presented was that there is only a twenty percent difference between being ten percent ahead and ten percent behind, but the difference is huge*. Allen suggests that this 20% difference leads to feeling a general sense of ease and also the ability to think more strategically. Fighting fires does not lead to giving time to think more holistically.

My Thoughts

Compare: “Well, I said this milestone would be done on Wednesday, but really it is not going to be done until Friday” to “I said this milestone would be done on Wednesday, but I actually got it done today on Monday.” If you’re an hourly and/or standard weekly person, the difference between having Friday afternoon to work on personal projects or thinking great thoughts instead of being behind at work.

The idea can be useful when applied to projects. Asking which projects are slightly ahead of schedule, and which projects are slightly behind schedule and the acceptability of that state can clarify priorities in organizations and life.

The quote from the book above is useful for also realizing that we are for the most parts responsible for the amount of work that we choose to take on. Sometimes the right thing to do is to consciously drop a project or put it on the back burner to free up energy to get ahead on key projects.

I think the tone of the quote also suggests that each of us has our own curve. A state that is ten percent ahead to me might be fifty percent behind or ahead of another given person.

Sometimes now when I feel like procrastinating, I ask myself: “Would I rather be working toward ten percent ahead, or ten percent behind?” That usually helps me either get back to being on track, take a step back to unblock myself mentally, or take a dedicated break.

Ready For Anything Itself

As for the book itself, I recommend it because it covers ground between tactical, strategic, and philosophical. I found it easily readable and it had useful insights for my general approach to being more organized about the “stuff” in my life. It is best used as a supplement after you have read the GTD book. It has fifty-two very short chapters (about 3 pages each.) When I finished the book I left it around the house and would randomly open it up and read a chapter, which led me to a better sense of Allen’s thinking and writing styles. Plus, it’s like a penny used on Amazon (plus shipping, of course.) It’s pretty useful for figuring out what fundamentals I am goofing up. “Oh yeah, I guess if I didn’t do my weekly review, then I would have some things that got missed.”

End Note

Mathematicians: There are probably many ways to slice the percentages here. However, just focus on the high level concept. :)

How to Set Up Local HTTPS Development

I spent a little time during the last week figuring out ways to debug HTTPS issues locally, and wanted to share. My end goal was to run HTTPS with valid wildcard SSL certificate on a Rails server locally (most of this is not Rails-specific.)

Why this is useful

I wanted to do this so that I could see which pages had partially insecure content or looked incorrect when using HTTPS. If your “secure” page loads a stylesheet or image or JavaScript file in an insecure manner, you could leak private user information, etc. You can see whether you are really secure by looking in the URL bars of modern browsers.

However, we only had a valid SSL certificate in production for a client project that I was working on. If I tried to look at the staging server or a local server with HTTPS, I would get a pretty ugly error and the browser would just tell me that the certificate was not accepted. Plus, I wanted to be able to make changes and see the effects locally without needing to push to staging (increasing the feedback loop speed is always high on my list of priorities.)

Setting up the SSL certificate

I followed the instructions at Heroku’s Self-Signed SSL Certificate post. I created a script which looks like this (to automate):

#!/bin/sh

# See https://devcenter.heroku.com/articles/ssl-certificate-self for overview

ssl_dir='ssllocal'
mkdir -p $ssl_dir
openssl genrsa -des3 -passout pass:x -out $ssl_dir/server.pass.key 2048

# be sure to use *.lvh.me as the common name, allows us to hit admin.lvh.me, etc.
openssl rsa -passin pass:x -in $ssl_dir/server.pass.key -out $ssl_dir/server.key

rm $ssl_dir/server.pass.key
openssl req -new -key $ssl_dir/server.key -out $ssl_dir/server.csr
openssl x509 -req -days 365 -in $ssl_dir/server.csr -signkey $ssl_dir/server.key -out $ssl_dir/server.crt

A bit of explanation: you are going to be generating keys into an ssllocal directory. Presumably this would be inside your Rails app, although if you used it for multiple apps, you could put it somewhere else. The openssl-related lines are just creating the keys, and I pulled all of that from the Heroku post.

Pointing to lvh.me will redirect you back to 127.0.0.1. This might not seem all that useful at first, but you can also use subdomains. So www.lvh.me will work in a way that www.localhost or www.127.0.0.1 will not. You could change your hosts file for each subdomain, but some sites have dynamic subdomains (consider one for each customer.) For my case this was the situation, so I needed to find a solution to create an SSL certificate that would work across all subdomains. I found Justin’s explanation of using wildcard subdomains, which says to be sure that you pass *. before the domain name to resolve any subdomains. I think that this will result in not being able to hit multiple nested subdomains with SSL (say, foo.bar.baz.lvh.me), and naked domains (you’ll need to use www.)

Running a local server with SSL

Next, you need to run a server with SSL. I used thin, with the command:

thin start --ssl --ssl-key-file ssllocal/server.key --ssl-cert-file ssllocal/server.crt

This says to use SSL, and to use the key/certificate that we generated above. Standard HTTP connections will not be allowed, and HTTPS ones will be. Next, hit the server by going to https://www.lvh.me:3000. You should be greeted with the standard error message when you are presented with an invalid certificate:

Certificate Error in Chrome Browser

Trusting the self-generated certificate

Now you want to tell your computer/browser to trust your certificate so you don’t get the error message when you hit the page. Without doing this, mixed content issue will be masked, since the browser will only tell you that there is a huge error with SSL. Since I’m on a Mac currently, I found this article quite helpful for downloading the certificate and trusting it, and I recommend following it closely.

When you are done, you should be able to hit the server again (probably after restarting your browser) and see:

Certificate Success in Chrome Browser

Cleaning up

To find issues with my site, I looked around at the browser and when it didn’t have the secure lock, I looked in Chrome’s developer tools to figure out what the offending resource was. In my case, I needed to tell Paperclip to use the secure version of images stored on S3, and generally changed any other includes. One helpful tip is that you can remove the protocol of a resource so you don’t need to check whether you are using http or https.

The generated key files are still around, you may want to git ignore those

If you later try to access localhost from a HTTP URL, your browser may remember the HTTPS setting. In this case you need to clear cookies for localhost.

This solution worked for me and I’d be interested in hearing if there are ways around some of the edge cases with subdomains.