|
| armchairhacker wrote:
| Counterpoint: some types of software aren't meant to last long.
| Even if it still builds and can be worked on later, the usecase
| itself may have changed or disappeared, or someone has probably
| come up with a new better version, so that it's no longer worth
| it to continue.
|
| This probably doesn't apply to many types of software over 6
| months, but in a couple years or a couple decades. Some online
| services like CI or package managers will almost certainly
| provide backwards-compatible service until then.
|
| Another possibility is that developer efficiency improves so much
| that the code written 10 years ago is easier to completely
| rewrite today, than it is to maintain and extend.
|
| This is why I'm hesitant to think about software lasting decades,
| because tech changes so fast it's hard to know what the next
| decade will look like. My hope is that in a few years, LLMs
| and/or better developer tools will make code more flexible, so
| that it's very easy to upgrade legacy code and fix imperfect
| code.
| iamthepieman wrote:
| "Another possibility is that developer efficiency improves so
| much that the code written 10 years ago is easier to completely
| rewrite today, than it is to maintain and extend."
|
| This seems completely false to me and I'm curious what has
| caused you to believe this as I'm a fairly imaginative and
| creative person yet I cannot imagine a set of circumstance that
| would lead someone to this conclusion.
|
| In other words, I disagree so very strongly with that statement
| that I wanted to engage rather than just downvote. (I didn't
| btw).
|
| I agree with your first statement though and I don't think the
| op is saying only make cold-blooded projects.
| dartos wrote:
| Well. I don't know if I agree or not, but felt like playing
| devils advocate.
|
| take the example of game development. Trying to maintain,
| say, the hobbit game from the early 2000s to today would
| almost certainly take more work than just making a new one
| from scratch today (GPUs have changed drastically over the
| past 20 years and making simple 3d platformers with unreal is
| so easy, "asset flips" are a new kind of scam)
|
| Or a tool which lets people visually communicate over vast
| distances without specialized hardware.
|
| That was a huge lift in the 2000s when Skype was the only
| major player, but you can find tutorials for it now using
| webrtc.
| languagehacker wrote:
| Cold-blooded software seems like a great idea in spaces where the
| security risk and business impact are low. I can think of a lot
| of great hobbyist uses for this approach, like a handmade
| appliance with Arduino or Raspberry Pi.
|
| The ever-evolving threat landscape at both the OS and application
| level makes this unviable for projects with any amount of money
| or sensitivity behind them. Imagine needing to handle an OS-level
| update and learning that you can no longer run Python 2 on the
| box you're running that project on. Fine for a blog, but
| calamitous for anything that handles financial transactions.
| kardianos wrote:
| If you are a bank, a store, or handle PHI, you will have
| contractual obligations to maintain it. However, I still think
| that can be "cold-blooded" maintenance. When I update a Go
| project after running `govulncheck ./...`, it is generally
| easy. I vendor; builds and runtime only rely on systems I
| control.
| apantel wrote:
| Many large companies and business like banks and
| manufacturers run legacy code in ancient runtimes. The
| projects can be so frozen in time that nobody has the courage
| to touch them.
| joshuaissac wrote:
| > Cold-blooded software seems like a great idea in spaces where
| the security risk and business impact are low. I can think of a
| lot of great hobbyist uses for this approach, like a handmade
| appliance with Arduino or Raspberry Pi.
|
| I think it would be the other way around. A low-impact hobby
| project can use exciting, fast-moving technology because if it
| breaks, there is not so much damage (move fast and break
| things). But something with high business impact should use
| boring, tried-and-tested technologies no external network
| dependencies (e.g. a package being available in a third-party
| repository at compile time or runtime). For something like
| that, the OS updates (on the LTS branch if Linux) would be
| planned well ahead, and there would be no surprises like the
| Python 2 interpreter suddenly breaking.
| chuckadams wrote:
| Meh, just keep a container around with py2 in it, maybe just
| containerize the whole app. The ultimate in vendored
| dependencies, short of a whole VM image.
| 082349872349872 wrote:
| I suspect our differences in preferences for cold- vs warm-
| blooded projects may be related to the "Buxton Index" as
| mentioned in
| https://www.cs.utexas.edu/users/EWD/transcriptions/EWD11xx/E...
| chrisweekly wrote:
| Curious, I read the linked transcript to find:
|
| "My third remark introduces you to the Buxton Index, so named
| after its inventor, Professor John Buxton, at the time at
| Warwick University. The Buxton Index of an entity, i.e. person
| or organization, is defined as the length of the period,
| measured in years, over which the entity makes its plans. For
| the little grocery shop around the corner it is about 1/2,for
| the true Christian it is infinity, and for most other entities
| it is in between: about 4 for the average politician who aims
| at his re-election, slightly more for most industries, but much
| less for the managers who have to write quarterly reports. The
| Buxton Index is an important concept because close co-operation
| between entities with very different Buxton Indices invariably
| fails and leads to moral complaints about the partner. The
| party with the smaller Buxton Index is accused of being
| superficial and short-sighted, while the party with the larger
| Buxton Index is accused of neglect of duty, of backing out of
| its responsibility, of freewheeling, etc.. In addition, each
| party accuses the other one of being stupid. The great
| advantage of the Buxton Index is that, as a simple numerical
| notion, it is morally neutral and lifts the difference above
| the plane of moral concerns. The Buxton Index is important to
| bear in mind when considering academic/industrial co-
| operation."
| salawat wrote:
| Holy shit. I am so using this as a communication clarifying
| tool. Nice concept.
| apantel wrote:
| Great concept, but isn't it just "time horizon"? Everyone
| knows "time horizon".
| Jtsummers wrote:
| Not everyone knows it, strangely, many of the (senior or
| junior) project management-types I work with have to be
| introduced to the term and concept (and if they listen it
| can at least resolve confusion, if not conflict, about the
| different priorities and behaviors of all the parties
| involved). But yes, they describe the same thing.
| jollyllama wrote:
| This is why I am trying to switch as many projects I'm on as
| possible to HTMX. The churn involved with all of the frontend
| frameworks means that there's far too much update work needed
| after letting a project sit for N quarters.
| mikewarot wrote:
| I googled HTMX, all excited that maybe, just maybe, the browser
| people got their shit together and came up with a framework we
| can all live with, something native to the browser with a few
| new tags, and no other batteries required....
|
| and was disappointed to find it's just a pile of other
| libraries 8(
| dartos wrote:
| Everything is a pile of libraries.
|
| It's a pile of someone else's code all the way down.
| diggan wrote:
| You can also use the web platform straight up without
| transpilation, build tools, post-css compilation and all
| that jazz.
|
| Just vanilla JavaScript, CSS, HTML, some sprinkles of
| WebComponents. And you can be pretty sure that you won't
| have to update that for a decade or more, as compatibility
| won't be broken in browsers.
|
| Heck, I have vanilla JS projects I wrote 15 years ago that
| still render and work exactly like how they rendered/worked
| when I wrote them.
| jollyllama wrote:
| Indeed, that baggage is all that I avoid by using HTMX.
| diggan wrote:
| You do you. It's worth knowing though that using HTMX is
| not vanilla JS/HTML/CSS, it's literally the opposite of
| that.
| kugelblitz wrote:
| It's one small dependency. Worst case, you write the
| library yourself.
|
| You send a request to the backend, it then sends you HTML
| back (all rendered in the backend using a templating
| language such as Django templating engine, Twig or
| Liquid), you insert it into a div or so.
|
| Htmx was Intercooler, worst case you create your own. But
| no additional scripts needed.
|
| I've been able to kick out Vue out because Htmx covers my
| use case.
| replwoacause wrote:
| Nothing to be disappointed in here AFAICT, however, it's
| shocking that you had to Google HTMX, seeing as it shows up
| on HN a few times a month at least.
| diggan wrote:
| I'm guessing the disappointing feeling come from parent
| saying "Pff, I'm so tired of all these libraries that
| eventually update their APIs in a breaking way, so now I'm
| using X" while X is just another library exactly like all
| the rest, and will surely introduce a breaking change or
| two down the line.
| jollyllama wrote:
| You're arguing from the abstract point of view, rather
| than the practical. The point is that it takes an order
| of magnitude more time to clone, say, a Vue project from
| three years ago that nobody has touched since then and
| try to download your dependencies and build on a new
| machine, as compared to an HTMX project.
| ryanar wrote:
| I really appreciate this idea after rewriting my blog engine
| three times because the frameworks I was using (Next, Remix) had
| fundamental changes after a year and I was multiple major
| versions behind. Though it depends on what you are after. If the
| goal is to be able to blog, time spent upgrading and rewriting
| code because the framework is evolving is wasted time unless you
| want to stay up to date with that framework. Think about how we
| view physical goods today, they aren't built to last. In certain
| situations, like a personal blog, you want reliable software that
| works for years without the need to change. It also helps to have
| software that uses common data formats that are exportable to
| another system, like a blog based in markdown files, rather than
| JSX.
| layer8 wrote:
| I'm glad this isn't about ruthless software.
| vrnvu wrote:
| one thing I've noticed is that many engineers, when they're
| looking for a library on Github, they check the last commit time.
| They think that the more recent the last commit is, the better
| supported the library is.
|
| But what about an archived project that does exactly what you
| need it to do, has 0 bugs, and has been stable for years? That's
| like finding a hidden gem in a thrift store!
|
| Most engineers I see nowadays will automatically discard a
| library that is not "constantly" updated... Implying it's a good
| thing :)
| pmichaud wrote:
| Even though it's not strictly true, checking for recent updates
| is an excellent heuristic. I don't know the real numbers, but I
| feel confident that in the overwhelming majority of cases, no
| recent activity means "abandoned", not "complete and bug free".
| scruple wrote:
| I'm generally doing that to check for version compatibility
| across a much broader spectrum than the level of a single
| library.
| fabian2k wrote:
| A library can only stay static if the environment it's used in
| is also static. And many of the environments in which modern
| software is developed are anything but static, web frontends
| are one example where things change quite often.
|
| A library that can stand entirely on its own might be fine if
| it's never updated. But e.g. a library that depends on a web
| frontend framework will cause trouble if it is not updated to
| adapt to changes in the ecosystem.
| adonovan wrote:
| Also, even a very stable project that is "done" will receive
| a trickle of minor tweak PRs (often docs, tests, and
| cleanups) proportional to the number of its users, so the
| rate of change never falls to zero until the code stops being
| useful.
| diggan wrote:
| > so the rate of change never falls to zero until the code
| stops being useful
|
| Non-useful software changes all the time ;) Also, Useful
| software stands still all the time, without any proposed
| changes.
| derefr wrote:
| I think this is also in inverse proportion to the arcane-
| ness of the intended use of the code, though.
|
| Your average MVC web framework gets tons of these minor
| contributors, because it's easy to understand MVC well
| enough to write docs or tests for it, or to clean up the
| code in a way that doesn't break it.
|
| Your average piece of system software gets some. The Linux
| kernel gets a few.
|
| But ain't nobody's submitting docs/tests/cleanups for an
| encryption or hashing algorithm implementation. (In fact,
| AFAICT, these are often implemented _exactly once_ , as a
| reference implementation that does things in the same weird
| way -- using procedural abstract assembler-like code, or
| transpiled functional code, or whatever -- that the journal
| paper describing the algorithm did; and then not a hair of
| that code is ever touched again. Not to introduce comments;
| not to make the code more testable; _definitely_ not to
| refactor things. Nobody ever reads the paper except the
| original implementor, so nobody ever truly understands what
| parts of the code are critical to its functioning /
| hardening against various attacks, so nobody can make real
| improvements. So it just sits there.)
| josephg wrote:
| I disagree. Tiny libraries can be fine indefinitely. For
| example this little library which inverts a promise in
| JavaScript.
|
| I haven't touched this in years and it still works fine. I
| could come in and update the version of the dependencies
| but I don't need to, and that's a good thing.
|
| https://github.com/josephg/resolvable
| xmprt wrote:
| I think total number of commits is probably a good metric
| too. If the project only has 7 commits to begin with then
| it's unlikely to get any more updates after it's "done".
| But a 10 year old project with 1000 commits where the
| last commit was 3 years ago is a little more worrying.
| zer00eyz wrote:
| >> web frontends are one example where things change quite
| often.
|
| There is a world of difference between linux adding USB
| support and how web front ends have evolved. One of them
| feels like they are chasing the latest shiny object...
| xmprt wrote:
| As someone who migrated a somewhat old project to one which
| uses a newer framework, I agree with this. The amount of time
| I spent trying to figure out why and old module was broken
| before realizing that one of it's dependencies was using ESM
| even though it was still using CJS... I don't even want to
| think about it. Better to just make sure that a module was
| written or updated within the last 3 years because that will
| almost certainly work.
| tedunangst wrote:
| This is a very strange example. Browsers have fantastic
| backwards compatibility. You can use the same libraries and
| framework you used ten years ago to make a site and, with
| very few exceptions, it will work perfectly fine in a modern
| browser.
| kazinator wrote:
| The problem arises when you're not using old libraries and
| frameworks. You're using new stuff, and come across an old,
| unmaintained library you'd like to use.
|
| Hey, it uses the same frameworks you're using --- except,
| oh, ten years ago.
|
| Before you can use it, you have to get it working with the
| versions of those frameworks you're using today.
|
| Someone did that already before you. They sent their patch
| to the dead project, but didn't get a reply, so nobody
| knows about it.
| hiatus wrote:
| You absolutely can do that, but it is likely the final
| output will have numerous exploitable vulnerabilities.
| crabmusket wrote:
| Browsers themselves aren't usually the problem. While
| sometimes they make changes, like what APIs are available
| without HTTPS, I think you're right about their solid
| backwards compatibility.
|
| What people really mean when they talk about the frontend
| is the build system that gets your (modern, TypeScript)
| source code into (potentially Safari) browsers.
|
| Chrome is highly backwards compatible. Webpack, not so
| much. This build system churn goes hand-in-hand with
| framework churn (e.g. Vue 2 to 3, while the team have put
| heaps of effort into backwards compatibility, is not
| automatic), and more recently, the rise of TypeScript, and
| the way the CJS to ESM transition has been handled by tools
| (especially Node).
| LeifCarrotson wrote:
| Even if the environment it's used in is not static, the world
| it lives in is not static.
|
| I work in industrial automation, which is a slow-moving
| behemoth full of $20M equipment that get commissioned once
| and then run for decades. There's a lot of it still
| controlled with Windows 98 PCs and VB6 messes and PXI cards
| from the 90s, even more that uses SLC500 PLCs.
|
| But when retrofitting these machines or building new ones,
| I'll still consider the newness of a tool or library. Modern
| technology is often lots more performant, and manufacturers
| typically support products for date-on-market plus 10 years.
|
| There's definitely something to be said for sticking with
| known good products, but even in static environments you may
| want something new-ish.
| hiAndrewQuinn wrote:
| The Haskell community has a lot of these kinds of libraries. It
| comes with the territory to some extent.
| samus wrote:
| The GHC project churns out changes at a quite high rate
| though. The changes are quite small by themselves, but they
| add up and an abandoned Haskell project is unlikely to be
| compilable years later.
| diggan wrote:
| I remember seeing a bunch of graphs which showed how
| programming languages have changed over time, and how much of
| the original code is still there.
|
| It showed that some languages were basically nothing like the
| 1.0 versions, while others had retained most of the code
| written and only stuff on top.
|
| In the end, it seems to also be reflected in the community and
| ecosystem. I remember Clojure being close/at the top of the
| list as the language hardly does breaking changes anymore, so
| libraries that last changed 5 years ago, still run perfectly
| well in the current version of the language.
|
| I guess it helps that it's lisp-like as you can extend the core
| of the language without changing it upstream, which of course
| also comes with its own warts.
|
| But one great change it did to me, is stop thinking that
| "freshness" equals "greatness". It's probably more common I use
| libraries today that basically stopped changed since some years
| ago, than I use libraries that were created in the last year.
| And without major issues.
| Uehreka wrote:
| By zero bugs do you mean zero GitHub issues? Because zero
| GitHub issues could mean that there are security
| vulnerabilities but no one is reporting them because the
| project is marked as abandoned.
| diggan wrote:
| > By zero bugs do you mean zero GitHub issues?
|
| Or, the library just have zero bugs. It's possible, although
| probably pretty uncommon :)
| bratbag wrote:
| Most engineers have probably been bitten in the ass by
| versioned dependencies conflicting with each other.
| wccrawford wrote:
| And the other way, too, with the underlying language's
| changes making the library stop working.
|
| It's just really unlikely that a project stays working
| without somewhat-frequent updates.
| troupe wrote:
| If you are asking yourself, "will this do what it says it will
| do?" and you are comparing a project that hasn't had any
| updates in the last 3 years vs one that has seen a constant
| stream of updates over the last 3 years, which one do you think
| has a greater probability of doing what it needs to do?
|
| Now I do get your point. There is probably a better metric to
| use. Like for example, how many people are adding this library
| to their project and not removing it. But if you don't have
| that, the number of recent updates to a project that has been
| around for a long time is probably going to steer you in the
| right direction more often than not.
| pizzafeelsright wrote:
| Good point. I have also seen Great Endeavor 0.7.1 stay there
| because the author gave up or graduated or got hired and the
| repo sits incomplete, lacking love and explanation for
| dismissal.
| duped wrote:
| > But what about an archived project that does exactly what you
| need it to do, has 0 bugs, and has been stable for years?
| That's like finding a hidden gem in a thrift store!
|
| Either the library is so trivial to implement myself that I
| just do that anyway, which doesn't have issues w.r.t
| maintenance or licensing, or it's unmaintained and there are
| bugs that won't be fixed because it's unmaintained and now I
| need to fork and fix it, taking on a legal burden with
| licensing in addition to maintenance.
|
| Bugs happen all the time for mundane reasons. A transitive
| dependency updated and now an API has a breaking change but the
| upstream has security fixes. Compilers updated and now a weird
| combination of preprocessor flags causes a build failure. And
| so on.
|
| The idea that a piece of software that works today will work
| tomorrow is a myth for anything non-trivial, which is why
| checking the history is a useful smell test.
| QuadmasterXLII wrote:
| I submit math.JS and numeric.JS. Math.JS has an incredibly
| active community and all sorts of commits numeric. JS is one
| file of JavaScript and hasn't had an update in eight years if
| you want to multiply 2 30 by 30 matrices, numeric.JS works
| just fine in 2023 and is literally 20 times faster.
| derefr wrote:
| Consider an at-the-time novel hashing algorithm, e.g. Keccak.
|
| * It's decidedly non-trivial -- you'd have to 1. be a
| mathematician/cryptographer, and then 2. read the paper
| describing the algorithm and _really_ understand it, before
| you could implement it.
|
| * But also, it's usually just one file with a few hundred
| lines of C that just manipulates stack variables to turn a
| block of memory into another block of memory. Nothing that
| changes with new versions of the language. Nothing that rots.
| Uses so few language features it would have compiled the same
| 40 years ago.
|
| Someone writes such code once; nobody ever modifies it again.
| No bugs, unless they're bugs in the algorithm described by
| the paper. Almost all libraries in HLLs are FFI wrappers for
| the same one core low-level reference implementation.
| duped wrote:
| In practice, this code will use a variety of target-
| specific optimizations or compiler intrinsics blocked
| behind #ifdefs that need to be periodically updated or
| added for new targets and toolchains. If it refers to any
| kind of OS-specific APIs (like RNG) then it will also need
| to be updated from time to time as those APIs change.
|
| That's not to say that code can't change slowly, just the
| idea that it _never_ changes is extremely rare in practice.
| tedunangst wrote:
| Keccak is perhaps not the best example to pick.
| https://mouha.be/sha-3-buffer-overflow/
| derefr wrote:
| Depends on the language.
|
| Some languages have releases every year or two where they will
| introduce some new, elegant syntax (or maybe a new stdlib ADT,
| etc) to replace some pattern that was frequent yet clumsy in
| code written in that language. The developer communities for
| these languages then usually pretty-much-instantly consider use
| of the new syntax to be "idiomatic", and any code that still
| does things the old, clumsy way to need fixing.
|
| The argument for making the change to any particular codebase
| is often that, relative to the new syntax, the old approach
| makes things more opaque and harder to maintain / code-review.
| If the new syntax existed from the start, nobody would think
| the old approach was good code. So, _for the sake of legibility
| to new developers, and to lower the barrier to entry to code
| contributions_ , the code should be updated to use the new
| syntax.
|
| If a library is implemented in such a language, and yet it
| hasn't been updated in 3+ years, that's often a bad sign -- a
| sign that the developer isn't "plugged into" the language's
| community enough to keep the library up-to-date as idiomatic
| code that other developers (many of whom might have just
| learned the language in its latest form from a modern resource)
| can easily read. And therefore that the developer maybe isn't
| _interested_ in receiving external PRs.
| NanoYohaneTSU wrote:
| I'm sort of confused on where your comment is coming from. In
| the modern world (2023 in case your calendar is stuck in the
| 90s) we have a massive system of APIs and services that get
| changed all the time internally.
|
| If a library is not constantly updated then there is a high
| likely hood (99%) that it just won't work. Many issues raised
| in git are that something changed and now the package is
| broken. That's reality sis.
| bee_rider wrote:
| Are you suggesting that all we need to do is use 30 year old
| languages to free ourselves from this treadmill? That seems
| like an easy choice!
| RhodesianHunter wrote:
| That's only true for libraries with zero transitive
| dependencies.
|
| Otherwise you're almost guaranteed to be pulling in un-patched
| vulnerabilities.
| kageiit wrote:
| For many use cases, cold-blooded software is not viable. We need
| better tools to automate and remove the tedium involved in
| upgrading dependencies or modernizing codebases to protect
| against ever evolving threats and adapt to changes in the
| ecosystem
| tlhunter wrote:
| I love the sentiment of this post. I absolutely hate that my
| recent mobile apps from only a couple years ago l now require a
| dozen hours to patch them up and submit updates.
|
| The author's final point is interesting wherein they refer to
| their own static site generator as being cold-blooded and that it
| runs on Python 2. Python 2 is getting harder to install recently
| and will eventually make it a warm blooded project.
| ryandrake wrote:
| I have a little hobby project (iOS and macOS) that I don't
| regularly develop anymore, but I use it quite often as a user,
| and I like to keep it compiling and running on the latest OSes.
| It's aggravating (and should be totally unacceptable) that
| every time I upgrade Xcode, I have a few odds and ends that
| need to be fixed in order for the project to compile cleanly
| and work. My recent git history comments are _all_ variations
| of "Get project working on latest Xcode".
|
| I could almost understand if these underlying SDK and OS
| changes had to be made due to security threats, but that's
| almost never the case. It's just stupid things like deprecating
| this API and adding that warning by default and "oh, now you
| need to use this framework instead of that one". Platforms and
| frameworks need to stop deliberately being moving targets,
| especially operating systems that are now very stable and
| reliable.
|
| I should be able to pull a 10 year old project out of the
| freezer and have it compile cleanly and run just as it ran 10
| years ago. These OS vendors are trillion dollar companies. I
| don't want to hear excuses about boo hoo how much engineering
| effort backward compatibility is.
| dartos wrote:
| Hardware changes over 10 years.
|
| Macs don't even run on the same CPU architecture or support
| OpenGL.
|
| Sometimes things just need to change.
| beambot wrote:
| The worst is when your virtualization environments intended
| to provide long-term support don't even accomodate the
| "new" mainline hardware. Most frustrating example:
| Virtualbox doesn't work on Apple M1 or M2 chipsets.
| angra_mainyu wrote:
| Apple is notoriously bad when it comes to this.
|
| I used to work on a cross-platform product and Windows was
| relatively stable across versions, as was Linux.
|
| Macs on the other hand required a lot of branching for each
| version.
| sowbug wrote:
| A link to this article would be an effective curt reply to the
| "is this project dead?" GitHub issues that have been known to
| enrage and discourage cold-blooded project owners.
| bee_rider wrote:
| I wonder if GitHub is a bad fit for cold blooded projects? It
| has social media elements, I'd expect lots of extra chatter and
| "engagement."
| coreyp_1 wrote:
| This. This, so very much!
|
| I built my websites on Drupal 7 and have enjoyed a decade of
| stability. Now, with D7 approaching EOL in 1 year, I'm looking
| for a solution that will last another decade. There's no reason
| for the EOL, either, other than people wanting to force everyone
| to move on to a newer version. It undoubtedly means more business
| for some people, as they will be able to reach out to their
| clients and say, "Your website is about to be a security risk, so
| you have to pay to update it!" Unfortunately, it means more work
| for me to support my personal projects.
|
| And why? Because someone somewhere has decided that I should move
| on to something newer and more exciting. But I don't want new and
| exciting... I want rock solid!
|
| I'm on vacation this week. Am I learning a new hot language like
| Rust, Zig, Go, etc.?
|
| Nope.
|
| I have no desire to. I don't trust them to be the same in a
| decade, anyway.
|
| I'm focusing on C. It's far more enjoyable, and it's stable.
| dartos wrote:
| Enjoyable is subjective. I can't think of anything less
| enjoyable than hunting for segfaults in C.
|
| I'd call Go pretty rock solid at this point. Modern go vs
| decade old go isn't very different. Maybe just the packages
| tools had 1 major changed.
|
| You'd get the same thing in C if your hardware significantly
| changes in the 10 years too.
| coreyp_1 wrote:
| Haha... I agree about it being subjective! I find that I
| enjoy the process as much as the result. It's like bringing
| order to a chaotic universe. :)
|
| The thing is, I don't have many segfaults in C, and I find C
| much easier to debug and hunt down issues in than even C++
| (which I also enjoy). Also, because C uses very little
| "magic", and I also know exactly what I'm getting with my
| code, I find it much easier to reason about.
|
| I heard a quote the other day while watching a presentation
| "When you're young you want results, when you're old you want
| control." I think I'm on the old side now.
|
| As for Go, I genuinely don't have anything against it, but I
| don't see why I need it either. I don't doubt that others
| have stellar use cases and impressive results with Go, and
| that's fine, too, but I don't sense any lack which prompts me
| to investigate further. I would love to learn more about it,
| but most of what I see online is either over-the-top (and
| therefore vomit-inducing) fanboyism, or otherwise
| unspectacular, which makes me ask "why bother?"
| flir wrote:
| https://backdropcms.org/ ? D7 fork. If you want to stay there.
| hiAndrewQuinn wrote:
| Most of the software I write is at least somewhat cold-blooded by
| this definition. My program to find the dictionary forms of
| Finnish words is an _okay_ example:
|
| https://github.com/hiAndrewQuinn/finstem
|
| I wrote the initial draft in an afternoon almost a year ago, and
| from then on endeavored to only make changes which I know play
| nicely with my local software ecology. I usually have `fzf`
| installed, so an interactive mode comes as a shell script. I
| usually have `csvkit`, `jq`, and if all else fails `awk`
| installed, so my last major update was to include flags for CSV,
| JSON, and TSV output respectively. Etc, etc.
|
| The build instructions intentionally eschew anything like Poetry
| and just gives you the shell commands I would run on a fresh
| Ubuntu VirtualBox VM. I hand test it every couple of months in
| this environment. If the need to Dockerize it ever arose I'm sure
| it would be straightforward, in part because the shell commands
| themselves are straightforward.
|
| I don't call it a great example because the CLI library I use
| could potentially change. Still, I've endeavored to stick to only
| relatively mature offerings.
| csdvrx wrote:
| I follow a similar approach but maybe more extreme : whenever
| possible, I use "YESTERDAY'S TECHNOLOGY TOMORROW"
|
| It's nicely presented on
| http://itre.cis.upenn.edu/~myl/languagelog/archives/000606.h...
|
| > I want yesterday's technology tomorrow. I want old things that
| have stood the test of time and are designed to last so that I
| will still be able to use them tomorrow. I don't want tomorrow's
| untested and bug-ridden ideas for fancy new junk made available
| today because although they're not ready for prime time the
| company has to hustle them out because it's been six months since
| the last big new product announcement. Call me old-fashioned, but
| I want stuff that works.
|
| The same thing is true with free software: I prefer to use the
| terminal. In the terminal, I prefer to run bash and vim, not zsh
| and neovim.
|
| When I write code, I've found C (and perl!) to be preferable,
| because "You can freeze it for a year and then pick it back up
| right where you left off."
|
| There are rare exceptions, when what's new is so much better than
| the previous solution (ex: Wayland) that it makes sense to move.
|
| However, that should be rare, and you should be very sure. If you
| think you made the wrong choice, you can always move back to your
| previous choice: after playing with ZFS for a few years, I'm
| moving some volumes back to NTFS.
|
| Someone mentions how the author choice (python2) is getting
| harder to install. Cold blooded software works best when done
| with multiplatform standards, so I'd suggest the author does the
| bare minimum amount of fixes necessary to run with
| https://cosmo.zip/pub/cosmos/bin/python and call it a day.
|
| With self-contained APEs and the eventual emulator when say 20
| years from now we move to Risc V, you don't have to bother about
| dependencies, updates or other form of breakage: compile once in
| a APE form (statically linked for Windows/Linux/BSD/MacOS) it
| will run forever by piggybacking on the popularity of the once-
| popular platform.
|
| Wine lets you run Windows 95 binaries about 30 years layer: I'd
| bet than Wine + the Windows part of the APE will keep running
| long after the kernel break the ABI.
| slaymaker1907 wrote:
| Besides what is stated in the article, it is also important to
| have an inherently secure threat model. For example, full
| websites are inherently warm-blooded since you are constantly
| dealing with attackers, spam bots, etc. However, static pages
| like Tiddlywiki are a lot better since you can avoid putting it
| on the web at all and browsers are incredibly stable platforms.
| imran-iq wrote:
| Python is a really bad example of cold blooded software. There is
| constant breaking changes with it (both runtime and tooling). So
| much so that the author still has to use python2 which has been
| EOL'd for quite a while.
|
| A much better example would be something like go or java where 10
| year old code still runs fine with their modern tooling. Or an
| even better example, perl, where 30 year old code still runs fine
| to this day
| 082349872349872 wrote:
| 2 and 3 don't really differ that much; true cold-blooded
| software doesn't care which it's being run with.
| JohnFen wrote:
| Agreed. This is one of the reasons why I avoid using Python
| whenever possible. Python code I write today is unlikely to be
| functional years from now, and I consider that a pretty huge
| problem.
| heurist wrote:
| This really depends on your environment. I've been running
| legacy Python servers continuously for 4+ years without
| breaking them or extensively modifying them because I
| invested in the environment and tooling around it (which I
| would do for any app I deploy). I can't say I want to bring
| all of them entirely up to date with dependencies, but
| they're still perfectly functional. Python is pretty great,
| honestly. I rarely need to venture into anything else (for
| the kind of work I do).
| JohnFen wrote:
| > I've been running legacy Python servers continuously for
| 4+ years
|
| That seems like a large amount of effort to make up for a
| large language deficiency. My (heartfelt) kudos to you!
|
| I might have been willing to do the same if I used Python
| heavily (I don't because there are a number of other things
| that makes it very much "not for me") -- but it would still
| represent effort that shouldn't need to be engaged in.
| frizlab wrote:
| Go is not a good example either. Some times ago we tried
| compiling a code a few years after it was made, it did not
| work. Someone who actually knew the language and tooling tried
| and said there was a migration to be done and it was
| complicated. I have not followed the subject up close but in
| the end they just abandoned IIRC.
| blakesley wrote:
| Regarding Python: Really? Obviously v2-to-v3 was an absolute
| fiasco, but since then, it's been great in my personal
| experience.
|
| Don't get me wrong: Python hasn't overcome its tooling problem,
| so there's still that barrier. But once your team agrees on a
| standardized tool set, you should be able to coast A-OK.
| TheNewAndy wrote:
| Depends if you mean python the interpreter or python the
| language. e.g. pypy still supports python2 and has "indefinite
| support" or something along those lines.
|
| Even the cpython2 interpreter is no longer supported by the
| original authors, but that doesn't stop someone else from
| supporting it.
| Aeolun wrote:
| > java where 10 year old code still runs fine with their modern
| tooling
|
| I don't know about you. But even when I try to run 3 year old
| Java code with a new SDK it's always broken _somehow_.
| ahoka wrote:
| Years? After one year, something amongst the hundreds of deps
| will have a horrible security vulnerability and updating
| means breaking changes.
| iqandjoke wrote:
| How about security?
| ganzuul wrote:
| https://en.wikipedia.org/wiki/Unix_philosophy
|
| Seems related. Tools built like this which still need constant
| updating must have a foundation of sand.
| aranchelk wrote:
| In my mind this is a lot more about tooling and platform than
| language, library, architecture, etc.
|
| I have a project that's quite complicated and built on fast-
| moving tech, but with every element of the build locked down and
| committed in SCM: Dockerfiles, package sets, etc.
|
| Alternatively, one of my older projects uses very stable slow-
| moving tech. I never took the time to containerize and codify the
| dependencies. It runs as an appliance and is such a mess that
| it's cheaper to buy duplicates of the original machine that it
| ran on and clone the old hard drive rather than do fresh
| installs.
| blastbking wrote:
| I had this experience making an iOS game. After a few years of
| making the game, I went back to it, and found that I was unable
| to get it to compile. I guess iOS games are very warm blooded.
| Perhaps if I had stuck with a desktop platform or web it would
| have remained fine? Not entirely sure.
| yellow_lead wrote:
| Mobile in general is this way. For instance, on Android, if
| your app isn't targeting a high enough sdk version, Google will
| remove it after some time. If you have to upgrade your target
| sdk, you may find many libraries are broken (or not supported),
| and it also can lead to other cascades of upgrades, like having
| to upgrade gradle or the NDK if you use it.
| petercooper wrote:
| I think Go's backward compatibility promise -
| https://go.dev/blog/compat - would make much Go software 'cold
| blooded' by this definition (so long as you vendor dependencies!)
| aeternum wrote:
| What a terrible name for this. Cold blooded animals are highly
| dependent on their environment whereas the body of warm-blooded
| animals eliminate the dependency on external temperature via
| metabolism.
|
| In any case, it's unnecessarily ambiguous. Why not simply say
| 'software without external dependencies' and eliminate the
| paragraphs of meandering explanation?
| kugelblitz wrote:
| I've been maintaining my own side project. It started 12-13 years
| ago, with vanilla php, later rewritten with Laravel, later
| rewritten again with Symfony in 2017-ish. Since then I've had
| phases from 6-18 months where I had a total of 2-3 tiny commits
| (I was working full time as a freelancer, so I didn't have energy
| to work on my side project). But then when I had time, I would
| focus on it, add features, upgrade and just experiment and learn.
|
| This was super valuable to me to learn how to maintain projects
| long-term: Update dependencies, remove stuff you don't need,
| check for security updates, find chances to simplify (e.g. from
| Vagrant to Docker... or from Vue + Axios + Webpack + other stuff
| to Htmx). And what to avoid... for me it was to avoid freshly
| developed dependencies, microservices, complexified
| infrastructure such as Kubernetes.
|
| And now I just developed a bunch of features, upgraded to PHP 8.2
| and Symfony 7 (released a month ago), integrated some ChatGPT-
| based features and can hopefully relax for 1-3 years if I wanted
| to.
|
| In the last 4-5 years the project has made about the same revenue
| as an average freelance year's revenue, so it's not some dormant
| unknown side project.
| Aeolun wrote:
| I think PHP, as horrible as it feels to go back, is one example
| of something that's truly backwards compatible even to its own
| detriment.
|
| Haven't worked with it for years, went back to find that the
| horrible image manipulation functions are still the same mess
| that I left behind 8 years ago.
| oooyay wrote:
| This got me thinking if any of my side projects or work projects
| that are in maintenance mode could qualify as "cold blooded".
| Conceptually, they can - I have many projects written in Go,
| Typescript, and Python where I could cache my dependencies (or at
| least the SHAs) and do what this is implying. The problem is that
| it stops being useful beyond proving the concept. In reality, all
| my projects have a slow churn that usually has to do with
| vulnerability updates. Maybe more aptly put, "Can I take this Go
| repository off the shelf, rebuild the binary, and let it run?";
| the answer is of course - assuming HTML and web standards haven't
| changed too much. The problem is that then some old vulnerability
| could be immediately used against it. The assumption I also made,
| that HTML and web standards haven't changed too much, will almost
| assuredly be falsey. They may have not have changed enough to be
| breaking, but they'll have certainly changed to some degree; the
| same can be said for anyone that's developed desktop applications
| for any OS. The one constant is change. Either side of that coin
| seems to be a losing proposition.
| __natty__ wrote:
| In the Node & JavaScript ecosystem, there is the web framework
| Express. The current major version 4.x.x branch is over 10 years
| old [1]. And yet it powers so many apps in the ecosystem (over
| 17M downloads every week [2]). It lacks some features and is not
| the most performant [3]. But me and coworkers I talked with, like
| it because it allows for quick, stable development and long-term
| planning without worrying about drastic API changes and lack of
| security patches for older versions. Even better stability is
| provided with Go where we can run over 10-year-old programs
| thanks to a mix of wide stdlib and the promise of compatibility.
| [4]
|
| [1] https://www.npmjs.com/package/express?activeTab=versions
|
| [2] https://www.npmjs.com/package/express
|
| [3] https://fastify.dev/benchmarks/
|
| [4] https://go.dev/doc/go1compat
| ChrisMarshallNY wrote:
| I wrote an SDK, in 1994-95, that was still in use, when I left
| the company, in 2017.
|
| It was a device control interface layer, and was written in
| vanilla ANSI C. Back when I wrote it, there wasn't a common
| linker, so the only way to have a binary interface, was to use
| simple C.
|
| I have written stuff in PHP (5), that still works great, in PHP
| 8.2. Some of that stuff is actually fairly ambitious.
|
| But it's boring, and has a low buzzword index.
| d_burfoot wrote:
| This essay showcased an excellent writing technique: at the
| outset, I had no idea what the title meant. But at the
| conclusion, it made perfect sense.
| js8 wrote:
| I work on IBM mainframe (z/OS). Nothing else I know comes as
| close in maintaining backwards compatibility as IBM. Microsoft
| (Windows) is the 2nd, I think. Linux (kernel) ABI has the 3rd
| place, but that's only a small portion of Linux ecosystem.
|
| Almost everything else, it's just churn. In OSS this is common, I
| guess nobody wants to spend time on backward compatibility as a
| hobby. From an economic perspective, it looks like a prisoner's
| dilemma - everybody externalizes the cost of maintaining
| compatibility onto others, collectively creating more useless
| work for everybody.
___________________________________________________________________
(page generated 2023-12-28 23:00 UTC) |