<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: alquemist</title><link>https://news.ycombinator.com/user?id=alquemist</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Thu, 27 Aug 2026 22:55:16 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=alquemist" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by alquemist in "How Shopify Uses WebAssembly Outside of the Browser"]]></title><description><![CDATA[
<p>Rarely. Over a long enough time period though, the probability of a portability event nears 1, and the cost of such event is enormous. Right now there is a credible challenge for the x86 domination in the server, laptop and desktop  markets raised by ARM, via AWS A1, Apple M1 and many others. Would be foolish to bootstrap an ecosystem locked-in to the loser, and we don't know the winner / loser over a 5-10 year timeframe.</p>
]]></description><pubDate>Sun, 20 Dec 2020 00:31:18 +0000</pubDate><link>https://news.ycombinator.com/item?id=25482737</link><dc:creator>alquemist</dc:creator><comments>https://news.ycombinator.com/item?id=25482737</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=25482737</guid></item><item><title><![CDATA[New comment by alquemist in "How Shopify Uses WebAssembly Outside of the Browser"]]></title><description><![CDATA[
<p>I am not following WASM closely, but it appears to be deployed in all modern browsers: Chrome, Firefox, Safari, Edge. That counts as 'large scale production deployment', even if there aren't that many websites that take advantage of this capability (yet?). <a href="https://caniuse.com/wasm" rel="nofollow">https://caniuse.com/wasm</a></p>
]]></description><pubDate>Sat, 19 Dec 2020 19:16:12 +0000</pubDate><link>https://news.ycombinator.com/item?id=25480252</link><dc:creator>alquemist</dc:creator><comments>https://news.ycombinator.com/item?id=25480252</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=25480252</guid></item><item><title><![CDATA[New comment by alquemist in "How Shopify Uses WebAssembly Outside of the Browser"]]></title><description><![CDATA[
<p>In a WASM + seccomp implementation, the whole WASM runtime runs inside seccomp. Breaking out of WASM leaves one running arbitrary asm inside seccomp, which has exactly the same attack surface as directly running untrusted binaries inside seccomp. The WASM layer in WASM + seccomp simply requires an additional exploit.</p>
]]></description><pubDate>Sat, 19 Dec 2020 13:18:07 +0000</pubDate><link>https://news.ycombinator.com/item?id=25477225</link><dc:creator>alquemist</dc:creator><comments>https://news.ycombinator.com/item?id=25477225</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=25477225</guid></item><item><title><![CDATA[New comment by alquemist in "How Shopify Uses WebAssembly Outside of the Browser"]]></title><description><![CDATA[
<p>That's a bit of apples and oranges. JS/WASM are runtimes executing hostile code, whereas Go apps are trusted code.</p>
]]></description><pubDate>Sat, 19 Dec 2020 13:09:14 +0000</pubDate><link>https://news.ycombinator.com/item?id=25477186</link><dc:creator>alquemist</dc:creator><comments>https://news.ycombinator.com/item?id=25477186</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=25477186</guid></item><item><title><![CDATA[New comment by alquemist in "How Shopify Uses WebAssembly Outside of the Browser"]]></title><description><![CDATA[
<p>Assuming that Intel / ARM microarch implementations are bug free, that is correct. In the real world there are no bug free implementations.<p>Edit. This is the strategy Chrome sandboxing uses: a hardened runtime (JS/WASM) inside a seccomp enclosure. <a href="https://chromium.googlesource.com/chromiumos/docs/+/master/sandboxing.md" rel="nofollow">https://chromium.googlesource.com/chromiumos/docs/+/master/s...</a></p>
]]></description><pubDate>Sat, 19 Dec 2020 12:56:36 +0000</pubDate><link>https://news.ycombinator.com/item?id=25477123</link><dc:creator>alquemist</dc:creator><comments>https://news.ycombinator.com/item?id=25477123</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=25477123</guid></item><item><title><![CDATA[New comment by alquemist in "How Shopify Uses WebAssembly Outside of the Browser"]]></title><description><![CDATA[
<p>* Predictable performance.<p>* A wide ecosystem of mature language toolchains.<p>* Simplicity: JS implementation contain sophisticated JITs, which are harder to prove correct compared to a simple ASM translator.<p>* Portability: not tied to a specific HW architecture.</p>
]]></description><pubDate>Sat, 19 Dec 2020 12:39:41 +0000</pubDate><link>https://news.ycombinator.com/item?id=25477062</link><dc:creator>alquemist</dc:creator><comments>https://news.ycombinator.com/item?id=25477062</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=25477062</guid></item><item><title><![CDATA[New comment by alquemist in "How Shopify Uses WebAssembly Outside of the Browser"]]></title><description><![CDATA[
<p>It's not an either/or. Most likely Shopify runs WASM inside an seccomp enclosure. Possibly inside a VM as well. Defense in depth.</p>
]]></description><pubDate>Sat, 19 Dec 2020 12:36:09 +0000</pubDate><link>https://news.ycombinator.com/item?id=25477053</link><dc:creator>alquemist</dc:creator><comments>https://news.ycombinator.com/item?id=25477053</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=25477053</guid></item><item><title><![CDATA[New comment by alquemist in "Death by 1000 layers: the perils of over-abstraction in Java (2017)"]]></title><description><![CDATA[
<p>Mock: Adhoc guessing of what methods called on a dependency, but sometimes even between classes in the same module, might return. Guess repeated over and over as new tests are added, sometimes tens of times or even more. For example, <a href="https://site.mockito.org/#how" rel="nofollow">https://site.mockito.org/#how</a>, "when(mockedList.get(0)).thenReturn("first"); System.out.println(mockedList.get(0)); // prints "first""<p>Fake: A replacement module that behaves like a production module, but with certain simplifications, for example in-process vs. using rpcs, or simply cleaning up the filesystem after usage. For example, <a href="https://github.com/tk0miya/testing.postgresql" rel="nofollow">https://github.com/tk0miya/testing.postgresql</a>. "automatically setups a postgresql instance in a temporary directory, and destroys it after testing".</p>
]]></description><pubDate>Tue, 15 Dec 2020 01:41:30 +0000</pubDate><link>https://news.ycombinator.com/item?id=25426017</link><dc:creator>alquemist</dc:creator><comments>https://news.ycombinator.com/item?id=25426017</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=25426017</guid></item><item><title><![CDATA[New comment by alquemist in "Death by 1000 layers: the perils of over-abstraction in Java (2017)"]]></title><description><![CDATA[
<p>Agreed. Using mocks while testing vanilla in-process code is never justified.</p>
]]></description><pubDate>Mon, 14 Dec 2020 11:37:09 +0000</pubDate><link>https://news.ycombinator.com/item?id=25415886</link><dc:creator>alquemist</dc:creator><comments>https://news.ycombinator.com/item?id=25415886</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=25415886</guid></item><item><title><![CDATA[New comment by alquemist in "Death by 1000 layers: the perils of over-abstraction in Java (2017)"]]></title><description><![CDATA[
<p>Fakes are not mocks. The fake is just another module. Assuming no updates, it is written once. Mocks are written 47 times, inconsistently, while focusing primarily on other tasks. If there are updates needed, better to fix them in one place than chasing 47 test code locations with inconsistent usages.<p>Furthermore, these are external dependencies that can't be run in-process. If a dependency <i>can</i> be run in-process (aka library), there is no justification to ever mock it. I've even seen codebases that mock their own class B in order to test class A. Run the production code already. Ban mocking libraries.</p>
]]></description><pubDate>Mon, 14 Dec 2020 11:10:15 +0000</pubDate><link>https://news.ycombinator.com/item?id=25415716</link><dc:creator>alquemist</dc:creator><comments>https://news.ycombinator.com/item?id=25415716</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=25415716</guid></item><item><title><![CDATA[New comment by alquemist in "Death by 1000 layers: the perils of over-abstraction in Java (2017)"]]></title><description><![CDATA[
<p>Fake, don't mock. Write, or ask the team that provide the external dependency to write, a small piece of code that behaves like your external dependency, but in-process. You'll thank me after about the 47th time you're guessing (inconsistently, possibly incorrectly, and definitely overly verbose) how the external dependency actually works. Ban mocking libraries.</p>
]]></description><pubDate>Mon, 14 Dec 2020 10:35:36 +0000</pubDate><link>https://news.ycombinator.com/item?id=25415480</link><dc:creator>alquemist</dc:creator><comments>https://news.ycombinator.com/item?id=25415480</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=25415480</guid></item><item><title><![CDATA[New comment by alquemist in "Death by 1000 layers: the perils of over-abstraction in Java (2017)"]]></title><description><![CDATA[
<p>Fake external storage / rpc dependencies.</p>
]]></description><pubDate>Mon, 14 Dec 2020 10:31:43 +0000</pubDate><link>https://news.ycombinator.com/item?id=25415453</link><dc:creator>alquemist</dc:creator><comments>https://news.ycombinator.com/item?id=25415453</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=25415453</guid></item><item><title><![CDATA[New comment by alquemist in "Death by 1000 layers: the perils of over-abstraction in Java (2017)"]]></title><description><![CDATA[
<p>Don't mock. Test production code, maybe with faked storage.</p>
]]></description><pubDate>Mon, 14 Dec 2020 10:08:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=25415293</link><dc:creator>alquemist</dc:creator><comments>https://news.ycombinator.com/item?id=25415293</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=25415293</guid></item><item><title><![CDATA[New comment by alquemist in "Why software ends up complex"]]></title><description><![CDATA[
<p>"In the beginning was the word". Language shapes reality. As software engineers, the second we accept that 'product owner' is a legitimate title, that second we lost agency to push back on poorly conceived features. Say it loud and clear: you also have a stake in the product.</p>
]]></description><pubDate>Mon, 14 Dec 2020 00:38:47 +0000</pubDate><link>https://news.ycombinator.com/item?id=25412037</link><dc:creator>alquemist</dc:creator><comments>https://news.ycombinator.com/item?id=25412037</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=25412037</guid></item><item><title><![CDATA[New comment by alquemist in "U.S. Treasury breached by hackers backed by foreign government – sources"]]></title><description><![CDATA[
<p><a href="https://leanprover.github.io" rel="nofollow">https://leanprover.github.io</a><p>While it is difficult to design a secure procurement chain all the way to the SiO2, we could at least design simple enough hw/sw systems for which formal verification is an economical option. And then force government entities to use formally verified systems instead of the bug ridden crap most shops, especially the sw ones, have to ship under intense deadline pressure. The market has led us into a broken local optima, no way to get out short of state level action.</p>
]]></description><pubDate>Mon, 14 Dec 2020 00:25:43 +0000</pubDate><link>https://news.ycombinator.com/item?id=25411960</link><dc:creator>alquemist</dc:creator><comments>https://news.ycombinator.com/item?id=25411960</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=25411960</guid></item><item><title><![CDATA[New comment by alquemist in "Monads and GATs in Nightly Rust"]]></title><description><![CDATA[
<p>Can not resist. The tension between 'basic feature set' and an admittedly superficial reading of the docs is very funny. The manifesto links to <a href="https://github.com/commercialhaskell/rio#readme" rel="nofollow">https://github.com/commercialhaskell/rio#readme</a> and urges us to use the rio library to get started. Upon opening the rio link and scanning for a list of the 'basic feature set', I stumble upon the first block of quoted code. After removing 39 eoln characters in respect for the HN audience, it reads:<p>"Our recommended [language extensions] defaults are: AutoDeriveTypeable BangPatterns BinaryLiterals ConstraintKinds DataKinds DefaultSignatures DeriveDataTypeable DeriveFoldable DeriveFunctor DeriveGeneric DeriveTraversable DoAndIfThenElse EmptyDataDecls ExistentialQuantification FlexibleContexts FlexibleInstances FunctionalDependencies GADTs GeneralizedNewtypeDeriving InstanceSigs KindSignatures LambdaCase MonadFailDesugaring MultiParamTypeClasses MultiWayIf NamedFieldPuns NoImplicitPrelude OverloadedStrings PartialTypeSignatures PatternGuards PolyKinds RankNTypes RecordWildCards ScopedTypeVariables StandaloneDeriving TupleSections TypeFamilies TypeSynonymInstances ViewPatterns"<p>39 <i>language</i> extensions just to get started. This screams 'incredibly complicated', even if perhaps reality is rather more mundane. Consider the 40th language extension: GradualTyping, so perhaps those that would rather write code about data than about types using a half baked and evolving type language  (which taken to its logical conclusion will have to become a full fledged theorem prover in the Coq / Idris / Agda / Lean lineage anyways) could get their jobs done.<p>Wish you guys all the best!</p>
]]></description><pubDate>Sun, 13 Dec 2020 14:40:57 +0000</pubDate><link>https://news.ycombinator.com/item?id=25406845</link><dc:creator>alquemist</dc:creator><comments>https://news.ycombinator.com/item?id=25406845</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=25406845</guid></item><item><title><![CDATA[New comment by alquemist in "Monads and GATs in Nightly Rust"]]></title><description><![CDATA[
<p>99% of the time a loop works just fine, because there are no measurable gains to be had from parallelism. For the 1% where performance matters, it's usually a bit more involved that simply using a map or fold, and hopefully already packaged as an off-the-shelf library. To have measurable gains from parallelism one has to be very intentional in balancing communication vs computation. Think carefully designed libraries like cuDNN.</p>
]]></description><pubDate>Sat, 12 Dec 2020 02:01:42 +0000</pubDate><link>https://news.ycombinator.com/item?id=25394582</link><dc:creator>alquemist</dc:creator><comments>https://news.ycombinator.com/item?id=25394582</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=25394582</guid></item><item><title><![CDATA[New comment by alquemist in "Monads and GATs in Nightly Rust"]]></title><description><![CDATA[
<p>'FP' covers 2 meanings:<p>A. Pure functions + immutable data structures.<p>B. Expressive type systems, all the way to compile-time metaprogramming and dependently typed proofs.<p>Writing programs in style A. is tremendously valuable. Expending too much effort in the fine points of the type system, which invariably is simultaneously both under-expressive and over-expressive, is a complete waste of time. Some critical projects require high defect-free confidence, and for those it's legitimate to go full in formal proofs and take the 10x-100x productivity slowdown. For mere mortals, documenting the structure of the data (json) manipulated by the respective functions suffices.</p>
]]></description><pubDate>Fri, 11 Dec 2020 21:22:58 +0000</pubDate><link>https://news.ycombinator.com/item?id=25391195</link><dc:creator>alquemist</dc:creator><comments>https://news.ycombinator.com/item?id=25391195</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=25391195</guid></item><item><title><![CDATA[New comment by alquemist in "Monads and GATs in Nightly Rust"]]></title><description><![CDATA[
<p>Haha, I'm the wrong person to ask. I was fortunate enough to be in a hands on senior role, and I promoted a very light Java++ style, to be learned in a 2 hours seminar: immutable collections, case classes, pure functions, impure logging & exceptions, sparingly used interface polymorphism, recursion, filter/map/flatmap/fold. Scala: The Good Parts. To this day I have not learned the first thing about implicits or type variance, and probably there are many many many more Scala features I haven't even heard of. The biggest challenge was helping the rest of the team avoid writing inscrutable sbt plugins. The plus side, it makes little difference Scala2 vs. Scala3. The downside, some teams may scoff at such a mundane approach.</p>
]]></description><pubDate>Fri, 11 Dec 2020 21:07:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=25390993</link><dc:creator>alquemist</dc:creator><comments>https://news.ycombinator.com/item?id=25390993</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=25390993</guid></item><item><title><![CDATA[New comment by alquemist in "Monads and GATs in Nightly Rust"]]></title><description><![CDATA[
<p>I used Scala2 professionally for a few years. Recently picked up Typescript, it has become a very usable Java++ language.</p>
]]></description><pubDate>Fri, 11 Dec 2020 20:51:20 +0000</pubDate><link>https://news.ycombinator.com/item?id=25390812</link><dc:creator>alquemist</dc:creator><comments>https://news.ycombinator.com/item?id=25390812</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=25390812</guid></item></channel></rss>