Julia is awesome to use, absolutely. But as an application developer, Julia can be frustrating. I wanted to write a post to outline my view on this. I write this post in a subjective tone because I want to share how I feel, because I think that might be useful to the community. My hope is to make my voice heard to Julia’s decision-makers, and to hear from other developers.
In short, I find Julia an unstable and difficult platform to develop for. Precompilation is slow, developer tooling is lacking, and with every Julia release, I fear that my packages will stop working (they often do). The maintenance burden from compatibility work is taking a toll on me – to the point where I am demotivated from starting new Julia projects.
New releases are scary
Julia makes too many breaking changes. Some minor releases have cost me hundreds of painful hours of compatibility work. With every Julia release, I fear that my project might be over, and I wish that the release gets delayed as long as possible. That’s not how I want to feel about my favourite language.
Julia regularly makes big internal changes in minor releases that break (important) packages. There is testing infrastructure to prevent this (PkgEval), but my experience is that PkgEval is not always called when needed. This means that package breakages are missed. And it seems that once your package (or a dependency) breaks, all future PkgEval runs will skip your package.
It’s up to me, the package developer, to test my package with the Julia prereleases (alpha, beta). This feels unfair: I put my trust in an ecosystem – spending my time developing a (popular) package – but now I have to spend time debugging, reporting and working around Julia compatibility issues, with no migration guide. And the end result? If you’re unlucky (like me), a slightly worse experience for my users with higher startup times and a higher memory footprint.
Other languages
I regularly work in both Julia and (trigger warning) JavaScript. Working in JavaScript is more peaceful because of its amazing developer tooling, but stability stands out the most. I can write a large, complex codebase, and I know that it will keep working 10 years from now with little or no maintenance. Packages might change, but the language runtimes (browsers) are extremely stable – my code will keep doing the same thing. The web ecosystem makes exciting developments, but not at the cost of my current work. For this reason, we now usually write new PlutoJL features in JavaScript instead of Julia, to keep our project sustainable. When Julia code breaks, we replace it with JavaScript if possible.
I need more hope
When I struggle with the developer experience of Julia, I am sometimes left feeling like this was somehow my fault. I used the API wrong (but there was no clear documentation). I used internal API (because there was no public API). Precompilation has been improved (but my package starts slower). The change is “not a bug” (but it still broke my package). In these interactions, I feel left behind.
My packages break in the name of progress, but progress towards what? Julia shouldn’t be a platform for compiler experiments. I would be happy to accomodate internal changes if they improve the developer experience. We still need reliable and easy-to-use [Ctrl+C interrupt, static type checking, breakpoint debugging, profiling, friendly error messages, WebAssembly]. Because I think that Julia is great as it is. Let’s just make it easier and get people to use it! In my eyes, Julia’s main issue is lack of adoption – not lack of a better memory layout, lack of compiled use, etc. Stability and developer experience is key here.
That’s it! Does this resonate with you, or is your experience different? I’m curious to hear!
