elm radio
Tune in to the tools and techniques in the Elm ecosystem.
The Human Side of Open Source
We discuss the role of Open Source Software and how we approach leadership and communication in our projects.
Published
August 28, 2023
Episode
#89
Elm Radio episode
Funding Open Source with Evan Czaplicki
Nonviolent Communication
David Marquet TED Talk
How Great Leaders Serve Others
Elm Radio episode
Developer Productivity
Transcript
[00:00:00]
Hello Jeroen.
[00:00:02]
Hello Dillon.
[00:00:04]
This conversation is provided as is, without warranty of any kind.
[00:00:09]
Just wanted our listeners to know that.
[00:00:13]
Alright, alright.
[00:00:18]
A pun at every start of the episode.
[00:00:21]
I really don't know how you maintain this pace for your puns.
[00:00:26]
I mean, you really pull your weight for them.
[00:00:30]
But I just want you to know, if you ever stop doing them, it's not an issue.
[00:00:36]
Just, it's fine.
[00:00:38]
I have a license to pun.
[00:00:42]
What are we talking about today?
[00:00:44]
Today we're talking about the human side of open source.
[00:00:48]
And I believe you and I have perhaps dabbled in open source a little bit, I would say.
[00:00:54]
Yeah, I'd say so.
[00:00:56]
I mean, how long has it been for me?
[00:00:59]
I think I started in 2017 with open source.
[00:01:03]
Yeah, that's starting to be quite a while already.
[00:01:06]
Do you remember what your first open source was?
[00:01:08]
Yeah.
[00:01:09]
First contribution was fixing a license.
[00:01:13]
Oh!
[00:01:14]
It was fixing the dates for a license.
[00:01:17]
Nice!
[00:01:18]
For someone's blog.
[00:01:20]
And the next one was doing the documentation for lodashfp.
[00:01:25]
Which was more ambitious already.
[00:01:27]
Yeah.
[00:01:29]
I believe my first open source project was in 2013.
[00:01:34]
And it was a random little Ruby executable for helping you with an interface to git.
[00:01:43]
Which probably two of my co-workers used.
[00:01:47]
Which is less than zero.
[00:01:49]
Right, yeah.
[00:01:51]
Oh, I guess I did publish an npm package or something around 2014 or 2015.
[00:01:59]
But getting really involved in other people's projects in 2017.
[00:02:04]
And that's when my project started as well.
[00:02:07]
Yeah, it definitely changes the game when number one you have users and number two you have contributors.
[00:02:13]
It doesn't really feel like open source if you don't at least have people opening issues and telling you about problems they're experiencing.
[00:02:23]
Or things that could be improved or discussing things with you.
[00:02:26]
Right, yeah.
[00:02:27]
If you only publish your package or your code and you put it on github.
[00:02:32]
It's very different from people interacting with you.
[00:02:35]
Making suggestions, making pull requests.
[00:02:38]
Telling you your code is crappy, your project sucks.
[00:02:43]
Right, exactly.
[00:02:45]
Which thankfully I have not had.
[00:02:48]
I've had a very good interaction with all of my open source projects so far.
[00:02:53]
That's awesome.
[00:02:54]
One of the things on my mind today is like, why do open source?
[00:02:58]
Like why do we even bother making a tool open source when we build one?
[00:03:04]
What are the motivations for us, for the community?
[00:03:08]
What's the benefit, what's the point of making something open source?
[00:03:12]
Right, well there are several.
[00:03:15]
One of them is feeling like you are helpful to people.
[00:03:20]
I think that's one thing that we tend to like as software engineers, as humans as well.
[00:03:26]
Just being helpful to others.
[00:03:28]
Like I'm making a project, I'm making a website, I'm making a tool that helps other people.
[00:03:35]
Any software project is basically to help someone.
[00:03:38]
It's usually you, even if it's just like making a video game.
[00:03:42]
It's helping you entertain yourself for an hour or two or two hundred.
[00:03:48]
So yeah, I feel like being helpful to other people.
[00:03:54]
So if something is open source, it's really accessible, people can use it.
[00:03:58]
There's also the recognition part.
[00:04:01]
I want to, I've made a tool or I've made something which I think is useful.
[00:04:07]
And I want other people to know about it.
[00:04:09]
Maybe to get my career going, to get, to have recruiters think that I am very qualified.
[00:04:18]
I have actually, for instance, like made a tool once.
[00:04:23]
Oh, that was in 2014, which I put on GitHub and it helped me land a job because they asked me like,
[00:04:31]
Hey, do you have some code that you have available that we can look at?
[00:04:36]
And I'm like, sure, you can look at this one.
[00:04:38]
And they hired me pretty much because they said it had tests.
[00:04:42]
So, you're running tests, you're qualified.
[00:04:48]
That's awesome.
[00:04:49]
Pretty low bar. I mean, I was quite junior back then, but yeah.
[00:04:54]
So yeah, recognition through multiple forms, like being just a junior who knows how to code quite well
[00:05:02]
or being a very famous maintainer who you can hire for consultancy on one of your projects.
[00:05:13]
Yeah, yeah, those are the two I can come up with.
[00:05:16]
It's mostly like helping people though.
[00:05:18]
I like that. I feel the same way.
[00:05:20]
I think helping people is really, there is something at the core there that you're right.
[00:05:26]
Like when we're building software, like if we're building software that doesn't help any single person in the world,
[00:05:32]
like why would you build it? It doesn't really solve any problems.
[00:05:35]
So you want to solve some problems.
[00:05:37]
And, you know, you mentioned like accessibility and I feel the same way, like with open source projects,
[00:05:45]
it's just, it's more usable and accessible.
[00:05:48]
It's whether that be going and installing something on NPM or copying part of the source code,
[00:05:57]
because some, you know, some module in your code is doing something that somebody else needs for another project,
[00:06:06]
or they want to go look at it for reference and see how you implemented something.
[00:06:10]
Maybe you're using the same framework under the hood and somebody just wants to go look at the code
[00:06:14]
and see how someone else did it.
[00:06:16]
Yeah, there's definitely like a learning aspect to open source as well,
[00:06:22]
where you look at other people's code and you learn from that.
[00:06:25]
Yes. Right.
[00:06:26]
And I definitely feel like doing more open source has helped me reach new levels,
[00:06:32]
which would have been hard to reach if I only did programming at work.
[00:06:36]
Yes, absolutely.
[00:06:38]
And, you know, to your point of wanting to build things that help people, you want to leverage that too.
[00:06:44]
So the more leverage you have, the more your thing can help people.
[00:06:48]
And if it's open source, it can help people in these different ways.
[00:06:51]
It can help people by them looking at the source code.
[00:06:53]
It can help them by them being able to use it as a dependency in another open source project,
[00:06:59]
because it's just an open source thing.
[00:07:01]
They don't need licensing.
[00:07:02]
They don't need to think about any of these considerations,
[00:07:05]
but they can also use it in a proprietary project and they don't have to think about that.
[00:07:10]
And, you know, for me as an open source maintainer, that gives me great joy.
[00:07:14]
If people use an open source tool that I built in their business, that makes me very happy.
[00:07:20]
I mean, honestly, if no businesses used the tools that I built, then I might not build them.
[00:07:26]
That's like one of the main motivations.
[00:07:28]
And it makes it a lot easier for businesses to build them.
[00:07:31]
Like these days, it's hard to imagine a business betting on a programming language that's not open source.
[00:07:39]
This has not always been the case, but there's been sort of a revolution where that's the expectation,
[00:07:45]
because, you know, how are you going to feel confident about the security of a project
[00:07:50]
if you can't look at the code and see what it's doing?
[00:07:53]
I think there used to be sort of the opposite view maybe a decade or two ago.
[00:07:58]
For languages or for projects or tools in general?
[00:08:02]
For both, yeah.
[00:08:05]
I mean, there's also just like the fact that it's very cheap because it's costless.
[00:08:11]
Like, it doesn't cost you any penny to use it.
[00:08:18]
Well, until you have to maintain it a little bit because the quality might be a little bit more,
[00:08:23]
a little bit worse than if you use a proprietary solution, which should hopefully be better.
[00:08:31]
Like it can go both ways, right?
[00:08:33]
Right. I mean, if it's open source, then it's open to contributions.
[00:08:38]
But if it's not open source, then it might be more sustainably funded.
[00:08:43]
So that's sort of getting to the other side of what might be some of the downsides of open source
[00:08:50]
or perhaps not strictly downsides, but challenges that I think,
[00:08:55]
I feel that we're at a pretty novel stage of open source.
[00:09:01]
And we have a lot of maturing to do as a software community in figuring out,
[00:09:07]
like we've kind of decided that open source is the way to go for most projects,
[00:09:14]
for languages and frameworks and libraries for the most part, for 95, 99% of them.
[00:09:22]
But we haven't really figured out how to make the huge ambitious open source projects
[00:09:29]
we depend on sustainable and avoid burnout for the people maintaining them.
[00:09:34]
Burnout.
[00:09:37]
Open source little friend.
[00:09:42]
Yeah. So that's another side of it.
[00:09:45]
And I mean, I recently spent a year and a half working full time on the on-page V3 release.
[00:09:53]
And it was very rewarding. I got to build this thing that I really cared about.
[00:09:59]
But it was, I mean, and I was fortunate enough to have a company helping to fund my work,
[00:10:06]
but I was still the primary sponsor of my work. Right.
[00:10:10]
And I think a lot of people in the open source community end up doing that.
[00:10:16]
There are some projects that are lucky enough to have massive sustainable funding,
[00:10:22]
but the majority of open source is not that way.
[00:10:25]
I mean, when you say massive, I'm like, it's still pretty small.
[00:10:29]
Like any project you can think of has very little backing compared to any projects that you can find at work.
[00:10:36]
Yeah. I mean, like React, for example, would be one of the big ones that comes to mind
[00:10:41]
where they have enough budget to hire full time teams of people building documentation.
[00:10:48]
But it's rare and that might not last forever either.
[00:10:52]
Yeah. I think actually some of them are moving towards other companies.
[00:10:57]
So it's diversifying in a way, which is probably good.
[00:11:01]
My memory might be wrong about this, but if it is, then yeah.
[00:11:04]
No. Yeah. I mean, Dan Abramoff recently left Meta.
[00:11:08]
So and he was one of the key people in the React team,
[00:11:12]
but he's still going to be on the React core team just at a different company, I think.
[00:11:17]
So it's just the difference is who pays him, I guess.
[00:11:22]
Yeah. Yeah. And perhaps whether he'll be paid for it.
[00:11:25]
I'm not sure in that particular instance, but it's definitely a challenge for the open source world.
[00:11:33]
And of course, in the Elm community, we are particularly aware of this
[00:11:37]
because we've seen different permutations in the life of Elm
[00:11:43]
with how Evan has been funding Elm's development.
[00:11:47]
And we had an episode about funding open source with Evan,
[00:11:51]
and he talked about a lot of different ideas there.
[00:11:54]
And a lot of the challenges of aligning the incentives between a business
[00:11:59]
and an open source project is very difficult.
[00:12:02]
So another thing that comes to mind for me with open source is,
[00:12:06]
so what should users of an open source project expect?
[00:12:12]
And what should maintainers of an open source project expect from their users?
[00:12:17]
Perfection.
[00:12:19]
I expect nothing less than perfection from anyone.
[00:12:27]
Sometimes it feels that way.
[00:12:31]
Do you mean like, for instance, if I open an issue, what should I expect?
[00:12:36]
Yeah.
[00:12:37]
Or if I'm a maintainer, what do users expect of me? What do I expect of them?
[00:12:42]
Yes.
[00:12:43]
I have a feeling you want to lean me towards someone.
[00:12:47]
Well, I have opinions, but I'm curious what yours are.
[00:12:50]
I mean, I know that one of the things that people dislike with open source
[00:12:56]
is when you're a maintainer and there's a user who doesn't ask for something,
[00:13:02]
who doesn't open an issue or make a pull request on something,
[00:13:06]
and says, could you please look at this,
[00:13:09]
but who would demand that you look at something,
[00:13:13]
basically as if they were owed something.
[00:13:16]
And that is obviously not a great expectation,
[00:13:20]
which if it works out for the maintainer, sure.
[00:13:24]
If it doesn't, then refer to the license.
[00:13:28]
There's no warranty.
[00:13:31]
The maintainer is not getting paid for any of the work.
[00:13:36]
They are not compensated, so you should not expect anything from them
[00:13:40]
except their benevolence, I guess, in a way,
[00:13:43]
like their empathy and their willingness to work for free
[00:13:47]
just to make some people happy.
[00:13:50]
So is that where you wanted to lead me?
[00:13:53]
Yeah, it kind of is.
[00:13:55]
I knew it.
[00:13:57]
I definitely feel the same way.
[00:14:00]
So what should users expect from an open source project?
[00:14:05]
And yeah, to me, the answer is you shouldn't expect anything.
[00:14:09]
But that's obviously not great if you're just like, whatever,
[00:14:15]
I don't care what this project needs.
[00:14:19]
Obviously, I don't think that's the right answer either.
[00:14:24]
But I think the question for me is what do you want out of the project?
[00:14:30]
If you put an open source project out there,
[00:14:33]
if you publish your blog as an open source project,
[00:14:38]
what should people expect from you?
[00:14:42]
Clearly, that's kind of it.
[00:14:44]
It's like, this is my blog, and you can look at it,
[00:14:47]
and you can copy some of the code if you, whatever,
[00:14:51]
put the license in the right place.
[00:14:53]
But that's it.
[00:14:55]
People don't really expect much more.
[00:14:57]
But somehow, when it's publishing a library or a framework,
[00:15:02]
people can start to expect that they can set the agenda.
[00:15:07]
I don't think that doesn't feel good as a maintainer
[00:15:11]
when that's the vibe you're getting from somebody.
[00:15:14]
But at the same time, if you create a project that people are depending on,
[00:15:19]
then I think if you want that to be a sustainable thing
[00:15:25]
that people are going to continue to engage with,
[00:15:28]
you are somehow going to need to earn the trust of users.
[00:15:33]
So that's how I look at it.
[00:15:35]
It's like, what do you want this project to be?
[00:15:38]
And it's totally fair if somebody wants to make a project
[00:15:42]
and ride off into the sunset.
[00:15:45]
That's totally fine. They're allowed to do that.
[00:15:48]
And I don't blame an open-source maintainer who does that.
[00:15:52]
But I think that everybody's going to have a better experience
[00:15:55]
if they can set those expectations.
[00:15:57]
If that's what you're doing, then say, hey, this is it.
[00:16:00]
This project will never have any more commits.
[00:16:03]
Don't bother opening issues because I'm not going to look at them.
[00:16:06]
I think you should express that.
[00:16:08]
Which in GitHub you can do through archiving, for instance.
[00:16:11]
Yeah, right. Absolutely. Yeah.
[00:16:14]
So I think there's somewhere in between those two extremes.
[00:16:17]
But either way, I think setting expectations is a good thing.
[00:16:21]
And I think...
[00:16:23]
So for me, with my open-source projects,
[00:16:26]
I often find that things work best
[00:16:29]
when the roles are operating a certain way.
[00:16:33]
So I don't see my role as an open-source maintainer
[00:16:38]
as being to do everything that everybody wants for the project.
[00:16:42]
And in fact, I couldn't if I wanted to.
[00:16:45]
Because if I did everything that everybody wants for a project,
[00:16:48]
then one person would want this,
[00:16:51]
and another person would want another contradictory thing.
[00:16:54]
So it's literally impossible.
[00:16:56]
And that's one thing that I, as a maintainer, really appreciate,
[00:17:00]
is when people recognize that I am, as a maintainer,
[00:17:05]
balancing conflicting desires for a project, conflicting directions.
[00:17:11]
And so while somebody might have an opinion
[00:17:15]
that a particular direction is good,
[00:17:17]
and I want to hear about that opinion,
[00:17:19]
I really appreciate it when people recognize
[00:17:22]
that it is one opinion that I'm going to need to balance out,
[00:17:25]
as somebody leading an open-source project,
[00:17:28]
with my opinions and other people's opinions.
[00:17:31]
And theirs is just one possible direction.
[00:17:34]
So I really appreciate that sentiment,
[00:17:36]
because if people are coming at it in that way
[00:17:39]
where they expect their preferred direction to be executed on,
[00:17:45]
then it's giving you a whole other hurdle to have to jump over,
[00:17:51]
where now not only do you have to potentially work on something,
[00:17:57]
but you need to do all this extra effort to communicate that
[00:18:02]
and set those expectations.
[00:18:04]
So when people make it clear that they are not expecting you
[00:18:08]
to do whatever they're asking for,
[00:18:10]
it just makes it less work for the maintainer.
[00:18:13]
So that's one thing you can do as a contributor,
[00:18:16]
is make it clear, like,
[00:18:18]
I'm just making sure these options are there for your consideration.
[00:18:22]
I don't expect you to do this free labor.
[00:18:25]
I don't expect you to choose my direction.
[00:18:28]
But I wanted to put this out there for your consideration.
[00:18:31]
So, Lint, I find it really nice when people are thinking about it
[00:18:35]
as not just, like, what should you do as a maintainer,
[00:18:39]
but how do we make this project operate smoothly?
[00:18:43]
And how do we make sure that this project
[00:18:45]
is kind of having all these great ideas presented
[00:18:49]
so they can be considered?
[00:18:51]
I feel like that touches on something
[00:18:53]
that I quite enjoy with my projects,
[00:18:56]
or at least the feeling that I get with my projects.
[00:18:58]
I feel like everyone who interacts with mine,
[00:19:02]
they all want, just like me, the best from the project.
[00:19:08]
And we all know that that is made of trade-offs.
[00:19:12]
So some people might say,
[00:19:14]
I would like to have this,
[00:19:16]
and then I respond, or other people respond with,
[00:19:20]
well, if that is true, or if you want this,
[00:19:24]
then you're going to have a problem with this situation,
[00:19:27]
you're going to have this to handle as well.
[00:19:30]
Plenty of trade-offs to think about
[00:19:33]
and to figure out the best solution
[00:19:36]
that works for the most people,
[00:19:39]
or a custom way that works for you
[00:19:42]
but will not work for others.
[00:19:44]
That might be a solution as well.
[00:19:46]
Yeah, I just feel like people have this understanding,
[00:19:50]
which I love.
[00:19:51]
If you have interacted with me on ElmReview
[00:19:54]
in any way, shape, or form,
[00:19:56]
you're a part of this.
[00:19:58]
And I really appreciate it.
[00:20:01]
People are thinking of what is best.
[00:20:04]
And me, myself, even though I'm the maintainer,
[00:20:09]
I am just someone with one opinion.
[00:20:12]
In practice, I will probably make the end decision
[00:20:15]
because they're my projects,
[00:20:16]
but people are allowed to fork them.
[00:20:19]
But I am successful at convincing people of my opinions
[00:20:29]
that they're not totally wrong.
[00:20:32]
And sometimes I'm just convinced that that can also happen.
[00:20:35]
And I'm really happy when I get convinced as well.
[00:20:38]
So that feels good.
[00:20:39]
The expectations I have with people
[00:20:42]
who interact with my projects
[00:20:43]
is that we will have a conversation.
[00:20:46]
You are submitting an idea, a bug report,
[00:20:50]
and fixing or adding that feature
[00:20:54]
is not necessarily going to be simple.
[00:20:56]
So let's talk it out.
[00:20:58]
Let's figure out a solution.
[00:21:00]
And let's implement it.
[00:21:02]
And that implementation part might be me by me, you,
[00:21:07]
might be in a few years from now.
[00:21:09]
I am spread thin,
[00:21:11]
and I'm not doing this full-time
[00:21:15]
because Meta is not doing Elm and is not paying me.
[00:21:20]
So I'm happy that I'm getting these interactions.
[00:21:23]
And that's why I feel like I have very good interactions
[00:21:26]
with the Elm community, the open source.
[00:21:29]
Yeah, that resonates with me a lot.
[00:21:32]
So, you know, like the recognizing trade-offs,
[00:21:36]
recognizing that the timeline,
[00:21:38]
like users of an open source project
[00:21:41]
don't get to dictate the timeline.
[00:21:43]
That's not the role of the user.
[00:21:45]
And they also don't get to dictate the agenda
[00:21:48]
because, as you said, like they can present trade-offs,
[00:21:51]
but ultimately, like the person leading an open source project,
[00:21:55]
they're going to come to some conclusions
[00:21:57]
that might be different than somebody else.
[00:21:59]
Many times there are different ways
[00:22:01]
to approach an open source project.
[00:22:03]
And I think open source projects work best
[00:22:06]
when they recognize that, to me, a project is a perspective.
[00:22:12]
You can't try to incorporate every perspective into it
[00:22:16]
because that's just watering it down.
[00:22:18]
A project is choosing a perspective
[00:22:21]
and committing to that.
[00:22:23]
And I think they work best when they do that.
[00:22:25]
And I think open source projects work best
[00:22:28]
when the communication also recognizes that.
[00:22:31]
When you say, this project goes with this approach.
[00:22:35]
The approach you're talking about here
[00:22:37]
sounds like a totally valid set of trade-offs,
[00:22:41]
but here are the core values that
[00:22:43]
are laid out for this project.
[00:22:45]
Here are some examples that show that.
[00:22:47]
Here's ideally where some of these values are written down.
[00:22:51]
Or let's write them down now because I'm
[00:22:53]
realizing that we have these values for this project
[00:22:55]
now that this might not be aligned with.
[00:22:58]
And I think the more somebody depends on a project,
[00:23:04]
the higher the stakes are.
[00:23:06]
So if you make it a little extras helper package
[00:23:10]
in the Elm ecosystem, if somebody
[00:23:13]
has a different perspective on it, then you say, hey,
[00:23:16]
that sounds like a great idea.
[00:23:18]
It's just not what I see for the vision of this particular
[00:23:21]
extras package.
[00:23:23]
So somebody else can go and make another version of it.
[00:23:25]
Maybe it starts as a fork.
[00:23:26]
Maybe it's a totally different thing.
[00:23:28]
The stakes are very low.
[00:23:29]
If you're talking about the programming language itself,
[00:23:32]
Elm, the stakes are very high.
[00:23:34]
And I think that emotions can run high as well when people
[00:23:38]
are saying, I depend on the future of this project
[00:23:42]
because this is the language I'm using.
[00:23:45]
Not only is it the language I'm using,
[00:23:47]
but it's a highly constrained language with the philosophy
[00:23:49]
of not providing escape patches.
[00:23:51]
So if you don't provide an escape patch for me,
[00:23:54]
or if you don't provide a path for me,
[00:23:56]
then I'm highly dependent on that.
[00:23:59]
So it feels more emotionally charged in cases like that.
[00:24:03]
Yeah, I think it's important.
[00:24:06]
Well, I don't know if it's important.
[00:24:07]
I think it's helpful, very helpful,
[00:24:09]
when projects convey their goals and their non-goals,
[00:24:13]
which you kind of said with the perspectives.
[00:24:16]
Like my goals with Elm Review is to have something,
[00:24:21]
blah, blah, blah, that is blah, blah, blah.
[00:24:23]
And for my goals, but some of what people can perceive
[00:24:28]
as goals are not goals.
[00:24:30]
Like I don't want to turn Elm Review into a language server.
[00:24:35]
That is a non-goal.
[00:24:36]
Maybe that will evolve.
[00:24:38]
Who knows?
[00:24:39]
I don't think so.
[00:24:41]
But at the moment, there are non-goals.
[00:24:43]
And the same thing is for extra packages.
[00:24:47]
The same thing is for Elm.
[00:24:49]
Like some of the goals for the Elm language
[00:24:51]
is that we make something that is really maintainable,
[00:24:54]
easy for beginners, and fun maybe in a way, delightful.
[00:25:00]
And those are the goals.
[00:25:02]
If something makes those goals disappear,
[00:25:06]
like adding a new feature that makes error messages really
[00:25:11]
hard to read, type classes, for instance,
[00:25:14]
is one example that I've heard of multiple times.
[00:25:18]
Well, that conflicts with the goals.
[00:25:20]
So the trade-offs have to be, like the benefits you get
[00:25:26]
from adding such a feature have to be really high in order
[00:25:30]
to compensate the loss of error-friendliness.
[00:25:35]
But something that is a non-goal,
[00:25:37]
like for instance, having direct FFI,
[00:25:41]
direct interrupt with JavaScript,
[00:25:43]
is not a goal of Elm.
[00:25:45]
You have to go through these escape hatches, ports,
[00:25:49]
that are available.
[00:25:50]
And they are a goal of Elm to set up a nice barrier
[00:25:55]
around your code.
[00:25:56]
And that's the way that things were thought of.
[00:25:59]
It is not meant to provide direct FFI,
[00:26:03]
unless that happens to be easy, nice,
[00:26:07]
and without any judgments to other features.
[00:26:11]
Right, like guarantees, which is a huge part of the language.
[00:26:14]
Safety and guarantees.
[00:26:15]
So I'm sure, for instance, Evan would be all for type classes
[00:26:19]
and FFI if we didn't lose the guarantees,
[00:26:23]
and if we didn't lose the ease of use of the language.
[00:26:27]
Exactly, yeah.
[00:26:28]
So if someone can come up with solutions to that,
[00:26:32]
then that's probably going to happen one day.
[00:26:35]
If they don't, or if they conflict too much in trade-offs,
[00:26:38]
it won't.
[00:26:40]
So yeah, defining your goals and your non-goals,
[00:26:44]
that can help people know whether they even have
[00:26:48]
to suggest an idea, or how much they have to push it,
[00:26:52]
or if they get pushback, like understand,
[00:26:55]
we're not going to go with this approach because we have
[00:26:59]
these goals.
[00:27:00]
And I think that helps explain it.
[00:27:03]
I don't know if I make my goals clear enough with Elm Review.
[00:27:08]
I'm thinking probably not, but who knows.
[00:27:13]
What about you for your project?
[00:27:15]
I mean, I've definitely made an effort to lay out my goals,
[00:27:20]
and I do sometimes reference them in poll requests or issues.
[00:27:26]
Sometimes people will say, hey, it would be really great
[00:27:30]
if ElmGraphQL could support aliases.
[00:27:35]
And I'll say, well, if there were a way to support that,
[00:27:41]
that was in line with these goals,
[00:27:43]
then that would be great.
[00:27:44]
But I've found that it makes it a lot easier to communicate
[00:27:47]
when it's all around these goals.
[00:27:51]
Like, you know, there's something called nonviolent communication.
[00:27:55]
Sometimes people call it compassionate communication,
[00:27:57]
which interests me a lot.
[00:27:59]
What did you say?
[00:28:00]
What did you call it?
[00:28:01]
And the basic idea of it at the core is that you're basically
[00:28:11]
recognizing that everybody universally has certain universal needs.
[00:28:18]
You know, a need for entertainment and a need for ease and peace
[00:28:23]
and things like that.
[00:28:25]
These are basic core human needs that we recognize in everybody,
[00:28:30]
and it's not something we would dispute.
[00:28:33]
The need for rest.
[00:28:34]
But just because somebody has a need for entertainment
[00:28:39]
doesn't mean they can say, hey, Jeroen, do a dance right now.
[00:28:44]
Because, well, okay, maybe you can.
[00:28:48]
I am doing a dance right now.
[00:28:49]
He's doing a dance.
[00:28:50]
Pseudo-Jeroen, do a dance right now.
[00:28:52]
But basically these needs, these universal needs,
[00:28:59]
don't have a specific person, place, or time for how to fulfill those needs.
[00:29:06]
So you can still recognize that the need is there.
[00:29:09]
I have a need to be entertained, but I can't require you.
[00:29:15]
It's no longer universal when I'm requiring you right now
[00:29:18]
to meet that need for me.
[00:29:20]
So in nonviolent communication, that would be called a strategy.
[00:29:23]
That would be one strategy to meet that need,
[00:29:26]
but there are multiple strategies to meet the need for entertainment.
[00:29:30]
So I see it as very similar in open source,
[00:29:33]
and that's really helped me navigate a lot of these open source communications.
[00:29:38]
I mean, not even communication, but just receiving requests
[00:29:42]
in an open source project is like understanding,
[00:29:46]
okay, I get why somebody might be dependent on this particular project.
[00:29:51]
And so what is their need?
[00:29:54]
They're trying to solve a problem.
[00:29:56]
But similarly, this happens a lot in communication with communicating needs.
[00:30:03]
Often the point of conflict in communication is when we try
[00:30:09]
to demand a particular strategy.
[00:30:12]
I say, you're in a dance right now.
[00:30:15]
If I just instead said, like, oh, man, I could go for, like,
[00:30:20]
something fun and entertaining right now.
[00:30:22]
If I started with that, then we could explore different ways,
[00:30:27]
different strategies for meeting that need,
[00:30:29]
and we would have a much easier conversation.
[00:30:32]
And I feel it's much the same thing in open source.
[00:30:35]
If we can start with the universal needs, it just reduces the conflict level
[00:30:42]
and it makes it less stressful for the open source maintainer
[00:30:46]
and the user, I believe.
[00:30:48]
For example, I think the user, I want to hear what is their pain point,
[00:30:54]
what is their experience, what is the problem they're solving.
[00:30:58]
But often a request, a GitHub issue, starts with this project needs this,
[00:31:06]
this project needs to do this.
[00:31:08]
If instead they said, context, I'm using this project,
[00:31:12]
I'm trying to solve this problem, I'm not sure how to do it,
[00:31:15]
this is what I tried, this is what I ran into, possible solution.
[00:31:20]
What if you had an API that allowed you to do this?
[00:31:23]
And that gives the open source maintainer or somebody else
[00:31:27]
who is looking at the issues for the project the opportunity to perhaps
[00:31:32]
the solution takes the form of, oh, well, here's an API that maybe
[00:31:36]
you haven't tried.
[00:31:37]
Why don't you try using it this way?
[00:31:39]
That might solve your problem.
[00:31:41]
Or maybe there's another API, the API could take another form.
[00:31:45]
Maybe we could explore that.
[00:31:47]
So now it's an exploration and the tensions are less high because it's not
[00:31:51]
like my way or the highway.
[00:31:53]
We can explore options together without feeling like it's winner takes all,
[00:31:59]
zero-sum game, one of us is going to get our way and one of us is not.
[00:32:03]
And also, even if you went with this project needs this new feature
[00:32:08]
and the maintainer is like, okay, sure, I'll add it.
[00:32:12]
Well, maybe the feature will not be what the person requested in the
[00:32:17]
first place or exactly like, oh, no, I actually wanted it to return
[00:32:22]
this value when this argument is given.
[00:32:24]
Oh, but that's not what I understood.
[00:32:26]
But if you start with a problem to solve, then things become clear.
[00:32:31]
I mean, just like in an open source project, at work they tend to say
[00:32:36]
like, don't come up with, don't present solutions, present problems
[00:32:41]
and present ideas.
[00:32:44]
Exactly.
[00:32:45]
And as you mentioned earlier, there could be different ways to address
[00:32:51]
the underlying problem or maybe solving that problem is not in the scope
[00:32:57]
of the project.
[00:32:58]
Maybe it's a non-goal of the project or maybe it's a goal of the project
[00:33:03]
but it's not a goal for the maintainer or the maintainer doesn't have time
[00:33:07]
to work on that or doesn't have the motivation to work on that particular
[00:33:10]
thing.
[00:33:11]
And that's okay, too.
[00:33:12]
And I do think I'm not saying that maintainer, I mean, obviously I believe
[00:33:18]
you and I have put in huge amounts of our free time to trying to do things
[00:33:25]
in response to requests people have made.
[00:33:27]
Right?
[00:33:28]
So we're obviously not opposed to responding to people's requests and
[00:33:32]
building something for them.
[00:33:34]
But I think it just is really healthy for a project to recognize that, hey,
[00:33:40]
you can request something and I can say, hey, that sounds like a great idea,
[00:33:45]
pull requests are welcome.
[00:33:46]
Or maybe I decide to build it.
[00:33:49]
And I think for me, especially like as, I mean, I have a lot of open source
[00:33:54]
projects.
[00:33:55]
I get a lot of feature requests in my inbox.
[00:33:59]
And I can't, I literally can't do every single feature request everyone puts
[00:34:04]
in my inbox.
[00:34:05]
It wouldn't, if I did, I would implicitly be saying no to somebody else's
[00:34:09]
feature request because by starting to work on something, I wouldn't have time
[00:34:13]
to work on the other thing.
[00:34:15]
And that's even if I'm working full time, like literally, it's just not
[00:34:18]
possible.
[00:34:19]
When you say full time, do you mean only eight hours a day?
[00:34:23]
Right.
[00:34:24]
Probably not.
[00:34:25]
And not on weekends?
[00:34:27]
Come on, put in some effort.
[00:34:29]
Yeah.
[00:34:30]
I mean, often not.
[00:34:32]
And even then.
[00:34:33]
And, you know, so I think it's, I think it depends on the type of issue,
[00:34:39]
right?
[00:34:40]
If there's like a blocking issue, it's a core feature of the framework and
[00:34:44]
it's blocking people from solving basic use cases with the tool or library.
[00:34:52]
Right. Obviously that's going to change your prioritization on it compared to
[00:34:59]
some nice to have feature.
[00:35:01]
Hey, this would be a really handy thing to have.
[00:35:03]
And in cases like that, I'm much more likely to say, hey, that sounds really
[00:35:08]
interesting.
[00:35:09]
I would be glad to like do the work to review a pull request and then for the
[00:35:15]
rest of this project, maintain this code, which is actually a very large cost.
[00:35:21]
Right.
[00:35:22]
Like when you're, when somebody is, it's not free to just pull in somebody's
[00:35:28]
code because, oh, they wrote this code.
[00:35:30]
When somebody writes the code, you're now committing to continue to consider
[00:35:36]
how that feature affects the project.
[00:35:40]
So any new features that are added, you need to consider that feature and how
[00:35:44]
it interacts with new features you're adding or new bug fixes you're doing.
[00:35:49]
And reviewing that code is not free.
[00:35:52]
Somebody might make a pull request that has several subtle bugs.
[00:35:56]
Right.
[00:35:57]
So it's, it's actually, you know, there's less investment needed to make a pull
[00:36:03]
request because you're not taking on responsibility for the project's long
[00:36:07]
term.
[00:36:07]
Like if somebody makes a pull request and there are bugs that result from that,
[00:36:11]
are they then going to fix them?
[00:36:13]
Or are you going to revert the feature if you find that there were bugs with it?
[00:36:16]
Probably not.
[00:36:17]
You might be spending some of your weekends and evenings fixing that bug,
[00:36:23]
which actually happens to me frequently.
[00:36:26]
Right.
[00:36:26]
So it's, I think it's really good to recognize that open source, there is a
[00:36:31]
cost to, to it.
[00:36:33]
It's not just reviewing a pull request, but to, to taking on new scope.
[00:36:38]
So I think it just helps to recognize, to have empathy for that, you know?
[00:36:42]
Yeah.
[00:36:43]
I feel like some of the best features that are requested and which will
[00:36:49]
motivate me the most is the ones that I want myself.
[00:36:53]
Like for instance, I make Elm Review and I'm a user of Elm Review.
[00:36:58]
And there are some people who say, well,
[00:37:00]
it would be nice if we could make a rule that does this,
[00:37:04]
or if there was this rule.
[00:37:06]
And I'm like, yeah, I want that as well.
[00:37:09]
Like the no news record fields, for instance.
[00:37:12]
Doesn't exist, would be amazing to have.
[00:37:15]
And it's more likely that people that that will happen if you get me on board
[00:37:21]
with the, the intent of your, with your idea.
[00:37:26]
And me as a maintainer,
[00:37:28]
I want my project to work as best as possible for my users because empathy,
[00:37:33]
I guess.
[00:37:35]
So if there are bugs that are, that I can solve, then I will solve them.
[00:37:40]
If there is a pull request, even better.
[00:37:43]
But yeah,
[00:37:44]
if you get me on board because I want my project to be as flawless as
[00:37:49]
possible,
[00:37:51]
and,
[00:37:52]
or you want a new feature that I also want because I want my product to be
[00:37:55]
as useful as possible,
[00:37:57]
then that's going to give you the best changes to, to get your idea in.
[00:38:01]
I don't know how you can affect what I want though.
[00:38:05]
But yeah, I guess that's part of the goals of the project as well.
[00:38:09]
Like you probably know where I want to go in a way where you can kind of
[00:38:14]
guess. And well,
[00:38:16]
through discussion we will figure out whether I do or I won't.
[00:38:20]
Yeah.
[00:38:22]
I would say for me, like one,
[00:38:25]
one thing that makes me far more likely to either roll up my sleeves and,
[00:38:31]
and implement something myself or,
[00:38:33]
or,
[00:38:34]
or be interested in somebody making a pull request about a particular feature
[00:38:39]
and wanting to whatever,
[00:38:41]
have Slack messages coordinating that and that sort of thing is how much are
[00:38:48]
they invested in it? Like if somebody,
[00:38:51]
if somebody opens a GitHub issue and says, Hey,
[00:38:54]
this would be really cool.
[00:38:55]
And there's nothing laid out of like, what problem does this solve?
[00:38:59]
Why do I have this problem? What are possible trade-offs?
[00:39:03]
What are possible downsides to this new feature?
[00:39:07]
What are possible approaches and implementations?
[00:39:10]
Like I'm not very likely to consider a feature request if it's just a sort of
[00:39:15]
not, if it's not giving me that motivation of why,
[00:39:19]
why is this important? It's like, well,
[00:39:21]
if you don't care enough to really lay out what problem this is solving and,
[00:39:25]
and really dig into like, how would you do this?
[00:39:29]
Why should I be interested enough to do that for you to,
[00:39:33]
to flesh out this feature idea more deeply?
[00:39:37]
So I'm probably not going to prioritize that over something else where someone
[00:39:41]
has done that.
[00:39:42]
Are you saying that if you get a issue saying as a title,
[00:39:47]
add feature X and that the comments of,
[00:39:52]
of the issue says no description,
[00:39:56]
the when it's empty, but you're not getting passionate.
[00:40:01]
Like you don't have a fire burning and causing you to roll up your
[00:40:06]
sleeves and get to work. Really?
[00:40:09]
I say that not, not just as a, like, you know, old man yells at cloud.
[00:40:15]
Although partially I also say it is that, but I also say that as like,
[00:40:20]
and I actually make an attempt to,
[00:40:24]
to communicate those types of things on issues and say, Hey,
[00:40:27]
if you think this is interesting, I'm,
[00:40:29]
I'm willing to like accept a pull requests.
[00:40:32]
If you can help me understand like what problem this would solve and how you
[00:40:36]
would do this and how the trade-offs are going,
[00:40:39]
going to look and how it's going to interfere or not interfere with this
[00:40:43]
feature, you know? So I try to communicate those things.
[00:40:47]
And actually pretty often people do say, okay, great. Yeah.
[00:40:51]
I'd be happy to do that.
[00:40:52]
And they write out super thoughtful comments and get some prior art and show
[00:40:58]
me how other projects have solved this problem and maybe make a pull request
[00:41:03]
or make a pull request that has some failing tests. So it,
[00:41:08]
I think giving users the opportunity to do that and communicating like what,
[00:41:12]
what you need as a maintainer is really good too,
[00:41:14]
because at the end of the day, as you said, like, I mean,
[00:41:17]
I think open source is a tool for making our projects more accessible,
[00:41:22]
but also like helping people more and contributions are a tool for that.
[00:41:27]
And the way we build our open source projects,
[00:41:30]
the way we communicate in our open source projects are tools for that,
[00:41:33]
because at the end of the day,
[00:41:35]
we're putting time into this because there's something we care about putting
[00:41:39]
into the world.
[00:41:40]
We care about being able to have more guarantees in an Elm project by doing
[00:41:45]
more powerful static analysis. That's like,
[00:41:48]
I believe that's something that you care about at your core and managing an
[00:41:54]
open source project effectively leverages you to be able to do that better,
[00:41:58]
to, to put that vision into the world in a more effective way.
[00:42:02]
So I think communicating can help people do that. And I think also like,
[00:42:08]
so I often think about like the role of a,
[00:42:12]
an open source maintainer or lead on an open source project as kind of like a
[00:42:17]
CTO for, for a mini company. And as that company scales,
[00:42:22]
the role of the CTO also changes. So, you know,
[00:42:26]
if you're CTO in a company of two, then,
[00:42:31]
then you're, you're the developer of the company, right?
[00:42:33]
You're also making technical decisions that if that company were to take off
[00:42:38]
and become a company with a hundred developers, a thousand developers,
[00:42:42]
those technical decisions are going to impact the long-term roadmap for the
[00:42:47]
company and the long-term success technically of the project.
[00:42:52]
So that's the hat I'm wearing early on in an open source project when I'm
[00:42:58]
maybe not even sure it's going to be successful, right?
[00:43:00]
Maybe it'll be a failed startup. Maybe it'll be an open source project that
[00:43:04]
nobody uses and, and that can happen and that's okay. But,
[00:43:09]
that's the hat I'm wearing when I'm early on in an open source project.
[00:43:13]
And as the project scales,
[00:43:15]
I tend to play a more strategic role and I'm thinking about how do I make
[00:43:22]
technical decisions? How do I help mentor people? You know,
[00:43:26]
how do I get on call?
[00:43:27]
Like maybe I'm going to be spending more time getting on video calls with
[00:43:31]
people who want to make contributions to help them,
[00:43:34]
to pair with them to help talk through certain trade-offs or technical
[00:43:40]
questions.
[00:43:41]
And I'm also like thinking really hard about high level strategic choices,
[00:43:47]
like what's our testing strategy going to be?
[00:43:49]
Are we doing some snapshot tests? Are we doing fuzz tests on this?
[00:43:53]
Like what's going to ensure quality and make that high bar for anybody
[00:44:00]
contributing to it? Not just me, because if it's a,
[00:44:03]
if it's a big project that a lot of people depend on,
[00:44:06]
I want to make it easy for a lot of people to contribute to it.
[00:44:09]
And so that's something I'm really focusing a lot of my time on that.
[00:44:13]
I think I uniquely need to be focused on as the CTO of the open source
[00:44:19]
project as it grows.
[00:44:21]
Right. So when you get someone to contribute a pull request,
[00:44:26]
how much do you care about like the quality of the contribution?
[00:44:30]
What are the types of things you're thinking about with quality?
[00:44:33]
I'm curious.
[00:44:34]
So whenever you get a pull request,
[00:44:37]
you will wonder a few things like is it code? Does a code look okay?
[00:44:43]
Does this handle all the different cases?
[00:44:46]
Are there any obvious bugs that can be found? Is it co-style okay?
[00:44:52]
Like all those things. Which ones do you care about?
[00:44:56]
Which ones do you not care about?
[00:44:58]
Yeah. I tend to be fairly trusting about contributions.
[00:45:04]
I look for ways that a contributor can show me that they're,
[00:45:10]
that they're taking ownership of those considerations.
[00:45:14]
And if I'm not being given signs of that,
[00:45:19]
then I'll ask to be communicated with in a way that gives me signs of that.
[00:45:23]
Like, what are the things you're thinking through here?
[00:45:26]
Like, can you lay that out for me?
[00:45:28]
Because in general, I don't want to micromanage people's contributions.
[00:45:34]
I generally want to trust them and give them some level of ownership.
[00:45:40]
And, you know, there are certain quality standards that I have for the project
[00:45:46]
that are pretty superficial to check.
[00:45:50]
Did you write tests? Is the CI green?
[00:45:54]
Right. Like, but I try to automate those as much as possible.
[00:46:00]
Like I'm not going to go through and check code style and things like that
[00:46:04]
because Elm format in my CI and Elm review in my CI and my approval test suite
[00:46:11]
and my unit test suite do that.
[00:46:13]
In the pull request, I am going to say, hey, I noticed this doesn't have tests.
[00:46:17]
I'm not going to merge this until it has some tests.
[00:46:21]
But other than that, I generally like to trust people.
[00:46:24]
But I do try to make sure that we're having the conversation where I see
[00:46:29]
that they're taking ownership and considering all these things.
[00:46:32]
Because I want to give contributors ownership.
[00:46:34]
Like I don't want to take that away from contributors.
[00:46:37]
I want to allow them to have some flexibility in how they approach something
[00:46:43]
because it's their thing.
[00:46:45]
They are contributing it to a project I maintain.
[00:46:48]
And so that does mean that I'm committing to taking on maintenance of it.
[00:46:54]
But I also want to trust people.
[00:46:56]
Yeah, I haven't thought of the ownership aspect and considered it.
[00:47:02]
But otherwise, I do pretty much the same thing.
[00:47:05]
Like as long as the CI is green and as long as there are tests,
[00:47:10]
I'm usually okay with it.
[00:47:12]
Sometimes if I'm worried about something, I will ask them to add a few tests
[00:47:17]
and to fix them if needed because they need to be green.
[00:47:21]
But other than that, especially if it's like a new contributor,
[00:47:26]
if the code style is not to my liking for the things that Elm Review doesn't report
[00:47:33]
or Elm Format doesn't report, I will tend to let those pass.
[00:47:40]
I will merge their pull request and then I will go fix them afterwards.
[00:47:48]
I feel like it's hard to get pull requests in sometimes
[00:47:54]
as someone who is like a first-time contributor.
[00:47:59]
So since the first time is the hardest, let's make that one easier.
[00:48:04]
We still want something of high quality or of decent quality,
[00:48:11]
but I will try to make that easier on the person.
[00:48:15]
And if that puts some strain on me, I'm fine with that.
[00:48:19]
And then if that person contributes more, then I will make more comments
[00:48:24]
because they will also understand how I work, how the project is written,
[00:48:30]
and we want things to be consistent.
[00:48:32]
They will understand the various trade-offs.
[00:48:34]
But on the first few pull requests, that's maybe not the essence of the contribution.
[00:48:40]
Right. Yeah, that makes sense.
[00:48:42]
Yeah, I'll definitely help push along first-time contributors as well in that way
[00:48:47]
where if there's something that they just were missing, like,
[00:48:51]
hey, there's a module that abstracts away some of these details
[00:48:54]
that we use in this code base, then I may make a commit on the PR
[00:48:59]
or point them to it depending on how involved it is.
[00:49:03]
And yeah, regarding the ownership, I think the more you give somebody your trust
[00:49:11]
and ownership over something, the more they step up to it.
[00:49:15]
That's just something I've noticed.
[00:49:16]
I definitely feel that way as well.
[00:49:19]
So I think as maintainers, we can really set the tone where if we're not trusting
[00:49:27]
our contributors, they feel that, and they feel constrained and like,
[00:49:33]
we're going to check everything and basically redo their work.
[00:49:37]
So they don't really look at the big picture because that's not what they're being asked to do.
[00:49:44]
They're being asked to just give some code, but we're going to be micromanaging it anyway.
[00:49:50]
So why would they be thinking about the big picture of how it fits in and everything?
[00:49:56]
There's a TED talk I saw by this author of a book.
[00:50:00]
I think it's called Turn This Ship Around.
[00:50:01]
And the author was a commander or admiral or something of a nuclear submarine, I believe.
[00:50:10]
And his first day on the job on this nuclear submarine, he actually was given a different type of vessel
[00:50:19]
than he thought he was going to be commanding.
[00:50:21]
And so he started to give these orders.
[00:50:26]
And people would look confused sometimes and he'd say, what's wrong?
[00:50:31]
Is there a problem?
[00:50:32]
And they'd say, well, we don't have that unit on this ship or something like that.
[00:50:36]
And he would realize when he was giving orders, people would sort of shut off their thinking
[00:50:44]
because they'd just be like, well, it's my duty to do what was asked of me,
[00:50:49]
even if it doesn't really make sense.
[00:50:51]
Because you're not being asked to think about the big picture.
[00:50:54]
And so he ended up realizing that if he was going to successfully run this vessel,
[00:50:59]
he would need to do things differently.
[00:51:02]
So he started to say, it's my intention to submerge the vessel.
[00:51:07]
And what am I going to ask you?
[00:51:10]
And they would start thinking about his goals.
[00:51:13]
So, OK, well, is everybody going to be safe?
[00:51:17]
And whatever. His checklist of things.
[00:51:20]
So that was his way of mentoring everybody to make sure these are the,
[00:51:24]
this is the vision that I'm setting as the captain.
[00:51:28]
But I'm trusting you to execute that and take ownership over your part of it.
[00:51:33]
And I'm setting the high level vision.
[00:51:35]
And I think that that's a really good way to approach an open source project as well.
[00:51:40]
Yeah. Yeah, that resonates with me as well.
[00:51:43]
So when is an open source project done?
[00:51:46]
When the maintainer leaves?
[00:51:54]
When there's no maintainer left?
[00:51:56]
When the maintainer gets hit by a bus?
[00:51:58]
Apparently that's a thing that happens with maintainers.
[00:52:01]
Yeah, quite often.
[00:52:03]
Actually, I don't know any maintainer who's been hit by a bus.
[00:52:10]
Definitely stay away from buses, though.
[00:52:14]
No, no, no. Use public transport. It's good. It's good.
[00:52:17]
Be on the bus. If you're on the bus, your odds of getting hit by a bus are lower. Probably.
[00:52:24]
I mean, if you're on the bus, then you're probably trying to flee someone with a gun
[00:52:29]
and you jumped from a bridge on top of the bus.
[00:52:36]
Maintainers lead interesting lives.
[00:52:42]
I guess. When is a project done?
[00:52:45]
Honestly, when it reaches its goals and when it's perfect, in the sense of
[00:52:52]
whichever author said perfection is attained when there's nothing more to remove.
[00:52:59]
Something like that.
[00:53:02]
Which is very far from where our projects are, I think.
[00:53:07]
I mean, you have some projects that could be considered to be done or close to done.
[00:53:11]
Yeah, absolutely. I mean, and I think it depends on the scope of the project, right?
[00:53:16]
If it's a project that, I don't know, if it's a project that parses a URL or parses an ISO 8601 date, right?
[00:53:30]
Like, is Richard's ISO 8601 date parser package done? I think it pretty much is.
[00:53:38]
And I think that sometimes a project can be done when it has a particular vision.
[00:53:47]
It sort of meets that vision.
[00:53:50]
And then sometimes it's better, rather than trying to reinvent that project,
[00:53:56]
sometimes it's better to create a different project with different goals,
[00:53:59]
rather than completely transforming the goals of that project.
[00:54:03]
But I think that happens quite often, and I think that's a natural part of the cycle as well.
[00:54:08]
But yeah, for ElmGraphQL, for example, I think it's at a phase where it kind of delivers what it promised.
[00:54:20]
And small improvements come up, and I do actively work on it,
[00:54:27]
and merge pull requests and small bug fixes come up.
[00:54:33]
But it's much less frequent, and the core features are there, and they're pretty much solid.
[00:54:42]
Not that it's... I don't think it's a perfect project, but I think it's a dependable project.
[00:54:48]
You can basically use it to do what it promises.
[00:54:52]
So it's more in maintenance mode, I would say.
[00:54:56]
Not that I could never ever feature.
[00:54:58]
Yeah, because the project is doing pretty much all that it needs to.
[00:55:02]
Right.
[00:55:03]
So yeah, ElmGraphQL wanted to allow you to interact with GraphQL endpoints in a specific way.
[00:55:13]
And as long as you reach that goal, and no one finds anything that needs to be added,
[00:55:19]
like new support for ADSes maybe, I don't know if that's a new thing, then yeah, you're done.
[00:55:27]
Right.
[00:55:28]
Or close to done.
[00:55:29]
Like, yeah, maintenance, fixed typos in the documentation that no one has seen before, that can happen.
[00:55:36]
Nothing really big, right?
[00:55:38]
Yeah, and I think that's...
[00:55:40]
I mean, the scope of ElmGraphQL is definitely like...
[00:55:45]
I mean, it's a non-trivial project, but it's also like a pretty clear scope.
[00:55:50]
Like frameworks like ElmPages, it would be a lot harder to ever call ElmPages done.
[00:55:56]
Because it's a framework.
[00:55:59]
Because the goal is much bigger.
[00:56:01]
I mean, you say that, but for instance, Backbone, back in the day,
[00:56:05]
which I've never used, but I've heard people...
[00:56:08]
I went to a Backbone meetup once in Paris, and they talked pretty much about anything else.
[00:56:15]
I didn't learn any Backbone there, because Backbone did what it had to do,
[00:56:23]
and they talked about other projects that worked well with Backbone.
[00:56:27]
I think, for instance, Lodash or something.
[00:56:30]
So the project was simple enough, in a way, and it did what it needed to do.
[00:56:36]
But it was inadequate for some use cases, and therefore died out.
[00:56:40]
That might be one of the reasons why it died out, I don't know.
[00:56:44]
But yeah, it is possible for it to finish, if you lay the right groundwork.
[00:56:53]
Or don't know how you say that.
[00:56:55]
Yeah, if your vision wants to allow users to do an enormous amount of things
[00:57:02]
that you're not doing, then yeah, you're far from being done, right?
[00:57:08]
Yeah, I think it's extremely valuable to put a lot of thought into how you scope a project.
[00:57:14]
Because, at the beginning of the episode, we talked about what should users expect from maintainers.
[00:57:22]
And of course, the software comes as is.
[00:57:26]
If you really don't want a big commitment, then don't take on a large scope of the project.
[00:57:34]
Try to narrow the scope down.
[00:57:36]
Or at least communicate what you plan to contribute to it over time.
[00:57:43]
But I think, we talked to Ryan Haskell-Glatz about his approach in LMSPA
[00:57:50]
with just trying to not make people blocked on his technical decisions by providing extension points.
[00:57:59]
Where the framework isn't responsible for everything they want to do.
[00:58:04]
And Ryan was even talking about it, he's almost afraid of taking on that responsibility of
[00:58:10]
users don't have a way to do things unless I give it to them.
[00:58:14]
And I think that's very wise.
[00:58:16]
And I think that's a good way to run a project.
[00:58:18]
You should really consider if that's what you want to do.
[00:58:22]
And avoid it if at all possible.
[00:58:26]
Yeah, LMSPA is one of those projects where if you limit what people can do,
[00:58:32]
it's going to kill the project or it's going to frustrate users.
[00:58:36]
Right.
[00:58:37]
If it's an auctioneering tool, then that's a lot more accepted, I would say.
[00:58:44]
Exactly.
[00:58:45]
For instance, for Elm Review, I feel like if I don't allow rule authors to make something,
[00:58:51]
then it's a shame.
[00:58:54]
If it's something that could have been useful, then it's a shame, but it's okay.
[00:58:59]
If you do that with Elm Pages or LMSPA, that's not going to float.
[00:59:04]
Exactly.
[00:59:05]
So one thing we haven't talked about yet at this point is how do you get feedback from users or from contributors?
[00:59:13]
So, I mean, we come up with plenty of tool or feature ideas,
[00:59:20]
and we know we're not always perfect in our decisions.
[00:59:24]
And sometimes it takes us years to think of some things.
[00:59:28]
And therefore, we need feedback.
[00:59:29]
We need to know what people will want to use something for,
[00:59:33]
and we need to ask them their opinion.
[00:59:36]
So how do you go about that and doing that?
[00:59:39]
Yeah, well, I love feedback, and I think that feedback is essential for the health of a project, in my opinion.
[00:59:48]
And it's a role that users are uniquely able to play.
[00:59:54]
Of course, we can give ourselves feedback, but we're kind of biased in the way we perceive things.
[01:00:00]
Yeah, I mean, we are still users of our own tools.
[01:00:03]
We are users.
[01:00:04]
Thankfully.
[01:00:05]
Otherwise, like, yeah.
[01:00:08]
But there's also a huge value to getting feedback from different uses of the tool.
[01:00:15]
And so I think it's an essential process.
[01:00:18]
And I mean, for me, the first thing that comes to mind is just ask.
[01:00:23]
Ask for feedback.
[01:00:24]
I try to ask for feedback all the time.
[01:00:26]
Like, you know, I would love to hear what you think of this.
[01:00:30]
And I often ask that on Slack when I release a new feature.
[01:00:35]
Also in GitHub issues.
[01:00:37]
You know, that's another like if somebody opens an issue, then again, that conversation of somebody opening an issue and saying this needs to do this,
[01:00:47]
and then peeling that back and saying, well, what problem are you trying to solve?
[01:00:51]
Sometimes that turns into understanding the experience people are having more.
[01:00:58]
What about you?
[01:00:59]
Yeah, I guess nowadays there's a sufficient number of people who roam the Elm Review Slack channel.
[01:01:09]
So there are people responding to my questions, and that feels good.
[01:01:14]
Unless they're very technical.
[01:01:16]
My questions, I mean, and I'm the only person who cares about this thing.
[01:01:21]
Then I don't always get answers.
[01:01:24]
But usually, yeah, just ask questions.
[01:01:27]
I do have ideas that take months to complete.
[01:01:32]
And then I write an RFC or write some kind of blog post in my notes, you know, and then I make an issue of that.
[01:01:40]
I don't do that nearly enough.
[01:01:41]
I have plenty of ideas that I should make available for people to comment on.
[01:01:48]
And maybe they would just add like one simple comment.
[01:01:51]
And I would be like, oh, yeah, that's a solution.
[01:01:53]
But that just takes a lot of time still, right?
[01:01:57]
Just to get it to a point where you can share it.
[01:02:00]
Yeah.
[01:02:01]
For instance, like the other day, I was like, here's an idea.
[01:02:06]
I've thought about this for a while.
[01:02:08]
I don't know if it's perfect.
[01:02:09]
And it's a very long thing.
[01:02:12]
I'm like, ah, I don't know if I'm in the mood of writing, of adding an example to this.
[01:02:18]
Like a few use cases.
[01:02:20]
Let me just get it over with and send it.
[01:02:23]
And a few minutes later, someone comes down and asks, do you have any use cases or examples for this?
[01:02:29]
Like, ah.
[01:02:31]
Well, OK, well, now I'm going to add those.
[01:02:34]
But at least the idea will get out.
[01:02:37]
So, yeah, it takes a long time, especially to present ideas in a way that's still, that are still open for discussion.
[01:02:47]
Right, because I don't want to have a problem that I want to solve.
[01:02:52]
I have some solutions I have in mind, but I don't want to close it to other solutions, which could be better.
[01:02:59]
And I hope are better because I'm not necessarily entirely satisfied with my own solutions.
[01:03:06]
And sometimes the solution is like, I have an idea.
[01:03:11]
I have a problem.
[01:03:13]
Here's a solution I'm suggesting.
[01:03:15]
And maybe the result is that is a pretty bad solution.
[01:03:19]
Let's just not do it.
[01:03:21]
Let's not solve this problem.
[01:03:23]
Yeah, I'm a fan of the RFC process as well.
[01:03:26]
I think like opening up a GitHub discussion thread and just saying, like, I even like it, even if nobody comments, which happens.
[01:03:36]
Like, I find it useful as a document to outline my thoughts.
[01:03:41]
And as I'm writing it in a way where I'm trying to present it in a way that's easy to understand for other people and that, you know, lays out all of the possibilities.
[01:03:53]
So people can say like, hey, here are three different paths we could go down here, I think, are the tradeoffs of all of them.
[01:04:00]
I might be missing some, but that process of trying to like exhaustively brainstorm all of the different approaches that are possible and all of the tradeoffs for them is valuable in itself.
[01:04:12]
And it's to me, I believe it's more valuable when I believe I'm communicating it to real people, not just in my notes.
[01:04:21]
Yeah, it's like when you have a duck, right?
[01:04:24]
And you're explaining your problem to a duck.
[01:04:27]
Right, right.
[01:04:28]
Yeah, exactly.
[01:04:30]
It's different when you're trying to communicate it and make sure it lands.
[01:04:34]
And often I do get amazing discussions where people are sharing their use cases and ideas.
[01:04:39]
So yeah, RFC processes are really valuable.
[01:04:42]
Yeah.
[01:04:43]
And regardless of whether they're in your notes or on GitHub, if you've written them down and you come back to it a few weeks or months after, or a few hours maybe even, you're going to come up with new ideas.
[01:04:57]
So it's always quite interesting to put it in writing in a way that is well articulated.
[01:05:05]
Now you can come up with new ideas.
[01:05:07]
Right.
[01:05:08]
And you might forget all the things you probably will forget, all the different possibilities you considered.
[01:05:15]
And then down the line, a couple of years from now when somebody says, hey, why didn't we do it this way, then you dig through, you search through GitHub and you find that RFC and you're like, oh, actually I talked about the cons here.
[01:05:29]
And maybe you missed a consideration or maybe you already thought it through and you just point to that.
[01:05:35]
So having those historical documents can be very valuable.
[01:05:39]
And now I have FOMO, I'm wondering, did I do that enough?
[01:05:45]
It's a good habit.
[01:05:46]
So one thing I noticed with, and I'm sure you have as well, noticed with the Elm community is that we like to tend to batch work.
[01:05:55]
Evan made that quite explicit to talk about batching work.
[01:06:00]
And I feel like we do it too.
[01:06:02]
I don't know if we do it for the same reasons.
[01:06:06]
And I was wondering, so one thing I really don't like is breaking versions.
[01:06:13]
I say I really don't like them.
[01:06:15]
I just mean, I tried very hard to avoid them because, especially in the case of Elm Review, there's a lot of packages that depend on Elm Review.
[01:06:23]
So if Elm Review releases a new major version, then all of them need to be updated.
[01:06:28]
Some of them are mine, which I can do.
[01:06:30]
It will just take me a few hours more.
[01:06:33]
But some of them are for other people, and that will take longer to, that will cause others pain to upgrade.
[01:06:42]
And I want to avoid that as much as possible.
[01:06:44]
So Elm Review has not had a major version since April 2020, which is quite an achievement in a way.
[01:06:53]
I know I will want a v3 at some point.
[01:06:58]
I just don't know when.
[01:07:00]
I wonder whether this fear of breaking changes causes us to batch work.
[01:07:07]
Because Elm enforces semantic versioning, and that means that there are some changes that I can't do without making a new major version.
[01:07:18]
And if I want to avoid them, I need to think really hard about how this feature will be used in the future.
[01:07:26]
How this feature will affect other things.
[01:07:30]
And in that sense, I need to carefully think about things.
[01:07:35]
Make RFCs, write down notes for months or years.
[01:07:39]
And once I feel like I have everything thought through, then I can implement it.
[01:07:47]
And I'm sure get some discoveries still.
[01:07:51]
But I wonder, if you care about avoiding breaking changes, do you batch work more?
[01:07:59]
What do you think?
[01:08:01]
I think you do. I think that's definitely one reason for batching work.
[01:08:06]
I don't even think it's the main reason for me though.
[01:08:09]
I think the main reason that I tend to batch work is...
[01:08:13]
First I'll say, if there's a pull request that's a typo in the docs, then I'm just going to click merge.
[01:08:22]
Because I want to get that off my radar as fast as possible.
[01:08:28]
Because it's just like, having it sitting around...
[01:08:31]
There's this idea in getting things done, which we talked about in our productivity episode, of the two minute rule.
[01:08:37]
Which is that, if you can complete something in two minutes or less, then managing that in your to-do system is going to be more costly than just doing it.
[01:08:50]
Because you accrue some sort of tax by having more things in your system.
[01:08:56]
So I definitely try to push things through when there's not a lot to think about.
[01:09:03]
But when there are deep considerations that I need to go through, then sometimes those need to sit with me for a little bit.
[01:09:12]
And I need to sleep on it, and I need to read through a bajillion RFCs that other open source projects and other language communities have made.
[01:09:23]
And watch some conference talks, and read some code books, and read some non-code books, and drink a Mai Tai, and think about these things.
[01:09:32]
Specifically Mai Tai?
[01:09:35]
It couldn't hurt.
[01:09:36]
I just don't know what it is, so yeah, maybe.
[01:09:39]
Try one out, it's good.
[01:09:41]
I think there's a lot of background processing for decisions for me.
[01:09:46]
Have you heard this story of the man who asked for a painting of a horse?
[01:09:54]
And so he asks this painter, he says, I want to commission a painting of a horse, it's like a birthday present for someone or something.
[01:10:03]
And the painter says, okay, yeah sure, I'll have that for you in a month or so.
[01:10:08]
And he goes back to the painter, and the painter says, are you done with the painting yet?
[01:10:13]
No, no, no, I'm still painting it.
[01:10:16]
And a couple weeks go by, and the painter says, hey, are you done with it yet?
[01:10:19]
No, no, no, I'm still working on it.
[01:10:21]
And he keeps going back, and he's not done, and eventually he goes back, and the painter gets so frustrated, he says, okay, okay, okay.
[01:10:27]
And he gets out an easel and paints a horse, and then gives it to him.
[01:10:31]
And he's like, well, if you did it so quickly, why didn't you just do that before?
[01:10:36]
And he says, well, I've been, you know, observing horses, and watching how they run, and thinking about them, and dreaming about them.
[01:10:43]
So all this time, he was working on painting the horse, even though his brush was only touching the canvas for however long, that was part of the process.
[01:10:53]
And that's how I feel with coding projects, is like, it needs to sit with you, and you can't just juggle a hundred different things and really consider them.
[01:11:04]
Like, you have to really get that cash into your brain about all of these things you're thinking about.
[01:11:12]
And so it's more efficient in a lot of ways to, like, think about a related group of things in a project before moving on to something else.
[01:11:20]
So that's how I tend to think of it.
[01:11:22]
So is there any feature that I have to rush you about?
[01:11:26]
You know, I actually don't mind when people politely ping on something, too.
[01:11:33]
Because for me, like, it is valuable to know that somebody actually cares about something.
[01:11:41]
Yeah, definitely. It gives you some motivation, like, oh yeah, yeah, no, I want that too.
[01:11:47]
At least for me, because I want those things as well.
[01:11:51]
Yeah. Or if somebody's blocked, I want them to be unblocked, and that's valuable information.
[01:11:56]
So, you know, sometimes it's okay to just say, hey, just making sure you're, you know, having lost track of this in a polite way.
[01:12:04]
Yeah. Don't write a comment saying ping, but...
[01:12:08]
Otherwise it's fine.
[01:12:12]
Yeah. Yeah.
[01:12:14]
All right. I don't know what else we can add to this conversation to maintain it.
[01:12:20]
Are you saying this conversation is done?
[01:12:22]
This conversation is done.
[01:12:25]
Well, then you're in. Until next time.
[01:12:27]
Until next time.