Settings
  • Tably
    • Simple and powerful data analytics for everyone. Import, explore, share and collaborate with ease.
    • Quick templates
      • Open a CSV. Edit, explore, and chart, from 10 rows to 10 million.
      • Marketing
      • Product metrics
      • Social statistics
      • Consumer research
      • Visual analysis
      • Google Ads Dashboard
      • PostHog
      • Easy imports
        • Google Analytics
        • Google Ads
        • Google Sheets
        • Amazon Seller Partner
        • Amazon Ads
        • Shopify
        • TikTok Marketing
        • Instagram
        • Facebook Pages
        • Facebook Marketing
        • LinkedIn Ads
        • Linkedin Pages
        • Paypal Transaction
        • Stripe
        • Square
        • Mailchimp
        • Intercom
        • ClickUp
        • HubSpot
        • Salesforce
        • QuickBooks
        • Sentry
        • PostgreSQL
        • Snowflake
        • MySQL
        • DBT
        • 7shifts
        • ActiveCampaign
        • Aha
        • Airbyte
        • Aircall
        • Airtable
        • Algolia
        • Amazon SQS
        • Amplitude
        • Apify Dataset
        • Appcues
        • Appfigures
        • Appfollow
        • Apple Search Ads
        • Asana
        • Ashby
        • Auth0
        • Aws Cloudtrail
        • Azure Table Storage
        • BambooHR
        • Basecamp
        • Beamer
        • BigQuery
        • Bing Ads
        • Bitly
        • Braintree
        • Braze
        • Breezy HR
        • Brevo
        • Buildkite
        • Buzzsprout
        • Calendly
        • CallRail
        • Campaign Monitor
        • Canny
        • Cart.com
        • Chargebee
        • Chartmogul
        • ClickHouse
        • Clockify
        • Close.com
        • Coda
        • Coin API
        • CoinMarketCap
        • ConfigCat
        • Confluence
        • Convex
        • Datascope
        • Delighted
        • Dixa
        • Dockerhub
        • Dremio
        • DynamoDB
        • EmailOctopus
        • Exchange Rates Api
        • Firebolt
        • Flexport
        • Freshcaller
        • Freshdesk
        • Freshsales
        • Gainsight PX
        • Lago
        • GitHub
        • Gitlab
        • Glassfrog
        • GNews.io
        • Google Directory
        • Google PageSpeed Insights
        • Google Search Console
        • Google Webfonts
        • Greenhouse
        • Gridly
        • Harvest
        • Hibob
        • Hubplanner
        • Insightly
        • Instatus
        • IP2Whois
        • Iterable
        • Jira
        • K6 Cloud
        • Klarna
        • Klaviyo
        • KYVE
        • LaunchDarkly
        • Lemlist
        • Lever Hiring
        • Link to File
        • Linnworks
        • Lokalise
        • Mailgun
        • Mailjet SMS
        • Marketo
        • Metabase
        • Microsoft Teams
        • Mixpanel
        • Monday
        • MongoDB
        • Microsoft SQL Server
        • My Hours
        • Netsuite
        • Notion
        • The New York Times
        • Okta
        • Omnisend
        • OneSignal
        • Oracle Database
        • Orb
        • Outbrain Amplify
        • Outreach
        • Paystack
        • Pendo
        • PersistIQ
        • Pexels
        • Pinterest
        • Pipedrive
        • Pocket
        • Polygon.io
        • Postmark
        • PrestaShop
        • Python Package Index
        • Qualaroo
        • Railz
        • Recharge
        • Recreation
        • Recruitee
        • Recurly
        • Redshift
        • Retently
        • RSS
        • Salesloft
        • SAP Fieldglass
        • Secoda
        • Sendgrid
        • Brevo
        • Senseforce
        • Shortio
        • Slack
        • Smaily
        • Smartsheets
        • Snapchat Marketing
        • SpaceX
        • Strava
        • SurveyMonkey
        • Tempo
        • The Guardian
        • Todoist
        • Trello
        • TrustPilot
        • TVMaze Schedule
        • Twilio
        • Twilio Taskrouter
        • Twitter
        • Typeform
        • Vantage
        • Webflow
        • Whisky Hunter
        • Wikipedia Pageviews
        • WooCommerce
        • Xero
        • Yandex Metrica
        • Yotpo
        • YouTube Analytics
        • Zendesk Chat
        • Zendesk Sunshine
        • Zendesk Support
        • Zendesk Talk
        • Zenloop
        • ZohoCRM
        • Zoom
    • Company
      • About
      • Whatโ€™s new?
      • Blog
        • Connecting people with their data. Empathy-driven design at Tably.
        • 10 years of betting on Rust and what Iโ€™m looking forward to next.
        • A Trillion-Dollar Problem
      • Terms of Service
      • Privacy policy
    • Pricing
    • Follow us
    • Community

Today

    Tably
    ๐Ÿš€
    Simple and powerful data analytics for everyone. Import, explore, share and collaborate with ease.
    โšก
    Quick templates
    ๐Ÿ›Ÿ
    Company
    ๐Ÿ’ธ
    Pricing
    ๐Ÿ“„
    Open a CSV. Edit, explore, and chart, from 10 rows to 10 million.
    ๐Ÿ“Š
    Marketing
    ๐ŸŽฎ
    Product metrics
    ๐ŸŒŽ
    Social statistics
    ๐Ÿ›’
    Consumer research
    ๐Ÿ–ผ๏ธ
    Visual analysis
    Google Ads Dashboard
    PostHog
    ๐Ÿ†
    Easy imports
    ๐Ÿ›ฐ๏ธ
    About
    โญ
    Whatโ€™s new?
    ๐Ÿ“ฐ
    Blog
    ๐Ÿ“œ
    Terms of Service
    ๐Ÿ”’
    Privacy policy
    Google Analytics
    Google Ads
    Google Sheets
    Amazon Seller Partner
    Amazon Ads
    Shopify
    TikTok Marketing
    Instagram
    Facebook Pages
    Facebook Marketing
    LinkedIn Ads
    Linkedin Pages
    Paypal Transaction
    Stripe
    Square
    Mailchimp
    Intercom
    ClickUp
    HubSpot
    Salesforce
    QuickBooks
    Sentry
    PostgreSQL
    Snowflake
    MySQL
    DBT
    7shifts
    ActiveCampaign
    Aha
    Airbyte
    Aircall
    Airtable
    Algolia
    Amazon SQS
    Amplitude
    Apify Dataset
    Appcues
    Appfigures
    Appfollow
    Apple Search Ads
    Asana
    Ashby
    Auth0
    Aws Cloudtrail
    Azure Table Storage
    BambooHR
    Basecamp
    Beamer
    BigQuery
    Bing Ads
    Bitly
    Braintree
    Braze
    Breezy HR
    Brevo
    Buildkite
    Buzzsprout
    Calendly
    CallRail
    Campaign Monitor
    Canny
    Cart.com
    Chargebee
    Chartmogul
    ClickHouse
    Clockify
    Close.com
    Coda
    Coin API
    CoinMarketCap
    ConfigCat
    Confluence
    Convex
    Datascope
    Delighted
    Dixa
    Dockerhub
    Dremio
    DynamoDB
    EmailOctopus
    Exchange Rates Api
    Firebolt
    Flexport
    Freshcaller
    Freshdesk
    Freshsales
    Gainsight PX
    Lago
    GitHub
    Gitlab
    Glassfrog
    GNews.io
    Google Directory
    Google PageSpeed Insights
    Google Search Console
    Google Webfonts
    Greenhouse
    Gridly
    Harvest
    Hibob
    Hubplanner
    Insightly
    Instatus
    IP2Whois
    Iterable
    Jira
    K6 Cloud
    Klarna
    Klaviyo
    KYVE
    LaunchDarkly
    Lemlist
    Lever Hiring
    Link to File
    Linnworks
    Lokalise
    Mailgun
    Mailjet SMS
    Marketo
    Metabase
    Microsoft Teams
    Mixpanel
    Monday
    MongoDB
    Microsoft SQL Server
    My Hours
    Netsuite
    Notion
    The New York Times
    Okta
    Omnisend
    OneSignal
    Oracle Database
    Orb
    Outbrain Amplify
    Outreach
    Paystack
    Pendo
    PersistIQ
    Pexels
    Pinterest
    Pipedrive
    Pocket
    Polygon.io
    Postmark
    PrestaShop
    Python Package Index
    Qualaroo
    Railz
    Recharge
    Recreation
    Recruitee
    Recurly
    Redshift
    Retently
    RSS
    Salesloft
    SAP Fieldglass
    Secoda
    Sendgrid
    Brevo
    Senseforce
    Shortio
    Slack
    Smaily
    Smartsheets
    Snapchat Marketing
    SpaceX
    Strava
    SurveyMonkey
    Tempo
    The Guardian
    Todoist
    Trello
    TrustPilot
    TVMaze Schedule
    Twilio
    Twilio Taskrouter
    Twitter
    Typeform
    Vantage
    Webflow
    Whisky Hunter
    Wikipedia Pageviews
    WooCommerce
    Xero
    Yandex Metrica
    Yotpo
    YouTube Analytics
    Zendesk Chat
    Zendesk Sunshine
    Zendesk Support
    Zendesk Talk
    Zenloop
    ZohoCRM
    Zoom
    ๐ŸŒŽ
    Connecting people with their data. Empathy-driven design at Tably.
    ๐Ÿฆ€
    10 years of betting on Rust and what Iโ€™m looking forward to next.
    ๐Ÿ“ˆ
    A Trillion-Dollar Problem

10 years of betting on Rust and what Iโ€™m looking forward to next.

By Alec Mocatta, Founder 1 Jun, 2025


I wrote my first line of Rust in June 2015, a month after the buzz of Rust 1.0 landing. Coming from C, Python, and JavaScript, I never looked back. Two Rust-based startups and 500k lines of Rust later, here are some reflections on the milestone.

The early days were painful

Version compatibility was poorโ€”both between crates and with the compiler itself. A bug-fix update could force a compiler bump, which in turn dragged in unstable crates like syntex (once a key serde dependency) and their dependents. In practice we โ€œupdated the worldโ€ and temporally pinned when a critical bug fix or feature demanded itโ€”early on this was as often as every 6-week compiler release cycle. An awful lot of time was wasted binary-searching for compatible version combinations.

โ€œFighting the borrow checkerโ€ was real for me. Traits came naturally given background in C++, Java and Objective-C, but lifetimes and the idea of โ€œproofsโ€ that (*mostly) donโ€™t affect codegen took a while to grok. Patient friends and colleagues made this easier!

After a couple years of our codebase and team growing, compile times became painful. Large types were a recurring issue (and still are, occasionally), requiring diagnosis and mitigation. Investments brought it down for us, but iteration cycles still took a hit and rapid prototyping generally required effort to set up.

The people were and are exceptional

The Rust ecosystem has an impressive amount of programming โ€œtasteโ€, manifesting in dependencies with relatively simple builds, elegant implementations, and fast and robust performance. Reaching for TypeScript or Python is a relative exercise in frustration. Thereโ€™s a reason Rust has taken the โ€œmost loved/admired languageโ€ title for nine years now!

โ€œWhat went rightโ€ is an essay in itself, but the evolving cadre of dedicated, opinionated and earnest volunteers, with strong mores around saying โ€œnoโ€ and โ€œnot yetโ€, are I think the crux of it.

I reaped the benefits as an employer. Weโ€™ve been fortunate to be one of few Rust opportunities in London, with a pipeline of talented engineers keen to work in their favourite language. That your average Rust programmer is better than your average <most other languages> programmer has been a bonus.

Rust has become a safe bet (in some domains)

The early days necessitated a lot of yak shaving. Omissions in std, for example, led to our evolving a library of workarounds, hacks and extensions: code that simplified or optimised our application code but wasnโ€™t ready or wasnโ€™t justifiable to merge upstream. Over time the rate of additions to it has slowed, and we regularly find ourselves now removing from it. Our custom implementations begone! Nowadays being able to rely upon stdโ€™s primitives having even relatively uncommon or abstract implementations, and them be well-optimised, is a joy.

This reliability now extends to much of the Rust experience. Building and upgrading is wildly more predictable, with fewer non-Rust dependencies, ~no surprise compiletime/codegen/inlining blowups, less ecosystem reliance on nightly features and greater respecting of semver. Inference improvements have made the borrow checker friendlier to newcomers. And far fewer ICEs on nightly! We used to see new ICEs or link errors almost weekly, now itโ€™s quarterly at most.

The crate ecosystem is more predictable too: newer crates like jiff, polars and tauri build on the hard-won lessons of earlier projects, while stalwarts like tokio, hyper and regex have earned robustness through years of heavy production use.

Ten years ago choosing Rust for production opted you into reinventing wheels and working around known and unknown issues. While still the case for some domainsโ€”namely Rust in the browser for usโ€”for general systems and backend engineering that is a thing of the past. Rust empowers us to focus on business logic while producing remarkably fast and robust applications.

Rust today feels like what programming should be

More than a safe bet, Rust has a degree of programmer empathy that is unprecedented in large software projects: simple and robust builds, the best error messages and linting around, great docs and IDE integration, and strong CI and regression testing. Rust feels like a passion project, a labour of love by and for programmers.

10 years ago could we have predicted this? Well, I think some did. Pained by the status quo, some saw the potential of a language, an ecosystem, designed well by people like them. They volunteered their time and made Rust what it is. As Graydon Hoare, one of Rustโ€™s original authors, puts it:

Rust today is the result of significant investments made by forward-looking institutions and the efforts of thousands of individuals who shared a belief in the long-term payoff of what they were building.

I bet my time and (my investorsโ€™) money on Rust 10 years ago because I believed in this payoff. The enthusiasm was infections, the potential palpable, and smart minds were converging. Iโ€™m so glad that has only grown, and so grateful to everyone whoโ€™s contributed to it.

What Iโ€™m looking forward to over the next 10 years

Simpler and faster builds

With growing engineering and testing bandwidth we can continue to replace battle-tested but complex or slow dependencies with simpler and faster ones. Iโ€™ve directly or indirectly benefitted from this with linking, locks, backtraces, platform-optimised routines, TLS, HTTP, git, compression, building and switching toolchains, and build automation. A few Iโ€™m particularly looking forward to gaining more attention are a pure-Rust and less special std, reduced reliance on system linkers and libs, pure-Rust crypto, a durable BTreeMap, and a Rust game engine. The latter not for me to use but because game devs bring some of the most aggressive optimisation Iโ€™ve seen and Iโ€™d love to benefit from it.


Significant expertise and effort is going into performance work. In the last few months Tably saw a 60% compile time improvement across frontend and backend. Many of the biggest wins have come from meta changes that arenโ€™t visible on this chart, including ThinLTO and backend parallelism, incremental, metadata pipelining, front-end parallelism. Meta changes that might bear further fruit are: Rust-oriented codegen, incremental linkers, dead-code elimination, a new solver, and cargo test caching results.

Improved portability and less #[cfg()]

Testing the power set of valid #[cfg()] options, targets and features on CI is generally prohibitive. This creates untested code paths and potential compile failures, alongside annoyances like fragmented and incomplete documentation, impaired IDE functionality and unused_imports warnings.

A lint was proposed to mitigate this. A mooted better approach is moving #[cfg()] into the trait system (cc) with bounds like where Platform: Unix and where Platform: Avx2. With this the compiler naturally guarantees compilation under all supported options, targets and features. Specializing items with OS-specific or architecture-specific implementations can be done via, appropriately, specialization. Metadata can be shared between dev/test/release, different feature combination and different platform builds, resulting in less recompilation, faster CI, and bringing a crates.io MIR cache closer to reality.

Everything being const

Constant evaluation reduces dependence on macros and build scripts, and brings forward run-time work and panics to compile-time. Currently we only scratch the surface of this as only a small subset of Rust code is supported (no traits, no allocation), and that which is supported runs too slowly for nontrivial use cases.

Assuming portability all code can be evaluated during compilation (cc). Unportable code like FFI or assembly without a generic fallback is getting less common. Various effects-inspired attempts to enable ubiquitous const have been made and reverted and attempted again. I hope we dodge this extra language complexity with the simple assumption that โ€œeverything can be executed in a const contextโ€. There are tricky issues to overcome but the language simplicity will be worth it.

Simpler concurrency

async has a relatively high complexity cost for us due to the 'static bound (cc), cancellation-safety, and restrictions relating to traits and dyn. These currently seem insoluble. Bifurcation between sync and async primitives and ecosystem idiosyncrasies further increase the async tax. Effects-inspired solutions seem unpromising.

Pre-1.0 Rust had a solution: libgreen. It achieved concurrency in user-space without this bifurcation, but at significant performance, portability and maintenance cost and so was removed. With increased engineering bandwidth this may be worth revisiting. Again the language simplicity would be worth it. (One day Iโ€™ll create a PoC of zero-cost wrapping of std::{fs, net} plus fiber::{spawn, select} using generator!)

Excelling in more domains

Rust in the browser feels under-explored: we bump into issues that suggest there arenโ€™t many others using it seriously. Table stakes like avoiding UB and getting stack traces cross-browser took our time and effort. leptosโ€”the web framework behind this siteโ€”has come a long way (much like our previous choice sycamore), yet rough edges remain.

Some domains like rapid prototyping and business logic may remain outside of Rustโ€™s reach due to deliberate design decisions that trade off iteration speed. For most domains though I think itโ€™s a matter of time. Adoption hurdles remain for GUIs, machine learning, and game development due to entrenched ecosystems, high switching costs, cultural inertia, and established tooling. But those barriers arenโ€™t permanent. Rust continues to mature and steadily break into these domains, thanks to relentless community efforts and innovation.

Conclusion

Looking forward the trajectory is clear and exciting. The positive feedback loop of adoption boosting engineering and testing bandwidth, which then fuels further adoption, is accelerating. The upcoming decade promises further refinement, faster compile times, broader domain adoption, and an increasingly seamless developer experience. At Tably, we remain committed to pushing the boundaries of whatโ€™s possible with Rust, excited to witnessโ€”and contribute toโ€”the languageโ€™s next chapter. Hereโ€™s to another 10 years of betting on Rust!


10 years of betting on Rust and what Iโ€™m looking forward to next.

By Alec Mocatta, Founder
1 Jun, 2025


I wrote my first line of Rust in June 2015, a month after the buzz of Rust 1.0 landing. Coming from C, Python, and JavaScript, I never looked back. Two Rust-based startups and 500k lines of Rust later, here are some reflections on the milestone.

The early days were painful

Version compatibility was poorโ€”both between crates and with the compiler itself. A bug-fix update could force a compiler bump, which in turn dragged in unstable crates like syntex (once a key serde dependency) and their dependents. In practice we โ€œupdated the worldโ€ and temporally pinned when a critical bug fix or feature demanded itโ€”early on this was as often as every 6-week compiler release cycle. An awful lot of time was wasted binary-searching for compatible version combinations.

โ€œFighting the borrow checkerโ€ was real for me. Traits came naturally given background in C++, Java and Objective-C, but lifetimes and the idea of โ€œproofsโ€ that (*mostly) donโ€™t affect codegen took a while to grok. Patient friends and colleagues made this easier!

After a couple years of our codebase and team growing, compile times became painful. Large types were a recurring issue (and still are, occasionally), requiring diagnosis and mitigation. Investments brought it down for us, but iteration cycles still took a hit and rapid prototyping generally required effort to set up.

The people were and are exceptional

The Rust ecosystem has an impressive amount of programming โ€œtasteโ€, manifesting in dependencies with relatively simple builds, elegant implementations, and fast and robust performance. Reaching for TypeScript or Python is a relative exercise in frustration. Thereโ€™s a reason Rust has taken the โ€œmost loved/admired languageโ€ title for nine years now!

โ€œWhat went rightโ€ is an essay in itself, but the evolving cadre of dedicated, opinionated and earnest volunteers, with strong mores around saying โ€œnoโ€ and โ€œnot yetโ€, are I think the crux of it.

I reaped the benefits as an employer. Weโ€™ve been fortunate to be one of few Rust opportunities in London, with a pipeline of talented engineers keen to work in their favourite language. That your average Rust programmer is better than your average <most other languages> programmer has been a bonus.

Rust has become a safe bet (in some domains)

The early days necessitated a lot of yak shaving. Omissions in std, for example, led to our evolving a library of workarounds, hacks and extensions: code that simplified or optimised our application code but wasnโ€™t ready or wasnโ€™t justifiable to merge upstream. Over time the rate of additions to it has slowed, and we regularly find ourselves now removing from it. Our custom implementations begone! Nowadays being able to rely upon stdโ€™s primitives having even relatively uncommon or abstract implementations, and them be well-optimised, is a joy.

This reliability now extends to much of the Rust experience. Building and upgrading is wildly more predictable, with fewer non-Rust dependencies, ~no surprise compiletime/codegen/inlining blowups, less ecosystem reliance on nightly features and greater respecting of semver. Inference improvements have made the borrow checker friendlier to newcomers. And far fewer ICEs on nightly! We used to see new ICEs or link errors almost weekly, now itโ€™s quarterly at most.

The crate ecosystem is more predictable too: newer crates like jiff, polars and tauri build on the hard-won lessons of earlier projects, while stalwarts like tokio, hyper and regex have earned robustness through years of heavy production use.

Ten years ago choosing Rust for production opted you into reinventing wheels and working around known and unknown issues. While still the case for some domainsโ€”namely Rust in the browser for usโ€”for general systems and backend engineering that is a thing of the past. Rust empowers us to focus on business logic while producing remarkably fast and robust applications.

Rust today feels like what programming should be

More than a safe bet, Rust has a degree of programmer empathy that is unprecedented in large software projects: simple and robust builds, the best error messages and linting around, great docs and IDE integration, and strong CI and regression testing. Rust feels like a passion project, a labour of love by and for programmers.

10 years ago could we have predicted this? Well, I think some did. Pained by the status quo, some saw the potential of a language, an ecosystem, designed well by people like them. They volunteered their time and made Rust what it is. As Graydon Hoare, one of Rustโ€™s original authors, puts it:

Rust today is the result of significant investments made by forward-looking institutions and the efforts of thousands of individuals who shared a belief in the long-term payoff of what they were building.

I bet my time and (my investorsโ€™) money on Rust 10 years ago because I believed in this payoff. The enthusiasm was infections, the potential palpable, and smart minds were converging. Iโ€™m so glad that has only grown, and so grateful to everyone whoโ€™s contributed to it.

What Iโ€™m looking forward to over the next 10 years

Simpler and faster builds

With growing engineering and testing bandwidth we can continue to replace battle-tested but complex or slow dependencies with simpler and faster ones. Iโ€™ve directly or indirectly benefitted from this with linking, locks, backtraces, platform-optimised routines, TLS, HTTP, git, compression, building and switching toolchains, and build automation. A few Iโ€™m particularly looking forward to gaining more attention are a pure-Rust and less special std, reduced reliance on system linkers and libs, pure-Rust crypto, a durable BTreeMap, and a Rust game engine. The latter not for me to use but because game devs bring some of the most aggressive optimisation Iโ€™ve seen and Iโ€™d love to benefit from it.


Significant expertise and effort is going into performance work. In the last few months Tably saw a 60% compile time improvement across frontend and backend. Many of the biggest wins have come from meta changes that arenโ€™t visible on this chart, including ThinLTO and backend parallelism, incremental, metadata pipelining, front-end parallelism. Meta changes that might bear further fruit are: Rust-oriented codegen, incremental linkers, dead-code elimination, a new solver, and cargo test caching results.

Improved portability and less #[cfg()]

Testing the power set of valid #[cfg()] options, targets and features on CI is generally prohibitive. This creates untested code paths and potential compile failures, alongside annoyances like fragmented and incomplete documentation, impaired IDE functionality and unused_imports warnings.

A lint was proposed to mitigate this. A mooted better approach is moving #[cfg()] into the trait system (cc) with bounds like where Platform: Unix and where Platform: Avx2. With this the compiler naturally guarantees compilation under all supported options, targets and features. Specializing items with OS-specific or architecture-specific implementations can be done via, appropriately, specialization. Metadata can be shared between dev/test/release, different feature combination and different platform builds, resulting in less recompilation, faster CI, and bringing a crates.io MIR cache closer to reality.

Everything being const

Constant evaluation reduces dependence on macros and build scripts, and brings forward run-time work and panics to compile-time. Currently we only scratch the surface of this as only a small subset of Rust code is supported (no traits, no allocation), and that which is supported runs too slowly for nontrivial use cases.

Assuming portability all code can be evaluated during compilation (cc). Unportable code like FFI or assembly without a generic fallback is getting less common. Various effects-inspired attempts to enable ubiquitous const have been made and reverted and attempted again. I hope we dodge this extra language complexity with the simple assumption that โ€œeverything can be executed in a const contextโ€. There are tricky issues to overcome but the language simplicity will be worth it.

Simpler concurrency

async has a relatively high complexity cost for us due to the 'static bound (cc), cancellation-safety, and restrictions relating to traits and dyn. These currently seem insoluble. Bifurcation between sync and async primitives and ecosystem idiosyncrasies further increase the async tax. Effects-inspired solutions seem unpromising.

Pre-1.0 Rust had a solution: libgreen. It achieved concurrency in user-space without this bifurcation, but at significant performance, portability and maintenance cost and so was removed. With increased engineering bandwidth this may be worth revisiting. Again the language simplicity would be worth it. (One day Iโ€™ll create a PoC of zero-cost wrapping of std::{fs, net} plus fiber::{spawn, select} using generator!)

Excelling in more domains

Rust in the browser feels under-explored: we bump into issues that suggest there arenโ€™t many others using it seriously. Table stakes like avoiding UB and getting stack traces cross-browser took our time and effort. leptosโ€”the web framework behind this siteโ€”has come a long way (much like our previous choice sycamore), yet rough edges remain.

Some domains like rapid prototyping and business logic may remain outside of Rustโ€™s reach due to deliberate design decisions that trade off iteration speed. For most domains though I think itโ€™s a matter of time. Adoption hurdles remain for GUIs, machine learning, and game development due to entrenched ecosystems, high switching costs, cultural inertia, and established tooling. But those barriers arenโ€™t permanent. Rust continues to mature and steadily break into these domains, thanks to relentless community efforts and innovation.

Conclusion

Looking forward the trajectory is clear and exciting. The positive feedback loop of adoption boosting engineering and testing bandwidth, which then fuels further adoption, is accelerating. The upcoming decade promises further refinement, faster compile times, broader domain adoption, and an increasingly seamless developer experience. At Tably, we remain committed to pushing the boundaries of whatโ€™s possible with Rust, excited to witnessโ€”and contribute toโ€”the languageโ€™s next chapter. Hereโ€™s to another 10 years of betting on Rust!


10 years of betting on Rust and what Iโ€™m looking forward to next.

By Alec Mocatta, Founder 1 Jun, 2025

I wrote my first line of Rust in June 2015, a month after the buzz of Rust 1.0 landing. Coming from C, Python, and JavaScript, I never looked back. Two Rust-based startups and 500k lines of Rust later, here are some reflections on the milestone.

The early days were painful

Version compatibility was poorโ€”both between crates and with the compiler itself. A bug-fix update could force a compiler bump, which in turn dragged in unstable crates like syntex (once a key serde dependency) and their dependents. In practice we โ€œupdated the worldโ€ and temporally pinned when a critical bug fix or feature demanded itโ€”early on this was as often as every 6-week compiler release cycle. An awful lot of time was wasted binary-searching for compatible version combinations.

โ€œFighting the borrow checkerโ€ was real for me. Traits came naturally given background in C++, Java and Objective-C, but lifetimes and the idea of โ€œproofsโ€ that (*mostly) donโ€™t affect codegen took a while to grok. Patient friends and colleagues made this easier!

After a couple years of our codebase and team growing, compile times became painful. Large types were a recurring issue (and still are, occasionally), requiring diagnosis and mitigation. Investments brought it down for us, but iteration cycles still took a hit and rapid prototyping generally required effort to set up.

The people were and are exceptional

The Rust ecosystem has an impressive amount of programming โ€œtasteโ€, manifesting in dependencies with relatively simple builds, elegant implementations, and fast and robust performance. Reaching for TypeScript or Python is a relative exercise in frustration. Thereโ€™s a reason Rust has taken the โ€œmost loved/admired languageโ€ title for nine years now!

โ€œWhat went rightโ€ is an essay in itself, but the evolving cadre of dedicated, opinionated and earnest volunteers, with strong mores around saying โ€œnoโ€ and โ€œnot yetโ€, are I think the crux of it.

I reaped the benefits as an employer. Weโ€™ve been fortunate to be one of few Rust opportunities in London, with a pipeline of talented engineers keen to work in their favourite language. That your average Rust programmer is better than your average <most other languages> programmer has been a bonus.

Rust has become a safe bet (in some domains)

The early days necessitated a lot of yak shaving. Omissions in std, for example, led to our evolving a library of workarounds, hacks and extensions: code that simplified or optimised our application code but wasnโ€™t ready or wasnโ€™t justifiable to merge upstream. Over time the rate of additions to it has slowed, and we regularly find ourselves now removing from it. Our custom implementations begone! Nowadays being able to rely upon stdโ€™s primitives having even relatively uncommon or abstract implementations, and them be well-optimised, is a joy.

This reliability now extends to much of the Rust experience. Building and upgrading is wildly more predictable, with fewer non-Rust dependencies, ~no surprise compiletime/codegen/inlining blowups, less ecosystem reliance on nightly features and greater respecting of semver. Inference improvements have made the borrow checker friendlier to newcomers. And far fewer ICEs on nightly! We used to see new ICEs or link errors almost weekly, now itโ€™s quarterly at most.

The crate ecosystem is more predictable too: newer crates like jiff, polars and tauri build on the hard-won lessons of earlier projects, while stalwarts like tokio, hyper and regex have earned robustness through years of heavy production use.

Ten years ago choosing Rust for production opted you into reinventing wheels and working around known and unknown issues. While still the case for some domainsโ€”namely Rust in the browser for usโ€”for general systems and backend engineering that is a thing of the past. Rust empowers us to focus on business logic while producing remarkably fast and robust applications.

Rust today feels like what programming should be

More than a safe bet, Rust has a degree of programmer empathy that is unprecedented in large software projects: simple and robust builds, the best error messages and linting around, great docs and IDE integration, and strong CI and regression testing. Rust feels like a passion project, a labour of love by and for programmers.

10 years ago could we have predicted this? Well, I think some did. Pained by the status quo, some saw the potential of a language, an ecosystem, designed well by people like them. They volunteered their time and made Rust what it is. As Graydon Hoare, one of Rustโ€™s original authors, puts it:

Rust today is the result of significant investments made by forward-looking institutions and the efforts of thousands of individuals who shared a belief in the long-term payoff of what they were building.

I bet my time and (my investorsโ€™) money on Rust 10 years ago because I believed in this payoff. The enthusiasm was infections, the potential palpable, and smart minds were converging. Iโ€™m so glad that has only grown, and so grateful to everyone whoโ€™s contributed to it.

What Iโ€™m looking forward to over the next 10 years

Simpler and faster builds

With growing engineering and testing bandwidth we can continue to replace battle-tested but complex or slow dependencies with simpler and faster ones. Iโ€™ve directly or indirectly benefitted from this with linking, locks, backtraces, platform-optimised routines, TLS, HTTP, git, compression, building and switching toolchains, and build automation. A few Iโ€™m particularly looking forward to gaining more attention are a pure-Rust and less special std, reduced reliance on system linkers and libs, pure-Rust crypto, a durable BTreeMap, and a Rust game engine. The latter not for me to use but because game devs bring some of the most aggressive optimisation Iโ€™ve seen and Iโ€™d love to benefit from it.

Significant expertise and effort is going into performance work. In the last few months Tably saw a 60% compile time improvement across frontend and backend. Many of the biggest wins have come from meta changes that arenโ€™t visible on this chart, including ThinLTO and backend parallelism, incremental, metadata pipelining, front-end parallelism. Meta changes that might bear further fruit are: Rust-oriented codegen, incremental linkers, dead-code elimination, a new solver, and cargo test caching results.

Improved portability and less #[cfg()]

Testing the power set of valid #[cfg()] options, targets and features on CI is generally prohibitive. This creates untested code paths and potential compile failures, alongside annoyances like fragmented and incomplete documentation, impaired IDE functionality and unused_imports warnings.

A lint was proposed to mitigate this. A mooted better approach is moving #[cfg()] into the trait system (cc) with bounds like where Platform: Unix and where Platform: Avx2. With this the compiler naturally guarantees compilation under all supported options, targets and features. Specializing items with OS-specific or architecture-specific implementations can be done via, appropriately, specialization. Metadata can be shared between dev/test/release, different feature combination and different platform builds, resulting in less recompilation, faster CI, and bringing a crates.io MIR cache closer to reality.

Everything being const

Constant evaluation reduces dependence on macros and build scripts, and brings forward run-time work and panics to compile-time. Currently we only scratch the surface of this as only a small subset of Rust code is supported (no traits, no allocation), and that which is supported runs too slowly for nontrivial use cases.

Assuming portability all code can be evaluated during compilation (cc). Unportable code like FFI or assembly without a generic fallback is getting less common. Various effects-inspired attempts to enable ubiquitous const have been made and reverted and attempted again. I hope we dodge this extra language complexity with the simple assumption that โ€œeverything can be executed in a const contextโ€. There are tricky issues to overcome but the language simplicity will be worth it.

Simpler concurrency

async has a relatively high complexity cost for us due to the 'static bound (cc), cancellation-safety, and restrictions relating to traits and dyn. These currently seem insoluble. Bifurcation between sync and async primitives and ecosystem idiosyncrasies further increase the async tax. Effects-inspired solutions seem unpromising.

Pre-1.0 Rust had a solution: libgreen. It achieved concurrency in user-space without this bifurcation, but at significant performance, portability and maintenance cost and so was removed. With increased engineering bandwidth this may be worth revisiting. Again the language simplicity would be worth it. (One day Iโ€™ll create a PoC of zero-cost wrapping of std::{fs, net} plus fiber::{spawn, select} using generator!)

Excelling in more domains

Rust in the browser feels under-explored: we bump into issues that suggest there arenโ€™t many others using it seriously. Table stakes like avoiding UB and getting stack traces cross-browser took our time and effort. leptosโ€”the web framework behind this siteโ€”has come a long way (much like our previous choice sycamore), yet rough edges remain.

Some domains like rapid prototyping and business logic may remain outside of Rustโ€™s reach due to deliberate design decisions that trade off iteration speed. For most domains though I think itโ€™s a matter of time. Adoption hurdles remain for GUIs, machine learning, and game development due to entrenched ecosystems, high switching costs, cultural inertia, and established tooling. But those barriers arenโ€™t permanent. Rust continues to mature and steadily break into these domains, thanks to relentless community efforts and innovation.

Conclusion

Looking forward the trajectory is clear and exciting. The positive feedback loop of adoption boosting engineering and testing bandwidth, which then fuels further adoption, is accelerating. The upcoming decade promises further refinement, faster compile times, broader domain adoption, and an increasingly seamless developer experience. At Tably, we remain committed to pushing the boundaries of whatโ€™s possible with Rust, excited to witnessโ€”and contribute toโ€”the languageโ€™s next chapter. Hereโ€™s to another 10 years of betting on Rust!


Actions

Insert

Connect service

Connect database

Open a file

Open from cloud

No matches

Suggestions

Insert

Actions

Connect service

Connect database

Open a file

Open from cloud

No matches

Tably๐Ÿ›ŸCompany๐Ÿ“ฐBlog๐Ÿฆ€10 years of betting on Rust and what Iโ€™m looking forward to next.

Continue with

Loadingโ€ฆ
GoogleMicrosoft