Absolutely No Machete Juggling Rod Hilton&#039;s rants about stuff he cares about way too much. http://www.nomachetejuggling.com 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> <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 +0000 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> <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 +0000 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 successor), 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, are &quot;cowboy&quot; coders. We have all the changes in our heads, and just try to get them fed from our brains into the compiler as quickly as we can, before we forget all the stuff we want 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 +0000 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 about $200 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 +0000 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 +0000 http://www.nomachetejuggling.com/2013/08/30/diving-into-android/ http://www.nomachetejuggling.com/2013/08/30/diving-into-android/ OSCON 2013: A Review <p>This year, I went to O&#39;Reilly&#39;s Open Source Convention, <a href="http://www.oscon.com/oscon2013">OSCON</a>. Every year for the last four years, I&#39;ve gone to a big tech conference. For the last three, I went to NoFluffJustStuff, which was later renamed <a href="http://uberconf.com/">UberConf</a>. UberConf is held in my home state, I can drive to it from my house every day so there&#39;s no plane or hotel involved, which makes it inexpensive enough that I&#39;ve been able to get my employers to pay for it. However, due to having attended UberConf consecutively for three years, last year I&#39;d seen about half the sessions already either in previous years on at local Java User Group meetings, so I decided that this year I&#39;d try something different.</p> <p>OSCON was a radical departure for me. UberConf is a &quot;Java/Agility&quot; conference, and since I work almost exclusively with the JVM in an Agile environment, it&#39;s more or less custom-tailored to my interests. OSCON, however, had a huge variety of different tracks and a similarly varied group of attendees. There were Python folks, Ruby folks, hardware hackers, system admins, operations gurus, cloud nerds, data geeks, perl wonks, and more. I picked OSCON because, while the variety was less tailored to my interests, the sheer number of tracks (18 concurrent sessions per time slot!) made up for it.</p> <table class='image aligncenter' width='586'><tr><td><img src="http://www.nomachetejuggling.com/assets/IMG_20130721_145702-580x435.jpg" width='580' height='435'/><p class='caption'>OSCON!</p></td></tr></table> <p>Here is my review of the OSCON experience. OSCON was the first conference I&#39;ve been to outside of my home state, and really the first one not run by the Rocky Mountain Software Symposium. As such, it will be unavoidable that I will be comparing it largely to my UberConf experience, since it&#39;s my only real frame of reference. I will try to address each element of the conference separately.</p> <h1>Sessions</h1> <p>First thing&#39;s first, how were the sessions? I don&#39;t go to tech conferences to network or hand out business cards, though I hear that&#39;s half the point. I treat conferences like an intense week of school, I take notes and try to learn as much as I can in the sessions. A tech conference&#39;s quality is going to be 95% the quality of the sessions for me, so they&#39;re the most important thing by far.</p> <p>As I mentioned earlier, I was initially worried that the lack of narrow focus on my area of work would make it difficult to find sessions I wanted to attend. For the most part, this wound up not being the case. I actually really enjoyed being able to venture out of my typical comfort zone and, while most of my sessions did still revolve around the JVM, I attended a few sessions about Google Go, Hadoop, Android development, ops, Erlang, vim, JavaScript, mathematics, Arduino, and NoSQL. I probably learned more from the JVM-related sessions, but it was fun to attend some of these sessions and learn about stuff I&#39;m not normally exposed to.</p> <p>Only a few times did this wide focus hurt my session-taking ability. One example that comes to mind was a talk on how to keep long-running server applications alive. The topic sounded interesting, and at a JVM-focused conference this would have probably been about JVM tuning, garbage collection tweaking, Tomcat, and similar topics. Here it was all about server daemons, cron jobs, signal interceptions, and the like. I was bummed because I liked the idea of the talk but the technology it applied to was too far out out my zone of usefulness that I skipped it. Another talk that seemed interesting used Erlang as the basis language, and having never used it, I was worried the talk would be over my head in detail so I skipped that too. These occurrences were rare, but frustrating.</p> <table class='image alignleft' width='306'><tr><td><a href='http://www.flickr.com/photos/oreillyconf/9356688516/in/set-72157634769772086'><img src="http://www.nomachetejuggling.com/assets/oscon_session-300x200.jpg" width='300' height='200'/></a></td></tr></table> <p>One thing lacking were &quot;agility&quot;-based talks. I actually liked this, I&#39;ve found that almost every talk I&#39;ve ever attended on something related to agile is really high-level and borderline useless. They always tend to be like &quot;you should read this book, it&#39;s good&quot; and full of a lot of filler or academic advice. Having virtually no talks like that cleared space for more technical talks, which are the kind I enjoy more, so I appreciated that. I think someone that enjoys talks like that might have had a tougher time at OSCON, but I enjoyed it.</p> <p>One thing of significant note is session length. At UberConf, all of the sessions are 90 minutes, but all of OSCON&#39;s sessions were 40 minutes. The longer sessions mean that a 6-session day goes from 8:30 AM to 10 PM, which basically means your brain is too exhausted to learn anything in the last session. I&#39;ve often felt like speakers doing 90 minute sessions were padding their talks, but OSCON sessions have the opposite problem: the talks often felt too short, and it was clear that speakers struggled to make some of their talks fit into 40 minutes. Often sessions would run long or get cut off just when they were getting good. On the upshot, it almost never felt like there were any filler moments, picking a bad session was only a 40 minute cost, and the day ended before my brain gave out, which was good. I think I&#39;d like to see sessions that are 60 minutes, it seems like such a length would avoid the problem of the too-short 40 minutes and the too-long 90. </p> <p>The number of parallel tracks was excellent. There was only one time slot where none of the sessions excited me, every other time slot forced me to choose between 2 or 3 that I really wanted. That&#39;s a great problem to have. I like choice.</p> <table class='image alignright' width='306'><tr><td><img src="http://www.nomachetejuggling.com/assets/picard-facepalm-300x197.jpg" width='300' height='197'/><p class='caption'>Not this 'not this shit again' shit again.</p></td></tr></table> <p>One thing I have to complain about is a trend I&#39;m noticing in more and more talks. This was present at UberConf last year, I see it in User Group talks, and it was out in spades at OSCON. <strong>People putting stupid meme image macros in their slides</strong>. Dumb pictures of rage comic faces, grumpy cat, tired old memes that I&#39;ve seen reposted to reddit about a billion times. I saw the <a href="http://knowyourmeme.com/memes/facepalm">Picard facepalm image</a> three separate times. It was like a damn &quot;applause&quot; sign for a sitcom studio audience, whenever the speaker needed a quick chuckle, something would pop up with huge Impact font. I unsubscribed from every default subreddit to get away from this hackneyed, unfunny crap, why do so many speakers feel compelled to put this &quot;omg guise I&#39;m on reddit too!!!&quot; narwhal baconing crap in their slides? Grr.</p> <p>Overall, the talks were great. I took a ton of notes, and learned a whole bunch of stuff. Good speakers with lots of good information. I would always like to see a wider selection of advanced talks available, but what was offered was definitely high quality.</p> <h2>Workshops</h2> <p>One thing present at OSCON that I was used to from UberConf was a separate day set aside for extra-long sessions. Generally called &quot;Workshops&quot; these are intended to be more hands-on sessions where you focus on learning a specific thing with the help of a teacher. At UberConf, there are two types of workshops: 9-hour, all-day sessions with a single topic, and workshops during during the regular week that just take up 2 slots back-to-back for a total of 3 hours. At OSCON, there are two full days set aside for workshops, which are 3 hours and 30 minutes each, two workshops per day.</p> <p>I actually like the all-day format of UberConf&#39;s Tuesday workshops the most, because a full day really is enough time to thoroughly learn something. Of the shorter variety, I preferred OSCON&#39;s workshop format, simply because they were all separated to their own workshop days. Having workshops in the middle of the week means that you&#39;re giving up two sessions to take the workshop, and every year I&#39;d have multiple occurrences of wanting to attend a particular session but having it conflict with half of a workshop.</p> <p>That being said, <strong>many</strong> of these workshops (at both conferences) suffer from the same basic problem, that speakers who don&#39;t want to invest the time in actually running a workshop simply use them as a place to give super-long talks. Here&#39;s the deal: if I&#39;m not typing code into my laptop, it&#39;s not a workshop, it&#39;s just a really long lecture. Too many times at both UberConf and OSCON I have attended a workshop that was really just an excuse to include more slides. And every time that happens, I get bored halfway through and my attention wanders.</p> <p>I attended the Android workshop at OSCON this year and it went extremely well, we jumped right into Android development, I actually learned more at it than at BOTH of the full-day, 9-hour Android workshops I attended in previous years combined. I also attended a workshop on Google Go that wound up just being a group follow-along of the <a href="http://tour.golang.org/">Google Go tour</a>, which disappointed me a bit so I bailed and went to the Hadoop talk, which wound up just being a really long slide lecture. I learned a lot at both of these talks actually, but I don&#39;t know that I&#39;d have classified either of them as &quot;Workshops&quot;. I also attended workshops on Clojure and Erlang - both of these were largely just lectures, with some encouragement to type what you see in the slides in a REPL. Again, I learned a lot and really enjoyed them, but I&#39;d still hesitate to call them workshops.</p> <h1>Keynotes</h1> <p>Another huge difference from what I&#39;m used to was the Keynote style. I&#39;m used to a 60 minute keynote presentation during dinner. OSCON had a series of 10-minute keynotes first thing in the morning, before any sessions. These keynotes covered all sorts of stuff (&quot;open source&quot; is a pretty wide umbrella).</p> <p>We got to see an <a href="http://www.youtube.com/embed/Ty9QDqV-_Ak?autoplay=1">AR drone being controlled by Clojure</a> (I want one), hear about choosing licenses for GitHub projects, learn about the <em>cough</em>total-bullshit<em>cough</em> We The People project, and Piers Cawley showed up to <a href="http://www.youtube.com/watch?v=YNeTBKyrHeY&amp;t=1m49s">sing a song about space</a> and, I&#39;m pretty sure, <a href="http://www.youtube.com/watch?v=YNeTBKyrHeY&amp;t=4m41s">chastise us for swearing too much</a>.</p> <table class='image alignleft' width='306'><tr><td><a href='http://www.flickr.com/photos/oreillyconf/9363469980/in/set-72157634769772086'><img src="http://www.nomachetejuggling.com/assets/oscon_keynotes-300x200.jpg" width='300' height='200'/></a></td></tr></table> <p>Overall, I liked the short-format Keynotes. I think the longer keynotes have to be extremely broad and high-level to be applicable to everyone in attendance, which generally means they&#39;re not technical at all so I hate them. The 10-minute keynote format meant that a whole bunch of different speakers could talk on different topics which actually allowed them to be more technical and interesting.</p> <p>Most importantly, all of the Keynotes were streamed live, which meant I could sleep in and watch them in my hotel room before heading to the convention center. Oh plus I can share them with people and blah blah blah. Point is, keynotes in my pajamas. Awesome.</p> <h1>Expo Hall</h1> <p>One thing that was totally new to me was the Exhibition Hall at OSCON. As the name implies, the &quot;No Fluff, Just Stuff&quot; conference series prides itself on a minimum level of sponsorship, so there were never trade booths or anything like that.</p> <p>I actually had no problem with the expo hall, in fact I really enjoyed it. I was never forced to go there, I never had to walk through it to get somewhere, and any sponsored session was clearly labeled as such. I was frequently <em>enticed</em> to go to the expo hall because often the snacks and goodies were there (but not meals), but it was always optional. I had a good time, I got to look at some cool stuff in the booths, and I collected a ton of little trinkets and stickers plus a whopping <strong>25 T-shirts</strong>. No kidding, 25.</p> <p>OSCON also ran this puzzle game, where you had to collect all of these little puzzle pieces and the first 500 people to finish the puzzle got an OSCON sweatshirt and were entered into a drawing for prizes. The only way to get most of the puzzle pieces was by visiting specific vendor booths. I really wanted the sweatshirt, so I took this game really, really seriously. Like, <strong>way too seriously</strong>. Okay, I actually walked to a Walgreen&#39;s and bought a bottle of glue so that I could glue down all of my pieces on Tuesday night so that when I collected the final piece from attending the Wednesday morning keynotes, I could immediately run to the registration booth and turn in my puzzle. They were still unboxing the sweatshirts when I turned mine in, I think I wound up being the first person done. I was worried that everyone was going to take it super seriously and I wouldn&#39;t get the sweatshirt, and I figured pre-gluing my puzzle would give me an edge over anyone just starting to assemble the puzzle after getting the last piece. In retrospect, I was being a complete psychopath, because people were still completing their puzzles Thursday night and getting sweatshirts, so clearly I&#39;m an insane person.</p> <table class='image alignright' width='306'><tr><td><a href='http://www.flickr.com/photos/oreillyconf/9353919205/in/set-72157634769772086'><img src="http://www.nomachetejuggling.com/assets/oscon_expo-300x200.jpg" width='300' height='200'/></a></td></tr></table> <p>I really enjoyed the Expo Hall, I found myself kind of wandering around it whenever I had some time to kill, or checking it out just before leaving for the day to see if there were any extra goodies. I didn&#39;t even get too heavily marketed to, I only occasionally got stuck listening to a marketing spiel while waiting for a T-Shirt. On one occasion I was told by a Rackspace representative that the only way to get the shirt was to play a game, but when I looked at the game it looked like some kind of Wii-like activity on a big TV screen in front of approximately eighty billion people. I said nevermind and started to walk away, dejected, which kind of saddened me because I actually wanted a Rackspace shirt due to already <strong>being</strong> a Rackspace customer and liking the product. As I started leaving, a different representative said &quot;I&#39;ll give you a shirt man, what size?&quot; and gave me a shirt without making me act like an idiot in the middle of the huge expo hall. Thanks, random Rackspace dude, I don&#39;t know why a company would make someone jump through hoops for the honor of becoming a walking billboard for that company for free.</p> <p>Two humorous standouts at the expo hall were GM and Microsoft. GM was there to showcase... actually, I have no idea why the hell GM was there. But they had a big fancy car in the middle of the hall, some luxury sportscar that you could sit in if you wanted to, I dunno, feel what it would be like to own a nice car? Anyway, someone tweeted about how misguided it was to bring a big gas-guzzler to an Open Source convention instead of some green hybrid-type deal. I thought that was funny, but not nearly as funny as Microsoft for setting up a booth with a bunch of Windows Phones on display. Yeah Microsoft, I&#39;m not sure the Open Source crowd is exactly your target market for a device running Windows of all things. Literally across from them was the Ubuntu booth with a couple of <a href="http://www.indiegogo.com/projects/ubuntu-edge">Edge prototypes</a>. There was usually a line to see the Edge.</p> <h1>Attendees</h1> <p>I wish I had a lot to say about the crowd at OSCON, but I don&#39;t. A colleague of mine warned me that he&#39;d been before and that the crowd was &quot;neckbeardy&quot; but I didn&#39;t notice much difference between them and the UberConf crowd. Lots of nerdy T-Shirts, and overall far too much facial and body hair in general, but the crowd didn&#39;t strike me as obnoxious. I am glad I decided not to pack my <a href="https://supporters.eff.org/shop">EFF T-Shirt</a>, which almost looked like some kind of a uniform with this crowd.</p> <table class='image alignleft' width='306'><tr><td><a href='http://www.flickr.com/photos/oreillyconf/9360697295/in/set-72157634769772086'><img src="http://www.nomachetejuggling.com/assets/oscon_lunch-300x200.jpg" width='300' height='200'/></a></td></tr></table> <p>Everyone seemed smart and very passionate about their particular areas of interest. One neat thing OSCON had were these networking ribbons you could pick up with the names of things you might like (&quot;Perl&quot;, &quot;Java&quot;, &quot;Big Data&quot;, etc.) and attach them to your conference badge; O&#39;Reilly also set aside a number of labeled tables at lunch for like-minded folks to gather together and geek out.</p> <p>I saw an awful lot of people wearing Google Glass. I realized that photos really don&#39;t do Glass justice, you have to see it in person just to realize how ridiculous someone looks wearing those things. Seriously though, I felt myself feeling <em>extremely</em> paranoid whenever someone wearing one was even looking in my direction, like I very well may be getting put into a photo or video. I actually disliked being <em>looked at</em> by someone wearing Glass. I really hate it. Also, I really want one.</p> <p>Overall, everyone was very friendly. Everyone but me, that is. I&#39;m not friendly, and thus went out of my way not to really talk to anyone or network. It&#39;s how I roll.</p> <h1>Venue</h1> <p>UberConf is typically held in the conference rooms of a large hotel, but OSCON was held at the <a href="http://www.oregoncc.org/">Oregon Convention Center</a>. I believe this allowed OSCON to definitely have more rooms overall, but both locations have always been very comfortable.</p> <p>UberConf sessions almost always have rows of tables with chairs, good for laptops and notetaking. Aside from the workshops, I don&#39;t think any of the OSCON sessions had tables set up, everything was just chairs, and they were pretty cramped. Sometimes this made notetaking difficult, but I will say OSCON did a generally better job of having sufficient power available, I almost never struggled to find a place to plug in my laptop. I&#39;m glad I brought my laptop for notes instead of my tablet, which requires a flat service to prop up and type on.</p> <p>A couple things irked me a little bit about the venue staff at OSCON. I frequently saw A/V staff being condescending and rude to speakers who were trying to get set up, as if they were annoyed the speakers didn&#39;t know more about microphones and video equipment. They did a good job of making sure the projection systems worked and the speakers were clear over the audio system, but whenever they had to basically do anything at all many of them would take this sarcastic tone of voice when talking to the speakers. It was weird.</p> <p>I&#39;m pretty sure the A/V crew is contracted out by the convention center, not actual center employees, but the actual convention center staff could be kind of annoying as well. Frequently convention center staff would harass people for sitting on the floor in overfull rooms, or turn people away from popular sessions for having too many people. In one instance one of the staffers guarding entry to a room told me the speaker wasn&#39;t there yet and he&#39;s not supposed to let me in because they might want a few minutes to get set up with the room empty. Why? I also got turned away from entering the expo hall to get a missing puzzle piece at 9:59 because the hall didn&#39;t open until 10. He literally watched his phone tick over to 10:00 before letting me through. Chill out man, you&#39;re not guarding the president.</p> <p>The food was good, too. Pretty much convention buffet food, not many choices at lunch but the quality was decent. This may sound strange, but I appreciated that the venue only supplied lunch, whereas UberConf typically provides breakfast, lunch, and dinner. It made it much easier to follow my diet, which I guess is a weird thing to appreciate, but this is my dumb blog and I liked it.</p> <p>The Convention Center was located in Portland, right near a public transit rail line, and the convention included a ticket. I didn&#39;t rent a car and instead took the transit system everywhere, which was pretty convenient. I walked from my hotel to the convention center every day; I even took a break back in my room to drop off some of those shirts because they were weighing me down. I was also walking distance to a movie theater, where I went to catch a movie and wind down one night. I felt safe everywhere, though when I checked into the Denny&#39;s across from my hotel on Foursquare for breakfast one morning, I noticed someone complaining that it wasn&#39;t open 24 hours a day, with a response posted &quot;LOL, you be willing to work in that part of town at 3am and we&#39;ll talk.&quot; What the hell part of town was I in?</p> <p>Sticking with public transit made it difficult to attend the various parties being thrown by tech companies in the area, so I didn&#39;t go to any of those. It would have been nice for there to be buses or something, but frankly I didn&#39;t stay at the actual O&#39;Reilly party that was <strong>at</strong> the convention center for more than 10 minutes, so I can&#39;t honestly say I&#39;d have used them.</p> <p>Overall, Portland is a cool place for a convention and the convention center was a cool venue with a lot of rooms. I missed being able to come home in the evenings, but I liked the convenience of the location and the proximity to my hotel, plus how quickly and easily I was able to get to lots of good restaurants and the like.</p> <h1>Misc</h1> <p>One neat touch of OSCON that I enjoyed was the personalized schedule. One of my biggest challenges with these conferences is figuring out which sessions to go to, I often print out the schedules and use an elaborate system of markings to indicate preferences and possible substitutions, it&#39;s all very A Beautiful Mind. OSCON allows you to log in and actually mark sessions right there on the site. What&#39;s more, you can subscribe to an iCal feed of your personalized schedule, and you can sync it to a special OSCON smartphone app that displays the rooms for the sessions and can be set to notify you before they start. Freaking cool.</p> <table class='image aligncenter' width='586'><tr><td><img src="http://www.nomachetejuggling.com/assets/IMG_20130727_205308-e1375128008444-580x494.jpg" width='580' height='494'/></td></tr></table> <p>I really had a great time at OSCON, I&#39;m very glad I went. I do wish for something that&#39;s a bit more of a happy medium between OSCON and UberConf, with one-hour sessions, and I really wish these conventions would start putting the hammer down on what allows a session to be called a &quot;workshop&quot;, but I definitely enjoyed the experience and I hope to go again next year.</p> Tue, 30 Jul 2013 00:00:00 +0000 http://www.nomachetejuggling.com/2013/07/30/oscon-2013-a-review/ http://www.nomachetejuggling.com/2013/07/30/oscon-2013-a-review/ Book Review: Presentation Patterns <p>I don&#39;t post book reviews here very often. Typically I write up a few paragraphs about a book when I finish it and post it to my <a href="http://www.goodreads.com/user/show/1499157-rod-hilton">Goodreads account</a>, which I consider enough of a review for nearly every book I read.</p> <p>But &quot;Presentation Patterns: Techniques for Crafting Better Presentations&quot; by Neal Ford, Matthew McCullough, Nathaniel Schutta is a bit more than a book. I&#39;m not joking when I say this book has actually changed my life. As such, I felt it was necessary to devote an entire post to it to draw extra attention to it.</p> <p>In the interest of full disclosure, I should admit that I know the authors personally, sort of. I&#39;ve had a conversation or two with Neal and Nathaniel at various developer conferences, though I seriously doubt either of them would remember or even think my face looks familiar. McCullough I&#39;ve interacted with quite a bit more, but I once managed to get him to tell me he wanted to punch me in the face. If you&#39;ve ever met Matthew, you&#39;d know this is pretty much like getting Gandhi to call you a stupid asshole. The point is, I&#39;m not affiliated with the authors or getting anything out of promoting the book. I just found it extremely valuable and wanted to share it.</p> <table class='image alignright' width='256'><tr><td><img src="http://www.nomachetejuggling.com/assets/pp-cover.jpg" width='250' height='320'/></td></tr></table> <p>In any case, Presentation Patterns is excellent. The book is full of tons of real-world, usable tips, ranging from how to speak clearly to how to organize your thoughts to the actual mechanics of doing specific things in Keynote and Powerpoint. It&#39;s very detailed in this way, rarely leaving the reader wondering how to do a thing the book describes. Reading this book after seeing many presentations by speakers like Ford, McCullough, and Schutta was an eye-opening experience, something akin to seeing how the sausage is made.</p> <p>The book also contains a number of Antipatterns, so it&#39;s a valuable resource for learning what to avoid. Many of the most common patterns we see with Powerpoint are identified here, with explanations of why they are so terrible and should be avoided. It rang very true for me, pretty much every presentation that has bored me has been an exemplar of these antipatterns.</p> <p>One complaint is that the book is a bit short on visual examples, in some places. I think every pattern covered should have had actual screenshots from powerpoints which illustrate the pattern (or antipattern). Many of the entries had such screenshots, but not all. Some patterns and antipatterns left me wondering what they would look like in real life. I happen to know because I&#39;ve seen so many talks by the authors, but I think more graphics would have benefitted those who do not regularly attend conferences and user groups.</p> <p>I particularly liked that the book didn&#39;t spend much time dealing with basic speaking concerns, like getting over nervousness or imagining your audience in their underwear. The approach the book takes is that you will beat nervousness by knowing what you&#39;re talking about and what you&#39;re doing, and the book aims to give you those tools. Getting over nerves comes naturally when you have a killer presentation. In effect, this book isn&#39;t &quot;Public Speaking for Dummies&quot; it almost assumes you&#39;ve already read such a book, and specifically want to get the delta between regular public speaking and giving technical presentations.</p> <p>The reason I say this is more than a book is that it has drastically altered my life in a very positive way. I&#39;ve always wanted to speak more, but I&#39;ve had a crippling fear of public speaking for as long as I can remember. Whenever I&#39;d watch talks or see friends prepare to give their own talks, I was extremely jealous of how easily it came to them, since the mere thought of speaking in front of a large crowd would send me into a panic.</p> <p>I&#39;ve known that giving technical talks is important for my career, and I&#39;ve always wanted to do it, so I hoped to pick up this book to see if it had any good tips. I discovered as I read it that most of my fear of public speaking actually came from a fear of looking foolish or ignorant of my subject. What this book gave me was more than a handful of tips, it gave me real tools to build confidence in my own presentations. The <a href="https://speakerdeck.com/rodhilton/sat-the-cook-levin-theorem">very next presentation I built</a> has so much obvious influence from this book that it probably borders on trademark infringement. Compare that to <a href="https://speakerdeck.com/rodhilton/quantitatively-evaluating-test-driven-development">the presentation I built for my master&#39;s thesis</a> and I think you&#39;ll see how much benefit this book provides.</p> <p>I had given one presentation in the 29 years of my life prior to reading this book. I built and gave one presentation during the process of reading it as well. Since completing it a little over a year ago, I&#39;ve given 4 more. If that&#39;s not a transformative experience, I don&#39;t know what is.</p> <p>Not only am I more comfortable speaking now, I&#39;ve discovered I&#39;m actually pretty good at it. After <a href="https://speakerdeck.com/rodhilton/breaking-monoalphabetic-substitution-ciphers-using-generic-algorithms">my first presentation</a>, I was asked by my CS professor to re-present the material to the Math department as well. After my most recent <a href="https://speakerdeck.com/rodhilton/rectangle-visibility-and-elusive-k23">full-class lecture</a> (1 hour, 15 minutes in front of about 40 people), students told me that I was a really interesting teacher and asked me if I&#39;d take over a particular class they didn&#39;t like. <a href="https://speakerdeck.com/rodhilton/detecting-codes">Another presentation</a> had students staying 15 minutes after class to discuss my presentation because they found it so interesting; I watched as I presented, and I had the eyeballs of almost every student, which wasn&#39;t the case for the other student presenters. <a href="https://speakerdeck.com/rodhilton/priming-for-steganography">Another still</a> resulted in the professor telling I gave &quot;one of the best student presentations [he&#39;s] ever seen.&quot;</p> <p>I had a peer tell me he thinks I go overboard with animations and that it comes off as unprofessional. Two years ago, feedback like this would have devastated me. Today, I&#39;m actually so confident that I&#39;m not overusing animation but actually using it effectively to demonstrate information that I can shrug off his feedback as being, simply, wrong.</p> <p>Having presentations backed by known-effective patterns rather than my own best guesses has resulted in a level of confidence in my presentations that I never would have imagined for myself. One singular book took me from having a crippling fear of public speaking to &quot;one of the best&quot; presenters one of my professors has ever seen. If you&#39;ve got an interest in giving technical presentations, I cannot recommend this book highly enough.</p> Mon, 10 Jun 2013 00:00:00 +0000 http://www.nomachetejuggling.com/2013/06/10/book-review-presentation-patterns/ http://www.nomachetejuggling.com/2013/06/10/book-review-presentation-patterns/ Spring 2013 Semester in Review <p>Another semester is over, and it was quite the doozy like the last one. This time, however, it wasn&#39;t because I hated the workload (like last semester) but because I hated the material. Or more specifically, half of it, but more on that later.</p> <p>This semester, I finally took the cross-department course from the Business School that I was dreading. My school&#39;s program is a joint-degree, Computer Science and Information Systems, with the CS stuff coming from the Engineering school and the IS stuff coming from the Business school. The degree has a number of requirements but one of them is that you must take at least one PhD-level class in each school. This means that I am able to take nothing but pure-CS courses, except I have to take one PhD-level course in the Business school. I&#39;ve been dreading this since I started, somehow hoping this requirement would be removed before I had to take it, but this was not the case, and I had to take it this semester. With the credits I am able to transfer from my Master&#39;s degree, this actually completes all of my course requirements, but because I was interested I also took a course on Graph Theory, which was a class crosslisted as both an undergrad and master&#39;s level class. And once again, I somehow managed to get stuck grading.</p> <p>I started the semester taking three courses on Coursera as well, but quickly decided that doing so contributed to my sense of being overwhelmed last semester, so I quickly dropped them and decided to download all of the lectures when the classes ended, and hence won&#39;t be mentioning them further.</p> <h1>Classes</h1> <h2>Applied Graph Theory</h2> <p>Textbook: <a href="http://www.amazon.com/Graph-Theory-Mathematical-Association-Textbooks/dp/0883857537">Graph Theory, a Problem-Oriented Approach</a></p> <p>Like I said, Graph Theory wasn&#39;t a course I took because I needed it, I took it because I felt like it would be low-key and fun, and a lot of the problems I&#39;m interested in for research relate to Graph Theory in some way or another.</p> <p>A great deal of the material had been covered in the same professor&#39;s Graduate Algorithms class, but not as much as I was expecting. There was lots of new stuff that I learned, and I really enjoyed it. This particular professor is a very good lecturer; I always enjoy her classes, and this one was no exception.</p> <p>The course is strange because its quadruply cross-listed. It is cross-listed as both a CS class and a Math class, and also cross-listed as an Undergrad and Graduate class. This led to an interesting mix of students in class, many lacking the math background of others, many lacking the CS background of others still. All together, there were 13 CS Undergrads, 15 Math undergrads, and 5 CS grads including myself (no Math grads). Due to the makeup of the class, the material was definitely taught at a level catering mostly to the undergrads, which made for a pretty easy class for me and the other graduate students. After the last semester&#39;s overwhelming workload, this was welcome.</p> <table class='image alignright' width='306'><tr><td><img src="http://www.nomachetejuggling.com/assets/300px-Petersen_graph_3-coloring.png" width='300' height='288'/><p class='caption'>Graph Theory!</p></td></tr></table> <p>Graduate students were required to also do a semester project and present it to the class at the end of the semester. As was the case last time I had a similarly-structured course, once I got into my research project I found it hard to focus on the rest of the class material due to being obsessed with my own project. My understanding and retention of the first half of the class material is definitely better than that of the second half. Because the professor drops the lowest homework grade, I didn&#39;t even do the final homework for the class, electing instead to put more work into my project.</p> <p>As the only PhD student in the class, my project presentation was allotted an entire class period for the presentation (the other students each got half of one), which consisted mostly of me lecturing on the background material not covered in the class before presenting my research. For the project, I was given an interesting, NP-Complete Graph Theory problem to try and optimize, which I attempted to find a solution to by implementing a Genetic Algorithm search. The code for this project is <a href="https://github.com/rodhilton/rectangle_visibility">here</a>, my presentation slides <a href="https://speakerdeck.com/rodhilton/rectangle-visibility-and-elusive-k23">here</a>. In the end, I was unable to actually solve the problem, but I had a great time trying.</p> <p>I had an absolute blast with this project, and my presentation went very well. I actually coded it up so that the students all met in the PC lab on campus instead of in the regular classroom, and they each ran their own copy of the search algorithm and uploaded their best result automatically to a server I was running connected to a projector. This turned the search into something of a competition, and the interactive component was a lot of fun. I somewhat regret shifting my focus too far away from the class material once I got invested in my project, but overall I had a great time and really enjoyed this class a lot. I wound up with an A in the class.</p> <h2>Topics in Analytical Research Management</h2> <p>Textbook: None</p> <p>Like I mentioned, this class is a requirement, the one Business School class that CS students needed to take as part of the degree requirements. I had been dreading it since I heard about it, as I have no interest in anything I could learn from the business school, and even less interest in this particular class subject.</p> <p><strong>I hated, hated, hated this class.</strong> I hated every second of its 3-hour length. I hated the fact that I had to stay downtown after work and grab food before its 6:00pm start time instead of eating dinner with my wife at home. I hated the complete lack of common ground between the few CS students taking the class and the overwhelming majority of business-school types in the same room. I hated the fact that almost all of the material was built on previous classes that the business school students had taken before but the CS students had not. I hated every lecture, every assignment, every student presentation I had to sit through. I hated the over-reliance on Powerpoint for lectures. I hated all the business-buzzword talk that I try so hard to avoid in my day job. I hated that I never saw a single mathematical proof of anything being discussed. I hated having to use Blackboard. Most of all, I hated how it was the only course I took not because I thought it sounded interesting, but because the department required me to. I deeply, deeply resented having to sacrifice an evening at home with my family every single week to take a course I had absolutely no interest in, that I felt I should not have to take at all, with a bunch of people with whom I had nothing to talk to about. I hated this class.</p> <p>I did not hate it due to workload, which was relatively minimal. Let me first start out by saying that, at no point during the semester did I actually <strong>understand</strong> any of the class material. I mean that literally, it all seemed built on classes in the business school prior to this one, classes I did not take, and I never understood anything. Almost every lecture may as well have been in French, I didn&#39;t even recognize the vast majority of the <em>words</em> being used, let alone understand the sentences they were in. At no point did my understanding of the material reach a level above a D or D+. By all rights, a D or perhaps an F is what I <strong>deserved</strong>.</p> <p>However, the assignments were extremely easy, though occasionally time-consuming. Four of them were to simply read a paper from a list of possible papers and write a review, akin to the kind of review one might write if reviewing for an academic journal. Of course, none of these articles were CS articles, they were all business-type articles. The most interesting paper I saw was on the subject of machine learning, and the opening paragraph talked about how it could be used to increase return on investment for businesses and my interest was instantly sapped. I just have no patience for this money-centric worldview.</p> <p>I managed to get an A on all four of these articles. I never read a single one of them. I read the abstract, the introduction, and the conclusion section of each. I rarely understood any of these sections, and I didn&#39;t even attempt to read the stuff in the middle. Yet they were enough to write my &quot;reviews&quot;, which largely consisted of finding a detail and generically referring to it as &quot;under-explained&quot; or something similarly vague. Every one of my article reviews was complete and total bullshit, an attempt to make it look like I understood the articles when I absolutely did not. My lowest grade was on a review of a paper that the professor was a co-author on, where my same generic criticisms were met with defensiveness, explaining that the content I felt was missing was cut out due to the journal&#39;s length restrictions.</p> <p>There were also a number of assignments that involved a lot of calculations in Excel. I never understood the purpose of these calculations, or what they meant. But I was consistently able to look at the professor&#39;s example Excel files, re-use the formulas out of one column and put them into my Excel sheet, just changing the cell numbers to use what appeared to be analogues in my worksheets to the cells in his. These assignments were, for me, exercises in pattern recognition, a skill at which I&#39;m quite adept. I was able to get decent grades on these assignments as well, only occasionally did my pattern matching skills fail me.</p> <p>A month or so before the midterm, I decided that I was being lazy. I decided I was only having trouble understanding the material because I disliked it, and that&#39;s no excuse. So I went to the professor&#39;s office hour, with one goal in mind: to walk out understanding exactly one thing. We&#39;d covered dozens and dozens of different concepts by this point in the class, and I understood none of them. I decided to pick one that was referenced a lot, and fully understand it. Sure, I&#39;d still be crazy behind, but at least it would be an improvement.</p> <p>I asked my question and he immediately launched into a tirade of nonsense that baffled me. I asked him to hold on, slow down, go back and explain so-and-so first. I took up an entire hour trying to get him to explain things more simply before eventually the professor shrugged and said &quot;you know, this stuff is pretty basic statistics, maybe I should have had a statistics class as a prerequisite.&quot; He then gave me a URL to a web page with hundreds of written pages about statistics and told me to read it. He didn&#39;t direct me to a particular thing to read up on, just the URL which had at least two semesters worth of reading material alone. First of all, I have what I consider basic statistics knowledge, I took statistics in high school at the very least. What he was referring to was more like graduate-level statistics, which I&#39;ll admit I don&#39;t know much about, largely because I have little to no use for such a thing studying theoretical computer science. Secondly, this course is <strong>already</strong> a course I&#39;m required to take and don&#39;t want to, the idea that he&#39;d add another one as a prerequisite was infuriating. And finally, it certainly didn&#39;t do me any good <strong>right now</strong>, so thanks a pantload.</p> <table class='image alignleft' width='306'><tr><td><img src="http://www.nomachetejuggling.com/assets/file8871263244366-e1349380440442-300x214.jpg" width='300' height='214'/><p class='caption'>Synergize our opportunity platform to facilitate tiger team knowledge management</p></td></tr></table> <p>So I gave up. I was mentally done with the course. I felt like I gave it an honest effort to understand something, anything from class, and the professor basically told me to fuck off. From this point forward, I resigned myself to the knowledge that I&#39;d fail the midterm, but with the decent grades I got on the assignments and the fact that I&#39;d be able to work with a partner on the final project, I&#39;d probably manage to get a C in the class, which would be enough for it to count. I spent every lecture from this point on working on my Graph Theory project on my laptop, I never looked at another one of the professor&#39;s slides again. I honestly don&#39;t even know what many of the lectures were even about, I just used the class as a 3-hour work session for my project.</p> <p>Sure enough, when it came for the midterm, I did poorly. There were 4 total questions, 2 of which I actually understood relatively well due to reviewing the material with another student in the class (who was able to explain, in about 10 minutes, what the professor could not explain to me in an hour). The final question -- worth the most points -- was, once again, barely English for me. I didn&#39;t even understand the words in the question, let alone how to answer it. So once again, I just wrote garbage down. I wrote 6 paragraphs, each exactly one sentence long. Each sentence was a statement that was true, which I knew from having memorized random sentences from the slides from class. Did any of these statements answer the question in any way? No idea. I just knew they were true statements about things, and that they were stated in class. I got the second lowest grade on the midterm in the class, but when I compared my answers with the other student I studied with, he was dismayed when he saw that he and I got the same number of points on the final question despite the fact that I clearly did not understand it. I got a B- on the midterm, not because I understood the material at a B- level, but because of how it was graded.</p> <p>There were only two more graded artifacts left. One was to read a paper of our own choosing and present it to the class, similar to the paper reviews from before. I did extremely well on this one, because I was able to select a CS paper and I&#39;m pretty good at giving presentations (he actually said it was one of the best he&#39;s ever seen). The final assignment was a project, and I was able to work with a partner (the one I studied with before). We selected a very CS-oriented project and did a very cool experiment, which utilized a fraction of classroom material. He was largely responsible for the research and the paper, whereas I did a lot of the gruntwork, writing scripts to generate data sets as well as all of the slides and the project presentation to the class, which is <a href="https://speakerdeck.com/rodhilton/priming-for-steganography">here</a>. This division of labor worked well for us because he understood the class material better than I did, but I was better at giving talks. In the end, we got a low A- on the project. We were the only group who not only designed an experiment, but actually <strong>performed</strong> it and got real results. Everyone else designed experiments that they couldn&#39;t actually do, so it sort of drives me nuts to know they got a higher grade for utilizing more material from class and doing absolutely nothing with any of it.</p> <p>These assignment and project grades were actually enough to make up for my midterm grade, and I wound up with an A- in the class. In a way, I actually wish I&#39;d gotten a B, since my project partner, who scored only a few points higher than me on the midterm and otherwise had the same grades, got an A. This means my grade was damn close to the A, and is now the lowest grade I&#39;ve received in all of my classwork, and this is the one class ruining my perfect 4.0 GPA. This kind of enrages me since I never wanted to take this class to begin with, but I have to try and keep things in perspective. I did not understand the class material at an A- level. I still do not understand much of <strong>anything</strong> from this class, and by all rights I should have failed. But due to the structure of the class and the grades, I managed to get an A-, so I don&#39;t have to retake the class and it counts towards my degree, which is really all I needed.</p> <h2>Grading</h2> <p>Believe it or not, I once again got roped into grading. The professor for Graph Theory asked if I could grade her class. I said I didn&#39;t really want to, but I didn&#39;t want her to be in a jam, so she should go ask everyone else on her list and if she can&#39;t find someone, come back to me. She found another grader, but the other grader could only do it part-time, so she wanted to know if I would be willing to be a second grader and grade part-time as well.</p> <p>I&#39;d only have to grade half of the six quizzes, and I&#39;d have one office hour per week instead of two. I figured this was tolerable, so I reluctantly agreed. Then after the semester started, the other grader got re-assigned by the department to grade another class, and I was the only one left for Graph Theory, so I had to double my office hours and grade all of the quizzes. It was too late to get anyone else, so I was stuck with it.</p> <table class='image alignright' width='306'><tr><td><img src="http://www.nomachetejuggling.com/assets/grading-rubric.jpg" width='300' height='288'/></td></tr></table> <p>This was the first time I was grading written work instead of compiled programs, which meant I had to deal with handwriting, lack of descriptions, poor English, errors in proofs, and crazy, off-the-wall answers from left field. I also had to figure out for myself how many points I&#39;d take off for particular errors, whereas with my previous grading effort I was given a rubric by the teacher. Grading this type of work is much more time consuming and much more difficult. I hated it. I also had to have office hours every week so students could come by and argue with me about the points I took off. I hated this more than anything else - nobody ever came to me and asked why they got the answer wrong because they wanted to understand the material, they almost always acknowledged they got it wrong but felt I took off too many points. This type of crap annoyed me to no end, particularly considering how obscenely lenient I was with points. I was giving 50-75% of credit to answers that I&#39;m sure the professor would have given a 0 to. I know this is the case, because the only grading feedback I ever got from the professor was that I was being too generous with points.</p> <p>You may have also noticed the name of the course I graded was &quot;Graph Theory&quot;. Wait, isn&#39;t that the name of the course I was also taking? Why, yes, yes it is. <strong>PhD students in the department are allowed to take and simultaneously grade the same class</strong>, the professor grades the TA&#39;s work, and the TA grades everyone else. If that sounds a bit strange to you, let me assure you that you have no idea how strange it is.</p> <p>I had to sit, every class, with students whose grades were lower than they wanted because of my grading. I had to hear the comments about what &quot;bullshit&quot; their grades were as their quizzes were handed back with me standing right there. Worst of all, I had to present a full lecture on my semester research to what I can only describe as a maximally hostile audience, who I was certain would have enjoyed nothing more than to see me stumble and fail as karma for taking 10 points off that one time when I &quot;totally should have taken off like 2 or 3, max.&quot;</p> <p>I had no friends in the class, and no other students I could talk to when I was having trouble with the material myself. I had to figure everything out early, before my office hour the day before assignments were due, which was inevitably when everyone would show up to ask me questions. The sense of being completely alone and an absolute outsider in the class transformed what would have otherwise been an awesome class into something awkward and uncomfortable. It placed far more stress on me in terms of needing to understand material out of fear of humiliating myself or telling a student something incorrect. This alone turned my &quot;low-key, easy class&quot; into a stressful burden.</p> <p>The value I got out of this was that it has made it abundantly clear that I do not want to teach. I actually really enjoy lecturing and teaching people, but I detest with every fiber of my being grading their work and having stupid little grade-grubbing conversations with them where I spend 30 minutes listening to them explain why they deserve 2 extra points while in my head thinking how they really deserve a 0 and I was already being nice by giving them partial credit. The lecturing part of teaching is fun, but the evaluating/grading portion has made it crystal clear that teaching is not for me.</p> <p>I know I&#39;ve said this before, but this time <strong>I totally, seriously, super-duper mean it</strong>: I am never going to be a grader again. <em>Dammit.</em></p> <h1>Conclusions</h1> <p>This semester was tough. I hated one of my classes more than any other, even Artificial Intelligence (where I at least liked the material), and the one that was supposed to be low-stress and fun wound up being highly stressful and unpleasant due to the grading situation. It was my second semester in a row where my overall level of enjoyment of school was low due to overwhelmingly negative reactions to a particular class. I had two semesters of awesome school, and then what wound up being another two semesters of unpleasantness. Considering that the only reason I&#39;m in school is because I thought it would be fun, you better believe I was wrestling at least once a week with the question of just dropping out. Usually in the minutes before the Business School class started.</p> <p>I stuck with it, largely because the one constant in the courses that I didn&#39;t enjoy was that, when I was doing a project or research for the semester, I was loving it. As much as I hated the business school class, I&#39;m really proud of the experiment my partner and I designed and I really had a lot of fun working on it. As stressful as Graph Theory was due to my &quot;other&quot; status, I absolutely loved my project, and really enjoyed presenting it, even to a hostile audience. Last semester, I hated the A.I. workload, but I had a blast doing the semester project. And even in my Computational Complexity class, which I really enjoyed but was disappointed with due to the infrequency of class, the highlight was my independent literature review.</p> <p>Since the end of this semester actually marks the end of all classwork for me, I slogged through the rough semester hoping that the next semester, where I&#39;ll be doing research completely on my own, will be a lot more of the thing I liked from the classes that I did not. I came to the school looking forward to actual classroom material, sitting in a physical class instead of taking classes online like I did for my Master&#39;s degree. I enjoyed that experience most of the time, but I&#39;m definitely at the point where I&#39;m ready to be done with classes and doing research.</p> <p>I had hoped that this semester would be low-key enough that I could spend lots of time figuring out what I wanted to research, but unfortunately both classes wound up being more time-consuming than I had hoped (particularly at the end where I was juggling two large projects). I&#39;m not as far along in the &quot;what do I want to research&quot; process as I was hoping to be, so I&#39;m hoping to catch up a bit this summer.</p> <p>I wish I could have enjoyed all of my classes as much as I enjoyed some of them, because I think it would have been possible to do so for all but the Business School class if not for particular circumstances. In a way, I&#39;m sad to see the chapter of classwork for my PhD close with a little under half of that time marked by disappointment in some cases and outright hatred, but close the chapter has, and it&#39;s time to buckle down and start doing my own research.</p> <p>This period will be marked by self-doubt, I&#39;m sure. Even now I don&#39;t really know what I want to research (though I&#39;ve developed quite a <a href="http://www.goodreads.com/review/list/1499157-rod-hilton?shelf=research">reading list</a>), and I don&#39;t really know if I&#39;m up to the task of coming up with something truly original and novel. I know that I enjoy the <strong>process</strong> of research, as it&#39;s been the only aspect of more than one course that I actually liked, so I&#39;m hoping I can find a problem or a set of problems that I&#39;m both passionate about as well as confident I can solve. I hope next school year is better than this one was, if I reach the point where 2/3rds of my time in school has been unpleasant, I don&#39;t think I can possibly justify sticking with it.</p> Wed, 22 May 2013 00:00:00 +0000 http://www.nomachetejuggling.com/2013/05/22/spring-2013-semester-in-review/ http://www.nomachetejuggling.com/2013/05/22/spring-2013-semester-in-review/ Brief Thoughts on Software Craftsmanship <p>To catch people up on some blogosphere drama:</p> <p>Last month, Heather Arthur posted on her blog about an unfortunate incident in which some people on Twitter had found some <a href="https://github.com/harthur/replace">code she wrote in GitHub</a>, and <a href="http://harthur.wordpress.com/2013/01/24/771/">people started trashing her on Twitter for it</a>. Some of those people are considered leaders in the <a href="http://manifesto.softwarecraftsmanship.org/">Software Craftsmanship</a> movement, in particular <a href="http://coreyhaines.com/">Corey Haines</a>. Corey immediately <a href="http://programmingtour.blogspot.com/2013/01/im-sorry.html">apologized</a> for acting like an asshole, and I think his apology was sincere because I&#39;ve met Corey and frankly the guy is almost annoyingly nice (he went around RubyConf 2012 taking a picture with every damn person there). But Ted Neward saw this turn of events and concluded that Corey&#39;s actions were not orthogonal to his involvement in Software Craftsmanship, but actually influenced by them, and he <a href="http://blogs.tedneward.com/2013/01/24/On+The+Dark+Side+Of+Craftsmanship.aspx">posted as such on his blog</a>.</p> <p>Neward&#39;s basic point is that this is the exact kind of behavior we should expect as a side effect of the Software Craftsmanship movement. By it&#39;s nature, it attempts to create a segregation between those who are &quot;in the know&quot; and those who are not, and he felt the behavior of Corey and others was a byproduct of this segregation. They saw Heather as an &quot;other&quot; and were overly harsh in their criticisms, emboldened in so doing by their sense of Craftsmanship. Neward took a lot of shit for this view on Twitter, with most people arguing that this was done by Software Craftsmen, but it wasn&#39;t done <strong>because</strong> they were Software Craftsmen, and it makes no sense to criticize the entire movement based on the action of a few members, regardless of how high their profile is. Neward responded to all of this feedback in <a href="http://blogs.tedneward.com/2013/01/26/More+On+Craftsmanship.aspx">a second blog post</a>, where he reinforces his original point.</p> <p>Uncle Bob Martin, one of the first five signers of the Software Craftsmanship Manifesto and author of Clean Code and The Clean Coder, then responded to all of this drama with <a href="http://blog.8thlight.com/uncle-bob/2013/01/30/The-Craftsman-And-The-Laborer.html">his own post</a>. Bob takes particular issue with Neward&#39;s promotion of what he sees as the opposite of a Software Craftsman, a Software Laborer. In Neward&#39;s words, a Laborer is someone &quot;who cranked out one crappy app after another in (what else?) Visual Basic [...] their apps were sloppy, bloated, and ugly...cut-and-paste cobbled-together duct-tape wonders.&quot; At the end of the post, Neward bows &quot;with respect to the &quot;software laborers&quot; of the world, who churn out quality code without concern for &quot;craftsmanship&quot;, because their lives are more than just their code.&quot;</p> <p>Bob finds these kinds of developers to be problematic, as his experience suggests that people who make a mess of their code create lots of defects and headaches for themselves and other developers. Finally, Ted Neward responded to Bob as well with one more defense of himself in <a href="http://blogs.tedneward.com/2013/02/02/Last+Thoughts+On+Craftsmanship.aspx">another blog post</a> which he proclaimed on Twitter as his &quot;last word on the subject.&quot;</p> <p>It was this last post that inspired me to post my own thoughts. I&#39;m not going to speak much about the drama itself, or the definition of Craftsmanship vs Laborer, follow the links above if you&#39;re interested in that debate.</p> <p>Something in Neward&#39;s final post struck me.</p> <blockquote> <p>Know what? I think one thing that got lost somewhere in all this debate is that value is only value if it&#39;s of value to the customer. And in a lot of the &quot;craftsmanship&quot; debates, I don&#39;t hear the customer&#39;s voice being brought up all that much.</p> <p>You remember all those crappy VB apps that Bob maligned earlier? Was the customer happy? Did anybody stop to ask them? Or was the assumption that, since the code was crappy, the customer implicitly must be unhappy as well? Don&#39;t get me wrong, there&#39;s a lot of crappy code out there that doesn&#39;t make the customer happy. As a matter of fact, I&#39;ll argue that any code that doesn&#39;t make the customer happy is crap, regardless of what language it&#39;s written in or what patterns it uses or how decoupled or injected or new databases it stores data into. Value isn&#39;t value unless it&#39;s value to the person who&#39;s paying for the code.</p> </blockquote> <p>This, to me, is the heart of the Software Craftsmanship movement. Neward intended this as a critique of Craftsmanship, but I see it as it&#39;s greatest strength.</p> <p>I see the <a href="http://agilemanifesto.org/">Agile Manifesto</a> as being customer-focused. It&#39;s values are interacting with people, collaborating with customers, releasing working software, and responding to change quickly. These are things that customers have a good reason to care about. I want every customer of mine to know that I consider myself an agile developer because I think that conveys to them a certain set of principles that they might value. </p> <p>But Ted&#39;s right, customers don&#39;t care much about if code is crappy, and they don&#39;t care if all of these craftspeople meet regularly after work to &quot;hone their craft&quot;. These are, indeed, not of much concern to customers, at least not directly. The Craftsmanship movement is for me, not about developers focusing on their customers, but about them also <strong>focusing on other developers</strong>.</p> <p>I don&#39;t write well-crafted code or go to meetup groups or steadily add value (even if it&#39;s not requested) for the benefit of the customer. I do it for the other developers I work with, and for those who maintain my code when I can&#39;t. It&#39;s this additional layer, the &quot;not-only&quot;s of the Software Craftsmanship manifesto that appeal to me: the adoption of a view that we must not only make our customers happy, but make our fellow developers happy as well.</p> <p>I&#39;m signatory #214 of the Software Craftsmanship Manifesto, and my self-given title on LinkedIn is &quot;Software Craftsman and Computer Science Geek&quot;. Every so often I see my own LinkedIn profile and this title strikes me as pretentious and annoying, and I consider changing it, but I never do. I always decide it&#39;s more important to leave it and risk looking like a bit of a pompous, self-important jerk. Why do I do this?</p> <p>I do it because I consider it something of a pirate flag for other developers. It&#39;s important to me that they see this flag, because the label conveys, to my mind, a great deal of meaning to the reader. It&#39;s a shorthand, it lets other developers know an awful lot amount me with two short words, including that I might be a bit of a pompous, self-important jerk. <strong>It tells other developers what they can expect of the quality of my work, and what I expect of theirs.</strong> It is a label that I adopt solely to aid communication between myself and other developers, not customers.</p> <p>Sure, I think hiring a team of Craftspeople will be beneficial for customers. I think the codebase will be more easily adaptable to change, I think they&#39;ll get more honest and accurate assessments of when work will be done, and I think they will generally have more positive interactions with their team. But at the end of the day, this team of Craftspeople has chosen their outlook on software development not out of concern only for the customer, but also out of concern for each other.</p> <p>If Neward wants to sing the praises of his VB-slinging, cut-and-pasting Software Laborer, that&#39;s fine. Such a person may make customers very, very happy, and good for them. But I know that it would make <strong>me</strong> unhappy if I had to work in or maintain their code, just as I know it would make someone else unhappy were I to be a Software Laborer myself. Frankly, I don&#39;t have much interest in working with Software Laborers as Neward describes them, which is why I fly my Craftsmanship flag high. Does this make me an elitist snob? Yeah, a bit. I&#39;m not trying to be a dick about it, I just know I&#39;d just come home frustrated and drained if I worked for 8 hours a day with a team of people who are just trying to sling enough code to make the customer happy and didn&#39;t care about the codebase itself. The mentality of &quot;the customer is all that matters&quot; is a fine stance to adopt, particularly from the perspective of the customer, but it&#39;s no way to build a team of happy developers.</p> <p>-Rod Hilton, Software Craftsman Godammit.</p> Sat, 02 Feb 2013 00:00:00 +0000 http://www.nomachetejuggling.com/2013/02/02/brief-thoughts-on-software-craftsmanship/ http://www.nomachetejuggling.com/2013/02/02/brief-thoughts-on-software-craftsmanship/ Fall 2012 Semester in Review <p>My third semester in the PhD program is over, and it has unquestionably been my hardest yet. I bit off way more than I could chew, this semester was extremely unpleasant and, for the first time since going back to school, I was glad for the semester to end.</p> <p>I took two 7000-level PhD courses at once (previously I had only done one in a semester) which was part of the problem. Originally I was planning on doing three, but quickly decided that was insane and dropped one of the classes, which I&#39;ll now be taking in the Spring. One of these two remaining classes was material I had never been exposed to at all, and it also happened to be structured in a way that would have made it exceptionally difficult even if I had, while the other was material to which I had minimal exposure. I also took two courses on Coursera during this period of time, both of which I took quite seriously, as though they were credit courses. And if all of that wasn&#39;t crazy enough, I managed to once again get roped into grading.</p> <h1>Campus Classes</h1> <h2>Artificial Intelligence</h2> <p>Textbook: <a href="http://www.amazon.com/Artificial-Intelligence-Pb-E-Rich/dp/0071008942/ref=sr_1_1?ie=UTF8&amp;qid=1355376492&amp;sr=8-1">Artificial Intelligence, 2nd ed.</a></p> <p>I had never taken an A.I. class as an undergrad, and I always regretted it. I felt like I should at least be see what it&#39;s about, and I was always really interested in things like evolutionary algorithms, genetic algorithms, and other metaheuristics. This class was taught by a professor I hadn&#39;t yet had, so this was a real gamble for me.</p> <p><strong>I actually wound up intensely disliking the class.</strong> Not the material, which I found mostly very interesting, but the actual class itself. Rather than having a challenging homework due every two weeks like my other classes had been, this class had one homework due each week, on Monday. Since I work full-time, this meant that every single weekend during the semester was spent working on homework, I never had a full weekend to relax or catch up on anything else. This had a pretty serious impact on my home life and I really grew to dislike it.</p> <p>It wasn&#39;t just the number of homeworks that was the issue, but the nature of them. The homeworks often asked us to solve very easy problems whose solutions were incredibly time-consuming to write out, and to make matters worse they often asked us to solve nearly identical problems in the exact same way over and over. It never tested my knowledge any differently to do the same problem twice in exactly the same way, but it was incredibly time-consuming to do these problems by hand. <strong>Homeworks often took 10-14 hours to complete</strong>, and like I said I could only work on them during the weekends, so my entire weekend was consumed by homework, every weekend, for 12 weeks. What infuriated me was that these homeworks didn&#39;t take time because I didn&#39;t understand the material, the amount of effort required was almost completely disconnected from my grasp of the topic.</p> <table class='image alignright' width='235'><tr><td><img src="http://www.nomachetejuggling.com/assets/Artificial.intelligence-229x300.jpg" width='229' height='300'/></td></tr></table> <p>My lack of weekends also led to me falling behind in my other classes, it felt like I was struggling to keep my head above water all semester long. This semester felt the most like my undergrad days, pulling all-nighters to complete assignments just before they were due, doing the bare minimum on an assignment just to get it checked off my list and move on to the next one, and always feeling stressed.</p> <p>Worst of all, this class, which I took as an elective for fun just to see what it would be like, was a constant time distraction, pulling my attention away from my Computational Complexity class, which I had been looking forward to since going back to school. Another PhD student who has taken a lot of classes with me actually wound up dropping Artificial Intelligence and entering an Independent Study because he felt that A.I.&#39;s disproportionate amount of busywork was distracting him from narrowing down his research area, and would ultimately delay him completing the program. He did this after the add/drop date, paying for the class and taking a withdrawal; that&#39;s how much of a timesink this class was. As the class went on, I began to realize just how wise a decision this was.</p> <p>I actually liked the classroom environment quite a lot - the professor tried to run the class very socratically, and almost nothing was taught without having a student come to the board and work through a problem with the entire class helping. I thought this was a really great way to teach, and the professor clearly had a passion for the subject. Class was very lively and engaging, which I enjoyed. <strong>It was unfortunate that the intense workload distracted me so much from the passionate professor, strong lectures, and engaging material.</strong></p> <p>Ultimately, the workload is what dragged this class down to me, wasting its potential as a great class and transforming it into the only class I&#39;ve taken that I didn&#39;t like. It&#39;s one thing if the work takes me a long time because I&#39;m struggling to understand the material, but when I understand the material and it takes me 10 hours to write it all up anyway, something is amiss. I&#39;d have preferred to have half the number of homeworks, and have them be more challenging than what we got. In fact, I&#39;d have preferred to have some projects, given that I wound up writing a lot of code to generate solutions for me to save time.</p> <p>There actually WAS a project for the class, but it was extra credit. This project was assigned halfway through the semester (to help students pull their grades up from the midterm), but the lectures that explained the concepts needed to do the project weren&#39;t until the final week of class. Given how much I was drowning in work just keeping up with his class, I decided not to pursue the project at all and just focus on doing well on the final. After my final, my professor e-mailed me to let me know I had a B in the class, but I could pull it up to an A if I did this project, which was due in 2 days.</p> <p>I&#39;ve had straight-A&#39;s for every other class, and I can&#39;t imagine a course being more challenging than A.I. I realized that one day I&#39;d look back at my transcript and see all A&#39;s and one B, <strong>a B that I had an opportunity to pull up to an A but I didn&#39;t bother because I was lazy and wanted to be done with the semester.</strong> I decided laziness wasn&#39;t a good enough reason to accept the B, so with only two days to do the entire half-semester project, I decided to give it a shot. It actually wound up being incredibly fun, largely because I made it fun by doing it in Scala. You can check out the project <strong><a href="https://github.com/rodhilton/trajectories">here</a></strong> if you want.</p> <p>In the end, I managed to complete the project by staying up until about 2am a few nights, and I wound up with the A in the class.</p> <h2>Computational Complexity</h2> <p>Textbooks: <a href="http://www.amazon.com/Automata-Computability-Complexity-Theory-Applications/dp/0132288060">Automata, Computability, and Complexity</a> and <a href="http://www.amazon.com/Computational-Complexity-Christos-H-Papadimitriou/dp/0201530821">Computational Complexity</a></p> <p>The existence of an entire course devoted to Computational Complexity was one of the main reasons I picked UCD over other schools. Taught by a professor I really enjoyed for Theory of Automata, I figured this class was likely to be my favorite class of all time. Unfortunately, it wound up being a bit of a disappointment.</p> <p>As an experiment, the class was, for the first time, taught as a &quot;hybrid&quot; class. Rather than the traditional classroom setting it had always been, it was taught mostly online. Once my professor saw that only 3 people wanted to take the class at the 7000-level and everyone else was taking it at 5000-level, it was split further, and the format it wound up taking was that the three of us met in-person once per week and discussed various issues within Complexity.</p> <table class='image alignleft' width='306'><tr><td><img src="http://www.nomachetejuggling.com/assets/chp_venn_diagram-300x270.jpg" width='300' height='270'/><p class='caption'>Complexity Classes, from Math $$\cap$$ Programming</p></td></tr></table> <p>The main issue was that, <strong>by only meeting once a week, we simply we unable to cover a great breadth of material.</strong> Computational Complexity is a huge subject, there are <a href="http://complexityzoo.uwaterloo.ca/Complexity_Zoo">495 classes in the Complexity Zoo</a>, and the infrequent meetings meant that only a tiny fraction of the topic wound up being covered. We walked through some of the more difficult, classic papers in theoretical computer science, which was a lot of fun, but fully dissecting a single paper would often take 2 classes, a huge fraction of the available classtime when only meeting once a week.</p> <p>For my semester project, I did <a href="http://www.nomachetejuggling.com/2012/12/15/a-stroll-through-the-complexity-zoo/">a literature review and covered 27 complexity classes from the Zoo</a> that we didn&#39;t have time to even mention in class. Due to the A.I. class, I had much less time to devote to this project than I would have liked, but I still wound up doing a lot of research. I absolutely loved this project, and discovered a whole bunch of complexity classes I had never heard of before as an undergraduate. I found the material just as exciting as I expected to, but the sad truth is that I was able to spend much, much less time on this fascinating subject than I wanted to.</p> <p>There was also a wide disparity between the 3 students. One of the students had actually taken a different version of the same class in another semester, and another was an upper-level PhD student working on his dissertation that was taking the &quot;class&quot; as an Independent Study. Both of these students had a much greater grasp of this material than I did, so I often felt like the class moved too quickly for me, and I got lost frequently. I was reluctant to ask questions because I knew I was the only person in the room who didn&#39;t understand things, so I had to do a lot of reading on my own time to keep up. Of course, I had almost no time to do this kind of reading, so I think there&#39;s a lot of stuff that went over my head and stayed there.</p> <p>Overall, I really enjoyed this class and both of the textbooks we used, but it was also one of my biggest disappointments because I felt like I was only getting half a class. I would have loved for us to have met twice a week (hell, I&#39;d have loved thrice per week), but I&#39;m glad I took the class and I learned more in the couple weeks of independent research than I have in any other class I&#39;ve taken. I wound up ordering physical copies of a number of complexity textbooks because I found the topic so interesting, and I&#39;m eyeing the sub-field closely for potential research topics.</p> <p>The class was pretty informal, with the only graded components being a presentation we did halfway through the semester, another presentation at the end, and the final term paper. I wound up with an A in the class.</p> <h2>Grading: Fundamentals of Computing</h2> <p>I swore off grading last time I did it, with an overabundance of cheating ruining the experience for me. But after the same class I graded before saw a 100% increase in enrollment, the chair of the department personally asked me if I could help her out by grading it again, along with a second grader. As much as I didn&#39;t want to, I couldn&#39;t turn down the chair, so I reluctantly agreed.</p> <table class='image alignright' width='306'><tr><td><img src="http://www.nomachetejuggling.com/assets/grading-rubric.jpg" width='300' height='288'/></td></tr></table> <p>I only graded the odd homeworks, with the other grader doing the evens. A grading session took much longer than it did last time I did it, but they were infrequent enough that it wasn&#39;t too much of a problem. It certainly did feel like I never had the time to grade, but I managed to sneak in the time whenever I was too tired to do A.I. work.</p> <p>Classes started off badly, with more students cheating on the first assignment I was grading. I once again caught them and called them out and then, to my great surprise, the cheating stopped (or they got much better at hiding it). Grading was much better this time, the only downside being that <strong>it cut into time I simply didn&#39;t have.</strong></p> <p>One tip I got a while ago from a blog post or article about getting a PhD is to remember that your goal is to get the PhD, and that anything you spend your time doing that doesn&#39;t bring you closer to that goal is inherently taking you further away from it, since your time is limited. Grading definitely falls into that category, and I particularly felt the drain on my time since I was barely surviving anyway.</p> <p>I intend to avoid grading in the future as much as possible, though it&#39;s hard to turn down a professor or department chair when personally asked by them.</p> <h1>Online Classes</h1> <h2>Functional Programming Principles in Scala</h2> <p>I, along with something like 10,000 other students, took Functional Programming Principles in Scala taught by Martin Odersky online on Coursera.org. I had registered for Coursera courses before, but largely treated them as &quot;bonus material.&quot; I&#39;d check out video lectures every so often, glance at assignments, and so forth. I thought taking a Functional Programming course would help me both academically as well as professionally, since we use Scala exclusively at work.</p> <table class='image alignleft' width='246'><tr><td><img src="http://www.nomachetejuggling.com/assets/scala.png" width='240' height='135'/></td></tr></table> <p>I took this course very seriously. I carved out time to watch every video lecture, and I treated the homework assignments like real assignments. I really enjoyed the format of the class, with an autograder running secret tests against my code. The code had a couple clever tricks to make &quot;???&quot; compile but not work, so you could leave functions unimplemented and submit what you had to see if you were on the right track. A co-worker would typically do the entire assignment and submit once, but I tended to write a little, submit, write a little, submit, over and over again. I typically wound up with 10-20 submissions per assignment.</p> <p>I thought the course started out better than it finished. When the course first started, it really felt like a class on Functional Programming itself, which simply happened to use Scala as the language. <strong>Later in the course, it began to feel like a Scala course, with more of a focus on Scala&#39;s idioms and syntax.</strong> I still enjoyed these sections, but definitely less so. Another thing that irked me was when Odersky dropped the hammer on posting and sharing code solutions to the homeworks. My co-workers and I would always share our solutions after the deadlines had passed, and I wound up learning a ton from seeing how others implemented the same things as me. I understand why they had to crack down on &quot;cheating&quot; but I think the restrictions were a bit overly strict.</p> <p>Odersky teaches a followup to the course at EPFDL, and I&#39;d love to see that course offered online as well. I&#39;d like to see more focus on FP in general with less time devoted to the particulars of Scala, but I definitely got a lot of out the course as it was. In fact, I wound up using a very similar style to the course to implement the A.I. project described above, and it worked incredibly well.</p> <p>I got 100% in the class, I was never willing to walk away from an assignment without getting full credit on it, even when I was pulling my hair out with suboptimal trees in the Huffman Codes assignment.</p> <h2>Writing in The Sciences</h2> <p>I also took Kristin Sainani&#39;s Writing in the Sciences course on Coursera. This is the online version of a class Sainani teaches at Stanford University. Since I&#39;m doing a PhD, I know I&#39;ll be doing a lot of writing, and I wanted to improve my writing skills. I also recently read the very similarly-themed <a href="http://www.amazon.com/Writing-Computer-Science-Justin-Zobel/dp/1852338024/ref=sr_1_1?ie=UTF8&amp;qid=1356058376&amp;sr=8-1">Writing for Computer Science</a> by Justin Zobel, which I found enlightening.</p> <p>I took this course pretty seriously, in that I actually watched all of the lectures and did all of the assignments, but I didn&#39;t give it the level of attention I gave the Scala class or either of my University classes. The course simply wasn&#39;t technical enough to require my full attention and it was always my bottom priority, so I often listened to the lectures in headphones while at work, turning my attention to the video only when something visual was being presented. One week, I played the lectures on my laptop while doing Scala homework on my desktop. Now <strong>that&#39;s</strong> multitasking.</p> <table class='image alignright' width='246'><tr><td><img src="http://www.nomachetejuggling.com/assets/writing.png" width='240' height='135'/></td></tr></table> <p>I struggled a bit with the grading of the class. Since it wasn&#39;t code, no auto-grader could be used. Instead, students simply submitted writing assignments and had 3 other students grade them. Similarly, you had to grade the work of 3 other students. The peer reviewers were tasked with making suggestion to improve the overall clarity of the writing, but generally they focused on word choice and minor paragraph tweaks. Nobody ever turned a 4-paragraph rant into a sleek and slender 2-paragraphs, the tweaks were always much more minor. By the final assignment, I was putting about the same level of effort in.</p> <p>I was also shocked at the level of plagiarism. One student submitted a paper that had a single sentence introducing a scientific peer, then a 4-paragraph quote by them, then another sentence thanking them for their contribution. What the hell is that supposed to be? I gave them a zero.</p> <p>I got pretty good feedback on my writing, and I think I improved overall. I definitely know some things to watch for when writing, but I also <strong>think I got more out of Zobel&#39;s book, possibly because it was more focused on Computer Science</strong> specifically than Sainani&#39;s class.</p> <p>I wound up with a 91.8% in the class, just barely above the 90% required to be considered passing. This was due almost entirely to my own lack of organization, getting due-dates of two assignments mixed up with all of my other due-dates and earning a couple zeroes as a result.</p> <h1>Conclusions</h1> <p>This semester was incredibly rough. On multiple occasions I asked myself just what the hell I was doing, and why I was subjecting myself to it. Lots of self-doubt, wondering if I was cut-out for the program. In the end, I pushed through it by thinking that if I can survive this semester, I can survive any of them.</p> <p>Having finished the semester with my grades and sanity in tact and little more than a severely bruised social life and diminished level of happiness, I think I can probably survive the rest of the program, which is promising. When I started this program, a goal of mine was to not let it impact my life noticeably; time I normally would spend watching TV or playing video games would be spent doing schoolwork, and otherwise my time would be the same. While I succeeded in this goal every other semester, this semester I failed, being <strong>completely unavailable for anything during any weekend, including for simple duties around the house</strong>. Lots of plans had to be cancelled or postponed, and juggling everything in my life was exhausting.</p> <p>Next semester should be less intense. I&#39;m taking a class in the business school (it&#39;s a requirement) about how to do research. I somewhat resent having to take a course that isn&#39;t really Computer Science, but it&#39;s the only non-CS requirement for the degree so I&#39;m just going to have to do it. Now that I have straight A&#39;s, I&#39;m going to feel a lot of pressure in that class, I don&#39;t want my only non-CS class to drag my GPA down.</p> <p>Due to credits transferring from my Master&#39;s program, that&#39;s actually all I need to be done with classwork. But since I&#39;ll be enrolled anyway, I&#39;m taking Graph Theory as well. I don&#39;t technically need this course, but I find the topic extremely interesting and I&#39;ve been looking forward to it since the professor who teaches it introduced some of the material in my Algorithms class. This course is taught simultaneously at a Master&#39;s AND Bachelor&#39;s level, so I doubt it&#39;d going to be a back-breaking workload, and I get along well with the professor. </p> <p>I have one more preliminary exam to take in February before I&#39;m truly considered a PhD candidate, so that&#39;s my next big obstacle. After the prelim and these two more courses, my coursework is finished and all non-research requirements will have been met. Hopefully I&#39;ll have narrowed things down and I&#39;ll have a good idea of what I want my research area to be before the summer. <strong>Ideally at the end of next semester I&#39;ll defend my proposal and be well on my way in research.</strong></p> <p>I&#39;m still glad I&#39;m in the program, and I&#39;m looking forward to continuing, but after this semester I&#39;m definitely ready for a nice long break.</p> Thu, 20 Dec 2012 00:00:00 +0000 http://www.nomachetejuggling.com/2012/12/20/fall-2012-semester-in-review/ http://www.nomachetejuggling.com/2012/12/20/fall-2012-semester-in-review/