Behavioral intensity

February 7th, 2012

I sometimes have people ask me “what should a team be doing and at what point in the project / product development effort?” Now, I could cross my legs, begin to float and say “whatever seems most valuable.” But I’d rather give some more applicable hints. So, I often try to answer in terms of behavioral intensity, given the conditions.

Here’s an example of a visualization I’ve used recently:

How have you answered these sorts of questions?

Newbie rake finding

January 21st, 2012

To script tasks that you need to accomplish in your rails apps, there is a lib/tasks folder designed to house *.rake files. Given that, let’s say you have a task you wish to accomplish with the assistance of some scripted automation, so we create a file:

your_rails_app/lib/tasks/confer.rake

And let’s say you identify a task in your rake file:

task :ask do
puts “what do you think of this post so far?”
end

Well, I originally thought I would call this task from my app’s root directory via “rake confer ask” and quickly found I’d get “Rake aborted! Don’t know how to build task ‘confer’.”

As it turns out, the files are just for human purposes. Rake appears to grab up task available to it, and does not organize them, inherently, in any particular file-name-driven fashion. This appears to be where namespaces become useful in the rake files.

To call the task I created, one would issue (from the rails app root dir) “rake ask”. That’s it! Onward.

Picky eater

January 14th, 2012

When we were kids, I remember noticing how my brother LOVED bacon, but only specific parts. He’d carefully strip the bacon apart so that he was only eating the meatiest parts, leaving the fat behind. He didn’t complain, mind you. He only ate what he really liked, and would take the time to make sure the “fat” was ripped away, since he hated it.

On with the techno-jargon-ish post…

I’ve always been interested in building an app on a non-microsoft stack. In the mobile space, I’ve created a couple of ugly Android aps (not ugly because of Android itself, but of my, and my team’s design limitations). The next part was a web app. This leads me down the rails / django / php path. I’ve chosen rails for my first real product venture.

I was about to push my app to Heroku, exposing the app to a colleague of mine for the next leg of the system interactions. I kept getting the wonderful “no Cedar app detected” and “failed to push some refs.” WTF man? I thought this should all just work.. what a fool I was. MOSTLY because I really have little confidence with rails at this point, and have no room (yet. I’m working on that >;]) to be so presumptuous.

I then began doing what any accomplished programmer would do: blame the thing I think I know the least about: Heroku.

To the Google! To Freenode! Nothing!

What could I be missing? Am I really so genetically deficient that I just can’t get this shit to work? Turns out.. no. Here’s the deal.

This app a mash-up of a number of data sources that I don’t own, has a web component to it and a mobile component. SO unique right? Well, hang on. Here’s what my git repo looked/s like:

ProductName
|_.git
|_ android
|_web (rails 3.1.3)
|_workers

See the problem? Which one of those is a Cedar-supported app? A Cedar-supported app is a Rails 3.x app, according to Heroku’s docs. While having the android app, the rails app and the worker scripts all in the same repo appears to be totally fine in terms of a team that is working on a cross-platform app, it fails us in the deployment context. It fails us in the deployment context because Heroku appears to expect the connected repository to ONLY contain items that comprise a supported application type. Any other items present in that same repo and BANG! “failed to push some refs.” So Heroku wants fat-free bacon or no bacon at all!!

In response to this situation, I’m thinking that it’s reasonable to keep each portion of my app in its own repo. This will, I think, help me more effectively isolate versioning needs (the commit logs will be more meaningful since they only contain changes to THAT app, and I won’t need to weed through the git logs to find changes to each of the n apps contained therein).

I am somewhat curious about better ways to manage my app’s assets though. Having multiple repos for a single product seems a little overkill. Additionally, it seems at this point that the requirements of working with Heroku are pushing a little too far into my local workflow. Hmm. Onward with the learning! Comments / corrections / objections are welcome.

Let us not forget,

What you (I) really mean(t)

November 27th, 2011

Through reflecting and general personal growth as an individual I’ve become more aware of the ways I’ve skirted responsibility at times in my life. These mechanisms for skirting responsibility have become quite noticeable to me in others as a result of my gradual and perpetual awakenings. I think it’s important for us to detect when we’re behaving this way in order for us to come closer to reaching each of our individual potentials. Here’s a starting list of statements, along with what I really meant when I said them and how it appeared to effect the recipients:

I don’t have time for…

Translation: I am currently unable or unwilling to make time for that activity. I may also be uncomfortable with changing a patterned behavior because of the presence of a level of instability in my life that I’m unable to handle effectively, which further change may cause my stress to become unbearable.
How does this effect the recipient(s)? Minimal, by design. Saying “I don’t have time” implies nobody gave me time. So, I appear to not be responsible for the inaction.

We can’t…

Translation: I can’t think of a way to make this work for us. I‘m also uncomfortable with exposing the fact that I don’t know what to do. I may also be uncomfortable with discussing the skills of team members that may be preventing us from attempting this.
How does this effect the recipient(s)?  Fight or Flight. I’ve observed a complete shut down of the creative process in some individuals (Flight), while a rise to the challenge (usually with an aggressive tone) in others (Fight). The “fight” may be desirable antagonism that assists the creative process in some teams, but can easily be mismanaged into self-destruction.

Let’s take that offline

Translation: I really don’t want to talk about that for some reason (I don’t think it’s important to our mission, or I’m generally annoyed by your demeanor). I’m hoping you forget about it. I’m also hoping the others in the room assume we handled the topic outside the meeting so it doesn’t come up again.
How does this effect the recipient(s)?  Frustration, anger, resentment, the feeling that “nobody cares” or that “my ideas are dumb or unwelcome.”

That depends

Translation: I don’t want to make an uninformed statement, and am prompting you for more information. Instead of asking you to tell me more about your problem context, I say this to sound wise when in reality I just don’t know enough about your problem yet.
How does this effect the recipient(s)?  Annoyance, primarily. To me, this is a ritualized and low-value answer. Many of the testers and thought leaders I meet enjoy wielding the context-dependent response of “it depends” instead of getting to the meat of the matter. Any more, when I hear this, it lands on me as condescension. Screw the “it depends” and start interviewing your customer. Show you care to understand her goals, what she values, and start the collaborative process.

You may notice a common modification in these statements to make use of “I-language.” This one (note, I did not say “simple”) change can, on its own, unlock significant potential within teams. This has, at least, been my observation. Take care all.

Ok, so which one gets the app?

October 28th, 2011

Trying to install an app from the browser-based android-market. If you have more than one of the same phone on your account, good luck figuring out which one is right!

Power failure – UX failure

October 28th, 2011

I was at my friend’s house recently and needed to use the microwave to heat up some of my awesome, from scratch, chicken cacciatore. I noticed that the power must have been knocked out recently because there was nothing on the screen but a single “0″. Now, this is no state-of-the-art microwave. This is an old Panasonic

Thinking nothing of it, I put the food into the microwave, close the door and proceed to press “Power” (twice to set it to “medium high”) then the “1″ (3 times) between the 2 “10″ buttons (to set it for 3 minutes)… but… but wait. Nothing is happening. All I see is the lone “0″ still on the display. Hmm, odd.

I think, I wonder if I need to pull the power for 30 seconds or so (because 30 seconds is some magical reset time for everything right? stupid magic numbers!). No dice. Same problem.

Now I start thinking there must be something special that needs to be done in order for the microwave to become usable again. I think of something.. no.. it couldn’t be.. it makes no sense..

I ended up having to set the clock in order to use the microwave for its primary function: COOKING FOOD! This just makes no sense to me. It’s like disabling the ignition of a car because, well, because the clock isn’t set (ok, direct analogy, I know).

To me, the moral of this story is: Do not block the primary function of a thing due to a failed secondary function.

Now, I’m sure you can think of times when this moral is completely wrong, and I’d love to hear it. Cheers.

When automation fails you

September 3rd, 2011

Consider the following android layout file:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <Button
            android:id="@+id/Button1"
            android:text="Cool button"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"/>
    <Button
            android:id="@+id/Button2"
            android:text="Cooler button"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"/>
</RelativeLayout>

And the following robotium automation:

    @Test
    public void testCanClickButton1(){ 
         runner.clickOnView(getActivity().findViewById(R.id.Button1));
    } 

    @Test
    public void testCanClickButton2(){
        runner.clickOnView(getActivity().findViewById(R.id.Button2));
    }

How do you think this fails the tester? Oh, the tests pass, btw. But there is something interesting about how the automation fails us.

Android project missing properties file

August 5th, 2011

Yeah, so I’ve seen this happen from time to time when working in a distributed setting. To remediate this simply create a file called “default.properties” in the root directory of your Android module, and place the following contents within it:

# This file is automatically generated by Android Tools.
# Do not modify this file — YOUR CHANGES WILL BE ERASED!
#
# This file must be checked in Version Control Systems.
#
# To customize properties used by the Ant build system use,
# “build.properties”, and override values to adapt the script to your
# project structure.

# Project target.
target=Google Inc.:Google APIs:YOUR_TARGET_API_LEVEL

Cheers!

Loading Android project in Intellij, but shows as Java Module

August 5th, 2011

So my colleague and I saw this from time to time. In order to remediate this so Intellij treats your Android module like the droid module that it is, open the .iml file in a text editor and change “JAVA_MODULE” to “ANDROID_MODULE”. Save and reload your project. Done and done!

It’s hard.. I mean easy.. I mean.. whatever.

June 28th, 2011

I’ve observed that, in order to effectively help others unlock their potentials, it can be useful to know their personalities. Specifically to understand their fear profiles.

Type 1: Easily bored, works best under pressure
Type 2: Easily frightened, works best under calm

For Type 1′s,

you may yield greatest results by teaching them with a “now, this can be difficult for some people to grasp” approach. This will likely trigger some predatory, “I will conquer this!” response. Thus, yielding strong results.

To the contrary, using a “don’t worry, this is pretty easy for most people, so I think you’ll be fine” approach will likely disengage Type 1′s.  Since the type 1 profile needs a challenge in order to be highly-engaged, they will view the task as beneath their capacity, and essentially a waste of their time. This may result in obvious task omissions, sloppiness, etc.  It’s best to keep Type 1′s cognitively configured in “challenge” mode.

For Type 2′s,

The opposite often rings true.  Stating that the task may be challenging may very well incapacitate them.  They may not respond well to assignments perceived as a stretch to their existing skill sets.  Instead, we may find greater benefit through mapping a new, perhaps challenging or stretch assignment, to skills they already have.  Explain to them that they’ll be able to shine with some existing skills, and will likely get the opportunity to build upon them through the assignment.

These are some observations I’ve made over recent months through the mentoring and facilitation of varied profile types.  Thanks for reading.