Jeff

goals

What are my goals in life? What does it mean to have these goals and how should I manage/prioritize them? I have been thinking about the things I aspire for in my life, things I want to do or be during my time here. I have been starting to realize that goals change, things happen and achieving all of your goals is probably impossible as they begin to conflict (or you are a very focused and driven person). When I begin to think about the goals that conflict and learning that the decision needs to be/has already been made and giving up on one of these goals is a tough idea.

A simple example would be the goal of playing ultimate Frisbee in college and the goal of being healthy. After my doctor informed me that I would not be able to run again after my back surgery, it was tough. But it was necessary, I mean what is more important, being able to play a sport for a few years or to correct a physical issue that would potentially get worse if I waited? But giving up on that goal was still difficult because passing up a short term desire for something that is better in the long term makes sense, but that doesn’t make it easy. I still feel a large amount of regret for what could have been and what is (I cannot run any long distance without needing to walk and the time it takes is almost laughable, I could run faster for longer when I was an awkward 13).

I have begun to realize that this need to put goals aside/give up on them is going to happen a lot more. I am getting married in a week, that was not even a goal of mine a few years ago. I never really decided that I had to get married. I was not one of those girl hungry teenagers who would do anything for a girlfriend. But Kim just kind of fell into my lap in that I was not looking to find someone to date, I just met a girl, we got along, it felt right to try dating, and 4+ years later, here we are. I guess marrying her became a goal later on. With it, a lot of other goals have, and need to be abandoned/modified.

I feel like I need to set up a ritual, on the first of every month (or every other month) I need to make a list of all of my goals, all of them. This means short term things, like cleaning the refrigerator or learning a new programming language, and long term things, like career aspirations or athletic goals (since my being able to run 5 miles at an 8 minute pace isn’t happening any time soon). This gives a chance to then rank them in terms of desire to achieve them and chance to. Things like working for Google would be low, as that would probably require a move (the Chicago office is not very big for software engineers and the things that they do work on are not things I am interested in) and I think that would conflict with some of the other goals we have (for now). It also allows me for a chance to assess the requirements for some of the long term goals (like learning Japanese for my desire to live in Japan). I feel like if I do not keep my sites on my dreams and aspirations, a few years will go by and I will suddenly realize that I am missing some of the time I could use to work towards these things, maybe even miss them entirely, and regret that fact.

I have tried this in some form for the past year, trying to assess what I need to do for some long term goals. But the lack of structure and my not clearly writing down and defining each goal have made it ineffective. I have an idea in my head of what they could be, but it is still a chaotic mess of ideas. Time to organize and understand what all is flying around in there.


environment

The environment of a software developer is a very personal thing. It is where we spend a majority of our time working, it is our kitchen, our car shop, our workbench. Like how a chef likes to have everything in its place (mise en place), developers like to have everything in its place. I have become very specific about things like directory structure, command shortcuts, keybindings, etc. Some people prefer Windows, others OS X, and even others Linux, each for their own reason: comfort, customization, community, etc. Then within those systems, people prefer different tools, things like web browser, editor, window manager (for Linux users), languages, etc. The longer you spend time developing, the more your environment evolves. The speed in which I use my system is very efficient for me, but probably not much for anyone else. It is my kitchen, everything is mise en place.

In my “kitchen” I use Linux, specifically Arch Linux. I like this distro/flavor of Linux because it is pretty vanilla, meaning it doesn’t change a whole lot. It plays by normal conventions and relies on standard systems (if I want to install a python library, I will use pip, if I want to build something from source, it plays nicely and may even have a Arch specific make script). I also like that it comes with nothing out of the box. Just a TTY into the base OS. I can install the xorg server and setup the window manager I want, I don’t have to live with GNOME living and updating because the distro comes with it. The window manager I use is XMonad, a tiling manager written in Haskell. I was turned onto this by a former coworker who used it. A tiling manager (as opposed to a stacking window manager that most people are used to, where you normally drag, resize, and stack windows as desired) naturally splits the window between windows as they form tiles. So if I have two windows open, it will split the screen in half and give each window half the screen (vertically split or horizontally split, I can change with a simple keybinding). I can hop to a specific screen, workspace, and window with the press of a few keys, never needing to grab the mouse (this will be a big theme). The window manager and OS are my kitchen, they are the core of where I work, but not the tools I work with, not my knives and cutting board.

My tools of choice vary and evolve a lot more. They are a lot more modular, you can take a seasoned chef and give him a new knife and he will function with little change, but you put him in a new kitchen, with a new layout, and he will slow significantly. My tools of choice are vim for my text editor (I am still learning), tmux for my multiplexing (I just switched from GNUScreen) which allows for me to keep a bunch of stuff in a single terminal (and detach it if needed), Chromium as my browser (learning luakit, but not good enough to use it regularly, soon hopefully), irssi as my IRC client (weechat is looking really awesome, have been using it on the train, need to customize some more and it’ll take over), mutt as my e-mail reader (this is new and is not replacing anything, has a lot of work needed still), and zsh as my shell along with urxvt (or rxvt-unicode) for my terminal emulator.

With these “tools” in this “kitchen” I have become a fairly efficient and capable software developer, but I am continually learning new tools and techniques to streamline my development. I am trying to use TDD principles in my personal projects right now, which is hard because I really don’t have interfaces figured out for what I am writing, but I am continually trying to upkeep unit tests to simplify the testing of what I write. Hopefully this gives some insight into thinking about how to streamline your workspace both physically and digitally. You would be surprised some of the quick shortcuts you can learn/setup and how much it will speed up your usage of your computer.

The configs should all be on my github (link at the bottom).


ideal setup

I always question myself what my “ideal” setup would be (in terms of a computer). It has changed a lot over the years as my priorities have changed and my interests evolved. I used to want a multi-monitor desktop with tons of power so I could do whatever I wanted (like gaming).

A few years ago, I made the jump to using Linux, so the gaming ideal started to die (I rarely play games these days, preferring to spend time with Kim or read). With my move to Linux, the choice of OS became a trait in my ideal setup. That has grown more so with my move to Arch and the barebones build up I have grown used to with it. I now have many tools of choice and a window manager of choice (which can change whenever) that I want to be free to choose and customize as my needs require.

Starting when I was visiting Kim at school every few weekends, and much more now with my commute to and from downtown for work, a desktop is no longer satisfactory as I am not right at it most of the time (I was a lot more in college), so portability became part of this. But not just portable (I have a netbook that I used while I was visiting on weekends), I also want it to be able to do things. It doesn’t need to be a powerhouse (I still have my powerful desktop I can connect to for the heavy lifting) but perform admirably (Things like watching movies, listening to music, loading a webpage).

With the requirement of portability comes a trouble, connectivity. A desktop is always in a location that is (preferably) connected all the time. The portable laptop is not always online (no WiFi on train, at restaurant, etc.) so the resources of the internet and the more powerful desktop at home are lost. Connectivity becomes a factor with the need for portability (but connectivity that is affordable for the need).

This brings me to my current setup, which is (for now) around what I consider ideal. With the latest round of Ultraportable laptops, I saw the idea of a portable (for me weight is an issue, I don’t like lugging around a heavy brick of a machine) laptop that could perform as a reality. The OS factor jumps up a lot with laptops though, as Linux compatibility is not complete on most laptops, especially brand new ones (they use new chipsets that haven’t been developed against). So I had to do some research in the plausibility of my distro of choice (Arch) or any other distro working on the desired hardware. In terms of hardware for this class, the MacBook Air (laugh, it is ironic that I use Apple hardware) is the best (everything else is first gen, lacking in various small areas that build up). But it is naturally proprietary everything from the bootloader to OS, so I found some information on getting Arch running on MacBooks and spent a week backing up the OS X partition and getting Arch running (and then fixing the various issues, such as bad support for the i915 chipset, since fixed in the kernel). I spent a few months with that, taking train rides and trying to save reading and documentation on the system so that I could access it while unconnected.

This gave me the portable, powerful, Linux based system I wanted, but I lacked the connectivity. Recently, I setup my phone to tether internet to my laptop (as in 2 days ago) and am now writing this entry from the laptop, while pulling into the station. So, for now, I am where I believe I want to be, but this all may change.