[HN Gopher] Reactive Clojure: A web language
       ___________________________________________________________________
        
       Reactive Clojure: A web language
        
       Author : audionerd
       Score  : 338 points
       Date   : 2021-09-23 15:04 UTC (7 hours ago)
        
 (HTM) web link (hyperfiddle.notion.site)
 (TXT) w3m dump (hyperfiddle.notion.site)
        
       | lewisjoe wrote:
       | This is beautiful. I used to think about this problem deeply. The
       | best imaginary system I did imagine was:
       | 
       | - A system that starts with our database schema
       | 
       | - a language in the front-end that abstracts away server
       | connection and db access
       | 
       | - this imaginary language should allow defining react-like
       | components but treat the db as a local datastore
       | 
       | - Most clients are UI stricture interpolated with that user's
       | data queried from the central db. So this imaginary front-end
       | language should allow querying from user-level views from the db
       | 
       | Most of what I read from the post, looks like a realization of
       | this dream.
        
         | hatch_q wrote:
         | You need to treat clients as zero-trust. Your db is just a
         | vector for DOS attack if you don't.
        
         | FpUser wrote:
         | >"- A system that starts with our database schema
         | 
         | - a language in the front-end that abstracts away server
         | connection and db access"
         | 
         | Optimal data layout for storage and for processing /
         | presentation can be quite different. Automatically mapping one
         | to another I think can not be efficiently implemented in
         | automatic fashion. I've tried different frameworks that claim
         | to achieve it but at some point you always hit the wall. As a
         | result I've long abandoned all those attempts and do manual
         | transformation in code that are optimal for my particular
         | situations
        
       | peter-m80 wrote:
       | Thanks. I hate it.
        
       | tambourine_man wrote:
       | If you are trying to allure front end devs, maybe don't use
       | tables in you example.
       | 
       | To my taste, all of that is way too overcomplicated. I don't know
       | why we need to make writing and maintaining web pages more
       | complex with every year that goes by. To my mind, this industry
       | looks completely derailed.
        
         | specialp wrote:
         | What would you use to represent tabular data like a list of
         | T-shirt orders as in the example? That should be an HTML table.
         | Using tables for positioning is bad in front end. Using HTML
         | tables/sections/headers for document data structure is exactly
         | what HTML is for.
        
           | tambourine_man wrote:
           | Unless it's two columnns only, tables don't work well on
           | mobile. You end up having to undo in CSS a lot of properties
           | that TD, TH bring by default.
        
       | BiteCode_dev wrote:
       | We did that, it was called PHP, and it turns out DSL are pretty
       | limited outside of their sweat spot. Also they don't evolve as
       | fast as libs and framework.
       | 
       | Case in point: PHP worked well, but framework like Rails and
       | Django became very attractive because their offered more, and
       | used languages that could be good outside of their niche.
       | 
       | And what did the PHP community to stay relevant ? They developed
       | great frameworks, and improved the non web language capabilities.
       | 
       | Turns out the web moves fast, and coding a web app is more than
       | web programming anyway.
        
       | marstall wrote:
       | As a web developer with 25 years of experience and (I thought) up
       | to the minute skills ... I have no idea what any of that means
       | but it sounds cool and important and I want to try it.
        
         | nickkell wrote:
         | Hats off to the lispers, they do some cool stuff. I think
         | treating code as data they just have a different view of what
         | computation means to the rest of us (or to me at least!)
        
         | quickthrower2 wrote:
         | You don't have to know everything you see. If you find it
         | interesting then cool but don't feel compelled to learn every
         | web thing, it's a never ending rabbit hole.
        
         | hungryforcodes wrote:
         | More work and learning basically in "front end" land, before
         | you can do anything practical -- as usual.
        
           | jazzyjackson wrote:
           | does nothing practical happen on the front end?
        
           | bcrosby95 wrote:
           | I view it as an attempt to reduce the work required in "front
           | end" land, making full stack development more feasible than
           | it is today.
        
           | Kaze404 wrote:
           | Because software engineers are known for being people who are
           | averse to learning and trying new things out.
        
             | hungryforcodes wrote:
             | As opposed to actually spending their time building useful
             | practical things?
        
               | andrewzah wrote:
               | Yes, that's why I manually input 1s and 0s - no time
               | wasted on _learning_ , only outputting practical things.
        
         | pjlegato wrote:
         | It allows you to define a GUI / DOM specification, with
         | transparently embedded serverside commands that do things like
         | "query the database for the list of users who meet criteria X."
         | No annotation or other special action required.
         | 
         | The runtime figures out an efficient and reactive way of
         | parceling out work to the server as needed, and refreshing it
         | only when necessary.
        
       | mamcx wrote:
       | This is tangential but also a validation.
       | 
       | FoxPro (& dBase) is a realization of the concept: To deal with
       | databases, you _need_ a database language.
       | 
       | Exist a lot of minor things that our apparent "general-purpose"
       | languages lack in the moment you need to deal with certain
       | niches. From very small stuff as not-even available decimals,
       | dates, currencies, units types, to lack of simple way to
       | transform data, to ad-hoc queries, to ad-hoc data validations, to
       | lack of relationship modeling, etc.
       | 
       | Even if you say "linq!, ActiveRecord!, functional!, lisp!,
       | pandas!..." and others all that are a _shadow_ of what the dBase
       | family provides.
       | 
       | How far? I was not in worry about all the stuff everyone worry
       | about today (injection? orms? impedance mismatch? reactivity? <-
       | an over-complicated patch on top of unfit languages for it, so
       | kudos for this idea!). That is what make me put some time aside
       | in build a language in the spirit of it, because is so much
       | details that are not available if the languages is not designed
       | with data(as of the kind of business) in mind.
       | 
       | So, in short, most languages, even php, python, ruby, ... are not
       | that good for web programming (and worse for database
       | programming!), just that are not that terrible, either.
        
       | rlili wrote:
       | Coincidentally, Alephjs (https://github.com/alephjs/aleph.js)
       | added a commit hours ago that also seems to solve this particular
       | problem for React.
       | 
       | So now there's a React hook (useDeno) that takes a callback that
       | is only executed on the server-side, and the returned value is
       | sent back to the client side transparently.
        
       | bennyp101 wrote:
       | Lots of people saying it's like PHP or liveview with elixir.
       | 
       | We kinda have that with livewire[1] and inertia[2] and as awesome
       | as they are (no separate api etc) they also suffer from the
       | "magic"
       | 
       | [1] https://laravel-livewire.com/ [2] https://inertiajs.com/
        
       | cies wrote:
       | I think no-code/low-code backend is here to stay. Products like
       | Hasura put authorization/ratelimiting/graphql/api-GW on top of
       | trusted postgres. Now BE and no serialization up and down. Simply
       | generate a client based on the graphql schema and off you go.
        
       | nbardy wrote:
       | This is great. It's the dream that was promised 4-5 years ago of
       | with om and reagent fully realized.
        
       | awinter-py wrote:
       | 'compiler managed network' in here is a useful concept
       | 
       | buildsystems are increasingly doing the heavy lifting of telling
       | backend how to deliver a pre-hydrated frontend, and telling
       | frontend how to speak backend's language
       | 
       | would be nicer if this was just types and schemas, so you didn't
       | have to use a full-stack framework to get full-stack
       | accelerations and linting
        
       | pbiggar wrote:
       | I'd love to know why any time I read something about clojure,
       | it's inevitably cluttered with big words that the author (or some
       | other clojurian) invented that have a lot of deep and important
       | meaning, that make it impenetrable to anyone else.
        
       | haskellandchill wrote:
       | This is nice but it doesn't give you a reasoning system for
       | making assertions about components. I'd rather work backwards
       | from that point to a web language but playing around with things
       | dynamically is the most natural and explored model.
        
       | doteka wrote:
       | One thing I admire about the Clojure community is audacious
       | projects like this. While a ton of these seem to run out of
       | steam, they certainly shoot for the stars and tend to come pretty
       | dang close for a while.
       | 
       | For those working in Typescript, Blitz.js seems to do a great job
       | at drastically decreasing the plumbing you have to write to
       | shuttle data between Postgres and React. There's also a ton of
       | goodies like auth built in. From my first impression it's the
       | closest the JS community has ever come to a Django, and that's
       | very high praise in my book.
        
         | grncdr wrote:
         | It's a very impressive project, and something I would
         | definitely try in a greenfield app.
         | 
         | I wish there was somewhere to follow updates that wasn't
         | Twitter though.
        
           | Rd6n6 wrote:
           | Especially for people without Twitter accounts
        
         | trutannus wrote:
         | Sadly the running out of steam effect hits the tooling for the
         | community too. It's _really hard_ to find good, stable clojure
         | tools on the level of those available for Java.
        
           | heyzk wrote:
           | Definitely take a look at Cursive, it may be what you're
           | looking for along the lines of stability and out-of-the-box
           | features you'd see in a Java IDE: https://cursive-ide.com/
        
             | LandR wrote:
             | Or Calva for VS Code.
             | 
             | It's the best dev environment I've used for any language.
             | It's brilliant.
        
               | trutannus wrote:
               | Calva always exploded on me when I tried to set it up on
               | Windows 10. Is it better on a *NIX system?
        
               | ziftface wrote:
               | Never tried it on Windows, but it works pretty well on
               | mac in my experience
        
               | trutannus wrote:
               | I'll try it out on a Linux device, thanks!
        
           | gleenn wrote:
           | I had another coworker compare Clojure and Java tooling
           | recently. I just don't think it's fair to compare one of the
           | most used languages on the planet to one that is written in
           | the other one. Clojure tooling isn't the best out of some
           | ecosystems I've used, but you can leverage a whole bunch of
           | the Java tools and I certainly have, like stack dump
           | analyzers or profilers, or Maven, etc. Are they perfect for
           | use with Clojure, not always, but things are pretty good
           | IMHO. Cursive is an excellent IDE too, a joy to use with very
           | many bells and whistles and there is also excellent Vim and
           | Emacs support. There are at least 3 build tools that are
           | Clojure-specific (Leiningen, Boot, and deps.edn), or you can
           | integrate with older or other JVM tools pretty easily like
           | Maven. There are multiple testing frameworks, multiple test
           | formatters, and multiple test runners. I could go on, but
           | what specifically do you think is missing or could be better?
        
       | [deleted]
        
       | baby wrote:
       | They chose a parenthesis-language, interesting choice. I don't
       | think the syntax is going to attract many web devs.
        
       | Datsundere wrote:
       | I think people are overlooking the fact that javascript and css
       | is a hot mess to deal with. We need something like flutter that
       | makes maintaining these easier.
        
       | throwawayswede wrote:
       | Not related, but is Notion becoming new Medium?
        
       | jtolmar wrote:
       | I've thought of doing this several times, and always shied away
       | at the complexity and nuance that goes into it. Kudos to the devs
       | for having the skill and determination needed to actually make
       | this real. Very impressive work, and I hope it works great in
       | practice.
        
       | avanai wrote:
       | When the framework does so much for you, I always worry about
       | what it looks like at scale when you need to start optimizing.
       | Can you instrument all the plumbing, if something breaks can you
       | get at it to fix it? How will you add caches at various different
       | layers? On the browser, http cache, db cache, CDN, etc.? If the
       | generated JavaScript that's ultimately running on the browser has
       | a bug, how many layers of library do I have to sift through to
       | fix it? When I want to simulate the network for testing or deal
       | with intermittent connection failures on the frontend how hard it
       | is to plug in? What do schema migrations look like? What do
       | deployments across a fleet of servers look like (there's some
       | point in time when some servers are old and some servers are
       | new...)?
       | 
       | These are problems with any framework, but the more all-in-one a
       | framework attempts to be the harder it is to get in between the
       | joints with your glue gun to fix things up.
       | 
       | That said, this is Clojure and usually you have pretty easy
       | access to all the intermediate bits and bobs and macros so maybe
       | it'll be great.
        
       | softfalcon wrote:
       | This syntax is insanely hard to read, is non-standard, and is
       | unclear what is server side and what is client side processed
       | without purple and red highlighting.
       | 
       | Maybe I've been in Node.js land too long, but I don't get why
       | this is better for my productivity or my ability to create
       | efficient web apps.
        
         | mrtnpwn wrote:
         | It's not hard to read, but it's just that you aren't used to
         | it. Try Clojure without this "hard to read" mindset and see how
         | great Lisp as tools are!
        
       | turtlebits wrote:
       | Off topic, but please don't use Notion for static sites. The page
       | is 1.8MB (9.4MB uncompressed) - 1.6MB of that is javascript.
        
       | zaksingh wrote:
       | So from what I can tell this is conceptually similar to the
       | LiveView model, except that the problem is approached from the
       | perspective of the SPA/client stack instead of the SSR stack.
       | It's a refreshing idea that I've never seen executed like this
       | before.
       | 
       | However I think it's missing the point of de-coupling. Security
       | would be very hard to reason about, as would handling of
       | intermittent network connections when the real structure of the
       | client and server are abstracted away from you.
       | 
       | Ultimately I think GraphQL with live queries is the best model
       | for this type of reactive work. You get a decoupled
       | client/server, reactivity, support for mobile clients as you have
       | an API, as well as full type-safety on the client.
       | 
       | Nonetheless I applaud the creativity on display here and I hope
       | I'm proven wrong. Maybe this will be the next paradigm shift? Who
       | knows
        
         | zero_iq wrote:
         | Mr first thought reading the article was security. After a
         | quick ctrl-f, it was a little disconcerting to find that the
         | only mention of security is in a tacked-on bullet list under
         | the heading "risks"...
        
       | intrasight wrote:
       | It had me at the title "You don't need a web framework, you need
       | a web language" but then it immediately dived into arbitrary
       | syntax instead of exploring in abstract what a modern web
       | language would entail.
        
         | isuckatcoding wrote:
         | Yeah I had a really hard time understanding even with the
         | backend frontend highlighting
        
           | balloneij wrote:
           | I think the misunderstandings are because they are targeting
           | a specific audience. They aren't trying to teach you Clojure,
           | Datomic, and Reagent because they assume you are already
           | knowledgeable about it.
           | 
           | Clojure and Clojurescript are the same language (more or
           | less). They just target the JVM or Javascript.
           | 
           | The author is mixing the frontend (Clojurescript and Reagent)
           | code with the backend (Clojure and Datomic) code in the same
           | expression. Then through their magical system and the beauty
           | of lisp, they pull the frontend and backend parts out to
           | serve them separately.
        
       | gdsdfe wrote:
       | I'm a bit confused, is this a product or a project?
        
         | danpalmer wrote:
         | Yes.
        
           | danpalmer wrote:
           | To expand on the snarky response, or explain my thinking...
           | 
           | I think more and more the lines are blurred between open
           | source projects, and products. This is good and bad.
           | 
           | It's good because people making money out of open source
           | projects probably means more open source projects, more
           | support available, and a healthier tech industry.
           | 
           | It's bad because as someone with no intention of turning a
           | few open source libraries into a full time job, there's still
           | an expectation of a certain level of polish to them that
           | makes more sense for products. Open source projects with
           | clever names, logos, mission statements, a domain name and
           | marketing site/landing page, marketing copy, flashy
           | documentation, a live preview environment, etc. These are all
           | a lot of work for an open source project, but the stakes are
           | raised to this level by the productised open source projects
           | that can afford to fund this sort of thing.
        
             | gdsdfe wrote:
             | I get that and I agree with you but then if it's a project
             | why do I need to ask for early access, if it's a product
             | then why launch a web tech on notion? one would expect to
             | build the website with the so called web language and have
             | the proof in the pudding like they say.
        
       | pkage wrote:
       | This reminds me of Meteor.js[0] from back in the day (2014?),
       | which had a very similar approach--you wrote code that ran on
       | both the frontend and the backend, and database updates were
       | propagated automatically. It suffered from a pretty hard reliance
       | on Mongodb and its own package manager (Atmosphere), and it was
       | at odds with the rest of the JS ecosystem which was settling on
       | NPM.
       | 
       | This project looks very cool! I like the focus on composition,
       | Meteor was lacking that (and really, most other frameworks do as
       | well).
       | 
       | [0] https://www.meteor.com/
        
         | leetrout wrote:
         | I feel like Meteor lost a lot of ground to Firebase.
         | 
         | I think what we are seeing with these tools to make data
         | synchronization in the frontend more invisible will continue to
         | proliferate.
         | 
         | I am looking forward to the next, rich landscape of
         | interactivity on the web powered by WASM, WebGL, etc.
        
           | FractalHQ wrote:
           | > I am looking forward to the next, rich landscape of
           | interactivity on the web powered by WASM, WebGL, etc.
           | 
           | All of which will likely be a broken mess on iOS thanks to
           | Apple
        
         | strictfp wrote:
         | Another big problem was that you rarely want exactly the same
         | code on client and server.
        
         | basch wrote:
         | one that sort of fell by the wayside when Meteor and Ember got
         | popular, was/is Derby.js/ShareDB.
         | https://github.com/derbyjs/derby https://derbyjs.com/
         | https://github.com/share/sharedb
         | 
         | The LiveView lead resurgence in server side rendering is
         | exciting. Does anyone have any insight as to why ShareDB never
         | really took off?
        
           | cjblomqvist wrote:
           | Having been fairly close to the Derby.js project I'd guess
           | that the difference between it and just using React and a web
           | API just isn't that much in reality. Live updates of data
           | isn't something most applications need (and very few parts of
           | those that actually do). The added complexity is not to be
           | underestimated, and there are some things inherit with live
           | data which makes it more complex. What happens when one piece
           | of data updates at an unexpected point in data, half-way
           | through a method where you process something? Plus you still
           | have the difference between backend and frontend, just that
           | now it's more difficult to understand where and when what is
           | run where under what conditions.
           | 
           | Then specifically for Derby/Share JS they didn't put enough
           | resources into the project to make it good enough compared to
           | the alternatives.
        
         | svachalek wrote:
         | Yeah Meteor was an interesting example of an amazing project
         | that fell into a hole based on a couple of bad decisions. It's
         | basically fixed those at this point but become something pretty
         | different in the process. It sounds like it may be something I
         | can use now but I haven't tried it.
        
         | zerr wrote:
         | And http://opalang.org/
        
           | daxfohl wrote:
           | The language itself was a really interesting halfway point
           | between typescript (near JS syntax) and purescript (stronger
           | type system), before either existed. Plus some extra goodies
           | thrown in.
           | 
           | It's really too bad they bound it so tightly to the
           | framework, as I think there's a chance it could have
           | succeeded as a language in itself. But these reactive shared-
           | code things never seem to work out.
        
       | oaguy1 wrote:
       | Hugged to death and I'm afraid there is no wayback archive right
       | now.
        
       | rowland66 wrote:
       | I think that several of the fallacies of distributed computing
       | are being ignored here.
       | 
       | https://en.wikipedia.org/wiki/Fallacies_of_distributed_compu...
        
         | telekid wrote:
         | Which ones? And ignored (and potentially irreconcilable) or
         | deferred?
        
       | athenot wrote:
       | This reminds me a lot of imba[1], which mixes the front end and
       | the back end. Though ReactiveClojure seems to be more about
       | reasoning in terms of a lisp for all parts of the app, whereas
       | imba is more focused on reducing syntax noise as much as
       | possible.
       | 
       | [1] https://imba.io
        
       | pizzeriafrida wrote:
       | It does seem a bit convoluted after going through it a couple of
       | times, but I'm down to try it if my reagent React interop still
       | works, e.g. `[:> MyJsComponent {...}]`.
       | 
       | I would say that I am very happy with the FE stack of reagent /
       | reframe at the core. I have long chased the dragon of co-located
       | queries ala GraphQL instead of basic re-frame subscriptions, or
       | redux.connect and pulling fields off a map. Obviously having the
       | ability to be more expressive with data queries is great, but in
       | reality I have come to settle on basic subscriptions into maps,
       | syncing data into my db via events. It's not super pretty but it
       | scales!
       | 
       | This seems like it's trying to push the needle, and I will it.
        
       | atroche wrote:
       | How does the reactivity work with Datomic? Is it polling those
       | queries? Or I'd it listening to the log of transactions and
       | figuring out when relevant parts have changed?
        
       | taikahessu wrote:
       | This is exactly what I've been thinking of lately. I started web
       | development in 1998 and in 2000 I got searching for some way to
       | store data.
       | 
       | At first I tried Macromedia Coldfusion, later acquired by Adobe.
       | Now that I checked on it, it seems to be going strong, to my
       | surprise. It was too hard for me. And it was closed software.
       | There was no way for me to learn it without spending money on it.
       | And it wasn't what I was really looking for.
       | 
       | But I just needed something simple. Something to tinker with. So
       | I found PHP. It was exactly what I needed at the time. Later I
       | also found MySQL.
       | 
       | The amount of garbage required to build a single website is
       | enormous. So enormous that we have gone a full circle and people
       | start using static site generators to create pure HTML sites.
       | Because of speed and few other reasons.
       | 
       | So I got to thinking, why is it that we're building webshops with
       | all these open source technologies, with a huge amount of
       | overhead and "bloat", when all you really need is a few simple
       | things.
       | 
       | Well, as the creator said it, there are a lot of unknowns. Huge
       | learning curve etc. But that's how Linux got started, as a
       | tinkering platform. I really think this is the right path to
       | take. Making an open source web programming language, that
       | handles all the needs directly built-in. I totally agree with the
       | philosophy and if you will, proposed abstraction, of the problem
       | at hand.
       | 
       | But also, it makes me shiver to look at the code and not
       | understand it. So much to learn. But it gives me hope to see,
       | that other's have come to the same conclusions. Looking forward
       | to hearing more!
        
         | Zelphyr wrote:
         | Clojure (and Lisps in general) really aren't hard to learn. It
         | just takes those of us that come from C-influenced languages
         | like PHP a little longer to be able to read them at a glance
         | because the syntax is slightly different and usually simpler.
         | 
         | Once that lightbulb of the power of a Lisp goes off, there's no
         | turning back. As Eric S. Raymond said, "Lisp is worth learning
         | for the profound enlightenment experience you will have when
         | you finally get it; that experience will make you a better
         | programmer for the rest of your days, even if you never
         | actually use Lisp itself a lot."
        
           | iainctduncan wrote:
           | If there was one and only one thing I could tell myself from
           | 15 years to do sooner it's LEARN SCHEME. Man I wish I'd
           | stated a decade ago.
        
       | sadieenward wrote:
       | ((((((((((((Dom))))))))))))
        
       | metalrain wrote:
       | I like how client and server code is separated, but I do wonder
       | how changes in expressions are evaluated.
       | 
       | I'm thinking about autocomplete that on new user input
       | (needle='ad') filters previous result from server (needle='a') in
       | the client before server returns a new response from new input
       | (needle='ad').
       | 
       | Essentially can inner parts of expression update even when they
       | are somewhat dependent on reactive data from server that comes
       | from their parent expression?
        
       | jspaetzel wrote:
       | Loving this for you...
       | 
       | )))))))))))
        
         | askonomm wrote:
         | Found the one person who uses Notepad.exe because no actual
         | Lisper even notices the indents due to structural editing
         | capabilities of IDE's, much like {} in C-based languages.
        
       | tosh wrote:
       | great to see hyperfiddle here, delightful surprise, deserves the
       | attention, kudos @dustingetz, ty for the writeup
        
       | disease wrote:
       | My arrow and page up/down keys do not work on this website. Very
       | annoying.
        
       | jack_riminton wrote:
       | Can someone translate this for a relative web dev noob? or can
       | anyone? which may be a better question
        
         | aidenn0 wrote:
         | A web app includes code that runs on the client and code that
         | runs on the server. For example, code that manipulates the view
         | runs on the client and code that accesses the database runs on
         | the server.
         | 
         | This lets you write a function where some of the code runs on
         | the client, some of the code runs on the server, and the
         | compiler figures out which and emits the network RPC calls for
         | you.
        
       | buryat wrote:
       | looks very overcomplicated for generating an html table, building
       | something more powerful would result in even more complex code.
       | There's a reason why these things get decoupled
        
         | paulgb wrote:
         | > There's a reason why these things get decoupled
         | 
         | This is true, but I also think it's worth evaluating whether
         | the lines along which we've been decoupling applications is the
         | _right_ one. Typically, the line of demarcation has been the
         | client /server boundary, for a bunch of reasons: security
         | considerations (it's also a trust boundary); different
         | computational environment. This split has reinforced itself
         | with the organization of companies into frontend/backend teams.
         | 
         | But there are a bunch of things that it makes a pain-in-the-
         | ass. I've encountered this most with data-heavy apps, where I
         | want to do some analysis on the server (e.g. Python/Pandas),
         | but I want low-latency recalculations on the client in cases
         | where the data is small enough. Doing it "right" requires
         | implementing the same data-level logic in both Python and
         | Javascript. Nobody has time for that, so we end up in our
         | current world of laggy janky SaaS that needs to run off to the
         | server every time you click a button.
         | 
         | Which is to say, I'm excited that people are looking at
         | alternatives (not just this; LiveView was on HN yesterday as
         | well).
        
       | fny wrote:
       | I think I fail to see the advantage in the example given. Is the
       | point that there's a server side call attached to the UI
       | component directly? How is this any different than what can
       | already be done with old school full stack like Rails or even
       | smaller libraries like Sinatra/Flask.
        
       | wrnr wrote:
       | Premature compositionally in the root of all evil, or something
       | like that. I've looking for better ways to do
       | document.createElement and addEventListener ever since the days
       | of DHTML. Anyone looked into diagram theory already? The only
       | productivity gain I've found is being fluent enough in your stack
       | of choice to do the work to solve a problem and nothing more. And
       | sure, spend the rest of your time researching diagram theory, but
       | try to be honest about why you do it.
        
         | wrnr wrote:
         | Would any of the 3+ people that dislike what I said like to
         | explain why or is it more, like, "THE WAY YOU SAID IT", that is
         | rubbing you faggots the wrong way :P.
        
         | Kinrany wrote:
         | Premature compositionality? If something didn't need to be
         | decomposed, it can be recomposed.
        
           | wrnr wrote:
           | As in function composition, a great idea from math but one
           | that is hard to use for anything that isn't a functions with
           | domain and range in R or N.
        
       | delegate wrote:
       | This is not reinvention of PHP as some are commenting. In fact I
       | think this is extremely cool.
       | 
       | If I understand it correctly, it allows you to achieve reactive
       | data flow in a single page app without any boilerplate.
       | 
       | Meaning - you update the database on the server and all the
       | relevant UI(s) will automatically receive the updated data and
       | re-render only the parts of the UI that display that data.
       | 
       | This would require a ton of PHP and Javascript dealing with
       | networking, websockets, routing, serializing data and so on.
       | 
       | Haven't tried it yet, but very curious to see if it works.
        
         | hatch_q wrote:
         | In this sense it's same as what microsoft is trying to do with
         | Blazor - except they are skipping whole javascript crap and
         | compile to wasm.
        
           | brokencode wrote:
           | Which sounds great until you experience the loading times.
           | Last time I tried it out, the loading times for all the DLLs
           | that a typical application requires was pretty bad. But once
           | it loaded, things were snappy.
        
         | hk__2 wrote:
         | > Meaning - you update the database on the server and all the
         | relevant UI(s) will automatically receive the updated data and
         | re-render only the parts of the UI that display that data.
         | 
         | > This would require a ton of PHP and Javascript dealing with
         | networking, websockets, routing, serializing data and so on.
         | 
         | I don't know how it was implemented, but Quora had this back in
         | its early days (~2012). There was some mechanism that
         | "remembered" which table lines were used to generate which UI
         | component, and when that data changed you had a live-reload in
         | your browser. That was really cool to see at the time; I'd love
         | to have more background on its implementation.
        
         | giancarlostoro wrote:
         | So more like Liveview for Phoenix / Elixir is what this kind of
         | sounds like to me, and less so back-end mainly language like
         | PHP.
        
         | cabalamat wrote:
         | > you update the database on the server and all the relevant
         | UI(s) will automatically receive the updated data and re-render
         | only the parts of the UI that display that data.
         | 
         | I really don't like that idea. It seems to me inefficient and
         | error prone.
         | 
         | Let's say you're updating a database. You add some records to
         | one table, and you update some records to some other tables.
         | 
         | If the program automagically updates the UI, then on the first
         | change it will attempt to update the UI (causing lots of
         | processing) , then on the 2nd change to the database it'll
         | update the UI again, and on and on for each change.
         | 
         | Wouldn't it be better to make all your changes to the database
         | then only after that run an updatePage() funiction that updates
         | the web page?
        
           | agumonkey wrote:
           | nothing forbids the system to give mechanisms defining rapid
           | sequences of changes, kinda like debounce in js
        
             | danenania wrote:
             | I think the main risk for this kind of framework is that
             | you spend as much time ironing out these kinds of "edge
             | cases" (debounce, transition states, error states,
             | transactions, authorization, url bar state, scroll bar
             | position, paging, efficient re-renders, etc. etc.), which
             | in practice are crucial to most non-trivial software, as
             | you would have just writing the usual boilerplate and
             | retaining fine-grained control.
             | 
             | It's great that people are innovating and creating new
             | abstractions, and I'm sure there are apps where the
             | tradeoff is worth it (internal CRUD-focused enterprise
             | stuff comes to mind), but my knee-jerk reaction for a large
             | app is that it will make easy things easier and hard things
             | much harder.
        
               | noizejoy wrote:
               | I appreciate and have created software that needed to be
               | complex with the associated complex underpinning.
               | 
               | I also have long been looking for a framework that makes
               | easy things easier.
        
         | pizzeriafrida wrote:
         | This is where I'm at with it. "Develop apps like you do now,
         | with a centralized app db, but now the app db (in the browser,
         | most likely a giant Map) is an actual database with a
         | sophisticated query language, an upgrade!"
        
         | namdnay wrote:
         | The problem with this type of system in my experience is that
         | it's great until you hit a bug, and then you realize you have
         | no idea what's going on under all the automagical stuff and you
         | go crazy
        
           | baby wrote:
           | True With any system
        
           | manmal wrote:
           | How is this different from any other framework? Try fixing a
           | React or Rails bug.
           | 
           | At least their system is only 2k LOC, which will presumably
           | be well documented.
        
             | christophilus wrote:
             | At first glance, this appears to be much more complex.
             | React is a relatively simple DOM diffing library. Rails is
             | a closer comparison, especially with whatever their live-
             | view implementation is. This appears to be doing a lot more
             | than React, at least, including network communication, and
             | database change event propagation. The odds seem much
             | higher that stuff will go wrong, especially under load, and
             | be pretty difficult to reason about.
        
               | Zababa wrote:
               | > At first glance, this appears to be much more complex.
               | React is a relatively simple DOM diffing library.
               | 
               | Their implementation is 2k lines of code. The React repo
               | has 350k lines of code. The Rails repo has 336k lines of
               | code (both of those according to tokei). Of course this
               | includes tests, lots of other stuff, etc. But still,
               | that's two orders of magnitude.
        
               | steelbrain wrote:
               | LoC != Complexity. React has one job, and it does it
               | really well, part of that 350k lines of code is a LOT of
               | tests. Just because it has those tests doesn't mean it's
               | "much more complex".
               | 
               | My two cents :)
        
               | kaba0 wrote:
               | It absolutely has a strong correlation with complexity.
        
               | Zababa wrote:
               | After a naive removal of the tests (every folder and
               | files that contains tests was deleted), React still has
               | 190k lines of code.
               | 
               | > React has one job, and it does it really well
               | 
               | I'm not sure I agree. It's hard to compare without a
               | minimal copy of React to see how small it can get, but
               | I'm guessing it could be an order of magnitude smaller.
               | For example, React supports different ways of doing
               | things (class components, function compenents, hooks).
               | Backwards compatibility is a great thing, but it's not
               | the same as "having one job and doing it well", it's a
               | different tradeoff. The React team has lots of people
               | that depends on their code, and thus choose stability
               | over being small and nimble. I think that's a responsible
               | choice. But this leads to complexity, and losing the
               | "having one job and doing it well".
               | 
               | As a more general remark, there's a cycle in software.
               | React starts small and nimble, especially compared to the
               | "jQuery behemots of the past". It gets really popular. So
               | people start depending on it. So it grows, and grows, and
               | grows. And then someone else comes out, maybe Photon,
               | maybe Svelte, maybe something else. Compared to React,
               | it's small and nimble. Maybe in 10 years, Photon will be
               | really popular, will be 200k lines of code, and someone
               | will build an alternative because it's too big and
               | complex.
               | 
               | Edit: as a more meta-remark: My message is way longer
               | than yours because I was trying to steelman my argument,
               | and you didn't do the same with yours. Considering you
               | made a small message "defending" React and I did a long
               | one "defending" Photon, I think we already agree about
               | the tradeoffs involved here.
        
               | nickkell wrote:
               | I'm going to keep scrolling in search of a shorter
               | comment
        
             | ashtonkem wrote:
             | Clojure tends to be a bit more terse than other languages.
             | 2K of Clojure is a lot of code. Especially if macros get
             | involved. As for the comparisons to React elsewhere; I
             | wonder how much of that is the result of React being battle
             | tested for a long time and expanded, would this still be so
             | short if Facebook was written in it?
             | 
             | I also wouldn't presume good documentation as a general
             | rule. That's something that must be proven, not presumed.
        
               | manmal wrote:
               | I'd still rather read 2k loc in _any_ language, and
               | undocumented, than 350k loc, perfectly documented.
        
               | ashtonkem wrote:
               | Sure. But I'd question two things:
               | 
               | 1) How often do you actually need to read your framework.
               | I used rails for years and read probably less than 2KLOC
               | out of it, ditto with Java and Spring. Good documentation
               | beats out small code bases.
               | 
               | 2) How much of the size difference between these two is
               | down to age and uses? Is React so big because it's
               | unfocused or poorly written, or is that a consequence of
               | it being used by so many people and projects? If it's the
               | latter, shouldn't we expect that this project will end up
               | growing if it got popular, eroding the benefit of its
               | small size.?
        
               | MetaWhirledPeas wrote:
               | > How often do you actually need to read your framework.
               | 
               | This brings us full circle to the question that started
               | this conversation branch:
               | 
               | > it's great until you hit a bug, and then you realize
               | you have no idea what's going on under all the
               | automagical stuff
               | 
               | With React and Rails, "hitting a bug" is apparently rare.
               | Maybe we should wait before assuming it will be any
               | different with this Reactive Clojure framework.
        
               | tluyben2 wrote:
               | In my (quite extensive) experience hitting a bug or
               | another issue with react and rails and when/if the error
               | message and trace are absolute drivel (which happens a
               | lot during normal projects), you usually can find fix by
               | pasting it in Google. In react it usually goes something
               | like: throw everything away yarn/yarn build again and
               | pray for the best by the way.
               | 
               | So I think many people don't need to read anything but
               | just pop into Google read what it is + get the fix.
               | 
               | In smaller frameworks and libraries I am more tempted to
               | just check what the issue is in the source and report a
               | bug if it was not just me being stupid again, but that is
               | also because pasting it in Google might get no results at
               | all.
               | 
               | I remember when just starting out with Rails, my rails
               | colleagues all read the source of everything when there
               | were issues or lack of docs; this was very early on
               | (first public version); now I know no one who does that
               | anymore.
               | 
               | I really would like something that stays small and is
               | around in 10 years and my experience with Clojure is good
               | in that respect. And Haskel projects. Those things that
               | keep growing and keep adding dependencies are nightmares
               | but what can I do.
        
         | Diggsey wrote:
         | > Imagine a programming language runtime whose runtime state
         | (i.e. lexical scope) is partially broadcast over network as it
         | happens, kind of like a remote debugger.
         | 
         | This sounds absolutely terrifying from a security
         | perspective...
         | 
         | What's to stop a malicious client from broadcasting code that
         | deletes my entire database?
        
           | outworlder wrote:
           | > runtime state
           | 
           | > code
           | 
           | Some overlap, but these are essentially two different things.
           | 
           | > What's to stop a malicious client from broadcasting code
           | that deletes my entire database?
           | 
           | Your backend.
        
           | BillyTheKing wrote:
           | any sort of networking sounds terrifying from a security
           | perspective...
           | 
           | Unfortunately (or fortunately) it's also a corner-stone of
           | computing in general
        
       | Fellshard wrote:
       | Quite a few comments that are dishonest or didn't focus on what
       | the author focused on, but rather on auxiliary things.
       | 
       | There are concrete similarities to PHP, which is effectively what
       | this server/client macro setup gives you at a superficial level.
       | However, from what I'm seeing, this will behave more like a
       | LiveView or Hotwire, with the focus being on optimizing network
       | requests in an automated manner.
       | 
       | My big question with the tool is this: if you're passing
       | environments back and forth, how secure can this feasibly be? Is
       | there an automated limit on what will be considered based on the
       | generated code? How do you handle malicious environments?
        
         | [deleted]
        
       | mjburgess wrote:
       | Finally the problem which PHP solved more than two decades ago
       | has been solved again. How do we include server-side code in
       | client-side code?
       | 
       | Do we build the client-side on the sever, and render? Why no,
       | that would be PHP.
       | 
       | Let's build the client-side in the browser, and rig a series of
       | complex code-generating primitives disguised by the beauty of a
       | language, to AJAX our way to a presumably good-enough solution.
       | 
       | I think its a serious question whether apps built with this are
       | more performant, easier to use, (and so on) than the equivalent
       | PHP-approach.
        
         | dgb23 wrote:
         | PHP doesn't reactively and selectively propagate changes
         | between client and server, nor would it be feasible to write
         | such a library in PHP itself. You could maybe achieve something
         | similar with code generation of PHP and JS.
        
           | slim wrote:
           | But are you sure propagating changes is desirable ? It looks
           | like a different architecture than the web to me
        
         | cosmotic wrote:
         | There's theoretically some performance benefit to rendering
         | client side over ajax because the pages can be trivially
         | cached, though you then run into the issue of pages being
         | placeholders for a moment while the subsequent request(s!) run.
         | Hence the UX anti-pattern of skeleton screens.
        
           | tshaddox wrote:
           | I don't care for skeleton screens much in any case, but
           | there's no reason why skeleton screens couldn't be limited to
           | client-side page loads while the client waits for the data.
           | The server could and should still fetch all the data and send
           | down a fully-rendered page.
        
           | Zelphyr wrote:
           | I will be so relieved when that anti-pattern goes away.
        
         | darthrupert wrote:
         | Hate towards PHP has absolutely nothing to do with how easy web
         | things are to deploy on it.
        
         | InitialBP wrote:
         | Regardless of whether PHP solved this particular problem, it
         | also caused a lot of its own due to numerous security issues
         | and documentation that encouraged unsafe use of libraries,
         | until recently.
        
           | mjburgess wrote:
           | The pragmatism of rasmus, and how bemused he was that people
           | were using his language to program (vs. template), meant that
           | the BDFL was not a great advocate of the PHP model.
           | 
           | The model is this: run-once-and-die + build-it-on-the-server.
           | 
           | Those two ideas are extremely powerful, a little like
           | immutability, in that they rule out a huge number of issues.
           | The issue with PHP wasn't this model which became associated
           | with the morass of amateurs using the language. A shame.
        
         | Zelphyr wrote:
         | I really love Clojure--it's a joy to use but, you're right.
         | 
         | Maybe I'm misunderstanding this project but it seems like
         | abstractions on top of abstractions and has little to do with
         | being a "web language". That was PHP, for better or for worse.
        
         | [deleted]
        
         | kazinator wrote:
         | PHP lets you have a piece of server code that can see the local
         | variables of the client code it's enclosed in? And it's all
         | reactive?
         | 
         | That's amazing!
        
         | [deleted]
        
         | tomconroy wrote:
         | Claiming "this is PHP" misses the point entirely, which is
         | turning PHP-like templates into apps that can _react_ to user
         | input
        
           | runawaybottle wrote:
           | What if we put a DOM API into php with a few state hooks?
           | Does that solve it? Because the GP is right, this is PHP.
        
           | Zelphyr wrote:
           | There has got to be a better way of achieving reactive
           | templates than what is described in this project though.
        
             | Spivak wrote:
             | I mean sure but you can't get over the need to have a two
             | way pipe of some kind to pass events server <-> client.
             | Like no matter what you've got two balls of state with
             | bidirectional relationships between them.
        
             | theptip wrote:
             | I think Phoenix LiveView (posted recently on HN:
             | https://fly.io/blog/how-we-got-to-liveview/) and Rails
             | Hotwire (https://hotwired.dev/) are the main alternatives
             | that have momentum right now.
             | 
             | The general idea being to abstract away the difference
             | between client and server code, so that you can write code
             | that handles both, in a single file.
             | 
             | > There has got to be a better way
             | 
             | What's offensive about the OP to you? Is it just that you
             | don't like functional programming / Clojure (fair, that's
             | ultimately a matter of taste / aesthetics at some level)?
             | Or is there something about the technical implementation
             | you think is suboptimal?
        
               | hangtwenty wrote:
               | Thank you for posting those two, I wanted to post them
               | but I don't comment often. Wanted to chip in another
               | contemporary: edelvalle/reactor, which is inspired by
               | LiveView[0].
               | 
               | [0]: https://github.com/edelvalle/reactor
               | 
               | I am using Hotwire for a project, and I'm learning Elixir
               | and Phoenix on the side. Finding edelvalle/reactor was
               | immediately helpful to me though, because I cut my teeth
               | on Python/Django, so reading a Python reference
               | implementation helps me learn nuts and bolts of
               | libraries, faster. (so, I figure that this might help
               | someone else grok how these approaches work.)
        
               | theptip wrote:
               | Thanks for sharing - I currently work with Django so I'm
               | very happy to see an equivalent library in that
               | ecosystem.
               | 
               | Have you found any issues with Reactor, areas where it's
               | behind Hotwire, etc?
        
         | [deleted]
        
         | [deleted]
        
       | j45 wrote:
       | Am I missing something or is reactive clojure a web framework for
       | a language too?
       | 
       | I don't recall Clojure being a web centric language like PHP,
       | ASP, etc.
        
         | askonomm wrote:
         | ClojureScript (JS target) is as web-centric as you can think,
         | with what you can write front-end apps, Node.js apps, React and
         | React Native apps, using Clojure.
         | 
         | Clojure (JVM target) can do back-end web as well as Java can,
         | as well as anything else that Java can.
         | 
         | Clojure is a general-purpose programming language, so it can do
         | pretty much anything.
        
       | pgt wrote:
       | The Web After Tomorrow beckons: https://tonsky.me/blog/the-web-
       | after-tomorrow/
       | 
       | Well done, @dustingetz!
        
       ___________________________________________________________________
       (page generated 2021-09-23 23:00 UTC)