The Hard Thing About Hard Things: Macros in Dart

A Strategic Pivot for Dart and Flutter

January 30, 2025
and 
January 30, 2025
updated on
January 30, 2025
By 
Guest Contributor

The Dart team recently announced the discontinuation of their work on macros. At Very Good Ventures, we see this decision as not only rational, but beneficial for the long-term success of both the Dart language and the Flutter ecosystem. 

A Strategic Shift, Not A Setback

When evaluating the decision to stop investing in macros, it’s essential to recognize the underlying reasoning. Google, and especially in the case of the Dart team, does not have unlimited resources. Yes, it is one of the most important companies in the world, but as any other team, they have to balance multiple (and sometimes conflicting) priorities: advancing the capabilities of the language, increasing performance, responding to the community’s feedback, fixing bugs, and so on. And, on top of that, they work in public: their roadmap (and therefore, their strategic bets) are available to everyone. 

As of today, we can say all their major bets were highly successful… but macros proved to be more challenging than initially expected. This level of public scrutiny is a very healthy exercise of prioritization with and in front of the community—but it can be used also for those that aren’t Flutter and Dart promoters to use this as a detractor of the framework, when the reality is that it powers more than 30% of new apps worldwide.

The Dart team, in their official announcement, outlined that macros had significant technical challenges, making them difficult to implement in a way that aligned with Dart’s design goals. Rather than persisting with a solution that introduced complexity and potential instability, the team chose to pivot towards other improvements and features that can bring more immediate benefits. Rather than lament this, we could praise the team for making the very difficult decisions, since they certainly are aware of the public relations ramifications.

Prioritization Enables Progress

Successful software development (and especially in the case of open source development) is about trade-offs, and the Dart team’s choice reflects a strategic prioritization of their time and energy. Instead of spreading themselves thin over a feature that has proven to be more expensive than the value it can provide, they can now focus on areas that provide greater value to developers. Better data serialization, stronger code generation mechanisms, enhanced developer tooling… the work on macros won’t be wasted, and some of those learnings will highly influence how developers use Dart in the years to come. These investments will ultimately benefit Flutter and Dart developers, ensuring an even more pleasant and stable framework.

Dart And Flutter Thrive On Simplicity And Performance

One of Flutter’s core strengths is its ability to deliver high-performance applications with a simple and expressive developer experience. The introduction of macros could have added another layer of complexity, making the language harder to reason about and maintain. By stepping away from macros, the Dart team is doubling down on what makes Flutter appealing: a fast, efficient, and easy-to-use development experience that can have an impact today and years to come.

The Hard Thing About Hard Things

I’m sure this decision was not easy to make. As a Google Developer Expert (GDE) myself, I can say that the Dart team has been in constant communication with their most active and influential contributors, taking their feedback very seriously, and guiding us along the way in this journey until they found it might be a dead end. Instead of isolating themselves from the community and its leaders, the Dart team has done an excellent job communicating and explaining their thinking process on this matter. The community has felt supported at all times, and their feedback has been taken very seriously. This case should be considered a gold standard when it comes to managing relations between an open source project and its community. 

As an engineering leader, I applaud their humility, transparency, and healthy ambition. We all knew that the work on macros was a big bet and a big effort—Dart’s simplicity comes with a series of design constraints that make certain features a gigantic challenge behind the scenes. Very few languages out there support JIT & AOT compilation, tree-shaking, null-safety, FFI… but Dart does. In order to support all these, tough decisions were already made (e.g. lack of support for reflection) that make other potential features, like macros, almost impossible to develop. All things considered, I’d rather work with a language like Dart today than with a language bloated with half-baked features that, over time, make the development experience worse just so they can claim shipping a new feature.

A lot of people dream of starting a new and successful open source project, but the brutal reality is that, when that happens, you are under constant scrutiny. That’s the hard thing about hard things

Dart & Flutter Will Fuel The Future Of UI Development

Far from being a sign of concern, the reprioritization away from macros is a move towards a more focused and efficient future for Dart and Flutter. By making thoughtful trade-offs, the Dart team is ensuring that developers have a more stable, performant, and maintainable ecosystem. Instead of lamenting this decision, we should embrace it as a positive step towards a better development experience.

Flutter is, in fact, evolving in a way that prioritizes long-term success over short-term complexity.

More Stories