Explore Teos Technology services, products, insights, and ways to connect with our team.
One of my favorite design principles, when it comes to development, is Don't Repeat Yourself (DRY). This principle is foundational in software development and is crucial for maintaining clean, efficient, and manageable code. At its core, the DRY principle emphasizes the importance of reducing repetition within your codebase and processes. The essence of this principle is quite intuitive; many developers are likely employing it without even realizing its significance. The name itself succinctly encapsulates the idea: simply avoid repeating yourself. This concept is not only applicable to the code you write but also extends to the processes you implement in your development workflow.
When you find yourself contemplating the act of copying and pasting code, it's essential to pause

and reflect on what strategies you can employ to avoid unnecessary duplication. Code duplication can lead to a host of issues, including increased maintenance costs, higher chances of bugs, and a more challenging debugging process. Instead of duplicating code, consider creating reusable functions or modules that can be called multiple times throughout your application. This may require a bit of extra care and thought upfront, as you will need to design your code with modularity in mind. However, the long-term benefits of adhering to the DRY principle are substantial. By investing the time to structure your code properly, you will ultimately reduce your maintenance overhead and streamline your development efforts, leading to a more robust and scalable application.
Moreover, think about the manual tasks you perform regularly, whether it's related to product releases, customer engagement, or any other repetitive activity. If you find yourself doing the same task repeatedly, it's a clear indicator that you should consider automating that process. Automation not only saves time but also minimizes the risk of human error, which can be particularly detrimental in critical operations. Implementing automation tools and scripts can free up your time to focus on more strategic aspects of your projects, allowing you to enhance productivity and efficiency. Whatever you choose to do, always keep the DRY principle in mind. By striving to keep your work free from unnecessary repetition, you will foster a more effective and organized approach to development, ultimately leading to better outcomes for both yourself and your team.
What exactly is software development? It’s inherently intangible. At the physical level, programming is just turning keystrokes into meaningful patterns of electrons. At the intellectual level, however, software development is a universe of its own.

A while ago, a colleague proudly proclaimed “making software isn’t engineering, it’s an art!” That really got me thinking about the validity of that statement, and what it really means. There’s software engineering and computer science, but what about art?
To find an answer, I wanted a better understanding of what exactly engineering, science, and art actually are. If you look up engineering in the dictionary, you’ll see the following:

It’s really the second definition that stands out: the application of science and mathematics by which the properties of matter and the sources of energy in nature are made useful to people. Software does indeed apply different fields of science and mathematics to make something that’s useful to people.

The latter half of the second definition of engineering is the design and manufacture of complex products. Software is assuredly a complex product, made up of many different components, and it requires careful design and manufacture.
The last part of the definition of engineering is calculated manipulation or direction. Software development, at its core, is the manipulation and direction of a computer system. The developer is directing the behavior of the computer itself.
Accordingly, software development is engineering in a number of ways. That means a software engineer is in fact performing engineering, when they design and develop software.
Having established that software development is engineering, let’s consider whether it could also be science or even art. Following the same technique, let’s dissect the definition of science:

Systematized knowledge is any information which can be arranged according to an organized system. Software development requires understanding highly specific, organized information. Hence, it falls under the second definition of science. It can be studied and learned.

Furthermore, the development of software applies scientific and mathematical laws to bring about something useful in the real world. Essentially, it turns binary numbers into practical outcomes. Consequently, it also falls under the fourth definition of science.
Software development is genuinely a science, but there’s still one more question to consider. Could developing software actually be an art? Again, turning to the definition will help answer the question. Art is defined as:

The first definition appears to fit. Software development is a skill which requires experience, study, and observation to master. It is a skill which improves with practice and refinement. It is also an occupation requiring skill and knowledge, so the third definition of art applies as well as the first.

However, it’s the fourth definition that really gets to the heart of what art truly is – a creative expression of aesthetics or beauty. When I speak of software as art, many people might think of computer graphics. While that can be art, it is using software, rather than creating software. When speaking of art in software development, I’m referring to the source code that comprises the software.
The beauty found in source code is not a visual aesthetic, but a mental aesthetic, much like other written language. Most people who aren’t developers may not realize there’s such a thing as ugly or pretty code. However, ask any developer what the ugliest code they’ve every written was, and they might blush.

Remarkably, it turns out, software development is an art. It is also science, and it's engineering. It spans all three categories, and that still doesn’t fully describe it. It is vast, complex, and beautiful.
What do you think software development is?


User stories lie at the heart of the Agile process. Well defined stories can mean delivering on your commitments. Poorly written stories can lead to wasted time and carryover. However, writing "good" user stories can challenge even the seasoned software professional. With as pivotal as they are in delivering on your commitments, it's critical to get your user stories right.
So what makes for a good user story? Before we answer that, let's take a look at a simple example: a client wants a system that tracks customer information. They say they're an agile shop, and can provide you with a user story for exactly what they want. Here's what they send you.
Story 1: Manage Customers
-
User can see customers
-
User can edit customer details and information
After some initial surprise, you thank them graciously and mention that it's a little vague. They agree, and you all sit down to discuss requirements. After some creative collaboration, you have a much more complete picture of what they need.
Story 1: Manage Customers
-
User can create a new customer
-
User can edit the details of an existing customer
-
Only authorized users can create new customers
-
Phone numbers have to auto-format to (xxx) xxx-xxxx
-
Zip codes have to be valid
-
User can delete an existing customer if authorized
-
User has to have permission to edit a customer
-
Customers must have a first name, last name, address, and phone number
-
The user can enter notes about the customer
-
A customer can have an email address
-
There's a list of customers that the user can view
-
There should be an image to go with each customer
-
Each customer should have a purchase history
-
Only authorized users can view customers
-
The list of customers can be filtered by items purchased, date of purchase, name, phone-number, email or address

Now you have a lot more to go on, but your team doesn't think they can complete the whole thing in one, or even two sprints. They're worried about the size of the story and the number of unknowns. So you decide to break the story apart and focus on the essential functionality first.
Looking at the list of requirements, some areas of functionality start to emerge: create customers, retrieve customers, update customers, delete customers, validation, authorization, purchasing. You realize these are just CRUD operations with validation and authorization. In fact, this is a common pattern of functionality visible in many applications dealing with a collection of data.
The requirements fall under two features: Customers and Purchases. There are no solid requirements around purchasing. After discussing it with your client, it makes sense to tackle Customers first, and then delve deeper into Purchasing. For now, the Purchases feature will be deferred. We'll then use the velocity information we get from developing the Customers feature to help estimate the Purchases feature.
With this new insight, you start to break the requirements for Customers apart into user stories. Your goal is to create small stories which can be developed and tested during a single sprint. We want to minimize carryover.
Story 1: As a User, I need to view all Customers, so that I can manage contacts
-
User can view existing customers
-
User can view the first name, last name, image, address, email, and phone number of a customer
Story 2: As a User, I need to filter the Customers, so that I can locate those of interest
-
While viewing the list of customers, a user can filter the list based on name, phone number, email, and address.
Story 3: As an Administrator, I need to create a customer, so that I can manually add a contact
-
User can create a new customer
-
User can enter the first name, last name, address, and phone number of a customer
-
Only an Administrator can create a new customer
-
User can enter Notes about the customer
-
User can select an Image for the customer
-
Phone numbers have to auto-format to (xxx) xxx-xxxx
-
Zip codes have to be valid
-
Changes to the Customer can either be Saved or Cancelled
Story 4: As an Administrator, I need to edit a customer, to keep information up to date
-
User can edit an existing customer
-
User can edit the first name, last name, address, and phone number of a customer
-
Only an Administrator can edit a customer
-
User can edit Notes about the customer
-
User can view or change the Image for the customer
-
Phone numbers have to auto-format to (xxx) xxx-xxxx
-
Zip codes have to be valid
-
Changes to the Customer can either be Saved or Cancelled
Story 5: As an Administrator, I need to delete a customer, to remove unused contacts
-
User can edit delete existing customer
-
Only an Administrator can delete a customer
-
User is prompted to confirm the deletion
Now we have five small, well-defined user stories, where we started with a single gigantic one. If we wanted to further dissect our functionality, we could pull Validation our of stories 3 and 4, and turn that into a separate user story. After discussing this idea with your team, they think leaving validation in those stories is reasonable.
With your user stories properly fleshed out, you can stack-rank and estimate them. Since the functionality has been broken into smaller stories, each one is much easier to estimate. As a side-effect of dissecting the original user story, a number of unknowns were also clarified.
Let's take a look back at our original question of "what makes a good user story?" Naturally, there's no single answer to such a nebulous question. If you ask 10 Agile practitioners, you're likely to get 10 different opinions. However, there are some simple guidelines to keep in mind when creating a user story:
-
Keep It Short – An ideal story can be developed and tested in a single sprint. Large stories lead to carryover and are hard to estimate.
-
Keep It Relevant – Group related functionality in a meaningful way. Unrelated functionality belongs in different story.
-
Keep It Essential – If it isn't essential to the spirit of the story, consider a separate story. Think minimalism.
These are just a few, among many, good considerations when creating your user stories. Writing user stories is a skill that improves with experience. I encourage you to continue learning and refining your practice.

I hope this has served as an enjoyable thought-exercise and spurred some interest in creating shorter user stories. If you have any guidelines of your own, or an interesting experience, please share in the comments.
Please note that I have intentionally been tool-agnostic, so the intent of this article is not lost on the presentation. I will explore available tools in future articles.