Student Spotlight: Maureen Sears of HC3!

We recently caught up with Maureen Sears, Project Manager at HC3, to ask her about the impact that her recent Scrum Master and Product Owner training has made in her professional life.

HC3 is a data-driven tech company delivering customer communications for their clients. By managing complex data generated from multiple client systems, they help financial service organizations communicate with their customers in meaningful ways. HC3 offers focused solutions for statement and notice redesign, intelligent marketing campaigns, and seamless delivery of both print and digital communications. Through these solutions, HC3 empowers financial service organizations to give their customers a fully customizable document experience.

You can find out more about her company, HC3, right here.

Since this was a short interview format, I’ll just list the questions along with her responses below!

Q: How has the Scrum Master and Product Owner training changed the mindset with which you approach your business?

As a team, our Project Management team has adopted a more fluid perspective on how we handle implementations. Our improved mindset allows us to more easily adapt and grow with challenges that come our way.

Q: Have you incorporated any of the training into your workflow yet?

One of the most important pieces of training that we have incorporated into our workflow is the feedback loop.

Constantly sharing ideas between other departments and getting feedback from our clients has enabled us to deepen our understanding of other departments to create a better experience for our clients.

Q: Have you seen any immediate benefits to bringing these thought processes into your business?

Our digital solution HC3 offers our clients is constantly evolving and improving, so the implementation process is constantly evolving and improving at the same time.

We have been able to refine the process and tool more rapidly than ever before by including a constant internal and external feedback loop.

Q: Do you think LSM/LSPO training would be helpful for other startups?

This training did a great job of building the foundation for working in the Scrum world. It would be extremely beneficial for a startup because it is easier to get everyone’s commitment to building a new process instead of changing an existing one.

Q: Would it be an added benefit for all members of a team to have this training (so that everyone understands it and are on the same page)?

We were fortunate enough to have members of our project management team, as well as the manager of the development team, participate in the training. Having everyone together to think about how we could apply this knowledge in our work environment and bounce ideas off each other during the course was invaluable.

If you are interested in learning more about our LSM (Scrum Master) and LSPO (Product Owner) training classes then head over to our class page to get the details. Currently, those living near Birmingham, AL might even be eligible for a full scholarship to attend!

Student Spotlight: Ethan Summers of Fledging!

We recently caught up with Ethan Summers, Commercial Operations Lead with Fledging, to ask him about the impact that his recent Scrum Master and Product Owner training has made in his professional life.

Fledging is part of Birmingham, AL’s rapidly growing tech startup community and they are doing some awesome things with product design and release in the portable SSD space. If you have a need for fast, secure, portable, and stylish storage, check them out here.

Since this was a short interview format, I’ll just list the questions along with his responses below!

Q: How has the Scrum Master and Product Owner training changed the mindset with which you approach your business?

We’re building into everything. We’re a startup in an industry full of tech titans with huge bank accounts, so all we really have is our creativity and agility. Scrum is helping be a lot more nimble. One major way is our Product process. We’ve rebuilt how we evaluate product concepts so that we get to “Yes” or “No” faster and in a validated way. 

Q: Have you incorporated any of the training into your workflow yet?

We’re right in the middle of that right now. The Product example above is one good example. But we’re trying to use it for everything. We don’t see any domain as off limits, even the “perpetual work” domains like our Production team, because they can run process improvement sprints or even decide to treat a whole month, with all its Production demands, as a kind of sprint. We’ve also started using concepts like the Daily Roundup right away. 

Q: Have you seen any immediate benefits to bringing these thought processes into your business?

We have! The Daily Roundup came at the perfect time during the quarantine. It would be really easy to lose touch with each other. Instead, we implemented Daily Roundups and now we all touch base at the beginning and end of each day to discuss what we’re working on, expected roadblocks, and so on. Our team’s reporting a lot of satisfaction both personally and professionally with this process.

Q: Do you think LSM/LSPO training would be helpful for other startups?

As long as they’re not a competitor, absolutely! But it would be a terrible waste of time for our competitors. 

Q: Would it be an added benefit for all members of a team to have this training (so that everyone understands it and are on the same page)?

Yes, I think so. Our CEO already has the training. Our CSO and I went through the same class. We have a Software Engineer going through it right now and our Head of Operations goes in May. Frankly, I think everyone on our team should do it. 

If you are interested in learning more about our LSM (Scrum Master) and LSPO (Product Owner) training classes then head over to our class page to get the details. Currently, those living near Birmingham, AL might even be eligible for a full scholarship to attend!

Environment settings in an Angular CI/CD build process

The Problem

When building large-scale Angular applications, most people eventually need to provide their application with environment-specific variables, which doesn’t seem like a very big deal on the surface.  After all, Angular provides us with the “environment.ts” file, right?

It should be as easy as filling in your environment settings and then using the environment variable throughout the site, but this method introduces a level of uncertainty into the build process that may not be acceptable for all applications.

This uncertainty comes primarily from the need to rebuild the application before those new variables are accessible.  For example, when changing from a Dev environment to a Test environment, the build process is at the mercy of hundreds of code packages that may or may not have updated since the last environment promotion.  This can cause time-consuming build errors that aren’t even related to the quality of your code.

In some instances, it may be possible to avoid these errors by locking down dependencies with something like “npm shrinkwrap.” However, due to the complexity of the Angular CLI build process, this approach still allows for the potential of different outputs. Even if you manage to get consistent outputs, it’s still time-consuming to constantly rebuild the application in a build pipeline that could potentially get backed up from rapid promotions.

The Solution

Before the application loads, retrieve a CI/CD generated settings file from the server, which allows you to make sure that an unchanged code base can get up to date settings no matter the environment. Here’s how our process works:

Create the configuration service

First, we create a service in one of your top-level Angular modules, typically the App Module or, if applicable, the Core Module.  You can also create this service in any non-lazy loaded module that provides services to the application.

@Injectable({
    providedIn: 'root',
})
export class AppConfigService {

    public settings: AppSettings;
    get WebUrl() {
        return location.protocol + '//' + window.location.host + '/';
    }
    constructor() {}
    public load() {
        return new Promise((resolve, reject) => {
            const self = this;
            const xhttp = new XMLHttpRequest();
            xhttp.onreadystatechange = function () {
                if (this.readyState === 4 && this.status === 200) {
                    const data = JSON.parse(this.responseText);
                    const jsonConvert = new JsonConvert();
                    self.settings =  jsonConvert.deserializeObject(data.BaseSettings, AppSettings);
                    resolve(true);
                }
                if (this.status === 404) {
                    reject('Server cannot find Appsettings.js file');
                }
            };
            xhttp.open('GET', 'appSettings.json', true);
            xhttp.send();
        }).catch(error => {
            console.error(error);
        });
    }
}

The “load” function is where we get our settings.  Unfortunately, we can’t use Angular’s built in HttpClient because it forms a circular reference with our authentication service, but depending on your project structure, you may be able to simplify this request with built-in Http functionality.

After we receive the data, we use an external library (Json2Typescript) to convert the settings JSON into a typescript class so we can include helper functions if necessary. We then assign this object to the “settings” property on this service to be used elsewhere.

Create the appSettings.json file

This file structure is entirely up to you and your preferred CI/CD tool, but here’s an example for reference.

{
  "BaseSettings": {
    "ApiUrl": "http://localhost:99999/api/"
  }
}

Include the appSettings.json file as an asset

Angular needs to be informed specifically about which files are assets so it includes them in the build process. We place our appSettings.json in the root “src” folder of our web application. Because of this, our assets list inside of the angular.json file looks like this:

"assets":[
     "src/favicon.ico",
     "src/assets",
     "src/appSettings.json",
     "src/web.config",
 ]

If you place the settings in a different folder, you’ll need to link directly the file, rather than the folder location (e.g., “src/assets/appSettings.json” rather than “src/assets/”).

Tell the app to load settings before launch

The last step on the client side is to make sure the application knows to load the settings before anything else initializes. This is done through Angular’s built-in APP_INITIALIZER function. Below is an example of our core module using the APP_INITIALIZER to load settings.

export function loadConfig(config: AppConfigService) {
  return () => config.load();
}

@NgModule({
  imports: [
    CommonModule,
    HttpClientModule
  ],
  declarations: [MainNavComponent],
  providers: [
    {
      provide: APP_INITIALIZER,
      useFactory: loadConfig,
      deps: [AppConfigService],
      multi: true
    }
  ]
})
export class CoreModule { }

Your factory function should return a function that returns a promise. As you can see, we’ve injected our App Config service and returned our “load” function, which will return a promise. Once that is completed the rest of the application will be allowed to load, and the configuration service, with settings, will be available throughout the application.

Configure the build service

At this point, your angular application should be set. The only thing left to do is configure the release service to change the appSettings.json for every environment, and your application should retrieve them properly when it starts. We use Azure DevOps build/release to update the appSettings.json file, but you can use any release-management tool that supports updating json files.