<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>"Hello World" - The SlickEdit Developer Blog</title>
	
	<link>http://blog.slickedit.com</link>
	<description>"Hello World" - The SlickEdit Developer Blog</description>
	<lastBuildDate>Wed, 23 Sep 2009 14:23:51 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/helloWorld-TheSlickeditDeveloperBlog" type="application/rss+xml" /><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2FhelloWorld-TheSlickeditDeveloperBlog" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FhelloWorld-TheSlickeditDeveloperBlog" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2FhelloWorld-TheSlickeditDeveloperBlog" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/helloWorld-TheSlickeditDeveloperBlog" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FhelloWorld-TheSlickeditDeveloperBlog" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FhelloWorld-TheSlickeditDeveloperBlog" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FhelloWorld-TheSlickeditDeveloperBlog" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
		<title>Hey, Check Out My Slick New Editor!</title>
		<link>http://feedproxy.google.com/~r/helloWorld-TheSlickeditDeveloperBlog/~3/Sns4AIoNEBA/</link>
		<comments>http://blog.slickedit.com/2009/09/hey-check-out-my-slick-new-editor/#comments</comments>
		<pubDate>Wed, 23 Sep 2009 14:21:01 +0000</pubDate>
		<dc:creator>jjones</dc:creator>
				<category><![CDATA[Code Editors]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[SlickEdit Products]]></category>
		<category><![CDATA[Diffzilla]]></category>
		<category><![CDATA[Macro Record/Playback]]></category>
		<category><![CDATA[Refactoring]]></category>
		<category><![CDATA[Regular Expressions]]></category>
		<category><![CDATA[slickedit]]></category>

		<guid isPermaLink="false">http://blog.slickedit.com/?p=396</guid>
		<description><![CDATA[Greg Christopher of VMware has written an article for DevX.com: Hey, Check Out My Slick New Editor!
In the article he discussing some of his favorite features of SlickEdit and why SlickEdit is his code editor of choice for programming.
On objections on switching editors
If your current editor works well enough for you, why switch? The answer depends [...]]]></description>
			<content:encoded><![CDATA[<p>Greg Christopher of VMware has written an article for DevX.com: <a href="http://www.devx.com/enterprise/Article/42874/0/page/1"><strong>Hey, Check Out My Slick New Editor!</strong></a></p>
<p>In the article he discussing some of his favorite features of SlickEdit and why SlickEdit is his code editor of choice for programming.</p>
<p><strong>On objections on switching editors</strong></p>
<blockquote><p>If your current editor works well enough for you, why switch? The answer depends on how you define &#8220;well enough.&#8221; Your current editor probably handles every editing command you think you need now, but consider the possibility that something could make you far more productive. You&#8217;ll see a few examples in a moment, but first, here are some of the reasons you might decide not to switch editors.</p></blockquote>
<p><span id="more-396"></span> <strong>Regular Expression Search and Replace</strong></p>
<blockquote><p>This isn&#8217;t an exclusive SlickEdit feature, some other editors have it too; but if you haven&#8217;t had the opportunity to experience regular expression searches, you should really consider switching to an editor that supports the feature.</p></blockquote>
<p><strong>Macro Record/Playback</strong></p>
<blockquote><p>SlickEdit carries out many of its commands through its slick-C programming language (note that both Brief and Emacs have their own languages as well). SlickEdit lets you write your own macros, or do a simple record / playback. This comes in handy when the syntax for find and replace gets too dicey.</p></blockquote>
<p><strong>Other Features</strong></p>
<blockquote><p>As you might imagine, because SlickEdit&#8217;s been around for 20 years, this article just scratches the surface.</p></blockquote>
<p>Continue reading <a href="http://www.devx.com/enterprise/Article/42874/0/page/1">Hey, Check Out My Slick New Editor<strong>!</strong></a> here: <a href="http://www.devx.com/enterprise/Article/42874/0/page/1">http://www.devx.com/enterprise/Article/42874/0/page/1 </a></p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.slickedit.com%2F2009%2F09%2Fhey-check-out-my-slick-new-editor%2F';
  addthis_title  = 'Hey%2C+Check+Out+My+Slick+New+Editor%21';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=Sns4AIoNEBA:JTY5aTceA14:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=Sns4AIoNEBA:JTY5aTceA14:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=Sns4AIoNEBA:JTY5aTceA14:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=Sns4AIoNEBA:JTY5aTceA14:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=Sns4AIoNEBA:JTY5aTceA14:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=Sns4AIoNEBA:JTY5aTceA14:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=Sns4AIoNEBA:JTY5aTceA14:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=Sns4AIoNEBA:JTY5aTceA14:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/helloWorld-TheSlickeditDeveloperBlog/~4/Sns4AIoNEBA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.slickedit.com/2009/09/hey-check-out-my-slick-new-editor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.slickedit.com/2009/09/hey-check-out-my-slick-new-editor/</feedburner:origLink></item>
		<item>
		<title>Automating SlickEdit with Snow Leopard Services</title>
		<link>http://feedproxy.google.com/~r/helloWorld-TheSlickeditDeveloperBlog/~3/iGU-Q_y0fOE/</link>
		<comments>http://blog.slickedit.com/2009/09/automating-slickedit-with-snow-leopard-services/#comments</comments>
		<pubDate>Fri, 18 Sep 2009 13:45:40 +0000</pubDate>
		<dc:creator>Matthew E</dc:creator>
				<category><![CDATA[Productivity]]></category>
		<category><![CDATA[SlickEdit Products]]></category>
		<category><![CDATA[SlickEdit Mac]]></category>

		<guid isPermaLink="false">http://blog.slickedit.com/?p=379</guid>
		<description><![CDATA[I have always liked the idea of the Services menu, but found it frustratingly crowded and not often helpful. And I always thought Automator had real potential, but I never really found a place for it in my day-to-day work. With the improvements to the Services menu in Snow Leopard, the combination of these features is wonderfully [...]]]></description>
			<content:encoded><![CDATA[<p>I have always liked the idea of the Services menu, but found it frustratingly crowded and not often helpful. And I always thought Automator had real potential, but I never really found a place for it in my day-to-day work. With the improvements to the Services menu in Snow Leopard, the combination of these features is wonderfully useful.</p>
<p>SlickEdit&#8217;s Slick-C macro language should be no stranger to our users, but many folks aren&#8217;t aware that macros can be called when SlickEdit is started. In this tutorial, I&#8217;ll demonstrate how to use Automator to create a simple text service for SlickEdit, using this macro call facility.<span id="more-379"></span></p>
<p>First, launch the <strong>Automator</strong> application and create a new service using the Service template. At the top of the new workflow, it should say <em>Service receives <strong>selected text</strong> in <strong>any application</strong></em>. Make sure <em>Replaces selected text</em> is <strong>not</strong><em> </em>checked.</p>
<p>From the library&#8217;s actions panel, select the <strong>Text &gt; New Text File </strong>action, and drag it into the workflow as the first item. Pick a name and location for the temporary file to be saved, and make sure <em>Replace existing files </em>is checked, or else you&#8217;ll receive an Automator error the second time you use the service. Select the Encoding to be (UTF-8).</p>
<p>From the library&#8217;s action panel, select the <strong>Utilities &gt; Run Shell Script</strong> action, and drag it into workflow as the second item. The shell should be set to the default of <strong>/bin/bash</strong>. Change the right-hand drop-down to read <em>Pass input <strong>as arguments</strong></em>.</p>
<p>Delete any existing text in the shell script editor. Add the following text as the first line.</p>
<pre>export VSLICKXNOPLUSNEWMSG="1"</pre>
<p>Switch to Finder, and navigate to the Applications directory. Highlight your SlickEdit application, and Control-Click the application, and select <em>Show Package Contents</em> from the context menu. Drill down to the <strong>Contents/slickedit/bin</strong>, highlight the <strong>vs </strong>executable, and drag this into the shell script editor. This will insert the full path to the executable in the script editor. Make sure it&#8217;s on a new line after the export line you just typed.<br />
Append the following right after vs, making sure the command is all one line.</p>
<pre>-#new-file "-#get $1"&amp;</pre>
<p>The full script should look like the following:</p>
<pre>export VSLICKXNOPLUSNEWMSG="1"
/Applications/SlickEditV1402.app/Contents/slickedit/bin/vs -#new-file "-#get $1"&amp;</pre>
<div id="attachment_380" class="wp-caption alignnone" style="width: 160px"><a href="http://blog.slickedit.com/wp-content/uploads/2009/09/AutomatorService.png"><img class="size-thumbnail wp-image-380" src="http://blog.slickedit.com/wp-content/uploads/2009/09/AutomatorService-150x150.png" alt="Automator Service" width="150" height="150" /></a><p class="wp-caption-text">Automator Service</p></div>
<p>Don&#8217;t forget the ampersand at the end of the second line. Save the service, (⌘+S), and give it the name &#8220;New SlickEdit File&#8221;.</p>
<p>Switch to another application, like Safari or TextEdit, highlight some text, and pull down the application&#8217;s services menu. Your new service should now be available in the menu in the Text category.</p>
<p>The SlickEdit &#8220;magic&#8221; is done with the <strong>-#</strong> arguments. These specify macros to be called when SlickEdit in invoked. Any SlickEdit macro command (defined with the <span style="color: #0000ff">_command</span> keyword in Slick-C) can be called. Surround the entire -# argument with quotes if the Slick-C command takes any parameters, like the <strong>get</strong> macro in this example.</p>
<p>You can create a similar service that will insert the text into the currently active document by simply removing the <strong>-#new-file</strong> argument.</p>
<p>By default, service workflows are saved under $HOME/Library/Services. You can remove the service by removing this file.</p>
<p>To rename a Service, select the workflow file under $HOME/Library/Services, Control-Click to bring up the context menu, and select Show Package Contents. Look for the <strong>Contents/Info.plist</strong> file, and open it in the Property List Editor application. Change the value of the <strong>Services/Item/Menu/Menu item title</strong> entry. You do not need to rename the workflow file itself.</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.slickedit.com%2F2009%2F09%2Fautomating-slickedit-with-snow-leopard-services%2F';
  addthis_title  = 'Automating+SlickEdit+with+Snow+Leopard+Services';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=iGU-Q_y0fOE:h5PmZYFPrtM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=iGU-Q_y0fOE:h5PmZYFPrtM:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=iGU-Q_y0fOE:h5PmZYFPrtM:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=iGU-Q_y0fOE:h5PmZYFPrtM:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=iGU-Q_y0fOE:h5PmZYFPrtM:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=iGU-Q_y0fOE:h5PmZYFPrtM:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=iGU-Q_y0fOE:h5PmZYFPrtM:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=iGU-Q_y0fOE:h5PmZYFPrtM:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/helloWorld-TheSlickeditDeveloperBlog/~4/iGU-Q_y0fOE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.slickedit.com/2009/09/automating-slickedit-with-snow-leopard-services/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.slickedit.com/2009/09/automating-slickedit-with-snow-leopard-services/</feedburner:origLink></item>
		<item>
		<title>Diminishing the Role of Folklore in Software Development</title>
		<link>http://feedproxy.google.com/~r/helloWorld-TheSlickeditDeveloperBlog/~3/T3raLheo178/</link>
		<comments>http://blog.slickedit.com/2009/09/diminishing-the-role-of-folklore-in-software-development/#comments</comments>
		<pubDate>Thu, 10 Sep 2009 13:45:52 +0000</pubDate>
		<dc:creator>Scott Westfall</dc:creator>
				<category><![CDATA[Dev Management]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.slickedit.com/?p=347</guid>
		<description><![CDATA[There&#8217;s a great old commercial for Tootsie Roll Tootsie Pops that reminds me a lot of what happens on most software projects. The commercial features a crudely drawn cartoon of a boy trying to figure out a vitally important question.
Boy: Mr. Turtle, how many licks does it take to get to the Tootsie Roll center [...]]]></description>
			<content:encoded><![CDATA[<p>There&#8217;s a great old <a href="http://en.wikipedia.org/wiki/Tootsie_Pops">commercial for Tootsie Roll Tootsie Pops</a> that reminds me a lot of what happens on most software projects. The commercial features a crudely drawn cartoon of a boy trying to figure out a vitally important question.</p>
<p><strong>Boy</strong>: Mr. Turtle, how many licks does it take to get to the Tootsie Roll center of a Tootsie Pop?<br />
<strong>Mr. Turtle</strong>: I&#8217;ve never even made it without biting. Ask Mr. Owl.<br />
<strong>Boy</strong>: Mr. Owl, how many licks does it take to get to the Tootsie Roll center of a Tootsie Pop?<br />
<strong>Mr. Owl</strong>: Let&#8217;s find out. A One&#8230; A two-HOO&#8230;A three.<br />
(crunch sound effect)<br />
<strong>Mr. Owl</strong>: Three!</p>
<p>This illustrates two common problems in oral communication. The first is the iterative process of finding someone who might know the answer to your question. In software development, the questions are typically of a more concrete nature, relating to a specific design or implementation choice.<span id="more-347"></span></p>
<p>Most software projects depend on a great deal of local knowledge. This is knowledge that is specific to the project, something you couldn&#8217;t know prior to working on the project. This include things like architectural and design details. The local knowledge is rarely written down in an organized manner but is contained in the collective experience of the development team. Because it isn&#8217;t written down and cataloged it cannot be searched, except through the iterative query process.</p>
<p>The other problem that this commercial illustrates is that of false experts. Like Mr. Owl, you will find people who will give you a definitive answer but one that is, unfortunately, wrong. In software development, it can be very difficult to spot these wrong answers&#8211;you don&#8217;t get to see someone just bite into the Tootsie Pop to come up with it.</p>
<p>In some cases, the person may truly believe the answer they give, and we&#8217;ll assume that until we have proof to the contrary. At other times, people just don&#8217;t like to admit that they don&#8217;t know something. So, they make up an answer. In either case, the damage to your work is just as bad. </p>
<p>Folklore is typified by this kind of oral communication. It is the main method for communicating important information in primitive cultures. Knowledge is passed from one person to another. Often, because of miscommunication, the knowledge is corrupted by each successive telling. </p>
<p>It&#8217;s like that <a href="http://en.wikipedia.org/wiki/Chinese_whispers">party game where you start off with a sentence and have each person whisper it to another person</a>. This is repeated several times and then the last person writes down the sentence. In the end, the meaning of the sentence is often radically changed with comical results. The same thing happens in software development, but the results are far less comical.</p>
<p>The solution to both of these problems is to document local knowledge. One form of that is code comments. So much has been written on that topic, that I don&#8217;t feel the need to add more. However, many things are not appropriate to store in code comments. It&#8217;s that kind of knowledge that is most often passed along as folklore.</p>
<p>Fortunately, technology has given us a solution. A <a href="http://en.wikipedia.org/wiki/Wiki">wiki </a>provides a centralized knowledge repository that is edited by the group. This allows for the information to be easily reviewed for accuracy. It also eliminates the need to wander around and find someone who might know the answer to your question.</p>
<p>It also addresses another problem. Many people are hesitant to go ask questions. Either they are afraid of looking stupid, or they don&#8217;t want to trouble their coworkers. So, they will often flounder around trying to figure it out on their own, wasting time, or they will try to make due without the answer. A wiki allows people to find an answer without the potential embarrassment of exposing their ignorance. </p>
<p>To be successful, a wiki needs to be searchable and browseable. The search capability is needed to find the answer to specific questions. Browseability allows someone to view a set of topics and delve deeper to get more information. This is important to allow someone to gain the initial knowledge on a topic, particularly for getting new team members up to speed.  Most packages do a good job providing the search capability. But very few provide a good mechanism to build a browseable knowledge structure. </p>
<p>At SlickEdit, we use <a href="http://www.mediawiki.org/wiki/MediaWiki">MediaWiki </a>for our shared knowledge. It provides both an excellent search and a convenient means to organize topics. The side menu allows you to structure your top-level categories, and each page automatically includes a table of contents if it contains 4 or more subsections. This makes it simple to build a logical knowledge decomposition. It&#8217;s this capability to create a browseable structure that sets MediaWiki apart from other wiki software we tried. </p>
<p>Finding the right wiki software and setting up an initial structure is only the first step, though. The main challenge is getting the team to populate it. You face a couple of common problems here. </p>
<p>The first is the normal reluctance of programmers to document things. Many programmers despise any activity that is not directly related to producing code. This is a tough nut to crack, since this attitude is often deeply ingrained in the developers psyche. How you overcome this depends on the person and the arguments that they will listen to. You can appeal to their sense of professionalism and explain that this is part of professional development. You can appeal to their sense of teamwork and explain how this helps make the team more effective. You will need your full set of management skills to get everyone contributing.</p>
<p>Even if everyone is willing to contribute, one problem that often prevents a wiki from reaching its true potential is that of obviousness. Once you know something, it seems obvious to you. If it&#8217;s obvious, then why document it? This same problem plagues code comments. The best solution is to make the wiki an essential part of the problem solving process. When someone is trying to answer a question, they should look in the wiki. If they don&#8217;t find the answer, they should make a note to come back and add this information to the wiki after folklore has delivered an answer. </p>
<p>So, how does having a wiki alter the scenario depicted in the commercial?<br />
<strong>Boy</strong>: Hmm, I wonder how many licks does it take to get to the Tootsie Roll center of a Tootsie Pop?<br />
(Boy looks in wiki for the answer and finds an entry by Mr. Owl: &#8220;How many licks does it take to get to the Tootsie Roll center of a Tootsie Pop?  Three.&#8221;)</p>
<p>Well, at least he didn&#8217;t have to go bother curmudgeonly, old Mr. Turtle.</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.slickedit.com%2F2009%2F09%2Fdiminishing-the-role-of-folklore-in-software-development%2F';
  addthis_title  = 'Diminishing+the+Role+of+Folklore+in+Software+Development';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=T3raLheo178:YRA4iPzSFbQ:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=T3raLheo178:YRA4iPzSFbQ:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=T3raLheo178:YRA4iPzSFbQ:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=T3raLheo178:YRA4iPzSFbQ:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=T3raLheo178:YRA4iPzSFbQ:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=T3raLheo178:YRA4iPzSFbQ:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=T3raLheo178:YRA4iPzSFbQ:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=T3raLheo178:YRA4iPzSFbQ:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/helloWorld-TheSlickeditDeveloperBlog/~4/T3raLheo178" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.slickedit.com/2009/09/diminishing-the-role-of-folklore-in-software-development/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://blog.slickedit.com/2009/09/diminishing-the-role-of-folklore-in-software-development/</feedburner:origLink></item>
		<item>
		<title>My Economic Stimulus Plan: Cash for Clunky Editors</title>
		<link>http://feedproxy.google.com/~r/helloWorld-TheSlickeditDeveloperBlog/~3/WwjOo-vpOrw/</link>
		<comments>http://blog.slickedit.com/2009/08/my-economic-stimulus-plan-cash-for-clunky-editors/#comments</comments>
		<pubDate>Mon, 10 Aug 2009 16:52:59 +0000</pubDate>
		<dc:creator>Scott Westfall</dc:creator>
				<category><![CDATA[Code Editors]]></category>
		<category><![CDATA[Productivity]]></category>

		<guid isPermaLink="false">http://blog.slickedit.com/?p=339</guid>
		<description><![CDATA[As part of the economic stimulus package, the government has instituted a Cash for Clunkers program that pays people to trade in older, less fuel-efficient cars for new, more fuel-efficient ones. $1 billion was made available for this program, and it was quickly used up. So, Congress is debating allocating even more money. While the [...]]]></description>
			<content:encoded><![CDATA[<p>As part of the economic stimulus package, the government has instituted a Cash for Clunkers program that pays people to trade in older, less fuel-efficient cars for new, more fuel-efficient ones. $1 billion was made available for this program, and it was quickly used up. So, Congress is debating allocating even more money. While the government is in such a giving mood, I&#8217;d like to see a Cash for Clunky Editors program that pays people to trade in their current, less effective editor on a new, more powerful editor.</p>
<p>In terms of economic stimulus, this could have a much greater effect on the nation. Consider that many programmers use minimalist editors that provide little help to analyze and navigate their code, don&#8217;t include powerful completions, or features to cut the number of keystrokes necessary to type their code. If these programmers switched to a more powerful editor, like&#8230;oh, let&#8217;s say, SlickEdit&#8230;their productivity would go way up.<span id="more-339"></span></p>
<p>As the productivity of the individual programmers goes up, their projects would get done earlier or include more capabilities. This increases the productivity of the people using that software, which would then increase the profitability of those companies. Since software underlies almost every industry, this could lead to a potential boom, the likes of which hasn&#8217;t been seen since the post-WWII expansion. Suddenly, there&#8217;s a surge in the US GDP. We pay off the national debt in a few years and have money left over for a comprehensive public health care system.</p>
<p>And it all begins with getting people to switch to a more effective editor.</p>
<p>Unfortunately, SlickEdit isn&#8217;t big enough to warrant a special government program like this. We&#8217;re not one of those too-big-to-fail kind of companies. But that doesn&#8217;t mean you can&#8217;t experience your own little economic stimulus.</p>
<p>Look at your coding practices and see if a more powerful editor wouldn&#8217;t help you write more code faster with fewer errors. Though the government won&#8217;t pay you for switching, the boost in productivity surely will.</p>
<p><strong><br />
SlickEdit is Giving Cash for your Clunky Editor!<br />
<em>Cash for Clunky Editors Program:</em></strong></p>
<p>If the editor you purchased is lacking the <em>speed, power, and flexibility</em> SlickEdit provides…trade it in for CASH towards SlickEdit.  Call <strong>1-800-934-EDIT (3348)</strong> or email <a href="mailto:sales@slickedit.com">sales@slickedit.com</a>, and mention the Cash for Clunky Editors Program to learn about the savings.</p>
<p>The program expires on September 30<sup>th</sup>, 2009, so act quickly.</p>
<p>Happy coding,<br />
The SlickEdit Team</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.slickedit.com%2F2009%2F08%2Fmy-economic-stimulus-plan-cash-for-clunky-editors%2F';
  addthis_title  = 'My+Economic+Stimulus+Plan%3A+Cash+for+Clunky+Editors';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=WwjOo-vpOrw:--ocZgPc_pk:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=WwjOo-vpOrw:--ocZgPc_pk:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=WwjOo-vpOrw:--ocZgPc_pk:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=WwjOo-vpOrw:--ocZgPc_pk:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=WwjOo-vpOrw:--ocZgPc_pk:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=WwjOo-vpOrw:--ocZgPc_pk:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=WwjOo-vpOrw:--ocZgPc_pk:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=WwjOo-vpOrw:--ocZgPc_pk:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/helloWorld-TheSlickeditDeveloperBlog/~4/WwjOo-vpOrw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.slickedit.com/2009/08/my-economic-stimulus-plan-cash-for-clunky-editors/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.slickedit.com/2009/08/my-economic-stimulus-plan-cash-for-clunky-editors/</feedburner:origLink></item>
		<item>
		<title>On Hearing and Speaking the Truth</title>
		<link>http://feedproxy.google.com/~r/helloWorld-TheSlickeditDeveloperBlog/~3/06WVxS0IOUM/</link>
		<comments>http://blog.slickedit.com/2009/07/on-hearing-and-speaking-the-truth/#comments</comments>
		<pubDate>Mon, 06 Jul 2009 13:42:42 +0000</pubDate>
		<dc:creator>Scott Westfall</dc:creator>
				<category><![CDATA[Dev Management]]></category>

		<guid isPermaLink="false">http://blog.slickedit.com/?p=327</guid>
		<description><![CDATA[I&#8217;ve worked at two kinds of companies in my career:

those with open and honest communication
those whose communications better resembled Soviet-style propaganda

As a manager, I&#8217;ve always considered accurate information one of my most important assets. I need to know where we are and what it&#8217;s going to take to succeed. My team has standing orders to [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve worked at two kinds of companies in my career:</p>
<ol>
<li>those with open and honest communication</li>
<li>those whose communications better resembled Soviet-style propaganda</li>
</ol>
<p>As a manager, I&#8217;ve always considered accurate information one of my most important assets. I need to know where we are and what it&#8217;s going to take to succeed. My team has standing orders to let me know as soon as they figure out that they&#8217;re not going to make it so we can adjust the plan.</p>
<p>I&#8217;ve always been surprised when the people I have reported to didn&#8217;t share this enthusiasm. As managers, our chief responsibility is making effective decisions to achieve the stated goals. How can you possibly do that in an environment that doesn&#8217;t encourage people to speak the truth?<span id="more-327"></span></p>
<p>On one project, we developed the following phrase to report statuses, &#8220;I know of no reason that the project won&#8217;t be completed on time.&#8221; While most of us had serious misgivings about the plan, anytime someone voiced those concerns their manager would grill them like Perry Mason trying to get a confession. In the end, you really can&#8217;t prove that things won&#8217;t get done on time, so why get worked over for nothing.</p>
<p>This predilection for denial showed up when we were asked to build a new capability in about 3 months. I did some analysis and determined that it couldn&#8217;t be done and that it would take more like 9 months. My manager wasn&#8217;t happy with that estimate, so he asked some other developers. One said he could do it, which vindicated the manager and made him happy.</p>
<p>After 3 months, the project  was starting to come together, but the core of it still had a lot of work left. So the developer told the manager that he needed a couple more months. The manager, really needing this to get done, granted the extension. That cycle repeated itself a couple of times until, in the end, the project took about 9 months to complete.</p>
<p>You would think that the manager would be upset at a developer who so seriously underestimated the amount of work needed. Instead, he was roundly praised for his can-do attitude.</p>
<p>It takes courage to speak the truth, particularly when it is an unpopular truth. Likewise, it takes courage to be willing to hear the truth, since it will often conflict with your own beliefs and desires. Being willing to speak and hear the truth has always been the hallmark of the best companies for which I have worked.</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.slickedit.com%2F2009%2F07%2Fon-hearing-and-speaking-the-truth%2F';
  addthis_title  = 'On+Hearing+and+Speaking+the+Truth';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=06WVxS0IOUM:NfYa83R6kV8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=06WVxS0IOUM:NfYa83R6kV8:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=06WVxS0IOUM:NfYa83R6kV8:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=06WVxS0IOUM:NfYa83R6kV8:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=06WVxS0IOUM:NfYa83R6kV8:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=06WVxS0IOUM:NfYa83R6kV8:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=06WVxS0IOUM:NfYa83R6kV8:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=06WVxS0IOUM:NfYa83R6kV8:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/helloWorld-TheSlickeditDeveloperBlog/~4/06WVxS0IOUM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.slickedit.com/2009/07/on-hearing-and-speaking-the-truth/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://blog.slickedit.com/2009/07/on-hearing-and-speaking-the-truth/</feedburner:origLink></item>
		<item>
		<title>The SlickEdit Command Line</title>
		<link>http://feedproxy.google.com/~r/helloWorld-TheSlickeditDeveloperBlog/~3/fVNHqYYkOBQ/</link>
		<comments>http://blog.slickedit.com/2009/06/the-slickedit-command-line/#comments</comments>
		<pubDate>Tue, 23 Jun 2009 17:08:33 +0000</pubDate>
		<dc:creator>jjones</dc:creator>
				<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[slickedit]]></category>

		<guid isPermaLink="false">http://blog.slickedit.com/?p=325</guid>
		<description><![CDATA[Use SlickEdit commands instead of the mouse to save time as you work. Open the SlickEdit command line by pressing Esc (in most emulations), type the command and any options, then press Enter. If you use a command frequently, bind it to a keyboard shortcut to save even more time. Type “Slickedit command line” in [...]]]></description>
			<content:encoded><![CDATA[<p>Use SlickEdit commands instead of the mouse to save time as you work. Open the SlickEdit command line by pressing <strong>Esc</strong> (in most emulations), type the command and any options, then press Enter. If you use a command frequently, bind it to a keyboard shortcut to save even more time. Type “Slickedit command line” in the Help Index (<strong>Help &gt; Index</strong>) to learn more.</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.slickedit.com%2F2009%2F06%2Fthe-slickedit-command-line%2F';
  addthis_title  = 'The+SlickEdit+Command+Line';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=fVNHqYYkOBQ:ZEb7mKruffs:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=fVNHqYYkOBQ:ZEb7mKruffs:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=fVNHqYYkOBQ:ZEb7mKruffs:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=fVNHqYYkOBQ:ZEb7mKruffs:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=fVNHqYYkOBQ:ZEb7mKruffs:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=fVNHqYYkOBQ:ZEb7mKruffs:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=fVNHqYYkOBQ:ZEb7mKruffs:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=fVNHqYYkOBQ:ZEb7mKruffs:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/helloWorld-TheSlickeditDeveloperBlog/~4/fVNHqYYkOBQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.slickedit.com/2009/06/the-slickedit-command-line/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.slickedit.com/2009/06/the-slickedit-command-line/</feedburner:origLink></item>
		<item>
		<title>Why does SlickEdit insert “/**/” when I type “/*” ?</title>
		<link>http://feedproxy.google.com/~r/helloWorld-TheSlickeditDeveloperBlog/~3/CQJ7KK_8cZ4/</link>
		<comments>http://blog.slickedit.com/2009/06/why-does-slickedit-insert-%e2%80%9c%e2%80%9d-when-i-type-%e2%80%9c%e2%80%9d/#comments</comments>
		<pubDate>Wed, 17 Jun 2009 15:17:52 +0000</pubDate>
		<dc:creator>jjones</dc:creator>
				<category><![CDATA[Productivity]]></category>

		<guid isPermaLink="false">http://blog.slickedit.com/?p=323</guid>
		<description><![CDATA[This is to make it possible to create a multi-line comment without temporarily commenting out all the code from the /* to the end of the file or to the end of  the next already existing multi-line comment.  This makes it possible to keep your file in a syntacticly correct state.  This allows you to [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #29303b; font-family: Arial; font-size: 12px; line-height: 18px; text-align: left;">This is to make it possible to create a multi-line comment without temporarily commenting out all the code from the /* to the end of the file or to the end of  the next already existing multi-line comment.  This makes it possible to keep your file in a syntacticly correct state.  This allows you to use things like tag navigation or statement navigation to move to the location where you want to end the comment.  When you type */ in order to close the comment, the editor will search backwards for a matching /**/ and patch things up by deleting the */ characters.  The unique thing about this technique is that it gives you the benefit of keeping your code syntactically correct without actually changing what you type to create a comment at all.  You still type /*, then move your cursor down, then type */, just like you did before.</span></p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.slickedit.com%2F2009%2F06%2Fwhy-does-slickedit-insert-%25e2%2580%259c%25e2%2580%259d-when-i-type-%25e2%2580%259c%25e2%2580%259d%2F';
  addthis_title  = 'Why+does+SlickEdit+insert+%E2%80%9C%2F%2A%2A%2F%E2%80%9D+when+I+type+%E2%80%9C%2F%2A%E2%80%9D+%3F';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=CQJ7KK_8cZ4:uE5_WPkSqP0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=CQJ7KK_8cZ4:uE5_WPkSqP0:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=CQJ7KK_8cZ4:uE5_WPkSqP0:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=CQJ7KK_8cZ4:uE5_WPkSqP0:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=CQJ7KK_8cZ4:uE5_WPkSqP0:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=CQJ7KK_8cZ4:uE5_WPkSqP0:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=CQJ7KK_8cZ4:uE5_WPkSqP0:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=CQJ7KK_8cZ4:uE5_WPkSqP0:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/helloWorld-TheSlickeditDeveloperBlog/~4/CQJ7KK_8cZ4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.slickedit.com/2009/06/why-does-slickedit-insert-%e2%80%9c%e2%80%9d-when-i-type-%e2%80%9c%e2%80%9d/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.slickedit.com/2009/06/why-does-slickedit-insert-%e2%80%9c%e2%80%9d-when-i-type-%e2%80%9c%e2%80%9d/</feedburner:origLink></item>
		<item>
		<title>Clipboard Formats</title>
		<link>http://feedproxy.google.com/~r/helloWorld-TheSlickeditDeveloperBlog/~3/07adZosbsZY/</link>
		<comments>http://blog.slickedit.com/2009/06/clipboard-formats/#comments</comments>
		<pubDate>Thu, 11 Jun 2009 14:05:48 +0000</pubDate>
		<dc:creator>jjones</dc:creator>
				<category><![CDATA[Productivity]]></category>

		<guid isPermaLink="false">http://blog.slickedit.com/?p=319</guid>
		<description><![CDATA[SlickEdit supports RTF and HTML clipboard formats for Windows. This means you can paste formatted and color-coded text from SlickEdit into other applications. The HTML clipboard format type is enabled by default. You can change to the RTF format or turn the feature off completely using the Clipboard formats option (located at Tools &#62; Options [...]]]></description>
			<content:encoded><![CDATA[<p>SlickEdit supports RTF and HTML clipboard formats for Windows. This means you can paste formatted and color-coded text from SlickEdit into other applications. The HTML clipboard format type is enabled by default. You can change to the RTF format or turn the feature off completely using the <strong>Clipboard formats</strong> option (located at <strong>Tools &gt; Options &gt; Editing &gt; Selections</strong>).</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.slickedit.com%2F2009%2F06%2Fclipboard-formats%2F';
  addthis_title  = 'Clipboard+Formats';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=07adZosbsZY:qH8sSNQTVs8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=07adZosbsZY:qH8sSNQTVs8:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=07adZosbsZY:qH8sSNQTVs8:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=07adZosbsZY:qH8sSNQTVs8:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=07adZosbsZY:qH8sSNQTVs8:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=07adZosbsZY:qH8sSNQTVs8:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=07adZosbsZY:qH8sSNQTVs8:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=07adZosbsZY:qH8sSNQTVs8:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/helloWorld-TheSlickeditDeveloperBlog/~4/07adZosbsZY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.slickedit.com/2009/06/clipboard-formats/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.slickedit.com/2009/06/clipboard-formats/</feedburner:origLink></item>
		<item>
		<title>…But It’s More Fun to Reinvent the Wheel</title>
		<link>http://feedproxy.google.com/~r/helloWorld-TheSlickeditDeveloperBlog/~3/Uw2ldGwp7Ew/</link>
		<comments>http://blog.slickedit.com/2009/06/but-its-more-fun-to-reinvent-the-wheel/#comments</comments>
		<pubDate>Thu, 04 Jun 2009 17:17:44 +0000</pubDate>
		<dc:creator>Scott Westfall</dc:creator>
				<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.slickedit.com/?p=309</guid>
		<description><![CDATA[&#8220;Reinventing the wheel&#8221; is used as a common metaphor in software development for rewriting code that has already been written. For example, SlickEdit contains a number of features that traverse directories and process files, including Find in Files, DIFFzilla, Add Tree, and more. In each case the syntax used to exlclude files or directories is [...]]]></description>
			<content:encoded><![CDATA[<p>&#8220;Reinventing the wheel&#8221; is used as a common metaphor in software development for rewriting code that has already been written. For example, SlickEdit contains a number of features that traverse directories and process files, including Find in Files, DIFFzilla, Add Tree, and more. In each case the syntax used to exlclude files or directories is different. Sometimes the exclude specs are space delimited; sometimes they are delimited with semi-colons. Some require the use of asterisks to specify a directory; some don&#8217;t.</p>
<p>The basic reason for this is that each feature was written in isolation without finding and reusing the capabilities of the other features. This is a very common problem on most software projects. To address this issue, I believe that software development should be broken down into two different workflows: mechanism application and mechanism creation.</p>
<p>We can define a mechanism as a component with a cohesive set of functionality, like the wheel. In most cases, mechanisms are meant to be reusable, though it is possible that there will be only one use for that mechanism in a particular program. Common mechanisms in software include login processors, calendar widgets, and sorted lists. These elements perform a specific function that is independent of what they are used for.</p>
<p>Mechanisms can also be specific solutions to common design problems, like error logging, object persistence, and thread synchronization. Ideally, these would be encapsulated in a library that is used by other developers, but in some instances it is more a matter of following a specified convention.</p>
<p>For example, one project I worked on specified that each function would contain #ifdefs for tracing and logging with specific information that each function should output. This still represents a mechanism that defines a cohesive functionality, in this case, tracing. But instead of writing a reusable library, the mechanism was primarily a set of conventions we all followed when writing our functions.</p>
<p>During mechanism application, the specialized functionality of a feature is built using existing mechanisms. You can work on your own unless you have a question about the specs or need assistance from another developer. The code being written is unique to the feature, so little attention is given to reuse unless a new mechanism is needed. Then you enter mechanism creation.</p>
<p>During mechanism creation, you are developing a generalized capability that is specifically intended to be reusable. This requires a totally different workflow. You have to stop and do a degree of analysis before you create the new mechanism. Several questions need to be answered. Are you sure there isn&#8217;t already a mechanism for this? If not, what are the essential behaviors of this mechanism? Where should it be stored?</p>
<p>These questions are best addressed with other members of the team. The goal is to produce a mechanism that can be used by everyone, not just by you. So, you need to get their input to make sure it does more than meet your immediate needs, or at least doesn&#8217;t prevent someone from extending it in the future.</p>
<p>When a developer tackles the new mechanism as part of their normal development, two common problems occur. Often the programmer includes the mechanism as part of the feature-specific code, rather than placing the mechanism into the library where others can find it. Even when they do put the code in the proper place, it often is written in such a way that it is only useful for this feature. You can&#8217;t make it reusable without breaking the feature that already depends on it.</p>
<p>In most applications, mechanism application is very straightforward, simple programming and requires little creativity. Mechanism creation, on the other hand, requires a great deal of creativity and design effort. You have to think more about algorithms and efficiency.</p>
<p>So why don&#8217;t programmers naturally break their work into these separate workflows? I think there are a number of explanations.</p>
<p>First, I think programmers get very focused on completing a feature. If they have to interrupt that work to enter the slower and more deliberate workflow required to create a new mechanism, then it delays the attainment of their goal.</p>
<p>Secondly, programmers like to program. Designing reusable components requires meetings, documentation, and reviews&#8211;all of which get in the way of programming.</p>
<p>Thirdly, most programmers aren&#8217;t too keen on collaboration. When you talk things over in a group, you have a chance of not getting your way. If you just build it yourself, you can do it the way you think it should be done.</p>
<p>Finally, by separating the two workflows, the creation of a needed mechanism might be assigned to a different programmer. Since the creation of these mechanisms is often more challenging and, therefore, more fun; developers are hesitant to initiate a workflow that would potentially deprive them of this fun.</p>
<p>Basically, it&#8217;s more fun to reinvent the wheel than to determine whether a suitable wheel already exists. If the wheel does need to be invented, it&#8217;s less fun to do it with a committee of your peers who may disagree with your vision for the wheel.</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.slickedit.com%2F2009%2F06%2Fbut-its-more-fun-to-reinvent-the-wheel%2F';
  addthis_title  = '%26%238230%3BBut+It%26%238217%3Bs+More+Fun+to+Reinvent+the+Wheel';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=Uw2ldGwp7Ew:XHkiZhXUHU4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=Uw2ldGwp7Ew:XHkiZhXUHU4:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=Uw2ldGwp7Ew:XHkiZhXUHU4:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=Uw2ldGwp7Ew:XHkiZhXUHU4:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=Uw2ldGwp7Ew:XHkiZhXUHU4:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=Uw2ldGwp7Ew:XHkiZhXUHU4:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=Uw2ldGwp7Ew:XHkiZhXUHU4:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=Uw2ldGwp7Ew:XHkiZhXUHU4:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/helloWorld-TheSlickeditDeveloperBlog/~4/Uw2ldGwp7Ew" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.slickedit.com/2009/06/but-its-more-fun-to-reinvent-the-wheel/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.slickedit.com/2009/06/but-its-more-fun-to-reinvent-the-wheel/</feedburner:origLink></item>
		<item>
		<title>No Small Changes</title>
		<link>http://feedproxy.google.com/~r/helloWorld-TheSlickeditDeveloperBlog/~3/gUFv5ud8kak/</link>
		<comments>http://blog.slickedit.com/2009/05/no-small-changes/#comments</comments>
		<pubDate>Thu, 14 May 2009 15:12:19 +0000</pubDate>
		<dc:creator>Scott Westfall</dc:creator>
				<category><![CDATA[Dev Management]]></category>
		<category><![CDATA[SlickEdit Products]]></category>

		<guid isPermaLink="false">http://blog.slickedit.com/?p=296</guid>
		<description><![CDATA[Recent experiences with SlickEdit 2009 have reminded me that there are no small changes. Even when you think you understand the nature of a change, severe side-effects can pop up in complex software.
This was the case when we put out our first release of SlickEdit 2009, version 14.0.0.5. We had completed our usual beta cycle [...]]]></description>
			<content:encoded><![CDATA[<p>Recent experiences with SlickEdit 2009 have reminded me that there are no small changes. Even when you think you understand the nature of a change, severe side-effects can pop up in complex software.</p>
<p>This was the case when we put out our first release of SlickEdit 2009, version 14.0.0.5. We had completed our usual beta cycle before releasing this version, which included a number of drops to correct reported problems. After the last beta drop, we made a few more changes, all of which seemed totally risk-free.</p>
<p>Within two hours of releasing SlickEdit 2009, we had reports of severe problems with the File tabs and the File list. These problems trace back to one of these simple, risk-free changes. We had done our normal testing after these changes, and we hadn&#8217;t discovered any problems. But this problem was so severe we had to pull the release until it could be fixed.</p>
<p>So, what did we learn from this?</p>
<p>First, there are no small changes. Even when you think you know the effect a change will have, you could be wrong.</p>
<p>Should we have tested more? Sure, you can always test more, but that is no guarantee that you will find a problem. Testing suffers from a horizon effect: you can only see as far as you test. The problem you need to find could lay just beyond or miles beyond. You don&#8217;t know until you find it.</p>
<p>Second, testing is different than using. When you are testing, you click all the buttons and try all the functions, but you are rarely able to perform all combinations of operations. Some problems depend on the order in which operations are invoked. Others require multiple operations before the problem surfaces, as was the case with the problem we missed.</p>
<p>It should be no surprise that the parts of SlickEdit that work the best are the things we use everyday. But there are many languages we don&#8217;t use on a daily basis. Even if we did, with a product like SlickEdit, our testing cannot hope to replicate the variety and complexity of our customers&#8217; use patterns.</p>
<p>We&#8217;ve determined that prior to shipping any release, we need help validating it. So, we&#8217;ll create a Release Candidate when we have finished our testing. We&#8217;ll make the Release Candidate available for early adopters to test, and if all goes well, it will be used for the General Availability release. In this way, we hope to catch more problems before they are set free to roam the countryside and terrorize the populace.</p>
<p><strong>Q&amp;A</strong></p>
<p><strong>Does that mean you&#8217;ve given up on testing? </strong>No, we plan to continue testing just as we always have. We just need help with final validation.</p>
<p><strong>What if I don&#8217;t have time to help you catch problems?</strong> Then wait until a release is no longer a release candidate. At that point, others will have helped to validate it, and you will have less likelihood of experiencing issues with a new version.</p>
<p><strong>If an unladen swallow flies west from New York&#8230;</strong></p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.slickedit.com%2F2009%2F05%2Fno-small-changes%2F';
  addthis_title  = 'No+Small+Changes';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=gUFv5ud8kak:Kmn5dLCBPMA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=gUFv5ud8kak:Kmn5dLCBPMA:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=gUFv5ud8kak:Kmn5dLCBPMA:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=gUFv5ud8kak:Kmn5dLCBPMA:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=gUFv5ud8kak:Kmn5dLCBPMA:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=gUFv5ud8kak:Kmn5dLCBPMA:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=gUFv5ud8kak:Kmn5dLCBPMA:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=gUFv5ud8kak:Kmn5dLCBPMA:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/helloWorld-TheSlickeditDeveloperBlog/~4/gUFv5ud8kak" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.slickedit.com/2009/05/no-small-changes/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://blog.slickedit.com/2009/05/no-small-changes/</feedburner:origLink></item>
		<item>
		<title>S-Expression Navigation</title>
		<link>http://feedproxy.google.com/~r/helloWorld-TheSlickeditDeveloperBlog/~3/Yc6vf-dKLDk/</link>
		<comments>http://blog.slickedit.com/2009/05/s-expression-navigation/#comments</comments>
		<pubDate>Mon, 11 May 2009 16:40:13 +0000</pubDate>
		<dc:creator>jjones</dc:creator>
				<category><![CDATA[Productivity]]></category>

		<guid isPermaLink="false">http://blog.slickedit.com/?p=294</guid>
		<description><![CDATA[Commands (and key bindings) are available for Emacs-like S-expression navigation. These work in all emulations.

The next_sexp (Ctrl+Alt+Right) and prev_sexp (Ctrl+Alt+Left) commands can be compared to next_word and prev_word, except that they treat blocks as words.
 The backward_up_sexp (Ctrl+Alt+Up) command is the shortcut for navigating to the start of the immediately enclosing block (in Lisp, this would be the [...]]]></description>
			<content:encoded><![CDATA[<p>Commands (and key bindings) are available for Emacs-like S-expression navigation. These work in all emulations.</p>
<ul>
<li>The <strong>next_sexp</strong> (Ctrl+Alt+Right) and <strong>prev_sexp</strong> (Ctrl+Alt+Left) commands can be compared to <strong>next_word</strong> and <strong>prev_word</strong>, except that they treat blocks as words.</li>
<li> The <strong>backward_up_sexp</strong> (Ctrl+Alt+Up) command is the shortcut for navigating to the start of the immediately enclosing block (in Lisp, this would be the open paren).</li>
<li>The <strong>forward_down_sexp</strong> (Ctrl+Alt+Down) command is used to drill into a block. If the cursor is at the start of a block, it moves the cursor to the first S-expression within the block; otherwise, it behaves like next_sexp.</li>
<li>The commands <strong>select_prev_sexp</strong> (Ctrl+Alt+Shift+Left) and <strong>select_next_sexp</strong> (Ctrl+Alt+Shift+Right) extend a character selection from the cursor position to the start of the next or previous S-expression, respectively. Like the Shift+Cursor commands do to CUA style selections, if executed repeatedly, they will extend the current character selection.</li>
<li> The <strong>cut_prev_sexp</strong> (Ctrl+Alt+Backspace) command will delete the S-expression to the left of the cursor and copy it to the clipboard. Again, if called repeatedly, this will prepend the subsequent deletions to the clipboard.</li>
</ul>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.slickedit.com%2F2009%2F05%2Fs-expression-navigation%2F';
  addthis_title  = 'S-Expression+Navigation';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=Yc6vf-dKLDk:11nBpAUC8Qo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=Yc6vf-dKLDk:11nBpAUC8Qo:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=Yc6vf-dKLDk:11nBpAUC8Qo:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=Yc6vf-dKLDk:11nBpAUC8Qo:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=Yc6vf-dKLDk:11nBpAUC8Qo:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=Yc6vf-dKLDk:11nBpAUC8Qo:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=Yc6vf-dKLDk:11nBpAUC8Qo:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=Yc6vf-dKLDk:11nBpAUC8Qo:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/helloWorld-TheSlickeditDeveloperBlog/~4/Yc6vf-dKLDk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.slickedit.com/2009/05/s-expression-navigation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.slickedit.com/2009/05/s-expression-navigation/</feedburner:origLink></item>
		<item>
		<title>How to Beat Down an “else” Statement in Three Keystrokes</title>
		<link>http://feedproxy.google.com/~r/helloWorld-TheSlickeditDeveloperBlog/~3/nX4QOfx17AI/</link>
		<comments>http://blog.slickedit.com/2009/04/how-to-beat-down-an-else-statement-in-three-keystrokes/#comments</comments>
		<pubDate>Tue, 28 Apr 2009 13:52:40 +0000</pubDate>
		<dc:creator>jjones</dc:creator>
				<category><![CDATA[Productivity]]></category>

		<guid isPermaLink="false">http://blog.slickedit.com/?p=286</guid>
		<description><![CDATA[Suppose you want to get from something like this:
 
       if ( cond ) {
          doSomething();
       } else {
          goSomewhere();
          doSomethingElse();
          comeBack();
          takeANap();
       }
 
To this:
 
       if ( cond ) {
         [...]]]></description>
			<content:encoded><![CDATA[<div>Suppose you want to get from something like this:</div>
<div> </div>
<div>       if ( cond ) {</div>
<div>          doSomething();</div>
<div>       } else {</div>
<div>          goSomewhere();</div>
<div>          doSomethingElse();</div>
<div>          comeBack();</div>
<div>          takeANap();</div>
<div>       }</div>
<div> </div>
<div>To this:</div>
<div> </div>
<div>       if ( cond ) {</div>
<div>          doSomething();</div>
<div>       }</div>
<div>       goSomewhere();</div>
<div>       doSomethingElse();</div>
<div>       comeBack();</div>
<div>       takeANap();</div>
<p>
<div>
1. First, put your cursor on else and press Ctrl+Shift+Right to select it.</div>
<div>2. Press Enter.</div>
<div>3. Press Ctrl+Delete, and select Unsurround the code block.</div>
<p></p>
<div>Though Unsurround does not normally apply to else blocks, this example shows how you can manipulate your code to make a feature work for you in order to save time.</div>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.slickedit.com%2F2009%2F04%2Fhow-to-beat-down-an-else-statement-in-three-keystrokes%2F';
  addthis_title  = 'How+to+Beat+Down+an+%26%238220%3Belse%26%238221%3B+Statement+in+Three+Keystrokes';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=nX4QOfx17AI:ehHb8ZLItKg:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=nX4QOfx17AI:ehHb8ZLItKg:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=nX4QOfx17AI:ehHb8ZLItKg:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=nX4QOfx17AI:ehHb8ZLItKg:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=nX4QOfx17AI:ehHb8ZLItKg:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=nX4QOfx17AI:ehHb8ZLItKg:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=nX4QOfx17AI:ehHb8ZLItKg:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=nX4QOfx17AI:ehHb8ZLItKg:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/helloWorld-TheSlickeditDeveloperBlog/~4/nX4QOfx17AI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.slickedit.com/2009/04/how-to-beat-down-an-else-statement-in-three-keystrokes/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.slickedit.com/2009/04/how-to-beat-down-an-else-statement-in-three-keystrokes/</feedburner:origLink></item>
		<item>
		<title>I miss paper</title>
		<link>http://feedproxy.google.com/~r/helloWorld-TheSlickeditDeveloperBlog/~3/j0ua1sqPvX0/</link>
		<comments>http://blog.slickedit.com/2009/04/i-miss-paper/#comments</comments>
		<pubDate>Thu, 23 Apr 2009 15:07:41 +0000</pubDate>
		<dc:creator>Scott Hackett</dc:creator>
				<category><![CDATA[Other]]></category>

		<guid isPermaLink="false">http://blog.slickedit.com/?p=275</guid>
		<description><![CDATA[I do my best to keep up with the latest technology and I like to read a lot about what&#8217;s going on in the world of programming.  However, I also have a limited amount of time to read.  Lately, I&#8217;ve been taking a hard look at my reading habits.  This is usually made up of [...]]]></description>
			<content:encoded><![CDATA[<p>I do my best to keep up with the latest technology and I like to read a lot about what&#8217;s going on in the world of programming.  However, I also have a limited amount of time to read.  Lately, I&#8217;ve been taking a hard look at my reading habits.  This is usually made up of going to my favorite group-think sites like <a href="http://www.reddit.com/r/programming/">reddit</a>, <a href="http://digg.com/programming">digg</a> or <a href="http://www.stumbleupon.com/tag/programming/">stumbleupon</a> and see what the latest programming blog posts are.  Over the last few years more and more of my reading has turned to blogs.  It feels more in touch with the community as a whole and keeps me on the edge of what&#8217;s going on.</p>
<p>The let down happened when I started thinking about the content of what I&#8217;m reading now versus what I was reading about 5-10 years ago.  Blog content is great, but it&#8217;s like reading a newspaper that&#8217;s nothing but a big editorial section.  Most posts are packed with unfiltered content that often falls into one of two categories; &#8220;You know what I think?&#8221; and &#8220;This is cool, check this out!&#8221;.   Both types of blog post are great and I&#8217;ve spent many, many hours reading these.  When I really thought about the content I&#8217;m reading though, I realized that I&#8217;m actually <strong>learning</strong> a lot less than I used to.  That wasn&#8217;t the only problem either.  Reading primarily in the browser has turned me into a skimmer, something I rarely used to do.  There&#8217;s so much pure bloggage out there that you have to skim and filter what&#8217;s worth reading and what&#8217;s not.  While that&#8217;s not awful in itself, I&#8217;ve noticed that I tend to retain a lot less when I read this way.  I also found that reading the blogs was only half of the reading I was doing.  The rest was reading people&#8217;s comments about what I had just read.  I can easily spend more time reading that than reading actual blog content.</p>
<p>At some point in your life, you say things or do things that make you think to yourself, &#8220;I&#8217;m really getting old.&#8221;  Everything is turning digital now.  Do I sound old yet?  In addition to programming, I&#8217;ve been a photographer for a long time, almost thirty years.  I started back in high school doing black and white film and eventually built a darkroom in my house.  About three years ago, I realized that buying film, paper and chemicals and spending countless hours in that darkroom could be replaced by spending a fraction of the time, at no cost, in front of my computer with Photoshop.  It was a sad realization, but I moved on to a digital SLR and turned the darkroom back into the original walk-in closet.  The only thing missing from Photoshop is actually feeling the film and the paper.  It may not sound like much, but after so many years I can say that those things are significant.  There&#8217;s something about handling the materials that puts you in touch with the process, and I haven&#8217;t found a replacement for that yet when I &#8220;develop&#8221; my photos the computer.</p>
<p>Reading is the same way.  There&#8217;s something about sitting down with a book that puts you in the mode of committing to read.  I can&#8217;t browse away from what I&#8217;m reading in a book with the click of a mouse.  Actually opening the book, holding it in my lap and turning the pages makes me feel like I&#8217;m ready to learning something new.  This is all about the experience of reading, and retaining what you read, without distraction.  It&#8217;s the same reason I wasn&#8217;t allowed to do my homework with the TV on when I was in school.  I can say for sure that I retain more when I read a book than when I read a blog at the computer.</p>
<p>Most computer books are also directed at actually teaching something.  Whether it&#8217;s a book about <a href="http://www.amazon.com/C-Programming-Language-Special-3rd/dp/0201700735/ref=sr_1_2?ie=UTF8&amp;s=books&amp;qid=1240491169&amp;sr=8-2">a programming language</a>, <a href="http://www.amazon.com/Design-Patterns-Object-Oriented-Addison-Wesley-Professional/dp/0201633612/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1240491211&amp;sr=8-1">a way of approaching design</a>, or <a href="http://www.amazon.com/Code-Complete-Practical-Handbook-Construction/dp/0735619670/ref=sr_1_8?ie=UTF8&amp;s=books&amp;qid=1240491211&amp;sr=8-8">how to see a development project through to completion</a>, most books teach.  However, it&#8217;s a rare occasion when a blog post really teaches you something.  Opinion pieces are great and have their place, but when the scale tips from spending time reading books to reading blog posts, you&#8217;re also tipping the the scale of how much you&#8217;re learning.</p>
<p>So now you&#8217;ve read a blog post about why you should try to read less blog posts.  You should probably eat more green vegetables and get eight hours of sleep each night, but I&#8217;ll save that for another post.  I&#8217;m going to try to make a change in my blogging, and do more writing that leaves readers with something more useful than a simple conversation piece.  Until then, try turning off the browser and go pick up a book&#8230; the trees will forgive you.</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.slickedit.com%2F2009%2F04%2Fi-miss-paper%2F';
  addthis_title  = 'I+miss+paper';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=j0ua1sqPvX0:MGNLh7G_ElY:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=j0ua1sqPvX0:MGNLh7G_ElY:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=j0ua1sqPvX0:MGNLh7G_ElY:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=j0ua1sqPvX0:MGNLh7G_ElY:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=j0ua1sqPvX0:MGNLh7G_ElY:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=j0ua1sqPvX0:MGNLh7G_ElY:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=j0ua1sqPvX0:MGNLh7G_ElY:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=j0ua1sqPvX0:MGNLh7G_ElY:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/helloWorld-TheSlickeditDeveloperBlog/~4/j0ua1sqPvX0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.slickedit.com/2009/04/i-miss-paper/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.slickedit.com/2009/04/i-miss-paper/</feedburner:origLink></item>
		<item>
		<title>Interactively Write and Test Regular Expressions</title>
		<link>http://feedproxy.google.com/~r/helloWorld-TheSlickeditDeveloperBlog/~3/pUQhb7xWeYU/</link>
		<comments>http://blog.slickedit.com/2009/04/interactively-write-and-test-regular-expressions/#comments</comments>
		<pubDate>Thu, 16 Apr 2009 17:04:18 +0000</pubDate>
		<dc:creator>jjones</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.slickedit.com/?p=272</guid>
		<description><![CDATA[Sometimes it&#8217;s hard to figure out the exact regular expression to write that will get the job done. With the Regex Evaluator tool window, SlickEdit provides a convenient method for creating, saving, and re-using tests of regular expressions. 
To display the window, from the main menu, click Tools &#62; Regex Evaluator. Enter some sample text in [...]]]></description>
			<content:encoded><![CDATA[<p>Sometimes it&#8217;s hard to figure out the exact regular expression to write that will get the job done. With the Regex Evaluator tool window, SlickEdit provides a convenient method for creating, saving, and re-using tests of regular expressions. </p>
<p>To display the window, from the main menu, click <strong>Tools &gt; Regex Evaluator</strong>. Enter some sample text in the top area. Select the type of regular expression syntax to use, then enter your expression pattern in the bottom field. Matching patterns in the test case are indicated with a wavy underline. Groups (tagged expressions) are indicated with a boxed yellow highlight.</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.slickedit.com%2F2009%2F04%2Finteractively-write-and-test-regular-expressions%2F';
  addthis_title  = 'Interactively+Write+and+Test+Regular+Expressions';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=pUQhb7xWeYU:XS5jMuSMpmA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=pUQhb7xWeYU:XS5jMuSMpmA:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=pUQhb7xWeYU:XS5jMuSMpmA:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=pUQhb7xWeYU:XS5jMuSMpmA:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=pUQhb7xWeYU:XS5jMuSMpmA:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=pUQhb7xWeYU:XS5jMuSMpmA:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=pUQhb7xWeYU:XS5jMuSMpmA:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=pUQhb7xWeYU:XS5jMuSMpmA:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/helloWorld-TheSlickeditDeveloperBlog/~4/pUQhb7xWeYU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.slickedit.com/2009/04/interactively-write-and-test-regular-expressions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.slickedit.com/2009/04/interactively-write-and-test-regular-expressions/</feedburner:origLink></item>
		<item>
		<title>Want to Learn Vim?</title>
		<link>http://feedproxy.google.com/~r/helloWorld-TheSlickeditDeveloperBlog/~3/cJEqjPSV4VM/</link>
		<comments>http://blog.slickedit.com/2009/04/want-to-learn-vim/#comments</comments>
		<pubDate>Tue, 14 Apr 2009 15:09:07 +0000</pubDate>
		<dc:creator>jjones</dc:creator>
				<category><![CDATA[Productivity]]></category>

		<guid isPermaLink="false">http://blog.slickedit.com/?p=268</guid>
		<description><![CDATA[Did You Know?
SlickEdit provides an emulation mode for the Vim text  editor. If you want to learn Vim, or need to hone your skills, you can use the vimtutor command. Most Vim installations come with  this command, which displays a special &#8220;learn-by-doing&#8221; practice file in the  editor that you can can actually [...]]]></description>
			<content:encoded><![CDATA[<p class="NormalText"><strong>Did You Know?</strong></p>
<p class="NormalText">SlickEdit provides an emulation mode for the Vim text  editor. If you want to learn Vim, or need to hone your skills, you can use the <span><strong class="command">vimtutor</strong></span> command. Most Vim installations come with  this command, which displays a special &#8220;learn-by-doing&#8221; practice file in the  editor that you can can actually edit as you learn how to use the Vim commands.  This file has been customized for SlickEdit users.</p>
<p class="NormalText">To use the command, open the SlickEdit command line, then  type the command and press <span><strong class="keycap">Enter</strong></span>. The  practice file is displayed in the editor. Each time you use the <span><strong class="command">vimtutor</strong></span> command, SlickEdit creates a fresh copy  of this file.</p>
<p class="NormalText">
<h3 class="admon">Tip</h3>
<p class="CellBody"> </p>
<div class="itemizedlist">
<ul type="disc">
<li>
<p class="NormalText">You will be prompted to switch to the Vim emulation when you  invoke the command if the editor is set to a different emulation. </p>
</li>
<li>
<p class="NormalText">When in the Vim emulation, you can open the SlickEdit  command line with <span><strong class="keycap">Ctrl</strong></span>+<span><strong class="keycap">A</strong></span>, or in any emulation, by clicking in the message  area with the mouse. See <a>Activating the Command  Line</a> for more information.</p>
</li>
</ul>
</div>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.slickedit.com%2F2009%2F04%2Fwant-to-learn-vim%2F';
  addthis_title  = 'Want+to+Learn+Vim%3F';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=cJEqjPSV4VM:uDPxY7LuDYs:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=cJEqjPSV4VM:uDPxY7LuDYs:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=cJEqjPSV4VM:uDPxY7LuDYs:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=cJEqjPSV4VM:uDPxY7LuDYs:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=cJEqjPSV4VM:uDPxY7LuDYs:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=cJEqjPSV4VM:uDPxY7LuDYs:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=cJEqjPSV4VM:uDPxY7LuDYs:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=cJEqjPSV4VM:uDPxY7LuDYs:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/helloWorld-TheSlickeditDeveloperBlog/~4/cJEqjPSV4VM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.slickedit.com/2009/04/want-to-learn-vim/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.slickedit.com/2009/04/want-to-learn-vim/</feedburner:origLink></item>
		<item>
		<title>Software Under Construction</title>
		<link>http://feedproxy.google.com/~r/helloWorld-TheSlickeditDeveloperBlog/~3/slShCWpQQgY/</link>
		<comments>http://blog.slickedit.com/2009/02/software-under-construction/#comments</comments>
		<pubDate>Tue, 10 Feb 2009 15:15:34 +0000</pubDate>
		<dc:creator>Scott Hackett</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.slickedit.com/?p=258</guid>
		<description><![CDATA[This week, our office is being remodeled.  Not just adding a couch here or a plant there&#8230; entire walls are being knocked down and the concrete floors are being cut.  It&#8217;s loud and disruptive and the whole place is a mess.  Having a construction crew at work amongst a group of software developers has been [...]]]></description>
			<content:encoded><![CDATA[<p>This week, our office is being remodeled.  Not just adding a couch here or a plant there&#8230; entire walls are being knocked down and the concrete floors are being cut.  It&#8217;s loud and disruptive and the whole place is a mess.  Having a construction crew at work amongst a group of software developers has been an interesting experience.  These guys work with real materials.  They cut down real drywall and set real concrete.  We work with text.  We edit, copy and paste, undo, refactor, revert, save and compile. In the end, though, we do pretty much the same thing.  We&#8217;re both either working on creating or restructuring something to meet someone&#8217;s requirements.  Having these guys around has made me realize some things I&#8217;d forgotten about and a few things I&#8217;d never thought about before.</p>
<p><strong>Blueprints</strong></p>
<p>One of the first things I noticed was that whenever I walk past the area where the construction guys are working on, there are always blueprints around.  Serious blueprints, not just stuff scribbled in a notebook.  Someone had taken the time to document in great detail every angle and aspect of even the most boring places in our office.  How often have you ever seen such blueprint level detail in software design documentation?  It&#8217;s rarely done, and if it is, it&#8217;s rarely maintained.  There are many times when I wished I&#8217;d just done the work of writing down my thoughts as I coded, so that if I needed to revise that code in the future, I&#8217;d have a blueprint of what was there.  It&#8217;s obviously important enough for the construction workers to insist on, why not software engineers?  Most of the code I&#8217;ve ever seen or worked on is barely commented, let alone designed or modeled.</p>
<p><strong>Diff, undo and revert</strong></p>
<p>Of course, for construction, having the blueprint level of detail is essential.  For them, there is no <em>Undo </em>command.  If you&#8217;re cutting drywall and you saw through a main electrical line or cut a key structural support, there&#8217;s no way to easily fix that problem.  If there&#8217;s one thing I learned from watching &#8220;This Old House&#8221;, it&#8217;s that when you build something, you measure twice and cut once.  For us software developers, we have a whole arsenal of life saving techniques.  Diff, undo and revert are all things we do when we&#8217;ve gone down the wrong path.  I joke sometimes that I wish everything in life had an undo command.  Unfortunately, these things have also made us lazy (there, I said it).  Diff, revert and automated refactoring have caused many software developers to stop measuring at all before cutting.  Admit it, if compiling refactored code could potentially cause the roof to collapse, we&#8217;d be a lot better at verifying correctness by:</p>
<ol>
<li>Reading documentation and notes written by other developers whose functions and classes our code relies on.</li>
<li>Documenting the functions and classes we write so that others will use them correctly.</li>
</ol>
<p>These are easy things to do that can potentially save a lot of time in future coding work.<br />
<strong><br />
Frog in the Well</strong></p>
<p>There&#8217;s a riddle about a frog trying to get out of a well who can jump up three feet, but then falls back two feet.  The more times you cut without measuring, or edit without designing, the more you increase the chance that you will make the wrong cut.  For construction workers, making a wrong cut is absolutely disastrous.  For software engineers, making the wrong cut means backing out and trying again.  It&#8217;s easy to forget that there&#8217;s a cost to reverting and refactoring; the time you spent writing what is being undone.  I&#8217;ve known software engineers that program like the frog trying to get out of that well.</p>
<p>Being able to back out of changes is a luxury that shouldn&#8217;t be taken lightly. There will always be times when it&#8217;s necessary, but it&#8217;s important to understand why it&#8217;s necessary.  The next time you have to revert or refactor, ask yourself how much time you lost writing the original code that had to be changed.  How much time could have been saved by designing the code before writing it.  How much time will be lost in the future if you don&#8217;t document why you had to revert or refactor?  If you wrote some code that you realized later was a mistake, what will keep other developers from making the same mistake in the future?</p>
<p>Don&#8217;t be the frog in the well.  Take a tip from our friends, the construction workers, and provide a plan for the code you intend to create or restructure.  Put it somewhere where everyone can get to it, and finally, tell everyone it&#8217;s there.  Not only will you benefit from the fore-thought of your design, but other developers will benefit from your insight before working on the same code.</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.slickedit.com%2F2009%2F02%2Fsoftware-under-construction%2F';
  addthis_title  = 'Software+Under+Construction';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=slShCWpQQgY:Rz3qgbdBkZU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=slShCWpQQgY:Rz3qgbdBkZU:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=slShCWpQQgY:Rz3qgbdBkZU:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=slShCWpQQgY:Rz3qgbdBkZU:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=slShCWpQQgY:Rz3qgbdBkZU:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=slShCWpQQgY:Rz3qgbdBkZU:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=slShCWpQQgY:Rz3qgbdBkZU:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=slShCWpQQgY:Rz3qgbdBkZU:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/helloWorld-TheSlickeditDeveloperBlog/~4/slShCWpQQgY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.slickedit.com/2009/02/software-under-construction/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.slickedit.com/2009/02/software-under-construction/</feedburner:origLink></item>
		<item>
		<title>Monkey or Rooster: Annual Reviews and the Chinese Zodiac</title>
		<link>http://feedproxy.google.com/~r/helloWorld-TheSlickeditDeveloperBlog/~3/oaAyKjD0gSs/</link>
		<comments>http://blog.slickedit.com/2009/01/monkey-or-rooster-annual-reviews-and-the-chinese-zodiac/#comments</comments>
		<pubDate>Wed, 14 Jan 2009 16:02:09 +0000</pubDate>
		<dc:creator>Scott Westfall</dc:creator>
				<category><![CDATA[Dev Management]]></category>

		<guid isPermaLink="false">http://blog.slickedit.com/?p=257</guid>
		<description><![CDATA[It’s my favorite time of the year, again: time for annual reviews!
Hopefully, you could hear the sound of sarcasm dripping from each word in that sentence. I don’t know anyone who looks forward to annual reviews. As a manager, I dread this more than others. Not only do I get to have my own review, [...]]]></description>
			<content:encoded><![CDATA[<p>It’s my favorite time of the year, again: time for annual reviews!</p>
<p>Hopefully, you could hear the sound of sarcasm dripping from each word in that sentence. I don’t know anyone who looks forward to annual reviews. As a manager, I dread this more than others. Not only do I get to have my own review, but I get to do the review for all of those who report to me.</p>
<p>I have to say that doing annual reviews falls somewhere between performing a root canal on myself and suffering through reruns of “Little House on the Prairie”. I know that seems like a broad area of pain, unless you hate that show as much as I do.</p>
<p>The chief reason for this angst is that no one, it seems, is ever happy with their review. Maybe that’s a good sign that I’m taking the process seriously and trying to really evaluate my team members’ strengths and weaknesses. Maybe that means I’m an overly critical [insert epithet here]. Believe me, nothing would be easier than telling everybody that they rock and just send them back to their cubicles.</p>
<p>I can’t bring myself to do that, though. I have to try to make this a meaningful event. To grow, everyone needs to know where they are strong and where they are weak. How many people realistically have no areas they cannot improve on?</p>
<p>Aside from the discomfort of doing an honest assessment of someone, the biggest problem in most review systems is that the scores are arbitrary and meaningless. At most companies, there is no effort to baseline scores or set a reasonable standard for what they mean.</p>
<p>At one company, we used a complex review system with 16 different ratings in 5 areas. Each was assigned a value from 1 to 10 with a 10 being the best score. When I had finished the reviews for my team, most scores ranged from 5 to 10 with a reasonable bell-shaped distribution. So, 7 and 8 were far more common than 5, 6, 9, and 10. I later learned that another manager had simply gone through and given his people all 9’s and 10’s. Since the raises were tied to scores, his people got bigger raises than mine.</p>
<p>I could have saved so much time and so much aggravation by just doing the same thing. Obviously the company didn’t care. They never said anything to me that my scores were unduly low or that his were unreasonably high.</p>
<p>It makes me miss the simple scoring systems used in college. There you are given a course syllabus that outlines the structure of your grade. It shows what percentage of your grade will come from homework assignments and what percentage will come from exams. Where I attended college, scores were posted on the professor’s door. Not only could you look-up your score, but you could see your ranking among your peers. So, even if you got an 87 on a test, you might find that it was one of the highest scores achieved.</p>
<p>In the work world, you rarely have that kind of clarity. Some of your peers succeed on the basis of their social skills rather than their contributions. And even when you are given a rating, you have no idea how it compares to those of your peers. Is it any wonder that employees typically view annual reviews with suspicion and hostility?</p>
<p>So, to simply things this year, I propose a new system based on the <a href="http://en.wikipedia.org/wiki/Chinese_astrology">Signs of the Chinese Zodiac </a>. I got the idea from a placemat at a Chinese restaurant. There are 12 animals: Rat, Ox, Tiger, Rabbit, Dragon, Snake, Horse, Ram, Monkey, Rooster, Dog, and Pig. Each animal is assigned a set of characteristics both positive and negative.</p>
<p>For example, the rat is said to be “Forthright, disciplined, systematic, meticulous, charismatic, hardworking, industrious, charming, eloquent, sociable, shrewd. Can be manipulative, vindictive, mendacious, venal, selfish, obstinate, critical, over-ambitious, ruthless, intolerant, scheming.” (from <a href="http://en.wikipedia.org/wiki/Chinese_astrology">Wikipedia</a>).</p>
<p>The Chinese zodiac assigns an animal to each year, month, day, and hour. So, you can interpret your personality based on these animals and how they interact. The interpretation of these signs is very complex and subtle.</p>
<p>To apply this system to annual reviews, I would take the traditional approach of breaking down performance into key areas: communication, teamwork, leadership, initiative, job knowledge, etc. For each area, the manager assigns one of the 12 animals. Along with the reviews, the employees would be given a key, like the placemat, that lists all of the animals and their characteristics. Together the employee and the manager would discuss the interpretation.</p>
<p>“Well, Frank, you got a Monkey for Communication and Rat for Leadership. I’d like to see you bring these two into better harmony next year. You should strive for an Ox in Communication or maybe a Rooster.”</p>
<p>This would also help when employees compare their results. Yes, we know they aren’t supposed to do that, but in my experience those kind of corporate rules are no more effective than speed limit signs. Using the Signs of the Chinese Zodiac for reviews would eliminate any hard feelings over someone getting a better review.</p>
<p>“Jim got a Rabbit in Customer Focus and I got a Horse.” Walks away with a look of utter puzzlement.</p>
<p>This would also head off any arguments due to an employee feeling they got an unfairly low score. “Damn it, Scott! I can’t believe you gave me a Tiger in Judgment. You know I should have gotten a Ram!”</p>
<p>Yes, this would produce a review system that allows for the arbitrary results of most modern reviews while allowing each employee to find their own meaning in their scores. &#8230;and peace and harmony rang throughout the kingdom!</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.slickedit.com%2F2009%2F01%2Fmonkey-or-rooster-annual-reviews-and-the-chinese-zodiac%2F';
  addthis_title  = 'Monkey+or+Rooster%3A+Annual+Reviews+and+the+Chinese+Zodiac';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=oaAyKjD0gSs:sX0puAHu6m8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=oaAyKjD0gSs:sX0puAHu6m8:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=oaAyKjD0gSs:sX0puAHu6m8:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=oaAyKjD0gSs:sX0puAHu6m8:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=oaAyKjD0gSs:sX0puAHu6m8:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=oaAyKjD0gSs:sX0puAHu6m8:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=oaAyKjD0gSs:sX0puAHu6m8:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=oaAyKjD0gSs:sX0puAHu6m8:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/helloWorld-TheSlickeditDeveloperBlog/~4/oaAyKjD0gSs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.slickedit.com/2009/01/monkey-or-rooster-annual-reviews-and-the-chinese-zodiac/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://blog.slickedit.com/2009/01/monkey-or-rooster-annual-reviews-and-the-chinese-zodiac/</feedburner:origLink></item>
		<item>
		<title>Reformatting Old Yeller</title>
		<link>http://feedproxy.google.com/~r/helloWorld-TheSlickeditDeveloperBlog/~3/S7fW9cBfTKQ/</link>
		<comments>http://blog.slickedit.com/2009/01/reformatting-old-yeller/#comments</comments>
		<pubDate>Wed, 07 Jan 2009 14:25:11 +0000</pubDate>
		<dc:creator>Scott Hackett</dc:creator>
				<category><![CDATA[Other]]></category>

		<guid isPermaLink="false">http://blog.slickedit.com/?p=256</guid>
		<description><![CDATA[My first blog post of this year is going to be a tribute to one of my best friends that I recently had to say goodbye to&#8230; the computer I started with here at SlickEdit.   As a programmer, your computer is something that you spend 8-9 hours a day interacting with.  My work computer gets [...]]]></description>
			<content:encoded><![CDATA[<p>My first blog post of this year is going to be a tribute to one of my best friends that I recently had to say goodbye to&#8230; the computer I started with here at SlickEdit.   As a programmer, your computer is something that you spend 8-9 hours a day interacting with.  My work computer gets more face-to-face time than any other person I know, so it&#8217;s only natural to develop a friendship with it.</p>
<p>After three years of use it had developed its own unique personality.  It had the perfect background with cool sounds to match.  The fonts were just right.  All of the desktop icons were where I wanted them and I knew exactly where everything was off the Start menu.  I had scripts, shortcuts and bindings to do all the common stuff I need to quickly.  I&#8217;d gotten to know all of its quirks, traits, flaws and mannerisms over those few years.</p>
<p>However, like many computers, after installing several versions of many large apps, it wasn&#8217;t the playful, energetic puppy that it was back when I started using it.  It was in no rush when rebooting, and I could hear it let out a sigh whenever started Outlook or Visual Studio.  What were once speedy builds turned into mandatory coffee breaks.  Still, I loved that computer&#8230; we knew each other and wrote software together every day.</p>
<p>Then, early one morning, our sys admin came over to my office.  &#8220;It seems like your computer&#8217;s been trying to send out emails directly on port 25 during the middle of the night, any idea what that could be?&#8221;  I didn&#8217;t know.  We looked up the address where they were being sent, somewhere I&#8217;d never heard of before.  &#8220;Alright, I&#8217;ll bring over the Vista DVD,&#8221; he said.</p>
<p>And that&#8217;s when it sunk in.  An infection&#8230; a virus&#8230; the Vista DVD&#8230; I was going to have to reformat my machine.  I was going to have to shoot Old Yeller.</p>
<blockquote><p>[<em>From the movie... Old Yeller's gone rabid and Mama's holding a shotgun</em>]<br />
<strong>Travis:</strong> No mama!<br />
<strong>Mama:</strong> There&#8217;s no hope for him now. He&#8217;s sufferin&#8217;. You know we gotta do it.<br />
<strong>Travis:</strong> I know Mama&#8230; But he was my dog&#8230; I&#8217;ll do it.</p></blockquote>
<p>I sat quietly for a while after he left, realizing that this was the end.  I spent the next few hours backing up all of my important files and exporting all of my preferences.  &#8220;There are automatic updates ready to install, reboot now?&#8221; it prompted innocently.  The poor thing had no clue.  I missed him already, and I wondered if a better place awaited him after fdisk.  A place without disk fragmentation, bloated installations, useless polling auto-update tray apps and frozen taskbars.  I said goodbye and shut down one last time before booting from the Vista DVD.</p>
<p>I&#8217;m still sitting at the same desk, but everything feels new and a little unknown now.  It&#8217;s like working again with that energetic puppy I began with.  He&#8217;s eager to start up and get to work, builds are a snap and the desktop is clutter-free.  I&#8217;m still getting to know it, and soon he&#8217;ll develop his own personality.  I still miss Old Yeller, though.</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.slickedit.com%2F2009%2F01%2Freformatting-old-yeller%2F';
  addthis_title  = 'Reformatting+Old+Yeller';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=S7fW9cBfTKQ:Oe9qe1o0T_Y:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=S7fW9cBfTKQ:Oe9qe1o0T_Y:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=S7fW9cBfTKQ:Oe9qe1o0T_Y:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=S7fW9cBfTKQ:Oe9qe1o0T_Y:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=S7fW9cBfTKQ:Oe9qe1o0T_Y:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=S7fW9cBfTKQ:Oe9qe1o0T_Y:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=S7fW9cBfTKQ:Oe9qe1o0T_Y:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=S7fW9cBfTKQ:Oe9qe1o0T_Y:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/helloWorld-TheSlickeditDeveloperBlog/~4/S7fW9cBfTKQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.slickedit.com/2009/01/reformatting-old-yeller/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.slickedit.com/2009/01/reformatting-old-yeller/</feedburner:origLink></item>
		<item>
		<title>Eliminating the Programmer</title>
		<link>http://feedproxy.google.com/~r/helloWorld-TheSlickeditDeveloperBlog/~3/mx_oYvUBifs/</link>
		<comments>http://blog.slickedit.com/2008/12/eliminating-the-programmer/#comments</comments>
		<pubDate>Mon, 15 Dec 2008 15:48:37 +0000</pubDate>
		<dc:creator>Scott Westfall</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.slickedit.com/?p=255</guid>
		<description><![CDATA[Occasionally I run across a tool or development project with the intent of eliminating the programmer. The goal is to have the business team control the behavior of the system. From a business management perspective, this sounds like a great idea. Think of all the money saved if we didn’t have to hire programmers or [...]]]></description>
			<content:encoded><![CDATA[<p>Occasionally I run across a tool or development project with the intent of eliminating the programmer. The goal is to have the business team control the behavior of the system. From a business management perspective, this sounds like a great idea. Think of all the money saved if we didn’t have to hire programmers or to waste time communicating requirements to them. In reality, I’ve never seen a tool or project succeed at this.</p>
<p>I worked as a contractor on one such project a few years ago. We were writing a call center application for a large enterprise client. The architect of this system convinced the client that the business analysts would be able to write in a high-level business language (invented by the architect) so that future changes wouldn’t require hiring programmers to modify the system. Each line of business script, it was claimed, had the power of 20 or 30 lines of lower level code. So, this promised even greater efficiency than just eliminating the programmer.</p>
<p>The business language had classes, constructors, destructors, and nearly all of the features of modern object-oriented languages. Maybe it started out as a simplified language that would be accessible to the business team, but it grew into the same level of complexity as the Java code we were writing to implement the rest of the system. There was no way that a business analyst without training as a programmer was going to be able to write effective code with this language.</p>
<p>Even worse, the programming team was struggling to write code with the language. There was no debugger or other tools, not even an editor with color coding. When you had an error, you had to determine if it was a bug in the script or in the interpreter, which was being modified almost daily.</p>
<p>Even if we accept that it is a worthy goal to eliminate the need for programmers, I don’t think it’s possible. That’s because programmers have skills and abilities other than just their knowledge of programming languages.</p>
<p>Whether this is by training or nature, I cannot say. Likely, it is a little of both. Programmers have aptitude in the skills necessary to succeed in our field and these get nurtured through practice. Regardless, I’ve noticed that programmers are often more capable in many ways than their non-programming coworkers.</p>
<p>Programmers think more logically. Working through if-then-else conditions is a core capability for any programmer. While working with business teams on requirements, I have often run across cases the where same ability was lacking.</p>
<p>During one project to develop an expert system for mortgage analysis, I was often given requirements for rules on how to handle loans with particular Loan-To-Value ratios or for a particular loan amounts. Not uncommonly, these requirements would have gaps. I’d have requirements for loans from $0 to $100,000; from $150,000 to $250,000; and for loans over $250,000. But there was a hole between $100,000 and $150,000. At other times I’d have conflicting requirements for overlapping ranges.</p>
<p>Programmers have a superior ability to analyze problems and come up with solutions. They excel at analyzing preconditions, sequences of events, and outcomes. Certainly, this is a key skill in programming, but it is also useful in troubleshooting and business case analysis.</p>
<p>Another key ability where programmers typically have an edge is the ability to make order out of chaos. I think that’s because the programmer is responsible for creating order within the program. We break systems into subsystems, subsystems into modules, and modules into units. There are no physical constraints that dictate the structure of the solution. Whatever order exists is created by the people who write the code. Reflecting on some of the codebases I’ve worked on, it’s clear that this is not a universal trait in all programmers.</p>
<p>While people typically think of programmers as coders, whose main talent lies in writing the arcane syntax of programming languages. I think that their main talent lies in their ability to analyze, troubleshoot, and solve problems. Code is just the physical manifestation that culminates the thought process of the programmer.</p>
<p>Let’s say that someone does manage to write a tool that allows people to define software and control its behavior without having to write code. The person using this tool will still need all of the other mental abilities of a programmer. If this were to happen, we haven’t eliminated the programmer; we just changed the job description a little.</p>
<p>Yes, I can envision a distant future where Artificial Intelligence is used to develop code—but that won&#8217;t eliminate programmers, either; it just ported them to a different platform.</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.slickedit.com%2F2008%2F12%2Feliminating-the-programmer%2F';
  addthis_title  = 'Eliminating+the+Programmer';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=mx_oYvUBifs:7C_jDUVpYyE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=mx_oYvUBifs:7C_jDUVpYyE:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=mx_oYvUBifs:7C_jDUVpYyE:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=mx_oYvUBifs:7C_jDUVpYyE:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=mx_oYvUBifs:7C_jDUVpYyE:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=mx_oYvUBifs:7C_jDUVpYyE:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=mx_oYvUBifs:7C_jDUVpYyE:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=mx_oYvUBifs:7C_jDUVpYyE:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/helloWorld-TheSlickeditDeveloperBlog/~4/mx_oYvUBifs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.slickedit.com/2008/12/eliminating-the-programmer/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
		<feedburner:origLink>http://blog.slickedit.com/2008/12/eliminating-the-programmer/</feedburner:origLink></item>
		<item>
		<title>SlickEdit Macros for Everybody</title>
		<link>http://feedproxy.google.com/~r/helloWorld-TheSlickeditDeveloperBlog/~3/CxQR4JO2XDM/</link>
		<comments>http://blog.slickedit.com/2008/11/slickedit-macros-for-everybody/#comments</comments>
		<pubDate>Wed, 26 Nov 2008 15:34:06 +0000</pubDate>
		<dc:creator>jjones</dc:creator>
				<category><![CDATA[Productivity]]></category>

		<guid isPermaLink="false">http://blog.slickedit.com/?p=254</guid>
		<description><![CDATA[I ran across a great blog the other day &#8220;SlickEdit Macros for Everybody&#8220;.  The blog is written by David Hicks, a self-proclaimed SlickEdit devotee, who enjoys &#8220;Squeezing as much functionality as possible out of his editor of choice.&#8221; He created the site because he likes working with Slick-C and felt there was not enough Slick-C code [...]]]></description>
			<content:encoded><![CDATA[<p>I ran across a great blog the other day &#8220;<a href="http://myslickeditmacros.blogspot.com/">SlickEdit Macros for Everybody</a>&#8220;.  The blog is written by David Hicks, a self-proclaimed SlickEdit devotee, who enjoys &#8220;Squeezing as much functionality as possible out of his editor of choice.&#8221; He created the site because he likes working with Slick-C and felt there was not enough Slick-C code on the web.</p>
<p>Slick-C is a macro programming language upon which the SlickEdit code editor is based.  Slick-C allows developers to modify the look and feel of the editor, write macros to perform custom operations, add new language support, and essentially extend the editor’s functionality until it is completely customized according to your preferences.</p>
<p><a href="http://myslickeditmacros.blogspot.com/2008_09_04_archive.html">From his first post</a>:</p>
<blockquote><p>Here you&#8217;ll find Slick-C macros of all kinds, from overly simple to fairly complex. I&#8217;m a writer/editor/journalist by trade, not a professional developer. Slick-C programmers should find something 0f interest here, including plenty of code that can be tweaked or fixed.</p>
<p>The purpose of this blog is to address the shortage of Slick-C code on the Web, while stimulating discussion and encouraging code sharing.</p>
<p>I&#8217;ve used Slickedit in my daily work since approximately 1998. Currently I have 388 _command macros in my vusrmacs.e file. I&#8217;m sure there are other Slickedit users whose macro folders are wishing to burst free and benefit the larger community.</p>
<p>My professional roles are technical writer; editor and researcher of print and electronic publications; desktop publisher; journalist. My programming experience has generally been limited to high-level scripting languages. I&#8217;ve spent a lot of time using numerous text editors and macro languages. Of the two kinds of Slickedit users named in the subtitle of this blog, I&#8217;m a Wordsmith rather than a Code Maven.</p></blockquote>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.slickedit.com%2F2008%2F11%2Fslickedit-macros-for-everybody%2F';
  addthis_title  = 'SlickEdit+Macros+for+Everybody';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=CxQR4JO2XDM:E9KM2k_Mogk:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=CxQR4JO2XDM:E9KM2k_Mogk:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=CxQR4JO2XDM:E9KM2k_Mogk:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=CxQR4JO2XDM:E9KM2k_Mogk:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=CxQR4JO2XDM:E9KM2k_Mogk:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=CxQR4JO2XDM:E9KM2k_Mogk:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=CxQR4JO2XDM:E9KM2k_Mogk:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=CxQR4JO2XDM:E9KM2k_Mogk:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/helloWorld-TheSlickeditDeveloperBlog/~4/CxQR4JO2XDM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.slickedit.com/2008/11/slickedit-macros-for-everybody/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.slickedit.com/2008/11/slickedit-macros-for-everybody/</feedburner:origLink></item>
		<item>
		<title>“Please” and “Thank You” Macro</title>
		<link>http://feedproxy.google.com/~r/helloWorld-TheSlickeditDeveloperBlog/~3/19FW0hOpEvE/</link>
		<comments>http://blog.slickedit.com/2008/11/please-and-thank-you-macro/#comments</comments>
		<pubDate>Wed, 19 Nov 2008 15:14:25 +0000</pubDate>
		<dc:creator>Scott Westfall</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.slickedit.com/?p=253</guid>
		<description><![CDATA[Though I now work as a programming manager I have been a programmer for many years. Programmers typically share many characteristics in common. Among them, a certain inpatience with inefficiency. I&#8217;m not sure if that trait was there before we became programmers or whether it is something we learn through years of coding. Perhaps we [...]]]></description>
			<content:encoded><![CDATA[<p>Though I now work as a programming manager I have been a programmer for many years. Programmers typically share many characteristics in common. Among them, a certain inpatience with inefficiency. I&#8217;m not sure if that trait was there before we became programmers or whether it is something we learn through years of coding. Perhaps we start with that characteristic and it gets nutured through our programming experience.</p>
<p>Regardless, I&#8217;ve grown weary of some wasteful pleasantries, and I&#8217;ve been trying to make things more efficient. In particular, I&#8217;m tired of saying &#8220;please&#8221; and &#8220;thank you&#8221; all the time, particularly with my wife. After nearly 25 years of marriage, haven&#8217;t I proven my love and respect? Do I need to continually show it through endless &#8220;pleases&#8221; and &#8220;thank yous&#8221;?</p>
<p>So, I asked her if she could just assume that every request I ask is automatically preceeded by a &#8220;please&#8221; and followed by a &#8220;thank you&#8221;. I mean really, if she expects one every time, why not just assume it&#8217;s there in the first place?</p>
<p>In programmer parlance, this would be equivalent to writing a macro. Macros are substitutions that are inserted inline so that the code is altered, as though the substitution were there all along. I won&#8217;t bore you with the syntax, but if you&#8217;ve used macros before then you know what a time-saver they can be.</p>
<p>Unfortunately, my wife didn&#8217;t go along with this notion. It appears that her ability to execute macros is substantially less effective than a C compiler. So, she still expects a tedious &#8220;please&#8221; and &#8220;thank you&#8221; for each request. Sheesh!</p>
<p>Some programmers have taken this notion of macros a little too far. From the many programmers I have worked with, I have noticed the following macros in use:</p>
<p><strong>The Greeting Macro</strong> &#8212; this is a common one, where the programmer has fully eschewed any responsibility for saying &#8220;Good morning&#8221;, &#8220;Hi&#8221;, &#8220;How&#8217;s it going?&#8221; or any of the regular acknowledgements of the other person&#8217;s existence.</p>
<p><strong>The &#8220;Yes sir, I&#8217;ll get right on it&#8221; Macro </strong>&#8211; with this macro, a programmer will no longer let you know that they have heard and understood your requests. You must infer that they will comply because they have ceased their efforts to make you feel stupid for asking.</p>
<p><strong>The &#8220;No I don&#8217;t think you&#8217;re a complete moron&#8221; Macro </strong>&#8211; here, the programmer has given up with trying to smile politely and respect your opinion. The macro is intended to soften his critical and belittling demeanor. It is important to note the stress on the word &#8220;complete&#8221; in this macro.</p>
<p><strong>The Personal Hygiene Macro </strong>&#8211; I know it&#8217;s boring to shower every day, but the rest of us really appreciate it. Trust me on this one!</p>
<p>please_and_thankyou(&#8221;If you enjoyed this article, leave a comment.&#8221;)</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.slickedit.com%2F2008%2F11%2Fplease-and-thank-you-macro%2F';
  addthis_title  = '%26%238220%3BPlease%26%238221%3B+and+%26%238220%3BThank+You%26%238221%3B+Macro';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=19FW0hOpEvE:-8bBDGbYbmk:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=19FW0hOpEvE:-8bBDGbYbmk:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=19FW0hOpEvE:-8bBDGbYbmk:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=19FW0hOpEvE:-8bBDGbYbmk:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=19FW0hOpEvE:-8bBDGbYbmk:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=19FW0hOpEvE:-8bBDGbYbmk:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=19FW0hOpEvE:-8bBDGbYbmk:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=19FW0hOpEvE:-8bBDGbYbmk:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/helloWorld-TheSlickeditDeveloperBlog/~4/19FW0hOpEvE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.slickedit.com/2008/11/please-and-thank-you-macro/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		<feedburner:origLink>http://blog.slickedit.com/2008/11/please-and-thank-you-macro/</feedburner:origLink></item>
		<item>
		<title>Our Nation’s First CTO</title>
		<link>http://feedproxy.google.com/~r/helloWorld-TheSlickeditDeveloperBlog/~3/tPElnhkv5p8/</link>
		<comments>http://blog.slickedit.com/2008/11/our-nation%e2%80%99s-first-cto/#comments</comments>
		<pubDate>Wed, 12 Nov 2008 18:31:22 +0000</pubDate>
		<dc:creator>Scott Westfall</dc:creator>
				<category><![CDATA[Dev Management]]></category>

		<guid isPermaLink="false">http://blog.slickedit.com/?p=252</guid>
		<description><![CDATA[The press is abuzz with news items about President-Elect Obama’s search for a CTO and the possibility that he could make this a cabinet-level position.
This is a great idea! Technology is so prevalent in our society and in our government that it’s impossible to conceive of a plan for effective government that is not based [...]]]></description>
			<content:encoded><![CDATA[<p>The press is abuzz with news items about President-Elect Obama’s <a href="http://www.infoworld.com/article/08/11/10/Googleenabled_government_starts_with_Obamas_CTO_1.html">search for a CTO</a> and the possibility that he could make this a cabinet-level position.</p>
<p>This is a great idea! Technology is so prevalent in our society and in our government that it’s impossible to conceive of a plan for effective government that is not based on a sound technology roadmap. Certainly, if we need a Secretary of Transportation, then we need a Secretary of Technology.</p>
<p>Making this a cabinet-level position will hopefully give the USCTO the authority to bring uncooperative agencies together. In truth, I think that will be the biggest challenge. Bureaucracies are rife with politics. They don’t like to be told what to do or to work with others. They want to do things their way without someone else suggesting a better way.</p>
<p>A Chief Technology Officer can be instrumental in setting goals and directions for our nation’s IT infrastructure. However, I have seen CTOs wreak havoc on organizations that were doing just fine without them. Here are a few common pitfalls I hope the new US CTO will be able to avoid.</p>
<p><strong>Outsourcing Core Expertise</strong></p>
<p>I have worked for years as a contract programmer, and I have worked for companies that provided outsourcing services. There are times when it truly makes sense to outsource. If you are not a software company, but you need to have software built, then you are generally better off hiring a company to do that for you. A company that develops software full-time will be far more successful than one with no experience.</p>
<p>For example, I worked for a company that developed workflow and routing systems that incorporated high-speed scanners. We had significant knowledge and experience with the hardware and issues involved with these systems. Our customers were companies that processed forms for things like book clubs or medical records. Those companies simply could not have built these systems as effectively as we could.</p>
<p>For them, the systems we built were just a tool. Their core knowledge was related to the business of processing the records. They just needed a system that made it faster and easier to process the information.</p>
<p>However, I have seen companies whose main revenue comes from selling software outsource the development of their products. Commonly, this is done by partnering with an offshore development house.</p>
<p>The problem with this approach isn’t that it’s overseas; it’s that the people working on the product do not work for the company. If you make money by building and selling software, then why would you ever want the knowledge necessary to create and maintain your products to be held by someone with no attachment to your company?!?</p>
<p><strong>Cost Centric Management</strong></p>
<p>Improving an organization is hard. It takes thorough analysis and creative thinking to find ways to do things better. Rather than finding ways to do things better, some CTOs try to make their mark by doing things cheaper.</p>
<p>Don’t get me wrong, I do believe that organizations should be run efficiently and that managers should be looking at costs to make sure they are in line. However, cost management is often taken to an extreme.</p>
<p>Examples of this mentality include hiring cheaper programmers rather than focusing on the knowledge and experience needed. Many companies treat programmers like interchangeable cogs with no appreciation for the difference between individuals. So, if they can hire programmers for $10K or $20K less per year, that’s a big win, right?</p>
<p>This mentality drives the offshoring approach. The lower cost is touted as a big win for the company, but little consideration is given to whether the product can be developed as successfully. This is particularly problematic if the development team is split, as is so often the case, with the business team working here and the developers working overseas. Software development has been shown to be far more successful when there is close interaction between the programmers and the subject matter experts, even more so with direct customer interaction.</p>
<p>Companies also attempt to restrict costs by scrimping on the tools they provide. We see that one a lot at SlickEdit. We often hear from programmers who want to buy SlickEdit but are told by their management that $300 is too expensive.</p>
<p>At SlickEdit, every developer has multiple monitors. We believe this is essential to getting your work done efficiently. I have worked at some companies where I bought my own equipment because they would not approve anything more than a single 17” monitor.</p>
<p>The fundamental mistake that drives these decisions is that they assume a fixed level of output. So, they believe they can cut costs and the output will not change. In truth, we know that the level of output in software development is highly variable and subject to many complex factors. The definitive work in this area is “<a href="http://en.wikipedia.org/wiki/Peopleware">Peopleware</a>” by DeMarco and Lister.</p>
<p><strong>Over Standardization</strong></p>
<p>Standardization can be a good thing. When done properly, it ensures efficiencies of scale and the ability to dynamically manage resources within an organization. Standardization can be helpful to assist everyone in producing a similar result. If taken too far, it becomes a force to make sure that no one can achieve excellence.</p>
<p>No single tool or technology is good for all situations. The cost of trying to pound a square peg into a round hole can often exceed the cost of buying a round peg. You do have to guard against capricious choices (see <a href="http://blog.slickedit.com/?p=249">Design Fail Patterns</a>), but you should guard against a policy that is too rigid. Standardization should be a gravitational force that pulls towards a center, but it should not become an inescapable black hole</p>
<p>The larger the company, the more diverse their technology should be. Small companies may not be able to afford to dabble in different technologies, but larger companies can often see greater efficiency by allowing teams to select the right tools even when they are different. Further, by having a broader technology portfolio they reduce the risks associated with selecting a single technology, and they are more likely to discover new, more efficient ways of doing things.</p>
<p><strong>“Vision”</strong></p>
<p>I often see the word “vision” used with CTOs. They have “vision”. When I hear this word, I cringe. While having vision is often essential in succeeding, too often this word is used as license for narrow-minded, megalomaniacal tendencies that will brook no discussion or alternatives. Can you tell I feel strongly about this one?</p>
<p>Often the CTO forms this vision before they know anything about the organization. In my experience, the employees already know what needs to be done to fix most problems at the company. What they need is a management team that’s willing to listen. Instead, most employees fear going to upper management with problems and solutions.</p>
<p>Sometimes this “vision” is based on a success at a previous company. They see the new company as an opportunity to do what they did before. However, these successes are rarely repeatable. Organizations are just too different. Often, the reason a project succeeds is because of complex factors, not the least of which is the team that implemented it. Given the choice, I’d rather have the team from that successful project rather than one guy with the “vision”. Be careful how much credit you give managers (or any leaders) for the accomplishments of their teams.</p>
<p>Vision should provide an overall direction, a set of values that are used to balance competing needs. It should not be a totalitarian model to which an organization must conform.</p>
<p>I wish the new CTO of the United States much luck. It will be needed. Confidence in our government is at an all-time low. It will take much more than vision to change that.</p>
<p> </p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.slickedit.com%2F2008%2F11%2Four-nation%25e2%2580%2599s-first-cto%2F';
  addthis_title  = 'Our+Nation%E2%80%99s+First+CTO';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=tPElnhkv5p8:fTz20Gn4I_8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=tPElnhkv5p8:fTz20Gn4I_8:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=tPElnhkv5p8:fTz20Gn4I_8:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=tPElnhkv5p8:fTz20Gn4I_8:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=tPElnhkv5p8:fTz20Gn4I_8:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=tPElnhkv5p8:fTz20Gn4I_8:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=tPElnhkv5p8:fTz20Gn4I_8:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=tPElnhkv5p8:fTz20Gn4I_8:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/helloWorld-TheSlickeditDeveloperBlog/~4/tPElnhkv5p8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.slickedit.com/2008/11/our-nation%e2%80%99s-first-cto/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.slickedit.com/2008/11/our-nation%e2%80%99s-first-cto/</feedburner:origLink></item>
		<item>
		<title>The Politics of Features</title>
		<link>http://feedproxy.google.com/~r/helloWorld-TheSlickeditDeveloperBlog/~3/ro-H1rIDz-k/</link>
		<comments>http://blog.slickedit.com/2008/11/the-politics-of-features/#comments</comments>
		<pubDate>Wed, 05 Nov 2008 15:50:42 +0000</pubDate>
		<dc:creator>Scott Westfall</dc:creator>
				<category><![CDATA[Dev Management]]></category>

		<guid isPermaLink="false">http://blog.slickedit.com/?p=251</guid>
		<description><![CDATA[The election season puts me in mind of the many ways I have seen teams decide on which features to implement. Like all human endeavors this process is political, meaning that it is shaped by the relationships and power structure of the organization. Consequently, you can use various systems of government as metaphors for different [...]]]></description>
			<content:encoded><![CDATA[<p>The election season puts me in mind of the many ways I have seen teams decide on which features to implement. Like all human endeavors this process is political, meaning that it is shaped by the relationships and power structure of the organization. Consequently, you can use various systems of government as metaphors for different approaches.</p>
<p>For the sake of this discussion, we’ll treat defects the same as features. This isn’t totally accurate since some defects simply must be fixed as soon as possible. However, most defects are subject to the same decision process as features.</p>
<p><strong>The Dictatorship</strong></p>
<p>With this system, a single, all-powerful voice decides what gets done when. This is a common approach on smaller projects, where these decisions are made by the project manager. That’s not to say that this person doesn’t listen to advice from others. But when it comes time to decide they, alone, make the call.</p>
<p>Ultimately, the other systems typically have a single person who has to make the final decision. In my opinion, this is an essential characteristic of an effective organization. Everything should funnel up to a single person authorized to make decisions. People at different levels should be empowered to make various decisions, but in the end a single person should have the final authority. Otherwise, you flounder endlessly when a consensus cannot be achieved. It becomes a dictatorship when the leader ignores the advice and guidance of others and acts strictly on their own belief.</p>
<p>This approach only appeals to me if I can be the dictator, using my sagely wisdom to guide the product direction. In truth, this system can work well if the person in charge has a keen sense of what it takes to succeed. From accounts I’ve read, this is not unlike Steve Jobs’ approach to new product development. Though you can argue with his approach, it’s hard to question the results.</p>
<p><strong>The Oligarchy</strong></p>
<p>In an <a href="http://en.wikipedia.org/wiki/Oligarchy">oligarchy </a>, power is shared by small, elite group. This approach is often used on larger projects where various constituencies are represented. You might have representatives from project management, sales, development, quality assurance, and product support. In some cases, actual customer representatives might be involved.</p>
<p>The group meets regularly to discuss what is needed and when. Tradeoffs are weighed between features needed to spur new sales and fixes needed to appease existing customers. Typically, the group is lead by someone with final decision authority, but most decisions have a strong consensus.</p>
<p>This approach is certainly more representative, but it is also much more time-consuming. I’ve worked on projects that used this method, but they were very large with complex interactions between subsystems. Still, a light-weight version of this can be helpful to make sure all factors are weighed effectively.</p>
<p><strong>The Democracy</strong></p>
<p>In its purest form, this approach relies on votes from the masses to make the selection. Sometimes, members of the development team do the voting. In other systems, the customers are allowed to vote.</p>
<p>Though I cannot find a reference to it anymore, I recall that Sun used Duke Dollars as a way for developers to vote for specific fixes in the early days of Java. I’ve worked on teams where each developer was given some number of votes that they could apply to the bugs or features of their choosing.</p>
<p>I’m not a big fan of this approach. When the developers do the voting, this tends to favor the interesting, glamorous features over those that are more mundane. Often, these mundane features make a bigger difference to the customers. When the customers vote, they are typically guided by their own way of working. An effective product has to balance the different ways customers will use it.</p>
<p>You could use a hybrid approach, where the developers or customers submit votes but the decisions is ultimately made by a small group or individual. The problem with this is that it can be demotivating to the voters. If a feature with a high number of votes is rejected, they will ask why they even bothered. So, if you use a voting system, you should be willing to act on the results.</p>
<p><strong>The Meritocracy</strong></p>
<p>In the <a href="http://en.wikipedia.org/wiki/Meritocracy">meritocracy </a>, the best idea wins. Instead of suggesting a feature or voting for it, each feature is submitted with a business case. The business case is used to decide which changes make the biggest difference to the product.</p>
<p>This is my preferred approach to prioritizing features. It allows for input from all stakeholders and provides a means to assess priorities. With this system, anyone can challenge a feature and have it replaced in the schedule by demonstrating that another feature has a better business case.</p>
<p>Unfortunately, it is not always evident which idea has the greatest merit. So, this system relies on approaches from the others to make that call. A team or individual weighs the various proposals and picks the ones that best meet the business needs.</p>
<p>This approach also avoids the “squeaky wheel gets the grease” syndrome. Often, it is the customer or developer who is most vocal that gets their way. Great ideas languish because the proponent is not willing or able to be heard above the din of the highly vocal.</p>
<p>Truthfully, there are very few pure examples of any form of government. Most are a combination of these approaches. The most important characteristics of a feature planning system are:</p>
<p>• The ability to gather ideas from all stakeholders.<br />
• The willingness to listen to these ideas.<br />
• A system to evaluate ideas on their true merit.<br />
• A clear vision of the product that helps to determine which ideas truly enhance the product and which just muddy the waters.</p>
<p>Of course, it wouldn&#8217;t hurt if we could somehow take humans out of the equation and have features selected by a race of benevolent and powerful robots. But that&#8217;s a post for another time.</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.slickedit.com%2F2008%2F11%2Fthe-politics-of-features%2F';
  addthis_title  = 'The+Politics+of+Features';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=ro-H1rIDz-k:SfXWVj4IthA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=ro-H1rIDz-k:SfXWVj4IthA:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=ro-H1rIDz-k:SfXWVj4IthA:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=ro-H1rIDz-k:SfXWVj4IthA:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=ro-H1rIDz-k:SfXWVj4IthA:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=ro-H1rIDz-k:SfXWVj4IthA:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=ro-H1rIDz-k:SfXWVj4IthA:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=ro-H1rIDz-k:SfXWVj4IthA:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/helloWorld-TheSlickeditDeveloperBlog/~4/ro-H1rIDz-k" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.slickedit.com/2008/11/the-politics-of-features/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.slickedit.com/2008/11/the-politics-of-features/</feedburner:origLink></item>
		<item>
		<title>Too Busy Bailing to Plug the Leak</title>
		<link>http://feedproxy.google.com/~r/helloWorld-TheSlickeditDeveloperBlog/~3/PNeETM_9Lcs/</link>
		<comments>http://blog.slickedit.com/2008/10/too-busy-bailing-to-plug-the-leak/#comments</comments>
		<pubDate>Wed, 29 Oct 2008 14:15:33 +0000</pubDate>
		<dc:creator>Scott Westfall</dc:creator>
				<category><![CDATA[Dev Management]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.slickedit.com/?p=250</guid>
		<description><![CDATA[My last post, Design Fail Patterns, dealt with the ways that people often select the wrong technologies for a project. That made me think of another way I&#8217;ve seen projects and people fail.
Cast your mind back to the days of the tall ships, great wooden vessels that plied the oceans under wind power. Imagine one [...]]]></description>
			<content:encoded><![CDATA[<p>My last post, <a href="http://blog.slickedit.com/?p=249">Design Fail Patterns</a>, dealt with the ways that people often select the wrong technologies for a project. That made me think of another way I&#8217;ve seen projects and people fail.</p>
<p>Cast your mind back to the days of the tall ships, great wooden vessels that plied the oceans under wind power. Imagine one of those majestic ships sailing along when suddenly it hits a reef, tearing a large hole below the waterline. All hands scramble to save the ship. They bail and bail, but the ship continues to sink. As the ship sinks lower, they bail more furiously until finally the ship is lost. The survivors are washed ashore on a nearby island.</p>
<p>As they stare out at the masts of the ship, still visible above the waves, the Captain asks, “Why weren’t we able to plug the leak?”</p>
<p>One of the crew pipes up, “Captain, sir, we were too busy bailing to plug the leak.”</p>
<p>OK, this is a contrived example, and it’s very hard to believe that it could occur in real life. However, very similar situations frequently arise in software development.</p>
<p><strong>Bad Codebase</strong></p>
<p>The most typical way I’ve seen this occur is on projects where the early work has set us up for failure. The infrastructural code is so full of bugs or badly designed that it has become a stumbling block to get the rest of the system built. The team furiously pounds away at the code, driving toward a critical milestone fixing bugs as they can. But with every iteration, things take longer to do and the codebase gets harder to work with.</p>
<p>In this case, the leak is the poor codebase. The only way to plug the leak is to rewrite that part of the system. Often, the programming team is unable to recognize that this code is a lost cause, particularly if they participated in its development. More commonly, the programmers know that this code is the problem, but they can’t talk management into the schedule slip that is necessary to fix it. In the end, the project takes longer to complete than if we had stopped and rewritten the offending code.</p>
<p>Unfortunately, a leak in software is rarely as visible or as easy to appreciate as a gaping hole in a hull. However, the programmers’ work to patch the system instead of fixing it is just as futile as the sailors who just keep bailing. And the result is nearly as predictable.</p>
<p><strong>Poor Process</strong></p>
<p>Another way this phenomenon is manifested is in adherence to bad processes. I worked on a project that used very poor configuration management techniques. The approach to version control was sloppy, and there were no controls for how integration servers were configured or how code was deployed for testing. Consequently, even though we would get successful tests on the integration server, we continually faced problems in production. These problems stemmed from several causes. Sometimes it was because of files that were edited on the integration server and not checked into source control, so they never got deployed to production. Or someone would set up the directory structure differently so that it would work on one machine but not the other.</p>
<p>When these problems appeared, the proffered solution was that people should be more careful. This case might be slightly different. Instead of thinking that you’re too busy bailing to plug the leak; in this case you believe that bailing may be all that’s needed.</p>
<p>I’m a firm believer that your test machines should mirror your production environment in every way possible and that you should deploy your code for testing exactly as it will be deployed to the production environment. And if I ever catch someone editing a file on a test or integration server, I’ll <a href="http://en.wikipedia.org/wiki/Keelhauling">keel haul</a> them!</p>
<p><strong>No Time for Personal Development</strong></p>
<p>I also see the “too busy bailing” mentality at work in peoples’ careers. As a hiring manager, I have interviewed hundreds of candidates for jobs over the years. I’m frequently amazed to learn how little people invest in their careers and the knowledge necessary to advance.</p>
<p>For example, most of my work has been on Object-Oriented projects. So, I typically ask OO questions of the candidates. One question is about how they learned OO programming. What books did they read? How did they hone this knowledge? Typically, I find that most candidates learned OO in college and have done nothing to build on that knowledge, other than their normal work experience.</p>
<p>I’ve also interviewed candidates for web development. So, I’ll get a resume from a bright young college student who is about to graduate. They tell me they want to be a web developer.</p>
<p>“Great!” I say. “So, have you ever built a website?”</p>
<p>“No.”</p>
<p>“Do you know HTML and JavaScript?”</p>
<p>“We had that in a class once.”</p>
<p>“Well, then what have you done to become a web developer?”</p>
<p>“I’m real busy with class right now.”</p>
<p>So, basically, this guy is looking for someone to pay him to become a web developer. I’ll always consider a new grad without formal experience, but I want someone who has done more than just sit through classes on their way to a degree. Show me some passion or interest in your area by working on something outside of class. Or at least have knowledge in the basic tools.</p>
<p><strong>Tool Selection</strong></p>
<p>The final way I see people being too busy bailing is through adherence to less effective tools. I often interact with people who have been using vi their whole career, or some other minimal editor, and just can’t be bothered to change. No amount of telling them how you can save them time will convince them to switch. They may even admit that they know they could be more productive if they switched, but they don’t want to take the time to learn a new tool.</p>
<p>Truthfully, this could be a case of the tool becoming the job rather than being too busy bailing. In that situation, a person spends so much time, say, hammering that they lose sight of why they are hammering: to build houses. So when a new way of driving nails comes along, they stick to their current way of working. “I’ve been hammering for 20 years. I’m not about to switch.”</p>
<p>Switching tools will always involve an investment in time. But if you pick the right tool, that investment will pay off rapidly.</p>
<p>So watch for signs of bailing in your own work and career. Consider whether there is a leak that needs to be plugged first. If not, then bail for all your worth. If you have spotted a leak and no one will listen, maybe you need to do a different kind of bailing.</p>
<p> </p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.slickedit.com%2F2008%2F10%2Ftoo-busy-bailing-to-plug-the-leak%2F';
  addthis_title  = 'Too+Busy+Bailing+to+Plug+the+Leak';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=PNeETM_9Lcs:GD4bTNqif4E:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=PNeETM_9Lcs:GD4bTNqif4E:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=PNeETM_9Lcs:GD4bTNqif4E:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=PNeETM_9Lcs:GD4bTNqif4E:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=PNeETM_9Lcs:GD4bTNqif4E:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=PNeETM_9Lcs:GD4bTNqif4E:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=PNeETM_9Lcs:GD4bTNqif4E:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=PNeETM_9Lcs:GD4bTNqif4E:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/helloWorld-TheSlickeditDeveloperBlog/~4/PNeETM_9Lcs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.slickedit.com/2008/10/too-busy-bailing-to-plug-the-leak/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.slickedit.com/2008/10/too-busy-bailing-to-plug-the-leak/</feedburner:origLink></item>
		<item>
		<title>Design Fail Patterns</title>
		<link>http://feedproxy.google.com/~r/helloWorld-TheSlickeditDeveloperBlog/~3/Imy884R5QYs/</link>
		<comments>http://blog.slickedit.com/2008/10/design-fail-patterns/#comments</comments>
		<pubDate>Wed, 22 Oct 2008 13:34:17 +0000</pubDate>
		<dc:creator>Scott Westfall</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.slickedit.com/?p=249</guid>
		<description><![CDATA[On every project, there is a phase where you have to pick the essential technologies that you will use to build the system. You need to decide what programming language to use. Is there an available framework? Does the system need a database? If so, which DBMS should you use?
Ideally, this is done logically and [...]]]></description>
			<content:encoded><![CDATA[<p>On every project, there is a phase where you have to pick the essential technologies that you will use to build the system. You need to decide what programming language to use. Is there an available framework? Does the system need a database? If so, which DBMS should you use?</p>
<p>Ideally, this is done logically and methodically, making sure to choose the technologies that best meet the stated needs and provide for a future growth path. Like most human activities though, this process is often subverted by the foibles of those involved.</p>
<p>Here are a number of Design Fail Patterns, ways that bad designs get chosen.</p>
<p><strong>“To A Man with a Hammer, Everything Looks Like a Nail.” – Mark Twain</strong></p>
<p>Sometimes a team makes an ill choice because of their background. There are more technologies available than ever before (see <a href="http://blog.slickedit.com/?p=248">Software’s Cambrian Explosion</a>). It is impossible to stay on top of every language, framework, and system. You do have to make a choice from the set of technologies you are familiar with or ones you know to explore.</p>
<p>Sometimes the right choice is the tool you have expertise with, even if another is more capable. Predictability is a key factor in the success of a project. Many projects don’t afford the time necessary to learn and master a new technology. So, success depends on doing the best with the tools at hand.</p>
<p>However, I have seen familiarity promote technologies way past their utility. I worked on a real-time communications system a few years ago. The architect on this project was a former Database Administrator. While he was a first-rate DBA, he knew little of object-oriented design or the design of large, complex systems. His design reflected his knowledge. Consequently, the system was designed as a transactional database with a thin veneer of objects to interact with the user and other systems.</p>
<p>I’ve also seen this work the other way. On another project we were building a system to manage patient records. While this was obviously a database project, the team treated this primarily as an object-oriented system, using the database merely to serialize their objects. All permissions, synchronization, and look-up took place in the object layer. To do that, they loaded all of the objects into memory when the system started up, with predictably poor results.</p>
<p>Every system we build has an essence that defines the nature and purpose of the system. For each, there are always technologies that are better or worse suited to that essence. It is very important to look past your familiarity and find the ones that best meet that need.</p>
<p><strong>Design by Resume</strong></p>
<p>Sometimes a team makes a bad choice because of a technology they want to work with. For a technical field, software development is full of fads and fashions. At any moment in time there is some hot, new technology that is supposed to render all others obsolete, and developers clamor to gain experience in these systems.</p>
<p>One such technology was Enterprise Java Beans (EJBs). A few years ago, the media was abuzz with articles extolling the virtues of this almost magical technology. I can hear the voice of <a href="http://en.wikipedia.org/wiki/Billy_Mays">Billy Mays</a> now, “Try EJBs, the distributed data solution that removes stains and whitens your teeth.”</p>
<p>For several years, every Java project I worked on desperately tried to find a way to use EJBs. Developers who had never actually used EJBs fell all over each other trying to wedge them into the design. Ultimately, none of the systems I worked on found a good use for them.</p>
<p>Sometimes that hot, new technology will be the right fit. Just be sure you are picking it because it is the right tool and not because you want that experience on your resume.</p>
<p><strong>Design by Magazine Article</strong></p>
<p>There is an entire ecosystem in software engineering that exists just to tell you how glorious new technologies are. That used to be the domain of trade magazines—you know the ones, the large newspaper looking things that are always lying around the break room. Now, websites have taken over as the number one source of telling you what you should be using. Seminars and conferences are another source for this.</p>
<p>Regardless of the source, Design by Magazine Article occurs when the technology direction is chosen because of one of these experts telling you how to do things. This differs from Design by Resume principally in motivation. Design by Resume comes from the desire of the developers to expand their experience. Design by Magazine Article occurs when engineers put too much faith in the so-called experts. Often this occurs in management circles, like when a CTO has time to kill on a long flight in first class.</p>
<p>And this leads us to our final Design Failure Pattern…</p>
<p><strong>Design by Management Fiat</strong></p>
<p>This may be the worst of them all, and certainly is one of the most common. In this situation, upper management decides what tools and technologies will be used. Often this comes as an effort to standardize on a tool set, like when a company decides it’s a Microsoft shop or Java shop. Sometimes it is driven by cost, like when companies standardize on tools like Eclipse.</p>
<p>This pattern is wrong on many levels. First it robs the team of their sense of buy-in. This is an essential element in a team that is functioning at its highest level. Second, no tool or technology is right for every situation. I’ve used both SQL Server and Oracle. In many cases either will do just fine. In some cases, SQL Server is a clear win for its simplicity and lower cost. But sometimes you need the capabilities that only Oracle can give you.</p>
<p>Finally, this pattern is bad because the policy is written in stone. No matter how effective some other solution might be, once management has made up their minds they will not be swayed, at least not until the next hot-shot CTO comes in and talks them into the latest set of must-have technologies.</p>
<p>Friends, let me share with you the one sure thing I’ve learned about technology: it is hard. You are faced with innumerable decisions about which way to go. While there are no roads to guaranteed success, there are many roads to guaranteed failure. You need to keep your options open and make the best choices you can.</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.slickedit.com%2F2008%2F10%2Fdesign-fail-patterns%2F';
  addthis_title  = 'Design+Fail+Patterns';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=Imy884R5QYs:VMFbcFazA5E:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=Imy884R5QYs:VMFbcFazA5E:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=Imy884R5QYs:VMFbcFazA5E:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=Imy884R5QYs:VMFbcFazA5E:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=Imy884R5QYs:VMFbcFazA5E:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=Imy884R5QYs:VMFbcFazA5E:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=Imy884R5QYs:VMFbcFazA5E:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=Imy884R5QYs:VMFbcFazA5E:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/helloWorld-TheSlickeditDeveloperBlog/~4/Imy884R5QYs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.slickedit.com/2008/10/design-fail-patterns/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.slickedit.com/2008/10/design-fail-patterns/</feedburner:origLink></item>
		<item>
		<title>Software’s Cambrian Explosion</title>
		<link>http://feedproxy.google.com/~r/helloWorld-TheSlickeditDeveloperBlog/~3/iKfHEQ6hKZg/</link>
		<comments>http://blog.slickedit.com/2008/10/softwares-cambrian-explosion/#comments</comments>
		<pubDate>Wed, 15 Oct 2008 13:16:49 +0000</pubDate>
		<dc:creator>Scott Westfall</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.slickedit.com/?p=248</guid>
		<description><![CDATA[I remember when I was first learning to program, back in the early ’80s. There were a handful of mainstream languages. The Survey of Programming class I took included FORTRAN, C, COBOL, Basic, LISP, Prologue, and Pascal. Each of these languages was distinct and served a particular purpose.
You might say that each was well adapted [...]]]></description>
			<content:encoded><![CDATA[<p>I remember when I was first learning to program, back in the early ’80s. There were a handful of mainstream languages. The <em>Survey of Programming</em> class I took included FORTRAN, C, COBOL, Basic, LISP, Prologue, and Pascal. Each of these languages was distinct and served a particular purpose.</p>
<p>You might say that each was well adapted to a particular niche in the programming ecosphere. COBOL was a business language used on mainframes to write banking applications. FORTRAN was the language used by scientists and engineers. C was the choice for writing system code and operating systems. And so on…</p>
<p>Likewise, there were relatively few choices for libraries and frameworks. If you wanted a graphical front-end, you could use X Windows. There were a couple of Database Management Systems available, but usually one that was dominant on your platform.</p>
<p>Since then, there has been an explosion of new languages, technologies, and frameworks. In my mind, this is similar to the <a href="http://en.wikipedia.org/wiki/Cambrian_explosion">Cambrian explosion</a>, a rapid proliferation of life forms that occurred around 530 million years ago. During this period, Earth went from having a relatively few and fairly similar life forms to a vast number of highly diverse life forms.</p>
<p>One explanation for this proliferation is the <a href="http://en.wikipedia.org/wiki/Snowball_Earth">Snowball Earth hypothesis</a>. According to this theory, there was a period where the entire Earth was covered by a sheet of ice. This created a uniform set of conditions for life. There was little need or opportunity for life forms to adapt to different conditions. So, there were relatively few life forms.</p>
<p>Similarly, the early years of computing saw a fairly uniform ecosystem for programs. Code was written to run on mainframes and later on mini-computers and personal computers. Still, the programs were very similar in that they were largely compiled programs and ran locally. Programs used text to interact with users.</p>
<p>The ice sheet was finally melted, it is believed, by the build-up of greenhouse gases over millions of years. Suddenly there are new conditions for life. New life forms come into being to exploit these conditions, producing the Cambrian explosion.</p>
<p>Similarly, the World Wide Web likely launched software’s version of the Cambrian explosion. The web has added many new challenges and radically altered the way programs are conceived and delivered. There was a great proliferation of languages and technologies to exploit these new conditions.</p>
<p>Though earlier developments like the personal computer and Graphical User Interfaces spawned a degree of new technologies, they cannot compare to the web for sheer number of new mechanisms. Within the Java ecosphere, alone, you can choose from Swing, Spring, JSP, Struts, JFaces, and more to build your interface, most of which were created to help deliver web content.</p>
<p>The Open Source movement is another evolutionary accelerator. There was a time when languages and frameworks were produced by a few individuals working at places like Bell Labs. With open source, communities are collaborating together to produce new technologies. This has greatly increased the rate of change.</p>
<p>I wonder what a <em>Survey of Programming</em> class is like now. It’s hard to imagine how you could cover the major technologies in a semester. Heck, by the end of the semester whole new technologies will likely have come into being. It’s exciting!</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.slickedit.com%2F2008%2F10%2Fsoftwares-cambrian-explosion%2F';
  addthis_title  = 'Software%26%238217%3Bs+Cambrian+Explosion';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=iKfHEQ6hKZg:mGTl2CD5t5w:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=iKfHEQ6hKZg:mGTl2CD5t5w:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=iKfHEQ6hKZg:mGTl2CD5t5w:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=iKfHEQ6hKZg:mGTl2CD5t5w:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=iKfHEQ6hKZg:mGTl2CD5t5w:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=iKfHEQ6hKZg:mGTl2CD5t5w:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=iKfHEQ6hKZg:mGTl2CD5t5w:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=iKfHEQ6hKZg:mGTl2CD5t5w:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/helloWorld-TheSlickeditDeveloperBlog/~4/iKfHEQ6hKZg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.slickedit.com/2008/10/softwares-cambrian-explosion/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.slickedit.com/2008/10/softwares-cambrian-explosion/</feedburner:origLink></item>
		<item>
		<title>Can we standardize version control?</title>
		<link>http://feedproxy.google.com/~r/helloWorld-TheSlickeditDeveloperBlog/~3/h9n9QUh4PUo/</link>
		<comments>http://blog.slickedit.com/2008/09/can-we-standardize-version-control/#comments</comments>
		<pubDate>Thu, 18 Sep 2008 12:45:41 +0000</pubDate>
		<dc:creator>Scott Hackett</dc:creator>
				<category><![CDATA[Productivity]]></category>

		<guid isPermaLink="false">http://blog.slickedit.com/?p=247</guid>
		<description><![CDATA[There are an unbelievable number of version control systems out there.  They all have their strengths and weaknesses, and almost everyone has a strong opinion about which one is best.  These software tools weren&#8217;t written by some group of developers that were out of touch with their end users either.  They are all developer tools, [...]]]></description>
			<content:encoded><![CDATA[<p>There are an <a href="http://en.wikipedia.org/wiki/Comparison_of_revision_control_software">unbelievable number</a> of version control systems out there.  They all have their strengths and weaknesses, and almost everyone has a strong opinion about which one is best.  These software tools weren&#8217;t written by some group of developers that were out of touch with their end users either.  They are all developer tools, written by developers for developers.  Many of them were born from previous version control packages, such as how SVN evolved from CVS.  The purpose was to keep what was good about the previous system and redo what they felt was lacking.</p>
<p>At this point, we&#8217;re pretty far along in the evolution of version control development. However, there&#8217;s a fundamental problem with all of these version control systems.  Even though they set out to do the pretty much the same thing, there&#8217;s no common interface to any of them.  Even worse, the interpretation of common concepts are completely different.  It&#8217;s not noticeable if you&#8217;ve only used one.  The more you use, though, the more obvious it becomes.  The only attempt at such a thing that I can recall is Microsoft&#8217;s SCC interface.  Unfortunately, it served a very specific purpose and aimed for the lowest common denominator.</p>
<p>If you have ever tried to switch from one version control system to another, you have suffered through this.  If you&#8217;ve ever had to port the version history from one system to another, then you likely gave up and stuck with the old system or lost all of your history.  The interoperability of version control systems is horrendous.</p>
<p><strong>Standardized interpretation</strong></p>
<p>Let&#8217;s start with version numbers, the ID that identifies a particular version of a file&#8230; how basic is that?  CVS has it&#8217;s own dot notation.  SVN and Team Server keep a global number that gets incremented when any file is checked in.  This difference in interpretation leads to fundamental differences in how these systems implement labeling and branching.</p>
<p>How could these common concepts be interpreted so differently? It means that in order to move from one version control system to another, you not only have to learn the new commands, but you must understand that system&#8217;s interpretation of what they mean.  Labeling and branching in CVS and SVN are very different, even though the basic concept is the same.  It would be nice to see some a standardization of the implementation of these concepts between version control systems.</p>
<p><strong>Standardized commands</strong></p>
<p>Imagine a world where databases each had their own proprietary language that was completely unrecognized by any other database.  Alright, maybe that&#8217;s not so far off from reality, but beyond PL/SQL, T-Sql and others, there&#8217;s ANSI SQL, which is the common language of all relational databases.  It <em>theoretically</em> (note the italics) allowed developers or DBAs to write SQL that could be understood by any database that supported ANSI SQL.  It&#8217;s the idea of polymorphism at work outside the code, creating a common interface to the functionality, yet allowing each database engine implement that functionality as they wanted.</p>
<p>Version control would be such a happier place if there was a common command language for it, that each version control system was required to implement. On a ground floor level, it would make the simple day-to-day operations consistent.  Update, commit, compare and revert would all be standard.  Once you learned how to use one version control system, you knew how to use ten version control systems.  Is this so hard?</p>
<p><strong>Import/export standardized formats<br />
</strong></p>
<p>A huge point of pain in version control is having to switch from one system to another.  It sounds crazy&#8230; who would switch version control systems at the same company?  However, it&#8217;s happened to me three times in my career.  Companies and departments merge, where both sides used different version control systems.  Sometimes your needs require a version control system with more functionality.  There are lots of reasons for switching systems.</p>
<p>Unfortunately, each time I&#8217;ve had to switch version control systems, it&#8217;s resulted in a complete loss of history. Therefore, there needs to be a standardized import/export format.  Many applications make use of XML as a way to import and export their data to share with other applications.  RSS is probably one of the best examples of this.  Version XML would allow you to export your version history for all files in the repository.  That history, as well as the files or deltas, could then be archived in tar or zip format into a single file.  The corresponding import functionality would be able to read this standard format and structure, and would be able to import that version history. This would completely remove the pain of having to switch from one version control system to another.</p>
<p><strong>Version Query Language<br />
</strong></p>
<p>Basic file check in and check out is the core of any version control system.  However, aside from being able to diff two specific versions of a file there is very little cross version analysis in most systems, despite the fact that the source control repository inherently contains this information. Going back to the SQL analogy used before, a version control repository <em><strong>is a database</strong></em> and users should be able to query it.</p>
<p>I would love to see a standard version query language and table structure that allowed you to run any query you wanted through the version control system&#8217;s engine.  You might be able to write queries like the following (pseudo-queries only):</p>
<p>Who wrote the code at a specific location in a source code file?<br />
<font size="-1"><strong>select author where file = &#8220;x&#8221; and line = y</strong><br />
where x is the file and y is the file line number.</font></p>
<p>Across all files, which version&#8217;s check in comments contain a specific string pattern?<br />
<font size="-1"><strong>select revision_number, file where comment like &#8220;x&#8221;</strong><br />
where x is the check in comment to look for.</font></p>
<p>What check ins has a particular person made in the last 10 days?<br />
<font size="-1"><strong>select file, revision_number where author = &#8220;x&#8221; and checkin_date &gt;= y</strong><br />
where x is the user and y is the date 10 days ago.</font></p>
<p>Which check ins had the biggest effect on a particular file?<br />
<font size="-1"><strong>select top 5 revision_number where </strong></font><font size="-1"><strong>file = &#8220;x&#8221; order by lines_changed desc</strong></font><font size="-1"><br />
where x is the file.</font></p>
<p>We took a stab at that in our <a href="http://www.slickedit.com/content/view/488">Tools for Visual Studio</a> product with the <strong>Find Version</strong> feature.  It allows you to find the versions of one or more files that match specific criteria, such as the ones above.  It does so with a GUI interface, not a query language like I proposed, though.  The most difficult part about this feature was finding a way to do this across several different version control systems, yet maintaining a consistent interface.</p>
<p>In an industry like software development, where most people understand the concept of one interface and many implementations, it&#8217;s amazing to me that this hasn&#8217;t caught on yet in the area of version control.  Maybe some day that will happen, and moving to a new version control system won&#8217;t waste time that could otherwise be used writing code.</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.slickedit.com%2F2008%2F09%2Fcan-we-standardize-version-control%2F';
  addthis_title  = 'Can+we+standardize+version+control%3F';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=h9n9QUh4PUo:qO8I9NzpUe8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=h9n9QUh4PUo:qO8I9NzpUe8:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=h9n9QUh4PUo:qO8I9NzpUe8:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=h9n9QUh4PUo:qO8I9NzpUe8:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=h9n9QUh4PUo:qO8I9NzpUe8:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=h9n9QUh4PUo:qO8I9NzpUe8:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=h9n9QUh4PUo:qO8I9NzpUe8:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=h9n9QUh4PUo:qO8I9NzpUe8:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/helloWorld-TheSlickeditDeveloperBlog/~4/h9n9QUh4PUo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.slickedit.com/2008/09/can-we-standardize-version-control/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		<feedburner:origLink>http://blog.slickedit.com/2008/09/can-we-standardize-version-control/</feedburner:origLink></item>
		<item>
		<title>How I Got VB for Fifty Cents</title>
		<link>http://feedproxy.google.com/~r/helloWorld-TheSlickeditDeveloperBlog/~3/s4niWy9HBac/</link>
		<comments>http://blog.slickedit.com/2008/09/how-i-got-vb-for-fifty-cents/#comments</comments>
		<pubDate>Wed, 10 Sep 2008 13:38:20 +0000</pubDate>
		<dc:creator>Scott Hackett</dc:creator>
				<category><![CDATA[Code Editors]]></category>
		<category><![CDATA[Other]]></category>

		<guid isPermaLink="false">http://blog.slickedit.com/?p=246</guid>
		<description><![CDATA[It&#8217;s become a custom with me and my kids to hit the yard sales during the summer and fall weekends.  They can get a lot more for their allowance money at those sales than they can at the toy stores, and sometimes I find stuff that&#8217;s such a bargain I can&#8217;t pass it up.  We [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s become a custom with me and my kids to hit the yard sales during the summer and fall weekends.  They can get a lot more for their allowance money at those sales than they can at the toy stores, and sometimes I find stuff that&#8217;s such a bargain I can&#8217;t pass it up.  We recently went to one that turned up one of the most amazing finds I&#8217;ve ever run into at a garage sale yet.</p>
<p><a href="http://www.scotthackett.com/slick_edit/box_front.jpg"><img src="http://www.scotthackett.com/slick_edit/box_front_small.jpg" /></a></p>
<p><strong>Visual Basic 1.0</strong></p>
<p>Sitting in between Turbo Tax &#8216;99 and Mavis Beacon&#8217;s Typing Tutor was this gem&#8230;.  Visual Basic 1.0.  I almost couldn&#8217;t believe my eyes.  To me, this was on par with finding the missing link.  As a programmer, this was archeological gold, and it was on sale for fifty cents.  My kids saw the excitement on my face and must have thought that I&#8217;d found an XBox 360.  For them, Visual Basic was a major let down.</p>
<p>A lot of people think that VB is soft and if you program in it, you&#8217;re automatically a drooling hack developer who couldn&#8217;t program their alarm clock.  I cut my teeth on <a href="http://http://blog.slickedit.com/?p=224">VB 4.0 in my first job</a>, and learned that when combined with COM in C++, VB was a fantastic language for the job of making a user interface. That being said, VB still has some special memories for me.</p>
<p><a href="http://www.scotthackett.com/slick_edit/box_back.jpg"><img src="http://www.scotthackett.com/slick_edit/box_back_small.jpg" /></a></p>
<p>The contents of the box were practically undisturbed.  The disks were all still in their original plastic wrap and the manual didn&#8217;t seem to have ever been opened.  Immediately, there are certain clues that tell you just how old it is (even though the box is copyrighted 1991).  First, the box contains two forms of media; 3.5&#8243; and 5.25&#8243; floppies.  To actually take a 5.25&#8243; floppy out of its sleeve and hold it brought me back to the days of floppy doors and the red LED that told you the disk was being read.  The system requirements for VB 1.0 were Windows 3.0, a 286 processor and 1MB of memory.  Somewhat of a far cry from the Visual Basic of today.</p>
<p><a href="http://www.scotthackett.com/slick_edit/contents.jpg"><img src="http://www.scotthackett.com/slick_edit/contents_small.jpg" /></a></p>
<p>I also loved the included &#8220;Companion Products and Services Directory&#8221;.  The third party marketing rush had already begun back then.  Most of the components in the catalog, though, are for connecting to a VAX server or to a dBase or Btrieve database.  There are a handful of charting components and widgets such as tree controls (not yet standard in 1991) and grids.  The reminiscing continues.</p>
<p>This box goes right up on my bookshelf at home next to the most revered books in my collection. Say what you will about Visual Basic, but it may be one of the most important developments in programming over the last 20 years for the simple reason that it allowed any non-programmer to write a Windows program.  If you think that&#8217;s not a valid reason for such importance, let me repeat&#8230; it allowed any non-programmer to write a Windows program.  It was Prometheus, stealing fire from Zeus and giving it to mere mortals for their use.</p>
<p>You no longer had to know C, and wade through <a href="http://www.amazon.com/Programming-Windows%C2%AE-Fifth-Microsoft/dp/157231995X/ref=pd_bbs_sr_3?ie=UTF8&amp;s=books&amp;qid=1220965587&amp;sr=8-3">Petzold</a>, to write &#8220;Hello World&#8221; in a window.  Employees from any company with core business knowledge, but no degree in programming, could now quickly write customized applications.  Of course, the debate of whether this was a good thing for programming or not still goes on today.  However, regardless of which side you&#8217;re on, you can&#8217;t deny that VB was a major victory for bringing the PC to the business market.  Without VB, we may not even have a Microsoft today.</p>
<p>So thank you very much, guy from two streets down, who decided that Visual Basic 1.0 wasn&#8217;t important enough to keep, but too important to just throw away.  One man&#8217;s junk is another man&#8217;s gold, and I really struck it rich that weekend.</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.slickedit.com%2F2008%2F09%2Fhow-i-got-vb-for-fifty-cents%2F';
  addthis_title  = 'How+I+Got+VB+for+Fifty+Cents';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=s4niWy9HBac:REgU1GLP_qc:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=s4niWy9HBac:REgU1GLP_qc:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=s4niWy9HBac:REgU1GLP_qc:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=s4niWy9HBac:REgU1GLP_qc:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=s4niWy9HBac:REgU1GLP_qc:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=s4niWy9HBac:REgU1GLP_qc:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=s4niWy9HBac:REgU1GLP_qc:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=s4niWy9HBac:REgU1GLP_qc:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/helloWorld-TheSlickeditDeveloperBlog/~4/s4niWy9HBac" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.slickedit.com/2008/09/how-i-got-vb-for-fifty-cents/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		<feedburner:origLink>http://blog.slickedit.com/2008/09/how-i-got-vb-for-fifty-cents/</feedburner:origLink></item>
		<item>
		<title>User Attention Span, the New Performance Metric</title>
		<link>http://feedproxy.google.com/~r/helloWorld-TheSlickeditDeveloperBlog/~3/7hLmIU8YZBM/</link>
		<comments>http://blog.slickedit.com/2008/08/user-attention-span-the-new-performance-metric/#comments</comments>
		<pubDate>Wed, 27 Aug 2008 14:31:22 +0000</pubDate>
		<dc:creator>Scott Hackett</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[SlickEdit Products]]></category>

		<guid isPermaLink="false">http://blog.slickedit.com/?p=245</guid>
		<description><![CDATA[When I was a kid, I was raised on Sesame Street.  I learned some counting and some reading, but most importantly, I learned how to pay attention in 3 minute chunks of time.   Over the years, that time has been cut down to somewhere around 30 seconds, which means that the advertising industry has [...]]]></description>
			<content:encoded><![CDATA[<p>When I was a kid, I was raised on Sesame Street.  I learned some counting and some reading, but most importantly, I learned how to pay attention in 3 minute chunks of time.   Over the years, that time has been cut down to somewhere around 30 seconds, which means that the advertising industry has done their job well.  Unfortunately, there&#8217;s a large group of people that share my short attention span&#8230; end users.</p>
<p><strong>Read The Friendly Manual&#8230; or not<br />
</strong></p>
<p>Many software products have changed over the years to cater to end users who don&#8217;t want to spend a lot of time learning how to use new software.  I first saw this in the game industry, where people can&#8217;t seem to be bothered to read a manual at all.  These days, games don&#8217;t even come with instructions.  They provide a tutorial level or integrated help that watches what you do and introduces you to the things you need to know as you play.  It&#8217;s brilliant, really.  The users don&#8217;t have to read a thing before playing, and who&#8217;d want to?  When I get a new game, I don&#8217;t want to waste time reading when I could be already up to level 10.  The game companies win too, because they don&#8217;t have to pay for the printed materials.  Everyone&#8217;s happy.</p>
<p>But how does this translate outside the game industry?  It&#8217;s been tried before, with much less success.  Clippy was the spokesman for the first wave of learn-as-you-go user experiences.  We all know how that turned out.  &#8220;<em>One of the worst software design blunders in the annals of computing</em>,&#8221; wrote <a href="http://en.wikipedia.org/wiki/Office_Assistant#Overview">Smithsonian Magazine</a>.</p>
<p><img width="300" src="http://www.slickedit.com/images/stories/blog/clippy.jpg" height="262" /></p>
<p>So users didn&#8217;t like being told how to use the software while they used it.  Another form of learning that is not always well received is the tip of the day.  I know my first order of business after installing new software is checking the &#8220;Never, never, ever show me this again&#8221; checkbox on the tip of the day dialog.</p>
<p><img width="353" src="http://www.slickedit.com/images/stories/blog/tipoftheday.png" height="292" /></p>
<p>Wizards also tried to ease the user into getting up and going without having to wade through options pages and understanding all of the menus and toolbars.  Although wizards have had some success, it&#8217;s still a paradigm that&#8217;s seems old.  When I think of wizards, I feel like I&#8217;m flashing back on an episode of &#8220;<a href="http://www.vh1.com/shows/dyn/i_love_the_90s/series.jhtml">I Love the 90s</a>&#8220;.</p>
<p>At the very least , there hasn&#8217;t been a lack of effort to try to help users figure out how to use their software without the manual.  Yet, most of these attempts seem to fail.  It&#8217;s as if users don&#8217;t want to read how to use the software and can&#8217;t be bothered being shown how to use it by the software itself.  Part of me wants to rant about how idiotic that is and the other half of me recognizes that I fall into that group.</p>
<p><strong>Done programming?  Great, now get back to work.</strong></p>
<p>I&#8217;ve spent most of my programming career writing programs for in-house use, or writing programs that were bought by large companies to be rolled out in-house.  The thing that all of my work had in common was that the end users were not end users by choice.  The software I helped write was all rolled out in some fashion to a large group of people whose jobs depended on them learning the software.</p>
<p>Here at SlickEdit, I&#8217;m no longer writing software that users <strong>must </strong>adapt to.  Instead, I&#8217;m writing software that users  make a conscious choice to use or not use.  The choice to use it hinges heavily on the trial, and if the user can&#8217;t get the trial installed and doing spectacular feats in less than five minutes, then the opportunity is completely lost. The bottom line is that the most important software performance metric is not how fast my code works, but how fast the user can use it meaningfully.  If that doesn&#8217;t happen, then the user loses interest and all of the great work we&#8217;ve done will never be seen.</p>
<p>That&#8217;s quite a psychological transition for me, because I&#8217;ve never focused before on instant user gratification.  One of our strategies involves the software helping users through an optional tool window, called the Tools Assistant,  which is part of the &#8220;Tools for Visual Studio&#8221; product.  It stays off to the side or can be closed if the user doesn&#8217;t want the help.  But there&#8217;s also a lot more to this effort than just adding up-front convenience to the software.  We also have to think up new ways to get users to see the product in action with very little effort on their part, often without even downloading it and installing it.  This involves a lot of non-programming work, like video script writing, screen shots, articles, etc&#8230;  It&#8217;s certainly an interesting change of pace, but it really pushes the limits outside of my programming turf.  I took a break the other day to fix bugs and it was refreshing just to see code for a while.</p>
<p>I love a change of pace&#8230; it keeps things interesting.   However, trying to figure out how to pitch a software product may be one of the biggest challenges I&#8217;ve had as part of a software development team.  I certainly never took any marketing classes in college, and at this point they&#8217;d all be irrelevant anyway.  So I&#8217;m no longer focused on reducing the time it takes to perform complex operations&#8230; my focus now is on reducing the amount of time it takes a new user to say, &#8220;wow, that is so cool!&#8221;  So far I can&#8217;t find any way to calculate the big O for that, but I&#8217;m trying.</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.slickedit.com%2F2008%2F08%2Fuser-attention-span-the-new-performance-metric%2F';
  addthis_title  = 'User+Attention+Span%2C+the+New+Performance+Metric';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=7hLmIU8YZBM:ZFNXBo-i3dE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=7hLmIU8YZBM:ZFNXBo-i3dE:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=7hLmIU8YZBM:ZFNXBo-i3dE:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=7hLmIU8YZBM:ZFNXBo-i3dE:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=7hLmIU8YZBM:ZFNXBo-i3dE:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=7hLmIU8YZBM:ZFNXBo-i3dE:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=7hLmIU8YZBM:ZFNXBo-i3dE:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=7hLmIU8YZBM:ZFNXBo-i3dE:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/helloWorld-TheSlickeditDeveloperBlog/~4/7hLmIU8YZBM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.slickedit.com/2008/08/user-attention-span-the-new-performance-metric/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.slickedit.com/2008/08/user-attention-span-the-new-performance-metric/</feedburner:origLink></item>
		<item>
		<title>Better way to find Eclipse command Ids, and more…</title>
		<link>http://feedproxy.google.com/~r/helloWorld-TheSlickeditDeveloperBlog/~3/QXRdKhu1mJ0/</link>
		<comments>http://blog.slickedit.com/2008/08/better-way-to-find-eclipse-command-ids-and-more/#comments</comments>
		<pubDate>Tue, 19 Aug 2008 13:26:45 +0000</pubDate>
		<dc:creator>Ryan</dc:creator>
				<category><![CDATA[Code Editors]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[SlickEdit Products]]></category>

		<guid isPermaLink="false">http://blog.slickedit.com/?p=243</guid>
		<description><![CDATA[Core 3.4.0 introduced the Slick-C function _eclipse_execute_command which allows you to execute Eclipse commands from the SlickEdit environment.  The documentation for this function shows you how you can search the Plug-in Registry to find Eclipse command names and ids, but there is a much better way documented in the following blog post:  http://evans-stuff.blogspot.com/2007/10/it-seems-that-im-not-only-one-still.html . 
Unfortunately I [...]]]></description>
			<content:encoded><![CDATA[<p>Core 3.4.0 introduced the Slick-C function <strong>_eclipse_execute_command</strong> which allows you to execute Eclipse commands from the SlickEdit environment.  The documentation for this function shows you how you can search the Plug-in Registry to find Eclipse command names and ids, but there is a much better way documented in the following blog post:  <a target="_blank" href="http://evans-stuff.blogspot.com/2007/10/it-seems-that-im-not-only-one-still.html">http://evans-stuff.blogspot.com/2007/10/it-seems-that-im-not-only-one-still.html</a> . </p>
<p>Unfortunately I discovered this technique after we finished the documentation and shipped the plug-in, but hopefully me pointing it out here may help some users. </p>
<p>Also, don&#8217;t forget the &#8220;Activate Editor&#8221; command in Eclipse (F12 by default).  If you are using <strong>_eclipse_execute_command</strong> to jump into different Eclipse Views and search around mouse-less, hitting F12 will jump you back into the last active editor.</p>
<p><strong>&lt;update&gt;</strong> </p>
<p>Check out this thread of the SlickEdit Forums for adding a generic Eclipse Pass-through Command: <a href="http://community.slickedit.com/index.php?topic=3549.0">http://community.slickedit.com/index.php?topic=3549.0</a></p>
<p><strong>From the post:</strong><br />
If you are evaluating 3.4.0 for your company, you can make this happen easily.  One of the best features in Core 3.4.0 is the introduction of _eclipse_execute_command, which is discussed in the user guide/readme, and also a little more in my post here: <a href="http://community.slickedit.com/index.php?topic=3816.0">http://community.slickedit.com/index.php?topic=3816.0</a> .  This is the idea that Rob suggests in this thread.</p>
<p>I&#8217;ll take this opportunity to give a brief tutorial on how to integrate that &#8220;Activate Task&#8221; shortcut into the SlickEdit environment.</p>
<p>First you need to know the command id of what you are trying to execute.  I used the method described <a href="http://evans-stuff.blogspot.com/2007/10/it-seems-that-im-not-only-one-still.html">http://evans-stuff.blogspot.com/2007/10/it-seems-that-im-not-only-one-still.html</a> , in which you create a Simple Cheat Sheet and use the Command Browse button (see first screenshot).</p>
<p><img src="http://www.slickedit.com/images/stories/blog/task1.png" /></p>
<p>Then I just used the search field to find the command (see second screenshot).</p>
<p><a href="http://www.slickedit.com/images/stories/blog/task2.png"><img src="http://www.slickedit.com/images/stories/blog/task2.png" /></a></p>
<p>Now that I had the command/parameter info, I opened up the Slick-C macro file where I write my custom commands (ryan.e), and added functions for Activate Task and Deactivate Task using _eclipse_execute_command (see third screenshot).  Remember to load your macro file with F12 after writing the functions.</p>
<p><a href="http://www.slickedit.com/images/stories/blog/task3.png"><img src="http://www.slickedit.com/images/stories/blog/task3.png" /></a></p>
<p>Then I used the SlickEdit Keybindings dialog to bind eclipse_activate_task to Ctrl + F9 (see fourth screenshot), and voila.  Hitting Ctrl + F9 in a SlickEdit editor will launch the Mylyn Activate Task dialog.</p>
<p><a href="http://www.slickedit.com/images/stories/blog/task4.png"><img src="http://www.slickedit.com/images/stories/blog/task4.png" /></a></p>
<p>It may seem like a lot of steps, but it&#8217;s really not.  This whole process took me less than 10 minutes including the time I took to capture/crop/annotate the screenshots.  You can use this method to execute almost any Eclipse command from any plug-in from the SlickEdit environment.</p>
<p>- Ryan</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.slickedit.com%2F2008%2F08%2Fbetter-way-to-find-eclipse-command-ids-and-more%2F';
  addthis_title  = 'Better+way+to+find+Eclipse+command+Ids%2C+and+more%26%238230%3B';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=QXRdKhu1mJ0:EV97HMf8a3E:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=QXRdKhu1mJ0:EV97HMf8a3E:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=QXRdKhu1mJ0:EV97HMf8a3E:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=QXRdKhu1mJ0:EV97HMf8a3E:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=QXRdKhu1mJ0:EV97HMf8a3E:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=QXRdKhu1mJ0:EV97HMf8a3E:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=QXRdKhu1mJ0:EV97HMf8a3E:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=QXRdKhu1mJ0:EV97HMf8a3E:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/helloWorld-TheSlickeditDeveloperBlog/~4/QXRdKhu1mJ0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.slickedit.com/2008/08/better-way-to-find-eclipse-command-ids-and-more/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.slickedit.com/2008/08/better-way-to-find-eclipse-command-ids-and-more/</feedburner:origLink></item>
		<item>
		<title>Defect or Feature Request?</title>
		<link>http://feedproxy.google.com/~r/helloWorld-TheSlickeditDeveloperBlog/~3/eyVBmqlf6a8/</link>
		<comments>http://blog.slickedit.com/2008/08/defect-or-feature-request/#comments</comments>
		<pubDate>Wed, 13 Aug 2008 15:37:01 +0000</pubDate>
		<dc:creator>Scott Westfall</dc:creator>
				<category><![CDATA[Dev Management]]></category>
		<category><![CDATA[Other]]></category>

		<guid isPermaLink="false">http://blog.slickedit.com/?p=242</guid>
		<description><![CDATA[SlickEdit is switching over to a different bug tracking system, so I’ve got that topic much on my mind lately. It’s amazing how complex something so simple can be. I’ve never seen a group of developers larger than three agree on how to do it.
I like the generic term, “change request” for all changes in [...]]]></description>
			<content:encoded><![CDATA[<p>SlickEdit is switching over to a different bug tracking system, so I’ve got that topic much on my mind lately. It’s amazing how complex something so simple can be. I’ve never seen a group of developers larger than three agree on how to do it.</p>
<p>I like the generic term, “change request” for all changes in a system. But it’s very important to know whether it is a defect or a feature request. In my lexicon, a “defect” is something that doesn’t work as spec’ed; a feature request is a request to alter the intended behavior. Overall, I prefer the word “defect” to “bug”. “Bug” sounds kind of cute. “Defect” is a harsh, painful word, which is exactly what I want associated with any part of the product that doesn’t work properly.</p>
<p>Depending on who you are talking to, they either don’t care about this distinction or they care greatly.</p>
<p>Customers generally don’t really care which it is. They just want the behavior changed. To them, it is a defect as in “defective”, and they don’t care whether it was spec’ed wrong or implemented wrong—it’s just wrong and they want it changed. Am I any different about the products I use?</p>
<p>As a product manager, I care greatly about this distinction because they tend to address different groups. Defects are typically the chief cause for dissatisfaction with a given product. Generally, customers wouldn’t have bought the product if it didn’t have the features they wanted, but key defects are sometimes discovered only after you’ve purchased. Certainly, if you have many obvious defects they will prevent new customers from favorably evaluating your product. Further, defects in a program add to the burden of development, slowing work on related capabilities.</p>
<p>Feature requests add new capabilities to the system. Though these are beneficial to existing users, they primarily want the existing set of capabilities to work as well as possible. New features are a means to broaden the product’s appeal. They can also provide incentives for customers to upgrade or participate in maintenance programs that include free updates.</p>
<p>Developers are also passionate about this distinction, but for a different reason. For them, the concern seems to be that a defect is considered a personal affront to their ability. I’ve spent more time arguing with some developers whether a change request was a defect or a feature request than it would actually take them to fix the problem (though, not at SlickEdit, of course!)</p>
<p>Balancing priorities for defects versus feature requests is one of the most challenging tasks a product manager faces. There are different voices pulling you in different directions: sales, marketing, customers, and developers. All have different things they want to accomplish in the next release.</p>
<p>At SlickEdit, we try to strike a balance that gives as much as we can to each group. Each major release contains new features that we think can improve how you write code. We also try to knock out as many defects as we possibly can.</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.slickedit.com%2F2008%2F08%2Fdefect-or-feature-request%2F';
  addthis_title  = 'Defect+or+Feature+Request%3F';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=eyVBmqlf6a8:bD79jad6D4w:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=eyVBmqlf6a8:bD79jad6D4w:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=eyVBmqlf6a8:bD79jad6D4w:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=eyVBmqlf6a8:bD79jad6D4w:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=eyVBmqlf6a8:bD79jad6D4w:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=eyVBmqlf6a8:bD79jad6D4w:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=eyVBmqlf6a8:bD79jad6D4w:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=eyVBmqlf6a8:bD79jad6D4w:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/helloWorld-TheSlickeditDeveloperBlog/~4/eyVBmqlf6a8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.slickedit.com/2008/08/defect-or-feature-request/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.slickedit.com/2008/08/defect-or-feature-request/</feedburner:origLink></item>
		<item>
		<title>Let’s Do a Code Review With SlickEdit Tools (Part 2)</title>
		<link>http://feedproxy.google.com/~r/helloWorld-TheSlickeditDeveloperBlog/~3/2mmr_VPWCSA/</link>
		<comments>http://blog.slickedit.com/2008/07/lets-do-a-code-review-with-slickedit-tools-part-2/#comments</comments>
		<pubDate>Wed, 23 Jul 2008 14:56:10 +0000</pubDate>
		<dc:creator>Scott Hackett</dc:creator>
				<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[SlickEdit Products]]></category>

		<guid isPermaLink="false">http://blog.slickedit.com/?p=241</guid>
		<description><![CDATA[This article continues Part 1 of the series, where we began the code review process by demonstrating some ways to find the best candidate files to review. We then introduced some techniques to identify what code a specific developer had written, using some of the features in the Versioning Toolbox. The next task is to [...]]]></description>
			<content:encoded><![CDATA[<p>This article continues <a href="http://blog.slickedit.com/?p=237">Part 1 of the series</a>, where we began the code review process by demonstrating some ways to find the best candidate files to review. We then introduced some techniques to identify what code a specific developer had written, using some of the features in the Versioning Toolbox. The next task is to actually comment on the code. This is always best done in an electronic format, in a way that can be pulled together with other developers&#8217; comments during the code review meeting.</p>
<p><strong>Using Code Annotations to Write Review Comments</strong><br />
The Code Annotations feature in the Editing Toolbox is extremely useful for writing code review comments because it lets you attach comments to specific locations in the code without altering the code itself. You can bring up the Code Annotations tool window by clicking <em>SlickEdit &gt; Show Code Annotations</em>.</p>
<p><a href="http://www.slickedit.com/images/stories/blog/code_review/codeannotationstoolwindow.jpg"><img src="http://www.slickedit.com/images/stories/blog/code_review/codeannotationstoolwindow_small.jpg" /><br />
[Click for full size image]</a></p>
<p>The first step when writing code review comments is to create an annotation file to store all of your code review comments. You can then send this file to the code review organizer when you&#8217;re done. You can use the <strong>Annotation File Manager</strong> to create a file called &#8220;<em>Code Review &#8211; Bob</em>&#8221; (or whatever your name may be).</p>
<p><img src="http://www.slickedit.com/images/stories/blog/code_review/codeannotationsfilemanager.jpg" /></p>
<p><strong>Writing Comments About the Code</strong><br />
After applying the <a href="http://www.slickedit.com/images/stories/blog/code_review/defaultuserscheme3.jpg">&#8220;Scott&#8217;s code&#8221; visualization scheme</a> that we made in the first article, we can navigate through the sections of code that Scott has written. On line 497 of <em>PackageBaseWhidbey.cs</em>, we see that he&#8217;s doing a GUID comparison using a literal string. This goes against coding standards, so we&#8217;ll log a comment that the string literal needs to be defined as a constant. Put the cursor on that line and click the <strong>New Annotation</strong> button on the Code Annotations toolbar. This will bring up the <strong>New Annotation</strong> dialog.</p>
<p><img src="http://www.slickedit.com/images/stories/blog/code_review/newannotation.jpg" /></p>
<p>We&#8217;ll create a review comment, which is one of the standard annotation types. We&#8217;ll also select the &#8220;Global : Code Review &#8211; Bob&#8221; scope, or category, which will put the annotation into the code review file we created earlier. After filling out the fields and clicking OK, a purple highlighted marker is placed on the line of the new comment.</p>
<p><a href="http://www.slickedit.com/images/stories/blog/code_review/annotatedline1.jpg"><img src="http://www.slickedit.com/images/stories/blog/code_review/annotatedline1_small.jpg" /><br />
[Click for full size image]</a></p>
<p>Once you create an annotation, it gets an entry in the annotation list. You can select that entry to see a summary of the annotation, or you can double click on it to jump directly to the code it is assigned to. This makes it easy to get to the code that you&#8217;ve commented on.</p>
<p>We also found a bug on line 431 of <em>FileUtility.cs</em>, so a bug annotation can be logged for that. This new annotation has a red highlight to indicate that it&#8217;s a bug type.</p>
<p><a href="http://www.slickedit.com/images/stories/blog/code_review/annotatedline2.jpg"><img src="http://www.slickedit.com/images/stories/blog/code_review/annotatedline2_small.jpg" /><br />
[Click for full size image]</a></p>
<p>It&#8217;s helpful to only show annotations that you have created for the code review, without the clutter of others in the list. You can filter out all non-code review annotations by using the <strong>Annotation Filter Configuration</strong> dialog, available on the code annotations toolbar. Select <strong>Filter by Scope</strong> and select the &#8220;Global : Code Review &#8211; Bob&#8221; item. Now, only your code review annotations will be visible in the list.</p>
<p><img src="http://www.slickedit.com/images/stories/blog/code_review/annotationfilter.jpg" /></p>
<p><strong>Wrapping Up Your Review</strong><br />
Once all of your code review comments have been completed, they will all be contained in the file &#8220;<em>Code Review &#8211; Bob.sca</em>&#8220;, which we created at the beginning of the article (code annotation files have an extension of .sca by default). That file can then be sent to the code review organizer.</p>
<p><img src="http://www.slickedit.com/images/stories/blog/code_review/annotationfileattachment.jpg" /></p>
<p>All of the received code annotation files can then be imported by the organizer during the code review meeting, where they can be discussed. Reviewing code this way maintains a tight link between the code review comments and the actual source code, and is far better than trying to manage the process with pen and paper, or a set of text documents.</p>
<p>You can also create a report of the annotations to print before the meeting, or to send to other developers. To do this, click the <strong>View annotation Detail</strong> toolbar button. The <strong>Code Annotation Details</strong> dialog will be shown and each annotation in the list will be shown in the report. A small red document icon will appear by each annotation that may be clicked to navigate to that annotation in the source code. The report can be exported to HTML or printed.</p>
<p><a href="http://www.slickedit.com/images/stories/blog/code_review/annotationreport.jpg"><img src="http://www.slickedit.com/images/stories/blog/code_review/annotationreport_small.jpg" /><br />
[Click for full size image]</a></p>
<p>The next step will be the actual code review meeting, which will be the focus of part 3 of this series. Once the code annotation files are pulled together from all of the reviewers, those comments can be discussed and updated. After the code review meeting, they can be exported to a single code annotation file and emailed back to the group. The developer being reviewed then has a clear set of action items as a result of the meeting.</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.slickedit.com%2F2008%2F07%2Flets-do-a-code-review-with-slickedit-tools-part-2%2F';
  addthis_title  = 'Let%26%238217%3Bs+Do+a+Code+Review+With+SlickEdit+Tools+%28Part+2%29';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=2mmr_VPWCSA:x2FrlZa6Kx4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=2mmr_VPWCSA:x2FrlZa6Kx4:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=2mmr_VPWCSA:x2FrlZa6Kx4:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=2mmr_VPWCSA:x2FrlZa6Kx4:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=2mmr_VPWCSA:x2FrlZa6Kx4:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=2mmr_VPWCSA:x2FrlZa6Kx4:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=2mmr_VPWCSA:x2FrlZa6Kx4:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=2mmr_VPWCSA:x2FrlZa6Kx4:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/helloWorld-TheSlickeditDeveloperBlog/~4/2mmr_VPWCSA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.slickedit.com/2008/07/lets-do-a-code-review-with-slickedit-tools-part-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.slickedit.com/2008/07/lets-do-a-code-review-with-slickedit-tools-part-2/</feedburner:origLink></item>
		<item>
		<title>Connecting With the End User</title>
		<link>http://feedproxy.google.com/~r/helloWorld-TheSlickeditDeveloperBlog/~3/6ipnNU2umcA/</link>
		<comments>http://blog.slickedit.com/2008/07/connecting-with-the-end-user/#comments</comments>
		<pubDate>Wed, 16 Jul 2008 15:05:43 +0000</pubDate>
		<dc:creator>Scott Hackett</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.slickedit.com/?p=239</guid>
		<description><![CDATA[Coding is as much of an art as writing literature. It&#8217;s a forgotten sentiment in programming these days. It&#8217;s easy to get lost in the sea of API&#8217;s, libraries, frameworks, and everything that&#8217;s out there that must be understood before you can start to program effectively. But many programmers see this as the end. Once [...]]]></description>
			<content:encoded><![CDATA[<p>Coding is as much of an art as writing literature. It&#8217;s a forgotten sentiment in programming these days. It&#8217;s easy to get lost in the sea of API&#8217;s, libraries, frameworks, and everything that&#8217;s out there that must be understood before you can start to program effectively. But many programmers see this as the end. Once they learn how to use an API, their learning is considered complete until the next required API comes along.</p>
<p>Just like a novelist must have a solid foundation of grammar and vocabulary, a good programmer must understand the fundamental APIs for their language. But a novelist cannot write a novel with grammar and vocabulary alone. It takes creativity to turn the words into a meaningful connection with the reader. The equivalent of this in programming is usability for the end user.</p>
<p>Usability is such a bad word. Dictionary.com defines it as &#8220;capable of being used&#8221;. Thanks for that. However, scrolling down further, it also references the following as it relates to programming:</p>
<blockquote><p><em>The effectiveness, efficiency, and satisfaction with which users can achieve tasks in a particular environment of a product. High usability means a system is: easy to learn and remember; efficient, visually pleasing and fun to use; and quick to recover from errors. </em>[1]</p></blockquote>
<p>Now we&#8217;re getting somewhere! This is a perfect analogy to the novelist trying to connect to the reader. Investigating further, I found the <a href="http://en.wikipedia.org/wiki/Human-computer_interaction">HCI (Human Computer Interface) page at Wikipedia</a>. I was expecting to find the softer side of programming, sort of a feel good, warm milk and teddy bears approach to software. However, I pretty quickly realized that it&#8217;s a whole other science in itself.</p>
<p>After creating what I think are some really compelling features in our Tools product, I&#8217;m having to look back on it now and figure out how to optimize it for the user. That&#8217;s so hard to do when you&#8217;ve worked with a thing for so long, or even worse if you&#8217;ve created the interface to it. Just like I wrote in my &#8220;<a href="http://blog.slickedit.com/?p=232">Zen Mind, Programmer&#8217;s Mind</a>&#8221; post, I really need to go back and approach it as it I knew nothing about it. I&#8217;ve always approached HCI by imagining the way that I would want to use it. It&#8217;s so easy to forget that I&#8217;m just one person and there will be so many more people out there using my software that won&#8217;t agree with the way I use it.</p>
<p>HCI is fairly new to me, but I&#8217;m always interested in learning something new. The problem to me is how amorphous it is. There are principals, guiding rules, methodologies, and such, but there are no concrete steps. I guess that&#8217;s how it is though when you get into the areas of programming that make the leap from straightforward answers to creative problem solving.</p>
<p>I wonder if someday in a hundred years or so we&#8217;ll talk about software like we talk about classic literature now. Maybe someday there will be a Shakespeare or a Mark Twain of software. Maybe someday you&#8217;ll be able to see a piece of software and say that it&#8217;s a distinctive program for a particular developer group. The closest thing we have to that right now is Apple. Someday I hope I can look at may own software and think, &#8220;Yeah, that was <em>my</em> style.&#8221;</p>
<p>1. <a href="http://dictionary.reference.com/browse/00-database-info?db=foldoc">The Free On-line Dictionary of Computing, © 1993-2007 Denis Howe</a></p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.slickedit.com%2F2008%2F07%2Fconnecting-with-the-end-user%2F';
  addthis_title  = 'Connecting+With+the+End+User';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=6ipnNU2umcA:pIMUys6k9fs:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=6ipnNU2umcA:pIMUys6k9fs:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=6ipnNU2umcA:pIMUys6k9fs:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=6ipnNU2umcA:pIMUys6k9fs:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=6ipnNU2umcA:pIMUys6k9fs:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=6ipnNU2umcA:pIMUys6k9fs:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=6ipnNU2umcA:pIMUys6k9fs:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=6ipnNU2umcA:pIMUys6k9fs:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/helloWorld-TheSlickeditDeveloperBlog/~4/6ipnNU2umcA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.slickedit.com/2008/07/connecting-with-the-end-user/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.slickedit.com/2008/07/connecting-with-the-end-user/</feedburner:origLink></item>
		<item>
		<title>The Disappointing Lack of Similarity Between Opposites, or The Ballad of Next and Prev</title>
		<link>http://feedproxy.google.com/~r/helloWorld-TheSlickeditDeveloperBlog/~3/_-NNlxG1LtM/</link>
		<comments>http://blog.slickedit.com/2008/07/the-disappointing-lack-of-similarity-between-opposites-or-the-ballad-of-next-and-prev/#comments</comments>
		<pubDate>Wed, 02 Jul 2008 12:54:27 +0000</pubDate>
		<dc:creator>Dennis B</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.slickedit.com/?p=238</guid>
		<description><![CDATA[In writing software, there are a few words you see in your symbol names more than any others:

First, Last
Next, Previous
Begin, End
Push, Pop
Draw, Erase
Add, Remove
High, Low
Yes, No
Stop, Go
OK, Cancel
And, Or
Up, Down
Left, Right
True, False
In, Out
Plus, Minus
Fixed, Floating
Open, Close

Each pair is opposite in meaning and different in length. When I study these pairs of words, I can&#8217;t help [...]]]></description>
			<content:encoded><![CDATA[<p>In writing software, there are a few words you see in your symbol names more than any others:</p>
<ul>
<li>First, Last</li>
<li>Next, Previous</li>
<li>Begin, End</li>
<li>Push, Pop</li>
<li>Draw, Erase</li>
<li>Add, Remove</li>
<li>High, Low</li>
<li>Yes, No</li>
<li>Stop, Go</li>
<li>OK, Cancel</li>
<li>And, Or</li>
<li>Up, Down</li>
<li>Left, Right</li>
<li>True, False</li>
<li>In, Out</li>
<li>Plus, Minus</li>
<li>Fixed, Floating</li>
<li>Open, Close</li>
</ul>
<p>Each pair is opposite in meaning and different in length. When I study these pairs of words, I can&#8217;t help but be absolutely convinced that the inventors of the English language gave absolutely no consideration to the fact that (thousands of years later) there will be millions of programmers writing code in mono-spaced fonts and really, really wanting it to line up nicely, but thwarted by this lack of similarity in length.</p>
<p>If you are smart, you&#8217;ll stop reading now, the rest is a bit predictable and boring. The point of this article is that it is annoying to write code that looks like this.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">T getNextItem();<br />
T getPreviousItem();</div></td></tr></tbody></table></div>
<p>So much is it annoying, that the monosyllabic, four letter abbreviation &#8220;Prev&#8221; has nearly became a universally accepted substitute for &#8220;Previous&#8221;, within the confines of software, at least.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">T getNextItem();<br />
T getPrevItem(); // ahhhhh</div></td></tr></tbody></table></div>
<p>You are still reading? Ok, fine. Really, if you have been programming at all, you have already encountered this, and you know everything I&#8217;m going to say. You <em>could</em> have stopped at the title, in fact.</p>
<p>There are a few exceptions to this rule of opposites &#8212; Get, Set, North, South, East, West, Insert, Delete, Internal, External, Throw, Catch. Get and Set are so loved, <em>I think for their matching size and rhyme</em>, that we have invented new words for those types of functions (getters and setters). Of course, &#8220;setter&#8221; isn&#8217;t a new word, but prior to the explosive discovery that both get and set had three letters, a &#8220;setter&#8221; usually referred to a breed of canine. What is really impressive are the applications you might find map directions applied to. Not in SlickEdit, but elsewhere, I have seen North and South used for cursor movement where you would have logically used Up and Down. Likewise, East and West have been applied to where you might logically think Left and Right and even, Next and Previous. My theory is that to some, alignment is a worthy cause, so much so that you may chose a naming scheme which involves a level of indirection.</p>
<p>Certain shell languages have employed mirror spellings of keywords as a level of indirection between opposites and like-sized keywords. Thus you find do, od, if, fi, case, esac. The first time you see it, you will think, &#8220;What is an esac? If it&#8217;s anything like an email, I do not want to touch it.&#8221; But, it may grow on you, as the Bourne shell has grown on Unix.</p>
<p>Acronyms were all the rage in the old days when it <em>really did matter</em> that your code be small and fit on a punch card. Some continue to survive and are frequently used, such as Gt for greater, Lt for less than, Eq for Equal, Ne for inequality, Hi for high, Lo for low, T for true, F for false. Sometimes you see hybrid abbreviation pairings, such as Up, Dn, or Add, Del.</p>
<p>Some programming language designers have addressed this issue with more symbols. APL is well known for it&#8217;s elaborate character set, &#8220;⌊&#8221; for floor and &#8220;⌈&#8221; for ceiling, for example. C++ introduced operator overloading and programmers followed that path of slow, destructive insanity towards standardizing &#8212; and ++ as next and previous iterator methods, among others.</p>
<p>But, in the end, this problem of opposites being different is not a programming language issue, it is a natural language issue. It&#8217;s a problem with the English vocabulary. And there is little we can do about that. Until we find a natural language invented by linguists who really thought about writing code in monospace fonts, our code will never be aligned as well as it could be.</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.slickedit.com%2F2008%2F07%2Fthe-disappointing-lack-of-similarity-between-opposites-or-the-ballad-of-next-and-prev%2F';
  addthis_title  = 'The+Disappointing+Lack+of+Similarity+Between+Opposites%2C+or+The+Ballad+of+Next+and+Prev';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=_-NNlxG1LtM:SIqztJrSwRU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=_-NNlxG1LtM:SIqztJrSwRU:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=_-NNlxG1LtM:SIqztJrSwRU:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=_-NNlxG1LtM:SIqztJrSwRU:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=_-NNlxG1LtM:SIqztJrSwRU:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=_-NNlxG1LtM:SIqztJrSwRU:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=_-NNlxG1LtM:SIqztJrSwRU:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=_-NNlxG1LtM:SIqztJrSwRU:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/helloWorld-TheSlickeditDeveloperBlog/~4/_-NNlxG1LtM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.slickedit.com/2008/07/the-disappointing-lack-of-similarity-between-opposites-or-the-ballad-of-next-and-prev/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.slickedit.com/2008/07/the-disappointing-lack-of-similarity-between-opposites-or-the-ballad-of-next-and-prev/</feedburner:origLink></item>
		<item>
		<title>Let’s Do a Code Review With SlickEdit Tools (Part 1)</title>
		<link>http://feedproxy.google.com/~r/helloWorld-TheSlickeditDeveloperBlog/~3/n9S1In78hZs/</link>
		<comments>http://blog.slickedit.com/2008/06/lets-do-a-code-review-with-slickedit-tools-part-1/#comments</comments>
		<pubDate>Wed, 25 Jun 2008 15:11:34 +0000</pubDate>
		<dc:creator>Scott Hackett</dc:creator>
				<category><![CDATA[Code Editors]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[SlickEdit Products]]></category>

		<guid isPermaLink="false">http://blog.slickedit.com/?p=237</guid>
		<description><![CDATA[As a developer, I look for tools that help me get things done quicker, and make tasks easier. This series of articles shows you how to take a handful of the features in SlickEdit Tools for Microsoft® Visual Studio® and use them to effectively put together and perform a code review.
I can&#8217;t say that I&#8217;ve [...]]]></description>
			<content:encoded><![CDATA[<p>As a developer, I look for tools that help me get things done quicker, and make tasks easier. This series of articles shows you how to take a handful of the features in <a href="http://www.slickedit.com/content/view/408/244?utm_source=seblogtoolstut&amp;utm_medium=blog&amp;utm_campaign=seblogtoolstut">SlickEdit Tools</a> for Microsoft® Visual Studio® and use them to effectively put together and perform a code review.</p>
<p>I can&#8217;t say that I&#8217;ve met too many developers that eagerly looked forward to reviewing code. Most developers understand the importance of code reviews, but many have experienced the pain of poorly run code reviews. Although SlickEdit Tools does not have a &#8220;code review&#8221; feature, it provides several features that can be used together to make a code review run smoothly. A well done code review process can be the difference between developer loathing and developer buy-in.</p>
<p>Because code reviews are such a big topic, this article will focus on some of the steps that lead up to a code review. Code reviews typically focus on the work of a single developer, so we&#8217;ll start there. We are going to be code reviewing the developer with ID <em>SLICKEDIT\shackett</em> (or <strong>Scott</strong>) in source control, and we&#8217;ll be reviewing his work since March 3, 2008, which is the date of our last (fictional) release.</p>
<p><strong>Finding the Best Files to Review</strong><br />
Our first challenge involves finding the set of files that Scott has worked on since March 3, 2008. We&#8217;ll use the <strong>Find Version</strong> feature of the SlickEdit Tools Versioning Toolbox as our starting point.</p>
<p><img src="http://www.slickedit.com/images/stories/blog/code_review/findversion.jpg" /></p>
<p>Find Version allows you to query versions of the source code files in your solution. The code review organizer can use this feature to find an ideal set of files to review. Simply click <em>SlickEdit &gt; Find Version</em> to bring up the Find Version tool window. For this example, we&#8217;ll find versions with the following criteria:</p>
<ul>
<li><strong>Since date:</strong> Finds all versions checked in since a particular date, such as the last release.</li>
<li><strong>Developer name:</strong> Finds all versions checked in by one or more specific developers.</li>
</ul>
<p>These two criteria are used to find all versions checked in by Scott during the latest development cycle (March 3, 2008 &#8211; present).</p>
<p>No development team has the resources to code review every file in that list, so it&#8217;s important to find the best candidate files to review. Therefore, the next task is to look through the results and find a sampling of files that represent the most important or complex code. You might also include some files that have a high number of check-ins by that developer, which indicates high rate of change, or churn. These are the ideal candidate files to be reviewed. Email the names of those files to all developers who will be participating in the code review.</p>
<p><a href="http://www.slickedit.com/images/stories/blog/code_review/findversionresults.jpg"><img src="http://www.slickedit.com/images/stories/blog/code_review/findversionresults_small.jpg" /><br />
[Click here for the full size image]</a></p>
<p>In this example, <em>PackageBaseWhidbey.cs</em> has had several changes and is a very important file, so we&#8217;ll include that in our code review process.</p>
<p><strong>Loading the Files to Review</strong><br />
When a developer is ready to prepare their review comments, they should close all other files and open the files in the list sent by the code review organizer. This can be done quickly using the <strong>Load Files </strong>feature in the Editing Toolbox, which allows you to quickly filter the list of files in your solution and open the ones you&#8217;re looking for. Click <em>SlickEdit &gt; Load Files</em> to use this feature.</p>
<p><img src="http://www.slickedit.com/images/stories/blog/code_review/loadfiles.jpg" /></p>
<p>By typing &#8220;<em>basew</em>&#8221; in the filter, we narrow down the files in the list to only those that include that text in their file name. We&#8217;ll select <em>PackageBaseWhidbey.cs</em> and open it.</p>
<p><strong>Isolating a Developer&#8217;s Work</strong><br />
One of the most difficult things to do when reviewing the code of another developer is actually identifying the work that that developer did, especially if it was done as part of a team. Once you have <em>PackageBaseWhidbey.cs</em> open, we&#8217;ll use the <strong>Version Visualizer</strong> feature of the Versioning Toolbox to see which parts Scott has worked on. Click <em>SlickEdit &gt; Version Visualizer</em> to show this tool window. Next, select &#8220;Default User Scheme&#8221; in the drop down at the top of that tool window.</p>
<p><img src="http://www.slickedit.com/images/stories/blog/code_review/versionvisualizer.jpg" /></p>
<p>The versions of the file will be processed and the tool window will list the names of all developers who have contributed to the current state of the file. The editor also becomes colorized into segments of lines that identify who wrote each line of the file.</p>
<p><a href="http://www.slickedit.com/images/stories/blog/code_review/defaultuserscheme1.jpg"><img src="http://www.slickedit.com/images/stories/blog/code_review/defaultuserscheme1_small.jpg" /><br />
[Click here for the full size image]</a></p>
<p>You can find Scott&#8217;s name (<em>SLICKEDIT\shackett</em>) in the tool window list and double click on it to go to the first line of code he contributed. You can then use the next and previous button on the tool window to navigate through the blocks of his work.</p>
<p>To make Scott&#8217;s work stand out more distinctly, select his name (<em>SLICKEDIT\shackett</em>) in the list and click the &#8220;Toggle Selection Visibility&#8221; toolbar button. When toggled on, Scott&#8217;s work will stand out, and all other developer&#8217;s work will be dimmed out. This allows you to quickly see what code is Scott&#8217;s and what code isn&#8217;t. You can click this button again to toggle it back off.</p>
<p><a href="http://www.slickedit.com/images/stories/blog/code_review/defaultuserscheme2.jpg"><img src="http://www.slickedit.com/images/stories/blog/code_review/defaultuserscheme2_small.jpg" /><br />
[Click here for the full size image]</a></p>
<p>Another option is to assign a unique color to Scott. To do this, click the <strong>Configure Visualization Schemes</strong> button on the <strong>Version Visualizer</strong> toolbar. This will bring up the <strong>Scheme Builder</strong> dialog. We&#8217;ll create a new scheme to highlight all areas of code worked on by Scott. Click the <strong>Add new scheme</strong> button and give the scheme a name of &#8220;Scott&#8217;s code&#8221;. We can now add a scheme item for Scott and give it a color of bright red.</p>
<p><a href="http://www.slickedit.com/images/stories/blog/code_review/schemebuilder.jpg"><img src="http://www.slickedit.com/images/stories/blog/code_review/schemebuilder_small.jpg" /><br />
[Click here for the full size image]</a></p>
<p>We can save this visualization scheme and then apply it by selecting it in the <strong>Version Visualizer</strong> drop down. This same scheme can be applied to any file to highlight areas of the code written by Scott.</p>
<p><a href="http://www.slickedit.com/images/stories/blog/code_review/defaultuserscheme3.jpg"><img src="http://www.slickedit.com/images/stories/blog/code_review/defaultuserscheme3_small.jpg" /><br />
[Click here for the full size image]</a></p>
<p>If you find a block of code written by the developer being reviewed that looks questionable, you may want more context about the developer&#8217;s intent, such as the check in comment made when that section of code was checked in. This information is very important for creating meaningful code review comments. The easiest way to do this is to see which version that code was checked in as, and look at the comment associated with that version. To do this, select &#8220;Default Relative Age Scheme&#8221; in the drop down at the top of the <strong>Version Visualizer</strong> tool window.</p>
<p><a href="http://www.slickedit.com/images/stories/blog/code_review/defaultrelativeagecheme.jpg"><img src="http://www.slickedit.com/images/stories/blog/code_review/defaultrelativeagecheme_small.jpg" /><br />
[Click here for the full size image]</a></p>
<p>Again, the versions of the file will be processed, but now the tool window will list the IDs of all versions that have contributed to the current state of the file. The editor also becomes colorized into segments of lines that identify which version last updated each line of the file. The colorizing of each segment corresponds to the age of the version it was checked in with (dark is oldest, light is most recent).</p>
<p>You can find the version associated with the questionable code and take a look at the comments associated with it. You can also use the next and previous button as before to see all of the code in the file that was updated as a result of that check in. For instance, we may have disagreed with the AddMenuCommandHandler function being public. We can see that change was part of version 762. By hovering over that version in the <strong>Version Visualizer</strong> tool window, we get a better understanding of why the function was made public. All of these features assist the team in making judgments about which code to review. They also provide some insight into the motivation the developer being reviewed might have had when checking a set of code in.</p>
<p>Next is the task of actually commenting on the code. This task is always best done in electronic format, in a way that can be pulled together as part of the code review meeting. The <strong>next article</strong> in the series will go through some of the features of SlickEdit Tools that facilitate writing comments about code and tying them directly to the source, without modifying the files.</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.slickedit.com%2F2008%2F06%2Flets-do-a-code-review-with-slickedit-tools-part-1%2F';
  addthis_title  = 'Let%26%238217%3Bs+Do+a+Code+Review+With+SlickEdit+Tools+%28Part+1%29';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=n9S1In78hZs:cJ38sgODu5U:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=n9S1In78hZs:cJ38sgODu5U:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=n9S1In78hZs:cJ38sgODu5U:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=n9S1In78hZs:cJ38sgODu5U:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=n9S1In78hZs:cJ38sgODu5U:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=n9S1In78hZs:cJ38sgODu5U:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=n9S1In78hZs:cJ38sgODu5U:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=n9S1In78hZs:cJ38sgODu5U:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/helloWorld-TheSlickeditDeveloperBlog/~4/n9S1In78hZs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.slickedit.com/2008/06/lets-do-a-code-review-with-slickedit-tools-part-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.slickedit.com/2008/06/lets-do-a-code-review-with-slickedit-tools-part-1/</feedburner:origLink></item>
		<item>
		<title>The Programming Book Graveyard</title>
		<link>http://feedproxy.google.com/~r/helloWorld-TheSlickeditDeveloperBlog/~3/6Js9RYXhhVM/</link>
		<comments>http://blog.slickedit.com/2008/06/the-programming-book-graveyard/#comments</comments>
		<pubDate>Wed, 18 Jun 2008 16:56:24 +0000</pubDate>
		<dc:creator>Scott Hackett</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.slickedit.com/?p=236</guid>
		<description><![CDATA[I&#8217;m a bit of a pack rat&#8230; I have a hard time getting rid of anything I think I might possibly need in the future, and that&#8217;s especially true of computer books and magazines. Once upon a time, there was no internet&#8230; a sad fact that makes me feel older than my parents who can [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m a bit of a pack rat&#8230; I have a hard time getting rid of anything I think I might possibly need in the future, and that&#8217;s especially true of computer books and magazines. Once upon a time, there was no internet&#8230; a sad fact that makes me feel older than my parents who can remember a time without TV. There was no Googling MSDN, no easy access to message boards, no coding sample web sites. Back then all you had was paper and ink, and you learned what you needed to learn by going to the bookstore and picking up the latest programming book on that subject. <a href="http://bp2.blogger.com/_p-WnL3N525c/R3pk6H9OQBI/AAAAAAAAAE0/20PwSTGjnDk/s1600-h/DaCa-Grumpy+Old+Man.jpg">And we liked it!</a></p>
<p>A programmer&#8217;s bookshelf was more than a reference library though; it was your peer resume. Other programmers would look through your bookshelf the same way that animals size each other up in the wild. When you started a new job, your bookshelf contents were like the cologne and nice clothes you put on for a first date. It was a huge part of the first impression you made and helped define what you knew. Did anyone care if you&#8217;d really read those books? Of course not! Just seeing <a href="http://www.amazon.com/Design-Patterns-Object-Oriented-Addison-Wesley-Professional/dp/0201633612/ref=pd_bxgy_b_img_a">Design Patterns</a>, <a href="http://www.amazon.com/Introduction-Algorithms-Thomas-H-Cormen/dp/0262032937/ref=pd_sbs_op_img_1">Introduction to Algorithms</a> and <a href="http://www.amazon.com/C-Programming-Language-Special-3rd/dp/0201700735/ref=pd_bxgy_b_img_a">The C++ Programming Language</a> was enough to grant you elite status your first day on the job (at least to those who mattered).</p>
<p>At my desk right now, I have approximately thirty books on the shelf. I&#8217;ve read them all from cover to cover, some of them several times. However, I haven&#8217;t read any of them in the past five years. At times, I&#8217;ll crack one open for a quick reference to something I can&#8217;t find quickly online, but seriously, they&#8217;re relics. I know that I should just do the smart thing and admit to them that the internet has caused their jobs to become redundant. I should tell them that the bookshelf is being downsized, and that they&#8217;re jobs have been outsourced to the web servers at Google. I just can&#8217;t bring myself to do that, though.</p>
<p>Every one of them has, in some strange way, come to mean more to me than just the information they contain. I can look at the cover of almost any book on my shelf and remember the reason I bought it, the project I was working on when I read it, and the difficult problems that it helped me work my way thorough. Many of the books have pictures of the authors on the cover, personifying them. All of the books make me reminisce to the period of time when they were read, the same way that so many songs from my first year of college do. I feel like I could take my programming books out for a beer and have a blast catching up on old times.</p>
<p>My programming bookshelf isn&#8217;t about learning anymore, and it&#8217;s certainly not about impressing anyone. I may at some point retire them, but not anytime soon. They sit on my shelf like old friends who I want to share my new programming experience with. They helped me out through tough times and I still want them to be there for all of my latest projects. I think my COM ATL books are grudgingly impressed with all the new-fangled .Net stuff, though I don&#8217;t think they trust it. My sockets books like to shake their walkers at web services. And of course, my first HTML book doesn&#8217;t think this fancy web 2.0 nonsense looks anywhere near as good as the first Geocities home page it helped me make.</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.slickedit.com%2F2008%2F06%2Fthe-programming-book-graveyard%2F';
  addthis_title  = 'The+Programming+Book+Graveyard';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=6Js9RYXhhVM:DjdLB2QOrzo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=6Js9RYXhhVM:DjdLB2QOrzo:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=6Js9RYXhhVM:DjdLB2QOrzo:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=6Js9RYXhhVM:DjdLB2QOrzo:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=6Js9RYXhhVM:DjdLB2QOrzo:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=6Js9RYXhhVM:DjdLB2QOrzo:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=6Js9RYXhhVM:DjdLB2QOrzo:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=6Js9RYXhhVM:DjdLB2QOrzo:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/helloWorld-TheSlickeditDeveloperBlog/~4/6Js9RYXhhVM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.slickedit.com/2008/06/the-programming-book-graveyard/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://blog.slickedit.com/2008/06/the-programming-book-graveyard/</feedburner:origLink></item>
		<item>
		<title>“Hello World” – The SlickEdit Developer Blog</title>
		<link>http://feedproxy.google.com/~r/helloWorld-TheSlickeditDeveloperBlog/~3/zL5-AuxmN9M/</link>
		<comments>http://blog.slickedit.com/2008/06/%e2%80%9chello-world%e2%80%9d-the-slickedit-developer-blog/#comments</comments>
		<pubDate>Wed, 11 Jun 2008 19:12:58 +0000</pubDate>
		<dc:creator>jjones</dc:creator>
				<category><![CDATA[Other]]></category>

		<guid isPermaLink="false">http://blog.slickedit.com/?p=235</guid>
		<description><![CDATA[To quote Jeff Atwood of Coding Horror fame:
“I don&#8217;t care if you suck at writing. I don&#8217;t care if nobody reads your blog. I don&#8217;t care if you have nothing interesting to say. If you can demonstrate a willingness to write, and a desire to keep continually improving your writing, you will eventually be successful.”
How [...]]]></description>
			<content:encoded><![CDATA[<p>To quote Jeff Atwood of <a href="http://www.codinghorror.com/blog/">Coding Horror </a>fame:</p>
<p><em><strong>“I don&#8217;t care if you suck at writing. I don&#8217;t care if nobody reads your blog. I don&#8217;t care if you have nothing interesting to say. If you can demonstrate a willingness to write, and a desire to keep continually improving your writing, you will eventually be successful.”</strong></em></p>
<p><strong>How this applies to us</strong></p>
<p>We began blogging at SlickEdit a little over a year ago. Not written by a single person, the blog is a group effort authored by the dev and support teams. Our goal for the blog was to better connect with the developer community at large and to become an active participant in online discussions . The <em><strong>‘Hello World’</strong></em> blog gave us the perfect platform to share our thoughts, opinions, and expertise on a myriad of technical issues.</p>
<p>From software management and best practices to managing the first days on the job, the SlickEdit team has shared their thoughts, tips, real world experiences, and genuine joy of coding with the online community. I am very happy to say that the blog has been a huge success. With hundreds of thousands of visitors from over 176 countries and territories, the SlickEdit blog has outperformed our wildest expectations.</p>
<p>What has been really exciting are the hundreds of comments we have received on the blog, as well as link backs, that have really allowed us to connect and interact with the online community &#8211; the whole purpose of the blog to begin with. On the social media side, we have been <a href="http://digg.com/">Dugg</a>, <a href="http://www.reddit.com/">Reditted</a>, <a href="http://www.stumbleupon.com/">StumbledUpon</a>, <a href="http://www.dzone.com/links/index.html">Dzoned</a>, <a href="http://www.dotnetkicks.com/">DotNetKicked</a>, <a href="http://del.icio.us/">Delicioused</a>, <a href="http://news.ycombinator.com/news">Hacker Newsed</a>, etc… more times than I can count. Exciting stuff and we can&#8217;t thank you enough.</p>
<p>Just in case you have missed any posts, here are a samples from each month since we began the blog.</p>
<p>Visit the <a href="http://blog.slickedit.com/?page_id=93/">blog archives</a> for a complete list of all posts :</p>
<p><strong>April 2007</strong></p>
<p><a rel="bookmark" href="http://blog.slickedit.com/?p=7" title="Permanent Link: Is Your Editor Working Hard Enough?">Is Your Editor Working Hard Enough?</a></p>
<p><strong>May 2007</strong></p>
<p><a rel="bookmark" href="http://blog.slickedit.com/?p=85" title="Permanent Link: Top Ten Reasons NOT to use SlickEdit">Top Ten Reasons NOT to use SlickEdit</a></p>
<p><strong>June 2007</strong></p>
<p><a rel="bookmark" href="http://blog.slickedit.com/?p=96" title="Permanent Link: Learning to Fly: The Musings of a New SlickEdit Employee">Learning to Fly: The Musings of a New SlickEdit Employee</a></p>
<p><strong>July 2007</strong></p>
<p><a rel="bookmark" href="http://blog.slickedit.com/?p=95" title="Permanent Link: Programming Language Wars">Programming Language Wars</a></p>
<p><strong>August 2007</strong></p>
<p><a rel="bookmark" href="http://blog.slickedit.com/?p=103" title="Permanent Link: SlickEdit 2007 For Windows Development">SlickEdit 2007 For Windows Development</a></p>
<p><strong>September 2007</strong></p>
<p><a rel="bookmark" href="http://blog.slickedit.com/?p=128" title="Permanent Link: Creating a PHP 5 Extension with Visual C++ 2005">Creating a PHP 5 Extension with Visual C++ 2005</a></p>
<p><strong>October 2007</strong></p>
<p><a rel="bookmark" href="http://blog.slickedit.com/?p=98" title="Permanent Link: Comfort, Habits and Ruts in Software Development">Comfort, Habits and Ruts in Software Development</a></p>
<p><strong>November 2007</strong></p>
<p><a rel="bookmark" href="http://blog.slickedit.com/?p=163" title="Permanent Link: C# with SlickEdit : No Visual Studio Required">C# with SlickEdit : No Visual Studio Required</a></p>
<p><strong>December 2007</strong></p>
<p><a rel="bookmark" href="http://blog.slickedit.com/?p=174" title="Permanent Link: Classical in a Digital Age">Classical in a Digital Age</a></p>
<p><strong>January 2008</strong></p>
<p><a rel="bookmark" href="http://blog.slickedit.com/?p=205" title="Permanent Link: My Programming New Year’s Resolution">My Programming New Year’s Resolution</a></p>
<p><strong>February 2008</strong></p>
<p><a rel="bookmark" href="http://blog.slickedit.com/?p=217" title="Permanent Link: Plug-in Extensibility Through Reflection in .Net and Java">Plug-in Extensibility Through Reflection in .Net and Java</a></p>
<p><strong>March 2008</strong></p>
<p><a rel="bookmark" href="http://blog.slickedit.com/?p=221" title="Permanent Link: Software Schedules and the Parable of the Loaf of Bread">Software Schedules and the Parable of the Loaf of Bread</a></p>
<p><strong>April 2008</strong></p>
<p><a rel="bookmark" href="http://blog.slickedit.com/?p=230" title="Permanent Link: BASIC and the Rubik’s Cube">BASIC and the Rubik’s Cube</a></p>
<p><strong>May 2008</strong></p>
<p><a rel="bookmark" href="http://blog.slickedit.com/?p=212" title="Permanent Link: Tutorial: Adding Language Support to SlickEdit">Tutorial: Adding Language Support to SlickEdit</a></p>
<p><strong>June 2008 </strong></p>
<p><a rel="bookmark" href="http://blog.slickedit.com/?p=233" title="Permanent Link: “Management” is a Dirty Word">“Management” is a Dirty Word</a></p>
<p><strong> All</strong></p>
<p><a href="http://blog.slickedit.com/?page_id=93/">Complete list of all posts for SlickEdit </a></p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.slickedit.com%2F2008%2F06%2F%25e2%2580%259chello-world%25e2%2580%259d-the-slickedit-developer-blog%2F';
  addthis_title  = '%E2%80%9CHello+World%E2%80%9D+%26%238211%3B+The+SlickEdit+Developer+Blog';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=zL5-AuxmN9M:2t6zgQR2-zI:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=zL5-AuxmN9M:2t6zgQR2-zI:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=zL5-AuxmN9M:2t6zgQR2-zI:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=zL5-AuxmN9M:2t6zgQR2-zI:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=zL5-AuxmN9M:2t6zgQR2-zI:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=zL5-AuxmN9M:2t6zgQR2-zI:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=zL5-AuxmN9M:2t6zgQR2-zI:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=zL5-AuxmN9M:2t6zgQR2-zI:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/helloWorld-TheSlickeditDeveloperBlog/~4/zL5-AuxmN9M" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.slickedit.com/2008/06/%e2%80%9chello-world%e2%80%9d-the-slickedit-developer-blog/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.slickedit.com/2008/06/%e2%80%9chello-world%e2%80%9d-the-slickedit-developer-blog/</feedburner:origLink></item>
		<item>
		<title>“Management” is a Dirty Word</title>
		<link>http://feedproxy.google.com/~r/helloWorld-TheSlickeditDeveloperBlog/~3/MTwGstwRAnM/</link>
		<comments>http://blog.slickedit.com/2008/06/management-is-a-dirty-word/#comments</comments>
		<pubDate>Tue, 03 Jun 2008 14:36:55 +0000</pubDate>
		<dc:creator>Scott Westfall</dc:creator>
				<category><![CDATA[Dev Management]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.slickedit.com/?p=233</guid>
		<description><![CDATA[Though it won&#8217;t be flagged as profane in most dictionaries, one word that is often viewed as a dirty word in programming is “management”. Managers are so maligned in engineering that Scott Adams created the “pointy-haired boss” as their representative (http://www.dilbert.com/). It may be true that managers are equally loathed in other fields, but having [...]]]></description>
			<content:encoded><![CDATA[<p>Though it won&#8217;t be flagged as profane in most dictionaries, one word that is often viewed as a dirty word in programming is “management”. Managers are so maligned in engineering that Scott Adams created the “pointy-haired boss” as their representative (http://www.dilbert.com/). It may be true that managers are equally loathed in other fields, but having spent my adult years working in software engineering, this is the only field I feel competent to address. I also have a somewhat unique perspective having been both a developer and a development manager.</p>
<p>I believe that all teams need management. That’s not to say that they all need a manager; some teams do manage themselves. Effective management gets the most out of a team by setting clear goals and minimizing time lost to indecision. A good manager bridges the gap between the business team and the technical team, making sure that both viewpoints are properly considered. A strong development manager can bring a process-centric view to the development team that seeks to improve daily workflows and operations.</p>
<p><strong>So, what’s wrong with “management”? </strong></p>
<p>I think the core reason that software management is so reviled is that it is so rarely done well. In my programming career, I can divide my previous managers into 3 categories:</p>
<ol>
<li><strong>Benevolent, useless, harmless</strong>—this is the category into which fall most of my previous managers. They did a reasonable job of passing along information and managing schedules, but I never really felt they were helping me get my job done. I spent a great deal more time giving them status reports than receiving guidance.</li>
<li><strong>Malevolent, clueless, harmful</strong>—fortunately this category contains only a few of my previous managers. These are the ones who made the job much harder than it needed to be. Sometimes it was done to further their individual goals, like the manager who stuck us with an unreachable milestone so he could get a 30% bonus. Others, it was because they had no idea what we were doing and didn’t have the courage to admit it.</li>
<li><strong>Effective, purposeful, supportive</strong>—by far the smallest population, this is the category we wish all managers fell into but so few actually do. These are the ones who truly help you get your work done by providing the kind of guidance and environment you need to succeed. Tom R., you were the best!</li>
</ol>
<p><strong>How did we get here?</strong></p>
<p>There are so many contributory causes for this problem. The first group, above, is composed of good people who just don’t know what to do. The second group shouldn’t be in charge of themselves, let alone others. I can offer little help to the second group, so let’s focus on the first.</p>
<p>There are two kinds of development managers: those with a strong programming background and those without one (henceforth called “programmers” and “non-programmers”). Even if you have some programming experience, it may not be enough to qualify you as a programmer. You have to have done enough to be considered as a peer on your programming team. I divide managers into these groups because they face different challenges. I’ve worked for managers from both backgrounds and neither is a guarantee of success or failure. My best manager learned his craft managing supermarkets before he went into software development.</p>
<p>To be a successful development manager, you need to know how to manage and enough about software engineering to make appropriate choices. Oddly enough, both groups seem to struggle with the first item. Though the non-programmers tend to have better communication skills than the programmers (if they didn’t, what the heck were they hired for since they’re not programmers?), few of them in my career were skilled managers.</p>
<p><strong>Unique Challenges</strong></p>
<p>The unique challenge faced by the non-programmers is their lack of knowledge about software development. This often hinders their decision-making. A common sign of this is an insistence on keeping to the schedule when a minor slippage could make a huge difference later. When you’ve been around software development long enough, you learn that schedules are fluid. What you do today can make your work tomorrow easier, or harder, depending on the quality of the design and implementation. It takes experience and insight to know when to make these tradeoffs.</p>
<p>Another common problem for the non-programmer manager is not being able to call shenanigans when a developer is snowing you. Even as a programmer, you will never know someone’s code like they will, but you will know from your experience when a developer is likely doing something wrong. My background has helped me to sniff out cases of “design by resume”, where developers chose a particular approach in order to get a trendy new technology on their resume. A non-programmer manager would have a hard time asking the appropriate questions to recognize this.</p>
<p>The programmer managers also face unique challenges. The first is the temptation to code and manage at the same time. I read where others actually recommend this as the desired situation. In my experience, the two activities are incompatible. Effective coding is about immersion, getting into a state of flow, and being very productive. Effective management involves being available to your team to tackle their issues when they arise. Even when I wanted to try to keep coding, I’ve never had a position where the management responsibilities didn’t crowd out any time I allocated for coding. As a manager, my favorite means of being involved with the code is to participate in design discussions and code reviews. This keeps things at a high level and still allows you to contribute your knowledge and experience.</p>
<p>Another problem for the programmer manager is trying to be “one of the guys”. This is manifested as a manager who is hesitant or unable to provide negative feedback. Often, these kinds of managers are promoted from within the team, making this even more of an issue. These managers still view themselves or want to be considered to be a member of the development team rather than its leader.</p>
<p>As a manager, your primary allegiance must be with the business team. Your job is to take their goals and translate them into effective plans to accomplish them. Where you think these goals will lead to problems, you need to point that out. However, if you can’t get them to change the goals, then you need to sign up to them and do your best to accomplish them. Programmer managers sometimes have a difficult time making this change.</p>
<p><strong>Shared Challenges</strong></p>
<p>The most common shared challenge is a lack of knowledge about how to manage. Most of the managers I have worked for had no formal training in management. At best they had a seminar or two. Few ever read any books on management or software development management. Since they, too, have had few truly effective managers, they have no guidance on how to manage. They just don’t know what to do.</p>
<p>An example where this shows up is the weekly status meeting. Most managers have one. They have one because their previous managers had one. In its most typical form, the status meeting lasts for an hour or so while the manager has a conversation with each member of the team, discussing what they are doing. The theory is that having this as a team fosters teamwork and helps everyone to know what everyone else is doing. In reality, the rest of the team already knows or doesn’t care. So this ends up being a large waste of time as the manager has a one-on-one conversation with each team member in front of the rest of the team.</p>
<p>Don’t get me wrong, I’m not saying that status meetings are wrong. But you need to choose to have one because of the benefits the team will get from it, because it is right for this team. Instead, most choose to have one because that’s how they’ve been managed in the past, and it is a visible sign that they are in charge. One of the primary goals of management should be to achieve stated goals with as little interruption in the daily work as possible.</p>
<p><strong>The Solution</strong></p>
<p>What we need to solve this is the same thing we need for all leaders: wise, beneficent individuals with a commitment to goals and compassion for their team. In software development, you need to add in enough knowledge to be mindful of the unique challenges in our field. To erase the pointy-haired boss from our minds or at least remove him as the dominant figure in engineering management, we need enough developers crossing over to become committed managers or enough business managers to gain an appreciation for software development.</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.slickedit.com%2F2008%2F06%2Fmanagement-is-a-dirty-word%2F';
  addthis_title  = '%26%238220%3BManagement%26%238221%3B+is+a+Dirty+Word';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=MTwGstwRAnM:5Yor26zmUs4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=MTwGstwRAnM:5Yor26zmUs4:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=MTwGstwRAnM:5Yor26zmUs4:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=MTwGstwRAnM:5Yor26zmUs4:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=MTwGstwRAnM:5Yor26zmUs4:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=MTwGstwRAnM:5Yor26zmUs4:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=MTwGstwRAnM:5Yor26zmUs4:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=MTwGstwRAnM:5Yor26zmUs4:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/helloWorld-TheSlickeditDeveloperBlog/~4/MTwGstwRAnM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.slickedit.com/2008/06/management-is-a-dirty-word/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.slickedit.com/2008/06/management-is-a-dirty-word/</feedburner:origLink></item>
		<item>
		<title>Zen Mind, Programmer’s Mind</title>
		<link>http://feedproxy.google.com/~r/helloWorld-TheSlickeditDeveloperBlog/~3/zCaGiMLYyTU/</link>
		<comments>http://blog.slickedit.com/2008/05/zen-mind-programmers-mind/#comments</comments>
		<pubDate>Wed, 21 May 2008 14:14:59 +0000</pubDate>
		<dc:creator>Scott Hackett</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.slickedit.com/?p=232</guid>
		<description><![CDATA[&#8220;In the beginner&#8217;s mind there are many possibilities, but in the expert&#8217;s there are few.&#8221; &#8211; Suzuki
As programmers of an application or feature, we quickly develop our own preconceptions as to how the software should work. Every day that we spend working on something, the use patterns of that feature become more and more hard [...]]]></description>
			<content:encoded><![CDATA[<p><em>&#8220;In the beginner&#8217;s mind there are many possibilities, but in the expert&#8217;s there are few.&#8221;</em> &#8211; Suzuki</p>
<p>As programmers of an application or feature, we quickly develop our own preconceptions as to how the software should work. Every day that we spend working on something, the use patterns of that feature become more and more hard wired into our brain. The end result is often a piece of software that works the way that <strong><em>we</em></strong> would expect it to. However, once that software gets released into the wild, many people are going to be using it, all of whom have never seen or touched it before. As a rule of thumb, each of those people will approach it with different perspectives. Each person will use it in a different way, and have different expectations of what it should and shouldn&#8217;t do.</p>
<p>Requirements are always necessary, but it would be impossible to capture everything in the requirements that any user would want or need, especially when it comes to the more subtle areas like UI workflow. Important use cases can also go completely undetected until a real end user actually sits down to work with it. Because of that, it&#8217;s important to remember that even the best requirements are not guaranteed to be intuitive or even correct. To help with this, we&#8217;ll need to bring in a Zen Buddhist master.</p>
<p><strong>Zen Buddhism in Application Development</strong></p>
<p>There are a handful of books I&#8217;ve been fortunate enough to stumble across that have changed me in some way. Those books are the ones I keep going back to, to remind me of that moment when I&#8217;d learned something new, yet felt like I&#8217;d known it all my life. <a href="http://www.amazon.com/Zen-Mind-Beginners-Shambhala-Library/dp/1590302672/ref=pd_bbs_sr_1?ie=UTF8&amp;s=books&amp;qid=1210593134&amp;sr=8-1">Zen Mind, Beginner&#8217;s Mind</a> by Shunryu Suzuki is one of those books. In it, the author and Zen master teaches the importance of &#8220;beginners mind&#8221;, which is the concept of constantly seeing with new eyes. It&#8217;s a teaching that he recommends for all aspects of daily life, though I doubt he ever imagined software development would be on that list.</p>
<p>As developers, we need to see our work from two perspectives:</p>
<ul>
<li><strong>Expert&#8217;s perspective:</strong> From this view, we make sure that the software is meeting the known requirements, which is our primary goal.</li>
<li><strong>Beginner&#8217;s perspective:</strong> From this view, we try to see the software as though we&#8217;ve never used it before and constantly ask the question, &#8220;Does that make sense?&#8221;</li>
</ul>
<p>These may seem very similar, but they&#8217;re not. For instance, let&#8217;s create a signature in Microsoft Outlook.</p>
<p><strong>Requirement:</strong> Allow the user to specify text to be automatically appended to every outgoing email. (Sounds simple enough&#8230;)</p>
<p><strong>Implementation:</strong></p>
<ol>
<li>Click Tools &gt; Options.</li>
<li>Click the &#8220;Mail Format&#8221; tab on the options dialog.</li>
<li>Click the &#8220;Signatures&#8230;&#8221; button on that tab pane. This brings up the &#8220;Create Signature&#8221; dialog.</li>
<li>Click the &#8220;New&#8221; button. This brings up the &#8220;Create New Signature&#8221; wizard dialog.</li>
<li>Enter a name for your signature and select that you want to start with a blank signature. Now click the &#8220;Next&#8221; button.</li>
<li>Type your signature. When you&#8217;re done, click &#8220;Finish&#8221;.</li>
<li>Click &#8220;OK&#8221; on the &#8220;Create Signature&#8221; dialog.</li>
<li>Your new signature is now added to a list of signatures on the &#8220;Mail Format&#8221; tab pane. Select it and click OK.</li>
</ol>
<p>Do those steps fulfill the requirement to create a signature? Check. Would a new user to Outlook have any clue how to do that without digging through help? Fail. This is a clear case where the development team did not look at final product and ask themselves, &#8220;Did that make sense?&#8221; The obvious answer is no.</p>
<p>There was a fantastic blog post recently called &#8220;<a href="http://contentconsumer.com/2008/04/27/is-ubuntu-useable-enough-for-my-girlfriend/">The Great Ubuntu-Girlfriend Experiment</a>&#8220;. In this post, the author has his girlfriend use his latest installation of Ubuntu as a way of getting a beginner&#8217;s perspective on it. He winds up with some very interesting conclusions, specifically &#8220;that the geeky programmers and designers assume too much from the average user&#8221;.</p>
<p>End users are demanding more and more ease of use out of the box without having to go to help (much to the dismay of our tech writer). Think about the <a href="http://en.wikipedia.org/wiki/GEICO_Cavemen">Geico caveman</a>&#8230; buying insurance with Geico.com is so easy even he could do it. Ease of use and intuitiveness are so in demand that Geico launched a massive marketing campaign with that as its centerpiece. The commercials don&#8217;t say anything about price, customer service or any of the details of their policies. It&#8217;s just easy to use&#8230; and that pulls in huge numbers of people.</p>
<p><strong>Putting It Into Practice </strong></p>
<p>Having beginner&#8217;s perspective on your own software <strong>sounds</strong> much easier than it really is. Stepping back and using the software without preconceptions involves being honest with yourself. Sometimes it&#8217;s easier to give in to the fact that the software might meet the requirements, and that task can be considered done. However, it&#8217;s those little touches like usability that can bring an application to the next level, and move it up from good to best. Finding those usability issues can only be done by being objective about your own work. It&#8217;s far better to find those issues during development than when an end user first sits down to try the software.</p>
<p>Whether you use Zen mind, caveman mind or girlfriend mind [ducking behind my chair], try and take the time to step back and ask yourself if you would love your software just as much if you were trying to figure it out for the first time. Just like meditation, it&#8217;s a practice that gets easier every time you do it. Soon, it should become a normal part of your daily approach to software development. Of course I&#8217;d be lying if I said that I had actually attained this goal, but I try.</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.slickedit.com%2F2008%2F05%2Fzen-mind-programmers-mind%2F';
  addthis_title  = 'Zen+Mind%2C+Programmer%26%238217%3Bs+Mind';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=zCaGiMLYyTU:ZQLRGBUAlLM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=zCaGiMLYyTU:ZQLRGBUAlLM:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=zCaGiMLYyTU:ZQLRGBUAlLM:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=zCaGiMLYyTU:ZQLRGBUAlLM:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=zCaGiMLYyTU:ZQLRGBUAlLM:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=zCaGiMLYyTU:ZQLRGBUAlLM:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=zCaGiMLYyTU:ZQLRGBUAlLM:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=zCaGiMLYyTU:ZQLRGBUAlLM:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/helloWorld-TheSlickeditDeveloperBlog/~4/zCaGiMLYyTU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.slickedit.com/2008/05/zen-mind-programmers-mind/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.slickedit.com/2008/05/zen-mind-programmers-mind/</feedburner:origLink></item>
		<item>
		<title>Tutorial: Adding Language Support to SlickEdit</title>
		<link>http://feedproxy.google.com/~r/helloWorld-TheSlickeditDeveloperBlog/~3/dRayDB6_olI/</link>
		<comments>http://blog.slickedit.com/2008/05/tutorial-adding-language-support-to-slickedit/#comments</comments>
		<pubDate>Wed, 14 May 2008 15:06:50 +0000</pubDate>
		<dc:creator>Dennis B</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.slickedit.com/?p=212</guid>
		<description><![CDATA[In this article, I am going to illustrate how to add very simple support for a language that, out of the box, is not already handled by SlickEdit.  To this end, I am choosing &#8220;Logo&#8221; as an example.  I made this choice partially as a follow-up to Scott&#8217;s article about using it as [...]]]></description>
			<content:encoded><![CDATA[<p>In this article, I am going to illustrate how to add very simple support for a language that, out of the box, is not already handled by SlickEdit.  To this end, I am choosing &#8220;Logo&#8221; as an example.  I made this choice partially as a follow-up to Scott&#8217;s article about using it as an educational language.  At first, I was going to use LOLCODE as my example, but then a genuine fear fell over me that I would be contributing to the delinquency of programmers by putting together support for LOLCODE&#8217;ing in SlickEdit.</p>
<p>I have used the freely available book <a href="http://www.softronix.com/download/tgla.zip">&#8220;The Great Logo Adventure!&#8221;</a> as a reference in this article.  Please note that I am not an experienced Logo programmer, so if you bear with me, you can learn how to add language support and I can learn something about Logo.</p>
<p><strong>Step 1: Defining the language</strong></p>
<p>Go to Tools &gt; Options&#8230;, and navigate to Languages &gt; &#8220;Language Manager&#8221;, then click on &#8220;Add Language&#8230;&#8221;  Enter the following:</p>
<ul>
<li>Mode name:  Logo</li>
<li>Associated extensions:  logo lgo</li>
<li>Color coding:  leave blank</li>
</ul>
<p><strong>Step 2: Color Coding</strong></p>
<p>Now navigate to your Logo language settings and find the &#8220;Color coding&#8221; page.</p>
<p>Click on the top-most &#8220;New&#8230;&#8221; button to create a new Lexer and name it Logo.  Now, we need to define the color coding.  Let&#8217;s work left to right, starting with the Tokens tab.</p>
<p>Logo is case-insensitive, so uncheck &#8220;Case sensitive&#8221;.  The identifier characters can be left pretty much as they are.  Logo, in fact, will allow nearly anything to be an identifier, but in practical terms, the typical C language style identifiers are adequate.</p>
<p>Next, we add Keywords.  The list below is fairly complete, though there is a fair amount of room for interpretation with respect to what is a keyword and what isn&#8217;t in Logo.  Note that when you add new Keywords, you can add several at once if you separate them with spaces.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">AND &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CS &nbsp; &nbsp; &nbsp; &nbsp; IFTRUE &nbsp; &nbsp; &nbsp;OR &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SENTENCE<br />
ASCII &nbsp; &nbsp; &nbsp; &nbsp; CT &nbsp; &nbsp; &nbsp; &nbsp; LABEL &nbsp; &nbsp; &nbsp; PARSE &nbsp; &nbsp; &nbsp; SETUP<br />
ASK &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; EDIT &nbsp; &nbsp; &nbsp; LEFT &nbsp; &nbsp; &nbsp; &nbsp;PR &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SHOW<br />
<br />
BACK &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;END &nbsp; &nbsp; &nbsp; &nbsp;LIST &nbsp; &nbsp; &nbsp; &nbsp;PRINT &nbsp; &nbsp; &nbsp; TC<br />
<br />
BACKSLASHEDP &nbsp;EQUALP &nbsp; &nbsp; LOAD &nbsp; &nbsp; &nbsp; &nbsp;READLIST &nbsp; &nbsp;TEST<br />
<br />
BYE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FALSE &nbsp; &nbsp; &nbsp;LOCAL &nbsp; &nbsp; &nbsp; READWORD &nbsp; &nbsp;TO<br />
<br />
CHAR &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;FLASHER &nbsp; &nbsp;LOCALMAKE &nbsp; REPEAT &nbsp; &nbsp; &nbsp;TRUE<br />
<br />
CLEARSCREEN &nbsp; FORWARD &nbsp; &nbsp;MAKE &nbsp; &nbsp; &nbsp; &nbsp;RUNPARSE &nbsp; &nbsp;TYPE<br />
CLEARTEXT &nbsp; &nbsp; IFELSE &nbsp; &nbsp; NOT &nbsp; &nbsp; &nbsp; &nbsp; RIGHT &nbsp; &nbsp; &nbsp; WAIT<br />
COUNT &nbsp; &nbsp; &nbsp; &nbsp; IFFALSE &nbsp; &nbsp;NUMBERP &nbsp; &nbsp; SAVE &nbsp; &nbsp; &nbsp; &nbsp;WORD</div></td></tr></tbody></table></div>
<p>Now switch to Preprocessing and add:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">.DEFMACRO &nbsp; &nbsp; .SETBF<br />
.EQ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .SETFIRST<br />
.MACRO &nbsp; &nbsp; &nbsp; &nbsp;.SETITEM<br />
.MAYBEOUTPUT</div></td></tr></tbody></table></div>
<p>And Punctuation:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">( &nbsp; ) &nbsp; : &nbsp; [ &nbsp; ]</div></td></tr></tbody></table></div>
<p>And Operators:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">+ &nbsp; - &nbsp; / &nbsp; * &nbsp; =</div></td></tr></tbody></table></div>
<p>Now switch to Library Symbols.</p>
<p>This is where you would typically add coloring for functions that are built into the language or included with the standard language libraries.  Since Logo has nearly 500 built-ins, it would be senseless to try to type them all in manually.  The attached hotfix includes a file, &#8220;logo_builtins.txt&#8221; which contains all the built-ins.  This file was constructed by opening the help file for MSWLogo (<a href="http://www.softronix.com">Microsoft Windows Logo, by Softtronics, Inc.</a>) using SlickEdit&#8217;s Help Indexer (&#8221;Help&#8221; &gt; &#8220;Configure F1 Index Help&#8221;).  I added the help file, then clicked on &#8220;Export&#8230;&#8221; to extract the index entries, then edited out the few things which were not library functions.  In the Color Coding dialog, click on &#8220;Get&#8230;&#8221;, point it at this file, and it will pull in all the words in the list file.</p>
<p>Note that the color coding engine is not perfect is the keyword coloring.  Logo is very context dependent whether a symbol is being used as keyword or just a word or list.  Lists are sometimes code, sometimes strings.  The color coding engine has no idea about these rules, so it sees a word that matches a keyword and it colors it.  This is simultaneously quite useful, quite annoying, and quite unavoidable.</p>
<p>We can now turn our attention to the Numbers tab.  The default settings will be adequate here.</p>
<p>In the Strings tab, we have to do something ugly.  Check the two items:</p>
<ul>
<li> Double quoted strings are always 1 char long</li>
<li> Single quoted strings are always 1 char long</li>
</ul>
<p>This is necessary because Logo doesn&#8217;t have the typical kind of string constants we have grown to expect in other languages, so we need to trick it, otherwise nearly everything will look like strings.  This solution is not ideal, but it is readable.  Sometimes, unusual language features will not map to SlickEdit&#8217;s default color coding engine, and you have to settle for the best you can do and move on.  This is one such case.</p>
<p>The default settings are fine for the Language tab, so let&#8217;s move on to Comments.  Logo has one type of comment, the semicolon.  So, click on &#8220;New Line Comment&#8230;&#8221; and specify that it uses &#8220;;&#8221; as the delimiter.</p>
<p>We are now done with configuring color coding.  Color coding definition are saved in &#8220;user.vlx&#8221; in your configuration directory.  I recommend opening &#8220;user.vlx&#8221; and copying the entire definition for [Logo], then saving it to a new file &#8220;logo.vlx&#8221;, also in your configuration directory.  This will be used later when we package up the language support.</p>
<p><strong>Step 3: Tuning language settings</strong></p>
<p>We can now configure other Language specific options for Logo.  Start with the <em>Indent</em> options.  You will probably want to set your tabs to &#8220;+3&#8243;, or something more in line with your preferences.</p>
<p>Now switch to the <em>Comments</em> options.  Define the &#8220;Comment line&#8221; to use &#8220;; &#8221; on the left so that you will be able to use &#8220;Document&#8221; &gt; &#8220;Comment Lines&#8221; and &#8220;Document&#8221; &gt; &#8220;Uncomment Lines&#8221; in your Logo source files.</p>
<p>On the <em>General</em> tab, make sure &#8220;Logo&#8221; is selected as the Color coding Lexer name.  I also recommend turning on the &#8220;Current Line&#8221; check box to highlight the current line, since SlickEdit does current line and selection highlighting better than any editor out there.</p>
<p>While we are on the <em>General</em> tab, click on &#8220;Language-Specific Project&#8230;&#8221; to set up a command for loading and running Logo programs in MSWLogo.  Go to the &#8220;Tools&#8221; command and select &#8220;Execute&#8221;.  Enter &#8220;logo32.exe -l %f&#8221; for the Command Line, and specify the Run from dir to be &#8220;%p&#8221; (file path).  You may have to give a [quoted] absolute path to logo32.exe if it is not on your regular path.</p>
<p><strong>Step 4:  Configure aliases</strong></p>
<p>Switch to the <em>Aliases</em> options for Logo.  This will allow you to define some typing shortcuts for Logo syntax.  I will provide one example and let you go from there.</p>
<p>To define an alias for defining a function, click on &#8220;New&#8230;&#8221; and name the alias &#8220;to&#8221;.  Fill in the alias text with the following:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">to %\c<br />
%\i%\c<br />
end</div></td></tr></tbody></table></div>
<p>&#8220;%\c&#8221; specifies a cursor landing and &#8220;%\i&#8221; specifies indentation.</p>
<p><strong>Step 5:  Create a language support module</strong></p>
<p>All of the above work displays how you can add support for viewing color coded files in SlickEdit, entirely through the configuration dialogs without writing any Slick-C code.  However, if you want to hand what you have done over to another developer, the best way is to write a language support module that he can simply load and use.  For what we have done so far with Logo, the essentials can be accomplished with the following small amount of code.  A complete copy of the language support module (logo.e) is attached to this article.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;height:300px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">#define LOGO_MODE_NAME &quot;Logo&quot;<br />
#define LOGO_EXTENSION1 &quot;logo&quot;<br />
#define LOGO_EXTENSION2 &quot;lgo&quot;<br />
<br />
// This function is called when the module is loaded.<br />
// It configures the &quot;logo&quot; and &quot;lgo&quot; file extensions.<br />
void defload()<br />
{<br />
&nbsp; &nbsp;_str setup_info=&quot;MN=&quot;LOGO_MODE_NAME&quot;,TABS=+3,MA=1 74 1,&quot;:+<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&quot;KEYTAB=ext-keys,WW=1,IWT=0,ST=0,IN=2,&quot;:+<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&quot;WC=A-Za-z0-9_$,LN=&quot;LOGO_MODE_NAME&quot;,CF=1&quot;;<br />
&nbsp; &nbsp;_str compile_info=&quot;0 logo32 *&quot;;<br />
&nbsp; &nbsp;_str syntax_info=&quot;3 1 2 1 0 1 0&quot;;<br />
&nbsp; &nbsp;_str be_info=&quot;(to)|(end);i&quot;;<br />
&nbsp; &nbsp;int kt_index=0;<br />
&nbsp; &nbsp;_CreateLanguage(kt_index, LOGO_MODE_NAME,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;setup_info, compile_info, syntax_info, be_info);<br />
&nbsp; &nbsp;_CreateExtension(&quot;logo&quot;, LOGO_MODE_NAME);<br />
&nbsp; &nbsp;_CreateExtension(&quot;lgo&quot;, LOGO_MODE_NAME);<br />
<br />
&nbsp; &nbsp;_str logo_vlx = _config_path() :+ FILESEP :+ &quot;logo.vlx&quot;;<br />
&nbsp; &nbsp;if (file_exists(logo_vlx)) {<br />
&nbsp; &nbsp; &nbsp; import_lexer_file(logo_vlx);<br />
&nbsp; &nbsp;}<br />
}</div></td></tr></tbody></table></div>
<p><strong>Step 6: Write tagging support for Logo</strong></p>
<p>Tagging is not rocket science, you can write your own tagging support with a minimal amount of effort, depending on the language you are trying to parse.</p>
<p>In the case of Logo, the critical item is the &#8220;to&#8221; statement, which defines a procedure.</p>
<p>User-defined tagging support is accomplished by writing a language-specific &#8220;proc-search&#8221; function, the signature for this function is as follows:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">int logo_proc_search(_str &amp;amp;proc_name, int find_first);</div></td></tr></tbody></table></div>
<p>The function returns &lt;0 on error, and 0 on success, also setting &#8220;proc_name&#8221; to the encoded information about the symbol which was found.</p>
<p>The basic outline for a &#8220;proc-search&#8221; function is to start by searching for a regular expression which will find lines that symbol declarations happen on.  If the search fails, return the failure status and it&#8217;s all over.  Otherwise, you parse apart the line and get the name of the symbol that was declared.  Finally, you set proc_name and return 0.  A very simple example for Logo is included below.  The &#8220;logo_proc_search&#8221; included in logo.e is a little more thorough than this, but this is a good starting point for nearly any language.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp;int status = search(&quot;^(:b|)(to:b|make:b[\&quot;]):v&quot;,&quot;@rih&amp;gt;Xcs&quot;);<br />
&nbsp; &nbsp;if (status) {<br />
&nbsp; &nbsp; &nbsp; proc_name=&quot;&quot;;<br />
&nbsp; &nbsp; &nbsp; return status;<br />
&nbsp; &nbsp;}<br />
&nbsp; &nbsp;get_line(line);<br />
&nbsp; &nbsp;parse strip(line) with kw proc_name args;<br />
&nbsp; &nbsp;switch (lowcase(kw)) {<br />
&nbsp; &nbsp;case &quot;to&quot;:<br />
&nbsp; &nbsp; &nbsp; proc_name = tag_tree_compose_tag(proc_name,&quot;&quot;,&quot;proc&quot;,0,args);<br />
&nbsp; &nbsp; &nbsp; break;<br />
&nbsp; &nbsp;case &quot;make&quot;:<br />
&nbsp; &nbsp; &nbsp; proc_name = substr(proc_name,2) :+ &quot;(gvar)&quot;;<br />
&nbsp; &nbsp; &nbsp; break;<br />
&nbsp; &nbsp;}<br />
&nbsp; &nbsp;return(0);</div></td></tr></tbody></table></div>
<p>If you want to support tagging local variables as well as globals, you will need to implement the &#8220;list-locals&#8221; callback.  It&#8217;s signature is shown below.  The implementation is quite similar to the &#8220;logo-proc-search&#8221; above, except that rather than working in a start and stop pattern, the list-locals function is just expected to find everything and insert the symbols directly using the tagging API function tag_insert_local2().  I will not detail it&#8217;s implementation in this article &#8212; please take a look at logo.e to learn more.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">void logo_list_locals(int unused_output_view_id, _str unused_filename_p,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _str embedded_ext, int ltf_flags,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int unused_tree_wid, int unused_bitmap_index,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int cur_start_seekpos, int end_seekpos);</div></td></tr></tbody></table></div>
<p><strong>Step 7: Adding support for block matching</strong></p>
<p>For many languages, the default block matching which supports parentheses, braces, brackets, and configurable begin-end pairs is adaquate.  For other languages, you may want to do more.  The prototype hook function for implementing advanced block matching is below.  For an excellent example of how to implement this function, look at ada.e.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">int _[lang]_find_matching_word(boolean quiet);</div></td></tr></tbody></table></div>
<p><strong>Step 8: Adding support for syntax expansion</strong></p>
<p>The typical way to add support for syntax expansion is to write commands to handle [space] (syntax expansion) and [enter] (syntax indent).  A simple example of this can be found in modula.e.  By using the &#8220;ext_keys&#8221; event table, your language-specific space and enter handlers will be automatically hooked in.  For this sample, I am not going to write syntax expansion for Logo &#8212; I leave that as an exercise for the reader.</p>
<p><strong>Step 9: Adding support for Context Tagging®</strong></p>
<p>There are six major hook functions necessary to implement support for Context Tagging for a language.  Again, I am not going to implement all of these for Logo, but leave that as an exercise for the reader.  There are numerous examples in the Slick-C® code of how to implement these functions for a variety of languages.  Look at csymbols.e for examples of how they are implemented for a conventional language such as C++.  Look at cobol.e for an example of how they can be implemented for less structured languages where you can have function calls without parens, for example.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">int _[lang]_MaybeBuildTagFile(int &amp;amp;tfindex);</div></td></tr></tbody></table></div>
<p>This function is used to automatically build a tag file for language-specific libraries and built-in functions.  You can create a [lang].tagdoc file to document built-in functions.  Look at [slickedit]/builtins/basic.tagdoc or html.tagdoc for some examples of how this is done.  The attached Logo sample attempts to build a tag file for Microsoft Windows Logo.  Note that there is a small problem, because most of the files in their run-time library are extensionless, thus, not recognized immediately as Logo.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">int _[lang]_get_expression_info(boolean PossibleOperator, VS_TAG_IDEXP_INFO &amp;amp;idexp_info);</div></td></tr></tbody></table></div>
<p>This function is used to get information about the code at the current buffer location, including the current identifier under the cursor, the expression before the current identifier, and other supplementary information useful to Context Tagging.  If the _[lang]_get_expression_info hook function is not implemented, the editor will use a default implementation which simply returns the current identifier under the cursor and no prefix expression.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">int _[lang]_find_context_tags(_str (&amp;amp;errorArgs)[],_str prefixexp,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _str lastid,int lastidstart_offset,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int info_flags,typeless otherinfo,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; boolean find_parents,int max_matches,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; boolean exact_match,boolean case_sensitive,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int filter_flags=VS_TAGFILTER_ANYTHING,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int context_flags=VS_TAGCONTEXT_ALLOW_locals,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; VS_TAG_RETURN_TYPE (&amp;amp;visited):[]=null, int depth=0);</div></td></tr></tbody></table></div>
<p>Find tags matching the identifier at the current cursor position using the information extracted by {@link _[lang]_get_expression_info()}.  This callback is used for symbol navigation, symbol completion, references, and symbol analysis.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">int _[lang]_insert_context_tags(_str (&amp;amp;errorArgs)[],<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int editorctl_wid,_str prefixexp,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _str lastid,_str lastid_prefix,int lastidstart_offset,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _str expected_type,int info_flags,typeless otherinfo);</div></td></tr></tbody></table></div>
<p>Insert tags into the list members tree control matching the given identifier and prefix expression.</p>
<p>If the _[lang]_insert_context_tags() or _[lang]_find_context_tags() hook functions are not implemented, the editor will use a default implementation which simply tries to find a symbol matching the current identifier under the cursor, ignoring any prefix expression.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">int _[lang]_fcthelp_get_start( _str (&amp;amp;errorArgs)[],<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;boolean OperatorTyped,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;boolean cursorInsideArgumentList,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int &amp;amp;FunctionNameOffset,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int &amp;amp;ArgumentStartOffset,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int &amp;amp;flags );<br />
<br />
int _[lang]_fcthelp_get( _str (&amp;amp;errorArgs)[],<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;VSAUTOCODE_ARG_INFO (&amp;amp;FunctionHelp_list)[],<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;boolean &amp;amp;FunctionHelp_list_changed,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int &amp;amp;FunctionHelp_cursor_x,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_str &amp;amp;FunctionHelp_HelpWord,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int FunctionNameStartOffset,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int flags );</div></td></tr></tbody></table></div>
<p>The _[lang]_fcthelp_get_start() callback is used to find the start of a function call.  This determines quickly whether  or not we are in the context of a function call.  The _[lang]_fcthelp_get() callback then does all the heavy lifting to find the matching functions and parse out their parameter lists and set up all the information in order for the function parameter info feature to display a prototype for the current function.</p>
<p>If the _[lang]_fcthelp_get_start() and _[lang]_fcthelp_get() hook functions are not implemented, the editor will use a default implementation which simply assumes that function parameters are comma-separated lists surrounded by parenthesis.</p>
<p><strong>Step 10: Creating a redistributable hot fix</strong></p>
<p>An easy way to redistribute a set of macros and support files is to package them together using SlickEdit&#8217;s hot fix mechanism.  To package a hot fix for the Logo support all you would have to do is use the create-hotfix command from the SlickEdit command line.  Note that this command requires you to have the Cygwin &#8220;zip&#8221; utility on your path.  You can also construct a hot fix manually by creating your own hotfix.xml manifest and dragging files into a zip file.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">create-hotfix [config]/logo.vlx [slickedit]/macros/logo.e</div></td></tr></tbody></table></div>
<p>The Logo support can be loaded by going to Help &gt; Product Updates &gt; Load Hot Fix&#8230; and pointing it to the addons_se13000_logo.zip file.</p>
<p><strong>Summary</strong></p>
<p>This article gives you an initial glance at how to add support for a new language to SlickEdit.  It does not detail every single aspect of adding language support.  There is still a great deal for you to learn by studying some of the language support code shipped with SlickEdit, such as basic.e, awk.e, ansic.e, pascal.e, modula.e, and fortran.e.</p>
<p><a href="http://www.slickedit.com/images/stories/blog/addon_se1300_logo.zip"> Zip file can be found here</a></p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.slickedit.com%2F2008%2F05%2Ftutorial-adding-language-support-to-slickedit%2F';
  addthis_title  = 'Tutorial%3A+Adding+Language+Support+to+SlickEdit';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=dRayDB6_olI:mChTxme-wnI:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=dRayDB6_olI:mChTxme-wnI:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=dRayDB6_olI:mChTxme-wnI:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=dRayDB6_olI:mChTxme-wnI:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=dRayDB6_olI:mChTxme-wnI:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=dRayDB6_olI:mChTxme-wnI:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=dRayDB6_olI:mChTxme-wnI:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=dRayDB6_olI:mChTxme-wnI:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/helloWorld-TheSlickeditDeveloperBlog/~4/dRayDB6_olI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.slickedit.com/2008/05/tutorial-adding-language-support-to-slickedit/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://blog.slickedit.com/2008/05/tutorial-adding-language-support-to-slickedit/</feedburner:origLink></item>
		<item>
		<title>What Would I Do Without Programming?</title>
		<link>http://feedproxy.google.com/~r/helloWorld-TheSlickeditDeveloperBlog/~3/ZAH9aX3XfqA/</link>
		<comments>http://blog.slickedit.com/2008/05/what-would-i-do-without-programming/#comments</comments>
		<pubDate>Wed, 07 May 2008 14:01:50 +0000</pubDate>
		<dc:creator>Scott Hackett</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.slickedit.com/?p=231</guid>
		<description><![CDATA[One of my friends lost his job this week. He worked in the chem department of a pharmaceutical company, doing something that went completely over my head while he was explaining it to me. What I got from his description was that it was not the kind of work that&#8217;s particularly easy to find and [...]]]></description>
			<content:encoded><![CDATA[<p>One of my friends lost his job this week. He worked in the chem department of a pharmaceutical company, doing something that went completely over my head while he was explaining it to me. What I got from his description was that it was not the kind of work that&#8217;s particularly easy to find and he&#8217;s really worried about how he&#8217;s going to find another similar position, or what he&#8217;s going to do to stay fresh if he has to take something in the meantime outside of his specialty.</p>
<p>I worried for him while he was telling me about this, and at the same time my mind was half zoning out thinking about my own career. I&#8217;ve been in a similar situation&#8230; it&#8217;s not uncommon for companies to just run out of funding or to have massive sweeping layoffs. The last company that I was at out ran out of money and we all showed up at our office one morning to find movers disassembling our cubes. No prior warning, nothing. Let me tell you, there&#8217;s no cup of coffee that can wake you up quicker than the sight of that.</p>
<p><em>&#8220;I just don&#8217;t know any other company that&#8217;s doing this kind of work,&#8221; he continued.</em></p>
<p>Apparently chem development is not the kind of generic skill that can be easily ported from company to company. I forget sometimes just how lucky I am to have a skill set that is so adaptable. Programming work is so readily available it&#8217;s ridiculous. A quick search on monster.com or dice.com will show that there&#8217;s a constant need for decent programmers. I say decent because you don&#8217;t even have to be a top shelf developer to enjoy this kind of programmer&#8217;s market. Most companies are looking for a programmer that can just get a job done. Now, ideally, I try to look for a lot more than that in a job position, but if it came down to being a worker-bee programmer, the money is still good for those jobs and you get to stay on point with your skills. It&#8217;s not a bad deal, and there&#8217;s always a need for this kind of work.</p>
<p><em>&#8220;The only other pharmaceutical company that has the kind of equipment I work with is two states away, &#8221; he told me.</em></p>
<p>Again, my brain is thinking about this and wondering what things would be like if my work depended on some niche, specialty apparatus. As a programmer, I&#8217;m spoiled by VPNs, remote desktop, portable laptops, 4 gig flash drives and a whole arsenal of gear to help me work from wherever I need to. My friend would have to buy some multi-million dollar research equipment to do his work from home. However, I can connect to my desktop and work from home like I&#8217;m right at my desk. The kind of flexibility that gives me is just incredible. How many people are fortunate enough to be as productive from home as they are at work?</p>
<p><em>&#8220;Without being around the lab every day, my skills are going to fall apart&#8230; this just isn&#8217;t the kind of stuff I can keep up with outside of a workplace,&#8221; he told me. </em></p>
<p>Software developers don&#8217;t need professional work to keep their skills up to date. There are many online communities, sites dedicated to providing samples for all aspects of programming, open source projects, and endless opportunities to stay on the cutting edge of software development. Staying current in this way is something many developers do on top of their normal job anyway. It&#8217;s not very often that I realize that without those resources, it would be much harder to keep up with all of the change and fluctuation that the software world goes through.</p>
<p>Of course, after all of the things my friend had told me I couldn&#8217;t say any of these thoughts I was having. But in the back of my head, I had a real face-to-face moment with the fact that I may be one of the luckiest people in the world simply because I write software. Do I ever worry about losing a job? Sure, everyone does to some degree. Nothing is certain. But I do know that if I ever lost a programming job, I&#8217;d have another within a week. No worries.</p>
<p>What does make me lose sleep some nights is what would happen if software development simply went away. It sounds ridiculous, but it&#8217;s something that I think about from time to time. Industrial workers in the early 20th century probably never imagined being replaced by robots, but it&#8217;s happened on a large scale.  Without software development, I would be in a lot of trouble. I wouldn&#8217;t be able to work from home if I needed to. I might have to do something 8 hours a day that I didn&#8217;t enjoy doing. I might have to wear a suit.</p>
<p>Even worse, I might have to take a job that didn&#8217;t allow me any creative thought. That would be worse than the suit. To have to work at a job where I performed some task over and over, or had some responsibilities that didn&#8217;t allow my mind to wonder &#8220;What if?&#8221; would kill a small part of me. This may be the biggest perk of all in this career choice of software development&#8230; the freedom of creativity.</p>
<p>I&#8217;m going to spend the better part of today reminding myself of just how lucky I am that there is such a thing as computer programming and that I just happen to absolutely love doing it. When I think about what my life would be without programming, I realize that the stars have aligned in some miraculous way for me.</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.slickedit.com%2F2008%2F05%2Fwhat-would-i-do-without-programming%2F';
  addthis_title  = 'What+Would+I+Do+Without+Programming%3F';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=ZAH9aX3XfqA:j8DU7X3gzNw:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=ZAH9aX3XfqA:j8DU7X3gzNw:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=ZAH9aX3XfqA:j8DU7X3gzNw:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=ZAH9aX3XfqA:j8DU7X3gzNw:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=ZAH9aX3XfqA:j8DU7X3gzNw:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=ZAH9aX3XfqA:j8DU7X3gzNw:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=ZAH9aX3XfqA:j8DU7X3gzNw:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=ZAH9aX3XfqA:j8DU7X3gzNw:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/helloWorld-TheSlickeditDeveloperBlog/~4/ZAH9aX3XfqA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.slickedit.com/2008/05/what-would-i-do-without-programming/feed/</wfw:commentRss>
		<slash:comments>30</slash:comments>
		<feedburner:origLink>http://blog.slickedit.com/2008/05/what-would-i-do-without-programming/</feedburner:origLink></item>
		<item>
		<title>BASIC and the Rubik’s Cube</title>
		<link>http://feedproxy.google.com/~r/helloWorld-TheSlickeditDeveloperBlog/~3/InI6qqp-UvY/</link>
		<comments>http://blog.slickedit.com/2008/04/basic-and-the-rubiks-cube/#comments</comments>
		<pubDate>Wed, 30 Apr 2008 13:09:17 +0000</pubDate>
		<dc:creator>David O</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.slickedit.com/?p=230</guid>
		<description><![CDATA[Remember when the Rubik&#8217;s Cube was still new and BASIC was cutting edge? Well, for that early generation of geeks, of which I was surely a member, it was unavoidable. You just had to write your own BASIC program to solve the Rubik&#8217;s Cube. I know there are other old programmers out there who have [...]]]></description>
			<content:encoded><![CDATA[<p>Remember when the Rubik&#8217;s Cube was still new and BASIC was cutting edge? Well, for that early generation of geeks, of which I was surely a member, it was unavoidable. You just had to write your own BASIC program to solve the Rubik&#8217;s Cube. I know there are other old programmers out there who have also done his because I&#8217;ve met at least two. I&#8217; love to hear about anyone&#8217;s attempts to solve the Cube on simple (pre-Windows) computers, no matter what the language or machine.</p>
<p>Here&#8217;s my story.</p>
<p>It all started a &#8220;few&#8221; years ago to when I was in high school. The Rubik&#8217;s Cube popularity had just peaked and our school was still just getting computers. I forget the exact specifications of the machine, but I think it was a <a href="http://oldcomputers.net/trs80iii.html">TRS-80 Model III</a> with about 16K of RAM and no color. I spent a lot of time on that machine because it was old even then and usually free. Most others wanting to use the newer Apples that had color. Wow.</p>
<p>So how do you represent a colored cube on a monochrome display with at best crude graphics? I used letters for the different colors (B = blue, R = red, G = green, O = orange, Y = yellow, W = white) and unwrapped it on the screen. (Fortunately none of the colors started with the same letter.) You would have something like this for a completed cube:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&lt;pre&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp;O O O <br />
&nbsp; &nbsp; &nbsp; &nbsp;O O O <br />
&nbsp; &nbsp; &nbsp; &nbsp;O O O <br />
&nbsp;Y Y Y B B B G G G <br />
&nbsp;Y Y Y B B B G G G <br />
&nbsp;Y Y Y B B B G G G <br />
&nbsp; &nbsp; &nbsp; &nbsp;R R R <br />
&nbsp; &nbsp; &nbsp; &nbsp;R R R <br />
&nbsp; &nbsp; &nbsp; &nbsp;R R R <br />
&nbsp; &nbsp; &nbsp; &nbsp;W W W <br />
&nbsp; &nbsp; &nbsp; &nbsp;W W W <br />
&nbsp; &nbsp; &nbsp; &nbsp;W W W&lt;/pre&gt;</div></td></tr></tbody></table></div>
<p>After typing in your sequence of letters representing the colors (You only had one chance. One mistake, and you had to start over.), the program dumped instructions to the printer (&#8221;Red Right&#8221; &#8220;Green Left&#8221; &#8220;White Around&#8221; &#8220;Blue Left&#8221; etc.) while the arrangement of letters on the screen was updated at each step. Needless to say, it was virtually impossible to take a mixed-up cube, type it&#8217;s arrangement into the TRS-80, then follow the instructions from the printout and actually solve the puzzle, but I know a few classmates certainly did try. I really should have made it pause after each turn, so you could check for mistakes as you went.</p>
<p>Here are a few things I remember about the program.</p>
<ol>
<li>I knew the limits of the machine&#8217;s memory so made use of the space compression codes. The TRS-80&#8217;s BASIC interpreter used the character values from 0xc0 and up to represent sequences of blanks. One byte could be used to display up to 64 spaces. My <em>data structure</em> was one string holding just the letters and space compression codes. I updated the display by printing just this one string.</li>
<li>Each of the 18 different moves would change the positions of 20 letters on the display or 20 characters in my string data structure. These character positions were stored in strings of 20 characters. This was much more compact than reading DATA statements. But you couldn&#8217;t type these strings with the keyboard because some of their values needed to be higher than the ASCII value of &#8216;Z&#8217;. So I first wrote some code that found the memory location of the array of strings and then used POKE to write the proper values directly into the memory of the program&#8217;s instructions. This trick actually made the program manipulated itself.<br />
I don&#8217;t really remember why I did it this way. It did make the program shorter and the code simpler in some places, but I doubt that was the real reason. I think I did it just because I could. Plus is looked cool when you listed the program on the screen. It would beep, clear screen, and show graphical characters inside your program listing. This was a great way to show off to the older junior and seniors when they came in and kicked you off the computer so they could write their boring programs to convert Celsius to Fahrenheit for their computer class. I&#8217;m sure they all hated me.</li>
<li>Finally, it was my own algorithm. There were a slew books out then to teach you to solve the Cube, but none of that cheating for me. Of course, that also meant that the list of &#8220;Yellow Left&#8221; &#8220;Orange Around&#8221; &#8220;Green Right&#8221; &#8220;White Left&#8221; etc. probably went on much longer than needed. But that didn&#8217;t matter, because you were never going to solve an actual Cube with the program anyway. It was all just a young kid&#8217;s way to use up free period.</li>
</ol>
<p>Best program I ever wrote!</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.slickedit.com%2F2008%2F04%2Fbasic-and-the-rubiks-cube%2F';
  addthis_title  = 'BASIC+and+the+Rubik%26%238217%3Bs+Cube';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=InI6qqp-UvY:8DYS_INCjXU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=InI6qqp-UvY:8DYS_INCjXU:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=InI6qqp-UvY:8DYS_INCjXU:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=InI6qqp-UvY:8DYS_INCjXU:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=InI6qqp-UvY:8DYS_INCjXU:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=InI6qqp-UvY:8DYS_INCjXU:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=InI6qqp-UvY:8DYS_INCjXU:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=InI6qqp-UvY:8DYS_INCjXU:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/helloWorld-TheSlickeditDeveloperBlog/~4/InI6qqp-UvY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.slickedit.com/2008/04/basic-and-the-rubiks-cube/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.slickedit.com/2008/04/basic-and-the-rubiks-cube/</feedburner:origLink></item>
		<item>
		<title>Works on my Machine</title>
		<link>http://feedproxy.google.com/~r/helloWorld-TheSlickeditDeveloperBlog/~3/PbWhMtGs8ME/</link>
		<comments>http://blog.slickedit.com/2008/04/works-on-my-machine/#comments</comments>
		<pubDate>Wed, 23 Apr 2008 14:57:08 +0000</pubDate>
		<dc:creator>Sandra</dc:creator>
				<category><![CDATA[Code Editors]]></category>
		<category><![CDATA[SlickEdit Products]]></category>

		<guid isPermaLink="false">http://blog.slickedit.com/?p=225</guid>
		<description><![CDATA[I report a problem to a colleague. After trying and failing to use the &#8220;works on my machine&#8221; excuse, he comes over to see for himself. He asks to drive so he can do a little debugging on my editor, so I step aside to let him use the keyboard. He squints at the code [...]]]></description>
			<content:encoded><![CDATA[<p>I report a problem to a colleague. After trying and failing to use the &#8220;works on my machine&#8221; excuse, he comes over to see for himself. He asks to drive so he can do a little debugging on my editor, so I step aside to let him use the keyboard. He squints at the code and seems unable to type. Several times he presses an elaborate key combination, only to curse and have to undo whatever he did. Usually, when he tries to undo, he again curses before finally looking at the keyboard to press Ctrl+Z with the concentration of an octogenarian trying to double-click the AOL icon fast enough.</p>
<p>Why is he having so much trouble using my editor? Because I&#8217;m using SlickEdit. What does he use? SlickEdit.This scenario happens a lot to me, really anytime a coworker tries to use my machine. Even after he gets used to the color scheme and whatever tool windows I use, if he doesn&#8217;t happen to use the same emulation that I use, he&#8217;s hosed. He spends more time trying to get somewhere in the code than he does actually making any changes. And no doubt he&#8217;s got some custom keybindings on his machine that he uses all the time, but my editor seems to think they have completely different functions.</p>
<p>So the good thing about SlickEdit is that it&#8217;s incredibly customizable. You can set it up to do whatever you want, however you want. You can go over, under, around, and through your code using commands and keybindings that you define, and after using them for a couple of days, you&#8217;ll feel like you were born using Ctrl+W to comment a line of code. You&#8217;ll do all this without thinking about it, because you&#8217;re thinking about the code instead of the use of the editor.</p>
<p>Ah, but then you have to use someone else&#8217;s configuration. It&#8217;s worse if they&#8217;re looking over your shoulder, giving you keyboard performance anxiety. You&#8217;re all thumbs, two left hands, a DVORAK user in a QWERTY world. Your customizations are your crutches, and you have to limp along to solve a stupid problem when you know it works perfectly on your machine.</p>
<p>In fact, you work perfectly on your machine, too.</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.slickedit.com%2F2008%2F04%2Fworks-on-my-machine%2F';
  addthis_title  = 'Works+on+my+Machine';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=PbWhMtGs8ME:RDkSf41hmyI:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=PbWhMtGs8ME:RDkSf41hmyI:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=PbWhMtGs8ME:RDkSf41hmyI:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=PbWhMtGs8ME:RDkSf41hmyI:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=PbWhMtGs8ME:RDkSf41hmyI:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=PbWhMtGs8ME:RDkSf41hmyI:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=PbWhMtGs8ME:RDkSf41hmyI:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=PbWhMtGs8ME:RDkSf41hmyI:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/helloWorld-TheSlickeditDeveloperBlog/~4/PbWhMtGs8ME" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.slickedit.com/2008/04/works-on-my-machine/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://blog.slickedit.com/2008/04/works-on-my-machine/</feedburner:origLink></item>
		<item>
		<title>Tom Brady on Software Management</title>
		<link>http://feedproxy.google.com/~r/helloWorld-TheSlickeditDeveloperBlog/~3/noTkokHtImM/</link>
		<comments>http://blog.slickedit.com/2008/04/tom-brady-on-software-management/#comments</comments>
		<pubDate>Wed, 16 Apr 2008 13:48:00 +0000</pubDate>
		<dc:creator>Scott Hackett</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.slickedit.com/?p=229</guid>
		<description><![CDATA[Management&#8230; the term alone is enough to send shivers down most developers backs. It evokes visions of meetings, Power Point presentations and schedules. Maybe even a Dilbert comic or two.
Between contract work and full time work, I&#8217;ve worked at a lot of places. There have only been a few that I can say I really [...]]]></description>
			<content:encoded><![CDATA[<p>Management&#8230; the term alone is enough to send shivers down most developers backs. It evokes visions of meetings, Power Point presentations and schedules. Maybe even a <a href="http://www.aquezada.com/staff/julian/journal/wp-content/uploads/2006/02/dilbert2006915890209.gif">Dilbert comic</a> or two.</p>
<p>Between contract work and full time work, I&#8217;ve worked at a lot of places. There have only been a few that I can say I really loved. Interestingly, the characteristic that all of those places had in common wasn&#8217;t interesting work or free food or a ping-pong table. It was my managers.</p>
<p>There are good managers and bad managers, and most programmers can say that they&#8217;ve worked with a representative from both groups at least once. However, there&#8217;s also a class of top-shelf managers, and they&#8217;re the ones I&#8217;m talking about here. They have the ability to lead a team, and at the same time make you feel like you&#8217;re one of the most important people on it.</p>
<p><strong>Quarterback vs. software manager<br />
</strong></p>
<p>Whether you like him or not, most of us (at least in the States) know who <a href="http://en.wikipedia.org/wiki/Tom_Brady">Tom Brady</a> is. I wouldn&#8217;t normally look at him, or any sports star, and see a clear comparison to the world of software development. However, I recently read an article in <a href="http://sportsillustrated.cnn.com/2007/football/nfl/12/28/pats.tucker/index.html">Sports Illustrated</a> by <a href="http://www.redskins.com/team/profile.jsp?id=2443">Ross Tucker</a> about his time spent playing on the Patriots with Brady:</p>
<blockquote><p>During my time in New England I worked as a backup lineman and often had to snap to Brady while playing center. In spite of all of the other chaos that he had to sort through, he always found the time to look me squarely in the eye and say, &#8220;C&#8217;mon Ross, me and you, let&#8217;s get a great snap first.&#8221;</p>
<p>I never wanted to snap a ball so well in my life.</p>
<p>I was a veteran in my fifth and sixth years in the league while in New England and I had started over 20 games, but Brady&#8217;s ability to single me out and make me feel important for the success of the play was unlike anything I had experienced.</p></blockquote>
<p>That&#8217;s powerful stuff. I instantly recognized it as the common characteristic of the jobs I&#8217;ve loved working at&#8230; managers that practiced the same philosophy as Tom Brady. After reading this, I realized that the need to be recognized as an important part of the team is something universal, regardless of your job or your level of experience. It&#8217;s about taking people who work hard and finding ways to make them feel important to the team effort. That includes contractors, junior developers, everyone on the team.</p>
<p>So managers, listen up! Yes, programmers like free food. We like the latest and fastest computers. We like ping-pong and pool tables and a fun atmosphere to work in. But most of all, we like to hear that our ideas are important&#8230; that our work matters. So often, we are just looked at as the staff that makes the requirements happen. Sometimes it can seem like we are simply a means to an end, but we are so much more than that. Software developers are creative writers; the designers that make your applications work, the same applications that run your business.</p>
<p>If you give a development team a set of requirements, you hope to get an application that meets those requirements. However, when you let the developers participate in the creative process, and make them feel like their contribution is needed, you&#8217;ll probably find a development team that will think up and implement features you couldn&#8217;t even dream of. All it takes is trust, and an occasional reminder to development that they are an essential part of the process.</p>
<p>The free pizza doesn&#8217;t hurt either&#8230;</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.slickedit.com%2F2008%2F04%2Ftom-brady-on-software-management%2F';
  addthis_title  = 'Tom+Brady+on+Software+Management';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=noTkokHtImM:knllLAyD4Co:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=noTkokHtImM:knllLAyD4Co:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=noTkokHtImM:knllLAyD4Co:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=noTkokHtImM:knllLAyD4Co:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=noTkokHtImM:knllLAyD4Co:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=noTkokHtImM:knllLAyD4Co:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=noTkokHtImM:knllLAyD4Co:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=noTkokHtImM:knllLAyD4Co:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/helloWorld-TheSlickeditDeveloperBlog/~4/noTkokHtImM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.slickedit.com/2008/04/tom-brady-on-software-management/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.slickedit.com/2008/04/tom-brady-on-software-management/</feedburner:origLink></item>
		<item>
		<title>Great Moments in Idiocy</title>
		<link>http://feedproxy.google.com/~r/helloWorld-TheSlickeditDeveloperBlog/~3/dOdTrTkKA5Y/</link>
		<comments>http://blog.slickedit.com/2008/04/great-moments-in-idiocy/#comments</comments>
		<pubDate>Wed, 09 Apr 2008 14:28:37 +0000</pubDate>
		<dc:creator>Dan H</dc:creator>
				<category><![CDATA[Productivity]]></category>

		<guid isPermaLink="false">http://blog.slickedit.com/?p=227</guid>
		<description><![CDATA[
April Fool&#8217;s Day was last week.  We had a pretty good April Fool&#8217;s Day post here, but I am not certain how many people got it.  This got me thinking about some of the better office pranks I have seen in my long tenure here at SlickEdit.  Actually, I do not think any of them [...]]]></description>
			<content:encoded><![CDATA[<p><img align="top" width="572" src="http://www.scotthackett.com/slick_edit/welcome_back4.jpg" alt="welcome back" height="428" /></p>
<p><a href="http://en.wikipedia.org/wiki/April_fool%27s_day">April Fool&#8217;s Day</a> was last week.  We had a pretty good <a href="http://blog.slickedit.com/?p=228">April Fool&#8217;s Day post here</a>, but I am not certain how many people got it.  This got me thinking about some of the better office pranks I have seen in my long tenure here at SlickEdit.  Actually, I do not think any of them happened on April Fool&#8217;s day.  But then its always April Fool&#8217;s Day here&#8230;</p>
<ul>
<li><strong><em>Fun with peanuts</em></strong> &#8211; We&#8217;ve all seen the emailed pictures of this sort of thing.  A cubicle &#8220;door&#8221; is closed off with cardboard, and the cubicle is filled with packing peanuts.  There weren&#8217;t enough peanuts to completely fill the area, but I felt this performance was special for a couple of reasons:
<ul>
<li>This an open area with multiple cubicles, so rear walls (whose sole purpose was to hold in the peanuts) had to be constructed.</li>
<li>The Enter key was removed from the keyboard and dropped into the peanuts.  This part, was just plain mean.  A Starbucks gift card was also dropped in to soften the blow.</li>
</ul>
</li>
<li><strong><em>Fun with Shrink wrap</em></strong> &#8211; An office classic.  Various times multiple items on a co-worker&#8217;s desk have been shrink wrapped.  There are a few fun variations:
<ul>
<li>Shrink wrap the telephone, and call the prankee as they are unwrapping the items on their desk.</li>
<li>When a member of the support staff left for some time to get married, <a href="http://www.scotthackett.com/slick_edit/IMG_1773.jpg"><em>everything </em>accessible on his desk was shrink wrapped</a>.  Since we had the occasional office cookout that day, foil was available and the shrink <a href="http://www.scotthackett.com/slick_edit/IMG_1817.jpg">wrapped items were then wrapped in foil</a>.  Finally, the <a href="http://www.scotthackett.com/slick_edit/IMG_1818.jpg">desk</a> was <a href="http://www.scotthackett.com/slick_edit/IMG_1819.jpg">wrapped </a>in <a href="http://www.scotthackett.com/slick_edit/IMG_1821.jpg">foil</a>.  The look on the face when first foil was removed to reveal shrink wrap: <a href="http://youtube.com/watch?v=ZOU8GIRUd_g">priceless</a>.
<ul>
<li>We have not figured out how to shrink wrap an LCD display.</li>
</ul>
</li>
</ul>
</li>
<li><strong><em>Rickrolling</em></strong> &#8211; <a href="http://en.wikipedia.org/wiki/Rickrolling#.22Rickroll.22_Internet_meme">Rickrolling </a>was all the rage around the office a while back.  This is where a link in an e-mail appears to be one thing, but is actually a link to a <a href="http://en.wikipedia.org/wiki/Rick_Astley">Rick Astley</a> video.</li>
<li><strong><em>The ol&#8217; Box On the Desk</em></strong> &#8211; I no longer remember who or when, but one time after a vacation somebody came back to find their desk packed into a box.  I always felt this was a little too mean.</li>
<li><strong><em>Moe&#8217;ing a Cube</em></strong> &#8211; One time a coworker returned from a few days off to find his cube covered in wrappers from <a href="http://moes.com/">Moe&#8217;s</a>.  For good measure, a CD player was hidden under his desk playing the &#8220;Welcome to Moe&#8217;s&#8221; sound clip over and over.  I still have the CD.</li>
<li><strong><em>Mac on the Desk</em></strong>- At some point a co-worker had some Mac experience, but was hoping he would not be asked to work on a SlickEdit Mac port.  He returned from vacation to find a <a href="http://en.wikipedia.org/wiki/Macintosh_SE/30">Mac SE30</a>, a <a href="http://en.wikipedia.org/wiki/Mac_OSX">Mac OSX</a> CD, and note &#8220;We need to talk &#8211; &lt;managername&gt;&#8221;.  Obviously, it looked ridiculous.</li>
<li><strong><em>A Call From a User</em></strong>- When a member of the support staff was leaving to take another job, we arranged for a user who had called support a lot to call and claim he had an absolutely ridiculous problem.  The subterfuge lasted until we could be heard laughing around the corner.</li>
</ul>
<p>That is all I have.  Let&#8217;s hear yours.</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.slickedit.com%2F2008%2F04%2Fgreat-moments-in-idiocy%2F';
  addthis_title  = 'Great+Moments+in+Idiocy';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=dOdTrTkKA5Y:xS-MtR9NpA0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=dOdTrTkKA5Y:xS-MtR9NpA0:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=dOdTrTkKA5Y:xS-MtR9NpA0:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=dOdTrTkKA5Y:xS-MtR9NpA0:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=dOdTrTkKA5Y:xS-MtR9NpA0:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=dOdTrTkKA5Y:xS-MtR9NpA0:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=dOdTrTkKA5Y:xS-MtR9NpA0:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=dOdTrTkKA5Y:xS-MtR9NpA0:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/helloWorld-TheSlickeditDeveloperBlog/~4/dOdTrTkKA5Y" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.slickedit.com/2008/04/great-moments-in-idiocy/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://blog.slickedit.com/2008/04/great-moments-in-idiocy/</feedburner:origLink></item>
		<item>
		<title>Finding Misery in Another Programmer’s Success</title>
		<link>http://feedproxy.google.com/~r/helloWorld-TheSlickeditDeveloperBlog/~3/izysofsTfcc/</link>
		<comments>http://blog.slickedit.com/2008/04/finding-misery-in-another-programmers-success/#comments</comments>
		<pubDate>Wed, 02 Apr 2008 13:46:05 +0000</pubDate>
		<dc:creator>Scott Hackett</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.slickedit.com/?p=224</guid>
		<description><![CDATA[I was introduced to the word schadenfreude by an episode of the Simpsons, &#8220;When Flanders Failed&#8220;. It&#8217;s a german word that means &#8220;pleasure from misfortune&#8221;. In this episode, Homer finds happiness in watching Flanders&#8217; Leftorium shop go out of business. The Wikipedia reference to it says that the opposite meaning of schadenfreude would be &#8220;happiness [...]]]></description>
			<content:encoded><![CDATA[<p>I was introduced to the word <em>schadenfreude</em> by an episode of the Simpsons, &#8220;<a href="http://en.wikipedia.org/wiki/When_Flanders_Failed">When Flanders Failed</a>&#8220;. It&#8217;s a german word that means &#8220;pleasure from misfortune&#8221;. In this episode, Homer finds happiness in watching Flanders&#8217; Leftorium shop go out of business. The <a href="http://en.wikipedia.org/wiki/Schadenfreude">Wikipedia reference to it</a> says that the opposite meaning of schadenfreude would be &#8220;happiness in another&#8217;s good fortune,&#8221; but I think that the opposite should really mean &#8220;misery in another&#8217;s success&#8221;. This sentiment has a long, unfortunate place in software development.</p>
<p><img width="200" src="http://upload.wikimedia.org/wikipedia/en/thumb/0/0c/Simpsons_7F23.png/200px-Simpsons_7F23.png" height="158" /></p>
<p><strong>My first job as &#8220;the VB guy&#8221;</strong></p>
<p>I graduated with a masters in CS, and my research involved working with the Air Force on a neural network algorithm they were implementing. This was all done in C++ and by the time I graduated, I was proficient in the language. My first job was at a startup with 3 other people, where we needed to get something done very quickly and we used VB4 (the latest VB at the time) to write the entire thing. I had never worked in VB before, but I picked it up quickly and learned how to push it to the edge of what it could do, which was a lot.</p>
<p>I remember being blown away by how fast we could test ideas and write new parts of the system, compared to the work I had done in C++ before. VB didn&#8217;t have inheritance and of course it had its own quirky syntax, but the power of how fast you could get things done was amazing.</p>
<p>That project went extremely well and we got an enormous bid to continue our work. At that point, I was firmly rooted in my place as a developer of the initial product and would continue developing it. However, we needed to start writing our own device drivers for new peripherals that we needed to interface with. In came the C++ programmers, and shortly after, I became known not as the lead programmer of the main product, but rather as &#8220;the VB guy&#8221;. As the VB guy, I was always pretty far outside of the C++ clique, even though a year before I had considered myself a proficient C++ programmer.</p>
<p>It&#8217;s a scar I think I still carry to this day.</p>
<p><strong>Any idiot can program [<em>insert high level language</em>]!<br />
</strong></p>
<p>Anyone who has worked for a significant amount of time in VB, Ruby, Perl, or even C# and Java probably knows where I&#8217;m coming from. There is a large number of people who hate these languages purely because they allow newer, less experienced programmers to develop working code quickly. You don&#8217;t need to know what a pointer is to program any of these languages. You don&#8217;t need to know how memory is allocated for new objects, and for the most part you don&#8217;t have to be conscious of freeing it either. You don&#8217;t need to understand a lick of the Win32 API to make a working client application in VB. The list goes on and on and on&#8230;</p>
<p>There are also programmers who have battle wounds from debugging memory leaks from unfreed pointers. There are those that learned to program Windows applications from <a href="http://www.amazon.com/Programming-Windows-Fifth-Charles-Petzold/dp/157231995X/ref=pd_bbs_sr_2?ie=UTF8&amp;s=books&amp;qid=1206534956&amp;sr=8-2">Petzold&#8217;s book</a> where you wrote the WinMain function and the message loop by hand. There are programmers who learned COM by hand writing their own implementation of QueryInterface and doing their own reference counting. Many of these programmers watch in horror as new, inexperienced programmers get the same end result in a small fraction of the time because their higher level language wraps up what they&#8217;ve spent years mastering, and makes it &#8220;just work&#8221;.</p>
<p><strong>Check your ego</strong></p>
<p>I believe that&#8217;s where so much of today&#8217;s language bitterness comes from. All programmers strive for higher levels of abstraction and functionality, whether it&#8217;s through libraries or frameworks. However, there&#8217;s a level at which the programmers who understand what happens internally start to despise the programmers that make use of that abstraction without understanding those internals. It&#8217;s a smug, arrogant attitude that makes a developer believe that they are a better programmer, or that their language is better, because they work at a lower level. Unless you are writing your code in 1s and 0s, there is always a huge amount of &#8220;scaffolding&#8221; underneath you that you just rely on.</p>
<p>If you&#8217;re one of these people, get over yourself. There are both great and terrible programmers in every language. There are brilliant VB programmers and there are frighteningly bad C++ programmers out there. If you resent beginner programmers being able to write apps quickly in VB, or put together a web site quickly in Rails, then you need to seriously rethink what the point of programming is in the first place. Their success should be your happiness.</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.slickedit.com%2F2008%2F04%2Ffinding-misery-in-another-programmers-success%2F';
  addthis_title  = 'Finding+Misery+in+Another+Programmer%26%238217%3Bs+Success';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=izysofsTfcc:r-dm-u39Dj4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=izysofsTfcc:r-dm-u39Dj4:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=izysofsTfcc:r-dm-u39Dj4:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=izysofsTfcc:r-dm-u39Dj4:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=izysofsTfcc:r-dm-u39Dj4:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=izysofsTfcc:r-dm-u39Dj4:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=izysofsTfcc:r-dm-u39Dj4:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=izysofsTfcc:r-dm-u39Dj4:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/helloWorld-TheSlickeditDeveloperBlog/~4/izysofsTfcc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.slickedit.com/2008/04/finding-misery-in-another-programmers-success/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		<feedburner:origLink>http://blog.slickedit.com/2008/04/finding-misery-in-another-programmers-success/</feedburner:origLink></item>
		<item>
		<title>Coding tips:  Generational Naming</title>
		<link>http://feedproxy.google.com/~r/helloWorld-TheSlickeditDeveloperBlog/~3/4SzDaZLRKF8/</link>
		<comments>http://blog.slickedit.com/2008/04/coding-tips-generational-naming/#comments</comments>
		<pubDate>Tue, 01 Apr 2008 12:42:34 +0000</pubDate>
		<dc:creator>Dennis B</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.slickedit.com/?p=228</guid>
		<description><![CDATA[All too often, you need to make a new version of a function that does something a little bit different than the original function. Perhaps it just takes a new argument or removes an unused one. Maybe it&#8217;s a wrapper around the original function that does some more cool stuff. Furthermore, for backwards compatibility, you [...]]]></description>
			<content:encoded><![CDATA[<p>All too often, you need to make a new version of a function that does something a little bit different than the original function. Perhaps it just takes a new argument or removes an unused one. Maybe it&#8217;s a wrapper around the original function that does some more cool stuff. Furthermore, for backwards compatibility, you have to leave the original version of the function around, semantics unchanged.</p>
<p>This is a pretty common programming scenario which can become quite unnerving when you discover that <em>the original function was named perfectly.</em> Of course, you can&#8217;t reuse that name because you are programming to a C ABI, or the signature is not different enough to allow you to overload the function.</p>
<p>So, you spend the next half hour of your day figuring out a name for this new function which makes sense. Here is one example, the original function:</p>
<pre><font color="#0000ff">   int findMatches(string regex, int flags);
</font></pre>
<p>And the new function changes the meaning of one of the flags. So you name it:</p>
<pre><font color="#0000ff">   int findMatchesWithNewFlags(string regex, int flags);
</font></pre>
<p>But wait, that&#8217;s a pretty stupid name, and rather verbose. So you try to capture what is really different about the new function.</p>
<pre><font color="#0000ff">   int findMatchesOldReentrantFlagIsReverseFlag(string regex, int flags);
</font></pre>
<p>Still pretty verbose, and if we change the function again in the future, this will just get silly. OK, how about this:</p>
<pre><font color="#0000ff">   int findMatchesWithReverseOption(string regex, int flags);
</font></pre>
<p>This is better, but still verbose. There has to be a better way.</p>
<p><strong>Generational Naming Conventions</strong></p>
<p>Well, on this day of April 1, 2008, let me share with you the dearest naming convention to my heart, generational naming. In this paradigm, we recognize that the original name was perfect, so all we want to capture in the name of the new function is that it is newer. You do this by adding a &#8220;2&#8243; to the end of the name.</p>
<pre><font color="#0000ff">   int findMatches2(string regex, int flags);
</font></pre>
<p>When you need to again change findMatches(), you create the next generation:</p>
<pre><font color="#0000ff">   int findMatches3(string regex, int flags);
</font></pre>
<p><strong>Extended Naming</strong></p>
<p>There are several less powerful variants of generational naming. For example extended naming, where you add &#8220;Ex&#8221; to the new function. This is in fact, a common practice at another large software company located in</p>
<pre><font color="#0000ff">   int findMatchesEx(string regex, int flags);
</font></pre>
<p>And then there is &#8220;new naming&#8221;:</p>
<pre><font color="#0000ff">   int newFindMatches(string regex, int flags);
</font></pre>
<p>Which can actually be extended twice over:</p>
<pre><font color="#0000ff">   int newerFindMatches(string regex, int flags);
   int newestFindMatches(string regex, int flags);  // buck stops here
</font></pre>
<p><strong>Conclusion</strong></p>
<p>The conclusion is simple. You do not need to be smart or clever to write code, you just need to know how to count.</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.slickedit.com%2F2008%2F04%2Fcoding-tips-generational-naming%2F';
  addthis_title  = 'Coding+tips%3A++Generational+Naming';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=4SzDaZLRKF8:EJBIbYF90aI:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=4SzDaZLRKF8:EJBIbYF90aI:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=4SzDaZLRKF8:EJBIbYF90aI:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=4SzDaZLRKF8:EJBIbYF90aI:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=4SzDaZLRKF8:EJBIbYF90aI:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=4SzDaZLRKF8:EJBIbYF90aI:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=4SzDaZLRKF8:EJBIbYF90aI:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=4SzDaZLRKF8:EJBIbYF90aI:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/helloWorld-TheSlickeditDeveloperBlog/~4/4SzDaZLRKF8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.slickedit.com/2008/04/coding-tips-generational-naming/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.slickedit.com/2008/04/coding-tips-generational-naming/</feedburner:origLink></item>
		<item>
		<title>The Next Programming Skill You Should Learn</title>
		<link>http://feedproxy.google.com/~r/helloWorld-TheSlickeditDeveloperBlog/~3/yWOMWZlmUI8/</link>
		<comments>http://blog.slickedit.com/2008/03/the-next-programming-skill-you-should-learn/#comments</comments>
		<pubDate>Wed, 19 Mar 2008 15:29:12 +0000</pubDate>
		<dc:creator>Scott Hackett</dc:creator>
				<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.slickedit.com/?p=223</guid>
		<description><![CDATA[Change and growth are faster than ever in software these days. There&#8217;s Silverlight, LINQ and WPF from Microsoft. There&#8217;s AJAX, REST and Rails 2.0 in the web development world. Java has JavaFX. There used to be a time when you had to pick one language and run with it because it was just too overwhelming [...]]]></description>
			<content:encoded><![CDATA[<p>Change and growth are faster than ever in software these days. There&#8217;s Silverlight, LINQ and WPF from Microsoft. There&#8217;s AJAX, REST and Rails 2.0 in the web development world. Java has JavaFX. There used to be a time when you had to pick one language and run with it because it was just too overwhelming to master more than one. Now it&#8217;s impossible to keep up with new developments within even a single language. This has many developers scrambling to figure out what to learn next. No one wants to invest countless hours in a losing technology&#8230; you want to learn something that will be useful in the long run. I have just the skill for you, and it doesn&#8217;t matter what language you work with.</p>
<p>Learn to write well. [<a href="http://www.scotthackett.com/slick_edit/cricket.wav">*</a>]</p>
<p>&#8220;But that&#8217;s not a programming skill!&#8221; you&#8217;re probably saying. Or maybe you&#8217;re disappointed because you thought I was going to be talking about the very latest cutting-edge API you can&#8217;t live without. Good writing skill is probably one of the most useful talents you can develop as a software engineer, and ignoring it is one of the biggest mistakes most programmers make.</p>
<p><strong>Working in a cave<br />
</strong></p>
<p>I used to work with a programmer who we jokingly referred to as a &#8220;walking MSDN&#8221;. He knew all the Win32 APIs, he could tell you the int values of const definitions and could enumerate the parameter lists to functions overloaded 30 times over. As a programmer, when given an assignment, he would <a href="http://blog.slickedit.com/?p=207">go into his cave</a>, hammer out a solution and would re-emerge from his cave with something that worked. I mean that in the most serious way&#8230; he would hammer his code into submission until it worked. There was no such thing as elegant code to him; it worked or it didn&#8217;t.</p>
<p>His manager both loved and feared him because he would do everything required on time, but he had no idea what happened in that cave. There was no visibility at all into what he was doing, and his manager had to blindly rely on the fact that he had a history of getting stuff done on time.</p>
<p>Programmers loved and feared him because he was incredibly knowledgeable and could answer any question about how this or that API worked. But whenever someone had to get inside his code, it was a pure mystery. There was no documentation, no models, no code comments&#8230; nothing but the raw code itself. For mister MSDN, this was no problem, because it was all in his head. For everyone else, it was like being lost in a big city with no map.</p>
<p>Was he a good programmer? Most people that worked with him would say yes&#8230; he was technically proficient and met his deadlines. But most of those same people would also say that they had a very difficult time working with him. That element of fear that he generated was a direct result of not being able, or willing, to communicate. He couldn&#8217;t communicate his plans or designs to other programmers. He couldn&#8217;t communicate his status with his managers. He couldn&#8217;t communicate his interfaces with other teams. Eventually when he left, his code left a wake of terror felt by those that had to pick up where he left off.</p>
<p><strong>The lifespan of a tech skill</strong></p>
<p>Technologies come and go. Seven or so years ago, I felt like I was completely on top of my game when it came to programming technology, at least in the Microsoft world. I had a very deep understanding of COM and ATL, thanks to <a href="http://www.amazon.com/ATL-Internals-Addison-Wesley-Object-Technology/dp/0201695898/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1205862823&amp;sr=8-1">Chris Sells, Brent Rector</a> and <a href="http://www.amazon.com/Professional-Atl-Programming-Richard-Grimes/dp/B0000B0T0K/ref=sr_1_3?ie=UTF8&amp;s=books&amp;qid=1205929348&amp;sr=1-3">Richard Grimes</a>, and I coupled that with VB6 on the front end. This was a really potent combination and I thought I&#8217;d be working with that for years and years. But, as with most technical skills, it didn&#8217;t last long&#8230; .Net came along a year later, ATL became outdated and VB6 just disappeared into the sunset. Now that I&#8217;ve mastered C#, I find that I haven&#8217;t even touched the new stuff in .Net 3.5. The point is, no matter what technology you learn, with very few exceptions, it will disappear or be overshadowed by newer technologies (and probably sooner than later).</p>
<p>Writing skills will last you a lifetime, though. You will always benefit from it, regardless of what language or technology your use, or whether you&#8217;re even a programmer or not. Good writing skills are universal and will never be replaced.</p>
<p><strong>The golden rule of documenting software design</strong></p>
<p>Try to document whatever you are working on. It doesn&#8217;t have to be the worlds most perfect UML and you don&#8217;t need an expensive tool to do it. In fact, Wordpad and Paint are sufficient, and don&#8217;t tell me you don&#8217;t have those. <a href="http://blog.slickedit.com/?p=43">Write in a way that best expresses your intent and your thought process in coming to the design decisions you did</a>. I have a golden rule of documenting software design:</p>
<blockquote><p><em><strong>Describe your design to others as you would have others describe their design to you.</strong></em></p></blockquote>
<p>When you spend the time to do this, you&#8217;ll find that many benefits will follow. You&#8217;ll get feedback from others that may have tried to solve a similar problem and have insight you may not have thought of. You&#8217;ll leave a clear trail to follow for those that work on the code after you. Most importantly, you&#8217;ll shed light on your work, which everyone who depends on your work will appreciate. Even if no one else reads what you write, you&#8217;ll still have worked through problems in your head that can only lead to better design in the long run. <em>There is no downside to documenting your designs. </em></p>
<p>If that wasn&#8217;t enough, consider the fact that someday you may be looking for another programming job. You&#8217;ll sit down with other developers and managers in an interview and try to describe how great your technical abilities are. You are now one of the vast sea of programmers trying to get that job. With your resume alone, a company has only your answers during the interview to base their decision on. With your documentation in hand, though, you can show them in full detail the type of work you&#8217;ve done and give them deeper insight into your thought process than they could ever get from interview questions alone. Your documentation serves as a body of work that travels with you, long after you&#8217;ve stopped working on this or that code, and speaks for your experience.</p>
<p>Of course, these skills won&#8217;t write code for you. But think about how much time you&#8217;ve devoted to learning programming based skills. Think about how many books you&#8217;ve purchased and read about programming. It&#8217;s a huge investment in time and money to keep up with. The next time you have some free cycles to sit down and pick up something new, consider skipping the software development section of the bookstore and pick up a book about technical writing. Here are some good books on this subject:</p>
<ul>
<li><a href="http://www.amazon.com/Writing-White-Papers-Capture-Readers/dp/0977716937/ref=tag_dpp_lp_edpp_ttl_in">Writing White Papers: How to Capture Readers and Keep Them Engaged</a></li>
<li><a href="http://www.amazon.com/Developing-Quality-Technical-Information-Information/dp/0131477498/ref=tag_dpp_lp_edpp_ttl_in">Developing Quality Technical Information: A Handbook for Writers and Editors</a></li>
<li><a href="http://www.amazon.com/Documenting-Software-Architectures-Beyond-Engineering/dp/0201703726/ref=sr_1_4?ie=UTF8&amp;s=books&amp;qid=1205864346&amp;sr=1-4">Documenting Software Architectures: Views and Beyond</a></li>
</ul>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.slickedit.com%2F2008%2F03%2Fthe-next-programming-skill-you-should-learn%2F';
  addthis_title  = 'The+Next+Programming+Skill+You+Should+Learn';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=yWOMWZlmUI8:ZU8XolWe0AE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=yWOMWZlmUI8:ZU8XolWe0AE:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=yWOMWZlmUI8:ZU8XolWe0AE:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=yWOMWZlmUI8:ZU8XolWe0AE:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=yWOMWZlmUI8:ZU8XolWe0AE:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=yWOMWZlmUI8:ZU8XolWe0AE:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=yWOMWZlmUI8:ZU8XolWe0AE:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=yWOMWZlmUI8:ZU8XolWe0AE:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/helloWorld-TheSlickeditDeveloperBlog/~4/yWOMWZlmUI8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.slickedit.com/2008/03/the-next-programming-skill-you-should-learn/feed/</wfw:commentRss>
		<slash:comments>26</slash:comments>
<enclosure url="http://www.scotthackett.com/slick_edit/cricket.wav" length="46124" type="audio/wav" />
		<feedburner:origLink>http://blog.slickedit.com/2008/03/the-next-programming-skill-you-should-learn/</feedburner:origLink></item>
		<item>
		<title>An Open Letter to My Software</title>
		<link>http://feedproxy.google.com/~r/helloWorld-TheSlickeditDeveloperBlog/~3/NQtw_29oRdU/</link>
		<comments>http://blog.slickedit.com/2008/03/an-open-letter-to-my-software/#comments</comments>
		<pubDate>Wed, 12 Mar 2008 13:37:03 +0000</pubDate>
		<dc:creator>Scott Hackett</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.slickedit.com/?p=220</guid>
		<description><![CDATA[You and I have been through a lot together. It doesn&#8217;t seem like that long ago when I was sitting and programming, nothing really important, and I said to myself, &#8220;Wouldn&#8217;t it be really cool if&#8230;?&#8221; And here we are now, only a short time from your gold build.
I feel like I&#8217;ve gotten to know [...]]]></description>
			<content:encoded><![CDATA[<p>You and I have been through a lot together. It doesn&#8217;t seem like that long ago when I was sitting and programming, nothing really important, and I said to myself, &#8220;Wouldn&#8217;t it be really cool if&#8230;?&#8221; And here we are now, only a short time from your gold build.</p>
<p>I feel like I&#8217;ve gotten to know you, that you&#8217;re not just a program or a set of files. You have a personality that I spend most of my day with, sometimes more than the people I work with and even my own family. We have our ups and downs. We&#8217;ve had days where we hated each other, and you were so stubborn that I wished I had never written you in the first place. But we also had times that made me feel like one of the proudest developers in the world. We learned a lot together and sometimes your bad behavior taught me something new about the way I write software. At other times you&#8217;ve amazed me with the things you&#8217;re capable of doing, producing results that were useful in ways I&#8217;d never originally intended, as if you were secretly developing yourself while I wasn&#8217;t looking.</p>
<p>There are going to be users out there and most of them are great people who will be excited to buy you and work with you. But there will also be some that won&#8217;t be so nice, and they may say or blog really bad things about you. You may be installed into environments where you have no clue. People aren&#8217;t going to be so gentle with you in the real world. They won&#8217;t be forgiving when you make mistakes and won&#8217;t give you the soft restart that you&#8217;re used to when you get debugged. I&#8217;ve tried my best to give you everything you need to avoid those situations and handle them gracefully, but sometimes unexpected things happen. Just remember all the good things you can do and let the bad stuff go.</p>
<p>We&#8217;ll be seeing each other from time to time, during bug fixes and maintenance, but it won&#8217;t be like this last development cycle. I hope I&#8217;ll be able to keep improving you and making you the best you can be, but in reality I&#8217;ll have new features to work on and a schedule that only allows us so much time together. I know my new features&#8230; they&#8217;ve started just like you did, some of them as ideas that came to me while I was writing you. But no matter what features I may work on in the future, the time we&#8217;ve spent in development together will always be unique and I&#8217;ll always remember it, just as I remember the features and programs that came before you.</p>
<p>This will be a milestone build and release and I can&#8217;t wait for your introduction to the world. Remember that I believe in you more than you know. Now get out there and show everybody what you can do!</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.slickedit.com%2F2008%2F03%2Fan-open-letter-to-my-software%2F';
  addthis_title  = 'An+Open+Letter+to+My+Software';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=NQtw_29oRdU:Ysc68MGVgjY:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=NQtw_29oRdU:Ysc68MGVgjY:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=NQtw_29oRdU:Ysc68MGVgjY:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=NQtw_29oRdU:Ysc68MGVgjY:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=NQtw_29oRdU:Ysc68MGVgjY:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=NQtw_29oRdU:Ysc68MGVgjY:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=NQtw_29oRdU:Ysc68MGVgjY:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=NQtw_29oRdU:Ysc68MGVgjY:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/helloWorld-TheSlickeditDeveloperBlog/~4/NQtw_29oRdU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.slickedit.com/2008/03/an-open-letter-to-my-software/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.slickedit.com/2008/03/an-open-letter-to-my-software/</feedburner:origLink></item>
		<item>
		<title>Software Schedules and the Parable of the Loaf of Bread</title>
		<link>http://feedproxy.google.com/~r/helloWorld-TheSlickeditDeveloperBlog/~3/ta5EX-J0sOs/</link>
		<comments>http://blog.slickedit.com/2008/03/software-schedules-and-the-parable-of-the-loaf-of-bread/#comments</comments>
		<pubDate>Wed, 05 Mar 2008 15:28:47 +0000</pubDate>
		<dc:creator>Scott Westfall</dc:creator>
				<category><![CDATA[Productivity]]></category>

		<guid isPermaLink="false">http://blog.slickedit.com/?p=221</guid>
		<description><![CDATA[As the manager of a development team, software schedules and estimates are frequently on my mind. A couple of my previous blogs covered estimates: The Perfect Estimate and Software Estimates and the Parable of the Cave. 
Today, I want to discuss a common problem that occurs after the estimate is delivered. Often, the estimate is [...]]]></description>
			<content:encoded><![CDATA[<p>As the manager of a development team, software schedules and estimates are frequently on my mind. A couple of my previous blogs covered estimates: <a href="http://blog.slickedit.com/?p=94">The Perfect Estimate</a> and <a href="http://blog.slickedit.com/?p=207">Software Estimates and the Parable of the Cave</a>. </p>
<p>Today, I want to discuss a common problem that occurs after the estimate is delivered. Often, the estimate is considered to be too high and management tells you how long you have to complete the task. Sometimes this is motivated by important business goals. Other times it’s motivated by a manager who wants to look good or has a bonus tied to a delivery date. </p>
<p>Regardless of the reason, when the team is given the new timeframe they have to scramble to meet it. Often, teams cut corners to try to hit what is, otherwise, an impossible deadline. This has happened to me on a couple projects with what I know now as predictable results. To illustrate it, I offer:</p>
<p><strong>The Parable of the Loaf of Bread</strong></p>
<p>   In a land far away lived a king who was terribly fond of bread. He ate bread at every meal and would often request it as a snack. One day the king requested some bread, but he was told by the royal baker that they were out. Apparently, one of the apprentice cooks had used all the remaining bread to make croutons. </p>
<p>   “Off with his head,” yelled the king, not at all pleased that he couldn’t have some bread. “Now, how long will it take you to get me some bread?”</p>
<p>   “Good King,” replied the royal baker, “I can have a nice, hot loaf of bread for you in about 2 and half hours.”</p>
<p>   “Two and half hours!?!  Not good enough! I want bread sooner. Bring some bread in an hour or you will share the fate of your apprentice.”</p>
<p>   The royal baker returned to his kitchen, determined to meet the king’s deadline. But how could he do it? Every good baker knows that it takes 10 minutes to mix the ingredients for the dough, 15 minutes to knead the dough, an hour to let it rise, and then another hour to bake. How could he finish in an hour? </p>
<p>   “There’s nothing I can do to mix the ingredients faster,” he thought. “But maybe I can let it rise for a shorter time. And maybe I can bake it quicker if the oven is hotter.”</p>
<p>   So he set about to make the loaf of bread, cutting corners wherever possible. He placed the bread in the oven after letting it rise only 20 minutes. He thought to himself that that loaf looked small, but hoped it would come out OK. After 30 minutes he removed the loaf from the oven. The outside was too dark from the higher temperature, but it didn’t look burned. Maybe this will be fine. </p>
<p>   The royal baker rushed the hot loaf up to the king without a minute to spare. The king sliced open the bread to find that the crust was way too hard and the inside too dense and not at all cooked. </p>
<p>   Thoroughly displeased, the king looked at the royal baker and asked, “What is this? This is not a decent loaf of bread!”</p>
<p>   The royal baker replied, “Good King, I did my best to bring you a loaf of bread in the time you allotted, but this is the best that could be done.”</p>
<p>   “How long will it take,” inquired the king, “to bring me a decent loaf of bread?”</p>
<p>   The baker thought for a moment, but there is nothing he can do to shorten the amount of time. “I can have a nice loaf of bread for you in about two and a half hours,” he replied.</p>
<p>   “Two and a half hours!?!” yelled the king. “I already gave you an hour. So bring me some bread in an hour and a half or I’ll cut your head off.”</p>
<p>   The baker returned to his kitchen, highly motivated to give the king what he wanted. Try as he might, he could think of no way to bake a perfect loaf in the amount of time given. So, he took the uncooked center from the first loaf and added in a bit more dough. He didn’t have time to let it fully rise and he had to cook it for less time than it should, but it was the only way he could produce a loaf in the allotted time. </p>
<p>   At the end of the hour and a half, the baker returned to the king with the new loaf of bread. Again, it was overly done on the outside. The inside was a mixture of dry, dense dough and underdone dough.</p>
<p>  The king was furious and called the guards to have the baker executed. He had the assistant baker brought before him and asked him how long it would take to bake a nice loaf of bread. The assistant baker, clearly unnerved by the fate of the former head, now headless, baker responded, “Your Majesty, I am aware of your desire for some nice bread. However, there is nothing I can do to speed the process and produce a loaf that is worthy of your Highness.  I can bring you a nice loaf of bread in about two and a half hours, but I could make you some delicious rolls in about half that time.”</p>
<p>   The king mulled it over for a few moments and said, “Very good. Some rolls would be nice.”</p>
<p>The End.</p>
<p>In software development, this cycle is all too common. A deadline looms and we eliminate steps that we know are essential to producing quality code. We throw out unit testing or greatly reduce the number of tests produced. We eliminate design and code reviews so we can spend more time writing code. I’ve even seen projects curtail analysis and design thinking they can adapt as they figure out the fine points later.</p>
<p>The problem with this is that cutting corners produces poor software, often with a high rate of defects or a design that can’t be extended or modified to meet changing requirements. As the code base grows and has more of this low-quality code, every subsequent unit of development takes longer than the ones before it. Rather than providing the basis to speed subsequent development, it slows it down as you are forced to trace problems and limitations in work that was previously “done”.</p>
<p>It’s hard to get non-developers to understand the impact of using poorly written code. But it is as clear and obvious to developers as attempting to use a half-backed loaf of bread to jump-start the creation of a new loaf. So it’s important to push back and try to educate your partners about what they are asking you to do. </p>
<p>Explain the risks involved and why essential steps can’t be skipped. I’m not saying that you should be a purist. Be pragmatic and willing to bend. When your back is against the wall, you should look for ways to perform steps, like unit testing, as quickly and efficiently as possible. You may find that the business need warrants the risk of skipping unit testing on infrequently used or less complex code paths. </p>
<p>Try to get them to reduce the scope of what is planned, just as in the parable when the assistant baker offered rolls instead of a loaf of bread. Cutting features is the surest way to shorten a schedule. Even if you don’t get permission to drop features, work on the code in an iterative and incremental manner. Get the essential functionality finished before adding bells and whistles, even if you’re told you can’t ship without them. When they’re given the option of shipping without them or shipping nothing, you’d be surprised how often they are willing to leave them off.</p>
<p>Hopefully, your project is a team effort and not a monarchy. Just as there are development considerations that they may not understand, there may be business considerations that you don’t understand. Work together to define an acceptable level of risk and then perform your development accordingly. </p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fblog.slickedit.com%2F2008%2F03%2Fsoftware-schedules-and-the-parable-of-the-loaf-of-bread%2F';
  addthis_title  = 'Software+Schedules+and+the+Parable+of+the+Loaf+of+Bread';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=ta5EX-J0sOs:uwg6-ABvK7E:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=ta5EX-J0sOs:uwg6-ABvK7E:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=ta5EX-J0sOs:uwg6-ABvK7E:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=ta5EX-J0sOs:uwg6-ABvK7E:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=ta5EX-J0sOs:uwg6-ABvK7E:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=ta5EX-J0sOs:uwg6-ABvK7E:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?a=ta5EX-J0sOs:uwg6-ABvK7E:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/helloWorld-TheSlickeditDeveloperBlog?i=ta5EX-J0sOs:uwg6-ABvK7E:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/helloWorld-TheSlickeditDeveloperBlog/~4/ta5EX-J0sOs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.slickedit.com/2008/03/software-schedules-and-the-parable-of-the-loaf-of-bread/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.slickedit.com/2008/03/software-schedules-and-the-parable-of-the-loaf-of-bread/</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic page generated in 1.923 seconds. --><!-- Cached page generated by WP-Super-Cache on 2009-11-09 22:11:32 -->
