TE
TechEcho
Home24h TopNewestBestAskShowJobs
GitHubTwitter
Home

TechEcho

A tech news platform built with Next.js, providing global tech news and discussions.

GitHubTwitter

Home

HomeNewestBestAskShowJobs

Resources

HackerNews APIOriginal HackerNewsNext.js

© 2025 TechEcho. All rights reserved.

Spec-ulation – Rich Hickey [video]

283 pointsby Moocarover 8 years ago

13 comments

programnatureover 8 years ago
This is a very thick talk, one Rich&#x27;s best ever IMHO.<p>The first point is how we talk about &#x27;change&#x27; in software, to center around what things &#x27;provide&#x27; and &#x27;require&#x27;.<p>Breaking changes are changes that cause code to require more or provide less. Never do that, never need to do that. Good changes are in the realm of providing more or requiring less.<p>There is a detailed discussion about the different &#x27;levels&#x27; - from functions, to packages, artifacts, and runtimes, which he views as multiple instances of the same problem. Even though we now have spec, theres a lot of work to leverage it across all those different layers to make specific statements about what is provided and required.
评论 #13095525 未加载
评论 #13095343 未加载
DEADB17over 8 years ago
I don&#x27;t understand why he says semantic versioning does not work. In my experience (with NPM, not maven) it is very useful, adding meaning of intent by convention:<p>Given a version number MAJOR.MINOR.PATCH, increment the: MAJOR version when you make incompatible API changes, MINOR version when you add functionality in a backwards-compatible manner, and PATCH version when you make backwards-compatible bug fixes.<p>I got the impression that the issue was maven not being able to handle multiple versions of the same package&#x2F;artifact, not in the convention.
评论 #13093836 未加载
评论 #13095086 未加载
评论 #13093705 未加载
gniquilover 8 years ago
Haven&#x27;t watched through the entire video, but the first part, analyzing dependency bottom up, and claiming version doesn&#x27;t work, really reminds me of graphql. We&#x27;ve been doing traditional rest with &#x2F;v1&#x2F;..., &#x2F;v2&#x2F;.... This sucks for so many different ways. Graphql&#x27;s solution of providing contract at the lowest level and just evolve the &quot;graph&quot; really feels a bit like what he was talking about in this video. And note that Facebook by not &quot;provide less&quot; or &quot;require more&quot; in their API is how they made their API still compatible with older clients. This talk is very interesting! (note I could be spewing BS here as I&#x27;ve not finished the video)
评论 #13093424 未加载
anonfunctionover 8 years ago
Rich Hickey gave one of my favorite talks that I recommend to all programmers no matter which language they code in:<p><a href="https:&#x2F;&#x2F;www.infoq.com&#x2F;presentations&#x2F;Simple-Made-Easy" rel="nofollow">https:&#x2F;&#x2F;www.infoq.com&#x2F;presentations&#x2F;Simple-Made-Easy</a>
taericover 8 years ago
The whole section on &quot;just change the name&quot; fits interestingly in with the way that the kernel is developed. They have been rather strict on this for a long time. A function released to the wild stays. Changes to it require a new function.
评论 #13093597 未加载
评论 #13096659 未加载
tbatchelliover 8 years ago
This is a worthwhile talk, albeit a bit too long. In this talk RH provides a framework to think about libraries, how they change over time and how we should be communicating those changes. He proposes a way forward in which the changes are communicated in a way that can be dealt with programmatically, a much better framework than versioning schemes (semver gets a beating in this talk!).
评论 #13092397 未加载
atemerevover 8 years ago
I can&#x27;t get any useful information from videos, it is so slowwwww. Even on 2x (the fastest I can watch), it is still 3 to 5 times slower than I read. Also, I can control my reading, skip the minutiae, or reread important parts or look up some reference — but I can&#x27;t do that with videos or audiobooks or podcasts. I wonder how people even find it convenient.<p>Unfortunately, Rich Hickey really loves videos for some reason, so everything he says is lost to me.<p>(Yes, there are transcripts, but those are linear and unstructured.)
评论 #13095166 未加载
qwtelover 8 years ago
I&#x27;ve revisited this post so many times, I know the number by now: <a href="http:&#x2F;&#x2F;hintjens.com&#x2F;blog:85" rel="nofollow">http:&#x2F;&#x2F;hintjens.com&#x2F;blog:85</a>, &quot;The End of Software Versions&quot;. I think it is related to, and similar to what Rich is saying.
j-pbover 8 years ago
&gt; Logic systems don&#x27;t have &quot;And nothing else will ever be true!&quot;.<p>Uuh. Closed world assumption? Everything that is not true is false. Most logic systems do have this. Prologs (not a logic system I know) cut operator even turns this statement into an operation.<p>I feel like Rich really gets it wrong this time. His request to support all the abominations that you have ever written and keep them compatible with recent changes, might work if you have people pay for using your library and a company behind it. But doesn&#x27;t fly if you maintain these things out of goodwill in your anyhow limited spare time.<p>The best example of this style going horribly wrong are the linux kernel file system modules. Different api versions all in use at the same time by the same code with no clear documentation on what to use when.<p>It&#x27;s also ironic that the examples he uses to make his point namely, Unix APIs, Java and HTML, are horrible to work with especially because they either never developed good API&#x27;s (looking at you unix poll), or they, like browsers, have become so bloated that nobody want to touch them with a ten foot pole. One of the reasons why it takes so long for browser standards to be adopted is that they have to be integrated with all the cruft that is accumulating there for almost three decades now.<p>&quot;Man browsers are so reliable and bug free and it&#x27;s great that the new standards like flexbox get widespread adoption quickly, but I just wish the website I made for my dog in 1992 was supported better.&quot; -no one ever.<p>Combinatorial complexity is not your friend.<p>I&#x27;d rather have people throw away stuff in a new major release, maybe give me some time to update like sqlite or python do, and then have me migrate to a new system where they have less maintenance cost and I profit from more consistency and reliability.<p>I think that Joe Armstrong has a better take on this. <a href="https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=lKXe3HUG2l4" rel="nofollow">https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=lKXe3HUG2l4</a><p>Also even though I&#x27;m a fulltime Clojure dev, I would take Elms semantic versioning that is guaranteed through static type analysis anytime over spec&#x27;s &quot;we probably grew it in a consistent way&quot; handwaving.
评论 #13093098 未加载
评论 #13094607 未加载
评论 #13094925 未加载
oztenover 8 years ago
As I understand it, one of the original problems Go was designed to solve was long compile times at Google.<p>This talk is fascinating and points out a possible solution space for real world problems in giant codebases and build infrastructures.<p>What if 80% of your dependency graph can be identified as dead code paths at build time and not require you to actually take dependencies on all that dead code?
评论 #13092406 未加载
eternalbanover 8 years ago
I was surprised by this. (Rich is rigorously perceptive and characteristically peels conflations apart.) Here, he seems to be conflating <i>linker</i> responsibilities with <i>(unit-module) dependency management</i> concerns.<p>If deployment-unit-A depends on du-B, but system-language level dependencies have additional subtleties, then that is fine, since someone like RH could be looking into code stripping of unreachable&#x2F;dead-code on linking, and I&#x27;d be completely surprised if that hasn&#x27;t been already looked at extensively to date.<p>Yes, you would sacrifice some transfer bandwidth&#x2F;time on artifact acquisition but keep conceptual models local and their implementations simpler. Or, looking at it from another point of view, OP should consider that a &#x27;dependency&#x27; is maximally the provider of objects in context of its namespace.
greenyouseover 8 years ago
When I was listening to the part about breakage vs accretion, I kept thinking back to the Nix pkg manager from NixOS. It does a pretty good job of separating out the artifacts by indexing them by version number and a hash of the username (i.e. artifact-name = sha($user) + $project-name + $semver). There have to be other examples of pkg managers that do this kind of thing too...
sgentleover 8 years ago
I think there is a missing piece to this conversation, which is about the definition of namespaces. It&#x27;s easy to conflate &quot;problems with semver&quot; and &quot;problems with semver+the way my package manager handles versioning&quot;.<p>In npm, or with any package manager that allows multiple independent versions to coexist, the <i>version becomes part of the namespace</i>. Multiple different versions of a package can be installed at the same time and referenced from each other. It&#x27;s no problem if you depend on B1.0 and C1.0, and they depend on D1.0 and D2.0 respectively; you just get all four installed.<p>In Rich Hickey&#x27;s vision, we would move the compatibility contract into the package name, so if we want to make a new version 2 of helloworld that does not obey the contract of version 1, we call it helloworld2. In practical terms, this is no different from the above, it&#x27;s just that we add the version number to the namespace through the package name rather than the package version.<p>Not surprisingly, this latter strategy is already used by most systems where versions aren&#x27;t part of the namespace. Debian has python2 and python3. Python has urllib and urllib2 (and urllib3). Unix has mmap and mmap2. It works fine, but it&#x27;s a bit of a hack.<p>If your version is part of the package namespace, semver works fine and solves the problem it was intended to solve. If, like in Java, every version has to share the same name, then I agree that semver doesn&#x27;t really buy you that much. After all, it doesn&#x27;t help you much to know that your unresolvable dependency tree is semantic.<p>It&#x27;s not a coincidence that npm handles transitive dependencies in the way it does; it&#x27;s the whole point. I&#x27;m sure it makes npm much more unwieldy to allow multiple different package versions, but having used it it is exactly one of those &quot;solves a problem you didn&#x27;t realise you had&quot; moments.<p>With that said, I definitely agree that more careful API design would allow far fewer backwards-incompatible (ie semver-major) changes, and more tightly defining compatibility (like with this requires&#x2F;provides concept) is a good way to do that. Many web APIs already say things like &quot;we will return an object with at least these fields, and maybe more if we feel like it&quot;, which I think is a good example to follow.<p>As far as changing package names, there&#x27;s also an interesting question, not about how computers deal with those package names, but how we do. After all, why helloworld and helloworld2? Why not give it another name entirely? Part of that is because you want to make the connection between these two packages explicit. But if you change your package dramatically, perhaps that connection is not doing a service to your users.<p>One of the biggest complaints about major rewrites is &quot;why does it have to be the new way? I liked it the old way!&quot; If you genuinely believe the new way is better, why not let it compete on an even playing field under its own name? (And, if you know your new package can&#x27;t compete without backwards compatibility, maybe don&#x27;t make a new package.)