During the course of the last few years, my Myers-Briggs psychological profile changed. It has been interesting to watch the transformation, and only recently did I discover the change in my score.

If I had taken the test long enough ago, I would likely have scored INTP. Growing up, I was, by almost any measurement, an introvert. By the time I took the test for the first time, I was being much more social. However, my introvert side never went away.

When my score was in the ENTP range, two things were happening in my life. First, I had discovered there was a technology community in Phoenix and was socializing with people I had a lot in common with. Second, I was putting a lot of effort into getting my name out in the technology industry. Despite being an introvert, I have never had a problem socializing with people once a conversation has started, especially if it is about a topic of interest. However, when it comes to initiating conversations, my introverted side is much more apparent.

While I was putting myself out there, I stumbled upon something very interesting: intrigue. For me, intrigue was the key to being an extrovert. If I could only get people to be intrigued enough to want to strike up conversation with me, I would be set.

Unfortunately, what essentially led to the ENTP->INTP transition was that I stopped getting my name out. As a result, people stopped being intrigued. People no longer had a reason to initiate interactions with me. My introverted side was given room to shine, and I became more and more reclusive.

I almost entirely stopped couch-surfing, because despite having more couch options than ever, I stopped asking my friends if I could crash with them. I used to have no qualms about asking, and my friends were often more than willing to accommodate (and hang out). As a result of becoming more reclusive, I asked fewer and fewer friends (sometimes even none) if I could crash on their couch. What’s interesting about this is that I started deciding for my friends that they had better things to do than hang out with me, or that simply asking would be too much of an intrusion. I would still feel like I was intruding despite being explicitly told, “you’re always welcome to stay here,” and, “any time, just ask.” In fact, the opposite would occur: my friends would be offended that I didn’t ask.

In a way, my incessant travel helped foster the transition. At first, hopping around the States helped me kindle relationships with friends in various cities. When I started to branch out and travel to places where I didn’t know anyone, I effectively faded out of peoples’ lives. Out of sight, out of mind.

One of the catalysts of the transition was negative feedback, criticism, detractors, and assuming the worst.

The first three can be lumped into one, which is the result of doing anything with any visibility. If you’re putting yourself out there, you’ll inevitably step on toes, rub people the wrong way, or statistically stumble upon a vocal minority known as trolls. It’s easy to say not to take those people to heart. Ultimately, you have a choice of being silently admired by many and vocally hated by a few, or not existing at all. I stopped volunteering to organize community events, started to become an outsider instead of a participant when it came to the technology community, and I stopped sharing most aspects of my life (the line between sharing and promoting or bragging is a blurry one). Despite there being only a handful of them, the detractors won.

Assuming the worst is very subtle but equally endemic. If one person was unavailable to let me crash on their couch, I would assume the rest were, too. If I told a friend I would be in town and they didn’t insist we meet up, I would assume they didn’t want to. I would assume that because I didn’t have anything specific to talk about, ask, or say that my friends wouldn’t want to talk or meet up.

I like sharing my thoughts, whether it’s a blog post or a video, but I tend to assume nobody is interested and I must be vain. After all, broadcasting your thoughts is something an extrovert would do. Despite that, I occasionally force myself to open up and share, on the off chance that someone might enjoy it and in hopes that my mere existence won’t anger anyone.

Is Entrepreneurship the Right Answer, Right Now?

For perspective, I should note that most of my friends and acquaintances, or most of the people I associate with, are entrepreneurs. The kind of people I find most interesting are self-actuating creators. People who would rather follow their own hearts than work all day to accomplish someone else’s dreams. People who would give up stability and security in return for freedom and flexibility.

That said, it’s common for people who think in these terms to believe entrepreneurship is inherently better than employment. They believe self-employment is the right answer.

They congratulate those who cross the threshold from full-time employment into the world of self-employment. Making such a transition is seen as a rite of passage. A frightening, stressful, and challenging struggle almost every entrepreneur has had to face.

Less celebrated are those who make a transition in the opposite direction—unless it’s by means of acqui-hire, in which case the celebration is about the payday rather than the paycheck. In most cases, it seems people subconsciously mourn those who demote themselves into full-time employment. They throw in the towel on their business and work for someone else’s. It’s seen as a failure of sorts, and it’s often quite evident the excitement someone has to get an awesome job is overshadowed by shame.

Ultimately, the people transitioning from self-employment to full-time employment have made a calculated decision. They aren’t going from the Right Way™ to the Wrong Way™. They’re going from what was the Right Way For Them™ to what is the Right Way For Them Right Now™.

As I say in every situation where there is a choice to be made, there are pros and cons to everything.

When it comes to work and life, the pros and cons vary not only by the individual but also by the moment. When it comes to entrepreneurship versus full-time employment, one or the other might always be the right answer for certain people. However, for most people, it seems the right answer can change.

What do you care most about right now? Is it the flexibility to travel, work from anywhere, and make your own hours? Maybe self-employment will make you happier. Do are care about medical benefits for you and your family, or do you need stability to provide for them? Maybe full-time employment will make life easier for you and your loved ones.

How much stress do you have in your life? How much stress can you handle? How much stress do you want? Self-employment can suck. It can be draining. It can take over your life. The market can make what’s already difficult even harder. Your clients/customers may or may not pay. Sometimes, entrepreneurship can take its toll, and you realize that you need a break, you need some sanity and order in your life.

There’s nothing wrong with that.

Everyone should be constantly evaluating what makes them happy and be prepared to change paths when they realize what is right for them at the moment is something else. The grass is often greener on the other side of the fence, because people compare the cons of their side of the fence with the pros of the other side. Don’t get caught up in that. Also, don’t get caught up in what other people think is the right answer, because as I said, it varies by person and by time.

For me, it’s a constant struggle. The cons of entrepreneurship weigh heavy on me, because I just like making things. For now, and for the foreseeable future, self-employment is the best way for me to get what I want out of life while working on whatever I want to work on.

The THX Sound and Random Numbers

I recently stumbled upon a 7 year old article detailing the creation of the THX sound in the 1980s. It was apparently generated by 250,000 ASP commands that were generated from a program that consisted of 20,000 lines of C code.

While entirely impressed by the work and result, this part stuck out to me.

>> There are many, many random numbers involved in the score for the piece. Every time I ran the C-program, it produced a new “performance” of the piece. The one we chose had that conspicuous descending tone that everybody liked. It just happened to end up real loud in that version.
>> “Some months after the piece was released (along with “Return of the Jedi”) they lost the original recording. I recreated the piece for them, but they kept complaining that it didn’t sound the same. Since my random-number generators were keyed on the time and date, I couldn’t reproduce the score of the performance that they liked. I finally found the original version and everybody was happy.

In visualization, I’ve come across instances in the past where I’ve needed random numbers to get a desired look, but needed repeatable results.

Take these two cases:

1.) I was re-rendering grid-like portions of a scatter-plot where data could be added but not removed. If I had 100 randomly placed points in a grid cell and needed to redraw it with 101 points, I needed the first 100 to be redrawn in the same positions they were in, plus the new one. (This one was in Flash)

2.) I was rendering a video with hundreds of thousands of “people” scattered around a floor in 3D space, but needed to be able to zoom in on particular people. If they were positioned in a truly random formation, the hard-coded positions I zoomed into would no longer show the specific people I was targeting. I needed to be able to re-render the video, position the people randomly, but have them in the same random positions they were in previously. (This one was in Processing)

For both of those cases, I came up with similar solutions. I created an alternate random() function that accepted an input parameter—a seed—and returns a random-ish floating point number between 0 and 1. For example, if you send it a seed of 123456, you might get a value back of 0.382919. If you send 123457, you might get 0.716254. What’s most important, however, is that sending 123456 again would result in the same value, 0.382919.

There are many ways to accomplish this, and I certainly didn’t set out to find the most optimal/scalable method. Within my seeded random function, I simply used the value for pi, performed some arithmetic using the seed, and returned only the digits after the decimal. That resulted in a very random-looking floating point number between 0 and 1, just like basic, non-ranged random() methods tend to provide.

In Case #1 above, I used the grid cell’s static X and Y coordinates plus the UID of the dot being rendered, and then generated a second random number with a slight variation in order to have two values—X and Y coordinates. In Case #2, all I needed was the UID of the person, also varied for a second random number to retrieve a random X and a random Y position.

As for the THX sound, they could have used a similar approach with a single hard-coded base seed value (e.g. the number 1) that is used in all subsequent seeded random function calls. This would result in the same sound being played every time. If they wanted to “compose” a new, randomized piece, the would simply change that base seed value (e.g. 1 becomes 2). To go back to a previous version, change that number back. Upon finding a composition they want to keep, simply leave that base seed in the code. The only way to lose the sound would be to lose the entire codebase, at which point your hopes of recreating the sound would obviously be slim, even if no random (or random-ish) numbers were involved.

Ludum Dare #23 48h Compo

Until Friday night, I had never heard of Ludum Dare, a global game development event celebrating its 10th anniversary. I found it via Reddit or Hacker News or Twitter or something, and discovered the event had kicked off 4 hours prior. Everyone participating in the Compo was given 48 hours to create a game from scratch around a theme announced that night. An alternate Jam competition has more relaxed rules, allowed teams, and ran for 72 hours. The theme was “Tiny Worlds,” which can be tricky when coming up with a compelling game idea. Fortunately, the theme and rules allow for pretty broad interpretation.

I wasn’t sure I would participate, but an idea popped into my head. Inspired in part by a segment of Dragon Ball Z Kai, I pondered what it would be like to jump from tiny planet to tiny planet. Mainly, what would happen to your perspective of “up” and “down” if you jump from the top of one planet to the bottom of another? The concept of “down” essentially just means “in the direction of the pull of gravity.” What drove me to want to build the game was the idea of making a 2D platformer where the directions up, down, left, and right are completely fluid and based on the gravitational pull of planets around the character.

Even though I haven’t used CoffeeScript or Processing.js before, I decided to try them out. Probably not a good idea on such a short timeline, but oh well.

The result was an auto-orienting 2D puzzle game where you have to jump from tiny planet to tiny planet to get to your goal before your oxygen runs out. You can walk around on planets and jump, but after leaving a planet’s surface, there is no longer any control over the character. That means if you miss a planet, you can drift off into space forever!

I finished an hour before the deadline and set up the game at PicoPlanets.com (a play on “pico” meaning one one-millionth, or 0.000001) and made the source code available on GitHub. You can also see screenshots and blog posts about the progress (“making of”) here on my Ludum Dare author page.

R.I.P. Kerplunk 2008-2009

A few years ago, I put together an alpha version of an AIR-based Twitter desktop client, called “Kerplunk!” It deserved its alpha status. It was little more than a proof of concept, focusing solely on displaying a new way of looking at and interacting with streams of tweets. I ran out of time and momentum on the project in mid-2009 and never got around to updating it while the Twitter API evolved (OAuth, id_str, etc).

If I had that primitive alpha version of Kerplunk! today, it would still be able to improve my Twitter experience. Twitter has only gotten noisier, and Kerplunk was the only application to provide ways of suppressing certain types of content—craptweets—either partially or entirely. To deemphasize craptweets, Kerplunk! would simply reduce the screen real estate available for that tweet and truncate it after a certain number of characters. If it turned out to be interesting, despite tricking Kerplunk! into thinking it was crap, you could still spot it and expand it. Simple, yet amazeballs. I miss it.

What’s more, Kerplunk! was designed from Day Zero to go beyond Twitter (in fact, the core application included ZERO references to Twitter or tweets, aside from a command to download and install a plug-in called “Twitter”). You see, I don’t give a damn about tweets or Twitter. I care about what my friends are posting and sharing online, be it on Twitter, Facebook, blogs/RSS, etc.

While the prototype source code lay abandoned collecting dust, the idea and desire remained. The idea grew beyond Kerplunk!, though. Beyond a desktop application, at least. Since 2009, I’ve used my phone more and more to see what my friends are up to, probably up to 50% of my social media usage. I also came up with concepts that would benefit from my application to talk directly to another application, rather than communicating only through social network APIs.

The nice thing about ideas is that they can evolve and change entirely. Over the last 3 years, I’ve wanted different tools to solve different problems I had with my disparate social graph. Kerplunk! evolved into something else entirely. I’ll share what the new project is all about in a subsequent blog post. Stay tuned!