Josh Haas's Web Log

Archive for June, 2011

Success is simple

without comments

I previously wrote about how I think the most important challenge right now is figuring out how to scale the process of people living up to their potential. Why do some people go on to change the world, and others go on to jobs that inspire shows like The Office? The more people we can tip towards living inspiring, full lives where they bring light into the world, the better off we are going to be as a species.

So the first thing we need to do is develop a theory of success. Here’s my working hypothesis: success is very, very simple. The biggest obstacle to success, I think, is making it more complicated than it needs to be. Here’s what success looks like:

  1. Be totally honest with yourself about what you really want. If you don’t know what you want, take a wild-ass guess and go with the best answer you can come up with.
  2. Logically think through what needs to happen to achieve your goal, and then figure out the most immediate, direct step that you can take right this minute towards achieving it. If you don’t know what the next step forward is, the next step forward is asking someone who does know. If you don’t know anyone who knows, the next step forward is asking someone who might know someone who might know. And so on.
  3. Take the step.
  4. Go back to 1 and repeat.

I really think that’s all there is. Human beings are goal-achievement machines; we are built by billions of years of evolution to be good at it. If we just point ourselves in the right direction, and keep moving forward, then naturally along the way we’ll figure out what it takes to get there. It’s the north star method of navigation: even if you know nothing about geography, seafaring, or transport, if you just keep on following the north star, you’ll eventually find the top of the world.

So if it’s that dead simple, why is it that only a small percentage of humans live a life of wild, overwhelming success? The problem is, this process, especially steps 1 and 3, can be very scary. Fear by itself is not a problem: if you know you’re afraid of something, you can still force yourself to do it anyway, and there’s nothing like taking action to dispel fear. But fear tends to hide itself in rationalization, and that’s another thing people are very good at: making up a million reasons why things are more complicated than they actually are. The vast, overwhelming majority of human behavior is sideways motion: stuff that feels like taking action, that feels somewhat related to the goal, but is really just scuttling around in a circle. If you look at any large institution, such as a Fortune 500 company, or Congress, probably 99% of the activity that occurs is sideways, and only 1% is the forward motion that keeps the company’s stock price from plummeting and the union from dissolving. And as we see every time a company goes bankrupt, sometimes that 1% isn’t enough.

One very common thing I succumb to a lot, that I’m trying to train myself out of, is the trap of listening to good ideas. Every time someone successfully takes a step forward, a good idea enters the world. But just because that idea helped that person take a step, it doesn’t mean it will help you take a step. For instance, there’s a lot of great entrepreneurship blogs with tons of advice on how to build a great tech startup. I enjoy reading them, but they are all a distraction from actually moving forward my own company — “entreporn” is the clever name for it. Good ideas are wholesome-sounding, constructive behaviors — maybe I should develop a social media strategy! — that aren’t critical path at this moment for achieving your goals. Chasing after good ideas is fun, and a nice distraction from the scary stuff that success actually entails.

Anyway, there are a million other varieties of rationalization; I bring that one up in particular because it resonates with me personally. But I’m sure everyone can come up with their own. Luckily, at some level, you always know when you are listening to rationalization vs when you are following the north star. You have to train yourself to listen to this knowledge, but once you get the knack of it it is infallible: are you scared and intimidated by the course of action you are considering? If so, you are on track; if not, please try again.

So the process of achieving success is simple. However, it isn’t easy, and it is very easy to lose sight of it and wander off course. So I’m interested in solutions for helping people stay on their trajectory. I think the biggest thing is having other people hold you honest. It is much easier to see when someone else is lying to himself about what he really wants, or taking a roundabout path when there’s a more direct one staring him in the face, than it is to see it in yourself. So what I want to do is figure out a way of making the process of watching each other’s backs scalable; can we build communities that have built-in processes for keeping people on track? Would you want to be a part of such a group?

Written by jphaas

June 27th, 2011 at 12:02 am

Posted in Uncategorized

Relatives, absolutes, and changing the world

without comments

At my last job, part of the company folklore was a story called “the frog and the boiling water.” Although I believe this is biologically untrue, the tale is that if you toss a frog into a pot of boiling water, the frog will jump out to preserve its life, but if you raise the temperature of the water gradually, the frog, complacent, won’t notice until it is too late, and will boil to death.

Frog in boiling waterPeople have a hard time comprehending absolutes. It is much easier to judge in terms of “better” or “worse” than “good” or “bad”. Give me a terrible bottle of wine and follow it up with a bad one and I’ll praise the second one. The effect is muted in day-to-day life, because we can more-or-less easily think back to the last good bottle of wine, so it becomes a matter of degrees, but as we leave the grounds of our own experience, the distortion can become profound.

Consider the difference between your life and the life of someone born starving in Africa (if you’re reading this as someone who’s fought their way out of poverty in Africa, pick a different hypothetical of your choice). Compared to that, most of the difference people spend time and energy on — the size of our apartment, the number of blemishes on the face of our significant other, whether or not the cool sneakers are on sale — are as significant as whether you can taste the hint of oak in a bottle of two buck chuck.

Okay, but we (the majority of my readership, I’d guess…) aren’t fighting day-to-day for their survival, so while this is an interesting thought experiment, especially if it turns out those sneakers are in fact not on sale, who cares whether or not the majority of our concerns are trivial in the grand scheme? They may be small things, but at least they’re our small things.

Flip the scenario around, though. What if there were people to whom our lives are like those of third world children born with AIDS? Who can only look at us with mute incomprehension, almost too distant to actually pity us?

Let me suggest that that isn’t so terribly far-fetched. Put the employees of Dunder Mifflin in the same room as a bunch of Nobel-prize winning scientists, peace activists, political leaders, Olympic athletes, or world-traveling poets, and the conversational comprehension gap would very much be along the lines of wondering what to say to “hey, Jim was able to find some muddy water this morning by digging next to the latrine with a stick.” Good for him? I’m sorry?

Most of the people reading this are probably somewhere in between the existence of the drones on The Office and world-changing leaders at the height of their abilities. I don’t slave away 40 hours a week at a meaningless, tedious job, subject of a petty dictator boss, with nothing ahead of me other than eventual retirement after my best years are over (a dream, pathetic as it is, that is becoming increasingly unrealistic in the current economic conditions), but neither am I fully living up to the potential that I can imagine for myself. Everyone has a shadow self, consisting of unrealized dreams and ambitions; people approach that self in varying degrees, and I think it is a rare person who fully closes the gap, who no longer fantasizes a future for themselves because they are already living it.

What is the difference between someone who starves to death in a third world country and someone who succesfully emigrates or rises to a degree of local prominence and security? What is the difference between someone who dies in a shitty retirement home after a career of paper-pushing, and someone who lives a life that’s remembered for a hundred or a thousand years after they’ve passed? Is it inborn genetic ability? Pure luck and circumstances? Divine intervention?

The truth is that it’s probably a little of everything, and varies from person to person. But in the absence of sheer ill-luck, I think mostly it’s a matter of individual behaviors and beliefs: things like perserverence, hope, and wisdom. Innate genetic abilities such as raw strength, intelligence, artistic ability, etc., do make some difference, I’m sure, and in zero-sum games — such as who wins the Olympic gold medal for sprinting — they may be strictly necessary, but I think people overestimate their importance, most especially in the non-zero-sum games which are far more prevalent. Even athletics, which would seem to be at the far end of the abilities vs behaviors spectrum, is very much a mental game. Consider the career of the 5’3″ basketball player Mugsy Bogues, remembered as one of the greats: who would predict that someone two feet shorter than his peers would predominate in a game that depends on height?

The interesting thing about behaviors and beliefs is that they can be changed. Putting aside the question of its initial origin, it’s clear that the character people are born with is not necessarily — though often is — the same as what they die with. Probably only a very small percentage of people ever move the needle on their character enough to dramatically change their life outcomes. But its the small percentage that interests me, because if it is possible, then it is repeatable.

Imagine a world where instead of 1% of people fully living up to their human potential, 99% of people do. What would that look like? How would things be different?

A lot of what exists today would fall apart. Many of our institutions and economic engines are premised on a supply of people willing to be cogs in a machine. If the change happened overnight, there would probably be chaos. But if it happened more gradually, I think we would adapt, and build a world that’s almost unimaginable by the standards of the current one. Problems that seem completely intractable today would disappear. Healthcare reform, for instance, looks very different in a world where the majority of people aren’t sitting around the TV and eating themselves to death to take their mind off the fact that their lives are miserable compared to their hopes. If you replace old problems, new ones arise, of course — I doubt this would be some kind of utopia — but it might look like utopia from the perspective of people like us who are trapped in this third world country called America.

This is not just wishful thinking. The problem of raising the percentage of people who live up to their full potential is just that, a problem: no more ambitious than other problems we’ve solved in the past such as putting a man on the moon. Time travel Back to the Future-style may be impossible; we know for a fact that people can change their own characters because people have already done it. The only open question is how best to scale that process.

There have been past attempts to change the nature of human beings, and they’ve generally ended badly: eugenics and Communism are the two main ones. Their proponents tried to impose a vision of what humans should be like in a top-down, coercive manner, based on ideological preconceptions about reality. This of course is a recipe for disaster. The main characteristic of someone living up to their potential is freedom: any attempt to mandate or set norms for good behavior is inherently working in the opposite direction of humanity at its best, and the enforcement of said norms via violence creates an environment of fear that is completely antithetical to the stated goals of the project. Any succesful attempt would have to happen in a bottom-up way: offering the technology of change as a choice, and winning adherents by virtue of the superior results it yields. Likewise, an empirical attitude must be taken to the technology itself or else it will be no more than ineffective dogma.

Albert Einstein once said “We can’t solve problems by using the same kind of thinking we used when we created them.” The advances of the last century have largely been in terms of what people can accomplish at a material level. What we need today are advances in how people use that which we’ve accomplished. I see this as the biggest open challenge for humanity right now, and personally, my goal is to move this from dream to reality. Wanna help out?

Written by jphaas

June 26th, 2011 at 5:55 pm

Posted in Uncategorized

An Innovation Social Network

with 3 comments

I use LinkedIn, Facebook, Twitter (and occasionally Fourquare although not very regularly) to communicate with and stay in touch with people. However, even between all three services, I still feel like I’m missing something. The original concept behind Facebook, back when it was TheFacebook, was that it was a “directory of people.” Meet a cute girl at a party? Look her up. Want to see who’s who in Kirkland House? Check it out. In college, this really was the perfect tool — my universe, for the most part, was my fellow students, and therefore Facebook, with its circle-of-trust delineated by .edu addresses, and in-network browseability, captured the notion of directory perfectly.

Now that I’m out of college, however, the need for a directory of people is even more important to me, but Facebook has the wrong feature set. My primary question in socializing right now is “Who is doing interesting, world-changing things?” I want to meet them, be their friends, exchange ideas, do my part to help out.

I don’t feel like any existing tool is useful for this, because they are all network-bound. Facebook spread rapidly because of the “friend” feature, but the reason it was useful was because of “browse” and “search”: because on campus, everyone trusted each other enough to share their profiles, the previously-opaque universe of who’s who suddenly became transparent. However, beyond the confines of campus, the level of trust isn’t there, and the sheer size requires much better tools for sorting relevant-from-irrelevant people.

The fact of the matter is, I am never going to have enough Twitter / LinkedIn / Facebook friends to put me one-degree-of-seperation away from all the interesting people out there. It’s nice to be able to map out and explore my network, but what is really interesting is who is not in my network. If I read my twitter feed, the message it sends is that the people busy changing the world are the ones who are building consumer-facing web applications, largely in New York City, because that’s who I know and follow. Moreover, because networks tend to be self-reinforcing, a lot of people on my twitter list probably think this is where all the action is. But I know that this is bullshit: there are many other clusters of innovation, some artistic, some entrepreneurial, some philosophic, some political, most of which I’m not plugged into at all.

This is the feature set I want in an application. Feel free to build it. If not, then maybe in a couple years when my current projects are wrapped up, I will, who knows.

  1. Complete transparency. The goal is people-discovery, not staying in touch. Let people know from day 1 that everything on here is public, and if you have something private you want to share, use a different medium.
  2. Organization by ambition. I’m interested in ambitious people, in general. Different people are ambitious about different things. The guy who thinks he’s going to revolutionize web comics and the guy who is sequencing the human genome both have daydreams, and I want to know about both of them, and to be able to sort and filter based on that. This is very different than the notion of “industry”. Industry might be a rough proxy, since people in biology are probably more likely to be dreaming of curing cancer while people doing international development are more likely to be dreaming of ending poverty, but some people in both industries are just dreaming of being rich, and others aren’t dreaming anything at all. I think ability to articulate what you’re ambitious about is a good filter for joining the site: if you can describe the change you want to see in the world, that’s strong evidence that you’re likely to be doing something interesting.
  3. Organization by geography. Although the internet is eroding barriers to distance-collaboration, “where” is still a hugely important criterion for trying to understand how innovation happens.
  4. Validation by network. The guy just getting started and the guy who’s transformed his industry both belong on this site, but we should be able to tell who is who. Different networks have different metrics for figuring out who the thought-leaders are, and all of those networks should be indexed. I.e., I want to see number of twitter followers, number of citations in peer-reviewed journals, stack overflow karma, and academy award nominations.
  5. Strong search and browse and heatmap capabilities based on all of the above. I want to be able to see at a glance that Silicon Valley is where the tech startup scene is and that there’s cool music stuff happening in Toronto. I want to know instantly if I visit Omaha, Nebraska, who the most influential people in the city are. If I meet someone interesting, I want to know who else thinks they are interesting, and who they are collaborating with, and what projects they have done in the past. Etc.
  6. Open invitations. The point of a directory is to facilitate person-to-person interaction. There should be cultural protocols for reaching out to people via this site. For instance, maybe there’s a feature that lets you publish a few office hours each week where you’re open to meeting anyone who’s interested in getting to know you. Or designated “welcomers” for people visiting from another city. Couch Surfing is a good example of a site that’s established a culture around meeting new people — it’s a little bit niche (since letting someone sleep over at your place can be pretty personal) but if the thing at stake was coffee instead of staying over, a lot more people would probably be open to participating.
  7. Open access to the data: this should belong to humanity, not to the owners of this site. If we’re going to ask innovative people to do work to maintain an entry in this directory, I think it’s the responsibility of the directory owners to share that data back with the innovators via APIs and non-restrictive intellectual property positioning.

Written by jphaas

June 20th, 2011 at 10:57 pm

Posted in Uncategorized

Marrying Boto to Tornado: Greenlets bring them together

with 14 comments

This one is for the techies.

I’m doing web app development for my startup KeywordSmart using Tornado, the pure-Python web server released by the Facebook folks.

Tornado is one of those super-trendy event-driven / non-blocking things that are becoming all the rage (like Node.js and all). The concept is, instead of the traditional thread-per-HTTP-connection approach, you have a single thread that asynchronously interacts with each request, allowing potentially thousands of simultaneous connections to a single server. Think of it as a Las Vegas blackjack dealer, whirling from one player to the next, touching each card only for an instant. (Or, you know, you could visualize it as a, like, tornado).

Actually, I don’t really use Tornado for its non-blocky awesomeness, I use it for the get out of deployment-hell free card. But, if I’m gonna add it to my tech stack, I do want my money’s worth — I’ll take the event loop too, thank you very much!

The problem is, asynchronous is all fine and good as long as you’re inside your own tech stack, but as soon as you start looking for 3rd party tools, the brutal realization sets in that most of the world still runs sync. You can mix synchronous with asynchronous by spinning up a thread pool alongside your main event loop, and delegating blocking operations to the pool to keep your main loop running briskly, but if you call a blocking operation in the majority of your methods, at that point you’ve given up a big chunk of the asynchronous performance advantage.

I use Amazon Web Service’s S3 and SimpleDB for the majority of my data storage right now. You access them over HTTP, so theoretically you could use Tornado’s built-in asynchronous HTTP client to make the requests, thus keeping your code async-kosher. However, life is way, way, way to short to parse SOAP, and Amazon’s documentation, while thorough, is not fun. Luckily, the good folks behind the boto project have done the painstaking work for us: boto provides a comprehensive Python library for accessing all facets of AWS in a nice, object-oriented way. But — you guessed it — boto is strictly synchronous. It’s bound to the HTTP facilities that come with the Python standard library, and there’s therefore no way to make non-blocking requests with it.

So what to do? It looks like a couple people have considered porting Boto to use Tornado’s HTTP facilities, and / or writing a new AWS interface from scratch, but there’s nothing even most-of-the-way complete that I was able to find. And I just have no desire or time to do a project like that myself.

It would be really cool if there were a way to just use Boto, as is, and somehow have it use Tornado’s HTTP classes instead of Python’s. Actually, this is what I did! It took a little hacking around, and the magic of greenlets, but I now have a working proof-of-concept. Let’s walk through how I got there….

(Update 1/21/12: Simon from MoPub packaged the greenlet-Tornado interaction piece of this as an easy-to-use decorator:

It’s relatively easy to switch out the class that Boto calls to make HTTP connections. Boto’s insert-name-of-service-Connection objects call self.get_http_connection() to fetch the standard Python HTTPConnection, so all you need to do is subclass the Boto classes and replace get_http_connection with a method that returns a mock HTTPConnection, and you’re in.

class AsyncConnectionMixin(object):
    def get_http_connection(self, host, is_secure):
        ...return my connection object...

#just like a normal S3Connection, but you've inserted your trojan horse!
class AsyncS3Connection(AsyncConnectionMixin, boto.s3.connection.S3Connection):

#this is how you use it:
conn = AsyncS3Connection('my key', 'my secret')

(For working code that shows how to do this, check out this project which I discuss further down.)

So far, all good. But now we’re at the hard part. Boto expects that when it calls the getresponse() method on the HTTPConnection object, that method will block until the HTTP request is complete and the method can return the results. Which is precisely what you don’t want to happen.

Inside Boto, there’s code that looks like this (faked for dramatic effect):

def fetch_me_some_s3_data_please(some_params):
    my_raw_xml = HTTPConnection.getresponse(build_request(some_params))
    the_data = parse_me_some_soap(my_raw_xml)
    return the data

What we really need to do is freeze this function mid-execution: we want it to call getresponse(), feed the request to our asynchronous tornado library, and then we want to hibernate the function until we get the data back again, at which point we want this function to pick up where it left off.

Can we do that? No, and yes. No based on Python’s built-in capabilities. But yes, with the installation of an easy C extension. Before we go there, though, let’s think for a minute about why we can’t do it natively. There are a couple Python language features that would seem to be potential candidates for pulling it off:

  • Generators: this is the canonical way in Python to freeze a function mid-execution and resume it later. A generator function, instead of producing a return value, produces an object that can both yield and accept input. The only problem is, you can’t turn a function into a generator after it has been written: it has to be a generator from the start. And generators can only yield control directly up the call stack: the function that calls a generator has to be aware that that’s what it is dealing with. We control the code at the top of the call stack, and we control the code at the bottom, but boto sits in the middle, and that’s the code we need to change to use generators successfully. (In one desperate moment, I considered writing a utility that would traverse the AST and automatically transform target code from function calls to trampolining. And then I returned to sanity).
  • Threads: why not just launch the boto call on a separate thread, then freeze the thread? Unfortunately, Python threads are high overhead, and I wasn’t able to figure out a way of “freezing” them that saved their state while releasing their resources (if there’s a way of doing it, please chime in in the comments, because that would be awesome). I’m anticipating potentially thousands of open outbound connections simultaneously, and in my unscientific experiments, the Python interpreter started erroring around the creation of thread #700.
  • Stack frame inspection: I was intrigued by the possibilities of the inspect module, specifically the fact that it lets you change the currently executing line of code. However, it turns out that that’s all it lets you do — you can’t jump around on the call stack to an arbitrary location, which is what I want. (I can imagine writing a utility that inspects the current call stack, saves the values of all the local variables, then systematically recreates it later by re-running the code and advancing the line pointer directly to each function call until you’re back where you started — but this idea is right next to the auto-trampolining idea in my “totally insane” bucket)
  • Exceptions: this is the other vanilla Python mechanism for subverting the call stack. By throwing exceptions, we can jump from our code in the HTTPConnection all the way at the bottom of the call stack up to our application code at the top, skipping over boto (assuming it doesn’t have blanket try-catch statements). This would allow us to pause boto’s execution while we launch our asynchronous request. But unfortunately, there’s no mechanism for jumping back down the call stack to the place where you initially threw the exception. Well, there is one way — the hard way. Yes, this guy’s code does exactly what you think it does: it calls the original boto method, throws exceptions to break out of the http request, and then re-calls and keeps re-calling the method until every HTTP request necessary for its execution has completed. He has a working proof of concept, and for that, I salute him, but on my personal “is it brave or stupid?” scale, I have to lean towards stupid, at least for production code: there’s just too many ways that irregularities in the boto codebase could break this technique, from over-aggressive try-catch statements to side-effects that cause weirdness when you call the same method twice.

So with all hope exhausted, I finally stumbled across the greenlet library. What are greenlets, you ask? They’re pieces of 100% carbon-neutral zero emission byte chunks that… oh wait, no, they’re actually a Python implementation of true coroutines. Unlike generators, greenlets can yield control to any arbitrary location in your code; whereas generators still operate in the paradigm of a single execution stack per thread, the greenlet extension introduces multiple parallel stacks. In other words, they are exactly what we need to solve this problem!

Greenlets work as follows: there’s a “master” greenlet that consists of the original call stack when you start your code, and you can create “child” greenlets that have their own, parallel call stacks, by creating a greenlet object, giving it a function to serve as the start of the call stack, and telling it to start. Unlike threads, only one greenlet is running at a time: you explicitly yield control via the switch() method, which you call on the object that represents the greenlet you want to switch to. Switch() works a lot like the built-in yield: you can send values out of the greenlet, and when control is returned, values can be passed back in. But unlike yield, which passes control up the call stack to whatever function invoked the next iteration of the generator, switch() lets you target any greenlet you want, which means, crucially, that you can use it to put a call stack on hold for an arbitrary amount of time. Also, unlike yield, you can use switch() alongside standard return statements, which means that a parent function calling a greenlet-enabled child doesn’t need to know that anything special is going on – -from its vantage point, it called a child, and got a return value as normal.

Let’s see how this works in practice to make boto asynchronous. The first step is to wrap your web-method in a greenlet:

import greenlet
import tornado.web

class MyApp(tornado.web.RequestHandler):
    def post(self):
        def business_logic():
   whatever work needs to be done, including making calls to boto...
            self.write(...stuff that gets returned to client...)
            self.finish() #end the asynchronous request
        gr = greenlet.greenlet(business_logic)

The call to gr.switch() will start up your greenlet running the function business_logic. Since at this point we haven’t modified boto, business_logic will run through to the end, blocking on all the http calls, and will then write its response to the server. When business_logic finishes, gr becomes “dead”, and control switches to the parent of gr, which is our original call stack, at the point we switched away: i.e., back to the line following gr.switch(). In other words, as written, the code above will run just as if you had called business_logic normally: the code will run, it will block on the boto requests, and then it will return the results to the client.

Our goal, however, is to have the “post” function terminate at the point we fire the boto requests, and then have a callback added to Tornado’s event loop once the relevant data is fetched from the server. So at this point, we inject our custom HTTP handler into boto as described above. Here’s the code for the class we pass to boto in lieu of the HTTPConnection that it is expecting:

import tornado.httpclient
import tornado.ioloop
import greenlet

class AsyncHttpConnection(object):
    def __init__(self):    #boring  = None
        self.is_secure = None
    def request(self, method, path, data, headers): #boring
        self.method = method
        self.path = path = data
        self.headers = headers     

    def getresponse(self):  #this is the method boto calls to get the result
                                    #of the request... this is where we do our thing
        #prepare the request for Tornado's http client
        http_client = tornado.httpclient.AsyncHTTPClient()
        if self.is_secure:
            schema = "https"
            schema = "http"
        url = "%s://%s%s" % (schema,, self.path)
        request = tornado.httpclient.HTTPRequest(url,self.method, self.headers, 
                                                             or None)
        #Find the greenlet that is currently executing -- 
        #this should be the one we created in above
        gr = greenlet.getcurrent()
        #Create the callback function to be fired when Tornado gets the 
        #results of the request back
        def callback(tornado_response):
            #see for the AsyncHttpResponse class: 
            #it's just a dummy class we used to coerce the response into
            # something that looks like the response that Boto expects
            response = AsyncHttpResponse(tornado_response.code, "???", 
                              tornado_response.body, tornado_response.headers)
            #resume our current greenlet, passing in the response
        #fire off the http request, with the callback we just created
        http_client.fetch(request, callback)
        #now, yield control back to the master greenlet, and wait for data to be sent to us
        response = gr.parent.switch()
        #hand the data back to boto
        return response

This takes a little staring at to really wrap your head around the control flow. When we hit gr.parent.switch(), this sends us back to the master thread, which is, at least the first time we enter getresponse(), in returns, causing Tornado to move on and handle the next thing on its event loop. Then later, Tornado receives the results of the http request, and fires the callback. The callback calls gr.switch(response), which re-activates getresponse() where we left off: “response = gr.parent.switch()”. The switch() passes the response through, it gets assigned to the variable, and then it gets returned to boto, which commences processing of it. Boto then returns the result back up the call stack to business_logic(), which writes the response to the client and calls self.finish(), ending the request. Follow that? It gets mildly more complicated when there’s multiple http calls inside business_logic()… each subsequent time we call gr.parent.switch(), the code that gets resumed is actually the code in the callback() function which is now the bottom layer of the master greenlet’s stack. But confusing as it is behind the scenes, from the perspective of you writing your application code in the business_logic function, it just works: you code in a synchronous style, but you automagically get the performance characteristics of asynchronous. Yay!

The code above is actually a simplified version of what I use: I like to wrap my business logic in timing code to make sure that the main event loop runs nippily, and exception-handling code to log bugs and send appropriate feedback to the clients. I omitted that for clarity, since it further obscures the control-flow. The thing to remember is that you need to wrap said code around every call to gr.switch(): both the original call in that starts the execution of business_logic(), and then the subsequent calls in callback() that resume the business logic. The results of that timing won’t be the total time from request arrival to request fulfillment — if you want that number, put the timer at the start and end of business_logic — it will be the time spent by the main Tornado thread executing your business logic before switching to the next request, which is the relevant metric for determining whether or not one of your functions is slowing down the event loop and thus the number of simultaneous connections you can take on before you need another server.

So to sum up, greenlets allow us to freeze and then resume execution of arbitrary code without incurring the prohibitive overheads of multithreading. This can be used to convert synchronous libraries to asynchronous — we used boto above, but we should be able to use this technique on any library that makes a call to an underlying resource that we can switch out for an asynchronous driver.

Written by jphaas

June 19th, 2011 at 11:37 pm

Posted in Uncategorized

Words are bullshit

with 2 comments

I’ve always been very suspicious of words. When I was in high school I was on the debate team, so I constantly had to practice arguing both sides of an issue, and one of the things I noticed was that I could work myself up to a state of passionate conviction that I was right, even though thirty minutes ago I was equally convinced of the other side. I was raised in a family of Democrats, and raised to believe that the Democratic party was right and the Republican party was wrong. My parents would even half-jokingly say “Republicans are evil.” After a while, though, this started to seem a little silly; how could half the population of the United States be right and virtuous and the other half be wrong and evil? On the debate team, I would be arguing from a conservative position one minute, and a liberal position the next, and honestly sometimes both seemed right and other times both seemed wrong.

In all this mess of wrongness and rightness, one distinction that emerged for me was the difference between value judgments and statements of facts. Value judgments seem very subjective; it’s pretty much impossible to prove using any kind of logical argumentation that something is good or bad, or wrong or right, if the person you’re talking to doesn’t accept the premises that you’re arguing from. On the other hand, facts are something you can rely on: they’re objective statements of what is, untainted by any subjective notions of what ought to be.

In theory, anyway. In practice, “facts”, I’ve learned, tend to be value judgments masquerading in disguise. In any complex situation, there are a million little details. What you leave in and what you leave out come down to what you see as relevant, and “relevant” means, “related to your goal or purpose in talking about this situation”, which puts you back in the realm of the subjective. A candidate walks into a job interview with two interviewers; the first walks out seeing the candidate as intelligent and straightforward; the other thought the person was obtuse and rude. It happens all the time.

Even the very simplest, most basic things, contain an element of subjectivity. Let’s take the statement, “there’s an apple on the table.” What’s an apple? Well, without getting too scientific about it, it’s a fruit whose parent was an apple tree. But what if that apple tree had some mutations, and the apple is a little larger, a little bumpier than your typical apple? (Keep in mind that every living organism has mutations… the only question is, how drastic are they?) Is it still an apple? At what point does a sufficiently mutated apple become a new species? There’s no hard-and-fast rule… what ends up happening is that interested parties (biologists, apple farmers, Whole Foods, the USDA, etc.) hash it out and come to some kind of an agreement.

We don’t see the subjectivity in our everyday facts because humans have a natural tendency to socially converge on a set of common values, a consensus reality. If I’m in a room with you looking at the apple, most of the time neither of us are apple experts, neither of us are thinking about mutations, and both of us are hungry: we accept “there’s an apple on the table” as self-evident fact. And this is by-and-large a fine way of operating: if we really thought about the fundamental accuracy of everything we said, we’d be completely paralyzed.

That said, at the end of the day, all the word “apple” really is is a short-hand for a complex biological phenomenon. Moreover, it’s an imperfect shorthand. There is no one-to-one mapping between our concept “apple” and a set of things in the real world; there are always border cases. We can keep on revising our concept of “apple” til the end of time and there will keep on being border cases. And our concept leaves out the majority of what there is to know about apples. For instance, did you know that apple seeds contain cyanide? Take anything you take for granted, drill into it, and there is always a world of complexity there that you’ve never thought about.

My conclusion from all of this is that in fact there is no such thing as a true statement about the world. Words and the concepts they represent are functions of the human mind, and the human mind is incapable of wrapping itself around reality. It’s like trying to paint a picture by singing a song: music can suggest images, but it can’t actually convey them.

In many ways this is a liberating observation. People spend a lot of time worrying about being right. People stake their entire careers on trying to convince other people that they are right, and that others are wrong. When I hear politicians speak, for instance, no matter what side of the political spectrum they’re on, I tend to hear “blah blah blah blah” — a lot of claims, emotions, rhetoric, all of which can sound better or worse or resonate with me more or less strongly but at the end of the day, often mean completely nothing.

When you drop the pretense of “right” and “true”, in a black-and-white way, what you’re left with is flexible adaptation of your concepts to experience. One thing I’ve noticed is that the more I’ve actually experienced something, the less opinionated I am about it, or at least the more skeptically I treat my own opinions. It’s easy to be opinionated about something that you’ve only engaged with on a conceptual level: in fact, most people, myself included, are almost frighteningly opinionated across a vast range of subjects that honestly they know nothing about (What’s your opinion on the government’s health care policy, for instance? Do you have a strong one? Are you sure you’re right?)

This seems counterintuitive — the more you’ve experienced, the less opinionated you are — but in fact it’s very logical. Concepts are compelling things, and we’re in love with our own. The more a concept relates to a sense of self, the more in love with it we are — if our sense of self is strongly based on us being an American, for instance, woe to anyone who dare criticize America in front of us! For American, substitute Republican, Democrat, black, white, gay, Jew, engineer, lean startup practitioner, housewife, businessman, artist… the list is as infinite as human culture. But the more experience we have, the more we are forced to confront the fact that our concept is just an approximation. The real world is always happy to teach us that things are more complicated than our mind is capable of wrapping into our world view. For instance, if you’ve learned to drive, you’ve probably been taught at some point that if you start skidding you need to turn your wheel in the direction of the skid. That’s probably good advice on average, and if you started skidding and didn’t know what else to do, that’s as good a thing to do as any and probably much better than turning the wheel in the other direction. But I bet you $5 that if you talked to someone who’s had extensive experience skidding — say, a professional race car driver, or someone who drives an ambulance in an icy climate — the conversation would be substantially longer than “turn your wheel in the direction of the skid”. Life is always more detailed and rich than our mental sketch summary of it.

It’s comforting to hold on to concepts, because it gives a sense of security to feel like you understand the world around you, that you’re in control, that you know what’s right and what’s wrong. But the ability to let go of those concepts is the ability to learn and grow. Uncertainty is the precondition for insight. In a sense, holding onto concepts is like keeping yourself in a cocoon… it feels safer, but it narrows the horizon of your world. So, what I like to tell myself, is that words are bullshit… I say stuff, but even as it comes out of my mouth, I know at some level it’s not really true, it’s just me expressing what I feel in the moment to the best of my abilities. That way, I can make strong statements and get things wrong, because I know that even if I tried to be really careful and always be right I wouldn’t be successful. And oftentimes, being creatively and aggressively wrong can lead to more interesting places anyway.

Written by jphaas

June 14th, 2011 at 12:01 am

Posted in philosophy

Consumer Culture, Creator Culture

without comments

On June 23, 2008, Pixar released WALL-E, a science fiction movie which predicted that humankind’s ultimate fate would be morbid obesity. In the movie, we retreat into space in technological wombs, leaving behind on Earth a planet-wide landfill, residue of our consumer culture, until we are rescued by a sentient robot that somehow restores our will-to-work.

WALL-E‘s premise was a reasonable attempt to forward-project cultural trends. Throughout most of the 20th century, America lived in a world of cheap calories and mass-produced content: a TV next to an Iowa cornfield. We stuffed our faces with food and our minds with reality shows, and it’s not too crazy a leap to extrapolate from that to couch-potato apocalypse. But today, that vision of the end seems as archaic as World World II propaganda showing Hitler marching through downtown Chicago.

There are two representative events that make me think that the world might end in fire, or it might end in ice, but it won’t end in lard. One was in September of 2006: Facebook released News Feed and Liking, and in literally under 24 hours, a hundred thousand people joined a group to protest; ironically, the rapid mobilization was made possible by the same-said technology, which, slightly modified, is increasingly becoming the basis for a new, participatory internet. The other was in September of 2008: only three months after WALL-E was released, Lehman Brothers collapsed, shattering the illusion that America was on a sustainable economic path. There will never be floating spaceships of the obese, because any civilization that would build them will be too deep in debt to afford it.

Although the Lehman collapse, subprime crisis, and ensuing recession were shocks to the system, they are going to look like minor tremors compared to the convulsions coming in the next thirty years. In the Arab world, the revolution has already started, and so far it has been political. I don’t know what it will look like in America but I hope — considering the alternatives — that it will be economic.

Simply put, in a world where the population keeps on expanding, a culture that focuses on consuming is not sustainable. Thomas Malthus infamously predicted that the pressure of population against resources would lead to poverty and death. We now know what actually happens is that humans invent new means for creating wealth. In the past, that creation was largely focused on material goods, and although each burst of wealth disrupted the power structure in society — for instance, the rise of the Rockefellers on a wave of oil — things quickly settled back into equilibrium. Now, the medium of creation is information, the creators are everywhere, and there are too many of them for the cultural elite to assimilate them all.

We are surrounded by the walking dead. Blockbuster CEO Jim Keyes was quoted in 2008 saying “I’ve been frankly confused by this fascination that everybody has with Netflix.” Everyone laughs at that now after Netflix drove his company into bankruptcy, but that was just a foretaste of the economic disruptions ahead. Across every industry, the barriers to entry are dropping: making and distributing movies (cellphones + YouTube), building software (python/ruby + amazon web services), journalism (wordpress + twitter)… Even in “hard” industries like manufacturing, you can start to see the beginnings of the end. As the barriers to entry go down, the creators start kicking out the landlords. It becomes harder and harder to sit on your ass and collect rent; to survive, you have to create value for other people.

Success in a creation economy requires a different set of characteristics than success in a consumer economy. Authenticity becomes more important than presentation. Speed becomes more important than size. Personal responsibility becomes more important than office politics. Pointy-haired boss better hope he has a good retirement plan. There is going to be, there already is, a fundamental shift in power into the hands of the people who master the tools of the new mediums. The revolution will not be televised, but it will probably happen on Apple hardware. And the people who create are not going to be satisfied seeing the results of their labor fed back into the black hole of the federal healthcare budget.

Every generation is a historical anomoly. The great anomoly of the 20th century was the utter lack of demands placed on the citizens of first-world countries. To pick an extreme example at the other end of the spectrum, the citizens of Sparta in ancient Greece were expected to maintain superb physical health and athletic fitness, devote their lives to training for combat, and endure a life of austerity and hardship; in exchange, their civilization became one of the great powers of the ancient world. The rigors that will be required for economic survival in the next few decades will be different — less obedience and conformity, more creativity and vision — but the fact is, the bar is going to be raised and not everyone will make the cut.

Losing weight isn’t easy. We have an education system, a political system, an agricultural system, and of course an economic system that have all been optimized to satisfy the basic material comforts of as many voters as possible, as well as the extended material comforts of a somewhat smaller subset. In other words, we are trained and groomed from birth to be fat, lazy and dumb. This is the world we built for ourselves; this is the fruit of our ancestor’s success. We got here with good intentions, but it’s a local maximum, not a global maximum, and therefore it’s a trap. Escaping from a local maximum is hard to do on your own. The more people who make it out, the easier it will be for us as a whole to ride the transition from a consumer culture to a creator culture succesfully.

I like the announcement they make on airplanes: put on your own oxygen mask first, then help the people around you. I don’t think we’ll crash, but we may experience sudden shifts in cabin pressure. So, if you don’t know where the oxygen masks are, the time to start looking around is now…

Written by jphaas

June 12th, 2011 at 8:45 pm

Posted in Uncategorized

Keep Moving Forward

with one comment

So I was thinking about how it’d be fun to give one of those inspirational, I did it, you can do it too speeches. And before I knew it, I actually wrote one in my head. Unfortunately, no one’s going to invite me up on a stage to talk about how I HAVEN’T built a succesful business and written a revolutionary tract on moral philosophy. And by the time I have, I’ll probably want to give a different speech. So I’m going to be lame and share this one now, even though I have to put my accomplishments in placeholder brackets, and of course it’s all probably bullshit since I’m just making it up. Whatever, I’m a dork, and this is my blog.

Brace yourself, here goes:

Dear blah blah blah, great to be here, blah. Insert dumb comment about the venue. Today we’re going to talk about entrepreneurship, and the “founder’s psychology”. A lot of people will tell you that it takes a certain type of person to be an entrepreneur. You have to have a high risk tolerance. You have to be a rebel or a rule-breaker. You have to be nerdy like Mark Zuckerburg. You have to really want it. I dunno, there’s a bunch of theories. I’m here to tell you that that’s all bullshit. 100%, absolute, total crap. The next time someone starts talking to you about the personality type it takes to be a founder, what I want you to do is stick your fingers in your ears and start singing “nah nah, nah nah nah nah, hey hey, good bye”. And then walk away.

The actual truth of the matter is that success, in any venture, enterprise, endeavor, quest, or vision, has nothing to do with personality. Or, more accurately, “personality” is just a way of describing the sum total of a person’s attitudes and behaviors. Some of those behaviors you can’t change, like the fact that you lisp like your Uncle Henry, and others you can, like the fact you punch Uncle Henry every time you see him. And the ones relevant to success are the latter.

What success actually comes down to is learning principles. We live in a universe governed by natural laws, which dictate principles for achieving things. If you want to build an airplane, all you need to do is master the principles of thrust, lift, drag, and weight: if you got those right, it’ll fly; if not, it won’t. No one is born understanding thrust… we had to figure it out, and once we did, airplanes turned from something that people thought was impossible to something people churn out in factories multiple times a day.

The really good news is that people are principle-learning machines. We were built for this. Picking up principles is as easy as learning to walk. In fact, that’s what learning to walk was. Take out a piece of paper — don’t actually do this, I’m talking right now — and write down everything you know how to do, from tying your shoes to driving a car to picking up attractive people in bars. Every one of those represents a victory of your natural mechanism for learning principles. Most of these accomplishments you probably take for granted now. But the very same thing that made those possible, is what enabled us to build the Manhattan skyline, for F. Scott Fitzgerald to write the Great Gatsby, for {insert president’s name here} to convince half the country he’s better than the other guy.

Wait, you ask. If it’s so easy, if it’s just human nature, why am I not president of the united states? (I’m sure you think you’d do a better job, right? Come on, admit it). I have that idea for a company. Or a book, or a sculpture, or an inner city agency to help teach kids how to play classical guitar. But it hasn’t happened yet.

Well it turns out there’s one meta-principle. A principle that makes the difference between whether or not you succesfully acquire all the other principles that you need. One principle to rule them all, you might say.

I think every succesful person would articulate it differently, but I think they’d all recognize it. You recognize it, because in your own way, you’re succesful too — you’ve done stuff, accomplished things… whether or not you’re happy with what you’ve accomplished, whether or not you’ve accomplished up to your full potential, the fact of the matter is you probably wouldn’t be sitting here if you were completely oblivious. Think back on all the moments in your life where you did something, grew as a person, moved forward, become more of an adult and closer to the person you want to be. What’s the common thread that you see?

I see a common thread, and the way I would articulate it is, “keep moving forward.” That’s the master principle. To be succesful in life, what you must do, is you must keep moving forward. Another way of putting it, is “let the universe tell you ‘no’.” It’s your job to decide what you want. And then it’s your job to keep moving forward. And it’s the universe’s job to try to stop you. Do you want to revolutionize the fashion industry? Do you want that cutie to be your significant other? Do you want to be suntanning on the beaches of Argentina? Do you want to write a book that’s read a thousand years after you die? Decide what you want, keep moving forward.

As long as you keep it straight — your job, move forward; universe’s job, say no — everything works great. It’s when you get confused and let the universe move things forward while you tell yourself ‘no’ that things go to shit. There are a million little ways we tell ourselves no every day. “I don’t think I deserve to have a great job, I’m not good enough.” “I don’t think she likes me.” “I can’t introduce myself to him, he’s famous!” “Maybe that book isn’t such a good idea after all.” That’s how failure happens. Because you can’t do two jobs at once. If you’re doing the job of telling yourself no, then you’re not doing your job of moving forward. And if you don’t move forward, guess what: you won’t go anywhere. Duh, right?

It’s actually relaxing to let the universe take over the work of telling you no for you. Maybe you’re actually not good enough for him: great, he’ll walk away when you try to talk to him. Maybe your vision for a company is impossible: great, investors won’t give you any cash. The universe does its job very, very well. It can and will come up with more creative ways of shutting you down than a hypochondriac worry-wort’s wildest dreams. Honestly, if you try to beat the universe at its own game, you’re out of your league. It’s far better just to play dumb and keep on operating as though you will start the company and get the lover and write the book and just keep on going until you run smack into a brick wall. Because sometimes, you will, but other times, the brick wall won’t actually be there. Just keep on moving forward and find out.

There’s a million ways you can keep going. If your business partner gets sick and can’t work any more, then you can find a new one, proceed without a partner, or see if you can work with her around her illness… or any other solution. No matter what disaster happens, as long as you’re not telling yourself ‘no’, it’s actually very easy to brainstorm ways of taking the next step.

So let’s go back to the founder psychology for a minute. The interesting thing is that some people seem to — from whatever childhood experience or genetic disease or whatever — seem to be born really getting it, and others life has to basically hit them over the head with a two-by-four before they catch on.

I’m in the latter category, by the way. I didn’t have a clue for the longest time. I would think myself silly trying to figure out, why isn’t my life going the way I want it to, and make it super-complicated, and blah blah blah blah blah. I mean, I was really terrible. I couldn’t tie my own shoelaces. I was the guy in class who’d try to make the insightful comment in the hope that people would hear and go, wow, you’re really insightful, let me make you famous now. Yeah, I was that guy, sorry everyone. I didn’t get the girls, I didn’t make an impact, I didn’t achieve my dreams. Because I was trying to have the universe do my job. I was hoping that if I stood there and smiled and waved, it would move things forward. Things only started turning around for me when I realized that that it was on me to make things happen.

Anyway the reason I’m telling you this is that I want to make the point that, whether or not the “keep moving forward” thing is something that comes to you naturally or not, you can learn to think that way. You don’t need the “high risk tolerance” gene. You don’t need to have been raised by bears in the forests of Africa, learning how to rip out the hearts of deer with your bare hands. You just gotta keep reminding yourself, “am I saying no or am I moving forward? Am I doing the universe’s job or am I doing my job?”

Okay, some typical objections. Number one: but it’s scary!

Actually, if you get so far as to realize how unbelievably scary it is, you’ve made a lot of progress. Most people are so busy rationalizing to themselves why they don’t move forward that they don’t even recognize how terrifying actually going after your dreams is.

Anyway the fear thing is really easy. Have you ever jumped off a high cliff into a lake? You can stand on the edge of the cliff for twenty minutes going back and forth, talking yourself into it, talking yourself out of it, shivering and looking really dumb in your bathing suit, etc. etc. But then the second you’re like, “oh well, what the hell” and jump, boom, you’ve just done it. The antidote to fear is acting. And you don’t need to “beat” or “master” or “conquer” your fear first, you just have to act. And most action is over so quickly, there’s almost not even time to fuck it up. For instance, “hi boss, I’d like to quit my job because I want to start my own business”…. oh shit oh shit oh shit what did I just say did I just say that oh well, too late, security’s showing me out the door, guess I better be an entrepreneur now….

It’s okay to scream like a 5-year-old girl going down. It’s all good. You’re allowed. Tarzan bellowing might be classier, but either way you hit the water, and that’s what counts. Just keep moving forward.

Number two objection: but I don’t know which way forward is! What do I want?? Yeah, this one really nailed me for a while. Should I write a book? Start companies? Join the peace corp in Africa? I don’t know!!!! How do I decide!!! Watching a freshman trying to choose their college major is often like this. You want to put the poor creature out of it’s misery, it’s just awful to watch. The trick is… being right is not important. It is far, far better to make a bad decision and act on that decision and experience the consequences of that decision then it is to not decide. Most people interpret Nietzsche’s “That which does not kill us makes us stronger” as creepy Teutonic bravado, but I actually think it’s just really down-to-earth good advice.

Fact: the only way you learn what you want, and how to get what you want, is to try things and see what happens. You want to be an astronaut and also be a doctor? Flip a coin then spend a summer interning with one of them. Still can’t decide? Spend the next summer interning with the other. Still can’t decide? Flip another coin, then major in biology. Still can’t decide? Flip a coin, then go to med school. Still can’t decide? Open a private practice. Just keep moving forward until either a) you have more clarity or b) you wake up one morning and realize that you’ve achieved one of your dreams. And you know what? Worse come to worse, you can do both. Maybe even simultaneously if you’re really Mr. I-can’t-make-up-my-mind. It’ll be harder, but then, “hard” is one of those things that it’s the universe’s job to worry about. Most indecisiveness is really disguised procrastination. Don’t do it. Yes, you may find yourself saying, in the words of Michael Bluth, “I’ve made a huge mistake.” But hey, that’s half the fun of life. Just keep moving forward.

Written by jphaas

June 11th, 2011 at 11:00 am

Posted in Uncategorized


without comments

I don’t want to write a journal here, but I alo can’t completely divorce my opinions from who I am. Most of what people say and think is bullshit derived from the imperative to protect their identity, and I’m no different. Context on what that identity is lets you see a thought for what it’s worth, or isn’t, as the case may be. So here’s an update on what I’m up to.

My short term goal is to launch KeywordSmart with my partner Jody: it’s a software product for people who need to keyword (ie, tag) images in order to make them searchable. The target demographic for this is, for the most part, professional photographers who sell their images on stock photo sites. We want to launch this product and build it into a company, and see where it goes: we know there’s a pain point that needs solving, and we have something in mind to solve it, and at the end of the day, that’s what a business is, so we’re going to try it and see what happens.

Longer term, what I want to do is write, specifically a book on philosophy and values. My thesis is that people are humans — special, worthy of praise, etc. whatever — insofar as they see themselves as responsible for who they are and how they react to the world around them. I believe that this thought — “I am responsible” — is a self-fulfilling prophecy: insofar as you don’t believe it, your actions are explainable in terms of external forces such as your heredity and environment; insofar as you do believe it, you become capable of increasingly spontaneous action, transcendent behavior that seems to defy explanation outside of spiritual vocabulary. Seeing oneself as free, responsible, the author of one’s own actions is a constant battle, and victory in that battle underlies all great human accomplishments, while failure leads to entropy, regret and oblivion.

Why philosophy? Isn’t it just asking over-intellectualized questions with no real fruitfulness? Who cares about abstract notions when there are things to experience, people to love, things to create and build? Honestly, part of the reason I want to write this book is so I can stop thinking about it and do just that. There’s a cliche about living life like each day is your last, and the cliche probably comes from the real experience that people who’ve faced death can see what really matters to them. To me, philosophy is about the death of the self — not physical death, exactly, but the death of constructed identity, the stories we tell ourselves about who we are and why we exist and what we’re doing. The great paradox is that these stories are both pernicious and necessary. They are pernicious because they get in the way of taking life as it is: they impose false constraints and illusory future visions that stop us from seeing what is right in front of our eyes. They’re necessary, though, because a sense of self is what allows us to take action — without a sense of who we are, we become paralyzed lumps, fleeing fear and seeking empty pleasure. The solution to the paradox is to ask “why” and keep asking until everything false about the self dies, and we’re left with who we really are.

Maybe you can get to that same place without asking the questions. I think it may be too late for that, though: as a culture, we’ve gone past the point of no return in terms of opening the doors to questioning. We’ve already asked “why” to all the traditional sources of identity such as culture, religion, and ideology. Once you open the door to wondering, I think it may be a one-way road: either you make it to the bottom of the rabbit hole, or you get permanently lost along the way. At any rate, I’m the kind of person who experiences the world in abstract terms, so whether or not there are other solutions available to other people, I need to go all the way and see what lies at the end of the path.

So that’s me right now. I’m working on a technology startup to help professional photographers sell their images online, and I’m trying to reinvent philosophy to provide a coherent narrative about what it means to be a person in a world where we can doubt everything. I honestly don’t know if these goals make any sense at all, but all my regrets I have at this point in my life are on the side of failing to act: not doing anything and being swept along by the pain / pleasure impulses, avoiding hard things and looking to food and entertainment for distractions. I’m near the end of my own patience for myself, and the funny thing is that self-respect doesn’t seem to require sanity, it just seems to require action. So: I’m going to write code, and I’m going to write philosophy, and I’ll see what happens.

Written by jphaas

June 4th, 2011 at 1:36 am

Posted in Uncategorized