Todd Grooms

That's a Hell of an Old Hound Dog You Got There

The Royal Tenenbaums

What’s he go by?

On January 18th, 2017, I made one of the hardest decisions I’ve ever made in my life. After a short battle with cancer, Ashley and I decided to put down Buckley. We adopted Buckley in March of 2008. Buckley has been a great companion. He knew all of my fears, anxieties, and secrets. We had many highs together and very few lows. On Wednesday, I quipped that I wish I had many little Buckleys. However, the truth is if I had many Buckleys, then he wouldn’t have been as special. I love him so much and I miss him greatly.


🔗 How I’d Teach Computer Science

I think this is an interesting idea, but it’s a bit short sited. I can’t emphasize this enough, but Computer Science != software development. There is definitely overlap between the two, however, it is certainly possible to have one without the other. I have met many software developers who were excellent at writing software that didn’t know the first thing about the time complexity of a given algorithm. I feel that distilling computer science down to what equates as process training is a disservice to the Computer Science field (says someone with a Masters of Engineering in Computer Engineering and Computer Science).

I do think offering courses with development methodologies in the curriculum is a worthwhile goal for college course work. I’m embarrassed to admit that fresh out of my college course work, I was fairly unfamiliar with source control. I had classes that taught us how to create UML diagrams to map model relationships for our OOD assignments, but I had not learned how to properly use source control, or how to plan a project, or what constitutes a good bug report. Shortly after landing my first job, I felt shame in what I didn’t know. I felt like a failure because I was unfamiliar with some of the technology stack. I felt inadequate around coworkers even though I held the highest degree. I remember being bitter towards my education.

Over time, my bitterness faded. I learned the different methodologies, different languages, and different tools of the trade. These came easy to me with a little patience. I still wish I would have had professors who had pushed us to use some of these tools/methodologies in our projects, but I eventually forgave them. I learned to be proud of my Computer Science background and it eventually set me apart from others in my field. It alone does not make me a better developer, but it’s an extra tool in my toolbox that others may not possess. I think this appreciation for my education has turned me off toward some of the formal education bashing that resides in my profession. There are many developers who tend to negatively view a traditional education. That’s okay. It’s their right. I just want to point out that those things are not equal, but they also don’t have to be mutually exclusive either.


How'd That Get in There?

A few weeks ago, Ashley and I were watching John Oliver’s piece on the state of Puerto Rico’s economy. One of the contributing factors in Puerto Rico’s current state is the limbo in which the territory finds itself. It’s not quite a state and it’s not quite a sovereign nation.

One of the more interesting revelations in the piece is that there were laws passed that hurt Puerto Rico that were buried in a larger bill. This intrigued me. My initial thought was, “Why would congress allow seemingly unrelated proposed laws in a larger bill?” I then immediately thought of all the terrible commits I’ve had in projects where I bury some seemingly innocuous change in a patch for a completely unrelated issue and it comes back to bite me on the ass. Suck.


Prince Rogers Nelson

A picture of the musician Prince

I was generally aware of Prince and some of his music in high school. It wasn’t something that I listened to, but I was aware of his more well known music. At an impressionable time of my life, my brother and I made a playlist of Prince songs. He was much more of a fan than I was and he set me up with a playlist of what he considered to be Prince’s best work. That playlist blew my mind. The CD I burned that playlist to didn’t leave my CD player for months. I listened to it for many hours. I loved the sound. I thought the lyrics were clever and very smart.

I don’t really care if anyone reads this. This is for my own self-therapy. I came across Prince’s work at a very important time in my life and it influenced my musical tastes for the rest of my life. I never met you. I never had the good fortune of seeing one of your shows. I enjoyed your work and it had a huge impact on me. Thank you.


Sleeves

A screenshot of a negative review left for a Nordiques jersey, with a funny quip: “fix the darn sleeves!


Relocated

I recently relocated for a job to the Bay Area. I’m not going to mention the name of the company, but if you’re clever enough you’ll figure it out. This post is not about my job or company. I’m quite happy with both of these things. This post is about my struggles coping with the move to a new location and the stress that has been placed on my family.

Picking up your roots and moving somewhere else is difficult. Now add a wife, a kid, and two dogs. I was fortunate enough to have movers pack up our belongings and our belongings were shipped across the country. Our vehicle was shipped on a trailer. We were able to just hop on a plane and arrive at our new residence. Despite being afforded many luxuries during the move, it’s been very stressful on us. This is the farthest that we have ever been from western Kentucky (where my wife and I grew up). One of the biggest pain points has been food (believe it or not).

Moving somewhere completely new leaves some of your favorite restaurants behind (unless you’re a restaurant chain only connoisseur, in which case I’m sorry for you). I was somewhat prepared for this eventuality as someone I had interviewed with mentioned that being one of his hardest things to overcome. No matter where you live, there are always a few restaurants that are comforting to you. If that restaurant happens to be a chain, you might be in luck (however, you might not: one of my comfort restaurants is Qdoba and the closest Qdoba is a two hour commute), but more often than not you will lose a staple in your diet. With a heavy population of Asian descendants, there are many of what I consider to be Asian style restaurants. I’m largely okay with this, but it’s difficult in finding one that I like, seeing as how I’m accustomed to the fake American/Chinese food commonly found in Kentucky and Tennessee.

Another large stressor has been the cost of living. I tried, in vain, to prepare myself for this. I created a spreadsheet to try to map out our income and our expenses. I knew that my income tax would increase when moving from a state with no state income tax to a state with state income tax. I came up with an estimate based on some information I could find online. My estimate was wrong, by hundreds of dollars per pay period. Take that with the huge increase in housing (again, I wasn’t blind to this) and you have a recipe for stress. I keep updating that spreadsheet and I’m doing all I can to stay on top of our expenses. We’ll be okay, but the cost of living adjustment has been larger than I planned for and it’s something that’s difficult to wrap your head around.

Then you have the small things that just add up: my vehicle’s registration expired the month we moved, finding a daycare for our son, registering our vehicle, applying for a new license (which also happened to be expiring this December). It was nearly overwhelming. Did you know that if you have purchased a vehicle in the same year you move to California that California will demand a payment based on the taxes of that vehicle you purchased? I did not. I suppose this measure is to crack down on people buying vehicles out of state and bringing them in, but for someone who purchased a vehicle in March/April without any intention of moving to California at that time, it was a pain in the ass (and the wallet).

The one thing I didn’t believe I would experience has been the overwhelming amount of homesickness I have had. I’ve never thought of myself as being attached to the area where I was born and raised or the area where I have lived for the past six years. I’m not sure if I miss the places so much as I miss the people (family and friends), but I have found myself wishing to visit or to call more frequently. We FaceTime with family so they can see Max. I feel as though I actually talk to my family more due to our FaceTime schedule. We have allotted days to particular family members so that everyone has a chance to talk to us and see him. It’s not ideal, but it’s the best of a bad situation. Before we left Nashville, I rarely used FaceTime with family members (some of this was just due to the fact that my dad did not have a smartphone and my grandmother did not have a device capable of FaceTime). After we broke the news to them and after the necessary setup, we started to FaceTime with them and it has been a blessing.

This is not meant to be a complete written capture of my feelings over the past few months. This is me, capturing some of my thoughts.


Broke Down

Monday was one of the most difficult days of my life. Monday was our pack and load date with our movers for our upcoming move. Watching as our lives were packed into nondescript boxes was an emotional experience, especially when they were packing my son’s belongings. My irrational thought was that the movers were packing our life away. They were packing our son away.

It’s surreal to equate your life, your being, to the possessions in your house and to see those possessions stacked like malformed Tetris blocks in a trailer, tied down and prepared for a cross country trip. I just wanted to get out of the house. I was supposed to stay on the premises the entire time to answer questions, but I couldn’t really take it. While watching movers efficiently box our belongings, I wanted them to take time to appreciate what they were packing. Didn’t they know how important those things were? Those toys and toddler clothes?

They didn’t know. And they shouldn’t know. And they shouldn’t care. They have a job to do and they were doing it. I’m glad they were doing it. I can’t imagine how difficult it would have been on me packing our belongings. Sure, the physical aspect of it would be trying. But the mental aspect of it would be brutal. I nearly lost it a few times while packing clothes into a suite case.

The truth is, I needed those movers. I couldn’t have moved out our stuff and held it together. As a matter of fact, every time I enter that empty house and I see that our belongings are missing, I break down and I cry. I broke down yesterday when doing the final walkthrough. I broke down this morning when running in to grab a few things. I’m going to break down tomorrow when going in to get our luggage prepared for our flight on Thursday. This is not regret for taking a job and moving to California; I’m looking forward to our time out there and to my new job (which I consider one of my dream jobs). This is the pain of leaving our first home. This is the pain of leaving Max’s home. This is the pain of realizing that Max won’t have a memory of that house.


Email Addresses

I recently read Evan Ratliff’s post, My wife found my email in the Ashley Madison database. I sort of understand where he is coming from here. No, my email address is not in the Ashley Madison database dump (as far as I know and I have not checked). My email address is, however, frequently used by other Todd Groomses around the country. I receive Lexus maintenance reminders for a Todd Grooms in Florida. I’ve received daycare notices for a Todd Grooms in Illinois. I usually attempt to respond to the sender to let them know that my email address does not belong to the person he or she is trying to reach, but this always feels so odd and so pushy on my part. Do I have an obligation to contact someone if the email seems to be important? Are they listing my email address knowingly to avoid spam in their own inboxes?

I believe there was just a misunderstanding and an error made when recording the email address for the Todd Grooms in Illinois. However, the Todd Grooms in Florida must knowingly give out the wrong email address as he frequently signs me up for newsletters from Lamborghini and Ferrari dealerships as well as boat dealerships. The Todd Grooms in Florida is kind of a jerk. Not only am I getting signed up for newsletters that I do not want, but I have to have this guys seemingly deep pockets flaunted in my face.

This also brings up the question: do we really own our email address? When I receive misplaced email, it almost feels as though someone out there is impersonating me. I sort of feel as though a small part of my identity has been taken away from me. I realize that my main contact address is a Gmail address and that at anytime it can be taken away from me, but I that email address has become apart of my identity. I’ve had it since 2005-2006 (it’s been so long ago, I don’t honestly remember). It’s a surreal feeling realizing that someone can essentially impersonate me or possibly represent me in a context that I do not want or am not aware of. It’s silly and, ultimately, trivial, but it’s something that I think about.


Relying On Experience

I’ve recently been pushing for use of pull requests in our workflow at LunarLincoln. I believe code review to be an important aspect of development and I feel that pull requests promote code review with every feature added. This kind of attention to detail isn’t just for open source projects on Github.

My Bad

There is an issue to opening an, ideally, small pull request for every new feature: inevitably, a new feature will rely on a feature that exists in an open pull request that has not been approved yet. What do we do in this situation? Normally, I would just create my new feature branch from the open pull request branch and work away. I did not do that this time. I had not thought that far ahead. After a few commits on my new feature branch, I realized I needed the work from an open pull request branch. So I did the logical thing and merged. I did not include the --no-commit --no-ff. I unintentionally merged code from an open pull request onto my new feature branch. To make matters worse, I edited the merge commit and royally screwed up my feature branch. So much so that later, I was testing my new feature branch after having merged in the approved pull request, the changes from the approved pull request was missing. Yikes.

My Experience

What was I to do? I had never run into this situation before. My first thought was to create a new branch and manually copy over my changes, then open a pull request for this copied branch. This would surely work, but there were a few commits worth of work (about 8) and that seemed tedious.

After pondering for a bit, I did create a new branch. I then used git’s cherry-pick command to bring over the commits from my fubar’d branch and save face. I had never used the cherry-pick function, but I was aware of its existence from the docs and from previous developer given talks at meet ups. While I didn’t have direct experience with it, I was able to use my indirect experience and solve my problem.


Testing An Ios Jekyll Publishing Workflow With Editorial

After seeing An iPad-Only Workflow for Creating Jekyll Posts , I decided to try my own hand at it.

I purchased Editorial and started accruing workflows. I downloaded a New Jekyll Post workflow and made a few adjustments tailored to my site setup (namely asking for whether or not comments should be enabled and asking for tags). Next I found a Publish Jekyll Post workflow for publishing my posts to my Github repo. While these weren’t perfect, I was able to learn how workflows in Editorial are built and I was able to customize these workflows to be more inline with how I work. I had been looking for a way to publish content to my site given my new Jekyll setup and I had been unhappy with what I had found. I had even contemplated writing my own app to accomplish this task (and I still might), but I think I’ll give this a try for now.


2015 Stanley Cup Playoffs

In preparation for the start of the Stanley Cup Playoffs tonight (that’s hockey for you non hockey people), I’ve been doing a bit of research into the Nashville Predators regular season record against the other teams coming out of the west. It’s important to note that of the eight teams in the playoffs out of the west, five of them come from the Central (the Predators' division), leaving three from the Pacific. The first spot goes to Anaheim with 109 points. The eighth spot goes to Calgary with 97 points. The West was so tight this year that only 12 points separate the 1st seed from the 8th seed. This year’s playoff race felt much tighter than last years (but this could be due to my increased interest with the Predators being smack dab in the middle of the race for the Central division crown; after all, perspective is everything).

Once the playoffs were set, I started thinking about how the predators do not match up too well against any possible matchup that they might have. This curiosity led me down the path of looking at their regular season record against potentail foes.

Predators Regular Season Record Against Western Conference Playoff Teams

Team Record
Anaheim 0-3 (1)
St. Louis 3-2 (1)
Chicago 1-3 (1)
Vancouver 2-1 (1)
Minnesota 2-3
Winnipeg 3-2
Calgary 0-3 (1)
*The number in parenthesis denotes a shootout loss, which are special cases and in my opinion come down to chance.*

First Round

The Predators have drawn the Chicago Blackhawks in the first round. Out of the teams from the Central, the Predators only played Chicago four times (versus five times for the other teams). This has to do with the Western Conference having seven teams in each division (whereas the Eastern Conference has eight teams in each division). During the first loss to the Blackhawks, the Predators started their backup goalie, Carter Hutton and only lost 2-1 in OT. This is a pretty good outcome, especially considering the Predators played this game on the backside of a back-to-back (the frontside being played against Winnipeg). The last loss to the Blackhawks ended with shootout (again, I chalk these up to luck and happenstance and I don’t personally find anything interesting in these losses or wins). If we discard those two games, that leaves the Predators with a 1-1 record (both games in Nashville) against the Blackhawks (a 3-2 win and a 1-3 loss). Both of these games had roughly the same number of shots for and shots against. Nashville had power plays in both games and did not convert on any of them. Nashville had to kill off penalties in both games and did not allow a power play goal in either. Rinne was the starter in both of these games for Nashville. The Blackhawks starting goaltender, Corey Crawford, did not start in either of these games.

Looking at the history, this series seems like a toss up. I think the Blackhawks have the edge (ignoring recent results from both teams). It’s hard to say because the last time these two teams met was in December. The last game between Nashville and Chicago was December 29th. That’s a big deal.

Other Interesting Notes

  • The Predators did not tally a win in the regular season against two playoff teams: the 1st place Anaheim Ducks and the 8th place Calgary Flames (both Pacific Division teams).
  • The Predators did not “earn” a shootout victory against any of the Western Conference playoff teams.
  • Out of the eight playoff teams in the west, two teams ended the season with a losing streak: Nashville ended with a 6-game losing streak (3 of which were to playoff bound teams), while Chicago ended the season with a 4-game losing streak (3 of which were to playoff bound teams).

Closing Arguments

This observation means nothing. It will not foretell who will come out on top in this series. I just found it to be an interesting exercise in prepration for the start of the playoffs tonight. Go Preds.


Make My Day

Lonely Planet recently had another featured app in the iOS App Store: Make My Day. This app is near and dear to my heart. Make My Day was one of the two apps that I worked on during my tenure at LP and was the one app that I worked on from start to finish (the other app that I worked on is slated for release later this year).

From what I can recall, this is the first app that I had a major hand in to be featured in the iOS App Store (Slacker may have been featured, but I cannot recall; additionally, I would not classify the involvement I had as “major”). Being featured is very exciting for me. There are many developers for whom this would not matter or for whom this honor has been bestowed upon many times and has now lost its luster. Not me. I am going to enjoy this. It is another milestone in my career.

If you are inclined, I hope you will check out Make My Day.


Saying Goodbye

I have mixed feelings today. I am excited because I am picking up a new (used, but new to me) vehicle, but sad because I am trading in my 2007 Volkswagen Rabbit.

The commute into work was uneventful and somber. I dropped Max off at his daycare a little earlier than normal. I then started the short drive to my office. I tried to savor every gear shift (for my Rabbit is a manual transmission). I reveled in every red light so that I may have the opportunity to accelerate through quick gear changes again. I tried to shift as smoothly as possible. I take pride in my gear shifting and in my opinion, there are only a few things in this world better than a smooth take off and a smooth gear change.

The Rabbit was my first new car. It was love at first sight. I wanted it since the first advertisement I watched when Volkswagen reintroduced the model in 2006. It served as a very dependable vehicle through long commutes to and from college. It was my escape. I could climb in, find winding roads, and focus on the drive, leaving all my worries behind (if only momentarily). I literally bought the thing right off the truck when it arrived at the dealer. I was the only owner. I was the driver for nearly 116k miles. I have logged many miles behind the wheel and many smiles as well.

You may think it is ridiculous to have such an attachment to a vehicle as I have to my Rabbit. I would argue that you would be the ridiculous one for not having an attachment to your vehicle. Your vehicle is an extension of yourself. Depending on the commute you have, you may spend more time in your car than you do awake at home. It may sound as though I am lamenting the loss of an old friend when I speak of my Rabbit. In truth, I am. Instead of suffering the pain of a something I care about being taken away too soon, I get the opportunity to possibly give someone else a modicum of the enjoyment that I have had behind the wheel of my Rabbit. I hope, in someway, that the owner who eventually purchases my Rabbit sees this. Take care of her. Enjoy the ride.

Goodbye friend.

A picture of my Volkswagen Rabbit.


Pressure is a Choice

While listening to Mark Maron’s interview with the Director Richard Linklater on his WTF podcast, Linklater brought up an interesting mantra: “Pressure is a choice.” Linklater heard this from former University of Texas pitcher Huston Street while filming Inning by Inning. In general, the idea is that everything in our lives is a choice. We choose what we focus on each day. If we can focus on the right things, then everything will fall into place. I feel like I need to change my focus onto things in my control and what I feel is important for my goals. It’s easy to get bogged down in the everyday grind and to focus on the wrong things. I do it everyday.


🔗 Increase Defect Detection with Our Code Review Checklist

An interesting piece from Fog Creek regarding their review process.

I found this link on HackerNews and one of the comments on the story caught my eye:

I don’t believe a code reviewer should even have to know about the requirements of the feature/bug, and should focus more on the design/quality vs. whether it works.

I believe this is a fallacy. This is like saying an editor does not have to understand what he or she is reading as long as he or she is focusing on grammar. Should the editor not be able to ensure that the author is getting his or her point across? Should the reviewer not be able to ensure that the code should functions as intended? If the reviewer does not understand what the code is meant to do, how can he or she understand whether or not something such as a conditional is behaving correctly? That a loop ends at the proper step? While the reviewer may not need to know every implementation detail, the reviewer should have at least a working knowledge of what is expected of the product. I can write nonsensical code that does not cover the requirements for a product that is syntactically valid and even clean. Should the reviewer focus more on the design/quality of code? Sure. I just believe the reviewer should know at least what he or she is reviewing.


Leaving

I have recently accepted a wonderful opportunity to work at LunarLincoln and I will be leaving my position at Lonely Planet, effective December 19th. This comes as a shock to me. I was not actively looking for a new job; I just happened to have stumbled into this serendipitous opportunity and, after a period of deliberation, have decided that the offer is too good to pass up. The founder of LunarLincoln is a good friend of mine and made me a generous offer to come work with friends. It was difficult for me to say “no” to that.

I thank Lonely Planet for everything they have given me: confidence, fond memories, and the chance to work with wonderfully talented developers. I wish everyone there nothing but the best.

With that said, I look forward to beginning my time at LunarLincoln in 2015.

This is Major Todd to Ground Control: I am ready for takeoff.


Growing Pains

I need to stop becoming so frustrated. I need to stop missing moments.


Beginners

I believed that this negative behavior stemmed from arrogance, ignorance, and callousness. After reading the aforementioned article, however, I have switched my line of thought: I now believe this negative behavior stems from a deep insecurity that developers have of being wrong. I believe that we constantly fight to prove our methods (tools, languages, or platforms) are the correct choice. I also believe that this behavior is not necessary and that most developers will eventually grow out of it as though it were a juvenile phase in our adolescence that we will, hopefully, look back upon in embarrassment. I am at the embarrassment stage in my career now. I feel bad for the negative behavior that I exhibited in my development youth. I was not only negative, but borderline belligerent at times. I think this behavior started and manifested itself due to the environment in which I started working. We need to take our environment and who we surround ourselves with into consideration. You eventually become what with which you surround yourself. I am glad that I am starting to surround myself with positivity.


Better Git/Vim Commit Messages

I recently decided that my Git CLI experience would be greatly approved with the aid of spellcheck. Luckily, I stumbled across a post detailing how one can enable spellcheck in Vim (my default editor). Unluckily, it did not work for me with Yosemite’s default version of Vim in Terminal. After struggling with this for a bit, I finally decided to upgrade to the latest version of Vim via Homebrew:

$ brew install vim

After installing the latest version of Vim, I created my ~/.vimrc (I am guessing this is not created by default as I did not see it on my machine) with the following content:

set backspace=2
syntax on
autocmd Filetype gitcommit setlocal spell textwidth=72

The first line enables what I believe to be the correct behavior of the Backspace (Delete on Mac) key: while in insert mode, the character immediately to the left of the cursor is removed and the cursor moves to that position (along with the text shifting to the left). I stumbled across a post indicating that this is not the default behavior in Vim, but it is the behavior I expect.

The second line turns on syntax highlighting. What I found to be unique about this feature is that it will actually highlight your Git commit message in such a way that the “title” of your message is highlighted to indicate when your title is too long (the recommended length, according to Github, is 50 characters). It also helps highlight comments in your commit messages.

The third line is the “money” line. This line enables spellcheck for gitcommit files. This line also includes a nice little extra to wrap our commit message bodies at 72 characters per line, which is the recommended length according to Github.

One other little tidbit I came across is you can use the following to ensure that Git uses your preferred editor (meaning the version of Vim I have installed via Homebrew):

$ git config --global --replace-all core.editor $(which vim) -f

I am not sure if this change is strictly necessary; it may just be belts and suspenders, but I would rather be safe than sorry.

If you want to know more about my setup, be sure to follow along under my Environment section.


Android vs. iPhone Cage Match!

I have been asked to participate in a panel. The panel will be a debate/discussion between mobile developers on which mobile platform is the best. I have been tapped for the iOS side. Leading up to tonight’s event, I have been jotting down my notes on the talking points I was given by my team. I have decided to post my notes for posterity. Each section title will be a question that I was given by the iOS team, followed by my notes. Enjoy.

What Problems with the iOS Platform Still Need to be Addressed?

I find that there are many developer APIs in iOS 8 that do unexpected things or are broken. I believe that Apple could probably use a development cycle to just clean up the platform and make it a bit more robust. I think it’s atrocious that Apple still offers flagship iPhone models with 16GB of storage. I don’t really care about expandable storage, but the fact that the baseline model comes with a paltry 16GB is ridiculous. I can’t recommend that device to anyone. I also feel that it’s time for Apple to increase the amount of RAM found in iPhones. New iPhone models currently come with 1GB of RAM. I honestly don’t see a performance hit from this in day-to-day operation, but there are times when I notice it (mostly when I have had Safari in the background for a while and upon returning to Safari, my open tabs reload since they are no longer in memory).

How Long Would it Take to Become a Competent iOS Developer? An Expert Developer?

I honestly feel that both platforms are fairly equal in the length of time it would take for you to become a competent or expert developer. There are so many great resources out there for both platforms (the developer documentation for each platform is top notch and you can usually always find an answer to your question on Stack Overflow, which has a very active community for both platforms). I think the community behind iOS development is probably larger at this time, but its fairly comparable. I think you can probably become a competent developer for either platform in 2-3 months. You can become an expert developer in a year. The key is to have someone who can review what you write to keep you honest and to ensure that you are observing good coding practices (specifically for that platform).

Where do You See iOS as Superior?

I feel that iOS is superior in a few different areas (although I’ll admit that some of those gaps are closing and some of the ways I feel iOS is superior are purely subjective). These areas are developer tools, the development language/system, user experience, and the camera.

Developer Tools

I feel that the developer tools that Apple provides are still better than the tools provided by Google. I believe Google has closed that gap significantly with Android Studio (IntelliJ users rejoice!). My first Android development experience involved Eclipse and, while Eclipse is what is is, it always felt a bit hackie to me. I feel Google is still lagging behind when it comes to user interface layout. The Interface Builder piece of Xcode is so easy to work with and what you see is pretty much what you get. I think Instruments is far and away better than any of the profiling tools provided to Android developers by Google.

Development Language/System

I believe the iOS development language du jour (Swift or Objective-C) is superior to Java. While language preference is purely subjective, there are some objective features where I feel like the iOS development platform is head and shoulders above the Android development platform. One of those is iOS’s Automatic Reference Counting (ARC) vs Android’s Garbage Collection. Garbage collection is an old idea that Android has implemented. It’s a methodology of reclaiming unused memory. It essentially scans the devices memory and determines which objects are currently being referenced and which objects are not. It then deallocates any objects that are not being referenced to reclaim memory (this is a very elementary example of how garbage collection works, so please forgive its crudeness). The issue with garbage collection is that it’s horribly inefficient. It’s slow (the length of the scan varies depending on the amount of memory in the system and how much of that memory is being used), requires more memory than other systems, and isn’t foolproof (it may be fixed by now, but I once knew of a way to guarantee memory leaks while writing Android code).

iOS has a thing called Automatic Reference Counting. ARC is not garbage collection (and to call it garbage collection is an insult). It’s a clever way of automatically managing your memory. It keeps track of how many references an object has (how many owners). When you reference an object, that object’s retain count increments. When you dereference an object, that object’s retain count decrements. Once an object’s retain count hits zero, it is released or deallocated. It is not foolproof, but it is definitely more efficient and requires less overhead.

User Experience

For my money, the iOS user experience exceeds that of Android’s user experience for the majority of users. On iOS, the only variability in user experience comes from the hardware. If you’re using an older device, your experience can be different than it would be on the latest and greatest hardware. Your experience can vary wildly on Android as you have different hardware manufacturers. Not only can your experience change based on the manufacturer’s build quality or the hardware specifications, but Android manufacturers are also able to “customize” (read: make it shitty) the operating system so that their devices may stand out amongst the numerous other Android devices on the market. You can, of course, install a different Android mod on your device. To me, that can be a bad user experience. I’m going to have a very difficult time explaining the steps of that process or why a person should even attempt to do that. Of course, I realize that one of the features or selling points of Android is the freedom for a more knowledgable user to customize his or her device. My opinion though is that the default experience that most users will have is a bad one. I doubt that first time, non-technical Android buyers are buying Nexus devices. I would guess that those first time, non-technical Android buyers are buying what the Verizon or AT&T sales person is recommending to them, which in many cases is an inferior product. I personally like the experience of stock Android Nexus devices. It’s just a shame that you can’t get that stock Android experience on most devices (it’s also a shame that Google no longer makes a normal sized device.

Camera

The last area where I find that iOS is superior is in the photos and the videos you can take with an iOS device. For my money, the cameras in iPhones produce better quality images than their Android counterparts. Android is closing the gap, but for the longest time I could usually take a look at two pictures (one snapped with an iPhone and one snapped with the leading Android device) and I could identify which one was captured with the iPhone and which one was captured with the Android device. Historically, pictures snapped with Android devices have always looked grainy or cloudy. When I’m at the park with my wife and son and I want to capture a moment, I’m never worried about getting a good shot with my iPhone. I know I’ll get a good shot with my iPhone.

Would You Ever Switch to Android? If So, What Would it Take?

I would possibly switch. I have used Android in the past as my daily driver. I just wasn’t “in love” with it. Certain components of the UI worked just differently enough (and, in my opinion, incorrectly) that it became irksome to use an Android device. I used a Nexus One (yeah, I’m one of the ten people who bought one of those). This was back in the 2.1, 2.2, and 2.3 days (fro-yo for life!). Out of quite a few UX things that irked me, two still stand out in my mind: tap targets and that damn back button.

I never became comfortable with the default Android keyboard (I’m aware I could have installed a third party keyboard, but I’m not a fan of that; I haven’t even installed a third party keyboard in iOS 8). My keyboard theory is that the default iOS keyboard placed the touch targets somewhere below the key view (and these would dynamically resize based on what you were typing). It felt as though the Android keyboard placed the touch targets right on top of the key view. I’ve always heard that when we tap on touch screens that we are actually tapping slightly below where we think we are tapping, so this theory always made the most sense to me.

The back button, in Android, is such a wildcard. What does it do? The simple answer is that it literally takes you back an activity (to use Android terminology). The OS keeps a history stack and as you navigate around your phone, it adds entries to that stack. If you hit the back button, it simply pops the top activity (the one you are currently viewing) off the stack and the activity that is now on top of the stack is the activity you’ll see. I always found this unnerving because if you don’t remember your navigation history, you don’t really have a way of knowing where the back button will take you. iOS always seemed a bit simpler to me. Each app is in control of its own navigation history. You’ll have a back button present if you have views in your history. If you reach the bottom of stack, there is no back button. To leave the app, press the home button.

For whether or not I would switch back to Android: it would really be a matter of Apple dropping the ball on what they have going. In my tastes and in my usage, my allegiance is Apple’s to lose. I’m a bit concerned about the quality of the operating system after some of the huge strides Apple has made in the past two versions of iOS, but, overall, it’s been reliable for me.


[1]: A memory leak is when an allocated object can not be deallocated until the process that owns the object is terminated or the system is restarted (depending on what owns the said object).

[2]: I just want a reasonably sized device and even the 4.7" iPhone 6 feels too large for me.


Ten Years

My ten year high school reunion is scheduled for this Saturday. I am, begrudgingly, attending. Why begrudgingly? It’s none of your stereotypical reasons. I wasn’t bullied in high school. I was relatively well liked. This is before I started spending most of my time in front of a computer screen, so I was fairly social. I actually had a few close friends and was friendly with everyone. The question remains: why am I begrudgingly attending?

At first, I thought my reluctance was rooted in my feeling of separation from my fellow graduates. Out of the approximately eighty students in my graduating class, I regularly talk with two to four of them. I recently deactivated my Facebook account, but even before then I rarely communicated with anyone else. They were doing their thing and I was doing mine. Separation seemed inevitable. We had our own lives to live and I was busy living mine.

Earlier this week, while driving to work and listening to Pink Floyd’s Dark Side of the Moon, I was hit with these lyrics:

You are young and life is long and there is time to kill today

And then one day you find ten years have got behind you

- Lyrics from Pink Floyd’s Time from Dark Side of the Moon

I slowly realized that my reluctance was not from the separation: it is from sadness. We spend most of our childhood after a certain age, looking forward to our high school years. I can remember wishing away my childhood for those four years. Before I realized it, that time was gone. I was heading off to college. With, what in retrospect feels like, a blink of the eye that time, too, quickly passed.


Radar Love

Earlier this year, there was a bit of a kerfuffle regarding filing bugs for Apple’s APIs and whether or not us developers should file them. In the past, I never really took the time to file them. I was either too lazy or assumed that the bug was in my code. I’ve always been pretty skeptical of faulting the tools for faults, but I’ve learned that occasionally we are charged with faulty tools and that this is okay. It’s part of development.

At Lonely Planet, we recently came across a particularly nasty bug that we determined to be an issue with iOS APIs. I created a sample project and filed a bug report with Apple. This is only my second filed bug report. Maybe it’s the newness of it all, but I’m not quite as jaded as some of the other developers out there. I hope I never fall victim to that, but I realize it’s all in context of past experiences.

Whenever I take the time to file a report, it makes me feel as though I am doing something good. I would want someone to file a report with me if I were to have a fault in my code. Why shouldn’t I return the favor?


Speed Kills

America is all about speed. Hot, nasty, badass speed. -Eleanor Roosevelt, 1936

Yesterday was kind of a crummy day. My back hurt. I forgot paperwork for my son that his daycare needed, which led me to me making two trips to his daycare (don’t worry, I picked up some nice coffee along the way). I had to sit in traffic. There were lots of little things that nagged at me yesterday. However, there was one big thing: I didn’t feel as though I accomplished much.

If you were to look at my commit history for yesterday, you might believe that I actually accomplished many things. You’d be mistaken. My commits were jumbled and incoherent. I wasn’t outlining my thoughts. I didn’t have a clear path. I kept hammering on my keyboard and slamming my head into that proverbial wall, but brute force was failing me. After hitting a teeth-gritting breaking point, the quote above came into my head. Here is my full commit message from when I hit that breaking point:

Nasty Commit to Save Work Attempting to add tests to verify that the link -> entity relationship is working correctly; Cleaning up some stringified keys and using NSStringFromSelector instead.

America is all about speed. Hot, nasty, badass speed. -Eleanor Roosevelt, 1936

That commit message makes absolutely no sense (and yes, I actually did include that quote in the message). I was frustrated. That commit touched fourteen files, contained two hundred and seventy-three additions, and disregarded fifty-nine deletions. It was a mess. Quite frankly, I’m ashamed of it.

I have been striving for small, granular commits. I want my commit messages to be concise. If I can fit an adequate description in the title portion of the commit log, that’s even better. This commit was cumbersome. It touched way to many files and made no sense. I can’t even begin to describe what I changed.

Today was much better. My commit history reads like a diary (albeit a confusing diary). I’m improving, but I’m not there yet. I’ve been debating on how I can go about making sense of what I do. Maybe I should keep a diary of what I’ve been working on. This could be beneficial as I encounter problems that seem familiar (Have I encountered these problems before? What did I do last time?) or even help shed light on what I should be doing or the path I should be taking. It would cause me to stop and think about what I’m doing or what I’m trying to accomplish instead of hammering as hard as I can on my keyboard.

Programming!


Man, I Could Really Go for a Starbucks, Y'know?

Idiocracy

I don’t really think we have time for a handjob, Joe.

The older I get, the more sure I become that humanity is devolving. I can only assume that Idiocracy is actually a “futurementary”: a documentary to warn humanity about the dangers of what lies ahead if we continue on our current trajectory.

I have recently been stunned by what we in the technology field choose to spend our time doing and what investors insist upon funding. A recent application received $1.5 million for doing less than current messaging applications. That’s right: an application that does nothing except send a one word message to your friends has raised $1.5 million. The New York Times piece links to a press release announcement from Blonde 2.0 (the self proclaimed world’s leader of digital marketing) which is riddled with mindless drivel that attempts to glorify one of the single worst ideas I’ve ever heard. The press release refers to Yo as “[an] incredibly simple communications app”. The application, as it stands today, literally allows you to send “Yo” to your friends or family. Are you fucking kidding me?

Zoolander: I Feel Like I’m Taking Crazy Pills

The New York Times piece quotes John Borthwick, the Chief Executive of Betaworks (an early backer of Yo), as saying,

We are fascinated by these uses of simple yes/no on/off communications tools. There is no payload in Yo — no pictures, no text, just a deceptively simple on/off state that over time has the potential to become a platform.

I hate to burst your bubble, but there is nothing “deceptively simple” about this platform or this application. I am not stupid. I fucking realize how simple this entire idea is. I’m just at a loss for words that the equivalent of a Facebook poke is being invested in so heavily. It’s shit like this that makes me embarrassed to tell people that I write software.


Defective Mood

As I age, I am perturbed that my mood is directly tied to what I feel that I am either accomplishing or not accomplishing at work or, rather, in software development. I have recently found that I can be quite foul if I encounter a problem in software that I am writing. I encounter many problems that do not affect me, but I have found that the ones that do affect me tend to have the same earmarks: an unfamiliarity with a framework or an API, a misunderstanding of how a framework or API is intended to function, or, my biggest fear, unexplained behavior of a framework or API. I was recently plagued many hours on an issue at work that I feared fell into the latter category.

I have worked with Core Data on many occasions now. We are using it in our project at work. However, I started noticing odd behavior in some of our tests. There were NSManagedObjects that were not updating as expected when importing example server responses. The tests were passing and unexpectedly not passing later. This was bothersome. I ended up stepping backward through our commit history until I narrowed it down to a particular commit (actually, a particular pull request being closed). My first inclination was to expect an issue with our .xcdatamodeld file (the backing of our Core Data model). All of the changes in this commit seemed innocuous enough. We were adding relationships and parameters to objects, but none of them should affect our import logic. After introducing these changes one by one into a detached HEAD state in our repo, I came to a startling conclusion: None of the data model changes actually broke our data import. This was terrifying. I was stumped. My mood was quite foul.

When you’re stymied by a problem, everything is stupid. Your computer is stupid. Your tools are stupid. The language is stupid. The framework causing you grief is stupid. Stackoverflow is stupid. Everything.

With the recommendation of a coworker, I took an early lunch. He rightly pointed out that I needed to step away from the problem. Once you’ve had your head down on a problem for an extended period of time with little progress, you become stuck. I was most definitely stuck. During our lunch break, we actually spit-balled ideas on what the issue might be. We came up with a few theories. I was reenergized. After being back in the office for a bit, my energy was zapped again. All of our theories were bunk.

I went back to the drawing board. Something finally caught my eye. It was a category for one of our NSManagedObjects that was overriding willChangeValueForKey:. I just happened to notice that this method was not calling super. Someone had forgotten to call super. I was vaguely aware that Core Data and MagicalRecord (a library to simplify the Core Data layer that we are using) use these methods for updating relationships. I am much more aware of that now. I added the super call. BOOM. I was back in business.

I believe the frustrating piece of this episode is the concern that something is now broken that had been working and there is no clear stressor at what triggered the issue. After making this fix and verifying the fix, I was elated. Not only had I fixed a particularly nasty defect, but I learned more about Core Data in the process.