Article

10min read

Rollout and Deployment Strategies: Definition, Types and the Role of Feature Flags in Your Deployment Process

How teams decide to deploy software is an important consideration before starting the software development process.

This means long before the code is written and tested, teams need to carefully plan the deployment process of new features and/or updates to ensure it won’t negatively impact the user experience.

Having an efficient deployment strategy in place is crucial to ensure that high quality software is delivered in a quick, efficient, consistent and safe way to your intended users with minimal disruptions. 

In this article, we’ll go through what a deployment strategy is, the different types of strategies you can implement in your own processes and the role of feature flags in successful rollouts.

What is a deployment strategy?

A deployment strategy is a technique adopted by teams to successfully launch and deploy new application versions or features. It helps teams plan the processes and tools they will need to successfully deliver code changes to production environments.

It’s worth noting that there’s a difference between deployment and release though they may seem synonymous at first.

Deployment is the process of rolling out code to a test or live environment while release is the process of shipping a specific version of your code to end-users and the moment they get access to your new features. Thus, when you deploy software, you’re not necessarily exposing it to real-world users yet.

In that sense, a deployment strategy is the process by which code is pushed from one environment into another to test and validate the software and then eventually release it to end-users. It’s basically the steps involved in making your software available to its intended users.

This strategy is now more important than ever as modern standards for software development are demanding and require continuous deployment to keep up with customer demands and expectations.

Having the right strategy will help ensure minimal downtime and will reduce the risk of errors or bugs so users get the best experience possible. Otherwise, you may find yourself dealing with high costs due to the number of bugs that need to be fixed resulting in disgruntled customers which could severely damage your company’s reputation.

Types of deployment strategies

Teams have a number of deployment strategies to choose from, each with their own pros and cons depending on the team objectives. 

The deployment strategy an organization opts for will depend on various factors including team size, the resources available as well as how complex your software is and the frequency of your deployment and/or releases.

Below, we’ll highlight some of the most common deployment strategies that are often used by modern software development and DevOps teams.

Recreate deployment

Image 

A recreate deployment strategy involves developers scaling down the previous version of the software to zero in order to be removed and to upload a new one. This requires a shutdown of the initial version of the application to replace it with the updated version.

This is considered to be a simple approach as developers only have to deal with one scaling process at a time without having to manage parallel application deployments. 

However, this strategy will require the application to be inaccessible for some time and could have significant consequences for users. This means it’s not suited for critical applications that always need to be available and works best for applications that have relatively low traffic where some downtime wouldn’t be a major issue.

Rolling deployment

Image

A rolling deployment strategy involves updating running instances of the software with the new release.

Rolling deployments offer more flexibility in scaling up to the new software version before scaling down the old version. In other words, updates are rolled out to subsets of instances one at a time; the window size refers to the number of instances updated at a time. Each subset is validated before the next update is deployed to ensure the system remains functioning and stable throughout the deployment process.

This type of deployment strategy prevents any disruptions in service as you would be updating incrementally- which means less users are affected by any faulty update- and you would then direct traffic to the updated deployment only after it’s ready to accept traffic. If any issue is detected during a subset deployment, it can be stopped while the issue is fixed. 

However, rollback may be slow as it also needs to be done gradually.

Blue-green deployment

Image

 

A blue/green deployment strategy consists of setting up two identical production environments nicknamed “blue” and “green” which run side-by-side, but only one is live, receiving user transactions. The other is up but idle.

Thus, at any given time, only one of them is the live environment receiving user transactions- the green environment that represents the new application version. Meanwhile, teams use the idle blue system as the test or staging environment to conduct the final round of testing when preparing to release a new feature.

Afterwards, once they’ve validated the new feature, the load balancer or traffic router switches all traffic from the blue to the green environment where users will be able to see the updated application.

The blue environment is maintained as a backup until you are able to verify that your new active environment is bug-free. If any issues are discovered, the router can switch back to the original environment, the blue one in this case, which has the previous version of the code.

This strategy has the advantage of easy rollbacks. Because you have two separate but identical production environments, you can easily make the shift between the two environments, switching all traffic immediately to the original (for example, blue) environment if issues arise.

Teams can also seamlessly switch between previous and updated versions and cutover occurs rapidly with no downtime. However, for that reason this strategy may be very costly as it requires a well-built infrastructure to maintain two identical environments and facilitate the switch between them.

Canary deployment

Image

Canary deployments is a strategy that significantly reduces the risk of releasing new software by allowing you to release the software gradually to a small subset of users. Traffic is directed to the new version using a load balancer or feature flag while the rest of your users will see the current version 

This set of users identifies bugs, broken features, and unintuitive features before your software gets wider exposure. These users could be early adopters, a demographically targeted segment or a random sample.

Therefore, you start testing on this subset of users then as you gain more confidence in your release, you widen your release and direct more users to it. 

Canary deployments are less risky than blue-green deployments as you’re adopting a gradual approach to deployment instead of switching from one environment to the next. 

While blue/green deployments are ideal for minimizing downtime and when you have the resources available to support two separate environments, canary deployments are better suited for testing a new feature in a production environment with minimal risk and are much more targeted.

In that sense, canary deployments are a great way to test in production on live users but on a smaller scale to avoid the risks of a big bang release. It also has the advantage of a fast rollback should anything go wrong by redirecting users back to the older version.

However, deployment is done in increments, which is less risky but also requires monitoring for a considerable period of time which may delay the overall release.

A/B testing

Image

A/B testing, also known as split testing, involves comparing two versions of a web page or application to see which performs better, where variations A and B are presented randomly to users. In other words, users are divided into two groups with each group receiving a different variation of the software application. 

A statistical analysis of the results then determines which version, A or B, performed better, according to certain predefined indicators.

A/B testing enables teams to make data-driven decisions based on the performance of each variation and allows them to optimize the user experience to achieve better outcomes.

It also gives them more control over which users get access to the new feature while monitoring results in real-time so if results are not as expected, they can redirect visitors back to the original version.

However, A/B tests require a representative sample of your users and they also need to run for a significant period to gain statistically significant results. Moreover, determining the validity of the results without a knowledge database can be challenging as several factors may skew these results.

AB Tasty is an example of an A/B testing tool that allows you to quickly set up tests with low code implementation of front-end or UX changes on your web pages, gather insights via an ROI dashboard, and determine which route will increase your revenue.

Feature flags: The perfect companion for your deployment strategy

Whichever deployments you choose, feature flags can be easily implemented with each of these strategies to improve the speed and quality of the software delivery process while minimizing risk. 

By decoupling deployment from release, feature flags enable teams to choose which set of users get access to which features to gradually roll out new features.

For example, feature flags can help you manage traffic in blue-green deployments as they can work in conjunction with a load balancer to manage which users see which application updates and feature subsets. 

Instead of switching over entire applications to shift to the new environment all at once, you can cut over to the new application and then gradually turn individual features on and off on the live and idle systems until you’ve completely upgraded.

Feature flags also allow for control at the feature level. Instead of rolling back an entire release if one feature is broken, you can use feature flags to roll back and switch off only the faulty feature. The same applies for canary deployments, which operate on a larger scale. Feature flags can help prevent a full rollback of a deployment; if anything goes wrong, you only need to kill that one feature instead of the entire deployment. 

Feature flags also offer great value when it comes to running experiments and feature testing by setting up A/B tests by allowing for highly granular user targeting and control over individual features.

Put simply, feature flags are a powerful tool to enable the progressive rollout and deployment of new features, run A/B testing and test in production. 

What is the right deployment strategy?

Choosing the right deployment strategy is imperative to ensure efficient, safe and seamless delivery of features and updates of your application to end-users. 

There are plenty of strategies to choose from, and while there is no right or wrong choice, each comes with its own advantages and disadvantages. 

Whichever strategy you opt for will depend on several factors according to the needs and objectives of the business as well as the complexity of your application and the type of targeting you’re looking to implement i.e whether you want to test a new feature on a select group of users to validate it before a wider release.

No matter your deployment strategy, AB Tasty is your partner for easier and low risk deployments with Feature Experimentation and Rollouts. Sign up for a free trial to explore how AB Tasty can help you improve your software delivery processes.

Article

11min read

Product Manager vs Product Owner: What’s the Difference?

What’s the difference between a product manager and a product owner or are these roles actually one and the same?

If you’re wondering, you’re not alone. The terms are often used interchangeably and not without reason as sometimes the two roles’ responsibilities may overlap especially in small to medium-sized companies. 

However, Product Manager (PM) and Product Owner (PO) are two distinct roles. Although they do share a common goal, delivering products users love, the scope of their responsibilities is actually not identical. 

Generally, a product manager is responsible for the why. They shape the product roadmap based on users’ needs and desires. They are focused on business metrics and on whether the product is going in the right direction on a larger scale.

The product owner, on the other hand, is responsible for creating and managing the product backlog. They are operational and on a deadline. For them, it’s all about Scrum, back and forth with developers, and getting stuff done.

However, the lines between the two do often blur. Depending on where you work, you might be used to a variety of setups. 

What are the differences in responsibilities of a product manager and a product owner?

The short answer is: it depends.Product Manager Experience

Now, I’m sure you’re thinking ‘of course! Isn’t that true for everything?’

But in this case, it really does depend on a lot of different factors. A chunk of this article will go over them in detail but first we will discuss each role to highlight the responsibilities of each one on its own to be able to then understand their differences.

The product owner role

The term “product owner” comes from Scrum- an Agile framework that helps teams structure and manage their work and solve complex problems effectively by adopting a set of values and principles. A typical Scrum team consists of Product Owner, a Scrum Master and Developers with specific accountabilities. 

According to the “Scrum Guide”, the product owner is responsible for “maximizing the value of the product resulting from the work of the Scrum Team”. Consequently, this role is usually found in organizations that have adopted an Agile methodology. 

Among the key responsibilities of the product owner is creating user stories for the development team to implement and ensuring that these stories meet customer requirements. In other words, the product owner advocates for customer needs and represents the voice of the customer to the development team by making sure that the right product is being built. 

Some other responsibilities of the product owner include:

  • Manage product backlog by creating and communicating the backlog items and prioritize them accordingly to maximize value
  • Define and manage the product vision 
  • Understand market and customer needs and turn them into actionable user stories
  • Collaborate closely with cross-functional teams such as developers to ensure that products meet customer needs and requirements. They also make sure that goals are clear and business objectives are aligned with the product vision 
  • Act as the primary point of contact for all stakeholders and ensure they have proper buy-in on all major decisions and strategies 

The product manager role

As we’ve seen, product owners are more tactical in that their focus is on maximizing value through creating and managing the product backlog. Additionally, product owners are more detail-oriented and have more of a short- to mid-term focus. 

Meanwhile, product managers play a more strategic role, which means their focus is more on creating the long-term vision of a product as well as aligning the product roadmap with larger organizational goals. 

They then build the product strategy in order to build a concrete product based on its overall vision that spans across the entire roadmap. Put simply, a product manager manages the entire product life cycle and oversees every aspect of its development from the early stages of user research to the moment of product launch.

The responsibilities of the product manager may vary from one organization to the next but they usually include the following tasks:

  • Conduct user research to determine customer needs to determine product vision 
  • Create and align teams around the product roadmap 
  • Decide what features to build next
  • Supervise teams and projects to ensure the successful launch of the product 

A product manager role is usually more outward-facing in that they speak to customers to define the requirements of the product to be built while a product owner is more inward-facing as they work closely with development teams to ensure the product is being built according to these requirements. 

We can look at product owners as an extension of product managers as they apply the strategies outlined by product managers and transform it into an actionable backlog.

In other words, the product manager decides what products or features to build next while the product owner oversees that developers build these products. 

Do organizations need both roles?

The simple answer to this question would be it depends. 

Various factors will need to be taken into account when it comes to deciding whether you need one or the other or both.

In an ideal scenario, there would be a product manager managing the product strategy and vision and a product owner responsible for executing that strategy. On the surface, it may seem that the responsibilities of the two roles may sometimes overlap as they’re working towards common goals but in reality, their day-to-day tasks differ significantly.   

However, not all companies may have the sufficient resources to have two different people dedicated to each of these roles.

Indeed, many small companies may find that having two distinct roles is not necessary and the responsibilities of the product development process can be carried out solely by the product manager. However, processes may become more complex in larger companies and could require a product manager to manage the product life cycle and outline the overall strategy and a product owner overseeing the development process to ensure the tactical execution of that strategy.

It’s important to also keep in mind that the product owner role is tightly linked with the Scrum development approach. Therefore, it’s typically found in teams practicing Scrum. Product managers, for their part, exist in organizations that aren’t necessarily following a specific approach or methodology. They can operate within any framework as part of the product team while product owners in highly Agile businesses come as part of a Scrum team.   

Nonetheless, many organizations struggle with the decision of whether to have one or the other or both. 

The most important consideration when making this decision is focusing on outcomes and not on the titles. Organizations need to examine their objectives and any weaknesses and bottlenecks in their current processes or structures that may hinder them from achieving these objectives. Such insights are key to building your winning team. 

When to consider a product manager vs product owner

Let’s not forget, there are products of all kinds: industrial products, agricultural products, services, chemical products, fashion and software products. 

In the SaaS martech space, the thinking goes that all products are built the same way and that companies are all structured the same way. They tend to think there is always a Product Manager and a Product Owner behind each feature.

We’ve already mentioned some things to consider when you’re deciding whether to have both roles. In this section, we look in further detail at some of these factors that determine the right setup for your organization.

1. Momentum

The most important criteria is ‘the momentum of the company.’ What does this mean?

How new/old is the organization?

This question is an important one. It is not directly related to the size of the company or to the number of clients, either. 

But rather, the right question here would be: How far or close is the company in relation to a specific “key moment”?

product owner vs product manager ab tasty

What we mean by ‘key moment’ are key phases or events in the life cycle of a company. Some examples include: 

  • the creation of the company
  • its sale
  • new funding
  • tax inspection
  • a competitor’s release
  • a crisis
  • replacement of the CEO 
  • … etc 

All these different key stages will have an impact on how the product development is executed.

And therefore, they affect what a product manager does and what a product owner does.

For example, just after a company is founded, the CEO is presumably the best person to take care of the product roles. They are very often (at least in scalable SaaS companies) the one who wears the hat of PO, PM, QA & Support. It is not a choice or a strategy. It is just what the moment implies.

Also, in general, the way a company’s momentum is handled defines how “well” a company is doing. 

Has the moment happening right now been anticipated, or is it just the consequence of the reaction of the last moment? The more a company reacts, the more “Agile” you can consider it to be. The more moments are anticipated, the more “visionary” you can consider the company. It’s challenging to be both.

2. Size matters

Size here doesn’t necessarily refer to the number of employees a company has. The size of a company could also refer to the number of:

  • products
  • models
  • features
  • scopes
  • price grids 
  • or markets they address. 

Cutting the products in the right “dimensions” and deciding if we split per market, per range or per topic can be a lifelong job, because it changes very often and the faster the company evolves, the more it has to be changed.

Size can also be defined by the number of users, clients, partners, retailers, languages, unit systems,… But also and more frequently, a combination of all the above will tell how many PMs, POs and Heads of Product your organization will need. 

For example, in many non-profits, product managers are based on the donor personas. You have a PM for small donation amounts (say $10 to $500), one for larger ones ($500 to $10,000) and one for those that are even bigger. Why? Because expectations from each persona type differ radically, and being able to cater to each will help the non-profit grow in the long run.

In short, the size of the company (its client portfolio, its product catalogue…) may define what the PM does, what the PO does, and how many of each there will be.

3. The remaining criteria

But these are not the only factors that define how many PMs, POs or any other product-facing people you will need. Many other factors can also be taken into account, including: 

  • number of developers
  • number of designers
  • shipping velocity
  • technical stacks
  • tooling
  • product lifecycle 
  • individual wishes
  • growth potential
  • existing need coverage ratio 
  • legacy ratio
  • human resources policy 
  • the market you address
  • the level of politics installed in the company.

There is some kind of global agreement (at least in SaaS businesses) on the fact that the split between PM and PO is based on: vision vs. operations, projection vs. immediacy, value vs. metrics. But both are sides of the same coin.

In short, no two organizations are identical. In other words, there’s no one set answer to the question of what a PM vs. PO should do. Some organizations will need many, some will need none. Enabling people to work successfully together is hard enough. Copying and pasting a method won’t help – you have to find your own. 

What skills are needed to be a good product manager and/or product owner?

Both product managers and product owners need a good balance of hard and soft skills to carry out their tasks efficiently. 

The necessary skills for product managers include:

  • Excellent communication and collaboration skills
  • A good amount of technical expertise
  • Prioritization skills
  • Good business acumen
  • Analytical skills

Meanwhile, the necessary skills for product owners include:

  • Problem solving
  • Project management skills 
  • Great communication and strong storytelling skills
  • Deep understanding of user data and analytics

The skills necessary for product managers and product owners may overlap especially in smaller companies where a product manager could also be a product owner and vice versa. 

What KPIs are used to measure success for product owners and product managers?

It depends and may vary from one organization to the other depending on their objectives 

However, if we tie them into their individual responsibilities, we can give a general overview of the kind of KPIs that can be used to measure their performance. 

A product manager, for example, has a wide range of responsibilities including the creation and prioritization of the product roadmap along with cross-team collaboration to ensure alignment around the roadmap.  

In that sense, a product manager’s performance is primarily related to product success in line with the overall business goals. Thus, usually product managers’ KPIs should be based on business metrics such as growth, revenue, churn rate and costs. 

Meanwhile, product owners have a narrower role and based on the responsibilities we outlined above, their success is measured using KPIs based on delivery, quality, and internal team satisfaction.

Conclusion

A product owner and manager are great assets to have but having both or two separate people taking on these roles is not a must for every organization. 

At the end of the day, the question is not whether you should have both a product manager and product owner but whether having both of those roles is right for your organization. You will have to look inward to understand what your business actually needs. 

How you decide to structure your teams will depend on the processes you have in place and the kind of outcomes you’re hoping to achieve based on business objectives, customer and company needs.

While we give an overall idea of each role, these responsibilities are not set in stone and they could widely vary on a case by case basis.

What really matters is that you have the right people with the right skills working towards a shared goal, which is building a product customers will love and meets their requirements and needs. 

Article

11min read

What Makes a Great Product Lifecycle Manager

We usually only see a product or service when it’s ready for consumption. 

But to get it to the shelf—both physically and virtually speaking—an all-encompassing process must take place. Even once a product or service is fit for consumption, there are a number of key considerations to make to ensure its success and market stability.

Effective product lifecycle management (PLM) is integral in almost every sector imaginable. It’s the product lifecycle manager’s job to spearhead the entire process, from development to decline.

The purpose of this article is to discuss the importance of PLM as well as to look at the core duties of a product lifecycle manager and what skills make a great product lifecycle manager in the modern software development world.

What is product lifecycle management?

We will first start by defining what product lifecycle management is to have a better understanding of the role behind it.

Product lifecycle management or PLM refers to all the processes, methods and technologies that are used to manage a product as it moves through the typical stages of its lifecycle from development through its introduction and growth to its decline and retirement.

The image below helps to envision the different processes that occur at each stage of the product’s lifecycle.

The product lifecycle refers to the progression of a product through its typical 4 stages (introduction, growth, maturity and decline) as well as more complex processes that occur within these stages such as inception, design, engineering, manufacturing, sales and marketing and distribution.

PLM is what helps to manage that lifecycle by aligning people, data, processes and technology to seamlessly bring the product to market.

Having a thorough understanding of the different stages of the product lifecycle is vital when it comes to developing new products as it helps answer questions such as whether it’s worth building the product and whether it would survive in the market before investing valuable resources. Afterwards, the next stage of product planning and preparing forecasts can begin.

Therefore, PLM essentially provides a framework that organizations use to manage their products through the different stages of its lifecycle.

It encompasses all aspects of a product including planning, managing, designing, and marketing through the use of dedicated software products and solutions that provide a single source of truth and visibility for all relevant stakeholders to monitor and track any changes to a product.

Why is product lifecycle management (PLM) important?

We can look at product lifecycle management as the glue that holds the entire process together, from ideation and development to production, promotion, and beyond. Without an effective PLM process, it’s unlikely that any production or service would ever see the light of day.

Above all, PLM is used as a means to develop a strategy to make better and more informed decisions to optimize every stage of the product lifecycle by aligning processes, data and technology to help businesses maximize profits. 

Because many departments are involved in product development, using a dedicated PLM software offers an all-around view of a product across various cross-functional teams to help them keep track of all products and their processes by allowing information to flow seamlessly between different teams. 

The purpose of such software is to shorten product development time while enhancing communication among teams through high-level visibility. An efficient PLM system will compile all your product data into a single database- a single source of truth- and manage this information flow which all relevant teams can access throughout the entire lifecycle.

In that sense, an efficient PLM system has a number of benefits including: 

  • Higher quality products
  • Enhanced information transparency
  • Optimization of processes and workflows
  • Improved product reliability
  • Improved decision-making and forecasting
  • Increased productivity
  • Increased innovation
  • Reduced time to market 
  • Reduced costs
  • Reduced waste
  • Identification of new development and market opportunities

Thus, PLM serves as a backbone of any project to help teams cope with the increasing complexity and challenges of developing new products and quickly meet consumer demands through streamlined processes. 

What does the role of a product lifecycle manager entail?

As we’ve seen, when it comes to realizing a product, service, or innovation, there are several processes and entities involved. It’s the responsibility of the product lifecycle manager to bring all of these elements together and ensure that every stage of the journey is optimized for success.

The role of the product lifecycle manager is as varied as it is vital, and there are a wealth of responsibilities involved which largely depends on the lifecycle stage their product is in. This means that the skills needed and decisions made will differ from one stage to the next and so the product lifecycle manager will need to smoothly transition as the product evolves and shifts to the next stage.

Thus, the product lifecycle manager is the one who is primarily responsible for managing a product as it goes through the different stages of its lifecycle. This means that they also oversee the work of the entire project team to ensure they successfully and effectively complete each phase of the lifecycle.

What is expected from a modern product lifecycle manager?

The functions of a product lifecycle manager differ from day to day according to business and product needs. However, the core functions of a project lifecycle manager include the following:

  • Introduction: Adopting the role of market or subject expert to get the product or innovation fit for the market. At this stage of the journey, extensive market research is required to identify gaps in the market and consumer needs as well as competitor analysis. The product lifecycle manager also needs to ensure that every department is working together cohesively for development, production, and launch.
  • Growth: Once the product is fit for public consumption, the product lifecycle manager will then establish a plan to promote healthy market expansion and scalability, supporting the necessary departments or entities in optimizing sustainable growth.
  • Maturity: At the point where the product in question is scaling and gaining momentum, the product lifecycle manager must work with internal and external stakeholders to sustain a market share and evolve the product’s commercial journey, thus securing a sustainable return on investment (ROI).
  • Decline: When a product or innovation reaches its decline, a great product lifecycle manager will assume the role of a solution seeker. At this stage, it’s the lifecycle manager’s job to formulate the best strategic outcome for the product—whether it’s a case of resurrection and redevelopment or phasing out.

Product lifecycle manager: Key attributes for success

Being a product lifecycle manager is challenging to say the least, but if you have the skills and talent to be great, it is a career path that will offer endless rewards.

Do you want to know what it takes to be a great product lifecycle manager? Here are the key attributes required for PLM success: 

Qualifications and credentials

While there is no clear cut path to becoming a great product lifecycle manager, you will need relevant experience and qualifications related to product management and development to perform every facet of the job effectively.

It’s also imperative that you are digitally savvy. As such, to be a great product lifecycle manager you should be certified or well-versed in the technology, tools, and platforms that are standard within the sector. 

If you work in a specific product niche, conduct extensive research and gain every relevant credential possible. Not only will this make you more credible, but it will also provide you with a level of working knowledge that will give you an all-important edge on the competition—the kind of edge that will empower you to streamline and optimize every initiative you undertake.

Continual adaptability

In the age of information, technology evolves at a rapid rate. That said, every great product lifecycle manager should be completely adaptable to change—evolving with ever-changing methods, innovations, and concepts on a continual basis.

As a product lifecycle manager, it’s vital that you invest ample time in developing your skills and keeping your finger on the pulse. A lifecycle manager must be robust and innovative, and to be an ongoing success must adopt a mindset of lifelong learning.

If you read regular industry publications, attend expos and webinars, and enroll in courses that will help you refine your existing skills (or learn new competencies), you will propel yourself from good to great.

Analytical skills

We live in an age rife with digital data.

That said, to be an exceptional product lifecycle manager, it’s important to possess a sharp eye and analytical skills to match.

At every stage of the production journey, data will empower you to spot emerging trends, identify weaknesses, and make informed decisions that will accelerate the success of the process. Moreover, by harnessing data analytics to its fullest potential, you will be able to work with key performance indicators (KPIs) to set success benchmarks and foster smooth collaboration between departments. 

As a guide, here are the three key metrics you should know in great detail (these are particularly pivotal during the early launch and development stages):

  • Traffic to product pages: An indicator of engagement and product interest
  • Conversion rate: The percentage of users or consumers that take the desired action
  • Adoption rate: The rate at which a product is acquired and used in certain marketplaces

By developing a deep understanding of essential PLM metrics and learning how to extract every last drop of value from the data while working with dynamic business intelligence (BI) tools, you will gain a level of insight that will make you an incredible product lifecycle manager.

A way with words

When it comes to product lifecycle management, this is an attribute that people often overlook. But to become great, having a confident, articulate way with words is essential.

Almost every day in the working life of a product lifecycle manager is crammed with conversations, both in person and via project management platforms, remote conferences, and email exchanges.

As a product manager, it’s your duty to share and deliver a wealth of product-related information to a variety of stakeholders, both internally and externally. That said, you need rock-solid interpersonal skills, excellent public speaking abilities, and writing attributes that will allow you to adjust your tone or language depending on your point of contact.

Every great product lifecycle manager has an extensive way with words—in every situation and across all platforms. Work on these skills and you will accelerate your success in the fast-paced world of PLM. 

Sales skills

As a product lifecycle manager, you will need to be able to sell a vision to potential partners throughout every project.

Naturally, having a way with words will help you sell your vision to potential engineers, manufacturers, marketers, stockists—the list goes on. But in the digital age, having digital selling skills is also imperative. These competencies include the following:

  • Targeted content creation to engage specific users and generate leads
  • Building trust through social media engagement
  •  The ability to optimize conversions through innovative promotional campaigns
  • Superior digital research skills to understand your target sector on a deeper, more meaningful level

To generate and nurture leads across a host of touchpoints—from social media and email to mobile applications and beyond—you will need to have an astute ability to be persuasive and build relationships both in person and in a virtual sense. Acquiring this attribute will boost your career prospects, exponentially.

Accountability and the ability to lead

As a product lifecycle manager, the ability to take accountability and lead a project with respectful authority is perhaps the most important soft skill you can possess.

Not only will you have to take the helm concerning strategic decisions at every stage of the journey, but you will also need to guide each entity within any given project towards one common goal. 

If a roadblock presents itself or an issue occurs, you must be accountable and take ownership. And, if you believe that individuals require additional support or guidance, it will be up to you to listen and offer mentorship—well, you will if you’re a great product lifecycle manager.

Moreover, at the growth and maturity phases of the lifecycle, you will need to display powerful leadership skills to spearhead new commercial relationships and reach bold new marketplaces.

Product lifecycle management: Unlock better & higher value products

Bringing an idea to life is no easy feat, and that’s an understatement. But with the passion, drive, and commitment to acquiring the right attributes, it is more than possible.

Expectations and demands for better products continue to grow and as organizations work fast to keep up, their product portfolio also grows and becomes more complex. 

The product manager’s work is never truly done but having the right PLM system in place will help them meet these demands by ensuring that the entire organization is focused on producing high quality products that ensure customer satisfaction.  

The whole process of PLM should primarily revolve around providing better value for your customers to truly have a successful product in your hands. 

To deliver better value, it’s also important to collect feedback at each stage of the product management lifecycle as it helps teams to continuously validate and optimize their products and to reveal hidden possibilities and ideas for a product.

Article

12min read

Code Freezes: Are They Still Relevant in Agile Practices?

During peak traffic season, the topic of code freezes often comes up as a way to deal with the influx of exceptionally high traffic during that time.

Code freezes may seem like an outdated concept nowadays, a leftover from the days when rigid Waterfall methodologies offered the only option for product development and release.

The whole concept of stopping production and delaying release—just to test for bugs and other functional issues—has no place in Agile and DevOps practices where code is tested and verified at each stage of the development process.  

At least that seems to be the general consensus for many tech teams.

But does it hold up? Once you scratch the surface of the most common arguments against incorporating code freezes into Agile product management, will they still seem archaic?

In this article, we’ll explore the three main arguments against incorporating code freezes into your Agile product management, and we’ll break down where those arguments fall apart, all to help you make a better decision about whether or not you should incorporate code freezes into your organization’s workflows.

What’s a code freeze?

We will first start with what a code freeze actually is to understand whether it still has a place in modern software development.

A code freeze is a traditional practice among developers to stop making changes or pushing new code to ensure site or app stability during a certain period of time. A code freeze is usually implemented during periods when higher traffic than normal is expected, particularly for e-commerce websites during the holiday season. 

What does this mean? During busy periods in the e-commerce industry, you are temporarily refraining from making any changes to the website. Any changes to impact the user experience during peak traffic time can ultimately result in a loss of conversions and profit.

In other words, a code freeze is done as a way to safeguard against any potential mishaps because of the extra load on a website

Let’s look at a practical example: developers decide to introduce a new code change during Black Friday when there is a high volume of traffic with shoppers looking to get the best deals. However, it turns out that there’s a bug they hadn’t anticipated. With the website facing downtime as developers quickly attempt to fix the issue, this may result in loss of potential revenue as customers are unable to complete their purchases.

To avoid this worst case scenario, developers instead impose a code freeze time, a time where no more code changes are made. This is done to ensure a website is up and running without any issues until this high traffic period ends.

What does an Agile methodology entail?

We will discuss the idea behind the Agile concept to better determine whether it aligns with code freezes before we explore the most common arguments against them.

The Agile methodology seeks to break up projects into regularly iterated cycles known as sprints and is largely driven by consumer feedback. This helps teams deliver more value to consumers quickly.

In other words, this methodology encourages continuous iteration and improvement of products and testing throughout the software development life cycle.

By breaking down development into sprints, cycle time is reduced, increasing speed-to-market and allowing teams to respond to market demands faster.

With this in mind, a code freeze may potentially reduce the ability for teams to quickly deliver value as they impose a freeze period.

Next, we’ll look at some of the common arguments against code freezes in the context of an Agile methodology.

Argument 1: Code Freezes are Irrelevant and Unnecessary

This argument is pretty simple and concrete— modern Agile methodologies and tools have eliminated the need for a dedicated QA and testing window.

Agile methodologies such as peer code reviews, pair programming, and the constant monitoring of system health give you much greater visibility into an application or feature’s performance while it’s being developed. Bugs and issues are easier, and more likely, to be caught during development itself, and resolved prior to any dedicated testing and QA activities.

The more refined your approach to Agile, the more you will try to shrink this window of time. The most refined current approaches to Agile are Continuous Integration and Continuous Deployment (CI/CD),

These processes aim to break development into small, incremental changes in order to “release” changes to the code as quickly as possible. In the purest application of CI/CD, development and release barely exist as distinct phases— new code is integrated into the application almost as soon as it’s completed.

New tools have also automated many tests. They constantly evaluate code to make sure it’s clean and ready for production at all times. Issues are identified in real-time, and alerts are immediately sent out to resolve them, reducing the volume of manual tests that need to be performed.

The result of these new Agile methodologies and tools is easy to see. Most of the core testing and QA activities performed during a code freeze are either being performed during development, or performed by software.

In Agile, software and features now exit development at a much higher level of confidence than they used to, making a dedicated code freeze harder and harder to justify.

Argument 2: Code Freezes Break a Core Agile Principle

This second argument is a little higher-level. Basically, it argues that code freezes don’t have a home in Agile methodology because they break one of this methodology’s core principles— reducing the time between development and release.

By contrast, you need to maintain distinct development and release phases if you’re going to deploy code freezes. After all, that’s where the code freeze lives— in between those two distinct phases.

Instead of trying to minimize or eliminate that window of time between development and release like most of Agile methodology, code freezes force you to formalize this window to the point that you need to build your development and release schedules around it.

If code freezes don’t align with core Agile principles, then it’s hard to make the case that they still belong in the methodology.

Argument 3: Code Freezes Lead to Slower, Lower-Quality Releases

This final argument is a big one, and it includes a few different angles.

Firstly, it argues that code freezes add a lot of complexity and additional moving parts to your roadmap, and naturally increase the chances that something will go wrong and throw off your timeline.

Even if nothing goes wrong, the work involved in code freezes is time-consuming and unpredictable (as you don’t know what bugs you will find or how long it will take to fix them), that by simply adding code freezes to your roadmap you will create slower development and release cycles.

It’s worth pointing out that, on the one hand, when you’re in a code freeze, developers will continue to develop code but without integrating or testing it while they wait for the freeze to be over. This will result in a build-up of code leading to greater risks and instabilities which could significantly slow down the momentum of your CI/CD processes. 

On the other hand, developers may want to get new code changes out before the code freeze period begins. This could lead to incomplete or poorly written code which may not undergo the usual thorough testing for the sake of saving time as they rush to get projects done before the code freeze. The end-result is lower-quality, less comprehensive software and applications.

Furthermore, code freezes may reduce your development team’s productivity. While Agile in general, and CI/CD specifically, keep your developers constantly working in an unbroken chain of productivity, code freezes force your developers to stop work at pre-defined intervals.

In other words, they could break your CI/CD pipeline.

By doing this, you will break your team’s rhythm and force them to try to work around your code freeze policies, instead of finding and maintaining whatever flow makes them most productive.

Making the Case for Code Freezes: A Losing Battle?

At this point, it’s looking pretty bleak for anyone who still wants to include code freezes in Agile methodology. There are some very compelling arguments and an overall solid case that, since the development of modern Agile methodology, code freezes have become:

  1. Obsolete and irrelevant
  2. Misaligned with modern development practices
  3. A barrier to rapid, high-quality releases

But while these arguments are compelling, and contain a lot of accurate information, they are not bulletproof. And there are fundamental flaws within each that need to be discussed before closing the book on code freezes as a useful element of Agile product management.

The Problem With Argument 1: Automated Testing Is Not Comprehensive

Automated QA and Agile development practices have increased the quality of code as it’s produced, that’s a fact. However, just because a piece of code has passed unit testing, that doesn’t mean it’s actually production-ready.

Even the most refined CI/CD approaches don’t always include critical steps—like regression testing—that ensure a piece of code is defect-free. When it comes down to it there are just some things you can’t test and resolve while a piece of code is in production.

If you choose to utilize code freezes, you aren’t going to give up the benefits of automated QA and Agile best practices.

You and your team will simply catch your code’s smaller, more trivial problems during production, clearing the decks to focus on catching larger, higher-impact issues during your freeze, such as the overall stability and reliability of your new software or feature.

The Problem With Argument 2: “Reduce”, Not “Eliminate”

While Agile is designed to reduce the time between development and release, there’s a big difference between trying to reduce this window, and trying to completely eliminate it. Doing so would be next-to-impossible, especially for larger projects.

The code freeze may be very short in CI/CD— or may only apply to a specific branch while development continues on other branches—but it still exists.

No matter how refined Agile became, there is almost always going to be a point in all development and release roadmaps where a new piece of software or feature will be evaluated in a fixed state before it goes out to real-world users.

The Problem With Argument 3: Rethinking Speed and Quality

If you utilize code freezes, you will add a new step to your development and release cycle and any time you add a new step to any process, you slow down that process and you create a new potential failure point. Code freezes are no exception.

But it’s important to take a step back, and to take a broader view of this slowdown and lost productivity.

If your feature has bugs, you will need to fix them, regardless of whether you caught those bugs during a code freeze, or whether they made themselves known after release. From a pure development perspective, the amount of time needed to fix them will be about the same in both scenarios.

But if you’re dealing with bugs in a live environment, you have a host of other issues you need to take the time to deal with, including:

  • Deciding whether to roll back the buggy feature or leave it live.
  • Taking your developers off their new projects, after they’ve begun work.
  • Making it up to your real-world users who were impacted by the bugs.
  • Answering to and managing your internal stakeholders who are not too happy about your problematic release.

The list goes on. There’s nothing more complicated, time-consuming, and destructive to productivity—for you and your team—than releasing a broken feature or product. Code freezes minimize the chances of this happening.

And as to the argument that code freezes lead to lower quality features and products because they reduce the amount of business requirements you can collect?

Your business requirements will always be little more than a “best guess” as to what your product or feature should function like. The most valuable requirements will always come from real-world users when deploying your product or feature in real-world scenarios.

How feature flags can replace code freezes

As we’ve already mentioned, a code freeze is done as a preventative measure against risky and/or faulty new code changes during sensitive periods. 

However, a code freeze could actually increase risk. As developers continue to work on new changes that don’t get released during the freeze period, this means that the next release will have a pile up of commits making this release incredibly risky. 

If any issues come up, it will be that much harder to pinpoint the source of the problem which means more time is wasted trying to locate and fix it.

This is where feature flags come in. Using feature flags means that developers no longer need to depend on code freezes during high traffic times to reduce the risk of code changes. 

By decoupling deployment from release, feature flags allow developers to deploy a new feature or code change into production and toggle it off so it’s not visible to users and then gradually release it to specific user sets—for example, internally within your organization.

As a result, teams can continuously ship new code and work on new features with customers none the wiser as they will be hidden behind these flags and can be toggled on or off at any time. Teams can also turn off— or roll back— a buggy change at any time with a kill switch so users no longer have access to it while it’s being fixed.

In summary, feature flags give teams more control over the release process and help reduce the risk of deploying into production, especially during particularly sensitive, high traffic periods without negatively impacting the user experience. 

Is it time to kill the code freeze?

Ultimately, code freezes still play an important role to avoid downtime or unexpected bugs during exceptionally busy times in the year.

Every e-commerce website is different so you will need to decide if a code freeze is the right choice for your website. If you do decide to implement a code freeze, draw up a carefully detailed plan in advance with your development team. 

This will help you determine what codes need to be frozen, what needs to be optimized and what projects should be put on hold to avoid “sloppy” releases before going ahead with the freeze period.

There are cases where they play a less critical role. Very small projects may not need dedicated code freeze periods, for example.

New features that have relatively minor consequences might not be worth the freeze. The same is true for phased release plans when you just want to test new features with a warm audience who you have primed to expect a buggy, imperfect experience, in which case feature flags are an efficient way to progressively roll out these features.

It is worth taking the time—even a very short period of time—to make sure your new features are as perfect as you think they are before you put them in the hands of the people who matter most: your real-world users.

This is where feature flags become your greatest ally to allow you to provide an optimal customer experience without having to pause your deployments.

However, keep in mind that feature flags are a great asset that should be used year-round and not only during periods of high traffic to minimize risk and maximize quality.

Article

8min read

Continuous Testing in DevOps

Nowadays, organizations cannot afford to make any errors. If something does go wrong, it will more often than not result in disgruntled customers turning to competitors for better satisfaction. Consumer frustration quickly results in losing any potential leads and conversions. 

This is why continuously testing software through the software development life cycle is the key to eliminate any errors and ultimately release better and higher quality products.

This is especially important if you’re looking to implement DevOps practices within your organization as DevOps often relies on the fast and frequent release of software.

Continuous testing is now needed to keep up with the demand for speed in the modern software development world and keep pace with DevOps and Agile practices that advocate for shorter delivery cycles to keep up with rapidly changing consumer demands.

In other words, continuous testing goes hand-in-hand with effectively adopting DevOps practices and workflows in your organization.

What is continuous testing?

The basic idea behind continuous testing is evaluating and verifying the quality of the software as frequently as possible starting from the early stages of development using automation.

This means that the software undergoes continuous, uninterrupted testing at every stage of the software development lifecycle from development until it’s eventually deployed to the end-user to assess the quality and performance of the software.

This is the idea behind ‘shifting left’ or ‘shift-left testing’, which entails testing early on the development cycle so that issues are discovered early on, largely through the use of automated tests.

Put simply, if we want to retain the momentum of continuous testing, it’s important to automate whenever and wherever possible.

Therefore, automated testing can be carried out on a frequent basis every time code changes are made enabling fast feedback loops to quickly fix any issues as they arise. With such quick feedback loops, developers can quickly and efficiently optimize and improve products to match customer requirements.

Continuous testing is an integral part of continuous integration and continuous delivery. 

This is because these processes require the software to go through a series of automated tests from unit tests early on in development in order to test single parts of a software to integration and functional tests to make sure that the individual parts work seamlessly together. 

Why is this so important for a DevOps methodology?

Think of it this way: traditionally, testing is typically completed after the software development process is done, at which point it’s sent to quality assurance to be tested. If bugs are found, then the software is sent back to developers so that they can fix these bugs.

The issue with this traditional form of testing is that it’s risky. When developers rush to fix any issues, they often fix these issues so late in the development process that things get complicated fast. In this sense, it can be time-consuming and could delay the release process, which defeats the entire purpose of a DevOps methodology. 

Moreover, DevOps embraces everything ‘continuous’, meaning it is dependent on continuous feedback and improvement through the implementation of continuous integration, continuous delivery and continuous testing.

Continuous testing enables teams to achieve the main goal of DevOps, which is to deliver high quality software quicker than ever before, hence reducing time-to-market and accelerating release cycles.

Benefits of continuous testing

As can be deduced from the above, continuous testing is a key element of DevOps and has a number of benefits including:

  • Accelerating software delivery and helps teams respond quickly and efficiently to rapidly-changing market demands
  • Improving code quality as software is assessed at each stage which, in turn, reduces risk and increases confidence
  • Helping discover bugs early on: this is important as the earlier bugs are discovered, the less costly it will be to fix and also allows for faster recovery
  • Ensuring immediate feedback and encourages better collaboration between testing and development teams as well as continuous improvement as teams can use the feedback to improve products’ reliability and quality
  • Reducing manual efforts, hence freeing developers to focus on more important tasks
  • Earning customer loyalty and satisfaction with products optimized for their needs
  • Facilitating the adoption of a culture of DevOps and fulfills its underlying goal which is delivering of quality software faster

Challenges of continuous testing 

While there are a number of benefits to continuous testing, there are a few challenges and points that teams need to take into consideration.

First, teams need to ensure that the test environments are exact replicas of the production environment to make sure that the software behaves as expected as it would in the production environment. 

Setting up these simultaneous environments will require careful coordination of the different test environments and consume considerable resources and investments that may not always be readily available.

Keep in mind that teams should not only focus on testing. Continuous testing is not just about automating tests but it also involves using the results of these tests to continuously improve and optimize products. Consequently, it represents an opportunity for team members to utilize the feedback from these tests to find areas for improvement in code quality.

Thus, teams need to successfully implement a system for fast feedback loops that helps them gather relevant feedback in real-time, which may require advanced tools.

Furthermore, continuous testing becomes more complex as the scope for the product grows and moves towards the production environment. The number of tests increases as does the complexity of these tests. This may result in delayed tests which could result in some serious bottlenecks delaying releases and defeating the whole purpose of continuous testing.

There’s also the issue of the tools being used not having enough scalability as more tests are run which could overwhelm the testing system

Best practices for continuous testing

  • Adopt automation wherever possible

Automate tests as much as possible to achieve faster releases and reduce the human error component that often comes with manual testing.

Automation is also a key enabler of DevOps implementation and by setting up an efficient CI/CD pipeline, this will help automate workflows to reduce manual tasks.

Moreover, your products will reach your customers faster helping you gain competitive advantage.

Keep in mind, however, that continuous testing and test automation are not the same concept even though they’re sometimes used interchangeably.

As we mentioned above, test automation is a vital part of continuous testing but that’s not all there is to it. Continuous testing evolves beyond the idea of test automation.

It instead encompasses all the tools, processes and teams that come with automation and which aims to verify software through feedback at every step of the development process.

  • Select the right tools

Automation isn’t the only key component of continuous testing. It also involves teams having the right tools at hand to make the continuous testing process more efficient and easier.

Teams need to select the right tools that will reduce manual operations so they can focus on more pressing things: building better software. Therefore, they will need to set in place a robust test automation framework that focuses on all aspects of testing-for each layer of the testing pyramid- from unit to UI tests.

Remember that whatever tools you opt for will largely depend on your organization’s and teams’ needs and overall objectives. 

Read more: our picks of the best DevOps tools

  • Track the relevant metrics

You will need to keep track of relevant metrics to measure the success of your tests. In other words, you will need to keep track of all the bugs that occur as well as the number of successful and failed tests.

For example, if you see the number of errors and bugs increasing, you know that you will need to look into your development process in order to rectify it and in the long run will help you improve the functionality of your products.

Keeping tracks of tests will also help create a more efficient continuous testing strategy.

  • Establish clear lines of communication 

One of the most essential contributing factors to successfully implementing continuous testing is getting teams to collaborate to avoid different teams working in silos. This will help prevent bottlenecks and conflicts from occurring which could disrupt the development process.

Therefore, constant and transparent communication will keep your pipeline moving seamlessly and will increase productivity among teams.

Feature flags: Continuous testing in production

So you’ve run all the necessary tests to verify that the software is working as expected before releasing it into production so users can access it.

However, continuous testing shouldn’t end in staging environments pre-production. It’s still imperative to test your releases even after they’ve been deployed to production and thus should be incorporated into your testing strategy and framework.

No matter how much you try to replicate your staging environments to match a production environment, it’s unlikely that it would end up being an exact replica. This means that errors and bugs may still end up in production even after thorough testing pre-deployment.

As a result, testing in production is essential to uncover these bugs that you may have missed in your previous tests.

But how do you implement a safe strategy to test in production to reduce major negative impact on your end-users?

Two words: feature flags.

Through progressive deployment, feature flags will allow you to control who sees (or who doesn’t see) the new feature allowing you to verify this feature before releasing it to everyone else. You can even choose to limit a release to internal users only, a type of targeting known as dogfooding so your team can verify the code in production before end-users have access to it.

Read more: How feature flags can bring efficiency to your CI/CD pipeline to deliver releases quickly and more frequently

Continuous testing: The magic ingredient for your CI/CD pipeline for better and faster releases

As we’ve seen, uncovering bugs early on in the software development lifecycle will make your life and development process much easier and more efficient, not to mention that nowadays having major bugs show up in production is a major business risk that organizations can no longer afford to make. 

To fulfil the goal of DevOps, which is releasing high quality software fast, continuous testing needs to be implemented.

Make sure you set in place a robust testing strategy that covers all the stages of the software lifecycle and above all, make sure that it fulfills your requirements and needs.

There are many tests you can run as part of an effective continuous testing strategy. However, keep in mind that continuous testing goes over and beyond test automation and is key to building and maintaining an efficient CI/CD pipeline as well as reducing risk while accelerating time-to-market.

Article

10min read

Building a Culture of DevOps

In our guide to DevOps, we discussed the increasing importance of this concept within the modern software development world.

To recap, DevOps can be seen as a cultural shift and a tactical approach that enables teams to collaborate more effectively in order to deliver high quality software faster than ever before.

In that sense, the main objectives of a DevOps methodology are to:

  • Increase speed to market
  • Continuously optimize software through continuous feedback loops
  • Break down barriers and remove silos between development and operations

With that said, in order to adopt DevOps practices, it’s important to keep in mind that it all starts with the culture within an organization itself as well as the people who are implementing these practices.

What is a DevOps culture?

DevOps is not a specific term or set of processes but more so about people and culture.

When we talk about building a DevOps culture, we’re not just referring to continuous integration and continuous delivery practices and automated testing. While these practices fall under the concept of DevOps, that’s not all this concept encompasses.

A DevOps culture is basically adopting the values that reinforce DevOps principles and incorporating its best practices and tools. You can look at it as a set of values that places emphasis on building an environment of continuous learning and encouraging open communication and feedback through cross-team collaboration.

In other words, a DevOps culture at its core means enhancing collaboration between development and operations teams to increase shared responsibility and accountability when it comes to software releases. It’s about those teams adopting a shared culture and mindset that allows them to focus on quality of software and speed of delivery.

The concept of DevOps also stresses the idea of continuous improvement by instilling such a culture of collaborative efforts throughout the software development life cycle.

The foundation that makes up a DevOps culture, then, is increased collaboration, transparency and communication between these teams that previously worked more in isolation to foster productivity.

How can you successfully achieve a DevOps culture?

Many organizations assume that since they have technology and workflow processes in place, they are successfully implementing DevOps.

However, as we’ve stated above, DevOps is much more than that. Sure, adopting these practices may improve the development process and increase velocity but these practices will only be effective if your team is not just blindly following a set of instructions because they are told to. You will need to establish the right team culture and mind-set that involves unified workflows to build better software.

A DevOps culture requires an environment transformation that fosters collaboration, trust and respect between team members and different teams. It’s important to ensure that teams share equal responsibilities and accountability throughout the project lifecycle.

Building a strong cultural foundation first based on these principles will allow your team to apply them much more easily in their day-to-day workflows so that DevOps becomes embedded within the organization as a whole. 

Consequently, unless these organizations actually adopt the cultural changes that come with DevOps, teams will find great difficulty in realizing the true promise of DevOps.

What does it take to build this kind of culture?

There are a number of principles that make up a culture of DevOps and applying them will help ensure that the implementation of such a culture will be truly successful. 

Below, we will outline some of these principles:

  • Start at the top

As mentioned previously, one of the objectives of DevOps is to break down traditional barriers and friction between development and operations teams.

Thus, to build a solid DevOps culture, communication and collaboration are imperative. To improve and facilitate communication and collaborative efforts between different teams, these teams must have a shared vision and goals that they can work towards.

How exactly can this be achieved?

By getting leadership to lay the groundwork for such a culture to flourish within an organization. Cultural change will only happen with top-down motivation so the idea is to start from the top and gradually make your way to the bottom.

In other words, it is important that senior stakeholders and leaders are involved and in full support of building an effective DevOps culture as good leadership tends to set the example for open communication by encouraging cross-team cooperation.

Leaders need to be advocates for DevOps, spreading its values across the organization as well as its benefits so that teams understand why it needs to be implemented across all workflows. 

However, DevOps is not a one-size-fits-all solution and so it’s not necessarily implemented the same way across different organizations. Every organization will have its own unique DevOps journey.

Needless to say, one DevOps team will not look the same as another. DevOps will only succeed if it’s aligned with what makes sense for your team and organization. 

One common trait that all good leaders share, on the other hand, is providing the resources and the set of practices necessary for teams to perform their jobs effectively while allowing each team to flourish in its own right.

Good leaders will also provide the kind of environment that will stimulate experimentation and promote knowledge sharing in order to nourish your DevOps culture.

  • Invest in the right people for your team

Just as important as good leadership, it’s equally important to establish the right team who understand the value of DevOps and will also advocate for it.

A cultural shift to DevOps starts with people and processes foremost. Focus on getting people with a problem-solving approach who are willing to learn and embrace your company’s culture and ensure they fit in with organizational DevOps vision so that they, in turn, can confidently lead this cultural change.

Afterall, your DevOps team will serve as the foundation on which all your DevOps efforts are built. The better different teams and team members collaborate with each other, the higher the quality of the end-product will be.

Therefore, every single member of your team must be willing to open up the lines of communication and enhance their collaborative efforts that will allow them to work together towards common goals.

In other words, implementing a DevOps culture will be more about changing your team’s habits and communication habits than just what tools they use.

This means you will need to begin assembling a team with a diverse background and expertise. Team members that come from different backgrounds can open up new ways of thinking and problem solving paving the way for innovative thinking.

  • Work towards common goals

One of the first questions you should ask yourself early on in your DevOps journey is what exactly the primary goal is.

Once that’s determined, it’s imperative that all teams have a clear understanding of where the organization is headed and that they’re all aligned around common objectives to have the right mindset in place.

This will help better orient your DevOps culture shift and will also help make better decisions when developing and deploying software as they use these goals to determine the kind of projects they should prioritize and products they work on that best meet business objectives.

This will include not only goals at the organizational level but also at team and project levels. Which goals you set will depend on the needs of your team and project such as reducing time to market or increasing efficiency. It will depend on the pain points and problems that your teams are facing, which is why ongoing communication is imperative.  

Again, leadership will play a huge role in communicating goals at all levels of the organization and sharing the overall vision to make sure all teams are on the same page.

  • Provide appropriate training and education

So you’ve lined up a great team but it’s not enough to get people with the right mindset. They will also need to receive the training and education necessary to be a productive member of the team.

As previously mentioned, leaders will need to be advocates for DevOps to educate on how and where DevOps practices add value to each team member and the organization as a whole.

DevOps teams will need to be involved throughout the software development lifecycle all the way from planning and building the software to deploying it. This will require that each team member has a well-rounded set of skills. As a result, teams will need to be trained on DevOps processes as well as the tools that will be used to carry out these processes.

Nevertheless, honing in technical skills should not be the sole focus. It’s just as important for teams to receive training on how to improve soft skills, primarily improving communication skills to enable cross-functional collaboration.

Training and education should be an ongoing endeavor for all teams and team leaders should make it a priority to check in often with team members to help them improve whenever necessary and open up lines of communication to create a safe space where everyone can freely participate.

  • Embrace failure

An essential part of DevOps is to encourage open communication between teams while at the same time giving them the space to be more autonomous and take ownership of their projects.

This instills a sense of shared responsibility as previously-drawn barriers are broken down and there’s a realization among everyone that they’re all in this together as they work towards ensuring the best possible outcome.

However, just as important as successes are, teams should also be encouraged to experiment with new processes and technologies to allow for continuous and faster innovation.

Therefore, failure should serve as a learning opportunity instead of pointing fingers and playing the blame game. Instead of talking negatively about things that didn’t work, teams can look at them as lessons to constantly improve.

By embracing failure, organizations can foster a culture of continuous learning and improvement so that team members are always learning and improving their skills as well as working towards further improving collaborative and communication efforts.

They can also incorporate these learnings to increase customer satisfaction and accelerate innovation to better meet fast-changing customer and market demands.

  • Automate wherever possible

A key aspect of a DevOps culture is automation in order to develop and deploy software more efficiently and reliably.

By automating processes, teams are able to continuously improve products and respond quickly to customer feedback.

Without automation, teams will need to perform numerous manual and repetitive tasks which could result in more delays and errors. On the other hand, automation frees up teams to focus on continuous improvement and innovation without worrying about tedious tasks which leads to better satisfaction for both consumers and teams.

Consequently, within any DevOps culture, it’s essential to have the right tools and technology at hand to ensure teams can perform their tasks and contribute to the software development and release processes as efficiently as possible.

In the long run, automation will save you time, money and resources and includes automation of vital processes such as infrastructure maintenance, software deployment and continuous testing to validate your releases. 

These tools should also play a large part in helping facilitate communication between all teams and team members and enhance their productivity.  

However, as already stated, remember that DevOps is not just about what set of tools you adopt but also the mindset of your team. 

DevOps: A gradual cultural shift that should be implemented organization-wide

Implementing a DevOps culture is so important today as it paves the way for open communication, collaboration and transparency which all serve to help you deliver better, more optimized products.

Building the right DevOps culture for your organization is not a process that happens overnight.

There are many key steps to take before fully embracing such a culture including preparing your teams for this shift by providing them with the necessary training and tools as well as instilling the DevOps culture mindset that comes with it.

A DevOps culture will not truly thrive unless your teams can come together and work collaboratively across common goals to deploy reliable software faster. This will require the support and commitment of leadership to create the right environment that promotes a DevOps culture and allow teams to make a seamless transition to the DevOps mentality. 

In other words, a true DevOps culture cannot be achieved unless the entire organization comes together as a tight-knit unit. Only then can you and your team reap the benefits of a DevOps culture that will ultimately deliver business value and drive growth. 

Article

8min read

Alpha vs. Beta Testing: What are the Differences?

Prior to the launch of a product, a number of tests are usually run to ensure that a software is ready for release and provides a good user experience. The purpose of these tests would be to validate the software before going ahead with a final release to your end-users.

These sorts of tests are essential to make sure that the software you’re releasing is free of bugs and meets the quality and requirements expected by your customers.

Among such tests are alpha and beta tests. These tests are conducted towards the end of the software development life cycle (SDLC) to test releases outside the development team to help uncover any issues that would otherwise not show up in previous tests that are run in more controlled environments.

What is alpha testing?

Alpha testing is typically run on internal users by the QA team (Quality Assurance) to make sure that the software meets all expectations and is working as it should. Thus, it represents an opportunity to evaluate the performance and functionality of a product release as well as obtain feedback from technical users.

In other words, the main purpose of this test is to uncover any bugs or issues to resolve them before the final product is released to users. It helps ensure bug-free functionality by carrying out tasks that a typical user may perform.

This test is usually performed when your product is nearly complete towards the end of the software development cycle in a staging environment, which attempts to mimic an actual production environment as closely as possible, but before beta testing, which we’ll get to later.

It seeks to answer the question whether your product actually works.

Alpha testing involves two main phases:

  • The first phase is run by software developers using debugging tools or software to catch bugs quickly.
  • The second phase is performed by the QA team and may involve ‘white box’ and ‘black box’ testing. A white box test will test the software system’s design and internal structure allowing QA testers to ‘look inside’ the product. A black box test, meanwhile, will test the system’s input and output functionality. 

 

The advantages of this type of testing are clear.
 

It allows teams to locate bugs and issues that managed to escape previous tests so that they may be fixed before they reach your end-users. 

Up until that point, tests were focused on testing specific parts of the software but alpha testing, on the other hand, looks to see if the software as a whole functions correctly.

In other words, it enables teams to validate the quality and functionality of their releases before it is released to customers. Put simply, Alpha testing opens up the application to receive initial feedback.

This results in improved software quality as the software is tested in an environment that is a very close replica of the environment it will eventually be used in, hence creating realistic testing conditions. This also allows the QA team to understand how the software will behave when it is later released to end-users.

To sum up, alpha testing provides an opportunity to put your product in real user environments but with technical users who are more adept at identifying and discovering bugs before conducting beta tests with actual real-world users.

However, conducting alpha testing may prolong the test execution cycle thereby delaying the release of the product to your end-users. Also, keep in mind that since the software is still in the development stage, alpha testing doesn’t provide in-depth testing of the functionality of the software.

Now, we will move on to the next testing phase, beta testing.

What is beta testing?

Beta testing involves releasing the software to a limited number of real users external to the organization. As a result, this type of testing is done in a production environment.

These users will then be asked to provide their feedback on the release, also named “beta version”. Beta testing, then, is an opportunity that allows users to test out the product to uncover any bugs or issues related to user experience (UX) before it is rolled out to the rest of your users.

In other words, it represents the final stage of testing before releasing the product to a wider audience. 

It also enables teams to run security and reliability tests as those tests cannot be conducted in a staging or lab environment.

There are many ways to implement beta testing. For example, often, companies will ask a select number of users to willingly op-in to get early access to the software. The advantage of this is that these users will be aware that the beta version may not be very stable and so they are more forgiving of any potential bugs and are happy to provide the feedback you need to optimize your product.

To be more specific, you may go for a closed or open beta test. In an open test, anyone can use the product but users are given a clear indication that the product is a beta version so they know that it’s still a work in progress. 

Meanwhile, in a closed test, as in the example given above, the testing is limited to a specific set of users, which would be by invite only. These users would be composed of early adopters, current customers or even paid beta testers.

Such exclusivity is one way to build close relationships with specific users as you are demonstrating that you value their opinion in particular before doing a wider release.

The advantage of this testing is clear. It is the first chance to test how the software will behave in real-world settings and observe how your end-users interact with it and what the user experience looks like.

Product managers, in particular, can make use of the feedback received to collect ideas and suggestions when planning future releases.

Beta testing is a way these managers can observe usage behavior and analytics to confirm that users are interacting with the product as expected. They may also run experiments and A/B tests of features to decide which one to choose for a general release. 

This, in turn, allows developers to uncover any bugs in real production and less controlled environments so that they may be fixed before a full launch.

Many bugs may have been discovered during alpha testing by your internal users but nothing can truly simulate real world users, which is why beta testing is necessary after alpha testing.

However, as we’ve seen, beta testing is conducted in real environments as opposed to controlled environments during alpha testing and so the former is more difficult to control.

Feature flags and beta testing: safer testing in production

During beta testing, you are essentially testing in production, which doesn’t come without its risks but luckily there is a way to mitigate those risks: by using feature flags.

A feature flag is a software development tool that helps decouple deployment from release, giving you full control over the release process. With feature flags, you can perform beta tests by enabling features for certain users and turning them off for everyone else.

Feature flags also act as a kill switch so that you can gradually roll out features to users to test performance and if something goes wrong, you can just as easily roll it back or turn off the buggy feature.

Feature flags are a great way for all teams within an organization to carry out beta testing as using feature flags for beta testing means even non-technical users such as product and marketing teams can turn on features for specific users, which means they’re not so reliant on development teams anymore.

Alpha vs beta testing

The major advantage of such types of testing is that it helps the development team to identify issues in advance before it goes to launch, allowing them to fix these issues early on before going for a full release. 

However, as already alluded to in above sections, there are still major differences between these two types of testing, some of which are summarized in the table below.

 Alpha αBeta β
TestersInternal employeesEnd-users or customers not part of the organization
Environment Requires a specific environment for testingDoes not require a testing environment
What’s testedFunctionality and usability are tested while security and reliability tests are not carried out in depthReliability, security and stability tests are key aspects of a beta test
Testing techniqueUses both white and black box testing techniquesFocuses mainly on black box testing 
WhenRun before the product officially launches to the marketRun after the product is launched
PurposeTest that the product is working as it should to evaluate product qualityUnderstand how real users interact with the product and to evaluate customer satisfaction 
DurationLong execution cycleShort process usually only lasting a few weeks
Post-test actionsAny bugs or issued discovered will be immediately rectifiedMost issues identified and feedback received will be implemented as improvements future versions of the product

Conclusion

Clearly, testing is important to ensure the delivery of high quality, bug-free releases. There are a number of tests carried out throughout a software’s life cycle, each of which serves a unique purpose. 

Read more: all about test environments and the type of tests that may be run as the software is being developed.

Here we looked at two important ones that occur towards the end of a software’s life cycle: alpha and beta testing.

Both alpha and beta tests are an important part of the testing process as they provide a valuable means to highlight crucial issues with your releases and provide user feedback, both internally and externally.

Alpha testing helps validate the quality of your software while beta testing allows you to obtain real-world feedback to ensure you’re building products that your customers actually like.

Therefore, in the testing lifecycle, both alpha and beta testing are essential.

Article

9min read

Flutter for Mobile App Development: Overview and Benefits

As mobile usage has increased and spread widely all over the world, mobile apps, as a result, have also risen in popularity. This means it’s important for app developers to stay current on the latest development tools in order to build high quality apps.

There are now many tools out there and if you’ve been keeping up with the mobile development world, you’ve probably already come across Flutter, which has generated a lot of buzz since its release in 2017.

What is Flutter?

Flutter is a free and open-source UI software development kit created by Google. It is used to develop natively compiled, multi-platform applications for mobile, web, and desktop from a single codebase and programming language.

This has greatly contributed to Flutter’s appeal and why it’s become so popular today.

It has been designed to support mobile apps that run on both Android and iOS allowing you to build apps on different platforms from the same codebase. This means, for example, that the code you used to publish your Android app can also be deployed on iOS, the web or desktop with little change.

Moreover, Flutter’s support for desktop devices means you can scale your app to Windows, Linux and Mac and hence reach more users on these platforms’ app stores.

Put simply, Flutter essentially provides a widget-based UI library, including UI elements such as text boxes, buttons and image blocks that can be used to create and personalize your app. 

To give a better visual of the coding process when writing your first app in Flutter, the below image gives a glimpse of a code for a basic Flutter app-everything in the code is a widget:

Source

We will come back to Flutter widgets in a bit but for a deeper understanding of Flutter, it is worth taking a look at its architecture first to understand the concepts that form its design.

Flutter architecture

Flutter consists of two major parts- a framework with a UI library based on widgets, which contains various reusable UI elements, such as sliders, buttons, text inputs, and others, and a software development kit (SDK)- the tools that help develop apps i.e., to compile code into native machine code for the use of iOS and Android.

The following image shows the major components of Flutter, which are organized around layers. This layered, extensible system exists as a series of independent libraries that each depend on the underlying layer.

Flutter Architecture Diagram

The three main architectural layers of Flutter consist of:

  • Framework: Developers interact with Flutter primarily through the Flutter framework, a modern reactive framework written in the Dart language. This framework provides a rich set of libraries that are divided into layers: basic foundational classes, rendering layer, widgets layer and Material and Cupertino libraries. 
  • Engine: In the diagram above, we can see that the next level of Flutter is an Engine written in C++ and which provides low-level implementation of Flutter’s core APIs.
  • Embedder: This platform-specific embedder provides an entry point and coordinates with the underlying operating system to access services such as accessibility, rendering surfaces, and input. The embedder is written in a platform-specific language such as Java and C++ for Android, Objective-C/Objective-C++ for iOS and macOS, and C++ for Windows and Linux.

Flutter uses Dart, also created by Google, for writing code. Dart is a client-optimized language for developing fast apps on any platform with the goal of offering the most productive programming language for multi-platform development.

You can look at Flutter as the front-end UI that you use to develop the app and Dart as the backend code that is automatically generated.

Dart compilers and runtimes support the combination of both just-in-time (JIT) compilation, which provides a faster development cycle and allows for hot reloads of the Flutter app, as well as ahead-of-time (AOT) compilation. AOT compiled programs usually run quicker as they are compiled before execution while JIT programs are executed at or just before runtime. 

Therefore, Dart combines the advantages of both JIT and AOT compilation: fast development cycles, and fast execution and startup times.

Everything on Flutter is a widget

In Flutter, basically everything is a widget, which is the core concept of the framework. Widgets are the building blocks of a Flutter’s app user interface and represent an immutable declaration of part of the user interface. In other words, they declare how a UI should look.

Thus, to build any app in Flutter, you start with a widget. The main underlying idea is that you build your UI out of widgets. Widgets describe what their view should look like given their current configuration and state. It includes a text widget, row widget, column widget, container widget, and many more.

To be more precise, Flutter draws its own widgets and uses the Skia library for rendering UI instead of relying on platform-specific components, which reduces communication between the Flutter apps and the mobile platforms. In other words, as Flutter uses its own rendering engine, UI built in Flutter can be launched on virtually any platform. This ensures consistency of the application interface across all platforms. 

As far as their layout, the widgets within a Flutter app form a hierarchy where a widget is a composition of other widgets and each widget inherits properties from its parent. Widgets, then, are arranged into a tree and nested inside of each other to parent and child widget.

The image below illustrates how the UI is built using widgets:

Flutter has a rich library of pre-built widgets, which speeds up and simplifies the process of creating a UI/UX. It’s also possible to create custom widgets.

There are primarily two types of widgets in Flutter: stateless, whose properties don’t change over time such as Icon, IconButton, and Text, and stateful, which are dynamic in nature such as Checkbox, Radio, Slider, InkWell and Form. 

Furthermore, Flutter has specific widgets specific to a particular platform – Material Design for Android or Cupertino style for iOS.

Benefits

  • Hot reload

Flutter enables faster app development using its hot reload which allows developers to view code changes as soon as they are saved. The changed code can then be reloaded immediately while the app is running and without losing the current application state, which means that developers can make quick changes and see the outcome immediately.

It also makes it easier to test out new ideas and experiment with new features helping boost creativity.

Reload in action

  • Enhanced performance

Unlike other cross-platform frameworks, there isn’t any kind of bridge converting Flutter widgets into the native components, which would slow things down and cause performance issues. Instead, Flutter’s core graphic machine, Skia (a 2D graphics rendering library), compiles the UI to native code without the need for any additional software as the user interacts with the app.

React Native, for example, uses JavaScript as a programming language to build an application and it uses a bridge to communicate with native components, which would affect the overall performance of the app.

As Flutter doesn’t need this bridge, apps built using Flutter run faster than apps developed with React Native.

  • Easy to learn and use

Compared to React Native or Java, Flutter is much easier to learn and use.

As discussed previously, Flutter uses widgets which makes the UI easy to use providing you with all the features you need to build your app.

The language Flutter uses, Dart, is also easy to learn especially for those who have already worked with other popular languages such as Java and C#.

  • Faster development and release time to market

One of the most prominent features of Flutter is its hot reload, as mentioned above. Hot reload allows developers to see changes to their codes almost instantly. In other words, with the Flutter framework, there is no need to recompile the code every time you make a change. This is what largely makes Flutter app development time faster than others.

Furthermore, since developers are working with one code base for both iOS and Android apps, this means they don’t have to write a platform-specific code. Any 2D-based UI can be implemented in Flutter without interacting with a native application counterpart.

Therefore, using a single code base, you can develop one UI design for both iOS and Android, which helps save time and resources.

  • Open to everyone

Flutter is open source and free to use and it also provides extensive documentation and community support in case any issues arise. Because of its rising popularity, Flutter has a fast-growing community of developers who are always ready to share their knowledge and experience so there’s a lot of support out there to help you get set up with the tool.

Flutter vs other app development frameworks

As we’ve seen, Flutter offers many advantages that arguably make it a superior choice to other hybrid development frameworks such as React Native.

There are many things that sets Flutter apart from React Native- things we’ve already mentioned such as the fact that the latter’s programming language, Javascript, requires a bridge to communicate with different native components while in Flutter no bridge is needed and so this ensures faster app development.

Also, the great thing about Flutter that also sets it apart is that it has UI widgets packaged within itself without relying on any third-party tools like React Native, which could affect app performance. In other words, within the Flutter framework, you have everything you need for developing mobile apps. Not to mention that Flutter provides a unified UI experience across all platforms.

Flutter is also ideal if you’re looking to build a minimum viable product (MVP) if you’re short on time using its expansive widget collection.

Many major companies today have used Flutter to develop their apps including:

Google Ads, Alibaba, Hamilton Musical as well as Reflectly (who provide their own take on why they decided to switch from React Native to Flutter). 

To sum it all up…

Flutter is a great choice for mobile app development projects of any size. Because it’s easy to learn and comes with clear and detailed documentation, developers can become acquainted with the Flutter framework quite quickly.

You can even integrate a feature flag solution inside your Flutter app, which will give you more control over your app releases by targeting certain user groups as well as allowing you to easily roll back releases in case anything goes wrong with minimal impact.

Feature flags will allow you to bypass app store validation as with remote config implemented through feature flags, any changes can be made instantly and remotely and then released to a small subset of users to get feedback before releasing it to everyone else. Therefore, you can upgrade your app continuously in real-time based on feedback from your users without waiting on app store approval.

With AB Tasty, you can easily get your Flutter app up and running on our feature flagging platform using our client library with preconfigured methods to implement the Decision API.

Article

13min read

What Are the Best Git Branching Strategies

In modern software development, speed and agility are crucial when it comes to developing and releasing software. However, when you have a large team of developers working simultaneously, branching and merging code can become messy fast. 

Therefore, teams need to have a process in place to implement multiple changes at once. This is where having an efficient branching strategy becomes a priority for these teams.

If you’re looking to enhance your team’s development workflow and streamline release processes, book a free demo to see how AB Tasty can help.

What is a branching strategy?

Branches are primarily used as a means for teams to develop features giving them a separate workspace for their code. These branches are usually merged back to a master branch upon completion of work. In this way, features (and any bug and bug fixes) are kept apart from each other allowing you to fix mistakes more easily.

This means that branches protect the mainline of code and any changes made to any given branch don’t affect other developers.

A branching strategy, therefore, is the strategy that software development teams adopt when writing, merging and deploying code when using a version control system.

It is essentially a set of rules that developers can follow to stipulate how they interact with a shared codebase.

Such a strategy is necessary as it helps keep repositories organized to avoid errors in the application and the dreaded merge hell when multiple developers are working simultaneously and are all adding their changes at the same time

Such merge conflicts would eventually deter shipping code quickly and thus hindering from creating and maintaining an efficient DevOps process as the whole purpose of DevOps is creating a fast workflow that would allow for the release of small batches of code.  

Thus, adhering to a branching strategy will help solve this issue so that developers can work together without stepping on each other’s toes. In other words, it enables teams to work in parallel to achieve faster releases and fewer conflicts by creating a clear process when making changes to source control.

When we talk about branches, we are referring to independent lines of code that branch off the master branch, allowing developers to work independently before merging their changes back to the code base.

In this post, we will outline some of the branching strategies that teams use in order to organize their workflow where we will look at their pros and cons and which strategy you should choose based on your needs, objectives and your team’s capabilities.

Why you need a branching strategy

As mentioned above, having a branching strategy is necessary to avoid conflicts when merging and to allow for the easier integration of changes into the master trunk.

A branching strategy aims to:
  • Enhance productivity by ensuring proper coordination among developers
  • Enable parallel development
  • Help organize a series of planned, structured releases
  • Map a clear path when making changes to software through to production
  • Maintain a bug-free code where developers can quickly fix issues and get these changes back to production without disrupting the development workflow


In short, implementing effective Git branching strategies is crucial for streamlined collaboration. Complementing this with robust Feature Experimentation allows teams to test and deploy features confidently, ensuring optimal performance across all channels

Git branching

Branches are not just exclusive to Git. However, in this article we focus on Git due to the many advantages this model of branching offers.

Consequently, before we delve into the various branching strategies out there, including Git branching strategies, we will take a look at how Git actually handles branches and why it’s a standout among other VCS tools.

Put simply, Git and other version control tools allow developers to track, manage and organize their code.

Git branches allow developers to diverge from the main branch by creating separate branches to isolate code changes. The default branch in Git is the master branch. 

The biggest advantage of a Git branch is that it’s ‘lightweight’, meaning that data consists of a series of snapshots so with every commit you make, Git takes a picture of what your files look like at that moment and stores a reference to that snapshot. This means that these branches aren’t just copies of the file system but simply a pointer to the latest commit. 

Meanwhile, other VCS tools store information as a list of file-based changes which may slow things down and use up significant space. 

In Git, a branch is essentially a reference or a pointer to the latest commit in a given context; it’s not a container for commits. As you create new commits in the new branch, Git creates new pointers to track the changes. Git branches, then, can be seen as a pointer to a snapshot of your changes. 

The images below illustrate this concept, where the top image shows the master branch and a pointer pointing to the last commit and the image right below it shows what happens when you create a new branch called ‘dev’- a new pointer now points to the latest commit.

Master Branch Illustration

To sum up, the Git branching model is lightweight compared to other version control systems; this is why it’s so easy and cheap to create branches in Git, as the whole code doesn’t need to be copied to the branch creating a large amount of duplicate files, as opposed to other VCS tools.

What are some common Git branching strategies?

GitFlow

Considered to be a bit complicated and advanced for many of today’s projects, GitFlow enables parallel development where developers can work separately from the master branch on features where a feature branch is created from the master branch.

Afterwards, when changes are complete, the developer merges these changes back to the master branch for release.

This branching strategy consists of the following branches:

  • Master 
  • Develop
  • Feature- to develop new features that branches off the develop branch 
  • Release- help prepare a new production release; usually branched from the develop branch and must be merged back to both develop and master
  • Hotfix- also helps prepare for a release but unlike release branches, hotfix branches arise from a bug that has been discovered and must be resolved; it enables developers to keep working on their own changes on the develop branch while the bug is being fixed.

The main and develop branches are considered to be the main branches, with an infinite lifetime, while the rest are supporting branches that are meant to aid parallel development among developers, usually short-lived.

Git Branching Illustration
Author: Vincent Driessen
source
License: Creative Commons BY-SA

GitFlow pros and cons

Perhaps the most obvious benefit of this model is that it allows for parallel development to protect the production code so the main branch remains stable for release while developers work on separate branches.

Moreover, the various types of branches make it easier for developers to organize their work. This strategy contains separate and straightforward branches for specific purposes though for that reason it may become complicated for many use cases. 

It is also ideal when handling multiple versions of the production code.

However, as more branches are added, they may become difficult to manage as developers merge their changes from the development branch to the main. Developers will first need to create the release branch then make sure any final work is also merged back into the development branch and then that release branch will need to be merged into the main branch.

In the event that changes are tested and the test fails, it would become increasingly difficult to figure out where the issue is exactly as developers are lost in a sea of commits.

Indeed, due to GitFlow’s complexity, it could slow down the development process and release cycle. In that sense, GitFlow is not an efficient approach for teams wanting to implement continuous integration and continuous delivery. 

Thus, in that case a much simpler workflow such as GitHub Flow is recommended.

GitHub Flow

GitHub Flow is a simpler alternative to GitFlow ideal for smaller teams as they don’t need to manage multiple versions.

Unlike GitFlow, this model doesn’t have release branches. You start off with the main branch then developers create branches, feature branches that stem directly from the master, to isolate their work which are then merged back into main. The feature branch is then deleted.

The main idea behind this model is keeping the master code in a constant deployable state and hence can support continuous integration and continuous delivery processes.

Git Branching Illustration

GitHub Flow pros and cons

Github Flow focuses on Agile principles and so it is a fast and streamlined branching strategy with short production cycles and frequent releases. 

This strategy also allows for fast feedback loops so that teams can quickly identify issues and resolve them.

Since there is no development branch as you are testing and automating changes to one branch which allows for quick and continuous deployment.

This strategy is particularly suited for small teams and web applications and it is ideal when you need to maintain a single production version.

Thus, this strategy is not suitable for handling multiple versions of the code.

Furthermore, the lack of development branches makes this strategy more susceptible to bugs and so can lead to an unstable production code if branches are not properly tested before merging with the master-release preparation and bug fixes happen in this branch. The master branch, as a result, can become cluttered more easily as it serves as both a production and development branch.

A further disadvantage is as this model is more suited to small teams and hence, as teams grow merge conflicts can occur as everyone is merging to the same branch and there is a lack of transparency meaning developers cannot see what other developers are working on.

GitLab Flow

GitLab Flow is a simpler alternative to GitFlow that combines feature-driven development and feature branching with issue tracking.

With GitFlow, developers create a develop branch and make that the default while GitLab Flow works with the main branch right away.

GitLab Flow is great when you want to maintain multiple environments and when you prefer to have a staging environment separate from the production environment. Then, whenever the main branch is ready to be deployed, you can merge back into the production branch and release it.

Thus, this strategy offers propers isolation between environments allowing developers to maintain several versions of software in different environments.

While GitHub Flow assumes that you can deploy into production whenever you merge a feature branch into the master, GitLab Flow seeks to resolve that issue by allowing the code to pass through internal environments before it reaches production, as seen in the image below.

Therefore, this method is suited for situations where you don’t control the timing of the release, such as an iOS app that needs to go through the App store validation first or when you have specific deployment windows.

Trunk-based development

Trunk-based development is a branching strategy that in fact requires no branches but instead, developers integrate their changes into a shared trunk at least once a day. This shared trunk should be ready for release anytime.

The main idea behind this strategy is that developers make smaller changes more frequently and thus the goal is to limit long-lasting branches and avoid merge conflicts as all developers work on the same branch. In other words, developers commit directly into the trunk without the use of branches.

Consequently, trunk-based development is a key enabler of continuous integration (CI) and continuous delivery (CD)  since changes are done more frequently to the trunk, often multiple times a day (CI) which allows features to be released much faster (CD).

This strategy is often combined with feature flags. As the trunk is always kept ready for release, feature flags help decouple deployment from release so any changes that are not ready can be wrapped in a feature flag and kept hidden while features that are complete can be released to end-users without delay. 

Trunk-based development pros and cons

As we’ve seen, trunk-based development paves the way for continuous integration as the trunk is kept constantly updated.

It also enhances collaboration as developers have better visibility over what changes other developers are making as commits are made directly into the trunk without the need for branches. This is unlike other branching methods where each developer works independently in their own branch and any changes that occur in that branch can only be seen after merging into the main branch.

Because trunk-based development does not require branches, this eliminates the stress of long-lived branches and hence, merge conflicts or the so-called ‘merge hell’ as developers are pushing small changes much more often. This also makes it easier to resolve any conflicts that may arise.

Finally, this strategy allows for quicker releases as the shared trunk is kept in a constant releasable state with a continuous stream of work being integrated into the trunk which results in a more stable release.

However, this strategy is suited to more senior developers as this strategy offers a great amount of autonomy which non-experienced developers might find daunting as they are interacting directly with the shared trunk. Thus, for a more junior team whose work you may need to monitor closely, you may opt for a Git branching strategy. 

Additionally, in fast-paced environments using trunk-based development, feature flags can provide the flexibility needed to ship incomplete features safely.

How to choose the best branching strategy for your team

When first starting out, it’s best to keep things simple and so initially GitHub Flow or Trunk-based development may work best. They are also ideal for smaller teams requiring only a single version of a release to be maintained. 

GitFlow is great for open-source projects that require strict access control to changes. This is especially important as open-source projects allow anyone to contribute and so with Git Flow, you can check what is being introduced into the source code.

However, GitFlow, as previously mentioned, is not suitable when wanting to implement a DevOps environment. In this case, the other strategies discussed are a better fit for an Agile DevOps process and to support your CI and CD pipeline.

The following table summarizes the strategies discussed in this article and which strategy is appropriate in which context:

Product type and its release methodTeam sizeCollaboration maturityApplicable mainstream branch mode
AllSmall teamHighTrunk-Based Development (TBD)
Products that support continuous deployment and release, such as SaaS productsMiddleModerateGitHub-Flow and TBD
Products with a definite release window and a periodic version release cadence, such as iOS appsMiddleModerateGit-Flow and GitLab-Flow with release branch
Products that are demanding for product quality and support continuous deployment and release, such as basic platform productsMiddleModerateGitLab-Flow
Products that are demanding for product quality and have a long maintenance cycle for released versions, such as 2B basic platform productsLargeModerateGit-Flow

To sum up, there is no such thing as the perfect strategy. The strategy you choose will depend on your team and the nature and complexity of your project and so this should be evaluated on a case-by-case basis.

It’s also fine to start off with one strategy and adapt it over time according to your needs. Needless to say, whatever strategy you end up choosing should aim to increase your team’s productivity by giving them a clear and consistent strategy to organize their work.

? Pro Tip: Want to personalize developer experiences across branches or environments? Explore our Personalization Guide for insights.

Article

11min read

Test Environments: Differences Between Dev, Staging, Preprod…

During software development, software goes through a series of stages. Testing, for its part, is a critical stage of the software development life cycle as it can determine the quality of the software that is to be released to live production environments.

In this article, we will be focusing on test environments and the types of testing that can be run in such environments and why test environments are an important part of your software pre-release strategy.

What is a test environment?

Once software tests are designed, they need an interface where they can be run or executed; this is what is referred to as a test environment.

A test environment is basically a combination of hardware, software, data and configurations in order to run tests.

Test environments need to be configured according to the needs of the software being tested and must be set to ensure that the software operates in the right conditions. In other words, there is no one-size-fits-all solution as it is the code that dictates the environment’s setup.

Thus, no two test environments are the same as they require a different setup to test different parts of the code- the parts that make the whole.

Certain test cases may also require the environment to be prepared according to a particular set of data. This is what is referred to as a test bed. Thus, a test bed is a test environment prepared with test data to help you identify cases requiring a particular data setup.

The main purpose of such environments is to allow QA teams to check system components and uncover errors and issues so the environment must closely replicate real user conditions. Once issues are detected, they can be fixed without affecting real users and negatively impacting their experience.

The elements of a test environment include the following:

  • The software to be tested
  • Test data
  • Network configuration
  • Device on which the software is to be tested
  • Database server

Types of environments

Before we delve deeper into test environments, we will first discuss the types of environments that precede and follow test environments. In this context, environments refer to the server location of the application or software, which are divided according to the state of the software.

Generally speaking, there are four types of environments in software development:

  • Development
  • Testing
  • Staging
  • Production

We will briefly go through each of these environments to better understand how they are linked to distinct stages in the release process.

Development environment

As the name suggests, this is where the development of the software takes place. It is the first environment where developers write the first lines of code and do all the code updates.

This environment usually consists of a server that is shared by several developers working together on the same project.

Therefore, when multiple developers are involved, a developer would have a copy of the source code on their own machine and then changes are submitted to the repository which are then integrated into the trunk or branch.

A number of preliminary testing takes place at this stage before moving on to the next stages.

For example, if developers have adopted a continuous integration methodology for their software development process then several changes daily would be committed to the trunk.

Testing environment

The testing environment allows QA engineers to test new and changed code whether via automated or non-automated techniques.

Development environments are ever-changing as developers keep adding new functionalities which makes it difficult for QA teams to run time-consuming tests so a testing environment is where they can execute more complex and time-consuming tests.

The code at this stage usually goes through more than one QA environment where unit tests are first conducted and the code is moved to further test environments.

Thus, you can either run tests one after the other or you can create several testing environments that allow for parallel testing to take place, depending on the sophistication of your testing environment.

More details about the different types of software tests will be discussed in the next sections.

Nonetheless, the focus here is testing individual components rather than the entire application, to check the compatibility between old and new code, the system’s performance and so on.

If there is a test failure, the faulty code can be removed in this environment. Thus, testers can ensure the quality of the code by finding any bugs and reviewing all bug fixes. However, if all tests pass, the test environment can automatically move the code to the next deployment environment.

Staging environment

This environment is a nearly exact replica of the production environment so it seeks to mirror an actual production environment as closely as possible to ensure the software works correctly.

The staging environment is often restricted to a small number of selected users and so it is limited to certain IPs and developer teams.

The purpose of this environment is to test on a near-production level but in a non-production environment to verify that the application will behave correctly after deployment. Thus, it represents a safe space away from the public eye to make sure everything works as expected; it is kept invisible from end-users.

The focus here is to test the application or software as a whole. In other words, staging environments are where you can conduct tests to ensure that no problems come up in production and limit negative impact on users there so that when the software is deployed to the production environment, there will be fewer errors to fix.

Examples of the kind of test that can be run in this environment include smoke testing and in particular load testing since it can be difficult to replicate high volumes of traffic in a staging environment to test the software or application under stress.

However, keep in mind that a staging environment is not meant to be a substitute for a real-world production environment.

To ensure your product works as it should, you need both a testing and staging environment, where the testing environment makes sure that every component does its job while the staging environment ensures that your software would behave correctly in an environment almost exactly the same as production.

While you can run many tests in a staging environment, the best way to truly determine how a feature performs is to test it on users in real-time, for example, through testing in production.

Production environment

This is where the software is produced and is running on a production server. It has officially gone live to real users.

When deploying a new release to production, rather than immediately deploying to all users, the release can be deployed in phases to a segment of your users first to see how it performs to catch and fix any additional bugs before deploying to the rest of your users.

In other words, just because you’re in the production environment, it doesn’t mean tests have to end here. You can and should still be testing in production. This can be done with the help of feature flags, which allow you to safely test in production on a pre-selected number of users.

Now that we’ve covered the main environments a software progresses through in its lifecycle, we will turn back to test environments and the type of testing that can be conducted in that particular environment.

Why is software testing required?

While we’re big advocates of testing in production, we acknowledge that some cases require dedicated test environments before moving forward onto production environments.

Before we move further to the types of software tests, it is important to shed light on why software testing is an essential modern software development practice. Choosing to skip this process is not advisable and may end up negatively impacting your products and business.

Before we move further to the types of software tests, it is important to shed light on why software testing is an essential modern software development practice. Choosing to skip this process is not advisable and may end up negatively impacting your products and business.

Below are just some of the reasons why software testing is so imperative nowadays:

  • Cost effective– testing your software will end up saving you money in the long run as testing the software will allow you to uncover bugs early on when it would cost less to fix them.
  • Security– software testing ensures that the software you’re releasing is free of any issues and thus you can guarantee your customers that your products are trust-worthy and safe to use.
  • Product quality-as software goes through continuous and diversified levels of testing, this ensures that bugs are detected along the software’s development process resulting in higher quality products.
  • Customer satisfaction– one of the main reasons tests are conducted are to ensure they provide the best user experience possible by making sure that the releases are stable and without any issues thereby achieving customer satisfaction.
  • Continuous delivery– an efficient setup of software testing would allow developers to push code changes into a CI/CD pipeline to go through the various levels of testing. If the code passes the tests, it can be automatically into production and if it fails it would notify developers so that they fix the issue. In other words, setting up automated testing allows you to maintain continuous delivery and to deliver higher-quality releases to end-users quickly.

Meanwhile, having a test environment to run these tests is essential as it provides you with a dedicated environment where you can isolate the code and verify the behavior of the application so it provides you with accurate feedback about the quality and performance of the software you’re testing.

Types of software testing

There are different types of tests that help analyze various elements of the software such as performance, security and user experience.

While a staging environment allows teams to replicate real testing conditions, tests will still need to be run beforehand to test its individual components to make sure that it all works well together to satisfy quality assurance requirements.

Below, we will highlight some of the most common tests which can be run during the software’s lifecycle:

Performance testing

These tests measure how fast an application responds to an interaction and so various aspects of the application such as page load speeds, stability and reliability are tested so that developers can make improvements as needed.

System integration testing

The main purpose of this testing is to ensure that all modules of an application work together smoothly and can communicate with each other. The interaction with the database is also tested.

Thus, it is all about making sure that the individual parts can function together as a whole.

User acceptance testing (UAT)

This testing is conducted to ensure that the application meets the business requirements of users and to ensure that functionalities of the application achieves customer satisfaction. UAT requires the whole application to be up and running and so usually represents the final stage of testing.

This type of testing also usually requires a staging environment- identical to a production environment but not accessible to end-users.

Alpha testing

After user acceptance testing is carried out within the development and product teams, testing can be expanded to include other kinds of users.

During Alpha testing, the release is tested outside of the teams involved in the project. It is typically conducted on internal users or employees within the organization and is usually followed by beta testing.

This test helps identify any bugs or issues before finally releasing the software to the end-user.

It attempts to simulate a real user environment by carrying out the same tasks and operations that the actual user will perform within the release to make sure it satisfies all of its functionalities.

Beta testing

In this testing environment, the software is released to a limited number of real-world users outside the organization to obtain their feedback which is then forwarded back to developers to optimize and improve the release as needed before releasing to all users.

It also tests the application or software under stress, where such load testing will help uncover any bugs that were not previously spotted.

Read more: Difference between alpha and beta testing

Test environments best practices

As we’ve seen, testing is an essential part of the software development life cycle and so test environments must be efficient and reliable to ensure the quality of your products and they must be well-managed.

In this section, we’ll highlight some of the essential best practices for test environment management:

First, it is important you start testing early on in the development process. In other words, don’t wait too long to run tests on every commit.

Otherwise, when teams don’t test early, they end up with a number of bugs later on and at that point fixing these bugs would require a lot of time, cost and effort.

Second, try to reduce manual processes by introducing more automation as that will save you time and resources while your team can dedicate their time to building and improving the product instead of tedious manual tasks.

Furthermore, before creating yet another new test environment, verify if it’s possible to use an existing one. If you already have an existing infrastructure, then that will go a long way in saving you time and money.

Another thing to verify is that you actually have all the required software and hardware, which includes physical servers, licenses, operating systems, etc.

It also goes without saying that you need to consider how to ensure the maintenance of the test environment such as who’s responsible for its maintenance and how to ensure the reliability of the environment.

The main takeaway here should be to…

Test, test and then test some more starting early on in the software development process.

To reiterate, test environments represent an efficient and a safe space to conduct all your essential and most basic tests.

However, don’t forget that just because you think you have run a sufficient number of tests in your test environment that you should discard testing in production altogether.

Yes, test environments are great for ruling out bugs early on but they are not an actual production environment. The best way to guarantee the quality of your products is to test them on a segment of your users during production, i.e in the production environment.

You can now do this safely with feature flags, which allow you to test on a small segment of users and disable any buggy features instantly.

Find out how AB Tasty leverages the power of feature flags to safely test new features in production by signing up for a free trial now.