Become a Creator today!Start creating today - Share your story with the world!
Start for free
00:00:00
00:00:01
#50 - Michiel Borkent a.k.a @borkdude image

#50 - Michiel Borkent a.k.a @borkdude

defn
Avatar
58 Plays6 years ago
For our #50 episode we catch up with Michiel Borkent from the the Netherlands to discuss old English literature, Haskell and a bit of Clojure and the tools he is building to help the Clojure Devs! Checkout his latest talk at Clojure Days: https://www.youtube.com/watch?v=Ygrml6tyrq0 Links of Interest: * https://github.com/borkdude * https://github.com/borkdude/clj-kondo * https://github.com/borkdude/speculative * https://github.com/borkdude/re-find and https://re-find.it
Transcript

Celebrating Three Years

00:00:14
Speaker
OK, so welcome to Deaf and Episode number 50, and it is our third anniversary show. And it's fucking amazing. I mean, three years. You're right on brand with the fucking amazing introduction, Vijay. Yeah, exactly. I think we need to live up to our expectations, you know. Yeah. So episode number 50.
00:00:41
Speaker
I don't know what to say, but I think we have one of our best friends and friends of the show, friend of the show, and also master tweeter, Mr. Michiel Borkand. We just did the calculation. We found out he is tweeting like one tweet per hour or something. Anyway, welcome to the show, Michiel.
00:01:02
Speaker
Thanks a lot for inviting me. Yeah.

Meet Michiel Borkand

00:01:05
Speaker
So, Ray, I think we need to do some introduction or something. It's episode number 50, so fuck it. I'm Vijay from Netherlands. Yeah. I'm Ray from Belgium, really from the UK, but living in Belgium. So, you know, sound UK-ish for a reason, but, you know, living in the wet and weary Belgium at the moment. But, you know, avoiding Brexit, thankfully, which is good.
00:01:31
Speaker
We'll, we'll get there. I mean, this has become purely political show these days. So fuck it, you know? So Miquel, maybe a quick introduction. Let's be nice to our guests as well, you know? Yes, yes. So Miquel, you've paid to be on. What have you got to say for yourself? Yeah, well, I'm the fanboy joining the band, right? Yeah. It's so good to have you on the show, mate. It really is. Yes.
00:01:59
Speaker
So you just said that you're in the reduce all the distractions and don't do shitty stuff phase. So why are you on the show? Well, the show sparks a lot of

Vegan Lifestyle and Podcast Humor

00:02:09
Speaker
joy. So I removed all the podcasts that I found are getting in the way, but definitely stays in my list.
00:02:19
Speaker
together with some other Closure Podcasts, but from Europe, the Vegetarian Closure Podcasts are definitely number one. I think this is one of those times when all three of us are vegetarians, right? I think so, yeah. I think Michael is even a vegan. Yeah, yeah, Michiel. Sorry, Michael. Michiel.
00:02:49
Speaker
Yeah, but we can focus on the things that are similar. So we're all vegetarian right now. Yeah, that's true. Fair enough. As long as you're not non-vegetarian, you know, that's good. Yeah.
00:03:04
Speaker
So, Michael, please don't leave me while you're listening to this episode is what we're trying to say. You know, I mean, in the privacy of you on forums, you can do it. I listened to an old show yesterday just to get into the into the vibe of this show. And it was actually the show with Alex Miller in 2016, just before the euro closure. All right. And you were also saying this to him like, well,
00:03:30
Speaker
Okay, it's okay that you're not a vegetarian, but please don't eat meat during the show. We keep using the same jokes, you know? I think that's what he's telling us. Alex said like, oh, I actually have some beef jerky on my desk, but I won't touch it while I'm doing the show.

Michiel's Closure Journey

00:03:50
Speaker
So, Michael, maybe, because of course, you know, we know each other for a fairly good amount of time. Obviously, how do you know each other, Vijay? Let's give a little bit of background for the people out there. I think it's better, Michael. Okay, so how did I meet Zije, the story? Oh, shit. The 50th show, you get the big reveals now. Now you know.
00:04:20
Speaker
I think I saw VGA for the first time at the Amsterdam closure meetup, I think, probably at Backbase company that hosted the meetup. And I remember VGA saying, well, I have to wait in Amsterdam for my Mac to be repaired.
00:04:41
Speaker
You were bringing your mech to the genius bar. During that waiting you went to the closure meetup. So I think I saw you there for the first time. Did you just walk in off the street, Vijay? Is that the idea? That's the whole idea. There's some room down the road here. I've got some bullshit going on. Oh, okay.
00:05:04
Speaker
At least it's not like we met him. The full chrono, like the full time frame, but I also remember that Vijay, he organized the closure meetup in Rotterdam. Yeah. I went there also a few times. But I also worked with Vijay once.
00:05:32
Speaker
and at a closure project in the commercial setting. That's probably 2013. Yeah, I think so. Maybe 2011, 12ish, or maybe 13. I don't exactly remember. Yeah, sometime during. It was 2013 because that was the year I left my job as a lecturer.
00:05:54
Speaker
Yeah, so you're coming from academia into commercial, quote unquote, commercial thing. That was a Datomic project, right? Datomic Angular. And yeah, it was an interesting, I think probably one of the first projects in the Netherlands, probably, with ClosureShit. Probably, yeah. Wasn't it very nice? Was ClosureShit the, was that the forerunner to ClosureScript, ClosureShit?
00:06:20
Speaker
Yeah, yeah. Before ClosureScript was introduced, there used to be another language. We know from 2013, which is like ages ago. Yeah. Pre prototypes. Like commercial closure projects. Protocols. They've done that, you know. In 2014 already.
00:06:38
Speaker
Oh, man. Yeah, good times. I think it was probably the initial version of Datomic and also the Immutant was the web server. And then Angular was the front end for that one.

Impact of Closure in Education

00:06:52
Speaker
Yeah, I always try to avoid that part of code base. And I think I managed pretty well. So that's how we met.
00:07:03
Speaker
Yeah, I kind of think. And then later, I think we kept bumping into each other a lot into the closure stuff. So enough about our stuff. So Mihiel, I know that you were already teaching closure, or you actually wrote a book in closure before coming to that project, right? That's true, yeah. So I was a lecturer before that job.
00:07:31
Speaker
Started in 2010 and I did it for three and a half years. And well, in the beginning I focused on programming courses that were already there like Java programming, C sharp programming.
00:07:48
Speaker
all kinds of Oracle stuff. But I was already into closure back then. My closure interest began in like 2010.
00:08:04
Speaker
Almost around the same time I joined that University of Applied Science. And I never tried to force closure on students, but I couldn't help myself.
00:08:21
Speaker
I'm not going to force you, but if you don't learn closures, you're not going to pass, that's it.

Introducing Speculative and Refind

00:08:26
Speaker
Yeah, well, it didn't exactly go like that, but yeah, I was teaching these object-oriented courses, but there was always this nagging feeling like this is actually not how it should be done, right? I'm teaching these people evil shit.
00:08:47
Speaker
Yeah, but it's part of the program, so you have to. But actually, later on, there was some room in the curriculum. And my colleagues, colleagues, lecturers, they knew that I was
00:09:06
Speaker
into functional programming and into closure or at least other ways of programming. And they wanted to have a course on like, they call it advanced programming. So it was like a very general topic where I could fit in anything I wanted, basically. And that is where I wrote a closure course for. And yeah, that course was,
00:09:35
Speaker
I taught that course twice, two years in a row, I think 2011 and 2012. And it was taught to two classes simultaneously, two classes of 30 students or 60 students a year, basically. And yeah, so that was actually the
00:09:58
Speaker
first way how I made money with closure, not actually writing software but teaching it. Did you ever get any follow-up from those students? Did you ever keep in touch with any of those guys, all the girls? Actually, yes. So there was one student I regularly am in contact with still. So for him, closure was really eye-opening, like, oh, can you also do the software like this?
00:10:28
Speaker
and less code functional programming. Well, it was really eye-opening to him. Then he decided after this bachelor program that I was teaching to continue to the University of Utrecht and do the computer science compiler program there as a master.
00:10:53
Speaker
And there he, I think, yeah, they are very keen on Haskell there in that university.

Closure vs. Haskell

00:11:02
Speaker
So there he converted to Haskell, basically. And so I kind of lost him from the Clovisier community. But he's still very much into functional programming. And my course was the first, yeah,
00:11:18
Speaker
the first way of getting to know it for him. And another student, I remember, I actually didn't know he liked closure because it wasn't very obvious during the course. But after the course, he went for an internship to Japan.
00:11:41
Speaker
and I didn't hear from him for a while and then he went to Shanghai and it turned out he was doing closure there, a closure job. Later on we had some chat and he thanked me like thank you for introducing me to this stuff and I'm still really into it.
00:12:01
Speaker
Oh, okay. So there are a few people that I think I influenced them and it made an impact on the rest of their, or at least the beginning of their career. But there were also a lot of students like, yeah, whatever. That's fair enough. Yeah.
00:12:24
Speaker
But a few of them really liked it and well, I guess that's already worth it. Yeah, totally. It's a few souls saved. Yeah. And then you send closure to faraway lands. Go to east and spread the word of the sick. Like the disciples like to go. Yeah, it's just evangelism. You know, like send the missionary to east. Yeah, but now he's converting people to Haskell. But
00:12:51
Speaker
I remember when we were talking a couple of times, I think this topic has come up, like Closure being the gateway drug to getting into Haskell, right? I mean, this is something that I've been trying multiple times as well. Yeah. Do you think, because I see your tweets on a couple of times, I see that every week or so, every month, you try to do something with Haskell as well. So do you still see that as the path? No.
00:13:20
Speaker
Personally, I get into Haskell like once a year.
00:13:25
Speaker
Like I have like once one month of really obsessive focus on something new and once a year that's Haskell. So and then I get into it and then I get tired of it and then I get back to closure and then I continue with my life. So that's basically usually how it goes. It's a bit like that story where you have the people bringing the cows and the sheep and the goats into their house.
00:13:55
Speaker
And then when the because they're complaining the house is too small so they bring in the sheep in the garden the cows and the chickens and then after a week or two they let all the chickens and sheep in the garden and the house feels bigger all of a sudden. Yeah it's kinda like that but i do think i.
00:14:15
Speaker
Well, I worked through the book Haskell Programming from First Principles. That's a relatively new Haskell book. And that's actually the first time that I made it from the beginning to the end and actually did a real project in Haskell. Because every year I tried Haskell again for a few weeks, but I never got anything really serious done in it.
00:14:42
Speaker
But yeah, now I have the feeling that I finally can do something in it. But go figure how steep the learning curve is, because in enclosure, it was like a matter of days that I made something productive, like a running app on the internet. Yeah, yeah. And enclosure that or in Haskell that took me years. I think Haskell is a bit like the kind of the equivalent of Finnegan's work, you know,
00:15:13
Speaker
What the hell is that? Stop making 1,800 references. We know you're old. Yeah, no. Finnegan's work is like one of the, well, it's a literary classic, I'm afraid to tell you people. It's a book. Get off my lawn. Have you heard of this guy, James Joyce, you know?
00:15:32
Speaker
No idea. No, he never had a James Joyce. Shut up. Come on. Of course you're from UK. He's Irish actually. We're not. I can't pretend I heard of him. So let's pretend. Oh yeah, right. James Joyce wrote this book called Portrait of an Artist as a Young Man. And he also wrote a very difficult book called Ulysses.
00:15:54
Speaker
And then that was like his last book, essentially, like kind of in semi-English. It was, Ulysses was a stream of consciousness book. It was a very, you know, like avant-garde at the time. But after that, he wrote this book called Finnegan's Wake, which is in a kind of its own language. And it's a kind of, what should we say, it's a kind of like the Holy Grail for many literary students that, you know, they can go to Finnegan's Wake and read it and,
00:16:22
Speaker
you know, sort of challenge themselves to to understand what what this literary genius meant by by his masterwork. But very few people actually make it through the book. So that's a very long story. Same with Haskell, I think. But you see where the comparison comes from anyway. Yeah. Oh, of course. Of course.
00:16:47
Speaker
So if Haskell is this Finnegan's thing, what is closure? Finnegan's work. What is closure? Closure, is that no? Jack and Jill, I guess. Spot the dog, you know. That I know. Jack and Jill I know, you know. Classic. But Michiel, what is bringing you back to closure? Every time you go and taste some Haskell and then you're like, fuck it, I'm going to go back.
00:17:15
Speaker
Well, it's not like, fuck it, I'm leaving something and I'm going back to something. It's more like... It's a small love affair. Yeah, it's like a small don't tell anyone kind

Closure in Coding Challenges

00:17:28
Speaker
of thing. I've booked a hotel room. Except that I tweet about it every hour. Yes. So Haskell is more like learning new things.
00:17:37
Speaker
of thing because closure I'm doing it since I don't know I'm well for my work at least 2013 and before that for as a hobby for a couple of years so and Haskell really yeah could teach me a new thinking everyone was talking on Twitter about this typed FP thing and I
00:18:01
Speaker
all these monad and monad transformers and i don't know monoids. These things so i just wanted to know what all these people were talking about and if it's really true what they say and.
00:18:17
Speaker
Yeah, so that's why I investigated and tried it. You also tried some Scala, right? I mean, you did some Scala stuff probably more recently than Haskell or maybe the other way around. Well, professionally, I only worked like five months.
00:18:34
Speaker
five months in a school and that's already three years ago. Yeah. And apart from that, I haven't been doing a lot of, oh, sorry. Did I say Scala? I meant Scala. I haven't been doing much Scala. Actually, I tried Scala before I got into that job just to be a little bit prepared.
00:18:56
Speaker
And actually I was doing. What is it called the advent of code in 2000? I think it was 2015. It was the first year maybe advent of code.
00:19:10
Speaker
So for those who don't know what Advent of Code is, it's during the period of Advent that's like from December 1 to December 25th. Every day on a website there is a new coding challenge and you can solve it in any language that you like.
00:19:33
Speaker
What the website gives you is the input and your program has to transform this input into an output and you fill in the output on the website and the website tells you if you have the right answer or not. So the language doesn't really matter. You can even do it in Excel or whatever you want. On a paper? Yeah, on a paper. So I tried a few puzzles in Clovisier.
00:19:57
Speaker
And there was one puzzle that involved why you couldn't actually do it without using mutability and a lot of arrays. So mutable arrays, or maybe just one giant array that you treat like a matrix. Because if you didn't do that, your program just wouldn't be fast enough.
00:20:20
Speaker
It would take years, probably, to finish. And that's when I started to get into problems with Closure. And I asked on Stack Overflow, why is this so slow? This takes like, well, I used mutable arrays. It took like,
00:20:41
Speaker
10 seconds were in Scala. It only took one second, so I was I was actually doing the puzzles in closure and Scala just to learn new language and well it turned out you had to add a lot of type hints and use the right array functions and eventually you could do it, but.
00:21:01
Speaker
This kind of stuff actually is a lot easier in Scala because the compiler knows where you can keep using primitives and you don't have a boxing, things like that. But that's also the only time that Scala was easier than Clojure. But I haven't been doing a lot of Scala apart from that.

Refind and Speculative's Role

00:21:30
Speaker
So what are you working on these days? Because there are a lot of open source couple of things that we want to talk about first of all. One of the things that you gave a talk at Dutch closure day. So can you explain, can you give something about that project and what the story behind it and context? Yeah, so I gave a talk about refined is what I call it.
00:21:55
Speaker
And Refind is a library and it also has a couple of interfaces.
00:22:01
Speaker
in the form of a web application. There is also a command line interface, and there is also a Java Avics interface made by another person, Joe Mage, he's called. And this library, what it does, it can find functions in Closure for you based on example input that you give it.
00:22:29
Speaker
and also based on predicates if you want. You can say, for example, I have the input number 1 and the number 2, and I expect the output to be number 3, so it comes up with the plus function. But it can also do more advanced stuff like that.
00:22:54
Speaker
For example, you can also say I have this set and I have another set and I want the intersection of it. Or you can say I want just the output to be a set, so you can say set? and then it comes up with all the functions that accepts two sets and returns another set.
00:23:15
Speaker
And so that, yeah, that's refined. So I talked about it at the Dutch closure days. So I gave a lightning talk. And if I remember correctly or maybe I'm not sure because it's been a pretty long day at Dutch closure day for me. It is driven by specs or what is the engine behind it? That's true.
00:23:40
Speaker
So yeah, so refine is driven by specs. So it can actually, it can only find functions that have specs for the arguments and also for the return value, but that's not a hard requirement, but at least for the arguments.
00:24:03
Speaker
And the reason for that is a lot of functions in Closure accept input. For example, if you have the input number one and you also want the output in the number one, there are a lot of functions at Closure that you can use. For example, you can use a function conch or the function merge, but it's kind of weird to recommend the function merge for
00:24:32
Speaker
accepting a number as the identity function for a number. That is why I use the specs for that. I expect a lot of core functions. That is inside the project called speculative.
00:24:52
Speaker
And actually, that project started together with two other people, Mike Fikes. Ray, you might know him. Yeah, I've heard of him. Maybe. And another guy called Eric Essam. Slip set. Yeah, that's him. And that's actually where those specs are coming from.
00:25:20
Speaker
The idea from Refine actually came when I was listening to a podcast called The Repel and Martin Kolebsch from CLJ Doc. He was discussing with Daniel Compton. Daniel? Yeah, Daniel. Like an idea for, well, maybe it would be cool if CLJ Doc could support something with spec.
00:25:47
Speaker
maybe it could display specs or maybe relate things to each other using specs or I don't know. And there I thought, well, we have all the specs
00:26:01
Speaker
cool with this. And they were also discussing Google, which is a project in Haskell, where you can say, I have a type A and a type B, and I want all the functions that have type A to B. So you can do queries like that. But that doesn't work in Clojure, because we don't have types. But we do have specs.
00:26:30
Speaker
that is kind of where the idea was born. And after, usually I listened to podcasts in when I am in the gym. So and so I, I heard this idea on the podcast in the gym and I went to went to home and this idea was already forming in my head. And I think two or three hours later, refined, the library was born, the command line interface. And it only took like one
00:27:01
Speaker
I don't know, one day later, also an HTML version was born. Nice. Yeah. And it tells a lot about closure, I think, how quickly you can turn these ideas into real projects. Yeah.
00:27:19
Speaker
And what is the idea behind speculative? Because I know you've been writing a lot of specs, you and, of course, Mike and probably Eric as well. Yeah. So you're specing all the core functions and all whatnot. And so is there a proposal to push that into core? Or where do you want to take it? Yeah. So how the project started, it also started on Twitter, where everything starts in my life, right? While you were sleeping.
00:27:46
Speaker
Right, while I was sleeping. So I think Mike Fikes, he tweeted the idea of, well, I really like some specs for the core functions, or at least I think these
00:28:03
Speaker
spec should exist somewhere because I'm wondering if I could use the merge function for this or that. I don't know exactly what he tweeted. I think his point, if I'm not wrong, was that the problem is an implementation problem because if you're in ClosureScript and you're looking at Closure,
00:28:21
Speaker
The question is, what is the right behavior? If you're implementing the language, what should you actually, without actually stepping through all of the code enclosure, can you get a little bit more information to say what the correct behavior should be with some given inputs? I think that was his idea. And that's the course of the intention of spec in some respects.
00:28:44
Speaker
yeah and then Eric Assam, he also responded on that thread and I responded on that thread and first I
00:28:54
Speaker
had a lot of, well, reserved thoughts about this, because I already suspected that if you would write a lot of core functions and instrument them during development or, I don't know, yeah, during development, things would get a lot slower. And that was my initial thought. So I thought, well, I don't know if it's a good idea, but we might try it. And so Eric made a repo.
00:29:23
Speaker
He committed the first specs.
00:29:27
Speaker
Yeah, I thought, well, let's just play the game and see what happens, right? And so I made some specs and Mike made some specs and eventually we added some tests and well, then Mike Fikes has a project called coal mine and coal mine is like a body of foreclosure solutions. Foreclosure is a website with closure puzzles and people can commit their code there.
00:29:56
Speaker
And you can do golfing and so a lot of solutions are already stored there and then we had the idea to verify these specs using the that code so that project is called coal mine. It's basically a set of solutions from foreclosure and there we detected that some specs.
00:30:19
Speaker
Either some specs were wrong or people were doing crazy stuff. A lot of people were using merge to add a key. They were using merge as the conge function, so everyone thought, well, I want to
00:30:45
Speaker
add an element to this set, and they used merge for it. That basically, I think that works. But so we found issues like a lot of issues like that. But we also found some examples from the wild. So for example, the merge, we added like a spec for merge.
00:31:12
Speaker
That said, well, the inputs have to be maps like closure maps, but then there was some some code from repo called day of the atomic. And there they also used Java util hash maps. And well, we looked at the code and we thought, well yeah, basically that's. That's yeah, that works and it's not surprising that it works because
00:31:39
Speaker
basically treats the second and the next arguments as seekables of map entries.
00:31:48
Speaker
And yeah, a hash map is a seekable of a Java hash map. It's a seekable of map entry. So we changed the spec to that. And eventually, Eric was not so active anymore. And he thought I should get the repo because I was committing very actively. I got the hang of it.
00:32:14
Speaker
So I inherited the repo and added a lot of specs and also tested a lot of specs and got feedback from a lot of users like, oh, the spec is complaining about this. Maybe it should be changed. And so the specs got refined over time and
00:32:37
Speaker
But my first thought that maybe if you instrument all these specs, it will maybe have too much impact on performance. That thought was right, I think. It really is noticeable in production or in development. So yeah, that's one thing that I didn't like.
00:33:05
Speaker
And then I had a thought, well, if these specs are maybe not useful to instrument all the time, can we still use them for something? And that is also where Refine was born, because Refine doesn't instrument the specs, it only searches the specs. So for example, if you have input like number one,
00:33:27
Speaker
So then it searches for all the functions where that accept an argument that have a predicate or a spec that matches this number one. So merge automatically is eliminated because it doesn't accept numbers.
00:33:45
Speaker
Michael, just before you go on to that, I don't think the notion of specing all of the core functions, etc., should be abandoned because I remember Stuart Holloway said in the past that in the future there may be different builds of closure, ones which have instrumentation and ones which don't. For example, that's all speculation whether it actually comes off or not, but I think
00:34:12
Speaker
the notion of having a closure build with all the specs on there. You know, maybe as you want to turn on when you're doing testing or something, you know, maybe as you can turn it off when you're in your IDE or you're, you know, at the REPL or whatever, or maybe as you turn them on in that case, you know, again, if you have, and the whole nice thing about specs to me is they're optional. So having a flag where you can just basically turn them on and turn them off as you

Speculative's Benefits and Challenges

00:34:35
Speaker
need them.
00:34:35
Speaker
strike this instrument on instrument thing, instrument, the new word, instrument. It's like where you're sucking in rather than blowing out on a saxophone, I guess. But shouldn't that be like instrument and out-strument? I don't like instrument.
00:34:53
Speaker
Well, it should be like an instrument, an instrument. That makes more sense. What you're saying, Ray, is already possible with the specs that we have in speculative, so you can turn them on only in development.
00:35:08
Speaker
That's totally possible, but things get a little bit slower, so you'll just have to accept that. Maybe if you're making a CRUD app, it doesn't really matter. But if you're making a very data intensive app with a lot of data going around, lots of IO, hot loops, then it starts to become noticeable.
00:35:36
Speaker
But I think there is the right place for this. It doesn't have to be on or off either, does it? You can instrument specific functions, for example. It doesn't have to be like, that's a nice thing, isn't it? That's nice thing about it's gradual. So you can choose to have all the specs instrumented or just some of them.
00:36:02
Speaker
blah, blah, blah. You've got a lot of choices there. Yeah, that's true. That's true. And I think the functions that the first
00:36:16
Speaker
candidates that you should probably instrument in tests are the set specs, because the set functions accepts like vectors and things like that. And if you do a set union on vectors,
00:36:33
Speaker
Yeah, weird things come out. Probably things you didn't want. And the setbacks really protect you from that kind of unexpected behavior. Also, if you do a union or intersection on two things, and one thing is a set, but the set is smaller,
00:36:57
Speaker
then for example the vector that you're unioning unioning unioning unioning then the the base collection will be the vector and not the set and so the all the elements will be conged onto the onto the vector and the result will be a vector and not a set so yeah so that can be really surprising so you will still have duplicate elements in there yeah
00:37:26
Speaker
And also strings. So strings are treated as a seekable of characters. So you can have surprising outputs with the set function. So I think it's really good to instrument those during, for example, unit testing.
00:37:44
Speaker
But if I remember correctly, you are also using a lot of open source code to check if there is any anomalies. Because my, not question, but something to discuss here is that if we are switching to a language like Haskell, all these things are completely non-problems because you have a type, so fuck it. It's impossible for you to use things like this.
00:38:10
Speaker
So what is your, what is your understanding or sorry, not understanding, what is your, you know, feeling when you, when you use this on, on, used this on a lot of open source projects? I mean, did you find anything, how prevalent is this misuse or? Well, I have, I actually have a list in speculative where I keep...

Speculative's Discoveries in Projects

00:38:35
Speaker
Yeah, naming and shaming. Well, actually, it's more like, look what speculates they found. And let me check. And now you release the enterprise edition for just 20 euro per month. We didn't actually find many things, but I wrote a spec for, let me see.
00:38:59
Speaker
Yeah, there was something in Planck actually. Oh man, you found a mic. Yeah, yeah. You shamed your mate. So there was, oh yeah. So in Planck, there was the usage of finil, finil plus, I think. And so what finil, I think the expression was finil plus zero or something.
00:39:27
Speaker
Man, what it what that does is so if you it returns a function and if you call it function with nil in the first argument.
00:39:36
Speaker
that will be treated as zero. But I think Mike called that function with more numbers. And so it was like you got something like plus zero nil or something. And well, JavaScript is very accepting. So that still didn't really, really raise an error. But it was not according to our spec.
00:40:02
Speaker
where the spec for plus said it only accepts numbers and not nil. So that is where we found one thing that wasn't really manifesting as an error, but it could be made more safer. So that was one example. Also we found
00:40:28
Speaker
Oh yeah, I think we made a spec from merge. And I don't know what is the arity from merge, actually. I have to look it up. But I initially respect it like it should at least have one argument.
00:40:45
Speaker
Well, that's actually not true, so the spec was not correct. Yeah, because it will return a transducer or something. Yeah. But when we instrumented this and then I tried to run some code from Jada project, then we actually found a call merged with zero arguments, which was correct. But this call was at the top level, so it wasn't doing anything.
00:41:14
Speaker
So we found a useless code with it. It's good. You scoured the entire internet and found one line of useless code. I think we count that as a success.
00:41:30
Speaker
I think there's a few more lines of useless code and other non-closure projects, but from a closure perspective, I think that's a win. Of all the closure code out in the world, I found one line that wasn't good. Well, I think that's going to be the headline of this story.
00:41:53
Speaker
We also made a spec for merge with, and I think it only accepts map entries. It should be a seekable of map entries and not a seekable of factors of two elements, because in Closure, that doesn't work. They should be map entries, but
00:42:20
Speaker
ClosureScript actually used vectors of two elements in the beginning as map entries. So a lot of code relied on this, but this changed in a later version of ClosureScript.
00:42:33
Speaker
And then I found one library secretary enclosure script that is a routing library that was still using vectors with merge. So yeah, we detected that early actually using the spec that we wrote. So yeah, that was nice. So we made a pull request to change it.
00:42:54
Speaker
Yeah, it was fixed. But in general, I think it shows that probably this is still a point of debate, I think. And in general, that shows that even though we didn't have specs, most of the code was written in a decent way, right? I mean, we didn't miss in closure, at least, the typing or spec information that much.
00:43:16
Speaker
Well, you usually find out if your code is wrong just by using it, right? So if you have a library that has existed for five years, it's very unlikely that you're still finding things that are wrong.
00:43:32
Speaker
Yeah, yeah. But this is the this is the I think the kind of difference in thinking in in when I'm writing closure code versus Scala Haskell code that now there is no I'm gonna fix it as I go. I know I'm gonna build it up as as I'm progressing. There is no mathematical rigor that I need before I'm gonna run my program. Yeah, that is something
00:43:54
Speaker
And actually, I think that's true. And so that you find less errors at compile time. But yeah, we it's, it's a trade off because
00:44:10
Speaker
enclosure I have the REPL and I can freely experiment. I thought a lot about this. For example, if I have a giant Haskell code base and I want to experiment in one file, what would happen if I added just one field to this type and I want to experiment very locally?
00:44:35
Speaker
Then in Haskell, I would have to change my entire code base before I can continue with my experiment because the compiler complains. But in Clojure, I can just make this local change or add a key and everything will still work.
00:44:51
Speaker
I can experiment locally and see if things will work out and then convert the rest of the codes also to that idea. I think the trade-off is not that easy actually as some people.
00:45:06
Speaker
Yeah, I mean, if you argue on the other side in Haskell, it will tell you where exactly you need to change the code. So there is no, you know, the mental gymnastic of OK, this map is going from this to this to this, this and then this key. So basically going through, you know, a search and replace sort of way. Yeah, I usually use AG for that.
00:45:25
Speaker
Yeah, exactly. Or AG or whatever the fancy thing, the rip grip or whatnot. Actually, about speculative, I want to say another thing because we found maybe not so many problems in existing code, but we did find while writing speculative, we found a lot of problems in the implementation of
00:45:52
Speaker
spec itself enclosure script. So I think I have 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, almost 20 issues that we fixed in enclosure scripts while developing things like
00:46:16
Speaker
something cannot be instrumented or instrumented in the REPL in Node or something like that, right? Or maybe a var args function. If I make a spec for this and the function is var args, I get a stack overflow error for some reason.
00:46:39
Speaker
Actually, the funny thing is that I think ClosureScript is in many ways more complicated to implement than Closure because actually, Closure is implemented on top of one virtual machine, on top of one set of understood constraints where ClosureScript is, well, you've got nodes, you've got the browser, and all the browsers have different JavaScript engines. You've got JavaScript Core, you've got V8, you've got
00:47:08
Speaker
you know, chakra. So it's kind of, and there's no spec, by the way. Well, there's a kind of spec, but not for kind of languages like compile two languages, you know? I mean, basically they use the closure compiler to do that. That's their spec, isn't it? But that itself is a moving target as well, you know? That's true. Yeah, we actually found some inconsistencies between closure and closure scripts using those specs.
00:47:38
Speaker
So that's another reason why those specs can be useful. So we write one spec for both closure and closure script, and then we find examples in closure scripts that do not conform to this spec, and that sometimes that boils down to an implementation difference in closure scripts.
00:47:58
Speaker
It should be interesting to see. I know that he's working on it, but when David comes out with a CLR version of spec to see if they can run the specs on the CLR as well.
00:48:12
Speaker
And then you're, I think you were just talking about condo or something. I mean, I'm not into the latest vernacular, whatever condo is. I can see that from the back of your room, you know.

Introducing CLJ Condo

00:48:28
Speaker
Not like mine. Obviously. So what is CLJ condo and what is condo? Okay.
00:48:38
Speaker
So what is a condo? So the condo is a linter foreclosure. Yeah, but don't talk about that yet. Talk about Marie first because she's more interested. OK, let's let's talk about Marie. OK, you want to know who Marie Kondo is? OK, I don't know who that is. Yeah, I think many people actually don't know who Marie Kondo is. Do you have do you have Netflix maybe? No, I don't know. OK, yeah. He's got a book on that.
00:49:05
Speaker
Yeah, so on Netflix, there is a program of a Japanese lady who cleans who helps people clean their houses and declutter their their mess, actually. And she has a method called Connery. And this method is basically
00:49:25
Speaker
decides if a thing sparks joy in your life or that it's only like weighing you down or it's just mess that you never got around to clean up. And she has like an order of categories that you have to go through.
00:49:49
Speaker
Like first start with your clothing. Your partner and I'd be out of my home already. So we start with your clothing and then start with, I don't know, I think I never got past that stage.
00:50:09
Speaker
And but there are also books. The books came first and everyone was talking about this. It was like becoming like a fashion or hip thing in all the bookshops about like self improvement department. They were all
00:50:26
Speaker
condo books and oh okay yeah really those bookshop should have been pretty empty by that stage yeah by the time they did they reach books level yes if they've actually read Marie Kondo it's like get rid of all these shakespeare shit you know yeah yeah
00:50:46
Speaker
Finnegan's work. Get rid of it. Or Finnegan's wick, whatever the fuck that is, you know. Jack and Jill, let's keep it right. Yeah, exactly. It brings joy. That sparks joy. Sparks joy. Yeah, yeah. So that's basically who Marie Kondo is.
00:51:02
Speaker
Okay, so that's the reference that I missed. I mean, I'm not really keeping up with all the fancy shit that is happening around me, obviously. That's okay. It's just a name, so as long as you can remember the name, it's fine. Exactly, yeah. So let's talk about CLJ Kondo. Before CLJ Kondo, Emacs or some other shit? Well, I know the answer, but... Emacs and some other shit.
00:51:29
Speaker
What is some other shit? Visual Studio Code. I use Emacs for most of my things, but usually when I have to edit a markdown file and I want a nice preview,
00:51:45
Speaker
then I usually use something like VS Code or Atom, because I think that it just works nicer that way. But that's basically the only time I go outside of Emacs. But there is a live server thing on Emacs that you can actually render the HTML file while you're typing your file. Yeah. That's super cool, actually. Anyway, of course. I do use Emacs, but I still feel like a noob in Emacs.
00:52:14
Speaker
I hope everybody is, except for probably just Talmud and Rubeino. Yeah. I think Devin Miller is not a noob. No, no, no. I think I got only into Emacs because of closure, because in 2010 there weren't a lot of options for other editors, so I was using this slime closure thing to get my class path set up. I don't know, it was very difficult back then.
00:52:40
Speaker
And I was still on Windows then, so it was even more difficult. But that's how I got into Emacs. And I never really became like a professional Emacs tweaker. So is that something you do with your bottom, is it?
00:53:04
Speaker
Yeah, I guess. And I'm still using the emacs is weird to me, you know, yeah, going on stage and being an emacs tweaker. Yeah, I know. And
00:53:19
Speaker
I'm still using Emacs. I think it's called prelude. So the thing by Bozydar. Because I'm using cider and I was guessing like, if I'm using his stuff, at least that's compatible with cider. So stuff doesn't break every time I upgrade cider. But unfortunately, that's not true. Why doesn't he call it glass, you know, then you can have like cider in a glass, you know. I don't know anything about Emacs.
00:53:50
Speaker
but I'm still ahead. I'm a happy prelude user, so yeah. Okay, so now back to Condo, back to regular programming. Okay.
00:54:03
Speaker
Yeah. So CLJ-condo. So yeah, the story behind CLJ-condo. I'm actually, I have been using a linter enclosure that gives editor feedback in my Emacs for a while, and that is Joker. And Joker is a static code analyzer, at least I think that's how it works.
00:54:27
Speaker
And it's pretty useful, so it gives like arity errors and it can show like this var that you're using. I don't know where it came from. Maybe you're missing an import or something. Or if you write down a hash map and you don't have an even number of keys and values, then it complains.
00:54:50
Speaker
It gives you a lot of useful feedback even before you evaluate your code into the REPL. I like that very much. I have been using it for three years. I think it's super cool. Everyone should give it a try. There's also integration for other editors, so it's not Emacs specific. You can also use it in CI if you want. I'm not doing that,
00:55:19
Speaker
I'm doing it for the editor integration. But there were some things in Joker that I think it should be possible, but it wasn't in Joker. I looked into maybe contributing to Joker, but it's written in Go. I'm not really proficient in Go. It was in the back of my mind for a while.
00:55:47
Speaker
And so, and there is another story behind CLD condo. Because I wrote a blog post, I don't know, maybe two years ago about debugging technique that I call inline def.
00:56:05
Speaker
And some people, well, it's kind of, yeah, some people don't like it. So what you can do, for example, if you have a function that is, let's take like, for example, you have a web server and this web server calls a handler, like a ring handler.
00:56:32
Speaker
And this ring handler calls another function in your code base, and that calls another function. And when you do a request, sometimes you get an exception. But you want to see exactly the input that this function got.
00:56:50
Speaker
So you want to capture this input somewhere, right? Because you want to have the entire request and all the information that it has gathered along the way. So what you can do is you can define an atom and then put the stuff into an atom.
00:57:07
Speaker
But you can also just make a temporary var where you store this request. So then you can say in your function as the first line, well, def r and then the request. So you're basically creating a var to inspect the information later. So I call that technique inline def.
00:57:36
Speaker
It's only for debugging, so it's only temporary and you should remove that code when you're done debugging because you're not supposed to define new vars inside a function. It's bad style, so you shouldn't be doing that, but as long as your colleagues don't see it, I guess it's fine. Then I thought, well,
00:58:00
Speaker
I accidentally committed sometimes my inline devs, and I was a little bit embarrassed. So I thought it would maybe be nice to have a linter that detects these inline devs. But how can I do this? It shouldn't be too difficult, because Closure Code is just data that we have to cliche. Well, it shouldn't be too difficult. So let's try. I think I tried Tools Analyzer.
00:58:29
Speaker
And that worked. But then I tried to make it fast because Joker is very fast. It's native code. So if you start it, it's only a few milliseconds, right? And so I wanted to also have that experience and then in my repl or in my editor. And then I tried to compile this code that I made with tools analyzer using Graal VM.
00:58:55
Speaker
And that didn't turn out to work very well because tools analyzer uses evaluation and it does macro expansion while it analyzes the code and that that stuff isn't possible in in in gravity. And so Yeah, then I decided to look
00:59:15
Speaker
further and then I found a library called rewritesailj and what that does it it's based on tools.reader and it emits

Closure Community Growth

00:59:25
Speaker
like yeah kind of like things that also tools analyzer also does but it doesn't do any evaluation so it's more like
00:59:36
Speaker
It's only static data that you're getting and not any meaning attached to it, so it doesn't do any macro expansion or something. Using that, I was able to get my first feature, the inline def linter. Then I did two others. This idea was
01:00:03
Speaker
It was only a couple of hours that the first version of sale the condo was born so i did the. Inline death and then i i had an idea like well you can have a left expression.
01:00:15
Speaker
And if you have a lead expression immediately in the body of that lead expression, that's often not necessary because you can move the bindings in the same way, right? Yeah. So you don't need, you don't need two nested lead expressions. So I thought, well, that's kind of like a redundant. So that is actually what a name CLD condo came from. Like this is a redundant stuff. Let's get rid of it.
01:00:41
Speaker
So I made the redundant left linter and also the redundant do linter because you can also have a do expression with only one thing in it and that's also redundant, right? And also you can have try, try of try catch, but also a do in it, that's what you see often, but that's not needed because try already has an implicit do. So that's all stuff you get. It doesn't spark, you can't get rid of it.
01:01:10
Speaker
And those three things were the initial...
01:01:16
Speaker
Things and I all it was only a couple of hours with rewrite CLJ and then gravity and to to make binary for Mac OS and Linux So then I thought well, this is cool, right? I can make things That Joker in the style of Joker because I was really a fan of Joker and I'm still still I'm a fan of Joker using closure itself so not written in go and
01:01:41
Speaker
and then make it just as fast and get the feedback in my editor just as fast. So that I found really cool and then I just started from there actually and I started adding things. So one thing I missed from Joker was Joker can lend incorrect arities of your own functions. So you define a function foo that takes one argument and later in the file you call it with two arguments and then you get
01:02:10
Speaker
You get a message about it, right? But what Joker cannot do is when foo lives in another file and you refer to that namespace and then call foo, you don't get an error because Joker is only aware of one file at a time. That is a joke. So it's basically not a full compiler. It's basically just a power file. Yeah. So it's a file namespace analyzer, not a whole program analyzer.
01:02:38
Speaker
Yeah, right. And that's where I got the idea like, we can improve on this. So I'm doing the same arity linting as Joker, but it can also remember things that it found in other files and then say, well, this foo you're calling from there, it's wrong over here. So it's two arguments instead of one.
01:03:05
Speaker
Is it also possible to do something like unused vars or unused functions or whatnot? In the last version or in the version that I released a week ago, a new linter was introduced called required but unused. You're requiring a namespace, but you're not actually using it anywhere in this file. You can remove the require.
01:03:34
Speaker
And okay, and that's because actually
01:03:39
Speaker
because I used something called line yagni like you ain't gonna need it sort of a plugin for identifying things and actually it hasn't been working as I expected but at least it gives some sort of hints because it can also do like a parent and child thing so you know child function is being called and used in parent but the parent is not used anywhere so that kind of hierarchy
01:04:08
Speaker
But it always ended up giving some sort of an error or something. These are the things that I miss when I'm working on a bit of a larger code base and then if I'm taking over from somebody else. And there are lots of functions I know that are unused and then I have to do like search and replace or that kind of shit to see is this used anywhere.
01:04:24
Speaker
And also, the other part is if it is written as a quote-unquote library, because every var is public, because it hasn't been written in such a way that this is definitely minus or something, it's very difficult to see where exactly this function is being used, because I want to reduce the APSFS area.
01:04:45
Speaker
So I think it'll be really cool to have that kind of functionality.

Michiel's Contributions

01:04:48
Speaker
I'm not sure if IntelliJ has or Cursive has that. Yeah, well, I think the thing about IntelliJ is Cursive is it's built on top of this kind of analysis that MPS offers. So you have all these kind of like
01:05:05
Speaker
You can do find usages, for example, so you can say, okay, I find use of this function across the entire project or across the various scoping that they have. And they have all the kind of unused imports and stuff like that. But I think, to be honest, I think intelligence support for this kind of stuff is really good on Clojure and cursive support for this is awesome on Clojure. I mean, it really is outstanding.
01:05:31
Speaker
But the ClosureScript side is a bit more rough, I think. So I think any kind of linters that are cross-platform or that give ClosureScript over the leg up will be really helpful. What is different about ClosureScript that Cursive finds difficult? I mean, it's just the same namespace forum, right?
01:05:56
Speaker
Yeah, probably. But I think it's just because it's mixing with JavaScript and JavaScript is itself an untyped language. The underlying kind of analysis that the NPS offers is weaker than the kind of analysis that can be offered in a type system like Java. That's my guess anyway. One of these days we'll finally get Colin on here to explain himself. But that's my guess.
01:06:20
Speaker
But Mihail, the clj-condo thing that you're building. So it does both closure and closure script, or only closure for now. No, no. It doesn't matter as long as it's normal closure. So it doesn't care if it's closure or closure scripts.
01:06:43
Speaker
And it also supports SalesJC. So if you define a function with conditional expressions and say in the conditional expression for closure, it has only one argument and in the conditional expression for closure script, it has two arguments, then it will still work.
01:07:09
Speaker
I'll give it a try because I think most of the time I'm writing CLJC these days. So that could be super fun to try. So any other things that you want to talk about your open source work before we talk about your commercial work?
01:07:32
Speaker
One thing I would like to say, actually, Mikael, is that I think, although you might not count this as open source work, I think the fact that you are so active on Stack Overflow is quite impressive for the community. I mean, you really do answer a shitload of questions on Stack Overflow and are very helpful out there. So I think a round of applause, everybody, for this guy. He's really helpful.
01:07:58
Speaker
That's true. Yeah. It's also a lot of fun doing this. If it wouldn't be a lot of fun, I probably would be doing this. Yeah. Well, I think it's, you know, it's good for you and it's good for everyone else. So I think for us, it's, you know, thank you. I, you know, I often think, why would I do this? Then I, then it's, you know, it's, it's always funny nowadays. It's like a toss up between you and Michael Marchech, Marchech, who the answer is from, you know. Yeah. His answers are a lot better.
01:08:32
Speaker
Yeah, he's amazing. Yeah, yeah. Totally. Amazing. So, we'll get him one day as well. I mean, we're slowly, slowly getting there to get everybody onto podcasts, you know? Yeah. So, what are you working on these days? I mean, commercially, if you can talk a little bit about your, you know, the stuff that you're getting paid for.
01:08:53
Speaker
Yeah, the last few years I've been contracting with a company called Doctor Evidence. We're working on a project called DocSearch. This project is basically a search engine for medical literature.
01:09:14
Speaker
powered by natural language processing and artificial intelligence buzzwords. It also offers a lot of analytics on your search results.
01:09:32
Speaker
have a query about some kind of disease or medical topic, then you get a lot of results and then you can filter down in those results and see what kind of search terms correlate with the results and see where this topic is mentioned around the world.
01:09:57
Speaker
Like a distribution in time of the articles that we found. What's the audience? Is it a medical audience or is it a general public?
01:10:09
Speaker
The audience is varied, so a big part of the audience is pharmaceutical companies that would like to track information about their topics of interest that they are making medicines for. What they could also do is track publications about their own medicines and see how effective they are or what side effects they might cause in patients.
01:10:39
Speaker
And if they are very effective, they can also use that for marketing, of course. But also another part of our audience is like researchers. So researchers that would like to track topics in their area of research and like hospitals, things like that. At least that's
01:11:05
Speaker
what I think are the user base because I haven't been really talking to the end users. So I'm working in a team of programmers and we have one guy, the manager Joel.
01:11:22
Speaker
He does most of the communication with the others in the company and also clients. Usually, there's a layer in between, but this is what I think are the users.
01:11:41
Speaker
You'll probably find that it's some evil scientist somewhere, but they're, you know, they're just keeping you in the dark about it. Yes. Tell them to do more awesome stuff while you take over the world. I think that.
01:11:56
Speaker
I think the super anti-climatic would be that this project is entirely funded by North Korea. That would be anti-climatic. This is basically, this is how North Korean pharmaceutical companies run. I'm like, oh, wow. I think it probably will be Cuba that will be funding it because I think they're the only ones with good health research. A communist country, anyway.
01:12:20
Speaker
Yeah, so this product is built entirely in or mostly actually in enclosure. So the back end of our application is enclosure. The front end is enclosure scripts usually using your reframe and things like reagent, things like that. So the usual stuff, right?
01:12:42
Speaker
And we also have another component that annotates the text with certain tags that we recognize as certain topics.
01:12:53
Speaker
So the natural language processing basically that's also building closure. And we have another component actually that's built in Python because of that. That's very machine learning heavy and. Yeah, it was easier to do that in Python so yeah.
01:13:13
Speaker
Nice. OK. So any other topics that we want to touch upon? I think we are almost one hour. Pretty good time, I think. A lot of different topics. So maybe because you've been in Clojure since 2010,
01:13:34
Speaker
And of course, you've been participating a lot. As Ray said, you're contributing a lot to the community and now even you're building the tools that can be used by everybody. And I know you've been doing a lot, especially I think last Advent of Code, you set up like a test stuff for that as well. Being active in the community and then encouraging everybody to or giving answers when people need them. So that's a really nice thing.
01:13:58
Speaker
because that's how we support each other, right? I mean, that's the whole idea of being in a community. So what do you think about the community these days? I mean, like how, because of the conferences that you're attending and all that stuff. Yeah. I think it's growing, actually. That's my impression. So every time I go to a conference, I'm amazed.
01:14:23
Speaker
that I do not only see the familiar faces but also a lot of new users. I can't really compare this to other communities because I haven't been an active member of the Java community or the Haskell community.
01:14:45
Speaker
I can't give a fair comparison but that's my impression right now that the community is growing and especially the European conference community is really doing a good job in the last few years I think.
01:15:03
Speaker
And yeah i actually have trouble keeping up with all the new stuff that keeps coming out so yeah. I also listened to the, was it the last show with, I don't know, the Repel or Defen, but it was with Zach Tillman. Yeah, Repel probably.
01:15:24
Speaker
That ended a little bit. I had a little bit of a pessimistic feeling how he described it. So like, well, it's been nice, but the community is not seen as, it's seen as, how did he describe it? As more like a cost than a value by Cognitect. Yeah.
01:15:50
Speaker
I don't see it that way. I don't know. I don't share that negative emotion, I think.
01:16:00
Speaker
Yeah, I mean, that's true. I mean, there is a lot of, obviously, if you're measuring closure or any language, it's a very difficult task. I mean, I think we crossed some critical mass already a long time ago. Because I've been, at least in the Netherlands, I've been using closure since 2009-ish, I think. That was the first time when I wrote my first closure thing. Pretty horrible closure and wicked interop.
01:16:30
Speaker
a long time ago on Java and all that shit. But since then, I think we're slowly growing, as you pointed out, multiple meetups and then multiple conferences. That's one measure of how many people are coming. But one thing what I realized is that
01:16:46
Speaker
Maybe this is just my rough estimation. Like for every one person who comes to the conference, there are at least like 20 people who don't show up at the conference. Yeah. Because I constantly get surprised every time I talk to somebody, they're like, Oh, we're doing closure. Like what the fuck? I didn't even know that your company existed. You know, this is like a million times that I keep hearing. And I had the weirdest thing, like a couple of
01:17:07
Speaker
weeks ago, we have a Closure Meetup in the Netherlands. And it started as the Amsterdam Closure Meetup. But now it's called the Dutch Closure Meetup. And we're also visiting other cities like Utrecht. So one evening, there was a Closure Meetup organized in Utrecht at a company called MediQuest. And it was about Closure CLR. So I thought, well, let's go there, CLR. I don't know.
01:17:37
Speaker
Let's just see. It turned out that they were actively using and developing libraries for Closure CLR in the last four years. I've never ever heard of this before. I think that confirms what you're saying. For every person that's shouting on Twitter about every little Closure thing like me, there's probably 20 others that never say anything.
01:18:03
Speaker
Yeah, because this has become even bigger thing in the recent, I wouldn't say recent years, but probably maybe one or two years, because since I was doing this podcast and then also doing a bit of consulting, then people send me an email saying, hey, do you want to take a look at our code base? Like, what the fuck? I mean, who are you? I mean, you've been using Closure. I've never known. OK, are you going to sponsor our conference? You know, that's my first question.
01:18:28
Speaker
But it is crazy. I think there is one to 20 relationships. At least that's my rough estimate. People don't show up on Slack or they're being productive, I guess. They don't need to talk about shit like me and Ray. But I think the other thing as well is that I think there's a distinction between
01:18:48
Speaker
like most Clojure users that basically are just using the language quite happily and keep on getting drops from rich like spec or various things that just keep on getting better and better and better in the language. And they're just like, wow, this is just so awesome. Keep on being happy.
01:19:11
Speaker
And then there are people who want to write libraries in it, like Mikel, who are super happy that it's so flexible and usable. There's definitely still plenty of space for innovation in the community environment. I'm writing a REPL and a multi-user REPL and stuff like this, and I'll probably use some of your stuff in the end. There's plenty of nice space around in the community. You see lots and lots of little projects popping up.
01:19:39
Speaker
that are adding value, that are very useful. But there are certain people that want to be right in the heart of it. And I think that's where the negativity or where, let's say, rich is a bit more controlling, that people get a bit pissed off. But for 99% of the population or close users, it doesn't matter.
01:20:02
Speaker
The program language is awesome. It's a list, so there's plenty of space for innovation outside of the core team. I think that's what most people are doing, actually.
01:20:16
Speaker
Yeah, I think another data point is that, I mean, otherwise our crap for whatever, you know, Ray and I are doing for 50 episodes and then fucking three years, you know, this won't run for three years. And then now, now suddenly we have so many nicer, hopefully better podcasts than our crap that we put out. Like, you know, Repel from Daniel and Jaลกek. Jaลกek. Yeah, Jaลกek. Yeah.
01:20:45
Speaker
Yeah, yeah, just XK or something, Closure Script Podcast. And there is also another one, like the Closure... There's a design podcast, those guys... Oh yeah, yeah, the functional programming. Yeah, yeah. And functional... Exactly. I think they call it functional design and closure. But that's a funny one because they like talk code through their entire podcast. And I know it's nice, I listen to it and I get a lot of it actually. You know, I think the guys are doing a great job there.
01:21:11
Speaker
I don't even listen to our own cramps, you know. I'm ashamed if I listen to other podcasts, you know, I'll feel even better. Holy fuck, we are pretty crappy. Well, I don't think so because I've always enjoyed show and it keeps me, my workout session less boring. I mean, what you're trying to say is...
01:21:36
Speaker
It keeps your heart rate high, right? Yeah, it keeps my controversial opinions and oh, that keeps my heart rate up as well. So are you saying that Deafen is good for your health? Yeah, definitely. Uncontroversial.
01:21:57
Speaker
Yeah, that's not controversial. But I think there's room for more podcasts because sometimes I'm on the treadmill and I'm running out of closure podcasts. And I'm actually filling it up with more general podcasts.
01:22:14
Speaker
I think I found Coder Radio lately. That's a nice podcast, but it's more general. But if there's more Closure Podcasts, I would be happy to queue them up first, right? Before I wrap up. So they're still room.
01:22:30
Speaker
Well, there's plenty to talk about. That's also another data point, right? That's true. Yeah, yeah, yeah. So that's another data point that, you know, this is a growing community and we have plenty of ideas that needs to be put out in the, what is put out now? Put out is probably to extinguish. You can put things out to posture. No, I want to put things out. Is it OK?
01:22:52
Speaker
okay i don't know i don't know fucking english share yeah to expose in the in the public yeah in the share in the public yes of course thank you um so yeah i mean i think it's overall it's a it's a fantastic community and from the conferences wise as you said mihiel i mean we have like four conferences now in europe already uh so i'm uh i'm looking forward to going to harder closure and probably to closure as well uh this is gonna be fun i think so
01:23:20
Speaker
Any other closing thoughts before we close our episode? Ah, well, keep doing the great work on the podcast, I would say. Another 50 episodes, at least. Thank you. Thank you. We'll try. We'll try. We need to retire at some point.
01:23:43
Speaker
Yes. I think, yeah, let's see. Because I think that the momentum is there, and then there is a lot of interesting people to talk to and a lot of interesting ideas that we can learn from people. That's another secret goal of mine using this. That's right. That's been going pretty well. So that is the end of our 50th episode, which is amazing. I think three years ago when we started this, we never expected it to be.
01:24:12
Speaker
you know, reaching episode number two. So it's certainly not number 10, that's for sure. Yeah, that's for sure. I mean, double digit was crazy for us. Now we are really getting, we are halfway through the triple digits. So, you know, let's see how far we go. Well, you can always invite the same 50 guests again. We keep on saying that, by the way. That's the plan. We keep on saying, oh, yeah, you know, we'll invite you back in a year or two's time, you know, it's this usual bullshit. But actually this time, you're right. We just should just do it, you know.
01:24:42
Speaker
So the first episode was called Hello World and the second was called The Reader and then suddenly you ran out of ideas and then invited all the people, right? No, no, no. By the second episode, look, it was two people, right? So we ran out of our brains, you know. We had like basically two idiots talking some shit and then we realized, hmm, I think two episodes is enough.
01:25:04
Speaker
I think the thing is everything is Mike Fikes is to blame for everything in the end. He used to blame for all the things that you did. He used to blame for all the things that we did because I spoke to him on the reader. Oh, yeah. Oh, I can come and join you and tell you a few things about that. So he did. Then we had the idea, maybe we should have some guests on. Yeah. Okay. Yeah. So the third one was with Mike Fikes and then persistent collections that was without a guest.
01:25:31
Speaker
Yeah, that was again our... And then you had Hoplon with Mika Nishkin. So you all kind of alternated between topics and guests and then it became guests. I think we had a village ideates episode. That was, you know, that was really awesome. I'm thinking everyone should go back and listen to that. Which one was it?
01:25:52
Speaker
Oh, yeah, that's one of those things that probably it's not good to dig through the history. You know, there are more skeletons in Deaf and closet now. No, but it's I mean, you know, you talk about like the history of this. I mean, it actually just feels like we're just starting in some ways on this podcast, even though it's like three years and 50 and so.
01:26:12
Speaker
I mean, for me, I think we've been incredibly lucky because we started the podcast relatively early in the Closure podcast world. So we've been lucky to have an amazing array of guests, topped tonight by the unbelievable bulk dude. So we've reached an apex this evening. You're in good company with Alex Miller.
01:26:42
Speaker
That's true, that's true. This is one of the, you know, Hall of Fame episodes. Yeah. So, this is the peak of my career. It can only go downhill. This is peak of our podcasting history. Remember, you're going to get invited back in two years' time, so, you know. Okay, okay, yeah.
01:27:00
Speaker
But yeah, I think obviously, this is still an amazing thing that every Sunday, I think one of the things that I was talking to at Dutch Closure Day is that we do this on Sunday, which is like the worst possible time for me because I go through this stuff and then you have this kind of a podcast. Hi, I talked to all the people and amazing people like you, Michiel and other people. Now I can't sleep because tomorrow morning I need to get back to work. And then I feel like, oh, fuck, I need to try this thing now because I just spoke to
01:27:29
Speaker
this person. So it's like a worst possible time for me, actually, in a nice as possible way, obviously. But this is all because thanks to Ray, obviously, he started the discussion and then at DCD 2016, I think. And then somehow he made me buy a microphone and then talk bullshit into it.
01:27:53
Speaker
And and then voter join. And then suddenly we started sounding professional, although the content that we are making was not up to the sound level quality. Well, I figure if one third of the content at least is decent, then we're OK. Yes. And since we have a guest, then we've definitely got, you know, that one third is OK.
01:28:16
Speaker
We are crossing that particular, you know, like the baseline. So even the two thirds of it is me and Ray and the rest one third is worth listening to. Yeah. And usually we try and let the guest speak as much as possible. So, you know, to increase the proportion.
01:28:34
Speaker
Yeah, but hey, so a big shout out to Wouter who has been helping us a lot, at least in the last two and a half years. He's doing an amazing job. Yeah, yeah. He's been spending a lot of hours making the audio sound pretty good. And obviously, he's also a closure programmer, so he knows what the crap that we are talking about. He's the first person who gives us feedback on the episode, which is pretty nice.
01:29:01
Speaker
Do the thing I'd like to, I mean, we're probably going to go on around spot. I mean, I think shouting out to the Patreon people as well, because we kind of like, obviously we do this in our own time and we don't need to be paid for it, but we've got some costs and it's nice that
01:29:19
Speaker
People are chipping in, you know, a few euros or a few dollars. And so essentially we don't have any costs anymore, which is really good, you know, and we can afford to like send Wout to Dutch closure days and put him up in a hotel and
01:29:35
Speaker
So it's really good. It means that we can afford a few of these things and it makes our life as closure people. It's also a weird thing. I think people give you money is a really weird thing. I mean, we kind of do it for a living with closure, but having people contribute to your kind of side grift is nice as well. That sounds wrong somehow. Maybe as you can say it better, Vijay.
01:30:03
Speaker
I mean, we're really happy with these guys, basically, and girls. What Ray is trying to explain in 18th century English literature is that we are very thankful that you are showing your support with your tweets, with your ideas for the episodes, and also with the Patreon support. That's really helpful in terms of maintaining the costs as well as every now and then we try to use that money for good causes. So that's the thing.
01:30:34
Speaker
So thanks a lot for for listening and again big milestone 50th episode. We do have a couple of other things in pipeline and meanwhile if you are running out of episodes then go and listen to other podcasts like Rapal or Clojusclip podcast and other stuff that Mahil pointed out.
01:30:56
Speaker
That's it from us and have a nice evening, morning or whenever you're listening to this stuff. And we'll see you in episode number 51. Alright. And thank you, Michiel. My pleasure. Okay, bye. Bye-bye.
01:31:44
Speaker
So yeah, I press the red button and it's now recording so I'll post a screenshot to confirm this So like we're really professionals, right?