Engineering Blog https://www.betterment.com/engineering We're engineering Betterment to become a top-notch fintech company. High quality code. Beautiful, practical design. Nerd out with us on all things tech. en Tue, 07 Jun 2022 22:13:31 GMT 2022-06-07T22:13:31Z en End-to-end-ish tests using fake HTTP in Flutter https://www.betterment.com/engineering/end-to-end-ish-tests-using-fake-http-in-flutter <div class="hs-featured-image-wrapper"> <a href="https://www.betterment.com/engineering/end-to-end-ish-tests-using-fake-http-in-flutter" title="" class="hs-featured-image-link"> <img src="https://www.betterment.com/hubfs/Graphics/Featured-images/feature-image-fake-http-flutter.jpg" alt="End-to-end-ish tests using fake HTTP in Flutter" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"> </a> </div> <p>We write tests in order to prove our features work as intended and we run those tests consistently to prove that our features don't stop working as intended.</p> <div class="hs-featured-image-wrapper"> <a href="https://www.betterment.com/engineering/end-to-end-ish-tests-using-fake-http-in-flutter" title="" class="hs-featured-image-link"> <img src="https://www.betterment.com/hubfs/Graphics/Featured-images/feature-image-fake-http-flutter.jpg" alt="End-to-end-ish tests using fake HTTP in Flutter" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"> </a> </div> <p>We write tests in order to prove our features work as intended and we run those tests consistently to prove that our features don't stop working as intended.</p> <img src="https://track.hubspot.com/__ptq.gif?a=5274572&amp;k=14&amp;r=https%3A%2F%2Fwww.betterment.com%2Fengineering%2Fend-to-end-ish-tests-using-fake-http-in-flutter&amp;bu=https%253A%252F%252Fwww.betterment.com%252Fengineering&amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "> Testing software Wed, 23 Feb 2022 13:55:21 GMT https://www.betterment.com/engineering/end-to-end-ish-tests-using-fake-http-in-flutter 2022-02-23T13:55:21Z Sam Moore | Principal Engineer, Betterment Stability through Randomness https://www.betterment.com/engineering/stability-through-randomness <div class="hs-featured-image-wrapper"> <a href="https://www.betterment.com/engineering/stability-through-randomness" title="" class="hs-featured-image-link"> <img src="https://www.betterment.com/hubfs/Graphics/Featured-images/feature-image-stability-through-randomness-2.png" alt="Stability through Randomness" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"> </a> </div> <p>We only recently enabled test randomization and as a result found that some of our tests were failing. Through fixing the tests, we learned lessons that could help others have a less painful migration themselves.</p> <div class="hs-featured-image-wrapper"> <a href="https://www.betterment.com/engineering/stability-through-randomness" title="" class="hs-featured-image-link"> <img src="https://www.betterment.com/hubfs/Graphics/Featured-images/feature-image-stability-through-randomness-2.png" alt="Stability through Randomness" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"> </a> </div> <p>We only recently enabled test randomization and as a result found that some of our tests were failing. Through fixing the tests, we learned lessons that could help others have a less painful migration themselves.</p> <img src="https://track.hubspot.com/__ptq.gif?a=5274572&amp;k=14&amp;r=https%3A%2F%2Fwww.betterment.com%2Fengineering%2Fstability-through-randomness&amp;bu=https%253A%252F%252Fwww.betterment.com%252Fengineering&amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "> Testing software Thu, 03 Feb 2022 23:43:36 GMT brandon.trautmann@betterment.com (Brandon Trautmann | Senior Mobile Engineer) https://www.betterment.com/engineering/stability-through-randomness 2022-02-03T23:43:36Z Finding a Middle Ground Between Screen and UI Testing in Flutter https://www.betterment.com/engineering/flutter-screen-ui-testing <div class="hs-featured-image-wrapper"> <a href="https://www.betterment.com/engineering/flutter-screen-ui-testing" title="" class="hs-featured-image-link"> <img src="https://www.betterment.com/hubfs/Graphics/Featured-images/flutter-screen-ui-testing.png" alt="smartphone held up by hand on gears background" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"> </a> </div> <p>We outline the struggles we had testing our flutter app, our approaches to those challenges, and the solutions we arrived at to solve those problems.</p> <div class="hs-featured-image-wrapper"> <a href="https://www.betterment.com/engineering/flutter-screen-ui-testing" title="" class="hs-featured-image-link"> <img src="https://www.betterment.com/hubfs/Graphics/Featured-images/flutter-screen-ui-testing.png" alt="smartphone held up by hand on gears background" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"> </a> </div> <p>We outline the struggles we had testing our flutter app, our approaches to those challenges, and the solutions we arrived at to solve those problems.</p> <img src="https://track.hubspot.com/__ptq.gif?a=5274572&amp;k=14&amp;r=https%3A%2F%2Fwww.betterment.com%2Fengineering%2Fflutter-screen-ui-testing&amp;bu=https%253A%252F%252Fwww.betterment.com%252Fengineering&amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "> Testing software Wed, 12 Jan 2022 18:26:10 GMT caleb.donoho@betterment.com (Caleb Donoho | Software Engineer) https://www.betterment.com/engineering/flutter-screen-ui-testing 2022-01-12T18:26:10Z Why (And How) Betterment Is Using Julia https://www.betterment.com/engineering/why-betterment-is-using-julia <div class="hs-featured-image-wrapper"> <a href="https://www.betterment.com/engineering/why-betterment-is-using-julia" title="" class="hs-featured-image-link"> <img src="https://www.betterment.com/hubfs/Graphics/featured-images/goal-card-on-track-retire-in-the-mountains.png" alt="Retirement goal next to on track graph" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"> </a> </div> <p>Betterment is using Julia to solve our own version of the “two-language problem."</p> <div class="hs-featured-image-wrapper"> <a href="https://www.betterment.com/engineering/why-betterment-is-using-julia" title="" class="hs-featured-image-link"> <img src="https://www.betterment.com/hubfs/Graphics/featured-images/goal-card-on-track-retire-in-the-mountains.png" alt="Retirement goal next to on track graph" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"> </a> </div> <p>Betterment is using Julia to solve our own version of the “two-language problem."</p> <img src="https://track.hubspot.com/__ptq.gif?a=5274572&amp;k=14&amp;r=https%3A%2F%2Fwww.betterment.com%2Fengineering%2Fwhy-betterment-is-using-julia&amp;bu=https%253A%252F%252Fwww.betterment.com%252Fengineering&amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "> Sun, 14 Nov 2021 22:51:19 GMT https://www.betterment.com/engineering/why-betterment-is-using-julia 2021-11-14T22:51:19Z Dan Felicetta | Former Staff Engineer, Betterment Introducing “Delayed”: Resilient Background Jobs on Rails https://www.betterment.com/engineering/delayed-resilient-background-jobs-on-rails <div class="hs-featured-image-wrapper"> <a href="https://www.betterment.com/engineering/delayed-resilient-background-jobs-on-rails" title="" class="hs-featured-image-link"> <img src="https://www.betterment.com/hubfs/Graphics/featured-images/portfolio-option-icons.png" alt="Various icons showing pie charts" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"> </a> </div> <p>In the past 24 hours, a Ruby on Rails application at Betterment performed somewhere on the order of 10 million asynchronous tasks.</p> <div class="hs-featured-image-wrapper"> <a href="https://www.betterment.com/engineering/delayed-resilient-background-jobs-on-rails" title="" class="hs-featured-image-link"> <img src="https://www.betterment.com/hubfs/Graphics/featured-images/portfolio-option-icons.png" alt="Various icons showing pie charts" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"> </a> </div> <p>In the past 24 hours, a Ruby on Rails application at Betterment performed somewhere on the order of 10 million asynchronous tasks.</p> <img src="https://track.hubspot.com/__ptq.gif?a=5274572&amp;k=14&amp;r=https%3A%2F%2Fwww.betterment.com%2Fengineering%2Fdelayed-resilient-background-jobs-on-rails&amp;bu=https%253A%252F%252Fwww.betterment.com%252Fengineering&amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "> Operating software Tue, 07 Sep 2021 04:00:00 GMT https://www.betterment.com/engineering/delayed-resilient-background-jobs-on-rails 2021-09-07T04:00:00Z Nathan Griffith | Senior Staff Engineer, Betterment Focusing on What Matters: Using SLOs to Pursue User Happiness https://www.betterment.com/engineering/service-level-objectives-slo <div class="hs-featured-image-wrapper"> <a href="https://www.betterment.com/engineering/service-level-objectives-slo" title="" class="hs-featured-image-link"> <img src="https://www.betterment.com/hubfs/Graphics/featured-images/shield-armor-lightbulb.png" alt="Security shield with light bulb on front" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"> </a> </div> <p>Proper reliability is the greatest operational requirement for any service. If the service doesn’t work as intended, no user (or engineer) will be happy. This is where SLOs come in.</p> <div class="hs-featured-image-wrapper"> <a href="https://www.betterment.com/engineering/service-level-objectives-slo" title="" class="hs-featured-image-link"> <img src="https://www.betterment.com/hubfs/Graphics/featured-images/shield-armor-lightbulb.png" alt="Security shield with light bulb on front" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"> </a> </div> <p>Proper reliability is the greatest operational requirement for any service. If the service doesn’t work as intended, no user (or engineer) will be happy. This is where SLOs come in.</p> <img src="https://track.hubspot.com/__ptq.gif?a=5274572&amp;k=14&amp;r=https%3A%2F%2Fwww.betterment.com%2Fengineering%2Fservice-level-objectives-slo&amp;bu=https%253A%252F%252Fwww.betterment.com%252Fengineering&amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "> Operating software Wed, 04 Aug 2021 04:00:00 GMT https://www.betterment.com/engineering/service-level-objectives-slo 2021-08-04T04:00:00Z Sophia Russell | Staff Engineer, Betterment Finding and Preventing Rails Authorization Bugs https://www.betterment.com/engineering/finding-and-preventing-rails-authorization-bugs <div class="hs-featured-image-wrapper"> <a href="https://www.betterment.com/engineering/finding-and-preventing-rails-authorization-bugs" title="" class="hs-featured-image-link"> <img src="https://www.betterment.com/hubfs/Graphics/featured-images/road-path-finish-flag.jpg" alt="Road leading to finish flag" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"> </a> </div> <p>This article walks through finding and fixing common Rails authorization bugs.</p> <div class="hs-featured-image-wrapper"> <a href="https://www.betterment.com/engineering/finding-and-preventing-rails-authorization-bugs" title="" class="hs-featured-image-link"> <img src="https://www.betterment.com/hubfs/Graphics/featured-images/road-path-finish-flag.jpg" alt="Road leading to finish flag" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"> </a> </div> <p>This article walks through finding and fixing common Rails authorization bugs.</p> <img src="https://track.hubspot.com/__ptq.gif?a=5274572&amp;k=14&amp;r=https%3A%2F%2Fwww.betterment.com%2Fengineering%2Ffinding-and-preventing-rails-authorization-bugs&amp;bu=https%253A%252F%252Fwww.betterment.com%252Fengineering&amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "> Testing software Thu, 27 May 2021 04:00:00 GMT https://www.betterment.com/engineering/finding-and-preventing-rails-authorization-bugs 2021-05-27T04:00:00Z OMAR | Staff Security Engineer, Betterment Using Targeted Universalism To Build Inclusive Features https://www.betterment.com/engineering/build-inclusive-features <div class="hs-featured-image-wrapper"> <a href="https://www.betterment.com/engineering/build-inclusive-features" title="" class="hs-featured-image-link"> <img src="https://www.betterment.com/hubfs/Graphics/featured-images/humans-under-umbrella.png" alt="Using Targeted Universalism To Build Inclusive Features" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"> </a> </div> <p>The best products are inclusive at every stage of the design and engineering process. Here's how we turned a request for more inclusion into a feature all Betterment customers can benefit from. </p> <div class="hs-featured-image-wrapper"> <a href="https://www.betterment.com/engineering/build-inclusive-features" title="" class="hs-featured-image-link"> <img src="https://www.betterment.com/hubfs/Graphics/featured-images/humans-under-umbrella.png" alt="Using Targeted Universalism To Build Inclusive Features" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"> </a> </div> <p>The best products are inclusive at every stage of the design and engineering process. Here's how we turned a request for more inclusion into a feature all Betterment customers can benefit from. </p> <img src="https://track.hubspot.com/__ptq.gif?a=5274572&amp;k=14&amp;r=https%3A%2F%2Fwww.betterment.com%2Fengineering%2Fbuild-inclusive-features&amp;bu=https%253A%252F%252Fwww.betterment.com%252Fengineering&amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "> Inclusivity Tue, 10 Nov 2020 05:00:00 GMT https://www.betterment.com/engineering/build-inclusive-features 2020-11-10T05:00:00Z Jesse Harrelson | Mobile Engineering Manager, Betterment Guidelines for Testing Rails Applications https://www.betterment.com/engineering/guidelines-for-testing-rails-applications <div class="hs-featured-image-wrapper"> <a href="https://www.betterment.com/engineering/guidelines-for-testing-rails-applications" title="" class="hs-featured-image-link"> <img src="https://www.betterment.com/hubfs/Graphics/featured-images/binoculars.jpg" alt="Guidelines for Testing Rails Applications" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"> </a> </div> <p>Discusses the different responsibilities of model, request, and system specs, and other high level guidelines for writing specs using RSpec &amp; Capybara.</p> <div class="hs-featured-image-wrapper"> <a href="https://www.betterment.com/engineering/guidelines-for-testing-rails-applications" title="" class="hs-featured-image-link"> <img src="https://www.betterment.com/hubfs/Graphics/featured-images/binoculars.jpg" alt="Guidelines for Testing Rails Applications" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"> </a> </div> <p>Discusses the different responsibilities of model, request, and system specs, and other high level guidelines for writing specs using RSpec &amp; Capybara.</p> <img src="https://track.hubspot.com/__ptq.gif?a=5274572&amp;k=14&amp;r=https%3A%2F%2Fwww.betterment.com%2Fengineering%2Fguidelines-for-testing-rails-applications&amp;bu=https%253A%252F%252Fwww.betterment.com%252Fengineering&amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "> Testing software Thu, 24 Oct 2019 04:00:00 GMT https://www.betterment.com/engineering/guidelines-for-testing-rails-applications 2019-10-24T04:00:00Z Greg Sadowski | Staff Engineer, Betterment WebValve – The Magic You Need for HTTP Integration https://www.betterment.com/engineering/webvalve-rails-http-integration <div class="hs-featured-image-wrapper"> <a href="https://www.betterment.com/engineering/webvalve-rails-http-integration" title="" class="hs-featured-image-link"> <img src="https://www.betterment.com/hubfs/Graphics/featured-images/shield-armor-lightbulb.png" alt="Lightbulb on a shield of armor" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"> </a> </div> <p>Struggling with HTTP integrations locally? Use WebValve to define HTTP service fakes and toggle between real and fake services in non-production environments.</p> <div class="hs-featured-image-wrapper"> <a href="https://www.betterment.com/engineering/webvalve-rails-http-integration" title="" class="hs-featured-image-link"> <img src="https://www.betterment.com/hubfs/Graphics/featured-images/shield-armor-lightbulb.png" alt="Lightbulb on a shield of armor" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"> </a> </div> <p>Struggling with HTTP integrations locally? Use WebValve to define HTTP service fakes and toggle between real and fake services in non-production environments.</p> <img src="https://track.hubspot.com/__ptq.gif?a=5274572&amp;k=14&amp;r=https%3A%2F%2Fwww.betterment.com%2Fengineering%2Fwebvalve-rails-http-integration&amp;bu=https%253A%252F%252Fwww.betterment.com%252Fengineering&amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "> Operating software Fri, 26 Apr 2019 04:00:00 GMT https://www.betterment.com/engineering/webvalve-rails-http-integration 2019-04-26T04:00:00Z Sam Moore | Principal Engineer, Betterment