<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Posts on BoochTek, LLC</title><link>https://blog.boochtek.com/posts/</link><description>Recent content in Posts on BoochTek, LLC</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Wed, 06 Jul 2016 23:22:08 +0000</lastBuildDate><atom:link href="https://blog.boochtek.com/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>You Don’t Have to Be Right</title><link>https://blog.boochtek.com/posts/you-dont-have-to-be-right/</link><pubDate>Wed, 06 Jul 2016 23:22:08 +0000</pubDate><guid>https://blog.boochtek.com/posts/you-dont-have-to-be-right/</guid><description>&lt;p&gt;Not too long ago, I was asked during a job interview &amp;ldquo;how do you convince your teammates that you&amp;rsquo;re right?&amp;rdquo; I answered with probably the most surprising answer: &amp;ldquo;I don&amp;rsquo;t.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s taken me years to realize that being right isn&amp;rsquo;t terribly important. Especially when there&amp;rsquo;s more than one right answer &amp;mdash; which there usually is. It&amp;rsquo;s more important to work as a team. It&amp;rsquo;s more important to be respected and to have respect for others.&lt;/p&gt;</description></item><item><title>My First Open Space</title><link>https://blog.boochtek.com/posts/first-open-space/</link><pubDate>Wed, 10 Feb 2016 23:42:54 +0000</pubDate><guid>https://blog.boochtek.com/posts/first-open-space/</guid><description>&lt;p&gt;I recently attended an Open Space hosted at work. I&amp;rsquo;d never been to an Open Space, and didn&amp;rsquo;t know what to expect. We&amp;rsquo;d been told that this was a workshop to help Engineering Managers (my role), Product Owners, and Product Analysts find better ways of working together. But due to the way an Open Space works, it evolved into something completely different &amp;mdash; and better.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;d brought in Diana Larsen to facilitate the Open Space. Diana is a stalwart of the Agile community, focusing on how people and teams interact. She literally (co-)wrote the book on Agile retrospectives. Diana was also kind enough to be our guest at an Agile LINC meetup later in the evening.&lt;/p&gt;</description></item><item><title>Resolutions for 2016</title><link>https://blog.boochtek.com/posts/resolutions-2016/</link><pubDate>Tue, 19 Jan 2016 23:51:09 +0000</pubDate><guid>https://blog.boochtek.com/posts/resolutions-2016/</guid><description>&lt;p&gt;I&amp;rsquo;ve written up a list of career-related resolutions the past few years. I&amp;rsquo;ve been pretty successful meeting those goals, so I&amp;rsquo;m going to continue the tradition.&lt;/p&gt;
&lt;h2 id="coding"&gt;Coding&lt;/h2&gt;
&lt;p&gt;I want to increase the &lt;a href="https://github.com/boochtek"&gt;Open Source code I write&lt;/a&gt; this year. That&amp;rsquo;s basically everything I write that&amp;rsquo;s not directly related to work.&lt;/p&gt;
&lt;p&gt;I took over maintenance of &lt;a href="https://github.com/solnic/virtus#readme"&gt;Virtus&lt;/a&gt; late last year, but haven&amp;rsquo;t done a good job at finding the time for that. That&amp;rsquo;s probably more responding to issues on GitHub and merging pull requests. But eventually, I&amp;rsquo;ll likely add some features and do some refactoring.&lt;/p&gt;</description></item><item><title>Team Values</title><link>https://blog.boochtek.com/posts/team-values/</link><pubDate>Mon, 04 Jan 2016 22:56:46 +0000</pubDate><guid>https://blog.boochtek.com/posts/team-values/</guid><description>&lt;p&gt;I held a retrospective with my new team last week. The team includes 2 senior developers, 2 junior developers, a product owner, and a product analyst. I&amp;rsquo;ve joined the team as an engineering manager, which I think of more as a team lead with an elevated title. Being new to this group, I wanted a way to understand their values. What motivates them? What common values do we share that we can leverage to move forward in the same direction?&lt;/p&gt;</description></item><item><title>2015 Year in Review</title><link>https://blog.boochtek.com/posts/year-in-review-2015/</link><pubDate>Mon, 28 Dec 2015 23:28:38 +0000</pubDate><guid>https://blog.boochtek.com/posts/year-in-review-2015/</guid><description>&lt;p&gt;It&amp;rsquo;s that time of year again &amp;mdash; time for a retrospective on how I did on &lt;a href="https://blog.boochtek.com/posts/2015/02/02/resolutions"&gt;my goals&lt;/a&gt; for the year. I had 5 main goals for 2015:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Job Hunting&lt;/li&gt;
&lt;li&gt;Conferences&lt;/li&gt;
&lt;li&gt;Blogging&lt;/li&gt;
&lt;li&gt;Programming Language Design&lt;/li&gt;
&lt;li&gt;Writing an Agile Book&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="job-hunting"&gt;Job Hunting&lt;/h2&gt;
&lt;p&gt;I got pretty lucky on this one. My main contract with &lt;a href="https://www.mercy.net/"&gt;Mercy&lt;/a&gt; got extended several times. &lt;a href="https://twitter.com/adkron"&gt;Amos&lt;/a&gt; and I must have been doing a good job of keeping the customer happy. We even made it through a couple rounds of layoffs. I&amp;rsquo;m wrapping up the gig at Mercy now. I&amp;rsquo;m working one day a week there, as the project winds down.&lt;/p&gt;</description></item><item><title>Face Your Fears</title><link>https://blog.boochtek.com/posts/face-your-fears/</link><pubDate>Mon, 21 Dec 2015 23:38:29 +0000</pubDate><guid>https://blog.boochtek.com/posts/face-your-fears/</guid><description>&lt;p&gt;I&amp;rsquo;ve always been someone who faces my fears.&lt;/p&gt;
&lt;p&gt;I have a moderate case of arachnophobia. I don&amp;rsquo;t run away when I see a spider, but it creeps my out when one is crawling on me. When I was in college, I decided to buy a tarantula to attempt to get over my irrational fear of spiders. I thought I&amp;rsquo;d be able to get more comfortable with the tarantula over time, eventually to the point of letting it crawl on my arm. It didn&amp;rsquo;t work. Although I did find that my fear of tarantulas is rational &amp;mdash; I got a terrible case of hives just from touching the &lt;a href="https://en.wikipedia.org/wiki/Urticating_hair"&gt;urticating hairs&lt;/a&gt; that fell off into its water sponge.&lt;/p&gt;</description></item><item><title>Encouragement</title><link>https://blog.boochtek.com/posts/encouragement/</link><pubDate>Tue, 15 Dec 2015 23:00:22 +0000</pubDate><guid>https://blog.boochtek.com/posts/encouragement/</guid><description>&lt;p&gt;I&amp;rsquo;ve been on vacation the past week, in Cozumel, Mexico. One day, we went on an excursion called Xenotes. A cenote (say-NO-tay) is a sinkhole filled with fresh water. (The &amp;ldquo;X&amp;rdquo; is to give it a more Mayan-sounding trademarkable name.) We had a lot of fun swimming, kayaking, and zip-lining. A bilingual tour guide led our group, which consisted of people from across the US and South America, of various ages and physical abilities.&lt;/p&gt;</description></item><item><title>The Ultimate Optimization</title><link>https://blog.boochtek.com/posts/ultimate-optimization/</link><pubDate>Sun, 06 Dec 2015 23:28:43 +0000</pubDate><guid>https://blog.boochtek.com/posts/ultimate-optimization/</guid><description>&lt;p&gt;I got my first computer in 1984. It was a Commodore 64. I had to do extra chores and save up my allowance to buy it. I was 13.&lt;/p&gt;
&lt;p&gt;Back then, Sears and other retail stores had Commodore 64 computers out on display. Whenever I went to the store, I&amp;rsquo;d write a short BASIC program and leave it running on the display computers:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;10 PRINT &amp;quot;CRAIG IS GREAT!&amp;quot;
20 GOTO 10
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Hey, I was a 13-year-old kid. Later, I got a little more sophisticated. I&amp;rsquo;d change the background color instead. I still remember the POKE address:&lt;/p&gt;</description></item><item><title>Show and Tell</title><link>https://blog.boochtek.com/posts/show-and-tell/</link><pubDate>Tue, 24 Nov 2015 23:21:06 +0000</pubDate><guid>https://blog.boochtek.com/posts/show-and-tell/</guid><description>&lt;p&gt;I&amp;rsquo;m wrapping up my current consulting gig at Mercy in December, and starting a new gig at CenturyLink. I&amp;rsquo;m a software developer, but that&amp;rsquo;s only a part of what I do. What I really do is join a team and help them improve the way they work &amp;mdash; both their processes and their technical skills.&lt;/p&gt;
&lt;p&gt;I think this is a key differentiator for me as a consultant. Most consultants (and Agile coaches) come in and tell people what to do. I don&amp;rsquo;t like to just tell people what to do. I&amp;rsquo;d much prefer to work side-by-side with them, getting a better understanding of what their challenges are. Once I have a better understanding of the challenges, I&amp;rsquo;m able to better brainstorm some ideas to try. Then we can experiment to see what will work and what won&amp;rsquo;t.&lt;/p&gt;</description></item><item><title>Happiness Retrospective</title><link>https://blog.boochtek.com/posts/happiness-retrospective/</link><pubDate>Mon, 09 Nov 2015 23:56:58 +0000</pubDate><guid>https://blog.boochtek.com/posts/happiness-retrospective/</guid><description>&lt;p&gt;I facilitated a retrospective today; it was one of the best retros I&amp;rsquo;ve ever been involved with. I figured out what activities I wanted to do earlier in the morning. They were really quite simple. I wanted to focus on happiness.&lt;/p&gt;
&lt;h2 id="how-happy-are-you-at-work"&gt;How happy are you at work?&lt;/h2&gt;
&lt;p&gt;I started with two questions that I&amp;rsquo;ve used with teams before, to some success (although not so successful for one particular team). The first question I asked was &amp;ldquo;How happy are you at work?&amp;rdquo; I had them put a rating from 0 to 10, with 0 meaning they should have quit last week, and 10 meaning they couldn&amp;rsquo;t imaging being happier at work.&lt;/p&gt;</description></item><item><title>Impromptu Retrospective</title><link>https://blog.boochtek.com/posts/impromptu-retrospective/</link><pubDate>Mon, 02 Nov 2015 21:44:44 +0000</pubDate><guid>https://blog.boochtek.com/posts/impromptu-retrospective/</guid><description>&lt;p&gt;I&amp;rsquo;m surprised that I haven&amp;rsquo;t gotten this story down in print before. It&amp;rsquo;s something I&amp;rsquo;ve mentioned many times &amp;mdash; including a few times on &lt;a href="http://www.thisagilelife.com"&gt;the podcast&lt;/a&gt;. It&amp;rsquo;s a great story about the power of retrospectives, and it&amp;rsquo;s a great story about the power of a blameless post-mortem.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t recall all the specifics at this point. It was about 5 years ago. I&amp;rsquo;d just noticed that Arun had made some sort of mistake. That&amp;rsquo;s fine, people make mistakes. The thing that was different about his mistake was that I had made the same mistake about a week prior. And &lt;a href="http://dirtyinformation.com"&gt;Amos&lt;/a&gt; had made the same mistake about a week before that.&lt;/p&gt;</description></item><item><title>The Problem With Estimates</title><link>https://blog.boochtek.com/posts/no-estimates/</link><pubDate>Mon, 28 Sep 2015 22:39:41 +0000</pubDate><guid>https://blog.boochtek.com/posts/no-estimates/</guid><description>&lt;p&gt;I&amp;rsquo;m a big proponent of Agile (mostly XP; I&amp;rsquo;m mostly anti-Scrum) and I&amp;rsquo;ve contributed some to the #noestimates &amp;ldquo;movement&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t really mean that nobody should ever estimate anything. I mean that I&amp;rsquo;ve never seen useful (fine-grained) estimates anywhere. Here are some of the problems with estimates that I&amp;rsquo;ve seen frequently:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;We&amp;rsquo;re not good at estimating how long things will take. We&amp;rsquo;re usually optimistic about how quickly we can get things done, and almost always miss thinking about things that will take more time. I&amp;rsquo;ve never seen a case where a project is completed more quickly than estimated. I&amp;rsquo;ve only rarely seen fine-grained (story-level) tasks completed more quickly than estimated.&lt;/li&gt;
&lt;li&gt;Management asks for estimates and then treats them as deadlines. The team then learns to inflate their estimates. Then management learns to reduce the estimates they&amp;rsquo;re given. Given fudge factors in each direction, the estimate no longer has much reliability. Even if you&amp;rsquo;re using story points, the point inflation/deflation leads to less consistency and therefore reduced reliability.&lt;/li&gt;
&lt;li&gt;Estimates that are given are negotiated down, or simply reduced. This leads to the question why you&amp;rsquo;d ask for an estimate and not take the answer provided. If you&amp;rsquo;re not going to listen to the answer, why are you asking the question? This is probably the craziest one on the list &amp;mdash; given my first point, increasing an estimate would make sense. Reducing the estimates is just magical wishful thinking.&lt;/li&gt;
&lt;li&gt;Plans change and work is added, but the deadline (presumably based on the estimates) is not changed to correspond with the extra work involved. So again, you&amp;rsquo;re not actually even using the estimates that were given.&lt;/li&gt;
&lt;li&gt;Management dictates deadlines arbitrarily, without speaking to the people who will be doing the work. Spending time estimating how long each task will take when the deadline is already set is completely pointless.&lt;/li&gt;
&lt;li&gt;Almost every deadline is complete bullshit, based on nothing. Often the excuse is that marketing needs to know when something will come out, so that they can let people know about it. Why they need to know the exact release date way in advance, I&amp;rsquo;ve never been able to figure out. Many people intuitively know that the deadlines are bullshit, and will likely be allowed to slip. The only exception to bullshit deadlines I&amp;rsquo;ve come across are regulatory deadlines.&lt;/li&gt;
&lt;li&gt;Estimation at a fine-grained level isn&amp;rsquo;t necessary. Many Agile teams estimate using story points, and determine a conversion from story points to time based on previous empirical data. This is fine, except that the time spent estimating the story is wasted time &amp;mdash; counting the number of stories almost always gives the same predictive power. Teams tend to get better at breaking up stories over time, so that they&amp;rsquo;re more consistent in size, so this becomes more likely over time.&lt;/li&gt;
&lt;li&gt;The ultimate purpose of an estimate is to evaluate whether the proposed work will be profitable, and therefore worth doing. Or to compare the ROI (return on investment) between alternative projects. But to know that, you&amp;rsquo;ll have to know what value that work will provide. I don&amp;rsquo;t believe I&amp;rsquo;ve ever seen that done &amp;mdash; at least not at a fine-grained level. Usually by the time you&amp;rsquo;re asked to estimate, the project has already gotten approval to proceed.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I&amp;rsquo;ll note that most of these pit management against the team, instead of working together toward a common cause. Most of the practices also lead to seriously demoralizing the team. And most of the time, the estimates aren&amp;rsquo;t really even taken into account very much.&lt;/p&gt;</description></item><item><title>Website Checklist</title><link>https://blog.boochtek.com/posts/website-checklist-2/</link><pubDate>Tue, 08 Sep 2015 22:38:02 +0000</pubDate><guid>https://blog.boochtek.com/posts/website-checklist-2/</guid><description>&lt;p&gt;While creating a web page isn&amp;rsquo;t too difficult, there are a lot of moving parts involved in creating an effective website. We&amp;rsquo;ve written up this checklist as a guide for anyone who has decided that they need a website.&lt;/p&gt;
&lt;p&gt;This list is for a basic static website. A web application will require significantly more effort. We&amp;rsquo;re working on a separate checklist for web apps.&lt;/p&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Determine your goals&lt;/li&gt;
&lt;li&gt;Develop a business plan&lt;/li&gt;
&lt;li&gt;Register a domain name&lt;/li&gt;
&lt;li&gt;Set up DNS hosting&lt;/li&gt;
&lt;li&gt;Set up web hosting&lt;/li&gt;
&lt;li&gt;Design and develop the site&lt;/li&gt;
&lt;li&gt;Deploy and test the site&lt;/li&gt;
&lt;li&gt;Market your site&lt;/li&gt;
&lt;li&gt;Set up additional services&lt;/li&gt;
&lt;li&gt;Maintenance&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="goals"&gt;Goals&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;What do you want to achieve from having the site?&lt;/li&gt;
&lt;li&gt;What &amp;ldquo;call to action&amp;rdquo; do you want visitors to take?&lt;/li&gt;
&lt;li&gt;How will you measure success?&lt;/li&gt;
&lt;li&gt;What will be the focus of the site?
&lt;ul&gt;
&lt;li&gt;Info (&amp;ldquo;brochure&amp;rdquo;) for an existing business&lt;/li&gt;
&lt;li&gt;Blogging&lt;/li&gt;
&lt;li&gt;Sales&lt;/li&gt;
&lt;li&gt;Community&lt;/li&gt;
&lt;li&gt;Web app&lt;/li&gt;
&lt;li&gt;Mobile app&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="business-plan"&gt;Business Plan&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Who is your target audience?&lt;/li&gt;
&lt;li&gt;Marketing
&lt;ul&gt;
&lt;li&gt;How will you get them to come to your site?&lt;/li&gt;
&lt;li&gt;How will you get them to buy something?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Who is your competition?
&lt;ul&gt;
&lt;li&gt;How do you compare to them?&lt;/li&gt;
&lt;li&gt;How do you differentiate from them?&lt;/li&gt;
&lt;li&gt;What is your niche?&lt;/li&gt;
&lt;li&gt;What makes your site better than theirs?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;How will you make money?
&lt;ul&gt;
&lt;li&gt;Bringing people into brick and mortar business&lt;/li&gt;
&lt;li&gt;Advertising&lt;/li&gt;
&lt;li&gt;Periodic billing/subscriptions&lt;/li&gt;
&lt;li&gt;Selling goods/services&lt;/li&gt;
&lt;li&gt;Get bought out&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Pricing
&lt;ul&gt;
&lt;li&gt;Aim high &amp;mdash; it&amp;rsquo;s easier to lower prices than raise them&lt;/li&gt;
&lt;li&gt;Tiered pricing often makes sense; most people pick the middle tier&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;What will it take to have a positive ROI?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="domain-name"&gt;Domain Name&lt;/h2&gt;
&lt;p&gt;You&amp;rsquo;ll probably want your own domain name.&lt;/p&gt;</description></item><item><title>Potential F5 Vulnerability</title><link>https://blog.boochtek.com/posts/potential-f5-vulnerability/</link><pubDate>Mon, 31 Aug 2015 22:52:53 +0000</pubDate><guid>https://blog.boochtek.com/posts/potential-f5-vulnerability/</guid><description>&lt;p&gt;It all started with an email about a WebInspect report. It listed a buffer overflow, which we had marked as a false positive. I read the WebInspect report carefully, and found a note at the bottom that said you could test manually to confirm whether it was a false positive or not. Unfortunately, the manual test listed had a few problems. First, it jammed the lines together, without the proper line-breaks. Second, it assumed the site was using HTTP, not HTTPS, so used &lt;code&gt;telnet&lt;/code&gt;. Third, it was testing against a page that didn&amp;rsquo;t exist, giving a 404. Keeping those in mind, I tried the manual test using the &lt;code&gt;openssl s_client&lt;/code&gt; command:&lt;/p&gt;</description></item><item><title>Not Quite Callbacks</title><link>https://blog.boochtek.com/posts/not-quite-callbacks/</link><pubDate>Mon, 22 Jun 2015 23:55:17 +0000</pubDate><guid>https://blog.boochtek.com/posts/not-quite-callbacks/</guid><description>&lt;p&gt;I&amp;rsquo;ve been working on application architectures based on &lt;a href="http://confreaks.tv/videos/rubymidwest2011-keynote-architecture-the-lost-years"&gt;Uncle Bob&amp;rsquo;s Ruby Midwest talk&lt;/a&gt;, following the &lt;a href="http://alistair.cockburn.us/Hexagonal+architecture"&gt;hexagonal architectural pattern&lt;/a&gt;. I posted &lt;a href="https://blog.boochtek.com/posts/2015/02/23/hexagonal-rails-controllers"&gt;an article a couple months ago showing a way that works fairly well in Rails&lt;/a&gt;, and some &lt;a href="https://github.com/boochtek/hexagonal-rails"&gt;accompanying Rails example code&lt;/a&gt;. But there was one thing I wasn&amp;rsquo;t quite happy with.&lt;/p&gt;
&lt;p&gt;The problem is that we used callbacks (actually, a publish/subscribe mechanism) in a situation where they don&amp;rsquo;t seem to quite fit:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; def show
interactor.on(:display) { |order| render order }
interactor.on(:not_found) { |order_id| render status: 404 }
interactor.get(params[:id])
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;What we really want is to respond in different ways, depending on the result of the call to &lt;code&gt;interactor.get()&lt;/code&gt;. There&amp;rsquo;s no good reason to define the responses before the call. It makes a lot more sense to define the responses after the call, because they&amp;rsquo;ll &lt;strong&gt;happen&lt;/strong&gt; after the call. I&amp;rsquo;d much prefer that the code be written in the order that it will be run.&lt;/p&gt;</description></item><item><title>Architectural Thoughts</title><link>https://blog.boochtek.com/posts/architectural-thoughts/</link><pubDate>Mon, 01 Jun 2015 23:51:59 +0000</pubDate><guid>https://blog.boochtek.com/posts/architectural-thoughts/</guid><description>&lt;p&gt;I&amp;rsquo;ve started working on my own framework in Ruby in the past couple days. It&amp;rsquo;s built upon my recent work at understanding &lt;a href="http://confreaks.tv/videos/rubymidwest2011-keynote-architecture-the-lost-years"&gt;Uncle Bob&amp;rsquo;s Ruby Midwest 2011 talk&lt;/a&gt;, and his article on &lt;a href="http://blog.8thlight.com/uncle-bob/2012/08/13/the-clean-architecture.html"&gt;Clean Architecture&lt;/a&gt;, and the resulting hexagonal architecture (AKA ports and adapters).&lt;/p&gt;
&lt;p&gt;Somehow my research in that vein led me to &lt;a href="https://www.destroyallsoftware.com/talks/boundaries"&gt;Gary Bernhardt&amp;rsquo;s Boundaries talk&lt;/a&gt;. I&amp;rsquo;ve read a lot about the talk, and knew about the idea of &amp;ldquo;functional core / imperative shell&amp;rdquo;. And I&amp;rsquo;ve worked with a lot of similar ideas lately. But I believe this is the first time that I actually watched the whole video.&lt;/p&gt;</description></item><item><title>From Agile To Happiness</title><link>https://blog.boochtek.com/posts/agile-to-happiness/</link><pubDate>Mon, 18 May 2015 23:33:11 +0000</pubDate><guid>https://blog.boochtek.com/posts/agile-to-happiness/</guid><description>&lt;p&gt;The &lt;a href="http://agilemanifesto.org"&gt;Agile Manifesto&lt;/a&gt; was written in 2001, as a way to explain the common values amongst several &amp;ldquo;light-weight&amp;rdquo; software development methodologies that had come about. The term &amp;ldquo;Agile&amp;rdquo; was chosen as a shorthand for those commonalities.&lt;/p&gt;
&lt;p&gt;Once &amp;ldquo;Agile&amp;rdquo; started to show success, we started to see many people use the term to market their products and services, whether or not they really believed in the values and principles of the Agile Manifesto. It&amp;rsquo;s gotten to the point where some of us don&amp;rsquo;t see much value in using the term &amp;ldquo;Agile&amp;rdquo; any more. Even some of those involved in creating the manifesto have suggested new terms. Dave Thomas &lt;a href="http://pragdave.me/blog/2014/03/04/time-to-kill-agile/"&gt;suggests&lt;/a&gt; &amp;ldquo;Agility&amp;rdquo; and Andy Hunt has started working on something called &lt;a href="http://growsmethod.com/"&gt;GROWS&lt;/a&gt;. Personally, I&amp;rsquo;m considering going back to the term &amp;ldquo;Extreme Programming&amp;rdquo;, even though I&amp;rsquo;ve incorporated ideas from other Agile methodologies.&lt;/p&gt;</description></item><item><title>When Should We Do TDD?</title><link>https://blog.boochtek.com/posts/when-tdd/</link><pubDate>Mon, 11 May 2015 23:43:05 +0000</pubDate><guid>https://blog.boochtek.com/posts/when-tdd/</guid><description>&lt;p&gt;On a recent episode (&lt;a href="http://www.thisagilelife.com/78/"&gt;78&lt;/a&gt;) of &lt;a href="http://www.thisagilelife.com"&gt;This Agile Life&lt;/a&gt;, my fellow hosts talked about when to do Test-Driven Development (TDD). They all said that you should always do TDD &amp;mdash; at least for anything that will go into production; there&amp;rsquo;s an exception for experimenting or &amp;ldquo;spiking&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;I wasn&amp;rsquo;t on that episode, but later commented on the topic. (Episode 83 &amp;mdash; which wasn&amp;rsquo;t really all that great.) My take was slightly different. I said that you should do TDD only when the benefits outweigh the costs. Unfortunately, we usually greatly underestimate the benefits. And the costs often seem high at first, because it takes some time to get good at writing automated tests. Not to mention that both the costs and the benefits are usually hard to measure.&lt;/p&gt;</description></item><item><title>Good Enough</title><link>https://blog.boochtek.com/posts/good-enough/</link><pubDate>Mon, 04 May 2015 23:03:01 +0000</pubDate><guid>https://blog.boochtek.com/posts/good-enough/</guid><description>&lt;p&gt;I ran into some former colleagues recently, from a company where I had worked to help transform the team to be more Agile. They&amp;rsquo;ve gone through some reorganization and management changes recently. One of the guys said that their team culture has helped them maintain quality in the face of those changes. This struck me as odd, since I had considered the work I had done there as somewhat of a disappointment. While I felt I had made a small dent, I didn&amp;rsquo;t feel like I&amp;rsquo;d made a true Agile transformation. Much of what I had taught didn&amp;rsquo;t seem to &amp;ldquo;stick&amp;rdquo;.&lt;/p&gt;</description></item><item><title>The Power of 1%</title><link>https://blog.boochtek.com/posts/one-percent/</link><pubDate>Mon, 27 Apr 2015 23:11:55 +0000</pubDate><guid>https://blog.boochtek.com/posts/one-percent/</guid><description>&lt;p&gt;I frequently participate in a podcast called &lt;a href="http://thisagilelife.com"&gt;This Agile Life&lt;/a&gt;. Recently, a listener asked how much time Agile teams should spend on self improvement. I said 10% to 25%, leaning towards 15% to 20% for most teams. That comes to at least one hour per day, and maybe even more than one day per week.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m including personal self improvement and team retrospectives in this self-improvement time. This can be as simple as configuring your IDE to make you more efficient, learning to use a tool better, or following up on action items from a retro.&lt;/p&gt;</description></item><item><title>Hexagonal Rails Controllers</title><link>https://blog.boochtek.com/posts/hexagonal-rails-controllers/</link><pubDate>Mon, 23 Feb 2015 23:50:28 +0000</pubDate><guid>https://blog.boochtek.com/posts/hexagonal-rails-controllers/</guid><description>&lt;p&gt;I&amp;rsquo;ve had a long love-hate relationship with Rails. I love the MVC framework and how it&amp;rsquo;s improved our speed of writing web apps. But I&amp;rsquo;ve never really been completely happy with it. I don&amp;rsquo;t generally agree with most of its opinions. I prefer models that follow the Data Mapper pattern, not the Active Record pattern. This includes separating the persistence layer from the models&amp;rsquo; business logic. I prefer Slim or HAML to ERB. I prefer RSpec to Test::Unit or MiniTest. When Merb hit the scene, I was ready to make the jump, until Merb merged with Rails.&lt;/p&gt;</description></item><item><title>Resolutions</title><link>https://blog.boochtek.com/posts/resolutions/</link><pubDate>Mon, 02 Feb 2015 23:42:13 +0000</pubDate><guid>https://blog.boochtek.com/posts/resolutions/</guid><description>&lt;p&gt;January kept me pretty busy, so I&amp;rsquo;m a little late to this. But better late than never. And as an Agile practitioner, I don&amp;rsquo;t think personal retrospectives should be limited to one time of year.&lt;/p&gt;
&lt;h1 id="review-of-2014"&gt;Review of 2014&lt;/h1&gt;
&lt;p&gt;Last year I wrote a blog entry listing &lt;a href="https://blog.boochtek.com/posts/2014/01/04/open-source-resolutions"&gt;my goals for 2014&lt;/a&gt;. As far as New Year&amp;rsquo;s resolutions go, I was relatively successful &amp;mdash; about 50% of my goals accomplished. Unfortunately, my Open Source contributions weren&amp;rsquo;t as strong as I had hoped; while I released some of my own work, I didn&amp;rsquo;t do much else. I did increase my blogging; getting in on a weekly blogging pact helped immensely. I also increased my participation on the &lt;a href="http://thisagilelife.com/"&gt;This Agile Life podcast&lt;/a&gt; to a level that I&amp;rsquo;m happy with. But the accomplishment I&amp;rsquo;m most proud of was giving a &lt;a href="https://www.youtube.com/watch?v=hc_wtllfKtQ"&gt;presentation at RubyConf&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>TDD Is Alive And Well</title><link>https://blog.boochtek.com/posts/tdd-is-alive-and-well/</link><pubDate>Mon, 05 May 2014 23:50:07 +0000</pubDate><guid>https://blog.boochtek.com/posts/tdd-is-alive-and-well/</guid><description>&lt;p&gt;I went to RailsConf this year, and the very first talk was a &lt;a href="http://www.confreaks.com/videos/3315-railsconf-keynote-writing-software"&gt;keynote by&lt;/a&gt; &lt;a href="http://www.confreaks.com/videos/3315-railsconf-keynote-writing-software"&gt;David Heinemeier Hansson (DHH)&lt;/a&gt;, the creator of Ruby on Rails. The TL;DR of his talk was &amp;ldquo;TDD rarely has value&amp;rdquo;. He followed up with a blog post the next day, titled &amp;ldquo;&lt;a href="http://david.heinemeierhansson.com/2014/tdd-is-dead-long-live-testing.html"&gt;TDD is dead. Long live testing.&lt;/a&gt;&amp;rdquo;, and &lt;a href="http://david.heinemeierhansson.com/2014/test-induced-design-damage.html"&gt;2 more&lt;/a&gt; &lt;a href="http://david.heinemeierhansson.com/2014/slow-database-test-fallacy.html"&gt;posts&lt;/a&gt;. I think this line of thought is terribly misguided, and causing more harm than good. This article is my response.&lt;/p&gt;</description></item><item><title>Ruby Pattern: Parameterized Module Inclusion</title><link>https://blog.boochtek.com/posts/ruby-parameterized-module-inclusion/</link><pubDate>Mon, 14 Apr 2014 23:57:29 +0000</pubDate><guid>https://blog.boochtek.com/posts/ruby-parameterized-module-inclusion/</guid><description>&lt;p&gt;I&amp;rsquo;ve run across a pattern in Ruby lately that I really like. It solves some problems that I&amp;rsquo;ve struggled with for several years. Let me start with the problems.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s say you want to include an ORM in a model class, and want to tell it what database table to use. Typically, you&amp;rsquo;d do this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class User
include MyORM::Model
table 'people'
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;But that &lt;code&gt;table&lt;/code&gt; call is more like an option to the module inclusion than anything else. So what we&amp;rsquo;d really like is something like this:&lt;/p&gt;</description></item><item><title>Brilliant – My Very Own Programming Language</title><link>https://blog.boochtek.com/posts/brilliant-my-own-programming-language/</link><pubDate>Sun, 30 Mar 2014 23:25:38 +0000</pubDate><guid>https://blog.boochtek.com/posts/brilliant-my-own-programming-language/</guid><description>&lt;p&gt;I&amp;rsquo;ve decided to design and implement my own programming language, and call it &lt;a href="https://github.com/BoochTek/brilliant"&gt;Brilliant&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been interested in programming languages and linguistics almost as long as I&amp;rsquo;ve been using computers. I&amp;rsquo;ve long thought that if I ever go back to college, it&amp;rsquo;s likely that I&amp;rsquo;ll concentrate on programming languages as a specialty.&lt;/p&gt;
&lt;p&gt;My recent discovery and involvement with the &lt;a href="http://crystal-lang.org/"&gt;Crystal&lt;/a&gt; programming language has gotten me excited about new language ideas. It&amp;rsquo;s also helped me realize that implementing a language myself is feasible, and that there&amp;rsquo;s no better time to start than now.&lt;/p&gt;</description></item><item><title>Estimation Isn’t Agile</title><link>https://blog.boochtek.com/posts/agile-estimation/</link><pubDate>Sun, 23 Mar 2014 23:02:28 +0000</pubDate><guid>https://blog.boochtek.com/posts/agile-estimation/</guid><description>&lt;p&gt;I don&amp;rsquo;t believe that estimation should be part of any Agile practice.&lt;/p&gt;
&lt;p&gt;One of our managers recently mentioned that we hadn&amp;rsquo;t met the &amp;ldquo;contract&amp;rdquo; that we had &amp;ldquo;committed&amp;rdquo; to in our last iteration. This was complete nonsense, because A) we hadn&amp;rsquo;t made any such commitments, and B) we completed many more story points than the previous iterations (and without inflating story points).&lt;/p&gt;
&lt;p&gt;&lt;img alt="estimates-as-deadlines" loading="lazy" src="https://blog.boochtek.com/images/estimates-as-deadlines.png"&gt;&lt;/p&gt;
&lt;p&gt;But her language made me come to several realizations. First and foremost, estimates are contracts. Sure, they&amp;rsquo;re not &lt;strong&gt;supposed&lt;/strong&gt; to be treated as commitments, but they almost always are. And what does the &lt;a href="http://agilemanifesto.org/"&gt;Agile Manifesto&lt;/a&gt; say about this? It says that we should value customer collaboration over contract negotiation, and responding to change over following a plan. So it&amp;rsquo;s pretty clear that treating estimates as commitments is completely counter to the Agile values.&lt;/p&gt;</description></item><item><title>Slow Down!</title><link>https://blog.boochtek.com/posts/slow-down/</link><pubDate>Sun, 16 Mar 2014 23:14:45 +0000</pubDate><guid>https://blog.boochtek.com/posts/slow-down/</guid><description>&lt;p&gt;There&amp;rsquo;s a tweet that I saw recently, with some simple advice for novice programmers:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Slow down.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is probably good advice for most programmers. Our team recently noticed that every time we try to rush things, we make mistakes. And the mistakes end up costing us more time than if we had just done things at our normal pace. Slowing down ensures that you do things right, and when you do things right, you end up with a higher-quality product.&lt;/p&gt;</description></item><item><title>Burying the Lede</title><link>https://blog.boochtek.com/posts/readable-shell-scripts/</link><pubDate>Tue, 11 Mar 2014 23:28:22 +0000</pubDate><guid>https://blog.boochtek.com/posts/readable-shell-scripts/</guid><description>&lt;p&gt;Most of us don&amp;rsquo;t write very readable shell scripts. There are plenty of things we could do better, but today I want to talk about one in particular &amp;mdash; burying the lede.&lt;/p&gt;
&lt;p&gt;The term &amp;ldquo;burying the lede&amp;rdquo; comes from the field of journalism. Here&amp;rsquo;s the &lt;a href="http://en.wiktionary.org/wiki/bury_the_lede"&gt;Wiktionary definition&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;To begin a story with details of secondary importance to the reader while postponing more essential points or facts.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Like a good news article, code should tell a story. And the story should start with what&amp;rsquo;s most important. In the case of code, the most important information is the high-level functionality &amp;mdash; a succinct summary of what the program does. In other words, write (and organize) the code top-down, as opposed to bottom-up.&lt;/p&gt;</description></item><item><title>Yak Shaving #1: Cursor Keys</title><link>https://blog.boochtek.com/posts/yak-shaving-cursor-keys/</link><pubDate>Mon, 03 Mar 2014 22:02:59 +0000</pubDate><guid>https://blog.boochtek.com/posts/yak-shaving-cursor-keys/</guid><description>&lt;p&gt;I recently decided to start using Emacs again. I used it extensively from the early 1990s until the early 2000s. I pretty much stopped using it when I had a sysadmin job with no Emacs on the servers, and no ability to install it. With the rising popularity of tmux and tmate for remote pairing, and my dislike for vim&amp;rsquo;s modes, I decided to try going back to Emacs in the terminal.&lt;/p&gt;</description></item><item><title>Chording Keyers</title><link>https://blog.boochtek.com/posts/chording-keyers/</link><pubDate>Sun, 23 Feb 2014 23:56:37 +0000</pubDate><guid>https://blog.boochtek.com/posts/chording-keyers/</guid><description>&lt;p&gt;I&amp;rsquo;m considering buying a chording keyer. A keyer is a 1-handed text input device. Chording means that you can hit more than 1 key at a time. I&amp;rsquo;ve been interested in these for a long time actually. They&amp;rsquo;ve been popular in the wearable computing (&amp;ldquo;cyborg&amp;rdquo;) field, but never caught on anywhere else. I&amp;rsquo;ve always thought that 1-handed chording keyer would be a great input device to use with a cell phone. It&amp;rsquo;d be even better with a heads-up display like the Google Glass.&lt;/p&gt;</description></item><item><title>Includable ActiveRecord</title><link>https://blog.boochtek.com/posts/includable-activerecord/</link><pubDate>Mon, 10 Feb 2014 12:09:53 +0000</pubDate><guid>https://blog.boochtek.com/posts/includable-activerecord/</guid><description>&lt;p&gt;I created a Ruby gem recently, called &lt;a href="https://github.com/boochtek/includable-activerecord"&gt;includable-activerecord&lt;/a&gt;. It&amp;rsquo;s pretty small, but I thought I might explain why I created it, and discuss its implementation.&lt;/p&gt;
&lt;h1 id="classical-inheritance"&gt;Classical Inheritance&lt;/h1&gt;
&lt;p&gt;When you use ActiveRecord, you normally include it in your model like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class User &amp;lt; ActiveRecord::Base
# ...
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Your &lt;code&gt;User&lt;/code&gt; class is inheriting from the &lt;code&gt;ActiveRecord::Base&lt;/code&gt; class. This is class-based inheritance, also called &amp;ldquo;classical&amp;rdquo; inheritance. (That&amp;rsquo;s &amp;ldquo;classical&amp;rdquo; as in &amp;ldquo;class&amp;rdquo;, not as a synonym for &amp;ldquo;traditional&amp;rdquo;.) Class-based inheritance represents an &amp;ldquo;is-a&amp;rdquo; relationship. So we&amp;rsquo;re saying that a user is an ActiveRecord base. Another way to say this is that &lt;code&gt;User&lt;/code&gt; is a subclass of &lt;code&gt;ActiveRecord::Base.&lt;/code&gt;&lt;br&gt;
&lt;br&gt;
There are a few problems with this. First, what is a &amp;ldquo;base&amp;rdquo;? The name was chosen because it&amp;rsquo;s a base class. But just like we don&amp;rsquo;t give factory classes names like &lt;code&gt;UserFactory&lt;/code&gt; (at least not in Ruby), we shouldn&amp;rsquo;t name base classes &lt;code&gt;Base&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Empathy</title><link>https://blog.boochtek.com/posts/empathy/</link><pubDate>Fri, 07 Feb 2014 21:23:48 +0000</pubDate><guid>https://blog.boochtek.com/posts/empathy/</guid><description>&lt;p&gt;I facilitated our team retrospective this morning. I felt like we made a little forward progress, but not as much as I would have liked. But it really brought one thing to the forefront of my thoughts today &amp;mdash; empathy gained through communication.&lt;/p&gt;
&lt;p&gt;We have a pretty large team by Agile standards &amp;mdash; we had 20 people in our retro: 16 developers, 3 QA folks, and 1 manager. Out of those, only about 5 or 6 speak up regularly. I recently sent out a survey to the team, trying to get feedback on how we could improve our retros. A couple of the questions tried to get a feel for why people aren&amp;rsquo;t speaking up more. Only about half the people responded, and the answers didn&amp;rsquo;t really answer my question as well as I had hoped.&lt;/p&gt;</description></item><item><title>What I Want in a Blog Engine</title><link>https://blog.boochtek.com/posts/blogging-software/</link><pubDate>Sun, 02 Feb 2014 22:50:43 +0000</pubDate><guid>https://blog.boochtek.com/posts/blogging-software/</guid><description>&lt;p&gt;I&amp;rsquo;m considering moving away from &lt;a href="http://wordpress.org"&gt;WordPress&lt;/a&gt;, for a couple reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Security. There have been several vulnerabilities over the past few years, and I&amp;rsquo;ve never really had a high level of confidence that it&amp;rsquo;s secure. In addition, I now find the whole PHP model &amp;mdash; every web app running as a single user, instead of leveraging UNIX permissions &amp;mdash; to be broken.&lt;/li&gt;
&lt;li&gt;Speed. I started to realize a couple years ago that a blog engine should generate static pages. The static pages should be updated whenever new content is added. There&amp;rsquo;s really no reason to re-generate the page every time someone wants to read it. At the very least, Server-Side Includes (&lt;a href="https://en.wikipedia.org/wiki/Server_Side_Includes"&gt;SSI&lt;/a&gt;) or Edge-Side Includes (&lt;a href="https://en.wikipedia.org/wiki/Edge_Side_Includes"&gt;ESI&lt;/a&gt;) should be used.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now that I&amp;rsquo;m starting to actually blog consistently, it makes sense to change. But before I move to something different, I want to be sure that I find all the features that I need. This post is my thought process about what I want.&lt;/p&gt;</description></item><item><title>Testing Rails Validators</title><link>https://blog.boochtek.com/posts/testing-rails-validators/</link><pubDate>Sun, 26 Jan 2014 23:27:07 +0000</pubDate><guid>https://blog.boochtek.com/posts/testing-rails-validators/</guid><description>&lt;p&gt;It&amp;rsquo;s challenging to test Rails custom validators.&lt;/p&gt;
&lt;p&gt;I recently had to write a validator to require that an entered date is before or after a specified date.&lt;/p&gt;
&lt;p&gt;It didn&amp;rsquo;t seem like writing the validator would be too difficult &amp;ndash; I&amp;rsquo;ve written custom validators before, and date comparisons aren&amp;rsquo;t all that tricky. But when it came time to write the tests, I ran into several issues. And since I always try to follow TDD / test-first, I was blocked before I even began.&lt;/p&gt;</description></item><item><title>Introspective</title><link>https://blog.boochtek.com/posts/introspective/</link><pubDate>Sun, 19 Jan 2014 15:15:26 +0000</pubDate><guid>https://blog.boochtek.com/posts/introspective/</guid><description>&lt;p&gt;Today I was informed that I&amp;rsquo;ve been impeding progress on our team.&lt;br&gt;
This was somewhat shocking, since I feel like I&amp;rsquo;m always pushing&lt;br&gt;
forward to make our team and myself better.&lt;/p&gt;
&lt;p&gt;Like most anyone, my initial reaction to criticism was defensiveness.&lt;br&gt;
I don&amp;rsquo;t handle criticism well. (You might find that hard to believe,&lt;br&gt;
after reading the rest of this post. Maybe it&amp;rsquo;s just the confrontation&lt;br&gt;
part I don&amp;rsquo;t handle well.) Thankfully the blow was softened somewhat,&lt;br&gt;
because the person providing the criticism didn&amp;rsquo;t tell me directly &amp;mdash;&lt;br&gt;
they told &lt;a href="http://dirtyinformation.com/" title="Dirty Information (Amos' blog)"&gt;Amos&lt;/a&gt;, a trusted colleague of mine. Amos then passed it on to&lt;br&gt;
me. I&amp;rsquo;m grateful for that &amp;mdash; this is the best way for me to have received&lt;br&gt;
that criticism.&lt;/p&gt;</description></item><item><title>What’s Your Open Source Resolution?</title><link>https://blog.boochtek.com/posts/open-source-resolutions/</link><pubDate>Sat, 04 Jan 2014 23:02:42 +0000</pubDate><guid>https://blog.boochtek.com/posts/open-source-resolutions/</guid><description>&lt;p&gt;I&amp;rsquo;ve been using GNU/Linux since 1994, starting with a Slackware 2.2 CD-ROM I ordered from the back of a magazine. I&amp;rsquo;ve been heavily involved in my local GNU/Linux community since 1999, and I give frequent presentations at various groups. I&amp;rsquo;ve made some small contributions to several Open Source projects.&lt;/p&gt;
&lt;p&gt;But I don&amp;rsquo;t feel like I&amp;rsquo;ve done enough to contribute to the wider community. So this year, I&amp;rsquo;m going to resolve to step up my contributions, and do more.&lt;/p&gt;</description></item><item><title>My Thoughts on Python vs. Ruby</title><link>https://blog.boochtek.com/posts/my-thoughts-on-python-vs-ruby/</link><pubDate>Fri, 22 Feb 2013 11:03:06 +0000</pubDate><guid>https://blog.boochtek.com/posts/my-thoughts-on-python-vs-ruby/</guid><description>&lt;p&gt;I&amp;rsquo;ve been using Python at work for the past few months.  I learned Python back in the early 2000s, but never used it for any large projects.  I learned Ruby in late 2005, and it quickly became my language of choice for most cases.&lt;/p&gt;
&lt;p&gt;So while I still prefer Ruby, and will likely use Ruby more in the future than Python, I wanted to assess the strengths and weaknesses of Python in relation to Ruby.  Perhaps some of the lessons could be applied when writing Ruby, and it could help to decide when to use each.  Also, I&amp;rsquo;m interested in programming language design, and wanted to document pros and cons in that light.&lt;/p&gt;</description></item><item><title>Debugging Pattern – Grenade</title><link>https://blog.boochtek.com/posts/grenade-debugging-pattern/</link><pubDate>Wed, 11 Jan 2012 18:59:59 +0000</pubDate><guid>https://blog.boochtek.com/posts/grenade-debugging-pattern/</guid><description>&lt;p&gt;I&amp;rsquo;ve been more interested in programming patterns lately, partly due to the&lt;br&gt;
Ruby community&amp;rsquo;s recent interest &amp;mdash; especially the Ruby Rogue podcast&amp;rsquo;s&lt;br&gt;
love affair with &amp;ldquo;Smalltalk Best Practice Patterns&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;I consider most of the patterns in &amp;ldquo;Smalltalk Best Practice Patterns&amp;rdquo; to be&lt;br&gt;
patterns &amp;ldquo;in the small&amp;rdquo; &amp;mdash; things that are typically employed on a single line&lt;br&gt;
or method. The Gang Of Four patterns are more medium sized, dealing with methods&lt;br&gt;
and classes. The PEAA book covers architectural-scale patterns. I suppose&lt;br&gt;
&amp;ldquo;The Pragmatic Programmer&amp;rdquo; and similar books could (should!) be considered&lt;br&gt;
to be very general patterns, mostly about the practice of programming.&lt;/p&gt;</description></item><item><title>Write Comments For Yourself</title><link>https://blog.boochtek.com/posts/write-comments-for-yourself-2/</link><pubDate>Tue, 10 Jan 2012 19:02:12 +0000</pubDate><guid>https://blog.boochtek.com/posts/write-comments-for-yourself-2/</guid><description>&lt;p&gt;&lt;a href="https://github.com/adkron"&gt;Amos&lt;/a&gt; and I got in a heated discussion recently on whether we should write a single line comment to better explain some code. (The code in question was Amos&amp;rsquo;s very elegant solution to testing whether a job got sent to Resque.)&lt;/p&gt;
&lt;p&gt;Amos doesn&amp;rsquo;t believe in writing comments much at all. He thinks that if you&amp;rsquo;re writing a comment, it means that you&amp;rsquo;re doing something wrong, and that you probably need to write the code more clearly.&lt;/p&gt;</description></item><item><title>Bulk Rename in Bash</title><link>https://blog.boochtek.com/posts/bulk-rename-in-bash/</link><pubDate>Fri, 26 Aug 2011 22:53:58 +0000</pubDate><guid>https://blog.boochtek.com/posts/bulk-rename-in-bash/</guid><description>&lt;p&gt;Here&amp;rsquo;s a relatively simple way to rename a bunch of files from the command line. It uses &lt;code&gt;sed&lt;/code&gt; within a command substitution to compute the new names from the old names.&lt;/p&gt;
&lt;p&gt;In this example, we&amp;rsquo;re renaming files that start with &amp;ldquo;ABC&amp;rdquo; to start with &amp;ldquo;XYZ&amp;rdquo; instead:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; i in ABC*; &lt;span style="color:#66d9ef"&gt;do&lt;/span&gt; mv $i &lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;echo $i | sed -e s/^ABC/XYZ/&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You&amp;rsquo;ll have to use shell globbing (wildcards) in the first part, to determine which files will be the source of the renaming, and regular expressions in the second part to translate the old names into the new names.&lt;/p&gt;</description></item><item><title>Introduction</title><link>https://blog.boochtek.com/posts/introduction/</link><pubDate>Fri, 01 Jan 2010 00:01:41 +0000</pubDate><guid>https://blog.boochtek.com/posts/introduction/</guid><description>&lt;p&gt;Welcome to the BoochTek blog. BoochTek, LLC is a small web development company, based in St. Louis, Missouri. We specialize in &lt;a href="http://rubyonrails.org" title="Ruby on Rails official site"&gt;Ruby on Rails&lt;/a&gt;, &lt;a href="http://jquery.com/" title="jQuery offical site"&gt;jQuery&lt;/a&gt; (JavaScript), and &lt;a href="http://php.net" title="PHP official site"&gt;PHP&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This bog will be a place where we can share some of our experiences in web development, Open Source, programming, and technology in general.&lt;/p&gt;</description></item></channel></rss>