Tuesday, December 21, 2010

2010 Personal Review, Thoughts on Setting Goals

Back in January I set some goals on a personal blog. I was pretty diligent following most of them well into the year (say June), but at some point I fell off the wagon and realized that some of the goals I just didn't really care about enough to keep going. I thought I'd review my successes and failures:

  1. Live better
    • ✖ Lose 15 pounds (down to 190) and be able to do 50 push-ups in a row. I was pretty well disciplined about both the weight-loss and push-ups until June. In fact I was over 50 push-ups for a little while, but I let it slide for the rest of the year. It just wasn't a priority.
    • ✖ Drink more green tea and less coffee I drank green tea reliably until June, and then again August/November when I was experimenting with "healthmonth.com":http://healthmonth.com
    • ✔ Succeed at gardening planted a bunch of varieties of veggies, had small harvests, ran a composter, etc.
  2. Code more
    • ✔ Finish my Den Manager cub scout app and get it ready so that another pack could use it.
    • ✖ Learn a new programming language (erlang, Clojure, Haskell, etc.) I just didn't have a reason and with the programming time that I put into Den Manager I didn't have leftover time to explore something else.
    • CANCELED Integrate twitter or some other BB system into the church website.
    • ✔ Finish ripping family videos into digital form and ✖ turn them into a more usable format (DVD, YouTube videos, etc.) I have it all available on a network drive and it's ready to distill into a more usable form, but I just didn't have the motivation to finish. That said I had the idea to write a program that automatically summarizes video content and it looks like now there is at least one service to do that highlightcam.com
    • ✔ Get our home backup solution in order so that all photos, videos, documents, etc. are consistently backed up in a redundant way and available from any machine on our network.
  3. Learn more
    • ✔ Finish all of the books on my nightstand (Uncle Tungsten, A Heartbreaking Work of Staggering Genius, Mathematics, Statistics, Leading with Questions, Age of Wonder, and a few others) Technically I didn't finish all of those books, but I finished many of them and I finished some others as well. The goal should've been "read N books" instead of specifically enumerated books.
    • ✔ Finish the MIT open courseware courses. Same thing holds for the MIT courseware... I finished several classes but not ALL of them.
  4. Write more
    • ✖ Finish my NaNoWriMo novel Writing... I just got bored with it. In the case of NaNoWriMo I don't really even like reading fiction so who am I kidding that I would write it (even if I did have a good story)
    • ✖ Write my daily morning pages reliably.

So, it looks like I batted about 50/50... What did I learn?

  1. Goals should be measurable in more abstract ways.... Saying "I'll read one book a month" is better than "I'll read books X,Y,Z this year". You never know which higher priority books are going to come along and really for the most part you care about the pursuit of knowledge in general not specific knowledge.
  2. Be careful choosing goals that compete against each other for time because you *will* prioritize them either implicitly (you'll do what you like better) or explicitly (you'll schedule them explicitly). In my case being a husband, dad, and involved member of church and civic organizations (in addition to work) I just plain have a limited amount of time and not everything would fit without giving somewhere so I did what I liked.
  3. When setting goals like this the temptation is to "eat your broccoli." Goals are supposed to be hard and not enjoyable, right? So you end up setting goals that aren't in alignment with what you really want out of life because it's what you're "supposed to do." Those sorts of goals are important (it'd help my health if I lost weight and exercised more), but if you don't like "broccoli" then it's probably wise to make yourself eat only a little of it and make sure you've got plenty of stuff that you do like.
  4. Review often and don't go it alone. The two times when I had most success in the things that I ultimately failed at were when a. I reviewed my list of goals often to see my progress b. I had a community of folks I was accountable to (at least a little bit).
  5. Take advantage of the fact that it feels good to check things off. Have small enough goals, or perhaps milestones so that when reviewing your list you often get to check things off. For example consider spliting your "read 12 books this year" into "read a book in January", "read a book in February"... That way every month you get to have a success or failure that can either motivate you to keep going or give you a chance to course correct.
  6. Be honest during the year and let yourself change... If you set goals that just don't look like they're realistic or if your context changes then don't hang onto goals just because you set them in January dammit! Kill them off or transform them into something more appropriate so that they can be more helpful than reminding you of your failures (or how bad you are at setting goals).

Monday, November 15, 2010

Ubiquitous Identity

The idea of having one account/identity to rule them all isn't new. Folks have tried (Microsoft's Passport now Live Id, OpenID, AOL, etc.) it in the past and it didn't really seem to get traction. That is of all of the sites that a person would visit, the vast majority would require you to create a *new* account and re-enter ALL of your details. Within the past year that seems to have started to change. Facebook, Twitter, Google, and others all provide authentication hooks (many using OAuth) so that you can login to a different site using the same credentials you use for FB, etc.

This is interesting for a couple of reasons:

  1. It basically guarantees that you will ALWAYS be signed into FB, etc. If there are times when you're not regularly using Facebook and perhaps your session has even expired, Facebook Connect (used to link up your account and provide your Facebook identity to a different site) will refresh your Facebook session.
  2. It centralizes authentication for basically the entire Internet which means it's a pretty big target... Break my Facebook account and you have access to lots of other accounts that I have. I suppose it's arguable that a person's digital presence is more secure if they have distributed accounts, but it would at a minimum make it a little harder for an attacker and if the user uses multiple strong passwords it's a good deal harder.
  3. It creates a huge moat for Facebook and cedes them a a lot of power. Don't like what they're doing with your account or generally and you're inclined to cancel your account? Think again, it's going to be a pain to have to re-setup all of those other accounts unless you plan on losing access to other things you care about.

Generally, I'm not a security or privacy conscious person but the more I think about this the more it seems like there should be some central/regulated/neutral authority for identity and authentication.

Tuesday, November 2, 2010

Build Assuming a Paying Customer

I've been working on turning a site I built a while back into a site I could charge for. When I built it, I assumed that:
  1. I was building it only for myself.
  2. If I ever wanted to open it up to other folks I wouldn't want to charge for it because it'd obligate me to maintain it... So I'd monetize by advertising, associates programs, etc.
Realistically you have little chance of building something that will generate enough traffic to make money off of advertising so stop fooling yourself. On the other hand if you build something useful (and if it's not useful then why the heck are you building it) you can probably charge for it... Maybe not a lot, but $5/mo or something, and 1000 people paying you $5/mo is nothing to quibble over.

So don't be dumb like me because when you do to turn it into a pay service you'll discover all sorts of work that you didn't do the first time. Such as
  1. Documentation and help sections
  2. Authentication/security needs
  3. Permissioning and roles
  4. Missing editing functionality that you always figured you'd just do by hand
  5. Scaling problems that you were ignoring because it'd only ever be for a handful of users
  6. Ugly UI that you tolerated because no one really cared

Wednesday, July 28, 2010

Sharing a phone is like sharing a toothbrush

On our roadtrip this summer our car was broken into and every last piece of technology (Nintendo DSes, iPhones, computers, etc.) was stolen except for my iPhone which was conveniently in my pocket like an extra appendage. We replaced some stuff on the trip, but intentionally chose not to replace Shiree's phone because we didn't want to mess up her upgrade to the imminent iPhone 4. What that meant is that throughout the entire trip (as I drove) I got to experience another person using *my* phone... "I need to look up a phone number, I need to check my email, I want to look at the map, what's the weather supposed to be like tomorrow." Now it was my wife so we can share right? Umm... just like my toothbrush I'd rather not. It's not rational, I know, but there's something about the personal-ness of a phone.

Tuesday, April 13, 2010

Apple is an Experience Company

There has been a lot of hate around Apple's change to section 3.3.1 over the past few days. The essence of the change is that apps for the iPhone/iPad must be developed in Objective-C, C, C++ or JavaScript. Looking at the change through a narrow lens it appears that Apple is boxing out Flash, .Net, Java, etc. developers. Understandably those developers complain about hindering creativity, monopolistic control, etc. John Gruber's reasoning is a sound reply to all the banter.

Let me add one more thought... Apple is NOT a hardware company. They're not a software company. They're an EXPERIENCE company (read "The Experience Economy"). Just like Disney people love their products because of how they make them FEEL. Using an iPhone, or an iPad is magical. Doing boring stuff like reading email, surfing the web, etc. has become fun again. Plus you get amazing stuff like "playing scrabble" with an iPhone as your tile rack (flick the tile off your iPhone and it appears on the board) or driving games played with the accelerometer, or games that use the GPS, and on and on. Apple builds hardware and writes software to make magic and provide an experience for their users and clearly it's working as the demand for their products is incredibly high (86million iPhone OS products sold?!?) To that end Apple should exert as much control over the platform as they can so that they can keep the experience magical. If whiny developers don't want to work within those constraints and can't be bothered to (re)write their application on the platform Apple is providing, I have no problem with that; they're probably not writing an application that's magical anyhow.

Tuesday, March 23, 2010

Complexity

Why are computers so hard? I ended up fiddling with iTunes again this morning . This time it was with a bunch of Music files that for some reason had an invisibility flag set on them. Were it not for the fact that I was working in a terminal with primitive terminal tools I would've NEVER known that those files existed aside from the fact that a huge chunk of my disk was gone. The problem with them being hidden though is that iTunes wouldn't pick them up so large chunks of my music library appeared to be missing (e.g. almost all of Radiohead). I ended up running an arcane command "chflags" on my whole music directory to unhide those files. Seriously? On a Mac? "Better, faster, easier?" There's no way on earth most computer users would've figured that one out. Granted most computer users wouldn't have had my problem because I was copying files around onto/from a network drive, but I didn't do anything terribly advanced and I can imagine users getting tripped up by this.



The problem, I think, is that in computers/software we work harder to hide complexity than we do to remove complexity. We thrive on abstraction and encapsulation and the result frankly is magical when you think about it. The number of lines of code that cooperate for me to type this alone is staggering (code in the operating system managing memory, and disk, and network layers... code in my web browser... code in the device drivers that collect my keystrokes... code in the display driver that powers my monitor... you get the picture). Generally we're entirely insulated from all of that hidden complexity, but when the abstraction fails the result is painful. What would it look like if we spent more time throwing away code and removing layers than we did writing new code?



What if smart people sat down and wrote an operating system and focused like a laser on keeping things simple? What if they built it with a child in mind, or with a grand parent, or another novice computer user in mind? What if they sought to control rather than abstract complexity?



Take for example "hidden" files. Why on earth do we need hidden files? It's more likely than not that real users have NEVER used that feature and instead have only been hurt by that feature. That feature exists as an attempt to encapsulate system files. Microsoft/Apple said "hmmm all of these files in /System or in C:\windows look pretty scary and users would be pretty messed up if they deleted them. what can we do?" And the abstraction of hidden files was born. So rather than reducing the need for those files (can't eliminate entirely obviously), or putting them in one location which is never shown, or archiving the files together in one bundle and hiding that.... we got file-level hiding, and beautiful but useless encapsulation that hid complexity but didn't reduce it and it sits there waiting to bite.



Thursday, March 4, 2010

Laptop Memory

I upgraded my MacBook Pro to 4GB of RAM (a whopping $100!) and while this should absolutely be no surprise to me my machine feels much snappier. It feels like this has to be a psychological effect particularly since I don't typically have a lot of memory hogs open at once. However it certainly seems to be the case with launching apps, changing between apps, jumping around Spaces, etc. It's hard to tell by reading the old RAM label, but my guess is that the new RAM I put in is faster. Either way it's nice to spend $100 on a "new" laptop ;)

Tuesday, March 2, 2010

Automated "Refactor-needed" Detection?

I've been working on and maintaining a site for tracking Cub Scout progress called Den Manager (not terribly exiciting if you don't have an account). I first wrote the site in Rails almost four years ago. About two years ago I did a pretty major refactor to reorganize the achievements so that it'd be easier to add additional awards. Finally, a month ago I migrated the site to the latest version of Rails and made a few "minor changes." This latest round of changes didn't go so smoothly, and yes I'm to blame. I didn't buy into the Rails religion completely in 2006 so I've got basically no test coverage (I'm working to rectify that now but it's hard to backfill test on years of work some of which has been through multiple refactors). But I don't want to talk about my personal failings in this post ;)

As I was fixing these latest problems I had an interesting thought.... The need for a refactor can be spotted when a small change causes many breakages in different places. In my case I changed one attribute on a class from a string to a symbol and it broke in dozens of different places (many of which I didn't spot for a few weeks because of missing test coverage). Had I had better coverage I wondered if you could build a system that monkeyed with code and intentionally introduced random bugs and then counted the number of breakages. You'd run a system like this in a CI type environment and you'd report up bugs in a particular module and how many failures it triggered. Sorting by the number of failures and you have potentially interesting candidates for refactoring.

iPad Keynote

I just got around to watching Steve's keynote for the iPad and, while I confess that I'm a card carrying Apple zealot (two laptops, a mini, two iPhones, a bunch of iPods, and a Cinema display), it was a bit silly how often Steve said "in the palm of your hand" The other thing that I found interesting was that within the first minute of the presentation, while browsing the web he demoed how Apple products don't play nicely with Flash. Hard to day if it was an intentional (though subtle) dig at Adobe or if it wasn't a terribly well planned demo. If it was a dig it's not clear that customers will see it that way. Average users (the kind of users who have been Apple's key to success historically... "it's so easy") don't give a rip if it's built in Flash or HTML5 or Obj-C so honestly, that the NYT site uses Flash and doesn't work on the iPad just makes it look like the device doesn't work.