<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>Absolutely No Machete Juggling</title>
	<atom:link href="http://www.nomachetejuggling.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.nomachetejuggling.com</link>
	<description>Rod Hilton's views on programming, technology, and life.</description>
	<pubDate>Mon, 01 Jun 2009 01:32:05 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.5</generator>
	<language>en</language>
			<item>
		<title>Test-Driven Development in Open Source Survey</title>
		<link>http://www.nomachetejuggling.com/2009/05/31/test-driven-development-in-open-source-survey/</link>
		<comments>http://www.nomachetejuggling.com/2009/05/31/test-driven-development-in-open-source-survey/#comments</comments>
		<pubDate>Mon, 01 Jun 2009 01:29:38 +0000</pubDate>
		<dc:creator>Rod</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<category><![CDATA[education]]></category>

		<category><![CDATA[school]]></category>

		<category><![CDATA[software]]></category>

		<category><![CDATA[survey]]></category>

		<category><![CDATA[tests]]></category>

		<guid isPermaLink="false">http://www.nomachetejuggling.com/?p=390</guid>
		<description><![CDATA[I&#8217;m in the process of doing research about the usage of Test-Driven Development within Open Source projects.  It&#8217;s part of my master&#8217;s thesis for Regis University.
The survey only has three required questions and should take less than 30 seconds to fill out.  If you have worked on an open source project, please help [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m in the process of doing research about the usage of <a href="http://en.wikipedia.org/wiki/Test-driven_development">Test-Driven Development</a> within Open Source projects.  It&#8217;s part of my master&#8217;s thesis for <a href="http://www.regis.edu">Regis University</a>.</p>
<p>The survey only has <strong>three required questions</strong> and should take less than 30 seconds to fill out.  If you have worked on an open source project, please help me with my research by filling it out.</p>
<p>It would also help greatly if you distributed the link to this post or to the <a href="http://spreadsheets.google.com/viewform?formkey=cHU2aHo5bS14cE04c2gzWGlhaUpQSHc6MA..">survey form itself</a> to your project mailing lists and encouraged other developers to fill it out as well.</p>
<p>When my research is complete, I&#8217;ll post the results on this web site.  <strong>Thank you for your time.</strong></p>
<p>The link to the survey is <strong><a href="http://spreadsheets.google.com/viewform?formkey=cHU2aHo5bS14cE04c2gzWGlhaUpQSHc6MA..">here</a></strong>.</p>
<p><iframe src="http://spreadsheets.google.com/embeddedform?key=pu6hz9m-xpM8sh3XiaiJPHw" width="500" height="0" frameborder="0" marginheight="0" marginwidth="0">Loading&#8230;</iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://www.nomachetejuggling.com/2009/05/31/test-driven-development-in-open-source-survey/feed/</wfw:commentRss>
		</item>
		<item>
		<title>How I Lost 90 Pounds in One Year</title>
		<link>http://www.nomachetejuggling.com/2009/05/02/how-i-lost-90-pounds-in-one-year/</link>
		<comments>http://www.nomachetejuggling.com/2009/05/02/how-i-lost-90-pounds-in-one-year/#comments</comments>
		<pubDate>Sat, 02 May 2009 23:59:29 +0000</pubDate>
		<dc:creator>Rod</dc:creator>
		
		<category><![CDATA[Life]]></category>

		<category><![CDATA[diet]]></category>

		<category><![CDATA[weight]]></category>

		<guid isPermaLink="false">http://www.nomachetejuggling.com/?p=354</guid>
		<description><![CDATA[I&#8217;ve been a fat guy since I was in elementary school.  I had a growth spurt around 10th grade that thinned me out a lot, but then I regained all of that weight in college, and then some.

One day I hit 290, which became something of a wake-up call for me.  I really [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been a fat guy since I was in elementary school.  I had a growth spurt around 10th grade that thinned me out a lot, but then I regained all of that weight in college, and then some.</p>
<p><a href="http://www.nomachetejuggling.com/files/weight_mountains.jpg"><img src="http://www.nomachetejuggling.com/files/weight_mountains-300x225.jpg" alt="" title="Before and After: Mountain Pic" width="300" height="225" class="alignright size-medium wp-image-366" /></a></p>
<p>One day I hit 290, which became something of a wake-up call for me.  I really didn&#8217;t want to break the 300 barrier, but I had been steadily gaining weight for the past few years and I was well on my way to being over 300 pounds.  Combined with my father&#8217;s increasing problems due to his diabetes, I had become worried enough about my future that I decided to do something about my weight in 2007.</p>
<p>I have tried a number of different things over the course of my life, though I never tried any fad diets like South Beach or Atkins.  I tried limiting my food intake, I tried riding my bike to work to get exercise, but I remained steadily creeping toward 300 pounds and a future as a diabetic.</p>
<p>To make a long story very, very short, exactly one year later I weighed 200 pounds, having lost 90 pounds.  No surgeries, no fad diets.</p>
<p>There were a number of things I did that I consider to have made the difference between an unsuccessful attempt at losing weight and a successful one.  I&#8217;ve decided to share these things on the intarwebs, in hopes that they might motivate or help someone else struggling with their weight.</p>
<p><span id="more-354"></span></p>
<p><strong>#1 See A Nutritionist</strong></p>
<p>Talking to a professional nutritionist made a huge difference.  I was able to tell her exactly what I ate during the day and exactly what kind of exercise I got regularly.  I ran her through a typical day and a typical week, and she figured out exactly what my problem areas were.  As it turned out, my main problem wasn&#8217;t sugar intake, but carbohydrate intake, and she gave me helpful guidance for how to control my carbs in my diet.  She told me what foods I ate that I needed to stop eating, which foods I needed to cut back on, and which kinds of food I needed to start eating.  She illustrated portion sizes for the foods I eat, and gave me a number of extremely helpful guides.</p>
<p>She didn&#8217;t put me on some crazy fad diet, or give me suggestions that I&#8217;d be unable to follow because I&#8217;d be miserable following them.  <strong>She catered her advice to me specifically</strong>, which made it far more useful advice than what I could pick up on the internet in blog posts such as this one.</p>
<p>In the end, making adjustments to my diet and exercise routines based on her suggestions wound up making a <strong>critical difference</strong> in my ability to lose weight.</p>
<p><strong>#2 Seriously, See A Nutritionist</strong></p>
<p>I really can&#8217;t stress it enough.  <strong>The combined impact of every single other item on this list didn&#8217;t even come close to the impact made by just talking to a nutritionist</strong>.  The visit was covered on my insurance plan and it only took about an hour out of my life.  Absolutely nothing I did over the course of the year helped me as much as talking to a nutritionist.</p>
<p>Do it.</p>
<p><strong>#3 Set Goals and Rewards</strong></p>
<p>My goal for the year was 90 pounds.  I never, EVER thought I&#8217;d actually pull it off.  90 was my &#8220;boy would it be nice&#8221; goal.  I set intermediate goals of 30 and 60 pounds.  30 I knew I could hit, 60 would take work, 90 was basically impossible.</p>
<p>At each goal, I gave myself a reward.  This reward was something I didn&#8217;t allow myself to get without hitting the goal.  At 30, I got a second monitor for my computer.  At 60, an XBox.  At 90, a Macbook.  Each reward was larger than the last.</p>
<p>Focusing on just the thirty pound increments made my goals seem more doable, and whenever I wanted to bail on a workout early I could say &#8220;come on, 10 more pounds to the XBox&#8221; to keep myself going.  Every time I wanted a piece of cake, I knew it moved me further away from my Macbook.</p>
<p>Manageable goals make a big difference in motivation, and I&#8217;d say that this item combined with seeing a nutritionist were the biggest difference makers without question.</p>
<p><strong>#4 Timebox The Effort and Commit</strong></p>
<p><a href="http://www.nomachetejuggling.com/files/weight_pose.jpg"><img src="http://www.nomachetejuggling.com/files/weight_pose-300x225.jpg" alt="" title="Before and After: Pose pic" width="300" height="225" class="alignleft size-medium wp-image-365" /></a></p>
<p>When I first started, it was very helpful, just from a mentality standpoint, to set a limit for how long I was going to make this effort.</p>
<p>The idea of &#8220;I&#8217;m going to watch what I eat and work out for the rest of my life&#8221; was intimidating to me, to the point where it felt like I didn&#8217;t even want to bother.  It was a miserable future in my mind, and it made me want to give up instantly.</p>
<p>In contrast, this time I said to myself &#8220;Okay, I&#8217;m going to watch what I eat and work out and commit to that for exactly one year, to the day.  I&#8217;ll decide what to do after that at the end.&#8221;  Time boxing the effort gave me a reason to try, and every time I wanted to give myself an excuse to get out of the gym or eat a giant pizza by myself, I&#8217;d just say &#8220;No, not now.  You&#8217;re sticking with this for one year.&#8221;</p>
<p>It seems small, but it made a big difference.  Feeling like there was a limit to the work kept me motivated to stick with the plan whenever I was tempted to deviate.</p>
<p>In the end, however, I feel so much better now than I did when I was 90 pounds heavier, and I actually ENJOY the gym as well as how I feel when I eat healthy.  I don&#8217;t have the temptation to eat a big pizza any more because I know how I feel afterwards and how different that is from how I feel normally.  Eating junk food makes me lethargic and tired, but I never knew that until I ate healthy and was able to really observe the difference.  Even though my year is up, I haven&#8217;t fallen back into old habits; I still eat well and go to the gym, but now I&#8217;m happy to do so.  However, it helped a great deal to to limit myself to a specific period of time from the outset.</p>
<p><strong>#5 Track Progress, Adjust as Needed</strong></p>
<p>During the year, I weighed myself every day, at the same time every day, wearing the same amount of clothing.  I wrote down my weight, and I used the results to course correct when I needed to.</p>
<p>I found that my weight fluctuated quite a bit during the week, and there was nothing as frustrating as working my ass of at the gym and then weighing myself the next day and finding I had gained weight.  In actuality, I hadn&#8217;t gained weight, but my weight fluctuated.  Weight fluctuations are completely normal and depend on the time of day, the time of year, how hydraded or dehydrated you happen to be, when you last ate, and many other factors.  <strong>You can&#8217;t let yourself get hung up on day to day weight changes.</strong></p>
<p><a href="http://www.nomachetejuggling.com/files/weightchart.png"><img src="http://www.nomachetejuggling.com/files/weightchart-300x194.png" alt="" title="Weight Chart" width="300" height="194" class="alignright size-medium wp-image-373" /></a></p>
<p>Instead, what I did was kept track of my weight for the week.  I had a spreadsheet (stored in <a href="http://docs.google.com">Google docs</a>) that had one week per row, 7 columns each.  The only column I ever really looked at was the &#8220;Week Average&#8221; and I compared that to the previous week.  If I had, overall, gained during the week, I needed to make a change.  If I had lost weight, I was on the right track.  This let me ignore daily fluctuations.</p>
<p>I entered my data every day, but I evaluated only at the start of the week.  When I decided to change my plan, I committed to the change for one full week, even if it didn&#8217;t look like it was working as the week started out.  For example, if I decided to have a different kind of breakfast, I would commit to that new breakfast for the full week, no matter what.  At the end of the week, I&#8217;d decide if that did or didn&#8217;t work.</p>
<p>It also helps to buy a decent scale and weigh yourself at the exact same time every day.  I always weighed myself in the morning, right before showering.  The scale was in the bathroom, next to the shower.</p>
<p>I also tracked myself at the gym.  I didn&#8217;t go running or bike riding for aerobic exercise - I used machines that allowed me to enter my age and weight, then told me how many calories I was burning.  When I was first starting out, this was critical in figuring out what kind of changes I needed to make.</p>
<p>One thing I wish I had done was taken a picture of myself at 290.  I never thought I&#8217;d actually be able to lose even 30 pounds, let alone 90.  So I wasn&#8217;t willing to take a photo of myself at 290.  When I hit 260, I wished I had taken a picture of myself 30 pounds heavier, because, having lived my life as a fat guy, it was really hard to actually see that I was losing weight because of my own perceptions.  Only the scale told me I was losing weight.  If I had a picture at 290 and one at 260, I would have seen the difference that others were seeing and mentioning.  Of course, at 260 I never thought I&#8217;d hit 230, so I still didn&#8217;t take a picture.  And, you guessed it, at 230 I never thought I&#8217;d hit 200 so I still didn&#8217;t take one.  I wish I had a picture of myself 90 pounds heavier without a shirt on, but I don&#8217;t.  Do it, or you&#8217;ll regret it.</p>
<p><strong>#6 Don&#8217;t Make A Resolution, Start Right Now</strong></p>
<p>Resolutions don&#8217;t work.  Don&#8217;t make weight loss a &#8220;new years resolution.&#8221;  And don&#8217;t say things like &#8220;alright, I&#8217;m going on my diet starting the first of this month.&#8221;  Start next week.</p>
<p>Whenever I would pick a specific time to start, or do something like have &#8220;one last hurrah&#8221; at a buffet during the month prior to &#8220;getting serious,&#8221; I would fail.  Any time I drew a line between my &#8220;old diet&#8221; and my &#8220;new diet&#8221; it didn&#8217;t work.  I can&#8217;t really explain why, but for some reason this never worked out.</p>
<p>I&#8217;d miss a workout day and all of a sudden the &#8220;new diet&#8221; had been blown and I&#8217;d wind up skipping another day, and then another, until I wasn&#8217;t doing it anymore.  Or I&#8217;d eat a slice of pizza and just give up on the whole thing. <strong> Creating a hard line between &#8220;old&#8221; and &#8220;new&#8221; made me feel like a failure if I screwed up during the &#8220;new&#8221; phase.</strong></p>
<p><a href="http://www.nomachetejuggling.com/files/weight_suit.jpg"><img src="http://www.nomachetejuggling.com/files/weight_suit-300x225.jpg" alt="" title="Before and After: Suit pic" width="300" height="225" class="alignright size-medium wp-image-364" /></a></p>
<p><strong>Instead, I got into it gradually. </strong> My first day at the gym wasn&#8217;t some hour-long thing, it was about 30 minutes.  My first day of my new diet wasn&#8217;t carrot sticks and salads, I just cut back on some bad foods and tried some new ones.  I experimented.  I replaced my morning muffin with a morning yogurt.  I added half an hour to my workday by going to the gym immediately after work (before going home) for a little while.  Then I&#8217;d simply track how helpful these efforts were.  Quite honestly, a small change was actually enough to lose some weight in the beginning, but eventually it wasn&#8217;t enough, and I had to add more gym time or cut back more in my diet.  I started with baby steps and then course-corrected as time went on.  This means I didn&#8217;t ever have a distinct &#8220;old life&#8221; and &#8220;new life&#8221; with a line drawn between them.  I didn&#8217;t start &#8220;first thing next Monday&#8221;.  I started immediately and changed the plan as I went along.  <strong>Start tomorrow.</strong></p>
<p>Another benefit of starting without making it a New Year&#8217;s resolution is quite simple: <strong>just after New Year&#8217;s, the gym sucks.</strong>  The place gets packed with &#8220;New Year&#8217;s Resolutionists&#8221;.  You have to fight for a machine that you want to use, and if you&#8217;re new to the gym, you feel like everyone is watching your fat ass jiggle around on the treadmill.  The gym blows when it&#8217;s crowded, especially when you&#8217;re starting out.  Starting out in January is a guaranteed way to abandon the gym.  I started in October, so I was comfortable enough in the gym by January that I didn&#8217;t mind the sudden surge in attendance (in fact, I felt like they were n00bs).  The resolutionists all give up by March, so after that it&#8217;s safe.</p>
<p><strong>#7 No Fried Food, No Soda - Cold Turkey</strong></p>
<p>There were two exceptions to the &#8220;slow start&#8221; mentioned above.  Two big changes that were, in fact, immediate and drastic.  I stopped drinking regular soda, and I stopped eating fried food.  Completely.</p>
<p>In a restaurant, if my food came with fries, I&#8217;d ask to replace it with steamed Broccoli or something similar.  I didn&#8217;t buy or drink any regular soda, ever, no exceptions.  Diet soda was fine, however.</p>
<p>I didn&#8217;t listen to any of the crap about how diet soda is bad for me and causes cancer, or how Mexican coke with real sugar is better for me, blah blah blah.  It&#8217;s all horseshit.  Calories are calories, and diet soda doesn&#8217;t have any.  Diet soda isn&#8217;t GOOD for me, but it did let me drink something with some flavor with my lunch.  Quite honestly I&#8217;d have gone insane if I only drank water for the year, so I&#8217;m glad diet soda had my back.  That said, I didn&#8217;t guzzle the stuff.  Soda, because it&#8217;s carbonated, expands your stomach, so it makes you feel less full than you otherwise would.  This encourages you to overeat.  I also started ordering only water when I went out to eat, which had the bonus of saving me more money than I expected.  I generally had water or diet iced tea (no carbonation) with dinner, and I allowed myself to drink a diet soda at lunch.  I could get away with this because I always brought my lunch from home, so there was a limit to the amount of food I could eat at lunchtime, reducing the risk of overeating because of soda.</p>
<p>I&#8217;d occasionally steal a couple fries from my fiancee if she had some, but eventually I found that having two fries made it extremely difficult not to have a third fry, and a third made it very hard not to have a fourth, so I stopped doing that for the most part.</p>
<p>Diet soda and veggies instead of fried food, immediately.  Starting right away.  It helps.</p>
<p><strong>#8 Get What You Need, But Don&#8217;t Let It Stop You</strong></p>
<p>At the gym during the first week with my iPod nano.  Holding it while I work out is a pain.  &#8220;You know what,&#8221; I think to myself, &#8220;I really need an arm strap.  I&#8217;ll get one tomorrow and then start working out.&#8221;</p>
<p>You have no idea what kind of excuses you will invent to get out of the gym until you start going.  It&#8217;s staggering, the human brain&#8217;s ability to concoct reasons to get out of the gym.  My foot is kind of hurting.  I need a water bottle to really get started.  My iPod battery is dead, I should charge it first.  My gym shorts are too tight, I need new ones.  The little plastic thing on my shoelace came off and now I can&#8217;t tie them as tightly.  Seriously, you will think of every possible reason under the sun to get out of the gym.  <strong>GO ANYWAY.</strong></p>
<p>Even if the reason is completely valid, like the armstrap for my iPod, make yourself go anyway and live with the problem for the one time, then fix it tomorrow.  The HABIT of going to the gym is almost as important as the actual going.  If you skip a day that you planned on going, you break your habit.  Once you build the habit of going to the gym, you find that you don&#8217;t have to convince yourself to go anymore, it&#8217;s just part of your day, like brushing your teeth.  Building the habit is crucial, so don&#8217;t let little things derail you from developing the habit.</p>
<p>I now find that I actually feel shitty when I don&#8217;t go to the gym, it takes more effort for me to skip than to go.  That&#8217;s because I built a habit out of it, the same way that if you skip brushing your teeth for a day your teeth feel all grimy and disgusting.  <strong>Even if you need something before you can really get a lot out of a gym trip, go anyway and deal with the problem tomorrow.</strong></p>
<p><strong>#9 Drink More Water</strong></p>
<p><a href="http://www.nomachetejuggling.com/files/weight_couch.jpg"><img src="http://www.nomachetejuggling.com/files/weight_couch-300x225.jpg" alt="" title="Before and After: Couch" width="300" height="225" class="alignleft size-medium wp-image-367" /></a></p>
<p>Water is good for you.  It increases your metabolism, and it helps you feel full.  Very, very often when you think you are hungry, you&#8217;re actually thirsty, your brain just can&#8217;t tell the difference.  If you find yourself craving food, go drink a glass of water and wait a few minutes.  You very well may not actually have been hungry.  Your brain sucks, deal with it.</p>
<p>When I go out to a restaurant, I order water, and I drink a ton of it.  This ensures I don&#8217;t overeat at the restaurant (food in restaurants is usually served in a 3x or more portion.  If you&#8217;re not taking home a box when you leave, you ate too much).  I try to drink an entire glass of water before the waiter or waitress comes back to even take my order, and another before the bread arrives.  <strong>If I&#8217;m not annoying the server, I&#8217;m not drinking enough water.</strong></p>
<p>How much water should you drink?  At the risk of being crass, your piss should be almost clear.  If your urine is yellow, you need to drink more water.  It&#8217;s that simple.</p>
<p><strong>#10 Slow The Fuck Down</strong></p>
<p>You eat too fast.  Trust me, you do.  Fat people eat way faster than skinny people.  Huge bites, gone in seconds, then a plate full of more food.</p>
<p>I found it very helpful to fill my dinner plate with what I felt was the correct amount of food, then to eat the food on it as slowly as possible.  If I was still hungry when I was done, I forced myself to wait 20 minutes.  Only if I was still hungry after 20 minutes would I let myself have more food.  It almost never happened.  I only got a second plate if I broke the 20-minute rule (which I&#8217;d always regret)</p>
<p><strong>It takes about 20 minutes for your stomach to tell your brain it&#8217;s full.</strong>  That means, once you&#8217;re COMPLETELY FULL, it will be twenty minutes before your brain even has an idea that you should stop eating.</p>
<p>The slower you eat, the more time you give your brain to find out it should stop eating before you cram more food down your cramhole.</p>
<p>Take tiny bites.  Your mouth doesn&#8217;t need to be full to enjoy the taste of your meal.  The smaller the bite, the more food you&#8217;ll think is on your plate, and the less likely you will be to feel like you didn&#8217;t get enough food.</p>
<p>Chew.  Turn it into mush before you swallow.  You&#8217;re on a diet, so you have a much more limited number of bites.  Taste those bites as long as you can before you swallow them.  Once the food is out of your mouth, you can&#8217;t taste it anymore, and you need to stuff a whole new bite into your face to enjoy the taste of your food again.  <strong>Leave the bite in longer, and you can enjoy your food longer without the need to shove more food into your gullet.</strong>  Try to chew until there&#8217;s no flavor.</p>
<p>I still stuggle with this one, it&#8217;s a big adjustment, but it&#8217;s worth it.</p>
<p><strong>#11 Don&#8217;t Kill Yourself</strong></p>
<p><a href="http://www.nomachetejuggling.com/files/weight_camping.jpg"><img src="http://www.nomachetejuggling.com/files/weight_camping-300x225.jpg" alt="" title="Before and After: Camping" width="300" height="225" class="alignright size-medium wp-image-368" /></a></p>
<p>The worst thing you can do to completely derail your diet is to make yourself so miserable that you hate it.</p>
<p>If your company orders pizza for your group and you decide you eat your lame little salad while everyone else is eating pizza, you&#8217;re just going to sit there focusing on delicious pizza and how pissed off you are that you&#8217;re on this stupid diet.  If you hate it, you&#8217;ll quit.</p>
<p>Indulge every so often.  Have that slice of pizza.  Steal a few fries from your spouse.  Just order the cheeseburger if you&#8217;re going to be pissed off all night after ordering a bowl of soup.  Just <strong>don&#8217;t make a habit of it</strong>.  They&#8217;re indulgences for a reason, they should be the exception, not the norm.</p>
<p>If you love chocolate more than life itself, depriving yourself of it is going to end one way: with you shoving fistfuls of Hershey bars into your face while screaming &#8220;screw the diet!&#8221;  The trick is not to deprive yourself, it&#8217;s to introduce moderation.  <strong>Eat a kit-kat, but spend an extra 15 minutes at the gym to balance it out.</strong></p>
<p>Eventually you&#8217;ll start looking at a slice of pizza not as a delicious, cheesy piece of bread, but as an extra 20 minutes on the treadmill.  Then you won&#8217;t even want the damn thing (usually).  </p>
<p>Yeah, that snickers bar sure LOOKS good, but the fact of the matter is that you&#8217;ll have eaten it in 30 seconds and you won&#8217;t even remember what it tastes like 10 minutes from now, but if you eat it you&#8217;ll have to spend an extra half hour at the gym working it off.  Possibly an extra 6 hours the next day being all pissed off at yourself for eating it, blaming it for the fact that you gained weight yesterday in spite of working your butt off at the gym.</p>
<p>Your relationship toward these kinds of foods changes when you start living healthier, and you desire them less and less.  But if you completely deprive yourself of them, you&#8217;ll want them more and more.  Give in when you absolutely have to, just don&#8217;t make it a regular occurrence.</p>
<p><strong>Conclusion</strong></p>
<p>Losing weight is not that hard.  Really, it&#8217;s not.  It&#8217;s more about commitment than anything else.  <strong>Make a plan, stick to it, and the pounds come off.</strong></p>
<p>You don&#8217;t need a fad diet, you don&#8217;t need a special book, you don&#8217;t need to subscribe to some online service.  <strong>If you burn more calories during a day than you eat, you lose weight,</strong> it&#8217;s that simple.</p>
<p>Stop telling yourself &#8220;I&#8217;ve tried everything and nothing works!&#8221;  You know damn well you haven&#8217;t tried everything, stop kidding yourself.</p>
<p>Losing 90 pounds is, without a doubt, the most significant accomplishment I&#8217;ve ever made in my entire life so far.  I can&#8217;t even describe in words how much better I feel now, how much more energy I have now, and how much happier I am.  I feel comfortable in a suit.  I can buckle my seatbelt in a car without feeling like the strap is making my bitch tits stick out.  I can shop for clothes in a regular department store, and it doesn&#8217;t take me 5 hours.  I can wear t-shirts instead of fat-guy Hawaiian shirts.  I can dance or ride a bike without feeling like a fridge.  The little things make a big difference.</p>
<p><strong>I feel alive, confident, and energetic.</strong>  My brain feels like it works better, and I enjoy how I feel when I&#8217;ve eaten well for the day.  I enjoy my time at the gym, it gives me time to think about whatever I want or listen to an audiobook.  200-pound-me is so much happier than 290-pound-me that I can barely even understand how I was able to live my life before.  Having someone I haven&#8217;t seen in a while say &#8220;holy shit, you look great!&#8221; makes my week.  </p>
<p>It&#8217;s not that hard once you build habits, I promise.  I did it.  You can too.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nomachetejuggling.com/2009/05/02/how-i-lost-90-pounds-in-one-year/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Book Review: Clean Code</title>
		<link>http://www.nomachetejuggling.com/2009/04/22/book-review-clean-code/</link>
		<comments>http://www.nomachetejuggling.com/2009/04/22/book-review-clean-code/#comments</comments>
		<pubDate>Wed, 22 Apr 2009 16:52:24 +0000</pubDate>
		<dc:creator>Rod</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<category><![CDATA[book]]></category>

		<category><![CDATA[craftsmanship]]></category>

		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://www.nomachetejuggling.com/?p=346</guid>
		<description><![CDATA[There is a movement brewing in the world of professional software development.  This movement is concerned not merely with writing functional, correct code, but also on writing good code.  Taking pride in code.  This movement is the Software Craftsmanship movement, and one of the people near the head of this movement is [...]]]></description>
			<content:encoded><![CDATA[<p>There is a movement brewing in the world of professional software development.  This movement is concerned not merely with writing functional, correct code, but also on writing <strong>good code</strong>.  Taking pride in code.  This movement is the <a href="http://manifesto.softwarecraftsmanship.org/">Software Craftsmanship movement</a>, and one of the people near the head of this movement is Robert C. Martin, also known as <a href="http://www.objectmentor.com/omTeam/martin_r.html">Uncle Bob</a>.</p>
<p><a href="https://www.amazon.com/dp/0132350882?tag=theediroo-20&#038;camp=0&#038;creative=0&#038;linkCode=as4&#038;creativeASIN=0132350882&#038;adid=1241ZGM92WDKZWAXGN4N&#038;"><img src="http://www.nomachetejuggling.com/files/cleancode.jpg" alt="" title="Clean Code" width="84" height="110" class="alignright size-full wp-image-349" /></a></p>
<p>His book &#8220;Clean Code&#8221; is, in many ways, <strong>an introduction to the concept of Software Craftsmanship and a guide for developers interested in becoming craftsmen</strong>.  Clean Code is not about only writing correct code, it&#8217;s about writing code that is designed well, code that reads well, and code that expresses the intent of the author.</p>
<p><span id="more-346"></span></p>
<p>The book is essentially divided into two parts.  The first part contains Bob&#8217;s suggestions for writing and maintaining clean code.  This includes suggestions on everything ranging from how to properly comment code and how to properly name variables to how to separate your classes and how to construct testable concurrent code.  The second part of the book uses the principles in the first part to guide the reader through a few exercises in which existing code is cleaned.</p>
<p><strong>The first part of the book is fantastic.</strong>  I can&#8217;t recommend it highly enough for a professional software developer that wishes to elevate him or herself to a higher standard.  This guide is excellent, and gave me lots of things to think about while reading it.  I could almost feel myself becoming a better programmer as I internalized Martin&#8217;s advice, and the code I&#8217;ve been writing has been noticeably better since I began following his suggestions.</p>
<p>In the second part of the book, Martin essentially guides us through three projects: a command line argument parser he wrote, a section of the JUnit source code, and a section of source code from <a href="http://www.jfree.org/jworkbook/api/org/jfree/workbook/date/SerialDate.html">SerialDate</a>.  Of these, the most detailed guide is Martin&#8217;s illustration of refactoring the command line argument parser.</p>
<p>These sections all suffered from a fundamental flaw: <strong>they were inside a book.</strong></p>
<p>These sections all required reading large amounts of source code.  Not just scanning it, but really reading and understanding the code, so that the reader can understand the changes Martin makes to the code.  Reading and understanding code is something I do every day as a professional, but I <b>never</b> have to do it from paper.</p>
<p>When I read code, I&#8217;m interacting with something, not just reading.  I can scroll up and down.  If I see a method being used and I wonder how it&#8217;s written, I can click on it and jump right to the implementation.  My IDE shows me symbols in my gutterbar when methods are overridden.  I can press a keystroke to pull up a list of just the methods in a source file.  I can right click on a method and find its usages immediately.  <strong>The source code I am reading is something I can push and pull, gaining an understanding of it through interaction.</strong></p>
<p><strong>When source code is printed in a book, you get none of this.  </strong>To make matters worse, Martin&#8217;s code samples have absolutely no syntax highlighting applied to them.  When I read source code, certain parts are rendered in specific ways that make it easier to pull the information into my brain.  Strings and literals are formatted differently, comments are dimmer so I can focus on code, and so on.  Code samples in &#8220;Clean Code&#8221; are just characters, with occasionally bolding used to draw attention to parts that were changed.  It&#8217;s amazing how much syntax highlighting helps make code more comprehensible, even at a completely subconscious level.</p>
<p>A book is, quite simply, <strong>not an appropriate medium for a guided code walkthrough</strong>.  I&#8217;d have preferred the content of these sections as perhaps a lecture, with Martin&#8217;s text done in audio and his code kept on the screen.  This would at least prevent me from having to flip back and forth constantly.  I didn&#8217;t get as much out of these sections as I would have liked to, simply because it was so difficult to digest the information it contained in such an awkward, unnatural medium.  <strong>At the very least, the code samples should have been printed in color, with syntax highlighting.</strong></p>
<p>I can tell that his advice was good and that the refactorings he applied to the code samples in the book made the code far better, but mostly because I&#8217;ve observed these efforts in real life and observed how much they improve code.  <strong>If I were to encounter Martin&#8217;s &#8220;before&#8221; and &#8220;after&#8221; code in a project I was working on, I undoubtedly would find the &#8220;after&#8221; code far, far cleaner and more enjoyable to work with. </strong> However, since the book format made it so difficult to understand EITHER code sample, it didn&#8217;t seem like Martin&#8217;s efforts offered much improvement, even though I know they did.</p>
<p>Despite this frustration, the book is an excellent read, and I&#8217;m quite certain <strong>it has contributed a great deal to helping me improve as a professional.  </strong>I can&#8217;t recommend it enough, especially for Java developers.  I just think that most readers will find the final few chapters intensely frustrating - I recommend downloading the <a href="http://my.safaribooksonline.com/9780136083238/ch14">code</a> and viewing it in your favorite code editor so that you can comprehend the source code the way you would any other source code.</p>
<p>Overall Rating: 4/5 Stars</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nomachetejuggling.com/2009/04/22/book-review-clean-code/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Managing The Firehose: Controlling RSS Through Pipes</title>
		<link>http://www.nomachetejuggling.com/2009/03/27/managing-the-firehose/</link>
		<comments>http://www.nomachetejuggling.com/2009/03/27/managing-the-firehose/#comments</comments>
		<pubDate>Fri, 27 Mar 2009 20:51:33 +0000</pubDate>
		<dc:creator>Rod</dc:creator>
		
		<category><![CDATA[Technology]]></category>

		<category><![CDATA[internet]]></category>

		<category><![CDATA[pipes]]></category>

		<category><![CDATA[productivity]]></category>

		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.nomachetejuggling.com/?p=316</guid>
		<description><![CDATA[I love RSS feeds.  I love the fact that I live in a time where the vast majority of sites that I find interesting have managed to export their data, updated live, in a universal format that I can pull together in a single place.  I can read what&#8217;s going on with hundreds [...]]]></description>
			<content:encoded><![CDATA[<p>I love RSS feeds.  I love the fact that I live in a time where the vast majority of sites that I find interesting have managed to export their data, updated live, in a universal format that I can pull together in a single place.  I can read what&#8217;s going on with hundreds of sites I care about by visiting a single site like Google Reader, or through a single piece of software or a browser plugin.  It&#8217;s great.</p>
<p>But this comes with a downside.  I have almost 200 subscriptions in my Google Reader account.  Many of these subscriptions are to sites, such as <a href="http://reddit.com">Reddit</a> or <a href="http://digg.com">Digg</a>, that themselves, aggregate other sites.  I have divided my Google Reader subscriptions along various categorical tags (such as politics, development, movies, etc) as well as priority tags (Must Read, Should Read, Can Read, Can Ignore, and Should Ignore) but even that isn&#8217;t quite enough to manage the firehose of information coming my way via RSS.</p>
<p>I have utilized <a href="http://pipes.yahoo.com">Yahoo Pipes</a> to manage this deluge of information and I thought I&#8217;d take some time to share how.  This article will serve both as a basic tutorial for using Yahoo Pipes to manage your RSS feeds as well as a place to show some specific examples I use to control my feeds that you can use as well if you subscribe to the same sites I do.</p>
<p><span id="more-316"></span></p>
<p><b>Yahoo Pipes</b></p>
<p>Yahoo Pipes, if you&#8217;ve never used it, is simultaneously both intimidating and insulting the first time you use it.  You drag components around on a screen and connect them together with little paths.  It feels like you&#8217;re programming in Visio or something.  Yet, even though you feel like a child dragging components around, you find yourself simultaneously overwhelmed by the number of components that exist in the system.  Yahoo Pipes is tough to get used to.</p>
<p>Pipes allow you to essentially define a source of data as a starting point, then run it through a series of operators and output something else when done.  But it&#8217;s more than just a regular expression being run on a page - it works best with sources that consist of a list of SOMETHINGs, and the operators tend to perform their transformations on every item in the list.</p>
<p>The source we&#8217;ll be using in this article is the RSS feed source.  Everything we do will be done to take an RSS feed with too much data, then run it through a series of filters and transformations to re-output the same feed, but with only the items we care about.</p>
<p>Once you have a pipe that outputs a transformed list, you can get an RSS url to the output of the Pipe itself, then subscribe to that with your feed reader in place of the original feed.  </p>
<p>For example, let&#8217;s say that I find far too many posts in the RSS feed for <a href="http://digg.com/technology">Digg.com/technology</a>.  Let&#8217;s say, for me, I only care about the items that relate specifically to Apple, because I&#8217;m a digg user and I love Apple to death like all good Digg users.  Rather than subscribe to the RSS feed for Digg/Technology in my Google Reader, I&#8217;ll create a pipe that uses that feed as a source, filters out all of the posts that do not relate to Apple, and then subscribe to the RSS feed of my pipe.  I can even rename the subscription &#8220;Digg/Technology&#8221; in Google Reader, hiding the fact that it&#8217;s even going through Yahoo Pipes.</p>
<p><b>Basic Example: Simple Filter</b></p>
<p>Let&#8217;s start with a simple filter.  I like to read <a href="http://www.screwattack.com">ScrewAttack.com</a>, so naturally I wanted to subscribe to their RSS feed.  But unfortunately for me, they post new videos every day and I&#8217;m only interested in some of them.  They have many categories of videos, but the only ones I really like are &#8220;Hard News,&#8221; &#8220;Jose&#8217;s Puntos,&#8221; and &#8220;Trailer Dump&#8221;.  In particular, I hate their &#8220;SideScrollers&#8221; feature because I don&#8217;t listen to podcasts.</p>
<p>So head on over to ScrewAttack and copy the RSS feed URL to your clipboard: <a href="http://screwattack.com/rss.xml">http://screwattack.com/rss.xml</a></p>
<p>Then go to Yahoo Pipes and create a new Pipe (you may need to make a Yahoo account).  Open the &#8220;Sources&#8221; menu on the left and drag the &#8220;Fetch Feed&#8221; element into your work area.  Paste the ScrewAttack RSS feed into the box.  You can now click on the titlebar of the source and see the output in the lower portion of the screen.</p>
<p>Now, open the Operators list and drag &#8220;Filter&#8221; into your work area.  Click on the circle at the bottom of the Fetch Feed box and drag the line to the circle on the top of the Filter box, connecting the two.</p>
<p>Change &#8220;Block&#8221; to &#8220;Permit&#8221; and change &#8220;all&#8221; to &#8220;any&#8221;.  Underneath &#8220;Rules&#8221; click the arrow next to the leftmost box and select &#8220;item.category.content&#8221;.  This makes the filter look at the item/category/content field of the RSS xml.  Leave the dropdown at &#8220;Contains&#8221; and type in &#8220;Hard News&#8221; into the box on the right.  Click &#8220;Refresh&#8221; in the output preview at the bottom and you&#8217;ll see that the recent Hard News posts (and only those) show up.</p>
<p>Now click the plus icon next to &#8220;Rules&#8221; to create another rule.  Select the same thing for the left drop down (for the category) but put &#8220;Trailers&#8221; in the right.  Do it again for &#8220;Jose&#8221;.  Click refresh again and you&#8217;ll see the interesting stuff on the site only.  You can obviously customize this however you wish if you care about different categories.  </p>
<p>Last, drag the circle at the bottom of the &#8220;Filter&#8221; box to the circle at the top of the &#8220;Output&#8221; box.  Your pipe is now done.  Click output and see a preview of what your pipe outputs.</p>
<p><img src="http://www.nomachetejuggling.com/files/picture-2.png" alt="" title="Screwattack Pipe" width="500" height="153" class="aligncenter size-full wp-image-317" /></p>
<p>Save your pipe in the upper right corner.  A flare will pop up at the top telling you it&#8217;s been saved.  Click &#8216;Run Pipe&#8217; and you will be brought to the Yahoo Pipes interface for a running pipe.  Click &#8220;Get an RSS&#8221; and you have your new RSS feed URL.  Feel free to change the name of your pipe if you wish at any time, the RSS feed URL never changes.</p>
<p>Please note that this RSS feed is PUBLIC (it has to be if you want to subscribe to it through something like Google Reader), but not LISTED.  If you publish your feed it will show up in the searchable feeds database on yahoo.  But don&#8217;t make pipes out of private data.</p>
<p>The later examples will be less more complex and less detailed.  Play around with Yahoo Pipes to see what you can do if you are not already familiar.</p>
<p><b>Reddit Filter: Only Talked-About Posts</b></p>
<p>One of the reasons I generally prefer <a href="http://www.reddit.com">Reddit</a> to <a href="http://www.digg.com">Digg</a> is that I find the conversation on Reddit to be a bit more intelligent.  The top comment is usually some snarky one liner, and the second comment is usually some joke or reference to a meme, but after that there&#8217;s usually some interesting conversation.</p>
<p>As a result, the way I&#8217;d like to limit my Reddit RSS feeds is by only selecting the the posts that reach a certain threshold of comments.  This number is different for the different subreddits I read (less popular subreddits need fewer comments to be considered talked-about than, say, the front page).</p>
<p>Let&#8217;s construct a filter for the <a href="http://www.reddit.com/r/programming/">programming subreddit</a> (or &#8220;proggit&#8221;) using the RSS feed <a href="http://www.reddit.com/r/programming/.rss">http://www.reddit.com/r/programming/.rss</a></p>
<p>If we create a feed source and look through the structure of the object that Pipes has to work with, we can see that in the &#8220;Description&#8221; element is a link to comments, and it contains the number of them.</p>
<p><img src="http://www.nomachetejuggling.com/files/picture-3.png" alt="" title="Proggit Source" width="329" height="136" class="aligncenter size-full wp-image-320" /></p>
<p>What we&#8217;re going to do is construct a regular expression that pulls that information out, and only permits posts with more than 20 comments.</p>
<p>Create a &#8220;Loop&#8221; element and connect the output of the feed to the input of the loop.  The loop allows you to perform an operation on every item in the feed and save the result to a new element in the feed (or overwrite an existing one).  This allows you to add information to the feed that it didn&#8217;t have, which you can then use in subsequent filters.</p>
<p>Drag the &#8220;String Regex&#8221; element into the inside of the loop and tell it to replace the regex <code>.*?(\d*) comments?.*</code> with <code>$1</em></code>.  Since the number of comments is the capturing group, it is essentially just extracting the number of comments.  Tell the loop to assign the the result to &#8220;item.comments&#8221;.</p>
<p>Now your feed has a &#8220;comments&#8221; element that contains the number of comments on the post.  Pipe the output of the loop to a new &#8220;Filter&#8221; element and tell it to permit only items that have item.comments greater than 20.  Connect that to your output and voila, you&#8217;ve got a version of the programming reddit RSS feed that only shows the items with more than 20 comments.</p>
<p><img src="http://www.nomachetejuggling.com/files/picture-5.png" alt="" title="Programming Reddit Filter" width="500" height="240" class="aligncenter size-full wp-image-322" /></p>
<p>If a post that was filtered out because it had, say, 5 comments, were to become more popular and get 21 comments, it would start showing up in the feed (and therefore in your reader).</p>
<p>You can make this pipe even more useful by introducing User Inputs.  User inputs let you send parameters to the feed, which can then be used by the pipe.  For our case, it would be handy to provide the url of the subreddit as a parameter, as well as the number of comments for the inclusion threshold.</p>
<p>Drag a new user input URL element into the work area.  Give it the name &#8220;redditurl&#8221; and the prompt &#8220;URL to Reddit RSS Feed&#8221;.  Paste the programming reddit RSS feed into the &#8220;debug&#8221; field.  This allows you to test out that your feed is still working correctly, but when you re-use the pipe it won&#8217;t use the value in the field.  Pipe the output of that input into the small box to the right of the field in the &#8220;Fetch Feed&#8221; box.  Your pipe should still be working as normal if you check the output, but if you paste a different reddit rss feed URL into the debug box and click refresh, you&#8217;ll have a new set of filtered data.</p>
<p>If you run the pipe, you&#8217;ll now see that you are prompted to input the feed URL before you can run the pipe.  If you paste the feed in here and run the pipe, you can grab the RSS feed for just that subreddit.  If you paste a different RSS feed URL into the box, you will get the filtered feed for a different reddit.</p>
<p>You can do the same thing with a &#8220;number input&#8221; to control the comment count threshold.  You could also use the &#8220;Sort&#8221; operator to sort by the number of comments, moving the more popular items to the top.</p>
<p><img src="http://www.nomachetejuggling.com/files/picture-7.png" alt="" title="Reddit Advanced" width="500" height="373" class="aligncenter size-full wp-image-328" /></p>
<p>If you don&#8217;t want to bother going through all this work, you can feel free to simply use my published version of this pipe <a href="http://pipes.yahoo.com/rodhilton/redditfilter">here</a>.</p>
<p><b>Digg Filter</b></p>
<p>Very much like Reddit, Digg is a link aggregation site that allows users to vote links up or down.  However, for me, the Digg comments aren&#8217;t as valuable as Reddit comments, so I&#8217;m more interested in links based on the number of Diggs they receive, rather than the number of comments they have.</p>
<p>Handily, the Digg RSS feeds actually include the number of Diggs that items have received in the XML, so we can key off that to build a new pipe.  The element can be found at <code>item.digg:diggCount</code>, so all you need is a filter that permits entries with a high enough diggCount.  In the example below, I&#8217;ve also included a sorting mechanism.</p>
<p><img src="http://www.nomachetejuggling.com/files/picture-8.png" alt="" title="Digg Filter" width="500" height="314" class="aligncenter size-full wp-image-329" /></p>
<p>As with the Reddit filter, you may feel free to just use the pipe that I&#8217;ve published <a href="http://pipes.yahoo.com/rodhilton/diggfilter">here</a>.</p>
<p><b>DZone Filters</b></p>
<p>DZone is like Reddit and Digg, but geared specifically toward software developers.  Just like Reddit and Digg, you can key off of certain elements in the RSS feed XML to determine how popular an item is and filter accordingly.</p>
<p>DZone is slightly more complicated, however, because there are actually two different kinds of sites on DZone.  First, there are different Zone&#8217;s, such as <a href="http://agile.dzone.com/">Agile Zone</a>, where you can key off the number of times a post has been read. Then there are the links collections, such as <a href="http://www.dzone.com/links/tag/agile.html">Agile Links</a> which is more like Digg/Reddit and you can key off the number of votes.</p>
<p>The first type is relatively simple, so I won&#8217;t even cover it (it works just like the Digg filter, but keying off the number of reads embedded in the feed).  You can use mine <a href="http://pipes.yahoo.com/rodhilton/dzonefilter ">here</a>.</p>
<p>The Links feeds are more interesting.  Even though the site displays the &#8220;net vote&#8221;, the XML only contains the number of up votes and the number of down votes.  That means you need to do the subtraction in your pipe to get the actual net vote count.</p>
<p>We&#8217;re going to do the subtraction in a loop and assign the results to a new element, then filter by that.</p>
<p><img src="http://www.nomachetejuggling.com/files/picture-9.png" alt="" title="DZone Links" width="500" height="381" class="aligncenter size-full wp-image-331" /></p>
<p>As usual, you can just use mine <a href=" http://pipes.yahoo.com/rodhilton/dzonelinksfilter">here</a> if you wish.</p>
<p><b>Conclusion</b></p>
<p>Digg, Reddit, DZone, and feeds in which I only care about a subset of the entries make up a major chunk of my RSS subscriptions.  Replacing those subscriptions with hand-tuned versions of feeds coming out of these pipes allowed me do a great deal toward managing the firehose.</p>
<p>Yahoo Pipes can do a lot more than I&#8217;ve covered in this post, and I encourage you to experiment with it.  If you make a particularly interesting (and generic, reusable) pipe, feel free to post about it here in the comments.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nomachetejuggling.com/2009/03/27/managing-the-firehose/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Book Review: The Political Brain</title>
		<link>http://www.nomachetejuggling.com/2009/03/11/book-review-the-political-brain/</link>
		<comments>http://www.nomachetejuggling.com/2009/03/11/book-review-the-political-brain/#comments</comments>
		<pubDate>Wed, 11 Mar 2009 20:47:38 +0000</pubDate>
		<dc:creator>Rod</dc:creator>
		
		<category><![CDATA[Life]]></category>

		<category><![CDATA[book]]></category>

		<category><![CDATA[politics]]></category>

		<category><![CDATA[psychology]]></category>

		<category><![CDATA[review]]></category>

		<category><![CDATA[Science]]></category>

		<guid isPermaLink="false">http://www.nomachetejuggling.com/?p=293</guid>
		<description><![CDATA[(Crossposted from Goodreads)
Drew Westen&#8217;s book, &#8220;The Political Brain,&#8221; is illuminating and engaging. The author is an expert in the human mind, and has devoted his book to relating his understanding of the brain to the world of politics.
Westen talks about what people really look at when they evaluate politicians and candidates. He backs up his [...]]]></description>
			<content:encoded><![CDATA[<p>(Crossposted from <a href="http://www.goodreads.com/review/show/45340971">Goodreads</a>)</p>
<div id="attachment_302" class="wp-caption alignright" style="width: 118px"><a href="http://www.amazon.com/gp/product/1586485733?ie=UTF8&#038;tag=theediroo-20&#038;linkCode=as2&#038;camp=1789&#038;creative=390957&#038;creativeASIN=1586485733"><img src="http://www.nomachetejuggling.com/files/41rmaqdvl_sl160_.jpg" alt="The Political Brain" title="The Poltiical Brain" width="108" height="160" class="size-full wp-image-302" /></a><p class="wp-caption-text">The Political Brain</p></div>
<p>Drew Westen&#8217;s book, &#8220;The Political Brain,&#8221; is illuminating and engaging. The author is an expert in the human mind, and has devoted his book to relating his understanding of the brain to the world of politics.</p>
<p>Westen talks about what people really look at when they evaluate politicians and candidates. He backs up his assertions with many studies and experiments, clearly laying out exactly how the human mind works when it attempts to &#8220;decide&#8221; who to vote for.</p>
<p>I learned a great amount about the human mind reading the book. When I look back and evaluate campaigns or candidates, I can now see exactly where they went wrong (or right) and what they could have done differently. I understand how my fellow voters think, and I&#8217;ve even gained a great deal of insight into how I think (though I didn&#8217;t realize it).</p>
<p><span id="more-293"></span></p>
<p>Unfortunately, Westen&#8217;s book is really two books. The first book is a rational, scientific analysis of the brain, a breakdown of various campaigns in America throughout history, and a discussion of what candidates need to do in order to effectively communicate their personalities and politics to the voting populace.</p>
<p>The second book is a biased diatribe against Republicans and an overly emotional plea with democrats to follow Drew&#8217;s advice.</p>
<p>The first of these two books is phenomenal: scientific, accurate, and rational. The second of these two books is garbage: emotional, biased, and relentlessly irritating. To make matters worse, these two books are overlayed on top of each other inside of &#8220;The Political Brain,&#8221; the content of the book suddenly switching between these two sub-books at random in a jarring, frustrating way.</p>
<p>It&#8217;s a shame to see a scientific man fall victim to his own emotions and biases. I&#8217;m not saying Westen&#8217;s personal political views are WRONG, but I am saying they have absolutely no place in a book that really ought to be scientific and fair-minded.</p>
<p>The plus side is that the switches from scientific book to political rant are so extremely obvious and transparent that you never have to worry about internalizing as scientific fact something that is really political opinion. The facts are backed up by studies, and the opinions backed up by emotional pleas. While jarring, the differences are so stark that it makes it somewhat easy to read the political nonsense with one skeptical eyebrow raised and simultaneously read the scientific information with an open, spongelike mind ready to absorb new information.</p>
<p>Like I said, the factual portion of the book is absolutely riveting - well worth a read for anyone interested in politics, cognitive science, or psychology. The opinion portion of the book is frustrating and tiresome, and the reader is forced to wade through it to get to the good stuff.</p>
<p>I wish I could say this is simply a matter of me having different political opinions than Westen, but the fact is that I agree with most of his opinions. I agree with many of his characterizations of the modern day Republican and Democratic parties, and I believe in a lot of the same values he espouses in the book. But the fact remains, even as I read opinions I agreed with I found it obnoxious I was reading opinions at all, embedded in an otherwise factual and intelligent book.</p>
<p>I recommend the book, but I also feel compelled to warn anyone reading it, particularly people of political persuasions that differ from Westen&#8217;s, they are going to have a tough time getting through many parts of the book without hurling it across the room. Keep at it, it&#8217;s worth it.</p>
<p>Rating: 3/5.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nomachetejuggling.com/2009/03/11/book-review-the-political-brain/feed/</wfw:commentRss>
		</item>
		<item>
		<title>I Love Pair-Programming</title>
		<link>http://www.nomachetejuggling.com/2009/02/21/i-love-pair-programming/</link>
		<comments>http://www.nomachetejuggling.com/2009/02/21/i-love-pair-programming/#comments</comments>
		<pubDate>Sat, 21 Feb 2009 16:44:51 +0000</pubDate>
		<dc:creator>Rod</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<category><![CDATA[agile]]></category>

		<category><![CDATA[development]]></category>

		<category><![CDATA[pair-programming]]></category>

		<guid isPermaLink="false">http://www.nomachetejuggling.com/?p=270</guid>
		<description><![CDATA[In the comments for my review of &#8220;The Art of Agile Development&#8221; an old colleague asked me a few questions about Pair-Programming, one of the key tenets of XP (which the book advocates).  My response so was so long and detailed that I felt it deserved it&#8217;s own post.
My current job is the first [...]]]></description>
			<content:encoded><![CDATA[<p>In the comments for my <a href="http://www.nomachetejuggling.com/2009/02/19/book-review-the-art-of-agile-development/">review of &#8220;The Art of Agile Development&#8221;</a> an old colleague asked me a few questions about Pair-Programming, one of the key tenets of XP (which the book advocates).  My response so was so long and detailed that I felt it deserved it&#8217;s own post.</p>
<p>My current job is the first one where I&#8217;ve ever pair-programmed.  I actually recall interviewing for it, and I was asked if I had pair-programmed before.  I said sure, occasionally I would pull another developer over to my desk to help me and we&#8217;d sit together to figure it out.  This apparently was a decent enough answer to the question that I got the job, but now that I&#8217;ve been pair-programming nearly full-time for five months, I&#8217;ve determined that what I was doing before was definitely not real pair-programming.</p>
<p>When I first heard I&#8217;d be pairing at the new job, I was a bit apprehensive and skeptical.  Do I really have to sit next to some fat developer all day, 40 hours a week?  When am I going to check my RSS feeds?  What if the other developer is gassy or hasn&#8217;t showered?  How am I going to listen to my totally awesome Death Metal if I can&#8217;t wear headphones?  Will the other developer be constantly judging and correcting my code?  <strong>Will pairing prevent me from hitting &#8220;the zone&#8221; where I&#8217;m just belting code out so fast that my fingers can&#8217;t keep up with my brain?</strong></p>
<p>Over the last five months, I&#8217;ve found answers to all of these questions: &#8220;no,&#8221; &#8220;often,&#8221; &#8220;that&#8217;s rough,&#8221; &#8220;easily,&#8221; &#8220;sort of,&#8221; and <strong>&#8220;YES, but that&#8217;s a good thing.&#8221;</strong></p>
<p><span id="more-270"></span></p>
<p><strong>The Mechanics Of Pairing</strong></p>
<p>The way pair programming works in practice is quite a bit different than I imagined it.  I envisioned a day where I couldn&#8217;t escape the company of some other developer, constantly having eyes looking over my shoulder.  I&#8217;m not a terribly social person, so the idea of interacting with a single human being all day was not my idea of a good time.</p>
<p>In reality, you don&#8217;t sit down at a desk with another person and work all day with them.  <strong>You pair up for tasks. </strong></p>
<p>So, once all of the stories for the iteration have had concrete tasks assigned to them, people pair up to do them. So a dev and I might pick a specific task and work on it together. Two other devs pick another task. My pairing partner and I sit at a big 30 inch monitor and work on the task (just that task) together. Generally when you pair one person is the “driver” and one is the “navigator” so one person is implementing code and the other is thinking of design implications, refactoring opportunities, or the “next step” for the task. If you get stuck or pause or just want to switch, you pass the keyboard to the other person and switch roles.</p>
<p>When doing Test-Driven Development, one of the things we do is called “ping-pong pairing”. So the other developer will write a test, then make it compile but fail. Then he passes the keyboard to me. I implement the feature just enough to make the test pass, then I write another failing test and pass it back.</p>
<p>When the task is done and code is checked in, the pair breaks up. Generally tasks only have 2 hour estimates (sometimes less) so you’re only pairing for the two hours. Then you pair up with someone else to work on another task. If a task is taking longer than expected, or the pair “goes dark” (meaning they aren’t talking) then you shuffle the pairings.</p>
<p>Between these tasks, you might go have lunch, or take a break from coding to watch a video on youtube at your desk, or check your RSS reader for a few minutes, or go take a walk, or go downstairs and play some ping pong or foosball. <strong>We take breaks often because getting away from the code for a few minutes helps keep a fresh perspective when you come back to the task.</strong> Physical activities like walking or playing ping pong help with blood circulation, which helps your brain.</p>
<p>It’s also nice to have an odd number of developers, which we do. This way, one person is working without pairing. Usually this person will work on a defect instead of a story, or they’ll work on a story where everyone understands what needs to be done for that part of the code. If you don’t feel like pairing or you need a break, you volunteer to be the odd man out for a task.  When I first started pairing, I frequently volunteered to be the odd man out and work alone.  Today, having been pairing for a few months, generally I try my hardest to avoid being the odd man out.</p>
<p><strong>In an 8 hour day, I’m probably pairing somewhere between 4 and 6 hours noncontiguously.</strong> It’s important to have a good setup for it - big monitors, comfortable chairs, no corner desks (so that the devs can be side by side at the flat desk with the monitor between them).</p>
<p><strong>Effectiveness</strong></p>
<p><strong>I see pairing work so well every day that I consider my career prior to my current job to have consisted mostly of wasting time.</strong> When I think back to all the code I’ve written for a job, I’m annoyed at how much less efficient I was then since I wasn’t pairing, and how much better my code and my products would have been if I had paired on them full time.</p>
<p>When you have a second person working with you, you find that you try harder to code well. <strong>You’re far, far less likely to be willing to apply duct tape to a problem</strong>, because someone else is working with you and he or she is more likely to object to the duct tape. If two people approve a hack and implement it, it’s almost certainly because it’s the right approach given the time constraints. If one person sitting alone decides to pursue a hack, it’s more likely to be a situation where there is a better approach.</p>
<p>Two people attacking a design problem together is easier than one person doing it. Your partner will think of things you don’t, and vice versa. In a non-pairing environment, you can always call someone to a whiteboard to help you work through a design issue, but <strong>when you do that you’re only calling for help when you know you need it. The times when you need help and don’t know it go unaddressed - and yet despite the fact that you need help, I guarantee that you’re coding SOMETHING and checking it in.</strong> It’s almost certain to be shitty code. The amount of time you spend trying to figure out “what’s going on here” or “why isn’t this working the way I expect” is severely reduced. I’m talking hours of debugging that literally turn into <em>seconds</em>.</p>
<p>Pairing also helps a great deal with collective code ownership. I don’t feel like there are any realms of the code that “belong” to any team member. You don’t have a situation where one person is the “expert” on a part of the codebase, since that person worked with someone else when they wrote it, and everyone likely shuffled around while it was developed. EVERYONE has seen that part of the codebase before, which means EVERYONE feels comfortable refactoring or extending it. This enables the team to perform improvements to any part of the code whenever they are working, which leads to technical debt being paid off very quickly. I often find myself shocked at how good the quality of the code is that we write and that we’ve written before. The product is ENORMOUS in code size, easily the biggest I’ve ever worked on, but there are very few areas of code that I would consider bad at all, and all of those are the earliest parts of the code that were written (and were written without pairing or TDD).</p>
<p>Pairing fosters a collective unity that I haven’t seen anywhere else. There are obviously issues and challenges, and there’s no denying that you’re producing fewer lines of code per day since only half your team is coding at any one point. I don’t consider that a bad thing, though (if you have two solutions that equally solve a problem, the solution with fewer lines of code is the superior one) because the QUALITY of the code that IS produced is so, so, so much higher.</p>
<p><strong>Challenges</strong></p>
<p>There are definitely some challenges to pairing.  Pairing at a corner desk absolutely does not work at all.  The developers need to be side by side, the same distance from the monitor (which needs to be large).  All instances in my career that I thought were &#8220;pair-programming&#8221; were not, because we were at corner desks.  The person further away was, as a result, not as actively involved in the code (moving chairs is harder than moving a keyboard over a few inches).  <strong>This isn&#8217;t pairing, it&#8217;s programming with someone watching over your shoulder.</strong>  It feels like you&#8217;re being watched, not like you&#8217;re working with a peer.  It sucks.  I&#8217;m so glad that this is NOT what real Pair Programming turned out to be.</p>
<p>We have a team area with individual desks surrounding the area, but with &#8220;pairing stations&#8221; in the middle of the room.  I find myself at my desk so infrequently (by choice) that my friends on IRC complain I never say anything on the channel.  A good pairing environment is crucial.</p>
<p>Hygiene can be a serious problem.  If one person smells, it&#8217;s rough to sit with them.  I find myself going back to my desk often and the code suffers for it.  If you&#8217;re pairing, take a shower, and hold your farts for your next bathroom trip.  Just do it, you filthy pig.</p>
<p>The biggest challenge for me personally was essentially mourning for the death of &#8220;Programmer Man&#8221;.  <strong>Programmer Man is how I think of myself when I&#8217;ve got my headphones in, speed metal blaring in my ears, and I&#8217;m coding like a motherfucker.</strong>  My fingers can&#8217;t keep up with my brain.  I&#8217;m In <em>The Zone</em>.  For most of my career, this image is what I&#8217;ve considered to be the zenith.  When I come home and was in Programmer Man Mode most of the day, I feel like I&#8217;ve had a good day.</p>
<p><strong>Pair Programming undeniably killed Programmer Man.</strong>  This was a tough adjustment, since I&#8217;ve considered that mode to be my favorite for so long.  I now see, however, that <strong>Programmer Man was, without me knowing it, Technical Debt Man.</strong></p>
<p>When you&#8217;re coding like a motherfucker, you&#8217;re often writing bad code.  You&#8217;re more likely to be outputting hundred-line methods.  You&#8217;re sometimes willing to skip writing tests (tests slow down Programmer Man).  You&#8217;re not pausing as much to think about design implications or ways that the code could be refactored.  You may not have time to fix the code you&#8217;re working WITH; Programmer Man is too busy working on his own code to give a crap about some other guy&#8217;s code.  Programmer Man&#8217;s code is almost certain to be more brittle and more poorly designed than if someone were sitting with him, making him slow down and THINK more often.  Programmer Man&#8217;s code may not have been BAD, but it was generally worse than if he had a partner.</p>
<p><strong>Programmer Man was too busy coding to do as much serious thinking, and the quality of the code suffered for it</strong>.  And in the situations where you can be headphones-on, heads-down but still write tests and think about design, modularity, and quality, it&#8217;s almost certain that two heads would have been better than one. <strong>If you&#8217;re coding at a reasonable pace, pair programming will not slow you down.  Conversely, if you code so quickly that pair programming slows you down a lot, you were making mistakes before.</strong> You need pairing more than anyone.</p>
<p><strong>Programmer Man is dead, but I don&#8217;t miss him.</strong>  Not anymore.  My standards for what is &#8220;good code&#8221; have greatly increased and quite frankly I&#8217;m not sure ANY of Programmer Man&#8217;s code ever met that standard.  Today, nearly all of my code does, and I have pairing to thank for it.</p>
<p>And the headphones situation is easy to solve as well - at work we pick a musical theme at the start of the day, then use <a href="http://www.pandora.com">Pandora</a> to provide music consistent with that theme all day.  I get my &#8220;Killswitch Engage&#8221; theme and my &#8220;Slayer&#8221; theme days because I graciously put up with another developer&#8217;s &#8220;Angels and Airwaves&#8221; theme and &#8220;The Cranberries&#8221; theme.</p>
<p><strong>Final Thoughts</strong></p>
<p>When I leave my job (which I don’t see happening any time soon) if the next company doesn’t do pair programming, it’s going to be a tough adjustment to me. It would be like walking into a new company and finding out that nobody uses version control - everyone just copies their changes to a shared directory at the end of the day.  Sure you get the job done, but god damn you’re being inefficient about it. When people hiss at pairing because they can’t listen to headphones or don’t want to sit next to a fat guy, it sounds to my ears EXACTLY like someone complaining about SVN being too complicated.</p>
<p>I&#8217;m not going to advocate pairing, because anyone who reads this post and says &#8220;hey, maybe we&#8217;ll give it a shot&#8221; and then forces their team to do it will find that it doesn&#8217;t work.  For pairing to work, everyone has to WANT to pair.  That means they all at least need to be curious enough about it to give it a genuine shot - attempting pairing with the attitude of illustrating it doesn&#8217;t work will certainly show that it doesn&#8217;t work.  <strong>If you&#8217;re holding onto Programmer Man, you&#8217;re doomed.</strong></p>
<p>But if you&#8217;re willing to give it a genuine effort, push through the challenges and difficulties, read a book or two about how to pair, or maybe even hire a mentor to come to your company and help you pair for a few weeks, I think you&#8217;ll be pleasantly surprised by how effective it is.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nomachetejuggling.com/2009/02/21/i-love-pair-programming/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Book Review: The Art of Agile Development</title>
		<link>http://www.nomachetejuggling.com/2009/02/19/book-review-the-art-of-agile-development/</link>
		<comments>http://www.nomachetejuggling.com/2009/02/19/book-review-the-art-of-agile-development/#comments</comments>
		<pubDate>Fri, 20 Feb 2009 02:51:55 +0000</pubDate>
		<dc:creator>Rod</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<category><![CDATA[agile]]></category>

		<category><![CDATA[book]]></category>

		<category><![CDATA[development]]></category>

		<category><![CDATA[review]]></category>

		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://www.nomachetejuggling.com/?p=263</guid>
		<description><![CDATA[(Crossposted from Goodreads)
&#8220;The Art of Agile Development&#8221; by James Shore and Shane Warden is a book that is primarily focused on explaining Agile to people who want to adopt Agile software development practices for their team.  The bulk of book is divided into sections based on a categorization on agile practices.  There is [...]]]></description>
			<content:encoded><![CDATA[<p>(Crossposted from <a href="http://www.goodreads.com/review/show/35398205.">Goodreads</a>)</p>
<p>&#8220;<a href="http://www.amazon.com/Art-Agile-Development-James-Shore/dp/0596527675/">The Art of Agile Development</a>&#8221; by James Shore and Shane Warden is a book that is primarily focused on explaining Agile to people who want to adopt Agile software development practices for their team.  The bulk of book is divided into sections based on a categorization on agile practices.  There is a chapter on practices that help with thinking, one for collaborating, one for releasing, one for planning, and one for developing.  In each of these chapters, there are sections devoted to a specific practice, such as &#8220;pair programming&#8221;.  The sections describe how to do the specific practice, what benefits it offers, what challenges you might face when adopting the practice, and so on.  Usually it also has some frequently asked questions about the practice (with answers, of course) and some suggestions for alternatives if you have a reason to not adopt the practice.</p>
<p>First and foremost, I need to mention my biggest criticism of the book.  It has one of the most misleading titles I have ever seen.  This is *NOT* a book on Agile.  It is a book on XP, one of a few different flavors of Agile.  The correct title for this book is &#8220;<strong>The Art of Agile Development using XP</strong>.&#8221;  This is worth mentioning for a few reasons.  First of all, XP&#8217;s practices are pretty hardcore.  XP&#8217;s engineering practices are all extremely useful, but most of the time when a company or team resists Agile, it&#8217;s because they are resisting a typically XP practice, such as Test-Driven Development or Pair Programming.  Personally, I&#8217;m a big fan of XP&#8217;s practices, but the fact of the matter is that any team that wishes to become Agile will likely find the most resistance if they try to adopt XP, so it seems misleading to sell the book as an introduction to Agile when it is, in fact, an introduction to XP.</p>
<p><span id="more-263"></span></p>
<p>That said, this is an excellent book on XP.  All of XP&#8217;s practices are covered in just the right amount of detail - giving you enough information that you can adopt the practice, but requiring that you do additional research about the ones that interest or challenge you the most.  This allows the book to be a pretty quick read in general, which is beneficial for a team wishing to adopt XP practices soon.  This level of detail does have one disadvantage, though: by staying largely in the realm of hypotheticals and ideals, I often found myself thinking that the authors were being naive and idealistic about how easy some practices were to adopt.  This made me somewhat more skeptical of the book than I would have been if more detail had been offered, but ultimately I felt the level of detail was right; I did my own research online about some of the things that challenged me.</p>
<p>One of the most annoying aspects of the book are the &#8220;examples&#8221; that are sometimes provided.  Usually these examples provide a sample conversation between stakeholders as they illustrate the effectiveness of an XP practice.  These little micro-plays are so exaggerated that it often felt like reading the script to a bad company training video.  After a few, I found myself skipping them.</p>
<p>I learned an awful lot about XP practices, particularly Pair Programming, estimation techniques, and incremental design.  I felt that a number of these topics were better covered in other books, but &#8220;The Art of Agile Development&#8221; seems like it is meant to be an introduction to XP.  In fact, every section generally provided a list of books that covered the section topic in more detail, so I think the book is meant to tease you by design.</p>
<p>I recommend this book for a team that wishes to adopt XP as quickly as possible, but I cannot reiterate enough that this should be the first, not the last, XP book you buy if you wish to become an effective XP team.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nomachetejuggling.com/2009/02/19/book-review-the-art-of-agile-development/feed/</wfw:commentRss>
		</item>
		<item>
		<title>How To Make Your T-Mobile G1 (Android) Check For Updates</title>
		<link>http://www.nomachetejuggling.com/2009/02/10/how-to-make-your-t-mobile-g1-android-check-for-updates/</link>
		<comments>http://www.nomachetejuggling.com/2009/02/10/how-to-make-your-t-mobile-g1-android-check-for-updates/#comments</comments>
		<pubDate>Wed, 11 Feb 2009 01:27:32 +0000</pubDate>
		<dc:creator>Rod</dc:creator>
		
		<category><![CDATA[Technology]]></category>

		<category><![CDATA[android]]></category>

		<category><![CDATA[google]]></category>

		<category><![CDATA[phone]]></category>

		<guid isPermaLink="false">http://www.nomachetejuggling.com/?p=259</guid>
		<description><![CDATA[I purchased the Android phone from Google not too long ago.  I plan on posting a detailed review of it someday soon, but I wanted to post this now in case anyone needed it.
Just recently Google started pushing new firmware to the phone with a bunch of new features.  My phone suddenly popped [...]]]></description>
			<content:encoded><![CDATA[<p>I purchased the Android phone from Google not too long ago.  I plan on posting a detailed review of it someday soon, but I wanted to post this now in case anyone needed it.</p>
<p>Just recently Google started pushing new firmware to the phone with a bunch of new features.  My phone suddenly popped up a screen asking if I wanted to install the update, but I was in the middle of something so I said &#8220;Update Later.&#8221;  The screen vanished, and when I finished what I was doing I was unable to find a way to make the phone check for updates and try again.</p>
<p>Here is how to do it if you do the same thing I did.</p>
<ol>
<li>First, have AnyCut installed if you don&#8217;t already</li>
<li>Next, Create a new shortcut on your phone&#8217;s desktop.  Select &#8220;AnyCut&#8221; and then select &#8220;Activity&#8221;</li>
<li>Select &#8220;Device Info&#8221; as your activity.  I can&#8217;t find any other way to get to this activity on the phone</li>
<li>Press the new shortcut icon you have created.</li>
<li>Scroll to the bottom and find the &#8220;Check for Updates&#8221; button.  Click it.  You may have to a few times for it to succeed.</li>
<li>Once the &#8220;checkin&#8221; has succeeded, exit back to your home screen and you will be prompted to install the update.</li>
</ol>
<p>That&#8217;s it!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nomachetejuggling.com/2009/02/10/how-to-make-your-t-mobile-g1-android-check-for-updates/feed/</wfw:commentRss>
		</item>
		<item>
		<title>What&#8217;s A Java Developer To Learn?</title>
		<link>http://www.nomachetejuggling.com/2008/12/22/whats-a-java-developer-to-learn/</link>
		<comments>http://www.nomachetejuggling.com/2008/12/22/whats-a-java-developer-to-learn/#comments</comments>
		<pubDate>Mon, 22 Dec 2008 18:06:45 +0000</pubDate>
		<dc:creator>Rod</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<category><![CDATA[career]]></category>

		<category><![CDATA[java]]></category>

		<category><![CDATA[skills]]></category>

		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.nomachetejuggling.com/?p=243</guid>
		<description><![CDATA[With the economy continuing on it&#8217;s tailspin, lots of developers are finding themselves out of work.  Those that are lucky to still have a job (like myself) live in fear that their company may downsize at any time and they&#8217;ll be looking for work.
This means that it&#8217;s more important than usual for a software [...]]]></description>
			<content:encoded><![CDATA[<p>With the economy continuing on it&#8217;s tailspin, lots of developers are finding themselves out of work.  Those that are lucky to still have a job (like myself) live in fear that their company may downsize at any time and they&#8217;ll be looking for work.</p>
<p>This means that it&#8217;s more important than usual for a software engineer to be &#8220;marketable&#8221;.  Engineers need to make sure they stay current on technologies that are widely used in their field.  This is a somewhat daunting task considering just how many technologies there are out there.  Luckily, there are resources to help narrow this down.</p>
<p>What follows is an investigation into what technologies/products/frameworks/languages/tools are showing up in job postings for Java developers using <a href="http://www.indeed.com">Indeed.com</a>.  This sort of thing can be very handy if you&#8217;re looking to improve your skillset and would like to focus on improvements that make you more likely to land a new job if you were to need to.</p>
<p><span id="more-243"></span></p>
<p>Obviously, one of the most prominent traits of good Software Engineers is a natural curiosity and motivation to learn.  Most engineers I know (including myself) have a list of technologies and tools they&#8217;d like to check out.  This article is merely meant to help engineers prioritize their list to whatever extent they are being motivated by career aspirations or security.  In other words, you may not see &#8220;Haskell&#8221; on this list, but that does not mean I am somehow arguing that Haskell isn&#8217;t worth learning.  I am merely saying, to whatever extent your career is a priority, perhaps a different tool or language may be more of a priority for you than Haskell.</p>
<p>I also want to reiterate that this analysis is for <b>Java Developers</b>.  Why Java?  Because the stress of this article is on career, not academia or intellectual pursuits, and Java and .NET are still the industry leaders.</p>
<p>So if you&#8217;re a Java developer, you want to learn something new, and you want to help protect your career from economic instability, take a look at each of the sections below and, if you aren&#8217;t familiar with either the &#8220;most popular&#8221; or &#8220;fastest growing&#8221; technologies, add them to your list.</p>
<p>And if you feel that I&#8217;ve missed an important technology, please leave a comment and I&#8217;ll update the post.</p>
<p><b>Persistence Frameworks</b></p>
<p>Most applications need to save data to a database.  Most large applications rely on frameworks to help with this process.  For this category, I&#8217;ve searched for toplink, hibernate, ibatis, jdo, spring dao, and &#8216;jdbc&#8217; itself.  </p>
<div class="wp-caption aligncenter" style="width: 550px"><img alt="Java Persistence Frameworks" src="http://www.indeed.com/trendgraph/jobgraph.png?q=java+toplink%2C+java+hibernate%2C+java+ibatis%2C+java+jdbc%2C+java+JDO%2C+java+spring+dao" title="Java Persistence Chart" width="540" height="300" /><p class="wp-caption-text">Java Persistence Frameworks</p></div>
<p>The big winner here is clearly <a href="http://www.hibernate.org/">Hibernate</a>.  There seems to be a still-present (and possibly rising) number of job posts that mention JDBC in the listing, but that may well be in conjuction with other technologies.</p>
<p><b>Databases</b></p>
<p>To see which database technology is the most popular for Java developers, I&#8217;ve searched for mysql, postgresql, sql server, oracle, sybase, and db2</p>
<div class="wp-caption aligncenter" style="width: 550px"><img alt="Databases" src="http://www.indeed.com/trendgraph/jobgraph.png?q=java+and+mysql%2C+java+and+postgresql%2C+java+and+sql+server%2C+java+and+oracle%2C+java+and+sybase%2C+java+and+db2" title="Databases" width="540" height="300" /><p class="wp-caption-text">Databases</p></div>
<p><a href="http://www.oracle.com/index.html">Oracle</a> returns the most hits here, though it&#8217;s difficult to know if that&#8217;s always the database platform in every case.  Microsoft&#8217;s <a href="http://www.microsoft.com/sqlserver/2008/en/us/default.aspx">SQL Server</a> is a big winner here as well.  As far as open source tools go, <a href="http://www.mysql.com/">MySQL</a> is where the jobs seem to be.</p>
<p><b>Web Frameworks</b></p>
<p>Writing web applications without a web framework is pretty grueling.  Most companies recognize this and use web frameworks to lessen the pain.  Here I&#8217;m looking at spring mvc, struts, javaserver faces, tapestry, wicket, and webwork.</p>
<div class="wp-caption aligncenter" style="width: 550px"><img alt="Java Web Frameworks" src="http://www.indeed.com/trendgraph/jobgraph.png?q=java+and+spring+mvc%2C+java+struts%2C+javaserver+faces+or+JSF%2C+java+tapestry%2C+java+wicket%2C+java+webwork" title="Web Frameworks" width="540" height="300" /><p class="wp-caption-text">Java Web Frameworks</p></div>
<p>The big winners here are <a href="http://struts.apache.org/">Struts</a> and, to a much lesser extent, <a href="http://www.springsource.org/">Spring MVC</a>.  Struts seems like something of an old standard, while SpringMVC is the up-and-coming technology.  </p>
<p><b>Web Technologies</b></p>
<p>For developing on the web, you&#8217;re going to want to be familiar with various technologies, even as a Java developer.  For this, I&#8217;ve searched for html, css, ajax, javascript, google web toolkit, flash, and flex.  Note that I&#8217;ve added &#8220;java&#8221; to each query to ensure that these skills are important for Java developers.</p>
<div class="wp-caption aligncenter" style="width: 550px"><img alt="Web Technologies" src="http://www.indeed.com/trendgraph/jobgraph.png?q=java+html%2C+java+css%2C+java+ajax%2C+java+and+javascript%2C+google+web+toolkit%2C+java+and+flash%2C+java+and+flex.+ " title="Web Technologies" width="540" height="300" /><p class="wp-caption-text">Web Technologies</p></div>
<p>HTML and Javascript are the big winners here, no surprises.  Ajax seems to have passed CSS as of 2007, which is interesting.  Flash and Flex seem to both be on a steady but slow rise.  </p>
<p><b>App Servers</b></p>
<p>In a perfect world, Java developers would never need to know anything about the server in which they are deploying an application since they&#8217;d all follow the same standards.  In reality, however, the popular application servers offer many different features and companies that don&#8217;t mind running the risk of vendor lock-in code their applications to those features.  As a result, knowing the ins and outs of application servers can be important.  </p>
<p>Here I&#8217;ve looked for websphere, jboss, apache geronimo, weblogic, tomcat, jetty, and glassfish.</p>
<div class="wp-caption aligncenter" style="width: 550px"><img alt="Application Servers" src="http://www.indeed.com/trendgraph/jobgraph.png?q=websphere%2C+jboss%2C+apache+geronimo%2C+weblogic%2C+tomcat%2C+jetty%2C+glassfish." title="Application Servers" width="540" height="300" /><p class="wp-caption-text">Application Servers</p></div>
<p>The big winners here are <a href="http://www-01.ibm.com/software/websphere/">WebSphere</a> and <a href="http://www.oracle.com/appserver/index.html">WebLogic</a>.  <a href="http://tomcat.apache.org/">Tomcat</a> and <a href="http://www.jboss.org/">JBoss</a>, however, seem to be on a clear slow growth.</p>
<p><b>Environment Tools</b></p>
<p>Many companies believe that hiring a developer who is already familiar with the development environment they use will allow their new hire to hit the ground running.  This means that sometimes job posts will mention IDEs, version control systems, and build tools.  </p>
<p>For this comparison, I&#8217;ve searched for ant, maven, git, subversion, cvs, eclipse, netbeans, and intelliJ.</p>
<div class="wp-caption aligncenter" style="width: 550px"><img alt="Environment Tools" src="http://www.indeed.com/trendgraph/jobgraph.png?q=java+and+ant%2C+java+and+maven%2C+java+and+git%2C+java+and+cvs%2C+java+and+subversion%2C+java+and+intellij%2C+java+and+eclipse%2C+java+and+netbeans" title="Environment Tools" width="540" height="300" /><p class="wp-caption-text">Environment Tools</p></div>
<p><a href="http://www.eclipse.org/">Eclipse</a> is a big winner here, as is <a href="http://ant.apache.org/">Ant</a>.  In the version control war, <a href="http://www.nongnu.org/cvs/">CVS</a> came out the winner, but the growth rate of <a href="http://subversion.tigris.org/">Subversion</a> seems to indicate it will eventually overtake CVS.  In a related observation: holy crap people still use CVS?</p>
<p><b>Other Languages</b></p>
<p>Good developers branch out of their comfort zone to pick the right tool for the job, and good companies know this.  So what should a Java developer know other than Java?</p>
<p>For this, I looked for ruby, python, scala, erlang, c, c++, php, groovy, and perl.</p>
<div class="wp-caption aligncenter" style="width: 550px"><img alt="Other Languages" src="http://www.indeed.com/trendgraph/jobgraph.png?q=java+and+ruby%2C+java+and+python%2C+java+and+scala%2C+java+and+c%2C+java+and+c%2B%2B%2C+java+and+c%23%2C+java+and+php%2C+java+and+groovy%2C+java+and+perl" title="Other Languages" width="540" height="300" /><p class="wp-caption-text">Other Languages</p></div>
<p>There&#8217;s no way around it, the best way to bolster your Java career is by expanding into C/C++/C#, though it&#8217;s possible these numbers may be partially attributed to job posts that look for candidates familiar with EITHER Java or C++.  </p>
<p>Additionally, I was surprised to see Perl so high on the list.  PHP, Python, and Ruby all seem to be on the rise as well, so learning those may put you ahead of the curve.</p>
<p><b>Overall</b></p>
<p>So far, we&#8217;ve seen a large number of technologies that are worth learning if you want to strengthen your career as a Java developer.  Unfortunately, our time is limited and our wallet finite, so it may be handy to see which of the above popular choices are more popular than the others.</p>
<p>I&#8217;ve taken the top couple of search terms from all of the charts above and combined them into a single search to get a handle on relative importance.  I&#8217;ve also added spring, ejb, and junit to the list.  Why?  Because, had I created a category for each of them they would have completely dwarfed the rest of the items in the category anyway.</p>
<p>The search terms are ejb, junit, spring, perl, eclipse, ant, websphere, javascript, ajax, struts, springmvc, and hibernate.  I&#8217;ve removed C/C++/C# from the comparison because it dwarfs everything else.</p>
<div class="wp-caption aligncenter" style="width: 550px"><img alt="Overall Comparison" src="http://www.indeed.com/trendgraph/jobgraph.png?q=java+ejb%2C+java+junit%2C+java+spring%2C+java+perl%2C+java+eclipse%2C+java+ant%2C+java+websphere%2C+java+javascript%2C+java+ajax%2C+java+struts%2C+java+spring+mvc%2C+java+hibernate" title="Overall Comparison" width="540" height="300" /><p class="wp-caption-text">Overall Comparison</p></div>
<p>Javascript and Perl (I&#8217;m still surprised by this) are the big winners overall.  This indicates that the two strongest skills for a Java developer to have are, somewhat ironically, to know how to program in something other than Java.</p>
<p>Let&#8217;s remove everything that isn&#8217;t Java-specific from the chart, searching only for ejb, junit, spring, eclipse, ant, struts, springmvc, and hibernate.</p>
<div class="wp-caption aligncenter" style="width: 550px"><img alt="Java Specific Overall" src="http://www.indeed.com/trendgraph/jobgraph.png?q=java+ejb%2C+java+junit%2C+java+spring%2C+java+eclipse%2C+java+ant%2C+java+struts%2C+java+spring+mvc%2C+java+hibernate" title="Java-Specific Overall" width="540" height="300" /><p class="wp-caption-text">Java Specific Overall</p></div>
<p>So the best Java technologies for Java developers to know are Hibernate, Spring, and Struts.  Following that, companies seem to value skills with EJBs, Eclipse, Ant, and JUnit, with SpringMVC gaining popularity.</p>
<p>I suppose that all of this data means the &#8216;quintessential&#8217; industry application is a Struts-based web application built using Spring, Hibernate, and EJB technology with an Oracle (MySQL if using an open source stack) database, written using Eclipse, built using Ant, tested with JUnit, and deployed in WebSphere (JBoss if using an open source stack).</p>
<p>Designing and implementing a web application using Struts, Spring, Hibernate, EJBs, MySQL, Eclipse, Ant, JUnit, and JBoss seems like a pretty solid way for a Java developer to make sure he or she has the skills that are in highest demand, and doing so would cost no money whatsoever.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nomachetejuggling.com/2008/12/22/whats-a-java-developer-to-learn/feed/</wfw:commentRss>
		</item>
		<item>
		<title>My Least Favorite Interview Question</title>
		<link>http://www.nomachetejuggling.com/2008/12/11/my-least-favorite-interview-question/</link>
		<comments>http://www.nomachetejuggling.com/2008/12/11/my-least-favorite-interview-question/#comments</comments>
		<pubDate>Fri, 12 Dec 2008 02:21:23 +0000</pubDate>
		<dc:creator>Rod</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<category><![CDATA[career]]></category>

		<category><![CDATA[interview]]></category>

		<category><![CDATA[job]]></category>

		<guid isPermaLink="false">http://www.nomachetejuggling.com/?p=206</guid>
		<description><![CDATA[There is one type of interview question I see pretty frequently that drives me absolutely bonkers.  I&#8217;ve never actually been given this queston myself, but I&#8217;ve worked at a lot of companies that like to ask it (I&#8217;ve been lucky).  Just recently, a friend of mine who has been interviewing mentioned some of [...]]]></description>
			<content:encoded><![CDATA[<p>There is one type of interview question I see pretty frequently that drives me absolutely bonkers.  I&#8217;ve never actually been given this queston myself, but I&#8217;ve worked at a lot of companies that like to ask it (I&#8217;ve been lucky).  Just recently, a friend of mine who has been interviewing mentioned some of the questions he was given; one of them fit this description and all I could do was feel bad for the poor guy.  There&#8217;s no way he answered it correctly, despite being a very capable software engineer.</p>
<p>I refer to this question as the &#8220;Career In A Bottle Question&#8221;</p>
<p><b>The Career In A Bottle Question</b></p>
<p>Very often this question is actually given prior to an interview, as something you submit to a company after passing an initial phone screening but before they bring you in.  The question takes a form similar to the following:</p>
<blockquote><p>
Write a program that will <em>[anything]</em>.  Please write it as though it were going into production.
</p></blockquote>
<p>It&#8217;s the second sentence that does a candidate in.  Why?  <b>Because there is no right way to answer the question</b>. </p>
<p><span id="more-206"></span></p>
<p>More specifically, there is a right way to a single interviewer, but you have a 50/50 chance.</p>
<p>Allow me to elaborate by making this concrete.  Imagine the question is as follows:</p>
<blockquote><p>
Write a program that calculates what phase the moon is in for a given date (the input) as though your code were going to be used in production.
</p></blockquote>
<p>If I, as an interview candidate, were to see a question like this, my mind would go through the following thought process:</p>
<p><i>Well, that&#8217;s actually a really simple algorithm.  Read a date from commandline, do a little <a href="http://www.voidware.com/moon_phase.htm">calculation</a>, print out the phase.  But wait, they said they want it to be like production code.  So I should probably design it in a more object-oriented modular manner than just some procedural script.  And when I write production code, I unit test it, so I should write some unit tests.  And with all that code, I&#8217;m going to need a build file&#8230; Jesus, this seems like overkill for a 10 line script.</i></p>
<p>It&#8217;s the last sentence that destroys me, and many other capable programmers.  On the one hand, production code needs tests, it needs a build, it needs to be well designed, and it needs to work.  On the other hand, the problem I was given is a 10-liner, and it seems like overengineering to do anything more.</p>
<p>If I write the simple script version, will the interviewer think that I write one-off production code without tests?</p>
<p>If I write the full system, will the interviewer think that I overengineer everything I write and anyone who maintains my code will have to deal with an overly complex system?</p>
<p><i>I have no way to know.</i></p>
<p>I have no idea what the interviewer&#8217;s expectations are, so I have to guess.  I have, essentially, a 50/50 shot at guessing correctly.  To make matters worse, my answer will likely go through a number of different interviewers, and I have a 50/50 shot at having guessed correctly with each of them.  Assuming that a single &#8220;no&#8221; from one of the interviewers means I don&#8217;t get a job offer, having 2 interviewers gives me a 25% chance of success.  Three interviewers gives me a 12.5% chance.  A team of 6 or 7 interviewers (extremely common in up-and-coming companies) gives me virtually no chance at all.</p>
<p>Generally the conversation about the interviewee&#8217;s qualifications goes like this:</p>
<blockquote><p>
<strong>Interviewer 1:</strong> I really liked his answer to this question.  He has a good design, good unit test coverage, and a fast build.<br />
<strong>Interviewer 2:</strong> Yeah but he wrote this future-proof ten-class system for a simple math function.  Why did he write code for requirements he wasn&#8217;t given?  I don&#8217;t want to hire someone that&#8217;s going to spend 2 weeks writing something that should take a day.<br />
<strong>Interviewer 1:</strong> Yeah, I guess I can see that.  He did write an awful lot of code.<br />
<strong>Interviewer 2:</strong> Let&#8217;s keep looking.
</p></blockquote>
<p>You can&#8217;t possibly have written something to please both of these interviewers without hitting the magical, arbitrary middle-ground exactly between the two of them.  If there was a third interviewer, you&#8217;d have virtually no chance.</p>
<p><strong>What&#8217;s Going On Here?</strong></p>
<p>Fundamentally, the reason this question is bad is that there is a mismatch between two of the constraints.  On the one hand, the interviewer is told to code as though it were something he were assigned at work, but at the same time a programmer would never get such a simplistic task.</p>
<p>Interviews are tricky, because you can&#8217;t tell your candidate to reinvent your product for you in the interview.  Questions need to be simplified to make the interview process manageable, but once something becomes simplified it leaves the realm of something you&#8217;d actually have to write in production.  As a result, there is no way to word a question like this without making it conflict with itself.</p>
<p>Essentially, this question breaks down because it&#8217;s testing too many of the candidate&#8217;s skills simultaneously.  What the interviewer wants to know here is:</p>
<ol>
<li>How are the candidate&#8217;s algorithmic skills?</li>
<li>How are the candidate&#8217;s design skills?</li>
<li>How are the candidate&#8217;s testing skills?</li>
<li>How are the candidate&#8217;s Java/Ruby/C#/Whatever skills?</li>
</ol>
<p>Occasionally, these questions are worded in a way to also test a candidates familiarity with a framework as well, such as an additional constraint of &#8220;Use Spring&#8221; or something of that nature.</p>
<p>The problem is that you can&#8217;t get the answer to all of these questions while keeping the questions manageable in scope and size.  Good design skills mean a high degree of modularity and encapsulation, but testing modular code means writing more tests than is appropriate for an interview.  Good algorithm skills mean writing simple procedures that perform a task, but simple procedures do not lend themselves to the scope that give insight into a candidate&#8217;s design skills or language knowledge.</p>
<p><strong>How To Change The Question</strong></p>
<p>If you&#8217;re a company looking to hire, don&#8217;t ask the Career In A Bottle question or you&#8217;ll wind up passing on a number of highly qualified candidates.  The only people who will get in are the ones who just so happen to hit the magic compromise between the ideal responses of all of your team members.  It turns what should be a game of skill into a game of luck.</p>
<p>Instead, figure out what you&#8217;re trying to ascertain, and ask direct, focused questions centering around those topics.  </p>
<p>If you want to know a candidate&#8217;s <strong>algorithm skills</strong>, ask a question fitting this template: &#8220;Write a method that takes a [something] and determines [something else].  Use any language you wish.&#8221;  By saying that you only want a method, you are removing any concerns the candidate might have about your expectations regarding class design and testing.  By saying the candidate can pick any language, you are making sure they aren&#8217;t wasting mental power on remembering language specifics or APIs.  The answer you want from the candidate should be whiteboarded pseudocode, easy to read and functionally correct.  If you need to say something like &#8220;pretend that there&#8217;s no something-or-other method,&#8221; feel free.</p>
<p>If you want to know a candidate&#8217;s <strong>design skills</strong>, describe the requirements of a large-scale system and ask that they draw UML describing the classes in the system, how they interact, what extends what, what&#8217;s an interface, etc.  The question should sound similar to &#8220;Sketch the design a system that [something].&#8221;  By saying sketch, you&#8217;re making it clear that you don&#8217;t want any code.  You want method names, class names, and so forth.  The candidate should give you boxes, arrows, and method signatures on a whiteboard, though I wouldn&#8217;t be too strict about the adherence to the UML standard unless it&#8217;s important to your company.</p>
<p>If you want to know a candidate&#8217;s <strong>testing skills</strong>, then YOU should be the one drawing boxes and arrows on a whiteboard.  Sketch out a system with classes and methods and ask how the candidate would test your system.  Ask about how he or should would strive for complete test coverage on a unit test.  Ask about functional tests and integration tests that test multiple aspects of the design.  The candidate should answer this question with, in my opinion, words only.  Descriptions and methodologies, without writing anything down.</p>
<p>If you want to know a candidate&#8217;s <strong>language skills</strong>, then and only then should you give an assignment.  Pre-interview assignments aren&#8217;t good at determining anything other than a candidates ability to write code in a specific language and work with the API for that language.  Asking language and API questions during an in-person interview is pointless since it tests a skill that developers don&#8217;t need unless your company&#8217;s internet connection dies and all of your books catch fire suddenly.  The best way to give a programming assignment is for YOU to actually provide some code.  Provide an interface and a test or a program that uses an implementation of that interface.  Ask the candidate to provide the implementation.  This way, the candidate can actually compile and run the code to make sure it does what it should (an ability he or she would have in real life).  It also gives you control over what you want to make sure the candidate is familiar with.  If it&#8217;s important to you that the candidate be familiar with the java collections library, write an interface that passes various collections around.</p>
<p><strong>Weeding Out</strong></p>
<p>The biggest objection someone may have to my suggestions above is probably that the purpose of the assignment is to weed out candidates before everyone has to take time out of their day to interview someone in person.</p>
<p>I believe that you can actually convert the information you wish to gather from a programming assignment into information you can easily gather with a phone screening.  The algorithm question can simply have the complexity of the question decreased to a point where you could describe the algorithm with words alone, over the phone.  The same goes for the design and test questions - you can make the system under discussion less complex and the questions and answers can be transmitted through speech alone.  And you can still do language/API/framework familiarity testing by giving a programming assignment following the specifications described above.</p>
<p>In my experience, following these suggestions may make the interview process take slightly longer than you may like, but the end result is that you severely decrease the number of false negatives.  Those qualified candidates that you aren&#8217;t hiring because of bad questions are getting jobs elsewhere, and it may be your competition.  </p>
<p>Don&#8217;t throw good programmers away because you&#8217;re too impatient to ask narrowly-scoped questions.</p>
<p>Don&#8217;t ask the &#8220;Career In A Bottle&#8221; question.</p>
<p><strong>Update:</strong> Some people have pointed out that you can simply ask the interviewer what he or she is expecting from you.  While this is usually a decent workaround, I&#8217;ve often seen the attitude taken that figuring out what &#8220;production ready&#8221; means is part of the question.  One particular horror story I&#8217;m aware of from a friend has him asking the interviewer &#8216;Do you want me to include tests?&#8217; and having him respond &#8216;Do you not normally test your production code?&#8217;</p>
<p>If you were to insist on asking a question like this, adding additional information to the description such as &#8220;I&#8217;m expecting unit tests and a build file&#8221; makes it far more palatable.</p>
<p>I still feel that the question is fundamentally flawed because it attempts to ask too many questions simultaneously, and would be better split into a few more narrowly-focused questions.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nomachetejuggling.com/2008/12/11/my-least-favorite-interview-question/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
