This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2023-12-01
Channels
- # adventofcode (170)
- # announcements (3)
- # babashka (1)
- # beginners (25)
- # cherry (1)
- # cider (3)
- # clj-kondo (5)
- # cljsrn (9)
- # clojure (27)
- # clojure-art (2)
- # clojure-europe (11)
- # clojure-nl (1)
- # clojure-norway (26)
- # clojure-sweden (2)
- # clojure-uk (5)
- # code-reviews (12)
- # component (8)
- # conjure (1)
- # data-science (2)
- # hyperfiddle (6)
- # malli (5)
- # off-topic (65)
- # overtone (34)
- # polylith (3)
- # re-frame (2)
- # reagent (2)
- # releases (3)
- # rum (1)
- # shadow-cljs (2)
- # slack-help (8)
- # sql (8)
- # squint (100)
- # thejaloniki (3)
- # tools-build (16)
- # vim (7)
- # yamlscript (1)
Hi, are there blog posts/case studies about Nubank, in particular around scaling up teams with Clojure being the main stack? I'm trying to share a success story with my team, they're afraid of not being able to recruit in the future if the tech stack will be built on Clojure
Have you read over the Nubank engineering blog? https://building.nubank.com.br/engineering/ They talk about onboarding and junior developer experiences, as well as all the ways Clojure has helped them.
You may also like these experience reports: https://www.youtube.com/watch?v=zsTXte3p0Uk
Growing Clojure inside the company (by Srihari Sriraman) https://www.youtube.com/watch?v=yEHBGQd33o4 This talk gives a company’s perspective in growing Clojure’s adoption internally. It details the beginner → intermediate → practitioner journey from a mentorship standpoint, and takes a “it starts at home” outlook in building the Clojure community and popularising the language. There isn’t a one-true-path to the challenges of growing a language’s adoption inside a company. I am looking to share what I have learned from our consulting experience over the last 10 years.
Why Clojure? - Derek Slager https://www.youtube.com/watch?v=BThkk5zv0DE “Why Clojure?!” is a question I’m asked frequently as the CTO of a startup using Clojure and ClojureScript as our foundational languages. Is Clojure really appropriate for a growing company with multiple teams of developers? Why not choose something more mainstream? This talk will answer these questions, and reflect on more than a year of development on a complex application with a large engineering team. Derek Slager is the CTO of Amperity, a Seattle based company building an at scale data platform with Clojure and ClojureScript.
On the technical side: Clojure is a JVM language - once you deploy your jars to the server, the server doesn’t know or care if its java/goovy/Clojure/Scala. It’s all the same thing to it. Clojure has basically the same performance as Java (there’s not lots of extra overhead - you can write algorithms in Clojure that are exactly the same performance as the java version). Clojure also has access to the full JVM ecosystem. So you can use Java libraries if you want to. So basically as long as you have confidence in Java for a project then you can have at least equal amounts of confidence in Clojure. On the recruiting side: There are plenty of Clojure developers out there. The average skill level is higher than other languages - so you typically save time by interviewing fewer people. If you can’t find enough experienced Clojurists, then it’s actually quite a small language (so it’s fast to learn) - people can learn enough to be useful in a couple of months.
Wrt the hiring angst: https://www.reddit.com/r/Clojure/comments/17brs54/clojure_hiring_experience_from_a_saas_company/
You can also find some things by Ron Minsky about hiring devs for ocaml, which is an even smaller pool than Clojure
Re: hiring -- we've hired for three technologies over the last decade: JS, CFML, and Clojure. The quality of the Clojure applicants was, in general, far higher than for the other jobs even tho' we got fewer candidates. Hiring for both JS and CFML was depressing in different ways: we did get a few gems for the JS gigs but we had to wade through literally hundreds of mostly terrible applicants; CFML is another niche JVM language but it has historically focused on ease of learning and because of its proprietary origins (despite there having been multiple OSS versions for about a decade now) it has always been an insular community that doesn't do much OSS work and has been very, very slow to pick up "modern" practices for software development... so we were getting applicants with well over a decade of experience but they were basically still junior developers 😞 Overall, I'd saying hiring for Clojure is easier than a lot of other technologies -- applicants tend to be keen on learning, self-motivated, interested in best practices, and there's fewer of them so you can spend less time on the process.
> Wrt the hiring angst: > https://www.reddit.com/r/Clojure/comments/17brs54/clojure_hiring_experience_from_a_saas_company/ Oh, that's really nice to read -- my impression is similar to Sean's but it's nice to have an up-to-date confirmation that the hiring pool is still really strong 😄
Are any of you on Bluesky (https://bsky.app) yet? I quite enjoy it so far, but am looking for more people from the dev community to follow. If you are on there, feel free to drop a link to your profile in a 🧵 I also have a couple of invite links if there is interest.
If you are on there, you can find me here: https://bsky.app/profile/jdurstberger.bsky.social
I absolutely, vehemently hate this practice - not being able to see what's what without creating an account.
They’re rolling out public viewing soon but people are mad about it for reasons
To be fair, it is still in beta, and invites are required.
At this point, I've seen close to a dozen of similar services, all invite-only either initially or pre-launch. I don't remember their names at all. :) Maybe they exist in some sort of shadow Internet, but something tells me they just don't. But yeah, we'll see.
My hope for Bluesky is that it is just trying to replicate 'good old twitter' at lest for now and that Jack Dorsey is on the board. But yeah. I am still sad about Twitter 😕
https://bsky.app/profile/seancorfield.bsky.social -- but I use it for social/political stuff mostly (like Facebook). I'm @U04V70XH6@tech.lgbt on Mastodon which I use for IT stuff (and also queer/political stuff), and also @U04V70XH6@clj.social but that's mostly because I'm one of the admins for that instance. I'm also still on Twitter (I will not call it X) but hardly use that at all now but still post occasionally about Clojure (and politics), and Threads (social/political). I'm seancorfield pretty much everywhere.
@U05S0RG9C6Q sent via private message
A few up for grabs: bsky-social-u4twm-c5ja6 bsky-social-ythfp-oy2as bsky-social-jbgn7-4tyav bsky-social-vaeoy-v4kbe bsky-social-afke2-g7ful
In non-clojure languages, how would you call compile-string*
(where another function is called compile-string
- since *
is prohibited in JavaScript function names, what would the compileString<...>
name for that?
Nearly what Martynas said but I'd go with _compile_string
, one leading underscore (& presumably snake_case rather than kebab).
You could also write compile-string_STAR
or similar.
Oh, I was assuming the inner fn was a private implementation detail. compile_string_impl
is kind of gross, but maybe that? 🤷
You mean like conventions? In F#, it is a '
suffix. In other languages I have seen a Aux
suffix.
another option would be to change the return value based on an option, but that's maybe also a bit gross
"Ex" is one thing, "Internal"/"Inner" might be another, then "Step", a sort of Hungarian notation, and so on.
In TypeScript and Swift you'll often see stuff like compileNormalizedStringIntoInternalModel
and compileGenericStringIntoExternalModel
.
One key question if it's public is: under what circumstances would people call compile-string
vs compile-string*
?
compile-string
return a single string, compile-string*
returns the compile state which can be passed back into compile-string(*)
I kinda wish I hadn't introduced compile-string
and always went with compile-string*
, but I guess that would be a breaking change
Too late to change the original compile-string
name, then?
Otherwise you could do something like compile-string-to-string
(but less terrible) vs the new one being compile-string
...
Will the resulting compile state always be passed back into one of the fns to get a string in the end? If so, maybe compileStringPartial
?
@U077BEWNQ compile-string*
also returns the string in one of the keys in the returned map
import { compileStringEx } from 'squint-cljs/index.js';
// repl = output suitable for REPL
// async = start in async mode (allows top level awaits)
// context: 'return' = start in return context since we're going to wrap the result in a self-calling function
// elide-exports: do not emit exports, since they cannot be evaluated by `eval`
const opts = {repl: true, async: true, context: 'return', "elide-exports": true};
const res1 = compileStringEx('(ns foo) (def x 1) x', opts);
// we evaluate REPL output in an async function since it may contain top level awaits
function wrappedInAsyncFn(s) {
return `(async function() {\n${s}\n})()`;
}
// the following gives 1 like expected
console.log(await eval(wrappedInAsyncFn(res1.javascript)));
// pass res1 which contains compiler state
const res2 = compileStringEx('x', res1);
// since we're evaluating x in the same namespace it was defined in, evaluating
// the returned javascript gives 1
console.log(await eval(wrappedInAsyncFn(res2.javascript))); // 1