Next week, I am excited to join Reflection AI as a Member of Technical Staff to help build the frontier open intelligence ecosystem of the Western world.
Spending the last few years at Google (X β Labs β DeepMind) during the founding years of the AI revolution was an opportunity of a lifetime. Working on Gemini and Jules with some of the smartest and most ambitious (and fun!) people on Earth – even more so. I will miss them fondly. But as 2025 unfolded, I found myself reflecting on the state of the AI ecosystem in the U.S. and on my work’s impact on empowering software builders… something critical was missing. This post is my attempt to articulate what.
NOTE: This is also my first blog post in… 7 years, apparently? Most of the older ones were from grad school π
Hope that changes – I remember enjoying blogging and tweeting about my work, which got somewhat disrupted by the whole “highly-confidential-frontier-lab” thing.
Introduction
In early 2017, Sumit Gulwani, Rishabh Singh, and I wrote a survey on Program Synthesis. Its goal was to provide a comprehensive overview of the state of the field at the time and to serve as an introduction for newcomers. While complete at the time, the survey got surprisingly outdated in the mere two years. Nowadays, every time someone asks me for an introduction to program synthesis, I point them to this survey but also add 10-20 other links that have recently pushed state of the art. On one hand, this is great: program synthesis is expanding rapidly (ICLRβ18 alone had 14 papers on the subject!). On the other hand, Iβm getting tired of compiling and annotating these lists of recent links every time π Ergo, this post β a high-level overview of the recent ideas and representative papers in program synthesis as of mid-2018.
Formerly, when someone asked me “How to make my C# program faster?”, my go-to advice was:
- Improve your computational complexity.
- Switch to a native language.
Of these suggestions, step #1 should take care of performance in most situations, if done properly. However,
sometimes it is not enough. For example, you are writing a user-facing real-time performance-critical
application, such as the
C# compiler, and you need to look not only at the average performance, but at
the 99th percentile. This is where step #2 used to take over… but not anymore. Currently, my
go-to advice looks like this: