<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hacker News: vvern</title><link>https://news.ycombinator.com/user?id=vvern</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Fri, 10 Apr 2026 12:50:05 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=vvern" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by vvern in "Show HN: Skir – like Protocol Buffer but better"]]></title><description><![CDATA[
<p>Notably missing both Go and Rust</p>
]]></description><pubDate>Sun, 08 Mar 2026 18:35:06 +0000</pubDate><link>https://news.ycombinator.com/item?id=47299773</link><dc:creator>vvern</dc:creator><comments>https://news.ycombinator.com/item?id=47299773</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47299773</guid></item><item><title><![CDATA[New comment by vvern in "Frankensqlite a Rust reimplementation of SQLite with concurrent writers"]]></title><description><![CDATA[
<p>Why does clean room even matter given SQLite is in the public domain?</p>
]]></description><pubDate>Mon, 02 Mar 2026 05:32:54 +0000</pubDate><link>https://news.ycombinator.com/item?id=47214214</link><dc:creator>vvern</dc:creator><comments>https://news.ycombinator.com/item?id=47214214</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47214214</guid></item><item><title><![CDATA[New comment by vvern in "What is a database transaction?"]]></title><description><![CDATA[
<p>Still, I think it’s the right default to start with serializable. Then when you have performance issues you can think long and hard about whether relaxed isolation levels will work in a big free way. Better to start with a correct application.</p>
]]></description><pubDate>Sun, 22 Feb 2026 23:31:52 +0000</pubDate><link>https://news.ycombinator.com/item?id=47116015</link><dc:creator>vvern</dc:creator><comments>https://news.ycombinator.com/item?id=47116015</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47116015</guid></item><item><title><![CDATA[New comment by vvern in "Readings in Database Systems (5th Edition) (2015)"]]></title><description><![CDATA[
<p>About time for the 6th Edition, eh? What would folks include in it?<p>- Vector databases and hybrid search?<p>- Object storage for all the things? Lake houses. Parquet and beyond.<p>- Continuously materialized views? I'm not sure this one has made the splash but I think about Naiad (Materialize) and Noria (Readyset)<p>- NewSQL went mostly mainstream (Spanner wasn't included in the last one, but there's been more here with things like CockroachDB, TiDB, etc)</p>
]]></description><pubDate>Wed, 31 Dec 2025 17:23:46 +0000</pubDate><link>https://news.ycombinator.com/item?id=46446164</link><dc:creator>vvern</dc:creator><comments>https://news.ycombinator.com/item?id=46446164</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46446164</guid></item><item><title><![CDATA[New comment by vvern in "Gin is a bad software library"]]></title><description><![CDATA[
<p>This is nice double entendre because tonic is a pleasant gRPC server library in rust!<p><a href="https://github.com/hyperium/tonic" rel="nofollow">https://github.com/hyperium/tonic</a></p>
]]></description><pubDate>Wed, 10 Dec 2025 03:42:05 +0000</pubDate><link>https://news.ycombinator.com/item?id=46213792</link><dc:creator>vvern</dc:creator><comments>https://news.ycombinator.com/item?id=46213792</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46213792</guid></item><item><title><![CDATA[New comment by vvern in "Using the expand and contract pattern for schema changes"]]></title><description><![CDATA[
<p>It should be this way. Clients should have some protocol to communicate the schema they expect to the database probably with some versioning scheme. The database should be able to serve multiple mutually compatible views over the schema (stay robust to column renames for example). The database should manage and prevent the destruction of in use views of that schema. After an old view has been made incompatible, old clients needing that view should be locked out.</p>
]]></description><pubDate>Mon, 10 Nov 2025 16:01:51 +0000</pubDate><link>https://news.ycombinator.com/item?id=45877203</link><dc:creator>vvern</dc:creator><comments>https://news.ycombinator.com/item?id=45877203</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45877203</guid></item><item><title><![CDATA[New comment by vvern in "TigerBeetle is a most interesting database"]]></title><description><![CDATA[
<p>You’re right that it would run on a block chain, but that fact would primarily exist to power some marketing. Everybody would end up interacting with it through a single centralized web site and API because it’s the only usable way to get it to work.</p>
]]></description><pubDate>Wed, 01 Oct 2025 14:06:08 +0000</pubDate><link>https://news.ycombinator.com/item?id=45437897</link><dc:creator>vvern</dc:creator><comments>https://news.ycombinator.com/item?id=45437897</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45437897</guid></item><item><title><![CDATA[New comment by vvern in "Giving Benchmarks a Boat"]]></title><description><![CDATA[
<p>Thank you for writing this. This comes up constantly, and it'll be great to have another reference to cite.<p>Another interesting thing about TPC-C is how the cross-warehouse contention was designed. About 10% of new order transactions need to do a cross-warehouse transaction. If you can keep up with the workload, then the rate of contention is relatively low; most of the workload isn't pushing on concurrency control. If, however, you fall behind, and transactions start to take too long, then the contention will pile up.<p>When you run without the keying time, it turns out that concurrency control begins to dominate. For distributed databases, concurrency control and deadlock detection is fundamentally more expensive than it can be for single-node databases -- so it makes sense that a classically single-node database would absolutely trounce distributed databases. I like to think of tpcc "nowait" as really a benchmark of concurrency control because, due (I believe) to Amdahl's law the majority of its execution time ends up just in the contended portion of the workload.<p>Also very interesting that, as Justin points out, the workload sets up the warehouses so there is <i>never</i> cross-node contention. That's wild! I'm glad they didn't go and benchmark against even more distributed databases (like YugabyteDB, Spanner, or CockroachDB) and call it a fair fight.</p>
]]></description><pubDate>Tue, 29 Jul 2025 01:03:14 +0000</pubDate><link>https://news.ycombinator.com/item?id=44717761</link><dc:creator>vvern</dc:creator><comments>https://news.ycombinator.com/item?id=44717761</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44717761</guid></item><item><title><![CDATA[New comment by vvern in "Benchmarking Postgres"]]></title><description><![CDATA[
<p>Folks, for the love of god, please please stop running TPC-C without the “keying time” and calling it “the industry-standard TPCC benchmark”.<p>I understand there are practical reasons why you might want to just choose a concurrency and let it rip at a fixed warehouse size and say, “I ran TPC-C”, but you didn’t!<p>TPC-C when run properly is effectively an open-loop benchmark that scales where the load scales with the dataset size by having a fixed number of workers per warehouse (2?) that each issue transactions at some rate. It’s designed to have a low level of builtin contention that occurs based on the frequency of cross warehouse transactions, I don’t remember the exact rate but I think it’s something like 10%.<p>The benchmark has an interesting property that if the system can keep up with the transaction load by processing transactions quickly, it remains a low contention workload but if it falls behind and transactions start to pile up, then the number of contending transactions in flight will increase. This leads to non-linear degradation mode even beyond what normally happens with an open loop benchmark — you hit some limit and the performance falls off a cliff because now you have to do even more work than just catching up on the query backlog.<p>When you run without think time, you make the benchmark closed loop. Also, because you’re varying the number of workers without changing the dataset size (because you have to vary something to make your pretty charts), you’re changing the rate at which any given transaction is going to be on the same warehouse. So, you’ve got more contending transactions generally, but worse than that, because of Amdahl’s law, the uncontended transactions will fly through, so most of the time for most workers will be spend sitting waiting on contended keys.</p>
]]></description><pubDate>Tue, 01 Jul 2025 17:07:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=44435967</link><dc:creator>vvern</dc:creator><comments>https://news.ycombinator.com/item?id=44435967</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44435967</guid></item><item><title><![CDATA[New comment by vvern in "Implementing Logic Programming"]]></title><description><![CDATA[
<p>Some time ago I worked on cockroachdb and I was working on implementing planning for complex online schema changes.<p>We really wanted a model that could convincingly handle and reasonably schedule arbitrary combinations of schema change statements that are valid in Postgres. Unlike mysql postgres offers transactional schema changes. Unlike Postgres, cockroach strives to implement online schema changes in a protocol inspired by f1 [0]. Also, you want to make sure you can safely roll back (until you’ve reached the point where you know it can’t fail, then only metadata updates are allowed).<p>The model we came up with was to decompose all things that can possibly change into “elements” [1] and each element had a schedule of state transitions that move the element through a sequence of states from public to absent or vice versa [2]. Each state transitions has operations [3].<p>Anyway, you end up wanting to define rules that say that certain element states have to be entered before other if the elements are related in some way. Or perhaps some transitions should happen at the same time. To express these rules I created a little datalog-like framework I called rel [4]. This lets you embed in go a rules engine that then you can add indexes to so that you can have sufficiently efficient implementation and know that all your lookups are indexed statically. You write the rules in Go [5]. To be honest it could be more ergonomic.<p>The rules are written in Go but for testing and visibility they produce a datomic-inspired format [6]. There’s a lot of rules now!<p>The internal implementation isn’t too far off from the search implementation presented here [7]. Here’s unify [8]. The thing has some indexes and index selection for acceleration. It also has inverted indexes for set containment queries.<p>It was fun to make a little embedded logic language and to have had a reason to!<p>0: <a href="https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/41376.pdf" rel="nofollow">https://static.googleusercontent.com/media/research.google.c...</a>
1: <a href="https://github.com/cockroachdb/cockroach/blob/f48b3438a296aad0ff6e2ce88875c6021dfea872/pkg/sql/schemachanger/scpb/elements.proto#L24">https://github.com/cockroachdb/cockroach/blob/f48b3438a296aa...</a>
2: <a href="https://github.com/cockroachdb/cockroach/blob/f48b3438a296aad0ff6e2ce88875c6021dfea872/pkg/sql/schemachanger/scplan/internal/opgen/opgen_column.go#L16">https://github.com/cockroachdb/cockroach/blob/f48b3438a296aa...</a>
3: <a href="https://github.com/cockroachdb/cockroach/blob/f48b3438a296aad0ff6e2ce88875c6021dfea872/pkg/sql/schemachanger/scop/immediate_mutation.go#L52">https://github.com/cockroachdb/cockroach/blob/f48b3438a296aa...</a>
4: <a href="https://github.com/cockroachdb/cockroach/blob/f48b3438a296aad0ff6e2ce88875c6021dfea872/pkg/sql/schemachanger/rel/doc.go#L6">https://github.com/cockroachdb/cockroach/blob/f48b3438a296aa...</a>
5: <a href="https://github.com/cockroachdb/cockroach/blob/f48b3438a296aad0ff6e2ce88875c6021dfea872/pkg/sql/schemachanger/scplan/internal/rules/release_25_2/dep_add_column.go#L16">https://github.com/cockroachdb/cockroach/blob/f48b3438a296aa...</a>
6: <a href="https://github.com/cockroachdb/cockroach/blob/master/pkg/sql/schemachanger/scplan/internal/rules/release_25_2/testdata/deprules">https://github.com/cockroachdb/cockroach/blob/master/pkg/sql...</a>
7: <a href="https://github.com/cockroachdb/cockroach/blob/f48b3438a296aad0ff6e2ce88875c6021dfea872/pkg/sql/schemachanger/rel/query_eval.go#L97">https://github.com/cockroachdb/cockroach/blob/f48b3438a296aa...</a>
8: <a href="https://github.com/cockroachdb/cockroach/blob/f48b3438a296aad0ff6e2ce88875c6021dfea872/pkg/sql/schemachanger/rel/query_eval.go#L339">https://github.com/cockroachdb/cockroach/blob/f48b3438a296aa...</a></p>
]]></description><pubDate>Sat, 14 Jun 2025 01:13:20 +0000</pubDate><link>https://news.ycombinator.com/item?id=44273543</link><dc:creator>vvern</dc:creator><comments>https://news.ycombinator.com/item?id=44273543</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44273543</guid></item><item><title><![CDATA[New comment by vvern in "Visualize and debug Rust programs with a new lens"]]></title><description><![CDATA[
<p>While that’s sort of true, there’s a lot of language specific things that go into making the UX of a debugger pleasant (think container abstractions, coroutines, vtables and interfaces). Specifically async rust and Tokio gets pretty interesting for a debugger to deal with.<p>Also, there’s usually some language (and compiler) specific garbage that makes the dwarf hard to use and requires special treatment.</p>
]]></description><pubDate>Thu, 29 May 2025 05:05:36 +0000</pubDate><link>https://news.ycombinator.com/item?id=44123288</link><dc:creator>vvern</dc:creator><comments>https://news.ycombinator.com/item?id=44123288</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44123288</guid></item><item><title><![CDATA[New comment by vvern in "Two Years of Rust"]]></title><description><![CDATA[
<p>How would you compare that to, say, go? I think the unit of distribution in go is a module, and the unit of compilation is a package. That being said, by using `internal` packages and interfaces you can similarly create the same sort of opaque  encapsulation.</p>
]]></description><pubDate>Tue, 15 Apr 2025 15:13:40 +0000</pubDate><link>https://news.ycombinator.com/item?id=43693985</link><dc:creator>vvern</dc:creator><comments>https://news.ycombinator.com/item?id=43693985</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43693985</guid></item><item><title><![CDATA[New comment by vvern in "Two Years of Rust"]]></title><description><![CDATA[
<p>My biggest issue with rust after two years is just as you highlight: the mod/crate divide is bad!<p>I want it to be easier to have more crates. The overhead of converting a module tree into a new crate is high. Modules get to have hierarchy, but crates end up being flat. Some of this is a direct result of the flat crate namespace.<p>A lot of the toil ends up coming from the need to muck with toml files and the fact that rust-analyzer can’t do it for me. I want to have refactoring tools to turn module trees into crates easily.<p>I feel like when I want to do that, I have to play this game of copying files then playing whack-a-mole until I get all the dependencies right. I wish dependencies were expressed in the code files themselves a la go. I think go did a really nice job with the packaging and dependency structure. It’s what I miss most.</p>
]]></description><pubDate>Tue, 15 Apr 2025 14:22:00 +0000</pubDate><link>https://news.ycombinator.com/item?id=43693166</link><dc:creator>vvern</dc:creator><comments>https://news.ycombinator.com/item?id=43693166</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43693166</guid></item><item><title><![CDATA[New comment by vvern in "A New Hash Table"]]></title><description><![CDATA[
<p>Literally all three of their required features which were not “standard” for swiss tables were requirements for the go implementation. See <a href="https://go.dev/blog/swisstable" rel="nofollow">https://go.dev/blog/swisstable</a> for a nice post on that project.</p>
]]></description><pubDate>Wed, 02 Apr 2025 18:53:24 +0000</pubDate><link>https://news.ycombinator.com/item?id=43560124</link><dc:creator>vvern</dc:creator><comments>https://news.ycombinator.com/item?id=43560124</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43560124</guid></item><item><title><![CDATA[New comment by vvern in "Stop syncing everything"]]></title><description><![CDATA[
<p>I’ll nitpick you back: if done correctly, consensus can have quite positive scaling consensus groups can have quite a positive impact on tail latency. As the membership size gets bigger, the expectation on the tail latency of the committing quorum goes down assuming independence and any sort of fat tailed distribution for individual participants.</p>
]]></description><pubDate>Wed, 02 Apr 2025 16:42:24 +0000</pubDate><link>https://news.ycombinator.com/item?id=43558601</link><dc:creator>vvern</dc:creator><comments>https://news.ycombinator.com/item?id=43558601</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43558601</guid></item><item><title><![CDATA[New comment by vvern in "Making Postgres scale"]]></title><description><![CDATA[
<p>Cockroach really doesn’t have limitations when it comes to queries. It is kinda magic in that regard. The single partition queries are the special case and are treated as rare. Cockroach ranges are quite small compared to other systems (~256MiB).</p>
]]></description><pubDate>Sat, 15 Mar 2025 12:48:02 +0000</pubDate><link>https://news.ycombinator.com/item?id=43372196</link><dc:creator>vvern</dc:creator><comments>https://news.ycombinator.com/item?id=43372196</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43372196</guid></item><item><title><![CDATA[New comment by vvern in "SQLite-on-the-server is misunderstood: Better at hyper-scale than micro-scale"]]></title><description><![CDATA[
<p>Check out <a href="https://sqlsync.dev/" rel="nofollow">https://sqlsync.dev/</a></p>
]]></description><pubDate>Mon, 03 Mar 2025 21:07:42 +0000</pubDate><link>https://news.ycombinator.com/item?id=43246727</link><dc:creator>vvern</dc:creator><comments>https://news.ycombinator.com/item?id=43246727</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43246727</guid></item><item><title><![CDATA[New comment by vvern in "Generating Voronoi diagrams using Fortune's algorithm"]]></title><description><![CDATA[
<p>It’s all open source, sorry there was no link!<p><a href="https://github.com/ajwerner/voronoi">https://github.com/ajwerner/voronoi</a></p>
]]></description><pubDate>Sat, 08 Feb 2025 20:22:25 +0000</pubDate><link>https://news.ycombinator.com/item?id=42985865</link><dc:creator>vvern</dc:creator><comments>https://news.ycombinator.com/item?id=42985865</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42985865</guid></item><item><title><![CDATA[New comment by vvern in "Generating Voronoi diagrams using Fortune's algorithm"]]></title><description><![CDATA[
<p>I made an implementation in clojurescript that animates the algorithm as it goes a while back: <a href="https://voronoi.ajwerner.net/#/app-diagrams" rel="nofollow">https://voronoi.ajwerner.net/#/app-diagrams</a><p>It’s a very beautiful algorithm.<p>However, after that project I sort of came to dislike Fortune’s algorithm because it isn’t numerically stable with floating point numbers. If you have points that are colinear, or nearly colinear in fp, things can break. The delaunator is better in this regard iirc: <a href="https://github.com/mapbox/delaunator">https://github.com/mapbox/delaunator</a></p>
]]></description><pubDate>Sat, 08 Feb 2025 12:52:55 +0000</pubDate><link>https://news.ycombinator.com/item?id=42982630</link><dc:creator>vvern</dc:creator><comments>https://news.ycombinator.com/item?id=42982630</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42982630</guid></item><item><title><![CDATA[New comment by vvern in "NYC Congestion Pricing Tracker"]]></title><description><![CDATA[
<p>I don’t think in NYC it’s fair to argue that there’s relatively little interest in making transit something people want to use. We can debate about whether the efforts are effective, and certainly many aren’t. However there are vast sums invested in the MTA and a great many folks at the MTA who try to make it pleasant and safe. Additionally there have been added police and military presence in subway stations around the city for months (again, no comment on efficacy). All I’ll say is that there is a ton of interest from leadership on down in making the subway and buses work well for normal people and far more money then congestion pricing cost to implement or will bring in.</p>
]]></description><pubDate>Tue, 07 Jan 2025 01:11:38 +0000</pubDate><link>https://news.ycombinator.com/item?id=42618112</link><dc:creator>vvern</dc:creator><comments>https://news.ycombinator.com/item?id=42618112</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42618112</guid></item></channel></rss>