[HN Gopher] Building a Startup on Clojure
       ___________________________________________________________________
        
       Building a Startup on Clojure
        
       Author : drikerf
       Score  : 156 points
       Date   : 2022-10-04 15:06 UTC (7 hours ago)
        
 (HTM) web link (wobaka.com)
 (TXT) w3m dump (wobaka.com)
        
       | alfl wrote:
       | Echoing some of the other posters here: Clojure is fantastic,
       | hiring (several) Clojure developers is hard.
       | 
       | Conversely, you can also get to the end of your roadmap quickly
       | (Clojure being great) and end up overstaffed.
       | 
       | There's a different line to walk with languages like Clojure.
       | 
       | Source: I walked this line.
        
         | kubb wrote:
         | Why not hire good non-Clojure devs and bootcamp them in Clojure
         | over a month?
         | 
         | Ah, you probably want to pay them 70k/year.
        
         | thih9 wrote:
         | Wouldn't these two average each other out long term?
        
       | bhanumanish wrote:
        
       | jwr wrote:
       | Having built a business on Clojure: I'd highly recommend it.
       | Stable, developed in a mature way over many years, with a
       | fantastic and mature community.
       | 
       | Together with ClojureScript it's one of very few solutions for
       | writing server/browser apps with shared code, which enables
       | interesting economies.
        
         | udkl wrote:
         | I would love to read a little about partsbox and the clojure
         | behind it. Do you have an article published ?
        
           | jwr wrote:
           | No, I don't, but I probably should write one. I write about
           | my experiences in various posts/comments from time to time,
           | but that is lost after several minutes, as The Internet moves
           | on to the next shiny thing :-)
        
         | iLemming wrote:
         | I have not built a business with Clojure and I wouldn't
         | recommend it. For the reason that I'm hoping one day to build
         | one and beat the averages. Stay away from Clojure, or else...
         | :)
        
       | [deleted]
        
       | ithrow wrote:
       | Besides being fun for sure because you can use whatever you want
       | for your own stuff I don't see what's special about clojure here.
       | They are using react (behind a wrapper), IME, clourescript is not
       | worth the hassle. On the server they are using ring/compojure
       | which is similar to js/express, python/flask that can get the job
       | done equally well in this case. The story would be more
       | interesting if they were using something like datomic instead of
       | postgres since datomic is were clojure could differentiate
       | itself.
       | 
       | Keep in mind that they have to juggle between almost four
       | different languages, Java, Javascript, Clojure and Clojurescript,
       | almost because there are differences between Clojure and
       | Clojurescript. Instead of for example just using one language:
       | JS.
        
         | jwr wrote:
         | > clourescript is not worth the hassle
         | 
         | ClojureScript is one of the main reasons why Clojure makes
         | sense in my business. I can use the same language and share the
         | same business logic code between the server and the browser
         | app. That's huge!
         | 
         | Also, I avoid a load of problems related to communication and
         | serialization, because the native serialization format is EDN,
         | e.g. Clojure data structures. There is no need to adapt your
         | data structures to the limitations of, say, JSON.
        
           | thih9 wrote:
           | If using the same business logic is one of the main reasons,
           | why not JavaScript / TypeScript?
           | 
           | Also, what are the limitations of JSON that EDN handles
           | better?
        
             | jwr wrote:
             | JavaScript is one of the few languages that works well both
             | in the browser and on the server side. I don't think this
             | is the time or the place to explain why I didn't write my
             | software in JavaScript -- let's just say that I don't think
             | I could handle the incidental complexity in my team of size
             | 1.
             | 
             | As for JSON, others have replied, but my point was perhaps
             | not very well made. It's not just the limitations of JSON
             | itself. By using the same language on both sides, I can
             | avoid adapting to the limitations of any transit format. In
             | other words, I can (pretty much) pass native data
             | structures through and get them out on the other side. In
             | my case, that means not just maps and vectors, but also
             | sets, keywords, or UUIDs. Can this be done with JSON? Sure!
             | But then I'd have an entirely new bug area to deal with
             | (encoding/decoding, forgetting to coerce, etc).
        
             | kaba0 wrote:
             | Arguably the JVM is a better backend platform, due to
             | better performance, observability, scalability, parallelism
             | (it is not even a competition, and then we haven't even
             | talked about Loom), plus the least objective point of mine,
             | more stable, battle tested libraries.
        
               | ithrow wrote:
               | That's like saying that C++ is a better backend platform
               | than the JVM due to better performance. For 95% of
               | business web apps out there it doesn't matter, I mean,
               | multiple business with evaluations in the billions of
               | dollars have been created with runtimes 50x slower than
               | nodejs.
               | 
               | Nodejs competes with Java in single threaded performance,
               | I'll say normal JS code is faster than normal Java code.
               | For web services that are IO bound, nodejs still competes
               | with Java unless you go with all the batshit crazy
               | complex reactive stuff in the Java world, supposedly is
               | going to get better with the new green threads
               | implementation.
        
               | kaba0 wrote:
               | You may have missed the other 10 reasons I listed besides
               | performance.
               | 
               | Also, no JS code will be faster than Java. While both
               | have insanely good JIT compilers that can output some
               | truly, often surprisingly great machine code, java is
               | all-around faster, if for no other reason, due to its
               | killer GCs.
        
               | [deleted]
        
             | ajgrover wrote:
             | I don't use Clojure but based on a quick search, EDN is
             | extensible so you can serialize things like datetimes and
             | UUIDs with type information rather than as plain strings
        
             | leiferik wrote:
             | Some advantages of EDN:
             | 
             | * Can represent sets `#{1 2 3 4 "foo" "bar" true false}`
             | (JSON only supports arrays)
             | 
             | * Maps/sets can contain arbitrary EDN as keys/values. `{[1
             | 2] "foo", 5 :a, "5" :b, true -1, false 5}` or `#{[1 2] #{3
             | 4} (5 6)}` (JSON only supports string keys on "objects")
             | 
             | * Supports clojure types like keywords (`:foo`, `:bar/baz`)
             | and symbols (`foo`, `bar/baz`), and can be extended to
             | support other values as well
        
               | kaba0 wrote:
               | I could probably look it up myself, but does EDN support
               | comments?
        
               | dimitar wrote:
               | Yep, two types in fact, line comments with ; and a
               | discard sequence - you can tag code that is read (so it
               | must be correct), but then discarded. We have edn files
               | that are well documented with comments.
               | 
               | https://github.com/edn-format/edn#comments
        
               | kaba0 wrote:
               | I thought so -- then it is strictly better than JSON.
        
               | jdminhbg wrote:
               | EDN also contains support for date and UUID literals, the
               | former of which is a huge pain when using JSON and
               | needing to communicate which standard you're using and
               | remember to encode/decode on each side of the wire.
        
               | thom wrote:
               | Plus you can even write your own reader literals to
               | enhance your data format. Aero does this well/horribly
               | depending on your taste but it's a cool mechanism for
               | declarative formats.
        
               | ithrow wrote:
               | 1. Objects are sets of keys
               | 
               | 2. JS has Map/Set which allow other composite types as
               | keys and can be converted to objects for JSON
               | serialization then deserialize back to Map/Set.
        
               | joshlemer wrote:
               | Yeah but still you have to admit, there's quite a lot
               | more friction and ambiguity in that approach. Do I
               | represent a map as                   [           ["key",
               | "value"],           ["otherKey", "otherValue"]         ]
               | 
               | or                   [           {"key": "key", "value":
               | "value"},           {"key": "otherKey",
               | "value":"otherValue"}         ]
               | 
               | or something else? And how can I distinguish between
               | values which just happen to look like maps but are
               | actually not maps? And what if the service I'm talking to
               | does it differently? What if I'm comparing or sorting two
               | JSON values, don't I have to modify the
               | equality/hashcode/ordering logic now to interpret
               | [           ["key", "value"],           ["otherKey",
               | "otherValue"]         ]
               | 
               | and                   [           ["otherKey",
               | "otherValue"],           ["key", "value"]         ]
               | 
               | as being equal and implement a new hashcode/ordering
               | which treats them as equal?
               | 
               | Quite a lot easier when this is just native to the
               | format.
        
             | outworlder wrote:
             | > If using the same business logic is one of the main
             | reasons, why not JavaScript / TypeScript?
             | 
             | Because Clojure is better designed. As are many other
             | languages.
        
       | ar7hur wrote:
       | We built Wit.ai on Clojure and it was one of the best decisions
       | we've ever made.
       | 
       | Most engineers we hired has no prior experience but learned
       | quickly. It gave us a great advantage to hire the best.
        
       | georgeoliver wrote:
       | It was interesting to me the author seems to use 'old-school'
       | Clojure, for lack of a better phrase, with lein as the build
       | tool, etc., rather than more recent tools/stacks; I don't use
       | Clojure myself, is my impression off?
        
         | jwr wrote:
         | Something being "more recent" doesn't necessarily make it
         | better :-)
         | 
         | I use leiningen, too. I tried other approaches, but had trouble
         | getting them to do everything that I need (for example, AOT
         | compilation of the entire code that goes into the final .jar),
         | and I couldn't really see any massive advantages.
        
         | synthc wrote:
         | deps is more flexible, but I you just want to run a repl, build
         | and deploy code then lein still works fine.
         | 
         | I usually default to leiningen: I can't be arsed to spend time
         | configuring deps to do what lein does out of the box. (For
         | example: building an uberjar)
        
       | onion2k wrote:
       | If I was choosing a language to base the tech stack for a startup
       | on these days I'd be very reluctant to pick anything that didn't
       | have a local user group. Slightly more esoteric languages that
       | enable you to write better code faster are brilliant, but if
       | you're successful enough to grow quickly, or you can raise
       | funding, you'll need to hire devs relatively early on. If you've
       | chosen a stack that's _too_ esoteric then this will be a huge
       | blocker to making any real progress.
       | 
       | When I did my last startup we switched from a Python API to Node
       | for this reason. Python is a great language but there are _no_
       | devs available where I live. I can 't even imagine considering
       | Clojure unless I was in a major tech hub.
       | 
       | The move to remote work is probably going to be a _massive_
       | benefit to building in less mainstream languages.
        
         | bsder wrote:
         | > Python is a great language but there are no devs available
         | where I live.
         | 
         | Wow. Where on Earth do you live? Real question, not being
         | sarcastic.
         | 
         | Presumably not the US. I've found Python developers even in
         | some fairly small towns (approx 25K people).
        
         | mradek wrote:
         | Also a point for node: in the time people have argued about how
         | node sucks (some valid points, all easily mitigated) and how X
         | is better, they could have already shipped a bunch of nice
         | features.
         | 
         | Focusing only on web stuff.. If you have a good grasp of design
         | patterns and you can build out your system in a modular way, I
         | think node is a great starting point.
         | 
         | I love starting with node because typescript is awesome, the
         | performance is nice, the community support is tremendous, the
         | scaling is easy, and finally it's easy to move off it. If some
         | part of the system starts becoming a bottleneck, just swap that
         | piece out for something more suitable. One thing I like about
         | this time right now is that most things are built just fine to
         | be used in creating something new and useful products.
        
         | outworlder wrote:
         | > If you've chosen a stack that's too esoteric then this will
         | be a huge blocker to making any real progress.
         | 
         | Clojure is... esoteric now? I would understand if we were
         | talking about, I don't know, INTERCAL. But Clojure? Is Scala
         | 'esoteric' too?
         | 
         | > Python is a great language but there are no devs available
         | where I live.
         | 
         | Ah, I see. Yeah, by that measure Clojure will be esoteric
         | indeed. Python developers being rare is very surprising.
        
           | kaba0 wrote:
           | Maybe exotic is a better word? It is certainly not seen as
           | often as Java is, but it is no Malbolge.
        
           | AyyWS wrote:
           | last 6 months job listings from itjobswatch.co.uk
           | 
           | Python - 23,146
           | 
           | Java - 19,800
           | 
           | Scala - 2,274
           | 
           | Clojure - 291
        
         | DrBenCarson wrote:
         | Counterpoint: building in esoteric languages can serve as a
         | filtering mechanism in and of itself. Given how broad the
         | swaths of JavaScript and Java developers are, they can be much
         | more hit-or-miss.
        
           | Huh1337 wrote:
           | Counterpoint counterpoint: Esoteric languages attract PL
           | nerds, who are much more interested in using every
           | new/different "expressive" feature of the language than in
           | getting business done using clear code understandable by
           | anyone on almost any level.
        
             | jmfldn wrote:
             | Counterpoint X 3
             | 
             | True. But if you have a good well-enforced, sane style
             | guide, then expressive powerful languages can be a good
             | thing. If you hire devs who care more about playing with
             | the language than delivering value then you're hiring the
             | wrong people. You can't ditch these languages because some
             | people are sometimes attracted to them for the wrong
             | reasons.
        
               | tensor wrote:
               | I actually did start a company using Clojure. All these
               | points are true. Yes, it helped filter candidates in the
               | early days, and also helped attract people to jobs that
               | might otherwise not be that interesting or competitive.
               | It's difficult for pre-funded companies to compete with
               | the FANG companies.
               | 
               | However, there were negatives. At the time the Clojure
               | library landscape was less mature. Clojure developers
               | would also tend to abandon projects to create "the next
               | best version" which made migrating and keeping up with
               | the libraries of the day difficult. Most of the libraries
               | were very rough around the edges too. On the other hand
               | we could use any Java library which was a boon.
               | 
               | As the team grew, it became harder and harder to hire
               | people in larger numbers. Especially in a single
               | timezone. Also it became apparent that many of the people
               | who were very happy in the early days, were increasingly
               | less happy as we added standardization and protocol to
               | our dev process. As some commenters pointed out many of
               | the people attracted to Clojure liked playing with the
               | latest and greatest, and things were "boring" when they
               | couldn't work with whatever the latest fast changing
               | trend in the community was. Trying to teach people
               | Clojure also an issue. For some it was challenging, and
               | for others, they were not really interested in using it.
               | 
               | It was a good learning experience, but I don't think I'd
               | do it again. There is something to be said for using
               | "boring" technology for the majority of your tech stack.
        
               | kochb wrote:
               | I also founded a company which built a large portion of
               | our backend on Clojure, using it through Series C. Your
               | experience matches ours verbatim.
        
               | brokenkebab2 wrote:
               | I must note switching from novelty to boring phase is a
               | crisis which every growing project will come through once
               | it starts to expand its workforce. I saw it in teams with
               | very average tech stack many times.
        
               | WFHRenaissance wrote:
               | Counterpoint Part 4:
               | 
               | Esoteric languages by-nature have smaller populations of
               | devs. They demand higher salaries for their specialist
               | work. This can hurt you as you scale - salaries continue
               | to increase (secularly), and the pool of possible
               | engineers begins to shrink within your locale.
        
               | jmfldn wrote:
               | Yep. This is also true.
               | 
               | Hopefully WFH helps there. In my niche Scala it does. We
               | can hire more broadly. We also hire ppl with an aptitude
               | for Scala and keep our style simple. That helps.
        
               | closeparen wrote:
               | If you hire developers based on the languages they know /
               | think of languages and stacks as part of the long-term
               | identity of a developer, then you should not use esoteric
               | ones. This is well known! On the other hand significant
               | parts of the industry don't do the former, so they are
               | free to do the latter.
               | 
               | As an example, nobody knows Go when we hire them to write
               | it.
        
           | rr888 wrote:
           | > building in esoteric languages can serve as a filtering
           | mechanism in and of itself.
           | 
           | Yes, definitely in growth periods you get the best developers
           | migrating to it. I'd say Rust is like this now. The problem
           | is a few years time they'll move on to the next big thing
           | leaving you stuck. I'd think Clojure is in this spot right
           | now.
        
           | vikeri wrote:
           | Having been at a Clojure startup I can second this, despite
           | our non existent brand we found great candidates. And
           | teaching a smart junior developer Clojure wasn't harder than
           | teaching people Ruby or Java. As soon as the initial lisp
           | shock is over learning is much faster due to the simplicity
           | (it's just data).
        
             | jwr wrote:
             | Good point! In my experience, you don't need to hire
             | "Clojure developers". Look for good candidates that have
             | worked with functional programming languages and you'll be
             | fine. They'll get up to speed in a matter of weeks. Any
             | flexible and educated developer can use Clojure, it's not
             | magic.
             | 
             | In other words, it's not about hiring a "Clojure
             | developer", it's about hiring a good developer.
        
           | onion2k wrote:
           | Countercounterpoint: People can be terrible at Clojure. The
           | distribution of ability probably doesn't vary much between
           | languages.
        
             | masklinn wrote:
             | It absolutely does, because there's a self-selection in
             | being interested in an esoteric langage (assuming it's not
             | a corporate oddball or legacy langage) which raises the
             | average above the background of targeting "employable"
             | langages: people going through this process show more
             | interest in the field.
             | 
             | Though that doesn't mean they'll be more productive, and
             | then adds hiring challenges. So the break-even is not
             | simple.
             | 
             | One of pg's early essays was on exactly that subject ("the
             | python paradox).
        
               | kagakuninja wrote:
               | As a Scala dev, I had a similar belief as you: Scala
               | using companies seemed to have higher calibre
               | programmers. Until my current job at a major Telecom.
               | 
               | The code is all Scala, but written by a bunch of ex-Java
               | devs. I have made attempts at education, and the code is
               | improving, but the fundamental structure of the services
               | are bad, and there is still a lot of bad code. I am not
               | saying this as a FP purist, some of the code would be bad
               | by the standards of Java programming.
               | 
               | Bad programmers then hire other bad programmers. Because
               | it is hard to find experienced Scala developers, they
               | have brought in people with java experience, or big data
               | Python programmers who claim to have some experience
               | using Scala with Spark. I am now involved in the hiring
               | process, and it is slow and dismal. To be fair, the kind
               | of contractors this company hires are mediocre,
               | regardless of language.
               | 
               | The features of Scala create novel ways for confused
               | programmers to screw up, and we aren't even doing
               | anything esoteric, like pure FP. I suspect there are some
               | similar traps in Clojure.
        
               | bcrosby95 wrote:
               | Scala's problem here is largely historical.
               | 
               | When it was released, there were two camps to adopt it:
               | people that wanted an FP, and people that wanted a better
               | Java. Since Java went through a long period of
               | stagnation, most of the Scala code out there is written
               | by Java developers that just wanted a better Java.
               | 
               | Kotlin has stepped in and replaced Scala for "better
               | Java" role. But this history has left a pile of crap code
               | written by people who didn't want to use Scala.
               | 
               | Clojure doesn't have this problem because you couldn't
               | ever use it as just a better version of Java.
        
               | throwaway5959 wrote:
               | Had this exact experience trying to hire at startups for
               | Scala/Spark. There's only so many Scala devs to go
               | around. It also doesn't help that "good" Scala is highly
               | subjective, with different levels of Scala from better
               | Java to functional paradise.
               | 
               | I've been happily coding (and hiring) in Python for the
               | last four years or so. Still doing Rust and some Scala at
               | home where deadlines don't exist and hiring is a non-
               | issue.
        
               | [deleted]
        
         | drikerf wrote:
         | I haven't gotten to that stage yet. But I think it's difficult
         | to hire good devs for all stacks, be it Python, Ruby, JS.
         | Clojure community is super friendly and full of very talented
         | developers and I'd love to pay someone to write Clojure :).
         | 
         | Yes, remote work for sure is an edge when hiring!
         | 
         | Also reminds me of the essay "The Python Paradox" by Paul
         | Graham (http://www.paulgraham.com/pypar.html)
        
           | heneryville wrote:
           | 2 years ago I was hired into a Clojure based start-up with no
           | experience in Clojure. It is easy to learn, and I love it
           | now. One of my duties is hiring, and we don't look for
           | developers with Clojure experience. Instead we look for
           | developers with good skills in any language, and trust
           | they'll be able to figure out Clojure. In a way, it has
           | actually widened our hiring pool since we can't be shackled
           | to the XXX years of experience in YYY approach.
        
             | gdsdfe wrote:
             | Still hiring? :)
        
         | zerr wrote:
         | How long does it take for some non-Python dev to become a
         | Python dev? One week? Two?
        
       | ducktective wrote:
       | While we are at it, anyone knows what's the Common Lisp story in
       | webdev? Both backend and frontend?
        
         | mejutoco wrote:
         | Not an expert, but I would expect hunchentoot
         | https://edicl.github.io/hunchentoot/ for the backend and a
         | Common Lisp "dsl" generating javascript for the frontend.
        
         | aidenn0 wrote:
         | I am a hobbyist lisp developer and have written webapps in CL.
         | 
         | I use cl-who[1] for generating html and parenscript for
         | javascript. I use clack on the backend, but hunchentoot is
         | probably more popular. Both backends have plenty of routing
         | libraries available (hunchentoot comes with a decent one baked
         | in, clack does not).
         | 
         | postmodern is a Postgres specific sql backend that is great.
         | There are database-agnostic SQL libraries as well (clsql and
         | cl-dbi I believe are the two big ones) but I haven't tried
         | them.
         | 
         | 1: People whose opinions I trust have told me that spinneret is
         | a better choice. It did not exist when I learned cl-who. cl-who
         | is "good enough" for me that I haven't switched.
        
       | ldite wrote:
       | Ah clojure. It's all fun and games until five years down the
       | line, you've had 100% dev churn, and you have a 100kloc codebase
       | that nobody understands, full of functions that don't give the
       | slightest hint of the shape of the data they're processing (it's
       | all lists!) yet down the bottom of the callstack there's some
       | function that'll explode if the map doesn't have whatever magical
       | key it expects.
       | 
       | If you're really lucky, someone will have thrown in a bunch of
       | 'specs' that make a bunch of assertions about the data, put them
       | on the API entry points, and then scattered some slightly
       | different specs with slightly more restrictive assertions on
       | various 'internal APIs', resulting in random explosions in
       | production!
       | 
       | And the joy of working with an esoteric language is that it
       | attracts esoteric developers, who often get frustrated by the
       | requirements of being a software engineer in a large company
       | (i.e. everything that's not writing code), which leads to the
       | aforementioned 100% dev churn (after a lot of shouting).
        
         | tasubotadas wrote:
         | > And the joy of working with an esoteric language is that it
         | attracts esoteric developers, who often get frustrated by the
         | requirements of being a software engineer in a large company
         | (i.e. everything that's not writing code), which leads to the
         | aforementioned 100% dev churn (after a lot of shouting).
         | 
         | Wow. Pretty insightful :)
        
         | kbuchanan wrote:
         | Oh man, this is not my experience. We may be different because
         | we are a small company, and Clojure is our main language. But,
         | we have a Clojure codebase of 90K lines, and is 10 years old.
         | It has its problems, and while your points about an opaque data
         | model resonate, for us, tests, specs, and assertions provide
         | enough hints to help newcomers. And... where I disagree the
         | most: the quality and professionalism of the developers who
         | work on it are unparalleled. New, senior-level developers,
         | quickly catch on to the system. I am grateful to Clojure
         | __because__ it attracts this caliber of developer.
        
         | CyberDildonics wrote:
         | What worries me the most about clojure and languages like it,
         | is that seems to be for people who want to be clever with how
         | they write programs, when that is the opposite of what I want
         | from people I work with.
        
           | christophilus wrote:
           | Yeah. Personally, I really love writing Clojure. But I've
           | never run it in production because I have the same
           | reservations. I'd be the overly clever dev in this scenario.
        
         | dustingetz wrote:
         | OK but that's a 500k LOC codebase in javascript/python that
         | nobody understands, maybe the project doesn't even get there
         | 
         | everybody hates their language when they have 100k LOC of tech
         | debt from 8 years ago
         | 
         | You're right that Clojure's sequence soup problem is painful at
         | that scale (really any scale) but have you ever debugged Java?
         | It's barely even possible, the project needs to drive $10M+/yr
         | revenue to just not collapse once it reaches 500k+ LOC Java,
         | 500k XML, 300k SQL ...
        
           | ldite wrote:
           | I should have added that I've had similar experiences with
           | (old school, untyped) python codebases - absent the esoteric
           | programmers, which is not a small difference - although with
           | python you tend to hit performance issues if your call stacks
           | get too deep. Ironically the JVM performance lets you dig
           | yourself into a gnarlier pit before you have to face up to
           | it.
        
           | synthc wrote:
           | Disagree about Java, I've worked on several large Spring
           | applications and making small changes was not a problem at
           | all.
        
           | zmmmmm wrote:
           | > have you ever debugged Java? It's barely even possible
           | 
           | hard disagree ... Java is a dream to debug. I've hacked into
           | complex applications countless times by remote attaching the
           | debugger and setting breakpoints to step through what they
           | are doing. You don't even need source code in many cases. I'd
           | pick Java ahead of any other language on that front.
        
           | seer-zig wrote:
           | Java is one of the very few languages out there that is
           | manageable and debuggable at the large scales you're talking
           | about. The tooling around it is second to none, and because
           | it is statically typed with a decent type system, you can
           | refactor quite safely in general.
           | 
           | And let's be frank, XML, other than for Maven (where it can
           | make sense), is not really a thing in modern Java.
        
         | gered wrote:
         | This is my experience exactly. I love the language and
         | ecosystem in a lot of ways. I also believe that REPL-driven-
         | development is a ridiculously productive way to work.
         | 
         | But I absolutely _hate_ maintaining an old Clojure codebase
         | (unless it 's tiny).
         | 
         | The REPL helps a lot with discovering what the proper way is to
         | call any random function you have in your code, but this is
         | still really super annoying. I really hate to get into a
         | dynamic-versus-static-typing debate, but I've long since come
         | to the conclusion that -- all other things being equal (hah!)
         | -- if I have to dig into a large and old project, I'd much
         | rather have types by my side than not. Code will not ever be
         | adequately documented or commented (and even if it _seems_ to
         | be at first glance, you will always have nagging doubts about
         | how up to date that info really is). This is where type
         | definitions help to figure out the shape of the data that any
         | piece of code is working with. People talk about adding
         | spec/schema definitions but that doesn't solve all the problems
         | with not having type definitions unless you add these
         | spec/schema definitions _everywhere_ ... and let's face it, you
         | just aren't going to do that in any Clojure project. So, best
         | case scenario is you still have a large collection of functions
         | in your project that are calling each other, etc that you are
         | left having to deduce yourself what this random map or list
         | actually contains.
        
           | strikelaserclaw wrote:
           | i'm starting to feel that REPL driven development can be bad
           | for maintenance, when you have a REPL, you can write
           | ridiculously compact and abstract code that is hard to
           | understand just by reading it.
        
             | synthc wrote:
             | With great power comes great responsibility.
             | 
             | When using the REPL you can quickly experiment until it
             | does what you want, but you need the discipline to distill
             | something maintainable from it afterwards.
        
             | gered wrote:
             | That's an interesting point I'd not thought of. I guess I'm
             | more looking at it through the lens of "interacting with
             | and modifying a running system" which kinda gives you a
             | debugger (ish), compiler and execution environment all
             | rolled into one. It's kind of nice to work in this kind of
             | "scratch pad"-like environment while you figure something
             | out versus the more traditional edit-compile-run cycle. But
             | I have definitely seen what you describe as well, so I
             | think that aspect is worth considering too, for sure.
        
             | zmmmmm wrote:
             | It's almost by definition in some sense ... if it was
             | obvious how to write the code you wouldn't need the REPL so
             | by definition if it is uesful it must be producing non-
             | obvious code.
             | 
             | That is a slightly shallow take though because its not
             | really symmetrical like that. You _can_ use a REPL as a way
             | to arrive at the most easily understood rendition of
             | something. But that is very prone to subjective bias as
             | lots of things seem obvious in retrospect that are not at
             | the start.
             | 
             | To the extent that the answer you eventually arrived at is
             | a result of learning a mental model of the data and
             | functions surround it, it will leave a significant residual
             | gap for the next person who comes a long to bridge.
        
           | z9znz wrote:
           | As a Clojure admirer who has learned it enough to get things
           | done (and subsequently forgotten it) twice, I recently had
           | the positive REPL experience that people talk about. Or at
           | least I think I did. I was able to write a web scraping tool
           | almost entirely in the REPL.
           | 
           | However, I find myself running Ruby/Rails (console) in debug
           | mode in RubyMine (Jetbrains IDE). The REPL-like experience
           | seems quite close to that of Clojure, with the added benefit
           | of being able to easily enable and disable breakpoints and
           | see my local data (and snapshots of all previous local data
           | up the call stack).
           | 
           | And honestly, the Clojure thing that always stops me from
           | actually getting a full anything built is the lack of
           | frameworks and approaches which have critical mass. It's
           | always the same answer, "We like to choose our own
           | libraries." That's lovely once you know what you're doing,
           | but the ramp-up time is just SO much slower than with other
           | languages.
           | 
           | Considering the time to working proof of concept is critical
           | quite often, few beginners have time to figure out all the
           | libraries and tooling and integrations to build something in
           | Clojure.
           | 
           | I think despite still wishing I had a Clojure backend with
           | Clojurescript/React frontend, I'll step from my Rails PoC to
           | a Phoenix/Elixir product and be successful and happy (and
           | have a lot of people doing something similar, with similar
           | tools and libraries).
        
             | gered wrote:
             | Yeah the (what I personally call it) "choose your own
             | adventure" style approach to Clojure projects, where you
             | don't use a framework like Rails, but just string together
             | your own project from separate libraries, is really both a
             | "pro" AND a "con".
             | 
             | It's great when you know what you're doing, and indeed, I
             | have my own personal Leiningen templates to set up a
             | Clojure project the way I like it and to save myself some
             | time. Bigger project templates, like Luminus, I often find
             | personally aggravating because I often feel like it just
             | barfs a whole bunch of unnecessary and semi-complicated (in
             | my opinion anyway) code in a new project even with the most
             | minimal options chosen. But that's the power of the
             | ecosystem ... you can create your own project templates to
             | meet your own needs.
             | 
             | But a new developer getting their feet wet in this
             | ecosystem? Yeah, it is hard. And even if they use an
             | existing project template like Luminus to bootstrap their
             | project ... well, the project template only helps generate
             | the initial project. Ongoing maintenance for updating
             | dependency versions and keeping a working integration of
             | the libraries it initially set up for you (with respect to
             | newer versions and any API/config changes, etc) ... well,
             | those responsibilities are all on you! Kit (another newer
             | successor to Luminus) _may_ provide some better
             | alternatives here, but it'll still be limited with exactly
             | how much it can help here. But I think it's still much too
             | early to say one way or the other with Kit, so who knows.
             | 
             | (Also thanks for sharing your Ruby/Rails perspective on
             | REPLs. A colleague of mine made some similar comments to me
             | when we were discussing REPLs a while back, and I've not
             | spent any time with Ruby so couldn't comment. It's
             | interesting to hear! Most other REPLs I've used outside
             | Clojure were not too useful as anything other than quick
             | toys for trying short snippets outside of the context of a
             | full project.)
        
         | Mikeb85 wrote:
         | Of course everything you're complaining about means that the
         | company has been successful enough to get to that point...
         | 
         | Startups that act too much like big companies just don't ever
         | get product out the door and fail before you can bitch about
         | technical debt...
        
         | synthc wrote:
         | I'd say 100% developer churn is the real problem here, no
         | inherited 100kloc codebase is going to be a walk in the park if
         | the original devs are not around.
         | 
         | However, I do think that it harder to keep a large code base
         | understandable when using a dynamic language v.s. a statically
         | typed language.
         | 
         | Having problems with understanding the shape of expected data
         | is certainly a problem experienced in larger Clojure code
         | bases, I guess this is just a disadvantage of using Clojure.
         | 
         | Documentation, tests, spec/schema and good naming conventions
         | can mitigate this disadvantage to some extent.
         | 
         | I found some the advice in this blog post useful:
         | https://tech.redplanetlabs.com/2021/06/03/tour-of-our-250k-l...
        
       | invalidOrTaken wrote:
       | My company (as in "I work there," not "I own it") is I think
       | unique in that it started as an Elixir/TypeScript shop, things
       | went seriously downhill, they brought in a new engineering team
       | (I'm on it), we switched to Clojure, and we're doing fine.
       | 
       | If I were to start a new company I'd _absolutely_ run it on
       | clojure. Even without frontend /backend code reuse, REPL-driven
       | dev--- _paredit_ is the killer app for me. It just makes editing
       | text files, which is what we 're doing if we admit it, so much
       | easier.
       | 
       | It's a data point.
        
       | hypersoar wrote:
       | For me, the killer feature of Clojure is "REPL driven
       | development". The ability to get rapid feedback as you build
       | things up is incredible. I'll make a comment form and evaluate
       | expressions within it to try things out as I go. By the time I've
       | written any reasonably complex function, all of the pieces have
       | been tested on various examples. Once I'm done, the comment form
       | leaves a helpful record of my thought process.
       | 
       | If you're wondering what's so great about the Clojure repl (and
       | other lisp repls) in particular, the thing is that you never have
       | to actually type something into it. You can run evaluations from
       | the code file itself. The structure of lisps makes it clear
       | exactly which code you want to evaluate. To do this, I use the
       | excellent CIDER package for emacs. I understand Calva for VS Code
       | and Cursive for IntellJ offer similar functionality.
       | 
       | Here's a good talk on what this looks like:
       | 
       | https://www.youtube.com/watch?v=gIoadGfm5T8
        
         | staticelf wrote:
         | I don't understand, doesn't most languages these days have a
         | REPL?
        
           | [deleted]
        
         | pedrodelfino wrote:
         | I kind of agree with you. I used to work with Common Lisp in a
         | Desktop App (Nyxt browser). I had some fun playing with Racket.
         | And I love Emacs. So, I am already into the Lisp idea. But, I
         | was kind of disappointed with Clojure which is new in my life
         | and has been used in my current job. Maybe you have a backend
         | bias in your testimony?
         | 
         | I have been working with ClojureScript (re-frame and reagent)
         | on front-end stuff and, unfortunately, the REPL does not seem
         | to help me that much on my workflow. I miss the REPL driven
         | development, by the way... The real "interactive programming"
         | seems to happen on Chrome Dev Tools + Browser's reactions to
         | Chrome Dev Tools tweaks on the UI + (lastly) changes on the
         | source code via the editor (Emacs in my case).
         | 
         | Namespaces as prefix of invocations on the REPL are not that
         | trustworthy on ClojureScript, apparently. It could also be that
         | I am a noob and I missed something, so... How do you feel about
         | ClojureScript?
        
           | jdminhbg wrote:
           | Have you tried Figwheel[0]? This is how I maintain a REPL
           | into a browser-based CLJS application under development.
           | 
           | [0]: https://figwheel.org
        
           | drikerf wrote:
           | Don't know about your exact environment but I've structured
           | my code so most of it is in .cljc files which can be
           | evaluated in browser and on server. This allows me to
           | evaluate/test/run things easily in the emacs repl.
           | 
           | For view code I think hot reloading has been a great thing
           | with Clojure/Script too. Everything is reloaded properly and
           | the state remains.
        
         | seer-zig wrote:
         | Java has `jshell`.
        
           | bcrosby95 wrote:
           | Just like C++ has automatic memory management because of the
           | existence of smart pointers.
        
       | fredrikholm wrote:
       | Greenspun's tenth rule, adopted for 2022:                 > Any
       | sufficiently complicated TypeScript or Java program contains an
       | ad hoc,       > informally-specified, bug-ridden, slow
       | implementation of half of Clojure.
       | 
       | Once you grokk the approach and workflow Clojure takes in solving
       | problems, the distance between having an idea and writing a rock
       | solid implementation of that idea is the shortest I've
       | experienced in my ~20 years of programming.
       | 
       | If you want to write succinct, transparent code whilst minimizing
       | the future potential of introducing bugs, Clojure is as good as
       | it gets.
        
         | xapata wrote:
         | But it doesn't have reader macros!
        
         | synthc wrote:
         | Cute, but i'll counter with this one:
         | 
         | > Any sufficiently complicated Clojure program contains an ad
         | hoc, > informally-specified, bug-ridden, slow implementation of
         | half of Spring.
        
           | bcrosby95 wrote:
           | Ah, Spring - freeing Java developers from the horror of
           | typing "new" since 2002.
        
           | xapata wrote:
           | Including Spring itself?
           | 
           | Jokes aside, can't Clojure simply call whatever you want from
           | the JVM?
        
       | meerita wrote:
       | Question for Clojure's pros: as a designer I started programming
       | javascript for a long time, now I can do my own APIs on Node
       | easily, would it be hard to do APIs in Clojure? Can you recommend
       | me a video course for learn it?
        
         | heneryville wrote:
         | I learned by reading through a book, then working through
         | problems on https://4clojure.oxal.org/. If you've got JS
         | experience it won't take too much effort to pick up. Don't get
         | too carried away with forming the perfect tail recursive pure
         | functional monad or whatever. Get into just doing what you're
         | trying to do quickly, then after you're competent, read other
         | people's code to correct your style.
        
         | drikerf wrote:
         | Clojure is great for writing backends. Checkout Ring and
         | Compojure. Simple libraries for making an API :).
        
           | meerita wrote:
           | Will check those, thanks.
        
       | ghufran_syed wrote:
       | fyi @drikerf, newsletter signup is not working, the error says
       | "magic link failed to send"
        
         | drikerf wrote:
         | Wow, thanks! Recently migrated and seems something went wrong.
         | Fixed now :)!
        
       | as4hretret wrote:
        
       | drfuzzy89 wrote:
       | Always great to see more start ups being built on Clojure! For
       | folks interested, this is a great talk on the same subject:
       | https://youtu.be/L9KcoRZcdbc
       | 
       | Full disclojure: I work for the company in the talk, though I'm
       | not one of the presenters.
        
         | pedrodelfino wrote:
         | The pun is nice (the lecture also seems interest)! I can't
         | believe I never use this pun on my Clojure job...
        
       | marrone12 wrote:
       | One thing to note about coding in Clojure -- if you never learned
       | Java, you hit a wall at a certain point. I only know scripting
       | languages and I had fun writing little scripts in clojure, but at
       | a certain point the lack of java knowledge and it's class system
       | / standard libraries held me back from doing more serious things.
        
       | beiller wrote:
       | I worked at a startup that was built on Clojure. It had trouble
       | finding developers for reasonable salaries at the early mid
       | stage. They decided to switch the stack to python at that point.
       | Just an anecdote!
        
         | silentsea90 wrote:
         | Building a company in Python feels like a bet against yourself
         | ie the company/codebase will never get big enough that using
         | Python (lack of static typing etc) will ever be a problem
        
           | throwaway5959 wrote:
           | In monoliths sure, but if you're building services that are
           | compact and tested it's less of an issue.
        
           | keithasaurus wrote:
           | It's pretty easy to enforce static typing in python these
           | days. mypy and pyright are both pretty mature.
        
             | ajgrover wrote:
             | The problem is that coverage of typing in third party
             | libraries is not that high yet, so it's not really possible
             | to enforce typing in a thorough manner.
        
           | outworlder wrote:
           | If you use Python and you aren't aware of its tradeoffs, yes
           | it is going to bite you.
           | 
           | Dynamic typing and the lack of a formal compilation step are
           | great for productivity, but they come at a cost. You need a
           | proper CI pipeline to run linters (granted, you need that in
           | statically typed languages too) and, most importantly, you
           | need to write tests. Sure, you need to write tests for any
           | language, but not having them for languages like Python is
           | going to bite you that much harder.
           | 
           | I've seen pretty large Python codebases that worked just
           | fine. And smaller Java codebases that were unmaintainable.
        
             | throwaway5959 wrote:
             | With GitHub Actions building a solid CI pipeline has never
             | been easier. I built one with linting, tests, coverage and
             | packaging to ghcr in an hour this weekend for Go. Python
             | would have been very similar.
        
         | aidenn0 wrote:
         | I don't know how any non-FAANG companies in the bay area hire
         | non-junior developers. I have 4 kids and the difference in
         | mortgage payments alone for relocating there is well into 5
         | figures per year.
        
         | jwr wrote:
         | > for reasonable salaries
         | 
         | I think this is the key here. Clojure developers are expensive
         | (see the Stack Overflow charts for how being a Clojure dev
         | essentially guarantees a great salary) -- but that's not
         | because of them being Clojure developers, but rather because of
         | them being more experienced, knowledgeable, and flexible than
         | your "average" developer.
         | 
         | If you start a business and use Clojure, you should expect to
         | hire more expensive developers. You will, however, need fewer
         | of them, so this might all balance out in the end, especially
         | as we all know that teams don't scale infinitely.
        
       | mylons wrote:
       | re-iterating what onion2k said, hard pass on building a company
       | around an esoteric language. enjoy attempting to hire people to
       | work on this. best case you get an eager programmer wanting to
       | learn the language. worst case you get zero experienced hires
       | unless you're a massive success.
        
         | haolez wrote:
         | The real worst case scenario is facing a competitor that's much
         | faster than you on implementing new features and testing
         | hypothesis. Using an esoteric language might be one of the
         | leverages that this competitor has against your tight
         | mainstream stack.
        
           | Scarbutt wrote:
           | In 2022 thinking that your esoteric language is going to help
           | you implement new features faster than with a mainstream
           | language is just plain language zealotry.
        
             | haolez wrote:
             | I disagree.
        
               | mylons wrote:
               | love the substance in your comment
        
           | mylons wrote:
           | i've worked with people like you in the past. they all write
           | books for their language now. none of them correct. it's
           | almost never the language that holds you back. it's the
           | organization and it's priorities. an easy example is
           | instagram and their use of python. they crushed with a
           | language that clojure folx look down on.
        
         | capableweb wrote:
         | That "best case" seems dishonest at best. How is the best case
         | not "Best case you get awesome programmers with lots of
         | experience and knowledge about what Clojure is all about, being
         | able to ship software better than anyone else" or similar?
         | 
         | Clojure has pitfalls for sure, but no need to be dishonest in
         | order to flag them.
        
       ___________________________________________________________________
       (page generated 2022-10-04 23:00 UTC)