<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>

	<head>
	
		<title>Arlo Leach: Web Technology Blog</title>
		
		
		
		<link href="/shared/styles.css" rel="stylesheet" type="text/css">
        <link href="/shared/elements.css" rel="stylesheet" type="text/css">
        <link href="/templates/default.css" rel="stylesheet" type="text/css">
        <!--[if lte IE 7]>
		<link href="/shared/styles_IE7.css" rel="stylesheet" type="text/css">
		<link href="/shared/elements_IE7.css" rel="stylesheet" type="text/css">
        <link href="/templates/default_IE7.css" rel="stylesheet" type="text/css">
		<![endif]-->
        
		<script type="text/javascript" src="/shared/functions.js"></script>
		
        <script type="text/javascript">
        
        	// preload rollover images
        	menu_buttons = "menu_home,menu_websites,menu_apps,menu_tools,menu_blog";
			preload_buttons(menu_buttons, "/images/templates", "png");
			
			// show a warning message to users of unsupported browsers
			check_browser_support();
			
			// copy some useful values into JavaScript
			page = "blog";
			
		</script>
	
	</head>

	<body>
	
		<div id="page">
	
			<div id="header">
				<div id="header_logo">
					<a href="/main/home.html"><img src="/images/templates/header_title.png" width="212" height="30" alt="Arlo Leach" border="0"></a>
				</div>
				<div id="header_tagline">
					<img src="/images/templates/header_tagline.png" width="236" height="18" alt="Putting the web to work for you" border="0">
				</div>
				<div id="header_contact">
					 <p class="body">773.769.6106  &bull;
				<script language="JavaScript" type="text/javascript">
show_email('arlo', 'arlomedia', 'com');
				</script>
</p>
				</div>
				<div id="header_menu">
					<a href="/main/home.html"><img id="menu_home" src="/images/templates/menu_home_0.png" border="0" alt="Home" width="54" height="20" /></a> <img src="/images/templates/menu_divider.png" alt="" width="8" height="20" /> <a href="/main/websites.html"><img src="/images/templates/menu_websites_0.png" alt="Websites" name="menu_websites" width="82" height="20" border="0" id="menu_services" /></a> <img src="/images/templates/menu_divider.png" alt="" width="8" height="20" /> <a href="/main/apps.html"><img src="/images/templates/menu_apps_0.png" alt="Apps" name="menu_apps" width="51" height="20" border="0" id="menu_samples" /></a> <img src="/images/templates/menu_divider.png" alt="" width="8" height="20" /> <a href="/main/tools.html"><img id="menu_tools" src="/images/templates/menu_tools_0.png" border="0" alt="Tools" width="49" height="20" /></a> <img src="/images/templates/menu_divider.png" alt="" width="8" height="20" /> <a href="/main/blog.html"><img id="menu_blog" src="/images/templates/menu_blog_0.png" border="0" alt="Blog" width="44" height="20" /></a>
				</div>
			</div>
				
			<div id="body">
				<div class="box_body_top_left"><div class="box_body_top_right"></div></div>
				<div class="box_body_middle_left"><div class="box_body_middle_right">
					<div class="box_body_inner">
			
						<div id="sidebar">
			
							
				
							
						
						</div>
						
						<div id="main"><div id="main_inner">
							<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Arlo&#039;s Blog &#187; Programming Principles</title>
	<atom:link href="http://www.arlomedia.com/blog/category/programming-principles/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.arlomedia.com/blog</link>
	<description>Arlo&#039;s Thoughts on Web Technology</description>
	<lastBuildDate>Mon, 02 Jan 2012 03:30:22 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Follow Your Users</title>
		<link>http://www.arlomedia.com/blog/2012/01/01/follow-your-users/</link>
		<comments>http://www.arlomedia.com/blog/2012/01/01/follow-your-users/#comments</comments>
		<pubDate>Mon, 02 Jan 2012 03:24:53 +0000</pubDate>
		<dc:creator>Arlo</dc:creator>
				<category><![CDATA[Programming Principles]]></category>

		<guid isPermaLink="false">http://www.arlomedia.com/blog/?p=176</guid>
		<description><![CDATA[A niche-market iPad app I first released a year ago has unexpectedly gained a larger audience than nearly any product I&#8217;ve built before. I added a Feedback button to the home screen of the app, and it has been pouring in. As a result, I&#8217;ve ended up making so many changes to the app that [...]]]></description>
			<content:encoded><![CDATA[<p>A niche-market iPad app I first released a year ago has unexpectedly gained a larger audience than nearly any product I&#8217;ve built before. I added a Feedback button to the home screen of the app, and it has been pouring in. As a result, I&#8217;ve ended up making so many changes to the app that it has almost become a different product! Along with a few things I&#8217;ve read in the last year, this experience has changed the way I view the process of building software, and the process of building a business.<span id="more-176"></span></p>
<p>My app is a <a href="http://www.itunes.com/apps/setlistmaker">song database</a> that musicians can use to assemble set lists; when finished, they can print them out and bring the hard copy on stage like musicians have always done. Some of the first feedback I heard was that the text or the buttons were too small; I didn&#8217;t get this because the app uses Apple&#8217;s standard interface elements, practically guaranteeing ease-of-use. Finally I realized that musicians were taking their iPads on stage with them and reading the set lists directly from the screen rather than using printouts. I had to add a &#8220;performance mode&#8221; with all the elements sized for viewing from a distance, and interacting with quickly between or during songs.</p>
<p>Since then I&#8217;ve added features that allow musicians to control their on-stage equipment from their iPads, and I&#8217;m about to add features to allow multiple band members&#8217; iPads to interact with each other on stage. These and many other features have taken me by surprise because I never would have used the app in this way; I only envisioned it as an easy way to generate printouts. My users have taken it much further than I imagined, and I&#8217;m fortunate that they&#8217;ve waited for me to catch up so many times.</p>
<p>This fits perfectly with the Derek Sivers book I recently read, <a href="http://www.amazon.com/Anything-You-Want-Derek-Sivers/dp/1936719118">Anything You Want</a>, in which he describes his customer service philosophy and quotes another author, <a href="http://steveblank.com/2010/04/08/no-plan-survives-first-contact-with-customers-–-business-plans-versus-business-models/">Steve Blank</a>: &#8220;No plan survives first contact with customers.&#8221; And it fits with another book I read this year, <a href="http://www.amazon.com/Lean-Startup-Entrepreneurs-Continuous-Innovation/dp/0307887898/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1325474126&amp;sr=1-1">The Lean Startup</a>, which advocates the idea of a &#8220;minimum viable product&#8221; to test your business ideas while saving your resources for growth after you know where it&#8217;s needed.</p>
<p>This has been an interesting lesson for me since I typically judge my success in building things by how closely I achieved my original goals. Instead, I&#8217;m going to start thinking about how quickly I can find out what the users of the product want, and how effectively I can adapt the product to serve them. I can&#8217;t wait to try my next project with this in mind!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.arlomedia.com/blog/2012/01/01/follow-your-users/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Designing Like a Developer</title>
		<link>http://www.arlomedia.com/blog/2010/10/26/designing-like-a-developer/</link>
		<comments>http://www.arlomedia.com/blog/2010/10/26/designing-like-a-developer/#comments</comments>
		<pubDate>Tue, 26 Oct 2010 17:32:34 +0000</pubDate>
		<dc:creator>Arlo</dc:creator>
				<category><![CDATA[Programming Principles]]></category>

		<guid isPermaLink="false">http://www.arlomedia.com/blog/?p=125</guid>
		<description><![CDATA[The difference between a web designer and a web developer like myself is like the difference between a fashion designer and a tailor or seamstress. The former conceptualizes what a product will look like, and the latter will actually create the product. I&#8217;ve worked with over a dozen designers and created over 100 websites, and [...]]]></description>
			<content:encoded><![CDATA[<p>The difference between a web designer and a web developer like myself is like the difference between a fashion designer and a tailor or seamstress. The former conceptualizes what a product will look like, and the latter will actually create the product.</p>
<p>I&#8217;ve worked with over a dozen designers and created over 100 websites, and I routinely encounter confusion about how this process works.<span id="more-125"></span> The problem is that some designers and some clients become so focused on perfecting the conceptualizations &#8212; image files created in Photoshop or Illustrator &#8212; that they forget that those are not the ultimate product. Here are a few concepts to keep in mind if you&#8217;re working on the design phase of a web project:</p>
<ol>
<li>Implementing a web design is not a process of &#8220;converting&#8221; the design files to a web format, it&#8217;s a process of building a website using the design files as a guide &#8212; just like a house must be built using blueprints as a guide.</li>
<li>The goal of any good developer is to match those depictions as closely as possible, but the more particular you are about the details, the longer that process will take. To take a simple example, if the design files show some leading between lines of text, most developers will see that and implement it. But if the developer set the leading to 10 pixels and you had your heart set on 11, the developer will have to spend time revising that.</li>
<li>It&#8217;s not important that the design files depict every page in exactly the way it will appear on the web. What&#8217;s important is that they depict every element that will appear somewhere in your site. For example, if you have a different submenu for each of five site sections, you don&#8217;t need to provide five different designs &#8212; just give the developer one design and he or she can extrapolate the other four from that. A less intuitive example is icons. If you have a half-dozen different icons that appear on a dozen different pages, it&#8217;s more convenient to give the developer one file containing only those icons, than a dozen files showing the complete pages in which they appear. Conversely, if the site contains an unusual page with unique elements, you must provide a file showing that page or at least those elements.</li>
<li>The individual elements are typically what the developer will spend time the most time implementing &#8230; combining them together to make each page is the easy part. So it&#8217;s helpful to think of your design as a collection of elements rather than a complete whole. How many elements are there &#8212; did you create four different styles of buttons, when two would suffice? Does every page use the same handful of text styles, or do you envision dozens of different text styles throughout the site? If you try making a list of every element you&#8217;ve designed and giving each element a name, you&#8217;ll have an idea of what the developer will face.</li>
<li>In most cases, the website you&#8217;re designing will grow and evolve &#8230; usually before the design phase is even complete. Therefore, it&#8217;s important to think of different ways in which the design elements can be reused. If you provide a box to present a couple sidebar blurbs, can that box expand to accommodate a longer blurb in the future? If the main menu contains five items now, does the design allow for adding two or three more? Will new text use a small number of styles, or will the person entering the text also have to perform a lot of formatting to keep the look consistent?</li>
</ol>
<p>If you think of the design as one step in the middle of a long process, rather than the end result, you should be able to create a design that is both easier to implement and more flexible and valuable over time.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.arlomedia.com/blog/2010/10/26/designing-like-a-developer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What screen size to design for?</title>
		<link>http://www.arlomedia.com/blog/2010/06/15/what-screen-size-to-design-for/</link>
		<comments>http://www.arlomedia.com/blog/2010/06/15/what-screen-size-to-design-for/#comments</comments>
		<pubDate>Tue, 15 Jun 2010 00:10:02 +0000</pubDate>
		<dc:creator>Arlo</dc:creator>
				<category><![CDATA[Programming Principles]]></category>

		<guid isPermaLink="false">http://www.arlomedia.com/blog/?p=30</guid>
		<description><![CDATA[The traditional question for web designers to ask before starting a project is, what screen size should we design for? The answer usually comes from looking at a table of browser statistics showing the screen sizes that web users currently own. The problem with this approach is that users don&#8217;t always size their web browser [...]]]></description>
			<content:encoded><![CDATA[<p>The traditional question for web designers to ask before starting a project is, what screen size should we design for? The answer usually comes from looking at a table of browser statistics showing the screen sizes that web users currently own.</p>
<p>The problem with this approach is that users don&#8217;t always size their web browser windows to fill their screens.<span id="more-30"></span> Actually, many users do, but they shouldn&#8217;t &#8212; especially with ever-increasing screen sizes. After all, the purpose of a large screen is not to let you view one thing at a time, with more empty space around it &#8212; it&#8217;s to let you view more things at one time. It&#8217;s just like a large desk or workbench that lets you spread out several documents or tools for easy access. Most people don&#8217;t buy large desks so they can read large pieces of paper, but so they can lay out several pieces of paper side by side.</p>
<p>To accommodate this, web designers should not view their job as &#8220;how to fill up those big screens.&#8221; Instead, they should design a site at the smallest reasonable size and then let users arrange that how they wish within their workspace.</p>
<p>An even better approach is to design a site that can automatically expand and contract to correspond to the user&#8217;s window (not screen) size. If a user wants to view a number of smaller windows, the site will look good; if a user wants to view just one large window, the site will also look good. This is called &#8220;liquid design,&#8221; and although most designers don&#8217;t approach their work in this way, I always advocate for it. &#8220;Fixed&#8221; designs are still more popular, but with computing devices ranging from 40&#8243; flat-panel displays to 2.4&#8243; phones, I&#8217;m hoping more designers come to realize that the best person to decide what size to make the site is the end user.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.arlomedia.com/blog/2010/06/15/what-screen-size-to-design-for/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Why is programming hard?</title>
		<link>http://www.arlomedia.com/blog/2010/05/12/why-is-programming-hard/</link>
		<comments>http://www.arlomedia.com/blog/2010/05/12/why-is-programming-hard/#comments</comments>
		<pubDate>Wed, 12 May 2010 17:38:13 +0000</pubDate>
		<dc:creator>Arlo</dc:creator>
				<category><![CDATA[Programming Principles]]></category>

		<guid isPermaLink="false">http://www.arlomedia.com/blog/?p=35</guid>
		<description><![CDATA[In The Mythical Man-Month, Fred Brooks distinguishes between aspects of programming that are hard because we don&#8217;t manage them well enough, versus aspects of programming that are inherently hard. This has stuck in my mind over the years as I&#8217;ve thought about how to improve my techniques. Today I was thinking about one inherent problem, [...]]]></description>
			<content:encoded><![CDATA[<p>In <em>The Mythical Man-Month,</em> Fred Brooks distinguishes between aspects of programming that are hard because we don&#8217;t manage them well enough, versus aspects of programming that are inherently hard. This has stuck in my mind over the years as I&#8217;ve thought about how to improve my techniques.<span id="more-35"></span></p>
<p>Today I was thinking about one inherent problem, which is the level of specificity that programming requires. I don&#8217;t think most people understand this, so I wanted to take a shot at explaining it. To make this a little more concrete, let&#8217;s imagine that you&#8217;re designing software for a robot, which will help with your cooking.</p>
<p>You don&#8217;t like chopping vegetables, so you decide to program your robot to carry out that task. First, you program it to distinguish a vegetable from other objects in the kitchen. In this process, you realize how many different shapes vegetables come in, and how difficult it is to tell a vegetable apart from other objects. But eventually you limit yourself to 10 different vegetables and teach your robot to recognize them.</p>
<p>Next comes chopping. The basic up-and-down motion of the knife is easy enough to program, but there are a lot of decisions to be made during the chopping process. How large should the pieces be? What shape? This varies by the recipe and maybe by the vegetable, so you end up creating a chart that your robot can refer to when beginning a new chopping task.</p>
<p>You&#8217;ve spent more time on this than you expected, but now your robot is working pretty well. You set it to work on a bag of potatoes and turn your attention to other things. OOPS &#8212; when you look again, the robot has chopped a few rotten sections of potatoes along with the good sections. Your robot doesn&#8217;t know how to recognize bruises or spoiling, so you have to teach it that, too. Unfortunately, a rotten potato looks different than a rotten tomato, so you need more charts explaining all the possibilities. Eventually, by trying some different vegetables and watching the robot carefully, you get it to correctly identify and reject rotten vegetables every time, without throwing away too many good vegetables in the process.</p>
<p>Satisfied, you leave the room to work on something else, and come back in a few hours. OOPS &#8212; the bowl that the robot was using is full, and the chopped vegetables are overflowing onto the countertop and the floor. Now you need to teach the robot how to tell if the bowl is full, and what to do when that happens.</p>
<p>I think you see the problem now: software (whether in a website or a robot) only does what we tell it to do, and no more. The key is thinking, in advance, of every specific instruction we will need to provide, for every possible scenario. But this is difficult because our own minds are very adaptable and don&#8217;t require so much planning.</p>
<p>This is where my job as a programmer comes in. If a client asks me to build a robot that &#8220;chops vegetables,&#8221; I need to translate that to a robot that &#8220;identifies particular vegetables, divides them into particular sizes and shapes, rejects pieces that don&#8217;t meet particular standards, and stores them appropriately.&#8221; To the extent that I can think of these requirements in advance, I can offer an accurate time and budget estimate, and build a product that the client is happy with.</p>
<p>By the way, I have a narrower definition of &#8220;bug&#8221; than most people, and that&#8217;s easy to discuss using this analogy. When you found that your robot was not discarding the rotten vegetables, was that a bug? I would say no, because nobody had bothered to tell the robot about rottenness. That&#8217;s a problem, but it&#8217;s not the robot&#8217;s fault! If, on the other hand, you had programmed the robot to recognize a particular kind of rottenness in a particular vegetable, and it still failed to do so, then you&#8217;d have a bug &#8212; a piece of software that&#8217;s not doing a task it was specifically designed to do.</p>
<p>The good news is that once we get that robot working, it will chop a heck of a lot of vegetables without further intervention. The bad news is that it falls upon us to define in advance every detail of that task.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.arlomedia.com/blog/2010/05/12/why-is-programming-hard/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Backups, backups, backups</title>
		<link>http://www.arlomedia.com/blog/2010/03/07/backups-backups-backups/</link>
		<comments>http://www.arlomedia.com/blog/2010/03/07/backups-backups-backups/#comments</comments>
		<pubDate>Sun, 07 Mar 2010 05:19:26 +0000</pubDate>
		<dc:creator>Arlo</dc:creator>
				<category><![CDATA[Programming Principles]]></category>

		<guid isPermaLink="false">http://www.arlomedia.com/blog/?p=26</guid>
		<description><![CDATA[I&#8217;ve always been fanatical about backups, based on the mantra that in the computer age, one should never have to do the same work twice. My standard policy is that I keep all project files in a version control system, back up my computer daily, and make an offsite backup monthly. This works great with [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve always been fanatical about backups, based on the mantra that in the computer age, one should never have to do the same work twice. <span id="more-26"></span>My standard policy is that I keep all project files in a version control system, back up my computer daily, and make an offsite backup monthly. This works great with the development model where I create all the files in a website on my computer, then upload them to the remote server. My computer is, essentially, the master copy and the server files are secondary.</p>
<p>When my favorite hosting company had an incident recently, losing data for two of my clients&#8217; sites, I realized that this model is quite outdated. Modern websites consist of much more than the developer&#8217;s files. With a content management system, my clients are adding content and files from different locations that are only collected in one place on the server. And with a social networking site, users are adding content constantly, without which the site would be worthless. Without an automated backup of the site&#8217;s database and root directory, replacing content added by the clients is time-consuming, and replacing content added by users is impossible.</p>
<p>My solution is a new system I&#8217;ve created for my clients. It allows me to configure automated backups of the database and the root directory, at different intervals if needed, as frequently as once per hour. I and/or my clients can receive email notifications of every backup, and every backup failure. The backup files are saved at a different datacenter than any of the sites, and are available to clients any time at a password-protected web page. Clients can even log in and run a manual backup at any time.</p>
<p>This should bring my backup strategy up to the level of my current website development. I can&#8217;t say I&#8217;m looking forward to using it, but I do like knowing it&#8217;s there!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.arlomedia.com/blog/2010/03/07/backups-backups-backups/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
    			
						</div></div>
						
						<div class="reset"></div>
			
					</div>
				</div></div>
				<div class="box_body_bottom_left"><div class="box_body_bottom_right"></div></div>
		
			</div>
			
			<div id="footer">
				 <p class="body">Arlo Leach &bull; 773.769.6106  &bull;
				<script language="JavaScript" type="text/javascript">
show_email('arlo', 'arlomedia', 'com');
				</script>
</p>
			</div>
		
		</div>
		
		<script type="text/javascript">
			add_rollover_events(menu_buttons);
			set_active_item("menu", page);
		</script>

		<script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script>
		<script type="text/javascript">
			_uacct = "UA-1087837-1";
			urchinTracker();
		</script>

	</body>

</html>
<!-- Can't connect to the reporter database to log site traffic -->

