The Investigative Mindset

Knowing where to look for answers is more important than memorizing a set of requirements or rules.

I have a confession: I often have no idea what I’m doing.

I remember clearly what it felt like my first day at my job: I was new, overwhelmed, and maybe even scared. But the work was exciting, mind-filling, and fun. Now, several years into the role, I still feel this push-and-pull. I’ve learned to juggle these opposing feelings and be both productive and successful at my job.

The key to this—and I believe one of the most important traits for my success—is an investigative mindset. Knowing where to look for answers is more important than memorizing a set of requirements or rules.

Why? Rules and requirements change, and the context I work in is constantly changing. I’m more productive in my work by making good, informed decisions—not by the book. I can work smarter, gaining a new awareness of how everything works.

How? To develop this mindset, I exercise the following:

1. Take initiative on my own first: do the legwork to find the answer. Be tenacious and know where to look.
2. Ask questions, know when to stop looking and ask for help. Not being afraid to be ignorant or wrong.
3. Share my ideas for the better solution.
4. Look to my teammates as a critical force—we learn together.

Often, the investigation takes me out of bounds—out of my “area”—that’s OK, and natural. I talk to other people outside my team, and I learn a bit more about how it all works together. I fill in the gaps in my knowledge. I’ve raised my awareness.

It wasn’t always this clear for me … after only 3 or 4 months into being at Automattic I had a revelation that changed my mindset—put it into words. One day, I ran into a quote one of our internal P2 sites, expressed as a formula or pseudocode.

( intuition + investigation ) > memorization

I said “Yes, Yes, YES!” I was in the privacy of my home office, so no one heard me, of course. It really made sense, though. And it alleviated part of the struggle I was having to completely internalize all the things I was supposed to know and do. All the stats and bots and checklists and dos and donts.

This was later echoed by something UX guru Jared Spool said at An Event Apart:

The mindset of investigation is about informed decisions, not going “by the book.” Dogmatic, rule-based methodologies exist only to enforce things; they avoid critical thinking and good decision making.

I realized if I made good, informed decisions I could solve problems in both normal and edge cases. Instead of a one-time answer, I could build a framework to answer any question. A mentality. The outcome of finding the answer, solving the problem, sharing the solution—rewards this mindset. A loop. Doing it over and over.

This feedback loop is hugely powerful. It gives me confidence to continue to strive for an investigative mind.


Notes

1. A video my colleague Justin Shreve posted echoes this investigative mindset, specifically as it applies to software development: Being a developer is being a problem solver.

2. Thinking about investigation reminded me of my time in the Future Problem Solving (FPS) club in high school. We found creative solutions to mock issues like world hunger or renewable energy. It was fun and challenging, but the best part was the process itself. Investigate, organize, present, debate. Learn. (Random trivia: according to Wikipedia a later team from my school won a state FPS competition. Rock!)

3. One more quote: “Never memorize what you can look up in books.” —Einstein (unsourced)

Review: Forge, a Tool for Bootstrapping a WordPress Theme

Forge is a tool for quickly developing a WordPress theme built by the fine folks at The Theme Foundry.

Forge is a free command-line toolkit for bootstrapping and developing WordPress themes in a tidy environment using front-end languages like Sass, LESS, and CoffeeScript.

During the early development process of this year’s default theme for WordPress, the Twenty Twelve team—Drew Strojny and myself—used Github and Forge to build the theme (view the archived source).

I would like to share my thoughts on using Forge during this process now that the theme is back in the core WordPress environment: Subversion and Trac.

In summary: Forge is too restrictive for general theme develpoment.

Continue reading Review: Forge, a Tool for Bootstrapping a WordPress Theme

Change GNU Screen Keyboard Command

I changed the command character for screen from Control-a to Control-b recently, after switching to a wireless Mac keyboard. On this small, portable keyboard—which is the same layout as most Mac laptops—there’s only one Control key, and it’s on the left side of the keyboard.

The weird angle to hit Control-a was hurting my hand. Gone now is the left-side contortion I was forced to make to strike with my pinky and ring finger.

It’s pretty easy to change the command key mapping, just add escape ^Bb to your screen config file (usually located in your home directory). Here’s what my .shellrc looks like:

# Make the shell in every window as your login shell
shell -$SHELL

# Instead of Control-a, make the escape/command character be Control-b
escape ^Bb

# Autodetach session on hangup instead of terminating screen completely
autodetach on

# Turn off the splash screen
startup_message off

# Use a 100000-line scrollback buffer
defscrollback 100000

Automatic WordPress Updates with SVN

Want to keep your WordPress install up to date automatically? Follow these steps to add a cron job to update your WordPress install every 6 hours.

Set up the install

The WordPress install must be a Subversion checkout. You can grab the bleeding edge source with a command like this:

svn co http://core.svn.wordpress.org/trunk/ .

If you aren’t familiar with Subversion, start here:

Schedule the updates

Add the cron job from the command line.

  1. Edit the cron job list.
    crontab -e
  2. Add the cron job (edit the path to your WordPress install).
    MAILTO=""
    # Update WordPress install every six hours
    * */6 * * * svn up -q ~/path/to/your/wp-install
  3. Save and close.

To learn more about editing cron jobs from the command line search Google for man cron and man crontab.

You can also use a GUI tool like CronniX on Mac OS X to manage the cron jobs.

Notes

  • The -q parameter tells the svn update command to run silently so that you don’t have to worry about any output from the cron job. But, you should add the MAILTO definition if you want to completely silence output.
  • Some systems don’t recognize the */6 syntax for hourly notation. If you get an error when trying to save the cron job you might have to change it to comma-separated values instead: 0,6,12 or similar.

Craftsmanship and Coding Standards

Inconsistencies [in your coding style] are jarring and require more time to read and comprehend. Consistency is such a valued quality that developers often abide by a coding standard even if they dislike the coding standard itself. —Chris Shiflett and Sean Coates

I consider following a coding standard a sure sign of a craftmanship. A craftsman knows his tools and languages well, and is consistent in his coding style. Ego and personal preference give way to consistency and best practices.

If you develop on your own, create a coding style and stick with it. There are many practical reasons to abide by code standards when developing on your own. It enforces good habits and helps avoid simple syntax bugs. It speeds up your development process by giving you structure and taking the guesswork out of naming and spacing tasks. And, possibly most importantly, it ensures your code is readable to your future self.

This is all fine and dandy when you’re the only one touching the code. When you share and collaborate with other developers, however, following a coding standard is not a choice—it is mandatory. If you develop for a platform, use the coding standards of the platform. Even if you don’t agree with the standard, you should follow it anyway so that your code is understandable and usable for other developers. Chances are the standards were put in place for very good reasons, both practical and philosophical.

To learn the coding standards for a project you work with, start by looking at other people’s code. Put the standards into practice in your own code and don’t be afraid to ask for a review from someone else. Check your code against similar structures in your software’s codebase, or popular modules, themes, and plugins for the software.

A big part of my job as Theme Wrangler at Automattic is reviewing themes. Lots of themes from lots of designers and developers. Everyone seems to have their own coding style, which makes it difficult to review code and find errors quickly. As a result I spend a lot of time cleaning up themes to match WordPress coding standards before I can even begin the actual work of reviewing and updating the theme.

For that reason code style consistency is especially important to me. It enforces best practices, produces consistent code, and speeds up development between collaborators.

Examples

For the languages I code in often (PHP, HTML, CSS, JavaScript), I use the same general set of standards.

  • Use standard syntax.
  • Remove extra whitespace and line endings.
  • Use consistent spacing and indentation.
  • Use human-readable labels and names.

Following are examples of specific coding standards that I follow in my everyday development.

For a top-notch example of coding standards within a company, see the Fellowship Technologies Code Standards. That, friends, is a well-crafted coding standard that we can all learn from.

Discouraging Image Theft

Recently I received a question from a colleague regarding image theft and how to prevent it. The sad truth is that you can’t. There are techniques to discourage downloading and reuse of your preciously-crafted images, but they generally aren’t 100% effective or user-friendly for your normal site visitors.

The reality of unwanted image downloads is a bit depressing: there is no guaranteed way to protect your images from being taken—the most you can do is discourage it.

First, make sure your copyright notice is clearly posted on each page indicating that downloading or using images without permission is not allowed. In doing so you are legally holding your site visitors accountable if they steal and reuse your content.

If you suspect that image search engines or IE-only users are the culprits, using client- and server-side techniques might help alleviate the problem. But if you are looking for a universal solution, editing the images is your best bet since all these techniques can be circumvented by taking screenshots, using screen scraping tools, or simply viewing the locally cached images.

Client-side techniques

  • Disable the right-click menu
  • Disable the shortcut menu in Internet Explorer
  • Use a transparent image overlay

There are JavaScript solutions for disabling the right-click contextual menu; unfortunately, it will only deter a few people. Anyone that is intent on stealing images can still do so. In older versions of Internet Explorer you can disable the image shortcuts that appear when you hover over an image; again, if that is your target browser (or if you suspect that’s where it’s coming from) then implementing IE-specific techniques might work.

Most right-click disabling scripts rely on browser-specific functionality or JavaScript, making them unreliable in other browsers. The downside is that you risk annoying your real customers by removing expected menus and links.

Another technique—which Flickr employs—is the transparent image overlay. This involves layering a transparent GIF over the top of the image you wish to protect. When the image is right-clicked and saved, the person assumes they are downloading a JPG but instead get the transparent GIF.

From Flickr’s download prevention help text:

Preventing people from downloading something also means that a transparent image will be positioned over the image on the main photo page, which is intended to discourage people from right-clicking to save, or dragging the image on to their desktop. By “discourage” we do mean simply “discourage”. Please understand that if a photo can be viewed in a web browser, it can be downloaded. The transparent image overlaid on the photo will not keep your images safe from theft, and is intended only as a slight hindrance to downloading.

Using Flash to display images is another method to discourage image theft (since Flash right-click menus can be customized), but it isn’t foolproof. Just like these other techniques, people can simply take a screenshot to capture the image.

Server-side techniques

  • Block image search engines
  • Disable image hotlinking

Image search a popular way to access images. If you notice a lot of traffic from image search engines, try blocking them with a rule in your robots.txt file. See Remove an image from Google Image Search for more details.

I also recommend disabling hotlinking by adding rules to your site’s .htaccess file. Doing so will not only potentially save you bandwidth costs by stopping other sites from reusing your images and content, it will prevent directly linking to your images without your permission.

Image content editing

  • Add watermarks
  • Use very low quality images

Although altering the image affects how it looks and works on your site, it is quite a bit more effective than simply trying to disable downloading or saving. Again, this is only a means to discourage theft — skilled graphic artists can remove a watermark and still have a usable image.

Using low quality images could also help, but finding a good balance between impressing your customers and deterring theft can be difficult.

Bottom line

If someone really wants the image, they will get it. Using the techniques described above will discourage most people from downloading your images, but remember that posting your images online means you run the risk of anyone downloading and reusing them.

Further reading

Self-Updating Copyright Dates

In “10 complaints the customers have about the design of corporate web sites“, Luke Manion mentions having current date information on your website. His tenth pet peeve is “Out of Date Information.”

An outdated copyright date or an expired offering calls all the information on a website into question as to its correctness.

I agree with Manion—I find it to be a big turn-off when a website doesn’t have a current date listed. It tells me that the site owner or maintainer doesn’t care about keeping the site up, or doesn’t know how to set it automatically.

While this concept may be a no-brainer for many webmasters and website owners, other owners and maintainers seem to ignore the easy fix — let the copyright date update itself.

At the very least, the outdated copyright date screams, “We don’t update our site. You can’t trust any of the content here.”

Of course, there are some exceptions like the homespun websites that are just flat HTML files with no scripting support. But come on—if you use any of the popular hosting services out there, whether it is a Windows, Linux, or Apple server environment, you probably have access to at least one of the common scripting languages such as PHP, ASP, or Coldfusion.

If you have an out-of-date copyright in your website footer, go fix it today. It will add credibility to your website and give the impression that you care about what your visitors see and read. Your visitors will be impressed at the turn of the year when your site date automatically changes. As a plus on the technical side, you will have one less thing to worry about when January 1st rolls around.

Here are some code samples for adding a dynamic date to your website page or blog template1 (line wraps marked »). The output desired is:

Copyright 2008 My Company.

PHP

Copyright <?= date('Y') ?> My Company.

VBScript (ASP)

Copyright <%= now(yyyy) %> My Company.

CFML (Coldfusion)

Copyright <cfoutput>#DateFormat(now(), "yyyy")#</cfoutput> My Company.

JSP (Java)

Copyright <%= new java.text.SimpleDateFormat("yyyy"). »
format(new java.util.Date()) %> My Company.

RHTML (Ruby)

Copyright <%= "#{Date.today.year}" %> My Company.

Note: I do not guarantee that these code samples will work with your server and website setup. These snippets are here to show you how easy it can be to output a dynamic date in the most common scripting languages. Please use with caution and test thoroughly before using on a production website.