<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5114139951825370861</id><updated>2012-02-16T10:54:49.962-05:00</updated><category term='podcasts'/><category term='web programming'/><category term='relationships'/><category term='tools'/><category term='agile'/><category term='freeware'/><category term='python'/><category term='distributed teams'/><category term='static websites'/><title type='text'>Free Range Software</title><subtitle type='html'>&lt;center&gt;Thoughts on software development, management and all things geeky&lt;/center&gt;</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.freerangesoftwareblog.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5114139951825370861/posts/default'/><link rel='alternate' type='text/html' href='http://www.freerangesoftwareblog.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Andrew Burke</name><uri>http://www.blogger.com/profile/07255618008204669467</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/_kHN4zlt5R4A/S2j6IjNQD0I/AAAAAAAAAAM/sYCMi868xHM/S220/me2.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>10</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5114139951825370861.post-5285292106403377220</id><published>2011-07-21T18:27:00.005-04:00</published><updated>2011-07-21T18:41:26.785-04:00</updated><title type='text'>Internet TV is Here</title><content type='html'>&lt;a href="http://4.bp.blogspot.com/-fOOty36Fx9Q/TiiqH5c2RAI/AAAAAAAAACo/d3tMI7vCA8A/s1600/tv.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 320px;" src="http://4.bp.blogspot.com/-fOOty36Fx9Q/TiiqH5c2RAI/AAAAAAAAACo/d3tMI7vCA8A/s320/tv.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5631938386684429314" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;small&gt;&lt;p style="text-align: center;"&gt;&lt;a href="http://www.freedigitalphotos.net/images/view_photog.php?photogid=2280"&gt;&lt;span class="Apple-style-span"&gt;Image: digitalart / FreeDigitalPhotos.net&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/small&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Note: Apologies for the long gap between posts. We've had quite a busy 6 months, but we're back to a bit of a routine now and I hope to be able to post more regularly.&lt;br /&gt;&lt;br /&gt;My wife and I recently moved to a new house and one of the highest priority utility hookups on our list was internet access. The only available broadband connectivity was through the local cable company which, like all cable companies (insert sneer here), offers mostly package deals. That left us with an interesting question. Do we get cable TV or take the plunge and go Internet TV only?&lt;br /&gt;&lt;br /&gt;I should preface this by saying that we don't watch a ton of TV and the TV we do watch is mostly movies and a handful of TV shows (Mythbusters, Madmen, Dexter, etc). If you're the kind of person that loves to channel surf and watch live TV, Internet TV is probably not for you. For us, it's more than enough and has several advantages:&lt;br /&gt;&lt;br /&gt;- We were already using Netflix on demand on our computers, so moving it to the TV was a natural next step. Most of the devices out there supported Netflix, so this was a no-brainer.&lt;br /&gt;&lt;br /&gt;- We HATE commercials. Broadcast television is so littered with mind-numbing, soul-destroying ads that we just gave up watching certain shows. Boo. Internet TV is (usually) much better about this, particularly if you're using pay services like Netflix, ITunes, Amazon, Hulu Plus etc.&lt;br /&gt;&lt;br /&gt;- It's cheaper. Well, in the long run anyway :).  Our internet access with the local cable company was roughly $40 cheaper per month without TV included (depending on the package, current offers, etc). Our Netflix subscription is $9.99 a month. Most of the media center devices out there ranged from $100-$700, which, even in the most expensive case, would pay off after the first 2 years. For the cheapest, it's saves us money after the first 4 months!&lt;br /&gt;&lt;br /&gt;Once we made that decision, I needed to figure out which media center to get. Once upon a time, I had built us a home-brew Windows Media Center 2005 box &lt;a href="http://en.wikipedia.org/wiki/Windows_Media_Center"&gt;http://en.wikipedia.org/wiki/Windows_Media_Center&lt;/a&gt;). My wife absolutely hated the thing. It was big, noisy, confusing and it had a nasty habit of developing problems that she couldn't fix by herself. It stung to let go of my little pet project, but I had to admit that she was right, so I disconnected the old machine and started looking at new options. After a copious amount of geeking out over features, price and flexibility, I narrowed our choices to the list below. Note that this is not intended to an exhaustive list as there are many other options available (Boxee, MythTV, etc). This is just our the list of finalists.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Tahoma; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;table border="1" cellpadding="2" cellspacing="0" width="100%"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign="top"&gt;&lt;b&gt;Device&lt;/b&gt;&lt;/td&gt;&lt;td valign="top"&gt;&lt;b&gt;Ease of Use&lt;/b&gt;&lt;/td&gt;&lt;td valign="top"&gt;&lt;b&gt;Netflix Support&lt;/b&gt;&lt;/td&gt;&lt;td valign="top"&gt;&lt;b&gt;Hulu Support&lt;/b&gt;&lt;/td&gt;&lt;td valign="top"&gt;&lt;b&gt;Price&lt;/b&gt;&lt;/td&gt;&lt;td valign="top"&gt;&lt;b&gt;DVDs&lt;/b&gt;&lt;/td&gt;&lt;td valign="top"&gt;&lt;b&gt;Games&lt;/b&gt;&lt;/td&gt;&lt;td valign="top"&gt;&lt;b&gt;Notes&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top"&gt;Windows 7 Media Center (+ new low profile hardware)&lt;/td&gt;&lt;td valign="top"&gt;Poor&lt;/td&gt;&lt;td valign="top"&gt;Yes&lt;/td&gt;&lt;td valign="top"&gt;Yes (w/ IE)&lt;/td&gt;&lt;td valign="top"&gt;$500+&lt;/td&gt;&lt;td valign="top"&gt;Yes&lt;/td&gt;&lt;td valign="top"&gt;Yes&lt;/td&gt;&lt;td valign="top"&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top"&gt;AppleTV 2&lt;/td&gt;&lt;td valign="top"&gt;Excellent&lt;/td&gt;&lt;td valign="top"&gt;Yes&lt;/td&gt;&lt;td valign="top"&gt;No&lt;/td&gt;&lt;td valign="top"&gt;$100&lt;/td&gt;&lt;td valign="top"&gt;No&lt;/td&gt;&lt;td valign="top"&gt;No&lt;/td&gt;&lt;td valign="top"&gt;Good integration w/ iPhone and iPad, iTunes content&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top"&gt;Roku XD|S&lt;/td&gt;&lt;td valign="top"&gt;Good&lt;/td&gt;&lt;td valign="top"&gt;Yes&lt;/td&gt;&lt;td valign="top"&gt;Yes&lt;/td&gt;&lt;td valign="top"&gt;$100&lt;/td&gt;&lt;td valign="top"&gt;No&lt;/td&gt;&lt;td valign="top"&gt;No&lt;/td&gt;&lt;td valign="top"&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top"&gt;XBMC or Boxee (+ new low profile hardware)&lt;/td&gt;&lt;td valign="top"&gt;Poor (Same problems as Windows MCE)&lt;/td&gt;&lt;td valign="top"&gt;Yes&lt;/td&gt;&lt;td valign="top"&gt;Maybe?&lt;/td&gt;&lt;td valign="top"&gt;$500+&lt;/td&gt;&lt;td valign="top"&gt;Yes&lt;/td&gt;&lt;td valign="top"&gt;Yes&lt;/td&gt;&lt;td valign="top"&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top"&gt;Google TV (Logitech Revue)&lt;/td&gt;&lt;td valign="top"&gt;Excellent&lt;/td&gt;&lt;td valign="top"&gt;Yes&lt;/td&gt;&lt;td valign="top"&gt;No&lt;/td&gt;&lt;td valign="top"&gt;$300&lt;/td&gt;&lt;td valign="top"&gt;No&lt;/td&gt;&lt;td valign="top"&gt;No&lt;/td&gt;&lt;td valign="top"&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Tahoma; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;After some soul searching, we decided that price and ease of use were the most important aspects, so we decided on AppleTV. It also had the advantage of being simple to use with the iPhones (My wife and I each have one) and iPad.&lt;br /&gt;&lt;br /&gt;Normally, I'm not an Apple fan boy. I think they're a little too proprietary with their software. I have to admit, though, after a few months of messing with the AppleTV 2, I'm impressed. The device is ridiculously easy to use (no more cursing from the wife :) ) and it just works. My Windows Media Center was constantly requiring maintenance and tweaking. After spending the few minutes to set it up, the AppleTV has worked perfectly. The quality of the video is great considering it's streamed and we've had little or no connection issues. The remote app on the iPhone is pretty well done as well and makes it a thousand times easier to type something when you're searching for a movie. The on-screen keyboard is ok, but can be really painful if you're typing something long-ish. Oh, and did I mention that it's *tiny*. It's not much bigger than a hockey puck, which makes the real estate near the TV a little less cluttered.&lt;br /&gt;&lt;br /&gt;That being said, there are a few things that are frustrating. The prices for iTunes movies is a bit higher than I'd prefer. I know it's the going market rate for digital rentals (about $5 per HD movie), but given that I can watch unlimited Netflix on the same device for $10/month, it seems a bit high. The lack of a DVD player, while understandable given the nature and price of the device, means we have to keep a separate DVD player around for Netflix-by-mail movies. It would have been nice to collapse everything into one device. The amount of content could be improved as well. An App store could make it possible to get things like Pandora or games on to the TV pretty easily. Rumor has it Apple is planning an App Store for the AppleTV, but there's been no confirmation yet from Apple.&lt;br /&gt;&lt;br /&gt;All in all, it's been a very good experience, especially for the price, and I'd buy it again given the choice. Next project: Jailbreak the AppleTV and install XBMC to see if I can squeak every ounce of functionality out of our new toy :).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5114139951825370861-5285292106403377220?l=www.freerangesoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.freerangesoftwareblog.com/feeds/5285292106403377220/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.freerangesoftwareblog.com/2011/07/image-digitalart-freedigitalphotos.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5114139951825370861/posts/default/5285292106403377220'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5114139951825370861/posts/default/5285292106403377220'/><link rel='alternate' type='text/html' href='http://www.freerangesoftwareblog.com/2011/07/image-digitalart-freedigitalphotos.html' title='Internet TV is Here'/><author><name>Andrew Burke</name><uri>http://www.blogger.com/profile/07255618008204669467</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/_kHN4zlt5R4A/S2j6IjNQD0I/AAAAAAAAAAM/sYCMi868xHM/S220/me2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-fOOty36Fx9Q/TiiqH5c2RAI/AAAAAAAAACo/d3tMI7vCA8A/s72-c/tv.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5114139951825370861.post-1498722080359473236</id><published>2010-10-16T22:32:00.000-04:00</published><updated>2010-10-16T22:33:21.749-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><title type='text'>The Importance of an Iteration Demo</title><content type='html'>When I first started using Agile,  I really didn't make a big deal over demos. We did them once in a while, but if we skipped one here and there, no big deal, right? The product managers and business folks will come around at some point and we'll show it to them then, right? The classic purpose of an iteration demo is to gather feedback from your stakeholders. What I didn't take into account were the benefits of doing demos that had nothing to do with feedback.&lt;br /&gt;&lt;br /&gt;A few years ago, I started a new project at work. One of my first orders of business was instituting an iteration "rhythm". The subject of demos came up and I was initially pretty unenthusiastic about it. I was alright with scheduling them but if we missed them that was fine too; we'd get the product manager to come down later. I had a colleague who was adamant that we have a fixed scheduled demo and and after some spirited but half-hearted resistance, I acquiesced. After the first 3 or 4 sessions, the affect on the team became obvious and I have completely changed my mind about the importance of a demo.&lt;br /&gt;&lt;br /&gt;1) &lt;span style="font-weight:bold;"&gt;A Demo is a Deadline.&lt;/span&gt; &lt;br /&gt;The first thing I noticed was that because the demo was scheduled in advance and was difficult to move, it served as a kind of unofficial deadline for the team. In previous iterations, the work always seemed to"bleed" over into the evening on the last day, or maybe even a little into the weekend or the next iteration. We always finished, but the end of the iteration was never really crisp. The iteration demo provided a specific time when everything needed to be done, working and ready to show to the team. While this created a little bit of panicked last minute work the first few times, over the next iterations it forced us to be a lot more disciplined and we started thinking very carefully about when things needed to be done before the demo.&lt;br /&gt;&lt;br /&gt;2) &lt;span style="font-weight:bold;"&gt;A Demo is a Motivator.&lt;/span&gt; &lt;br /&gt;Feedback is an important tool for improving software, but it is also an incredible morale builder. For most programmers, there's no greater compliment than hearing that someone really appreciates the software they've built. Of course, if you have somebody who's habitually trashes everything you do, this could blow up in your face, but as long as the good aspects of the software are acknowledged and the criticism is constructive, I guarantee you your developers will walk a little taller for the next few hours.&lt;br /&gt;&lt;br /&gt;3) &lt;span style="font-weight:bold;"&gt;A Demo is a Test.&lt;/span&gt; &lt;br /&gt;Software always has a tendency to fail in catastrophic ways right before a demo. It's easy to chalk this up to Murphy's law but demos by their very nature exercise the software as a user would, and often result in a more comprehensive test than you would create otherwise. In all likelihood you are uncovering bugs that would eventually show up in production.  While this may make for a few uncomfortably bad demos, better to find out now than after you've shipped. Obviously, this information can be used to improve testing in future iterations which is always a good thing. &lt;br /&gt;&lt;br /&gt;4) &lt;span style="font-weight:bold;"&gt;A Demo is an Education.&lt;/span&gt; &lt;br /&gt;Just clicking through the software and showing that all the buttons and tabs work is one thing, but showing your customer that you understand &lt;span style="font-style:italic;"&gt;how &lt;/span&gt;they need to use the system creates a whole new level of discussion. One of the rules in all our demos is that they must be scripted (well, at least loosely anyway) and that they must demonstrate how our customers will actually use the system. If you're building accounting software, then pretend you're an accountant attempting to create a quarterly report for his company. If you build music recording software, then record a simple song to demonstrate how the software would really be used in the field. Of course, this might require some research, but your team will better understand the needs of the customer as a result. In my experience, a better understanding leads to better software.&lt;br /&gt;&lt;br /&gt;A good demo is more than showing your boss that you're actually doing something at work.  If you catch yourself skipping iteration demos more than you should, it might be time to rethink their purpose. If done well, a demo can be a powerful tool to improve your product and motivate your team.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5114139951825370861-1498722080359473236?l=www.freerangesoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.freerangesoftwareblog.com/feeds/1498722080359473236/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.freerangesoftwareblog.com/2010/10/importance-of-iteration-demo.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5114139951825370861/posts/default/1498722080359473236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5114139951825370861/posts/default/1498722080359473236'/><link rel='alternate' type='text/html' href='http://www.freerangesoftwareblog.com/2010/10/importance-of-iteration-demo.html' title='The Importance of an Iteration Demo'/><author><name>Andrew Burke</name><uri>http://www.blogger.com/profile/07255618008204669467</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/_kHN4zlt5R4A/S2j6IjNQD0I/AAAAAAAAAAM/sYCMi868xHM/S220/me2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5114139951825370861.post-909020709170296034</id><published>2010-07-11T13:37:00.005-04:00</published><updated>2010-07-23T19:58:39.330-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web programming'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='freeware'/><title type='text'>Find Dead Files</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_kHN4zlt5R4A/TEosQzSXvdI/AAAAAAAAABo/6ik8NS-Mm_c/s1600/photo_10761_20091219.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 226px;" src="http://3.bp.blogspot.com/_kHN4zlt5R4A/TEosQzSXvdI/AAAAAAAAABo/6ik8NS-Mm_c/s320/photo_10761_20091219.jpg" alt="" id="BLOGGER_PHOTO_ID_5497254962315902418" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;small&gt;&lt;center&gt;&lt;p&gt;&lt;a href="http://www.freedigitalphotos.net/images/view_photog.php?photogid=404"&gt;Image: Simon Howden / FreeDigitalPhotos.net&lt;/a&gt;&lt;/p&gt;&lt;/center&gt;&lt;/small&gt;&lt;br /&gt;&lt;br /&gt;I've been doing a lot of web development recently for a friend's website. One of the problems I always seem to have is cleaning up files that are no longer used as the site evolves. This is particularly true with images. I solved this problem by writing a simple Python script to do the following:&lt;br /&gt;&lt;br /&gt;1) Produce a list of files in the current directory and all subdirectories (minus a few file types that are ignored)&lt;br /&gt;2) Search all the files in the current directory for references to those files&lt;br /&gt;3) Output a list of files that do not appear to be referenced&lt;br /&gt;&lt;br /&gt;Here's some sample output:&lt;br /&gt;&lt;blockquote&gt;Creating list of files...&lt;br /&gt;&lt;br /&gt;Searching files...&lt;br /&gt;&lt;br /&gt;The following files are not referenced from files in this directory:&lt;br /&gt;&lt;br /&gt;images/oldcontactus.jpg&lt;br /&gt;images/header.jpg&lt;br /&gt;images/photos.jpg&lt;br /&gt;index2.html&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;Every week or so I run the script and clean out any lingering dead files. In the hopes that it might be useful to others, I have uploaded it to the blog. There are couple things to keep in mind if you intend to use it:&lt;br /&gt;&lt;br /&gt;1) The search is not intelligent so it will recognize any text that references the file (including comments and the occasional lucky substring).&lt;br /&gt;2) It only searches the content of files in the current rectory, which assumes that your HTML is in the current directory and images, .js files, etc are in subdirectories.&lt;br /&gt;3) If you need to modify the file types that are ignored, edit the .py file and change the constants at the top.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://sites.google.com/site/freerangesoftwareblogresources/zip/find_dead_files.zip?attredirects=0&amp;amp;d=1"&gt;Download the script here. &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I've included a listing of the source code below. As always, feedback and constructive criticism is always welcome. I'm always looking for ways to improve my code. Enjoy.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: python"&gt;&lt;br /&gt;#########################################################################&lt;br /&gt;# find_dead_files (version 0.1) by Andrew Burke&lt;br /&gt;#&lt;br /&gt;# This utility builds a list of files in the current directory and all&lt;br /&gt;# subdirectories. It then searches the files in the current directory&lt;br /&gt;# for references to these files.&lt;br /&gt;# If a file is identified that has no references to it, it&lt;br /&gt;# is reported. The algorithms used is not and intelligent&lt;br /&gt;# search so comments and raw text WILL match.&lt;br /&gt;#&lt;br /&gt;# This script is intended to help identify files that are no longer use&lt;br /&gt;# in a website.&lt;br /&gt;#&lt;br /&gt;# Usage: Place the .py file in the root of the directory structure you'd&lt;br /&gt;# like to analyze and execute the script. To change the file types that are&lt;br /&gt;# ignored altogether or not searched, please modify the "Constants" section&lt;br /&gt;# below.&lt;br /&gt;#&lt;br /&gt;# IMPORTANT NOTE: Files that are referenced from external sources only,&lt;br /&gt;# WILL be reported this tool as being unreferences. Please use care&lt;br /&gt;# before permanently deleting any files.&lt;br /&gt;#&lt;br /&gt;# Copyright (C) 2010 Andrew Burke&lt;br /&gt;# This work is licensed under a Creative Commons GNU General Public License&lt;br /&gt;# http://creativecommons.org/licenses/GPL/2.0/&lt;br /&gt;#&lt;br /&gt;# Revision history:&lt;br /&gt;# v0.1 - First version (Andrew Burke)&lt;br /&gt;# v0.2 - Corrections from PyChecker&lt;br /&gt;&lt;br /&gt;import os&lt;br /&gt;&lt;br /&gt;# Constants&lt;br /&gt;NON_SEARCHABLE_FILES = ".jpg,.png,.gif" #Files that should not be searched for keywords&lt;br /&gt;IGNORABLE_FILES = ".svn,.py,.bat" #Files that should not referenced anyway&lt;br /&gt;FOLDER = "." #Folder to start from (default is current directory)&lt;br /&gt;&lt;br /&gt;def does_string_contain_keywords(in_str, cur_keywords):&lt;br /&gt; # Search the given string for any of the given keywords&lt;br /&gt;&lt;br /&gt; for search_term in cur_keywords.split(","):&lt;br /&gt;     if in_str.find(search_term) &gt; -1:&lt;br /&gt;         return True&lt;br /&gt;&lt;br /&gt; # If we get this far, none of the keywords were found&lt;br /&gt; return False&lt;br /&gt;&lt;br /&gt;def is_ignored_file(search_filename):&lt;br /&gt; # Should we ignore this file altogether?&lt;br /&gt; return does_string_contain_keywords(search_filename, IGNORABLE_FILES)&lt;br /&gt;&lt;br /&gt;def is_not_searchable_file(search_filename):&lt;br /&gt; # Is this a file we can search?&lt;br /&gt; return does_string_contain_keywords(search_filename, NON_SEARCHABLE_FILES)&lt;br /&gt;&lt;br /&gt;def concat_with_slash(str1, str2):&lt;br /&gt; # Put two files/directories together&lt;br /&gt; if str1 == "":&lt;br /&gt;     return str2&lt;br /&gt; elif str2 == "":&lt;br /&gt;     return str1&lt;br /&gt; elif str1 == "" and str2 == "":&lt;br /&gt;     return ""&lt;br /&gt; else:&lt;br /&gt;     return str1 + "/" + str2 &lt;br /&gt;&lt;br /&gt;def add_files_to_list(subdir, root_path, mylist, search_subdir):&lt;br /&gt; # Recurse the folder structure and build a list of files&lt;br /&gt; # mylist is modified as a pass-by-ref parameter&lt;br /&gt;&lt;br /&gt; cur_path = concat_with_slash(root_path, subdir)&lt;br /&gt;&lt;br /&gt; for cur_filename in os.listdir (cur_path):&lt;br /&gt;     if is_ignored_file(cur_filename):&lt;br /&gt;         continue&lt;br /&gt;&lt;br /&gt;     if os.path.isdir (concat_with_slash(cur_path, cur_filename)) and search_subdir:&lt;br /&gt;         new_subdir = concat_with_slash(subdir, cur_filename)&lt;br /&gt;         add_files_to_list(new_subdir, root_path, mylist, True)&lt;br /&gt;&lt;br /&gt;     mylist.append(concat_with_slash(subdir, cur_filename))&lt;br /&gt;&lt;br /&gt;def search_file_for_keywords(cur_path, search_filename, cur_keywords):&lt;br /&gt; # Search the specified file for keywords and remove the keyword if found&lt;br /&gt; # cur_keywords is modified as a pass-by-ref parameter&lt;br /&gt;&lt;br /&gt; if is_not_searchable_file(search_filename):&lt;br /&gt;     return&lt;br /&gt;&lt;br /&gt; if os.path.isdir (concat_with_slash(cur_path, search_filename)):&lt;br /&gt;     return&lt;br /&gt;&lt;br /&gt; try:&lt;br /&gt;     cur_file = open(search_filename, "r")&lt;br /&gt; except:&lt;br /&gt;     print ("ERROR: Cannot open file: " + search_filename)&lt;br /&gt;     return&lt;br /&gt;&lt;br /&gt; line = cur_file.read()&lt;br /&gt; keyword_iterator = list(cur_keywords)&lt;br /&gt; for cur_keyword in keyword_iterator:&lt;br /&gt;     if line.find(cur_keyword) &gt; -1:&lt;br /&gt;         cur_keywords.remove(cur_keyword)&lt;br /&gt;&lt;br /&gt;# Main script&lt;br /&gt;filelist = []&lt;br /&gt;keywords = []&lt;br /&gt;&lt;br /&gt;print ("Creating list of files...")&lt;br /&gt;add_files_to_list("", FOLDER, keywords, True)&lt;br /&gt;add_files_to_list("", FOLDER, filelist, False)&lt;br /&gt;&lt;br /&gt;print ("\nSearching files...")&lt;br /&gt;&lt;br /&gt;#search each file for the filenames&lt;br /&gt;for filename in filelist:&lt;br /&gt; search_file_for_keywords(FOLDER, filename, keywords)&lt;br /&gt;&lt;br /&gt;# Print out the list of files that are not referenced&lt;br /&gt;print ("\nThe following files are not referenced from files in this directory:\n")&lt;br /&gt;for keyword in keywords:&lt;br /&gt; print (keyword)&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5114139951825370861-909020709170296034?l=www.freerangesoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.freerangesoftwareblog.com/feeds/909020709170296034/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.freerangesoftwareblog.com/2010/07/ive-been-doing-lot-of-web-development.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5114139951825370861/posts/default/909020709170296034'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5114139951825370861/posts/default/909020709170296034'/><link rel='alternate' type='text/html' href='http://www.freerangesoftwareblog.com/2010/07/ive-been-doing-lot-of-web-development.html' title='Find Dead Files'/><author><name>Andrew Burke</name><uri>http://www.blogger.com/profile/07255618008204669467</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/_kHN4zlt5R4A/S2j6IjNQD0I/AAAAAAAAAAM/sYCMi868xHM/S220/me2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_kHN4zlt5R4A/TEosQzSXvdI/AAAAAAAAABo/6ik8NS-Mm_c/s72-c/photo_10761_20091219.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5114139951825370861.post-1166161714951515911</id><published>2010-07-05T09:32:00.001-04:00</published><updated>2010-07-05T09:34:22.113-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web programming'/><category scheme='http://www.blogger.com/atom/ns#' term='static websites'/><title type='text'>The Joy of Static Websites</title><content type='html'>So, you've got a little website you're working on as a side project. The requirements are pretty simple but there are a few pieces, maybe &lt;a href="http://en.wikipedia.org/wiki/Internationalization_and_localization"&gt;internationalization&lt;/a&gt;, feedback forms or even a shopping cart that sound like they're going to need some server-side programming. Being the geek-ified programmer that you are, you start evaluating what tools and bits of knowledge you can bring to bear on this problem. What should the database look like? Should I use &lt;a href="http://en.wikipedia.org/wiki/ASP.NET"&gt;ASP.NET&lt;/a&gt; or something like &lt;a href="http://en.wikipedia.org/wiki/Python_%28programming_language%29"&gt;Python&lt;/a&gt; or &lt;a href="http://en.wikipedia.org/wiki/PHP"&gt;PHP&lt;/a&gt; for the dynamic parts?&lt;br /&gt;&lt;br /&gt;It is easy to start building a monster this way. If you think about it, most of the features above can be built with simple programs, javascript and a completely STATIC website. No dynamic content, no server side scripting at all (well, at least not for you).&lt;br /&gt;&lt;br /&gt;"So what?", you ask. Well, static websites have several advantages over dynamic ones:&lt;br /&gt;&lt;br /&gt;1) They are SIMPLE. Static websites are easy to build and debug. There's really not a ton of tricky things that can happen when the page you store on the server is exactly the same as the one that gets rendered in the browser.&lt;br /&gt;&lt;br /&gt;2) They are FAST. Static web pages can be cached by browsers and &lt;a href="http://en.wikipedia.org/wiki/Web_proxy"&gt;web proxies&lt;/a&gt;. This improves performance for the end user and reduces the load on the web server.&lt;br /&gt;&lt;br /&gt;3) They have no STATE. If you want to update the site, you don't need to migrate the database. If you want to back it up, just keep a copy of the html. If you're site gets big, scaling it up is just a matter of a load balancer and some more servers.&lt;br /&gt;&lt;br /&gt;4) They are generally CHEAPER. Many hosting providers charge more for dynamic content and databases. A static site needs neither of these. Of course, you might be uploading more static content to the server, so disk space could become a consideration.&lt;br /&gt;&lt;br /&gt;Of course, none of this helps you solve the issues mentioned above. You still need that feedback, internationalization and shopping cart. A lot of that can be provided without resorting to server-side programming.&lt;br /&gt;&lt;br /&gt;Feedback: There's an amazing variety of stuff that can be built just using cloud service these days. &lt;a href="https://uservoice.com/"&gt;Uservoice.com&lt;/a&gt; for example, is a great solution for adding user feedback to your site using a little block of HTML and some javascript. Theirb smallest offering is free and is still pretty customizable. If you're fussy about the URLs looking like they're all from the same site, you can opt for their paid version and they will allow a DNS CName record to point your users to your uservoice site.&lt;br /&gt;&lt;br /&gt;Internationalization: If you're building an e-tail site these days, it's tough to ignore the international market. You could build some crazy database-driven resource lookup solution, or, you can simply generate the site on your local computer and upload the files to the web server with no dynamic content at all. That might sound a bit confusing at first, so let's take a step back and go through an example.&lt;br /&gt;&lt;br /&gt;You're getting ready to start selling your gourmet jelly beans overseas. In fact, you've discovered that there's a HUGE market in France for jelly beans, so you decide to translate your site into French to better target this market. You could just make an /fr directory on your web server, copy the website into it and change all the English to French (assuming of course you speak French, which as another issue entirely). The problem is if you decide to alter the HTML of the main English site, you're going to have to copy the changes over to your French site as well. If you have a dozen different languages, this gets hairy pretty fast. Instead, consider building the site with some unique strings in place of your descriptions. Maybe something like JELLYBEAN_DESCRIPTION_SOURAPPLE. Then write a script in the programming language of your choice to copy the site into the /fr directory and replace the dummy string with the real content in French (or English, or Italian, etc). Once you're ready, run your script, build the site and upload the whole thing. Of course, you will still need to check and make sure the text looks ok and doesn't get cut off anywhere, but you need to do that if you're building a dynamic site too.&lt;br /&gt;&lt;br /&gt;Shopping Cart: Shopping carts are a really common reason to add back-end scripting to a site, but there are tools that will allow you to put this in the cloud as well. &lt;a href="https://www.paypal.com/"&gt;Paypal&lt;/a&gt; has a nice little forms-based API that will allow you to host an entire shopping cart with them. You can even brand the shopping cart page so that it matches your site's look. You won't get the kind of flexibility you would get from a customized cart, but it's quick, easy and pretty inexpensive. (Disclaimer: Apologies to those of my friends out there with a really deep-seated hatred of Paypal. They were just the easiest example.)&lt;br /&gt;&lt;br /&gt;It doesn't solve every problem, but you can do more with a static site these days than most people would think. They can be a lot easier, faster and cheaper than a dynamic site and can save you boatloads of work and headaches. It's at least worth strong consideration before diving into a pile of database and server-side coding.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5114139951825370861-1166161714951515911?l=www.freerangesoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.freerangesoftwareblog.com/feeds/1166161714951515911/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.freerangesoftwareblog.com/2010/07/joy-of-static-websites.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5114139951825370861/posts/default/1166161714951515911'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5114139951825370861/posts/default/1166161714951515911'/><link rel='alternate' type='text/html' href='http://www.freerangesoftwareblog.com/2010/07/joy-of-static-websites.html' title='The Joy of Static Websites'/><author><name>Andrew Burke</name><uri>http://www.blogger.com/profile/07255618008204669467</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/_kHN4zlt5R4A/S2j6IjNQD0I/AAAAAAAAAAM/sYCMi868xHM/S220/me2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5114139951825370861.post-5847092349319004081</id><published>2010-05-29T15:25:00.002-04:00</published><updated>2010-05-29T15:28:25.377-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='distributed teams'/><category scheme='http://www.blogger.com/atom/ns#' term='relationships'/><title type='text'>Working with Distributed Teams - Maintain Relationships</title><content type='html'>One of the most difficult aspects of working with distributed teams is  maintaining the personal connections that come naturally when you are  working with your team in person five days a week. Despite what we're  told to believe by many human resource "experts", you must build and  maintain a personal connection with your direct reports if you want your  team to be effective. Think about the connections you've had with your  bosses in the past. Most people are far more willing to go that extra  mile for their boss if they know that their boss is listening to them  and looking out for their best interests.&lt;br /&gt;&lt;br /&gt;It's easy to fall into the trap of assuming that this sort  of connection is impossible over long distances, but the truth is that  we do this sort of thing all the time in our personal lives. It is not  at all uncommon to have family or friends that live in other states or  even countries and yet we manage to maintain a personal relationship  with them. You may not live in the same state as aunt Jean, but you can  still call every so often and fly in for a visit now and then.  Unsurprisingly, the tools at your disposal are not all that different  from what you would do with friends and family, albeit a bit more  structured and formal.&lt;br /&gt;&lt;br /&gt;The most obvious  tool is travel. While it's not impossible to keep close contact with  your staff without travel, it's significantly more difficult. This is  especially true at the beginning of a project when there is more need  for communication to set up methods of work and decide on the scope of  the project. Getting everybody on the same page early and giving  everybody a much needed relationship boost early in the project will set  the stage for a much more organized and clean running project in the  future. The same is true of your family relationships. After all, the  phone calls after your visit to aunt Jean just seem so much more natural  and easy, right?&lt;br /&gt;&lt;br /&gt;For those of you that  follow the managers tools podcast, the second tool won't come as much  of a shocker. One-on-ones are the key to keeping regular personal contact with  your remote reports. They can and should be done at least once a week  over the phone, and can be done in much the same way they are done in  person  ( &lt;a href="http://www.manager-tools.com/2005/07/questions-and-answers-on-one-on-ones"&gt;Click here for the Manager Tools podcast on one on one's&lt;/a&gt; ).  You still need to cover work related areas, but consider leaving some  extra time to discuss more personal matters such as family, weekend  events, vacation plans or just whatever comes naturally. This is  particularly important since you will be missing the regular "water  cooler" types of informal conversations that happen naturally when you  are co-located.&lt;br /&gt;&lt;br /&gt;The last that I want to  address in this post is assignments. Nothing improves your staff  members' relationships and understanding of remote sites as much as  going there for a while. Ideally a small percentage of each of your  teams should be on a remote assignment at any given time. Unfortunately  this is often the most difficult tool to justify in budget conscious  organizations. However, if you can manage it, your team members will  have developed relationships and knowledge that will help them  immensely. They will know who to contact when they have a problem. They  will know how the team process works at the remote site and the  challenges they face on a daily basis. All of this information makes  them more effective themselves and also helps to make them ambassadors  for others in the organization, helping to overcome the "us and them"  mentality that so often plagues distributed teams.&lt;br /&gt;&lt;br /&gt;Maintaining relationships with remote teams can be  difficult, but it's not impossible given the right time and energy. The  steps mentioned above are just a few of the many options available for  keeping those connections with your remote teams tight and effective.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5114139951825370861-5847092349319004081?l=www.freerangesoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.freerangesoftwareblog.com/feeds/5847092349319004081/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.freerangesoftwareblog.com/2010/05/working-with-distributed-teams-maintain.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5114139951825370861/posts/default/5847092349319004081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5114139951825370861/posts/default/5847092349319004081'/><link rel='alternate' type='text/html' href='http://www.freerangesoftwareblog.com/2010/05/working-with-distributed-teams-maintain.html' title='Working with Distributed Teams - Maintain Relationships'/><author><name>Andrew Burke</name><uri>http://www.blogger.com/profile/07255618008204669467</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/_kHN4zlt5R4A/S2j6IjNQD0I/AAAAAAAAAAM/sYCMi868xHM/S220/me2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5114139951825370861.post-8038196852639138182</id><published>2010-03-17T21:18:00.003-04:00</published><updated>2010-03-17T21:24:01.682-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='distributed teams'/><title type='text'>Working with Distributed Teams - Effective Communication</title><content type='html'>&lt;span style="color: rgb(0, 102, 0);"&gt;If you work with a distributed team today, then you're already painfully aware of how critical time is when communicating. Issues that could be resolved locally with a simple five minute conversation can take days with a remote team to say nothing of the time lost when one group is plowing ahead with incorrect assumptions about what the other team is doing. This is further exacerbated if one of the remote teams is in a distant time zone and there's a limited amount of time in which the corresponding work days overlap. If you're based in the US and you have a team in Asia or vice-versa, then there may only be a few hours a day where you can actually talk to your team. Establishing a regular rhythm of communication is critical. It may be difficult or impossible to talk to your team extensively during the day, so a process by which you communicate and expect information can help immeasurably. The most basic tools have worked for me are status reports both to and from your remote teams and regular staff meetings. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Daily status reports, although most people roll their eyes when they hear that phrase, can be a great tool for keeping you up to speed on the days events. This report, however, does not and *should not* be a 10 page detailed report on the days activities. Often a simple email with the highlight reel from the day is sufficient to alert you to something that might need attention. For example, you might get a status report from your onsite manager at the end of the day that looks something like this:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;- Started integration testing between system A and B&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;- Coding blocked on component C due to a bug in third party libraries&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;- Bob and Sam off on training till Thursday&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;If you're working on something that requires more structured information (perhaps performance testing or deployment) then a 1-page spreadsheet copied and pasted into email usually does the trick. My general rule of thumb is that it should take no more than 10 minutes to fill out the report and send it off. The last thing you want to hear is that your team is behind on deliverables because they spent half the day putting together a status report for you. The goal is not to communicate every detail of what's going on at the remote site, it's to provide a little communication boost between you and your team until you can talk next.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Getting information *from* your remote teams is important, but it's really easy to lose sight of what it's like for them. Chances are, they are feeling disconnected from the decision making process and out of touch with new direction and changes. A regular staff meeting can help you to communicate this sort of information, but your team could be out of sync for several days or weeks depending on how often you hold them. A simple status email (in the same form listed above) sent to your remote team from you can go miles towards helping them feel connected, informed and on track. Some people balk a little at this idea. Perhaps because many people think of status reports as something that is sent from a subordinate to a manager. At the end of the day, a status report is a communication mechanism and nothing more. If it helps get the best our of your teams, then how can it hurt?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Status reports are good, but, there's no substitute for regular staff meetings over the phone. It may be tempting at first to rely on email to communicate, but email is just too slow to support the kind of in-depth conversations that are necessary to develop software. If you share a time overlap with your remote teams, then it helps to block out the overlapped hours in your calendar. You have a limited amount of time to communicate with them and you don't want those time slots chewed up by meetings that could happen at any other point during the day. If you don't share an overlap, then chances are one or both teams are working night hours at least once a week. Either way, detailed meeting agendas are critical to keeping that limited communication effective. Manager tools has a great podcast on effective meetings that I highly recommend (&lt;a href="http://www.manager-tools.com/manager-tools-basics"&gt;click here and scroll down for the 3 part series on effective meetings&lt;/a&gt;). Setting up a good agenda and timeline are not rocket science, but it does take a bit of discipline and practice and the manager's tools model provides a really clear place to get started. One of their suggestions is to ask for meeting topics ahead of time. &lt;a href="http://wave.google.com"&gt;Google  Wave&lt;/a&gt; or a Wiki are great tools that can be used to gather agenda items when you have limited face to face interaction and can help offload the gathering and formatting to the team.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;The problem with remote teams is almost always communication, so it shouldn't be a surprise that all of the points above are about squeezing the most effective communication possible out of the time you have. These are the tools that I've found useful, but there are many more techniques for managing relationships over a distance. I'm sure there are tons of other ideas out there and look forward to hearing about them.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Today's post in GREEN in honor of  St. Patty's Day :). Enjoy the holiday!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5114139951825370861-8038196852639138182?l=www.freerangesoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.freerangesoftwareblog.com/feeds/8038196852639138182/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.freerangesoftwareblog.com/2010/03/working-with-distributed-teams.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5114139951825370861/posts/default/8038196852639138182'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5114139951825370861/posts/default/8038196852639138182'/><link rel='alternate' type='text/html' href='http://www.freerangesoftwareblog.com/2010/03/working-with-distributed-teams.html' title='Working with Distributed Teams - Effective Communication'/><author><name>Andrew Burke</name><uri>http://www.blogger.com/profile/07255618008204669467</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/_kHN4zlt5R4A/S2j6IjNQD0I/AAAAAAAAAAM/sYCMi868xHM/S220/me2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5114139951825370861.post-4350459410245111737</id><published>2010-02-25T19:11:00.015-05:00</published><updated>2010-02-25T23:08:44.823-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='distributed teams'/><title type='text'>Working with Distributed Teams - Use Good Tools</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kHN4zlt5R4A/S4c2pmOJcrI/AAAAAAAAAA4/LOVx9e1IYTo/s1600-h/wave_agenda.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 254px;" src="http://1.bp.blogspot.com/_kHN4zlt5R4A/S4c2pmOJcrI/AAAAAAAAAA4/LOVx9e1IYTo/s320/wave_agenda.jpg" alt="" id="BLOGGER_PHOTO_ID_5442378762962956978" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I think it's fair to say that being a manager with responsibility for remote teams is very common today. Advances in technology have made this possible, but not necessarily easy. Communication, cultural barriers, time differences and the sheer impact of being physically remote introduce a host of potential pitfalls. If you're lucky, your company allows you to travel and see your team in person frequently, but travel is often the first thing to go when budgets get tight. Unfortunately, I don't think there are any magic solutions to this problem, but there are some things I've found that make it a bit easier. In this entry, we'll be talking about tools that help improve communication, but this is only the beginning of the story. There is much, MUCH more to this, involving behavior and organization, that we'll get into later.&lt;br /&gt;&lt;br /&gt;The first thing that pops into most people's minds when you think of communicating with remote teams is heavy use of email. While this is certainly true, email is an ancient tool (in technology terms at least) and there are some great new products out there, many of which are free, that can help overcome these barriers. &lt;a href="https://wave.google.com/"&gt;Google Wave&lt;/a&gt; is a great way of managing communications. Although it's still in development (as of this writing), it's relatively easy to request access and doubles as a simple collaborative document system as well. I've found it particularly effective for managing meeting minutes and agendas (see image above). Attendees can suggest agenda items and can take notes collaboratively in the same space. Actions can be tracked and updated as part of the same wave. Alternately, Wikis can be used if you just need a collaborative document solution. They are great for sharing documents that the team needs to maintain such as process documentation, test plans and requirements documents.&lt;br /&gt;&lt;br /&gt;Collaborative Web based meeting tools like &lt;a href="http://www.webex.com/"&gt;Webex&lt;/a&gt; can be the difference between a long confusing meeting and a simple one. This is especially true if there's a language barrier involved. Having a document open that everybody can look at can help avert those endless "Sorry, can you repeat that?" conversations. They're also great for demos or for use as a screen sharing tool when trouble shooting problems together. When there's a time barrier involved, making the most of the meetings you have is absolutely critical and anything that makes the conversation quicker and easier is welcome.&lt;br /&gt;&lt;br /&gt;Instant Messaging is a great tool when there's some time overlap. There is a different feel for instant messaging than email. It's generally more casual and more interactive than email. Some might say that this is an unnecessary addition and that email covers this need, but I can tell you that it absolutely does not. People are much quicker to type an IM than an email and a couple of simple messages back and forth can save you days in the right situation.&lt;br /&gt;&lt;br /&gt;Several of the tools mentioned above support webcams as well. While it might seem unnecessary, visual communication on top of audio goes a long way to improving communication (especially across language barriers) and helps to reinforce relationships with your team. Webcams are cheap these days and with tools like &lt;a href="http://www.skype.com/"&gt;Skype&lt;/a&gt;, there's really no reason everybody can't use some level of video conferencing.&lt;br /&gt;&lt;br /&gt;Centralized development tools are really critical for a distributed development team. A single &lt;a href="http://en.wikipedia.org/wiki/Revision_control"&gt;source code control system&lt;/a&gt;(especially if you're sharing code across sites) and a web based &lt;a href="http://en.wikipedia.org/wiki/Bug_tracking_system"&gt;bug and task management system&lt;/a&gt; can save you and your team piles of work. I've been using &lt;a href="http://www.atlassian.com/software/jira/"&gt;Altassian JIRA&lt;/a&gt; and &lt;a href="http://subversion.apache.org/"&gt;Subversion&lt;/a&gt; recently, but there are literally dozens of alternatives out there. If your company can't host these tools for you, there are lots of companies that will.  If you're working with a virtual team of home-based engineers, then you might also want to check out a distributed source code control system like &lt;a href="http://git-scm.com/"&gt;GIT&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Social Networking sites get a bad rap in most corporate circles, but they fill a very basic need. If you have a distributed team, your personal relationship with them will be strained. The lunch conversations, water cooler conversations and the discussion on your way out to the parking lot all help to solidify your relationship with a local team, but unless you travel often, you won't have this kind of rapport with your remote team. Sites like &lt;a href="http://www.facebook.com/"&gt;Facebook&lt;/a&gt; help keep you in touch on a more personal level. Keep in mind that this can be a tricky thing. Insisting on "friending" a direct report is generally a bad idea. If they are interested in sharing their personal lives with you, they will respond to a request, but forcing the issue will generally have exactly the wrong effect. You will also need to be careful what you post. A complaint about your job might be ok with your friends and family, but taken out of context with your staff can lead to bad assumptions about what's going on in the company.&lt;br /&gt;&lt;br /&gt;While email can be an absolute nightmare to manage for some of us, effective use of email is still a great tool. Regular status updates both from staff to you and *you to your staff* are great ways to keep everybody in sync. Be careful of relying on email too much though. It can also lead to an enormous waste of time if used when you need a timely response.&lt;br /&gt;&lt;br /&gt;The PHONE. Yes, I know, it's positively primitive, but it's also extraordinarily effective. Hearing your voice is the next best thing to seeing your face and there is simply no substitute for it. With tools like &lt;a href="http://www.skype.com/"&gt;Skype&lt;/a&gt; there is virtually no cost associated with a phone call and regular verbal communication is critical.&lt;br /&gt;&lt;br /&gt;This list is not exhaustive, but I think it covers the highlights for what I use today. I'm sure there are lots of opinions out there on what tools are effective and what tools are a waste of time, so let's hear what you're using.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5114139951825370861-4350459410245111737?l=www.freerangesoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.freerangesoftwareblog.com/feeds/4350459410245111737/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.freerangesoftwareblog.com/2010/02/working-with-distributed-teams-use-good.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5114139951825370861/posts/default/4350459410245111737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5114139951825370861/posts/default/4350459410245111737'/><link rel='alternate' type='text/html' href='http://www.freerangesoftwareblog.com/2010/02/working-with-distributed-teams-use-good.html' title='Working with Distributed Teams - Use Good Tools'/><author><name>Andrew Burke</name><uri>http://www.blogger.com/profile/07255618008204669467</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/_kHN4zlt5R4A/S2j6IjNQD0I/AAAAAAAAAAM/sYCMi868xHM/S220/me2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_kHN4zlt5R4A/S4c2pmOJcrI/AAAAAAAAAA4/LOVx9e1IYTo/s72-c/wave_agenda.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5114139951825370861.post-2631047832713452417</id><published>2010-02-15T18:38:00.004-05:00</published><updated>2010-02-15T18:44:16.405-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='podcasts'/><title type='text'>Podcasts</title><content type='html'>Over the last few years, I have become more and more enamored with podcasts. They are a great way to keep up with the industry and you can listen to them while your driving, walking or generally doing things that make holding a book, well, dangerous. There's still no substitute for hands-on learning or a good book, but with the dizzying array of technologies, processes and techniques available out there, podcasts provide a nice overview and can help keep you abreast of all the new stuff.&lt;br /&gt;&lt;br /&gt;There is a stunningly good amount of content available for free if you know where to look for it. Topics range wildly, but if you're a software engineer or manager, there are a few (in my opinion) that clearly stand out from the rest.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Technical Podasts&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.se-radio.net/"&gt;Software Engineering Radio&lt;/a&gt; - Really good for more detailed technical topics. Topics vary but include specific technologies, design patterns, architecture, process and all things software engineering. There tends to be a bit more open source stuff here, but all technologies are represented.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.hanselminutes.com/"&gt;HanselMinutes&lt;/a&gt; - A software engineering podcast by blogger Scott Hanselman. Scott's show tends a bit towards .NET based solutions but not exclusively. Topics vary widely and Scott is an excellent speaker and interviewer. Highly recommended.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.dotnetrocks.com/"&gt;.NET Rocks&lt;/a&gt; - A technical podcast focused (obviously) on .NET technologies. I haven't listened many of the audio podcasts, but they do have a vidcast called &lt;a href="http://www.dnrtv.com/"&gt;dnrtv&lt;/a&gt; that is great for showing in groups with your teams. Topics are largely focused on .NET and .NET based technologies.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Management Podcasts&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.manager-tools.com/"&gt;Manager Tools&lt;/a&gt; - I've been listening to Manager Tools only recently but so far, I've been very impressed with their cast. The focus is on more general management techniques, not software, but almost all of their topics apply. There is a very heavy focus on "what to do" rather than theory. Their approach is clear, well thought out and practical.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.netobjectives.com/blog-categories/Lean-Agile%2BStraight%2BTalk"&gt;Lean-Agile Straight Talk&lt;/a&gt; - A podcast specifically focused on lean engineering processes as well as agile development practices. Worthwhile if you have an interest in these subjects.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;A little of Everything&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://itc.conversationsnetwork.org/series/stackoverflow.html"&gt;Stack Overflow Podcast&lt;/a&gt; - The stack overflow podcast is more of an open ended software development discussion with bloggers Joel Spolsky and Jeff Atwood. The conversations range all over the place, but are always interesting and entertaining.&lt;br /&gt;&lt;br /&gt;Typically, I listen to an hour of podcasts a day, usually on the train to work or when walking to and from the station. I'm always on the lookout for good podcasts on technical and management topics, so if anybody out there has some favorites, please feel free to post them here.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5114139951825370861-2631047832713452417?l=www.freerangesoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.freerangesoftwareblog.com/feeds/2631047832713452417/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.freerangesoftwareblog.com/2010/02/podcasts.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5114139951825370861/posts/default/2631047832713452417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5114139951825370861/posts/default/2631047832713452417'/><link rel='alternate' type='text/html' href='http://www.freerangesoftwareblog.com/2010/02/podcasts.html' title='Podcasts'/><author><name>Andrew Burke</name><uri>http://www.blogger.com/profile/07255618008204669467</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/_kHN4zlt5R4A/S2j6IjNQD0I/AAAAAAAAAAM/sYCMi868xHM/S220/me2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5114139951825370861.post-7445692929790763562</id><published>2010-02-06T01:09:00.002-05:00</published><updated>2010-02-07T11:40:58.794-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><title type='text'>Why Free Range Software?</title><content type='html'>Okay, I know, it's a weird title. It evokes images of large two-dimensional desktop applications grazing on mid-western fields... or at least it does for me. So, what do we mean by &lt;a href="http://en.wikipedia.org/wiki/Free_range"&gt;Free Range&lt;/a&gt;?&lt;br /&gt;&lt;br /&gt;From Wikipedia:&lt;br /&gt;"Free range is a term which (...) denotes a method of farming husbandry where the animals are allowed to roam freely instead of being contained in any manner "&lt;br /&gt;&lt;br /&gt;In a way, that reflects my view of how software should be developed. Software development is a hugely complex activity. Often, we're dealing with customers who are not sure what they want and new technologies that we don't completely understand. It is (sort of) possible to plan out every last detail of such a development project. Unfortunately, the result is often &lt;a href="http://www.cbronline.com/news/software_project_failures_hit_5_year_high_220609"&gt;failure&lt;/a&gt; in the form of budget overruns, burned-out teams or software that does not meet the needs of the customer. Software development is part research and part engineering and to really create the best possible products, the software must be allowed to evolve or "roam freely" during the course of the project.&lt;br /&gt;&lt;br /&gt;For those of you that are familiar with &lt;a href="http://en.wikipedia.org/wiki/Agile_software_development"&gt;agile&lt;/a&gt; software development practices, you are probably already smelling a little bias towards those techniques. You'd be right. However, as much as I believe in the effectiveness of those techniques, they are not without their flaws and there is much to be learned from the traditional waterfall development practices that created the overwhelming majority of the software that we all use today.&lt;br /&gt;&lt;br /&gt;That, in a nutshell, is what I mean by "Free Range Software": Development projects work best when they are free to evolve (roam?) within a set of guidelines (fences?) that govern the overall goals of the project. If my analogy is a bit rough, well, let's just say good domain names are hard to come by.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5114139951825370861-7445692929790763562?l=www.freerangesoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.freerangesoftwareblog.com/feeds/7445692929790763562/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.freerangesoftwareblog.com/2010/02/why-free-range-software.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5114139951825370861/posts/default/7445692929790763562'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5114139951825370861/posts/default/7445692929790763562'/><link rel='alternate' type='text/html' href='http://www.freerangesoftwareblog.com/2010/02/why-free-range-software.html' title='Why Free Range Software?'/><author><name>Andrew Burke</name><uri>http://www.blogger.com/profile/07255618008204669467</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/_kHN4zlt5R4A/S2j6IjNQD0I/AAAAAAAAAAM/sYCMi868xHM/S220/me2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5114139951825370861.post-8475694689097793967</id><published>2010-02-02T13:33:00.002-05:00</published><updated>2010-02-05T17:54:48.904-05:00</updated><title type='text'>Hello World!</title><content type='html'>My name is Andrew Burke and I've been working in software as an engineer and manager for the last 16 years. Like many people in this industry, I got my start very early on and what started as a kid's hobby became a career (and an adult's hobby for that matter). I still remember the early days of typing hundreds of lines of BASIC code out of books into my very first computer, an Atari 800XL, complete with a *whopping* 8K of RAM. While the tools and technologies have changed radically since then, it's amazing how many of the lessons I learned then still apply today.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I spent many years working as a developer, and then about five years ago I was given an opportunity to manage the team. It was a great opportunity (and a pretty decent raise), but I'd be lying if I said I was initially excited about the idea. The industry was full of horrible stories of ineffectual managers who worked their teams to the bone. It was a running joke that such a promotion was actually a "management lobotomy" and that no self-respecting developer would even consider such a position.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ultimately, I took the job. At the time, I'm not sure I knew exactly why. I was earning a living doing what I loved and a shift to management was a very different (and potentially boring) job. I think the real motivation was the desire for a new challenge and a chance to see if it *could* be done better. I've learned a great deal since and made my fair share of mistakes along the way. Now, I can't imagine doing anything else. My work encompasses all the things I love about people, technology and people who love technology.This blog is intended to be a place to share my experiences and thoughts and for us all to discuss our views on software engineering and management. With any luck, we'll all be better managers for it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5114139951825370861-8475694689097793967?l=www.freerangesoftwareblog.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.freerangesoftwareblog.com/feeds/8475694689097793967/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.freerangesoftwareblog.com/2010/02/hello-world.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5114139951825370861/posts/default/8475694689097793967'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5114139951825370861/posts/default/8475694689097793967'/><link rel='alternate' type='text/html' href='http://www.freerangesoftwareblog.com/2010/02/hello-world.html' title='Hello World!'/><author><name>Andrew Burke</name><uri>http://www.blogger.com/profile/07255618008204669467</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://1.bp.blogspot.com/_kHN4zlt5R4A/S2j6IjNQD0I/AAAAAAAAAAM/sYCMi868xHM/S220/me2.jpg'/></author><thr:total>2</thr:total></entry></feed>
