<turbo-stream action="append" target="posts_list"><template>    <div class="postbit" id="376762" data-post-id="376762">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="jstimps" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/jstimps/120/37213_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  jstimps
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Thanks, I now see your point about developer discipline writing code in this style. I suppose this is why Flow exists. And I’m sure the next iteration exists at the core of Antithesis.</p>
<p>Question for you, since you’ve been thinking deeply about this. Suppose BEAM does someday get a simulation mode, with a deterministic and stable scheduler. Would we require <em>fundamental</em> language changes in order to make proper (and ergonomic) use of it, or do you see a world where one or more of the current languages can adapt: Erlang, Elixir, Gleam? I guess I’m wondering what building blocks would we need, hypothetically, to remove some of that required developer discipline?</p>
<p>How deep does the rabbit hole go? <img src="https://forum.elixirforum.com/images/emoji/apple/slightly_smiling_face.png?v=15" title=":slightly_smiling_face:" class="emoji" alt=":slightly_smiling_face:" loading="lazy" width="20" height="20"></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="376762" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/hobbes-a-low-level-distributed-database-for-the-elixir-programming-language/73003/42">Post #41</a>
	                </div>
	            </div>
              <div id="likers-container-376762" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="376762"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #41"></div>
  </section>
</div>
    <div class="postbit" id="376763" data-post-id="376763">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="garrison" src="/assets/icons/user-9f439610.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  garrison
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>I mean, I shouldn’t oversell this: it really is <em>not</em> that hard. In the very beginning I had a couple of determinism bugs caused by enumerating maps. After I learned about that I don’t think I ever had a determinism bug again.</p>
<p>Also, if you have a <em>rare</em> determinism bug it may not matter very much. The purpose of the simulator is <em>debugging</em>; deterministic execution does not have to be a correctness condition of the <em>database</em>.</p>
<aside class="quote no-group" data-username="jstimps" data-post="42" data-topic="73003">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/jstimps/48/37213_2.png" class="avatar"> jstimps:</div>
<blockquote>
<p>I guess I’m wondering what building blocks would we need, hypothetically, to remove some of that required developer discipline?</p>
</blockquote>
</aside>
<p>At the end of the day, you actually have to <em>care</em> about these things. Good testing takes effort. Really, <em>anything</em> good takes effort.</p>
<p>Like, I said property-based tests are better than unit tests, and then everyone shows up to defend unit tests. And, look, I am <em>not</em> here to tell you what to do, but if you actually care about correctness and want to get to zero bugs this attitude is just NGMI.</p>
<p>Fundamentally, what set FDB apart is that from the beginning they set a <em>culture</em> of caring deeply about correctness. They went to war with bugs. Flow, the simulator, and the database were all <em>downstream</em> of that, not upstream.</p>
<p>Today I think most of that culture has been erased. They still have the simulator, but the team maintaining the database is several generations removed from those pioneers.</p>
<p>If you want to see who’s <em>really</em> carrying this torch today, it’s Tigerbeetle. In particular, their work on handling storage faults far surpasses FDB, and if FDB’s culture was still alive today they would be working on that instead of replacing their storage engine with <em>RocksDB</em> (lol).</p>
<p>I would like to carry a bit of that torch too.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="376763" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/hobbes-a-low-level-distributed-database-for-the-elixir-programming-language/73003/43">Post #42</a>
	                </div>
	            </div>
              <div id="likers-container-376763" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="376763"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #42"></div>
  </section>
</div>
    <div class="postbit" id="376764" data-post-id="376764">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="garrison" src="/assets/icons/user-9f439610.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  garrison
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>To actually answer your question, I don’t think any language changes are needed. Simulation tests on the BEAM work today; I’m literally doing it right now.</p>
<p>If you made the BEAM scheduler deterministic and wrote simulated APIs for I/O and time you could do DST natively, which would have performance benefits. But this would probably be a lot of work.</p>
<p>The real benefit of a new VM would be to simtest <em>the VM itself</em>. The biggest problem with my approach is that I cannot catch bugs <em>in Erlang</em>. Of course Erlang is old and stable so this isn’t the end of the world, but I would love to do better.</p>
<p>If you look at Tigerbeetle they have no dependencies at all. They literally vendor parts of the Zig stlib into their repo. That’s the dream: no untested surface area whatsoever.</p>
<p>But obviously “rewrite the entire BEAM” was one yak too many even for me, so Construct works for now!</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="376764" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/hobbes-a-low-level-distributed-database-for-the-elixir-programming-language/73003/44">Post #43</a>
	                </div>
	            </div>
              <div id="likers-container-376764" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="376764"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #43"></div>
  </section>
</div>
    <div class="postbit" id="377525" data-post-id="377525">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="itekhi" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/itekhi/120/38403_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  itekhi
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>When I saw this in the forum’s email digest, I was like wait what, I need to see this <img src="https://forum.elixirforum.com/images/emoji/apple/smile.png?v=15" title=":smile:" class="emoji" alt=":smile:" loading="lazy" width="20" height="20"></p>
<p>Congrats! It will be pretty exciting to see how this project grows, good luck!</p>
<p>Actually, the reason I wanted to see this is because I need something like Uber’s LedgerStore, an immutable, scalable storage for financial transactions… Will this project ever be suitable for this? (apologies if this is unrelated, I didn’t dive in the answers yet)</p>
<p>P.S. I just can’t seem to find anything for this in the Elixir ecosystem, searching for column-oriented DB (DuckDB?) that blends in, but defaulting to Postgres right now… If anyone has suggestions for what to use please let me know <img src="https://forum.elixirforum.com/images/emoji/apple/folded_hands.png?v=15" title=":folded_hands:" class="emoji" alt=":folded_hands:" loading="lazy" width="20" height="20"></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="377525" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/hobbes-a-low-level-distributed-database-for-the-elixir-programming-language/73003/45">Post #44</a>
	                </div>
	            </div>
              <div id="likers-container-377525" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="377525"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #44"></div>
  </section>
</div>
    <div class="postbit" id="377561" data-post-id="377561">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="Sorc96" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/Sorc96/120/28361_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  Sorc96
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>This is an incredible amount of effort put into something that could become extremely valuable to the ecosystem. I just want to ask how you ended up with all the knowledge needed to build something like this. It’s difficult for me to imagine how to even begin understanding these concepts, at least from my position of a regular developer shovelling endless CRUD apps and integrating half-working REST APIs. It’s clearly a very different world.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="377561" data-batch-url="/posts/batch_likers">
                        3
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/hobbes-a-low-level-distributed-database-for-the-elixir-programming-language/73003/46">Post #45</a>
	                </div>
	            </div>
              <div id="likers-container-377561" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="377561"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #45"></div>
  </section>
</div>
    <div class="postbit" id="377590" data-post-id="377590">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="garrison" src="/assets/icons/user-9f439610.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  garrison
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="Sorc96" data-post="46" data-topic="73003">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/sorc96/48/28361_2.png" class="avatar"> Sorc96:</div>
<blockquote>
<p>I just want to ask how you ended up with all the knowledge needed to build something like this.</p>
</blockquote>
</aside>
<p>I did not have the knowledge when I started! I acquired it by <em>trying</em>. Of course I had to read a lot and studying databases had become a hobby of mine before it turned into <em>writing</em> databases, but at the end of the day (and this is really true of everything) reading is not enough. There is a <em>lot</em> of stuff that only clicks once you sit down and try to implement it.</p>
<aside class="quote no-group" data-username="Sorc96" data-post="46" data-topic="73003">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/sorc96/48/28361_2.png" class="avatar"> Sorc96:</div>
<blockquote>
<p>at least from my position of a regular developer shovelling endless CRUD apps and integrating half-working REST APIs. It’s clearly a very different world.</p>
</blockquote>
</aside>
<p>Maybe, maybe not. If you’ve followed my posts on this forum you will know that this project was born specifically out of me trying to build apps that are better than CRUD apps with half-working REST APIs and consistently failing to meet my own standards. Some of that is on me, but I prefer to think in terms of process errors and I’ve found that bad tooling leads to bad results.</p>
<p>Especially in this brave new world of AI slop I have become convinced that saas-with-forms is just not going to cut it anymore. I am trying very hard to do better.</p>
<aside class="quote no-group" data-username="Sorc96" data-post="46" data-topic="73003">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/sorc96/48/28361_2.png" class="avatar"> Sorc96:</div>
<blockquote>
<p>It’s difficult for me to imagine how to even begin understanding these concepts</p>
</blockquote>
</aside>
<p>Well, the explicit goal of this project is to make sure you don’t have to <img src="https://forum.elixirforum.com/images/emoji/apple/slight_smile.png?v=15" title=":slight_smile:" class="emoji" alt=":slight_smile:" loading="lazy" width="20" height="20"></p>
<p>But really, if you’re interested in this stuff it might not be as hard as you think! Keep in mind that non-programmers would say the same things about the knowledge <em>you</em> take for granted. Don’t count yourself out.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="377590" data-batch-url="/posts/batch_likers">
                        8
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/hobbes-a-low-level-distributed-database-for-the-elixir-programming-language/73003/47">Post #46</a>
	                </div>
	            </div>
              <div id="likers-container-377590" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="377590"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #46"></div>
  </section>
</div>
    <div class="postbit" id="377592" data-post-id="377592">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="garrison" src="/assets/icons/user-9f439610.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  garrison
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="itekhi" data-post="45" data-topic="73003">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/itekhi/48/38403_2.png" class="avatar"> itekhi:</div>
<blockquote>
<p>the reason I wanted to see this is because I need something like Uber’s LedgerStore, an immutable, scalable storage for financial transactions… Will this project ever be suitable for this?</p>
</blockquote>
</aside>
<p>I will give you the long answer to this question.</p>
<p>First of all, Hobbes is a low-level database; that is, a tool for building databases. The architecture is optimized specifically for a “distributed OLTP” model where the dataset is large but transactions are small. In these workloads, contention is rare and has to be guarded against mainly for correctness. This architecture is pretty optimal for app backends and so on.</p>
<p>However, there are some workloads that have high contention. These workloads do not scale (<a href="https://www.usenix.org/system/files/conference/hotos15/hotos15-paper-mcsherry.pdf" rel="noopener nofollow ugc">here’s a fun paper</a>). As it turns out, financial transactions are quite close to the worst possible case here. It is common to route transactions through a small number of accounts which leads to extremely high contention (“hot keys”).</p>
<p>So for financial transactions specifically the best design is to write extremely tightly optimized code to process all transactions in batches as fast as possible on a single core. Elixir is essentially the worst language I can imagine for doing something like this.</p>
<p>Coincidentally, there is a new database designed specifically for financial transactions called Tigerbeetle which was the topic of discussion a few posts up. I mentioned them because I’ve spent a good amount of time in their codebase now (learning) and, frankly, they have the best engineering practices I have ever seen. If you need to store financial transactions Tigerbeetle is without question the way to go. You still need another database to store everything else, though, as they can <em>only</em> store transactions.</p>
<p>Hobbes is a low-level OLTP store and can be used as a tool to build essentially any kind of distributed database. You could use it to build a relational database, or as a metadata store for blob storage (like S3). You could even use it to store metadata for an analytics/columnar data warehouse; this is literally exactly what Snowflake did with FoundationDB (Hobbes’s architectural donor). You could keep track of Parquet files as blobs and query them with something like DuckDB. In fact, <a href="https://github.com/duckdb/ducklake" rel="noopener nofollow ugc">that pattern has become a whole thing lately</a>.</p>
<p>But financial transactions are essentially the prototypical example of the worst possible case for a “horizontally scalable” database like Hobbes.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="377592" data-batch-url="/posts/batch_likers">
                        8
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/hobbes-a-low-level-distributed-database-for-the-elixir-programming-language/73003/48">Post #47</a>
	                </div>
	            </div>
              <div id="likers-container-377592" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="377592"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #47"></div>
  </section>
</div>
    <div class="postbit" id="378168" data-post-id="378168">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="itekhi" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/itekhi/120/38403_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  itekhi
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Thank you for such a thorough answer! You are the engineer the world needs!)) (thanks for your work and answers throughout the Elixir community man!)</p>
<p>It was so awkward to see that literally previous post of mine mentions Tigerbeetle, the thing I was searching for <img src="https://forum.elixirforum.com/images/emoji/apple/saluting_face.png?v=15" title=":saluting_face:" class="emoji" alt=":saluting_face:" loading="lazy" width="20" height="20"></p>
<p>Much appreciated for the paper and technologies (and even terms new to me) you mentioned, it got me interested and made me want to learn more about much things!</p>
<aside class="quote no-group" data-username="garrison" data-post="48" data-topic="73003">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/letter_avatar_proxy/v4/letter/g/3bc359/48.png" class="avatar"> garrison:</div>
<blockquote>
<p>as a metadata store for blob storage (like S3). You could even use it to store metadata for an analytics/columnar data warehouse;</p>
</blockquote>
</aside>
<p>I am a beginner to data warehouses with metadata stores stuff, but I really want to learn because I am planning to work with lots of analytical (frequently written and aggregated) data, and this stuff just seams like must know right now. FoundationDB has caught my attention much times and I want to try to do some work with it, but what bothers me is that it needs API language binding and there is no official one for Elixir (I saw you answered A LOT on the EctoFdb forum, so it would be great to hear some advice from an expert). Perhaps there is an alternative that has better Elixir support?</p>
<p>I am now wondering is Hobbes suitable for analytical workloads or it is better to use it as metadata store for a data warehouse? (TBH I don’t really understand for what metadata store is needed and how Hobbes could be used as that <img src="https://forum.elixirforum.com/images/emoji/apple/persevering_face.png?v=15" title=":persevering_face:" class="emoji" alt=":persevering_face:" loading="lazy" width="20" height="20">)</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="378168" data-batch-url="/posts/batch_likers">
                        2
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/hobbes-a-low-level-distributed-database-for-the-elixir-programming-language/73003/49">Post #48</a>
	                </div>
	            </div>
              <div id="likers-container-378168" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="378168"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #48"></div>
  </section>
</div>
    <div class="postbit" id="378174" data-post-id="378174">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="itekhi" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/itekhi/120/38403_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  itekhi
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="Sorc96" data-post="46" data-topic="73003">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/sorc96/48/28361_2.png" class="avatar"> Sorc96:</div>
<blockquote>
<p>I just want to ask how you ended up with all the knowledge needed to build something like this. It’s difficult for me to imagine how to even begin understanding these concepts</p>
</blockquote>
</aside>
<p>(garrison is a legend and he was born with all that knowledge, even peaky blinders named their pub after him, JK :P)</p>
<p>Writing previous post led me to an answer to you my friend: I think becoming a real engineer is tough, because besides the work we all have and do, it requires just delving into difficult stuff to accumulate knowledge about various topics (as garrison said <em>trying,</em> <a href="https://en.wikipedia.org/wiki/The_Thinker#/media/File%253ALe_Penseur_by_Rodin_(Kunsthalle_Bielefeld)_2014-04-10.JPG" rel="noopener nofollow ugc">literally like this</a>).</p>
<p>Just dig into code, try implementing – learning by practise is the best, and ask questions! Engineering is pretty courageous ey) But if you want it, and embrace the difficulty, it can be fun and rewarding afterall <img src="https://forum.elixirforum.com/images/emoji/apple/wink.png?v=15" title=":wink:" class="emoji" alt=":wink:" loading="lazy" width="20" height="20"></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="378174" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/hobbes-a-low-level-distributed-database-for-the-elixir-programming-language/73003/50">Post #49</a>
	                </div>
	            </div>
              <div id="likers-container-378174" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="378174"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #49"></div>
  </section>
</div>
    <div class="postbit" id="378177" data-post-id="378177">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="garrison" src="/assets/icons/user-9f439610.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  garrison
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="itekhi" data-post="49" data-topic="73003">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/itekhi/48/38403_2.png" class="avatar"> itekhi:</div>
<blockquote>
<p>Much appreciated for the paper and technologies (and even terms new to me) you mentioned, it got me interested and made me want to learn more about much things!</p>
</blockquote>
</aside>
<p>I am very glad to hear that!</p>
<aside class="quote no-group" data-username="itekhi" data-post="49" data-topic="73003">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/itekhi/48/38403_2.png" class="avatar"> itekhi:</div>
<blockquote>
<p>FoundationDB has caught my attention much times and I want to try to do some work with it, but what bothers me is that it needs API language binding and there is no official one for Elixir</p>
</blockquote>
</aside>
<p>This kinda bothered me too, and was one of the original reasons I wanted to try writing my own DB. A ridiculous reason on its own of course, but others came along.</p>
<p>FDB does not have a wire protocol like, say, Postgres. They opted instead for a “thick client” design where the client is responsible for some pretty important stuff like buffering writes, implementing a “read your writes” cache, caching and invalidating shard location metadata, and so on. A lot of this stuff is in the critical path for correctness, meaning if somebody implemented it wrong (which they likely would, because it’s hard) the client would corrupt your data.</p>
<p>FDB was designed using a very sophisticated simulation testing methodology (especially for the time - they pioneered this) and it was necessary to test the client along with the server. So the FDB client is a C library which you have to link against. They do have “official” bindings for a couple of languages but they just link the C library for the important stuff.</p>
<p>For Elixir, <a class="mention" href="/u/jstimps" rel="nofollow">@jstimps</a> maintains the BEAM FDB bindings (<code>erlfdb</code>). My understanding is that they were originally written for the CouchDB rewrite which never happened and they are fairly mature and stable. If you have questions about that you should direct them to him in the EctoFDB thread. He also knows much more about operating FDB than me (I just read the code).</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="378177" data-batch-url="/posts/batch_likers">
                        4
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/hobbes-a-low-level-distributed-database-for-the-elixir-programming-language/73003/51">Post #50</a>
	                </div>
	            </div>
              <div id="likers-container-378177" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="378177"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #50"></div>
  </section>
</div>
</template></turbo-stream><turbo-stream action="replace" target="load-more-container"><template><div id="load-more-container" class="load-more-container">
    <a class="load-more-button" data-turbo-stream="true" href="/topics/73003/load_more?page=6">Load more posts (36 remaining)</a>
</div></template></turbo-stream>