Absolutely No Machete Juggling Rod Hilton&#039;s rants about stuff he cares about way too much. http://www.nomachetejuggling.com My StrengthsFinder Results <p>At work, the BigWigs paid for a bunch of employees, including myself, to take the <a href="http://strengths.gallup.com/110440/About-StrengthsFinder-20.aspx">Gallup StrengthsFinder</a> test. This test gives the taker a series of choices between two things that aren&#39;t exactly opposites, and you have to select which one you identify closer with. In the end, the test tells you which of 34 possible strengths are your top 5.</p> <p>I enjoy taking personality tests for fun, but the way that the aforementioned BigWigs were attaching tremendous levels of importance to the results of the test made me a bit weary. Personality tests can often have a horoscope vibe, where they all say something so nice about the taker that everyone who reads it says &quot;yep, that&#39;s me!&quot;.</p> <p>So before the test, I took a look at the 34 possible strengths that the test would identify. I figured they&#39;d all be things I liked, so that when the top 5 were output, the taker would like the results. To my surprise, there were a number of strengths, about 10 of the 34, that I would have been downright irritated if they appeared in my top 5. To an extent that, if the exercise told me any of those 10 were strengths of mine, I&#39;d be able to instantly disqualify the test as bunk.</p> <p>So I took the test with a skeptical eye toward it, but I was actually incredibly surprised by the results. I think the test absolutely nailed me, and I&#39;m so impressed by the accuracy of my test results that I think it&#39;s worth sharing here. These strengths are ranked from strongest to less-strong (I don&#39;t say weakest because it&#39;s only the top 5 of all 34 strengths, so all 5 are very strong).</p> <h1>Strengths</h1> <h2>#1: Analytical</h2> <blockquote> <p>People exceptionally talented in the Analytical theme search for reasons and causes. They have the ability to think about all the factors that might affect a situation.</p> </blockquote> <p>I&#39;m not sure I agree that this is my #1 strength, but it&#39;s definitely very accurate for me. I think this goes hand in hand with the fact that I love being a programmer, and I enjoy debugging code. I&#39;ve never been satisfied with any explanation that something &quot;just is&quot; - I have to understand why something happened or I can&#39;t relax about it. It&#39;s not enough for a stressful production outage to be over, I need to get to the root cause of it. This is true even in the rare instance that there&#39;s nothing I can do about it, and thus get no value out of knowing the cause - the knowledge is the reward for me.</p> <p>I have a tendency to demand people &quot;prove it&quot; when making claims, even believable ones. Similarly, I expect other people to hold me to the same standard - I actually enjoy when I have an explanation for something and friends or co-workers are able to shoot it down. I want to believe as many true things as possible, and disbelieve as many false ones.</p> <p>Nothing is ever noise for me - there&#39;s always some kind of pattern that I want to find in the noise.</p> <h2>#2: Deliberative</h2> <blockquote> <p>People exceptionally talented in the Deliberative theme are best described by the serious care they take in making decisions or choices. They anticipate obstacles.</p> </blockquote> <p>Yep, this is absolutely me. This &quot;strength&quot; is so strong within me that it can often be a weakness, one that I actively try to overcome regularly - I often can get &quot;analysis paralysis&quot;. </p> <p>It takes a great deal of information gathering before I&#39;m willing to make any big decision - I ask an annoyingly large number of questions. This is true even for day-to-day things; the number of questions I asked my realtor when buying my first house actually caused him to become so exasperated that he and I had to part ways.</p> <p>When facing any decision, the first thing I want to know is what the risks are, and I try to plan for every possible outcome. If I don&#39;t feel like I understand the risks of a decision, I often cannot make one.</p> <p>One of the ways I try to address the analysis paralysis weakness is by plowing forward with functional spikes and throwaway code experiments, that way I&#39;m not just stuck reading wikipedia pages or StackOverflow posts. Experimentation is often the best way to acquire real knowledge.</p> <h2>#3: Learner</h2> <blockquote> <p>People exceptionally talented in the Learner theme have a great desire to learn and want to continuously improve. The process of learning, rather than the outcome, excites them.</p> </blockquote> <p>Kind of surprised this one wasn&#39;t higher, though 3 out of 34 is still pretty high. I&#39;ve been accused of being a &quot;perpetual student&quot; on more than one occasion, which is fair since I&#39;ve only been able to last one year after graduating before wanting to go back to school for another degree.</p> <p>I regularly take MOOC classes, attend conferences, and watch talks online. The level of excitement I felt when the company I work for announced that engineers could get free accounts on O&#39;Reilly Safari and Pluralsight is, frankly, embarassing. I read nonfiction constantly, usually jumping between 3 or 4 books at a time, and I consider reading fiction a waste of time because I don&#39;t learn anything while reading, and that time could be better spent learning.</p> <p>One of the things that Gallup says I should try to focus on as an action item as a Learner is:</p> <blockquote> <p>Seek roles that require some form of technical competence. You will enjoy the process of acquiring and maintaining this competence.</p> </blockquote> <p>A-yup, the fact that it&#39;s basically impossible to ever feel &quot;caught up&quot; in this industry is one of my favorite things about it. There&#39;s always stuff to learn, and I love mastering new skills, languages, and technologies.</p> <h2>#4: Intellection</h2> <blockquote> <p>People exceptionally talented in the Intellection theme are characterized by their intellectual activity. They are introspective and appreciate intellectual discussions.</p> </blockquote> <p>Very accurate. One of my favorite pastimes is discussing totally unimportant nerd shit with friends for hours and hours. </p> <p>I like exercising my brain muscles, solving problems, and challenging myself. When I was narrowing down college choices, eventually the deciding factor between my last two options was that I simply wanted to go to the school that I thought would be harder (the one that didn&#39;t offer me a full ride, so I&#39;m still paying for this strength).</p> <p>I&#39;ve often changed my opinions on issues because I challenged myself on some of my beliefs, and tried to reason my way from first principles to a new conclusion, and found myself on the oppsosite side of an issue than my gut reaction was initially.</p> <p>I don&#39;t think the test is telling me I&#39;m &quot;smart&quot;, which would definitely be horoscope territory. But I think you can be dumb and still really enjoy thinking, so I think this description is still fair. </p> <h2>#5: Restorative</h2> <blockquote> <p>People exceptionally talented in the Restorative theme are adept at dealing with problems. They are good at figuring out what is wrong and resolving it.</p> </blockquote> <p>I think this is, in a lot of ways, a natural result of some of the other strengths. As I said before, I love debugging and solving problems. I have a co-worker who is fond of saying that he wouldn&#39;t want to be a murderer if I was the detective assigned to the case.</p> <p>Some of my &quot;action items&quot; for this strength are particularly entertaining to me.</p> <blockquote> <p>Seek roles in which you are paid to solve problems. You might particularly enjoy roles in medicine, consulting, <strong>computer programming</strong>, or customer service, in which your success depends on your ability to restore and resolve.</p> </blockquote> <p>Uh, yeah.</p> <h1>Weaknesses</h1> <p>After taking a class with the guy at work is so gung-ho for this test, he released my full ranking of all 34 strengths. This means I am able to see what my bottom 5 strengths (weaknesses) are.</p> <p>When I saw my bottom 5 weaknesses, I was very happy to discover that they came out of that pool of 10 or so strengths where I&#39;d have dismissed the entire test if it had told me I was strong with one of them.</p> <p>So here they are, in reverse order, meaning starting with my biggest weakness.</p> <h2>#1: Developer</h2> <p>The name of this strength fooled me at first, I was extremely annoyed the test said I shouldn&#39;t be a Developer. But in fact, this is the description:</p> <blockquote> <p>People who are especially talented in the Developer theme recognize and cultivate the potential in others. They spot the signs of each small improvement and derive satisfaction from these improvements.</p> </blockquote> <p>Oh, yeah, that&#39;s me, fine. Really not big on cultivating the potential in others. I won&#39;t try to beat someone else down or something, but I&#39;m much more interested in cultivating the potential in myself than some other bozo. Executive material I am not.</p> <h2>#2: Positivity</h2> <blockquote> <p>People who are especially talented in the Positivity theme have an enthusiasm that is contagious. They are upbeat and can get others excited about what they are going to do.</p> </blockquote> <p>Hah, yep. Not me. I&#39;m almost bummed that &quot;Negativity&quot; isn&#39;t one of the 34 strengths - I guess in a way the Deliberative strength is that - it&#39;s hard to be positive when your main thing trying to figure out the risks of every possible decision.</p> <h2>#3: Includer</h2> <blockquote> <p>People who are especially talented in the Includer theme are accepting of others. They show awareness of those who feel left out, and make an effort to include them.</p> </blockquote> <p>Guilty as charged. I don&#39;t exclude people, but I definitely don&#39;t go out of my way to include anyone. I treat everyone pretty much the same (&#39;Consistency&#39; is my #8) and don&#39;t go out of my way to give anyone special treatment.</p> <h2>#4: Woo</h2> <blockquote> <p>People who are especially talented in the Woo theme love the challenge of meeting new people and winning them over. They derive satisfaction from breaking the ice and making a connection with another person.</p> </blockquote> <p>How is this not my bottom one? I&#39;d be downright offended if this test told me I was good at this. The notion of &quot;winning people over&quot; is about as far from me as you could get.</p> <h2>#5: Empathy</h2> <blockquote> <p>People who are especially talented in the Empathy theme can sense the feelings of other people by imagining themselves in others’ lives or others’ situations.</p> </blockquote> <p>Alright Gallup, I get it. I&#39;m misanthropic as hell. In my defense, I think I&#39;m more personable and enjoyable to be around than a lot of engineers I&#39;ve met. </p> <h1>Conclusions</h1> <p>I really liked this test, and I think it definitely nailed me. Basically the test tells me that I&#39;m doing exactly what I ought to be doing in terms of career choices, which is nice.</p> <p>The book that surrounds this test (and the BigWigs who introduced it at work) put a lot of stock into these results. We&#39;re actually supposed to include our Top 5 in our e-mail signatures, and everyone is supposed to cater how they interact with people to the recipient&#39;s strengths. I&#39;m not entirely sure how I would do such a thing, like what would it mean if I was talking to someone who&#39;s really good at Empathy? Should I talk not about the facts of a task, but of how it makes me feel so they empathize? Weird, pass.</p> <p>One of the things the book and surrounding material pushes though, is playing to your strengths rather than trying to cover your weaknesses. This advice makes sense to me - essentially you want to emphasize the areas where you&#39;re strongest, so I should embrace the fact that I&#39;m an analytical, deliberative, learning, thinking problem-solver and try to make sure that, in my day-to-day work, I&#39;m giving those strengths a chance to shine.</p> <p>There&#39;s also value in knowing your true &quot;lesser strengths&quot;, like the things I got ranked #6-15 for example. Those are truly areas where I am strong, but could be stronger, and it&#39;s worth investing in improvement. My bottom 5, on the other hand, are probably permanently out of reach, so there&#39;s no point in putting myself into a situation where I need to improve my Woo skills, as an example.</p> <p>My #6-15 strengths are:</p> <ul> <li>Futuristic (inspired by the future and what could be)</li> <li>Relator (enjoy close relationships with others)</li> <li>Consistency (treat people the same)</li> <li>Input (like to collect and archive information)</li> <li>Strategic (create alternative ways to succeed)</li> <li>Focus (follow through and stay on track)</li> <li>Achiever (hard worker, likes staying busy)</li> <li>Command (take control of a situation and make decisions)</li> <li>Responsibility (take ownership of what you say you&#39;ll do)</li> <li>Discipline (enjoy routine and structure)</li> </ul> <p>I think this assessment is very fair as well. All ten of those things are things I&#39;m good at, but I could improve, and I definitely understand why they&#39;d be ranked lower than my more-dominant top 5 strengths. <strong>These are all things that there&#39;s value in working on, whereas my bottom 5 are basically a lost cause, so it&#39;s an inefficient use of my time and energy to really focus on them.</strong> It&#39;d be better to focus on my top strengths, and improve my almost-as-strong strengths.</p> <p>Some co-workers who took this test disagreed with the results so strongly that they took it multiple times until they got different results. That makes it even harder to want to actually cater my interactions with people to <em>their</em> strengths. But for me, I think this test absolutely got my number and I think it&#39;s worth doing. The book that goes with this test, <a href="http://www.amazon.com/Strengths-Based-Leadership-Leaders-People/dp/1595620257">Strengths Based Leadership</a>, costs less than 20 and comes with an access code to take the test. I&#39;ve only skimmed the book so I can&#39;t speak to it&#39;s quality, but I definitely recommend taking the test.</p> Sat, 30 Apr 2016 00:00:00 -0600 http://www.nomachetejuggling.com/2016/04/30/strengthsfinder/ http://www.nomachetejuggling.com/2016/04/30/strengthsfinder/ Star Wars Machete Order: Update and FAQ <p>Wow, this <a href="http://www.nomachetejuggling.com/2011/11/11/the-star-wars-saga-suggested-viewing-order/">Machete Order</a> thing got big! After the post first &quot;went viral&quot; and got mentioned on <a href="http://www.wired.com/2012/02/machete-order-star-wars">Wired.com</a>, I started getting around 2,000 visitors to it per day, which I thought was a lot. But then in the months before <em>Star Wars Episode VII: The Force Awakens</em> was released, it blew up like Alderaan, peaking at 50,000 visitors DAILY. This year, over 1.5 million unique users visited the page. <a href="http://www.google.com/trends/explore?hl=en-US&amp;q=machete+order,+cure+for+cancer,+lindsay+lohan+naked&amp;cmpt=q&amp;tz=Etc/GMT%2B5&amp;tz=Etc/GMT%2B5&amp;content=1">It&#39;s been nuts</a>.</p> <p>So let me start out by thanking everyone for liking and spreading the original post - I&#39;m truly floored by how well-received the post was. Considering I wrote a nearly 5,000-word essay on Star Wars, I&#39;m pretty amazed that it was only a handful of times someone told me I was a loser neckbeard who needs to move out of my parents&#39; basement and get a girlfriend (I&#39;m married with a kid by the way). People only called for my public execution a couple times. On the internet, that&#39;s the equivalent of winning an Oscar, so thanks everyone!</p> <table class='image aligncenter' width='646'><tr><td><img src="http://www.nomachetejuggling.com/assets/machete_order_popularity.png" width='640' height='141'/><p class='caption'>Holy shit!</p></td></tr></table> <p>In all seriousness, I&#39;ve had thousands of people tell me I &quot;fixed&quot; Star Wars and made the saga more enjoyable for them. I think this is an unnatural amount of praise - after all, I&#39;m just a guy who watched some movies in the wrong order and skipped one, then wrote down why. I didn&#39;t create fanedits or anything truly difficult like that. But at the same time, the reason I published the post in the first place was that I felt Machete Order &quot;fixed&quot; Star Wars for me personally, allowing me to use the relevant parts of the Prequels to make Return of the Jedi a better movie, so it&#39;s really awesome that so many other people felt similarly. <strong>All joking aside, thank you.</strong></p> <p>Since it&#39;s been about 4 years since the original <a href="http://www.nomachetejuggling.com/2011/11/11/the-star-wars-saga-suggested-viewing-order.html">Machete Order</a> post, and now that Episode VII is out, <strong>I thought I&#39;d post a small update answering a lot of the questions I&#39;ve been asked</strong> and responding to the most common criticisms of Machete Order. <strong>There will be no spoilers of Episode VII here</strong>, though I will be talking about it a bit and I can&#39;t predict what people will post in the comments, so if you haven&#39;t seen it yet, make like a Tauntaun and split.</p> <!--more--> <h1>But Episode I has Maul!</h1> <p><em><strong>&quot;Are you really advocating I never watch Episode I or show it to anyone?&quot;</strong></em></p> <p>Man, no. By far the most common complaint is that I am advocating never watching Episode I, and that&#39;s a shame because it has the best podrace/duel/song/whatever. So let me be perfectly clear, I am not advising anyone to pull their Episode I disc out of their box set and throw it in the garbage. By all means, watch Episode I. Hell, I think Episode I is probably a better movie than Episode II is.</p> <p>The point of Machete Order is not, and has never been, ignoring Episode I because it&#39;s bad. It&#39;s been about skipping it because it&#39;s not relevant to Luke&#39;s journey. Episodes II and III are, because we see how his father falls to the Dark Side, and we see elements of his path that are mirroring his father&#39;s. </p> <table class='image alignright' width='306'><tr><td><img src="http://www.nomachetejuggling.com/assets/fates.jpg" width='300' height='169'/></td></tr></table> <p><strong>By all means, if you like Episode I, watch it.</strong> What I&#39;m advocating though, is watching it sort of like an Anthology film - remember that we&#39;re going to be getting Han Solo origin movies and Boba Fett spinoffs and Rogue One films, and so on, until Disney stops making money off Star Wars. These movies are all going to take place at different times, between different Episodes, or before all of them. If you enjoy or want to share Episode I, I say view it as an Anthology movie, sort of like a prequel to the entire series.</p> <p>In other words, when you&#39;re watching &quot;The Main Saga&quot;, like maybe if you&#39;re doing a Marathon or you&#39;re introducing someone to Star Wars for the first time, watch in Machete Order: IV, V, II, III, VI. When you&#39;re done and that &quot;book&quot; is closed, you can pull in whatever &quot;Anthology&quot; stuff you enjoy, such as the Clone Wars TV shows or movies, the Han Solo spinoff, and Episode I. </p> <p>But for some kind of contiguous viewing experience, I think Episode I should be skipped, because it provides mostly backstory to the Republic itself and political goings-on. This makes it an interesting prequel to the entire saga, but a useless distraction from Luke&#39;s journey. </p> <h1>But Episode I has backstory!</h1> <p><em><strong>&quot;Aren&#39;t parts of Episode I crucial pieces to the story?&quot;</strong></em></p> <p>No, they aren&#39;t. They might be crucial pieces to the Star Wars overall story, but not to Luke&#39;s story, which is the whole point of Machete Order: re-centering the main saga narratively on Luke.</p> <p>Yes Sheldon, <a href="http://www.youtube.com/watch?v=keSFjjhUyVA">Chancellor Valorum is relevant</a> to understanding Palpatine&#39;s rise to power. Yes, Qui-Gon&#39;s belief that Anakin is the chosen one, combined with his untimely demise are very directly responsible to understanding Anakin&#39;s fall. Those make them interesting backstory - but they are <strong>not relevant to Luke&#39;s journey</strong>.</p> <table class='image alignleft' width='306'><tr><td><img src="http://www.nomachetejuggling.com/assets/amidalabeforesenate.jpg" width='300' height='153'/></td></tr></table> <p>People who point this out act like it&#39;s sacrilege to (temporarily, see above!) skip Episode I because it fleshes out the Star Wars universe in various ways. So they might advocate Episodes I, II, III, IV, V, VI, VII, in order. But imagine that Disney releases an Episode 0, all about how Qui-Gon ignored some other ancient Jedi prophecy, and as a result his entire family died or something. This would provide a great understanding of why Qui-Gon is so insistent on training Anakin, and why he passes that burden to Obi-Wan. If someone were to suggest skipping Episode 0, by the logic of Machete Order detractors this would be impossible, because it&#39;s critical in understanding Qui-Gon&#39;s motivations. But skipping it would simply be regular Episode Order that we have now, which is what they&#39;re arguing for. This could go back forever, the exact order being advocated as &quot;correct&quot; is somehow now missing a critical component, because it skips hypothetical &quot;Episode -1&quot; and &quot;Episode -2&quot;.</p> <p>In other words, we don&#39;t really need to know why Qui-Gon is so intent on Anakin being trained or why he believes so strongly in a prophecy that the rest of the council doesn&#39;t seem to care much about. &quot;He just does&quot; is a perfectly fine answer for now, and it would be a perfectly fine answer if Episode 0 existed too. Similarly, we don&#39;t really need to know all of the machinations that led to Anakin embracing to the dark side, &quot;he just does&quot; is perfectly suitable, and in fact I argue that &quot;he lacks proper training&quot; is a far less sympathetic answer than &quot;it&#39;s very seductive&quot;, which is what we&#39;re left with skipping Episode I.</p> <p>All of these movies make references to past events that we don&#39;t ever see on screen. That&#39;s what these big &quot;worldbuilding&quot; movies are all about, and why there&#39;s a whole business for books and comics and video games to support them. We don&#39;t <em>need</em> to see Anakin&#39;s mother becoming a slave (not even in a movie), just like we don&#39;t <em>need</em> to know exactly why Nute Gunray hates Padme so much in Episode II. It&#39;s all backstory and fleshes things out a bit, but it&#39;s not critical, your mind fills in the gaps, makes educated guesses, and so on.</p> <p>Bear in mind, people happily enjoyed Star Wars without ANY of the prequels for sixteen years, and nothing that happened in the original trilogy left some kind of gaping unanswered question in the minds of the audience. So really, since the whole point of Machete Order is refocusing the story on Luke, claiming that any part of the prequels is truly <strong>necessary</strong> is a bit of a hard sell. I argue that Episodes II and III make Luke&#39;s story more enjoyable to watch in VI, but <em>crucial</em>? As in, unable to be understood without them? Nah.</p> <h1>But the prequels aren&#39;t that bad!</h1> <p><em><strong>&quot;I grew up with the prequels and they&#39;re not as bad as you think! You&#39;re blinded by nostalgia for the originals!&quot;</strong></em></p> <p>I had no idea what a huge population there was of Prequel fans, people who were born in the 90&#39;s and grew up watching the prequel trilogy and love them. Many people even claim Episode I is their favorite, or their favorite character is Jar-Jar. These people are not trolls, they genuinely love these movies. In fact they claim that the only reason that myself and others dislike the prequels is because our own nostalgia for the original trilogy blinds us to their flaws.</p> <p>First, a bit of an admission: I am not a huge Star Wars <a href="https://www.washingtonpost.com/lifestyle/in-what-order-should-you-watch-the-star-wars-movies/2015/12/09/25e96e88-9cf8-11e5-a3c5-c77f2cc5a43c_story.html">&quot;superfan&quot;</a>; I&#39;m just a movie geek. If I was some kind of rabid Star Wars fanboy, I would imagine I&#39;d consider it borderline blasphemous to advocate skipping an entire film in the Gospel of Star Wars. But as a movie nerd, I&#39;m more than happy to make whatever adjustments I think make for a better film-watching experience, because Star Wars is just a bunch of movies to me. I skip Godfather III and The Incredible Hulk too. They&#39;re just movies.</p> <p>So, here&#39;s my big secret: <em>I did not grow up watching Star Wars</em>. In fact, whenever I saw clips or images from the movies, I thought they looked boring (it looked like they mostly took place in the desert), and I skipped them. I liked parody movies, so I watched Spaceballs instead (a bunch). It was not until I was a senior in high school that my older sister discovered I still hadn&#39;t seen any Star Wars movies, and insisted I watch them. This was in 1999. To reiterate: <strong>I saw Episodes IV, V, VI, and I all for the first time, the same year, when I was seventeen.</strong></p> <table class='image alignright' width='306'><tr><td><img src="http://www.nomachetejuggling.com/assets/spaceballs.jpg" width='300' height='169'/><p class='caption'>My Star Wars</p></td></tr></table> <p>As a result, I can confidently say that I am not blinded by nostalgia for the original trilogy - they played no role in my childhood. I saw Episode I almost immediately after seeing the original trilogy, and I feel totally justified in saying that the prequel trilogy films, every single one of them, is vastly inferior to the original trilogy entries. I think my opinion here is pretty much objective - in fact I think the younger crowd talking about the greatness of the prequels are the ones blinded by their nostalgia.</p> <p>Further, the very first versions of the original trilogy I saw were the Special Editions, because that&#39;s what was available on VHS at the local video store at the time. Han never shot first for me. A cartoon Jabba always talked to Han after Greedo, Jabba&#39;s palace has always had an extended dance number, and the entire galaxy (not just Ewoks) always celebrated the fall of the Empire, at least for me. I didn&#39;t see the &quot;Despecialized&quot; versions until years and years later, and so I can once again confidently say, with total objectivity, that they are better than the special editions. The improved special effects for Cloud City and some matte improvements are welcome, but otherwise the Special Editions make the movies worse.</p> <p>Look, you can like or even love the prequels, and I totally understand why you might if you grew up watching them. But really, they are dreadfully bad movies, as far as movies go. Frankly I also think Return of the Jedi isn&#39;t a very good movie either, it&#39;s a mediocre movie that&#39;s elevated by having stellar <em>moments</em>. But all three of them are parsecs better than all of the prequels (yes, even III, &quot;the good one&quot;).</p> <p>It doesn&#39;t make the prequels genuinely good movies just because you liked them when you were a kid. Kids are completely capable of loving terrible movies. Kids are stupid. When I was a kid, I thought the two best movies in the world were Back to the Future and Superman III. Turns out, one of them is genuinely good, and one of them is actually dog shit.</p> <p>I am officially completely dismissing outright any criticism that my dislike for the prequels is because of my nostalgic childhood affection for the originals. I have no such childhood affection, and the prequels are dreck. Sorry.</p> <h1>What About Force Lightning?</h1> <p><em><strong>&quot;Doesn&#39;t Machete Order ruin the surprise that Emperor Palpatine can shoot lightning?&quot;</strong></em></p> <p>Yep, sure does. This was something I hadn&#39;t realized before, and was pointed out to me by a commenter. But indeed, if you&#39;re watching the original trilogy, the first time Palpatine starts electrocuting Luke, it&#39;s quite a shock (har har). </p> <p>With Machete Order, this surprise happens when Count Dooku just casually does it in Episode II. It&#39;s a real shame because it doesn&#39;t have the emotional or narrative impact here. I have no real defense for this, and I actually now consider it Machete Order&#39;s greatest flaw.</p> <table class='image alignleft' width='306'><tr><td><img src="http://www.nomachetejuggling.com/assets/forcelightning.jpg" width='300' height='155'/></td></tr></table> <p>I kind of always thought the lightning wasn&#39;t a &quot;Sith power&quot; so much as something that Palpatine could do because he&#39;s so incredibly fucking evil. But no, the prequels make it clear this is just one of the video game powers you get by embracing the darkside, and they just do it willy nilly all over the place. Apparently you can just absorb it with a lightsaber if you have one handy, or without one if you&#39;re Yoda (hint to Luke, don&#39;t throw your lightsaber away, it has a +2 against Force Lightning!)</p> <p>It&#39;s even kind of annoying that this is typically referred to as &quot;force lightning&quot; now, like it&#39;s some kind of standard-issue thing you learn in Graduate Level Sith Academy before you get your diploma. I think it was better when it was just &quot;that evil scary crazy lightning shit The Emperor does out of nowhere.&quot; But alas, the prequels ruined this (have I mentioned that they suck?) and Machete Order is unable to fix it. </p> <p>The only way to preserve this twist is to simply move Episode VI two movies earlier, which is effectively just Release Order (IV, V, VI, I, II, III). I like the lightning surprise a lot but I think overall it&#39;s worth giving it up in order to make the final confrontation between the Emperor, Vader, and Luke more enjoyable by watching II and III first.</p> <p>The best defense I can offer is that there&#39;s basically no way to preserve this twist without moving the &quot;Luke and Leia are twins&quot; surprise back to Episode VI. And as I&#39;ve pointed out elsewhere, it actually works far better at the end of III, when the audience has no idea they are related, but does know who they are (by watching IV and V before it). So in a sense, you kind of have to choose if you want an effective twin twist or an effective lightning twist, and I personally choose the twins.</p> <h1>Where Does Episode VII fit?</h1> <p><em><strong>&quot;Now that The Force Awakens is out, how does it fit in Machete Order?&quot;</strong></em></p> <p>It&#39;s amazing how often I&#39;ve been asked this. I was even getting asked this question before I&#39;d seen the movie, in the form of &quot;now that (spoiler), where does it fit with Machete Order!?&quot; so thanks for that.</p> <p>But I could have answered this question before even seeing Episode VII, and now that I&#39;ve seen it I&#39;m just as confident in my answer. <strong>It goes after</strong>. </p> <p>IV, V, II, III, VI, VII.</p> <p>The Force Awakens is a continuation of the story, and without giving any spoilers away, having now seen the film I&#39;m confident the entire sequel trilogy is going to be viewable as a continuation or epilogue to Luke&#39;s Journey. Thus it is even more appropriate than ever to refocus the first part of the saga, Luke&#39;s adventure as a young man, by framing Episodes II and III within the narrative as relevant to Luke&#39;s own temptations. </p> <p>Clone Wars, Episode I, Rogue Squadron, Young Han Solo, The Adventures of Yoda, Boba Fett&#39;s Big Day, and whatever other movies come out that aren&#39;t part of the numerical &quot;Episode&quot; structure, can all pretty much be viewed in any order, as supplemental material outside of the &quot;main saga&quot; which I suggest viewing in the above order. Before watching any of those movies, you just say &quot;this takes place between X and Y&quot; and you&#39;re done. I don&#39;t imagine Episode 7, or even Episode 9 will be the last Star Wars Episode that Disney releases, either. It&#39;s entirely possible that the Episodes 10-12 &quot;trilogy&quot; will be a completely separate thing, but for now it seems clear that going forward my position is going to be:</p> <p>IV, V, II, III, VI, VII, VIII, IX, X, XI, XII...</p> <table class='image alignright' width='306'><tr><td><img src="http://www.nomachetejuggling.com/assets/lukemad.jpg" width='300' height='200'/></td></tr></table> <p>Now, all of that being said, while watching Episode VII I was struck by the way that certain parts and characters of the original trilogy had become &quot;legend&quot;. The movie&#39;s final shot is pretty big tie-in to one of those legends, so I think another interesting Star Wars order would be (contingent upon what happens in VIII and IX): 7, 4, 5, 6, 8, 9. I wouldn&#39;t bother inserting the prequels at all there. Again, who knows what&#39;s in store, but the way a particular character is framed throughout The Force Awakens I have a hunch that order might be fun someday.</p> <p>In any case, for the time being my answer is: watch Star Wars in Machete Order (4, 5, 2, 3, 6), and then watch all subsequent episodes in the order they&#39;re released, because they are both in episode order and chronological order, so there&#39;s no reason to play musical chairs with them. </p> <h1>But What If The Next One...?</h1> <p><em><strong>&quot;What if Episode VIII reveals that (spoiler)?&quot;</strong></em></p> <p>There&#39;s lots of speculation in the wake of Episode VII&#39;s release. There&#39;s a <a href="http://moviepilot.com/posts/3691694">particular piece of speculation</a> that I personally am not dismissing at all, which would present a bit of a problem for Machete Order if it turns out to be true. Basically, if any of these Star Wars movies come out and have something happen that will basically make <em>no sense</em> unless you&#39;ve seen Episode I, Machete Order is bunk. But I think that&#39;s very unlikely to happen, Disney is trying to capture a new audience, even Episode VII is largely watchable even if you&#39;ve never seen any of the previous movies. Hell, any one of the Star Wars films works without any other Episodes - the whole point of the opening crawls is that they harken back to the days of Flash Gordon and Buck Rogers serials where people would permanently miss episodes and need summaries to be caught up.</p> <table class='image alignleft' width='306'><tr><td><img src="http://www.nomachetejuggling.com/assets/serkis.jpg" width='300' height='186'/></td></tr></table> <p>Is it possible that Episodes VIII or IX would contain some revelations or twists that would be more enjoyable if you&#39;ve seen Episode I? Yeah, completely possible, but I doubt anything will make Episode I required viewing. So I&#39;m still confident in saying, even if you&#39;re watching Star Wars films in preparation to watch entries in the sequel trilogy, Episode I can still be skipped.</p> <p>Besides, <a href="http://www.ew.com/article/2015/11/30/jar-jar-binks-fan-theory-jj-abrams">&quot;Darth Jar Jar&quot; was dismissed by J.J. Abrams</a> so <strong>I think Machete Order is safe</strong>.</p> <h1>Did you like Episode VII?</h1> <p><em><strong>&quot;What did you think of The Force Awakens?&quot;</strong></em></p> <p>I&#39;m surprised people care what I think of the movie itself. I may publish a full review on another movie blog I run, but let me summarize with: <strong>it&#39;s fine</strong>. I think it&#39;s generally pretty forgettable like most of J.J. Abrams&#39;s movies, and I think like all his other movies, the more you think about what happens in it, the less sense it makes.</p> <p>But I&#39;m also reserving judgment until the other episodes are released. Lots of things that seem like huge coincidences or plot holes could easily be addressed and explained in subsequent films. It&#39;s certainly the best movie J.J. has ever made, and it&#39;s definitely better than the prequels, at the very least in terms of technicals.</p> <p>Aesthetically and tonally, it&#39;s much more similar to the original trilogy than it is to the prequel trilogy, and I&#39;d argue far closer to the originals than the prequels were themselves. It &quot;feels like Star Wars&quot; though I think a big part of that is that it leans so heavily on the original films that one could easily mount an argument that it&#39;s a soft reboot. I&#39;m certainly not the first to point out how much it borrows from the prior films, and I think it&#39;s a legitimate criticism.</p> <table class='image alignright' width='306'><tr><td><img src="http://www.nomachetejuggling.com/assets/kyloren.jpg" width='300' height='188'/></td></tr></table> <p>In a lot of ways, Episode VII is a highly cynical piece of marketed, productized material. For all their faults, you can tell that the prequel trilogy films existed because George Lucas had a story that he really wanted to tell. Episode VII didn&#39;t give me that feeling, it didn&#39;t come off like a movie that was dying to get out of the creative mind of an auteur. It felt like a product that had been assembled and expertly directed by a committee of very smart businesspeople. It was naked and transparent in its intentions and its methodologies, pulling the strings to elicit an almost impossible-to-avoid sense of joy in the audience.</p> <p>None of this is to say it&#39;s bad - far from it. I, the puppet, was able to look up and see all of the strings attached to me, and notice as they were pulled and prodded. I rolled my eyes, knowing exactly what my puppet masters were doing and why. But it didn&#39;t change the fact that the puppet masters were <em>successful</em> in eliciting the desired movements from me. <strong>They forced me to feel joy, I was aware that it was being forced, but I felt it nonetheless</strong>. </p> <p>I enjoyed the hell out of Episode VII and I consider it an extremely good but flawed movie, a quality &quot;Star Wars Sequel&quot; like Return of the Jedi, that manages to be a good franchise entry but not an &quot;excellent film&quot; on its own in the way that Empire Strikes Back and the original Star Wars are. Like Die Hard is a classic piece of near-perfect filmmaking, it belongs in the pantheon of great films for all time. Die Hard 3 is a really good Die Hard sequel, but it&#39;s not a timeless classic like Die Hard. Same deal for Return of the Jedi and The Force Awakens - great entries in their franchises, but not Top 100 Films of all Time material.</p> <p>In any case, I&#39;m definitely looking forward to Episode VIII. I think the franchise is in good hands and, made-by-committee or not, there&#39;s a level of consistent quality that makes me confident in future installments. I hope that Episode VII got all of the placating fanservice out of the way and calmed everyone&#39;s fears about the upcoming slate of movies, so now they can focus on just telling interesting, original stories set in the Star Wars universe, and I think that&#39;s relatively likely (fingers crossed).</p> <h1>Other Stuff</h1> <p>Those are all the questions I get regularly. I think I&#39;ll update this one post with new questions I get in the future, so that my poor little Software Engineering blog doesn&#39;t turn into Star Wars Central or something. If you have other criticisms of Machete Order or other questions, feel free to leave a comment. I&#39;ve gotten over 1,000 comments on the original post, and I read them all.</p> <p>And again, thank you to everyone who made Machete Order blow up all over the place. I&#39;ve been on the radio multiple times and <a href="http://www.npr.org/2014/03/20/291977042/theres-more-than-one-way-to-watch-star-wars">NPR</a>, and had articles that mention me by name published in <a href="http://www.nydailynews.com/entertainment/movies/star-wars-fans-debate-movie-marathon-viewing-order-article-1.2454281">New York Daily News</a>, <a href="https://www.washingtonpost.com/lifestyle/in-what-order-should-you-watch-the-star-wars-movies/2015/12/09/25e96e88-9cf8-11e5-a3c5-c77f2cc5a43c_story.html">Washington Post</a>, and <a href="http://www.cnn.com/2015/12/08/entertainment/star-wars-machete-order/">CNN</a>. The order has been mentioned on <a href="https://www.youtube.com/watch?v=effD1u4oCRE">King of the Nerds</a>, <a href="https://www.youtube.com/watch?v=keSFjjhUyVA">The Big Bang Theory</a> and <a href="https://www.youtube.com/watch?v=XP0F1eKJZ3s">Late Night with Seth Meyers</a> by one of my favorite comedians, Patton Oswalt. As far as 15 minutes of fame go, it&#39;s been a real blast, and I have everyone who saw the post and shared it to thank.</p> <p>May the Force be with you, always.</p> Mon, 28 Dec 2015 00:00:00 -0700 http://www.nomachetejuggling.com/2015/12/28/machete-order-update-and-faq/ http://www.nomachetejuggling.com/2015/12/28/machete-order-update-and-faq/ PhD Status Report <p>It&#39;s been a long time since I posted about how school is going, and I figured the folks who read my blog (all two of you, hi Mom!) might be curious.</p> <p>Since the end of my Spring 2013 semester, I&#39;ve been in &quot;Research Phase&quot;. This means I&#39;m finished with classwork and have been working on my research project. It&#39;s been a little over two years now, so here&#39;s what has happened.</p> <h1>Picking a Project</h1> <p>About two years ago, I started working with my advisor trying to figure out what area my research would be in. I&#39;ve always had a fascination with Genetic Algorithms and Metaheuristics, so I knew I wanted to do something involving that subfield. Two of my projects at school utilized Genetic Algorithms, and I had a lot of experience in the area.</p> <p>I went back to school to primarily focus on CS Theory &amp; Algorithms, but I knew my biggest strength was Software Engineering. In other words, I like theory, but I&#39;m not sure I&#39;m a real theoretician, and I wanted to play to my strengths a bit. This meant I wanted to be writing real, working code, rather than proofs. If I wound up proving anything interesting, that&#39;d be great, but I didn&#39;t want that to be part of my critical path to completing my PhD. Lots of CS PhD&#39;s go off with a white board and paper and output some amazing results, but I knew that wasn&#39;t going to be me.</p> <p>My first idea was to build some kind of framework for comparing different metaheuristics. I&#39;ve worked extensively with Genetic Algorithms but that&#39;s just one of an entire class of Metaheuristics. I had no experience with things like Swarm algorithms, Ant Colony System optimization, Tabu search, Simulated Anealing, and so on. I thought it would be interesting to pick some known optimization problems like Traveling Salesman using <a href="http://comopt.ifi.uni-heidelberg.de/software/TSPLIB95/">TSPLIB</a>, code various &#39;solvers&#39; using different techniques, and compare their performances.</p> <p>I started building out the project, codenaming it <code>judy</code> (because it was like a judge, ha ha. My advisor hated this name and told me to change it.) Unfortunately, while doing a literature review in this area I discovered that it&#39;s more or less accepted that all metaheuristics have a similar level of effectiveness.</p> <p>The more I researched, the more I realized that this would probably not be a valuable contribution to the the field. It was becoming very clear that this project wasn&#39;t well-formulated, and wasn&#39;t going to be successful. I hadn&#39;t spent very long on it, building out some parts of Judy but not much more. I needed to pick a different project, but I was still very interested in Metaheuristics, so I knew I wanted it to be closely related.</p> <h1>Course Correction: Picking a Similar But Different Project</h1> <p>I had already built out some parts of Judy by this point and had some pretty promising software. In fact the <a href="https://github.com/rodhilton/metaheuristics-engine">metaheuristics-engine</a> I had been building was a pretty nifty generic simulator for metaheuristic algorithms. I&#39;d used my skills as a software engineer to build a few interfaces that were easy to implement and then dump directly into a simulator that would scale out for however many processors were on a machine, handle as much of the metaheuristic algorithm in parallel as possible, and do various neat things like safe-journaling results (so that an interrupted simulation could resume). Thus, writing new metaheuristic implementations to search problem spaces would be really easy and fun.</p> <p>I wanted to use this software because I enjoyed building it, and I thought it would be cool to enhance the capabilities of my metaheuristic engine as a side-artifact of my research. I had also started building out a taxonomy of metaheuristics and how they were related in terms of object-oriented relationships (for example, a <code>GeneticAlgorithm</code> was a type of <code>EvolutionaryAlgorithm</code> in a formally-defined way, because one extended the other polymorphically).</p> <p>I went to another professor, the one who taught the classes where my projects utilized Genetic Algorithms. I knew she had a whole bag of interesting problems to solve, and I wondered if I could use my simulator to find solutions.</p> <p>Basically all of her problems were existence questions. Things like, does there exist a graph $$G$$ such that $$Y$$, with $$Y$$ being a variety of different restrictions. She&#39;d posed a similar problem before, which was the motivator behind <a href="https://speakerdeck.com/rodhilton/rectangle-visibility-and-elusive-k23">my project in her Graph Theory class</a>.</p> <p>Most of these graphs would have their existence proven not by formal proof, but by construction. Meaning, if I could construct a particular kind of graph, that graph itself would be the interesting result (and not necessarily how I derived it). My idea was, for each of her problems, I would figure out a way to randomly generate potential solutions, a way to score solutions in terms of how close they are to the ideal, and a way to mutate or perform crossover mutation with candidate solutions. I&#39;d write code for the problems, use/enhance my simulator, and then run the simulation on our ultrapowerful university computer across hundreds of threads.</p> <p>When I took on this project, <strong>I knew that it was high-risk/high-reward</strong>. For every problem I was working on, it was entirely possible that the solution I was looking for does not exist (remember, the only proofs possible are via construction). I also knew it was possible that even if it exists, my strategy might not find it, or that my approach might get stuck in local optima. In other words - I was essentially applying a technique intended for discovering SUBOPTIMAL results to optimization problems, hoping that that the threshold for optimality would be low enough that the technique could work.</p> <p>It&#39;s been two years since I started this project. In that time, I have been working on three different particular problems, growing my metaheuristics solution engine, and heavily taxing the resources on the university parallel computation platform.</p> <p>The first problem I worked on has been running for the longest time. Since this was a continuation of my project in my advisor&#39;s Graph Theory class, I simply adapted it to used my new and improved simulator, and put it up on our university multiprocessor machine. I&#39;m not going to bore you with the details but basically I&#39;ve been trying to find a particular graph configuration with certain restrictions, to see if a complete graph of a certain size exists. Since I&#39;m looking for a complete graph, the &#39;fitness&#39; criteria is simply, how many edges my best solution has, out of a possible $$\frac{n(n-1)}{2}$$ edges. About a year ago (after running for a year), my software managed to get ONE edge away from the desired answer. As of this writing, it is still one edge away from the solution I&#39;m trying to discover, which seems to be the best it can do (205,949,225 generations). Unfortunately this is not an interesting or publishable result unless I can uncover that one missing edge. It&#39;s always possible that the software will find the correct solution tomorrow, but I think at this point I need to admit this is a dead-end.</p> <p>I&#39;ve worked on two other problems but of those, I&#39;ve spent about 95% of my time on just one of them. This particular problem (again, I&#39;ll spare the details) is one that&#39;s been plaguing my advisor herself for over twenty years. I vividly recall one day in Algorithms class when she told the class that, if someone can discover particular graph with a specific set of properties, &quot;I&#39;ll give you a PhD right there.&quot; It was this problem I chose to work on for most of these last two years.</p> <p>Again, this too was a high-risk/high-reward project. My advisor and I joked that the entire publication that results from this effort would be a couple pages about the background and the reason for wanting to know if this graph exists, and the entire results section would be a single page - a listing and rendering of the graph. If I had found a result, there&#39;s no question that a paper about it would be accepted in virtually any CS journal I sent it to.</p> <p>But once again, I&#39;ve been working on this project for a little over two years now. I recognize that it seems early to give up&#39;&#39; given that it&#39;s been plaguing my professor for decades, but she&#39;s been trying to construct the graph by hand and my goal was to use the metaheuristics to perform a guided search of the solution space computationally. In the end though, I&#39;ve become convinced after two years of working on this that either the solution doesn&#39;t exist, or that it does exist but my technique will not discover it.</p> <h1>Walking Away</h1> <p>This past semester my wife and I found out that we were going to be having a baby girl in April. Very suddenly, I started to evaluate the relative importance of my degree. It started to feel very stupid to be working on a series of high-risk/high-reward research projects where nothing had panned out in two years. These problems were unbounded in every sense - my simulations might discover a solution after a day, a week, a year, ten years, a thousand years, or never. I started to become increasingly uncomfortable with the notion of continuing down a path of research so open-ended, with the possibility that I was programmatically searching for solutions that may not even exist.</p> <p>When I first decided to go back to school, I did it for fun. I enjoyed my Master&#39;s research and wanted to continue learning and educating myself, and I liked the idea of pursuing a Doctorate. At the time, I told myself and my wife that, since I was doing it for fun and not for any professional reason, that I&#39;d stop the instant it stopped being fun. Well, after two years of research that wasn&#39;t panning out, school had certainly stopped being fun for me. In fact, it&#39;s been a source of constant stress and irritation. I&#39;ve been working very hard and building some really cool software, but I have no interesting results to show for it.</p> <p>The analogy I used to describe how I was feeling to my wife was, it was as if I saw people mountain climbing and I thought it looked really fun, and I wanted to do it as well. So I spent a great deal of time and money taking mountainclimbing classes. Then I began researching mountainclimbing gear and spending a great deal of money on equipment. I planned and scheduled flights to various mountain ranges. Then I finally started climbing mountains and realized &quot;you know what? This sucks. I&#39;m really cold, and this isn&#39;t fun at all.&quot; But because I&#39;d spent so much time and money on it, I felt like I had to keep going even though I hated it it, falling victim to the sunk cost fallacy.</p> <p>After a great deal of thought I decided I would walk away from the PhD altogether. This was not an easy decision, given how much work I&#39;d put into things like the GREs, classes (straight A&#39;s), and passing my preliminary exams. But after two years and nothing publishable to show for all my research work, with a baby on the way, I felt like I needed to re-prioritize and know when to fold &#39;em, so to speak.</p> <h1>...Or Not?</h1> <p>I scheduled a meeting with my advisor to discuss my departure from the program. I was all set to walk away, and in fact had written the entire above portion of this blog post. I had basically accepted that I was done, I killed the processes on the university supercomputer, and moved a ton of books and articles out of my to-read list on Goodreads. Washing my hands of the project and admitting I was no longer pursuing it was extremely liberating - I felt like a huge burden had been lifted simply by shutting down the effort. </p> <p>But then I realized something. My main motivator for coming back to school was how much I enjoyed my Master&#39;s Thesis research, and that I wanted to do more. I had thought that I must love research, and wanted to continue it. The past two years made me realize I didn&#39;t actually enjoy research as much as I thought - a fact that I had trouble coalescing with how much I enjoyed my Master&#39;s research.</p> <p>A few weeks ago, the author of <a href="http://smile.amazon.com/Beyond-Legacy-Code-Practices-Software/dp/1680500791?sa-no-redirect=1">Beyond Legacy Code</a> contacted me to say he referenced my Master&#39;s thesis in his book. He praised my effort, talking about how much he enjoyed it and how he felt it was one of the better entries he&#39;s come across. It made me look back at my thesis and remember how much I enjoyed working on it.</p> <p>Then it dawned on me. Was it possible that it wasn&#39;t the research I enjoyed at the time, but the actual subject? If it was the subject, then would a research project more inline with my Master&#39;s appeal to me more? I had come back to school for Theory &amp; Algorithms, and I was so laser-focused on those subjects that it hadn&#39;t occured to me that I might enjoy classes in these topics but <em>not</em> research. Would I enjoy a research project if it were focused on Software Engineering, like my Master&#39;s?</p> <p>Pondering this for a few more days, I suddenly had a new idea for a research project. This was something much more Software Engineering-focused than what I had been working on - in fact it wasn&#39;t related to CS Theory at all. It was more of a natural continuation of my Master&#39;s work, and I was stunned by how <strong>excited</strong> I was by the idea. I once again felt the passion of wanting to complete my PhD, reinvigorated by this new project. My wife commented that she hadn&#39;t seen me this excited about research in the entire two years I&#39;d been working on my metaheuristics project.</p> <p>Of course, there have been some logistical issues. Since I went back to school primarily to focus on Theory, nearly every class I&#39;ve taken has been theory-heavy. Due to this, every single professor I&#39;ve met or worked with has been a theory professor, not a single one of them is experienced, or even interested in Software Engineering research. </p> <p>The meeting with my advisor, which I had originally scheduled to tell her I was dropping out of the program, went very differently. I had come up with the new project and done some publication searching all between scheduling the advising meeting and actually having it. So when I walked into her office, I presented her with my new project idea.</p> <p>I expected her to hate the idea since it&#39;s so unrelated to theory. Instead, her reaction was basically, if I&#39;m passionate about the project she&#39;ll help in any way she can. She doesn&#39;t have a lot of experience with Software Engineering but I don&#39;t think I need a lot of help with the topic - this is what I know best. </p> <p>So that&#39;s my status update. Baby on the way, feeling a strong desire/pressure to finish this PhD quickly, and basically starting over entirely in the research. Reading it back, it seems downright idiotic, but I feel extremely excited about my new project, and for some reason I don&#39;t feel worried.</p> <p>I still feel the same way about the program - this is something I&#39;m doing for fun, and the instant I&#39;m miserable in the program I will walk away. But if there&#39;s any path that ends with me actually completing this degree, I feel like I&#39;m finally on it.</p> <p>The next update about school will either be announcing that I&#39;ve completed my dissertation and am graduating, or that I&#39;ve decided to walk away from the program for good.</p> <h2>TL;DR</h2> <p>Too rambly but you still sort of care? Here it is in a nutshell:</p> <blockquote> <p>I decided the research project I&#39;ve been working on for two years was a dead-end. I almost decided to walk away from the program entirely, but instead have started over with a radically different project to give it one last shot before calling it quits.</p> </blockquote> Fri, 13 Nov 2015 00:00:00 -0700 http://www.nomachetejuggling.com/2015/11/13/phd-research-status-report/ http://www.nomachetejuggling.com/2015/11/13/phd-research-status-report/ Testing Against Template Renders in Grails <p>I work with Grails a lot and while I really enjoy it for the most part, there are definitely some weird quirks of the framework.</p> <p>One such quirk is something I encounter whenever I want to write unit tests against grails controller methods that render out templates directly. This isn&#39;t something I do very often - generally I prefer rendering out JSON and parsing it with client-JS - but in some cases when there&#39;s a lot of markup for a page element that you want to be updateable via ajax, it makes sense to render out a template like <code>render(template: &#39;somePartial&#39;)</code> directly from a controller method.</p> <p>Unfortunately, these kinds of methods are very difficult to write tests against. While a normal render exposes a <code>model</code> and <code>view</code> variable that you can test against, for some reason using a render with a template doesn&#39;t seem to do this.</p> <p>I&#39;ve seen lots of solutions where you stuff a fake string matching the name of the template using some metaclass wizardry, but then you&#39;re stuck dealing with some semi-view stuff in what you might want to simply be a unit test about the model values placed by the controller method.</p> <p>However, based on <a href="http://stackoverflow.com/questions/15141319/grails-controller-test-making-assertions-about-model-when-rendering-a-template">this StackOverflow post</a>, I&#39;ve written a quick-and-dirty little monkeypatch that exposes the <code>model</code> and <code>view</code> variables in your test, and populated with the values relevant to the template.</p> <p>I&#39;ve got this method in a <code>TestUtil</code> class:</p> <div class="highlight"><pre><code class="language-groovy" data-lang="groovy">static def ensureModelForTemplates(con) { def originalMethod = con.metaClass.getMetaMethod('render', [Map] as Class[]) con.metaClass.render = { Map args -&gt; if (args[&quot;template&quot;]) { con.modelAndView = new ModelAndView( args[&quot;template&quot;] as String, args[&quot;model&quot;] as Map ) } originalMethod.invoke(delegate, args) } } </code></pre></div> <p>Then I can call this method with the controller as a parameter anywhere before I invoke the controller action. It can go in a <code>setup</code> or <code>@Before</code> method, it seems to work from both Spock tests and the builtin Grails testing framework.</p> <p>So if we have this example:</p> <div class="highlight"><pre><code class="language-groovy" data-lang="groovy">class ExampleController { def index() { def bigName = params.name.toUpperCase() render(template: &quot;partial&quot;, model: [ one: &quot;hello&quot;, two: bigName ]) } } </code></pre></div> <p>This test will do what we want:</p> <div class="highlight"><pre><code class="language-groovy" data-lang="groovy">@TestFor(ExampleController) class ExampleControllerSpec extends Specification { def setup() { TestUtil.ensureModelForTemplates(controller) } def shouldHaveModelAndViewExposed() { given: params.name = &quot;Rod&quot; when: controller.index() then: view == &quot;partial&quot; model.one == &quot;hello&quot; model.two == &quot;ROD&quot; } } </code></pre></div> Thu, 27 Aug 2015 00:00:00 -0600 http://www.nomachetejuggling.com/2015/08/27/testing-against-template-renders-in-grails/ http://www.nomachetejuggling.com/2015/08/27/testing-against-template-renders-in-grails/ QCon New York 2015: A Review <p>My default yearly conference, for many years, has been <a href="http://uberconf.com/conference/denver/2015/07/home">UberConf</a>. I really enjoy UberConf because it&#39;s packed full of lots of great sessions, and it&#39;s conveniently local. However, because I go to various local user groups and attend so often, I find that, if I go two years in a row there are too many sessions I&#39;ve seen before, and I wind up disappointed. So for the past few years, I&#39;ve been alternating between UberConf and something new. Two years ago, it was <a href="http://www.nomachetejuggling.com/2013/07/30/oscon-2013-a-review/">OSCON</a>, and this year it was <a href="https://qconnewyork.com/">QCon New York</a>.</p> <p>I chose QCon for a few reasons. One, the sessions seemed very focused on architecture and higher-level concepts, with very few language/technology talks. This was right up my alley because, while there are some languages and tools I&#39;d like to go deeper on, I think a more significant area for improvement for me is architecture and scalability. We get tons of traffic at my job - more than any other place I&#39;ve ever worked - so I&#39;ve had to learn a lot about scalability, and the nature of the work has forced me to really see broad system design differently.</p> <p>I went to QCon specifically wanting to improve some areas where I was weak, namely containerization, microservices, and reactive programming. I hear a lot of buzz about these things, and they pop up on recent <a href="http://www.thoughtworks.com/radar/a-z">ThoughtWorks Technology Radar</a>s, and QCon seemed to have a lot of sessions to offer in these areas. It took a LOT of convincing to get my employer to agree to send me to a conference location as expensive as New York, but eventually they approved it. Here I will detail some of my thoughts about the experience, in case it may be of use to others considering QCon.</p> <!--more--> <h1>Sessions</h1> <p>First and foremost, the sessions. Networking isn&#39;t my thing, I&#39;m all about the quality, quantity, and variety of sessions offered. <strong>I picked QCon based on the sessions, and I was not disappointed.</strong></p> <p>The sessions were well-arranged into tracks, as is common with these kinds of conferences. What was somewhat different about QCon, at least from my perspective, was how cohesive sessions were within a track, and how diverse the tracks themselves were. A lot of times tracks are really general, like &quot;Java&quot; or &quot;Agile&quot;, or they can be too similar to each other. In QCon&#39;s case, all of the tracks themselves were very different, but very specific, like &quot;Fraud Detection and Hack Prevention&quot; and &quot;High Performance Streaming Data&quot;. Within a track, all of the talks were very closely related, and it actually made sense to pick a track and stick with it, rather than buffet style picking-and-choosing based on session alone.</p> <p>The sessions were the perfect length. I&#39;ve complained before that UberConf&#39;s 90 minute sessions can sometimes seem overlong or padded, and that OSCON&#39;s 30-minute sessions seemed rushed or abbreviated right when they were getting good, but QCon strikes a great balance at 50 minutes each. This is short enough to prevent topic fatigue, but long enough to go in depth. Speakers usually did a great job of giving a presentation in-line with the topic title and description as well, which is (somewhat surprisingly) rare for tech conferences.</p> <p>One complaint is that <strong>slides were usually made available AFTER sessions were over</strong>. I hate when this happens, I want to see slides ahead of time, both because I can use them to make sure the content is going to be interesting, and because I use Evernote to actually take notes IN the PDF itself, highlighting or marking up the document with my own notes. The only argument I can imagine for why slides would be held off until after a presentation is that speakers might be modifying the slides until just before they give a talk, but frankly I think that stinks of unpreparedness. Slides should be available in advance, no exceptions.</p> <p>One excellent feature of QCon was that almost all of the talks were published in video form after the sessions were over (usually late at night or the next day). The recording quality was excellent, full video of the speaker and their slides synced up, and actual cameramen that kept the speaker in frame for the whole talk. Audio quality was excellent as well. UberConf does something similar by making audio-only available, but sometimes speakers forget to press record, and I often found myself skipping some sessions with the intent to listen to them on audio later, only to find that they weren&#39;t recorded. QCon solves this problem entirely with a professional A/V staff and quick editing/uploading. What&#39;s more, the slides are available when the video is - <strong>I actually found myself more easily able to take notes on the recorded talks than I was able to when watching talks live.</strong></p> <p>I learned a whole bunch from the sessions I went to, though there was a day (Thursday) where I narrowed down to two talks for every time slot, only to find out based on Twitter that the session I <em>didn&#39;t</em> choose was the better one. This was annoying, but I fixed it with the video recordings.</p> <p>I also really liked there being a special &quot;Modern Computer Science in the Real World&quot; track - it&#39;s rare to see really heavy CS stuff at programmer conferences, I liked it.</p> <table class='image aligncenter' width='646'><tr><td><img src="http://www.nomachetejuggling.com/assets/qcon_sessions.jpg" width='640' height='427'/></td></tr></table> <h2>Mini-Talks</h2> <p>On Wednesday, each of the tracks had a session which was &quot;mini-talks&quot;, kind of a series of lightning talks related to the track. I really, really love lightning talks, I have found that there are a lot of 40-50 minute talks that really should just be 5 or 10 minute lightning talks, and they&#39;re a great way to get wide exposure on a lot of different topics.</p> <p>I wish QCon had done a mini-talks session for every track, rather than just the tracks on the first day of the conference, because <strong>the mini-talks were great</strong>. Again, the video recordings were instrumental here, it was extremely tough to decide which mini-talks to attend, and with the help of video I was able to attend all of them.</p> <h2>Open Spaces</h2> <p>QCon also has an &quot;Open Space&quot; slot for each track, where attendees would get together and brainstorm their own topics, then other attendees would speak about them if they knew anything about the topic.</p> <p>I hate these things, I typically find that they either fizzle out due to not enough participation, or get completely controlled by a single enthusiastic person. I guess a lot of people like Open Spaces, but they just aren&#39;t for me. Every time I saw an Open Spaces talk on the schedule, I wished it was another session, or a session of mini-talks.</p> <h1>Workshops</h1> <p>Like a lot of other conferences, QCon had two days of workshops. Workshops can be really hit or miss in my experience (usually miss), and QCon was no exception. One way QCon did a good job was that Monday was for all-day workshops, and Tuesday was for two half-day workshops (though they had some all-day ones as well). This is a good way to go, personally <strong>I&#39;ve found half-day workshops tend to work better than the all-day variety</strong>.</p> <p>The workshop I picked for Monday wound up being entirely not what was I expecting. It was extremely academic and not very hands-on, which is about the greatest sin a &quot;workshop&quot; can commit. If every participant isn&#39;t on their laptop, it&#39;s not a workshop, it&#39;s just an all-day lecture. QCon was particularly strict about not allowing you to change workshops after making selections, so I was stuck in the workshop the whole day, hating it.</p> <p>The two half-day workshops were much better, but again they suffered from the problem so many workshops have, which is <strong>catering to the slowest, least prepared people in the workshop</strong>. I&#39;ve said it before but if you ignore the e-mail that goes out with the instructions to get set up, you should be left behind. Read the e-mails and do the setup, if you can&#39;t do that then you deserve to have your money wasted; the alternative is that everything slows down so you can catch up meaning everyone else&#39;s money is wasted instead.</p> <p>I especially want to call out <a href="https://twitter.com/everett_toews">Everett Toews</a> for doing an excellent job with his OpenStack half-way workshop. He had a bunch of helpers who got the slower people set up without having to slow down himself, and overall the workshop got a lot accomplished and taught me a lot about OpenStack. I think the session occasionally devolved into &quot;here, copy and paste these commands&quot; lacking explanation, but for the most part the entire workshop was great, and <strong>easily a highlight of the conference for me</strong>.</p> <h1>Keynotes</h1> <p>I tend to expect Keynotes to be extremely non-technical technical talks. Like a talk that you might find scheduled normally, except watered down to a point where every audience member would be okay choosing it. These usually mean I&#39;m not a fan of them.</p> <p>OSCON had an interesting approach to the Keynote, which was a series of short keynotes, almost lightning-talk style, which I really liked. QCon didn&#39;t do this, but they actually managed to avoid the &quot;technical talks with no technical information&quot; by having legitimate technical talks, pretty in-depth from a technical standpoint.</p> <p><strong>Mary Poppendieck&#39;s Microchips to Microservices keynote was fantastic, as was Todd Montgomery and Trisha Gee&#39;s less technical but still highly enjoyable &quot;How Did We End Up Here?&quot; talk</strong>. I disagreed with a lot of points that Todd and Trisha made, but their talk gave me a lot to think about, which is always fun.</p> <p>I wasn&#39;t a big fan of &quot;Driven to Distraction&quot; which was a talk about the different kinds of &quot;X-Driven-Development&quot; there are. This was largely intended to be a comedy talk, rather than a technical talk, and it closed the day rather than opened it. I wasn&#39;t a fan of the humor, honestly. A little into the talk, I realized he was literally going to the entire alphabet, ADD, BDD, CDD, DDD, EDD, and so on. Some letters got multiple definitions, I think I gave up and left around GDD (&quot;Google Driven Development&quot;, because we Google things, har). Kind of ended the conference on a sour note, but something skippable at the end is nice in case your brain is fried, as mine was.</p> <h1>Expo Hall</h1> <p>Like OSCON, QCon had an area for vendors promoting their products and giving stuff away. This room was much smaller than OSCON&#39;s, but it wasn&#39;t off to the side. In fact, you had to walk through to get to 3 of the salons with regular talks, which was somewhat annoying. However, the vendors themselves were a lot less pushy, and only tried to talk to you if you came directly to their book and initiated conversation. They also let you go more easily once you indicated you wanted to move on.</p> <p>I can&#39;t complain much about the vendor room, they gave cool stuff away and getting your nametag scanned for the low low price of being pestered via e-mail later on earned you a spot in a drawing. There were enough giveaways that your chances were fairly decent, in fact I won a Lego Mindstorm set.</p> <table class='image aligncenter' width='646'><tr><td><img src="http://www.nomachetejuggling.com/assets/qcon_haul.jpg" width='640' height='360'/><p class='caption'>Swag!</p></td></tr></table> <p>I still think the coolest version of this I&#39;ve ever seen is at OSCON, where the Expo Hall was gigantic and had all sorts of interesting stuff in it, with a lot of demos and products (even a car). QCon&#39;s room being so much smaller meant that you could go see every booth in just a few minutes, but then were stuck going through the same room multiple times throughout the conference. It also could get extremely crowded in the room, with both booth traffic and just-passing-through traffic, which discouraged me from wanting to spend much time booth hopping.</p> <h1>Attendees</h1> <p><strong>I really liked the class of people at QCon, it seemed like mostly seasoned veterans in the world of software engineering</strong>. There weren&#39;t a lot of young hipsters or brogrammers or anything like that, it seemed like a lot of graybeards. I&#39;m a fan of that, I think our industry generally undervalues people that have been in the field for a while, so it was nice to see such a seasoned group.</p> <p>Of course, I mostly avoided talking to people because I hate networking, so I can&#39;t say much more than that. All I can say is I didn&#39;t overhear conversations that made me cringe with people saying dumb shit like &quot;what&#39;s the big deal with functional programming, I&#39;ve been using C++ for years and it&#39;s fine&quot; (a real thing I heard at a conference once). So it seemed like a brighter group of people overall than I&#39;ve seen at some other conferences.</p> <p>One thing I will say, I really liked how QCon set up their lunch tables. Lunch is typically when most of the socializing happens, and OSCON for example has tables for people with similar interests to meet and mingle. QCon had a similar setup, but I appreciated that they also had a handful of rectangular tables pushed against the walls on the perimeter of the lunchroom. A clear set of &quot;I don&#39;t want to mingle&quot; tables. Good stuff if you hate chit-chat like I do.</p> <blockquote class="twitter-tweet" lang="en"><p lang="en" dir="ltr">Just ran into stranger at <a href="https://twitter.com/hashtag/qconnewyork?src=hash">#qconnewyork</a> who recognized my name from my badge because he follows me on Twitter and doesn&#39;t know why. <a href="https://twitter.com/hashtag/surreal?src=hash">#surreal</a></p>&mdash; Rod Hilton (@rodhilton) <a href="https://twitter.com/rodhilton/status/608641289379262464">June 10, 2015</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script> <h1>Venue</h1> <p>Alright, here&#39;s the bad news. The conference was held at the New York Marriott at the Brooklyn Bridge, and <strong>the venue was easily my biggest complaint about the entire conference</strong>.</p> <p>The hotel itself had absolutely no restaurant (or bar for that matter), which made meals a bit difficult. What the Marriott had was a lounge that you could pay to access for75 per day, which is outrageous. The lounge was the only place to get a meal or a drink in the entire building, and there was no room service offered.</p> <p>Normally only dinners would be a problem in this type of situation, since conferences usually include breakfast and lunch. However, what passed for &#39;Breakfast&#39; was extremely disappointing - 100% pastries and breads, no eggs or meat or protein of any kind (actually they did have bland, ice cold poached eggs). Nothing served warm or even warmable (bagels, no toaster). A bunch of pastries and muffins are not &quot;brain food&quot; - starting a full day of technical talks with a bunch of muffins is a surefire way to be nodding off by the third talk. I wound up walking to a nearby Panera every single morning to get an egg sandwich.</p> <p>Lunch was better, but also not great. I think by choice of QCon itself, the hotel catering had to make everything gluten-free. I find the whole gluten-free for non-celiacs fad <a href="http://www.georgeinstitute.org.au/media-releases/dont-believe-the-hype-on-gluten-free-food">generally irritating</a> but what really made this annoying was what foods they chose to serve. If I say to you &quot;okay we need a vegetarian meal&quot; you try to think of foods that don&#39;t involve meat, you don&#39;t immediately think of a meat dish and substitute tofu in. Similarly, why does your &#39;gluten free&#39; menu consist almost entirely of gluten-free pasta? I wound up grabbing lunch elsewhere for 3 of the 5 days I was at the conference. This was frustrating, because I convinced my employer to send me to NY by arguing that meals were mostly included, but then I wound up having to pay for most meals.</p> <p>Aside from workshops, it was very rare to find tables in the sessions - usually it was just rows of seats. And the walls were those sliding accordion walls that hotels use to divide huge rooms into sections. The end result being, it was very hard to find a place to plug in a laptop, and situate it in a way to take notes. This isn&#39;t really the venue&#39;s fault, I&#39;m sure QCon told them no tables, but it&#39;s always something that irks me as a notetaker. Like I mentioned earlier, I actually found it easier to take notes and watch sessions from the video recordings, from the comfort of my hotel room after hours.</p> <h1>Misc</h1> <p>In summary, QCon absolutely excelled in terms of session quality, variety, and depth, but workshops were an area for improvement (as with every other conference that offers them), and the venue itself was dreadful.</p> <p>I learned a lot at the conference, and was able to gain a lot of insight in the areas where I was hoping to. One particular interesting note was, I went to a lot of &quot;microservices&quot; talks, but almost all of them were &quot;here are some tips for your microservices&quot; and not &quot;here are pros and cons of microservices&quot; or &quot;why you should use microservices&quot;. In other words, most of the microservices talks assumed that you were already building and deploying microservices. This was somewhat shocking to me and made me feel behind the curve a bit - I&#39;m really not sold on microservices, I think the operational concerns are likely to outweigh the benefits, so it was interesting to see it presented like that ship has already sailed. There was a talk by StackOverflow in favor of monoliths, but everything else was all microservices all the time. Martin Fowler recently published a great <a href="http://martinfowler.com/articles/microservice-trade-offs.html">pros-and-cons of Microservices article</a> that I found myself nodding along to.</p> <p>QCon had a nice &#39;custom schedule&#39; builder like OSCON but QCon&#39;s was a bit behind, it didn&#39;t integrate with an app and give notifications like OSCON&#39;s did. However, the full video recordings of sessions available same day were phenomenal, and the ability to share with 10 other people who didn&#39;t attend the conference is awesome.</p> <p><strong>Overall, I really enjoyed my QCon experience and it&#39;s definitely on my radar for a conference to attend again in the future</strong>. However, most of the things I disliked about the conference were related to its physical location and venue, which makes me wonder if it&#39;s worth the (very high) price tag since the best part (the recorded sessions) are eventually made available on the internet.</p> Wed, 01 Jul 2015 00:00:00 -0600 http://www.nomachetejuggling.com/2015/07/01/qconny-2015-a-review/ http://www.nomachetejuggling.com/2015/07/01/qconny-2015-a-review/ Uploading a Jekyll Site to Rackspace Cloudfiles <p>This blog was never intended to be popular by any stretch of the imagination. Largely I started it simply to have a place to gather solutions to technical problems I&#39;ve encountered, so that I could easily look those solutions up if I needed them again. The blog has always run on my own shared hosting server, on a self-installed version of Wordpress.</p> <p>To my great surprise, a <a href="http://www.reddit.com/r/programming/comments/2986e4/the_worst_programming_interview_question/">few</a> <a href="http://www.reddit.com/r/programming/comments/hn1fx/a_different_kind_of_technical_interview/">of</a> <a href="http://www.reddit.com/r/programming/comments/yvr9/my_interview_with_google/">my</a> <a href="http://www.reddit.com/r/TrueReddit/comments/q98ld/the_star_wars_saga_suggested_viewing_order_iv_v/">posts</a> have found their way to the front page of <a href="http://www.reddit.com/domain/nomachetejuggling.com">reddit</a>. My <a href="http://www.nomachetejuggling.com/2011/11/11/the-star-wars-saga-suggested-viewing-order/">post about Star Wars</a> has been mentioned on <a href="https://www.youtube.com/watch?v=effD1u4oCRE">King of the Nerds</a> and <a href="https://www.youtube.com/watch?v=keSFjjhUyVA">The Big Bang Theory</a>, and even landed me an <a href="http://www.npr.org/2014/03/20/291977042/theres-more-than-one-way-to-watch-star-wars">Interview on NPR</a>. </p> <table class='image aligncenter'><tr><td><script type="text/javascript" src="//www.google.com/trends/embed.js?hl=en-US&q=Machete+Order&cmpt=q&content=1&cid=TIMESERIES_GRAPH_0&export=5&w=600&h=330"></script></td></tr></table> <p>Needless to say, the traffic to my blog has been both extremely unexpected and unpredictable. The Star Wars post had been online for months with virtually no traffic before <a href="http://archive.wired.com/geekdad/2012/02/machete-order-star-wars/">Wired</a> suddenly linked to it, instantly decimating my web server. I&#39;ve fought and fought with various configurations for Wordpress, used <a href="http://wordpress.org/plugins/w3-total-cache/">as much caching</a> as possible, and even had my <a href="https://www.servint.net/">web host</a> temporarily upgrade my service, all trying to keep a web site that makes no money online even when traffic increases by a factor of 100 overnight. <strong>When my site goes down, it&#39;s embarrassing, because even though it&#39;s just a personal blog on a shared host, it gives the impression that I, as a software developer, don&#39;t know how to make a web site scale</strong>.</p> <h1>Switching to Jekyll</h1> <table class='image alignright' width='306'><tr><td><img src="http://www.nomachetejuggling.com/assets/jekyll-logo.png" width='300' height='141'/></td></tr></table> <p>So after the most recent pummeling I took due to a <a href="https://news.ycombinator.com/item?id=7953725">Hacker News link</a>, I decided it was time to <strong>bite the bullet and convert the entire site to <a href="http://jekyllrb.com/">Jekyll</a></strong>. I&#39;ve messed around with the technology before to build another, smaller, blog, so I was somewhat familiar with the constructs and idioms. A lot of work and ten custom plugins later, the entire site was converted, with very little loss of functionality.</p> <!--more--> <p>I didn&#39;t want to serve the files from my shared host because I know firsthand that the traffic spikes I experience are often enough to overwhelm apache itself, and I couldn&#39;t host it with <a href="https://pages.github.com/">GitHub Pages</a> due to the aforementioned ten custom plugins. I&#39;ve used both Amazon S3 (to host the smaller Jekyll-based blog) and Rackspace Cloudfiles (as a CDN for the Wordpress version). Of those two, I find Amazon S3 to be extremely overcomplicated and difficult to work with, but there&#39;s a great <a href="https://github.com/laurilehmijoki/s3_website">S3_Website</a> gem that makes uploading a Jekyll blog a snap. Rackspace Cloudfiles is much more straightforward to work with, but the <a href="https://github.com/nicholaskuechler/jekyll-rackspace-cloudfiles-clean-urls/blob/master/cloudfiles_jekyll_upload.py">Python script</a> that <a href="http://www.rackspace.com/blog/running-jekyll-on-rackspace-cloud-files/">even Rackspace itself</a> links to has given me various dependency issues.</p> <p><span data-pullquote="Rackspace Cloudfiles is a bit cheaper per GB than Amazon S3, and ... that became the deciding factor. " class="left">Rackspace Cloudfiles is a bit cheaper per GB than Amazon S3, and ... that became the deciding factor. </span> In the end, Rackspace Cloudfiles is a bit cheaper per GB than Amazon S3, and since this blog receives a nontrivial amount of traffic, that became the deciding factor. Since I always had issues with the python script that uploads a Jekyll blog to Cloudfiles, I decided to do some research into alternative means of automated uploading (<a href="http://cyberduck.io/">Cyberduck</a> works, but I wanted something that I could make Jenkins run).</p> <p>Unfortunately, <strong>almost everything I found wound up linking to the exact same Python script that gave me trouble</strong>. So I decided to write my own, which I&#39;m open-sourcing for the benefit of anyone else that has had similar problems.</p> <h1>jekyll-cloudfiles-upload</h1> <p><a href="https://github.com/rodhilton/jekyll-cloudfiles-upload">jekyll-cloudfiles-upload is hosted on GitHub</a> and is a single Ruby script that can be dropped into your Jekyll blog project directory. It will look in <code>_site</code> for all of your static site files, compare them to what is in your Rackspace Cloudfiles container, upload any that need updating, and delete anything in the container you no longer have. It only has a few small dependencies (ruby and a ruby gem named <code>Fog</code>), and I&#39;ve been using it to update this blog with great success.</p> <h2>Installation and Usage</h2> <ol> <li><p>Log into Rackspace Cloud Files and create your container. <em>You must create your container first, the script will not do that</em>.</p> <blockquote> <p><strong>Pro-Tip</strong>: Before you upload anything, set your container&#39;s TTL to something other than the default, which is 72 hours. Once a file is loaded into the CDN, it seemed to me that, even if you changed your container&#39;s TTL after the fact, the TTL change itself wouldn&#39;t propagate until after 72 hours. Changing it first (I use 15 minutes) before uploading files seemed to fix this issue.</p> </blockquote></li> <li><p>Install <code>fog</code> rubygem via <code>gem install fog</code></p></li> <li><p>Put a <code>.fog</code> file in your home directory that looks like this (it&#39;s a yaml file, be careful not to use tabs instead of spaces):</p> <div class="highlight"><pre><code class="language-yaml" data-lang="yaml">default: rackspace_username: your_user_name rackspace_api_key: your_api_key rackspace_region: your_preferred_region </code></pre></div> <p>The rackspace regions are strings like &#39;iad&#39; or &#39;dfw&#39;, depending on your preferred container region. You can get your api key from the Rackspace control panel&#39;s Account page.</p> <p>If you have multiple sites with multiple containers all in different regions, you&#39;ll have to hand-alter the script so that it doesn&#39;t look up this information in Fog, but just hardcodes it instead. If you do this, I suggest using the ruby symbol syntax in the <code>cloudfiles_upload.rb</code> script, such as <code>:iad</code>.</p></li> <li><p>Copy the <code>cloudfiles_upload.rb</code> script from the GitHub repository into the directory for your Jekyll project. It&#39;s a good idea to also make it executable via <code>chmod a+x cloudfiles_upload.rb</code></p></li> <li><p>Build your site via <code>jekyll build</code></p></li> <li><p>Execute <code>./cloudfiles_upload.rb container_name</code> or <code>ruby cloudfiles_upload.rb container_name</code>.</p> <p>The script will spider through the <code>_site</code> subdirectory and look for any files that need to be added, deleted, or updated. Only files whose md5 hashes differ will from those in the container will be uploaded, so it will not upload files unnecessarily.</p> <p><strong>Note</strong>: You may optionally leave off the <code>container_name</code> parameter, and the script will use the name of the directory you are in. So if you name your directory and container <code>mysite.com</code>, you can just run <code>./cloudfiles_upload.rb</code> with no arguments.</p> <blockquote> <p><strong>Pro-Tip</strong>: Add <code>cloudfiles_upload.rb</code> to your <code>_config.yml</code> file&#39;s exclusion list so it doesn&#39;t get uploaded.</p> </blockquote></li> </ol> <h1>Dogfooding</h1> <p>I offer no guarantee of support on this script, but I can assure you that I&#39;m dogfooding the hell out of it. I set up a private Jenkins instance that watches for changes to my private <a href="https://bitbucket.org/">BitBucket</a> repository that contains this blog. The repository has <code>jekyll-cloudfiles-upload</code> as a submodule, with the <code>cloudfiles_upload.rb</code> script symlinked to the submodule&#39;s version. Any change to the blog pulls down the most recent copy of the script, builds the blog, and then runs the script to upload it.</p> <p>I liked this solution so much that I wound up converting the smaller blog that I had been running on Amazon S3 over to Rackspace Cloudfiles as well. I also have a Jenkins job that looks for changes to the <code>jekyll-cloudfiles-upload</code> project, and automatically kicks off the jobs for both web sites whenever it changes as well, so this script is definitely instrumental to a process that controls a web site whose downtime personally embarrasses me a great deal. Again, no guarantees, but I&#39;m putting a lot of trust in this script, for whatever that&#39;s worth.</p> <h1>Jekyll Thoughts</h1> <p>So far, I&#39;m digging Jekyll a lot. I&#39;d used it before for the smaller blog as I mentioned, but that was my first, so I used <a href="http://jekyllbootstrap.com/">JekyllBootstrap</a> thoroughly. It was good for getting set up, but I found making modifications to themes and general customization quite perplexing and difficult. This time, I built everything from scratch, including all of the custom plugins I&#39;m using, and I have a much better understanding of how Jekyll works.</p> <p>The only thing I had to give up was the rightmost sidebar. Previously, that area actually showed my latest tweet, and various updates from my Goodreads, Trackt, Last.fm, Groovee, and Diigo feeds. Those used the <a href="https://wordpress.org/plugins/better-rss-widget/">Better RSS Widget</a> Wordpress plugin, and I liked the feature but it would occasionally have trouble pulling feeds, causing it to leave an error on the cached version of a page for hours until the cache cleared. I&#39;m alright with my sidebar-o-social-icons that I replaced it with, though.</p> <p><span data-pullquote="I love writing posts in Markdown. " class="right">I love writing posts in Markdown. </span> I&#39;ve always wanted to be able to do that with Wordpress, but found that plugins which supported it were generally terrible. I wish it was easier to make custom alterations to the markdown processing, but <a href="http://jekyllrb.com/docs/plugins/#tags">Jekyll Tags</a> are a decent workaround. Like I mentioned earlier, I&#39;ve got a lot of custom plugins gluing this site together, but I&#39;m happy with the readability of my markdown source files, and I like that there&#39;s an abstraction layer translating those to HTML rather than embedding HTML directly into posts or writing Wordpress shortcode processors.</p> <p>I may eventually put some of these plugins into GitHub as well, and I wound up writing a pretty handy extension to <a href="http://highlightjs.org/">highlight.js</a> that makes it easier to copy and paste syntax highlighted code which I think others might find useful. But easily, the most useful thing I wrote to support this effort - aside from a highly customized script that ran my blog post&#39;s html files through forty regular expressions to convert them to markdown - was the <code>cloudfiles_upload.rb</code> script. Hopefully others may find it useful as well.</p> Fri, 04 Jul 2014 00:00:00 -0600 http://www.nomachetejuggling.com/2014/07/04/uploading-a-jekyll-site-to-rackspace-cloudfiles/ http://www.nomachetejuggling.com/2014/07/04/uploading-a-jekyll-site-to-rackspace-cloudfiles/ The Worst Programming Interview Question <p>Years ago, I wrote about a <a href="http://www.nomachetejuggling.com/2008/12/11/my-least-favorite-interview-question/">particular type of interview question</a> that I despise. Today I&#39;d like to discuss a much more specific question, rather than a type. I&#39;ve never been asked this question myself, but I have seen it asked in an actual interview, and I officially nominate it as the worst question I&#39;ve ever heard in an interview.</p> <p>A co-worker at a previous company used to ask this question, and it was the first time I&#39;d ever heard it in an interview setting. This company did pair interviews, two engineers with one candidate. One day he and I were the two engineers interviewing some poor candidate. The candidate had actually done pretty well as far as I was concerned, and then my co-worker busted this question out. The candidate stumbled over the answer, visibly frustrated with himself. In the post-interview pow-wow, all of the engineers who&#39;d interviewed him gave him the thumbs up, except my interview partner, who refused to hire him on the grounds that he completely flubbed this question, and &quot;any engineer worth his salt should be able to answer it.&quot; He actually said that if we hired this individual, he would be unwilling to work on a team with the candidate. For what it&#39;s worth, the story has a happy ending, in that we hired the candidate in spite of his protests, fired the co-worker within a few months, and the candidate is still at that company, doing quite well.</p> <p>Anyway, I think this question perfectly represents everything that can go wrong with an interview question, so I&#39;d like to discuss it here to explain why it&#39;s almost hilariously awful as an interview question:</p> <blockquote> <p><strong>Write a function that can detect a cycle in a linked list.</strong></p> </blockquote> <p>Seems like your basic algorithm coding question at first, right? Hop up and write the function on the white board; totally reasonable, right? Except it&#39;s not, it&#39;s brain-meltingly terrible. Let&#39;s break it down.</p> <!-- more --> <h1>1. It&#39;s completely inappropriate</h1> <p>This is a job interview. You have a dynamic where you&#39;re talking to someone who is interviewing for a job. It&#39;s naturally nerve-wracking, and &quot;puzzler&quot; questions where there&#39;s some &quot;a-ha&quot; moment of clarity are the worst kind of programming questions you can ask. If you don&#39;t have the a-ha moment in the interview, you won&#39;t get it, and a good chunk of your brain will be devoted to thinking &quot;oh shit I&#39;m blowing this interview&quot; rather than focusing on the question at hand.</p> <p>People like to pose puzzlers to &quot;see how people think&quot; but that&#39;s nonsense in the case of puzzler questions. <strong>You can&#39;t reason your way through a puzzler, that&#39;s why it&#39;s a puzzler</strong>. You just have to hope you have the a-ha moment. Sometimes I&#39;ve heard people like to &quot;see how people handle pressure&quot; but they&#39;re <em>already</em> in an interview, the pressure is already there.</p> <p>Asking puzzler questions is a complete waste of time, <strong>all you&#39;re doing is testing if someone has seen your particular puzzler before or not</strong>. You may also be testing their acting chops, as the person who has heard the question before pretends it&#39;s their first time hearing it, and they feign reasoning their way through the problem to arrive at the answer they already know as soon as the question comes out of your mouth.</p> <p>This particular problem is the worst offender in this regard. Why, you ask? Well, imagine if someone truly <em>was</em> hearing this problem for the first time, and you&#39;re expecting them to reason their way to the answer. </p> <p>In this case, the generally &quot;correct&quot; answer is a tortoise-and-hare algorithm, where you have two pointers at the head of your linked list, one traverses the list two nodes at a time, and one traverses the list one node at a time; if ever the pointers point to the same node, you have a cycle somewhere.</p> <p>Sure, there are easier answers, like marking each node with some kind of &#39;seen&#39; boolean, or traversing the list from each node to see if you come back to it, or duplicating the list into a hash and looking for a collision, but as soon as you provide those answers, the interviewer will add restrictions saying to use less memory or use less time or don&#39;t modify the underlying data structure. The only one that makes the question &quot;stop&quot; is the tortoise-and-hare algorithm.</p> <p>Is it reasonable to expect someone to think of this, from scratch? After all, you&#39;re pretty confident you could think of it, right? Well, the Linked List as a data structure was <a href="http://en.wikipedia.org/wiki/Linked_list#History">discovered by Allen Newell, Cliff Shaw and Herbert A. Simon</a> in 1955. The &quot;correct&quot; cycle detection algorithm for a Linked List is named &quot;Floyd&#39;s cycle-finding algorithm&quot; in honor of its inventor, Robert W. Floyd, who discovered it in <a href="http://dl.acm.org/citation.cfm?doid=321420.321422">a 1967 paper</a>.</p> <p>Between 1955 and 1967, the problem of &quot;how do we determine if there is a cycle in a linked list without modifying the list&quot; was an open problem. Meaning, any number of PhD candidates in Mathematics or Computer Science could have written about it as part of their dissertation. With all of those hundreds and hundreds of minds, <strong>this problem remained open for 12 years</strong>.</p> <p>Do you honestly think you could, in a twenty minute interview, from scratch, come up with the solution to a problem that remained open in the field for 12 years, all under a pressure far more intense than any academic? Seems pretty damn unlikely, <strong>the only reason you think you could do so is that you&#39;ve heard the answer before, and it seems obvious and simple in retrospect</strong>. In other words, &quot;a-ha!&quot;</p> <h1>2. It&#39;s completely disconnected from reality</h1> <p>As if the above weren&#39;t reason enough for this to be a laughably bad question, you have to also ask yourself, is this even a good question for determining if this engineer has the skills they need for the job?</p> <p>Let me challenge the question altogether: <strong>why would you ever find yourself in a situation where your linked list has a cycle?</strong></p> <p>In the real-world, what could lead to this? I don&#39;t mean mechanically, obviously you get a cycle if you have a node whose &quot;next&quot; pointer is upstream of that node. I mean, how does it actually happen in real life?</p> <p>See, a Linked List is a data structure, it&#39;s not an abstract data type. Generally you wouldn&#39;t be making a <code>LinkedList</code> class, you&#39;d be making a <code>Stack</code> or a <code>Queue</code> or something like that. Those would be the classes you&#39;re writing and exposing to a consumer of your class, and it would just so happen that your internal <em>implementation</em> of those types is a linked list. So what are the methods on your <code>Stack</code> class, for example? <code>push</code>, <code>pop</code>, <code>peek</code>, etc? Well, if someone is using those methods, how on earth are you going to get a cycle in your list? They&#39;re not messing with the <code>next</code> or <code>prev</code> pointers, they&#39;re just pushing and popping with objects of some type.</p> <p>Even if you wrote a <code>LinkedList</code> class for some library, you still can&#39;t find yourself in this situation. Take a look at <a href="http://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html">Java&#39;s <code>LinkedList</code></a> class. There is no way to manipulate the pointers for the node&#39;s next or previous references. You can get the first, or get the last, or add an object to a specific place in the list, or remove an object by index or by value. </p> <p>Take a look at the Java source code and you&#39;ll find those next and previous pointers are here, inside of <code>LinkedList</code>:</p> <div class="highlight"><pre><code class="language-java" data-lang="java"> private static class Entry &lt;E&gt; { E element; java.util.LinkedList.Entry&lt;E&gt; next; java.util.LinkedList.Entry&lt;E&gt; previous; Entry(E e, java.util.LinkedList.Entry&lt;E&gt; entry, java.util.LinkedList.Entry&lt;E&gt; entry1) { /* compiled code */ } } </code></pre></div> <p>This is a <code>private static</code> class, inside of <code>LinkedList</code>. You can&#39;t instantiate a <code>LinkedList.Entry</code>. You have no way to manipulate these <code>next</code> or <code>previous</code> pointers. Because those things are the state of the list, and <strong><code>LinkedList</code> encapsulates the behaviors with the state inside of the class,</strong> like it ought to.</p> <p>If your <code>LinkedList</code> class were vulnerable to any kind of cycle creation, you&#39;ve done a poor job of encapsulation. You either have a design failure in your interface, or a bug in your implementation. In either case, your time would be better spent addressing your error rather than coding up some kind of cycle detection mechanism.</p> <p>Here&#39;s the only cycle detector you&#39;ll ever need to write for your <code>LinkedList</code>:</p> <div class="highlight"><pre><code class="language-java" data-lang="java">public class LinkedList { public boolean containsCycle() { return false; } } </code></pre></div> <p>There is no real situation in which this method&#39;s return value would be different than one that uses a tortoise-and-hare algorithm.</p> <p>In the real world of actual coding, you&#39;d very rarely find yourself ever needing to code up a linked list implementation from scratch, but if you did, you&#39;d certainly have no reason to expose methods that would allow someone using your code to create a cycle. The only way it could be done is through intentional, malicious metaprogramming or reflection of some kind, which could just as easily bypass your <code>detectCycle</code> method anyway.</p> <h1>Conclusion</h1> <p>Many interview questions fail for one of these two reasons. Either the question is too much of a puzzler to reasonably be solved in an interview setting, or it&#39;s so far removed from the skillset required to do the job (&quot;how would you move Mt. Fuji&quot;) that it&#39;s useless.</p> <p>This question, hilariously, suffers from both of these major problems, and it suffers from each about as hard as it possibly could.</p> <p>If you&#39;re asking this question, everyone who has ever answered it to your satisfaction was merely proving they have good memory recall abilities from their Computer Science curriculum, nothing more. Folks you turned away from the job for failing to answer this question may have been more qualified than you realize, and your company maybe should have turned you away instead.</p> <p>Linked List cycle detection: just don&#39;t ask it.</p> <p>Update: One commenter pointed out that if the data structure in question was a digraph where every node has an out degree of at most one, the question still applies. Totally valid point, in that case you <strong>are</strong> exposing methods that allow consumers of your structure to manually set the pointers. That&#39;s a far more reasonable question but, again, I think you&#39;re still just asking someone how well they recall their computer science classes, or you&#39;re asking an unreasonable question in an interview, unless you&#39;re willing to accept answers with worse runtime or space complexity than the tortoise-and-hare algorithm.</p> Tue, 24 Jun 2014 00:00:00 -0600 http://www.nomachetejuggling.com/2014/06/24/the-worst-programming-interview-question/ http://www.nomachetejuggling.com/2014/06/24/the-worst-programming-interview-question/ Top 10 Career-Changing Programming Books <p>When I graduated with a Computer Science degree ten years ago, I was excited to dive into the world of professional programming. I had done well in school, and I thought I was completely ready to be employed doing my dream job: writing code. What I discovered in my very first interview, however, was that I was massively underprepared to be an actual professional programmer. I knew all about data structures and algorithms, but nothing about how actual professional, &quot;enterprise&quot; software was written. I was lucky to find a job at a place willing to take a chance on me, and proceeded to learn as much as I could as quickly as I could to make up for my deficiencies. This involved reading a LOT of books.</p> <p>Here I reflect on my 10-year experience programming professionally and all of the books I&#39;ve read in that time, and offer up the ten that had the most profound impact on my career. Note that these are not the &quot;10 best&quot; programming books. I do feel all of these books are very good, but that&#39;s not the only reason I&#39;m selecting them here; I&#39;m mentioning them because I felt that I was a profoundly different person after reading each than I was beforehand. Each of these books forced me to think differently about my profession, and I believe they helped mold me into the programmer I am today.</p> <p>None of these books are language books. I may feel like learning to program in, say, Scala, had a profound impact on how I work professionally, but the enlightening thing was Scala itself, not the book I used to help me learn it. Similarly, I&#39;d say that learning to use Git had a significant impact on how I view version control, but it was Git that had the impact on me, not the book that I used to teach myself the tool. The books on this list are about the the content they dumped into my brain, not just a particular technology they taught me, even if a technology had a profound impact on me.</p> <p>So, without further ado...</p> <h1>Top &quot;10&quot;</h1> <h2><a href="http://www.amazon.com/The-Pragmatic-Programmer-Journeyman-Master/dp/020161622X">The Pragmatic Programmer</a></h2> <table class='image alignright' width='244'><tr><td><a href='http://www.amazon.com/The-Pragmatic-Programmer-Journeyman-Master/dp/020161622X'><img src="http://www.nomachetejuggling.com/assets/pragprog-238x300.jpg" width='238' height='300'/></a></td></tr></table> <p>I know, I know. Every list you&#39;ve ever seen on the internet includes this book. I&#39;m sorry, I wish I could be more original, but this book really is an eye-opener. <em>The Pragmatic Programmer</em> contains 46 tips for software professionals that are simply indispensable. As the name implies, the book avoids falling into any kind of religious wars with its tips, it&#39;s simply about pragmatism.</p> <p>If you were to read only one book on this list, this is the one to read. It never goes terribly deep into anything, but it has a great breadth, covering the basics that will take a recent college-grad and transform him or her into someone employable, who can be a useful member of a team.</p> <p>Many programmers got into the field because they liked hacking on code in their spare time, writing scripts to automate tasks or otherwise save time. There is a set of skills one develops just to sling code that makes a computer perform specific tasks, and that exact same skillset is needed by many, many employers. But there are many people who see programming professionally as simply an extension of their hobby, and do things the same way whether they are hacking at home or at work. <em>The Pragmatic Programmer</em> permanently altered how I view programming, it&#39;s not just extending my hobby of coding and getting people to pay me for it; there&#39;s a fundamental line between professional coding and hobbyist coding, and I am able to see that line and operate differently depending on what side of it I&#39;m on thanks to <em>The Pragmatic Programmer</em>.</p> <p>How groundbreaking is this book? Groundbreaking enough that it launched an entire publishing company. It&#39;s a big deal, if you&#39;ve somehow managed not to read it yet, go do so.</p> <p><strong>What it changed:</strong> How I view &quot;programming&quot; as a job instead of a hobby I get paid for.</p> <h2><a href="http://www.amazon.com/Continuous-Delivery-Deployment-Automation-Addison-Wesley/dp/0321601912">Continuous Delivery</a></h2> <table class='image alignright' width='233'><tr><td><a href='http://www.amazon.com/Continuous-Delivery-Deployment-Automation-Addison-Wesley/dp/0321601912'><img src="http://www.nomachetejuggling.com/assets/continuousDelivery-227x300.jpg" width='227' height='300'/></a></td></tr></table> <p>Releasing software is one of the most stressful parts of the job. I can&#39;t tell you how many times in my career I&#39;ve been part of a botched launch, or up until the wee hours of the morning on a conference call trying to get software into the hands of customers. When do we branch, what goes in what branch, how do we build the artifacts, what process do we walk through to get them where they need to go? It can be one of the most complex, error-prone, and difficult parts of professional programming.</p> <p><em>Continuous Delivery</em> means to do away with all of that difficulty. It describes a mindset, toolset, and methodology for completely turning releases on their head. Instead of doing them less frequently because they are difficult, do them more frequently so they&#39;re forced to be easier. In fact, don&#39;t just do them more frequently, do them <strong>all the time</strong>. <em>Continuous Delivery</em> describes, with real-world practical examples, how to version control all configuration, how to test integration points, how to handle branching and branch content, how to safely rollback, how to deploy with no downtime, how to do continuous testing, and how to automate everything from checkin to release.</p> <p>In a lot of ways the book describes a pie-in-the-sky ideal. It&#39;s difficult to achieve truly continuous delivery, though GitHub, Flickr, and many other companies seem to have done so. But as the old adage goes, aim for the moon, even if you miss you&#39;ll end up among the stars. Wait, that adage is insane, stars are further away than the moon. Who came up with that phrase? Where was I? Oh right, even if you don&#39;t ever reach the true ideal, every step you made toward it makes deployments at your company that much better. I&#39;ve worked in various environments where the principles of this book have been applied at different levels, and I can personally attest that there is a near-perfect linear relationship between how much you adhere to the advice in this book, and how smoothly releases go.</p> <p>I worked in an environment operating at about a 70%-level of adherence to the philosophy outlined in this book, and it was heaven. When I left that job, my new employer was at approximately 0%, and it was complete misery. I set about implementing the ideas of the book and even a 10%-level of adherence was like a fifty-ton boulder being removed from my back. It worked so well that it was like a blinding light of epiphany for co-workers, and we wound up hiring someone whose sole job it was to help get us further along. Today we&#39;re at about 50%, and it&#39;s easily five times better than it was at 10%, and infinitely better than at 0%. Still hoping to get to 100%, obviously, but there&#39;s no doubt that every aspect of the book makes releases smoother and less stressful. I simply don&#39;t think I could ever work any other way ever again, it&#39;s like finding out you&#39;ve been coding with a blindfold on for years.</p> <p><strong>What it changed:</strong> How I release software and bake releasability into my code.</p> <h2><a href="http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882">Clean Code</a> / <a href="http://www.amazon.com/The-Clean-Coder-Professional-Programmers/dp/0137081073">The Clean Coder</a></h2> <table class='image alignright' width='306'><tr><td><img src="http://www.nomachetejuggling.com/assets/cleanduology-300x191.jpg" width='300' height='191'/></td></tr></table> <p>Look at this, only a few items into my list and I&#39;ve already cheated by including two books as a single entry. Yes, <em>Clean Code</em> and <em>The Clean Coder</em> are two separate books, but honestly they&#39;re both very short, and very similar. Both books are about how a programmer should conduct him or herself professionally, they simply cover different aspects. Professional software developers communicate with their coworkers in two ways: through code and through everything else. <em>Clean Code</em> is about how you communicate with your co-workers (fellow programmers) through code itself, and <em>The Clean Coder</em> is about how you communicate verbally, or through e-mail.</p> <p>Both of these books, written by &quot;Uncle&quot; Bob Martin, really could easily be a single book with two large sections. Bob&#39;s philosophy toward professional software development is honest and direct, some would even say blunt. He makes no bones about it: fail to communicate in the way he describes, and you&#39;re bordering on professional negligence. It seems harsh but, frankly, I&#39;m convinced. Call me a believer. </p> <p>I definitely treat my code differently in light of his suggestions from <em>Clean Code</em>. It may seem strange that I categorize <em>Clean Code</em> as a book about communication, given that it&#39;s all about how to write code. But in the words of Abelson and Sussman, &quot;Programs should be written for people to read, and only incidentally for machines to execute.&quot; Machines will run code whether it&#39;s &quot;clean&quot; or not, but your coworkers will only be able to understand and work with your code if it&#39;s clean. <em>Clean Code</em> is about how to structure your code for others to read, or even for the future version of yourself to read.</p> <p>Even more than <em>Clean Code</em>, <em>The Clean Coder</em> had a profound impact on me. It drastically altered how I talk to bosses, product owners, project managers, marketers, salespeople, and other non-programmers. It advocates taking ownership of your screwups, being honest about abilities and deadlines, and up-front about costs. Not every co-worker you encounter will appreciate the approach outlined in <em>The Clean Coder</em>, but ultimately your customers will, because your products will be better for it.</p> <p><strong>What they changed:</strong> How I conduct myself professionally.</p> <h2><a href="http://www.amazon.com/Release-It-Production-Ready-Pragmatic-Programmers/dp/0978739213">Release It!</a></h2> <table class='image alignright' width='256'><tr><td><a href='http://www.amazon.com/Release-It-Production-Ready-Pragmatic-Programmers/dp/0978739213'><img src="http://www.nomachetejuggling.com/assets/releaseit-250x300.jpg" width='250' height='300'/></a></td></tr></table> <p>A product&#39;s life doesn&#39;t begin when you first create the source code repository, or write the first line of code, or even finish the first story. It begins as soon as it&#39;s launched into production, into the hands of real users. Everything before that is just bits, just plain text files on disks. So in a lot of ways, it&#39;s astonishing how much thought is put into the code for the period of time before it&#39;s really born.</p> <p><em>Release It!</em> places the stress on the real life of a program. It&#39;s all about monitoring, health checking, logging, and ensuring that applications remain operational. It&#39;s about baking in concern for capacity and stability from the start, and what needs to be done to keep a program operating even when there are outages, or broken integrations, or massive spikes in load. Most of all, it&#39;s about <strong>assuming</strong> that code will fail, backend servers will die, databases will timeout, and everything your software depends on will eventually go to hell. It&#39;s a completely different approach to software development, and it&#39;s completely eye-opening.</p> <p>Not to be too pejorative, but if you do enterprise application development, you probably shouldn&#39;t write another line of code before you read this book. I consider pretty much everything I&#39;ve written before it to be inadequate for real production use, even all the stuff currently in production. It covers patterns and anti-patterns to support (or subvert) stability as well as capacity, and the section of the book covering these topics is simply excellent. But then it goes beyond that to also discuss Operational enablement. Even if you&#39;re not into DevOps, and don&#39;t want to really be involved in DevOps work, this book gives you the tools and tips to do what aspect of DevOps is the purview of pure developers. </p> <p><em>Release It!</em>&#39;s tactics will make you your operations team&#39;s favorite person, and greatly help cover you and your teams ass in the eventual case of catastrophic failure somewhere. The patterns sections alone are worth the price of admission here, and the fact that the book is chock full of even more useful content beyond them is kind of stunning. </p> <p><strong>What it changed:</strong> What I consider to be &quot;production-ready&quot;, and how I view Operations.</p> <h2><a href="http://www.amazon.com/First-Design-Patterns-Elisabeth-Freeman/dp/0596007124">Head First Design Patterns</a> / <a href="http://www.amazon.com/Patterns-Enterprise-Application-Architecture-Martin/dp/0321127420">Patterns of Enterprise Application Architecture</a></h2> <table class='image alignright' width='306'><tr><td><img src="http://www.nomachetejuggling.com/assets/patterns-300x189.jpg" width='300' height='189'/></td></tr></table> <p>No list like this would be complete without a book about design patterns. But where&#39;s the famous &quot;Gang of Four&quot; book, you ask? Not on this list, that&#39;s where. Honestly, GoF was a pretty groundbreaking book at the time, but I personally think the presentation of the information it contains is awful. I believe everything presented in GoF is presented better in <em>Head First Design Patterns</em>. I know that not everyone is crazy about the Head First series, and even I find the structure and layout of the book grating at times, but I think the diagrams and visuals are light years better than those of GoF. </p> <p>I also think Head First does a better job of providing <em>contextual</em> examples. While GoF provides sample code implementing the pattern, I feel that <em>Head First Design Patterns</em> provides a more valuable context for its examples, with more explanation about what the code is doing and what it&#39;s for. This helps readers understand <em>when</em> to use specific patterns, which I feel is the most important thing to learn when learning patterns. Too often, people read their first design patterns book and immediately decide to implement as many as they can. This is the wrong approach to take with patterns, and I think Head First&#39;s contextualization and strong visuals make it easier for readers to avoid this mistake. <a href="http://www.codinghorror.com/blog/2005/09/head-first-design-patterns.html">Jeff Atwood disagrees</a> and I can see his point, but I think overall this book is better in this regard than the classic GoF.</p> <p><em>Patterns of Enterprise Application Architecture</em> is the GoF book, but at the level of architecture rather than code. Like GoF, it is extremely dry, and somewhat difficult to get through cover to cover, working better as a reference book than a reading book. It does a very good job, however, of managing to still provide ample context, describing when you&#39;d want to use (or avoid) a particular pattern. I can&#39;t tell you how many times I&#39;ve referenced this book.</p> <p>Patterns provide great &quot;templates&quot; to use when solving common problems. They need to reached for with great care to avoid overuse, but when utilized appropriately can give developers a great deal of confidence in the time-tested designs they outline. Additionally, they provide a shared vocabulary among developers that greatly aids communication about complex topics. Describing the exact kind of hamburger you want to a Burger King employee is difficult when you have to describe every single element of the meal, but it&#39;s much easier when you can simply say &quot;number 5&quot; and you both know exactly what is being ordered.</p> <p><strong>What they changed:</strong> How I design and discuss my software, both at the code and architecture level.</p> <h2><a href="http://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052">Working Effectively with Legacy Code</a></h2> <table class='image alignright' width='232'><tr><td><a href='http://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052'><img src="http://www.nomachetejuggling.com/assets/legacycode-226x300.jpg" width='226' height='300'/></a></td></tr></table> <p>My first job out of college was replacing a developer who had left the company, as the sole responsible engineer on a massive and extremely complex codebase. Working in this codebase was terrifying, any change I made had the potential to break almost anything, and there was no way to test any changes without pushing a jar to the production system and watching it go. I checked over every change I made about a thousand times, and hand-constructed little <code>public static void main</code> classes just to instantiate classes and invoke methods, and then hand-check results. I had never heard of unit tests at this point (evidently, neither had my predecessor), so everything was done with kid gloves.</p> <p>It wasn&#39;t until 2 jobs later that I actually read <em>Working Effectively with Legacy Code</em>, which describes exactly how to deal with systems like these. The book explains how to take yourself from having no confidence in the codebase or your changes, to having complete confidence in them. It&#39;s not simply about how to effectively manage yourself in the hole you&#39;ve found yourself in, but exactly the tactics you can use to dig yourself out of the hole. It&#39;s organized extremely well, indexed largely by actual complaints you might have about an inherited codebase. If I&#39;d read this book earlier, my first job experience would have been much less stressful, and much more rewarding.</p> <p>One important thing to realize is that &quot;Legacy Code&quot; doesn&#39;t refer exclusively to million-line Cobol codebases. As soon as code is written and deployed somewhere, it&#39;s legacy code from that point forward. Every codebase you&#39;ve worked on that you didn&#39;t write yourself as a greenfield project is a legacy codebase, and the methodology of the book will help. Once upon a time in my career, inheriting another developer&#39;s codebase was frightening for me, and I&#39;d often react (as so many developers do) by immediately wanting to do a full-scale rewrite of any codebase that&#39;s too complex for me to manage. Thanks to this book, I have no problem inheriting code written by others, even if they&#39;re no longer around.</p> <p>Moving to a new job is less intimidating to me now, and I often spend the first few months of my time somewhere new simply getting the scaffolding in place to make changes confidently later on, increasing unit test coverage and breaking code into smaller and more isolated chunks. The full-scale rewrite is no longer the first tool I reach for in my toolbelt, it&#39;s the last one, and I feel confident that I can refactor nearly any codebase into something I&#39;m comfortable working on.</p> <p><strong>What it changed:</strong> How I feel about inherited codebases, and how I manage my confidence working with them.</p> <h2><a href="http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672">Refactoring</a> / <a href="http://www.amazon.com/xUnit-Test-Patterns-Refactoring-Code/dp/0131495054/">xUnit Test Patterns</a></h2> <table class='image alignright' width='306'><tr><td><img src="http://www.nomachetejuggling.com/assets/refactoring_xunit-300x196.jpg" width='300' height='196'/></td></tr></table> <p>I think most recent college graduates, myself included at the time, are &quot;cowboy&quot; coders. I used to have all the changes in my head, and just tried to get them fed from my brain into the compiler as quickly as I could, before I forgot all the stuff I wanted to do. Today, I cringe when I think about how many characters of code I&#39;d type between actually running or testing my software; &quot;waiting for the compiler is just going to slow me down, let me get all the code written first and then I&#39;ll debug it!&quot;</p> <p>Learning the technique of refactoring, in which you change the structure of code without changing the behavior, forces a mental split. You realize that &quot;coding&quot; is really two jobs, and that structure and behavior should be altered and tested independently, never at the same time. Martin Fowler&#39;s <em>Refactoring</em> is a collection of structure-but-not-behavior changes that really provides the toolset for a lot of other books on this list. <em>Refactoring</em> is so important that, depending on what language you work with, you may not even think you have to actually read it: your IDE probably supports many of the operations it describes out of the box. Nonetheless, it is a critical read, as it puts the reader in the mindset to understand the two hats they must wear as a coder, and how to intentionally change from &quot;coding&quot; to &quot;refactoring&quot;.</p> <p>Of course, refactoring goes hand-in-hand with unit testing. There are hundreds of books covering unit tests and test-driven development, but none of them that I&#39;ve seen break things down as well as <em>xUnit Test Patterns</em>. The book covers everything a programmer needs to become a unit testing badass, how to work with mocks and stubs, how to recognize problem smells in tests, how to refactor tests, and tons more. It&#39;s not about a specific technology or tool, it&#39;s about unit testing best practices in general, and my attitude toward testing and the kinds of tests I write are much improved because of it.</p> <p>Refactoring and testing are essential tools in the programmer&#39;s toolchest, and these two books cover all of the mechanics and tools one needs to master those tools. <em>Refactoring</em> focuses on improving the structure of your code, <em>xUnit Test Patterns</em> focuses on improving the structure of your tests, and your code and tests form a symbiotic bond of code quality. These two books are, in a lot of ways, two sides of a very important coin.</p> <p><strong>What they changed:</strong> How I approach altering existing code, and how I ensure I&#39;ve done so correctly.</p> <h2><a href="http://www.amazon.com/The-Passionate-Programmer-Remarkable-Development/dp/1934356344">The Passionate Programmer</a> / <a href="http://www.amazon.com/Land-Tech-Love-Pragmatic-Life/dp/1934356263">Land the Tech Job You Love</a></h2> <table class='image alignright' width='306'><tr><td><img src="http://www.nomachetejuggling.com/assets/career_books-300x225.jpg" width='300' height='225'/></td></tr></table> <p>Okay, I get it, I&#39;m terrible at making these lists, and clearly should have just done a &quot;Top 15&quot; or something. In any case, landing that first job out of college is tough, but eventually the day comes when it&#39;s time to move on. <em>The Passionate Programmer</em> is largely about how to find the right kind of job for you, what to look for in tech companies, and how to manage the direction of your career. It&#39;s pretty high level, but full of extraordinarily important advice to ensure you find yourself at companies that fit you and that you fit into well. <em>Land the Tech Job You Love</em> is more about the mechanics of this process, how to write a resume, how to interview, how to negotiate a salary, and the like. This is another situation where really two books are so closely related that they&#39;d be better as a single larger book.</p> <p>These books helped give me confidence to understand the process of hunting for and getting a job as a programmer. It completely shifted my mentality, from being the unqualified person begging a company to give me a job, to being a competent and capable engineer simply searching for a mutually beneficial fit. It changed how I view the job hunt, and how I conduct myself in interviews. After reading these books, I completely scrapped my entire resume and created a new one from scratch.</p> <p>In a lot of ways, these books inspired me to create this very blog, or at least adjust what I used it for. I view my various online profiles as part of my &quot;brand&quot; and I think my viewpoint shift in this regard informs a great deal of what I post here, on twitter, and elsewhere. Yes, even all the inappropriate swearing (companies should probably know what they&#39;re getting into with me). </p> <p>I have a lot of confidence about my career now, and I don&#39;t live in fear of losing my job or being unable to find a new one. I think about my career differently, as a very planned and deliberate thing, not just a series of jobs. It makes me excited about my future as a programmer, rather than concerned and fearful, which is a liberating sensation.</p> <p><strong>What they changed:</strong> How I view and manage my career.</p> <h2><a href="http://www.amazon.com/Apprenticeship-Patterns-Guidance-Aspiring-Craftsman/dp/0596518382/">Apprenticeship Patterns</a></h2> <table class='image alignright' width='234'><tr><td><a href='http://www.amazon.com/Apprenticeship-Patterns-Guidance-Aspiring-Craftsman/dp/0596518382/'><img src="http://www.nomachetejuggling.com/assets/apprenticeship-patterns-228x300.jpg" width='228' height='300'/></a></td></tr></table> <p><em>Apprenticeship Patterns</em> isn&#39;t really a patterns book as the name implies, but it&#39;s content has been kind of shoehorned into the format, I assume to increase sales. Ignoring that flaw, <em>Apprenticeship Patterns</em> is the best book on Software Craftsmanship I&#39;ve read, and I&#39;ve read quite a few. I actually recommend it above <a href="http://www.amazon.com/Software-Craftsmanship-The-New-Imperative/dp/0201733862">Pete McBreen&#39;s Software Craftsmanship</a>, because it covers pretty much everything useful from that book, but excises some of the more unrealistic or naive bits, as well as the extremely long and pointless section about salary. <em>Apprenticeship Patterns</em> is a bugfix release for <em>Software Craftsmanship</em>.</p> <p>This book was the one that made really see the value in the Software Craftsmanship movement, and truly embrace it. I&#39;ve written elsewhere about <a href="http://www.nomachetejuggling.com/2013/02/02/brief-thoughts-on-software-craftsmanship/">why I like the Software Craftsman title</a>, but this was the book that convinced me to consider myself part of that crowd. Software Craftsmanship isn&#39;t just about what customers can expect from you, it&#39;s about what your fellow developers can expect from you, and what you should expect from yourself. It&#39;s not just about writing clean code, it&#39;s about having a clean career, if that makes any sense.</p> <p>I now put a much greater stress on my fellow engineers than I used to, and I care more about the team as a whole. In a lot of ways, this book takes the practices and techniques of many other books on this list and codifies them into an over-arching set of guiding principles. Software Craftsmanship as a movement can get a little culty at times, but I generally consider myself part of that cult, and I largely have this book to blame. The night time is the right time.</p> <p>What&#39;s especially great is this book is it&#39;s been licensed under Creative Commons, and is now <a href="http://chimera.labs.oreilly.com/books/1234000001813/index.html">completely free on the web</a>! Cool!</p> <p><strong>What it changed:</strong> How I view my responsibilities as a professional, and what I consider my true title.</p> <h2><a href="http://www.amazon.com/Art-Agile-Development-James-Shore/dp/0596527675">The Art of Agile Development</a></h2> <table class='image alignright' width='234'><tr><td><a href='http://www.amazon.com/Art-Agile-Development-James-Shore/dp/0596527675'><img src="http://www.nomachetejuggling.com/assets/theartofagiledevelopment-228x300.jpg" width='228' height='300'/></a></td></tr></table> <p>The first job I had out of college was pure chaos. No process, no estimation, no planning, nothing. Generally someone from marketing would stop by a programmer&#39;s cubicle and inform them that they just sold a few thousand dollars worth of seats based on a feature that didn&#39;t exist yet, so how long would it take to implement it? Being my first post-college job, I was in &quot;sponge mode,&quot; so I simply thought this was how it worked in the real world. It wasn&#39;t until my next job that I was introduced to Agile Development methodologies by way of Scrum, which was like mana from heaven. I was hooked.</p> <p>My job after that was at a company that wasn&#39;t just into Agile as a methodology, their core business was actually developing agile tools for other software shops to use. The entire company lived and breathed agile, so knowing agile was the same as understanding the core company domain. It would have been impossible to do my job without understanding agile, in more ways than one. So when I first took the job, I decided I needed to read an Agile book to make sure I knew my stuff. Based on the title, I picked up <em>The Art of Agile Development</em>. What I didn&#39;t realize at the time was that there were a lot of different agile methodologies, and in fact this book wasn&#39;t about Scrum, it was about XP.</p> <p>I became a die-hard XP programmer without even realizing it. My first exposure to &quot;XP Programming&quot; was a failed experiment in college that ruined it for me, I never would have knowingly bought a book on XP. But The Art of Agile Development changed how I do my job, it changed the processes I like to use when working with managers and other developers, and the practices I like to adhere to myself, such as Test-Driven Development, Spiking, Evolutionary Design, and the like. What&#39;s ironic is that I read this book to work at an agile company, only to find most of them disliked XP, and considered themselves Scrum only.</p> <p>What&#39;s nice about XP is that it&#39;s pretty individualistic. You can employ XP principles as a developer while working within Scrum, Kanban, Crystal, Lean, or whatever else. In fact, that&#39;s exactly what wound up happening: a small contingent of developers at this company including myself began working in a more XP-style within the confines of the company&#39;s Scrum processes, and our successes wound up infecting larger and larger groups of people until pretty much the entire engineering team was working similarly. When the company switched from Scrum to Kanban, it had little effect on how we worked.</p> <p>Today, my preferred way of working is with XP-style practices within a Kanban-style process, and an enormous part of that is because of this book. I wish I had a Kanban book to recommend as well to round this part of my list out, but 100% of my Kanban experience was gained on the job, with no books of any kind. What&#39;s more, having worked for three years at a company where agile was something bordering on a religion, I&#39;m pretty burned out on the topic in general, so other process-centric books on my &quot;to-read&quot; list have found themselves migrated towards the bottom. Nonetheless, in all of my reading, The Art of Agile Development was easily the most influential book on how I like to work. This one is pretty subjective, as I&#39;m pretty sure <strong>any</strong> good XP book would have had the same effect, but this was the one that did it for me, so I had to include it here.</p> <p><strong>What it changed:</strong> How I like to work in terms of processes and practices.</p> <h1>Honorable Mentions</h1> <p>There are a number of books that I didn&#39;t include in the above list, but that nonetheless had a large impact on my career. This, of course, despite the fact that I completely cheated in my Top 10 and included more than ten books. </p> <ul> <li><a href="http://www.amazon.com/Presentation-Patterns-Techniques-Crafting-Presentations/dp/0321820800"><strong>Presentation Patterns</strong></a> - Only an honorable mention because it&#39;s not <em>really</em> about software development per se, but I&#39;ve <a href="http://www.nomachetejuggling.com/2013/06/10/book-review-presentation-patterns/">written elsewhere</a> about how this book changed my life and I have to include it somewhere in this post.</li> <li><a href="http://www.amazon.com/Pragmatic-Thinking-Learning-Refactor-Programmers/dp/1934356050"><strong>Pragmatic Thinking and Learning</strong></a> - Learn more about your brain than you ever realized you needed to know. Though not specifically about programming, it&#39;s a very programmer-centric view of the mind, and how one can best work with your own mind and improve your ability to think and learn.</li> <li><a href="http://www.amazon.com/Effective-Java-Edition-Joshua-Bloch/dp/0321356683"><strong>Effective Java</strong></a> - I said I wasn&#39;t going to include any technology-specific books, but I can&#39;t help but mention <em>Effective Java</em> somewhere. I was programming in Java for years before reading this book, but afterwards I felt like a Java master. I almost never work with pure Java anymore, instead largely using other JVM-compatible languages, but the Java I wrote before reading <em>Effective Java</em> looks very different than the Java I wrote afterwards, and I definitely prefer the latter.</li> <li><a href="http://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215"><strong>Domain-Driven Design</strong></a> - I&#39;m such a blowhard, I haven&#39;t even read this book and I&#39;m listing it here. I include it because I have a hunch that, once I read a DDD book, it will have as profound an impact on me as the other books on this list. Unfortunately, I can&#39;t get through this book, because I really dislike the writing and organization of it. I&#39;m eagerly awaiting the release of the <em>Head First Design Patterns</em> to this book&#39;s GoF, but so far it doesn&#39;t seem to exist. I had hoped <a href="http://www.amazon.com/Implementing-Domain-Driven-Design-Vaughn-Vernon/dp/0321834577/">Implementing Domain-Driven Design</a> would be that book (so much so that I pre-ordered it), but alas it seems to assume the reader has already the original DDD book, so I&#39;ll have to keep waiting.</li> </ul> <p>So that&#39;s my complete list. I obviously have many, many more books to read, and I look forward to writing another list like this one in the future after being profoundly changed for the better some more.</p> <p>Have some books you want to add? Feel like telling me one of my favorite books is inferior to one of yours? Want to yell at me for not including <a href="http://www-cs-faculty.stanford.edu/%7Euno/taocp.html"><em>The Art of Computer Programming</em></a> (come on, you never read that shit and you know it)? Leave a comment!</p> Wed, 05 Feb 2014 00:00:00 -0700 http://www.nomachetejuggling.com/2014/02/05/top-10-career-changing-programming-books/ http://www.nomachetejuggling.com/2014/02/05/top-10-career-changing-programming-books/ CenturyLink: Traps and Caps <p><em>TL;DR: After a decade of service, CenturyLink decided I wasn&#39;t worth keeping as a customer, so I switched to Comcast Business Internet. Even if CenturyLink tells you that you have no data caps, you do.</em></p> <p>When I first moved to Colorado nearly a decade ago, I signed up for Comcast&#39;s Residential high-speed internet service, and I hated it. I had to reset my cable modem once every week because it would stop working properly, and my internet noticeably slowed down when people would get home from school/work in my apartment complex.</p> <p>I did some research and determined that, for the kinds of internet speeds being offered at the time (around 1-5Mbps down), Qwest&#39;s DSL had similar prices to Comcast. Additionally, because it was DSL, I could use my own Netgear router that had a DSL modem built in, and I wouldn&#39;t have to mess with company equipment. Also, DSL&#39;s speed varies based on your distance to a hub, not based on how many people are currently using it. I thought I could avoid both of my major problems by switching to DSL for about the same price, so I did, paying for the maximum possible speed at the time, 5Mbps.</p> <p>For many years, Qwest was the only monthly bill I never had any trouble with. Sometimes my cable would go out or look pixelated, sometimes my heating bill would be surprisingly massive, I was always having annoying issues with my cell phone service, but month after month, I never even noticed I had Qwest. It was just there, it worked, it never went down, it never slowed down. It was great.</p> <table class='image alignright' width='306'><tr><td><img src="http://www.nomachetejuggling.com/assets/Qwest-300x233.jpg" width='300' height='233'/><p class='caption'>The good ol' days.</p></td></tr></table> <p>As the years went by, Cable speeds seemed to be improving at a faster rate than DSL speeds. Nonetheless, I was happy with Qwest&#39;s customer service and I had bad experiences with Cable, so I stuck to DSL. One day, I got a mailer that 10Mbps was now available in my area. I called Qwest that day and upgraded. A year or so later, another mailer came with 20Mbps as an offer, and I upgraded immediately. Each time the price difference was less than double for double the speed, so it seemed worth it. I use a lot of internet, and I still missed my University&#39;s T3 line.</p> <p>Eventually Qwest became CenturyLink after an acquisition/merge. I was a bit worried at first, I was happy with Qwest not only from a technical standpoint, but from a customer service standpoint. Would this change? I could always tell that Qwest representatives were especially friendly to me after they saw how long I&#39;d been a customer, I feared I&#39;d lose my &quot;standing&quot;. But, CenturyLink one day sent me a letter offering &quot;fiber&quot; internet, 40Mbps down, 5Mbps up. Upgrading bumped my price up to about 100 a month, which was a lot, but I really do use the everloving crap out of some internet, so I did it.</p> <p>Many people on Twitter and Facebook asked me about internet providers, and I&#39;d always talk up CenturyLink. Fast internet, good customer service, no downtime. And best of all, this was around the time that cable companies started introducing usage caps on their cable internet. I found this maddening for both philosophical and technical reasons, but <strong>CenturyLink had no such caps, so I&#39;d often argue it was a better choice for heavy internet users like myself</strong>. I know that I influenced a handful of people to get CenturyLink, or even in a few cases to switch to CenturyLink off Comcast.</p> <h1>The First Warning</h1> <p>In February of this past year, I was at work and decided I wanted something off my computer at home. I tried to SSH into my workstation at home but was unable to connect. This was strange. Like I said earlier, CenturyLink never went down, so it made no sense to me. Thinking maybe my workstation had crashed or died, I tried connecting to my home VPN, and that didn&#39;t work either. There are a few services I run on various machines that sync with centralized servers, such as <a href="http://www.subsonic.org/pages/index.jsp">Subsonic</a> and <a href="http://www.plexapp.com/">Plex</a>, so I tried connecting to them, only to discover they too had lost connectivity to my home. I even tried pulling up my <a href="https://nest.com/">Nest</a>, and saw that even that had lost connectivity to the outside world.</p> <p>Here&#39;s how much confidence I had in CenturyLink: <strong>I actually thought the power must be out.</strong> I went home at the end of the day, fully expecting to walk into a cold house that had been without power for a portion of the day, and assuming I&#39;d have to go around resetting clocks and booting up computers. But to my surprise, the house was fine. All the clocks had the right time on them, the power had never gone out. It was an internet problem.</p> <p>I sat down at a computer and opened up a web browser. Instead of my home page, I got this:</p> <table class='image aligncenter' width='586'><tr><td><img src="http://www.nomachetejuggling.com/assets/centurylinkuse-580x391.png" width='580' height='391'/><p class='caption'>No 'net for you!</p></td></tr></table> <p>This was why none of my devices were connectable. Every outgoing connection was pulled into some weird walled garden with this message, and I wasn&#39;t able to get my internet back until I clicked Continue to acknowledge I&#39;d gotten the warning. </p> <p>Like I said, and like I had told many people, CenturyLink <strong>had no usage caps</strong>. I had never heard of this Excessive Use Policy before, I didn&#39;t remember getting a letter saying one had been implemented. I used quite a lot more internet in January than usual, but I had no idea it was something I needed to curb. </p> <p>Totally baffled by this, I called the number in the notice. I asked what the policy was and the tech told me to hold on while she looked up my account. Alright, I thought, this is good. Generally as soon as they look up my account, they see how long I&#39;ve had service with the company and their tone becomes super-friendly. Sure enough, when she came back on the line, she was quite friendly. <strong>She told me that, because I pay for the highest tier internet the company offers, 40Mbps down, that the Excessive Use Policy does not actually apply to me.</strong> She said the notice was in error, I wasn&#39;t supposed to get it. She said she&#39;d flip a flag to make sure I never get another notice again. I thanked her and asked her to please make a note of this conversation in my account, so that it would be there in case it happened again and I had to call back. She said she would, but reiterated that it was not necessary, as it would not happen again.</p> <p>When I first got the warning message, I posted it to my Twitter, expressing some irritation. A bunch of friends asked me what happened, since I was always talking up CenturyLink. After I got off the call, I posted again with an update, that it was all good, and I wasn&#39;t even supposed to get the warning. I publicly praised CenturyLink&#39;s customer service yet again.</p> <blockquote class="twitter-tweet" lang="en"><p><a href="https://twitter.com/CenturyLink">@CenturyLink</a> resolution: I&#39;ve been removed from the list of accounts that get such notices. Good on you guys, thanks Kensie. <a href="https://twitter.com/search?q=%23happycustomer&amp;src=hash">#happycustomer</a></p> <p>&mdash; Rod Hilton (@rodhilton) <a href="https://twitter.com/rodhilton/statuses/301883017645928449">February 14, 2013</a></p></blockquote> <p><script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script></p> <blockquote class="twitter-tweet" lang="en"><p><a href="https://twitter.com/CenturyLink">@CenturyLink</a>, my tweet about how well you resolved this issue has 2 of my friends considering switching from Comcast. :)</p> <p>&mdash; Rod Hilton (@rodhilton) <a href="https://twitter.com/rodhilton/statuses/301907519121530881">February 14, 2013</a></p></blockquote> <p><script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script></p> <h1>The Second Warning</h1> <p>I resumed business as usual, confident that the usage policy did not apply to me, happily using my internet like crazy. But a few months later, in May, I was working at home and, once again, I was presented with a similar walled-garden message. The first time I was surprised and alarmed, but now I was annoyed. I had already discussed this with a representative, and she assured me I wouldn&#39;t get another one of these.</p> <p>I called again, and hid my irritation, knowing that if I stayed friendly, as soon as the technician pulled up my account, they would see how long I&#39;ve been a customer and be friendly as well. Once again, the tech pulled up my account notes, and was immediately accommodating. I asked if my notes indicated I&#39;d called about this before, and the representative told me <strong>yes, he could see that I had spoken to the company a few months ago, and was told I was not supposed to get these.</strong> The representative put me on hold so he could call some other department and be certain that the proper flag was set so that I wouldn&#39;t get any more of these. After about 10 minutes, he came back and told me it&#39;s done, he&#39;s sure I won&#39;t get any more of these. I asked him to please make another note in my account that we had this conversation, and he said he did.</p> <p>Once again, I live-tweeted most of these interactions. And once again, people responded to it. One thing that kept popping up was, people advised me to look into Comcast Business Internet. They said it was more reliable than Comcast Residential, and had absolutely no data caps because it&#39;s for businesses. Curious, I looked into it, even going so far as calling a Comcast Business representative to ask some questions and get a plan priced out. I was surprised to see that the price for Comcast Business Class internet was about the same as what I was paying, for slightly faster access. All this time, I&#39;d been comparing Qwest/CenturyLink&#39;s price increases for more speed, never really comparing with competitors. </p> <p>Comcast Business looked interesting, but in the end, I didn&#39;t like the idea of having to sign up for a year or two of service ahead of time with a contract, and I didn&#39;t fully trust Comcast due to my experiences with the residential cable. The price of Comcast Business Internet was good, but the only real advantage was the removal of data caps, which I&#39;ve now had two CenturyLink representatives tell me don&#39;t apply to me anyway. My faith in CenturyLink restored, I once again went about my business.</p> <blockquote class="twitter-tweet" lang="en"><p>2nd Excessive Use warning from <a href="https://twitter.com/CenturyLink">@CenturyLink</a>. Called and they said (again) I&#39;d never get another. Love the customer support.</p> <p>&mdash; Rod Hilton (@rodhilton) <a href="https://twitter.com/rodhilton/statuses/334521053403549697">May 15, 2013</a></p></blockquote> <p><script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script></p> <h1>The Letter</h1> <p>I never got another walled-garden notice. Months went by, and I figured that the extra effort the CSR took to get me flagged properly finally worked, and I was in good shape. Then, on November 21st, I got a letter. Not a browser notice, not an e-mail, but a paper letter, sent via the post office. The last 3 times this company sent me something in the mail, it was to alert me of higher speeds in my area. This letter was decidedly different.</p> <table class='image aligncenter' width='586'><tr><td><img src="http://www.nomachetejuggling.com/assets/centurylinktermination-e1386560161832-580x576.png" width='580' height='576'/><p class='caption'>You're Terminated.</p></td></tr></table> <p>So many things annoyed me about this letter. The claim that this was my third notice was questionable, to start. Though I had gotten two previous warnings, both of them were in error according to CenturyLink customer service. So as far as I was concerned, I had gotten zero warnings. Additionally, the termination date was December 3rd, eleven days away. Eleven days to find a new internet provider, get signed up, schedule an install, get everything working? Infuriating.</p> <p>Once again, I held back my irritation, knowing that being friendly was always met by helpful representatives once they saw how long I&#39;d been a customer. I called the number on the letter, which connected me to technical support, and person who I will call Jordan. <strong>Jordan checked my account and said that my account was not flagged for termination, had no excessive use flags on it, and was in good standing.</strong> He called the letter a &quot;miscommunication&quot; and said I would not have my service ended. This was good news, so I relaxed a bit. I did, however, ask if he saw the two notes on my account from previous calls about similar issues, and he said that there were no notes on my account. That made no sense to me, the second time I called, the person I spoke with specifically mentioned seeing the note from the first time I called, so how could it be gone? Jordan informed me it might be a &quot;business note&quot; and I should call the business office on Monday, because he only had access to &quot;technical notes&quot;.</p> <p>I called the business office on Monday using a number Jordan gave me and spoke to a second CSR, who I will refer to as Taylor. Taylor verified two things for me. One, I absolutely did not have any notes on my account about previous phone calls. And two, <strong>my account was just fine, I was not set to be terminated, I had nothing to worry about</strong>. Again, I relaxed some more, but then Taylor suggested we conference-call someone from the &quot;Securities Office&quot; just to triple-check. She got an employee, who I will refer to as Howard, on the line.</p> <p>Howard did some checking and gave me some news that stunned me. <strong>The excessive use policy <em>does</em> apply to my account, and I am indeed flagged for termination on the 3rd, now in eight days.</strong> I was almost at a loss for words. I was told to ignore both warnings by CenturyLink employees previously. I called the number <em>on the termination notice</em> and was told my account was fine, and even followed up with a second call to double check it. Even that call said I was fine. It wasn&#39;t until I talked to a third person, fifth overall, that I was finally told for the first time that the policy applied to me, and I was being told not only that but that as a result my service was being terminated in eight days.</p> <p>I finally got the details on the Excessive Use Policy from Howard. He told me that the limit for usage is 250 GB per month for any service at 1.5Mbps and up. Anything above that was a violation of the policy. I wasn&#39;t sure I understood, so I asked for clarification, &quot;you mean that someone who is paying for 40Mbps down and someone paying for only 1.5Mbps down have same usage cap?&quot; and Howard answered, &quot;correct.&quot;</p> <p>&quot;So even though I&#39;m paying more than quadruple what my 1.5Mbps neighbor is, he and I have the same maximum?&quot;</p> <p>&quot;Yes.&quot;</p> <p>I did a quick calculation. 40 megabits per second is 5 megabytes per second. 250 GB is 256,000 megabytes. That means, if I were to saturate the bandwidth I&#39;m paying for, I could use up my entire allotment in 51,200 seconds. 14.2 hours. I asked Howard if this was the case and he informed me that it was.</p> <p>This was about the time I decided to stop being so friendly. I explained that it was ridiculous that I was having my service terminated in eight days when I&#39;ve gotten, as far as I&#39;m concerned, zero actual warnings that were legitimate. Howard explained that the CSRs I talked to previously were misinformed, as the policy does apply to me. He also said I had no notes about previous conversations in my account. As I mentioned, what&#39;s particularly surprising about that is that the second CSR mentioned the notes of the first, meaning that, if they were gone, they must have been deleted (or the second CSR lied). Amazing, too, that two independent CSRs would tell me the same thing incorrectly.</p> <p>I asked Howard to reset my &quot;warning&quot; counter back to zero, so I at least had a fair chance now that I knew the policy was in place. He was willing to reset me back to two. So my internet would no longer be terminated in eight days, but if I violated the policy one more time, I&#39;d get another letter of termination. In other words, <strong>I was now in a permanent position of possibly having my internet suddenly turned off within about a week</strong>.</p> <p>Howard suggested I look into CenturyLink Business Class, which removes the cap. He hung up, and Taylor (who was still on the line) conference called someone from the Business Internet department. The Business CSR informed me that the price would be about200 a month, double what I was paying at the time. I asked if it would at least be faster, and was told it would not be, 40/5 is the fastest CenturyLink gets. I tell him (and Taylor) I need to think about that a little more. The Business CSR hangs up, which unfortunately disconnects the entire call somehow.</p> <p>Ugh. I still had questions for Taylor, she said she would stay on the line after the Business call. I call back and get a new CSR, who I will call Brandon. I asked to be transferred to Taylor because she&#39;s been informed of my extremely long story, and I didn&#39;t want to have to repeat it all. Brandon informed me they are not able to transfer to people directly, only departments. I let out a sigh and once again recounted the entire story starting from my first warning up until that very moment. I explained to Brandon that it doesn&#39;t seem right to give me a data cap so low that I can bust out of it in 14 hours, and it seems that the caps should, at the very least, increase linearly with the speeds. Brandon agreed with me, agreed that I&#39;m not getting proper treatment, and asked to put me on hold while he gets to the bottom of this. <strong>While on hold, I was disconnected again</strong>.</p> <p>At this point I was in full-on pain-in-the-ass-customer mode. I called again, asked to speak to Taylor or Brandon, and was once again told they can&#39;t do that. So I asked to speak to the highest manager I can be transferred to, because if I have to tell the whole story again I want it to be at the highest level I can get. The CSR obliged, transferring me to someone I will call Terry. I told the entire story again. By the time I&#39;m done, I&#39;ve been on the phone for three hours in total. All I wanted at this point is to be reset to zero warnings so that I could try to get my usage down to acceptable levels without living in fear of termination. Terry told me he can&#39;t really help me as a Customer Support person, and offered to transfer me to Securities. Fine.</p> <p>I was transferred to Securities again and spoke with a Securities Agent. She looked up my notes and informs me that Howard already did me &quot;a big favor&quot; by resetting me back to 2 warnings. She said there was nothing further she was willing to do for me. I asked how, exactly, I&#39;m supposed to even get my usage down to their limit when my next violation means termination. She told me there are free tools I can install on my computer to monitor usage. That&#39;s rich. I&#39;m supposed to install these tools on every computer in my house, both mine and my wife&#39;s, plus our phones, running the gamut of Linux, Windows, OS X, and Android? The best I can do is look at my router, which tells me how much traffic I used in a day, so I&#39;d have to check it at the end of each day and manually total it up. I started thinking about writing a shell script for this, and then chastised myself for playing into this nonsense. The Securities Agent once again recommended I switch to CenturyLink Business Class, all for the low-low price of double what I&#39;m paying now for the exact same service.</p> <h1>The Defeat</h1> <p>Completely defeated, I hung up, and I started looking at Comcast Business Class again. If I were willing to pay $200 for internet, I could get Comcast Business Class&#39;s fastest speed, 100Mbps down, 20Mbps up, with no data caps. Hell, at my current price of$100, I could get 50 down and 10 up, 10Mbps faster downloading, with double the upload speed, and still no cap.</p> <p>I called Comcast and got some more info. I even had a contract drawn up, ready to sign. At this point, I couldn&#39;t justify staying with CenturyLink any longer. I could remove the data caps from my life with no additional cost just by switching providers, and I would even get a bonus of slightly faster speed. I obviously had reservations about Comcast due to my previous experience, but everyone I was talking to on Twitter indicated that the Comcast Business is a completely different branch of the company, that the techs really know their stuff and that the representatives are extremely helpful, because they are used to dealing with businesses.</p> <p>Speaking of Twitter, I was naturally live-tweeting everything that was happening with all of this. In addition to friends and colleagues responding, I actually got a response from CenturyLink itself. </p> <blockquote class="twitter-tweet" lang="en"><p><a href="https://twitter.com/rodhilton">@rodhilton</a> Hey Rod, our team can help look into that for you. Send us your acct info here <a href="http://t.co/V7SCkTtg1e">http://t.co/V7SCkTtg1e</a>&#10;Thanks, ^AshleyKay</p> <p>&mdash; CenturyLinkHelp Team (@CenturyLinkHelp) <a href="https://twitter.com/CenturyLinkHelp/statuses/405002367793254400">November 25, 2013</a></p></blockquote> <p><script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script></p> <p>After some more tweeting, I got this as well:</p> <blockquote class="twitter-tweet" lang="en"><p><a href="https://twitter.com/rodhilton">@rodhilton</a> Hi Rod, if you need additional help with this issue we can have our DSL Escalations Team give you a call&#8230;Thanks,Corey</p> <p>&mdash; CenturyLinkHelp Team (@CenturyLinkHelp) <a href="https://twitter.com/CenturyLinkHelp/statuses/405045978928926720">November 25, 2013</a></p></blockquote> <p><script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script></p> <p>So I decided to bite. Maybe this is a different team, who might really be able to do something for me. Again, all I wanted at this point was to be reset to zero warnings so I had a fighting chance.</p> <p>I filled out their form, writing 1,414 words explaining this entire story. I explained that Comcast had them beat on Business Tier service by a wide margin, and I&#39;d leave for Comcast before paying double for the same service from CenturyLink just to avoid being harassed. I also explained that this is my last attempt to remedy the situation with CenturyLink, that I&#39;d given them three hours of my Monday and I couldn&#39;t give them any more of my time. I reiterate I&#39;ve been a customer for a long time, and I&#39;d like to stay a customer, but that I needed this situation to be improved.</p> <p>I submitted the form and waited. I had a contract with Comcast Business Internet ready to sign in my inbox. If CenturyLink&#39;s help team could do something for me, I&#39;d keep them and try to figure out how to get my bandwidth to reasonable levels. If they wouldn&#39;t do anything for me, I&#39;d switch to Comcast, severing nearly a decade of loyal service. </p> <p>That night, I checked with my router to see what my bandwidth use for the day was. Just a normal day of working from home, no big media downloading, no movie or music streaming, nothing excessive. I used 10GB that day alone, and that&#39;s with trying my hardest not to use much. At that rate, I&#39;d hit the cap in 25 days, less than the month I&#39;m paying for. While I was tweeting about all of this, I had some friends ask me just what the hell I&#39;m doing that&#39;s using so much bandwidth. To be completely honest, I don&#39;t even understand the question. After seeing how much bandwidth I use on a day when I&#39;m giving it my full effort to minimize use, I have to wonder just how the hell everyone else is able to stay under their caps at all. It seems impossible.</p> <p>A few days later, I got a response from CenturyLink.</p> <blockquote> <p>Thanks for reaching out and sending such candid feedback on your experience. I understand your frustration, unfortunately there&#39;s no way I can change or stretch our policy. Up until this year you haven&#39;t hit over 250gb before in, as you mentioned, many years. You have since gone over the usage limit every month so far in 2013. We&#39;ve been very generous in the notices you&#39;ve received and when you&#39;ve received them. I apologize for the 2 representatives that provided you with incorrect information and therefore caused further turmoil in the matter. I am investigating that further so that proper feedback/coaching will be enforced. I wish there was something I could offer as far as a better price goes for the business usage, but there&#39;s no other option other than what you&#39;ve been told already. Please let me know what direction you&#39;d like to go with this and I&#39;ll take care of you to the end. If there&#39;s anything else additional I can help with, let me know as well.</p> <p>I wish there was a way for me to guarantee that you&#39;ll go back to &#39;zero&#39;, but that&#39;s not an option. As Howard already did for you, the forgiven process is the best than can be done. I understand your decision to try other venues for service you need. If there&#39;s anything else I can assist you with, please let me know.</p> </blockquote> <h1>The Switch</h1> <p>A Comcast technician installed my new Business Internet two weeks later. I know this post is way too long already, and I don&#39;t want to look like some kind of shill for Comcast, so let me just summarize with: <strong>why didn&#39;t I do this sooner?</strong></p> <table class='image alignleft' width='306'><tr><td><img src="http://www.nomachetejuggling.com/assets/comcast-business-300x168.png" width='300' height='168'/><p class='caption'>The good new days</p></td></tr></table> <p>We did a speed test before he left, and I was getting 57 Mbps down, 11.5 up. I&#39;ve had no issues with bandwidth dropping at all, it seems pretty consistent all day long; the lowest I saw was 48 down, which is still faster than my top speed with CenturyLink (about 37). I haven&#39;t had to reset the cable modem at all, it&#39;s a beefy, boxy beast of a thing from Netgear. No frills, no wireless, just a black box I hooked up to my existing router.</p> <p>I&#39;ve had no blips, no lags. I&#39;ve worked from home a few times since the install and I&#39;ve seen no drop-offs, disconnections, or slowdowns. I&#39;ve dealt with Comcast Business Internet representatives in the sales department, billing department, and technical support department, and all of them were extremely helpful and friendly. The Technical Support guy even helped me fix an issue I was having with my router, even though it wasn&#39;t Comcast-commissioned equipment.</p> <p>I actually feel bad for how many people I&#39;ve recommended go to CenturyLink. I know a nontrivial number of people have signed up with them based on my glowing recommendations over the years (this isn&#39;t self-absorption, they&#39;ve told me this). I think I&#39;d now only recommend residential CenturyLink to very light internet users, like my parents or in-laws. There&#39;s no good reason at all to use CenturyLink&#39;s business class service, which is massively overpriced for the service when compared to Comcast&#39;s offering. And the higher-speed tiers at CenturyLink are all hampered by data caps that can be blown out in less than a day. If all you want is 1.5-5Mbps down for light internet use, CenturyLink is the way to go for price, but for higher speeds it&#39;s a complete rip-off. The same high speeds can be found for cheaper at Comcast Business, with no data caps.</p> <p>It&#39;s unfortunate that things had to become so unpleasant with CenturyLink but it became clear that the company simply was not interested in keeping me as a customer. While I wish I could have left CenturyLink on different terms, I&#39;m glad I made the switch, and I hope the quality of service with Comcast Business Internet continues.</p> Tue, 17 Dec 2013 00:00:00 -0700 http://www.nomachetejuggling.com/2013/12/17/centurylink-traps-and-caps/ http://www.nomachetejuggling.com/2013/12/17/centurylink-traps-and-caps/ Diving Into Android <p>I&#39;ve finally written my <a href="https://play.google.com/store/apps/developer?id=Absolutely%20No%20Machete%20Juggling&amp;hl=en">first real Android app</a>. I dabbled a bit with Android development in the very early days, writing <a href="https://code.google.com/p/rallydroid/">an app that interacted with the web services</a> of the company I was working for at the time. This app was ugly, written for Froyo, and frankly barely worked at all. It was a 20% time project at my then-employer, but I never went back and worked on it after the initial effort, and never even bothered getting it packaged into the Android Market, largely out of embarrassment.</p> <p>I&#39;ve been wanting to get into Android development more seriously since that effort, because I overall liked the idea, and as a big Android user myself, I felt that it was essential <em>I be able to develop applications for my own device</em>, as being unable to do so was a lot like using Linux without the ability to write shell scripts.</p> <p>I&#39;ve taken two all-day training sessions on Android before as part of larger development conferences, and while I was able to suss out some basics about the lifecycle and other Android fundamentals from them, neither left me with any sense of real understanding of how I could develop something for Android that people might actually use. But at <a href="http://www.nomachetejuggling.com/2013/07/30/oscon-2013-a-review/">OSCON 2013</a>, I took an excellent half-day Android class taught by <a href="https://twitter.com/markog">Marko Garenta</a>. Among other things, he showed me, for the first time, how to write a modern-looking Holo app, how to use asynchronous background tasks, how to transition between multiple activities, and how to handle fragmentation issues. These were never touched on in my all-day sessions, and they&#39;re all large barriers to writing real applications.</p> <p>Once I left the class I had a sense that I actually now knew enough that, with some help from web searches, I could actually write an Android app. I just needed a good idea, so <strong>I tried to take notice of various itches in my life to see if I could scratch any with a phone app</strong>.</p> <h1>The Concept</h1> <p>After only a couple weeks, I found it. I use various tools to track my gym workouts, but each one is vastly overcomplicated, attempting to be the &quot;one fitness app to rule them all&quot;, so I wind up using about 5% of many different apps to track my health. This generally means navigating past features I don&#39;t care about or working around features I dislike. For example, when I go weightlifting all I want is to be able to track how much I lifted last time so I can increase it. I generally do sets until failure, so one workout might have 5 sets, but then after I increase the weight I might only be able to do 3. The program I use to track this, <a href="https://play.google.com/store/apps/details?id=je.fit.pro&amp;hl=en">JEFIT Pro</a>, demands I create workout routines consisting of certain exercises, then set each exercise to have a certain number of sets; it&#39;s all very rigid, and I find myself fighting with the app constantly to get out of my way and just let me track my workouts.</p> <p>So this became my itch. I wanted to write a very simple app that would:</p> <ol> <li>Let me add my own exercises to a list (JEFIT has its own predefined, and there are about fifty billion to scroll through)</li> <li>Easily let me log sets with a weight and a number of reps</li> <li>Save those logs to a simple-to-read JSON file stored on my SD card</li> <li>When I pull up an exercise, go through these logs to show me previous records for the exercise, so I can ensure I&#39;m increasing my weight</li> <li>Be a rest timer, counting down and alerting me when a rest is over after logging a set</li> <li>Work well in airplane mode (I usually use this at the gym to avoid getting phone calls and texts)</li> </ol> <table class='image alignright' width='174'><tr><td><img src="http://www.nomachetejuggling.com/assets/Screenshot_2013-08-25-15-10-59-168x300.png" width='168' height='300'/></td></tr></table> <p>In other words, <strong>a clipboard, piece of paper, pencil, and stopwatch, but on a phone</strong>. I didn&#39;t want it to have any more features than this, because I felt that would risk it being another app that just gets in my way and tries to dictate how I should work out. In fact, I specifically insisted that this app not even need internet permission, instead writing all log data out to the SD card for the user to sync however they please (I&#39;m using <a href="https://play.google.com/store/apps/details?id=com.ttxapps.dropsync&amp;hl=en">Dropsync</a>).</p> <p>I came up with a name as simple as the idea: <strong>Simple Strength Log</strong>. I also decided that, should the experience be a positive one, I could go on to write similar apps to track fitness and write to simple JSON files, like Simple Cardio Log, Simple Food Log, Simple Water Log, Simple Weight Log, etc. I like collecting data.</p> <h1>Development</h1> <p>Development of the app took me about one week. I expected this to be a month-long project as I sputtered my way along unfamiliar territory, but honestly it wasn&#39;t too bad. With what I learned from the OSCON session, I was able to get some basic functionality working pretty quickly, and any time I had a question on how to do something, <strong>99.9% of the time there was a StackOverflow post addressing it</strong>. Basically I started development after work on a Friday, spent every waking hour of my weekend working on it, worked after hours (and sometimes during lunch) during the week, and had it done by the next Friday. I took one more weekend with it before releasing, since a change I wanted to make was going to fundamentally alter the file format I was using, and it was simpler to wait than to release it and deal with parsing the legacy format.</p> <p>I used Eclipse for development, despite being an IntelliJ user, because we used Eclipse for the OSCON session and I wanted to hit the ground running. <strong>I hated using Eclipse</strong>, it&#39;s even more clunky and annoying than I remember. Obviously the keyboard shortcuts were unfamiliar, but honestly I find it to be a less capable IDE overall, and I found some of its quirks maddening. One thing that happened constantly was I&#39;d copy some code with Command-C, delete it, go somewhere to paste it, and it would paste the thing that was in my buffer previously, with the copy having been ignored. I&#39;d have to then undo the deletion, re-copy, re-delete, and re-paste. And before you say I probably wasn&#39;t hitting Command-C correctly or something, bear in mind that I use the clipboard like this in every application I use, including IntelliJ, and this only happens in Eclipse. The Android tools themselves were great, particularly the wizard for creating Android XML files with different constraints, and the UI/Layout editor. Hopefully I know enough now about Android that I can confidently use the new IntelliJ environment.</p> <table class='image aligncenter' width='586'><tr><td><img src="http://www.nomachetejuggling.com/assets/Screen-Shot-2013-08-30-at-4.07.48-PM-580x423.png" width='580' height='423'/></td></tr></table> <p>Overall, development went very smoothly. I felt like there was an enormous mountain to climb in terms of my lack of knowledge, but that the learning curve wasn&#39;t steep at all. Most development felt very natural, often the way to do something was the way I&#39;d expect to, so the principle of least surprise was satisfied. <strong>I generally found that, if you were meant to do something, the Android API made it dirt simple to do, and if you weren&#39;t, a StackOverflow post told you how</strong>.</p> <p>Being able to write in Java definitely smoothed the process. Being very familiar with Java and its conventions helped me move briskly through the development, I never had to think about language questions at all, focusing entirely on Android questions. One thing that was tough was, I&#39;m used to doing JVM development in languages like Scala or Groovy, and when I&#39;ve done Java in recent years I&#39;ve done so with the help of Java libraries that made it much easier to work with, like <a href="http://commons.apache.org/proper/commons-lang/">Apache Commons</a> and <a href="https://code.google.com/p/guava-libraries/">Guava</a>. But each jar file I downloaded increased the size of my tiny little .apk file substantially, so I often hand-rolled methods that I normally don&#39;t have to write. I wound up only including a library if I used a number of functions from it, and managed to keep my binary (just barely) under 1 MB.</p> <p>The two biggest challenges were, by far, layout and managing state. Layout was the easier of the two, largely because of the quality of the Eclipse tools. Managing state was very tricky however, in that you basically have instance fields in your activities, but can&#39;t trust that they have the values you think. Assignment to and from these fields needs to happen through various lifecycle methods and, while there are diagrams that illustrate the flow, it&#39;s sometimes difficult to know which lifecycle methods get called when, and it&#39;s tricky to trace through these steps to ensure that data is where you expect it to be. For example, if you call one activity from another, the lifecycle methods that get called on the parent differ depending on whether you return to it by hitting the &quot;up&quot; button on the action bar or hit the &quot;back&quot; button of your device.</p> <table class='image alignleft' width='174'><tr><td><img src="http://www.nomachetejuggling.com/assets/Screenshot_2013-08-30-12-50-37-168x300.png" width='168' height='300'/></td></tr></table> <p>Managing state was a particular challenge for this app, because I refused to store any persistent data inside of internal databases the way most apps do. Instead, I wanted to read and write from a large collection of json files on the SD card, which means disk access on the slowest part of the phone, reading from a particularly slow-to-parse file format, and serializing/deserializing frequently. In other words, <strong>my persistence and unpersistence operations were particularly slow</strong>, and I had to take a lot of extra precautions to avoid working with them in the main UI thread to avoid the dreaded &quot;Force Close&quot; popup.</p> <p>Tracking down bugs due to my understanding of lifecycle methods and state management took the majority of my time developing. Even now, my code is littered with an overabundance of null checks for extra safety.</p> <p>The other big challenge was layout and UI. Simple layouts were very easy, particularly with the tools, but <strong>any time I wanted to be slightly complex or specific with my layout, it was a struggle</strong>. I love the ability to handle fragmentation and different screen sizes by making alternative xml layouts with the same component ids and specify &quot;this layout is for landscape mode&quot; or &quot;this landscape is for large screens&quot;. That&#39;s a cool feature and it makes things easy. But any complex layout often wound up being a nightmare, with me being essentially forced to create lots of nested LinearLayouts with different weights. The tool specifically warns me that this is bad for performance, but frankly it always works fine on my phone so I kind of ignored the warnings. I really like the notion of defining behaviors in code and interface/strings/UI stuff in XML files, I held myself to preserving this separation even when I was having a tough time making something look right in XML.</p> <p>Often the UI didn&#39;t work the way it seemed like it was supposed to. For example, I wanted my ActionBar title to be a drop-down to select different filters for the exercise list (Favorites, Chest exercises, Leg exercises, etc). When I implemented it the way the documentation indicated, it was impossible to properly set the text color to white, even though the title was white before (as specified by me in a style file) and the ActionBar background was dark. I tried every manner of customization but was simply never able to find the magic incantation to make it work. Additionally, the pop-up menu with the dropdown list was black on gray rather than white on black like the other pop-up menus. Again, even with the help of StackOverflow, I was unable to figure out how to fix this, so <strong>I wound up writing a whole bunch of custom components to make it work right, which was annoying</strong>.</p> <p>Another frustration I had was when I tried to create an AlertDialog with a NumberPicker inside. No matter what I did, the Dialog background and NumberPicker foreground were both white, making it impossible to use. I wound up completely re-designing my UI to work around this. In the end, <strong>I like what I wound up with quite a bit more than my original plan</strong>, but it was frustrating that I was unable to do something that the documentation gave me all indications I should be able to do.</p> <p>The Android SDK and related tools provide a way to run emulators of various devices for testing your apps, and I did this for a while but frankly found the whole process very slow. In the end, <em>I wound up doing almost all development with my actual phone connected</em>. This was faster, gave me a more accurate sense of how the app would work, and frankly I got a kick out of seeing something I wrote on my actual phone that I use every day. As a bonus, my phone always had the last version I tested on it, so I was easily able to test my app at the gym to work out kinks (get it? WORK OUT kinks? har har har) well before releasing it. I also had a tablet that I tested on, but never ran the emulator again after using my phone, so I have no idea if my app works like shit on other devices.</p> <table class='image alignright' width='174'><tr><td><img src="http://www.nomachetejuggling.com/assets/Screenshot_2013-08-25-15-11-33-168x300.png" width='168' height='300'/></td></tr></table> <p>I dealt with the Android version fragmentation as poorly as I could have: <strong>screw you if you have an old phone</strong>. I would write code using specific features of the Android API, and whenever ADT would warn me that I was using an API that was newer than my target API, I just bumped my target API. What originally started as an app that would work on Froyo quickly became an app that would work on Honeycomb, as I found the hoop-jumping needed to work around not having an ActionBar simply not worth the hassle. Shortly after, I wound up wanting to use some simple function that required Ice Cream Sandwich as the target. This function would have been easy to write on my own, but it was even easier to just bump my target API again. Not exactly the tactic I&#39;d take if I were doing Android professionally, but good enough for something I&#39;m doing in my spare time. Hey, I made a setting to let people switch from Imperial to Metric units even though I live in the U.S., what more do you people want from me?</p> <p>I wound up never writing a single test for my project, which is very much against my normal patterns of development. I felt annoyed having to test and re-test my app my hand after making changes, but I found the unit testing stuff too difficult to set up, and my app too small to bother with. I often wanted to just write simple unit tests against my <code>Util</code> class, but the only way to test a single class is apparently to set an entire Test Project version of the app, and it was all too convoluted to bother with. Maybe next time.</p> <h1>Publishing</h1> <p>Publishing the app to the store was pretty easy. I had come under the false impression this involved getting certificates and other crazy crap, but it was much simpler than all that. The documentation on the Android site was actually pretty confusing, but I eventually fumbled my way through creating a signed, zipaligned (that&#39;s important) apk and getting it into the Play Store.</p> <p>Working with the Store is easy, updating your apps, changing the descriptions, <strong>all of that is cake</strong>. The web UI built around managing your Android Developer Console is one of Google&#39;s best, definitely the easiest part of this whole process.</p> <p>In the end, I had <a href="https://play.google.com/store/apps/details?id=com.nomachetejuggling.ssl&amp;hl=en">an app in the Play Store</a>. Just seeing my own app in this store, searchable on the web or in the app, was a trip. It was like seeing yourself on television. This isn&#39;t a place for me, it&#39;s a place for professionals, but there I am! My app! My wife got such a kick out of it that she installed it and put it on her home screen, despite not using the gym.</p> <p>I released the app for free, and made the source available on GitHub <a href="https://github.com/rodhilton/SimpleStrengthLog">here</a>. In today&#39;s Android ecosystem, this seems to be increasingly rare, it&#39;s become a lot more like the App Store, with a lot of apps that cost $2, or have a free version with a$2 pro version key. I rarely see Android apps open sourced anymore, but I did it anyway because when I first <strong>adopted</strong> android, it was the norm. And since it was one of the reasons why I decided I liked the Android ecosystem in generally and got my first Android device, I felt like I should preserve it. The <a href="http://www.engadget.com/2008/10/16/t-mobile-g1-review/">T-Mobile-G1</a>-buying version of me would have wanted me to keep it open.</p> <h1>Android in my Future</h1> <p>I really enjoyed my Android experience. In fact, I set about writing the followup, <a href="https://play.google.com/store/apps/details?id=com.nomachetejuggling.scl&amp;hl=en">Simple Cardio Log</a>, and completed it in about 4 days, largely stealing a lot of code from Simple Strength Log. While developing it, I learned a bit more, especially about the Android UI, that I wound up backporting back into the Strength Log.</p> <table class='image alignright' width='174'><tr><td><img src="http://www.nomachetejuggling.com/assets/Screenshot_2013-08-29-21-07-13-168x300.png" width='168' height='300'/></td></tr></table> <p>I definitely intend on doing more Android development. I do indeed plan to write the followup apps like Simple Food Log (my next one) and maybe even a non-free apps that work with the output files.</p> <p>I now feel about my phone the way I feel about my desktop machines, in the sense that if I have an issue on the device I want to solve, I feel competent being able to write software that runs on it to solve the problem. I&#39;ve already responded to a few complaints my wife has made about various things with &quot;maybe I&#39;ll write a tiny Android app for you to fix that.&quot; I&#39;ve even inquired a bit at work about which team works on my company&#39;s Android apps, to consider if I&#39;d like to work on them as well (yeah, my company is so large I literally don&#39;t even know who works on the Android apps).</p> <p>Android is a fun platform to develop on, and it&#39;s come a long way since I first tried back in the days of Froyo. It&#39;s a lot easier to write good-looking apps now, utilizing Android APIs to implement common patterns on the Android platform. There is now a wealth of information out there, with tons of books and the indispensable <a href="http://stackoverflow.com/questions/tagged/android">StackOverflow</a>, which is a welcome shift from when I first wanted to write an Android app and there were only 3 books on the subject, all out of date by the time I got them. The Android platform is stabilizing and maturing, and the documentation is reaching a point where it&#39;s actually almost helpful, so writing an app was a lot more fun than I expected going in.</p> <p>When all done, I had a whole bunch of new knowledge under my belt for writing applications, I have a skill I can add to my resume, a field that I&#39;d definitely consider in future employment and, best of all, I finally have apps to track my workouts on my phone.</p> Fri, 30 Aug 2013 00:00:00 -0600 http://www.nomachetejuggling.com/2013/08/30/diving-into-android/ http://www.nomachetejuggling.com/2013/08/30/diving-into-android/