1
00:00:00,000 --> 00:00:02,820
Well, this is not a tremendous amount of news this week.

2
00:00:03,160 --> 00:00:08,820
Thankfully, we have a guest who I think can fill the void of interesting factoids.

3
00:00:09,200 --> 00:00:10,800
Do you want to introduce yourself, guest?

4
00:00:12,100 --> 00:00:12,700
Sure.

5
00:00:13,520 --> 00:00:20,920
So my name is Mark Fisher, and I am the technical lead for Project Riff at Pivotal.

6
00:00:21,920 --> 00:00:28,680
And prior to that, I've spent the last decade, more than a decade now, on the spring team.

7
00:00:29,860 --> 00:00:51,840
And started with the spring team in 2006, and then worked on a number of projects there, including spring integration, and then spring cloud stream, spring cloud data flow, and spring cloud function as well, before shifting over to Riff and serverless and functions as a service and all those fun things about a year ago.

8
00:00:52,020 --> 00:00:53,860
And so a decade, what's that like?

9
00:00:55,200 --> 00:00:56,320
It's all been a blur.

10
00:00:56,960 --> 00:00:59,120
Yeah, I guess that happens.

11
00:00:59,120 --> 00:01:07,760
I mean, that's, let's see, if you get a laptop for three years, that means you've gotten three different machines from work?

12
00:01:08,080 --> 00:01:08,560
Is that right?

13
00:01:08,720 --> 00:01:09,160
Or is it different?

14
00:01:09,240 --> 00:01:10,580
That sounds about right, yes.

15
00:01:10,800 --> 00:01:11,200
Yeah?

16
00:01:11,320 --> 00:01:12,140
Maybe on its fourth.

17
00:01:12,520 --> 00:01:12,760
Yeah.

18
00:01:12,920 --> 00:01:13,080
Yeah.

19
00:01:13,280 --> 00:01:14,920
You got the one with the touchpad on it now?

20
00:01:15,320 --> 00:01:17,500
I do, and that I find annoying.

21
00:01:17,500 --> 00:01:23,960
And I'm just waiting for my chance to get the 32 gig of RAM on the 15-inch MacBook.

22
00:01:23,960 --> 00:01:24,160
Okay.

23
00:01:24,540 --> 00:01:26,300
Yeah, that would be crazy.

24
00:01:26,300 --> 00:01:26,540
Yeah.

25
00:01:26,700 --> 00:01:32,260
My wife has an older laptop, and I'd forgotten how nice those old buttons are.

26
00:01:32,460 --> 00:01:34,680
I guess you would call them keys in the modern era.

27
00:01:35,280 --> 00:01:37,120
But the keys are nice.

28
00:01:37,400 --> 00:01:38,920
They're not all like, I don't know.

29
00:01:38,980 --> 00:01:40,040
I mean, this keyboard's fine.

30
00:01:40,180 --> 00:01:40,920
It's very functional.

31
00:01:41,200 --> 00:01:50,720
But I feel like it's sort of like, it's like, I don't know about your grandparents, but you would go into their house, and they would have this formal living room that no one, it was, you know, I always thought it was funny.

32
00:01:50,780 --> 00:01:53,640
It's a living room that no one lives in, and you couldn't touch anything.

33
00:01:53,880 --> 00:01:56,800
And these keyboards feel kind of like you're not supposed to touch them.

34
00:01:57,120 --> 00:01:57,980
They're just...

35
00:01:57,980 --> 00:02:01,160
Do you, Coté, do you have one of the newer MacBooks?

36
00:02:01,160 --> 00:02:03,760
Because I have an older one, so I still have like HDMI and USB.

37
00:02:03,900 --> 00:02:05,740
I don't have to carry around the 50 dongles.

38
00:02:06,060 --> 00:02:07,720
Do you have to carry around tons of things?

39
00:02:08,020 --> 00:02:09,580
I'm on dongle style here.

40
00:02:09,680 --> 00:02:10,560
Full dongle mode.

41
00:02:10,560 --> 00:02:10,880
Okay.

42
00:02:11,120 --> 00:02:12,140
I got the four out.

43
00:02:12,140 --> 00:02:12,580
Yeah, makes sense.

44
00:02:13,580 --> 00:02:13,980
Oof.

45
00:02:14,340 --> 00:02:16,040
What a problem.

46
00:02:16,560 --> 00:02:17,200
What a world.

47
00:02:18,060 --> 00:02:18,560
Yeah, yeah.

48
00:02:18,560 --> 00:02:20,560
The dongles now have their own firmware, so.

49
00:02:21,740 --> 00:02:23,080
Yeah, your dongles have dongles.

50
00:02:23,120 --> 00:02:24,100
There's too much going on here.

51
00:02:24,220 --> 00:02:24,660
I can't get it.

52
00:02:25,080 --> 00:02:28,320
Yeah, you know, when Pivotal sent me this, they sent me one of those.

53
00:02:28,440 --> 00:02:34,540
It's a very popular dongle for the USB-C that's got like three USB hubs and an HDMI internet port.

54
00:02:35,280 --> 00:02:37,780
And it also has a micro SD card.

55
00:02:37,940 --> 00:02:39,780
And it actually is...

56
00:02:39,780 --> 00:02:42,300
I enjoy the functionality of it, right?

57
00:02:42,360 --> 00:02:48,560
Because you can put in like a little USB, SD card and, you know, have storage on there.

58
00:02:48,560 --> 00:02:50,080
And it's fun to have the internet.

59
00:02:50,080 --> 00:02:52,200
But the problem is you get the 15 inch one.

60
00:02:52,420 --> 00:02:55,560
And I think the power pass through doesn't work, right?

61
00:02:55,980 --> 00:03:00,960
So, because that would be awesome if I actually just had one thing to plug in.

62
00:03:01,580 --> 00:03:02,020
Sure.

63
00:03:02,300 --> 00:03:03,020
But I don't.

64
00:03:03,440 --> 00:03:07,180
So, you know, it doesn't really pay off there.

65
00:03:07,940 --> 00:03:08,420
Anyhow.

66
00:03:08,840 --> 00:03:11,120
Well, there is no weather this week.

67
00:03:11,400 --> 00:03:15,820
But I did want to do one small update from Amsterdam.

68
00:03:16,280 --> 00:03:18,380
I finally ate some herring.

69
00:03:18,920 --> 00:03:21,320
Traditional Amsterdam food.

70
00:03:21,320 --> 00:03:24,500
Now, I didn't realize that it was raw herring, which is fine.

71
00:03:24,760 --> 00:03:25,680
It's no big deal.

72
00:03:26,060 --> 00:03:29,920
But, you know, you get this herring and they've deheaded or beheaded.

73
00:03:30,080 --> 00:03:34,980
I don't know what the proper fish and gutted it and taken off the skin.

74
00:03:35,100 --> 00:03:39,300
And then, but they leave the tail on and you just kind of like drop it in your mouth and eat it.

75
00:03:39,360 --> 00:03:41,840
You don't actually just like put it, you know, you chew it.

76
00:03:41,840 --> 00:03:47,260
And you kind of like put it in a bed of onions to have it attached there and eat it.

77
00:03:47,420 --> 00:03:48,480
And it was good.

78
00:03:48,760 --> 00:03:49,500
It's delicious.

79
00:03:49,660 --> 00:03:50,980
It's basically like sushi.

80
00:03:51,320 --> 00:03:54,880
Like it's not really that much of a different thing.

81
00:03:55,240 --> 00:03:57,600
So I think, and then it's quite affordable too.

82
00:03:57,720 --> 00:04:00,940
You can make a little lunch out of it without vegetables.

83
00:04:01,120 --> 00:04:02,680
I guess, does onion count as a vegetable?

84
00:04:02,860 --> 00:04:04,120
That's like a root, isn't it?

85
00:04:04,120 --> 00:04:04,900
No, that seems fair.

86
00:04:05,320 --> 00:04:06,860
Yeah, that'll get your vegetable.

87
00:04:07,480 --> 00:04:10,040
That picture of you that you're including here is probably,

88
00:04:10,040 --> 00:04:14,240
we have to turn that into a Slack emoji or my new profile picture or something.

89
00:04:14,560 --> 00:04:15,260
But it's good.

90
00:04:15,360 --> 00:04:15,580
It is.

91
00:04:15,660 --> 00:04:18,240
I do have a small video, so maybe I can load Giphy up.

92
00:04:18,980 --> 00:04:21,220
Get ready.

93
00:04:21,320 --> 00:04:24,220
Yeah, I like it.

94
00:04:24,280 --> 00:04:24,560
It's good.

95
00:04:24,640 --> 00:04:26,800
And that was from the local grocery store.

96
00:04:27,000 --> 00:04:28,420
Imagine if you got it fresh.

97
00:04:29,020 --> 00:04:32,600
And, you know, another just before we get started with serious stuff that we get paid for.

98
00:04:32,980 --> 00:04:39,060
Another fun factoid about herring is that was, I think, the first way back, you know, way back when,

99
00:04:39,320 --> 00:04:45,660
way, way back when, that Amsterdam got wealthy is they invented a new technology, some new kind of boat,

100
00:04:45,660 --> 00:04:48,560
so they could go out into the North Sea for like three weeks.

101
00:04:49,040 --> 00:04:57,380
And then they also figured out that if you behead and gut and prepare the herring and salt it and stick it in barrels at sea,

102
00:04:57,500 --> 00:04:58,980
it would last a long time.

103
00:04:58,980 --> 00:05:04,560
So they could make a lot of, they could bring a lot of herring in and that made them lots of money.

104
00:05:04,560 --> 00:05:11,760
And what I like about that little factoid is it makes you realize that like even back in like the 1400s,

105
00:05:11,760 --> 00:05:15,660
there was just trade of barrels of herring just being sent around.

106
00:05:16,020 --> 00:05:21,000
People would, I mean, can you imagine eating some raw fish out of a barrel that was four weeks old?

107
00:05:22,440 --> 00:05:25,460
Man, I can't even come up with some stupid quip about that.

108
00:05:25,600 --> 00:05:26,360
I don't know if I could.

109
00:05:26,920 --> 00:05:27,100
Yeah.

110
00:05:27,600 --> 00:05:28,840
So times have improved.

111
00:05:29,380 --> 00:05:30,640
This is the golden age.

112
00:05:31,300 --> 00:05:32,040
That's right.

113
00:05:33,480 --> 00:05:39,020
Well, speaking of the golden age, it's been a quiet week for infrastructure software news.

114
00:05:39,120 --> 00:05:43,340
I think there was some relevant to our guest here.

115
00:05:43,700 --> 00:05:50,300
There was some coverage of like native or native or whatever, just some kind of follow-up and analysis,

116
00:05:50,300 --> 00:05:53,220
which, which also brought in some, some serverless things.

117
00:05:53,220 --> 00:05:57,620
And I don't know, I'll put, there's some links in there for people who in the show notes,

118
00:05:57,780 --> 00:06:01,120
if you want to look at it, but they're just, we've kind of talked about those things,

119
00:06:01,120 --> 00:06:07,160
but have you, have you caught anything else there and your, your nets and your Dutch cog ships?

120
00:06:08,420 --> 00:06:11,180
I don't know how I do that kind of lead in.

121
00:06:11,560 --> 00:06:16,460
So a few minutes before we recorded, we actually announced that steel toe 2.1 ship.

122
00:06:16,460 --> 00:06:20,700
So if you're a .NET developer and you're using the latest .NET framework, .NET core,

123
00:06:20,780 --> 00:06:24,420
and trying to build these more observable systems, so you're doing distributed tracing,

124
00:06:24,640 --> 00:06:28,860
or you're trying to have better actuator support for .NET devs, that's great.

125
00:06:29,000 --> 00:06:30,100
That's fully available now.

126
00:06:30,160 --> 00:06:30,960
So that was nice news.

127
00:06:31,480 --> 00:06:38,420
And then I included one in here about that new-ish Intel chip foreshadow, the name of the flaw.

128
00:06:38,760 --> 00:06:40,900
That was another one of these things that had to quickly get patched.

129
00:06:41,380 --> 00:06:45,320
And another one of these that you can either run around with your, you know, kind of head cut off,

130
00:06:45,380 --> 00:06:51,020
trying to figure out how to patch systems and contact your OS vendor and roll out updates and figure out what breaks.

131
00:06:51,380 --> 00:06:54,300
We didn't really make a big deal of it because Ubuntu patched it.

132
00:06:54,300 --> 00:06:58,420
We rolled it out to customers and many of them are already updated because of Bosch and Comfort.

133
00:06:58,760 --> 00:07:04,680
So again, we like to talk about the operating system doesn't necessarily matter a lot to the end person

134
00:07:04,680 --> 00:07:05,880
who just wants to run software.

135
00:07:05,980 --> 00:07:08,860
It matters a ton as a baseline for what you're running.

136
00:07:08,980 --> 00:07:12,840
But when it's embedded in platforms, this stuff becomes boring even when they're critical updates.

137
00:07:13,080 --> 00:07:17,480
So it was kind of neat to see that get rolled out again and keeping you safe if you're running Cloud Foundry.

138
00:07:18,360 --> 00:07:21,380
I wonder if there's a committee where they name viruses.

139
00:07:21,600 --> 00:07:22,660
I'd like to be on that committee.

140
00:07:23,020 --> 00:07:26,080
Maybe they're less ominous, just like, you know, happy time.

141
00:07:26,480 --> 00:07:27,200
It's the happy time.

142
00:07:27,200 --> 00:07:31,320
Yeah, I mean, I'm not super worried about the Intel daisy problem or something like that.

143
00:07:31,380 --> 00:07:34,420
It really just makes me a buttercup, something that kind of makes me smile.

144
00:07:34,700 --> 00:07:36,120
The sunflower exploit.

145
00:07:36,560 --> 00:07:38,540
Yeah, that can't be too bad.

146
00:07:39,780 --> 00:07:40,980
That would be nice.

147
00:07:41,080 --> 00:07:46,520
Now, the other question, I don't want to ask this every week, but maybe every now and then.

148
00:07:46,560 --> 00:07:47,380
How's the book going?

149
00:07:47,660 --> 00:07:48,260
Almost done?

150
00:07:49,580 --> 00:07:49,940
Oh, me?

151
00:07:50,020 --> 00:07:51,080
Yeah, I'm more than halfway done.

152
00:07:51,160 --> 00:07:52,700
I'm feeling pretty good about that.

153
00:07:52,800 --> 00:07:57,440
I have had the obligatory one contact with the editor to tell them it will not be on the original schedule.

154
00:07:57,840 --> 00:07:59,660
I think it'll only be one time.

155
00:08:00,000 --> 00:08:02,020
I think I'll finish it when I'm supposed to now.

156
00:08:02,220 --> 00:08:03,500
So it's going pretty well.

157
00:08:03,880 --> 00:08:06,040
Well, I figure book deadlines.

158
00:08:06,180 --> 00:08:09,960
Any kind of deadline is kind of like, you know, a serving suggestion.

159
00:08:10,360 --> 00:08:12,080
It's sort of, you know, add salt to taste.

160
00:08:12,360 --> 00:08:14,800
That's kind of what the deadline is, as I recall.

161
00:08:15,580 --> 00:08:17,160
Yeah, plus or minus three months.

162
00:08:17,660 --> 00:08:18,300
Three day time.

163
00:08:18,820 --> 00:08:19,260
Exactly.

164
00:08:19,940 --> 00:08:22,980
You might want a pinch of salt or a tablespoon.

165
00:08:23,300 --> 00:08:23,880
It depends.

166
00:08:24,900 --> 00:08:25,040
Yeah.

167
00:08:26,800 --> 00:08:27,240
Excellent.

168
00:08:27,660 --> 00:08:31,540
Well, so I'm always trying to finish up a little booklet that I have.

169
00:08:31,540 --> 00:08:33,620
And I published an excerpt.

170
00:08:35,000 --> 00:08:44,120
I've gotten a lot of, I wouldn't call it faint praise, but it's sort of, some people have told me that I have too many links.

171
00:08:44,380 --> 00:08:46,280
And so it takes a long time to read things.

172
00:08:46,580 --> 00:08:51,940
So I tried to post a smaller excerpt that maybe still has a lot of links.

173
00:08:52,040 --> 00:08:59,460
But anyways, it's basically this part on like, if you're doing your, we should work on phrases for this.

174
00:08:59,520 --> 00:09:05,460
If you're digital transformation, something, you know, and you're trying to be the sort of leaders of it.

175
00:09:05,580 --> 00:09:09,940
It's probably a good idea not to go it alone because that doesn't really work out very well.

176
00:09:09,940 --> 00:09:18,540
So you got to take a page from some classic change management or just really corporate life and build up some alliances and friendships and things like that.

177
00:09:18,600 --> 00:09:26,220
So it's very brief, but it's just a little, little write up of doing that and how some other people in the, I don't know, the pivotal world have done that.

178
00:09:26,400 --> 00:09:33,420
And also it gave me the chance over in medium, they have these things, you know, everyone is, has like snap clone things where they make these story cards.

179
00:09:33,660 --> 00:09:36,620
And wow, they're, they're doing something over there.

180
00:09:37,300 --> 00:09:38,020
Love it.

181
00:09:38,900 --> 00:09:39,780
I'm using those.

182
00:09:39,840 --> 00:09:45,960
It's unfortunate because it's, it's done for a mobile form factor, which renders perfectly in your browser on the desktop.

183
00:09:45,960 --> 00:09:51,480
But if you open it on the actual mobile device, uh, you have to install the medium app.

184
00:09:51,820 --> 00:09:56,840
So I don't know if that really works out well, but it doesn't know, no, I don't like it.

185
00:09:56,920 --> 00:09:59,260
Well, no, you're, you're, uh, your progress has been good though.

186
00:09:59,280 --> 00:10:00,860
I've liked following the last couple you've done.

187
00:10:00,900 --> 00:10:04,640
There's, I think you did one recently around even some measurement of things, right?

188
00:10:04,660 --> 00:10:06,620
Of kind of progress and things like that.

189
00:10:06,620 --> 00:10:07,560
So I really liked that one.

190
00:10:07,580 --> 00:10:10,020
I'll probably use some of that for an upcoming talk.

191
00:10:10,180 --> 00:10:10,620
So a nice one.

192
00:10:10,920 --> 00:10:11,240
Measurements.

193
00:10:11,380 --> 00:10:12,280
Well, that's good to hear.

194
00:10:12,640 --> 00:10:14,580
I, I, I love a little measurements.

195
00:10:14,740 --> 00:10:16,380
Measurements are, are mysterious.

196
00:10:16,840 --> 00:10:20,420
I, as, as I've joked about, I think I might even mention this here.

197
00:10:20,420 --> 00:10:23,940
Like whenever you're a, I don't know if you've had this, if you two have had this experience

198
00:10:23,940 --> 00:10:27,800
when you write something, but measurements or metrics are one of those things where you

199
00:10:27,800 --> 00:10:31,220
ask people, uh, and you know that they know the answer and you're like, well, tell me what

200
00:10:31,220 --> 00:10:32,260
metrics that they use.

201
00:10:32,520 --> 00:10:36,380
And then they like go on poetically about like, well, what is a pudding?

202
00:10:36,600 --> 00:10:38,920
You've got a Yorkshire pudding and like a pudding cup.

203
00:10:38,980 --> 00:10:39,620
What is a pudding?

204
00:10:39,860 --> 00:10:41,220
And they get all philosophic.

205
00:10:41,220 --> 00:10:44,940
And then you're like, okay, I gotta, I got, you know, I got stuff to do my life.

206
00:10:45,560 --> 00:10:48,580
And then, and then you write something and you put it in front of them.

207
00:10:48,580 --> 00:10:51,620
And they're like, let me write you 50 pages on exactly what metrics are.

208
00:10:51,700 --> 00:10:55,500
And you're like, come on, how come you didn't just tell me about this in the beginning instead

209
00:10:55,500 --> 00:10:56,240
of putting talk.

210
00:10:56,640 --> 00:10:59,620
So hopefully that will lick some of that there.

211
00:11:01,020 --> 00:11:05,560
So, uh, I was gonna, I was gonna say, speaking of putting talk.

212
00:11:05,820 --> 00:11:06,020
Yeah.

213
00:11:08,700 --> 00:11:13,960
So, so why not, you know, first of all, I was, uh, I was, I was emceeing, uh, which happens

214
00:11:13,960 --> 00:11:15,580
to me, uh, some of my initials.

215
00:11:15,580 --> 00:11:22,680
Uh, I think the spring, uh, the spring tour, uh, let's see Dallas some time ago and spring

216
00:11:22,680 --> 00:11:24,100
platform tour, I think we call it.

217
00:11:24,440 --> 00:11:26,800
And the number one, the, the, the, thank you.

218
00:11:26,860 --> 00:11:31,320
The number one thing that people were asking, wanted to ask about that we didn't get to discuss

219
00:11:31,320 --> 00:11:33,440
with them was, uh, was project riff.

220
00:11:33,560 --> 00:11:34,920
They were all like, what is riff?

221
00:11:35,180 --> 00:11:40,180
And so, I mean, I mean, I'm putting the clock a little bit back, but back then, let's say

222
00:11:40,180 --> 00:11:45,140
this was in the spring, what, what would, how would you have answered them and told them

223
00:11:45,140 --> 00:11:45,820
what that was?

224
00:11:46,180 --> 00:11:46,560
Sure.

225
00:11:46,820 --> 00:11:54,960
Um, well, riff is a, uh, it's basically a function as a service platform that can run

226
00:11:54,960 --> 00:11:57,520
on any Kubernetes installation.

227
00:11:57,520 --> 00:11:59,840
So it can run on prem.

228
00:11:59,920 --> 00:12:01,560
It can run in, in a public cloud.

229
00:12:01,980 --> 00:12:13,920
And, um, we, I think that one of the key differentiators for riff is that we have focused on, um, an event

230
00:12:13,920 --> 00:12:15,420
driven model at the core.

231
00:12:15,520 --> 00:12:21,860
So every function is invoked based on, um, an event.

232
00:12:21,860 --> 00:12:26,620
And back in the spring, that would have meant an event, um, being sent over Kafka.

233
00:12:27,100 --> 00:12:33,840
We were basically coupled to Kafka at the time, but, um, building on Kubernetes and, and running

234
00:12:33,840 --> 00:12:42,040
that Kafka code in a sidecar so that what the developer needs to provide is just a function

235
00:12:42,040 --> 00:12:47,100
that basically acts as a callback and the sidecar then, um, invokes that.

236
00:12:47,540 --> 00:12:55,320
So it was kind of the ideas behind some of the spring projects that we had built in the

237
00:12:55,320 --> 00:13:00,660
years leading up to that, um, such as, especially like spring cloud stream, where you would have

238
00:13:00,660 --> 00:13:05,240
a binder to Kafka or rabbit or some other event driven messaging middleware.

239
00:13:05,240 --> 00:13:10,880
And then the user just writes a function, just writes a callback to be invoked.

240
00:13:11,480 --> 00:13:17,500
Um, but we took that model into, um, Kubernetes and therefore made it polyglot.

241
00:13:17,540 --> 00:13:24,720
With, um, an extensible model for the actual invokers that, that handle that inversion of control.

242
00:13:25,820 --> 00:13:30,720
So, so I, I have a, I have a slightly, uh, off topic question cause you reminded me of something

243
00:13:30,720 --> 00:13:34,820
I'm always, I'm always wondering, and especially since you, you, you know, uh, been, been working

244
00:13:34,820 --> 00:13:39,940
on this for like 10 years or in this area when, when, when you're, when you're working on,

245
00:13:40,060 --> 00:13:44,400
I mean, let's, let's, let's say spring is, well, I guess it's called the spring framework.

246
00:13:44,400 --> 00:13:48,300
Spring is a framework that, that you use to build other things.

247
00:13:48,300 --> 00:13:52,720
Uh, it's sort of like, I, I guess you could just run spring on its own.

248
00:13:52,720 --> 00:13:53,960
That would be sort of fun.

249
00:13:54,260 --> 00:13:57,020
Be sort of like running an air conditioner with no one in the room.

250
00:13:57,740 --> 00:13:59,400
It'd be an interesting experiment.

251
00:13:59,400 --> 00:14:05,200
But, uh, so when you're building that and you decide to have like, um, a dependency, I

252
00:14:05,200 --> 00:14:08,780
guess, on something like Kafka, like, how do you think through that architecturally?

253
00:14:09,000 --> 00:14:13,580
Like, cause you can't, you can't build everything in it.

254
00:14:13,580 --> 00:14:18,060
Like you, you have to use some other things and like, what, I don't know, like, how do you

255
00:14:18,060 --> 00:14:20,000
think through to do that or not do it?

256
00:14:20,000 --> 00:14:24,100
And, uh, the sort of compromises you made or make or the benefits, like what's the, uh,

257
00:14:24,100 --> 00:14:25,740
the decision tree for that kind of thing?

258
00:14:27,900 --> 00:14:34,640
Well, it's, it's tough because I think usually it involves defining an abstraction and getting

259
00:14:34,640 --> 00:14:39,860
that abstraction to be the right level where you're not creating the lowest common denominator,

260
00:14:39,860 --> 00:14:47,180
but you're actually, um, allowing people to choose what they plug in behind that abstraction

261
00:14:47,180 --> 00:14:54,040
for certain reasons and be able to expose the value of the reason they chose that thing, but

262
00:14:54,040 --> 00:14:57,100
in a way that is still, uh, pluggable.

263
00:14:57,100 --> 00:15:02,800
And so that usually in a, in a spring based application for something like the binders and

264
00:15:02,800 --> 00:15:06,660
spring cloud stream, that means that you can plug in Kafka, you can plug in rabbit, you

265
00:15:06,660 --> 00:15:12,820
can plug in, um, say Redis streams or, or, uh, if you're in a public cloud, you can plug

266
00:15:12,820 --> 00:15:15,640
in Kinesis, uh, on Amazon, for example.

267
00:15:16,320 --> 00:15:21,980
Um, and they're similar enough that an abstraction can define the common model there.

268
00:15:22,080 --> 00:15:28,380
And so that's what makes it pluggable, but then whichever one you choose, um, there may

269
00:15:28,380 --> 00:15:32,320
be certain parameters that you could specify in the declarative configuration that allow

270
00:15:32,320 --> 00:15:34,780
you to take advantage of some of its core features.

271
00:15:35,280 --> 00:15:41,620
So, so essentially like the, what you want to go for is, uh, you can swap out as, as they

272
00:15:41,620 --> 00:15:46,260
say the, the implementation underneath there, or, or you want to get as close to that as

273
00:15:46,260 --> 00:15:50,900
possible so that you're not sort of stuck with just the one thing that you, you would

274
00:15:50,900 --> 00:15:51,320
need to run.

275
00:15:51,500 --> 00:15:51,640
Right.

276
00:15:52,460 --> 00:15:52,820
Yeah.

277
00:15:52,880 --> 00:15:53,100
Yeah.

278
00:15:53,100 --> 00:15:58,240
I asked that cause I think the, uh, the first time I encountered this was way, way back when,

279
00:15:58,240 --> 00:16:03,180
when I was working, uh, on a systems management piece of software and, uh, you know, there's,

280
00:16:03,240 --> 00:16:06,920
there's, there's, uh, there's, there's, uh, there's, there's a joke about like, you know,

281
00:16:06,920 --> 00:16:11,000
the, the first thing you need to do is invent the world is sort of like how you set up

282
00:16:11,000 --> 00:16:11,540
any system.

283
00:16:12,020 --> 00:16:15,420
Uh, but, but the, the first thing you'd have to do for this system is install.

284
00:16:15,720 --> 00:16:18,760
I forget which, which, uh, which TIBCO thing it was.

285
00:16:18,820 --> 00:16:21,340
I don't think they even owned it back then, but it was just like this.

286
00:16:21,340 --> 00:16:23,340
I, I think it was a Corbra thing.

287
00:16:23,540 --> 00:16:24,880
You had to set up this orb.

288
00:16:25,080 --> 00:16:29,180
And I remember when we went to the training, about two hours was spent setting up the orb

289
00:16:29,180 --> 00:16:31,000
before you even installed the software.

290
00:16:31,540 --> 00:16:33,160
So it's sort of stuck in my mind.

291
00:16:35,560 --> 00:16:41,100
So let me ask you, Mark, what you quick mentioned there kind of in passing was the event driven

292
00:16:41,100 --> 00:16:46,060
sort of foundation of riff and why you felt like that was something that was important.

293
00:16:46,140 --> 00:16:51,180
Do you see it as different than how kind of traditional FAS has been up till this point?

294
00:16:51,260 --> 00:16:52,820
So what is that, you know, what is that difference?

295
00:16:52,980 --> 00:16:54,600
Why do you, why do you call that out uniquely?

296
00:16:56,360 --> 00:17:06,040
Well, I, I do think, um, there's a difference in the, uh, extent to which it can support messaging

297
00:17:06,040 --> 00:17:07,040
patterns, right?

298
00:17:07,080 --> 00:17:14,440
So like in riff, um, we, by, by having the sidecar communicate with Kafka, one of the

299
00:17:14,440 --> 00:17:19,080
things that we could do between the sidecar and the container that hosted the developer's

300
00:17:19,080 --> 00:17:29,900
function is to manage that incoming, um, stream of events as a, an actual stream, um, through

301
00:17:29,900 --> 00:17:34,880
a gRPC, um, service binding, right?

302
00:17:34,880 --> 00:17:39,560
So then that means that the developer's code can actually handle streaming input.

303
00:17:39,780 --> 00:17:43,880
If you're using Java, you could, you could depend on a reactor flux.

304
00:17:43,880 --> 00:17:46,740
And if you're using JavaScript, you can depend on a node stream.

305
00:17:47,240 --> 00:17:52,640
Um, so there are some use cases that where that's valuable because then the, the, the

306
00:17:52,640 --> 00:17:58,500
function developer can, can perform windowing operations and map reduce type operations on

307
00:17:58,500 --> 00:18:04,240
the stream of data, as opposed to just single input, single output, which we also support,

308
00:18:04,240 --> 00:18:10,100
but that's, that's almost like the degenerate case, even if it's, even if it's the, uh, 80%

309
00:18:10,100 --> 00:18:10,580
case.

310
00:18:11,020 --> 00:18:15,960
So being able to support both of those, it's, it's very hard to build a model that takes the

311
00:18:15,960 --> 00:18:16,740
other direction.

312
00:18:16,740 --> 00:18:21,600
I think where it assumes from day one, everything is just a single HTTP request.

313
00:18:21,900 --> 00:18:24,800
And then somehow we're going to add streaming on top of those.

314
00:18:25,020 --> 00:18:25,380
Right.

315
00:18:27,060 --> 00:18:30,720
I mean, that architecture, which is, as you say, it's kind of been, I don't know if to

316
00:18:30,720 --> 00:18:32,260
me, it's been, that's the dominant one, right?

317
00:18:32,300 --> 00:18:38,620
I mean, functions get spun up via mostly HTTP requests and there's not much state sharing

318
00:18:38,620 --> 00:18:40,620
or any sort of messaging paradigm there.

319
00:18:40,700 --> 00:18:45,140
So if you were doing this in a typical FAS today, would you be using an event stream processor

320
00:18:45,140 --> 00:18:50,100
and then bolting functions on so that you're still passing the data through something that

321
00:18:50,100 --> 00:18:51,000
has some of those primitives?

322
00:18:53,000 --> 00:18:53,360
Yeah.

323
00:18:53,420 --> 00:18:54,740
Well, I think, I mean,

324
00:18:56,060 --> 00:18:58,960
I'm thinking, for example, I'd have to use Kinesis with Lambda, right?

325
00:18:58,980 --> 00:18:59,800
Or something like that.

326
00:18:59,800 --> 00:19:01,680
Is that how I would stitch things together today?

327
00:19:02,840 --> 00:19:09,460
Well, okay, so that's an interesting one because in the Lambda example, if you choose to use

328
00:19:09,460 --> 00:19:15,700
Kinesis as your trigger, then you really end up with a different input type as opposed

329
00:19:15,700 --> 00:19:22,260
to if you're connecting your function directly to the API gateway to handle HTTP requests.

330
00:19:22,260 --> 00:19:32,460
And so that's the kind of consistent model that we're aiming for to where you can take a function

331
00:19:32,460 --> 00:19:39,020
and either write it for single input, single output, or streaming in, streaming out, and

332
00:19:39,020 --> 00:19:48,260
be able to plug that in to any, you know, independently of the upstream source of events, right?

333
00:19:48,260 --> 00:19:48,620
Right.

334
00:19:49,080 --> 00:19:49,840
That makes sense.

335
00:19:50,200 --> 00:19:53,260
So tell me a little bit about how we got to Knative.

336
00:19:53,700 --> 00:20:00,120
So, you know, if we were, we launched Riff at SpringOne Platform next year, kind of took

337
00:20:00,120 --> 00:20:02,160
the wraps off of you, did a great keynote presentation.

338
00:20:02,360 --> 00:20:04,160
You and Dave Sire did a fun breakout.

339
00:20:04,280 --> 00:20:06,560
People can go back and watch, which is well worth their time.

340
00:20:07,140 --> 00:20:09,980
But, you know, as we were going through the spring and all of a sudden, you know, the

341
00:20:09,980 --> 00:20:13,980
team wasn't doing as much Riff stuff and this other work was emerging, what was kind

342
00:20:13,980 --> 00:20:16,980
of the, you know, I guess we don't have to get the whole backstory, but more

343
00:20:16,980 --> 00:20:18,100
importantly, why?

344
00:20:18,220 --> 00:20:19,700
Like, why did these efforts merge?

345
00:20:19,800 --> 00:20:23,120
What are you excited about with Knative that might have not happened if Riff had stayed

346
00:20:23,120 --> 00:20:24,040
on its current path?

347
00:20:25,300 --> 00:20:25,520
Right.

348
00:20:25,680 --> 00:20:33,060
So I think a big part of it is that, you know, at Pivotal, we talk a lot about the value

349
00:20:33,060 --> 00:20:33,400
line.

350
00:20:33,660 --> 00:20:36,880
And that's an important concept to our customers.

351
00:20:38,080 --> 00:20:41,940
And it's just as important when we're building things internally.

352
00:20:41,940 --> 00:20:46,680
So anytime that we discover that there's another effort where we could be part of a larger

353
00:20:46,680 --> 00:20:53,220
community that's building the foundation of something, then it's worth considering that

354
00:20:53,220 --> 00:20:56,660
as opposed to building it completely on our own.

355
00:20:56,660 --> 00:21:01,600
And so when we first heard about Knative, it seemed like there was a significant amount

356
00:21:01,600 --> 00:21:07,520
of overlap in the sense that they were adding custom resource definitions to create higher

357
00:21:07,520 --> 00:21:14,760
levels of abstraction on top of Kubernetes in order to support serverless workloads and functions.

358
00:21:16,180 --> 00:21:23,000
Now, to the extent that we looked at what, I mean, obviously, we were doing a lot of that

359
00:21:23,000 --> 00:21:24,180
in Riff ourselves.

360
00:21:24,560 --> 00:21:32,120
And it sort of triggered us to evaluate what extent of what we were doing in Riff was more

361
00:21:32,120 --> 00:21:40,500
generic and what was more specifically in our differentiation, like the event-driven paradigm.

362
00:21:40,780 --> 00:21:50,260
So a lot of the lower-level concerns are things that, like being able to scale automatically, scaling

363
00:21:50,260 --> 00:21:57,840
back to zero, providing metrics for the functions that are running, providing the observability

364
00:21:57,840 --> 00:21:58,620
of those functions.

365
00:21:58,940 --> 00:22:02,340
There are a lot of common concerns there.

366
00:22:02,600 --> 00:22:06,040
And so it made sense for us to at least consider that option.

367
00:22:06,760 --> 00:22:12,960
And then as we started collaborating with the team at the time, it was Google and then others

368
00:22:12,960 --> 00:22:14,720
also started to come on board.

369
00:22:16,320 --> 00:22:19,940
And we shared some of our ideas around eventing.

370
00:22:20,580 --> 00:22:27,620
And our goal was basically to see if we could get enough of what we needed to support our

371
00:22:27,620 --> 00:22:33,900
model into Knative so that we could still build on top of it and then take advantage of what

372
00:22:33,900 --> 00:22:38,120
we hope becomes a larger ecosystem for the common foundation.

373
00:22:40,120 --> 00:22:49,480
So can you, like, throw a good illustrative or illustrative example of an application you

374
00:22:49,480 --> 00:22:51,760
might write in this style?

375
00:22:53,360 --> 00:22:54,000
Sure.

376
00:22:55,680 --> 00:23:09,800
I think, so with Knative, there's actually the idea that it's a unified model for scaling.

377
00:23:10,120 --> 00:23:12,280
Regardless of the type of workload.

378
00:23:12,480 --> 00:23:20,800
So they want to be able to support anything on the spectrum from applications to functions

379
00:23:20,800 --> 00:23:29,920
in a way that it can be auto-scaled and can be, the lifecycle can be managed from the developer's

380
00:23:29,920 --> 00:23:30,920
source code.

381
00:23:31,260 --> 00:23:37,080
So if you opt into having the build managed by the cluster, then that step is also in common.

382
00:23:38,180 --> 00:23:44,260
And, but for us on the Rift team, we were very focused on function-based runtime, the actual

383
00:23:44,260 --> 00:23:46,360
function-based use cases, right?

384
00:23:46,420 --> 00:23:57,400
So things like, I mean, there's the classic examples of something that runs relatively infrequently,

385
00:23:57,400 --> 00:24:05,600
so you don't want to have it consuming resources continuously, like the, when an image is uploaded

386
00:24:05,600 --> 00:24:09,560
to a directory, then you create thumbnails for it, or a video is uploaded and you create

387
00:24:09,560 --> 00:24:14,320
different formats for that video using a converter.

388
00:24:15,000 --> 00:24:22,740
But then there's also, in our world, many more kind of enterprise use cases where we see that

389
00:24:22,740 --> 00:24:28,400
developers are breaking down these monolithic web applications into microservices and some

390
00:24:28,400 --> 00:24:35,540
of the most fine-grained pieces that fall out from that end up being good examples for running

391
00:24:35,540 --> 00:24:36,080
as functions.

392
00:24:36,220 --> 00:24:44,300
Maybe they're called infrequently or they're things that, that can take advantage of streams

393
00:24:44,300 --> 00:24:47,040
of events with the model that I was describing earlier.

394
00:24:48,660 --> 00:24:53,900
Yeah, it seems like, I mean, one of the, one of the examples, one sees a lot is like a, or

395
00:24:53,900 --> 00:24:57,680
I, I guess I should say, I, I see a lot as like a reservation system.

396
00:24:57,820 --> 00:25:06,000
And, uh, I don't know, even, even at least, uh, I assume from a, uh, a consumer, a person

397
00:25:06,000 --> 00:25:10,500
point of view, I don't know if there's someone who reserves things not on this model, but like

398
00:25:10,500 --> 00:25:15,080
even, even when I like go to, to kayak or whatever, and just search for flights, like that seems

399
00:25:15,080 --> 00:25:19,980
like a sort of one-time operation that might work well, like something just scurries off

400
00:25:19,980 --> 00:25:21,600
and looks for things and then returns it.

401
00:25:21,680 --> 00:25:26,200
And then, you know, crawls off to die somewhere until it's brought back to life again.

402
00:25:26,660 --> 00:25:33,460
But, uh, yeah, I, I mean, I mean all of those, those, uh, that, that kind of, you know, it's

403
00:25:33,460 --> 00:25:38,700
interesting, like, like you mentioned, uh, the idea of, as we said, whether it's like, you

404
00:25:38,700 --> 00:25:44,040
know, from, from zero to in or whatever, or scaling up or being bursty, like that seems to

405
00:25:44,040 --> 00:25:50,500
be like a primary characteristic of interest in, in doing serverless and K native stuff.

406
00:25:50,540 --> 00:25:53,540
I mean, is that, am I, am I, am I overemphasizing that?

407
00:25:54,520 --> 00:25:56,360
No, I think that's definitely true.

408
00:25:56,360 --> 00:26:01,320
I mean, on one end of the spectrum, you're, you're scaling to zero for, for applications

409
00:26:01,320 --> 00:26:07,300
where you don't, or at least specific functions within a larger application that, that don't

410
00:26:07,300 --> 00:26:09,680
need to be continuously serving traffic.

411
00:26:09,940 --> 00:26:12,820
Uh, some of those might be, there's always a trade-off.

412
00:26:12,900 --> 00:26:18,340
It might be that the latency requirements are not, um, very important, right?

413
00:26:18,360 --> 00:26:22,120
So it's like something that happens offline in reaction to something else, like updating

414
00:26:22,120 --> 00:26:27,280
your, your, uh, flight miles or something after a flight, like it doesn't need to happen

415
00:26:27,280 --> 00:26:28,040
instantaneously.

416
00:26:28,460 --> 00:26:31,840
Um, other examples would be things that are very bursty.

417
00:26:31,840 --> 00:26:38,620
And so then you're, you're kind of on the, um, the scaling to inside, um, and that might

418
00:26:38,620 --> 00:26:44,980
be because there's irregular traffic or there might be something like, um, a sale for an

419
00:26:44,980 --> 00:26:45,740
online retailer.

420
00:26:45,740 --> 00:26:51,800
And so obviously they have, um, very inconsistent traffic and times when they need to scale much

421
00:26:51,800 --> 00:26:53,980
higher than the, than the steady state.

422
00:26:54,480 --> 00:26:55,000
Yeah.

423
00:26:55,180 --> 00:27:01,600
I think that more and more we see that, that even more traditional enterprise use cases start

424
00:27:01,600 --> 00:27:08,580
to fall into these categories because operations are running 24 seven and, um, things are, are

425
00:27:08,580 --> 00:27:10,900
moving online that didn't used to be.

426
00:27:10,900 --> 00:27:15,780
And you've got more and more fine grained ways of interacting with customers and chat bots

427
00:27:15,780 --> 00:27:22,300
and like there's more and more entry points into the system where, um, having, being able

428
00:27:22,300 --> 00:27:26,240
to break things up into more fine grained components is, is useful.

429
00:27:26,880 --> 00:27:27,400
Yeah.

430
00:27:27,460 --> 00:27:33,220
I mean, that definitely seems the, uh, it's, it's sort of like the issue, the issue, the,

431
00:27:33,220 --> 00:27:37,880
the fun mind problem I've always had around like, like, uh, serverless and functional programming

432
00:27:37,880 --> 00:27:42,840
stuff is to think about like, what are some types of applications that would be a poor fit

433
00:27:42,840 --> 00:27:43,300
for that?

434
00:27:43,380 --> 00:27:48,380
And, and as you're kind of saying that the reason why it's kind of a weird or a delightfully

435
00:27:48,380 --> 00:27:54,160
endless question is, well, if you can break things down into components, then almost anything

436
00:27:54,160 --> 00:27:58,720
can, I don't know, maybe not like video game playing or something like maybe, maybe if there's

437
00:27:58,720 --> 00:28:03,080
things that are like extremely real time and high latency, like you just have an ongoing

438
00:28:03,080 --> 00:28:07,860
process or whatever, but most of life isn't like this, this phone call.

439
00:28:07,880 --> 00:28:14,800
I don't know if this would work out serverless wise, but it's, it seems like a huge amount

440
00:28:14,800 --> 00:28:18,800
of things you could break down into a series of components that are linked together.

441
00:28:19,420 --> 00:28:19,820
Right.

442
00:28:20,340 --> 00:28:24,220
If you're starting from scratch though, I think what's always interesting there is if you were

443
00:28:24,220 --> 00:28:25,620
building some of these systems from zero.

444
00:28:25,840 --> 00:28:26,000
Yeah.

445
00:28:26,120 --> 00:28:31,460
But I don't think Mark, have you seen much that migrates just natively to a function platform?

446
00:28:31,460 --> 00:28:34,460
It seems like that's often at least a refactor or rewrite.

447
00:28:34,460 --> 00:28:39,320
So, you know, sometimes I know, Coté, you're interested in also some of the legacy app story

448
00:28:39,320 --> 00:28:39,580
here.

449
00:28:39,840 --> 00:28:44,900
I guess there's that decision of, should you refactor an app into a series of interconnected

450
00:28:44,900 --> 00:28:45,880
functions?

451
00:28:46,060 --> 00:28:51,540
Or is this something you see for new types of use cases or kind of what's your take on serverless

452
00:28:51,540 --> 00:28:55,200
as a whole and how this is supposed to fit into somebody who probably already has a lot

453
00:28:55,200 --> 00:28:56,240
of investments in software?

454
00:28:58,100 --> 00:28:58,560
Yeah.

455
00:28:58,580 --> 00:29:08,000
I mean, I think that's, it's definitely more of a, it's, it's more appealing as a runtime

456
00:29:08,000 --> 00:29:11,420
model for a greenfield development.

457
00:29:11,420 --> 00:29:17,960
I think that on the just like pragmatically looking at the way people break down a monolith

458
00:29:17,960 --> 00:29:24,480
is often following patterns like the, the strangling the monolith pattern.

459
00:29:24,480 --> 00:29:24,800
Right.

460
00:29:25,260 --> 00:29:28,780
And usually there's a point where you reach diminishing returns.

461
00:29:28,780 --> 00:29:33,780
So you're not going to literally break that monolith down into a thousand functions and then, you

462
00:29:33,780 --> 00:29:34,380
know, you're done.

463
00:29:34,440 --> 00:29:40,860
It's a, it's often just some of the, the pieces get chipped off as, as functions where

464
00:29:40,860 --> 00:29:41,620
it's most obvious.

465
00:29:41,620 --> 00:29:47,760
And at some point you realize that the rest you can leave as it is, but the, the, some of

466
00:29:47,760 --> 00:29:53,420
the drivers for that are not only latency requirements or things that run offline or things that are

467
00:29:53,420 --> 00:30:00,680
called in frequently, but also once you do have these very fine grained kind of single responsibility

468
00:30:00,680 --> 00:30:05,880
endpoints that can be exposed independently as functions, then you know, that the scaling

469
00:30:05,880 --> 00:30:10,760
characteristics can be determined based on the traffic to that thing, because it's only

470
00:30:10,760 --> 00:30:15,760
called to do that one thing, as opposed to some giant web app that is called for a thousand

471
00:30:15,760 --> 00:30:16,520
different reasons.

472
00:30:16,620 --> 00:30:21,620
And it's not easy to, to determine, um, how to scale that.

473
00:30:21,620 --> 00:30:26,460
So once you get to that really fine grained function, then things like auto scaling become,

474
00:30:26,460 --> 00:30:35,160
uh, possible where with large web apps with larger surface areas, it's, um, it's not always

475
00:30:35,160 --> 00:30:39,880
a, something you can actually drive to reality.

476
00:30:39,880 --> 00:30:41,640
Auto scaling, right.

477
00:30:42,620 --> 00:30:42,940
Yeah.

478
00:30:42,940 --> 00:30:48,400
I mean, do you, uh, from, from talking to you and, and even your answers here, it sounds

479
00:30:48,400 --> 00:30:52,840
like you think that you can be quote unquote serverless anywhere, right?

480
00:30:52,840 --> 00:30:56,220
I mean, even the K native, I guess, lends itself to saying it's not just a public cloud

481
00:30:56,220 --> 00:30:57,100
only thing.

482
00:30:57,100 --> 00:31:00,780
On one hand, I see plenty of debate that, Hey, serverless is really something that can only

483
00:31:00,780 --> 00:31:02,340
happen in public cloud.

484
00:31:02,360 --> 00:31:06,160
Cause it's the only place you can literally hide the infrastructure and just up an API

485
00:31:06,160 --> 00:31:07,860
or an endpoint versus on-prem.

486
00:31:07,940 --> 00:31:11,660
You're going to have Kubernetes pods to deal with virtual physical infrastructure.

487
00:31:11,660 --> 00:31:14,100
So stop trying to bring that paradigm on-prem.

488
00:31:14,200 --> 00:31:18,780
We should be steering everybody, the public kind of fall on that discussion of, should we

489
00:31:18,780 --> 00:31:22,840
be investing in quote unquote serverless like tech that would run in a, in your own data

490
00:31:22,840 --> 00:31:23,180
center?

491
00:31:24,360 --> 00:31:24,760
Yeah.

492
00:31:24,880 --> 00:31:29,480
So, I mean, I think obviously there's, um, probably the only thing that, that, that people

493
00:31:29,480 --> 00:31:35,620
agree about serverless is that it's a very confusing term that nobody agrees on.

494
00:31:36,160 --> 00:31:40,220
Um, and I think part of that is how literally do you take it?

495
00:31:40,220 --> 00:31:47,700
Um, and another part of that is because there, there's definitely one viewpoint that you, you

496
00:31:47,700 --> 00:31:52,520
can't talk about serverless unless it's public cloud, because otherwise you have servers and,

497
00:31:52,640 --> 00:31:57,340
um, but then you can take that to the extreme and say, well, you know, Amazon also has servers.

498
00:31:57,740 --> 00:32:03,820
Uh, eventually there are servers and, um, you know, if someone at Amazon is using Lambda,

499
00:32:04,340 --> 00:32:06,000
does that mean it's not serverless?

500
00:32:06,080 --> 00:32:06,480
I don't know.

501
00:32:06,980 --> 00:32:14,620
Um, so I think that one, one way to look at it is that if, and this is especially relevant

502
00:32:14,620 --> 00:32:20,660
for, for us, because it's our primary focal point is that there's the developer experience

503
00:32:20,660 --> 00:32:23,440
that it's somewhat separate from the operator's experience.

504
00:32:24,220 --> 00:32:30,640
And so I think if you're running serverless on a public cloud, then it ends up, um, removing

505
00:32:30,640 --> 00:32:33,880
responsibility, uh, not all of it.

506
00:32:33,960 --> 00:32:37,800
I don't think there's any such thing as no ops, but it does remove, or at least shift the

507
00:32:37,800 --> 00:32:40,760
responsibilities for operators as well as developers.

508
00:32:41,140 --> 00:32:46,000
But you can still have something that's called serverless, um, whether you like the term or

509
00:32:46,000 --> 00:32:51,640
not, that runs, uh, that provides a simplified experience for developers.

510
00:32:51,640 --> 00:32:58,320
And that's just meaning that they, something that they can focus on their code and focus

511
00:32:58,320 --> 00:33:04,440
on the smallest scope of the code that's, that's solving a business problem and be able to upload

512
00:33:04,440 --> 00:33:09,620
that in some way into the cloud without thinking about actual server processes that they need

513
00:33:09,620 --> 00:33:10,160
to manage.

514
00:33:11,620 --> 00:33:17,260
So it's very fuzzy, but, um, I think putting it between the developer and operation, uh,

515
00:33:17,580 --> 00:33:20,240
responsibilities is, is one way to help with that.

516
00:33:21,520 --> 00:33:21,920
Yeah.

517
00:33:22,140 --> 00:33:27,440
It's, it's, it's hard to nail a term like that because, uh, uh, I mean, I mean, it's because

518
00:33:27,440 --> 00:33:32,240
basically it's just like, there's less stuff developers need to worry about, but then, but then

519
00:33:32,240 --> 00:33:35,640
on the other hand, you don't want to make them all goofy and be like, you don't need to worry

520
00:33:35,640 --> 00:33:36,380
about anything.

521
00:33:37,320 --> 00:33:41,080
There's still lots of considerations that need to come into play, but I don't know.

522
00:33:41,280 --> 00:33:45,040
I think, I think it's like, like most terms is just like, it's, it's a little too late

523
00:33:45,040 --> 00:33:46,800
to come up with something, something new.

524
00:33:46,900 --> 00:33:48,900
And then, and then we would just debate that.

525
00:33:49,780 --> 00:33:50,140
Right.

526
00:33:50,240 --> 00:33:55,900
And, and I think, I mean, what's interesting about the points you make about, uh, overdoing

527
00:33:55,900 --> 00:33:59,540
it to where you don't have to worry about anything is that on the flip side, there are actually

528
00:33:59,540 --> 00:34:05,980
some things that become, uh, more of a concern or at least more of a challenge to, to worry

529
00:34:05,980 --> 00:34:10,940
about when you're running in this kind of a model, because, uh, for instance, if you're

530
00:34:10,940 --> 00:34:15,260
if your containers are going away, scaling to zero, then you need to be able to have access

531
00:34:15,260 --> 00:34:18,620
to logs for things that may be failed, but are now gone.

532
00:34:18,620 --> 00:34:22,900
Um, you need to be able to, once you've broken things up into such fine grained functions

533
00:34:22,900 --> 00:34:28,200
that all interact with each other in a number of different ways, you need to be able to see

534
00:34:28,200 --> 00:34:34,260
the trace of a, of a, uh, user transaction that spanned a dozen different functions.

535
00:34:34,260 --> 00:34:34,580
Right.

536
00:34:34,580 --> 00:34:41,320
So things like logging and all the observability and, and, um, and metrics become a bigger challenge,

537
00:34:41,320 --> 00:34:46,160
um, at least for the developers of platforms that the developers are using.

538
00:34:46,520 --> 00:34:52,380
And one of the things I noticed when, uh, I kind of got into this a little more and followed

539
00:34:52,380 --> 00:34:56,280
your work on Knative is yes, there's those things you call out, which, Hey, now you have

540
00:34:56,280 --> 00:35:00,540
to think of new things and think of instrumentation differently and monitoring and all that.

541
00:35:00,540 --> 00:35:05,780
But there's things that I liked that we added to Knative for all of us to make it also easier

542
00:35:05,780 --> 00:35:09,820
for devs to do in general, two things you, you quick touched on earlier, but could you explain

543
00:35:09,820 --> 00:35:13,740
a little more about the build system, which I think is interesting and obviously the venting

544
00:35:13,740 --> 00:35:16,580
subsystem, which has a lot of, I guess, riffs heritage in.

545
00:35:17,040 --> 00:35:21,700
So to me, those are beyond just the serving component of just run apps, scale them to zero,

546
00:35:21,920 --> 00:35:26,260
have revisions, all really good stuff, but the build and event actually pretty neat things

547
00:35:26,260 --> 00:35:30,800
that are arguably trying to make the developer experience more powerful and more interesting.

548
00:35:30,920 --> 00:35:32,380
Could you, could you explain those a bit?

549
00:35:33,020 --> 00:35:33,220
Sure.

550
00:35:33,400 --> 00:35:33,580
Yeah.

551
00:35:33,660 --> 00:35:39,800
So with the build, um, the basic idea in Knative is that you, you enter the system,

552
00:35:39,820 --> 00:35:45,580
with a, uh, component that it's a custom resource in Kubernetes called configuration.

553
00:35:46,020 --> 00:35:52,480
And that's the thing that points to the source code or a source image.

554
00:35:52,480 --> 00:35:55,200
And so that's basically, those are the two options that you have.

555
00:35:55,240 --> 00:36:00,060
You can, you could have already built an image, whether you did it manually on your laptop and

556
00:36:00,060 --> 00:36:04,560
pushed it somewhere, or as part of, uh, some CI pipeline, right?

557
00:36:04,580 --> 00:36:05,700
There's already an image.

558
00:36:05,700 --> 00:36:11,220
Then you just point to the image and the configuration, uh, that you either create or update points

559
00:36:11,220 --> 00:36:12,560
to that image.

560
00:36:12,560 --> 00:36:14,580
And that triggers a deployment.

561
00:36:15,320 --> 00:36:20,260
And every time you make a change to a configuration, whether you've changed the image tag or something,

562
00:36:20,260 --> 00:36:23,280
then that will trigger a new revision to be deployed.

563
00:36:23,500 --> 00:36:26,460
And so that part is the serving core.

564
00:36:26,900 --> 00:36:32,580
Now, what's interesting is that if you choose to, then instead of pointing directly to an image in the

565
00:36:32,580 --> 00:36:35,940
configuration, you can point to a build, uh, process.

566
00:36:35,940 --> 00:36:40,520
You basically, um, choose a build template and then provide the parameters for that template.

567
00:36:40,800 --> 00:36:45,120
And so that could be anything ranging from, um, something that we've been working on.

568
00:36:45,120 --> 00:36:50,960
That's obviously, uh, in the, in the DNA at pivotal is build pack support, right?

569
00:36:50,960 --> 00:36:56,100
So we're working now on, uh, riff building on top of K native, being able to use build packs

570
00:36:56,100 --> 00:37:02,500
to create the, to ultimately create the image from just a developer's function code and the

571
00:37:02,500 --> 00:37:07,100
parameters that point to what base that needs to be added on top of and, and what other things

572
00:37:07,100 --> 00:37:08,200
you need to configure.

573
00:37:08,360 --> 00:37:09,860
And so that drives a build pack.

574
00:37:09,860 --> 00:37:15,920
You can also have something that delegates to say the Google cloud builder or something that runs,

575
00:37:15,920 --> 00:37:23,660
um, kind of in between approach, which is, uh, something like Kaneko, which can take, um, a Docker

576
00:37:23,660 --> 00:37:27,340
file and build an image in a container and then, and then push that.

577
00:37:27,560 --> 00:37:29,220
So there are a number of different options.

578
00:37:29,220 --> 00:37:35,200
And the whole idea behind the build template is that it's, it's, uh, configurable and extensible

579
00:37:35,200 --> 00:37:40,780
and can support this whole range of, of options, but you always have the ability to just come

580
00:37:40,780 --> 00:37:44,340
with an image as well, um, on the eventing side.

581
00:37:44,340 --> 00:37:52,900
So that's more about how request traffic, uh, makes its way to a route that is sitting in

582
00:37:52,900 --> 00:37:53,960
front of those revisions.

583
00:37:54,520 --> 00:38:02,540
And, um, um, the idea there is that, um, you can plug into event sources and those could

584
00:38:02,540 --> 00:38:11,300
be things like databases or cloud services or file systems, and those will be adapted so

585
00:38:11,300 --> 00:38:18,620
that the events that come off of those end up, um, passing through the, uh, route for, for

586
00:38:18,620 --> 00:38:20,140
different revisions that they target.

587
00:38:20,540 --> 00:38:26,000
And what we, uh, were most involved in on the riff team was, was helping to define a model

588
00:38:26,000 --> 00:38:29,200
around a pub sub system, basically.

589
00:38:29,200 --> 00:38:33,300
So there's a, there's a custom resource called channel, and then there's a custom resource

590
00:38:33,300 --> 00:38:37,180
called bus, which is an implementation that can back those channels.

591
00:38:37,180 --> 00:38:42,140
And that's where we brought the Kafka implementation from riff as one example.

592
00:38:42,140 --> 00:38:46,180
But now there's also a Google cloud pub sub implementation of that.

593
00:38:46,820 --> 00:38:52,060
And, um, there will be others, uh, for that bus implementation to back a channel.

594
00:38:52,680 --> 00:38:57,780
And the other resource then is the subscription, which allows you to point to a given channel

595
00:38:57,780 --> 00:39:04,800
and then, uh, have, um, you can have a one to many relationship from a channel to various,

596
00:39:04,800 --> 00:39:06,440
uh, services.

597
00:39:06,440 --> 00:39:12,340
And those services are, are basically the end points, uh, typically for your revisions that

598
00:39:12,340 --> 00:39:16,360
were triggered by the creation of a, of a K native configuration.

599
00:39:16,720 --> 00:39:23,080
So you can create a model where you maybe are listening to say a GitHub web hook as an

600
00:39:23,080 --> 00:39:29,740
input source or a Google cloud storage bucket as an input source, or any of the number of

601
00:39:29,740 --> 00:39:35,180
adapters that we think will start to grow in a, in an ecosystem that's driven by the community.

602
00:39:35,420 --> 00:39:40,080
And then you, you point those to a channel and then downstream from that channel, you can

603
00:39:40,080 --> 00:39:41,000
add different subscribers.

604
00:39:41,000 --> 00:39:46,820
And that's the part that we needed to have at a level that we could replatform riff.

605
00:39:47,140 --> 00:39:49,660
And, um, and so we were able to do that.

606
00:39:49,660 --> 00:39:52,120
And now we're continuing to make those contributions there.

607
00:39:52,620 --> 00:39:56,780
Well, well, so, uh, you know, I think, I think as you're describing to use one of my favorite

608
00:39:56,780 --> 00:40:01,640
templates for things like, like any good technology, it can be as complicated as you don't want

609
00:40:01,640 --> 00:40:02,080
it to be.

610
00:40:02,760 --> 00:40:08,720
And, and, and to that end, like, like putting aside the legacy stuff, uh, cause I mean, you've

611
00:40:08,720 --> 00:40:13,780
kind of covered that in regards to the following questions or as much as is necessary.

612
00:40:14,080 --> 00:40:18,520
Like if, if you were sitting down to like, let's say you can pick something else, but make

613
00:40:18,520 --> 00:40:23,020
a reservation system, like what kind of planning do you start doing?

614
00:40:23,420 --> 00:40:27,500
Uh, you know, if you're going to do things in a serverless way and, and, and let's assume

615
00:40:27,500 --> 00:40:32,200
the old thing, you know, of like, you validate that this is the right technology to pick and,

616
00:40:32,200 --> 00:40:33,580
and, and all that kind of stuff.

617
00:40:33,720 --> 00:40:39,840
But like, what kind of pre planning architecture stuff do you do?

618
00:40:39,920 --> 00:40:43,720
What, what, what do you think through of, we need these components and what's the big

619
00:40:43,720 --> 00:40:46,760
wall look like that you got a bunch of boxes and lines on?

620
00:40:48,020 --> 00:40:56,900
Well, I mean, I think to a large extent, it's, it's similar to any kind of greenfield microservices

621
00:40:56,900 --> 00:41:05,080
type approach where, um, most of the ideas from, uh, domain driven design apply.

622
00:41:05,220 --> 00:41:11,900
So you think about where are your bounded contexts, where does your state for each of those need

623
00:41:11,900 --> 00:41:19,000
to be stored and which things interact with each other and what makes up the aggregates

624
00:41:19,000 --> 00:41:21,880
that are being shared, uh, between those boundaries.

625
00:41:22,440 --> 00:41:31,180
And then you map those things themselves into functions and the, what, the state that they

626
00:41:31,180 --> 00:41:36,160
need would be mapped into services that, that those functions need to connect to.

627
00:41:36,420 --> 00:41:37,520
Well, that makes sense.

628
00:41:37,840 --> 00:41:38,720
I mean, it's a good question.

629
00:41:38,940 --> 00:41:43,840
I, I, it's, it seems like the key thing is always, uh, you know, where, where's your state?

630
00:41:44,760 --> 00:41:45,240
Right.

631
00:41:45,380 --> 00:41:50,260
I shouldn't say it's not the key thing, uh, but it's a, uh, it's a, what would you say?

632
00:41:50,320 --> 00:41:51,420
A necessary thing.

633
00:41:51,600 --> 00:41:53,360
You always have to have that involved somewhere.

634
00:41:54,160 --> 00:41:54,280
Right.

635
00:41:55,280 --> 00:41:55,640
Yeah.

636
00:41:55,680 --> 00:42:00,200
So one of those technologies that you may have chosen ahead of time that Coté just mentioned,

637
00:42:00,300 --> 00:42:04,540
but one that we didn't talk about here, but I've seen kind of get mixed up as we talk about

638
00:42:04,540 --> 00:42:07,080
Knative and Riff and things like that is Spring Cloud Function.

639
00:42:07,280 --> 00:42:09,340
I know you had some involvement in that.

640
00:42:09,380 --> 00:42:10,620
So that's not the same as Riff.

641
00:42:11,040 --> 00:42:12,160
It's not the same as Knative.

642
00:42:12,320 --> 00:42:16,720
Could you kind of talk about this other piece of the pivotal serverless universe and Spring

643
00:42:16,720 --> 00:42:18,800
Cloud Function and kind of summarize what that is?

644
00:42:20,080 --> 00:42:20,560
Sure.

645
00:42:20,560 --> 00:42:28,380
Um, yeah, I mean, I think from my, from my perspective, there's, there's a, um, an evolutionary

646
00:42:28,380 --> 00:42:33,740
aspect to this as well, because I started working on Spring Cloud Function when I was first

647
00:42:33,740 --> 00:42:41,620
looking at, um, what serverless could mean for Spring developers and taking the typical Spring

648
00:42:41,620 --> 00:42:47,720
philosophy of things, which is basically all about inversion of control and letting developers

649
00:42:47,720 --> 00:42:52,280
focus on business logic and, uh, we usually refer to the Hollywood principle, right?

650
00:42:52,340 --> 00:42:53,800
Like don't call us, we'll call you.

651
00:42:54,180 --> 00:43:01,080
And so extending that framework up to the level where we'll call you with the smallest amount

652
00:43:01,080 --> 00:43:04,200
of code that you could possibly need to worry about.

653
00:43:04,200 --> 00:43:09,280
Um, so that was, um, so that was, that was the original idea behind Spring Cloud Function.

654
00:43:09,280 --> 00:43:15,440
And, and in some sense, it was just an evolution itself of Spring Cloud Stream where with Spring

655
00:43:15,440 --> 00:43:20,020
Cloud Stream, you would configure the binder through properties.

656
00:43:20,020 --> 00:43:22,100
Like I want to connect to Kafka or I want to connect to Rabbit.

657
00:43:22,400 --> 00:43:27,740
And then my code is in this one class annotated with Stream Listener.

658
00:43:27,940 --> 00:43:31,880
And so Spring Cloud Function basically just said, you don't need to annotate anything.

659
00:43:31,880 --> 00:43:33,220
You can just provide a function.

660
00:43:33,620 --> 00:43:38,640
And if you're building an app that exposes a single function, it was very easy to, to

661
00:43:38,640 --> 00:43:45,960
just provide the function and then let us provide the dependencies that wrapped that up into something

662
00:43:45,960 --> 00:43:46,440
runnable.

663
00:43:46,440 --> 00:43:53,000
And what that meant is then, uh, because in addition to inversion and control, we also want

664
00:43:53,000 --> 00:43:57,760
to have portability so that you can write the same code locally that you're running on some

665
00:43:57,760 --> 00:43:58,200
platform.

666
00:43:58,340 --> 00:44:04,520
And what I was noticing at the time is that even though fast platforms like Lambda are

667
00:44:04,520 --> 00:44:09,260
focused on the developer writing smaller amount of code, there was still something about the

668
00:44:09,260 --> 00:44:14,860
platform in the contract that you had to implement, especially for Java, I would say it's maybe

669
00:44:14,860 --> 00:44:21,180
not as much the case for, for JavaScript, but you would need to extend the framework classes

670
00:44:21,180 --> 00:44:22,800
or implement the frameworks interfaces.

671
00:44:23,540 --> 00:44:27,420
And so what we did with Spring Cloud Function is we provided just the thinnest possible layer

672
00:44:27,420 --> 00:44:31,020
that implemented or extended the target platform.

673
00:44:31,760 --> 00:44:33,620
And then that layer calls your code.

674
00:44:33,960 --> 00:44:38,080
And so you can swap out different dependencies for different of those adapter layers to run

675
00:44:38,080 --> 00:44:44,700
on different FaaS runtimes like Lambda and Azure and, um, and OpenWisk as well.

676
00:44:44,800 --> 00:44:46,660
So we have adapters for all of those.

677
00:44:46,840 --> 00:44:53,260
And then since Spring Cloud Function could also be used as just a Spring boot app, which means

678
00:44:53,260 --> 00:44:55,320
it can be an executable jar.

679
00:44:56,000 --> 00:44:59,540
That's where things maybe start to seem blurry because I can take a Spring Cloud Function app

680
00:44:59,540 --> 00:45:02,800
and just run it, um, on its own.

681
00:45:03,080 --> 00:45:06,180
And so that's where it feels like it's not just a framework.

682
00:45:06,180 --> 00:45:07,160
It's also a runtime.

683
00:45:07,680 --> 00:45:11,360
Um, but we, we build on top of that actually for Rift.

684
00:45:11,460 --> 00:45:16,360
If you're building a Java application in Rift and you just provide the function, like the

685
00:45:16,360 --> 00:45:19,900
literal Java util function function implementation.

686
00:45:20,900 --> 00:45:29,260
And, um, and that gets laid on top of a base image that has the Java function invoker, which is actually

687
00:45:29,260 --> 00:45:31,640
a Spring Cloud Function, um, foundation.

688
00:45:31,640 --> 00:45:37,400
And it's a boot app that then spins up in the container in Rift on Knative.

689
00:45:38,180 --> 00:45:39,640
Lots of layers there, but.

690
00:45:41,560 --> 00:45:46,760
But I mean, well, well, well, as always, if you don't want like a, uh, we were talking about

691
00:45:46,760 --> 00:45:50,900
earlier, if you don't want a tremendous amount of dependency and lock-in, then you need layers.

692
00:45:51,320 --> 00:45:53,780
Like layers are the answer to that.

693
00:45:54,660 --> 00:45:59,520
I mean, you're, I mean, Spring Cloud Function, kind of you bring the FAS versus Rift as you

694
00:45:59,520 --> 00:46:00,200
bring the function.

695
00:46:00,340 --> 00:46:02,240
Is that at least coarsely fair?

696
00:46:02,920 --> 00:46:05,340
Yeah, I think that's, that's a good way to look at it.

697
00:46:06,000 --> 00:46:06,200
Yeah.

698
00:46:06,260 --> 00:46:14,120
And I mean, even taking your, the idea of inversion of control always, uh, with Spring, um, has

699
00:46:14,120 --> 00:46:21,120
always been that you, you build a jar from the dependencies, the framework dependencies.

700
00:46:21,320 --> 00:46:23,660
And then also your code, right?

701
00:46:23,780 --> 00:46:29,260
And with the difference really with Rift is that we cross over this line where you don't

702
00:46:29,260 --> 00:46:32,300
bring the, the framework dependencies in your jar.

703
00:46:32,420 --> 00:46:34,060
You just give us the jar that's the function.

704
00:46:34,180 --> 00:46:40,000
And so instead of, it's not only don't call us, we'll call you, but it's even don't depend

705
00:46:40,000 --> 00:46:41,560
on us, we'll depend on you.

706
00:46:41,920 --> 00:46:49,040
And so you just, the, the container that spins up has the user provided code as a dependency

707
00:46:49,040 --> 00:46:56,720
that it then loads and invokes, um, and you, as a developer, you can write unit tests for

708
00:46:56,720 --> 00:47:03,040
that function, but you don't even, unless you choose to use a Spring library for something

709
00:47:03,040 --> 00:47:07,980
within the scope of your code, you don't even have the dependencies on the framework, um, in

710
00:47:07,980 --> 00:47:08,560
your artifact.

711
00:47:09,840 --> 00:47:10,320
Hmm.

712
00:47:11,320 --> 00:47:12,240
That makes sense.

713
00:47:12,540 --> 00:47:15,500
Well, uh, thanks for being on to go over this stuff.

714
00:47:15,540 --> 00:47:16,020
It was nice.

715
00:47:16,280 --> 00:47:20,200
We get to talk about fish and then, uh, you know, don't depend on us.

716
00:47:20,260 --> 00:47:21,140
We'll depend on you.

717
00:47:21,580 --> 00:47:22,840
It's, that was good.

718
00:47:23,120 --> 00:47:28,520
So, uh, I mean, I mean, finally, um, what, what do you think, like, like, what are, what

719
00:47:28,520 --> 00:47:30,640
are y'all planning on doing over the next year or so?

720
00:47:30,640 --> 00:47:33,040
Like, what's, what's the sense for the roadmap that you'll have?

721
00:47:34,780 --> 00:47:38,120
Well, I mean, there's quite a bit, it's still an early project.

722
00:47:38,440 --> 00:47:47,800
Um, and there's, uh, I, I think the Knative, uh, release right now is 0.11 and, um, same

723
00:47:47,800 --> 00:47:49,040
for project riff.

724
00:47:49,040 --> 00:47:56,120
So we, we, uh, when we sort of went into a quiet period where we were working on Knative,

725
00:47:56,220 --> 00:48:01,780
but before it was public, we stopped, um, somewhat intentionally on version 007.

726
00:48:02,500 --> 00:48:06,940
And, uh, we recently, after replatforming on Knative, released version 0.1.

727
00:48:07,240 --> 00:48:10,840
So, um, in both cases, there's a zero in the first digit.

728
00:48:10,840 --> 00:48:14,120
So that shows that we have, um, we still have some work to do.

729
00:48:14,620 --> 00:48:17,780
Um, we're also focused on the, on the pivotal side.

730
00:48:17,800 --> 00:48:23,880
On the, um, building the pivotal function service on top of riff as well.

731
00:48:24,000 --> 00:48:25,500
So that will be our commercial offering.

732
00:48:25,960 --> 00:48:29,420
And that's part of the pivotal cloud foundry umbrella.

733
00:48:30,260 --> 00:48:36,660
Um, so there's, there's quite a bit going on there as well, running riff as a replatformed

734
00:48:36,660 --> 00:48:43,980
on Knative component on top of Pivotal's container service and, um, and thinking more about what

735
00:48:43,980 --> 00:48:47,260
those commercial features are, uh, for that.

736
00:48:47,320 --> 00:48:53,020
And, um, and, and definitely all of those challenges that I mentioned earlier around

737
00:48:53,020 --> 00:48:59,220
observability and tracing and metrics and things that really turn it into a full platform.

738
00:49:00,260 --> 00:49:05,560
As you say, there's 0.3 more percent work to do or not percent 0.3 more work to do.

739
00:49:06,440 --> 00:49:08,020
So, no, no, that makes sense.

740
00:49:08,220 --> 00:49:12,020
And then, and then, uh, I mean, if people want to find more, I'm sure they can, uh, you

741
00:49:12,020 --> 00:49:15,640
know, if they wanted to get ahold of it or like read through the docs or whatever, what

742
00:49:15,640 --> 00:49:16,440
would you point them to?

743
00:49:16,940 --> 00:49:20,340
So there's project riff.io for riff itself.

744
00:49:20,500 --> 00:49:29,700
Um, there's the, uh, PFS site on pivotal.io and for Knative, there's the, uh, GitHub org,

745
00:49:29,700 --> 00:49:38,380
which is Knative, um, and there is a, um, I guess that pretty much covers, uh, the entry

746
00:49:38,380 --> 00:49:38,640
points.

747
00:49:38,720 --> 00:49:41,660
Everything else is accessible from there.

748
00:49:42,280 --> 00:49:42,960
Well, good.

749
00:49:43,040 --> 00:49:46,820
Well, thanks again for being on and, uh, for the listeners as always.

750
00:49:46,820 --> 00:49:47,720
Thanks for listening.

751
00:49:47,900 --> 00:49:53,520
This has been Pivotal Conversations and you can find, uh, this episode and all the other

752
00:49:53,520 --> 00:49:56,900
ones listed at soundcloud.com slash Pivotal Conversations.

753
00:49:57,240 --> 00:50:01,920
And every Thursday or so, uh, we post the full show notes where you can see those things that

754
00:50:01,920 --> 00:50:05,800
we skipped over and, uh, maybe I'll put a picture of me eating a herring.

755
00:50:05,800 --> 00:50:10,040
That'll be fun, uh, over on pivotal.io slash podcast.

756
00:50:10,180 --> 00:50:12,400
And with that, we'll see everyone next time.

757
00:50:12,400 --> 00:50:13,080
Bye-bye.
