The name “Hacker School”

I spent three months this year in the Winter 2013 batch of Hacker School. Below are some thoughts on what the organization is — since the name is misleading, to say the least — excerpted from my feedback to the organization. (In an earlier post I’ve mentioned the fact that “hacker” has a far more noxious meaning in the press and at large that it does among programmers, but never mind that now.)


It’s not actually a school at all, except in the sense that being in it was a lot like graduate school (I wrote a blog post about that). But what it *is* is less easy to say.

“Retreat” is used on the website’s “about” page, along with “immersive school”. These are not bad, but I don’t think either one exhausts the meaning of the experience, not with eloquence anyway. It seems to me that the problem with “retreat” is that there isn’t really removal, either physical or mental, from the rest of the world. “School” strongly suggests a curriculum or program, which of course there isn’t. Even if students set their own programs, that isn’t a school — it’s an arena for self-study, a different thing in essential features. Oh, go ahead and use “school” if you need to for other purposes, but in plain truth the word doesn’t fit comfortably.

I’ve used “dojo” to describe the physical place where the batch meets. That’s good because it suggests the self-cultivation that is such an explicit part of Japanese training in all the traditional arts. But it’s bad because a dojo is always associated with a sensei, one sensei who is part of a tradition (even if it is the venerable tradition of standing apart from tradition), and not only do we have no sensei in that strict sense, we also have no sect or “school” or tradition in the intellectual aspect of the word. Similarly, a friend who lived some time among Jesuits said of my description of Hacker School that “it sounds like life at a monastery” — let’s not say anything about celibacy, but Hacker School fails to meet the definition because there is no abbot and no order (in the sense of a religious ideology or theological affiliation). And as with “retreat”, the word fails because we are not cloistered here. If Hacker School has any ideology, it is that of the rain forest-like chaos of the hacking world at large. Dojo and monastery, both of which involve adherence to hierarchical rules, are not the right names for a place that encourages this state of things.

“Collaborative studio” might do to describe Hacker School. “Gymnasium” also might do. Neither requires a sensei or abbot figure, and each suggests a place where people can work, independently or together, at training themselves or producing work that depends on discipline or reflective exertion or craftsmanship. That seems to me the essential point. I recommend those two expressions, then, to describe Hacker School.

“Collaborative studio” and “gymnasium” are what I say now, describing Hacker School when I talk to people who understand about self-cultivation. When forced to talk to grown-ups, I have been describing Hacker School as a tech recruitment company that offers unpaid training-internships.

The benefits of Hacker School

I spent three months this year in the Winter 2013 batch of Hacker School. Below are some thoughts on what it did for me, excerpted from my feedback to the organization.


Hacker School gave me a critical mass of people with whom I could interact, having coding as the context of interaction. I have never had that before.

The single most important outcome of this experience was my acculturation as a programmer. I learned best practices, terms (both standard and jargon), the names of companies and services, and more generally how to think and express myself within this culture. For the first time I came to think of myself as a programmer. I was so keyed up during the batch that I slept about five hours a night, and I dreamt of coding on most nights whose visions I can remember.

I have some sense now of the dimensions of the mind-space in which the life of a coder is situated, as though I have become aware the height of the unseen vaults overhead when I stand in a dark cathedral.

The community has provided me many models for how to do things and how to conduct myself as a programmer. I finally overcame the sloth that had previously kept me from learning how to use Git and VirtualEnv, and those things have led to better workflow hygiene all around — it has led me to pay much more attention to my Python and Ubuntu installations, for instance. I finally remembered to begin making regular use of list and dictionary comprehensions in my code, too.

Hacker School has provided far more chances for me to receive fruitful criticism (Karl Popper’s phrase) than I have ever gotten before on my code or my thinking. The community is a sort of personal Stack Overflow, without the insults or grubbing for votes, and that has been very helpful. The use of Humbug greatly facilitated communication, including after the batch, and think life would have been much harder if we had been limited to IRC or Skype chat.

Other specific gains I’m aware of are, if not speed, then anyway “motor memory” as it affects my proficiency with coding syntax and my choice of tools. I have a long way to go yet but my progress these three months has been greater than at any other time in my life as a coder. I have become comfortable with SQLite3, BeautifulSoup4, Feedparser, and NLTK, and am much more willing now to pick up a module I don’t know and try to learn how to use it. Now that the batch has been over for three weeks and I am back to the insanity of my philological work — using chopsticks to clear a room of swarms of gnats is what it’s like — I constantly find myself envisioning efficiencies and then building them or hunting for tools rather than letting myself get into a rut doing things the same way as before. That shows me that the grooves of my mind have indeed been altered substantively by my experience these three months. I do not feel quite right if several days go by without coding, either — I am still making peace with that, as though after a religious experience that demands changes in how I live.

Another two subway rules of thumb illustrated

1. Sometimes it is more efficient to use an exit or stairway that is not the closest one to your destination, if there are fewer people taking it along with you. In that case, you can make up the distance lost more quickly above ground than you would have managed if you had gotten into a long, dense line below ground.

For example, these past three months I have been commuting to the Houston Street station on the Seventh Avenue line. The King Street exit is substantially closer to my destination than the main exit, so I normally position myself in car 2, rear door, which is closest to the platform’s emergency exit there and to the stairway on the southwest corner of the intersection. But if I have not made it into car 2 — perhaps only into car 3, which is nearest to the turnstile-exits at King Street, I will arrive at the south stairway too late to bound up it unimpeded. It will be clogged with a mass of slow-moving commuters trudging to jobs downtown from King Street, and I will have to slow my speed to match them. I prefer to avoid trudging if I can. Instead, I prefer to take the turnstile exit and then leave through the north stairway, which is usually much emptier at this time than the south stairway. Once I’m on the street, I can cross King in the downtown direction at normal Gotham Breakneck speed and be where I am going before most of the people who took the south stairway ahead of me have emerged.

2. Here is an example of striving to be second, rather than first, in a tight situation (see also this previous post). At King Street I try to be the second person out of the car, so that someone else can do the technically illegal work of opening the emergency exit; this particular emergency exit door is heavy and you generally need to push it once to unlock it and again to make it swing open, and I prefer to leave all that to the anxious person I choose to walk behind. Many people are in an intensely competitive state of mind when leaving the train for their jobs, and are happy to be the first ones to the door; this is the time to hang back and let them clear the way for me. Once the door is open, I can normally get up the south stairway well before them.

Short-circuiting and (and ==) instead of if in Python

Some people use a special short-circuiting and expression to replace if blocks in Python. For instance, instead of

    if x >= 0.5:
        f(x)

one can use

    x >= 0.5 and f(x)


The point is that because multi-term logical conditions are evaluated in series, f(x) is only evaluated after x >= 0.5 returns True, making x >= 0.5 a pre-condition of f(x).

You cannot use an outright assignment (here y = x) as the second part of the and statement; only a function will do.

In any case, this syntax is unsatisfying to me because it is less explicit than using if outright. But I’ve seen it defended by a gifted programmer as being “explicit once you recognize the syntax”, and I wondered if there was any timing advantage to it.

The results of timing, on 10^8 iterations, are (in seconds):

    time using if:  43.7663021088
    time using and: 44.545058012


It doesn’t look as though the and statement saves time, particularly. I suspect it is a case of coding craftiness — surely a pleasurable thing in itself. But it now seems clear to me that using if is better; it is both explicit and involves no loss of speed.


Addendum, later in the evening:

There is another way to use short-circuiting to avoid the use of if: with == instead of and; for instance:

    x >= 0.5 == f(x)

Just as with and, == causes f(x) to be evaluated after x >= 0.5; we can show (though I have not done so here) that f(x) is in fact evaluated. But it turns out that this trick saves even less time:

    time using ==:  50.7892489433

Best to stick with if, it seems.


The program I wrote to compare processing times follows:

    import time
    import random
    
    def f(x):
        y = x
    
    rounds = 100000000
    r = random.random
    start_time = time.time()
    for i in xrange(rounds):
        x = r()
        if x >= 0.5:
            f(x)
    print 'time using if: ', time.time() - start_time
    
    start_time = time.time()
    for i in xrange(rounds):
        x = r()
        x >= 0.5 and f(x)
    print 'time using and:', time.time() - start_time
    
    start_time = time.time()
    for i in xrange(rounds):
        x = r()
        x >= 0.5 == f(x)
    print 'time using ==: ', time.time() - start_time

Quintilian on time and study

Sed breve nobis tempus nos fecimus: quantulum enim studiis partimur? Alias horas vanus salutandi labor, alias datum fabulis otium, alias spectacula, alias convivia trahunt. Adice tot genera ludendi et insanam corporis curam, peregrinationes, rura, calculorum anxiam sollicitudinem, invitamenta libidinum et vinum et fractis omni genere voluptatum animis ne ea quidem tempora idonea quae supersunt.

[But we make the time short for ourselves, for how little is set aside for study? The empty work of paying visits removes some hours, idle time spent gossiping removes some more hours, the theater some more, and dinner parties some more. Add to these so many kinds of entertainment and unhealthy care of the body, travel, the countryside, anxious counting of profits and losses, the allurements of sex and wines. And sufficient time for study certainly does not remain to our minds, damaged by all kinds of pleasures of the soul.]

Marcus Fabius Quintilianus (fl. 35–100 C.E.), Institutio oratoria, XII.11.18

Kenkō on time and study

A certain man who was learning to shoot a bow aimed at the target with two arrows in his hand. His teacher said, “A beginner should not hold two arrows. It will make him rely on the second arrow and be careless with the first. Each time you shoot you should think not of hitting or missing the target but of making this one the decisive arrow.” I wonder if anyone with only two arrows would be careless with one of them in the presence of his teacher. But though the pupil is himself unaware of any carelessness, the teacher will notice it. This caution applies to all things.

A man studying some branch of learning thinks at night that he has the next day before him, and in the morning that he will have time that night; he plans in this way always to study more diligently at some future time. How much harder it is to perceive the laziness of mind that arises in an instant! Why should it be so difficult to do something now, in the present moment?

— Kenkō Yoshida 吉田兼好 (1283–1352), Tsurezuregusa 徒然草, 92 (Donald Keene, Essays in Idleness; New York: Columbia University Press, 1981)

George Orwell on keeping a diary to cultivate dispassionate thinking

To see what is in front of one’s nose needs a constant struggle. One thing that helps toward it is to keep a diary, or, at any rate, to keep some kind of record of one’s opinions about important events. Otherwise, when some particularly absurd belief is exploded by events, one may simply forget that one ever held it. Political predictions are usually wrong. But even when one makes a correct one, to discover why one was right can be very illuminating. In general, one is only right when either wish or fear coincides with reality.

If one recognizes this, one cannot, of course, get rid of one’s subjective feelings, but one can to some extent insulate them from one’s thinking and make predictions cold-bloodedly, by the book of arithmetic. In private life most people are fairly realistic. When one is making out one’s weekly budget, two and two invariably make four. Politics, on the other hand, is a sort of sub-atomic or non-Euclidean world where it is quite easy for the part to be greater than the whole or for two objects to be in the same place simultaneously. Hence the contradictions and absurdities I have chronicled above, all finally traceable to a secret belief that one’s political opinions, unlike the weekly budget, will not have to be tested against solid reality.

— George Orwell, “In Front of Your Nose”, currently posted at http://orwell.ru/library/articles/nose/english/e_nose, accessed 20130415. Originally published in Tribune (London) 19460322.