Introduction
At JBS, High Velocity Software Development means hitting the ground running, utilizing proven architectural practices to find reusable solutions. The study presented below demonstrates how we identify redundant work and decompose it into reusable components, accelerating all of our development efforts.
With many of our clients, JBS augments multiple teams that each have different business initiatives and objectives. By maintaining lines of conversation between these teams, we are able to identify common tools and APIs used by our client. Once common APIs are identified, the next step is building shareable interface libraries. These shared libraries provide all teams with a common, clean interface to each API. Furthermore, all teams can benefit from the improvements made by each group. This shared body of work enables JBS and client employees to move between teams as needed while maintaining a high level of productivity.
Shared Library and Decomposition
To keep the interface libraries consistent, we continue to decompose common tasks or utilities into more reusable components. Chief among these is application configuration and secrets management.
Application Configuration Management
The ability to have feature flags or change configuration in real time without deployments is something most of our applications require. Since we use Python and Django to build our service side components, Constance was an obvious solution for real time configuration. Not all of our apps use it or require it, however, so we decided to make constance an optional requirement.
setup(
name=‘config-loader',
version=‘0.0.1',
packages=[‘config_loader'],
include_package_data=True,
description='Support optional loading of constance configs over django settings for use in libraries.',
install_requires=install_requires,
setup_requires=['pytest-runner'],
tests_require=['redis', 'pytest', 'pytest-coverage', 'pytest-django', 'pytest-mock'],
long_description=README,
author='',
author_email='',
classifiers=[
'Programming Language :: Python :: 3.7',
],
extras_require={
'constance': ['django-constance>=2.0.0,<3'],
'credstash': ['credstash>=1.0.0,<2'],
'django': ['Django>=1.11'],
}
)
By using extras_require
in the setup.py
for your library, you can specify optional packages that your library supports. To have them installed, install your package like `pip install config-loader[constance]`. Find more details in the [https://setuptools.readthedocs.io/en/latest/setuptools.html#declaring-extras-optional-features-with-their-own-dependencies|setuptools docs].
Most of our applications are deployed with Zappa to AWS Lambda. This makes it convenient to do per environment configuration in a zappa_settings.yml
file. To support applications that go this route, our config library also supports reading from environment variables.
In our final solution libraries can declare their settings, along with a namespace in a `Settings` object.
from config_loader import Settings
loader_settings = Settings({'A_SETTING': 'DEFAULT'}, ’NAMESPACE')
And load values from a hierarchy of places:
- constance
CONSTANCE_CONFIG = {’NAMESPACE_A_SETTING': (True, 'A fine setting'),}
- settings.py
NAMESPACE = {'A_SETTING': 'NEW_VALUE’}
- os.environ
export NAMESPACE_A_SETTING=env_Value
- The configured default
Secrets Management
Another optional requirement, used by applications that need credentials to other systems, is credstash. Credstash leverages AWS KMS and AWS Dynamo to maintain secure storage of secret data. With a little bit of code glue, we are able to specify the name of a secure value in our clear text config, protecting the actual secrets.
Any of the values above can be surrounded by %%
eg %%app.API_PASSWORD.dev%%
to fetch those values from credstash.
Results
With many developers from different teams contributing to and reviewing this library, we’ve accumulated a collection of robust features in a single reusable component. The final solution includes caching, logging, documentation, and testing - all of a higher quality than one person or team would likely be able to deliver. The end result is higher reliability, more team bandwidth, and "free" updates.
We have found that once a particular integration or feature has been moved to a shared library, it greatly reduces the overhead for a new team to develop that integration in the future. Rather than re-implementing the same (or similar) code in multiple applications, our teams stay efficient and deliver more high-quality software by working together.

Introducing the JBS Quick Launch Lab!
FREE 1/2 Day Assessment
Other Recent Articles
-
The Evolution of Maintainable Lambda Development Pt 1
Joshua M.
Jan. 12, 2021AWS Lambda is a very popular tool for deployments at JBS. As an AWS Partner, we have repeatedly espoused the benefits of serverless architectures as... -
What's New From AWS reInvent 2020
Philip H.
Jan. 19, 2021As an AWS partner, we rely constantly on AWS services to help us build solutions for our clients that are manageable, scalable, and fault-tolerant.... -
JBS Custom Software Solutions Joins BigCommerce Partne…
Jenny L.
Jan. 14, 2021JBS Custom Software Solutions offers headless commerce integrations and full BigCommerce sites to help fast-growing businesses modernize and scale... -
Three Tips for Effective Project Meetings
Muhammed U.
Jan. 12, 2021Unnecessary meetings are a common stereotype. Sometimes we don’t do a good enough job of putting in the thought required to make them useful. -
Part 2: Portable Function Pattern for the Scaling Busi…
Shon D.
Dec. 31, 2020The feedback loop for business logic development should be totally contained on the engineers' machine with a few commands. -
How One Non-Profit EdTech Partnered with JBS to Fill a…
Joe R.
Dec. 24, 2020We started this series on digital education with some of the core capabilities today’s educators, students, and school administrators really need in... -
Event-Driven Application Logging
Nick W.
Dec. 22, 2020Proper logging and exception handling will greatly improve a team’s capability to support any application, but such visibility becomes crucial... -
Using Azure Functions with .NET
Chris E.
Dec. 17, 2020Using .Net within Azure Functions is Simple and Straightforward -
Part 1: Portable Function Pattern for the Scaling Busi…
Shon D.
Dec. 29, 2020The landscape of platforms and runtimes is ever increasing. There are more ways of packaging and running code than are possible to keep up with. -
Universal Native Apps with Flutter
Greg R.
Dec. 15, 2020Flutter Provides A Compelling Alternative To True Native Development -
Moving to AWS Managed Databases
Joe B.
Dec. 10, 2020Amazon Web Services (AWS) managed database services enables dynamic scalability, faster processing of database operations, convenient visualization... -
The Table Stakes for Today’s Digital Education
Joe R.
Dec. 8, 2020It’s not like digital education suddenly happened when 2020 rolled around. The steady rise of digital education over the past decade was changing the... -
Generating PDFs with AWS Lambda
Bob S.
Dec. 4, 2020There are services that offer to turn your HTML into PDFs, but if you don't want another bill, and the risk of outsourcing vital functionality, you... -
Top 5 Ways to Deliver Total Quality Focus to your Team
Scott S.
Dec. 1, 2020You've secured agreement and buy in from all stakeholders. You've got people excited about giving their best and receiving your best. You're scared... -
Improve Django’s Admin Interface Using Inlines
Benjamin R.
Nov. 24, 2020Improve Django’s Admin Interface using Inlines -
JBS Custom Software Solutions Becomes a Member of the …
Jenny L.
Nov. 17, 2020JBS is pleased to announce today it achieved member status in the Amazon Web Services (AWS) Public Sector Partner Program -
React Embedded in Django Forms
Joshua L.
Nov. 12, 2020One technique we have found to accelerate our project development lifecycle is balancing the use of Django forms/views and React. React is a great... -
Application Logging with Watchtower and CloudWatch Logs
Nick W.
Nov. 11, 2020Centralized logging systems are vital in cloud-based architectures due to their inherent ephemeral nature. Whether using auto-scaling instances or... -
Deep Linking in iOS 14
Matt C.
Nov. 6, 2020With the release of iOS 14, companies like Branch and Facebook sounded the alarm with respect to IDFA changes. These changes gave users much more... -
Writing Self-Documenting Code & Good Code Commenting P…
Greg R.
Nov. 3, 2020We all know that writing good code that is efficient, stable and secure can be a challenging task. Because of this, as developers, we are tempted to... -
To Code Review or Not to Code Review…
Rachel G.
Oct. 29, 2020During their careers, developers are likely to encounter numerous approaches to code reviews. Some organizations will demand multiple approving peer... -
Four Ways to Increase Your Team’s Efficiency as a PM
Muhammed U.
Oct. 27, 2020As the Project Manager, you have a unique perspective on the project and can steer the project in the right direction by helping your team make the... -
Django Autocomplete
Joshua M.
Oct. 20, 2020Django is a Python-based web application framework that makes it easy to start developing a new dynamic website and simplifies much of the solved... -
Autoscaling GitLab Runners In Your CI/CD Pipeline
Nick W.
Oct. 18, 2020A typical CI/CD pipeline workflow usually includes some form of automation server - this article focuses on GitLab Runner. -
Get Your Digital Transformation Off the Ground and Int…
Joe R.
Oct. 15, 2020How do you actually get your critical initiative off the ground and into production? Here’s an overview to create a roadmap and basic steps to help... -
NuxtJS: Have your modern JS cake and SEO too
Sam B.
Oct. 13, 2020The web has grown immensely in its demands for user interface responsiveness. As countless consumers and businesses move from desktop programs to... -
Newfound Agility: Two Retailers that Adapted to Rapid …
Joe R.
Last edited: Oct. 7, 2020Today we examine two retailers with very different needs and goals. Both needed to quickly adapt, to make the leap from commodity sales to selling... -
Adapting to Change: Agility in Retail
Joe R.
Oct. 1, 2020We often talk and read about the changing expectations of today’s customers and the importance of not just meeting but exceeding those expectations.... -
When Online is Not Enough: Building Omni-Channel Exper…
Joe R.
Sept. 22, 2020We recently explored some interesting ways e-commerce retailers can build customer loyalty and a competitive advantage by making themselves stand out... -
4 Ways to Build Competitive Advantage Through Customer…
Joe R.
Sept. 15, 2020When it comes to digital enablement, today’s retailers have to work hard to distinguish themselves. In an ocean of online retailers, most of which... -
Redis Cache Deletion Performance
Matt C.
Sept. 9, 2020When developers of high traffic applications are confronted with performance degradation, often the first course of action is to implement some... -
Innovate or Fail: The Importance of Exceeding Customer…
Joe R.
Sept. 1, 2020While many companies believe that online shopping has forced brick-and-mortar retailers to adapt or close their doors, there’s far more to it than... -
Looking forward to Python 3.9
Bob S.
Aug. 26, 2020Python is often thought of as a hobbyist language, and its popularity among software developers for its flexibility and simplicity tend to make it an... -
Makefile is Still Cool in 2020
Shon D.
Aug. 19, 2020What we will discuss today is a simple pattern for makefile that does not require one to fully indoctrinate c/c++ into your shop to take advantage of... -
Blockchain Might Not Save The World But It’s Still Pre…
Benjamin R.
Aug. 5, 2020A blockchain is a decentralized “digital ledger” system intended to provide transparency and trust between parties engaging in some kind of... -
Transitioning to Contactless Retail
Chris E.
July 27, 2020The current situation with the worldwide pandemic has forced retailers to rethink how they operate and embrace contact-less methods of interacting... -
Real World Estimates
Kurt S.
July 22, 2020Estimates are created in software development for two very simple reasons – to determine how much a project will cost and how long it will take to... -
A Gentle Intro to CloudFormation and SAM
Ramin R.
July 14, 2020AWS is pretty amazing; we no longer need to self manage and provision our own servers. For pretty much any web service you can think of, AWS has a... -
Pros and Cons of Selenium IDE for Automated Testing
Benjamin R.
June 30, 2020Selenium is an open source suite of testing software that can automate web browsers to mimic real user behavior. The Selenium suite has three main... -
Affinity Analysis and Product Recommendations
Andrea R.
June 25, 2020How JBS implemented a wine recommendation system for one of our clients and as a result greatly increase the sales revenue -
Managing Technical Debt
Joshua M.
June 17, 2020Good engineering is the result of strong requirements grooming and prioritization, within the budgetary constraints available to complete a project.... -
The Case for Linux as Your Main Driver
Ramin R.
June 10, 2020Whether you need to convert 1,000 images to a different format, sync up code between servers, or manipulate text or files in any way imaginable - the... -
What is Snowflake and why should I care?
Chris E.
June 1, 2020Many organizations are considering cloud-based data solutions, instead of planning out on-premise solutions. Organizations are also evaluating moving... -
UI/UX: Establishing a Regression Testing Firewall
Joshua L.
May 26, 2020Finding a balance between the benefit the tests give you and the cost of spending time and effort writing tests can be challenging. -
Protecting Data in SQL Server Blog Post
Chris E.
April 29, 2020Keeping your and your client’s data secure is more important than ever. Security threats today cannot be ignored, with data breaches being a nearly... -
Strategies for a Successful Agile Implementation
Muhammed U.
March 2, 2020Agile is a widely adopted framework that brings many benefits to improve your software delivery as a whole. The framework itself is relatively... -
Domain Driven Project Organization
Brandon D.
April 28, 2020It seems every time I read a new software tutorial or library, the code is organized per a recognizable design pattern. For example. a Model, View,... -
Faster Mobile Development - Architect once, build twice
Joshua L.
April 14, 2020For many modern businesses, deploying a single mobile platform is no longer sufficient; in order to adequately cover your entire market, user base,... -
Working from Home - Agile Everywhere
Greg R.
April 2, 2020Whether you are a CEO, a manager, or a team lead, if you are following the Agile principles even reasonably well, it does not matter where your... -
The 5W's of Implementing CI/CD Pipelines
Patrick K.
March 20, 2020Continuous Integration / Continuous Delivery (CI/CD) has been widely accepted as an integral part of software development for some time now. -
Unit Testing Strategies
Brandon D.
March 6, 2020I don't think I've met a developer that enjoys writing unit tests. I don't enjoy writing unit tests either, but I do enjoy the confidence that they... -
Sanity When ALTERing Database Tables in Django
Joshua M.
March 1, 2020Databases are an integral part of many web applications - if you have used a website that has any user-specific functionality, that information has... -
Optimization Made Easy in the Django Admin
Joshua M.
Feb. 21, 2020Django is a Python-based web application framework that makes it easy to start developing a new dynamic website and simplifies much of the solved... -
Soylent Green - Your Application is Made of People
Miguel L.
Feb. 11, 2020Who you hire matters beyond their tech talent and whether they have the maturity to perform in your organization. Like choosing a business partner,... -
AWS Lambda Layers - What Are They Good For?
Patrick K.
Feb. 11, 2020There’s no doubt that AWS Lambda and Function as a Service (FAAS) have been game changers in the microservice architecture landscape. AWS Lambda... -
Vue.js - A Cleaner and More Effective Approach to Fron…
Ramin R.
Jan. 31, 2020The days of jQuery are long gone. Folks are no longer littering their code bases with JavaScript snippets to introduce interactivity. -
PostgreSQL Indexing: GIN, Django, and Trigram Similari…
Joe B.
Jan. 31, 2020PostgreSQL supports a special type of index called GIN – Generalized Inverted Index. This type of index is especially helpful for improving the... -
Universal Native Apps with React Native
Stuart L.
Jan. 23, 2020Heading into the year 2020, the prime candidates for application developers are iOS, Android, and the web browser. Modern users typically interact... -
The Wonderful World of Serverless Development
Mark R.
Jan. 23, 2020Serverless is one of those terms that gets thrown around and can mean different things to different people. The thing people generally think of is... -
Containerization and How It Can Be Useful for IT Autom…
Joe B.
Nov. 13, 2019Containerization accelerates the software delivery process. It is one of the key tools in the toolbox of high velocity software development and... -
High-Velocity Software Development
James P.
Sept. 15, 2019High velocity software development is a framework to maximize returns when developing custom software. The approach focuses on integrating technology... -
GeoDjango on Zappa / Lambda
Adam F.
Oct. 22, 2019Zappa and AWS Lambda are great prototyping tools (and production tools too) but one tool that’s important to me has been missing from the drawer when... -
Reduce Abandon Rates with the SPA Treatment
Joshua M.
Aug. 15, 2019Single-page applications (SPAs) have become the name of the game in modern web pages. Users expect to receive a web page instantly and are no longer... -
Outsourcing 101
Mark R.
July 19, 2019Most of these concepts are probably familiar, but it’s good to clarify some of what we will be discussing. When we talk about outsourcing, we mean... -
Hybrid Outsourcing Increases Success Rates
James P.
July 20, 2019Outsourcing or in-sourcing, those are the two choices right? Actually, they are not. You can combine the best of both worlds and really drive home... -
What is serverless, is it the future?
Joe C.
July 20, 2019In the five years since their large cloud provider launch, serverless hosting and Function as a Service (FaaS) platforms have become increasingly... -
In Defense of Unit Testing
Chris E.
June 20, 2019An argument can be made that unit tests are not worth the time and energy that they cost to produce. Furthermore, after investing that time and cost... -
Microservices for Innovation
Joe B.
June 21, 2019Companies today have more decisions to make when it comes to their application infrastructure than ever before. There are lots of choices that need... -
Succeeding with Agile in a Waterfall Culture
Doug P.
Feb. 27, 2019While working as both a developer and a project manager at JBS, I have seen many projects where the customer is looking to move away from a... -
Use Voice Activated BI to Reduce IT Expenses & Fast Tr…
Chad E.
Jan. 10, 2019Conversational BI is here, and it is a competitive advantage your firm needs today. Conversational BI gives you the ability to ask plain language... -
Practical Tips for Getting Started with Xamarin Cross-…
Shawn H.
Sept. 22, 2017In the years since it was first released, Xamarin has certainly come a long way towards fulfilling the promise of true cross-platform development. ... -
Migrating to Azure
Chris E.
Aug. 17, 2017So, you’ve decided that you want to migrate to the Cloud. Moving to a cloud service provider such as Azure is not something that should be taken... -
5 Things Your Project Team Can Do Right Now to Become …
Nick F.
May 30, 2017Agile is a word that gets thrown around a lot these days. While continuing to be the “methodology du jour”, especially in the complex world of... -
Zero to DevOps in Two Weeks
Aaron M.
Jan. 12, 2017I’ve have the good fortune in the recent past to work in an environment with some really strong DevOps slash automated infrastructure folks. As a... -
A Brief Overview of Apache Spark
Philip H.
Oct. 18, 2016In the Apache Foundation’s own words, Spark is called “A fast and general engine for large scale data processing.” Parsing this we get: Fast – Spark... -
Hybrid Mobile Apps Part 1: Ionic Framework Basics
Frank G.
Sept. 26, 2016According to an April 2016 report by comScore, a global media analytics company, mobile users now represent 65 percent of digital utilization with... -
Big Data with Hadoop Cluster
Joe R.
April 5, 2015It’s rare that you can go to a medium to large-enterprise IT environment and not have some kind of “Big Data” setup. Information and analytics are... -
Garbage Collection (.NET) vs. ARC (Swift) - Part 2
Greg R.
April 6, 2016In Part 1 of this series, we dug deep into many languages differences, both good and bad, between C# and Swift. As you begin to use the language on a... -
Escape from C# / Into the Swift Trenches - Part 1
Greg R.
March 1, 2016In my previous post I introduced the Swift language from the perspective of a C# developer, demonstrating some of the more obvious differences... -
Dealing with SQL Performance
Chris E.
March 24, 2016It seems all too often that the answer to dealing with SQL is now to use an Object-Relational Mapping (ORM) tool to avoid SQL like the plague when... -
An introduction to Celery
Joe R.
Jan. 6, 2016Often times in a web application, there are a subset of tasks that are long-running, resource intensive and don’t have to be completed in real time. ... -
Introduction to Aurelia – Part 2
Dave M.
Jan. 5, 2016Just recently, the Aurelia framework Beta-1 release was rolled out. While we’re excited to play with it, since we started this introductory series on... -
Introduction to Swift (for C#.NET developers)
Greg R.
Jan. 20, 2016The Swift language is gaining wide adoption at an accelerated rate. According to the TIOBE Index for 2015, Swift increased quite a bit in popularity... -
Django Caching Strategies
Joe R.
Nov. 4, 2015One of the often overlooked but critical components of a functioning web application is it’s performance. Not only does it have a dramatic impact on... -
An Introduction to Aurelia - Part 1
Dave M.
Nov. 12, 2015For a recent project, my JBS project team was tasked with updating a web front-end implementation. We looked into various front-end libraries in...