STAQ Development Manual (Redacted)

Mike Subelsky
Mike SubelskyEntrepreneur at OtherInbox
Development Manual: Fast and Good
PRIORITIES
Priorities
1.Accuracy
2.Timeliness
3.Performance
Predictability >> Speed
Professionalism >>
Heroism
Defense systems <=>
New features &
integrations
Ethical Conduct,
Always
When in doubt, ask!
THE VISION
How do we build software
in a predictable,
professional way?
We manage
the risk of change
It’s more risky
to NOT change code
Let’s make it impossible
to break the app
PROCESS
GUIDELINES
All bugs are ultimately
process failures
Our systems should reject bad changes
and enforce quality automatically
Deliver incremental
results
What’s the 10% solution
you could ship today?
Have more meetings
• Make decisions
• Hash things out
• Explain your plan
• Brainstorm
• Write pseudocode
• Make diagrams
• Sharpen understanding
I, Mike Subelsky,
heartily endorse meetings
IIF they entail decision-making, brainstorming,
mentoring, conflict, fun, excitement
STAQ Development Manual (Redacted)
Conduct Root Cause
Analysis After Every
Outage
“The Five Whys”
Team leaders
send weekly change updates
to all@
Prioritize automatic tests and
quality control
over new features/integrations
Place one person
on QA / bugfixing duty
each week
Need a cool object to pass around the office
PROJECT PLANNING
GUIDELINES
Set smaller goals
you can actually achieve
We need more milestones,
hard deadlines, “forcing functions”
3 Layers of Planning &
Goalsetting
• Goals
• Epics
• Stories
Goal
• Strategic objective that helps STAQ grow
• Increases revenue or reduces costs, or both
• Expressed as a single sentence, completely in
business terms, associated with a deadline
• “Charge customers for use of custom
connections by 12/01/2015”
Epics
• Major, high-level initiative to help achieve a Goal
• Complex effort encompassing changes to multiple
codebases
• Expressed in business terms, in terms of user
capabilities, with a deadline
• “Users can view, create, update, and delete custom
connections on their own by 11/15/2015”
• Constantly reprioritized as the project deadline
approaches
Push back
• AMs/TAMs should always push us to deliver our best,
advocating for customer
• We should push back when real constraints exist
• Helps everyone be more creative
• Helps clarify priorities
• 80% / incremental solutions often good enough
• Resist the urge to dive in and save the day
Refactoring &
maintenance cycles
• Count on about a week of fixing and polishing
major features post-release
• After an epic or major project finishes, we do this
anyway; let’s plan for it
• Good time to handle chores, smaller feature
tickets & bug fixes
CODING GUIDELINES
Make small changes
Observe the
Single Responsibility
Principle
Most other OOP principles derived from this one
- https://en.wikipedia.org/wiki/Single_responsibility_principle
“…every class should have responsibility over a
single part of the functionality provided by the
software.”
- https://en.wikipedia.org/wiki/Single_responsibility_principle
Responsibility is “…a reason to change…a
class or module should have one, and only one,
reason to change.”
Deploy in AM/mid-day
Prefer to deploy heavy/
breaking changes on
weekends
Avoid Sunday morning when collections run
Evening deploys OK
but more dangerous
You’ll get lazy / sleepy
Make a rollback plan
Use the staging server
• https://staging.staq.com
• https://sites.google.com/a/staq.com/
staqnowledged/home/infrastructure/staging-
server
Fork the app
• Good for testing database changes
• Need someone to try & document this
• https://devcenter.heroku.com/articles/fork-app
• May need to fork multiple apps in concert
• Heroku addon attachment feature pretty cool
Use feature flags
Create parallel
gems/engines/
extractors/tables
Design solid code
open to future change
But also beware of YAGNI
(You Ain’t Gonna Need It)
Make it easy to test
This is the main point of BDD; produces better designs
Lint Ruby and JS Code
• Rubocop
• ruby -c after every save
• Let’s make this a git pre-commit hook
• brew install jsl
Keep writing tests
• Unit tests: 100% coverage
• Usually no need to test explicit string contents
• Integration test: all major subsystems
• Including failure modes
• Acceptance test: most features, important failure
modes
• Smoke test: engines/gems integrated into apps
Tests must always
pass on CI
Fixing the build should usually
take precedence over other work
Keep Classes Small
• “One screenful or less”
• Not counting documentation
• Almost no private methods
• There’s always a better way, look for a hidden
object
Write many, many
classes
Use clean architectural
patterns
• 12factor
• Dependency injection
• Hexagonal architecture
Clear code >>
documentation >>
comments
Refactor constantly
Think like a gardener, not like a landscaper
Make the change easy,
then make the easy
change
Write many,
many gems/engines
Continue
peer code review
You are only done when…
• Documentation written (YARD tags + wiki)
• Unit tests written to 100% coverage
• Integration tests covering important subsystem
interactions
• Acceptance tests covering important features
and failure modes
• Code reviewed by a peer
MONITORING
AND ALERTING
Develop a few high-level,
actionable alerts
in staqmonitor
Many cool possibilities
We are going to build
an immune system
Rejects bad changes
Develop indications
and warning indicators
QUESTIONS?
1 of 62

Recommended

Ruby Concurrency Realities by
Ruby Concurrency RealitiesRuby Concurrency Realities
Ruby Concurrency RealitiesMike Subelsky
1.5K views55 slides
How to build webapps with tools by
How to build webapps with toolsHow to build webapps with tools
How to build webapps with toolsPasindu Perera
155 views13 slides
NCUG 2019: Spring forward: an introduction to Spring boot and Thymeleaf for (... by
NCUG 2019: Spring forward: an introduction to Spring boot and Thymeleaf for (...NCUG 2019: Spring forward: an introduction to Spring boot and Thymeleaf for (...
NCUG 2019: Spring forward: an introduction to Spring boot and Thymeleaf for (...Frank van der Linden
4K views48 slides
Jenkins2: How Jenkins 2 works and how to automate it by
Jenkins2: How Jenkins 2 works and how to automate itJenkins2: How Jenkins 2 works and how to automate it
Jenkins2: How Jenkins 2 works and how to automate itCamilo Ribeiro
397 views18 slides
Cypress workshop for JSFoo 2019 by
Cypress  workshop for JSFoo 2019Cypress  workshop for JSFoo 2019
Cypress workshop for JSFoo 2019Biswajit Pattanayak
117 views7 slides
Helpful Automation Techniques - Selenium Camp 2014 by
Helpful Automation Techniques - Selenium Camp 2014Helpful Automation Techniques - Selenium Camp 2014
Helpful Automation Techniques - Selenium Camp 2014Justin Ison
1.5K views31 slides

More Related Content

What's hot

Introduction to cypress in Angular (Chinese) by
Introduction to cypress in Angular (Chinese)Introduction to cypress in Angular (Chinese)
Introduction to cypress in Angular (Chinese)Hong Tat Yew
270 views39 slides
Ohoh by
OhohOhoh
OhohAzukisoft Pte Ltd
443 views21 slides
LONDON SDET MEETUP - Difference between Selenium and Cypress presentation by
LONDON SDET MEETUP - Difference between Selenium and Cypress presentationLONDON SDET MEETUP - Difference between Selenium and Cypress presentation
LONDON SDET MEETUP - Difference between Selenium and Cypress presentationSriram Angajala
440 views24 slides
Making maven and grunt play nice by
Making maven and grunt play niceMaking maven and grunt play nice
Making maven and grunt play niceZoran Nikolovski
1.1K views18 slides
Java EE 7 meets Java 8 by
Java EE 7 meets Java 8Java EE 7 meets Java 8
Java EE 7 meets Java 8Roberto Cortez
699 views11 slides
[131] packetbeat과 elasticsearch by
[131] packetbeat과 elasticsearch[131] packetbeat과 elasticsearch
[131] packetbeat과 elasticsearchNAVER D2
13.7K views60 slides

What's hot(20)

Introduction to cypress in Angular (Chinese) by Hong Tat Yew
Introduction to cypress in Angular (Chinese)Introduction to cypress in Angular (Chinese)
Introduction to cypress in Angular (Chinese)
Hong Tat Yew270 views
LONDON SDET MEETUP - Difference between Selenium and Cypress presentation by Sriram Angajala
LONDON SDET MEETUP - Difference between Selenium and Cypress presentationLONDON SDET MEETUP - Difference between Selenium and Cypress presentation
LONDON SDET MEETUP - Difference between Selenium and Cypress presentation
Sriram Angajala440 views
[131] packetbeat과 elasticsearch by NAVER D2
[131] packetbeat과 elasticsearch[131] packetbeat과 elasticsearch
[131] packetbeat과 elasticsearch
NAVER D213.7K views
Erlang - Dive Right In by vorn
Erlang - Dive Right InErlang - Dive Right In
Erlang - Dive Right In
vorn411 views
Vim Plugin Deployment by 偉格 高
Vim Plugin DeploymentVim Plugin Deployment
Vim Plugin Deployment
偉格 高1.1K views
Automated Acceptance Testing from Scratch by Excella
Automated Acceptance Testing from ScratchAutomated Acceptance Testing from Scratch
Automated Acceptance Testing from Scratch
Excella1.5K views
How To Combine Back-End 
 & Front-End Testing with BlazeMeter & Sauce Labs by Sauce Labs
How To Combine Back-End 
 & Front-End Testing with BlazeMeter & Sauce LabsHow To Combine Back-End 
 & Front-End Testing with BlazeMeter & Sauce Labs
How To Combine Back-End 
 & Front-End Testing with BlazeMeter & Sauce Labs
Sauce Labs3.3K views
Belfast Selenium Meetup by Justin Ison
Belfast Selenium MeetupBelfast Selenium Meetup
Belfast Selenium Meetup
Justin Ison461 views
How to Use Selenium, Successfully by Sauce Labs
How to Use Selenium, SuccessfullyHow to Use Selenium, Successfully
How to Use Selenium, Successfully
Sauce Labs14.8K views
Sauce Labs for Visual Studio Team Services & TFS by Sauce Labs
Sauce Labs for Visual Studio Team Services & TFSSauce Labs for Visual Studio Team Services & TFS
Sauce Labs for Visual Studio Team Services & TFS
Sauce Labs4.3K views
DCAST Meetup - Washington, DC Feb 2016 by Justin Ison
DCAST Meetup - Washington, DC Feb 2016DCAST Meetup - Washington, DC Feb 2016
DCAST Meetup - Washington, DC Feb 2016
Justin Ison241 views
Release the Monkeys ! Testing in the Wild at Netflix by Gareth Bowles
Release the Monkeys !  Testing in the Wild at NetflixRelease the Monkeys !  Testing in the Wild at Netflix
Release the Monkeys ! Testing in the Wild at Netflix
Gareth Bowles3.9K views
Saving Time By Testing With Jest by Ben McCormick
Saving Time By Testing With JestSaving Time By Testing With Jest
Saving Time By Testing With Jest
Ben McCormick2.9K views
React talk, GrunnJs 24 September 2014 by _jjoos_
React talk, GrunnJs 24 September 2014React talk, GrunnJs 24 September 2014
React talk, GrunnJs 24 September 2014
_jjoos_637 views
An (Updated) Introduction to Gutenberg by Andrew Marks
An (Updated) Introduction to GutenbergAn (Updated) Introduction to Gutenberg
An (Updated) Introduction to Gutenberg
Andrew Marks84 views
Create and upload your first Perl module to CPAN by brian d foy
Create and upload your first Perl module to CPANCreate and upload your first Perl module to CPAN
Create and upload your first Perl module to CPAN
brian d foy4.7K views

Similar to STAQ Development Manual (Redacted)

DevOps - Understanding Core Concepts by
DevOps - Understanding Core ConceptsDevOps - Understanding Core Concepts
DevOps - Understanding Core ConceptsNitin Bhide
912 views59 slides
DevOps - Understanding Core Concepts (Old) by
DevOps - Understanding Core Concepts (Old)DevOps - Understanding Core Concepts (Old)
DevOps - Understanding Core Concepts (Old)Nitin Bhide
3.2K views53 slides
A lean automation blueprint for testing in continuous delivery by
A lean automation blueprint for testing in continuous deliveryA lean automation blueprint for testing in continuous delivery
A lean automation blueprint for testing in continuous deliverySauce Labs
264 views36 slides
Solano Labs presented at MassTLC's automated testing by
Solano Labs presented at MassTLC's automated testingSolano Labs presented at MassTLC's automated testing
Solano Labs presented at MassTLC's automated testingMassTLC
701 views11 slides
Mark Andersen DFW DevOps Days 2017 by
Mark Andersen DFW DevOps Days 2017Mark Andersen DFW DevOps Days 2017
Mark Andersen DFW DevOps Days 2017Mark Andersen
1.3K views19 slides
Cloud Academy Webinar: Recipe for DevOps Success: Capital One Style by
Cloud Academy Webinar: Recipe for DevOps Success: Capital One StyleCloud Academy Webinar: Recipe for DevOps Success: Capital One Style
Cloud Academy Webinar: Recipe for DevOps Success: Capital One StyleMark Andersen
488 views21 slides

Similar to STAQ Development Manual (Redacted)(20)

DevOps - Understanding Core Concepts by Nitin Bhide
DevOps - Understanding Core ConceptsDevOps - Understanding Core Concepts
DevOps - Understanding Core Concepts
Nitin Bhide912 views
DevOps - Understanding Core Concepts (Old) by Nitin Bhide
DevOps - Understanding Core Concepts (Old)DevOps - Understanding Core Concepts (Old)
DevOps - Understanding Core Concepts (Old)
Nitin Bhide3.2K views
A lean automation blueprint for testing in continuous delivery by Sauce Labs
A lean automation blueprint for testing in continuous deliveryA lean automation blueprint for testing in continuous delivery
A lean automation blueprint for testing in continuous delivery
Sauce Labs264 views
Solano Labs presented at MassTLC's automated testing by MassTLC
Solano Labs presented at MassTLC's automated testingSolano Labs presented at MassTLC's automated testing
Solano Labs presented at MassTLC's automated testing
MassTLC701 views
Mark Andersen DFW DevOps Days 2017 by Mark Andersen
Mark Andersen DFW DevOps Days 2017Mark Andersen DFW DevOps Days 2017
Mark Andersen DFW DevOps Days 2017
Mark Andersen1.3K views
Cloud Academy Webinar: Recipe for DevOps Success: Capital One Style by Mark Andersen
Cloud Academy Webinar: Recipe for DevOps Success: Capital One StyleCloud Academy Webinar: Recipe for DevOps Success: Capital One Style
Cloud Academy Webinar: Recipe for DevOps Success: Capital One Style
Mark Andersen488 views
Improving the Design of Existing Software by Steven Smith
Improving the Design of Existing SoftwareImproving the Design of Existing Software
Improving the Design of Existing Software
Steven Smith1.4K views
Geecon Microservices 2015 - Swimming upstream in the container revolution by Bert Jan Schrijver
Geecon Microservices 2015 - Swimming upstream in the container revolutionGeecon Microservices 2015 - Swimming upstream in the container revolution
Geecon Microservices 2015 - Swimming upstream in the container revolution
Bert Jan Schrijver2.6K views
Road to Continuous Delivery - Wix.com by Aviran Mordo
Road to Continuous Delivery - Wix.comRoad to Continuous Delivery - Wix.com
Road to Continuous Delivery - Wix.com
Aviran Mordo3K views
Agile Engineering Best Practices by Richard Cheng by Excella
Agile Engineering Best Practices by Richard ChengAgile Engineering Best Practices by Richard Cheng
Agile Engineering Best Practices by Richard Cheng
Excella994 views
Java Forum Nord 2015 - Swimming upstream in the container revolution by Bert Jan Schrijver
Java Forum Nord 2015 - Swimming upstream in the container revolutionJava Forum Nord 2015 - Swimming upstream in the container revolution
Java Forum Nord 2015 - Swimming upstream in the container revolution
Bert Jan Schrijver660 views
NextBuild 2015 - Swimming upstream in the container revolution by Bert Jan Schrijver
NextBuild 2015 - Swimming upstream in the container revolutionNextBuild 2015 - Swimming upstream in the container revolution
NextBuild 2015 - Swimming upstream in the container revolution
Bert Jan Schrijver507 views
Software Development 2020 - Swimming upstream in the container revolution by Bert Jan Schrijver
Software Development 2020 - Swimming upstream in the container revolutionSoftware Development 2020 - Swimming upstream in the container revolution
Software Development 2020 - Swimming upstream in the container revolution
Bert Jan Schrijver381 views
Swimming upstream in the container revolution by nextbuild
Swimming upstream in the container revolutionSwimming upstream in the container revolution
Swimming upstream in the container revolution
nextbuild304 views
Continuous delivery @wcap 5-09-2013 by David Funaro
Continuous delivery   @wcap 5-09-2013Continuous delivery   @wcap 5-09-2013
Continuous delivery @wcap 5-09-2013
David Funaro1.5K views
JavaOne 2015 - Swimming upstream in the container revolution by Bert Jan Schrijver
JavaOne 2015 - Swimming upstream in the container revolutionJavaOne 2015 - Swimming upstream in the container revolution
JavaOne 2015 - Swimming upstream in the container revolution
Bert Jan Schrijver647 views
Introduction to continuous delivery by OlympicSoftware
Introduction to continuous deliveryIntroduction to continuous delivery
Introduction to continuous delivery
OlympicSoftware825 views

More from Mike Subelsky

Coding for uncertainty by
Coding for uncertaintyCoding for uncertainty
Coding for uncertaintyMike Subelsky
1K views21 slides
Generating Good Ideas by
Generating Good IdeasGenerating Good Ideas
Generating Good IdeasMike Subelsky
743 views22 slides
Baltimore: A Great Place to Pick Up Ideas and Run WIth Them (Ignite) by
Baltimore: A Great Place to Pick Up Ideas and Run WIth Them (Ignite)Baltimore: A Great Place to Pick Up Ideas and Run WIth Them (Ignite)
Baltimore: A Great Place to Pick Up Ideas and Run WIth Them (Ignite)Mike Subelsky
591 views20 slides
Let's Make Baltimore More Innovative (TEDxBaltimore) by
Let's Make Baltimore More Innovative (TEDxBaltimore)Let's Make Baltimore More Innovative (TEDxBaltimore)
Let's Make Baltimore More Innovative (TEDxBaltimore)Mike Subelsky
562 views21 slides
Social Media for Everybody by
Social Media for EverybodySocial Media for Everybody
Social Media for EverybodyMike Subelsky
666 views39 slides
Ruby For Startups by
Ruby For StartupsRuby For Startups
Ruby For StartupsMike Subelsky
1.4K views83 slides

More from Mike Subelsky(11)

Baltimore: A Great Place to Pick Up Ideas and Run WIth Them (Ignite) by Mike Subelsky
Baltimore: A Great Place to Pick Up Ideas and Run WIth Them (Ignite)Baltimore: A Great Place to Pick Up Ideas and Run WIth Them (Ignite)
Baltimore: A Great Place to Pick Up Ideas and Run WIth Them (Ignite)
Mike Subelsky591 views
Let's Make Baltimore More Innovative (TEDxBaltimore) by Mike Subelsky
Let's Make Baltimore More Innovative (TEDxBaltimore)Let's Make Baltimore More Innovative (TEDxBaltimore)
Let's Make Baltimore More Innovative (TEDxBaltimore)
Mike Subelsky562 views
Social Media for Everybody by Mike Subelsky
Social Media for EverybodySocial Media for Everybody
Social Media for Everybody
Mike Subelsky666 views
It's Not Always Sunny in the Clouds by Mike Subelsky
It's Not Always Sunny in the CloudsIt's Not Always Sunny in the Clouds
It's Not Always Sunny in the Clouds
Mike Subelsky1.7K views
Introduction to SproutCore at JSConf by Mike Subelsky
Introduction to SproutCore at JSConfIntroduction to SproutCore at JSConf
Introduction to SproutCore at JSConf
Mike Subelsky1.3K views
Scaling Rails Applications In The Cloud by Mike Subelsky
Scaling Rails Applications In The CloudScaling Rails Applications In The Cloud
Scaling Rails Applications In The Cloud
Mike Subelsky1.4K views
SproutCore and the Future of Web Apps by Mike Subelsky
SproutCore and the Future of Web AppsSproutCore and the Future of Web Apps
SproutCore and the Future of Web Apps
Mike Subelsky708 views
SproutCore and the Future of Web Apps by Mike Subelsky
SproutCore and the Future of Web AppsSproutCore and the Future of Web Apps
SproutCore and the Future of Web Apps
Mike Subelsky523 views

Recently uploaded

Sprint 226 by
Sprint 226Sprint 226
Sprint 226ManageIQ
10 views18 slides
Copilot Prompting Toolkit_All Resources.pdf by
Copilot Prompting Toolkit_All Resources.pdfCopilot Prompting Toolkit_All Resources.pdf
Copilot Prompting Toolkit_All Resources.pdfRiccardo Zamana
16 views4 slides
Keep by
KeepKeep
KeepGeniusee
78 views10 slides
DRYiCE™ iAutomate: AI-enhanced Intelligent Runbook Automation by
DRYiCE™ iAutomate: AI-enhanced Intelligent Runbook AutomationDRYiCE™ iAutomate: AI-enhanced Intelligent Runbook Automation
DRYiCE™ iAutomate: AI-enhanced Intelligent Runbook AutomationHCLSoftware
6 views8 slides
ShortStory_qlora.pptx by
ShortStory_qlora.pptxShortStory_qlora.pptx
ShortStory_qlora.pptxpranathikrishna22
5 views10 slides
What is API by
What is APIWhat is API
What is APIartembondar5
10 views15 slides

Recently uploaded(20)

Sprint 226 by ManageIQ
Sprint 226Sprint 226
Sprint 226
ManageIQ10 views
Copilot Prompting Toolkit_All Resources.pdf by Riccardo Zamana
Copilot Prompting Toolkit_All Resources.pdfCopilot Prompting Toolkit_All Resources.pdf
Copilot Prompting Toolkit_All Resources.pdf
Riccardo Zamana16 views
DRYiCE™ iAutomate: AI-enhanced Intelligent Runbook Automation by HCLSoftware
DRYiCE™ iAutomate: AI-enhanced Intelligent Runbook AutomationDRYiCE™ iAutomate: AI-enhanced Intelligent Runbook Automation
DRYiCE™ iAutomate: AI-enhanced Intelligent Runbook Automation
HCLSoftware6 views
Understanding HTML terminology by artembondar5
Understanding HTML terminologyUnderstanding HTML terminology
Understanding HTML terminology
artembondar56 views
predicting-m3-devopsconMunich-2023-v2.pptx by Tier1 app
predicting-m3-devopsconMunich-2023-v2.pptxpredicting-m3-devopsconMunich-2023-v2.pptx
predicting-m3-devopsconMunich-2023-v2.pptx
Tier1 app9 views
.NET Developer Conference 2023 - .NET Microservices mit Dapr – zu viel Abstra... by Marc Müller
.NET Developer Conference 2023 - .NET Microservices mit Dapr – zu viel Abstra....NET Developer Conference 2023 - .NET Microservices mit Dapr – zu viel Abstra...
.NET Developer Conference 2023 - .NET Microservices mit Dapr – zu viel Abstra...
Marc Müller41 views
Unlocking the Power of AI in Product Management - A Comprehensive Guide for P... by NimaTorabi2
Unlocking the Power of AI in Product Management - A Comprehensive Guide for P...Unlocking the Power of AI in Product Management - A Comprehensive Guide for P...
Unlocking the Power of AI in Product Management - A Comprehensive Guide for P...
NimaTorabi215 views
Myths and Facts About Hospice Care: Busting Common Misconceptions by Care Coordinations
Myths and Facts About Hospice Care: Busting Common MisconceptionsMyths and Facts About Hospice Care: Busting Common Misconceptions
Myths and Facts About Hospice Care: Busting Common Misconceptions
360 graden fabriek by info33492
360 graden fabriek360 graden fabriek
360 graden fabriek
info33492143 views
Dapr Unleashed: Accelerating Microservice Development by Miroslav Janeski
Dapr Unleashed: Accelerating Microservice DevelopmentDapr Unleashed: Accelerating Microservice Development
Dapr Unleashed: Accelerating Microservice Development
Miroslav Janeski12 views
Generic or specific? Making sensible software design decisions by Bert Jan Schrijver
Generic or specific? Making sensible software design decisionsGeneric or specific? Making sensible software design decisions
Generic or specific? Making sensible software design decisions
Team Transformation Tactics for Holistic Testing and Quality (Japan Symposium... by Lisi Hocke
Team Transformation Tactics for Holistic Testing and Quality (Japan Symposium...Team Transformation Tactics for Holistic Testing and Quality (Japan Symposium...
Team Transformation Tactics for Holistic Testing and Quality (Japan Symposium...
Lisi Hocke35 views
Introduction to Git Source Control by John Valentino
Introduction to Git Source ControlIntroduction to Git Source Control
Introduction to Git Source Control
John Valentino6 views

STAQ Development Manual (Redacted)