tag:blogger.com,1999:blog-137064792024-03-07T01:02:13.888-08:00Thoughts of MeIdeas and thoughts from the world of software development, finance, sci-fi, disney world, and who knows what else!Tantonhttp://www.blogger.com/profile/08601404650352658381noreply@blogger.comBlogger209125tag:blogger.com,1999:blog-13706479.post-43470383783349007532010-03-28T23:25:00.000-07:002010-03-29T00:08:13.760-07:00A new languageWhy, oh why, would I curse the world with another programming language? The answer is my typical, "Why not?". More seriously, there are minor deficiencies that I would like to address in the modern mainstream languages. The language I will design will be an incremental improvement over what we currently have. I don't expect it to gain much traction, but it should be enjoyable to program in and it will make for a nice side project.<br /><br />Here are the major things I wish to have in my language<br />1. Type inferencing<br />2. Mutable/Immutable variables - you should be able to specify if a variable is mutable or immutable. By default, local variables are mutable. Non local variables (member variables and static variables) are by default immutable.<br />3. Non-nullable types - By default all types are non-nullable. You can wrap the type in a Nullable<T> and use the Nullable<T>.Null object to represent null.<br />4. Generic types - types can be generic.<br />5. "Duck" interfaces - types can be cast to an interface that they don't implement so long as they implement the correct functions. It must be an explicit cast (unless the interface is unnamed), but the cast will succeed.<br />6. Unnamed interfaces - When defining a generic function, you can specify an interface that the parameter must implement. The incoming object will be implicitly cast to this unnamed interface.<br />For example:<br />int f<T implements { void foo(); }>(T incoming)<br />{<br /> incoming.foo();<br />}<br />7. immutable methods - methods are, by default, immutable. They can not change any of the mutable or immutable members. A method may be specified as mutable, but mutable methods may not be called on immutable objects.<br />8. Metaprogramming support - Compile time support for metaprogramming should come from a few different sources. First, a standard AST will be provided that can be manipulated through annotation. Basically, an annotation is like a macro that takes a statement and transforms the AST into a different statement. For example, you could write a "memoize" functional annotation that accepts a function declaration and replaces it with a different declaration that is memoized. In addition, metaprogramming can come through compiler event hooks such as "onInheritance", "onCast", "onDeclaration", etc...<br />9. Unit test support - I'm not yet sure what this will end up looking like, but I do plan on having the ability to write short, inline unit tests at the point of method declaration. It will act as both a user guide as well as a documented test.<br />10. No "new" keyword - I have never understood the point of the "new" keyword in Java and C#. Therefore, it is gone.<br />11. No more try - I really hate the try/catch thing. In <i>The Design and Evolution of C++</i>, Bjarne writes about how he had a version without try, but it was confusing. I think it is time to resurrect his experiments. I'm not yet sure of the final form, but I'm sure it will be tryless.<br />12. Inheritance is deprecated - Other than interfacing with other languages, there should be no need or desire for inheritance. Much of what it was designed to accomplish can be done better through syntax macros and composition. Inheritance will be kept for compatibility with Java/C#/etc..., but its use in native libraries will be deprecated.<br /><br /><br />Ok, that's 12 things that I see for my language. I don't have a name for it yet, but will accept any suggestions :) I plan to target the .net runtime at first, but the JVM should be a target as well. Comments are welcome.Tantonhttp://www.blogger.com/profile/08601404650352658381noreply@blogger.com0tag:blogger.com,1999:blog-13706479.post-53900570548509283322010-03-19T03:05:00.000-07:002010-03-19T03:40:23.798-07:00Passing the Microsoft InterviewAs you know, I work for Microsoft - specifically on the bing.com team, more specifically on the core core relevance team (yes, that's two cores...don't ask). Even more specifically on the anchor team in the core core relevance team of bing.com in Microsoft. Wow, that's a mouthful.<br /><br />Anyway, bing is hiring and that means I'm interviewing a lot these days. I'm doing at least one interview every other week, sometimes more. In addition, not many people are passing. So, to help everyone out, I thought I would put together a list of tips to help you pass the Microsoft Interview.<br /><br /><h3>Tip #1: Know your stuff</h3><br />Yeah, easier said than done. However, there are a number of resources out there that can help you. I've listed them in a <a href="http://blogginman.blogspot.com/2008/08/live-search-interview.html">previous blog post</a>, so study up and have a good understanding of data structures, algorithms, and Big O notation before getting here.<br /><br /><h3>Tip #2: Understand the problem</h3><br />A lot of people encourage you to ask lots of clarifying questions. I think that is good practice and would also encourage you to do it. In addition, I think you should also spend quite a bit of time at the beginning to list out examples, both positive and negative.<br />Let's use a concrete example. One question that I see posted all over the web is to write a function to take a string as input and reverse the order of the words in the string. So, for example, "Hello World" would get reversed to "World Hello".<br />The first thing you should do is ask clarifying questions. Here are some examples:<br />1) Should I reverse the string in place, or create a new string?<br />2) What is the return value for the empty string?<br />3) How should a null pointer be handled?<br />4) What constitutes a word separator?<br />5) ASCII or Unicode?<br />6) How should punctuation at the end of the string be handled?<br />7) What about capitalization?<br />8) Is it a c style string or are embedded nulls allowed?<br /><br />Now that you have fleshed out the problem, the next thing to do is think of some example inputs and see what the outputs would be. I would think of this in a tabular format with input on the left and output on the right<br /><table border=1><br /><tr><th align=left>input</th><th align=left>output</th></tr><br /><tr><td>null</td><td>assertion failure</td></tr><br /><tr><td>""</td><td>""</td></tr><br /><tr><td>"Hello"</td><td>"Hello"</td></tr><br /><tr><td>"Hello world"</td><td>"world Hello"</td></tr><br /><tr><td>"Hello from Microsoft"</td><td>"Microsoft from Hello"</td></tr><br /></table><br /><br />There may be more examples depending on the answer to the clarifying questions, but these would be the minimum examples necessary. Go through each example with your interviewer and make sure he or she agrees with your mapping function.<br /><br /><h3>Tip #3: Describe the algorithm</h3><br />After you have created your examples, but before you start to code, describe, in English, the algorithm you have devised. First, this helps you to think about the algorithm before you code it and second it gives your interviewer a chance to hint at the right solution if you missed it. If, instead, you immediately start coding a poorly performing algorithm, you give your interviewer no choice but to sit idly by while you waste his time coding something he knows won't work. If you, instead, discuss the algorithm with the interviewer, it gives him or her the chance to point you in the right direction and lets you write code that the interviewer wants to see.<br /><br />In our word reversal example, you might start by describing an algorithm whereby you find the first space and the last space and then swap the words and repeat until the spaces are the same. The interviewer might ask you about the complexity of this approach and then ask if there is a less expensive algorithm. Doing things in this order makes sure that you are coding the algorithm the interviewer wants to see.<br /><br /><h3>Tip #4: Don't mention a naive algorithm to fill time</h3><br />The interviewer has asked you a difficult question. You're not sure of the correct way to solve it. Don't just mention the first, most naive, solution that pops into your head. If you think your first solution is a good one, then by all means mention it, but if you know it sucks and is O(n!) or some such nonsense, then stop, think, and come up with something better. By giving a poor solution to begin with you are just giving the interviewer a reason to reject you. You don't have to get the right solution to begin with, just make sure it's not horrible.<br /><br /><h3>Tip #5: When coding, make sure you check your boundary conditions</h3><br />Nothing sets me off more than when someone forgets a null check or a boundary condition check. This is just Engineering 101 and is critical for a system such as bing. If you can't be bothered to check for null in all the right situations, then don't even apply. Sure, everyone makes mistakes, but in the interview keep null checks on the top of your mind.<br /><br /><h3>Tip #6: After coding, run through your examples and make sure your code works</h3><br />I've seen too many people write code on the whiteboard, spend 5 seconds looking at it, and then say "Yes, that looks good." There is NO way you have tested it in your head after 5 seconds. Even if it is correct, how do you know? The best thing to do is to use your examples that you generated to walk through your code. You might discover, for instance, that you assumed there would always be a space, when there might not. This gives you a chance to correct your own mistakes without forcing the interviewer to intervene.<br /><br /><h3>Tip #7: Ask questions about the interviewer</h3><br />This is just good psychology. Make the interviewer feel important by spending a few minutes at the end asking about the interviewer's team and work. The benefit to you is that you get to hear about the day to day activities and make sure they sound interesting. The benefit to the interviewer is that he or she gets to talk about his or her exciting projects. This leaves the interviewer with a good feeling leaving the interview, which is always a good thing. So, the next time you are stuck without a question, ask the interviewer to tell you about a recent project - and hopefully it excites you both!<br /><br />There you have it, 7 tips on getting through a Microsoft interview. Of course, I honed in on coding, but many of the same ideas apply to the design based interview questions, as well. Regardless, be prepared, be confident, and most of all, have fun!Tantonhttp://www.blogger.com/profile/08601404650352658381noreply@blogger.com24tag:blogger.com,1999:blog-13706479.post-37024015826724487502010-02-12T00:32:00.000-08:002010-03-26T00:10:47.177-07:00What have we programmers learned?Remember when everyone wrote spaghetti code littered with gotos? Ok, I don't, and I doubt there was such a time. The really great people never wrote spaghetti code littered with gotos. They used gotos because they were all that was available, but they wrote structured code before structured code was cool. It took time, and language advances, but eventually the average joe programmer like me caught on to the practice. This led to much rejoicing and greatly improved software. Of course, by that time, the great programmers were already moving on to things like object-oriented programming and generic programming. There is always a downdraft from the great programmers exploring and pioneering to the average joe learning and improving the mean.<br /><br />The questions were are here to ask (and answer) are<br />1) What has the average joe programmer learned over the last 10 years?<br />and<br />2) What are the great programmers exploring and pioneering today?<br /><br />It is interesting to note that most of the things I'm going to discuss were practiced since the beginning of the computer era. They are not new ideas or inventions, it is just that it has taken this long for the rest of us to catch up and realize their significance and importance.<br /><br />In this post, I'll list out what I believe we have learned and are learning and in future posts, we'll go into each in more depth.<br /><br /><h3>What have we learned over the last 10 years?</h3><br />1) Automated unit testing - Note, this doesn't necessarily mean TDD, BDD or any other methodology, just that we should have unit tests and they should be run automatically.<br />2) Refactoring<br />3) Small methods<br />4) Value Semantics - How can I say this when most VMs use references? Think immutable reference types!<br />5) Functional extensions to procedural languages<br />6) VMs are good<br />7) OO is not a silver bullet<br />8) ORM is hard<br />9) IDEs are vital<br />10) XML was a cruel joke<br /><br /><h3>What are we learning?</h3><br /><br />In most of these cases, we know the concept is important, but we're still quite unsure of how to quite integrate it into our everyday lives. There are still many fledgling attempts, but nothing has quite been standardized. In some cases, it could be that web search has clouded my view of what is importat.<br /><br />1) Non-nullable types<br />2) DSLs<br />3) Metaprogramming is important<br />4) MapReduce [or parallelism is all about the programming model]<br />5) Statistics<br />6) Column-Store DBs have a place, but so do RDBMS's<br />7) Convention vs Specification<br />8) Patterns are not a silver bullet, nor are functional languages<br />9) Type inferencing is a benefit<br />10) XML was a cruel joke (yes, it goes in both)<br /><br />Please feel free to comment if you disagree or want to add.Tantonhttp://www.blogger.com/profile/08601404650352658381noreply@blogger.com0tag:blogger.com,1999:blog-13706479.post-56649193253525012642010-01-06T08:15:00.000-08:002010-01-06T08:44:13.743-08:00My new browserFor years I have been a faithful IE user. I say faithful and not loyal because I have only used it because it suited my needs and other browsers were too cumbersome or clumsy to hold my attention for long. <br /><br />FireFox is infinitely customizable, but it never <i>felt</i> like a well designed app - it felt clumsy to me. Plus, it always had problems rendering tables in an appropriate manner.<br /><br />Chrome is sleek, fast and elegant, but in many cases it just doesn't work. I'm always finding some site that it doesn't render quite right, a video that it won't play, or a simple customization that doesn't exist.<br /><br />I've also tried Safari from time to time, but never long enough because I never saw any advantages over IE.<br /><br />However, a new version of an old browser has impressed me so much that I have switched for what I hope is good. <a href="www.opera.com">Opera version 10.10</a> is an amazing piece of art. It renders fast and correctly, plays all the video sites I need (though I did have to "Mask as FireFox" for Netflix!), and has the simple customizations I want. For instance, I can use the address bar to search on various search engines (I'm not limited to Google like I am with Chrome.) If I want to search <a href="www.bing.com">Bing</a>, then I just type "b " followed by the search string into the address bar and viola! it goes to Bing and searches (I did have to manually set this up, but it was quick and easy). Other niceties include movable tabs for web pages with hover preview and a "speed dial" page that is much nicer and more customizable than Chrome's.<br /><br />My requirements are simple. I want a browser that is easy to use, works on the sites I frequent, and has simple customizations. I don't want to spend a lifetime studying all the intricacies and hunting down new plug ins. I just want a browser that works. Opera satisfies those needs and left me happier than I was before. Give it a try and let me know if you feel the same way!Tantonhttp://www.blogger.com/profile/08601404650352658381noreply@blogger.com0tag:blogger.com,1999:blog-13706479.post-17327022045147632522009-09-05T21:19:00.000-07:002009-09-05T21:39:03.333-07:00C# TimingsRecently, I was adding a bit of debug code to measure how long it took to run various parts of my program (yes, I know a profiler would be more accurate, but I just needed a rough estimate). So, I had 3 or 4 areas in my code where I did something akin to<br /><code><br />TimeSpan timer = new TimeSpan();<br />DateTime startTime = DateTime.Now;<br />Type1 rval = DoIt(a, b);<br />timer += DateTime.Now - startTime;<br /></code><br />Firstly, this code is ugly. I'm obviously doing many different things here: timing code, calling a function, storing it's result, etc.... It would be much better if I could wrap the timing code into its own function. So, I esentially want something like:<br /><code><br />TimeSpam timer = TimeIt( () => DoIt(a, b) );<br /></code><br />The code for TimeIt is simple to write<br /><code><br />TimeSpan TimeIt(Action a)<br />{<br /> DateTime startTime = DateTime.Now;<br /> a.Invoke();<br /> return DateTime.Now - startTime;<br />}<br /></code><br />However, that doesn't save the return value of DoIt, so that is useless for my purposes. I need TimeIt to return the value from DoIt. To do this, I make TimeIt a generic method and have it accept a function instead of an action. I pass the TimeSpan in as a reference argument. The calling code looks like<br /><code><br />TimeSpan timeSpan = new TimeSpan();<br />Type1 rValue = TimeIt(() => DoIt(a, b), ref timeSpan);<br /></code><br />The TimeIt function looks like<br /><code><br />public static T TimeIt<T>(Func<T> f, ref TimeSpan timeSpan)<br />{<br /> DateTime startTime = DateTime.Now;<br /> T rVal = f.Invoke();<br /> timeSpan += DateTime.Now - startTime;<br />}<br /></code><br />There, now we have a simple and generic way to time a single method that returns a value. If you wanted to go further, you could create a class that held the TimeSpan value so that you wouldn't have to pass it in as a ref, but this worked for my needs and was clean enough so I stopped here. If I need this code again, I'll refactor it into another library and perhaps into its own class. Until then, I'll enjoy the cleanliness and conciseness.Tantonhttp://www.blogger.com/profile/08601404650352658381noreply@blogger.com0tag:blogger.com,1999:blog-13706479.post-43735834071194593782009-07-20T19:09:00.000-07:002009-07-20T19:10:12.071-07:00A letter to my representativeI sent a letter to my representative regarding the health care bill and would like to repost it here for others to comment.<br /><br />Hello Representative Inslee,<br /><br />I wanted to write a quick letter in opposition to the upcoming health care reform. Believe it or not, health care is undergoing a major revolution today. The problem is that the traditional "insurance" programs of the past are becoming harder to use because people have confused "insurance" with "comprehensive coverage". Allergy medicine, maintenance meds, etc... are not part of any insurance program. Insurance is responsible for covering major and unexpected medical issues. Over the last 5 years, more insurance companies are coming to terms with this and are inventing things like Health Savings Accounts, which, though unpalatble to many consumers, are a cost effective means of giving consumers choice over how to best spend thier medical allowance. Unfortunately, the private sector has not sorted everything out yet, so now is a very inopportune time for the government to intervene. The government is not innovative nor is it cost effective. Instead, it simply throws constiutents money at a problem with little effect until they stop complaining about it. I do recognize the importance of helping our elderly and needy, but I also recognize the precarious position of the american economy and the health care industry. Despite Obama's claim, now is NOT the time to act. Now is the time to rely on capitalism and market forces to sort out what the future should hold and then fit our current medicare and medicaid plans into that future. The economy, the health care industry, and your constituents need you, Representative Inslee, to be a pillar of salt in today's wax and wane congress. You have been in the past and I trust you will be again.<br /><br />Thanks for your time,<br />Tanton Gibbs<br />Redmond, WATantonhttp://www.blogger.com/profile/08601404650352658381noreply@blogger.com1tag:blogger.com,1999:blog-13706479.post-59438746058380915382009-06-28T02:04:00.000-07:002009-07-06T02:29:00.552-07:00What should Yahoo! do?Yahoo!'s CEO, Carol Bartz, has stated firmly that <a href="http://www.cnbc.com/id/15840232?video=1134895115">Yahoo! is not a search company</a>. In fact, Yahoo!, she states, <a href="http://online.wsj.com/article/SB10001424052970203431004574196080698220124.html">is much closer to a portal</a>. The goal is not search, but editorial comments and a local feel. A portal, if you will, from a major media/technology firm. Unfortunately, in the coming years, portals will be less and less necessary as people will get their news from a swath of algorithmically mined sources across the social media landscape. I'm afraid the era of Yahoo! dominance has ended and will not return.<br /><br />Like <a href="http://www.amazon.com/Elephants-Dance-Inside-Historic-Turnaround/dp/0060523794">IBM in the 90's, Yahoo! must redefine itself.</a> Yahoo! must <a href="http://www.fastcompany.com/magazine/51/goodtogreat.html?page=0%2C4">sell the mills</a>.<br /><br />Again, like IBM, who has become a major integrator, and Kimberly-Clark, who has become a consumer goods powerhouse, Yahoo! must set out on the next phase of it's life - it must enter and dominate a new area or be relegated to a technological side show until it dies. But what should it pursue? To answer that question, we need to look at its strengths and products, especially those that are hard to mimic, such as those related to its core technology.<br /><br />Yahoo! has <a href="http://www.datacenterknowledge.com/archives/2009/06/24/yahoos-unstealths-its-data-center-efficiency/">world class data centers</a>, meaning they can store and process data cheaper than anyone else (except, perhaps, google). Yahoo! also has a <a href="http://www.idevnews.com/IntegrationNews.asp?ID=913">data processing platform</a> that allows it to analyze web scale data quickly and efficiently. It's also beginning to build <a href="http://hadoop.apache.org/pig/">a dataflow language</a> which allows developers to be productive. Finally, Yahoo! has a <a href="http://research.yahoo.com/">respected research organization</a> which keeps it at the forefront of areas such as machine learning and information retrieval.<br /><br />The question then becomes: "What business needs massive computational power, data storage and processing ability, and makes heavy use of machine learning and information retrieval?" The biggest one I can think of is data marketing. Analyzing billions of consumer and business records as quickly as possible and making decisions on the fly is what data marketing is all about.<br /><br />Imagine a person walking into an electronics store. Currently, if the person buys something he may get a coupon to promote his buying something more, later. However, this is suboptimal for two reasons. The simplest reason is that the coupon may be unnecessary. The patron may have been planning to return even without the coupon and so the coupon represents wasted revenue. The second reason is that the coupon may be too late. It could be that if the patron would have been given the coupon on the way in then he might have bought more or upgraded or any other number of things that could have produced more revenue. It could even be that a customer doesn't buy anything at all, but would have purchased if a coupon was given beforehand. The holy grail of marketing is to sell an item to each person at an individualized cost. You want that person to pay as much as possible for the item. If person A will pay $100 for a camera and person B will pay $300 for the same camera then you want to issue the $200 off coupon to person A and no coupon to person B.<br /><br />Now, imagine a system where a customer is recognized by an <a href="http://research.yahoo.com/search/node/image">image recognition system</a> the moment they walk in. Their data is retrieved instantly and a <a href="http://research.yahoo.com/Machine_Learning">machine learning algorithm</a> is run to determine what the person is shopping for and what the person is willing to pay. From their online profile and <a href="http://www.twitter.com">twitter account</a>, the algorithm is able to determine that the person recently broke their camera and is looking to replace one. Using data from <a href="http://www.acxiom.com">a company such as this one</a> the algorithm can tell that they are struggling economically and will want to buy a cheaper camera. However, it also knows from statistics that a coupon for the higher priced camera has a good probability to make the consumer stretch his budget and go for the "prestige" item. A few more checks against the data center reveals that the current store location has excess inventory of the higher priced camera and therefore the algorithm decides to dispatch a bigger discount coupon for the better model. The sales attendant walks to the customer and presents the coupon, escorting the customer to the camera aisle. The sale is made and the computer gets an extra volt in its bedtime snack ;-)<br /><br />More seriously, Yahoo! could perform those computations more efficiently and with better accuracy than an enterprise. Enterprise data centers are not going to reach the efficiency of Yahoo!'s data center. Moreover, enterprise IT programmers are not going to have the time or penchant to do the necessary IR and ML research. Yahoo! is uniquely positioned to do those things; furthermore, since it is dangling on the precipice of disaster now is a good time to bite the bullet and make the change. Not that I expect them to. Change is something that is hard to accept and Ms Bartz doesn't seem like the type to change their core business...if she ever figures out what that is. More than likely the model I express above will be adopted by a new comer...perhaps by <a href="http://flamingo.ics.uci.edu/">these guys.</a>Tantonhttp://www.blogger.com/profile/08601404650352658381noreply@blogger.com0tag:blogger.com,1999:blog-13706479.post-36217890801202497412009-05-24T13:01:00.000-07:002009-05-24T13:43:32.136-07:00The Perils of FanaticismI found <a href="http://www.computerworld.com/action/article.do?command=viewArticleBasic&taxonomyName=windows_and_linux_pcs&articleId=9133381&taxonomyId=64&intsrc=kc_feat">this article</a> on reddit the other day and was immediately struck by its stupidity. Now, usually I wouldn't use such a harsh word, but the ideas contained in it are so preposterous that it doesn't really deserve any better word.<br /><br />I first want to say that I have no opinion about the book described or the author of the book. I have not read the book and I don't know the author. For all I know, <a href="http://www.amazon.com/After-Software-Wars-Keith-Curtis/dp/0578011891">After the Software Wars</a> could be about bunny slippers. Instead, I want to be very clear that I'm arguing only with the points contained in the article.<br /><br />The article describes how open source produces superior software to a closed source model and uses, as its first example, <a href="http://www.wikipedia.org">Wikipedia</a>. It mentions that Wikipedia is not software, but uses it as an example anyway. Seriously. I can't deny that no closed source institution can provide the same quality of data as Wikipedia. However, Wikipedia deals with data, not code, and data entry can be done by anyone. It is very different from a program that requires someone know how to program before they change it.<br /><br />Next, the article uses two examples to <b>prove</b> that open source software is better than closed source: FireFox and the Linux kernel (over IE and Windows). Wow, this is the height of arrogance and a circular argument. There is no demonstrable way to prove their superiority; I doubt even 4 out of 5 dentists would agree that one is better than the other.<br /><br />The next part of the article that I find incredulous is that he believes that Google Docs will never catch on, while Linux and OpenOffice will. Yeah, sure. People are going to avoid using something that doesn't take any effort to change to, makes your data available everywhere, and is constantly updated versus something requiring a complete modification of your current computing environment, has to be shared separately, and is updated using magic incantations. While this may sound like I'm a Linux newbie, I'm not. I'm just pointing out the fact that, to most people, yum is something you say before dinner, not the way to update your programs.<br /><br />The MOST ignorant thing, however, was the following: "If Microsoft, 20 years ago, built Windows in an open way, Linux wouldn't exist, and millions of programmers would be improving it rather than competing with it."<br /><br />Yeah, right. We don't have various flavors of Linux. We don't have emacs and Xemacs. We don't have hundreds of open source projects that do the same thing in slightly different ways. Come ON! Competition is in our blood. Doing things "our way" is what makes programmers unique. You could have the most awesome open source project on the planet and someone would find a reason to fork and change it. That's just how we work. The idea that everyone will give up their belongings, join a commune, and hum "Linux is king" is not realistic. Just look how many open source programming languages there are. Look how many open source unix-like variants there are. Get a grip on reality and stop pontificating your idiotic ideals.<br /><br />Ok, next quote. "The biggest difference between Windows and Linux is that free software contains thousands of applications, installable with one click, and managed as one set." First off, I'm not sure what that means. I have never seen a Linux application that was installable with one click. I definitely prefer the Windows model of installation to the Linux model. In addition, the Windows and Linux model of uninstallation is similar, IMO, so I'm not sure what it means to be "managed as one set", nor how that differs from Windows. As for thousands of applications, that is true, but Windows also has a number of free applications and that seems to be growing as the .NET platform usage increases.<br /><br />The idea that software developers around the world will just give up the idea of profits and join together in harmony is ridiculous. Furthermore, proprietary software has benefits. You can judge the financial soundness of a company to see whether their software will be around in 10, 15, or 20 years. Just look at <a href="http://sourceforge.net">sourceforge</a> to see the number of free software projects that are abandoned.<br /><br />I believe strongly in the value of free software and open source software (and I even know the difference). However, I also believe strongly in the value of proprietary software. For a case study in what happens when you are the champion of free software, just look at Sun. Oh, you can't, <a href="http://www.oracle.com/us/corporate/press/018363">it's been bought by Oracle</a>, a closed source shop. Yeah, Microsoft should really follow in their footsteps. Sheesh.Tantonhttp://www.blogger.com/profile/08601404650352658381noreply@blogger.com1tag:blogger.com,1999:blog-13706479.post-963602251861106392009-02-23T19:42:00.001-08:002009-03-30T22:41:19.176-07:00Yahoo! InterviewI realize this write up is a bit late, seeing that I already work for Microsoft, but I wanted my interview collection to be complete, so I want to add this one and the interview with Google. Realize, that it has been six or so months since I interviewed with Yahoo!, so my memory has faded a bit. However, I'll go over what I remember.<br /><br />After my interview with Google, I didn't think I would interview with Yahoo! because it was in the same area of the country - an area I was not impressed with. However, a friend of mine, who works for Yahoo! talked me into interviewing. He said that he could show me around so that I would enjoy the area. I wasn't convinced of that, but at the least it was a free trip to see an old friend, so I decided to take him up on it. In hindsight, I'm very glad I did. First, because getting the Yahoo! offer allowed me to get other offers, but, more importantly, because my friend would passed away in December of last year and it was to be the last time I saw him.<br /><br />My friend, Nathan, submitted my resume to two groups in Yahoo! The group that contacted me was the <a href="http://hadoop.apache.org/pig/">Pig group.</a> This was fortunate, because I had just begun using Pig and <a href="http://hadoop.apache.org/core/">Hadoop</a> at work. I had also begun interacting with the Pig group through their mailing list. Therefore, I was familiar with the product and could talk about it in our very first call.<br /><br />I was actually impressed with the phone screenings for Pig. We talked about things relevant to the product, such as how to handle large memory footprints with Java and various join algorithms for large data sets. We also discussed some more trivial things such as some of the differences between C++ and Java and what a virtual function is. I actually got confused at this point and described how compilers typically implemented a virtual function instead of what they did, but we eventually sorted things out.<br /><br />After the first phone interview, I was fairly confident that things went well. This was mostly due to the fact that the interviewer told me that things went well :) She was the only phone screener to be that blunt. The next phone screener discussed process with me. We talked about TDD, documentation, program management and other things similar to that. It went well and they invited me to Silicon Valley to interview in person.<br /><br />In retrospect, the best part about going to the Yahoo! interview was getting to see Nathan again. It was the last time I was to see him before the motorcycle accident that led to his death. He took me around the coast and we picked up some strawberries and cherries at a roadside stand. He also took me for a "backstage" view of the Yahoo! scene. It appeared rather normal, other than the guy who had a mini-bar in his cube.<br /><br />Back to the interview. Like the Amazon interview, all of the Yahoo! interviews took place in the same room. The interviews varied in style, some were more puzzling (how do you find a loop in a linked list), some were more practical (tell everything you would do to design a highly available high throughput web server).<br /><br />Throughout the interview, I felt I needed far too many hints. I think I did well on the design portions, but the algorithm sections were my weak point. I ended up getting the answers, but hints were necessary. Toward the end, I was just being self-deprecating. I remember one question they asked about how many people I had recommended for hiring (not many about 3) and how many I had interviewed (lots). I made the comment that for my previous company we didn't get Stanford grads and I qualified it by saying that not even I could be a Stanford grad, I just wasn't that good. This interview plus the Google interview plus Microsoft interviews from years before had beaten me down. I was now completely convinced I was useless.<br /><br />In the end, though, I came away with the impression that the people were very intelligent and would have been great to work with. They talked about the "architect" path that I could take so that I didn't have to become a "people manager" (which sounded good). They seemed to have a great company and it would have been loads of fun. However, I didn't expect an offer.<br /><br />Surprisingly, they called not too long after the interview with an offer. By this time, I had an interview scheduled with Amazon.com and so I asked to make my decision after that point.<br /><br />As you know, I didn't choose to go to Yahoo!, but that interview and offer gave me the confidence going into the Amazon.com and Microsoft interviews. Had I not gone to the Yahoo! interview I don't know how I would have done in the other interviews. I know I would not have been as confident and that could have prevented me from getting the position I have now. For that, I'm thankful to both Yahoo! and Nathan.<br /><br />Thanks Nathan, I'll miss you, prophet!Tantonhttp://www.blogger.com/profile/08601404650352658381noreply@blogger.com2tag:blogger.com,1999:blog-13706479.post-9771383176489737082009-01-27T21:29:00.000-08:002009-01-28T23:04:05.333-08:00Short-sightednessA friend of mine sent me <a href="http://blog.wired.com/business/2009/01/why-a-google-we.html">this blog post on why google web drive won't kill windows or anything else</a>. To be honest, I'm surprised by the author's short-sightedness.<br /><br />First, Scott mentions DropBox as a pre-existing replacement for GDrive. He then points out that Google plans to tie the GDrive in to Google Docs and that DropBox doesn't currently have that functionality. However, he doesn't see that as a game changer. What he doesn't comprehend is that Google has more than just Google Docs. Google has Gmail, Calendar, YouTube, Blogger, and an ever growing number of other sites. They also have an operating system (Android). So, you'll be able to turn on your netbook and have it sync your email, documents, favorite shows and blogs, etc... immediately from the cloud. Don't think that will happen? <a href="http://gmailblog.blogspot.com/2009/01/new-in-labs-offline-gmail.html">GMail is already offering an offline syncing mechanism through Gears through GMail Labs</a> How much longer before they expand the syncing mechansim to work with other things like Google Docs, YouTube, etc... Google has consistently been able to deliver on big ideas and this one is one of the biggest.<br /><br />Scott also mentions the trust issue. Who wants Google to store their most personal documents? I think this will become less of an issue over time. Already people are using services such as <a href="http://www.carbonite.com">carbonite</a> to back thier computer up online. How much different is it to trust an encrypted Google cloud? I think this issue will stay a hot topic for a few years, but in 4 or 5 years when everyone is using the cloud more and more it will become a non-issue except for the most sensitive documents. Google is already heavily advertising its security features.<br /><br />Another issue is downtime. What happens when the cloud goes offline? Once again, I think this will be less of an issue over time as the cloud becomes more stable. Even now, how often does GMail go down? I think my internet provider goes down more often than GMail does. Moreover, I can't get much done without an internet connection anyway, so offline availability doesn't really help me out much. I think the more Google convinces people that the cloud technology is stable the more they will flock to it and use it. After all there are many benefits to cloud technology such as redundency, multi-computer availability, etc...<br /><br />Scott is right in saying that there are currently alternatives in DropBox and Windows Live Sync, but only Windows Live Sync has the capability of rivaling GDrive. Microsoft has services in its <a href="mail.live.com">hotmail mail service</a> and its <a href="http://office.live.com">online office suite</a>. They will have to continue to integrate those into the cloud to keep up with Google. Not only that, but if they could integrate their next XBox platform into the cloud so that you could store your games on the cloud (or just download them directly from the cloud) then that would be a big plus and something that Google can't currently rival. Having a home media system synced to Microsoft's cloud could promote using the Microsoft cloud for other things such as mail and documents.<br /><br />I certainly believe in Microsoft's ability to beat back the Google threat, but I'm not narrow minded enough to think that GDrive is not a threat. It is the backbone of the internet operating system that Google is building to take on Microsoft.Tantonhttp://www.blogger.com/profile/08601404650352658381noreply@blogger.com2tag:blogger.com,1999:blog-13706479.post-21226967677197963262009-01-26T23:47:00.001-08:002009-01-27T00:34:03.047-08:00The Google ThreatDisclaimer: I work for Microsoft on their <a href="www.live.com">Live Search</a> product. In no way is what I'm blogging about representative of the actual views of Microsoft. I'm much too low level to have any input or insight into Microsoft's thought process.<br /><br />I see a lot of people on various message boards comment on how Microsoft should stop funding Live Search and Online Services. Many people say that Microsoft should just focus on what they do best (developer tools, operating systems, and office) and ignore this whole "Internet Thing (TM)". Microsoft loses millions of dollars a year competing with the Google Behemouth with very little to show for it in terms of market share. Why not just cut your losses, spin off the division, and let it die a horrible death?<br /><br />I'll tell you why. Google is Microsoft's biggest threat. Google threatens Microsoft's operating system dominance, their developer tools dominance, and their office dominance. If this were the Civil War, Google would be the North. They are the ones competing on Microsoft's home turf. They are trying to burn Atlanta, and some would say they are succeeding. As a Microsoft employee, I am not at all scared of Apple. They will continue to tinker with their iPhone and Macs and a few hardcore Apple fans will always be there to keep them going. Don't get me wrong, I think the iPhone is a huge improvement. I own one. I like it (but don't love it). However, Apple isn't making inroads into Microsoft's core. Objective C is not the Visual Studio killer and OS X won't kill Windows. Apple wants to produce the "perfect system". And that's fine. They'll end up creating something very beautiful that will be mimiced by others, but it will take them years to do so and they'll do so single mindedly. They won't be diverse enough to kill the Microsoft behemouth. Google, on the other hand, is thinking big. They have a plan that goes after all of Microsoft's core competencies and they are taking the fight to MS.<br /><br />Let's look at a few examples: <br /><br />1. Office vs Google Apps for Business - Take a look at a number of <a href="http://www.google.com/apps/intl/en/business/customers.html">business that are evaluating or have switched to Google Apps for Business</a>. Now a few things have to be said. Many of these companies are using Google Aps in addition to MS Office. They are using Office for thier internal communications and confidential emails and Google Aps for less sensitive material. For now, that is the best they can do. In addition, many of the companies are switching from other systems such as sendmail, so that's not a direct gain against MS. Nevertheless, how long is it before Google provides encrypted email and a guarantee of privacy? How long before they win a big MS client and other companies start looking at the cheaper Gmail system with reduced administrative costs? This is an obvious attack and one that is gaining momentum.<br /><br />2. Visual Studio vs Google Web Toolkit - This is a bit of a misclassification. Really, <a href="http://code.google.com/webtoolkit/">Google Web Toolkit</a> is more of an attack on Microsoft's <a href="http://www.microsoft.com/azure">Azure Platform</a> than on Visual Studio itself. However, Visual Studio is included in the assault. With Eclipse, Google Web Toolkit, and many libraries such as jUnit, Guice, etc... Google has teamed up with the Open Source community to take on MS. Google wants developers to develop on its "platform" just like Microsfot wants developers to develop on its "platform". That is why Microsoft developed <a href="http://silverlight.net">Silverlight</a>. Silverlight allows developers to take their .NET familiarity and transfer it to the browser. This keeps people in the Microsoft environment. Google takes the same approach. They want people to use its services, so they provide the Google Web Toolkit to keep people in their environment. It's also a good testing ground for larger conquests, providing computing power and frameworks for the enterprise. Once developers become comfortable with the Google environment, it will be an easy transition to open up their cloud to businesses and allow them to develop and deploy on it.<br /><br />3. Windows vs Android - Shouldn't this be Windows Mobile vs Android? <b>No</b>, definitley not. Android is a direct attack on Windows and the desktop. Already many people are speculating that Android will be released on netbooks soon.<br /><br />See <a href="http://d0od.blogspot.com/2008/12/android-netbook-coming-early-next-year.html">Android notebook coming early next year?</a>, <a href="http://education.zdnet.com/?p=1970">Android netbooks? Wouldn't it be lovely</a>, and <a href="http://www.theinquirer.net/inquirer/news/209/1050209/android-netbook-is-a-possibility">Android netbook is a possibility</a>. Google will use their operating system to keep your information and applications in the cloud and you will be able to access them from any computer, especially your Android netbook. You'll log in and immediately see your desktop with your applications that are stored on the cloud. When you click on an application, it will download and begin running immediately (though many applications will still work through the web, like GMail, blogger, etc...). <a href="http://www.thevarguy.com/2008/10/24/linux-netbooks-impact-microsoft-sales/">Netbooks are already taking a chunk out of Microsoft's sales</a> and having Google's name on it will only increase sales. Also see this article on how <a href="http://blogs.computerworld.com/microsoft_layoffs_netbooks_sales_are_killing_us">Netbooks sales are killing Microsoft</a>.<br /><br />I haven't tried to paint bleak picture on purpose. Instead, I was trying to show that Google is taking the battle to Microsoft and Microsoft must respond. Search, in particular <a href="http://www.live.com">Live Search</a> is a key component to that. But, it is not the only component. <a href="http://www.microsoft.com/windows/windows-7/">Windows 7</a> and Azure are other key components. In the future, people's computers will live on the cloud. Search will go beyond finding web pages. Instead, you'll perform searches for applications that will fit with your current settings. You might even rebuild your OS components in the cloud specifically to fit your library versions. You'll search for a song and not only get an mp3, but also a list of movies that you own that have that song in them. You might, if your search options are set correctly, even get a list of similar songs, or songs you played before or after that song. Search is the backbone of the next generation computer and the next generation HCI. Google, I believe, backed into this and is now expanding it to its inevitable conclusion. Microsoft realized it after the fact and is rushing to catch up. Regardless, we need competition and I believe that Microsoft has the resources and the dedication to provide that competition.<br /><br />Needless to say, the things I outlined above are not going to happen overnight, but Google is taking a long term view. So is Microsoft. Google is using their advertising revenue to subsidize their desktop pursuits. Microsoft is using their desktop revenue to subsidize thier advertising pursuits. Both are in it for the long haul. It will take years for Google to implement some of the things I discussed above. I expect 8-10 years will pass before all of our data and programs live in the cloud. I expect another 10 years will pass before most businesses data and programs live in the cloud. Both companies will be here after that time has passed, which company will be the dominant one? I have no idea, but it will be exciting to find out!Tantonhttp://www.blogger.com/profile/08601404650352658381noreply@blogger.com0tag:blogger.com,1999:blog-13706479.post-4188751188906942462009-01-10T16:45:00.000-08:002009-05-28T00:15:44.952-07:00Browser ToolbarsRecently, Microsoft announced <a href="http://ces.cnet.com/8301-19167_1-10135067-100.html">a deal with Dell to distribute the MSN toolbar with new computer purchases</a>. This comes after previous announcements with <a href="http://www.pcworld.com/article/153589/msn_sun_deal.html">Sun</a> and <a href="http://www.microsoft.com/presspass/press/2007/mar07/03-13LenovoLivePR.mspx">Lenovo</a>. While I am excited about the traffic this will bring to <a href="http://www.live.com">Live Search</a>, I have to say that I hate browser toolbars. Seriously, what good are they? Most browsers already have the functinality that the toolbar provides: search box, term highlighting, etc... The MSN Toolbar does provide a few interesting twists like automatically launching Live Messenger, but on the whole, who needs them? They just use up space and memory. My wife's computer has both the Yahoo! toolbar and the Google toolbar on it. I have to go take them both off now...<br /><br />You know, what I'd really like is a browser that prohibits toolbars, that I could use. And while I'm on that topic, over Christmas I installed extra RAM in my father-in-laws computer because it was going slow (it only had 256 MB of RAM). I also noticed that he hadn't upgraded from IE 6 and had some Yahoo! toolbar that provided virtual tabs of some sort. Why hadn't the browser updated itself to IE7? Seriously, why doesn't our software just fix itself? Why don't my drivers automatically update? ARRRGGG!!!!<br /><br />Ok, I feel better.Tantonhttp://www.blogger.com/profile/08601404650352658381noreply@blogger.com0tag:blogger.com,1999:blog-13706479.post-62058697725276230532009-01-09T22:52:00.000-08:002009-01-09T22:53:04.459-08:00New LayoutAs you can tell, I picked a new layout from blogger. Let me know what you think.Tantonhttp://www.blogger.com/profile/08601404650352658381noreply@blogger.com0tag:blogger.com,1999:blog-13706479.post-68886446650032879812009-01-08T07:01:00.000-08:002009-01-09T22:51:47.641-08:00Rules for running an IT organizationThe last post was how to run a research organization. In this post, I'm going to set my sights even higher and tell how to run an IT organization. These rules have been picked through my studies of various companies.<br /><br />1. <b>Hire the best people</b> - I've harped on this before. So have <a href="http://www.joelonsoftware.com/articles/HighNotes.html">others</a> and <a href="http://www.artima.com/weblogs/viewpost.jsp?thread=4738">others</a> and still <a href="http://blogs.construx.com/blogs/stevemcc/archive/2008/03/27/productivity-variations-among-software-developers-and-teams-the-origin-of-quot-10x-quot.aspx">others</a>. If you don't know by now that there is at least a 10x difference between the top programmers and everyone else then you haven't been paying attention. I can't say much on this topic that hasn't already been written, but I will point out that you need to be proactive about hiring the right people. It's not just the <a href="http://money.cnn.com/galleries/2008/fortune/0801/gallery.BestCo_Google_8.fortune/9.html">free food</a>. It's about providing employees with incentives to do <i>great</i> work. If you just need a warm body, then provide him with a steady paycheck. But if you work in IT, you don't want warm bodies, they are not in the 10x group. You want the best, so you have to make it worth it. You have to make them feel important and wanted. You have to put effort into finding them at the top colleges, recruting them, and retaining them. If you are a small company, you can provide stock options. A large company? You can provide free food :-) Either way, you have to provide challenging problems, a sense of ownership, and other fantastic people to work with. Remember, if you have ten of the 10x group that is equivalent to one-hundred of everyone else. If you don't think that is true because of parallelism, etc... you are wrong. Parallelism doesn't apply because the communication pathways increase leading to <a href="http://portal.acm.org/citation.cfm?id=1010809.1010812&coll=GUIDE&dl=GUIDE">lower overall productivity</a>. Just like you don't get a linear increase with most parallel algorithms, the same applies for programmers. The <a href="http://en.wikipedia.org/wiki/Brooks'_law">communication overhead gets in the way</a>. Therefore, with ten 10x programmers you can be <b>more productive</b> than with one-hundred other programmers. And you don't even have to pay them 10x as much, though you will have to pay some extra. With the savings, you can provide more stock options or free food :-)<br /><br />2. <b>Make the source available to all</b> - Everyone in the company should have access to all the source code. At Google, the designers of the library can easily update it, because they can open everyone else's code up in eclipse, choose refactor, and then save and recommit it. They are <a href="http://butunclebob.com/ArticleS.UncleBob.ThePrimeDirectiveOfAgileDevelopment">not blocked.</a> In addition, an open code base implies group accountability. Too often, programmers get too attached to their work. They don't see the flaws that are inevitable in their programs. An open code base allows everyone to view and comment on everyone else's work. It forces programmers to realize that they are mortal and make mistakes. Eventually, they will come to know that the group is better than the individual and their work improves due to peer review. Forcing an open code base allows this to happen sooner and with more acceptance.<br /><br />3. <b>Dedication to infrastructure</b> - Who is responsible for the build system? Who writes the core infrastructure components? Who sets up the distributed computing system? Who determines which dependency injection framework should be used? All of these are core infrastructure decisions and they all matter. As we'll see in a future bullet point, standardizing the infrastructure is vital. You want your application programmers to focus on their individual application. If every application programmer has to focus on their infrastructure, then you are losing 3 to 6 months out of every project. If it takes a week to set up an automated build system and a week to attach the test harness and another week to set up the distributed key/value store, then you have lost 3 weeks of your project to things that have to occur for nearly every project! Instead, you want application programmers to think about their application. You want them to worry about delighting their customers. They need an automated build system, but they shouldn't have to think about which one to use, how to set it up, or what happens when it isn't working. That is infrastructure. In the past, there were extra teams responsible for hardware, networking, and OS setup. These were not the responsibility of programmers. Now, we're adding additional layers. The build system, test framework, and distributed computing platform are additional infrastructure components that must be standardized and managed elsewhere. There could be additional infrastructure components for your organization as well. For instance, <a href="http://code.google.com/p/google-guice/">Google uses dependency injection so often that they wrote their own framework for it.</a> Notice that I didn't say every team wrote their own framework. Instead, one team wrote it and maintains it and everyone else uses it. This consistency and willingness to use other people's work makes for a successful company. As another example, Google has a <a href="http://code.google.com/p/google-collections/">Java collections library</a> that the company uses. Every team can take advantage of this without having to rewrite it. <b><i>In other words, the goal of the infrastructure group is to find and eliminate duplication throughout the company.</i></b> This could be with hardware, applications, or libraries. Regardless, duplication is the enemy of the IT organization and it must be eliminated!<br /><br />4. <b>Repeatability</b> - Everything that is put into production must be a repeatable process. Not only that, but it must be repeatable by someone else! This means both applications and documentation must be written and available that show how to repeat it. Once again, we're trying to seek out and eliminate duplication. Programmers in the future shouldn't have to reverse engineer or re-create your application. If it is worth putting into production, then it is worth documenting and ensuring repeatability.<br /><br />5. <b>Enforcing standards</b> - You want programmers to feel empowered, but you also want productivity. You need standards to ensure the latter, but you need only the <i>right</i> standards to ensure the former. Standardizing on one build system (perhaps per language) ensures that everyone can access and build everyone else's code. Standardizing on a common base class ensures pandamonium. You want to standardize tools, not techniques. Not only does this allow programmers to quickly move from one project to the next, but it also provides continual feedback and improvement on your internal tools. When a programmer says, "Tool X doesn't provide capability Y so I'll write my own" you are in for disaster. Now, every project begins with a 3 week tool writing cycle. Instead, if the programmer would just fix Tool X then everyone else can take advantage of capability Y. Libraries work the same way. Pick a dependency injection library and use it across the organization. It doesn't matter if one team happens to like Spring over Guice. They are both open source and you can alter it to suit your needs. Just pick one and be consistent. <b><i>Get everyone moving in the same direction.</i></b> That way, when they increase others' velocity <b><i>they move in that direction even faster</i></b>.<br /><br />6. <b>Don't start from scratch</b> - If nothing exists, then you have to start from scratch. However, if you have a working product, then <a href="http://www.joelonsoftware.com/articles/fog0000000069.html">don't start rewriting it from scratch</a>. The only thing you do is create new bugs that you don't know about instead of fixing the old ones you already knew about. Now, that doesn't mean that you shouldn't take a troublesome component and rewrite it. That doesn't even mean that over the course of a year you don't eventually rewrite 90% of the application. It does mean that you work piecemeal, with <a href="http://www.amazon.com/Working-Effectively-Legacy-Robert-Martin/dp/0131177052">legacy code</a>. You create tests, if you don't have them. You write documents, if you don't have them. You continually improve the product you have. Then, when you are ready, you begin <a href="http://www.refactoring.com/">refactoring</a>. You improve its structure a little bit at a time. Just enough to add your new functionality with new tests. Then a little more and a little more. Eventually, your crufty working system blossoms into a beautiful piece of artwork. Well, you'll think so anyway, but the next developer won't understand why you did X, Y, and Z and he'll want to rewrite it from scratch. That's the problem and the point. When we don't understand how something works, we want to rewrite it so that we do. However, the next maintainner doesn't understand it either, so the rewrite circle continues and is vicious. If something works, use it, clean it, modify it. Don't rewrite it.<br /><br />7. <b>Be dedicated to testing</b> - The best organizations have dedicated testers. This is not a coincidence. Recognizing quality as a core attribute of a product is vital to having a quality product. Manufacturing companies have known this forever. Why is it that IT shops think they can ignore quality and still have a quality product? Google's Chrome has <a href="http://velocipeek.com/2008/09/02/new-browser-google-chrome/">unit tests for highly ranked web pages, automated UI testing, and random input testing</a>. Not only that, but they also ran other test suites against it. For instance, it passes 99% of webkit's layout tests and passes all but 2 of jQuery's unit tests. Quality is a core attribute. At Microsoft, there is a <a href="http://blogs.msdn.com/jobsblog/archive/2004/05/27/143419.aspx">Software Development in Test job role.</a> Each team is assigned one or more of these resources to ensure they deliver a quality product. These people are top notch programmers that love to break things. They are not random guys off the street. They can code just as well as the SDE's and it is vital that they can do so. Testing today is about coding. It is about <a href="http://butunclebob.com/ArticleS.UncleBob.TheSensitivityProblem">double entry bookkeeping</a>. It is about automation and repeatability. People expect thier products to work, out of the box. They expect future releases to be backwards compatible. They expect a quality product. To delivery that, quality must be a feature. The organization must be dedicated to quality - having a special testing division is one way to commit to that level of dedication.<br /><br />8. <b>Metrics</b> - "<i>In God we trust, all others bring data.</i>" Metrics are at the core of process improvement. How can you possibly know if you are improving if you don't measure that improvement? Would you be satisfied with your water treatment plant if it told you the water quality was improving because it looked a bit clearer? No. You'd want to know the Ph levels, the amount of sediment in the water, etc... You expect a quality product to have metrics that back up its quality. If speed is a feature, then you'd expect metrics around how fast the product will go in certain conditions. If accuracy is a feature, then you'd expect benchmarks showing the accuracy against other products or human judges. In all cases, metrics are vital to a product in order to show improvement and achievement of goals. The one caveat is to be sure you are measuring the right thing. It is inevitable that programmers will find a way to improve the metrics. If the metrics are measuring the right thing, then that is great. If the metrics are measuring the wrong thing, say lines of code, then you have a recipe for disaster. Make sure that your metrics are measuring externally visible things, not internal ones. You want improvements to your metrics to affect the customer, not your programmer's salary. <a href="http://thedailywtf.com/Articles/Productivity-20.aspx">Everyone cheats the system</a>, you want those cheats to have a positive impact on your final product.<br /><br />Well, there you have it. 8 rules for running an IT organization. Hopefully they will make your company the next IT powerhouse!Tantonhttp://www.blogger.com/profile/08601404650352658381noreply@blogger.com0tag:blogger.com,1999:blog-13706479.post-72294124904573495792009-01-06T22:44:00.000-08:002010-05-07T15:40:13.166-07:00Applied ResearchAt one point in my career, I had the experience of being on an applied research team. In fact, I was one of its founding members. At the time, I wasn't sure what applied research was; even now, I can't say for sure I know.<br /><br />For our team, applied research was new product development. Honestly, I think that had disastrous effects. We were in limbo between delivering a new product and maintaining our "research" mantra. In the end, we wanted product teams to adopt and maintain our product. This, too, led to tension. Product teams want to feel comfortable with what they will eventually own. They want to use and support things they have used and supported in the past. Research products are wild-cards and not to be used unless nothing else like it exists. Even then, most product teams will choose to rewrite it. Take, for instance, <a href="http://hadoop.apache.org/pig/">Pig</a>. Pig is a dataflow language created by Yahoo! Research to run on <a href="http://hadoop.apache.org">Hadoop</a>. It was created to prove a point, but it was also created to be used. However, once it transfered to a product team in Yahoo!, it was scheduled for rewrite. I'm not sure the cause. It could be <a href="http://en.wikipedia.org/wiki/Not_Invented_Here">Not Invented Here</a> syndrome. It could be that research teams are not focused on the long term, so they deliver a short term product. It could be that research teams don't know how to code or that product teams and research teams speak a different language, so they can't see eye to eye. Regardless, having a research team deliver to a product team is doomed to failure, if you count failure as an eventual rewrite of the product or technology.<br /><br />To help guide my thoughts on this matter, I had the good fortune to speak to <a href="http://en.wikipedia.org/wiki/Hector_Garcia_Molina">Hector Garcia-Molina</a> of Stanford University. If you don't know who this guy is, you are missing out. Stop and go read the wikipedia entry linked to above. He recounted to me his description of what a research organization should do. I'll recount here and embelish a little.<br /><br />First, a research organization should publish. The benefit of publishing is that it brings notariety/publicity to your organization. The company's sales force can go to battle with slides that reference conference proceedings. Of course, no sales person would read the proceedings, but it does make their presentation look legit. In addition, presenting at conferences allows the researches to make the aquantence of people like Dr. Garcia-Molina and bring new insight and innovations back. Finally, publishing creates an attractive employment environment. New graduates from top schools want to go to a place that has a publishing history so that they can continue their research. To get a graduate of MIT or Stanford, you need a publication record. I'll add one more to his list. I think a research department that publishes shows a commitment to innovation by the company; a commitment that roots itself in the culture and makes the company a hotbed of innovation.<br /><br />Second, a research organization can be used as a SWAT force. Tackling a hard problem or subset of the problem. I think this can be the area where the most "good" can be done internally. Instead of creating a product, create an extension to an existing product. There are always "next version" features that never get created. These features either provide too little value or are too difficult. It is that latter segment where the research department can really shine. Since they are not constrained by time to market, etc..., the research department can think outside the box and take the time to create an "academic" solution. For example, <a href="http://en.wikipedia.org/wiki/PageRank">PageRank</a> was an academic solution to the problem of which web sites were more popular. It is a beautiful recursive algorithm that just happens to produce great results. Is it a perfect algorithm? No, of course not. Was it better than the "engineering" algorithms of the time? You betcha! It was what happened when two academics got together and had the time to think about the problem. They realized the probelm was similar to that of research paper citations, so they devised an algorithm that treated the problem thusly. Had they had to meet an arbitrary deadline so that their employer could make the trade show deadline, they would not have come up with PageRank. That is the benefit of a research team. Not to create some fancy product for the trade show, but to take the existing product the next step. To finish out the "next version" features and do so elegantly.<br /><br />The final task for a research organization is to benefit the company at large. There are many ways to do this. One is to create best practices and spread them out to the other development teams. Another is to investigate various technologies and report on how they could/should be used throughout the company. An additional way could be to create the infrastructure to ensure developer productivity if no other team is responsible for it. Do developers have access to distributed key/value stores? If not, install <a href="http://memcachedb.org/">MemcacheDB</a> or <a href="http://couchdb.apache.org/">CouchDB</a>, and help developers to connect to it by creating modules in various languages. Do developers understand and have access to technologies like Hadoop and Pig? If not, create demos and give a roadshow. All of these things lay in the "best practices" umbrella and often organizations don't have the teams in place to create and distribute the "know-how" required to use them.<br /><br />In all three cases, the applied research team stayed away from the product team's core product. Instead, the research team focuses on small, manageable pieces that fit nicely into the strategy already outlined by the product team. This creates trust and will foster future collaborations between the product and research teams.<br /><br />Good luck and let me know of your experiences dealing with research teams!Tantonhttp://www.blogger.com/profile/08601404650352658381noreply@blogger.com2tag:blogger.com,1999:blog-13706479.post-91150811747507192892009-01-03T15:50:00.000-08:002009-01-03T15:51:49.096-08:00Gay BoyfriendI'm not sure which one I like the best<br /><br /><a href="http://www.youtube.com/watch?v=38UnUqIDY5w&NR=1">dorky fan version</a><br /><a href="http://www.youtube.com/watch?v=7nAond4ZQHQ">dorky house version</a>Tantonhttp://www.blogger.com/profile/08601404650352658381noreply@blogger.com0tag:blogger.com,1999:blog-13706479.post-56227521608842005172009-01-03T13:34:00.000-08:002009-01-03T13:35:01.051-08:00Ouch<a href="http://searchengineland.com/report-microsoft-to-lay-off-15000-workers-15986">I hope not</a>Tantonhttp://www.blogger.com/profile/08601404650352658381noreply@blogger.com1tag:blogger.com,1999:blog-13706479.post-24597543367041226432009-01-01T19:30:00.001-08:002009-01-01T19:32:52.734-08:00Facebook lamentI have too many facebook friends. I lament it. I only have about 5 that I actually want to monitor and communicate with; however, when people request friendship I don't want to say 'no, I care nothing for you.' I really want a "preferred facebook" view where I can just track and interact with those I care to. One would think that it is not that big of a deal, but it really is. For instance, I just went to superpoke a friend of mine and it took far too long because I had to find that person in my list of friends (and I don't have *that* many). It actually reduces the amount of time I spend on facebook.<br /><br />Less is more.Tantonhttp://www.blogger.com/profile/08601404650352658381noreply@blogger.com1tag:blogger.com,1999:blog-13706479.post-73930891583494385802009-01-01T17:51:00.000-08:002009-01-01T18:40:34.497-08:00Infinities and SeriesThose of you who read this blog (all 1 of you!) know that the number of integers is infinite and the number of irrational numbers is infinite, but the latter infinity is greater than the former infinity. I tend to think of this as mathematical shenanigans. The idea that one infinity is larger than another just doesn't meet the "beauty" test that accompanies mathematics. In the past, I've argued that infinities don't exist, so we can make contradicting remarks about them to our hearts content. It's similar to asking the question "Can God make a rock so big even he can't lift it?" The words make sense and are in the right order, but the semantics of the sentence are off. They produce a <a href="http://en.wikipedia.org/wiki/Barber_paradox">barber paradox</a> that belongs to the realm of meaninglessness. They show that <a href="http://en.wikipedia.org/wiki/Goedel">Goedel</a> is alive and well and relevant for today's meta-mathematical problems, if only we'd heed his words. Ok, back to infinities.<br /><br />First, can we create a more intuitive reason for why one infinity might be greater than the other, a reason that doesn't fall back on establishing a one-to-one correspondence with the integers?<br /><br />First, let's establish that the integers exist in one-dimensional space. In fact, they exist on a number line which is the definition of one-dimensional space :-) But, let's consider a slightly different definition of dimensionality. In this definition, we'll look at the number of infinite dimensions. In the case of integers, the length of the integer is finite. No matter how big the integer becomes, there is always a finite number of digits. Even if the integer explodes to a googolplex digits, there is still a finite number of them. Therefore, the only infinity is in how many integers there are, the size of the actual integer is finite. So, there is only one dimension of infinity.<br /><br />Let's now look at rational numbers. In the case of rational numbers you might say that there are two dimensions of infinities. The first dimension is the number of rational numbers. There are an infinite number of rational numbers. The second dimension is that some rational numbers have an infinite decimal expansion. For example, 1/3 has an infinite expansion of 0.333333333... Therefore, rational numbers have two dimensions of infinity and should be larger than integral numbers, right? Not so fast. That's just their decimal expansion. If you keep them in their functional form, then we get a different story. All rational numbers can be expressed as the division of two integers. Moreover, we know that both integers have a finite number of digits. Finally, we know that adding two integers with a finite number of digits will produce a third integer with a finite number of digits. Therefore, there is a representation that is finite in length for every rational number. That leads to the logical conclusion that all rational numbers have one dimension of infinity.<br /><br />Next up, irrational numbers. Irrational numbers extend to positive and negative infinity, giving one dimension of infinity. In addition, they have an infinite expansion <i>in every base</i>, which gives them a second dimension of infinity. So, we can easily see why there are more irrational numbers than rational numbers, because we allow irrational numbers to have an infinite expansion!<br /><br />So, if we can't represent irrational numbers with a fixed number of rational numbers, what can we represent them with? Why, an infinite number of rational numbers, of course! For example, PI can be represented by the following series (<a href="http://functions.wolfram.com/Constants/Pi/06/01/01/">one of many</a>): PI = 4 * (SUM[k=0 to inf] (-1^k)/(2k+1))<br /><br />So, in essence, we have an infinite set of numbers each composed of an infinite set of numbers. Two dimensions of infinity!<br /><br />But wait! If we can create a series to represent each irrational number, does that mean that there exists a representation that is not infinite and therefore we can count them, similar to the rational numbers above? No. With rational numbers there was a <i>finite</i> number of integers that created the rational number. With irrational numbers there is an <i>infinite</i> number of rational numbers.<br /><br />So, it is true that the number of irrational numbers exceeds the number of rational numbers, right? Well, maybe. I think it is fair to say that an infinitely expanded irrational number doesn't exist, so we're back to the land of Goedel. It is worth thinking of an irrational number as a function of an infinite number of rational numbers much the same as a rational number is a function (division) of two integers. Functions are often useful in mathematical manipulations, but that doesn't make them "real". The number 3 is a physical, real number. You can count out 3 things. The number PI is not a physical, real number. We can only approximate it. In fact, complex analysis is based around the number i, which is a function (sqrt) applied to -1. As long as we don't expand the function, we can do mathematics with it, but if we ever need to expand it our equations blow up. The same thing is true with irrational numbers, they are mathematical niceties. Abstractions that we can manipulate as long as we don't look too closely. Similarly, questions about abstractions such as if one abstraction is infinitely larger than another abstraction requires you to look to closely, so you get crazy results, just like if you had really taken the sqrt of -1 or divided by infinity (another function).<br /><br />So, the next time you see PI, take it for what it is, a function that can be evaluated to the necessary precision. A mathematical abstraction that can be admired from afar. Just don't get too close.Tantonhttp://www.blogger.com/profile/08601404650352658381noreply@blogger.com0tag:blogger.com,1999:blog-13706479.post-42447688294009506412008-12-30T18:40:00.000-08:002008-12-30T20:03:47.417-08:00North vs SouthI've been in the Pacific Northwest for four months now and I thought I'd share a few of the differences I've noticed.<br /><br /><ol><br /><li>In the South, we have sweet tea. In fact, we have most any fattening item you can imagine: gravy, lard, fatback, etc... In the Northwest, everyone drinks their tea unsweetened and even IHOP lists the number of calories in their food.</li><br /><li>In the South, you drive everywhere. If you take the bus or walk you are most likely poor and almost always frowned upon. In the Northwest, you are hailed as a hero and considered "green".</li><br /><li>In the South, PTA was for the crazies who had nothing better to do with their money. In the Northwest, our PTA paticipation is at 100% for the third year straight.</li><br /><li>In the South, the kids look forward to deer season. In the Northwest, the kids look forward to the new Star Trek movie.</li><br /><li>In the South, teachers send letters home with the children. In the Northwest, teachers email the parents</li><br /><li>In the South, we get our coffee from McDonalds. In the Northwest, the city would shut down if Starbucks closed.</li><br /><li>In the South, the biggest technical gathering is when Ma Potter drops the security on her wireless router. In the Northwest, you are constantly bombarded with invites to technical events.</li><br /><li>In the South, a top IT graduate comes from Vanderbilt. In the Northwest, a mediocre hire comes from Berkeley.</li><br /><li>In the South, the churches are dense, huge and filled with Southerners. In the Northwest, the churches are sparse, huge and filled with former Southerners.</li><br /></ol><br /><br />I'll pause here and reflect on a few things. First, with regards to schools, it is easy to find a correlation between money spent and quality. The schools in the Northwest are better funded. Heck, my daughter's school here has a buffet! However, those people who feel that spending more on education will fix it have missed the boat. The real issue is parental involvement and peer pressure. In our schools the children challenge each other and the parents are involved. At our PTA social events nearly everyone is there. We, and the children, want each other to succeed. No amount of money will make kids want to have a read-in instead of play outside. No amount of money will make kids come to school dressed as their favorite storybook character instead of their favorite pop-star. No amount of money will make kids succeed. It takes dedicated parents. Moreover, it takes a school full of dedicated parents. Otherwise, you will run into the problems faced by other behavioral economists. The smart kid with dedicated parents will be ostracized. He or she will be considered an outcast. After all, they aren't going to be staying around after graduation, so why invest your friendship in them? You need an entire school full of dedicated children and dedicated parents in order to succeed. Money won't help, changing the culture is required.<br /><br />Secondly, you can see the failure of the church in the Northwest. The educated, affluent people avoid the church while the Southerners flock to it. I think there are a number of factors at play here. First, the larger churches are getting the publicity and they are taking a stance against education. I have personally been in a church where the pastor said that anyone who believed in the Big Bang is going to hell. I didn't go back to that church. However, if a church accepts everyone and everything then there is no point in going. You can socialize on the net. So, there is no middle ground. The educated people are turned off from the backwards southern denominations and have no reason to attend the more "progressive"/"liberal" variants. If higher education becomes the norm in the South (which is a big question mark), then the church as we know it is doomed. The church must find its way in a new era. It must bridge what we know to be true, scientifically, with what we believe to be true, spiritually. It must exclude certain things as immoral, even though it accepts them civically. For instance, homosexuality is banned in the Bible. However, so is adultery. No churchmember protests the legality of adultery; hell, half of them have committed it themselves. But homosexuality is an abomination! The same goes with other moral sins such as lying and blaspheming. The church needs to realize that it does NOT have a civic duty to outlaw immoral behavior. No one can legislate morality and those that do are seen as haughty and hippocritical. Instead, they should accept that the world's morality and the church's morality are different. Christians are "sanctified". Before Christianity, to sanctify something was simply to set it apart; there was no religious meaning. If the church gets to legislate everything, then there is no more sanctification; we are just like everyone else and that is not our mandate. We are to work in the world and change the people. That can only be done by example. Right now, we're not setting a good example. It won't be long until the church is completely irrelevant outside a few poor areas where their only role is to give the poor hope.<br /><br />In total, I've really enjoyed living in the North. I have no idea if I'll stay here long term, but it's been a great experience so far and I'm glad I was given the opportunity.Tantonhttp://www.blogger.com/profile/08601404650352658381noreply@blogger.com0tag:blogger.com,1999:blog-13706479.post-33301960667454970022008-11-23T03:35:00.000-08:002008-11-23T04:24:24.646-08:00C# AwesomenessAs you can imagine, my <a href="http://www.live.com">current employer</a> gives me a number of opportunities to work in C#. I've really been enjoying myself, but only scratching the surface of what C# was capable of. So, tonight, I tried a few more interesting ideas that use the C# anonymous types and lambda function capabilities.<br /><br />The first one is a pretty simple copy of <a href="http://www.ruby-doc.org/core/classes/IO.html#M002280">ruby's IO.each_line</a> function. My goal is to have the C# function encapsulate the logic of opening and closing the file and me pass in a lambda that does the processing I want (just like Ruby's).<br /><br />Here's the code<br /><pre><br />1 public delegate void IOProcessor<T>(T line);<br />2 public static void ForEachLine(string fileName, IOProcessor<string> processor)<br />3 {<br />4 using (StreamReader reader = new StreamReader(fileName, Encoding.UTF8))<br />5 {<br />6 while (!reader.EndOfStream)<br />7 {<br />8 processor(reader.ReadLine());<br />9 }<br />10 }<br />11 }<br /></pre><br /><br />First, I declare a delegate. In C or C++, it would be a function pointer. Here, it is more than that because it can be generic, which is utter coolness in a box. We'll see the point of the genericity in a moment.<br /><br />The next line declares my function which takes the file name and the delegate (we will be giving it a lambda.) Here, we explicitly set the generic parameter to a string because we know that is what we are retrieving from the file.<br /><br />The using statement opens the file, specifying a UTF-8 encoding. It will also ensure the file is closed whether or not an exception occurs.<br /><br />Finally, we have a loop that reads each line and passes it to the delegate until we run out of lines. Very simple and straightforward.<br /><br />If we wanted to use this code to sum up the lines in a file we could write code like the following.<br /><br /><pre><br />1 int sum = 0;<br />2 <br />3 ForEachLine("my_integers.txt", (line) => { sum += int.Parse(line); });<br /></pre><br /><br/><br/><br />After line 3 finishes, sum contains the sum of each line in the file.<br />For instance, if the file was<br />10<br />20<br />30<br />40<br />Then sum would be 100.<br /><br />Another thing I do a lot of is handle delimited files. Usually, I'll open one up, perform a line by line manipulation of the file, and close it back. Of course, the obvious string.Split() method comes to mind, but that is somewhat unsatisfactory because you are still dealing with integer offsets into an array. How do I know that offset 3 is the anchor text and offset 7 is the ubercool feature? It would be nice, if I could specify their names in the beginning and then work with objects.<br /><br />So, to handle that, I created a function that would objectify my delimited files.<br /><br />Here goes:<br /><pre><br />1 public static IEnumerable<T> EachDelimitedLine<T>(<br />2 string fileName, char delimiter, T outputObject)<br />3 {<br />4 Type outputType = outputObject.GetType();<br />5 using (StreamReader reader = new StreamReader(fileName, Encoding.UTF8))<br />6 {<br />7 while (!reader.EndOfStream)<br />8 {<br />9 string[] fields = reader.ReadLine().Split(delimiter);<br />10 yield return (T) Activator.CreateInstance(outputType, fields);<br />11 }<br />12 }<br />13 }<br /></pre><br /><br />I'll break this function down line by line in the next blog. Specifically, it takes in a prototype object called outputObject and creates an object like that from each line of the delimited file, using the strings after splitting to initialize the object. I call this function like<br /><br /><pre><br />1 foreach(var x in <br />2 EachDelimitedLine("delimitedFile.txt", ',', <br />3 new { Title = "", Body = "", Anchor = "" }) <br />4 {<br />5 if (x.Title == "Thoughts of Me")<br />6 {<br />7 // do something with my blog...<br />8 }<br />9 }<br /></pre><br /><br />As you can see, I specify a prototype object of an anonymous type and my code uses that prototype to create objects from the delimited file. Of course, in production code you would want checks for too few fields or too many fields so that you don't get the weird error messages you would get from this code by default. However, I think it gives you a flavor of the power of C#.<br /><br />Now, for the final piece, we combine the ideas of the ForEachLine function and the EachDelimitedLine function to get a ForEachDelimitedLine Function. This also shows you the power of the generic delegate.<br /><br /><pre><br />1 public static void ForEachDelimitedLine<T>(<br />2 string fileName, char delimter, T outputObject, IOProcessor<T> processor)<br />3 {<br />4 foreach (var x in EachDelimitedLine(fileName, delimter, outputObject))<br />5 {<br />6 processor(x);<br />7 }<br />8 }<br /></pre><br /><br />In this case, the IOProcessor now accepts a generic argument T which is the same type as the prototype object I pass in (called outputObject).<br /><br />Let's look at the above example code redone to use the ForEachDelimitedLine function<br /><br /><pre><br />1 ForEachDelimitedLine(<br />2 "delimitedFile.txt", ',', new { Title = "", Body = "", Anchor = "" }, (x) =><br />3 {<br />4 if (x.Title == "Thoughts of Me")<br />5 {<br />6 // do something with my blog...<br />7 }<br />8 }<br /></pre><br /><br />There, no more foreach statement. Now, the logic is part of the function itself.<br /><br />Next, I plan to extend my C# emacs mode to generate a class around my static functions and compile and run for me so I can have a C#-script of sorts. Don't get me wrong, I still love and use perl on a daily basis, but C# is often much faster than perl, surprisingly enough, and seems to be able to handle memory more efficiently as well. However, I do admit that is anecdotal and not based on any tests I have performed. On a more pragmatic side, it is easier to integrate with exsiting C# libraries from C# rather than writing a SWIG interface.<br /><br />Hope you enjoyed!Tantonhttp://www.blogger.com/profile/08601404650352658381noreply@blogger.com3tag:blogger.com,1999:blog-13706479.post-31137123588743795462008-11-22T22:38:00.000-08:002008-11-22T22:41:59.531-08:00disgruntled iPhone userI'm tired of the Apple iPhone. As long as you don't need to do anything unusual, it is fine, but try to go outside what the folks at Apple have deemed appropriate for you and it blows up. For example, if you want to sync with two computers, you are hosed. If you want to make a different interface (for example, I want playlists to have folders), you are hosed. If you want to do anything custom, you are up a creek - I'm tired of it. When my contract expires, I will be moving to a different phone. No more Apple for me, I want something more open.Tantonhttp://www.blogger.com/profile/08601404650352658381noreply@blogger.com1tag:blogger.com,1999:blog-13706479.post-48860422426953000212008-11-22T22:35:00.000-08:002008-11-22T22:38:17.523-08:00MidomiJust a quick post to give props to the <a href="http://www.midomi.com">Midomi</a> team. I always enjoyed Shazam, but it only works for commercially recorded songs. Midomi lets you sing and then tries to determine what song you were singing. It is great karaoke fun! My wife and I played a game of Horse with it recently and had a blast.<br /><br />Great job, guys!Tantonhttp://www.blogger.com/profile/08601404650352658381noreply@blogger.com0tag:blogger.com,1999:blog-13706479.post-21844774500053714492008-09-01T23:22:00.001-07:002008-09-01T23:28:10.704-07:00The end of broadcast TVSeems like broadcast TV should be in its death throws. I give it no more than 7 years. I imagine within 5 everyone else will chime in with its death. I wonder how Dish/Comcast/DirectTV/etc... will fight back. Will they try to lure the RIAA into banning places like <a href="http://hulu.com">hulu.com</a>? Or will they hold out hope that people will want to see their shows as soon as possible instead of waiting for them to come online? At what point do they stop coming out in broadcast form first? Seriously, between <a href="http://netflix.com">netflix</a>, <a href="http://hulu.com">hulu</a>, <a href="http://veoh.com">veoh</a>, and <a href="http://mtv.com">mtv.com</a> I don't really need cable. I have enough entertainment with just those sites. That doesn't even include iTunes and the paid providers. The tail is growing in this area and it will only be a few more years before it becomes mainstream. Not only that, but the monitization ability is already there through commercials, so it is a viable model. I do hope it doesn't get bogged down by commercials though - and I hope the commercials become personalized. Just because I'm watching The Hills doesn't mean I want to see a cosmetics commercial...however, my eyebrows do look a bit...nevermind.Tantonhttp://www.blogger.com/profile/08601404650352658381noreply@blogger.com2tag:blogger.com,1999:blog-13706479.post-73706030466133083122008-08-24T09:15:00.000-07:002008-08-24T09:19:50.611-07:00What a great family<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2WCoSea75MaNCVuaV33YUB_HmKI5JkwdOBcTASHAGTeky6BGP2uZrl1OveJvAY2GZ7DT6ZCArKbgf1b4DQ0XMu02cWO5i9lPBIMzOHzdTdH2IsmXsxZS45oqhXGaGAp5hjUnE/s1600-h/Ipic.jpeg"><img style="float:top; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2WCoSea75MaNCVuaV33YUB_HmKI5JkwdOBcTASHAGTeky6BGP2uZrl1OveJvAY2GZ7DT6ZCArKbgf1b4DQ0XMu02cWO5i9lPBIMzOHzdTdH2IsmXsxZS45oqhXGaGAp5hjUnE/s320/Ipic.jpeg" border="0" alt=""id="BLOGGER_PHOTO_ID_5238119114064511554" /></a><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWK5AZSuJLfb3BMEit-iEWR4tV_VKjIFGJ2TQR2tIEh81YyelBaNu3eSHVQBgbi7ZUnTdZJaFXTUQtBfUyyt_yM34Xh-zlrqXe99z-DYVw4cXKSFr82srM0N48xQZZNPW_1TVP/s1600-h/lovepic.jpeg"><img style="float:top; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWK5AZSuJLfb3BMEit-iEWR4tV_VKjIFGJ2TQR2tIEh81YyelBaNu3eSHVQBgbi7ZUnTdZJaFXTUQtBfUyyt_yM34Xh-zlrqXe99z-DYVw4cXKSFr82srM0N48xQZZNPW_1TVP/s320/lovepic.jpeg" border="0" alt=""id="BLOGGER_PHOTO_ID_5238119124708126146" /></a><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqPTBGoal7K8dbA8cOUG8ytIT3MfWBU6XJhYk0DjP5wRAV6dNjJuLMhVs3uKEkeluEErUxGv8jF65UnN55Cu7WBOe_DpLZM8WHs4zIsdqM3GGY9GNVPGXtrrsM89oMXOqvWBh0/s1600-h/youpic.jpeg"><img style="float:top; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqPTBGoal7K8dbA8cOUG8ytIT3MfWBU6XJhYk0DjP5wRAV6dNjJuLMhVs3uKEkeluEErUxGv8jF65UnN55Cu7WBOe_DpLZM8WHs4zIsdqM3GGY9GNVPGXtrrsM89oMXOqvWBh0/s320/youpic.jpeg" border="0" alt=""id="BLOGGER_PHOTO_ID_5238119131488042482" /></a><br /><p/><br />I received these pictures from my wife and kids when I arrived in Seattle. They are a great family and I miss them. From left to right is my niece Ashlan, my daughter Brooklyn, and my son Carter. See you soon!Tantonhttp://www.blogger.com/profile/08601404650352658381noreply@blogger.com0