With hundreds of unique customers across three continents, and adding multiple new customers every month, ParityFactory continues to experience rapid growth and adoption of our robust Warehouse Management Software.
We have expanded beyond our original loyal customer base of Pacific Northwest and Alaskan fisheries to have a large footprint in the tree nut industry in Oregon, California, and Georgia, the meat processing industry in the Mid-West, citrus farming in the South-East, and frozen food manufacturing in the North-East. As we have expanded into Europe by internationalizing our applications (currently Spanish and Italian, with French on the way!) and by adding new features every few weeks, how do we ensure that the software we build is resilient, reliable, scalable, and performant? This is a multi-faceted approach, the key components of which are outlined below.
- Cloud-based virtualization: we deploy our software in the Amazon Web Services (AWS) cloud, replicating pre-configured and pre-optimized foundational containers. This ensures that best practices are automatically followed when building new secure environments for our customers. Using virtualization also means that we can (a) dynamically increase hardware requirements should the scale of our customer outgrow their existing virtual container size and (b) move to different geographic regions to be close to our customers centers of operation (or expanded facilities) for maintaining peak performance.
- Agile software engineering practices: our team of developers use a modern blend of formally structured Agile Scrum ceremonies with the highly flexible and visual “swim-lane” Kanban software development practice. This is known as the “Scrumban” methodology and provides the whole ParityFactory team of Implementation Consultants, Account Managers and Support members with full transparency of our delivery commitments and real-time communication of capacity. This allows our team to accurately plan delivery of new features to our customers on-time and on-budget, while remaining flexible enough to fit last-minute requirements that may be required for a new customer to go-live.
- Testing regime: we have several industry-standard processes to verify that our software performs as expected:
a. Code standards: How features are named and how they interact “under-the-hood” are critical to building a scalable, resilient application. We have a rigorous documentation and training culture that ensures all our developers are building towards the same standard. We also have regular pair-programming sessions between developers, “tech jams” (where developers can openly share and discuss new techniques with their peers), and weekly celebrations of significant engineering wins.
b. Code linting: This is an easily automated process that checks code syntax and readability by comparing the code authored to a defined set of rules and standards mutually agreed upon by the software development team. Suspicious code is either auto-fixed, flagged for further review, or outright rejected, depending on the severity.
c. Unit Testing: A “unit” in software engineering is an applications’ smallest testable part. Unit testing, therefore, consists of checking these “units” to ensure they work as designed. We build test cases that automatically and accurately test these units across our applications and external to any user interaction, user interface, or any integration with 3rd party systems (like the Enterprise Resource Planner, or ERP, systems that our software work in unison with). Whenever our unit tests run, we receive a report that outlines the coverage of our code base that is testable, and which tests failed (reflecting bugs that must be fixed).
d. Pull requests/code reviews: Each new piece of functionality added to our application code is peer reviewed by one or more of our senior software developers. They put their name against the code, essentially “certifying” that it adheres to our standards, runs without errors, and builds cleanly.
e. Automated integration (end-to-end) testing: Modern software consists of multiple “integrated” units working together to provide functionality that defines our software’s features. To test that these pieces work together correctly and return the correct results, we must replicate our user’s per-feature workflows, such as:
i. Sending and receiving messages.
ii. Communicating with external libraries or applications (e.g. NetSuite, Quickbooks, Microsoft Business Central)
iii. Interacting with different environments such as databases
- System monitoring: Once our software is deployed and our customers are in production, we monitor performance and user behaviors to seek out and resolve problems before our customers business processes are impacted. This is done using AWS’s built-in tools, but also custom reporting tools that identify problem areas and automatically notify our team.
Our primary goal is to always build and release robust software applications that perform well under heavy use, especially as many of our customers have seasonal peaks in processing (such as fruit or nut harvests, and salmon or crab fishing seasons). Customers keep on adopting our software because it is so reliable and scalable.