Off-Topic but Interesting

My Ten Favorite iPad Apps

I’ve been so happy this year with my MacBook Pro and my iPhone X that I haven’t really missed having an iPad. But as soon as I got my new iPad last week all that changed and I wondered how I ever lived without it. Here are my top ten favorite apps for the iPad. …

Read More
Off-Topic but Interesting

My Ten Favorite iPhone Apps

I’ve been a fan of iOS since I got an iPod Touch to manage my to do list and it ended up managing my life and my work with it. I’ve found several amazing apps for my iPad/iPhone/iPod over the years. Here are my top ten iPhone apps: 10. Phone Yes, I occasionally use my …

Read More
Off-Topic but Interesting

My Ten Favorite macOS Apps

I’ve been a Windows developer since 1988. The version of Windows I started with was just called Windows. It was before Windows 286 and the popular Windows 3.1. Prior to that, I was an OS/2 developer and much of my code for the graphics system got consumed by Windows. So, when I switched from Windows …

Read More
Announcements

Announcing the Ten Year Anniversary of My Blog

Yes, it was on December 5th, 2008 that I wrote my first blog post. Over the next decade, I would write hundreds of posts on agile software development principles and practices. If you haven’t checked out this free resource, I encourage you to do so by visiting https://tobeagile.com/blog. I’ve recently recategorized my posts so it’s …

Read More
Bits and Pieces

Object Thinking

We refer to object-oriented programming as a paradigm or way of thinking because it’s more than just a set of techniques and practices. It’s a different way of modeling behaviors. It’s not necessarily as easy to learn as the syntax of a programming language. Object-oriented programming is subtly different than procedural programming and it’s easy …

Read More
Rants

The Virtues of Laziness

Ok, I admit it. I am lazy. But laziness can be a virtue. I think it is humanity’s basic laziness that let us create computers in the first place. Computers take the drudge-work out of many tasks. My basic laziness has motivated me to find better ways to build software because I simply got tired …

Read More
Refactor Legacy Code

Rebuild or Refactor

Sometimes, when an important project is going poorly there’s a desire to start over. Sometimes this comes from management but often this comes from the developers themselves. They say if they only had a second chance and could start over then they can build the right system. But that almost never happens. Take it from …

Read More
Rants

Buy or Build

One question that I hear a lot of people asking is whether they should buy or build the software that they need to run their enterprise. This is often a difficult question to answer. One thing I can say having lived through many major software purchases is that the main cost was understanding a system …

Read More
Write the Test First

More on Test-Driven Development

One of the most valuable development practice that has become popular recently is test-driven development. When done correctly, unit tests can dramatically drop the cost of maintaining software while increasing its value. All the things that management wants and needs from the processes that are built around software development are embodied in this simple practice …

Read More
Refactor Legacy Code

Code Transformations

A lot of poor designs can be attributed to sticking with an existing design as changing requirements show us the need for a better one. Oftentimes, an initial design is just a stab in the dark. We might not know enough to make an informed decision but we have to get something done, so we …

Read More
Say What, Why, and for Whom Before How

Work Through Examples

One of the biggest challenges in building software is specifying what needs to be built. A blueprint captures all of the valuable information we need in order to build a building and details such as the tensile strength of the material and how to build a foundation are available through other sources. Blueprints have no …

Read More
Bits and Pieces

Making Code Testable

I believe that testability is one of the key characteristics of good, maintainable software. But what do I mean by testability? Testable code is code that’s written in such a way that it is independently verifiable. It has a well-defined programmatic interface and it can be fully tested based on that interface. Testable code receives …

Read More
Bits and Pieces

Complex Systems

When I look at the systems around me I noticed three kinds. There are simple systems, there are complex systems, and there are complex adaptive systems. Most of us are familiar with simple systems. They have a direct cause and effect relationship that can be easily traced. Other systems are less direct. Complex systems are …

Read More
Bits and Pieces

Trade-Offs

Of course, we want the best of all worlds. We want our code to be clear and performant and extendable. But what happens when benefits are at odds with each other? What happens when, for example, in order to gain some clarity and improve maintainability we have to sacrifice some performance? Of course, the answer …

Read More
Collaborate

Pair Programming Pointers

Pair programming is the one Extreme Programming practice that I get the most pushback from both developers and managers. Most of us have experience programming as a solitary art form and we’ve done it alone. We figured out a bunch of things for ourselves and we don’t necessarily feel comfortable doing our work in the …

Read More
Refactor Legacy Code

The Stigma Around Refactoring

Refactoring is a critically important concept in software. Anyone involved in the software industry should understand exactly what refactoring is and why it’s valuable. Refactoring is not just the redesign of code. The redesign must behave exactly in the same way as it did before. In many situations, this also means bug-for-bug compatibility as well …

Read More
Refactor Legacy Code

Read, Write, and Refactor

A couple of years ago I got to realize a lifelong dream when I became a published author. I was surprised to learn that many of the skills that I gained in becoming a good software developer were actually useful to me in becoming a good writer. Like code, prose should be well-encapsulated and cohesive, …

Read More
Refactor Legacy Code

My Second Favorite Refactoring

In my last blog post, I shared with you my favorite refactoring and it might not have been what you were expecting. I can’t leave the topic without sharing with you my second favorite refactoring, as well. Like my favorite refactoring, my second favorite refactoring is also a safe refactoring, which means that if you …

Read More
Refactor Legacy Code

My Favorite Refactoring

Refactoring code is an essential activity when working with existing systems, as well as building new ones. Refactoring techniques allow us to safely transform code into designs that are perhaps better suited for future extension. The techniques used to refactor code range from very simple to quite complex and there is a strong emphasis to …

Read More
Refactor Legacy Code

Surgery on Legacy Code

One of my early blog posts that I wrote nearly 10 years ago that I called Sony Baloney discussed how the electronics giant cultivated some unusual, yet highly successful practices. One of the practices that Sony is known for is taking young and inexperienced engineers and putting them on new product development, while their senior …

Read More
Rants

Sharing Knowledge

In my early days of computing back in the late 70s and early 80s, having an interest in microprocessor design was unusual. I remember getting almost monthly updates from Motorola and Intel on their latest chips and my shelves were filled with technical manuals. Information flowed freely and it felt that we were part of …

Read More
Create CLEAN Code

Encapsulate Change

Software development is a unique human activity but it bears resemblance to other activities such as math, writing, and engineering. I think of writing software as a modeling process but unlike modeling physical things that occur in space, we’re modeling processes that occur in time. Therefore, writing software is a process of creating models that …

Read More