Meet Peter Chester (@peterchester) WordPress developer, plugin daddy, member of Modern Tribe, husband, father, and musician. In this interview, Peter talks about the principles of developing great plugins, the Modern Tribe philosophy, managing a distributed workforce of freelance professionals, and more.
You’ve built/contributed to 11 plugins for WordPress. All of them are well-rated, and combined, they have over 1 million downloads. What tips and suggestions can you share with developers on creating a great plugin?
Be intentional.
I’ve often heard people in the WordPress community say that we should all blog more, contribute more, teach more, and share as much as possible about what we are up to. This is a lovely ideal to strive for. But, practically speaking, there is a limit to what we can actually do with our time on this earth. So it’s important to be focused and intentional.
It’s not about making something moderately useful and slapping it in the plugin repo willy nilly. Before I seriously consider launching a plugin, I work out a business case for myself, my company, and the WordPress community. My assumptions might be wrong, and that’s ok. But at least I start the process with a long view. What am I hoping to get out of this? What is the return on investment for Modern Tribe (since they pay for my time)? And what is the benefit for the community? What is the mission of this plugin?
Incidentally, this is another great reason for using GitHub. You can slap some code up on GitHub and see if it gets traction before packaging it and supporting it in the plugin repo.
Make solutions, not code.
Usually, our plugins are the result of solving problems for our service customers. After I’ve built something and used and refined it on three or four projects, I can assume that other people in the community may want to use this code as well. This process also ensures that I’ve had a chance to try a few ideas out before publishing. And of course, building cool stuff is more fun when you’re getting paid to do it.
In the case of the Image Widget, I couldn’t believe that there was no simple solution that allowed my customers to upload an image directly in the sidebar. So I convinced a customer to fund an effort to build one. Realizing that this is solving an extremely common problem, I went right for the name ‘image-widget’ (try searching Google for “image widget”) with the explicit goal of creating a robust and simple solution for any WordPress site.
Less is best.
People ask for features all the time. Can you add a slider to the widget? Can you support multiple images? Can you add a Mosaic 1.22-compatible purple border polk-a-dot unicorn toggle switch with an adjustable BMP blink mode?
My mission is to serve the greater community. Each new feature is a liability.
For example, consider a request for a feature in the Events Calendar plugin that posts a reminder to Twitter one hour before the event. This is a great idea! Heck yeah! One hour before an event, let’s post a reminder to Twitter. Let’s consider what’s involved in that:
- Admin UI for Twitter account.
- Maybe a checkbox or selector in the events admin UI to say if you want to post to Twitter and maybe how early.
- Twitter API integration so that WordPress can post to Twitter.
- Security measures to make sure that people can’t hack into Twitter via your WordPress install.
- UI or a template to specify what the tweet should say specifically.
- Make language translations for all the user interfaces.
- A system to ensure that your event title or URL isn’t too long for Twitter.
- Documentation about how this works in the
readme
and in your code. - Support for all the people who get confused or break something or don’t understand the Twittering.
- Support the people who are angry about the clutter in the UI and how there are always new features, and all they want is a f%*$ing calendar plugin.
- Although we know that Twitter’s API is super stable and never changes (wink), maybe we should expect to support future “minor” alterations in the Twitter API.
- Ideally we have some unit tests for this feature.
- This list really does go on…
Then, there’s the question: what about posting to Facebook, Google+, email, and any number of other social media endpoints? And of course, no sooner do we create this feature than we are inundated with a bunch of other related feature requests for adding tracking codes to the Twitter links, adjusting Twitter templates per event, and pushing MD5 encoded magic smurf monkeys through a rainbow filter API to produce nootropic tweets with enhanced psionic domain.
Never fear, there is an answer!
Hook it!
When in doubt, make a hook. Let people write their own plugins. Or better yet, if we see a good business case, we can write the plugin. But it’s separate as an add-on. It’s not in the way for 95% of people who wouldn’t care about it. And we’ll have approached it with a business plan and possibly with customer funding.
With that said, I had the great pleasure of giving Andrew Ozz a lift at the 2012 Community Summit where he went ahead and dropped a little knowledge bomb on me. Beware the hooks you write — once launched they may be unwieldy to remove. This is because the very purpose of a hook is to enable blind collaboration. People can hook into it however they please without your knowledge. But by that same token, if someone writes a popular add-on for your plugin using one of your hooks and you remove it, their plugin will break and a cloud of angry customers (yes, I said customers… that’s what they are even if they aren’t paying you for your work) will descend upon your inbox and your star ratings.
This is also a good reason for being careful about how you name your hooks. They operate in a global namespace. For example, I would never name a hook "twitter_message"
because it’s entirely possible that one of the 15 other Twitter plugins that someone has installed is also using that name for a hook.
Ask for feedback (from people you respect).
Hopefully lots of people are going to try your plugins and probably they will give you the gift of their insights. Publicly. With a star rating.
Firstly, before I submit a plugin to the permanent and uncontrolled flogging that is the WordPress feedback and support system… I often ask people who I think are better coders, designers or content editors than I am, to see if they have any feedback for me.
For example, in the case of The Events Calendar 3.0, we had the benefit of feedback from both Pippin Williamson and Mark Jaquith, among others. Both of them provided extremely valuable insight — most of which has been implemented.
Make plugins you want to use.
It’s entirely likely that people will want to hire you to make modifications to your plugin, help install it, or make add-ons. If you don’t want to work with the Quickbooks API, then you should probably think twice about producing a Quickbooks-to-WordPress sync plugin.
At the end of the day, this is a business. Your users are your customers. But if you want to have any meaningful and enduring infleunce in this big WordPress party, you gotta have some fun.
You’re a partner at Modern Tribe — the name isn’t only catchy and memorable, it speaks to your agency’s work philosophy. Tell us a bit about MT’s philosophy and how it’s helped you to become successful.
“Modern Tribe” speaks to our emphasis on being a distributed lifestyle business. Our goal is to live well together even though we are all physically far apart. We spend a lot of time online with each other and with our customers. As such, communication and rhythm are fundamental to our business.
Start with a system.
To facilitate this, we use a project management system (based on Redmine / Chili Project) that we’ve modified extensively to support a financially conscious workflow. Aside from real-time communications on Skype, all our communications, expectations, budgets, reports, clocking, and tracking happens through one central system.
Find great people.
We look for people who we would want to hang out with because… we are, in fact, going to spend a lot of time online hanging out. After a great deal of thought, we concluded that our people need to be happy, helpful, curious, and accountable. For more on this, check out this blog post I wrote on the topic.
Make time for perspective.
Shane started an incredible tradition in our company when he insisted that we should do quarterly manager retreats and annual team retreats. Over the years I have learned that it is actually rather uncommon for businesses of our size to indulge in regular retreats. The truth is, however, that all of our greatest systems, philosophies, optimizations, and decisions were born out of this delightful tradition. In addition to productivity, our retreats also serve to provide adventure. So far we have travelled up and down the continent including Panama, Costa Rica, Nicaragua, El Salvador, Canada, Mexico, and Hawaii. We’ve gone on surf adventures, culinary tours, jungle hikes, and even survived a triathlon. This is a lifestyle business and when all is said and done, all you have are your stories.
Rince and repeat.
We are always on the lookout for more ways to systematize, for more great people to work with and for more adventures to be had.
Tri.be consists of five employees and over 30 freelancers working the world over. What are the secrets to managing so many freelancers?
Ahh, this subject is near and dear to our hearts. To make a long story short, working with people is all about setting expectations. This is as true for freelancers as it is for employees. It applies equally to the team and to the customers.
Start with accountable people.
Starting when we interview prospective team members, one of our most challenging and primary objectives is to assess whether this person will be accountable. Usually our ideal team member is someone who has a few years of experience with full-time freelancing, really enjoys the life that it affords, and has a track record of clear communication. In fact, our first test is often simply showing up to the first meeting. I’ll say, “Call me next Tuesday at three p.m. Pacific.” If the interviewee is late or forgot about the meeting and failed to let me know ahead of time, then they are instantly disqualified. So far every single person who we’ve taken on who actually started late or missed the first call without notifying us, ended up failing us on a project. It’s a pretty solid test.
Explicitly map availability.
Once a project is lined up, we poll the team that we’re hoping to put on the project to confirm availability. Our goal is to avoid any unexpected delays. If it looks like a key team member is going to be absent for part of the project, we either get someone else scheduled or we work with the customer to reset expectations.
Promote mentorship.
We pair new team members with experienced team members so that we can propagate culture. This is actually a fairly recent endeavor and we’re still learning how best to apply it. But so far, it’s been very helpful in terms of both ensuring that new team members get up to speed faster and that experienced members get the fulfillment of being mentors.
Make it personal.
As Reid often points out, start every conversation with a personal question. “Hey Daniel! How was your daughter’s birthday this weekend?” It’s true that I have some business to get through. And we have a limited amount of time. But this is a lifestyle business and I care about our relationship more than the task at hand.
Along these same lines, we started to have a problem where all our project-based chats were getting congested with personal chatter. Daniel Dvorkin suggested that we start a watercooler chat. We did it as a temporary fix and it quickly became a core channel of communication within our company. It’s now a regular place to go hang out during working hours, paste links about unicorns and cats and ask questions about code, design, and how to fix a motorcycle. It’s our hub of personal communication.
Document agreements.
Whereas hitherto “we,” a term defined in paragraph 34, section “q,” may be applied to, but is not explicitly required to be applied, therefore we resolve to define “we” as meaning “I” any time except when following section “c.”
We write contracts for humans. We do this both for our customers and our contractors. Paper is not important. Documenting understandings is important. In fact, there was a point at which eBay’s legal team looked over our contractor agreement and requested a meeting with our “legal team” to investigate the viability of replacing their own contract with ours. When Shane and I showed up with our lawyer and they learned that Shane and I had actually written it ourselves (though our lawyers did review it), they decided to stick with their legal jargon. In my perfect world, lawyers would be trained to write using the simplest words and phrases possible so that a fifth grader could read and understand a terms of use contract. To a large extent, I feel similarly about WordPress code.
In addition to being a developer and a manager, you’re also a musician. How does the creative impulse feed and fuel you?
I’m not sure that I can say that music fuels my professional life. But what I can say is that life is about more than code. It’s about more than meeting challenges. Life is an ephemeral opportunity to experience adventures and collect stories.
The truth is that success in any endeavor amounts to time and care. Many of the most prominent members of the WordPress community have built their reputations and contributions on a foundation of raw enthusiasm using “spare” time.
I spent a lot more time playing music before I learned WordPress. I also earned a lot less money before I learned WordPress. At this point, my fuel is comprised primarily of conscious balance between work, play, health, and family. Too little of any of these and I get a little crazy.
All that said, I do love to make music. It’s one of my greatest passions. If you want to hear more, check out http://deepfried.info.