Mario Cardinal

"The real voyage of discovery consists, not in seeking new landscapes, but in having new eyes" – Marcel Proust


Leave a comment

Enjoying the journey

It’s been eight (8) months since I left my job to focus all my efforts on developing To-Do Studio. Fortunately for me (and my sanity), I really appreciate my entrepreneurial journey. Having fun to pursue your business project is a necessity for any entrepreneur. This is the only option to persevere in the face of adversity. And adversity, there is. At each stage there are issues that make the work longer and more difficult than expected.

planandrealitiesFor example, recently, the programming of multiple identity support (OAuth 2.0 authentication) was much more complex than we had planned. Since it is very common for an individual to have multiple e-mail addresses, whether for personal needs or work, our service had to provide the ability for users to associate multiple identities to their unique account. This support allows a user to find all the workspaces to which he collaborates, regardless of the identity with which he is known by teammates (personal email or email from the employer). This is important because To-Do Studio wants to provide a global view that includes all facets of your life. We want to avoid multiple ‘sign in’ and ‘sign out’ repeatedly between different accounts. Multiple identities within a single account is a feature not much found in competing products such as email, calendar, to-do list, kanban board, or Excel spreadsheet. One of the reasons for this absence is surely the fact that it is not easy to implement.

With my business partner Erik Renaud, we managed to overcome this complexity by constraining ourselves to complete one goal at a time and setting a measurable goal with a short deadline.

The importance of completing one goal at a time

For several months, my work has come down to front-end programming with the Vue framework and Vuetify design system. It is a long-term job that requires many hours of programming. Every week, I work around fifty hours to advance my entrepreneurial project. Choosing your weekly goal is very important. I make sure I work on only one goal at a time and I do not start working on a new goal until the previous one is completed.

Very rarely, I manage to complete my weekly goal. Fortunately, almost always, I managed to complete this goal in the course of the following week. At some point, in the process of realization, I had to split a goal which proved to be too complex.

Every day, I identify the three (3) important tasks that I must complete. I usually have two tasks related to personal goals such as fitness or taking care of my family and a third task that aims to advance my entrepreneurial To-Do Studio project. Again, I do not start a new task until the previous one is complete.

The importance of setting a measurable goal with a short deadline

touching-the-voidRecently, I was reading the book “Touching the Void” written by Mountaineer Joe Simpson. He recounts the disastrous climb he made with Simon Yates of Siula Grande, a mountain of over 6000 meters in the Peruvian Andes. After reaching the summit, the expedition unfortunately turns into a tragedy when Joe Simpson fractures his right leg after a heavy fall against a wall. This situation is usually fatal for a mountaineer. Thus, during the descent, despite the help of his colleague Yates, unable to brake on such steep walls, Simpson ended up sliding over a cliff and was then suspended in the emptiness above a deep crevice. Seeing no other choice, Yates eventually cut the rope to save his own life, with Simpson falling into the crevasse. The book tells how, at the cost of superhuman efforts, Simpson will still manage to come out alive from the mountain after more than 3 days to crawl to base camp.

One of the important things I remember from the book is that, despite the pain and adversity, Simpson has managed to continue his journey by setting measurable goals with a short deadline. By crawling on the ground, he progresses by fixing a visible objective located less than a hundred meters in front of him, and, each time, giving himself less than 30 minutes to reach this target. Thus, firing with the strength of his arms and uninjured leg, for more than 10 kilometers, target after target, measuring his progress with the clock of his watch, slowly, he moves forward. This allowed him to keep the focus despite the suffering and delirium that inhabited him.

In any case, I cannot compare my entrepreneurial journey to what Simpson experienced. In my case, there is no suffering, no pain and the journey is pure happiness. However, I must recognize a similarity in the importance of setting measurable goals with a short deadline.


Leave a comment

MVP Renewal Day

Today, while processing my email on this beautiful Canada Day, I was happy to find my MVP renewal among the many messages in my inbox.

mvpFor fifteen consecutive years, I am the proud recipient of the Most Valuable Professional (MVP) award from Microsoft. MVP status is awarded to credible technology experts who have demonstrated their deep commitment to helping others make the most of their technology, voluntarily sharing their passion and real-world knowledge of Microsoft products with the community. While there are more than 100 million technical community members on earth, only a small portion are selected to be recognized as MVPs. Each year, around 2,000 MVPs are honored. They are nominated by Microsoft and other community individuals for this annual award. Candidates are rigorously evaluated for their technical expertise, community leadership, and voluntary community contributions for the previous year. They come from more than 90 countries, speak over 40 different languages, and are awarded in more than 90 Microsoft technologies.

I suspect that I am receiving this award mainly for my outstanding contribution as host of the Visual Studio Talk Show podcast. This French-language podcast, where we discuss software architecture, began in November 2004 (Yes! 15 years ago). With the help of co-host Guy Barrette, we publish a show with a French-spoken technology expert on a monthly basis.

Here is a listing of the podcasts we published lately:

June 5, 2019 0232 – Stephane Lapointe – Gouvernance dans Azure
May 6, 2019 0231 – Laurent Duveau – Vue
April 1, 2019 0230 – Alain Vezina – Le métier du DevOps
March 3, 2019 0229 – Maxime Rouiller – Durables Functions
February 9, 2019 0228 – Etienne Tremblay – Azure Pipelines
January 5, 2019 0227 – Vincent Hubert – IoT
December 9, 2018 0226 – Bernard Fedotoff – SaaS
October 25, 2018 0225 – Frank Boucher – Azure DevTest Labs
October 5, 2018 0224 – Michel Perfetti – Azure DevOps
September 4, 2018 0223 – Fred Harper – Programmer avec le SDK de Fitbit
August 12, 2018 0222 – Eric Coté – React
July 12, 2018 0221 – Mathieu Guindon – Rubberduck VBA
June 4, 2018 0220 – Jérôme Laban – WebAssembly


Leave a comment

Continuous Testing with CI/CD, Rings and Impact Analysis

The key to building quality into a piece of software such as To-Do Studio is making sure we can get fast feedbacks on the impact of changes using a deployment pipeline with continuous testing.

In the last few months, using the Azure Pipelines service, we have worked hard to put this infrastructure in place. It relies on practices such as Continuous Integration and Delivery (CI/CD), deployment rings and impact analysis.

Continuous Integration is about automating build and test processes to make sure the resulting software is in a good state, ideally every time a developer changes code. Continuous Delivery goes one step further by automating a software release, which typically involves packaging the software for deployment in a production-like environment.

Deployment rings were first discussed in Jez Humble’s book. Rings promote a production-first DevOps mindset and limit impact on end users, while gradually deploying and validating changes in production.

Deployment rings are used to advance a software release, built in the initial stage of CI/CD, through a sequence of target users.

We identified four types of users:

  • Ring 0 – Staging : Developers and testers who validate the release before deploying it to real users.
  • Ring 1 – Alpha : Close circle of employees and volunteers who test new features as they become available.
  • Ring 2 – Beta : Early adopters who voluntarily preview releases, considered more stable than the ones in Alpha.
  • Ring 3 – Users : Users who consume the service, after passing through the alpha and beta early adopters.

rings

Let’s look at how a change goes through the deployment rings.

continuous-testing

  1. A developer commits a change (checkin) to our source code repository.
  2. The checkin triggers a Continuous Integration (CI) build.
  3. The last step of the continuous integration launches a continuous delivery trigger, which automatically starts deployment in the staging environment.
  4. The deployment publishes a new release to the Staging ring. Only the developers and testers are impacted by the change.
  5. The deployment publishes a new release to the Alpha ring. Only the Alpha users are impacted by the change.
  6. The deployment publishes a new release to the Beta ring. Only the Beta users are impacted by the change.
  7. The deployment publishes a new release to the Users ring. At this stage, everyone is affected by the change.
  8. It’s key to realize that the impact (“blast radius”) increases as your change moves through the rings. Exposing the change to the Alpha and the Beta users, is giving two opportunities to validate the change and hotfix critical bugs before a release to everyone.

At each ring, an impact analysis is performed. In case of insufficient quality, the deployment is rejected, and the developers must correct the problems. The process must then start over again. Impact (also called blast radius), is evaluated through observation, testing, analysis of telemetry, and user feedback. We rely primarily on the Application Insights and Azure Monitor services to perform the impact analysis.


Leave a comment

Subscribe to my Newsletter

Since a few months I publish a newsletter for my family and friends. One of the objectives of this newsletter is to share my entrepreneurial journey. It contains the latest news about To-Do Studio, the startup I founded with Erik Renaud. Our company designs and markets a software service that allows leaders to empower others to take initiative. The newsletter is intended to offer a privileged look at the path of a startup company.

newsletterEncouraged by the positive comments I receive, I decided to give access to the newsletter to readers of this blog. That’s why I invite you to subscribe to my newsletter.

Here is the link to subscribe: Destination To-Do Studio

The newsletter is free. It is published every 2 months, 6 times a year. The subscription does not require any obligation on your part. The only information you must provide to register is your email address (it will never be shared with third parties). You can unsubscribe at any time. If you wish to preview the content of the newsletter, I invite you to read the first issue here.

PS. Following registration, if you do not receive quickly a confirmation email, check your Junk Email inbox.


1 Comment

Market Positioning Statement

As I stated in a previous post, the first challenge facing startups is to find their Product/Market Fit. Product/Market Fit means that the solution (the product) is well suited to its target problem (the market who experienced the problem). To find the right Product/Market fit, you must not only fulfill a job-to-be-done but also ensure you have an obvious competitive advantage.

competitive-advantage

Startups that have a competitive advantage create a sustainable future for their businesses, with products that can grow and generate profits long after the initial launch.

During my master’s degree in Innovation and Technological Entrepreneurship, I learned to capture and formalize a competitive advantage using a “Market Positioning Statement”. Positioning is a choice of attributes that provides a credible, different, attractive and sustainable position within a marketplace and in the minds of customers. The positioning communicates what makes a product unique and different.

This statement usually comes in a form that looks something like this:

For [Target Market] who [Statement of Need], the [Product Name] is a [Product Category] that [Key Benefit / Reason to Buy] unlike [Competitors] our product [Primary Differentiation]

Here is the rendition of the Market Positioning Statement for To-Do Studio:

[Target Market]
Modern leader

[Statement of Need]
Want to avoid the hassle of follow-ups and tough talks that occur when pushing and pulling others to take initiative

[Product Name]
To-Do Studio

[Product Category]
Collaborative work management service

[Key Benefit / Reason to Buy]
Guides teams to self-organization

[Competitors]
Other current solutions such as chats, emails, calendars, to-do lists, kanban boards, spreadsheets or project managers

[Primary Differentiation]
Get things done because each teammate works in tandem with an automated guide (personalized coaching), that not only provides a daily schedule, but guides and directs the involvement (throughout the process)

Here is the positioning statement in sentence form:

For the modern leader who wants to avoid the hassle of follow-ups and tough talks that occur when pushing and pulling others to take initiative, To-Do Studio is a collaborative work management service that guides teams to self-organization. Unlike current solutions such as chats, emails, calendars, to-do lists, kanban boards, spreadsheets or project managers, To-Do Studio get things done because each teammate works in tandem with an automated guide (personalized coaching), that not only provides a daily schedule, but guides and directs the involvement (throughout the process).

The key competitive advantage of To-Do Studio is its automated guide (personalized coaching).


1 Comment

For five years we have been searching for the right Product/Market Fit

Often, I summarize the To-Do Studio journey saying that it took us five years of research and development (R&D) to find a simple and elegant solution to the following problem: How to allow teammates to complete a common to-do list? The reality is much more complex.

What I describe as R&D is rather a long quest to find the right Product/Market Fit. Of everything I discovered applying the Lean Startup practices, Product/Market Fit is the concept that remains the most inspiring for me. Compared to some other concepts such as MVP that I first discovered through reading The Lean Startup, Product/Market Fit is much less famous outside of the startup scene.

Product/Market Fit means that the solution (the product) is well suited to its target problem (the market who experienced the problem). Startups that achieve Product/Market Fit create a sustainable future for their businesses, with products that can grow and generate profits long after the initial launch. The life of any startup can be divided into two parts — ’before’ Product/Market Fit and ‘after’ Product/Market Fit. Obviously, to this day, To-Do Studio is in the ‘before’ part. Our goal in 2019 is to move into the ‘after’ part.

Over the last five years, using ongoing build-measure-learn cycles, we have progressed toward validated learning. Every day we had new assumptions for building the product, new measures to check results, and new learning opportunities that brought us closer to Product/Market Fit.

On the other hand, on three occasions, we abandoned perseverance and opted instead for a pivot. Pivoting is what you should consider when you conclude that you’re not making any progress (or not enough) toward Product/Market Fit. A pivot is a radical course correction, going in a new direction, with a new strategic hypothesis regarding the problem or solution space. In pivot mode, the unit of progress is creative destruction.

Here is a summary that presents the radical course correction of each pivot:

Problem Space Solution Space
Launch
April 2013
New market

For teammates who want to improve outcomes from shared accountability and aligns individual responsibility with team workflow

New product

Boards that guides collaboration between teammates using sticky notes to represent work items and columns to represent each stage of the workflow

Pivot 1
May 2014
New market

For individuals who want to schedule commitments and get a unified view of their “daily” commitments

New product

Daily planner that organize work by pairing a daily calendar with a list of to-do items. It keeps track which to-dos remain to be started, which are in progress and which are done.

Pivot 2
Sept 2016
New market

For people adopting work-life fusion who want to split their workload with their close ones

Product Evolution

Collective workspace that expands on our previous product by allowing to team up with others through a common list of to-do items, synchronized among teammates

Pivot 3
Jan 2018
New market

For leaders who need to empower others to get things done and want to avoid the hassle of follow-ups and tough talks that occur when pushing and pulling others to take initiative

Product Evolution

Collective workspace that expands on our previous product by providing each teammate with an automated assistant (personal coach)

A first interesting observation is the elapse of several years between each pivot. This can be explained by the following reasons:

  • The discovery process requires time. Making the right assumptions and finding out why they are not working is hard and time consuming;
  • For entrepreneurs, deciding to persevere against pitfalls is always the first choice. It takes a long period of thinking and many failures to agree to pivot;
  • In bootstrapping mode, since entrepreneurs divide their efforts on two fronts, the discovery process is much longer. They must complete the contracts that finance the business while continuing to pursuit the Product/Market Fit.

A second interesting observation is that each pivot involves a creative destruction of the target market. It seems that entrepreneurs are poorly equipped to define the problem space. As a convergent thinker, an entrepreneur is much more likely to focus on the solution than the problem.

The good news is that correctly identifying a problem space is a knowledge that can be learned. In our case, it was in December 2017 when I discovered the “Job to be Done” innovation approach. This acquisition of new know-how led us to our most recent pivot.

“Job to be Done” innovation approach presents a product not as a set of functionality but rather as a solution that a customer hires to get a job done.

Here are two blog posts I wrote following my discovery of the approach. It describes the positive impact it has on our quest to discover a better Product/Market Fit:


4 Comments

Configuring Cypress in CI with Azure DevOps Pipelines

Cypress is a front-end test automation framework built for the modern web. It is open source and written entirely in JavaScript. It addresses the key pain points developers and QA engineers face when testing modern applications:

  • A rich yet simple API for interactions with automatic waiting
  • Mocha, Chai, and Sinon bundled in
  • A sleek dashboard with automatic reloads for Test-Driven Development
  • Easy debugging
  • Network traffic control for validation and mocking
  • Automatic screenshots and videos

It is a very powerful tool that enables developers to write End-to-End tests entirely in JavaScript, directly accessing everything within the browser. It is also a versatile tool that can be used to test REST APIs.

At To-Do Studio, we use Cypress to test End-to-End scenarios, as well as REST APIs.

On developers’ computers, we install the Cypress Test Runner and write tests locally. Everything works perfectly. However, for CI/CD testing, we must configure Cypress with Azure DevOps Pipelines. The recipe for configuring Cypress is not as simple as it may seem at first. I’m writing this post to make sure that a configuration recipe is documented somewhere on the web to explain how to configure Cypress in Continuous Integration (CI) with Azure DevOps Pipelines. Thus, with the help of Google search, those who will have the same goal in the future will find the right answer easily.

Here is diagram presenting an overview of the major elements of the solution:

Deployment_overview

First, ensure during the build phase that the cypress tests files are zipped and published to the artifacts drop.

build

Second, during the release phase hosted on an Ubuntu agent, extract the zipped test files,run the tests using Cypress and publish the tests results. Here are the detailed steps:

1. Extract the zip file containing the tests

Extract the zip file that was published to the artifacts drop by the build pipeline.

extract

2. Run the tests

Start by creating the Cypress config file. Define the location of your tests with the integrationFolder configuration value. Do not use the testFiles configuration value or –spec command line option.

{
  "integrationFolder": "tests/e2e/specs",
  "baseUrl": "https://info-staging.to-do.studio",
  "projectId": "<insert your project Id>",
  "reporter": "junit",
  "reporterOptions": {
    "mochaFile": "tests/test-output-[hash].xml",
    "toConsole": true,
    "attachments": true
    },
  "video": false,
  "pluginsFile": "tests/e2e/plugins/index.js",
  "supportFile": "tests/e2e/support/index.js",
  "env": {
    "urlEnv": "staging"
  }
}

cypress_config

Follow by running the tests with Cypress using the command: npx cypress run –record –key <insert your record key>. npx install and run Cypress in a single step. npx is a npm package runner (x stands for eXecute). The typical use is to download and run a package temporarily. Please note that if you intent to record screenshots and videos with Cypresss Dashboard Service, you need to add the unique projectId into your cypress.json and pass the record key into the command. If you do not need visual results, simply omit the recording option and projectId.

run_tests

3. Publish the tests results

Here you will publish the junit mocha files created during the tests run. Make sure that your merge test results and that it fails if there are test failures.

publish_tests