<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2123627074120865266</id><updated>2011-07-28T19:23:43.104-07:00</updated><title type='text'>The Importance Of</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://scanningcrew.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2123627074120865266/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://scanningcrew.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Scanningcrew</name><uri>http://www.blogger.com/profile/01189333113641708597</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='14' height='32' src='http://1.bp.blogspot.com/_9Dlucn6QibU/Sk2dLmwfe7I/AAAAAAAAACY/1IpJE0YkQTI/S220/Photo+16.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>9</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2123627074120865266.post-3448910723507695355</id><published>2009-10-20T22:03:00.000-07:00</published><updated>2009-10-20T23:30:47.646-07:00</updated><title type='text'>When Bad is Good</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;If there is one thing I have learned from &lt;a href="http://www.amazon.com/Predictably-Irrational-Revised-Expanded-Decisions/dp/0061854549/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1256105478&amp;amp;sr=8-1"&gt;Predictably Irrational&lt;/a&gt;, &lt;a href="http://www.amazon.com/Traffic-Drive-What-Says-About/dp/0307277194/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1256105497&amp;amp;sr=1-1"&gt;Traffic&lt;/a&gt;, or your pick of any &lt;a href="http://www.amazon.com/Malcolm-Gladwell/e/B000APOE98/ref=ntt_athr_dp_pel_1"&gt;Gladwell book&lt;/a&gt; it is that the human thought processes is unbelievably complex. We are so wired to behave in certain ways that despite all logic and precognition we are destined to repeat the same mistakes, victims of our brain's own evolutionary biology. I will get back to this concept, but for the time being let me explain why this has anything to do with Apple and Google.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;At the recent San Francisco &lt;a href="http://stackoverflow.carsonified.com/"&gt;Stackoverflow DevDays&lt;/a&gt; I had the opportunity to sit through two presentations, each from the two of the biggest players in mobile OS platforms, Apple (iPhone), and Google (Android). I will start out with the highlights from the iPhone talk. Read the rules for developing on the iPhone and see if they sound friendly and inviting:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;You have to learn a 20+ year old programming language with a toolkit that is almost as old&lt;/li&gt;&lt;li&gt;You must follow all our programming and UI guidelines to the letter when developing your application. Oh, and we mean it!&lt;/li&gt;&lt;li&gt;You must give us 30% of the profit you make from selling your application&lt;/li&gt;&lt;li&gt;We can reject your application for any number of reasons you might not like&lt;/li&gt;&lt;li&gt;Your application will only run ever be able to run on one kind of phone. Adios portability!&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Where do I sign up? No seriously, where?! (BTW great talk &lt;a href="http://www.neopoleon.com/home/default.aspx"&gt;Rory Blyth&lt;/a&gt;) Believe it or not these rules are exactly why Apple's long term iPhone vision is paying off and Google's never will. This lock down policy is why the experience of using an iPhone is so consistent. Why the battery life seems to remain steady despite me adding 10 new apps. Why different gestures like sliding a panel, toggling a switch, and entering text is consistent in every application. Most importantly, why I have never seen the dialog box like this.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 401px; height: 726px;" src="http://gyazo.com/e22ba1591b1f57ff53e2c1491c8e6db7.png" border="0" alt="" /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I don't want see dialog boxes like that. Especially when my only option is "Force close". As oppose to what? There is only one choice!!! Just make it for me, hide the whole ordeal, and let me move on.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;During the Android talk the representative from Google referred to this as "The error dialog which G1 owners should all be familiar with now". A huge ugly dialog box. Shit happens, force close, but try again mate! He explained to the room that this wasn't Android's fault. It was due to Android application programmers who didn't understand threading. Threading of all things!  He remind us that the best thing about Android was their marketplace didn't have draconian rules and guidelines like those meanies over at Apple. Anyone can make an application for Android, and we all know when everyone gets to play, no one wins.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Which brings me back to my intro. You see, Apple understand the economics of the crazy way humans work. Programmers are going to write crappy code and programmers don't like big corporations telling them what they can and can't do. We know best! We must have error dialogs! How dare you not let me use Java, Ruby, or the language of the month to write my iPhone app! We must have our application work on all 39 different models because thats more sales! This should all be obvious!!! &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And yet it's all wrong. What we want is not always what is good for us.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In order to create a consistent phone experience, in order to have it work reliability (ok, forget AT&amp;amp;T for this argument I'm talking about Apple's role), in order for the battery to have a decent lifespan, in order to sell tons of applications in an unified consistent manor, they had to do the very things that should of turned developers away. And it worked. And now people are lining up to give Apple 30% of their profits, just to get in on the only mobile platform in town. &lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2123627074120865266-3448910723507695355?l=scanningcrew.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://scanningcrew.blogspot.com/feeds/3448910723507695355/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2123627074120865266&amp;postID=3448910723507695355' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2123627074120865266/posts/default/3448910723507695355'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2123627074120865266/posts/default/3448910723507695355'/><link rel='alternate' type='text/html' href='http://scanningcrew.blogspot.com/2009/10/when-bad-is-good.html' title='When Bad is Good'/><author><name>Scanningcrew</name><uri>http://www.blogger.com/profile/01189333113641708597</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='14' height='32' src='http://1.bp.blogspot.com/_9Dlucn6QibU/Sk2dLmwfe7I/AAAAAAAAACY/1IpJE0YkQTI/S220/Photo+16.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2123627074120865266.post-3207560485020146126</id><published>2009-07-02T22:10:00.000-07:00</published><updated>2009-07-02T22:51:21.442-07:00</updated><title type='text'>Real Incremental find</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_9Dlucn6QibU/Sk2T8Ho_aXI/AAAAAAAAACQ/ycS8J8kyj5o/s1600-h/Picture+4.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 190px; border-color: black;" src="http://3.bp.blogspot.com/_9Dlucn6QibU/Sk2T8Ho_aXI/AAAAAAAAACQ/ycS8J8kyj5o/s320/Picture+4.png" border="1" alt="" id="BLOGGER_PHOTO_ID_5354098193065798002" /&gt;&lt;/a&gt;How many times do you find yourself searching for something where you don't even know what to search for? This happens to me all the time. I can't remember the name of some new artist who's song I recently heard and loved, and so I search for some of the song lyrics. I can't remember the name of that great Sushi place I just ate at so I search a nearby cross-street I remember passing  + "great sushi". But what about if you have absolutely no idea? A recent example I heard (From &lt;a href="http://www.joelonsoftware.com/"&gt;Joel Spolsky&lt;/a&gt;) was someone who was looking for how to create the perfect latte. It turns out in order to do this you need to perfect the steaming your milk until you get it into a state called "microfoam". How would you ever know that term to ask the question: "How do I create perfect milk microfoam" ? &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As it turns out this happens in programming all the time. Often you start playing around with some new language and you really want to do "X", but it just doesn't work. As it turns out "X" has a special esoteric name in that language and if you only new that word you would solve your problem in 5 minutes. Instead you spend the next 30 minutes trying to type in searches like:&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;"Why do I get an exception when I pass a mutable object to NewLanguage.specialFuction(var), but not all the time..."&lt;/blockquote&gt;To me, this is one of  the next logical evolutions of search and typeahead is the perfect place for it. I don't want incremental find (typeahead) to finish my sentence for me, I want it to finish my thought. I know, I know, that seems like a lot to ask. Natural language has so many ambiguities and computers are so explicit and logical. But the information is out there, AI can be improved, the graphs and connections are waiting to be formed. I will know someone (Google? Bing? ...Cuil?) is on the right track the minute I start typing; "Will this day never en..." and the first thing that comes up in my typeahead drop down is:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;"You need a vacation: How about Fiji?"&lt;/blockquote&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2123627074120865266-3207560485020146126?l=scanningcrew.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://scanningcrew.blogspot.com/feeds/3207560485020146126/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2123627074120865266&amp;postID=3207560485020146126' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2123627074120865266/posts/default/3207560485020146126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2123627074120865266/posts/default/3207560485020146126'/><link rel='alternate' type='text/html' href='http://scanningcrew.blogspot.com/2009/07/real-incremental-find.html' title='Real Incremental find'/><author><name>Scanningcrew</name><uri>http://www.blogger.com/profile/01189333113641708597</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='14' height='32' src='http://1.bp.blogspot.com/_9Dlucn6QibU/Sk2dLmwfe7I/AAAAAAAAACY/1IpJE0YkQTI/S220/Photo+16.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_9Dlucn6QibU/Sk2T8Ho_aXI/AAAAAAAAACQ/ycS8J8kyj5o/s72-c/Picture+4.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2123627074120865266.post-4645385065998889755</id><published>2009-03-01T22:09:00.000-08:00</published><updated>2009-03-01T22:19:19.837-08:00</updated><title type='text'>Antique</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_9Dlucn6QibU/Sat6XGq8OQI/AAAAAAAAACI/MH-cun6WE9U/s1600-h/1732658868_eaa49875ae.jpg"&gt;&lt;img style="border-color: black; border-width: 2px; margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 308px; height: 320px;" src="http://2.bp.blogspot.com/_9Dlucn6QibU/Sat6XGq8OQI/AAAAAAAAACI/MH-cun6WE9U/s320/1732658868_eaa49875ae.jpg" alt="" id="BLOGGER_PHOTO_ID_5308471123132561666" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Buying Amazon’s new &lt;a href="http://www.amazon.com/Kindle-Amazons-Wireless-Reading-Generation/dp/B00154JDAI/ref=amb_link_83624371_1?pf_rd_m=ATVPDKIKX0DER&amp;amp;pf_rd_s=center-1&amp;amp;pf_rd_r=1G3PPNG5CP01Y7XFCT76&amp;amp;pf_rd_t=101&amp;amp;pf_rd_p=469942651&amp;amp;pf_rd_i=507846"&gt;Kindle&lt;/a&gt; was an interesting transition for me. I have always been passionate about physical collections. I started out collecting comics and &lt;a href="http://www.coolminiornot.com/pics/pics11/img4641c422d6fb9.jpg"&gt;Games Workshop&lt;/a&gt; figures as a youth. Later in life it was records for DJing and books. A full bookcase or room of milk crates packed with vinyl is a thing of beauty. Like the rest of the 21st century I am slowly making transitions towards new mediums for these items. There wasn’t a specific defining event which instigated this and the transition will never be 100% (Which is why record companies are so wrong when they assume the digital downloader isn’t also buying hard-copies). This is why beautiful album art and companies like McSweeney’s will always have a place on my bookshelf.&lt;br /&gt;&lt;br /&gt;It is the uniqueness and ambiance that physical items have. You remember when and where you bought that music album by looking at the jewel case. Or maybe you can’t quite remember, but you still romanticize about it. &lt;span style="font-style: italic;"&gt;“Yah, I got Nirvana album the day it came out!”&lt;/span&gt; Perhaps you can even remember where you purchased a particularly old and faded book or that good friend who lent it to you then moved to the other side of the country and never got it back. It is the same way with photos. Those old, grainy, washed-out pictures from the 1970’s look like the 1970’s! Super 8 videos look…well dated.&lt;br /&gt;&lt;br /&gt;Not as much in the digital age. As I begin to capture high-definition video (I can barely believe HD camcorders are a consumer product) of my new-born daughter, and fill up my hard drive with digital pictures, I wonder if she will be able to visually “date” them when she is older? And I am not talking about dating via the subject of the photo. Will she have the experience I had of going through my Mom’s scrapbook of poorly taken strangely-contrast Polaroid’s where it’s hard to make out if the photo is me or my brother? What is the digital version of the yellowing borders around an old photo, or the grainy image and artifacting on a VHS tape? Does an external hard drive with a hand made sticker saying “Baby’s First Year” emit any sort of nostalgia?&lt;br /&gt;&lt;br /&gt;There is beauty to things that physically age. Are we loosing this in a digital age? Once video and photograph resolution exceeds human ability to discern between real and captured, will everyone’s life be perfectly preserved for all eternity just as if the images were taken the day before?&lt;br /&gt;&lt;br /&gt;Oh and the Kindle... yes I love it. It has lightened my bag by at least 1-2 pounds and I already have three more books queued to read. Maybe it is the engineer in me, but I am still excited to see what the next new compact, greener, easier to manage digital tool gets invented for me to buy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2123627074120865266-4645385065998889755?l=scanningcrew.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://scanningcrew.blogspot.com/feeds/4645385065998889755/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2123627074120865266&amp;postID=4645385065998889755' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2123627074120865266/posts/default/4645385065998889755'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2123627074120865266/posts/default/4645385065998889755'/><link rel='alternate' type='text/html' href='http://scanningcrew.blogspot.com/2009/03/antique.html' title='Antique'/><author><name>Scanningcrew</name><uri>http://www.blogger.com/profile/01189333113641708597</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='14' height='32' src='http://1.bp.blogspot.com/_9Dlucn6QibU/Sk2dLmwfe7I/AAAAAAAAACY/1IpJE0YkQTI/S220/Photo+16.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_9Dlucn6QibU/Sat6XGq8OQI/AAAAAAAAACI/MH-cun6WE9U/s72-c/1732658868_eaa49875ae.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2123627074120865266.post-3766577132384441590</id><published>2009-01-22T21:48:00.000-08:00</published><updated>2009-01-22T23:39:17.045-08:00</updated><title type='text'>Change</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_9Dlucn6QibU/SXlzw_0bu1I/AAAAAAAAABw/TJgQg1kZKn8/s1600-h/milton.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 153px;" src="http://2.bp.blogspot.com/_9Dlucn6QibU/SXlzw_0bu1I/AAAAAAAAABw/TJgQg1kZKn8/s320/milton.jpg" alt="" id="BLOGGER_PHOTO_ID_5294390122552998738" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;There are two classic stereotypes of software groups that most developers are familiar with. On the left you have the small start-up team with 5-10 engineers all slaving away and working together to overcome that 6 month deadline you have before your competition comes out with your new idea, or worse, the coffers run dry. On the right you have the corporate goliaths with 47 levels of middle management and engineering groups in 23 countries all following multi-year feature release schedules with documentation and specs that rival War and Peace. During a conversation between two engineers, if one of them mentions that terrible start-up that worked them to death, or the huge tech firm where they worked on a project for 5 years and reported to 9 managers, the other engineer can nod and say; "Boy, I know what you mean... that's why I could never work at that sort of company."&lt;br /&gt;&lt;br /&gt;Both of these companies have issues (And plenty of them). At the small start-ups you know what you are in for, and the same holds true at the IBM’s and Microsoft’s of the world.  Really, regardless of if you’re a junior developer or a VP of Engineering; you just have to figure out what environment you work best in. Strategies for building a cohesive engineering team that generates quality software can be very different at the two. There are great books and blogs that go into many of these strategies, and even a few ideas that work in both environments. However, what seems to be the hardest to figure out are good strategies for all the companies in between. What happens when your small start-up starts to become not so small?&lt;br /&gt;&lt;br /&gt;Once a software group reaches 30-50 people you start to enter a dangerous area. Some companies expand and think they need to transition to the "big" model. They quickly higher more managers and before you know it there is a manager for ever 3 people, every engineer has 5 status reports to complete each week, and productivity grinds to a halt. Just as bad are the companies that don’t bring in good leadership and have 50 people all running around with a start-up mentality and interfacing between each team becomes a nightmare.  During this growth period you also run the risk of loosing the people that think the company is moving away from the start-up they love and transitioning into the Office Spaces of the world. To get through this you are going to have to figure out what works best for your software group. Different tactics are going to work better at different places, but in general here are a few of the things I have noticed.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;If you have good existing senior engineers and managers that are willing to stick with the company as it gets bigger, make sure they work well as a team. If they don't, it will be a disaster. As new engineers join the different teams they will soon pick up on the conflicts and cliques and division will only get worse. &lt;/li&gt;&lt;li&gt;Don't outsource. One of the worst things you can do as a department grows is solidify the fact your company is turning into a cold corporate giant where money reigns supreme. Transitioning is already difficult enough without hallway rumors that John's team is next to go, or all of support just packed their bags. Also, early on this will not save your company money. Companies of this size don’t have the manpower to dedicate to the time that goes into managing an off shore team. So you either increase your salary expenses bringing people in that are specifically hired to help manage off shore or you dig into developer time to manage it. Either way is not free, and most likely it will only lower your productivity.&lt;/li&gt;&lt;li&gt;Be careful with the &lt;a href="http://www.joelonsoftware.com/articles/fog0000000018.html"&gt;Architecture Astronauts&lt;/a&gt;. If you have senior engineers who already love the 6 month R&amp;amp;D projects that never go anywhere and have been with the company for so long that people aren't even sure who they report to, it's only going to get worse.&lt;/li&gt;&lt;li&gt;If you are a manager, take the time to compliment other team members (the old, the new, and especially the ones not on your team). It could be as simple as, "I saw that check-in you did last night, nice work!" It's the easiest thing in the world and it makes your coworkers feel connected. As your department continues to grow this really helps the teams feel connected.&lt;/li&gt;&lt;li&gt;Train the people you want to see move up the ladder. Don't grab the member of a team who has been with the company the longest and throw him into management. If you don't have to time or resources to train them, you are solving a temporary need with a long term disaster. When that person is totally overwhelmed and their team is 6 weeks behind schedule you can see why management by lottery has never worked.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;I equate this period to the software department's version of &lt;a href="http://en.wikipedia.org/wiki/Crossing_the_Chasm"&gt;Crossing the Chasm&lt;/a&gt;. You need to keep cohesion as you expand. If you pile on the bureaucracy and corporate attitude you might get a big surprise when productivity slows and so does the economy. Suddenly, you have a 15% work force reduction and now you are back to the small team, except with big company red tape. Likewise, you can't continue the fly-by-night coding and no bug tracking and pray the CEO isn't upset when you try to explain not having enough manpower for that next new huge project despite all the new hires. Work slowly at it, and you will find you will keep the good people, even some of the ones that mourn the days when everyone worked out of the coffee shop downstairs.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2123627074120865266-3766577132384441590?l=scanningcrew.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://scanningcrew.blogspot.com/feeds/3766577132384441590/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2123627074120865266&amp;postID=3766577132384441590' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2123627074120865266/posts/default/3766577132384441590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2123627074120865266/posts/default/3766577132384441590'/><link rel='alternate' type='text/html' href='http://scanningcrew.blogspot.com/2009/01/change.html' title='Change'/><author><name>Scanningcrew</name><uri>http://www.blogger.com/profile/01189333113641708597</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='14' height='32' src='http://1.bp.blogspot.com/_9Dlucn6QibU/Sk2dLmwfe7I/AAAAAAAAACY/1IpJE0YkQTI/S220/Photo+16.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_9Dlucn6QibU/SXlzw_0bu1I/AAAAAAAAABw/TJgQg1kZKn8/s72-c/milton.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2123627074120865266.post-5366669569364135552</id><published>2008-12-26T09:13:00.000-08:00</published><updated>2008-12-26T09:14:08.908-08:00</updated><title type='text'>Practice</title><content type='html'>I recently read Malcolm Gladwell's new book &lt;a href="http://www.amazon.com/Outliers-Story-Success-Malcolm-Gladwell/dp/0316017922"&gt;Outliers&lt;/a&gt;, and one of the great points he makes is the huge impact practice makes in an individual's ability to become a master of his specialty. While I don't necessarily agree that &lt;a href="http://www.gladwell.com/outliers/outliers_excerpt1.html"&gt;The Rule of 10,000 Hours&lt;/a&gt; applies to all fields, it is definitely on the right track. It doesn't matter if it is skiing, painting, playing hockey or coding; the human brain and nervous system require some amount of continuous repetition to really master a technique. I haven't figured out what the magic number of hours to become a master is for programming (I'm not sure there is one), but there is no question the best programmers I have come across are not math geniuses or naturally gifted in understanding some esoteric computer technology. They are talented because of the intriguing and diverse projects they have had the opportunity to work on.&lt;br /&gt;&lt;br /&gt;They are masters because they continuously practice.&lt;br /&gt;&lt;br /&gt;Now, &lt;a href="http://www.joelonsoftware.com/"&gt;Joel &lt;/a&gt;might argue a great programmer also needs to be able to think at multiple levels of abstraction, and they can't have gone to a Javaschool, and they need to understand the nuts and bolts of C and low level programming. Let's assume you have all this and are on your way to greatness at the next new challenging startup. Is the project you are working on forcing you to break out of your comfort zone with C (remember you didn't go to Javaschool)? Are you learning something new? When other people in your department mention the work they are doing do you think, "Wow that sounds really interesting too?"&lt;br /&gt;&lt;br /&gt;A lot of companies are not interested in solving something in a new way. They need a program written to take data from location A and move it to location B, and they need it done in a month. It doesn't matter if the program is particularly fast or if you developed some new design pattern to generate an elegant solution. What matters is that your boss can tick off your program's completion on his Gantt chart, and he can report the project is on schedule! If you are on this type of project, you are not practicing. You are buying your time until the next mundane program is needed. Except this time they need it to take that data you so carefully moved to location B and move it back to A. (Why did we move it to B to begin with?!)&lt;br /&gt;&lt;br /&gt;Find a project that is challenging. Diversify. Practice. Computer science is too fast an evolving field to spend even 6 months of your life not learning. Yes, there is a lot of white noise, but there are also a lot of gems being discovered. There are also plenty of other companies that are looking for people that can write faster programs and do so with elegant solutions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2123627074120865266-5366669569364135552?l=scanningcrew.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://scanningcrew.blogspot.com/feeds/5366669569364135552/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2123627074120865266&amp;postID=5366669569364135552' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2123627074120865266/posts/default/5366669569364135552'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2123627074120865266/posts/default/5366669569364135552'/><link rel='alternate' type='text/html' href='http://scanningcrew.blogspot.com/2008/12/practice_26.html' title='Practice'/><author><name>Scanningcrew</name><uri>http://www.blogger.com/profile/01189333113641708597</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='14' height='32' src='http://1.bp.blogspot.com/_9Dlucn6QibU/Sk2dLmwfe7I/AAAAAAAAACY/1IpJE0YkQTI/S220/Photo+16.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2123627074120865266.post-4884365543226922144</id><published>2008-12-09T15:52:00.001-08:00</published><updated>2008-12-09T17:56:25.772-08:00</updated><title type='text'>Consistency</title><content type='html'>In a recent Java refactoring project I was updating some threading code and came across a &lt;i&gt;HashMap &lt;/i&gt;that needed to be converted to a &lt;i&gt;ConcurrentHashMap&lt;/i&gt;. I made a one line change from:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;"&gt;Map myMap = new HashMap();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;to&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;"&gt;Map myMap = new ConcurrentHashMap();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;It seemed like a good idea before I started working other parts of the threading problem to run my my unit tests just to see what changing the implementation would do. What happened? Good old Java Null Pointer exception. The problem it turned out was due to the &lt;i&gt;get()&lt;/i&gt; method. &lt;i&gt;get() &lt;/i&gt;was being called with some null key and &lt;i&gt;ConncurretHashMap &lt;/i&gt;was throwing a NPE. Why didn't this happen with &lt;i&gt;HashMap&lt;/i&gt;? I thought perhaps I should double check the &lt;i&gt;Javadoc &lt;/i&gt;for &lt;i&gt;ConcurrentHashMap &lt;/i&gt;just in case I made a silly assumption they both had the same interfaces and contracts. Here is the Javadoc excerpt from the description in the first paragraph of the &lt;i&gt;ConcurrentHashMap&lt;/i&gt; page.&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;A hash table supporting full concurrency of retrievals and  adjustable expected concurrency for updates. &lt;b&gt;This class obeys the  same functional specification as &lt;/b&gt;&lt;code&gt;&lt;b&gt;Hashtable&lt;/b&gt;&lt;/code&gt;&lt;b&gt;, and  includes versions of methods corresponding to each method of  &lt;/b&gt;&lt;b&gt;Hashtable&lt;/b&gt;&lt;b&gt;.&lt;/b&gt; However, even though all operations are  thread-safe, retrieval operations do &lt;i&gt;not&lt;/i&gt; entail locking,  and there is &lt;i&gt;not&lt;/i&gt; any support for locking the entire table in a way that prevents all access. This class is fully interoperable with Hashtable in programs that rely on its thread safety but not on its synchronization details.&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;They say (ignoring gritty details of threading) that these two classes are interchangeable. The problem is that the devil is in the details and the details are the way Java handles uncaught exceptions. They both extend the same classes and have the same interface methods but as it turns out, HashMap and ConcurrentHashMap treat a null key totally different. In order to enforce these classes being interchangeable they couldn't have ConcurrentHashMap.get() actually throw an exception. Going into a little more detail, here are the actual Javadoc comments on the &lt;i&gt;get()&lt;/i&gt; method calls:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;HashMap.get()&lt;/span&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;Returns:&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;&lt;div style="margin-left: 40px;"&gt;the value to which this map maps the specified key, or           null if the map contains no mapping for this key.&lt;/div&gt;&lt;/div&gt;&lt;span style="font-size:130%;"&gt;ConcurrentHashMap.get()&lt;/span&gt;&lt;br /&gt;&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;Returns:&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;&lt;div style="margin-left: 40px;"&gt;the value to which the key is mapped in this table; null if the key is not mapped to any value in this table.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;Throws:&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;div style="margin-left: 40px; font-family: Courier New;"&gt;&lt;div style="margin-left: 40px;"&gt;&lt;code&gt;NullPointerException&lt;/code&gt; - if the key is                null.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;All of the sudden someone decided they would throw an uncaught exception? Certainly, there must be a reason behind it. I decided to look at the Java source code:&lt;br /&gt;&lt;br /&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:130%;"&gt;ConcurrentHashMap:&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-left: 40px;" class="MsoNormal"&gt;&lt;span style="font-family:Courier New;"&gt;public V get(Object key) {&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-left: 80px; font-family: Courier New;" class="MsoNormal"&gt;        int hash = hash(key); &lt;b&gt;// throws  NullPointerException if key null&lt;/b&gt;&lt;/p&gt;&lt;p style="margin-left: 40px;" class="MsoNormal"&gt;    ...&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size:130%;"&gt;HashMap&lt;/span&gt;:&lt;/p&gt;&lt;p style="margin-left: 40px;" class="MsoNormal"&gt;&lt;span style="font-family:Courier New;"&gt;public V get(Object key) {&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-left: 80px; font-family: Courier New;" class="MsoNormal"&gt;                &lt;b&gt;if (key == null)&lt;/b&gt;&lt;/p&gt; &lt;p style="margin-left: 120px; font-family: Courier New;" class="MsoNormal"&gt;&lt;b&gt;                    return  getForNullKey();&lt;/b&gt;&lt;/p&gt; &lt;p style="margin-left: 80px; font-family: Courier New;" class="MsoNormal"&gt;        int hash = hash(key.hashCode());&lt;/p&gt; &lt;p style="margin-left: 40px;" class="MsoNormal"&gt;        ....&lt;/p&gt;It turns out it comes down to a small null check in one method and the same check missing in the other. The Sun Java developers might have had a good reason for this, but it misses the point. With OOP there is nothing more important then truth in advertising. When you claim one thing and do another that is far more dangerous then simply saying "Use at your own risk".&lt;br /&gt;&lt;br /&gt;I find this is common in a large number of APIs and it really seems to show it's ugly head when those API's update. Sometimes this is because the developer updating the API makes some bad assumption about how people use it, sometimes its a technical restriction and sometimes it's just a mistake. What is really scary about this one is that it is a runtime exception. That evil type of exception that normally sneaks through (even with good unit tests) and then hits you in production. Users beware!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2123627074120865266-4884365543226922144?l=scanningcrew.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://scanningcrew.blogspot.com/feeds/4884365543226922144/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2123627074120865266&amp;postID=4884365543226922144' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2123627074120865266/posts/default/4884365543226922144'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2123627074120865266/posts/default/4884365543226922144'/><link rel='alternate' type='text/html' href='http://scanningcrew.blogspot.com/2008/12/consistency.html' title='Consistency'/><author><name>Scanningcrew</name><uri>http://www.blogger.com/profile/01189333113641708597</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='14' height='32' src='http://1.bp.blogspot.com/_9Dlucn6QibU/Sk2dLmwfe7I/AAAAAAAAACY/1IpJE0YkQTI/S220/Photo+16.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2123627074120865266.post-6231422842853091908</id><published>2008-11-30T09:53:00.000-08:00</published><updated>2008-11-30T21:17:06.159-08:00</updated><title type='text'>Early Branching</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_9Dlucn6QibU/STLTcj4ywXI/AAAAAAAAAAk/B9p2lPxvH14/s1600-h/18tree-600.jpg"&gt;&lt;img style="border-color: black; border-width: 2px; margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 252px; height: 164px;" src="http://1.bp.blogspot.com/_9Dlucn6QibU/STLTcj4ywXI/AAAAAAAAAAk/B9p2lPxvH14/s320/18tree-600.jpg" alt="" id="BLOGGER_PHOTO_ID_5274510601227518322" border="0" /&gt;&lt;/a&gt;Recently a coworker and I were looking at a versioning problem with some code that had been integrated into the current release branch (from some parallel branch) and we stopped and asked ourselves; "Why are these integ issues always so complicated, and why do we always hit them at the end of a release cycle?"&lt;br /&gt;&lt;br /&gt;I have had the fortunate experience to work for software companies where the build was a transparent luxury that developers knew almost nothing about (It just worked!), and companies where the build was some Machiavellian  Rube Goldberg machine that worked if no one made any mistakes and sage was burned at the right hour on night before a release. The interesting thing is that despite the technologies or languages or platforms that the build system used the one thing that seemed to make the biggest difference was when the branches were cut.&lt;br /&gt;&lt;br /&gt;Of all the branching strategies I have come across the one that I've witnessed the greatest success with is early branching. Why does this seem to work better then late branching (or variants of merge/propagate early/often)? I think for a couple key reasons:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Branching is done for clear and coherent reasons. As soon as a release is planned a branch is cut. It ties together clear release requirements to a physical code base from which those documents can be evaluated against at any given moment.&lt;/li&gt;&lt;li&gt;It isolates potentially conflicting parallel work and helps to minimize developer collisions and build downtime&lt;/li&gt;&lt;li&gt;Reduces concurrent branch explosion. (I have seen companies with 9-10 concurrent branches all hoping they can merge them together at the 11th hour and release)&lt;/li&gt;&lt;li&gt;Potentially underestimated tasks (Hey we need to support a new platform!) are identified early and release plans (or requirements) can be adjusted accordingly.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;While I think #1 is probably the one that gives developers and project managers the biggest benefit, #4 is where I've seen hours, days, even weeks of time saved. It is self evident that knowing potential problems early in a software cycle is better then late, but it is also surprising how often this is missed because no one foresaw any major problems.  Developers are also human, and as opposed to strategies which are more &lt;span style="font-style: italic;"&gt;laissez-faire&lt;/span&gt; in their version control restrictions (often relying on the wise developer to remember to do all &lt;span style="font-weight: bold;"&gt;right &lt;/span&gt;integing) this approach minimizes mistakes and is more forgiving when mistakes do happen. And if we have learned anything from books like &lt;a href="http://www.amazon.com/Microserfs-Douglas-Coupland/dp/0060987049"&gt;Microserfs&lt;/a&gt; or &lt;a href="http://www.amazon.com/Dreaming-Code-Programmers-Transcendent-Software/dp/1400082471"&gt;Dreaming in Code&lt;/a&gt;, it's that software is hard enough without adding unforgiving process into the mix.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2123627074120865266-6231422842853091908?l=scanningcrew.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://scanningcrew.blogspot.com/feeds/6231422842853091908/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2123627074120865266&amp;postID=6231422842853091908' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2123627074120865266/posts/default/6231422842853091908'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2123627074120865266/posts/default/6231422842853091908'/><link rel='alternate' type='text/html' href='http://scanningcrew.blogspot.com/2008/11/early-branching.html' title='Early Branching'/><author><name>Scanningcrew</name><uri>http://www.blogger.com/profile/01189333113641708597</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='14' height='32' src='http://1.bp.blogspot.com/_9Dlucn6QibU/Sk2dLmwfe7I/AAAAAAAAACY/1IpJE0YkQTI/S220/Photo+16.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_9Dlucn6QibU/STLTcj4ywXI/AAAAAAAAAAk/B9p2lPxvH14/s72-c/18tree-600.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2123627074120865266.post-1857143818870443140</id><published>2008-11-23T15:19:00.000-08:00</published><updated>2008-11-23T16:01:48.489-08:00</updated><title type='text'>Gastronomique</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_9Dlucn6QibU/SSnuaaMKl8I/AAAAAAAAAAc/KnhOmkNfccQ/s1600-h/20070520-026.jpg"&gt;&lt;img style="border-color: black; border-width: 2px; margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 230px;" src="http://3.bp.blogspot.com/_9Dlucn6QibU/SSnuaaMKl8I/AAAAAAAAAAc/KnhOmkNfccQ/s320/20070520-026.jpg" alt="" id="BLOGGER_PHOTO_ID_5272006976288233410" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Cooking as an art has seen a popularity explosion in America over the last 15 years. From dedicated cooking channels to reality cooking shows, from the &lt;a href="http://www.slowfood.com/"&gt;Slow Food Movement&lt;/a&gt; and backlash against the fast food industry to boom in organic/fresh grocers like Whole Foods. Cooking has and continues to be an activity where I find peace. To focus on creating something exquisite and present it for others to savor is not only rewarding but meditative. I must own 50 cookbooks on various cooking subjects and recipes but it is &lt;a href="http://www.amazon.com/French-Laundry-Cookbook-Thomas-Keller/dp/1579651267"&gt;Thomas Keller's French Laundry Cookbook&lt;/a&gt; that inspires the name of this blog.&lt;br /&gt;&lt;br /&gt;Rather then the typical organized listing of recipes, Keller entitles many of his chapters "The Importance of ___". From building good relationships with specialty vendors, to big pot blanching, to the importance of staff dinner, each chapter helps the reader understand why professional cooking is a holistic approach to both people and ingredients. I find Keller's philosophies and passions apply to so much of life outside of cooking that I hope this blog will serve as my personal interpretation of this idea in software, society, and the Bay Area.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2123627074120865266-1857143818870443140?l=scanningcrew.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://scanningcrew.blogspot.com/feeds/1857143818870443140/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2123627074120865266&amp;postID=1857143818870443140' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2123627074120865266/posts/default/1857143818870443140'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2123627074120865266/posts/default/1857143818870443140'/><link rel='alternate' type='text/html' href='http://scanningcrew.blogspot.com/2008/11/gastronomique.html' title='Gastronomique'/><author><name>Scanningcrew</name><uri>http://www.blogger.com/profile/01189333113641708597</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='14' height='32' src='http://1.bp.blogspot.com/_9Dlucn6QibU/Sk2dLmwfe7I/AAAAAAAAACY/1IpJE0YkQTI/S220/Photo+16.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_9Dlucn6QibU/SSnuaaMKl8I/AAAAAAAAAAc/KnhOmkNfccQ/s72-c/20070520-026.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2123627074120865266.post-8876313714503573878</id><published>2008-11-22T22:04:00.000-08:00</published><updated>2008-11-22T22:47:46.913-08:00</updated><title type='text'>Underindulgence</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_9Dlucn6QibU/SSjyzGkWQfI/AAAAAAAAAAM/DWY949_Vhqo/s1600-h/Picture+027.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 240px; height: 320px;" src="http://1.bp.blogspot.com/_9Dlucn6QibU/SSjyzGkWQfI/AAAAAAAAAAM/DWY949_Vhqo/s320/Picture+027.jpg" alt="" id="BLOGGER_PHOTO_ID_5271730323587482098" border="0" /&gt;&lt;/a&gt;I grew up in what would certainly be considered a modest to low income family in America. Both my parents were teachers in an affluent city whose primary constituents were  doctors, lawyers, and retired movie stars. My family made due with what was available and if there was one lesson we learned it was sharing. Now most people think of sharing as that altruistic forfeiture in which one makes some sacrifice so that another may benefit.&lt;br /&gt;&lt;br /&gt;20 Years later I have witnessed a variation of sharing which has become the horror of my place of work. Normally, I shrug this type of offense to the office idiot or perhaps the nameless dirty neighborhood filth-leprechaun who sneaks in to perform some vial offense that employees later come upon in the kitchen and exclaim "Holy Christ...who filled the sink with leftover curry?!"&lt;br /&gt;&lt;br /&gt;This particular Offender has decided that whatever free office breakfast, lunch, or snack is offered they will partake of exactly 1/2 an item and leave the rest for another (sharing right?). Now the polite, if not sanitary, way to do this would be cut the item in half. Hey there is even a knife right there! Unfortunately, evidence would suggest The Offender simply uses their mighty cake-hole grinders to tear off a piece of the item leaving behind the rest for some poor soul to stumble upon and ponder "What the hell happened here?".&lt;br /&gt;&lt;br /&gt;In the spirit of my advice to voters this last election who gave Bush the deuce run; I plead to The Offender... If you can't finish a whole muffin, consider abstaining this time around.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2123627074120865266-8876313714503573878?l=scanningcrew.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://scanningcrew.blogspot.com/feeds/8876313714503573878/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2123627074120865266&amp;postID=8876313714503573878' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2123627074120865266/posts/default/8876313714503573878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2123627074120865266/posts/default/8876313714503573878'/><link rel='alternate' type='text/html' href='http://scanningcrew.blogspot.com/2008/11/underindulgence.html' title='Underindulgence'/><author><name>Scanningcrew</name><uri>http://www.blogger.com/profile/01189333113641708597</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='14' height='32' src='http://1.bp.blogspot.com/_9Dlucn6QibU/Sk2dLmwfe7I/AAAAAAAAACY/1IpJE0YkQTI/S220/Photo+16.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_9Dlucn6QibU/SSjyzGkWQfI/AAAAAAAAAAM/DWY949_Vhqo/s72-c/Picture+027.jpg' height='72' width='72'/><thr:total>0</thr:total></entry></feed>
