Sunday, June 11, 2023

Platform 2023 Talk: Adobe's journey into building an Internal Developer Platform

Adobe began its Cloud-Native journey back in 2015 and has since then expanded to over 200 multi-tenant clusters deployed across multiple regions and geographies. We have an average of >3 million containers with over 200 production deployments each day. All this has been made possible with Adobe's Cloud Platform called Ethos which provides high resiliency, reliability, and robust CI/CD capabilities to Adobe product teams. We are now expanding this platform into an Adobe-wide Internal Developer Platform (IDP) that aims to provide a seamless experience incorporating service creation, deployment, and management to over 5000 developers. The IDP will integrate and provide key capabilities across security, infrastructure provisioning, monitoring, diagnostics and GitOps-based CI/CD tooling using Argo. Adobe is also going through a massive project of modernizing its K8s cluster fleet which will lead to greater resiliency and considerable cost savings each year. 

Watch the video below!

Sunday, January 15, 2023

Key Learnings from a GitOps Based Deployment Product Launch

I recently oversaw the launch of a new GitOps based deployment tool at my company. As a Product Manager working on internal developer tooling, a lot of the products I work on are not commercially available, so some of the learnings may or may not apply to commercial products. Having said that, one theme is constant which is that any Product Manager needs to build products that add value for users (developers in my case) and solve a set of key problems that they face. 

I recently shared about a workshop we conducted around the Adobe IDP, so this product launch provides a solution for two key IDP components which are namely Delivery/Deployment Management and Workflow Orchestration.

Below are some learnings I want to share from this product launch, and I hope some of these points will be applicable to any product launch. 

Focus on Users

  • Users typically have a status quo bias in the set of habits and technologies they use, and our product is no different. It's important to evaluate areas where user behavior may need to change in your current suite of products based on pain points users have shared with you. In our example, we are changing user behavior to move them towards a modern way of doing CI/CD using GitOps as opposed to leveraging a more traditional deployment philosophy.
  • Lighthouse period is golden, use it really well to understand client pain points, their success criteria and to improve your product.

Pre-Mortem Helps

  • Pre-mortems could really help you identify things that could go wrong a few months after launch. I first heard about pre-mortems from Shreyas Doshi where he shared it here. We conducted this session a few months product before launch. I repurposed the original template and created it in Miro, which is a tool we use at Adobe. See this template we used with examples.

Prepare GA Checklist

  • Support/on-call engineers need to be trained on the product well before going GA.
  • Have a GA production launch preparedness/checklist. This checklist should include things which are blockers to GA, which include various aspects around security, scalability and support readiness etc. 
  • Prepare a press release/blog post clearly outlining all product capabilities and communicating benefits it will provide to users and publish it during GA.

Establish Baseline for Success Early

  • Define and emphasize the criticality of KPIs to measure success of the product. If not already done, work with engineering to add tracking on all aspects of the product.
  • Prioritize product bootcamps and trainings. Build a community of power users who will be your advocates and will be willing to contribute features back into the product.
  • Build necessary conversion/migration tooling for users of existing tooling to move them over without causing friction. Remember to proactively communicate any maintenance mode decisions to incumbent users so that they are not left surprised.
  • Scalability and performance of the product are absolutely critical to the success.

Continue to Focus on Simplification

  • Continue to simplify user onboarding and make it a priority whether it's automating repetitive tasks, adding the right level of abstraction or removing friction for users via great documentation. First impression is everything!

Be Prepared to Make Tradeoffs

  • Be willing to pause new feature work temporarily in favor of addressing critical aspects such as scalability, security, support, training etc.
  • Keep a close eye on new feature requests that will enable new client adoption. Prioritize these features and set expectations with those clients accordingly.
  • Avoid building features that add tech debt and be prepared to retire unused features. Always aim to identify alternatives which provide users with the solution to their problem instead of asking engineering to build those features.

Listen to Users and Evaluate Other Offerings

  • Engage with clients continuously to understand their pain points and drive adoption. Listen more and speak less during these conversations.
  • Be willing to evaluate/learn from external offerings (free or paid). There may be a better solutions out there which you could either incorporate or learn from.

Hope these points will be helpful to you. Please share any other points I may have missed.

Monday, October 10, 2022

AdobeDevBlog: ArgoCon Community Learnings from the Adobe IDP Workshop

Adobe was a diamond sponsor of ArgoCon and we hosted a workshop on September 21, 2022, to brainstorm and formalize the definition and capabilities of an Internal Developer Platform (IDP) with the community’s feedback. In this workshop, which was in the spirit of community open discussion, we shared our IDP journey, and brainstormed with other community thought-leaders on making IDP a reality, based on Argo and other open-source projects. In preparation for the workshop, we had shared the following GitHub document where we outlined the key capabilities of an IDP and gathered the community’s thoughts and feedback.

Here is a visual we came up with to formalize key capabilities of an IDP and here's a link to the full blog post.

Tuesday, February 1, 2022

AdobeDevBlog: Building Enhanced Security into Our Container Platform

In this post, we dive deeper into the security controls within Ethos that help safeguard our Continuous Integration/Continuous Deployment (CI/CD) pipelines, which are used to help deploy microservices across the Adobe ecosystem during service creation, onboarding, provisioning, and deployment. Here's a link to the main blog post on Medium.

Friday, November 19, 2021

AdobeDevBlog: How Ethos Powers a Cloud-Native Transformation at Adobe

I recently moved into a product management role at Adobe. This is my first post as a PM published on Adobe's Medium Tech blog about Ethos (the team I work in). Ethos is a cloud-native and cloud-agnostic platform (and principles) that streamlines the development, operation, and consumption of cloud services inside Adobe. Here's a link to it and below is a high-level architecture of Ethos.

Friday, July 16, 2021

Adobe Experience Platform Query Service Video Demo

In this post, I want to share a demo I created working for the Adobe Experience Platform Query Service product team. The target audience are primarily pre-sales and account teams but anyone can use it get a general understanding of how Query Service connects with external tools. Below is what I worked on to create this demo:

  • Identified a common telecom sector customer churn use case
  • Ingested online/offline data into Adobe Experience Platform using AWS S3
  • Mapped the incoming data files to relevant schemas and datasets
  • Used SQL to combine those datasets into one common dataset using a CTAS query
  • Created a simple churn analysis dashboard using Tableau and connected it to Query Service using PostgreSQL. 
    • Here's a link to it. Please note that the dashboard will not populate (due to AEP access requirements) but you can look at the general structure and fields being used.

Adobe Experience Platform Query Service is a powerful serverless tool that allows brands to analyze online-to-offline customer journeys and understand omnichannel attribution. Query service also allows you to join any dataset in the AEP Data Lake and capture the query results as a new dataset for use in reporting, machine learning, or for ingestion into Real-time Customer Profile. It provides customers with a rich set of SQL-based analytic capabilities to provide rich insights on customer data collected from all channels and devices.

In addition, here are some other practical applications of Query Service aside from combining AEP datasets and connecting to external data visualization tools:

  • Leverage Query Service to take a back up of AEP datasets.
  • Run pathing analysis, attribution analysis and sessionize raw data using Adobe defined functions.
  • Create new calculated attributes using existing data like creating a new calculation for Customer Lifetime Value (CLV).

Below is the video which is uploaded on YouTube and a direct link to it.

Sunday, June 6, 2021

Multi-Org Adobe Target and AEM Experience Fragment Integration and Governance Ideas

Adobe Experience Manager and Adobe Target integration is one of the most powerful and robust in the Adobe Experience Cloud. I wrote about some of the benefits of this integration back in 2019. In this post, I want to cover two topics within the context of these two solutions:

  1. Cross-IMS Org integration between AEM and Target
  2. General Target workspace governance and XF nomenclature ideas

AEM & Target Cross-IMS Org Integration

This is one topic I never got a clear answer to unless I tried and tested it myself. A well known fact about IMS orgs is that we cannot integrate solutions across which is absolutely true when it comes to the Adobe Experience Cloud Visitor ID among other solution but in this case, it is possible to integrate AEM with different Adobe Target instances via Adobe I/O. Having said this, I must also mention that it's not very common for us to see given most companies have a single Target instance but there are some Adobe customers that have multiple Target instances and orgs.

I've included the steps I took to set this up where I tested this using a single AEM author and two Target instances across two IMS orgs. Let's a closer look:

In AEM (6.5.x), go to Security - > Adobe IMS Configurations and either click on an existing Target integration or create a new one. In this case, I already have two integrations set up with two Target instances (2 IMS orgs). 

The first few steps are outlined in the next two screenshots which is key where we first need to generate the public certificate/key in AEM.

The next step is to upload the public key (called AEM-Adobe-IMS.crt) generated in AEM in the Adobe I/O console to integrate AEM with Target. I did this twice by uploading the public keys for both IMS configurations separately into each of the Adobe I/O consoles per IMS org.

You can follow the rest of the steps to set this up in Adobe's official documentation here and once it's set up, you can test the connection for both IMS orgs.

The final step is to connect to each Target instance and send Experience Fragments (XF) separately to both Target instances (and workspaces) in different IMS orgs.

Adobe Target Workspace and AEM XF Governance

This is another important topic that a lot of customers often ask about that's tied to best practices around creating a standardized process for organizing and naming workspaces and XFs in Target and AEM respectively. I previously wrote about a slightly similar topic about creating a segmentation governance strategy in AAM. 

A colleague of mine Ryan Lillis took the first pass at the Target workspace governance strategy so want to give credit where it's due and a lot of these concepts are also covered in Adobe Target's official enterprise permissions documentation so I highly recommend you review it.

Before we can set governance in any solution, it's important for us to understand the concepts of user access in any solution. I'm not going to explain each of the user roles or the core access functionality in Target (covered in great depth in the documentation) but I have taken a stab to visualize WHAT the users are given access to in Target. 

As you can see, the "Default Workspace" in Target has access to all Target properties and any additional workspaces do not have access to Target properties by default so you will have to manually add them to the workspace. This is an important concept as in AEM 6.5, you can share Experience Fragments directly to Target workspaces. 

Target Workspace Governance

Here are some options for you to consider when you're deciding your Target workspace strategy:

  • Workspaces by Brand: This works well in companies that have multiple brands and each business group operates differently.
  • Workspaces by Geography/Locale: This works well in companies that have multiple country sites/implementations/teams. 
  • Workspaces by Environment: Workspaces are tied to each unique site environment like Dev, QA, Stage etc. This is getting more and more common as more companies start sending XFs to these environments for testing before a launching to production.
  • Hybrid Workspaces: This typically works well for a large companies that are organized by various functions but eventually, it always makes sense to formalize it based on some fundamental construct.
It's also important to note that a company's organizational structure (divisional vs functional etc.) can also dictate how the workspaces are laid out but it's not very common as not every department necessarily has a testing program.

 Experience Fragment Nomenclature Ideas

I've seen examples where XFs are named as "XF1" to something which is well structured like "Site:Location:Offer".

In my experience, a good XF nomenclature has a delimited set of values that have a predefined logic to it and I'm only referring to cases where they're meant to be shared with a Target workspace. Some examples are:

  • XFs based on Brand: <brand>:home:summercampaign
  • XFs based on Geography: en-us:home:springcampaign
  • XFs based on Environment: <dev/stage>:home:wintercampaign
  • Hybrid XFs: <brand>:en-us:home:fallcampaign:20%off

These examples are probably oversimplified and generic but the main point I'm trying to make is that it's important to add some sort of structure to how XFs are named as we want to minimize any confusion and redundancy when these land up as offers in Adobe Target. The other important point is that both the developers in AEM and Target users should align on these before applying these widely to save time. 

Even though Target has robust filtering capabilities for offers (and others), this is how XFs will look in Target if the two groups won't align which in this example, shows inconsistency.

So, that was it! Hope you found this topic helpful. Please feel free to share with me your ideas on workspace organization or XF nomenclature best practices that you've seen work well.