On Tuesday I decided my plan needed an overhaul.


  • Get some guidance on my goals and projects.
  • Write a new plan based on guidance.


  • I started the day by chatting with Tom about the tension I was experiencing in wanting to learn Factor, and wanting to do the Protagonist project.

    (It was really hard for me to ask for help in this way. I actually opened the booker system 3 times to request a meeting, typing in what I wanted to talk about, and then closing it again without committing. I'm so glad I finally clicked submit!)

    The problem I was having was that I am excited about learning Factor, and I wanted to bootstrap my learning by tying it to a real project I'm interested in. At the same time, I have a project that I am eager to make progress on, and I can see that developing it in Python, or even bash, would enable me to make quick progress, which would be motivating and rewarding.

    I was thinking about Brett Victor's vision of ideas dying because the connection between making a change and seeing the result is too remote, and I was feeling the frustration of not being able to develop my design and ideas, because I'm spending all my time figuring out how to make tiny things happen in Factor. Making things happen in Factor is really fun, but the juxtaposition of these competing goals was not fun.

    After going around the issue from different angles, we noticed that Protagonist could be thought of as a protocol (in the OOP sense), or interface, rather than a specific implementation. An implementation of Protagonist interfaces an object defined in the filesystem. Thinking of it this way enabled the following realisations:

    • I could develop as much or as little of the project in Python or in Factor as I want, and the Python and Factor code don't even have to interact, except through the filesystem. For example, I could quickly search the design space by writing in Python, and then I could re-write small parts in Factor if I wanted to. This would have the following advantages:

      • Then my Factor learning experiences are contained, well-defined, and not bottlenecks.
      • I can make quick progress on the project, which would amp up my motivation, and allow me to get on to the interesting parts.
      • I can get much more help and code review writing in Python than I ever could writing in Factor, because for the latter I have to find someone who is interested in Factor, interested in my project, and feels like devoting time to helping a stranger. For the former, there are lots of people right here at Hacker School who are excellent Python programmers, and who want to help me just because we are here to help each other.

      The disadvantage is that it does not seem particularly motivating to re-write bits in Factor, but in order to make progress on learning Factor, I would need to have something to write. I definitely want to learn Factor; it pulls on my curiousity in a deep, pleasurable way. I can think of a two ways to address that:

      • Put off learning Factor, and come back to it later.
      • Choose something else to do in Factor that is smaller and more explicitly for learning, and do that on the side. Unfortunately, there aren't books or guides for learning Factor yet. It might be a fun project to compile good examples as I go.

    So, I decided to restart the project in Python.

    I knew this was a good decision in part because of the sense of relief and returning excitement I had. It's a soft measure, but seems to work well.

  • After talking to Tom, and then pairing with him a little on his project, curtsies, I had only the afternoon to work on Protagonist withthe new zeal I had found. In that time I completed almost as much functionality on Protagonist in Python as I had in over a week in Factor! That felt really good.

More thoughts

Learning Factor and writing Protagonist are just particular instances of the balance I am trying to strike while here.

It has been a long time since I have been able to play as a computer scientist. In many ways "computer science" is a misnomer. It is more like an art than a science; it is a creative activity. Creative growth requires play. Learning a new language, especially one that is obscure, requires some degree of experimentation before competence emerges. I want to spend some time doing that while I am here, because it is mind-expanding, and it feels good, and the opportunity to do so in my real life is rare.

On the other hand, I am really excited about making things that work. I want to demonstrate my competence to myself and others, and I want to experience the satisfaction that comes with a job well done. Hacker School is an excellent opportunity to develop a portfolio of such successes. Moreover, I think my experience level in programming Python positions me well to get enormous benefit from pairing and reviewing, and it seems like a wise move to push myself toward excellence in the direction of my current strengths.

I want art and craft; breadth and depth.