Thanks for sharing, I wonder how do you keep the stylistic and mental alignment of the codebase - is this happens during the code review or there are specific instructions during at the plan/implement stages?
Just ask chat gpt about state of the art in context pruning and other methods to optimize the context being provided to a LLM, it's a good research helper. The right mental model is that it's basically like RAG in reverse, instead of trying to select and rank from a data set, you're trying to select and rank from context given a budget.
I think it all depends on your platform and use cases. In my experience AI tools work best with Python and JS/Typescript and some simple use cases (web apps, basic data science etc). Also, I've found they can be of great help with refactorings and cases when you need to do something similar to already existing code, but with a twist or change.
The approach described resonates well with my (limited) experience using tools like Cursor/Cline and Aider, thanks for writing this up.
It feels more like the waterfall-style method and it takes time to get used to it after years of test-driven/agile development.
The nice thing is that you can easily go both ways - e.g. do full "vibe coding" to build a throw-away prototype, then ask the AI for help creating documentation and end-to-end tests for it, then collaborate with it to redesign the architecture, create a new implementation plan, and start coding from scratch.
Learning about Rama (https://redplanetlabs.com/) which has been released recently. The tech is very cool and also it's Clojure, but still not sure what would be the best use case for it.
Last time I checked it is perfectly possible to use anything including TS via jsbundling-rails and esbuild, so honestly I don’t understand what is the problem here.
I’m also on a fence re Hotwire, but apparently it works for them in Basecamp and Hey, so that’s what they are investing into.
Anecdotally, recently in Ruby shops I see an increase in new projects using Hotwire as a push back against bloated and hard to maintain React front ends and people are delighted how everything is easier now. RoR codebases are not the only ones which did not age well, I’ve seen quite a few React/NextJs legacy projects I would prefer not to touch at all. So I don’t think technology is the main culprit here.
One thing which is quite hard to do in Datomic is simple pagination on a large sorted dataset, as one can easily do with LIMIT/OFFSET in MySQL for example. There are solutions for some of the cases, but general case is not solved, as far as I remember (it’s been a while I used it extensively)
It depends! If you want to lazily walk data, you can read directly from the index (keep in mind, the index = the data = lives in your app), or use the index-pull API which is a bit more convenient.
However, if you want to paginate data that you need to sort first, and the data isn't sorted the way you want in the index, you have to read all of the data first, and then sort it. But this is also what a database server would need to do :)
Yep, I am well aware of these specifics and workarounds, but in general case where is no general solution to the question asked here, for example [0].
And for big datasets with complex sorting it will take some effort to implement a seemingly simple feature.
Guess it is just one of the tradeoffs, as while some features Datomic has out of the box are hard to replicate in RDBMS-es, things like pagination which are often took for granted is a bit of work to do in Datomic. So it is something to keep in mind when considering the switch
Datomic's covering indexes are heavily based on their built-in ordering, and doesn't really have much flexibility in different ways to sort and walk data.
Personally, I'm a fan of hybrid database approaches. In the world of serverless, I really enjoy the combo of DynamoDB and Elasticsearch, for example, where Dynamo handles everything that's performance critical, and Elasticsearch handles everything where dynamic queries (and ordering, and aggregation, and ....) is required. I've never done this with Datomic, but I'd imagine mirroring the "current" value of entities without historical data is relatively easy to set up.