Skip to content

Instantly share code, notes, and snippets.

@luqui
Created March 18, 2013 07:09
Show Gist options
  • Save luqui/5185517 to your computer and use it in GitHub Desktop.
Save luqui/5185517 to your computer and use it in GitHub Desktop.
Journal Entry 2013-03-18

Hello, this is my journal. I have a good 3-4 shots of cheap whiskey in me (at the very least, positive time-derivative). I don't know why I journal on github, I figure I'll have roughly the same number of readers as if I wrote it to myself, and here I have an audience. I can't share my innermost deepest secrets here, but that's okay, I can share most things. If anybody reads it they will arrive here from a random google search for something random I mentioned anyway.

So... I'm getting excited about (1) my Continuum, which I will be able to afford in a month!!!!!! and (2) my time off, which I will be able to afford in 2? years. Assuming I can keep my job. The project is ending, but I have a suspicion that they are unhappy with my work. There's more than a 50% chance that that's my own shit coming through... I dunno, after the abrupt end of the socialmedia contract I am perpetually jittery about my job security.

Oh well, what I really want to do is research and music. I mean my own research. I'm getting a fair amount of it in on the CRASH/SAFE contract, being meticulous about the modularity of my design, teaching myself new techniques and whatnot. I think this practical application will ultimately have a positive effect on my eventual contribution.

Contribution... how about that word. Yeah, I do want to contribute, and I do think I have something to contribute. It's just about distilling it. I want it to be beautiful. As I'm working through Mac Lane, I'm realizing that he and Eilenberg really did create something beautiful. It's worth it. Can I do something for software engineering like they did for mathematics? There has to be something better than what we have. Java is the most popular language; Haskell is the best one. How can Haskell be the best? It's got so many flaws. I mean, what's beautiful about it is beautiful, but it is by no means a software engineering oasis. Complex syntax (&, combined with limited popularity, poor editor support), an unfortunately limited module system, a broken typeclass system which wreaks of a paradigm just getting off its feet but with as many holes as Pascal has to Haskell.

And I give a damn. I have ideas; I have the potential to execute them. I just need to get out of this slavery which I have constructed for myself. I am wasting my time on CRASH because I don't really care about security. I think it is a virtue when the government is forced to be transparent by technological limitations. Not that I care enough in that direction to focus my effort on it. I think a bigger problem facing our age is spam -- spam and advertising (and power). It's just a natural consequence of nature -- tropical birds get big and colorful because they want to advertise for mates. It is the same here, streets and online sites and email inboxes are filled with advertisements because they want to get money in any way they can. They want to convince you that you need something or trick you out of your money. There is little difference. I suppose there is a little merit in convincing you that you need something -- though I would be more comfortable with the word "want". Surely if Ben hadn't sent me that ad for the Continuum I'd still be idly dreaming of building one for myself (with my limited knowledge of hardware) instead of making the (much smaller) investment of buying one from someone who has made it his life's work to make one. I'm not an instrument designer, I'm a musician. I make music, not music-making tools. The latter is much less satisfying to me.

But in software, I do make tools. Or rather, I make conceptions of tools. Maybe someday I will make a real tool -- I just need to find my niche. No compromises. Can I be sure that I will not be lying on my death bed still trying to make the most beautiful software tool? No... but I don't really think I have a choice. I am deeply uninspired by compromise; when something is not as good as it could be, I lose my energy unless I am empowered to make it as great as it could be. That is the problem with working for a corporation with different goals than mine (and honestly, what corporation could make money off my ideas?) -- and indeed that is the problem with CRASH. They are doing research, so I feel a little better about doing research under them, but I still feel guilty that I am not working directly toward their goal. I wish I had more influence in the project -- but really I don't because I don't care enough to put my whole heart into it. I'd do a bad job, for security isn't my passion. I'm not even sure it's that important -- security helps the powerful stay in power. I don't want anybody with a will to be able to get power, I think that is probably more dangerous than keeping power in the hands of the powerful, but really I want power to be efficiently distributed. I want society to have the information and opportunities to make the best decisions for everyone. I don't know how that plays out, but concentration of power isn't the way in most cases, unless we have a brilliant and noble leader (a rare occurrence). Organizations like Wikileaks help to distribute power, and Wikileaks thrives off of imperfect computer security. So could I say that I even want CRASH to fail? I can't be sure... certainly I'm not in a position to guide it any particular direction, I'm just a drone doing his job (and trying to learn what he can about his own passion meanwhile).

So what is my passion? Other than music. I'm sure I have multiple; there may be a unification, I don't know. But in the realm of software, I care about at least these things:

  1. Accessibility of programming
  2. Fun/flexibility of programming for myself/experts like me
  3. Reuse of code (in so many of its subtle incarnations)
  4. Organization/beauty of code

This is not in priority order, just some things I thought about. I inserted #2 after the others. I don't know why I put it there. That relates to #4.

I care about accessibility of programming. I find programming incredibly empowering; the idea that if I find myself faced with a repetitive task in the realm of computers, that I have the power to tell a computer to do it for me. I am then in a constant state of trade-off between doing it myself and describing the task in enough detail to have a very cheap assistant do it. This is the conundrum that lead me to one of my callings -- making the task of describing things in that amount of detail easier. Without programming, I wouldn't even know that this was a problem to be tackled. I want to show everyone what can be done; I want to make everyone aware of the power to program computers, so that those with ideas can understand what is possible, because such a great many things are possible. The power of computation is making incredible strides, but is also incredibly wasted in comparison to its potential. I do want everyone to be able to program. Not like I do, though -- not diving into the depths of libraries and sorting out difficult design and algorithms problems -- I want people to be able to tell their phones "remind me to stop by the grocery store on the way home", "download as many scholarly articles as you can find about GMO so I can research during my camping trip", "here's a shopping list, find me the specific products that I should buy that are most aligned with my values".

I care about the fun of programming. So many times I have had a game idea that I want to try out, only to find myself in the perilous caverns of pointless details. I lose my inspiration. I mean, yes, that is a test of my true inspiration versus my one-off half-baked "wouldn't it be cool if" ideas, but I would like it if they were a little easier to get to fruition. If I want a monster, let me select from a library of reusable monsters with art and animation presets. Let me customize it to the degree I need to -- often I do not have anything very specific in mind, just something that is convincing. If I see an opportunity in my code, let me refactor it quickly to conform to that idea, rather than having to spend days and days converting every line. Those difficult moments are what differentiate me from a good software engineer -- I want to push through them to get to the beautiful solution. But when I am working for someone I feel pressure to toss them away and get to the solution that will get the job done in the quickest time. But the beauty of code matters to me.

Code aesthetics matter. Version control aesthetics matter. Code reuse matters. I want to be able to get a beautiful description of my solution. I know that many times I need to sledge through the details to adapt what is to what I need -- that is okay (even satisfying) to me. But I don't want that sledge to disrupt my beautiful solution. I am seeing that in CRASH. I am compiling a blog series on composing F-algebras and F-coalgebras, and I'm seeing lots of opportunities for using it already. But I need to adapt Haskell's broken typeclass system to my ideal, an unweildy and ugly process. What is a simple transformation in my eyes, complicated by the practical limitations of my langauge, is nothing more than unnecessary overengineering in Jesse's (and I want to impress Jesse). I want to stash away the sledge into its appropriate place where it is accessible to others, where my adaptation of the standard way -- a form of art -- can be seen and used. But not in a way that it interferes with the other art which is my solution to the problem at hand.

I am stuck. There are so many opportunities in this project to make my solution beautiful, but they all take too much of a time investment to justify. I want to try them all out.

I want to dedicate my life for a few years to making a beautiful coding environment. I can. I see things differently than others; I see a way. I see a silhouette through the fog, a way coding can be abstract and accessible and reusable and mutable all at the same time. But it does not come as a small improvment on existing tools. It is a new way of thinking, a new way of doing. The ideas that programmers have about what a program is are flawed, they are limiting. Programmers work with an astonishingly small vocabulary versus what people use in English; humanity is capable of expressing itself in much more concise and sophisticated ways. But it does not matter how sophisticated your language -- that is my hope -- if you can define an idea with five intellectual words or a thousand words for children, that word should be equally usable by others. The extent of its domain should be clear, so that a novice's definition does not infect an expert's vision. I don't want to have to write a JSON parser; somebody with a good reason to already has, and I should be able to build off of his effort, but adapt it to my way of seeing. Maybe that will take some effort of my own, but a complete reimplementation should not be necessary. He has written the hard parts, an effort I appreciate; allow me simply to structure them according to my framework. And if another has another framework, allow them to combine my efforts with the JSON author's to structure his.

A lot of this has to do with implementation, I think. I want to separate from it. Some ugly stuff can be behind my beautiful interface (it already is); I shouldn't care about how it is written (as long as it is free of bugs). What matters is how it is presented, how it can be used in the future. But, today in software, how it is written is quite important, and I don't really see why. We are trying to minimize the number of dependencies we use; we are trying to mitigate namespace conflicts; we are reimplelemting things to get around limitations in our language. I still cling to data-memocombinators even though MemoTrie has a more convenient interface because there is a trade-off between convenience and expressivity. It does not need to be so!.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment