In our previous post, we described how Doximity Ask answers clinical questions, and our commitment to safety and oversight as part of building each one of its components. Today we are releasing Bedside Bench, an open benchmark of 500 physician-validated clinical question-answering cases, together with the complete grading rubrics we use as part of our core internal evaluations for this question set. Bedside Bench covers a wide range of clinically specialized evaluation tasks covering both common clinical query scenarios, safety-focused evaluations, as well as areas where large language models…
The Newsfeed is one of the most-used features in the Doximity iOS app. It is the first thing many users see when they open the app. For doctors checking in between patients or residents catching up during a break, it has to be fast and efficient. Those expectations defined success for the migration. Feature work had to continue, analytics had to remain reliable, and the experience had to remain familiar to users even as the underlying implementation changed. We approached the migration less like a rewrite and more like a controlled rollout. We moved one section at a time, kept the UIKit and…
Change Data Capture (CDC) is often presented as a straightforward pipeline: read a database transaction log, publish each change, and apply those changes to another system. That description is accurate, but it leaves out many of the decisions that determine whether the resulting data can be trusted. At Doximity, we already had a batch pipeline that periodically copied snapshots of application databases into our data warehouse. Those snapshots were reliable, but their freshness was measured in hours. We introduced CDC to make changes available in minutes so downstream transformations and…
Medical AI has attracted confident claims: perfect scores, no hallucinations, a system that gracefully declines whenever the evidence runs out. But are these dimensions the right way to think about a tool that physicians use to make real-world decisions? For clinical AI, reliability is not just a question of whether an answer is correct. It is also a question of whether a physician can understand where the answer came from, evaluate the supporting evidence, and identify situations where uncertainty remains. How Doximity Ask Answers Clinical Questions Few domains face stakes as high as medical…
One of our background jobs was so slow that users assumed it was broken. They would kick it off, wander away, knowing it would take ages to complete. Turns out the job was fine. It was just taking its sweet time. We eventually cut its runtime by about 80%, and the fix was so small it was almost insulting. You could have stared at the code for hours and missed it. A profiler found it in minutes. This post is about how to think about profiling so you reach for it at the right moment, not as a first reflex. Performance is a KPI, Not a Vibe It's easy to treat performance as something you tune…
In the current rush to adopt agentic systems, the most dangerous question isn't "what can we make agentic?" but "where do agents actually help?" At Doximity, we’ve found that moving from a working demo to a production-grade agent requires a shift in focus—from model capability to system design. That framing matters because a working demo and a production system are very different things. The demo proves something can work once. The product has to work repeatedly, with real users, real permissions, real data, and real failure modes. That matters even more in healthcare-oriented products like…
As a newly minted Staff Software Engineer at Doximity, I've been looking for ways to maximize my impact on the teams I support. My mandate as a Staff Software Engineer is to solve the kinds of problems that affect every team in my umbrella, not just the one team where I do my own IC work. That's a big change from my previous role as tech lead of a small team. I’ve enjoyed following LeadDev’s content, from blog posts and videos to webinars, so attending a LeadDev conference has been on my bucket list for a while. I got my chance when I learned they were hosting their conference in New York…
IBM defines Data Engineering as "the practice of designing and building systems for the aggregation, storage, and analysis of data at scale, empowering organizations to get insights in real time from large datasets." While this definition generally captures what data engineering is, it blends together distinct specializations that enable scalable transformation of raw data to actionable insights. At Doximity, we break this down into two distinct roles: product-focused data engineers and platform-focused data engineers, each playing a crucial role to fuel our organization with timely, reliable…
Matching the Tool to the Task A Quick Recap In a previous article, we focused on the strengths of Large Language Models (LLMs), traditional Machine Learning (ML), and statistical methods and recommended 4 key questions to help you choose the right tool for a data solution. Your Data: Is it structured or unstructured? Bounded or unbounded? Your Goal: Do you need prediction, generation, or inference? Your Data Volume: Are you working with massive datasets or limited samples? Your Need for Transparency: Is deep explainability or strict repeatability a requirement? The key takeaway was that LLMs…
At Doximity, we have nearly 20 data teams responsible for the development of data pipelines to support product and business intelligence needs. These teams rely on Apache Airflow to orchestrate over 900 active DAGs (fancy word for data pipelines), with dozens of updates deployed daily. However, with the growth of our data platform team, the bottlenecks in our deployment process for data pipelines could no longer be ignored. Deploying new pipelines or updating existing ones required building, publishing, and deploying a new Airflow container image—a process that could take up to 20 minutes. To…
The rise of a new title in the data industry, Data Strategist, caught my attention recently. Initially, I was skeptical. "Isn’t this just a fancy term for a Data Manager?" I wondered. However, as I delved deeper, I realized my perspective was heavily influenced by my recent tenure at Doximity. At Doximity, the Data Engineering and Data Analytics Manager roles have always blended technical individual contributor work (often referred to as "IC Work") with responsibilities as people managers and functional leaders in the data organization and product. Prior to Doximity, I rarely had managers who…
On April 4th and 5th, 2024, Doximity sponsored Tropical.rb, also known as "The Latin America Rails Conference," in São Paulo, Brazil. This event gathered developers from across Latin America and beyond. It served as a dynamic platform for discussing Ruby on Rails, sharing knowledge, and networking among professionals in the field. The Doximity team at Tropical.rb Doximity has utilized Ruby on Rails since its founding, attributing significant success to the framework. The timing of the recent conference coincided with a resurgence in Rails' popularity, marked by new features and increased…
At Doximity, we go to great lengths to ensure the quality of our products aligns with the standards physicians require. Across various industries, Large Language Models (LLMs) have become the backbone of numerous applications, driving advancements in everything from natural language processing to automated content creation. As we continue to develop products that make use of these LLMs, the need for rigorous and comprehensive evaluation of their outputs has never been more critical. Strap in as we explore the process for evaluating our Doximity GPT product, Doximity’s HIPAA-compliant medical…
Deeplinking support in Android is relatively straightforward. You declare your deeplinks in the app's manifest, receive the incoming Intent passed in to your Activity and then navigate the user to the associated destination. This pipeline works just fine when you only need to support a handful of deeplinks. What happens though as the number of deeplinks grow? How do you deal with several dozen, or possibly even hundreds, of deeplinks? First Stab at Deeplinks When we first implemented deeplinking in our app, we only had to support 12 different deeplinks. We introduced a DeeplinkRouter class…
As Rails monoliths grow, coupling becomes increasingly difficult to manage. Developers often reach for microservices to help simplify things, but instead find higher complexity. The Modular Monolith approach is a proven, lightweight alternative that offers the benefits of enforced boundaries without being cumbersome. I spoke at the 2023 Rocky Mountain Ruby conference on how teams can use a phased approach to refactoring toward this style using the packwerk gem. At Doximity, we've used this gem and a phased approach to break some of our most critical rails applications into modules that are…
In the modern business landscape, the significance of data analysis cannot be overstated. It empowers organizations to uncover insights, make informed decisions, and gain a competitive edge by deciphering the hidden patterns within vast datasets. Data analysis is the cornerstone of strategic innovation and effective decision-making in today's dynamic markets. At Doximity, data is crucial to the success of business operations, playing a key role in every step of the product development cycle. From determining the potential of new features to testing and tracking their performance, data…
State management is a fundamental concept of front-end application design, and a critical aspect in building robust Vue applications. As Vue applications grow in complexity, managing state becomes an increasingly challenging task, especially when working with a large organization of engineers spread across various product teams. Fortunately, the Vue and Nuxt ecosystem provides a variety of state management solutions, each with its own trade-offs. In this blog post we will explore the Composable Provider pattern, which handles state management by combining the Vue Composition and…
In this case study, we will build a note-taking app that lets the user add, edit and delete notes. It uses Compose for both the view and presentation layers! Note: This is a follow up to Part 1: Simplifying State Management with Compose and assumes the reader is already familiar with Jetpack Compose. The Template I find it useful to start with the model that represents the state of the screen we’re building. It will have a list of notes, with each note containing properties for the text and checkbox: data class NotesUiModel(val notes: ListNote>) : UiModel { data class Note(val text: String,…
The recent release of Doximity’s refreshed physician scheduling tool Amion involved a significant overhaul of the user interface (UI) layer using Jetpack Compose. As part of the development process, we decided to experiment with shifting from ViewModels to utilizing the Compose Runtime for managing screen state. This article explores the motivations behind this approach and demonstrates an overall improvement to the view layer and presentation logic using the patterns developed in Amion 6.0.0. Note: This is part one of a two-part article. In part two, we will build a note-taking app using the…
Releasing mobile apps to the store is inherently slower than web updates due to manual process overhead, such as versioning, packaging, and submitting to the App Store for review. While web developers have long enjoyed full buzzword-compliant Continuous Deployment, mobile teams generally use a defined release cadence, typically 2-4 weeks. The DORA metric, which stands for DevOps Research and Assessment, evaluates performance using four key metrics: Deployment Frequency (DF), Lead Time for Changes (LT), Mean Time To Recover (MTTR), and Change Failure Rate (CFR). These metrics are commonly used…
Read at the source
Your visit, your choice.
Optional Google Analytics helps us understand visits. Microsoft Clarity records masked interactions to improve the site. Optional tools stay off unless you choose them. Privacy details.