Blog
Insights and Technology
Our story, vision and perspectives on technology, design and business solutions.

Featured Articles

News
5 min read
Announcement : Spiria is certified SOC 2 Type 2
<div><h2>What is the certification SOC 2 ?</h2><p>SOC 2 (Service Organization Control 2) certification is a standard developed by the American Institute of Certified Public Accountants (AICPA) that assesses an organization's ability to manage the risks associated with the security, availability, processing integrity, confidentiality and privacy of the data it processes on behalf of its customers.</p><p>SOC 2 certification is based on five principles, known as trust criteria, which define the minimum requirements an organization must meet to ensure the security and quality of its services. These criteria are as follows:</p><ul> <li><strong>Security</strong>: the organization protects data against unauthorized access, modification, disclosure, damage or loss.</li> <li><strong>Availability</strong>: the organization ensures the availability and continuous operation of its services in accordance with customer agreements.</li> <li><strong>Integrity of processing</strong>: the organization processes data in a complete, valid, accurate, timely and authorized manner.</li> <li><strong>Confidentiality</strong>: the organization respects confidentiality commitments and obligations towards its customers and third parties concerning the data it processes.</li> <li><strong>Privacy protection</strong>: the organization respects the privacy principles defined by the AICPA and the laws in application concerning the collection, use, storage, disclosure and disposal of personal data.</li></ul><p>« Obtaining and maintaining the SOC 2 certification is to me like an ultramarathon, rather than a 100-meter sprint. It's a first step in a long and continuously evolving process. Cybersecurity, as a whole, requires rigour and constant attention to detail, which our team is ready to invest in. »</p><p>– Vincent Huard, Vice President of Data Management and Analytics</p><p>To receive the SOC 2 certification, an organization must undergo an independent audit by a qualified accounting firm to ensure that it complies with the trust criteria applicable to its services. The audit covers the conception and effectiveness of the controls put in place by the organization to ensure compliance with the five trust criteria.</p><h2>What is the difference between SOC 2 Type 1 and Type 2 ?</h2><p>There are two types of SOC 2 certification. Among other things, it is the duration of the audit that distinguishes them. SOC 2 Type 2 is covered by a more extensive and rigorous audit.</p><ul> <li>SOC 2 Type 1 certification attests that the organization complies with trust criteria on a given date. It assesses the conception of controls, but not their effectiveness over time.</li> <li>SOC 2 Type 2 certification attests that the organization meets the trust criteria over a defined period of time, generally from three to twelve months. It assesses not only the conception but also the effectiveness of controls, taking into account their actual use and evolution.</li></ul><p>In other words, SOC 2 Type 2 certification meets more demanding and rigorous criteria, as it involves continuous monitoring and regular verification of controls. It offers greater assurance of the quality and security of the services provided by the organization.</p><h2>What are the benefits for our clients ?</h2><p>By obtaining the SOC 2 Type 2 certification, Spiria reaffirms its position as a trusted partner in the development of digital solutions for its customers.</p><p>Here are some of the main benefits that enable our customers to undertake large-scale projects with peace of mind:</p><ul> <li>The guarantee that we uphold the highest standards of data security.</li> <li>The guarantee that we protect our customers' data against internal and external threats.</li> <li>The confidence that we ensure the availability and performance of our services.</li> <li>The confidence that we are able to react quickly and effectively in the case of an incident.</li> <li>The certainty that we treat your data with integrity, while complying with validation, accuracy, traceability and authorization rules.</li> <li>The peace of mind that we respect your confidentiality obligations and do not disclose your data to unauthorized third parties.</li> <li>The security of knowing that we respect privacy principles and comply with applicable laws on personal data.</li></ul><p>SOC 2 Type 2 certification is a guarantee of trust and security for our clients, testifying to our commitment to delivering quality services and upholding industry best practices. It represents excellence in data security across industries, and is becoming increasingly sought after for software development projects. It was therefore only natural for Spiria to be one of the few expert firms in North America to be certified.</p><p>We are proud to be certified and to guarantee the excellence, reliability and rigor of our business practices.</p><p>Start a project with confidence : <a href="mailto:NewProject@spiria.com">NewProject@spiria.com</a>.</p></div>

Strategy
5 min read
Choosing Between a Time-and-Materials or a Fixed-Price Contract
<div><p>Spiria teams have thorough and extensive experience with both types of projects. In this blog, we’ll share what we have learned on the subject over the years and what criteria contribute to the success of each option.</p><p>But first, let’s go over those two types of projects:</p><h3>Time & Materials projects</h3><p>These are projects whose scope (activities, deliverables, inclusions and exclusions, etc.) are moderately well defined. The initial proposal provides an estimated price range for completing the project, after which costs are billed based on actual hours worked plus the required hardware and resource expenses (such as software licenses or cloud services). This approach is more flexible, as it allows both parties to adjust or change the specifications throughout the development process. This encourages agility and puts an emphasis on project management controls.</p><h3>Fixed-price contracts</h3><p>In contrast, the scope of this kind of project is usually well or very well defined. The initial cost estimate can be stated with confidence because it is based on more reliable information than in the T&M project. As the name suggests, costs are established at the outset, regardless of the actual hours worked and the materials and other resources expenses. Therefore, risk and profitability are critical considerations in opting with this type of contract. Any change to the initial specifications is policed by a change-request process and is billed as additional work.</p><p>Let’s imagine a first scenario in which a project has been previously defined. The client would opt for T&M or Fixed-price, a decision sometimes dictated by the organization’s internal requirements or even by industry regulations. This is often the case with calls-for-tender, which are mostly Fixed-price. Whenever possible, Spiria suggests an approach that leads to a better understanding of the project’s scope, thus mitigating risk. Spiria could recommend that the client invest in an initial discovery phase, whether in T&M or in Fixed-price mode, then propose the actual development and deployment phases as Fixed-cost. This helps the client assess whether it needs to change priorities or modify the scope as a result of the discovery phase. This flexibility allows us to negotiate the defined scope while amending the inclusions/exclusions, in order to remain within the agreed contractual Fixed-cost budget.</p><p style="text-align: center;"><picture><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/11800/process-en.400x0.webp" media="(max-width: 599px)"><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/11800/process-en.760x0.webp" media="(max-width: 999px)"><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/11800/process-en.1039x0.webp" media="(min-width: 1000px)"><img src="https://mirror.spiria.com/site/assets/files/11800/process-en.webp" style="width: 60%; border: none;" alt="A Typical Project Cycle." title="A Typical Project Cycle."></source></source></source></picture></p><p style="text-align: center; font-style: italic;">Figure 1. A Typical Project Cycle.</p><p>In a second case where the type of contract is not predetermined, we have more latitude to choose our strategy. A client schedules meetings with various suppliers for a Q&A session, followed by internal discussions to evaluate the factors leading to the best strategy. To help the teams decide, the table below presents a non-exhaustive list of criteria that are quantifiable (easily identifiable and measurable) or qualitative. The answers will depend on the information provided during the initial meetings and in the specifications, and on information obtained by asking the client directly. The symbols in the two right-hand columns suggest ways to weigh the answers relative to the two types of projects.</p><table cellpadding="0" cellspacing="0" style="width:100%"> <tbody> <tr> <td style="width:76%"><strong>Points</strong></td> <td style="width:12%"><strong>Fixed</strong></td> <td style="width:12%"><strong>T&M</strong></td> </tr> <tr> <td>The business plan, requirements, needs and expectations are clear.</td> <td>➕➕</td> <td>➕</td> </tr> <tr> <td>The business rules and processes are numerous and complex.</td> <td>➕</td> <td>➕➕</td> </tr> <tr> <td>The client’s budget is defined and budget planning is set.</td> <td>➕</td> <td>➖</td> </tr> <tr> <td>The schedule is tight or critical due to the client’s circumstances or business context.</td> <td>➕</td> <td>➖</td> </tr> <tr> <td>The required expertise is clearly defined.</td> <td>➕</td> <td>➕</td> </tr> <tr> <td>The organizational and decision-making structure is large and complex.</td> <td>➖</td> <td>➕</td> </tr> <tr> <td>The legal aspects are complex.</td> <td>➖</td> <td>➕</td> </tr> <tr> <td>A past relationship already exists, or a mutual contact recommended us.</td> <td>➕</td> <td>➕</td> </tr> <tr> <td>The risk, uncertainties and contingencies are high.</td> <td>➖</td> <td>➕</td> </tr> <tr> <td>There is a high likelihood of scope-creep.</td> <td>➖</td> <td>➕</td> </tr> <tr> <td>The client has staff or other internal capacity<br> (designer, development team, QA, etc).</td> <td>➕</td> <td>➕</td> </tr> <tr> <td>The technological environment is familiar.</td> <td>➕</td> <td>➕</td> </tr> <tr> <td>There are significant technological constraints (e.g. legacy system).</td> <td>➖</td> <td>➕</td> </tr> <tr> <td>There are many and complex challenges to integrating the solution.</td> <td>➖</td> <td>➕</td> </tr> <tr> <td>The choice of technology is pre-established.</td> <td>➕</td> <td>➕</td> </tr> <tr> <td>Data is available to reliably do quality assurance.</td> <td>➕</td> <td>➕</td> </tr> <tr> <td>The solution is subject to special certifications.</td> <td>➖</td> <td>➕</td> </tr> </tbody></table><p><br>This reflection can lead to different approaches, represented in the following diagram:</p><p><picture><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/11800/strategies-en.400x0.webp" media="(max-width: 599px)"><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/11800/strategies-en.760x0.webp" media="(max-width: 999px)"><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/11800/strategies-en.1039x0.webp" media="(min-width: 1000px)"><img src="https://mirror.spiria.com/site/assets/files/11800/strategies-en.png" style="width: 100%; border-style:solid; border-width:1px;" alt=" Possible strategies or approaches." title=" Possible strategies or approaches."></source></source></source></picture></p><p style="text-align: center; font-style: italic;">Figure 2. Possible strategies or approaches (click to enlarge).</p><p>The strategy selected dictates how the contract agreement is concluded and has implications for the entire life of the project and its final success. The relationship will start out on the right foot if our process is transparent and we can explain our reasoning to the client. Our ultimate objective is to deliver a project that respects our Spirian values and that provides the expected value to the client.</p></div>
All Articles
Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.

Dev's Corner
5 min read
Setting up an octo-boot on a Mac (part 1)
<h2>Background</h2> <p>As a hands-on IT director in a mid-sized company like mine, I have to come to terms with the fact that some users are bound to use Apple products and that they are most likely going to end up asking for our help. Given this fact, we need to have a fairly recent device with macOS installed on it in order to run tests or troubleshooting tasks, but the last time I checked, Apple licensing terms required that we run macOS from an official Apple product. Recently, I recovered a MacBook Pro 2015 from a free repair for a battery problem. Given our internal policy that requires that we replace equipment every five years, I asked my boss if I could replace the internal drive of the Pro to obtain a triple boot machine for IT purposes (macOS, Microsoft and Linux). He agreed to the purchase, as long as I produced some blog articles on my experience.</p> <p>But then, I started thinking. Why not four operating systems? And since I was sleep-deprived that day, things snowballed from there, and I ended up talking myself into having eight operating systems, because “octuple” sounds cooler and more recognizable than nonuple or septuple. So, here we go.</p> <p><strong>Disclaimer!</strong> Playing with the partitions, especially the boot partition, is not something for the faint of heart; it can even make your device permanently unbootable. Do not do this unless you are familiar with things such as disk partitions, GRUB, EFI, etc.</p> <p><strong>Even more important warning!!!</strong> IT people talk to themselves... a lot... We pretend it’s a process, but in fact, we’re just sleep-deprived wrecks.</p> <h2>The basics</h2> <p><picture><source srcset="https://mirror.spiria.com/site/assets/files/4330/octobot.400x0.webp" type="image/webp" media="(max-width: 599px)" /><source srcset="https://mirror.spiria.com/site/assets/files/4330/octobot.760x0.webp" type="image/webp" media="(max-width: 999px)" /><source srcset="https://mirror.spiria.com/site/assets/files/4330/octobot.1039x0.webp" type="image/webp" media="(min-width: 1000px)" /><img title="Octo-boot." src="https://mirror.spiria.com/site/assets/files/4330/octobot.webp" alt="Octo-boot." /></picture></p> <h3>Broad project strokes</h3> <p>Officially, Apple supports dual booting for macOS and Windows through Boot Camp, and <a href="https://support.apple.com/en-us/HT201468">the procedure</a> is pretty straightforward. However, when it comes to triple booting with a Linux distribution, things start to get hairy. Those who do that sort of thing recommend using a boot manager called “<a href="http://www.rodsbooks.com/refind/">rEFInd</a>”. It has to be installed manually from a USB key during the process. I had a list of Linux distributions I wanted to install, but I had to change it a little along the way. At the time of writing, I basically achieved my goal of having eight distributions on the same device with the help of an excellent article I found <a href="https://robpickering.com/triple-boot-macbook-pro-macos-windows-10-linux/">here</a>.</p> <h3>The operating systems</h3> <p>Along with Windows and macOS, we installed a series of Linux distributions (or distro in geek speak). Linux is the central program, called kernel, to which a series of tools and programs are attached (desktop environment, file systems, libraries, etc.) in order to make a complete operating system.</p> <p>Here is the list of OSs I ended up installing, with partition sizes and reason for installation:</p> <ul> <li><strong>macOS</strong> <ul> <li>Size: 256 GB.</li> <li>OS: Duh ... (and FreeBSD-based).</li> <li>Reason: take one for the team and test forecasted enterprise management tools.</li> </ul> </li> <li><strong>Windows 10 Pro</strong> <ul> <li>Size: 256 GB split across C: drive for OS and D: drive to be shared across OSs.</li> <li>Desktop: MS Windows.</li> <li>Reason: to run Crysis.</li> </ul> </li> <li><strong>Linux Mint</strong> <ul> <li>Size: 64 GB.</li> <li>Desktop: Cinnamon Desktop, Ubuntu(ish)-based.</li> <li>Reason: LinuxMint is usually my “go-to” distribution for desktop implementation and since I am quite familiar with it, it is also my “control” in this experiment.</li> </ul> </li> <li><strong>Suse Linux</strong> <ul> <li>Notes: <ul> <li>I intended to use a Gentoo-based distro, but they are notorious for being hard to use and more geared toward servers. Sabayon would not even start the install process, and Redcore could not get Wi-Fi to work (and repositories were-based in Russia).</li> <li>I switched to Suse Linux because its main development base is in Germany and everyone knows that everything German is well-engineered (and cool).</li> </ul> </li> <li>Size: 64 GB.</li> <li>Desktop: KDE Plasma, Slackware(ish)-based.</li> <li>Reason: Deutschland!!! Testing out the <a href="https://en.wikipedia.org/wiki/Btrfs">Btrfs</a> file system.</li> </ul> </li> <li><strong>Manjaro</strong> <ul> <li>Size: 64 GB.</li> <li>Desktop: KDE, ArchLinux-based.</li> <li>Reason: Arch-based repo experimentation (Pacman).</li> </ul> </li> <li><strong>Fedora</strong> <ul> <li>Size: 64 GB.</li> <li>Desktop: Mate Desktop, Redhat-based.</li> <li>Reason: RedHat-based distro is one of the biggest Linux distributions and uses YUM repo management.</li> </ul> </li> <li><strong>Kali Linux</strong> <ul> <li>Size: 128 GB.</li> <li>Desktop: GNOME Desktop, Debian-based.</li> <li>Reason: security testing. This distribution is preloaded with a wide array of security tools for ethical hacking.</li> </ul> </li> <li><strong>Ubuntu Studio</strong> <ul> <li>Size: 128 GB.</li> <li>Desktop: XFCE, Ubuntu-based, with allegedly low-latency kernel.</li> <li>Reason: to have some distro geared toward artsy-fartsy stuff and test the low-latency kernel feature if possible.</li> </ul> </li> </ul> <h3>Post-installation goals</h3> <p>The subsequent goals are as follows:</p> <ul> <li><em>Test a variety of desktop distributions and desktop UI:</em> <ul> <li>Linux distributions are (in)famous for their flexibility.</li> <li>This can make support somewhat difficult and spotty in some cases due to the wide variety of hardware available.</li> <li>On any given distribution, you can have a wide array of Windows Management UI.</li> <li>I tried to pick the widest possible assortment of desktop software and pick those that came “out of the box” when installing the distro. <ul> <li>You can usually pick any desktop of your choosing after installing the “default” desktop.</li> <li>I chose to pick those that were “officially” supported during install time to reduce problems.</li> </ul> </li> </ul> </li> <li><em>Have a shared disk drive partition across all OSs:</em> <ul> <li>I usually do that with any dual boot machine that I run, in order to facilitate access to various files such as photos, music files, video, etc.</li> <li>Since Windows traditionally never supported File Systems other than FAT and NTFS, I always shared a “D” drive formatted as NTFS.</li> </ul> </li> <li><em>Have the following tested and working:</em> <ul> <li>Webcam;</li> <li>SD card slot;</li> <li>External display;</li> <li>Power management;</li> <li>Special functions; <ul> <li>Through combos of Control, Option and Command keys, you can control various aspects of the device, such as brightness and volume.</li> <li>All functionalities should be available throughout all OSs.</li> </ul> </li> <li>USB external headset;</li> <li>3.5 external headset;</li> <li>Wired NIC;</li> <li>Wi-Fi network;</li> <li>USB-based external enclosure.</li> </ul> </li> <li><em>Test various applications and workloads:</em> <ul> <li>Firefox browser. <ul> <li>Find a demanding application/website and get stats.</li> </ul> </li> <li>Chrome Browser. <ul> <li>Install and run the official Google version.</li> </ul> </li> <li>Filesystem. <ul> <li>File copy.</li> <li>Zipping in NTFS and in base-FS of each OS.</li> <li>Document base-FS in each.</li> </ul> </li> <li>A/V-crunching software. <ul> <li>Find a tool that can be used across platforms to convert video/audio files to another format in order to compare performance.</li> </ul> </li> <li>Compilation tool. <ul> <li>To be determined. Ideally, a cross-platform tool and something to crunch that is big enough to take at least five minutes under macOS.</li> <li>I will get my colleagues to help me with that.</li> </ul> </li> <li>Wi-Fi/wired - download/latency. <ul> <li>Find a tool that can be used across OSs and provide a variety of statistics.</li> </ul> </li> <li>3d rendering tool. <ul> <li>Test on Blender.</li> </ul> </li> </ul> </li> </ul> <h2>Hardware and initial installation</h2> <p>The Mac Pro 2015 disk is relatively easy to access and replace as long as you have the right tools. I will not go into details here but be warned that the screws are of the type called “<a href="https://en.wikipedia.org/wiki/Pentalobe_security_screw">pentalobe</a>” and that they are easily stripped. I ordered a NVMe disk from <a href="https://www.macsales.com">OWC</a> because I expect that a regular NVMe disk will not work as intended, something I will test out at the end of the project. My first (semi) surprise was to find a Samsung NVMe disk inside an Apple laptop. It shows that while the two are at odds in public, they get together under the covers in private. The reinstallation of the macOS software and the subsequent Windows install through Boot Camp went pretty much without a hitch. I will not go through the whole process here, since it is amply covered in many other articles out there.</p> <p><picture><source srcset="https://mirror.spiria.com/site/assets/files/4330/samsung-ssd.400x0.webp" type="image/webp" media="(max-width: 599px)" /><source srcset="https://mirror.spiria.com/site/assets/files/4330/samsung-ssd.760x0.webp" type="image/webp" media="(max-width: 999px)" /><source srcset="https://mirror.spiria.com/site/assets/files/4330/samsung-ssd.1039x0.webp" type="image/webp" media="(min-width: 1000px)" /><img title="Samsung S4LN058A01-8030." src="https://mirror.spiria.com/site/assets/files/4330/samsung-ssd.webp" alt="Samsung S4LN058A01-8030." /></picture></p> <p>Samsung’s NVMe SSD.</p> <p>The fun really begins with the Linux install. Basically, whenever you install a Linux distribution, it installs GRUB (except for SuSe), which causes macOS to stop booting while everything else still works. The workaround I found was to reinstall rEFInd every time, but then I realized that I would also need to reinstall the rEFInd application every time a Linux distribution got a new kernel in its upgrade. I tried to find a workaround for that by manually editing the GRUB file with some changes suggested by various forums, to no avail. This will require some digging. Another problem I ran into was that Windows would not start either, and I had to disable the System Integrity Protection (<a href="https://en.wikipedia.org/wiki/System_Integrity_Protection">SIP</a>).</p> <p>Aside from those little annoyances, I was very surprised to find that the Wi-Fi pretty much worked out of the box on all distros that I ended up installing. This had been my biggest concern. Wi-Fi drivers are usually the most contentious part of a Linux distribution installation, given that Wi-Fi chips are often welded to closed-source drivers.</p> <p>The biggest problem I had was the laptop display experience, which proved to be somewhat uneven. Some worked right away, while others required some tweaks. All had a few bugs here and there due to the fact that this specific laptop model has a Retina display. It’s very nice looking, but it needs some adjustments in order to be usable. Usually, the problems were (mostly) resolved by googling HiDPi settings for the various platforms. In the end, the only irritant that remained was in the boot login manager of the GRUB screen, which I will research later.</p> <h2>What now?</h2> <p>Somewhere in the process, I got a little carried away and forgot to take notes about the desktop UI adjustments. I think I will just re-run the installation procedures and write down the details for each distro in part 2 or 3 of this blog article. I need to do some research on the GRUB situation to see if I can do something about it or if I am just going to have to stick to “rEFInd”. As previously mentioned, playing with the bootloader is somewhat risky and the documentation on the subject is sparse. Whenever I found an article about it, there was always a caveat. Ideally, I would like to have GRUB as my permanent boot loader and have it running permanently and consistently throughout Linux kernel upgrades. Plan B would be to remove the default GRUB installation, since rEFInd can detect new OSs quite nicely.</p>

Artificial Intelligence
5 min read
The 3 main steps of Machine Learning
<div><p><img src="https://cdn.prod.website-files.com/67c06f07cfba9b0adb43e16c/67febb24de99365a009cb8d8_data_science_ai_en.1039x0.png" alt="Illustration representing supervised, unsupervised, and reinforcement learning in data science" style="max-width: 100%; height: auto;" /></p><p>There are three types of machine learning: Supervised Learning, Unsupervised Learning and Reinforcement Learning.</p><p><b>Supervised Learning</b>: With Supervised Learning, you have input data called features and the expected result called label. It allows us to make predictions based on a model<sup>*</sup> created from historical data and a chosen algorithm.</p><p>Supervised learning attempts to answer two questions:</p><ul> <li>Classification: “which class?”; and</li> <li>Regression: “how many?”.</li></ul><p><b>Unsupervised Learning</b>: With Unsupervised Learning, you still have features, but no label, since we are not trying to predict anything.</p><p>Unsupervised Learning involves mining historical data to see what can be learned from them, then validating the conclusions reached with subject-matter experts.</p><p>This kind of Machine Learning is used to discover data structures and patterns. It can also be used for Feature Engineering when preparing data for Supervised Learning (more on this later).</p><p><b>Reinforcement Learning</b>: With Reinforcement Learning, you start with an agent (algorithm) that has to choose from a list of actions. Then, according to the chosen action, it will receive a feedback from the environment (it may be a human in certain situations or an another algorithm): either a reward for a good choice or a penalty for a wrong action. The agent (algorithm) learns which strategy (or choice of actions) maximizes a cumulative reward.</p><p>Reinforcement Learning is often used in robotics, games theory and self-driving vehicles.</p><p>The main steps to take are:</p><h2>Data Preparation</h2><ul> <li><b>Data collection</b>: first, gather the data you’ll need for Machine Learning. Make sure you collect them in consolidated form, so that they are all contained in a single table (Flat Table).</li> <li><b>Data Wrangling</b>: it involves prepping the data to make them usable by Machine Learning algorithms. <ul style="list-style-type:circle;"> <li>Data Cleansing: find all the “Null” values, missing values and duplicate data. Replace “Null” and missing values by other data (or delete them) and make sure you have no duplicates.</li> <li>Data Decomposition: text columns sometimes contain more than one element of information; split them up in as many dedicated columns as necessary. If some columns represent categories, convert them in dedicated category columns.</li> <li>Data Aggregation: grouping data together, when appropriate.</li> <li>Data Scaling: this will yield data on one common scale if it’s not already the case. Data Scaling does not apply to <i>label</i> or <i>categorical columns</i>. Required when there is a large variation with <i>features</i> ranges.</li> <li>Data Shaping and Transformation: categorical to numeric.</li> </ul> </li> <li><b>Data Enrichment</b>: Sometimes, you’ll need to augment existing data with external data to give the algorithm more information to work with, improving the model (for example, economic or meteorological data).</li></ul><h2>Feature Engineering</h2><ul> <li>Visualise your data as a whole to see if there are any links between columns. By using charts, you can see the features side-by-side and detect any links among features, and between features and labels. <ul style="list-style-type:circle;"> <li>Links between features allow us to see if any given feature is directly dependent on another. If so, you may not need both features.</li> <li>Links between one feature and the label allow us to see if any feature will have a great impact on the result.</li> </ul> </li> <li>Sometimes, you’ll need to generate additional features from existing ones in a classification (for example, when the chosen algorithm is unable to correctly differentiate classes).</li> <li>You can end up with a huge number of columns. In this case you need to choose the columns you will use as <i>features</i>, but if you have thousands of columns (i.e. potential features), you’ll need to apply Dimensionality Reduction. There are several techniques available to do this, including Principal Component Analysis or PCA. PCA is an unsupervised learning algorithm that uses existing columns to generate new columns called principal components, which can be used later by the classification algorithm.</li></ul><h2>Algorithm Choice</h2><p>At this stage, you can start training your algorithms, but first:</p><ul> <li>Split up your dataset in three parts: Training, Testing and Validation. <ul style="list-style-type:circle;"> <li><b>Training data</b> will be used to train your chosen algorithm(s);</li> <li><b>Testing data</b> will be used to check the performance of the result;</li> <li><b>Validation data</b> will be used at the very end of the process, or if necessary, rarely looked at or used before that, in order to avoid introducing any bias to the result.</li> </ul> </li> <li>Choose the relevant algorithm(s).</li> <li>Try the algorithms with different combinations of parameters and compare their results performance.</li> <li>Use Hyper-parameters (ex. <i>GridSearch</i> in Python) procedure to try many combinations, in order to find the one that yields the best result (do not try manual combinations).</li> <li>As soon as you’re reasonably happy with a model, save it even if it’s not perfect, since you may never find again the combination that made it.</li> <li>Continue testing after every new model. If the results are not satisfactory, you can start over: <ul style="list-style-type:circle;"> <li>At the Hyper-parameters stage, if you’re lucky.</li> <li>It is also possible that we need to start again the choice of <i>Features</i> to include or even worse, to review the state of our data (check if we don’t have problems with normalization, regularization, scaling, outliers…).</li> </ul> </li></ul><p>Remember that after all this, Machine Learning may not yield a better result than the one you obtained through traditional processes. But, at worst, it will definitely provide interesting information thanks to the data analysis process it makes you go through.</p><hr><p>(*) Model: the result obtained by analyzing data with an algorithm and any given combination of parameters, supposing the model is a mathematical function <i>y = f(x)</i>, where <i>x</i> is a feature, <i>y</i> is a label and <i>f(x)</i> is the model.</p></div>

Strategy
5 min read
Helping a team manage severe constraints
<div><p>Here are a few tips to help:</p><p>A very severe constraint may often be seen by team members as impossible to solve at first glance, which leads to pushback. <b>Reminding the team of your confidence in their ability to find a solution</b>, and going over the various processes and phases which lead to finding a solution, will greatly help the team to live with the uncertainty and doubt of the situation.</p><p>As a team lead, your role is <b>to help your team reach its goal</b> and learn from the experience. Avoid foisting your ideas on the team; instead, ensure everyone feels comfortable voicing their own ideas. No idea should be left unsaid out of fear of judgment or pressure from the peers.</p><p>Ensure <b>all ideas can be challenged by team members</b> and that constructive outcomes flow from such challenges. Critical thinking helps to avoid groupthink within a team, and helps to reach greatness. The team should be aware that what is being challenged is the idea and not the person who proposed it.</p><p>Not foisting your ideas on the team doesn’t mean you don’t have your say on what the team is coming up with. If the solution doesn’t meet your expectations, or if you believe there is a better way, <b>you can challenge the team</b>. A good way of doing this is by asking probing questions to bring the group to understand how things could be done better and to learn to be more critical of their findings.</p><p>The members of <b>the team should know that you and the organization are there to support them</b>. They must be confident that you will handle all the issues that are not directly related to the problem they are trying to solve, and that you will provide them with the necessary time, budget, talent and resources.</p><p>The way to <b>the best solution lies through successes and failures</b>. The consequences of failure should never be bitterness or blame. Failure is an opportunity for the team to understand what went wrong and what went well, and to decide what to do next. Failure is a source of knowledge and of a better understanding of the problem, and a new step in the intellectual journey towards the ultimate solution. Use failure as a new launching pad to reach a higher level of greatness.</p><p>Small accomplishments and victories help <b>create positive energy</b> and constructive willingness.</p><p><b>Celebrate accomplishments</b> along the process to motivate the team.</p><p>Remember that the solution that seems the simplest in the end is often the one which required the most work and ingenuity: <b>it’s very hard to make things simple</b>.</p></div>

Dev's Corner
5 min read
My favourite Visual Studio tips and tricks
<div><p>Hi everyone! Today, I thought I’d share my best time-saving tips for Visual Studio.</p><p>Just so you know, I usually work in C++ and C#, but most tips should apply to other languages as well.</p><p>Here we go!</p><h2>Editing tips</h2><p>1. <b>Go to All: Ctrl + ,</b></p><p><picture><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4218/01_go_to_all.400x0.webp" media="(max-width: 599px)"><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4218/01_go_to_all.760x0.webp" media="(max-width: 999px)"><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4218/01_go_to_all.1039x0.webp" media="(min-width: 1000px)"><img src="https://mirror.spiria.com/site/assets/files/4218/01_go_to_all.png" style="width: 452px; border-style:solid; border-width:1px;" alt="Go to All" title="Go to All"></source></source></source></picture></p><p>You can quickly find anything and everything (i.e., files, classes, etc.) in your project with this tool.</p><p>2. <b>Go to the previous edit location: Ctrl + -</b></p><p>3. <b>Go to the next edit location: Ctrl + Shift + -</b></p><p>4. <b>Go to the beginning or end of a code block: Ctrl + [ et Ctrl + ]</b></p><p>5. <b>Go to definition: F12</b></p><p>A basic but critical command to quickly navigate to class and method definitions.</p><p>6. <b>Comment out the selected block of code: Ctrl + K + C</b></p><p><picture><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4218/02_comment_block.400x0.webp" media="(max-width: 599px)"><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4218/02_comment_block.760x0.webp" media="(max-width: 999px)"><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4218/02_comment_block.1039x0.webp" media="(min-width: 1000px)"><img src="https://mirror.spiria.com/site/assets/files/4218/02_comment_block.png" style="width: 224px; border-style:solid; border-width:1px;" alt="Comment out the selected block of code" title="Comment out the selected block of code"></source></source></source></picture></p><p>7. <b>Uncomment the selected block of code: Ctrl + K + U</b></p><p>8. <b>Autoformat the selected code: Ctrl + K + F</b></p><p>This automatically fixes whitespace and code indentation according to your settings.</p><p>9. <b>Vertical text box selection: Alt + Mouse click</b></p><p><picture><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4218/03_alt_box_select.400x0.webp" media="(max-width: 599px)"><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4218/03_alt_box_select.760x0.webp" media="(max-width: 999px)"><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4218/03_alt_box_select.1039x0.webp" media="(min-width: 1000px)"><img src="https://mirror.spiria.com/site/assets/files/4218/03_alt_box_select.webp" style="width: 213px; border-style:solid; border-width:1px;" alt="Vertical text box-selection" title="Vertical text box-selection"></source></source></source></picture></p><p>This is very useful to remove the first characters of text on multiple lines of code.</p><p>10. <b>Toggle between a header and its source file (C++): Ctrl + K + O</b></p><p>11. <b>Rename a variable: Ctrl + R + R</b></p><p>This is much faster than manually finding every occurrence of the variable on your own.</p><p>12. <b>View whitespace: Ctrl + R + W</b></p><p><picture><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4218/04_whitespace.400x0.webp" media="(max-width: 599px)"><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4218/04_whitespace.760x0.webp" media="(max-width: 999px)"><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4218/04_whitespace.1039x0.webp" media="(min-width: 1000px)"><img src="https://mirror.spiria.com/site/assets/files/4218/04_whitespace.png" style="width: 195px; border-style:solid; border-width:1px;" alt="View whitespace" title="View whitespace"></source></source></source></picture></p><p>This may just be my OCD, but I love seeing the exact whitespace in a document. I don’t like having to guess whether it’s a tab or a space.</p><p>13. <b>Code snippets<i> (snippets)</i></b></p><p><picture><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4218/05_code_snippets.400x0.webp" media="(max-width: 599px)"><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4218/05_code_snippets.760x0.webp" media="(max-width: 999px)"><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4218/05_code_snippets.1039x0.webp" media="(min-width: 1000px)"><img src="https://mirror.spiria.com/site/assets/files/4218/05_code_snippets.png" style="width: 611px; border-style:solid; border-width:1px;" alt="Code snippets" title="Code snippets"></source></source></source></picture></p><p>If you find yourself repeatedly writing the same instruction, consider using code snippets.</p><p>Here’s an example to get you started: I often work in Release mode to speed things up in very large client projects.</p><p>When I need to debug a method more thoroughly, I can quickly disable optimizations by typing the following shortcut: P + O + Tab.</p><p>Before, I had to repeatedly write: <code>#pragma optimize("", off)</code>.</p><p>To achieve this shortcut, I just had to add a keyboard shortcut (Tools -> Options -> Environment -> Keyboard) to the following code snippet:</p><pre><code><?xml version="1.0" encoding="utf-8" ?><CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet"> <CodeSnippet Format="1.0.0"> <Header> <Title>Pragma Optimize Off</Title> <Shortcut>po</Shortcut> <Description>Code snippet to disable optimizations</Description> <Author>Me</Author> <SnippetTypes> <SnippetType>Expansion</SnippetType> </SnippetTypes> </Header> <Snippet> <Code Language="cpp">#pragma optimize("", off)</Code> </Snippet> </CodeSnippet></CodeSnippets></code></pre><h2>Debugging Tips</h2><p>14. <b>Breakpoint Actions</b></p><p><picture><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4218/06_breakpoint_action.400x0.webp" media="(max-width: 599px)"><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4218/06_breakpoint_action.760x0.webp" media="(max-width: 999px)"><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4218/06_breakpoint_action.1039x0.webp" media="(min-width: 1000px)"><img src="https://mirror.spiria.com/site/assets/files/4218/06_breakpoint_action.png" style="width: 100%; border-style:solid; border-width:1px;" alt="Breakpoint Action" title="Breakpoint Action"></source></source></source></picture></p><p>Use Breakpoint Actions instead of <code>printf</code> and <code>cout</code>. I love Actions: they allow you to quickly adjust your temporary logs without recompiling each time, and having to remember to clean them up when they are no longer needed./p></p><p>15. <b>Conditional Breakpoint</b></p><p>A basic and very useful debugging tool, it is right next to the Actions in the breakpoint settings options pane.</p><p>16. <b>Run to cursor: “Run execution to here.” No breakpoint needed!</b></p><p><picture><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4218/07_run_execution_to_here.400x0.webp" media="(max-width: 599px)"><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4218/07_run_execution_to_here.760x0.webp" media="(max-width: 999px)"><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4218/07_run_execution_to_here.1039x0.webp" media="(min-width: 1000px)"><img src="https://mirror.spiria.com/site/assets/files/4218/07_run_execution_to_here.png" style="width: 231px; border-style:solid; border-width:1px;" alt="Run to cursor" title="Run to cursor"></source></source></source></picture></p><p>I know some people find this widget annoying, but it can be more than just a mouse pointer trap. Try pressing the little green Play button to quickly skip to that point in the code while debugging. Thanks to this tool, you no longer need to add a temporary breakpoint to stop at the desired point.</p><p>17. <b>Drag the instruction pointer</b></p><p><picture><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4218/08_instruction_pointer.400x0.webp" media="(max-width: 599px)"><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4218/08_instruction_pointer.760x0.webp" media="(max-width: 999px)"><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4218/08_instruction_pointer.1039x0.webp" media="(min-width: 1000px)"><img src="https://mirror.spiria.com/site/assets/files/4218/08_instruction_pointer.png" style="width: 100%; border-style:solid; border-width:1px;" alt="Drag the instruction pointer" title="Drag the instruction pointer"></source></source></source></picture></p><p>Yep, you can move the yellow arrow while you’re debugging. It’s very useful to be able to move it up in the code you are debugging to repeat certain code statements that are being executed. You can also easily skip certain code blocks while debugging by dragging it lower down in the code. The beauty here is that you can do this without restarting the application each time.</p><h2>Conclusion</h2><p>I hope you discovered a trick or two that will speed up your daily coding workflow. Please add your own favourites in the comments area below!</p><p>Until next time!</p></div>

Design
5 min read
User Story Mapping: what it is, how it works
<div><p>User Story Mapping is grounded in real life experience. Have you, like me, ever encountered a situation where all the members of a group seemed to agree on every last detail of a project, only to realize in the end that they had all understood a different basic concept? Well, User Story Mapping helps to avert that kind of situation!</p><p><picture><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4189/glad-we-all-agree.400x0.webp" media="(max-width: 599px)"><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4189/glad-we-all-agree.760x0.webp" media="(max-width: 999px)"><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4189/glad-we-all-agree.1039x0.webp" media="(min-width: 1000px)"><img src="https://mirror.spiria.com/site/assets/files/4189/glad-we-all-agree.webp" style="width: 100%; border-style:solid; border-width:1px;" alt="I’m glad we all agree!" title="I’m glad we all agree!"></source></source></source></picture></p><p>Shared understanding is one of the aims of collaborative work. Illustration: Jeff Patton / Luke Barret – CC <a href="https://creativecommons.org/licenses/by-nc-sa/1.0/">BY-NC-SA</a>.</p><h2>User Story Mapping, or “The Big Picture”</h2><p>User Story Mapping gets you to see the forest rather than individual trees. By fostering deeper discussions, it builds a common vision of the solution to be developed. More concretely, User Story Mapping allows you to structure the backlog of user stories.</p><p>A backlog is basically the list of tasks that need to be accomplished before getting to the desired product.</p><p><picture><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4189/2d-backlog.400x0.webp" media="(max-width: 599px)"><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4189/2d-backlog.760x0.webp" media="(max-width: 999px)"><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4189/2d-backlog.1039x0.webp" media="(min-width: 1000px)"><img src="https://mirror.spiria.com/site/assets/files/4189/2d-backlog.webp" style="width: 100%; border-style:solid; border-width:1px;" alt="Flat backlog vs 2D backlog." title="Flat backlog vs 2D backlog."></source></source></source></picture></p><p>Flat Backlog (unstructured list) vs 2D backlog (User Story Map). Illustration: Juliana Betancur/<a href="https://twitter.com/julibetancur/status/908513329794179073">Twitter</a>.</p><h2>User Story Mapping: application</h2><p>During the workshop, our team was given the task of organizing a trip on a 10,000$ budget.</p><p>This was accomplished in five steps:</p><h3>1. Write out the story, in stages</h3><p><i>On Post-It notes, write down the steps you took to organize your last trip – write down everything that comes to mind. One note per step.</i></p><p>Brain-storming style, everyone writes down all the steps they take to organize a trip, without omitting anything. For example, some people included “Clean the house”. Indeed, some people just can’t go on a trip leaving a dirty house behind.</p><h3>2. Organize the story</h3><p><i>Arrange the Post-its in chronological order from left to right, then tell the story by going through the Post-its in sequence. For example, “To prepare, I first did this; <b>then</b>, I did the other; etc.”; if needed, add missing steps.</i></p><p>Since everyone will have their own opinion on the sequence of the tasks, debate this issue until a consensus emerges.</p><h3>3. Explore alternative stories</h3><p><i>In other words, ask “what if” questions:</i></p><ul> <li><i>What if we went on a trip in Quebec?</i></li> <li><i>What if we went on a trip in South America?</i></li> <li><i>What if we went on a romantic trip as a couple?</i></li></ul><p><i>Write down the new steps necessary under each the new scenario and add them to the story.</i></p><p>What if we had a pet? What if we had children? What if we were travelling with the in-laws? What if we were backpacking? What if we had a shoestring budget? Etc.</p><p><picture><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4189/story_mapping_01_en.400x0.webp" media="(max-width: 599px)"><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4189/story_mapping_01_en.760x0.webp" media="(max-width: 999px)"><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4189/story_mapping_01_en.1039x0.webp" media="(min-width: 1000px)"><img src="https://mirror.spiria.com/site/assets/files/4189/story_mapping_01_en.png" style="width: 100%; border-style:solid; border-width:1px;" alt="User Story Mapping." title="User Story Mapping."></source></source></source></picture></p><h3>4. Extract and build the structure</h3><p>Group tasks according to goal, <b>while keeping the storyboard intact</b>. Gather each group of tasks under a heading. In other words, at a high level, what must I do?</p><p><picture><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4189/story_mapping_02_en.400x0.webp" media="(max-width: 599px)"><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4189/story_mapping_02_en.760x0.webp" media="(max-width: 999px)"><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4189/story_mapping_02_en.1039x0.webp" media="(min-width: 1000px)"><img src="https://mirror.spiria.com/site/assets/files/4189/story_mapping_02_en.png" style="width: 100%; border-style:solid; border-width:1px;" alt="User Story Mapping." title="User Story Mapping."></source></source></source></picture></p><p>Add a Post-it at the top of each column summarizing the goal of the activities under this heading.</p><h3>5. Divide the map according to priorities to reach a specific result</h3><p><i>Write down the specific result on a Post-it note and stick it on the left-hand side – this is the minimum viable product. Draw a line across the board and move all non-essential activities below this line.</i></p><p>Now, let’s pretend the departure date has been brought forward, and let’s ask the group to leave tonight. Some activities will immediately drop below the line, due to the time crunch. The real priorities are now easy to identify.</p><p><picture><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4189/story_mapping_03_en.400x0.webp" media="(max-width: 599px)"><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4189/story_mapping_03_en.760x0.webp" media="(max-width: 999px)"><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4189/story_mapping_03_en.1039x0.webp" media="(min-width: 1000px)"><img src="https://mirror.spiria.com/site/assets/files/4189/story_mapping_03_en.png" style="width: 100%; border-style:solid; border-width:1px;" alt="User Story Mapping." title="User Story Mapping."></source></source></source></picture></p><p>As Jeff Patton, the creator of this method, <a href="https://www.jpattonassociates.com/the-new-backlog/">said</a>:</p><blockquote><p>“We spend lots of time working with our customers. We work hard to understand their goals, their users, and the major parts of the system we could build. Then we finally get down to the details — the pieces of functionality we’d like to build. In my head I see a tree where the trunk is built from the goals or desired benefits that drive the system; big branches are users; the small branches and twigs are the capabilities they need; then finally the leaves are the user stories small enough to place into development iterations.</p><p>After all that work, after establishing all that shared understanding I feel like we pull all the leaves off the tree and load them into a leaf bag — then cut down the tree.</p><p>That’s what a flat backlog is to me. A bag of context-free mulch.”</p></blockquote><p><picture><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4189/istock-908024826.400x0.webp" media="(max-width: 599px)"><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4189/istock-908024826.760x0.webp" media="(max-width: 999px)"><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4189/istock-908024826.1039x0.webp" media="(min-width: 1000px)"><img src="https://mirror.spiria.com/site/assets/files/4189/istock-908024826.jpg" style="width: 100%; border-style:solid; border-width:1px;" alt="Raking up user stories." title="Raking up user stories."></source></source></source></picture></p><p>Raking up user stories. © iStock.</p><h2>Prioritize the journey</h2><p>A User Story Map visually illustrates the client’s journey through the product, including the tasks and activities they accomplish with it. This visualization will help the team to concentrate on development, to put every element in context and to give the customer the desired result.</p><p>The User Story Map gives the team a context to work within by answering the following questions:</p><ul> <li>Why are we building this product?</li> <li>For whom?</li> <li>What added value will the solution give the client, and when?</li></ul><p>In short, User Story Mapping is useful to:</p><ul> <li>Identify and implement features based on the results desired by the client.</li> <li>Make the user journey tangible by turning the backlog into a client-centric map.</li> <li>Gain a better understanding of the user’s journey based on what that client wants and appreciates.</li> <li>Prioritize actions depending on expected value.</li> <li>Get better results and reduce waste.</li></ul><p><picture><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4189/flat-backlog-vs-story-map.400x0.webp" media="(max-width: 599px)"><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4189/flat-backlog-vs-story-map.760x0.webp" media="(max-width: 999px)"><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4189/flat-backlog-vs-story-map.1039x0.webp" media="(min-width: 1000px)"><img src="https://mirror.spiria.com/site/assets/files/4189/flat-backlog-vs-story-map.webp" style="width: 100%; border-style:solid; border-width:1px;" alt="Flat backlog vs Story map." title="Flat backlog vs Story map."></source></source></source></picture></p><p>Flat backlog vs story map. © Nicholas Muldoon.</p><p>Is User Story Mapping a practice you follow? What tools do you use?</p></div>

Strategy
5 min read
Bringing an idea to life through the Discovery process
<div><p>Sometimes, companies identify an issue that needs addressing, without knowing what the solution might be. For example, a company might need to adapt to new market conditions, gain velocity, modernize tools, or satisfy customer needs. Or, it may wish to enhance an existing product or develop a new one.</p><p>Inspired by Google’s <i><a href="https://www.spiria.com/en/blog/uxui-design/innovate-design-sprint/">Design Sprint</a></i>, but more flexible in its application and wider in scope, the Discovery process was developed by Spiria to help companies innovate. This process is an intensive and interactive collaboration effort involving different tools, depending on the problem to address.</p><p><picture><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4178/spiria-dev.400x0.webp" media="(max-width: 599px)"><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4178/spiria-dev.760x0.webp" media="(max-width: 999px)"><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4178/spiria-dev.1039x0.webp" media="(min-width: 1000px)"><img src="https://mirror.spiria.com/site/assets/files/4178/spiria-dev.webp" style="width: 100%; border-style:solid; border-width:1px;" alt="Spiria Montréal." title="Spiria Montréal."></source></source></source></picture></p><p>The process involves a team of digital experts, enterprise decision-makers and various stakeholders. It has four phases:</p><h2>1. Preparation</h2><p>This phase is dedicated to gaining a thorough understanding the customer’s business, its ecosystem and the challenge to address. It is studied from every possible angle to obtain a 360° vision. It can be supported by preparatory work like researching existing literature, polling future users, or compiling key market metrics.</p><h2>2. Definition</h2><p>After the comprehension-based preparatory phase, Discovery process participants define the key issue, set expectations and define the main goal of the process. They also set the metrics for success and identify potential constraints, like legacy architecture.</p><h2>3. Ideation</h2><p>The goal of this phase of the Discovery process is to map user browsing patterns and create a detailed storyboard of the suggested solution. The storyboard includes the basic characteristics and features required for a minimum viable product. If necessary, a wireframe is developed, the foundations of the information architecture and methodological process are laid, and a technical evaluation is performed to assess feasibility.</p><h2>4. Creation</h2><p>A multidisciplinary team turns the storyboard into a prototype and defines the amount of work involved, the technological pile and the list of features, all of which supports the costing of the final digital solution. Armed with a detailed roadmap that minimizes risk and optimizes productivity, the team can now move on to the production phase.</p><p><picture><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4178/healthpro.400x0.webp" media="(max-width: 599px)"><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4178/healthpro.760x0.webp" media="(max-width: 999px)"><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4178/healthpro.1039x0.webp" media="(min-width: 1000px)"><img src="https://mirror.spiria.com/site/assets/files/4178/healthpro.webp" style="width: 100%; border-style:solid; border-width:1px;" alt="HealthPRO website." title="HealthPRO website."></source></source></source></picture></p><p>HealthPRO, a corporate site designed from A to Z in record time thanks to the Discovery process. <a href="https://www.spiria.com/en/our-work/healthpro/">Learn more about it</a>.</p><p>Depending on the issue addressed, several documents can come out of the Discovery process: a roadmap, wireframes, a style guide, an organized copy deck, usability tests, etc.</p><p>Essentially, whether you’re satisfying a specific enterprise need or sharpening a nebulous idea, the goal of the process is to quickly lay solid foundations to support an efficient, problem-free development phase. The <a href="https://www.spiria.com/en/services/growth-driven-strategy/discovery-process/">Discovery</a> process leaves no questions unanswered, produces a detailed roadmap and provides a clear vision of the final result. It minimizes the risks inherent to any software development project, providing immediate return on investment.</p></div>

Culture
5 min read
Change, bonds, and board games
<div><p>I don’t get to work with my coworkers.</p><p>What ought to be an oxymoron is in fact a reality for anyone that works in an environment with a variety of clients, such as a digital agency or a consulting company. I have many coworkers, some of whom work on bigger teams for larger clients. However, due to our wide range of clients, it just so happens that my direct teammates are not in our Gatineau office. This is a very new concept for me.</p><p>My background is working for startups, which in many ways is in very stark contrast to my current environment. In a startup, a relatively small group of people works towards one common goal or product, or even just one project. Day in, day out, a large number of us focus on tackling the same tasks and solving the same problems. The common endeavour bonds us.</p><p>At <a href="https://www.spiria.com">Spiria</a>, by contrast, one might assume, as I once did, that not directly working with my colleagues would distance me from them. Well, I’m happy to say that this is far from the case. We all still interact every day, be it in tech discussions, collaborative problem solving, team lunches, or lunch-time games of foosball.</p><p>One neat aspect of our interaction, the one that I’d like to highlight today, is that a great number of us are into board games. But unlike the relatively trivial games of our childhood, like <i>Monopoly</i> and <i>Clue</i>, our games are less luck-dependent. They promote strategy, tactics, collaboration or competition, and taking advantage of the complex systems and mechanics that make the game work. It’s an activity that works our minds, much like our jobs do, but in a fun and social setting.</p><p>We now have a small stockpile of games at work, brought in by those of us who have more than a reasonable number of games at home. This gives us an impromptu activity to engage in at lunch, after work, on weekends, or even when people just need to step away from their monitors and engage in something that continues to work their brains.</p><p><picture><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4113/board-games.400x0.webp" media="(max-width: 599px)"><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4113/board-games.760x0.webp" media="(max-width: 999px)"><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/4113/board-games.1039x0.webp" media="(min-width: 1000px)"><img src="https://mirror.spiria.com/site/assets/files/4113/board-games.webp" style="width: 100%; border-style:solid; border-width:1px;" alt="Spirians playing Rising Sun." title="Spirians playing Rising Sun."></source></source></source></picture></p><p>Spirians playing <i>Rising Sun</i>.</p><p>The games promote critical thinking, a quality that we developers need for our day-to-day work. Some games require us to observe and know the diverse traits and personalities of the other players, our coworkers. This helps us to better know and understand them, helping to foster collaboration when working on future projects together.</p><p>Even though I'm very new here, this activity has already brought us together numerous times outside of work. It has encouraged those of us who are more introverted to engage socially with our coworkers in a fun and stress-free way. On numerous occasions, I’ve come down late for lunch to see a game already in progress, while others sit around it, observing and discussing the various goings-on and strategies at play.</p><p>The mechanics of the game spark interest in our minds, and the bond created by the experience brings us together.</p></div>

Quality Assurance
5 min read
What is an Agile Test Plan?
<div><p>An Agile Test Plan is a very important document because it gives your Quality Assurance (QA) team the ability to have all high-level scenarios, business requirements and estimates in one place. Your QA Analyst or Agile Tester should fill out an Agile Test Plan during each sprint planning event. And just like the actual live document, it is always changing and evolving, depending on sprint requirements and overall timelines.</p><p>An Agile Test Plan should have a proper and clear structure containing business inputs and QA tasks.</p><p>Let’s see how it works.</p><h2>1. Introduction</h2><p>Agile Test Plans usually start with an introduction; this is a short description of the project containing general information on the sprint’s testing process. This part of the document should include two sub-parts:</p><h3>1.1 Document Scope</h3><p>This part specifies how the delivery of the future application will be tested. It defines the following areas:</p><ul> <li>User stories</li> <li>QA environment</li> <li>Testing scope</li> <li>Testing process</li> <li>Risks and dependencies</li> <li>Estimates and Exit criteria</li></ul><h3>1.2. Feature Description</h3><p>The Feature Description clarifies how the newly-created features or functionalities work within the application and how they can be tested. The features are explained in general terms, not in detail. For example: <i>“A new geolocation feature is enabled when the user signs in to the web app and is automatically disabled after two hours of idling. User may disable geolocation manually in: Account → Settings → Geolocation settings → Location traffic.”</i> That’s it.</p><h2>2. User stories</h2><p>This part of the Agile Test Plan includes any new feature that comes with an explanation or detailed user story. User stories are important because they show business requirements. If a new feature comes from the client without a user story, the QA and Project Managers must write the high-level scenarios together and create a new task for it in Jira.</p><h2>3. QA Environment</h2><p>This part usually details the list of all software or tools that are used in the testing process for the sprint, for both manual and automatic testing. This is dependent on the main project requirements and discussions and clarifications with the Product Owner or with client.</p><ul> <li>For example: a software platform, an operating system, a device type;</li> <li>Which automation tool: Selenium WebDriver or UFT;</li> <li>Appium Framework or Express for Mobile Automation;</li> <li>jMeter or LoadRunner for Performance Testing.</li></ul><h2>4. Testing Scope</h2><p>The testing scope is the list of all QA tickets and tasks that the tester must verify at any given Agile sprint. This part of the document contains an exhaustive list of Jira ticket numbers, ticket summaries, a log of QA task duration and an optional Hiptest link. Testing Scope must be written in coordination with the developers, team lead and product owner.</p><p>Here’s a sample for a task:</p><blockquote><p>Ticket name: Jira ticket 876.<br>Summary: Geolocation should be tested on iPhone 7.<br>Build: app-staging-build-1.2.3.<br>OS: Android and iOS<br>Estimated time: 2.5 hours.<br>Hiptest link: https://app.hiptest.com/l/fo/765776.</p></blockquote><h2>5. Testing Process</h2><p>An Agile Test Plan should state what kind of testing will be performed during an Agile sprint. Manual and automatic testing processes allow for different types of software testing, such as:</p><ul> <li><b>Functional Testing</b>: positive tests only for main software functionality; no negative tests during testing cycle.</li> <li><b>Security Testing</b>: both positive and negative tests, which means checking how the application is working for Sign Up, Sign In and Forgot Password functionalities.</li> <li><b>UI Testing</b>: testing the presence of particular UI elements on the web page or mobile build. UI testing usually checks for element display, size and location on a page/screen.</li> <li><b>Cross-Browsing Testing</b>: testing on the most popular browsers, depending on business requirements and browser popularity in applicable country or countries.</li> <li><b>Regression Testing</b>: the most important part of testing, since it checks full software functionality before release. There are two types of regression testing: <i>pre-regression</i> on release candidates before full release, and <i>post-regression</i> after release and smoke testing. Mobile Regression testing involves checking a previous build, then installing a current build and testing the release candidate.</li> <li><b>Smoke/Sanity Testing</b>: simple and quick high-level testing. Does the application work after release or not? Smoke testing usually runs after release to check if it launches correctly.</li></ul><h2>6. Risks and Dependencies</h2><p>Before starting an Agile testing process, the QA Analyst must decide if there are any blockers or potential risks for failed tests. If so, are the risks minor or major? For example, was there a “code freeze” day during the sprint? Has the previous build been successfully released? Has it been approved by the client? The QA Analyst should discuss all of this before developers start coding and building an app.</p><h2>7. Estimates and Exit criteria</h2><p>Estimates are general business schedules for completing sprints and heading to release. How many hours should QA spend on different testing types? When will the green light be given for web and/or mobile release? These questions should help focus on high-level results.</p><p>Finally, when completing all parts of the Agile Test Plan document, make sure that all high-level business scenarios have been created in Jira and Hiptest with a description, detailed steps, entry and exiting criteria, sprint name, original estimates and proper summary.</p><p>A detailed and structured Agile Test Plan helps QA ensure a complete QA process, have confidence in their work and avoid omissions. A very good habit is to always refer back to this document in which everything is indicated.</p></div>

Design
5 min read
Accessibility as part of success
<div><p>In other words, it’s the ability for everyone to access something, regardless of their condition. Let’s have a look at what the concept of accessibility has given us over the last few decades, and how we take advantage of it in our daily life. And I’m not talking just about the automatic door buttons that are standard here in Canada, and that my son loves to push every time he sees one ?!</p><p>Most of us need to experience a problem to want to solve it; that is why people with disabilities are a powerhouse of solutions that advance technology. <a href="https://en.wikipedia.org/wiki/Vint_Cerf">Vint Cerf</a>, one of the fathers of the Internet, is a prime example of this. Mr. Cerf is hearing-impaired, and his disability had an impact on his work developing the Internet. Back in the 80s, the deaf and hard-of-hearing were looking for an alternative to telephone communication. Mr. Cerf led the creation of the first commercial email service (<a href="https://en.wikipedia.org/wiki/MCI_Mail">MCI Mail</a> in 1982) that allowed him to communicate with family members and colleagues.</p><p>While accessible design and features are essential for equal access for people with disabilities, they often lead to improvements in user experience and loyalty for everyone, disabled or not. Indeed, more and more solutions that were originally made for people with disabilities end up being picked up, embraced and loved by the mainstream. Accessible design is what gave us text-to-speech solutions, autocomplete features, smart watches, voice controls, smart TVs, car autopilot, and more. Or take just basic Web accessibility: you might never notice that some of the websites that you use daily are accessible. Some accessibility-related recommendations in web design like styles, contrast and other features actually improve overall user experience and satisfaction. In fact, web accessibility is becoming the law in many developed countries.</p><p>At least 15% of the world’s population has a recognized disability. In countries like Canada, where life expectancy is over 70, people spend around 12% of their lifespan living with a disability.</p><p>This means that from a purely business perspective, accessibility solutions and innovations increase client base and market reach. But beyond the profits, businesses that mainstream accessibility are more likely to be innovative, which spurs development, which in turn leads to discoveries and inventions. And employing people with disabilities is key to finding the best possible accessibility practices and solutions in different environments and areas.</p><p><picture><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/3975/accessibility-fail.400x0.webp" media="(max-width: 599px)"><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/3975/accessibility-fail.760x0.webp" media="(max-width: 999px)"><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/3975/accessibility-fail.1039x0.webp" media="(min-width: 1000px)"><img src="https://mirror.spiria.com/site/assets/files/3975/accessibility-fail.webp" style="width: 56%; border-style:solid; border-width:1px;" alt="Accessibility fail." title="Accessibility fail."></source></source></source></picture></p><p>It is impossible to overestimate the contribution to the development of accessibility by companies like Google, Apple and Microsoft:</p><blockquote><p>“Accessibility is a core value at Apple and something we view as a basic human right.” — Sarah Herrlinger, Director of Global Accessibility Policy and Initiatives, Apple.</p></blockquote><blockquote><p>“The accessibility problems of today are the mainstream breakthroughs of tomorrow.” — Eve Andersson, Director, Accessibility Engineering, Google.</p></blockquote><blockquote><p>“Designing inclusive software results in improved usability and customer satisfaction.” — Microsoft’s App Developer Guide.</p></blockquote><p>Most of us are lucky enough to never have to consider the importance and necessity of accessibility, and might realize it only after reading articles like this one. On the flip side, no-one is ever inconvenienced by accessible technologies and features; in fact, we actually like to use them, whether we’re disabled or not. So let’s start making things more accessible for everyone and, who knows, maybe one day they will turn into a breakthrough, and become mainstream.</p></div>

Best Practices
5 min read
Processes topped with a sprinkle of standards
<div><p>Some people cringe at the words <i>process</i> or <i>standards</i>, but I, and others like me, tend to appreciate clear structure. Processes are all around us: at home, at work and everywhere in between. Even children are exposed to processes and standards at a young age. Whether we like it or not, we all follow processes in our daily lives.</p><p>I believe that processes are the glue that hold everything together, and that standards are what help us all achieve a common goal with a high level of quality. Experience has shown us that we are far more successful when we have great processes in place, with a sprinkle of standards. Here are a few examples that I’d like to share.</p><h3>Documenting Processes and Standards in plain sight</h3><p>I’ve seen processes, standards and policies documented in various tools throughout my career, and consistency seems to be the winner. You can place your meticulously documented standards on the Internet, plaster them on the wall in your office, or even create <a href="https://developer.amazon.com/fr/blogs/alexa/post/2b4d2dc0-22d4-4e41-a51e-436adc687d7f/create-an-alexa-skill-for-your-organization-in-minutes-with-alexa-for-business-blueprints">Alexa private skills</a> for your organization to help employees find them. But whatever you do, just make sure people know where to find them, and keep it consistent.</p><h3>Project Consistency</h3><p>We have executed many projects over the years, and while every project is different, processes and standards have always played a big role in each project’s success. From sales hand-off to production and quality assurance through product and production collaboration, quality processes ensure that all of our projects are consistent and help everyone on the team know what needs to be done, and how.</p><h3>Reusability</h3><p>Code reuse should be practiced judiciously. The question I like to keep in mind is: <i>Can someone else benefit from this feature, either at my company or in the open-source world?</i> If the answer is yes, you should consider designing the feature for reusability. Creating small, reusable components that contain simple, sharable code will allow you to:</p><ul> <li>provide lower, more accurate estimates on common functionalities;</li> <li>reuse production-grade code that has been rigorously tested;</li> <li>dedicate more effort to complex business logic that cannot be reused.</li></ul><h3>Code Reviews</h3><p>Code reviews provide significant value when used correctly. Every feature that we build must go through the peer code review process, which helps us write cleaner, more consistent code, reduce bugs and share knowledge between all areas of development. My colleague, Claude Houle, wrote a wonderful <a href="https://www.spiria.com/en/blog/method-and-best-practices/simply-code-reviews/">piece on the importance of code reviews</a> that is worth a read.</p><h3>Unit Tests</h3><p>Unit testing might not be possible in all projects, but there is a definite value in using it under the right circumstances. Unit testing can help reduce the number of bugs during development, effectively increasing your development capacity. Adding unit tests for key business logic, complicated functionalities or when a quality issue is found should increase your confidence with each deployment. If you’re interested in learning a bit more about testing, feel free to read the <a href="https://www.spiria.com/en/blog/web-applications/understanding-difference-between-unit-test-and-integration-test/">blog post</a> by Anthony Giretti.</p><h3>Scalability</h3><p>Scalability is one of the standards that you just can’t ignore if you want the best user experience for your website or mobile application. Whether you expect 200 simultaneous users on your platform or 10,000 new registrations after a marketing launch, ask yourself the following questions:</p><ul> <li>Will this feature work at scale with small and large datasets?</li> <li>Will my pages load quickly for all users (new and old) regardless of the amount of data involved?</li> <li>Am I using techniques like caching, and considering when those techniques could compromise functionality or expected results?</li></ul><h2>Speak up (when everyone is listening)</h2><p>I could go on and on about the various standards and processes we use every day at Spiria, but my goal was to share a few ideas that will help you reflect and see how you can make a difference. If you feel like something is broken, examine your processes and standards and try suggesting an improvement.</p><p>One thing that I always keep in mind is that we cannot blame failure solely on a lack of process. Instead, we should work towards creating, updating and sharing information that helps all of us move in the direction of success.</p><p>I’m in the “glass half full” camp; I believe that every person and every process has room for improvement. This is an integral part of personal, professional and corporate growth. When we stop pointing fingers and start collaborating, everyone wins!</p></div>

Strategy
5 min read
Constraint drives innovation
<div><p>Often, humans are content to keep doing the same thing they’ve always done: it’s simpler and it limits the risks and outlay of effort. Only when strong constraints take us out of our comfort zone do we strive for unique and innovative solutions.</p><p>How do you identify those constraints that will prompt innovation, and how do you make sure that they will lead to something that generates real value? It’s a question worth asking. For example, we see many phone manufacturers who, in their race for innovation, added features that were technically innovative but didn’t address any real problem, or that offered inadequate solutions to problems. Simply put, real innovation has to solve a problem. If we first innovate and then set out to find a problem that this innovation might address, it’s likely to be useless or inappropriate.</p><p>One example is Apple’s 3D Touch. From a technological point of view, it was innovative, but from a user-experience perspective, it didn’t solve a major problem and the proposed solution was ineffective. 3D Touch recognizes different levels of pressure on the touch screen, but the function was not essential and many users didn’t even know it existed. Apple ended up <a href="https://www.theverge.com/circuitbreaker/2018/9/13/17854864/iphone%20-xs-max-3d-touch-waste-features-apple">removing</a> this feature from its entry-level models and will <a href="https://9to5mac.com/2019/07/09/digitimes-iphone-11-3d-touch/">probably remove</a> it from all models coming out in 2019.</p><p>Essentially, the purpose of innovation is to solve a problem. The goal of solving a problem imposes a constraint, and this constraint generates innovation. In other words: to innovate, first identify a problem that needs to be solved. The problem can be a major issue or a mundane one, like an annoying detail of daily life that we have learned to cope with and that we’ve become barely aware of.</p><p>Innovation begins when we put words to the problem, when we describe it as an obstacle in need of a solution. We can no longer follow what was apparently the straightest path, because it is now blocked by the problem. This imposes a constraint on the solution we seek to implement, and this constraint forces us to look for paths that we would not have considered otherwise.</p><p>This phase of identifying and naming the problem and the approach to finding a solution are fundamental for innovation. There must be an understanding of this process at all levels of a project’s management to create conditions that foster innovation. Sometimes the constraints imposed on a team may seem insurmountable. The project managers should be ready to handle this situation by providing the necessary means, support and tools for the team to move forward in this stressful situation, to maintain morale and to strive for excellence. In a future article, we will discuss the different ways to support a team under such conditions.</p><p>One ground-breaking innovation, which seems obvious today but was not at the time and required major work, was the iPhone user interface. When Steve Jobs created the iPhone at the time of Pocket PCs and other pseudo smart phones, he didn’t want a stylus because users weren’t comfortable with it (and also because someone at Microsoft whom <a href="https://www.zdnet.com/article/steve-jobs-was-driven-to-create-iphone-by-obnoxious-microsoft-guy-with-stylus/">he couldn’t stand</a> was coming up with a tablet and stylus). In a world where all the portable systems used pens on small screens that were overloaded with information, verbalizing the problem and imagining that you only had to use your fingers was implausible and put a heavy constraint on the engineers who had to find a solution.</p><p>The biggest difficulty was that no-one knew how to improve user experience by substituting a system that uses a precise stylus with one that uses fat fingers to interact with a lot of data on a small screen. Apple engineers had to imagine a whole new human-machine interaction and create a whole new operating system around this paradigm. They had to rethink how to scroll data, how to indicate the end-of-screen boundary, how to present data efficiently and accessibly while displaying less stuff on the screen, how applications should behave, etc. Today it seems obvious, but at the time when the problem was stated and the constraint explained, it must have seemed impossible.</p><p>Goes to show that innovation requires courage, perseverance, a lot of work and also a fair amount of intuition to sense that an effective solution is around the corner.</p><p>Sometimes, the constraint that comes from verbalizing a problem is negligible: once the problem is named and the constraint exposed, the solution appears obvious. How often have you lived with a problem without really realizing it or trying to solve it? Then you discover a small piece of software that solves your problem and you think to yourself, “How did I not think of it before, it’s so simple and obvious!” This doesn’t make it less of an innovation.</p><p>Moreover, don’t be fooled by the apparent simplicity of an innovation. As we saw with the iPhone user interface, some of the best innovations that required the most work appear simple or obvious, precisely because the solution is so brilliant and efficient. It nevertheless required a lot of effort, trial and error.</p><p>Innovation is an inexhaustible topic. Following articles will cover some aspects in-depth, such as:</p><ul> <li>Ways to generate innovation-friendly constraints in various business sectors</li> <li>Managing change and heavy constraints in a team</li> <li>How to detect innovation that brings real value to a product</li></ul><p>And more…</p></div>

Custom Development
5 min read
Debugging Superpowers
<div><p>Console logging is the worst. Some may disagree with my assessment of this handy tool, but I feel that it’s too often used as a crutch, despite the existence of better debugging tools and methods.</p><p>Here is where I’m coming from: my first professional programming language was Python. I spent five-and-a-half years of my career developing Python/Django applications, and one of my favorite things about working in this environment was a tool called <a href="https://docs.python.org/3/library/pdb.html">PDB</a>, the Python Debugger.</p><p>In my opinion, this tool is a junior developer’s dream come true. At any point, I could stop my program and inspect its current state; I could see the lifecycle of variables; I could see and follow the stack of functions and methods as they were called. Thanks to this tool, I was able not only to solve bugs and issues more quickly, but also to learn from the process. I felt like I had X-ray vision. I felt like a superhero.</p><p>Fast forward a number of years, and I started working more and more with Javascript. Gone was my beloved debugger, but I quickly learned to use Chrome’s <a href="https://developers.google.com/web/tools/chrome-devtools/">DevTools</a> debugger and console. These tools satisfied all my debugging needs and allowed me to add breakpoints to my code easily and visually. I felt like a superhero once more.</p><p>In my current position at <a href="https://www.spiria.com/">Spiria</a>, the applications I work on are all in TypeScript. We use Node and Express in the back-end, with a React client-side app. On the client side, things are still fine. We use <a href="https://webpack.js.org">WebPack</a> to transpile the TypeScript code, along with source-code mappings, and we’re able to debug it in Chrome as we always did. When it came to the back-end, however, the team was exclusively reliant on console logging for debugging purposes. Our development and debugging process consisted in making changes, adding a bunch of debugging logs, running through the code, then parsing the output log to try to get an idea of what happened. It was a cumbersome process which I felt generated more noise than insight. My X-ray vision was gone, and I felt like a superhero no more.</p><p>Furthermore, unlike in the front-end code, we had to manually run the command for the build process to transpile the back-end code. Also, the server process was not watching for changes and had to be restarted manually for it to acknowledge the latest transpiled code. After a few months of going along with the status quo, I felt increasingly bogged down with the process and yearned to have my superpowers back. Happily, I wasn’t the only one who felt this way and our team was lucky enough to be able to take the time to improve these processes.</p><p>While working on a project that happened to involve a large amount of back-end work, I improved our debugging process as best I could. The first step was to get proper debugging powers back. Luckily, Node comes with a <code>--inspect</code> flag that opens up a Websocket on a particular port, exposing the Node process for debugging. Chrome can hook into this and open an instance of its DevTools that works with Node; there are even handy extensions! I use one called <a href="https://chrome.google.com/webstore/detail/nodejs-inspector-manager/bnmjajghllhhhgiaeipaibfmnjnponhd?hl=en">Node Inspect Manager</a> (NiM) to automatically open DevTools when a debugger is exposed to a predefined port. X-ray powers: check!</p><p>However, I was still unhappy with the process as a whole. Whenever I made changes to the code, I’d have to kill my server, re-build the server code and restart the server process. But this was also an easy fix. The TypeScript transpiler comes with a <code>--watch</code> flag that has it re-transpile every time it detects code changes. Magic shapeshifting: check!</p><p>Lastly, I wanted my server process to restart whenever it detected changes in the transpiled code. This was relatively easy as well, with a tool called <a href="https://nodemon.io">Nodemon</a>. It’s a light wrapper around Node that restarts the process when code changes are detected. It supports all the same flags as the Node command, so our debugging process was still in business. Super-speed: check!</p><p><picture><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/3708/wow.400x0.webp" media="(max-width: 599px)"><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/3708/wow.760x0.webp" media="(max-width: 999px)"><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/3708/wow.1039x0.webp" media="(min-width: 1000px)"><img src="https://mirror.spiria.com/site/assets/files/3708/wow.png" style="width: 60%; border: none; " alt="Wow." title="Wow."></source></source></source></picture></p><p>I definitely felt like a superhero again: I was able to write code efficiently and debug it on the fly. No longer did we have to do the legwork of re-building code and restarting processes manually. But there was still one thing that bugged me: I still had to run separate commands to watch for code changes and to start up Nodemon. Then I remembered a great little tool that I’d used in a past project, called <a href="https://www.npmjs.com/package/npm-run-all">npm-run-all</a>, that can be used to run a number of separate scripts either serially or in parallel. Now, we enter one command, npm run watch:server, and the rest happens as if by magic.</p><p>Proper debugging processes are the foundation of any team. All developers, regardless of their experience, can learn much from properly inspecting their code and workflows. This results in better-running, bug-free apps that satisfy stakeholders and developers alike.</p><p><picture><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/3708/yeah.400x0.webp" media="(max-width: 599px)"><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/3708/yeah.760x0.webp" media="(max-width: 999px)"><source type="image/webp" srcset="https://mirror.spiria.com/site/assets/files/3708/yeah.1039x0.webp" media="(min-width: 1000px)"><img src="https://mirror.spiria.com/site/assets/files/3708/yeah.webp" style="width: 60%; border: none; " alt="Wow." title="Wow."></source></source></source></picture></p></div>