Nonchalant Arrogance, Intellect, and Caring About Your Work

I recently encountered a demeanor that I couldn’t quite place. I anonymously overheard a conversation and, unfortunately, let it get under my skin enough to tell you about it.

I (somewhat ashamedly) tried to find some kind of a meme that described the person who portrayed this demeanor, which forced me to put it into words: nonchalant arrogance.

The “yeah, it’s a big deal, but I know you’re going to think it is, so instead of aligning with you, I’m going to downplay my accomplishment so you think it’s the tip of my intellectual iceberg” attitude.

The “if you like that, there’s more where that came from, but I’m under an NDA” guy.

The “eh, their third album is okay, but the early stuff you don’t have access to is the best” attitude.

I’m not sure why this attitude is still somehow effective in shifting perception, but it is. Perhaps it has something to do with a perceived sense of humility from the general audience, or maybe it portrays some kind of rare, cultured superiority and curation of “good ideas” that should be followed, like a good Instagram-er. Like the guy who turns his nose up at certain kinds of wine if they are paired with the wrong kinds of food, but gets a column in the paper as an expert sommelier.

I hate it, and I don’t want to be it, but at the same time I do want to communicate a sense of intellectual superiority. (For those of you who don’t want to be perceived as smart, throw the first stone.) I want others to value my opinion at a level of excellence.

The difference is, I don’t want it to be because I have some exclusive access to information that they don’t have; rather, that I have done the hard work to uncover that information, and that access is granted only to those who sweat for it.

So I have this struggle, as many others might, that I don’t have enough knowledge to properly and fully convey an idea. Certainly I feel confident in my vocabulary and in my writing style, and I truly don’t experience writer’s block very often. What I do experience is a sense of fear that once I write something out, or build something to release, that it’s going to be subpar. It’s going to be like the band’s 3rd album, or a badly paired wine.

I refuse to adopt nonchalant arrogance. If I am proud of something I’ve done, I’m not going to put on a charade of humility in hopes of you noticing – I’m going to tell you how excited I am, and show you my project. Who knows if you will like it. From my point of view, honesty and transparency are just as valuable as humility. I’m not above my own work. I’m certainly not above my own writing, or the subjects I write about. Nor am I above building for the web, or the people for which I build. I love what I do, and I’m really quite excited to tell you about it, especially if you have an open ear.

I vow never to post with a contrived ironic space between myself the creator, and my creation. I want my fingerprints all over my creations.

The chase for the external perception of intellect can be a dangerous path. That chase leads us to stop being excited when we learn something new. Do you remember when you first made a successful jQuery transition, or when you first learned how to remove something from a picture in Photoshop? The love for the work often dies when you chase a sense of intellect in hopes of an elevated position in the field. You can easily lose respect for the joys and simple highs of your craft. You begin to see the seemingly trivial nature of what once kept you up late at night, reading and hacking and intoxicated with hope of building something of personal value to show the world.

As Alexis Ohanian says in his book Without Their Permission and in the video below, I want everyone who comes into contact with me to know that I “give lots of damns.” That as a creator, I don’t want to separate myself from the work that I do for the sake of perception. I want the things I create to be so closely tied to me as a person that I fight for them like they’re a living, breathing extension of myself.

I’m Using Buffer to Segment My Working Day, and it’s Awesome

I have a lot of different responsibilities on a day-to-day basis. I’m guessing you probably do too.

Family and home responsibilities, like loving my wife, paying bills, and taking my dog on walks.

Personal responsibilities like sleeping enough, exercising, chasing my own goals, and making time for intentional sanity.

Work responsibilities – now there’s a big (and awesome) list. In particular, let me highlight two types of work I do, at work.

  • Reactive work – work that requires me to respond to external resources, like emails, phone calls, meetings, etcetera
  • Creative work – work that requires me to build something out of nothing (or out of a predetermined specification)

As a company, Whiteboard employees recently read 99U’s Managing Your Day to Day, an excellent book about building an effective creative routine. We’ve all adopted a good number of practices proscribed in the book to start out the year, and let me tell you, it has been fantastic. A few simple thoughts on these practices, as they will inform what this article is really about.

Don’t check email, social media, or content sources until 2PM or later.

Note that this is making space for the creative work, where nothing is needed. Quite a few successful creative folks agree that it’s best to do this kind of work in the morning, so we’re trying it. The basic concept is to avoid getting into response mode, as we tend to allow problems and tensions to linger, but instead to start our day out with a clean brain after sleep, which will theoretically encourage what Cal Newport calls deep work.

Maintain a stopping point.

At some point during the day, your routine needs to shift away from working and onto the other parts of your life, like hiking or relaxing or basket weaving. This allows for you to not only fulfill your family and personal responsibilities and/or projects, but also forces you to do only the most important things for projects while you are working on a day to day basis.

Learn this: The rest of the world is not on your schedule.

With these two thoughts in mind, we must also realize that the rest of the world isn’t on our schedule. So, emails will come in at night. (Ignore them until 2PM the next day.) People around the world will continue to live their schedules, and in fact even in the United States, people on one coast will have a different schedule than I will.

So, in a very narrow sense, people are asynchronous from one another.

Before you continue, if you think social media is useless, then you can stop here and hopefully still gain something from the article. No one else needs to hear why you’re quitting Twitter and Facebook and throwing your phone away and selling your car and moving out to the back woods to get away from the noise in the world. (You already told us… on Twitter and Facebook.)

If you take social media to be important to your job (it is for mine) or for your personal aspirations (again, it is for mine), then you should understand that schedule is everything.

Why does schedule matter?

First of all, professional engagement on social media isn’t about people wanting a glimpse into your life. (Unless, of course, they are particularly interested in your personal affairs. Generally not the case for me, other than my mother.) Instead, it is about what your followers can gain from you.

What we have to understand is that our followers don’t gain anything from us if they don’t see relevant content, but content isn’t enough on it’s own; it must also be timed well.

Open your Twitter timeline, and leave it for 20 minutes. I can almost guarantee, unless you follow a small number of people, that tweets from 20 minutes ago have effectively been buried in those 20 minutes.

So imagine that your next opportunity could come from a Twitter follower who is 4 hours separated from you, time-zone wise. How can you engage with this person in a meaningful way?

As far as social media goes, the answer is to post whenever they are looking.

This has absolutely nothing to do with my segmented work schedule; no one cares that I’m not posting to social media until after 2 PM except my family and my coworkers.

So how do I maintain my sane, segmented daily schedule while also increasing my chances of meaningful engagement on Twitter?

A good answer: Buffer (or a similar tool).

Buffer is a tool that allows you to setup a regular tweeting schedule. You fill up your queue however you see fit, and let Buffer auto-tweet for you. And here’s the kicker:

All of your content discovery and sharing can be done in a single block of your day.

Let me rephrase:

You can now engage with social media asynchronously instead of treating it like a chat room.

Let me re-rephrase:

You can now have a constant presence on Twitter without inundating your followers and sucking your time away from other (more) important things.

If you aren’t getting how this can be insanely valuable if done properly, then you probably need to try it for a while to learn.

A challenge.

Use a tool like Buffer to write your posts and share content for a limited, concentrated block in a day. Experience the peace of limiting social media distraction throughout your day, and the benefit of increasing intentionality and regularity of your online presence as a result of smarter computing.

(Disclaimer: I’m in no way affiliated with Buffer, nor do I receive any benefit for touting their service, but it is in my opinion the prettiest and generally the most popular tool for this particular use case. If I’m missing the mark here, please let me know.)

The war of privacy is coming in 2014

What will you do when you have the opportunity to trade your privacy as a currency?

Of course, it’s not a sustainable model, but that’s not the point. The point is that as long as we can trade our info for goods and services, we will set new standards for technological boundaries on our lives. And we’ve already seen it coming fast – mobility has been tackled, wearability is next, and embedded/environmentally ubiquitous will come after.

Apple released a phone that knows you by the same way you are identified by if you commit a crime or two. (This is a gross over-generalization, but stick with me.) On the flip-side (read: not the private sector) the NSA can listen in on your conversations. Without a warrant. Endorsed by the president. He doesn’t really want a call made on whether that’s okay.

And what will this bring? With movies like The Fifth Estate coming into mainstream (albeit fairly unsuccessfully) and with technological literacy being pushed with efforts to get everyone to code, there will eventually be a click moment where people understand the seriousness of the NSA’s deal to weaken RSA. Eventually there will be an enlightenment of what “surveillance state” means as it relates to all of these wearable devices and Xbox eyes and webcams and…

We’ve heard about Luddites, and I think this may be their birthplace: a strong, deep-rooted hatred for the corruption and terror of privacy-destroying devices like Apple’s iPhone 6. They reject the need for technology, first as a hipster trend (like leaving Facebook), but evolving into a real movement.

Obviously this is absurdist in many ways. (At least hopefully that’s obvious.) The truth is, the general population will take longer to shift to technological literacy enough to understand the seriousness of the RSA deal. (By the time that click moment happens, RSA will have become obsolete anyway.) But the underlying pattern is emerging: people will start caring more about privacy than ever before. They will understand that their need to be “always-connected” puts that privacy up for crucifixion, and that creates a direct conflict with the rapidly advancing personal device world. And that will be the war of privacy.

How We Adopted an Agency-wide Grunt Workflow

tldr; When adopting tools, do so to eliminate waste. It’s not worth adopting a tool for the sake of the clout of adopting it. For development, automate things you do the same often (or should/could do the same often). Build shareable processes that require little training overhead. Identify pieces of your process that require a common language; these places are usually where tools can be introduced to solidify that common language.

Don’t mess with my flow.

If you are a leader of a development team, you know that it can be hard to adopt any team-wide change in workflow. This is especially true if the new project tools are a significant shift away from the way you already work. The truth is, the overhead of managing the tools (instead of working on the project itself) can bog down your team, make for some confusion, and ultimately cause over-engineering and waste of time.

But the truth is, the evolving tools of web design are rising for a reason. Dependency management tools (or any kind of tool, for that matter) that are rising in fame should be evaluated. But where is the line? How can you know when its time to bite the bullet, buckle down, and learn the details of these tools? I think the answer is ultimately subjective, but I’ll share an anecdote with you about how we decided to move our team to a shared workflow that involves dependency management through Grunt, GitHub-centric code control, etcetera, while generally avoiding overhead.

A Note About Dependency Management

The goal of dependency management is to abstract away the details of manually managing toolsets that a project uses. In the Rails world, this is done in a Gemfile. In Node, it’s in a package.json file. Almost every project has some kind of dependency; it’s your job as a developer to make sure the dependencies are met in a suitable fashion. Furthermore, every project has different “build processes” – for some, this means compiling code. For others, this means setting environment variables or incrementing a “revision” count. Grunt is a highly-configurable tool that does many of these things for web-based projects. Powered by Node.js, Grunt and related projects have gained an enormous amount of support and active development contributions.

At Whiteboard, we are constantly starting new projects. This can happen even on a daily basis. What’s more, the developers are constantly iterating on and reviewing projects. Our work is highly communication-centric, with a focus primarily on a consumption orientation that is driven to develop brand voice. That’s a long way of saying we work more heavily with content publishing platforms than we do “web apps”.

For this reason, we adopted WordPress long ago as our primary project platform, and have made WordPress knowledge a core competency of our agency. We work in other areas (Rails, specifically) as well, but for spinning up a content publishing platform for a client, WordPress is our go-to.

Manual Dependency Management

A year ago, our processes were very slim. I like to think of this as a Good Thing™. We worked quickly, and used tools as they popped up. In the WordPress world, we found a few base themes (like Bones), and then threw our own self-brewed stuff on top. The development team is experienced enough to adopt a wide variety of tools, and this worked fine. But we started to notice problems creeping into our system: our tools were all quite similar amongst a set of projects, but none of them were dependably exactly the same. We also knew that the tools could be unified – we used the same basic types of tools/libraries/themes/structure on every single project.

We had adopted LESS, but were using CodeKit on our private machines without any global configuration. (CodeKit is awesome, and has these types of project-level options available, but we weren’t using them.) After a few accidental overwrites and other issues, we realized that everyone’s process, like our toolsets, were very similar, but just off enough to show cracks in our system.

Makefiles

Our first step towards a solution was to adopt a Bootstrap-inspired approach to compilation and project builds. Before Bootstrap 3, the process for compiling assets primarily revolved around a Makefile. We brewed up our own makefile, and created the first version of a theme we called Launchframe. This unified a lot of our tools, and immediately this increased our ability to communicate about projects to one another, without much hassle. The powerful element here is that our code started looking and feeling exactly the same (rather than relatively the same). We also all adopted native (Mac OS)AMP + phpMyAdmin stacks on our Mac OS machines, using Homebrew to get everything installed. This makes for predictable and very easily executable PHP-based projects. (There are quite a few guides for how to do this, including this Homebrew-specific one.)

Moving to Grunt

The Makefile approach eventually started showing its flaws. Most specifically, some of the error reporting and watch scripts didn’t quite work as expected. While Make is certainly a powerful way to handle problems, we realized that people in our field were handling these same problems in a much more actively supported way through Grunt (and associated CLI tools). When Bootstrap 3 moved to Grunt, we made the move to Grunt, and once again adopted a lot of the techniques in the Bootstrap build process.

The Trick

The best way to reduce overhead for any kind of development process is to first find your consistencies and near-consistencies, and commit to them. Once you’ve made this commitment, build your tools to automate these consistencies. For us, we always use jQuery, we always use LESS, we always start with our base theme, and we always use a particular file structure. To make the process as easy as possible, we chose to commit to these consistencies, and build our workflow so that our developers need to only know the basic overview of the process. To start a new project at Whiteboard, you install WordPress, change into that directory and type npm install. This will install all dependencies for the Grunt tasks to work properly. Then, run grunt watch. Develop on the project like you always do, and push live.

A Step Further

Who wants to install WordPress? Wouldn’t it be nice if we could automate the whole process from front to back, and have a few prompts with configuration options along the way? Of course it would. So I made this script. Running this on a configured machine with the right tools does everything to open up the project, watching and ready to be edited. It’s also a lot of fun to run it, considering the colors lolcat provides. 🙂 It utilizes a few tools here and there, particularly wpcli, to get things going. This could probably be grunt-ified, but ask yourself: why would that be valuable?

#!/bin/bash
command -v lolcat >/dev/null 2>&1 || { echo >&2 "I require lolcat but it's not installed. Run gem install lolcat."; exit 1; }
command -v wp >/dev/null 2>&1 || { echo >&2 "I require WordPress CLI but it's not installed. \n Run the following:\n curl https://raw.github.com/wp-cli/wp-cli.github.com/master/installer.sh | bash
."; exit 1; }
command -v git >/dev/null 2>&1 || { echo >&2 "I require git. For more information, visit: http://git-scm.com/book/en/Getting-Started-Installing-Git "; exit 1; }

purple='\x1B[0;35m'
NC='\x1B[0m' # No Color


echo '

LAUNCHFRAME 0.1 #########
####### A WHITEBOARD TOOL

       !
       !
       ^
      / \
     /___\
    |=   =|
    |     |
    |     |
    |     |
    |     |
    |     |
    |     |
    |     |
    |     |
    |     |
   /|##|##|\
  / |##|##| \
 /  |##|##|  \
|  / ^ | ^ \  |
| /  ( | )  \ |
|/   ( | )   \|
    ((   ))
   ((  :  ))
   ((  :  ))
    ((   ))
     (( ))
      ( )
       .
       .
       .
' | lolcat

if [[ $1 == "" ]]; then
    read -p "Enter the site folder you want to create for installation: " sitefolder
else
    sitefolder=$1
fi

echo -e "${purple}Downloading WordPress... Please wait a moment.${NC}"

mkdir -p "${sitefolder}" && cd "${sitefolder}"

wp core download

echo -n "Enter database name (press enter for wp_${sitefolder}) "
read dbname
if [[ $dbname == "" ]]; then
    dbname="wp_$sitefolder"
fi

echo -n "Enter database username (press enter for root) "
read dbuser
if [[ $dbuser == "" ]]; then
    dbuser="root"
fi
read -p "Enter database password (required): " dbpass
while [[ $dbpass = "" ]]; do
    read -p "You cannot continue without entering a database password (required): " dbpass
done

echo -n "Enter site url (press enter for http://localhost/${sitefolder}) "
read siteurl
if [[ $siteurl == "" ]]; then
    siteurl="http://localhost/${sitefolder}"
fi

echo -n "Enter site title (press enter for ${sitefolder}) "
read sitetitle
if [[ $sitetitle == "" ]]; then
    sitetitle="${sitefolder}"
fi
echo -n "Enter admin email (press enter for admin@example.com) "
read adminemail
if [[ $adminemail == "" ]]; then
    adminemail="admin@example.com"
fi

echo -e "\n"
echo -e "${purple}Creating the wp-config file.${NC}"
echo -e "\n"

wp core config --dbname=$dbname --dbuser=$dbuser --dbpass=$dbpass

echo -e "\n"
echo -e "${purple}Creating the database.${NC}"
echo -e "\n"

adminpw='[filtered]'
adminun='admin'
wp db create
wp core install --url=$siteurl --title=$sitetitle --admin_name=$adminun --admin_password=$adminpw --admin_email="$adminemail"

echo -n "Install Multiple Post Thumbnails? (y/N) "
read a
if [[ ${a:0:1} == "Y" || ${a:0:1} == "y" ]]; then
    wp plugin install multiple-post-thumbnails
    wp plugin activate multiple-post-thumbnails
else
    echo -e "\n"
    echo -e "${purple}Run wp plugin install multiple-post-thumbnails to install later.${NC}"
    echo -e "\n"
fi

echo -n "Install Yoast SEO? (y/N)"
read a
if [[ ${a:0:1} == "Y" || ${a:0:1} == "y" ]]; then
    wp plugin install wordpress-seo
    wp plugin activate wordpress-seo
else
    echo -e "\n"
    echo -e "${purple}Run wp plugin install wordpress-seo to install later.${NC}"
    echo -e "\n"
fi

echo -e "\n"
echo -e "${purple}Downloading Launchframe...${NC}"
echo -e "\n"

wp theme install https://github.com/Whiteboard/launchframe/archive/master.zip

echo -e "\n"
echo -e "${purple}Activating Launchframe...${NC}"
echo -e "\n"

mv wp-content/themes/launchframe-master wp-content/themes/launchframe
wp theme activate launchframe
echo -n "Install Custom Meta Boxes? (y/N)"
read a
if [[ ${a:0:1} == "Y" || ${a:0:1} == "y" ]]; then
  git clone git@github.com:jaredatch/Custom-Metaboxes-and-Fields-for-WordPress.git wp-content/themes/launchframe/inc/cmb
  echo "Custom Meta Boxes requires a manual include and setup - be sure to add this in functions.php or somewhere similar."
fi

cd wp-content/themes/launchframe
npm install


echo -e "\n"
echo -e "${purple}Opening the site install...${NC}"
echo -e "\n"

open $siteurl

echo "Done!"
echo '
  ______   _______  _______  _______  _______ 
(  ___ \ (  ___  )(  ___  )(  ___  )(       )
| (   ) )| (   ) || (   ) || (   ) || () () |
| (__/ / | |   | || |   | || |   | || || || |
|  __ (  | |   | || |   | || |   | || |(_)| |
| (  \ \ | |   | || |   | || |   | || |   | |
| )___) )| (___) || (___) || (___) || )   ( |
|/ \___/ (_______)(_______)(_______)|/     \|


 ' | lolcat
subl ../../..
grunt watch

Do What Keeps You Moving

The thing we’ve learned about learning new tools is to find ways of constantly doing something new. This means stop doing the same things over and over. Wasting your time doing the same things over and over means you aren’t innovating, and you aren’t creating change. Don’t stop learning, but learn, implement, and move on to learning more and doing more. This is perhaps an opinionated understanding of the purpose of learning as it applies to development, but it certainly offers a strong method for balancing intellectual progress and business-oriented productivity.

My Solution for Quantified Self: Prompted Data Aggregation

The quantified self is really quite a hot topic. Ivan Kirigin talks about it in his post here as a potential startup idea. I’ve created something simple I’d like to share with all of you.

It is really quite simple, but also very flexible. Before I explain what it is, I’ll cover some of the conceptual reasoning behind the solution.

I believe that to do lists are generally quite hard to deal with, and overall don’t help my productivity. They require me to return to them over and over throughout the day, managing them, and often only serve as a place to mark things as done (rather than a place to ensure that I am being productive).

However, I don’t mind prompts. I don’t mind alerts. Certainly too many of irrelevant alerts can be annoying. But if I am motivated to use the alerts, I will.

As a developer, I am used to constant feedback. I am used to my machine telling me when I have compile errors. I’m used to having reports. These reports are what I take action on. To-do lists stay dormant until I put effort into them. The same can be said for calorie tracking applications. The same can be said for most tracking applications.

So, I created a small script to ask me a random question. I set up a YAML file to track my answers and the dates of my answers. I then created a simple plist file to load the script every 8 minutes via launchctl. This will give me about 50 data points per workday.

While they may be simple data points, and while the questions will repeat, the concept is simple: my computer asks me a question, and tracks my answer for me. My answers can be arbitrary; I also have two types of questions. One is directly actionable, the other is subjective. (“Tell your wife you love her.” vs “What have you eaten today?”)

Here is the Ruby code:

#!/Users/jonathancutrell/.rvm/rubies/ruby-2.0.0-p247/bin/ruby
require 'yaml'
y = YAML::load_file(File.join(__dir__, "stretchr.yml"))
if (rand(10).to_f/10.0).round == 1
    @msgs = y["msgs"]
    @msg = @msgs.sample
    ret = `osascript -e 'set question to display dialog "#{@msg}" buttons {"Nope", "Did it"}'`
    ans = ret.split(":")[1]
else
    @questions = y["questions"]
    @msg = @questions.sample
    ret=`osascript -e 'set question to display dialog "#{@msg}" default answer ""' -e 'text returned of result' 2>/dev/null`
    ans = ret
end
@answers = y["answers"]
@answers[@msg] ||= []
@answers[@msg]<< [ ans, Time.now ]
File.open('stretchr.yml', 'w+') do |file|
  puts file.write(y.to_yaml)
end

And here’s the yaml file.

---
msgs:
- Stand up and stretch.
- Live healthy, think healthy
- Tell your wife you love her.
- Do something to show appreciation to your coworkers and employees.
- Text a family member.
- Value, now. Stop doing things that don't matter.
- Have you kissed your wife today?
questions:
- Is your desk clean?
- Have you had 10 minutes of quiet thinking time today?
- What word are you thinking of right now?
- Who was the last person you spoke to?
- Is Hacker News open?
- What are you building now for tomorrow?
- Text a family member.
- What have you eaten today?
- On a scale from 1 to 10, how energetic are you?
- On a scale from 1 to 10, how productive do you feel today?
- How many hours did you sleep last night?
answers: {}

And finally the plist.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>org.jcutrell.stretchr</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Users/jonathancutrell/stretchr.sh</string>
    </array>
    <key>StartInterval</key>
    <integer>480</integer>
</dict>
</plist>

Some of these you can clearly see come from personal goals. Some of them, though, are much more related to aggregating some sort of arbitrary data. Later, I hope to gain some kind of insights from this into very specific areas of my life.

Notice the name stretchr.sh – this was originally built to be a simple reminder to stand up and stretch at my desk. I would go hours on end without stretching simply because it wasn’t on my mind. So many things we should, could, and want to do go undone because we simply let them slip our mind. I’m interested to see how much of an impact these more consistent reminders will have.

It’s obviously very easy to add new data points. Of course, as you add more questions or imperative messages, it’s more likely that you will have more time between data points on average, assuming an even distribution of the random range generator over time.

It would be easy to take this YAML data somewhere else, like for instance to JSON to be fed into something like D3:

require 'yaml'
require 'json'
y = YAML::load_file(File.join(__dir__, "stretchr.yml")) # I think this may be v>=2.0
puts y.to_json

Interested in doing something similar? Or interested in making this more than it is? Let me know. I’d love to let this grow.