I’m difficult to work with

When I was in third grade, my elementary school guidance counselor setup a meeting with my parents and I to talk about my behavior. I’ll spare you the details, but the gist is that “John has a high comprehension level and enormous potential but does not apply himself.” Whether or not that was or is actually true is debatable on some days and a ludicrous notion on others, but this interaction stuck with me, and possibly accidentally influenced the rest of my life, up to this point at least.

I’ve made it around the sun 36 times now, and in the past 28 revolutions since being told that my ability to grok how the world works was a super human ability yet to be seen in reality, I’ve identified several commonalities that boil down to one inalienable truth:

You’re difficult to work with.

I’ve been told this directly several times in my life, and twice recently, so let’s assume that it’s true.

  • I’m stubborn; I get that from my dad who is always right even after you have definitively proven him wrong with factual evidence to refute his theories. I’ve always found this endearing in a way; “prove that I’m wrong” was a fun challenge growing up and learning how the world worked, and I also actively try never to operate in that capacity towards others because as an adult, it’s hugely frustrating.
  • I’m observant; I get that from both of my parents who both were always living on the brink of poverty and needing to keep an inventory of every scrap, every opportunity, and every potential threat at what they had already accomplished or accumulated.
  • I’m passionate; I get this from my mom; her heart is bigger than her head, and her head is growing increasingly fuzzy. I want to make sure that people and things are taken care of, and I actively put forth my best effort to ensure the most positiver outcome occurs.
  • I “think too much.” I’m not sure when exactly this started or if it’s always been this way, or what exactly influenced my brain to work this way, but learning is my addiction and being fluent enough in everything to be able to hold down a conversation is a way for me to dodge any social anxiety I might have.
  • I expect too much from people. I expect people to understand my perspective as much as I understand theirs. I expect people to be as patient with me as I am with them. I expect people to be polite, and communicative, and respectful. I expect people to be considerate, kind, and compassionate. I’m constantly disappointed when they aren’t any of these things.

(Edit: I should note here that I think my parents are both amazing individuals. They’re brilliant in their own unique ways. They are savants that sacrificed their opportunities so that I could have mine, and I love and appreciate them immensely.)

This last one is (in my self-diagnosed opinion) ultimately the issue that makes me difficult to work with. I try not to offer unsolicited advice, but I desperately want to be helpful so when someone does ask for my opinion I have a well thought-out perspective to offer. That requires an education, which requires research, and doing this at scale with all the cool shit in the world requires an ability to comprehend something quickly and filter out anything that isn’t relevant.

In reality, though, what’s happened numerous times is someone asks for my opinion, and I blow their question out of the water with several layers deeper worth of feedback than they were probably asking for. Here’s an example based on a real life experience:

  • “What do you think of this new soup we are trying out?”
  • “I like it, but I don’t think it matches the rest of the lunch offerings.”
  • “Oh, okay. But the soup is good though?”
  • “It’s not bad, but it’s heavy on the spices and thicker than I expected it to be. And I think if I came in for an iced-tea on a hot summer day, that I wouldn’t want to pair it with a cup of tomato soup.”
  • “I suppose. We have a few days worth of ingredients so we’ll see how it goes. Thanks.”

Now, me… I don’t find this interaction off-putting at all, but the chef definitely does, and the manager who worked hard to make the decision to order the ingredients and put together the pairings and design the menu and bring out the ladder and chalk and write the specials on the board and convince everyone this was the right thing to do, doesn’t want to hear this feedback.

This type of scenario carries over to my current career, where interactions are largely public, relationships are largely friendly, interactions are usually with individuals I’ve known in some capacity for several years, but I still manage to piss off despite a lifetime of preparation to try and avoid conflict and accomplish cool stuff with people.

My hunch is that they’re probably right, and that working with me is difficult. Ironically, I don’t think it’s because I’m stubborn like my dad, or over-observant, or passionate, or think too much, but because I’m so fluent and familiar with every aspect and angle of every problem that needs solving under my umbrella of influence, that I’ve already:

  • Deeply assessed the entire situation
  • Tested several theories about what’s wrong
  • Cross-checked the results of my conclusions
  • Considered the social implications of communicating my feedback
  • Formulated a response catered to being direct, polite, jovial, and light-hearted enough to convey humor in whatever flaw it is we’re diagnosing and repairing

Ironically, even with all of this preparation, and time, and knowledge, and consideration, I’m still difficult to work with.  And they’re right, they must be, because it’s fairly consistent feedback spanning several years and groups of friends and relationships and what-not.

My conclusion is that, in one sense, I’m over-applying myself to compensate for a conversation that happened when I was 8 years old. I’ve become addicted to learning things and applying what I learn to prove to myself that I can. I learned how to build, tune, and race cars when I was a teenager. I learned how to write code and make video games. I learned about making wine, brewing coffee, working on the house, auto-cross, electrical, plumbing, accounting, hiring, firing, small engines, milling wood flooring, drywall, pressure washing, video production, mixing music, turntablism, art history, design, typography, security, microwave emitters, steam cleaning, public speaking, community service, whatever…

Basically, I unknowingly fueled the depression and anxiety of primarily inattentive ADHD. I included a link, but you can just search the web for it if you care to learn. Basically, my brain is a hummingbird that never lands, and is constantly on high-alert trying to observe and absorb, and there is no off switch within reach. When it’s time to communicate to someone else what’s been rattling around in my head for however long, it’s already been too long and I’ve worked too far ahead. The effort it takes for me to slow down to bring everyone else up-to-my-speed, means me sacrificing my momentum just so that people can think I’m difficult to work with anyways.

This doesn’t happen very frequently, but when it does it’s painful… it hurts my head to stop thinking so I can write down everything I just learned, with the knowledge that the recipient isn’t going to consider all of the angles that I did, and I’m too anxious about being perceived negatively to concentrate on communicating the depths of my thoughts effectively.

If I wasn’t a cargo-shorts wearing pizza-eating white-dude that looks and acts pretty normal most of the time, and if it wasn’t something I felt I could control enough to navigate the world with relative ease, I’d call it a disability. It’s like being blind, and having people tell you that you’re difficult to work with because you can’t see.

When you consider the perspective of a self-aware recipient, being told that you’re difficult to work with is not feedback, it’s a personal attack, it’s dismissive, and it’s insulting. Combine that feedback with your efforts being voluntary, and it starts to look like management is actively sabotaging your experience.

It’s perpetually negatively self-fulfilling. If you tell someone they are a jerk, they’re going to get defensive which heightens their anxiety and excites them into acting like a jerk, and then you get to say they’re a jerk. It’s unfair, manipulative, and not indicative of true leadership ability or spirit.

What should happen in these cases, and what I actively put mucho effort to convey in BuddyPress, bbPress, and other open-source endeavors, is an appreciation for everyone’s efforts and perspectives, particularly if I initially disagree, because it’s important to me and the projects I represent that I fully understand all perspectives before I can rightfully come to any conclusion, and it’s important that the delivery of my conclusion be respectful of their time & feelings related to the matter.

So, fine… I’m difficult to work with. I’m probably difficult to work for, too. And difficult to be married to. And I’m confident Paul the dog thinks I’m a difficult puppy-master because I spent 2 hours drafting this all up instead of walking him around the block this afternoon. If you know me, or you think you want to, or you’re forced to interact with me somewhere for some reason, please try to give me the benefit of the doubt, and if you aren’t able to, expect for me to be pretty frustrated about it, because I’m trying my best and I expect you to do the same.


I’m going to say, with emphasis, what I think everyone is probably thinking…

LoopConf is what you wish most WordCamps were

Here’s my gist:

  • Live streaming quality was excellent, because a professional crew was on-tap to handle all of it
  • The logistical planning of the entire conference felt very smooth – almost invisible, really
  • Vendor tables were in a single isle, making them impossible to miss and easily approachable because they needed to be constantly staffed
  • Speaker quality was excellent, and I predict we will see a few presentations remixed and repackaged by others for WordCamps this year and next
  • I never want to follow John O’Nolan (of Ghost fame) in a speaker lineup ever again – he is a well-prepared stage performer with relatable personality and charisma, and will easily make you second guess your own experience & abilities
  • Andy Nacin’s talk was revealing, and even still, is only really half of the story
  • Jeremy Felt is much more comfortable on stage than he used to be, and his Multisite presentation was spot on
  • So many mentions of the REST API, but not a lot of truly practical usages yet – everyone is building WordPress minus WordPress instead of replacing existing piecemeal AJAX calls or iteratively improving WordPress itself

Full disclosure: after O’Nolan’s talk, the reality of being the last session of an intense 3 day conference became very apparent, so I trimmed 10 slides from my presentation talking about code and stuck to the high-level overview of my perspective of what building (and maintaining) big plugins is like and means to me.

It didn’t help either that vendors started breaking down their tables & displays in the middle of the talk before mine. It confirmed my suspicions that at least some people were ready to be done with the event, and demotivated me enough to cut my talk a few minutes short so everyone could call LoopConf done-done and move on to reflecting rather than ingesting. I know some events penalize vendors for this, and I’m not exactly endorsing that, but I can say in my experience that it certainly influenced my mood on stage.

Going back to the WordCamp vs. LoopConf angle, I like that WordCamps are casual and inviting, and I like that conferences like LoopConf and the WordPress.com VIP Workshop strive to achieve something more professional. I think there will be some WordCamps that try to upgrade themselves to compete, and others that will purposely stay intimate and niche. And I love that event planners have the freedom to choose what they think is best for their audiences, and that attendees are able to tweak their own experiences within the WordPress specific conference space.

LoopConf in general was super great event. It felt well executed, with plenty to do, learn, and accomplish afterwards. I hope I’m invited back next year to go more in-depth about something niche and interesting happening in the WordPress community, and if so, that I don’t end up following that O’Nolan chap again.

P.S. – here’s the recording of my talk, if you’re interested

“I’m too busy”

TL;DR – If you ping me directly for help with something, you will probably get it.

BuddyPress & bbPress recently switched from IRC to Slack for real time synchronous communication. Philosophically, I prefer the openness of IRC, but I do appreciate how convenient Slack is for everyone, and it’s anecdotally a more inviting and active environment & experience. For some, Slack might actually be overly convenient to the point of annoying or obtrusive, but I think like any communication tool, it requires a bit of wrangling and tuning to suit your needs.

What won’t happen, in Slack or otherwise, is any response from me that boils down to “I’m too busy” even if it’s true.

Let’s imagine that I am actually too busy to help you; you still won’t hear me say so. Instead, you’ll get any number of different replies that are considerate of you and your time:

  • “I’d love to help but won’t be able to for X number of hours.”
  • “Sorry; I have a bunch of things going on and won’t be able to get to this for a while.”
  • “I took a quick look and found this; check it out and let me know how it goes.”
  • “I can’t help right now, but maybe Frank is around and can take a look with you.”

My emphasis is on being polite and considerate of how the recipient could perceive my attitude & demeanor, and making sure to convey genuine concern for their situation even if it does not directly influence my life or priorities in any way.

Conversely, when I reach out to ask for help, it’s only because I’ve reached a point where it is no longer efficient or appropriate to continue on my own; I’ve done everything I am aware of and is in my scope of influence to do, and for any number of reasons I’m choosing to include someone else into my situation.

One place this happens quite frequently is WordPress Trac. As an example, let’s again imagine that I’m working on BuddyPress or bbPress, and I believe I’ve identified a bug in WordPress core. There’s a priority-ordered list of things I’ll go through before I include anyone else into my problem:

  • Run the PHPUnit tests to ensure I didn’t break something on my own
  • Duplicate the bug in a completely vanilla installation without any modifications
  • Confirm bug is real
  • Attempt to fix bug in WordPress core codebase by modifying as few lines as possible
  • Test and retest fix to confirm results, and confirm PHPUnit tests still pass
  • Search the internet for anyone else with this problem, and drill down into any relevant results to learn as much as I can about what anyone else is experiencing
  • Search WordPress Trac for any existing tickets related to any surrounding code, usually by searching for function or method names, variables, component names, etc…

All this, and no one else but me has any idea I’ve been hunting down Carmen Sandiego for the past hour or two. What happens next generally depends on the severity of the issue, and whether or not I feel comfortable pinging someone directly and risk interrupting whatever they’re working on for a consult. In my experience, anytime the urgency and prioritization of two separate parties converges, it requires even more clear & concise communication than normal. If someone gets frustrated by being interrupted, or you haven’t come fully prepared, the person(s) you ping are not going to be receptive now, and will be less receptive in the future.

Even after all of this research, preparation, and with years of experience doing this in a professional setting, it still isn’t easy, and positive & productive results are not guaranteed. I think if you value other people’s time more than your own, do your due-diligence, and are considerate of how your interruptions may impact their lives, you will generally get the same in return. And if you’re always constantly too busy to be interrupted (to the point of forgetting to be polite about it) it might not be the outside world and their lack of so-and-so that’s the problem.

January thoughts, BuddyPress 2.2

With each new software release that I’m fortunate enough to contribute to, I usually take some time (or lots of time) to reflect on a few different things that I think are critical to the project and myself:

  • What went right?
  • What went wrong?
  • What did I learn?
  • What can I do better?

With BuddyPress 2.2 imminent, here’s a brain-dump of my random and unrelated thoughts for January 2015, in no particular order:

  • Significant improvements have been made to cache-coverage, but many more are necessary, and some of our existing implementations are not ideal.
  • User statuses are pretty messy. A user’s status is a numeric value in the users database table, and there is no API in WordPress for interacting with it. Just like post statuses, anyone concerned with workflow (or activation flow in this case) is pretty much on their own.
  • The Member Type API is sweet, and I’m excited to see how developers use it. Hopefully I get to use it myself soon.
  • It seems like each ticket takes longer to test, confirm, fix, patch, and push.
  • How strictly do we enforce cache coverage, unit-test overage, inline documentation coverage, and all of the other nuances? I fear we are over-complicating each others lives with anti-progress and slowly forgetting what made BuddyPress fun to work on in the first place.
  • I need to write more unit tests.
  • I need to increase cache coverage.
  • I need to write more inline documenta… Ehh… maybe I’m okay here.
  • I sure wish PHPUnit were faster and easier to run. Netbeans has decent integration, but I haven’t figured out how to efficiently implement it into my workflow.
  • It’s been really great not juggling immense client and customer expectations in January, thanks to the funders of my recent IndieGogo campaign.
  • The old BuddyPress Default and Legacy templates are starting to look really out-of-date to me now. I wish we didn’t have so many templates to style and that creating themes was easier.
  • I continue to struggle with the cost of switching contexts during the day, between writing code, impromptu meetings, and random pings. Working nights used to help with this, and I need to come up with a healthy plan to improve my ability to come back to things once I switch away from them. I feel like I used to be better at this when I was younger.
  • That squirrel outside my window is looking pretty well fed considering it’s January.
  • I bought too much Lego over Christmas.
  • I need to take more small breaks and be more physically active during the day.
  • I need to prioritize blogging.
  • I need a nap, and it’s only 11am.
  • BuddyPress 2.2 is going to be sweet.
  • Boone did a really good job juggling both WordPress and BuddyPress core development. Note: be more like Boone, at least in this capacity (I don’t think I can eat that much pizza anymore.)
  • I’m excited for a vacation my wife and I are planning in March to celebrate our wedding anniversary. It will probably be much needed by then.
  • I broke my ankle 1 year ago, and it’s still not quite right. Likely won’t ever be the same I suppose. Guess I’ll never play the piano again.
  • Penny (our new rescue puppy) tested positive for heart-worm. Poor thing. Hopefully it’s not too bad and we get her all fixed up.
  • You are great.❤

BuddyPress Notifications

Today, with a little help from my friends, the first new component to BuddyPress in several years saw it’s first commit into trunk this morning.

BuddyPress Notifications
First pass UI for BuddyPress Notifications

BuddyPress’s new Notifications component is something I’ve had in my imagination since BuddyPress 1.0. It works identically to the previous core notifications functionality, and offers key features I’ve always wanted in our notifications:

  • The notifications component can now be deactivated.
  • Individual notifications can be marked as read/unread.
  • A user interface for previously read notifications.
  • A solid foundation for future notifications improvements (notification meta!).

For the curious, you can follow along with Notifications development on ticket #5148. This feature is slated for BuddyPress 1.9, coming near the end of November.

Contributing to WordPress, BuddyPress, & bbPress

Siobhan McKeown recently authored an amazing post at Smashing Magazine about contributing to WordPress. I was fortunate enough to have the opportunity to share some of my own thoughts, mostly surrounding BuddyPress and bbPress.

If you’re a part of the WordPress community, this is a great read, with ideas and suggestions from a few of the most iconic WordPress contributors. I’ll leave you with my two favorite snippets from my pals Matt and Mark:

The number one skill you need for just about any job, but specifically working on open source, is communication skills. You need to have clarity, consistency, compassion, relatability, a little bit of a thick skin and a decent sense of humor. — Mark Jaquith

You can’t knock on the door at Google and say, “Hey, do you mind if I help you out with your home page? I have some ideas for you.” But you could come to us and say, “Hey, I have some ideas for your dashboard, and here are some patches.” — Matt Mullenweg

SLASH Architecture – My approach to building WordPress plugins

I’ve fallen into a routine when building WordPress plugins; a few general rules are:

  • Avoid creating new PHP globals.
  • Avoid executing PHP code in the global scope.
  • Generous use of Actions and Filters.

I’ve decided to name the pattern I use Slash, which stands for:

  • Singletons
  • Loaders
  • Actions
  • Screens
  • Handlers


I didn’t love singletons in PHP at first, and I’m still not convinced they are ideal, but they work well at avoiding yet-another-WordPress-related Global variable. bbPress is a good example.

The benefit of using PHP singleton’s in WordPress is they don’t create an additional PHP global to worry about getting stomped. They also allow your plugin to always exist in memory, without another plugin being able to unset it, while still working like a traditional PHP class.


These are basically bootstrap functions. Their only responsibility is to jumpstart a singleton, and put it in a place for easy access. See the bbpress() function in the above bbPress link. Loaders allow you to reference your Singleton without needing to use a global variable, or pass an instance around into functions and method calls. Used like: bbpress()->foo = 'bar';


By hooking everything into WordPress core actions, bbPress never runs any code inline in the global scope, other than the above loader function. Also, bbPress comes with it’s own sub-actions to piggyback WordPress’s, making writing bbPress specific plugins safe and simple.

This also includes WordPress Filters. The major difference with Filters is that they are generally more risky to use; you have to assume other plugins are already using them, and those same plugins aren’t designed to handle whatever you’re trying to do too.


Derived from BuddyPress, screens are basically “Views” if you’re familiar with MVC. They are how we output markup to the browser from inside PHP, WordPress, and our plugins. Screens can be modular (again, see bbPress) allowing them to work with shortcodes, widgets, and template parts. Screens typically contain all of the translatable strings and HTML markup, and sanitize any variables for output.


Handlers are the equivalent of controllers in MVC. They are responsible for containing the logic that comes from requests like forms, AJAX, JSON, XML-RPC, etc… They “handle” whatever the request is, performing capability checks, validating input data, and also checking for nonces.

Why not use MVC?

Honestly? No reason. Slash isn’t intended to compete or replace anything, and like anything else it’s constantly evolved over time to become what it is today, and will likely change tomorrow too. MVC and other architectures work really well, and Slash is just an approach that’s worked well for me. Putting a name on the routine should help it grow, or educate me on better approaches.

It’s also worth noting that Slash isn’t really anything new, but rather an assembly of separate methodologies combined into a single process that helps me translate my thoughts into code.

The best way to see the Slash approach in action is to browse through the BuddyPress and bbPress codebases. If you’re an experienced developer, I’m always looking for feedback. If you’re just starting out, maybe give the Slash approach a try. Take what’s in bbPress and remix it for your own use, and let me know how it goes.