What do you mean when you say “Maintainability?”

I think the easiest way to tell an experienced programmer from a newcomer is to see how much they care about maintainability. New coders (and some business clients) just want to it built as fast as possible, at any cost. Coders who have been around for a while understand, however, that code of any quality spends a lot more time in maintenance than it does getting build the first time.


But there are still some disagreements on just what maintainability means. You can’t boil it down to a number, like lines of code or hours spent, so it’s not as easy to measure — and if you can’t measure it, it requires a lot more intuition and “art” to manage it. Here are a few thoughts for making decisions based on which is the more maintainable.


Maintainable Components


For almost any common programming problem, there are two or three potential solutions that are already built, and generally, a well-supported external component is more maintainable than rolling your own… usually. If the code is buggy, poorly-documented or poorly-supported, you might be better with your own home-made solution. Or, depending on the options and task, it may make more sense to take a poorly-supported, but open solution, add what it needs, and contribute the changes back.


In any case, you want your components to be reusable, reliable and, as much as possible, forgettable. If you never have to think about it, it’s doing its job just fine.


Maintainable Design


Test-driven design often calls for the “simplest change that will pass the test.”  And if you have full test coverage, it’s so much safer to refactor that it can be the wisest decision. But often the type of “organic” design that can grow out of Agile development is closer to organic fertilizer.


Maintainable design means using “just enough” design to get your job done — over-engineered code is a pain to maintain — but it also means encapsulation, smart code re-use, and appropriate application of design patterns.


Yeah, I said design patterns.  I also said, and I emphasize, appropriate use of design patterns.  I’m not talking about using a Factory to produce “Hello, World!” But design patterns are a smart way of encapsulation with maintenance in mind, and when your developers understand and use patterns, you greatly reduce the typical heavy communication overhead associated with maintenance.


Maintainable Process


This can be a major challenge for rapid-development groups because there is a way to get working code out that is faster than the most-maintainable process for the first draft or two … and some programs never get past the first draft or two. But if you have a high-output “lightweight” process that glosses over maintenance needs, it’s only a matter of time before your output of so many code chunks that require maintenance starts draining resources from your high-production plan.


There are many options for process, and it’s wise to choose one that’s appropriate for your team, your business, your industry, and your size.  Whatever process you choose, it’s essential to track new development and maintenance work, to pro-actively reduce code debt, and to plan for maintenance before you start a new project.

Finding Flow in Everyday Life

Have you ever experienced a state of confident, steady and purposeful action? This feels pretty awesome, and it turns out it has a lot of benefits, both for productivity and for happiness. It’s called “flow” or the flow state.


Flow can happen when you’re coding, building things, or even doing chores, like washing dishes or doing laundry. It is a state of supreme creativity and peak productivity. But in a paradox, if you only want to be productive, you’re going to have a hard time reaching it. In order to have this state of flow, you need to be happy starting out.


So how do you get happy to begin with? How do you stay positive when challenges arise? Both these questions have volumes dedicated to them (not to mention a few blog posts) but here are a few ideas that I’ve seen have a positive effect.


  1. Be intentionally thankful. Make it a point every day to write down one thing that you’re thankful for. It can be in a spreadsheet or a text file, or tucked away on personal hand-written notes. But every day make it a point to write down two or three things you’re thankful for. The experience will help you to recognize the good in the world.


  1. Help other people. Ideally this can be done with volunteer work, but even when you’re working, think about what you’re doing. If you’re getting paid to do something, then you’re almost certainly doing something positive for them. Try to focus on the problem you’re solving for others, and look at the work you’re doing.


  1. Leave the bad job. There’s a lot to be said for keeping an attitude in spite of challenges, be they from difficult managers or clients. But if your business is in a field, or pursuing a purpose that is inherently demoralizing to you … get out. The first time I heard this advice it struck me as fanciful. “But I’ve got kids to feed,” I thought. Truth is, the kids will get fed… but just as important as food is to have a healthy home life, with parents that can set them on a path for the right future. If your job isn’t doing that for you, then how are you going to help your kids see the right way to go?

With this happiness and a vision for your future, you’re well on your way to achieving a positive, powerful, creative flow in your life.

Why Artificial Intelligence Matters

Artificial Intelligence is Here

The science-fiction promise of AI is starting to become a reality. It has beaten humans at chess, and at Jeopardy. It is making better medical diagnoses, making better predictions, and in some cases providing real-world strategy to businesses. This is not something you read about in a magazine or watch in a movie. It is something you read about in the Wall Street Journal and watch on NBC. It is Here.


It’s Disruptive

Machines that can approach or surpass a human intellect are the single biggest change that has ever happened in the history of production. It has never been more true to say, “This changes everything.” Prepare to have your world turned upside-down.


Your Competitors are Using It

Artificial Intelligence is too big a game-changer to not be used in your industry. But it doesn’t have to just be something that your big, well-funded competitors are using. With the right strategic partner, your business can be using real AI to solve real problems. It can happen sooner than you think, and for less than you expect.

Relevance is the Best SEO Redux

In the past, I wrote an opinionated blog rant about how SEO is overrated, and how if you want to rise in search engine rankings, your only focus should be building a good product. I was looking for opinions or echoes on the net, and I found out that my radical ideas about Search Engine Optimization have already occurred to others.


Having spent the better part of a year now working in the aggregation end of a major search engine, I … I really have to take that back.  I mean, yes, being relevant is a huge boon to your search ranking, but being crawlable is necessary before you even get into the index at all! If you have a convoluted POST-based navigation or you require Flash, Acrobat or even JavaScript to navigate your site, search engines will have an uphill struggle to index your content.  Technology to do so is improving, but the bread-and-butter of search indexing is still GET-based.


Interestingly, making the right decisions to get crawled well, will also help you make good accessibility decisions, too. Have you ever looked at NoScript? It’s a firefox plugin that disables all JavaScript by default.  It’s troublesome to manually enable scripting for new sites, but in exchange you get to have very high confidence that you won’t get remotely pwned by a rogue website. And if you’re optimizing a site for accessibility/SEO, it also helps you test and see how your site performs to the average search indexing bot (or browser for the blind, or low-end mobile browser, etc.)  It doesn’t have to look pretty with NoScript, but if it’s not browsable without Javascript enabled, it’s not as indexable as it could be.


There are obviously inappropriate SEO moves, like packing keywords or spamming links, that not only don’t work in the long run, they’re counterproductive, because resources that go into temporary, artificial ranking boosts are resources that could be directed into relevance. Or even into paid search advertising. It’s kind of expensive, but if you need to get your name out, paid search works. (A word to the wise, though: If you know someone who is really good at this, they are worth money.)