Skip to content

Instantly share code, notes, and snippets.

@isovector
Last active January 21, 2022 02:44
Show Gist options
  • Save isovector/ce47f012f620aa7d5b465fe627b2ee22 to your computer and use it in GitHub Desktop.
Save isovector/ce47f012f620aa7d5b465fe627b2ee22 to your computer and use it in GitHub Desktop.
Jonathan:
My thought process was that like, "Everybody's doing the same
thing. Everybody's reading Cracking the Coding Interview.
Everybody's reading books, doing Udemy courses, what is something
different that I can do to accelerate myself?"
Sandy:
Hello and welcome to the very first episode of the Cofree Cast.
I'm your host, Sandy Maguire, and today, I'm joined by Jonathan
Lorimer. Jonathan is a software developer based in Toronto, who's
passionate about functional programming, particularly Haskell.
He's the organizer of the Toronto Haskell Meetup. Interestingly,
Jonathan got into technology late, after having done his
undergraduate degree in Philosophy, where he focused on
Epistemology, Philosophy of Law and Ethics.
Sandy:
On a more personal note, when I first met Jonathan, I was sleeping
on his couch and forced him to call in sick in to work. We did
a three-day coding binge, working for 14 hours a day, about as
deep in the weeds as you can get. He's the only person I know
who's ever been gained to do that sort of thing, has quickly
become one of my favorite humans. Thanks for being on the podcast
today, Jonathan.
Sandy:
So, I guess, we'll just dive in here. And my first question for you is that you
got into programming rather late in your career. And I was wondering what
you're doing before that and sort of why did you start thinking about
programming?
Jonathan:
So, as you said, I did philosophy in university. I was actually, I was a bit of
a slacker in the university. I really didn't kick things into high gear until
maybe third year. I had a really great professor and she noticed that I was
really engaged in the essays that I was writing, but didn't come to class a lot
and she kind of like sat me down, and said, "Hey, look, you don't have to be
here. You could go off to college and learn a trade. You could take a gap year.
There's a bunch of different things you could do."
Jonathan:
And that kind of made me refocus and made me take things seriously. And I feel
like at that point, I really started to enjoy my Philosophy. I really started
to do the readings more seriously, and just became more of an engaged human in
general. So, but at that point, I was kind of far along in my Philosophy
degree. I didn't really have an idea of what I was going to do, so I finished
up my degree. I knew that I wanted to get a job right away and not really moved
back in with my parents and try and kind of find my way.
Jonathan:
So, I got a job doing construction. I had previously been into art and
architecture, so I thought, "Hey, maybe I'll learn construction and find my way
into property development or something like that." I was just kind of lost, so
I started working construction and that was a very formative experience. I was
really bad at it. It was previously everything I'd done and it wasn't
necessarily great, but everything had been kind of easy. I'd done all right at
sports. I'd done all right at school, but construction, I was just so bad and
I was bottom of the rung. I think the first day I was allowed to drive the
truck by myself, I got in a car accident, so it was a pretty stressful
experience. And being bottom of the rung in a construction job, you get bossed
around a lot.
Jonathan:
And then winter was coming and winter in Canada, not great and you're outside
doing construction, so. And I was already dreading going to work every day in
the summer, so okay, I just need to get out. And so, I started looking for
alternatives. And I started cold calling people to do just general business
development stuff. I reached out on LinkedIn. I tried to set up meetings. I was
generally looking for strategy type jobs and no one would respond. No one
picked up the phone and it was incredibly demoralizing.
Jonathan:
And so, I said, "Okay, I need to retool or rescale." So, I looked into a couple
of things. I looked into I think graphic design, because I had the arts
background. But I saw coding, and I roughly knew that coding was a relatively
lucrative position. And I figured with my background in logic, maybe I'd have
a chance at it, so I applied to a boot camp and got accepted. And then I went
off to the boot camp and that's how I got into tech.
Sandy:
Sort of interesting, you mentioned the ego thing of being good at everything
you did until you got to construction. And I wanted to ask about that when you
were doing tech. I feel like so many people approach tech when they're young
and grow up with it and so much so that it shapes the person that they become.
And so, I was wondering what is it like to get into programming as an adult? Is
it hard? Did your ego take a hit or was it something you were naturally good
at? Just how smooth did it go? And maybe you could tell me a little bit about
that.
Jonathan:
To give a more direct timeline, I started the boot camp at 24. I'm 27 now.
I graduated university a little bit late at 22 or 23, I can't remember. I did
an extra year and going into the boot camp, I had a very, very particular goal.
I figured that the hiring rate out of the boot camps was not 100%, so I had the
goal to be in the top three of the class at all the projects. And the idea was
that in every project, I was top three. I finished somewhere in top three and
those are the candidates that the hiring managers were going to select.
Jonathan:
So, I went in quite competitive. I don't think anyone else quite had as much of
a competitive attitude. I think people kind of showed up and they're just in
survival mode. So, I think that a more aggressive mentality held me in good
stead. There were people who did have coding backgrounds and they had a head
start. But I think I ended up being top three in my cohort. I do think it's
a bit, I don't know. It's a bit unfair, because the type of coding boot camp
was very specific. It was get good at React, get good at web development, and
get hired. So, it was actually quite easy to treat it as a skill rather than
more of an academic endeavor or something that I was trying to understand
deeply.
Jonathan:
It was really more of can you learn what makes a React component and mimic this
web template. So, that lent itself well, I think, to the type of attitude that
I went into it with. Yeah, so it wasn't actually that hard, I don't think until
I got into functional programming. And there's a very specific story of how
I got into functional programming, but that's when things started to get more
difficult. And I started to compare myself to peers who I think are more
advanced. Some of those like lifers, those like programming lifers.
Sandy:
That's really interesting. I want to get to functional program in a minute, but
just a little more on this topic first, which is, would you recommend that more
people put off getting into programming until later in life? Or do you think
that was an asset or a liability?
Jonathan:
Yeah, I do, actually. I had a bunch of friends who are kind of, they're having
a tough time finding their way as well. Actually, in the grand scheme of
things, I feel like I got into programming relatively early for someone who got
into it late, if that makes sense. But I have these friends who are kind of
mutt, who are kind of 25, 26, 27 now and they've tried to get a job in the
discipline that they went to university for unsuccessfully. It's actually
a pretty harsh job market out there, I think.
Jonathan:
And so, they've asked me, "You made the transition, do you think I should?" And
these are people who are Economics majors or they're really into urban
development and urban planning, like really, really interesting things. And the
advice that I give them all the time is to try and be a subject matter expert,
rather than just a technologist because it's a bit paradoxical because I chose
to become a technologist. But from what I've seen or in my opinion, I think
subject matter experts are in short supply and I think there will be a premium
on them in the future.
Jonathan:
It's very easy, or I shouldn't say very easy, but it's a solved problem how to
take a technical specification and translate that into working code. It's not
so straightforward to actually understand disparate domains and to be able to
explain those to a technologist and have them build something. So to get back
to your original question, I think there is some advantage to being, to having
subject matter expertise outside of tech. I think it does expand, expand the
way that you see the world and it gives you a lot of intangible skills that can
inform the way that you do things.
Jonathan:
It's hard for me to point exactly to what mine are because Philosophy itself is
very abstract and it's also relatively related to tech, because it's pretty
logic heavy, so I don't know. I can't say exactly what the separate skills that
I developed that I wouldn't have developed if I'd done a Computer Science
degree. But I definitely feel that I have a few at least. And so, I think that
would be the primary advantage is that you're kind of this hybrid of you've got
expertise outside of tech and you can speak about real world things. But then
you can also take a technical specification and write the code.
Sandy:
Would you say that your life experience is the thing that maybe differentiates
you most from other programmers, the lifers, as you call them?
Jonathan:
Yeah, yeah, I think so. Maybe what it is, is that in technology, there's kind
of diminishing returns as you invest time. And so, I've kind of got the steep
curve from an early learner from Philosophy and then I'm also enjoying the
steep curve of being on in my technology journey, so maybe that's a good way to
put it.
Sandy:
I'm really curious as to whether you were ever aware of programming rewiring
your brain. I find the more I learn about technology, the more I see it
everywhere in the world. And not necessarily like, "Oh, there's computers
everywhere, but there's computation everywhere," and sort of. And so, but
again, that's something I've grown up with and it's hard to exactly pinpoint if
my brain ever changed or if I grew into that. And so, the question I'm trying
to ask is, did you ever feel that way? And if so, how did computation ever
change the way you think about the world?
Jonathan:
I'm going to take a roundabout way of answering this. I feel like I've had this
experience with Philosophy, where once I started to learn formal Logic,
philosophical argumentation, I learned the skill of putting together an essay.
I started to see that everywhere, this logical structure. And it was a little
strange to me, because some people found that quite grating when I would try
and force logical structure onto our conversations.
Sandy:
I think we all have that, that experience.
Jonathan:
Yeah, I'm sure. But I think what that stems from is that there are human
interactions where people enjoy living in the ambiguity, if that makes sense.
The ambiguity can be an aid or a crutch, if you aren't entirely sure what
you're talking about. But for the most part, I started to see this logical
structure everywhere. So, it started with philosophy, but then to come back to
programming, and I'm not sure if you want me to get into this now or later, but
I had at my boot camp, there was a mentor, who gave me a crash course on lambda
calculus. And that was probably the formative experience of my time at the boot
camp.
Jonathan:
And learning about the lambda calculus was really what made me understand the
logical system that I'd seen in everything. It was actually just computation.
And so, the experience I had is he was a mentor that was really into functional
programming and really into category theory. And we'll have this lecture on,
this introduction to lambda calculus and he wanted to test it out on someone,
so he showed to me. It was kind of like a practical example where you'd learn
the basic rules and then you'd start to build up structure. So, he showed me
how to build true and false in the lambda calculus, how to encode it. I think
it's called Church encoding. And it showed me how to encode.
Jonathan:
And then from my experience about truth tables and logic, I was able to deduce
how to encode or and it was kind of like this magical experience. I felt like
what I was learning was objective and true and real and out there. And one of
the things that this mentor used to say was, I was into chess, he was into Go
and he would tell me that Go was an objectively better game than chess because
Go has more possible permutations and fewer rules. So, it was inherently more
general. And I still enjoy playing chess, but I actually think I agree with
him, that there was something more beautiful about this game.
Jonathan:
And I feel that analogy applies to lambda calculus, where you've got very few
primitive operations. You've got lambda abstraction and function application
and that's it. But from those very few rules, I saw this proliferation of
structure, this logical structure that I had seen on the world, so that is
a very roundabout way of saying that like, "Yeah, I think I had seen the
structure in the world. I had seen people shy away from it. I had seen that it
can be applied to a lot of different domains." But I didn't really quite know
what it was and I think what I learned lambda calculus and felt like what I was
seeing was just computation out in the world.
Sandy:
Yeah, absolutely. Just to question a little more about the Go versus chess
thing. It sounds to me like you're saying if you were to write an AI to play
Go, it'd be harder than one to play chess and therefore, it's more an
interesting game, is that?
Jonathan:
I guess that's an example of it, but I think the way that the mentor was coming
out was that the interesting part of a game is that you don't really know the
outcome. And so, there's this anticipation of you trying your skill against the
opponent's skill and it's not entirely obvious, who's going to win. And Go has
a deeper tree, a deeper and wider tree of possibilities from fewer rules. And
so, I guess what that means is that some of the rules in chess are contingent.
Jonathan:
So I think that with Go, I don't really know that much about Go, but I think
your valid moves are just placing a pebble on the board in a specific position.
With chess, you've got all these different moves that are very particular to
the pieces. It's like it's unnecessarily constrained.
Sandy:
Oh, I think I see what you're saying like the lambda calculus has so few
restrictions.
Jonathan:
Yeah, it's the lambda calculus has two moves. And from that ever that you get
this very-
Sandy:
You get all computable functions.
Jonathan:
Yeah, exactly. Whereas chess you've got, I don't know exactly how many moves,
but pawns you can move forward. But sometimes if there's a piece in the way,
you can move them diagonally, you can't move them backwards. Horses, you can
move backwards, but only in an L shape, so there's all these very specific
contingent rules. Whereas in Go, it's no, it's just this one move.
Sandy:
That makes a lot of sense to me and it's a fascinating way to think about it.
I'd like to ask you a little more about your journey to functional programming.
You mentioned you had this mentor who's got you thinking about it. And was it
something that you bounced off a few times or did you learn about functional
programming and just dived in?
Jonathan:
After the introduction through lambda calculus, I had this transcendental
experience, this aha moment, but I still didn't pursue it. I always treated it
like Philosophy where I said, "Oh, yes, it's interesting and it's abstract."
But I'm trying to get a job, I'm trying not to go back to construction, and
lambda calculus isn't going to help me write React. So I put it off, but I had
this attitude where I was like, "Okay, I'm going to do functional light
programming. I'm going to do functional JavaScript." Just from an aesthetic
perspective, I thought it looked nicer that kind of thing.
Jonathan:
And then I got a job and I was trying to improve. And this mentor invited me
over to teach me Haskell. He was big into Haskell. At this time, Haskell was
a black box to me. And so, I started learning it and I thought it was a bit
uncomfortable. I wasn't entirely sure that I want to pursue it. I was like it's
interesting to train me to be better at doing functional JavaScript, but
I don't know that I really want, but I kept coming back to it.
Jonathan:
And I think, a couple of my early experiences at startups. So, I worked for
quite a few companies that had a very quick succession. The first company
I worked for the startup went under within three months. The second one was
just really bad code, and then the third one was a bigger tech company in
Toronto, but still, they used pre-rudimentary programming stack. And I think
what I started to see was every company I worked at, there was this elastic
band ball of features where they just kept wrapping one around another and it
was very messy.
Jonathan:
It was, I was always frustrated. I felt like we were prioritizing ourselves
today over ourselves tomorrow and we're making a ton of work for ourselves
tomorrow because of the exponentially increasing complexity. And so, I was
still doing functional light program or functional light programming
JavaScript, but I was looking for tools to combat complexity. And I kept coming
back to Haskell. Really, it started with types. I got into TypeScript. I was
learning some Haskell still just to keep up with my functional programming.
Jonathan:
And I think I started to recognize the constraints in Haskell, that had made me
think it was impractical at first, were exactly what I was looking for to fight
this complexity. And then when I tried to introduce these techniques, I was met
with a lot of resistance and the resistance I was met with from the senior
developers, felt unreasonable. It felt like people were just against Haskell
for the sake of it being Haskell, saying it was necessarily complex, it was
really hard to learn.
Jonathan:
And I had this feeling that like, "No, it's the opposite. This is making things
simpler." So, I feel like people's negative attitude towards Haskell pushed me
more towards it. I've always been a bit of a contrarian and then once I was on
the Haskell flywheel, it was impossible to get off and the big career goal
became finding a job in Haskell. So anyway, that was my journey into Haskell.
It was little bit slow, but no, I didn't really ever bounce off of it once
I had decided to get into it.
Jonathan:
I have bounced off of some things. I've tried to learn a bit of category theory
and I've consistently bounced off of that. But Haskell, I think as soon as
I recognized that it was the south to unnecessary complexity or to I guess,
sprawling complexity, it became a no brainer. And it's the only programming
language I would choose to write software.
Sandy:
Do you think that being a contrarian is necessary to get into Haskell?
Jonathan:
I don't think so, but I think just on the path that I was on, it was the final
push that got me to dedicate literally all of my time. Because I was also
trying to split some of my time about getting good at CSS and getting better at
React, and things that I thought were directly applicable to my day job. And
then when people started to fight me on it, I was like, "Okay, screw this, all
I'm doing is Haskell every night."
Sandy:
To switch attacks a little bit, at some point, you hired a programming coach,
which is so I think rare in this industry. And I'd love to hear more about
that. What was it like?
Jonathan:
That was a really interesting experience. I had a learning budget at the
Toronto Bay startup and I have always been really keen on finding alternative
ways of getting ahead that my thought process was that like, "Everybody's doing
the same thing. Everybody's reading Cracking the Coding Interview. Everybody's
reading books, doing Udemy courses, what is something different that I can do
to accelerate myself?" And paying for a coach seemed like a no brainer, because
I was trying to get better at all costs. And I was severely limited by time,
but if I could exchange a little bit of money for a quicker development that
seemed like a no brainer.
Jonathan:
So, I hired this, I went out looking for coaches. I found one named Jimmy
Koppel. I heard of him through Composed Conference in New York. He gave
a really interesting talk on defunctionalization, the best refactoring you've
never heard of. And he's a really interesting individual, because he's got
a very strong programming languages background. I think he focuses in program
synthesis, but he writes a lot of Haskell. I think he knows some dependently
type programming languages. I think he's done some work in Agda.
Jonathan:
But I don't want to misrepresent him, but from my understanding, he's firmly in
the camp of object-oriented programming. He really goes between the two, but
the people that he's usually coaching are like FANG company software engineers
who are looking for a way to get an edge on the person next to them. So,
they're usually like Java, Python, JavaScript programmers. And so when
I engaged him, I was still extremely junior at Haskell. I think I couldn't even
put together a real application because I was still struggling with
understanding IO and the different monads and how to get my effects to play
nicely and just like fighting with the type system.
Jonathan:
So, I wanted, my goal was to get better at Haskell and I did say that to him,
but I also gave him some more abstract and general goals. And so maybe, it
ended up not working out. I did the 10 sessions and I didn't carry on. But
maybe the reason it didn't work out is because I was too vague from the outset
about what I wanted. I don't think I even understood. What I really wanted to
do was to get a job in Haskell, but I thought that I wanted to understand
general Computer Science Principles better.
Jonathan:
And so, he had me go through these modules. And I learned stuff like how to
encode some types in object-oriented languages. That was an interesting one,
like the visitor pattern. I learned, he had me do some exercises on the state
monad laws, so I get after a get should be the same as just the one get and
there's a couple, but. And so, that was interesting, but I think the main
lesson that came out of it was that there is something to object-oriented
scholarship.
Jonathan:
So, and probably the best paper he gave me was, I think it's on abstraction, by
James Cook. James Cook has a couple really good papers and it got me thinking
about law abstraction, but also, what does object-oriented programming has to
offer. And I do try to be even-keeled and balanced in my perspectives on
things. And so, while I love functional programming, I really do want to give
object-oriented programming a chance.
Jonathan:
And so, I do wonder why do we speak so negatively of it in the functional
programming community? Why is there this huge rift? Are there not ideas that we
can take for a majority? Why do I personally struggle so much with
object-oriented code bases that I have a really hard time cutting through the
complexity and understand them? So, it led me down this path towards data and
co-data, which has been a bit of a theme, a bit of a research theme for me in
the past year. I've let it go a little bit, I would to come back to it, but
yeah, that's been an interesting pursuit.
Jonathan:
So, I guess the reason I chose to get the coach was I was willing to exchange
money for an expedited improvement. And the best thing that I got out of
coaching was an interesting perspective on object-oriented programming and
a nuanced view of what object-oriented programming is.
Sandy:
I've heard you mentioned this before, your research interest in data versus
co-data. And it sounds to me like that's quite tied to the functional
programming OOP divide? Do you think that's true? And if so, could you speak to
it a little bit? It's not immediately clear to me what the relationship there
is.
Jonathan:
So, I should provide a caveat that I'm not a PL academic. I'm trying to
understand these things, but I'm not sure that I entirely understand, but I'll
give it my best shot.
Sandy:
Yeah, I don't think being an expert is necessary here. If it were, none of us
would ever talk about anything, right? So.
Jonathan:
Right. So, the classic example of co-data in a functional programming context
are streams. But really what co-data is, is it's the production of a value from
substructure. So with the stream, you can think about it, you always define the
stream in terms of how you consume it. And so, in an object-oriented language,
objects are co-data because they're defined by methods implemented on the
object that implicitly consumed the object structure and produce something.
Jonathan:
So, a concrete example of that would be like a class that represents an
infinite list of numbers. And you can imagine that internally, it just starts
at the number zero and then when you ask for one and increments it and gives it
to you, when you, so there's a head function or a head method say. And then
maybe there's a take up until and I will count out the numbers and give you
those. But implicitly, each method takes the self or the this argument, so it's
consuming the larger object structure. It can reference the internal state and
produce some value for you.
Jonathan:
Another way to think about it, and so I guess the data corollary is just or
abstract data or sorry, not abstract, algebraic data types that we're all
familiar with. And I think that's actually, that gave me some insight into why
Haskell spoke to me so much early on is because with data, you're
constructively building something up. It's a lot easier to visualize the domain
that you're trying to express. With objects, you're defining your problem
domain in the negative. You're defining it in terms of how you consume the
data.
Jonathan:
So, I think object-oriented programming is just from our perspective is more
complicated. But it gets more interesting because you can define data in a code
data base language and you can define co-data in a database language. So, you
can describe the other one in a separate host language. So, I have a GitHub
repo where I try to express co-data in Haskell. And from the Cook paper and
a couple of other papers that I've read, it's become clear to me that the core
of co-data is abstraction. And that makes sense when you think about it as an
infinite structure. Co-data is infinite, because it's self referential.
Jonathan:
I'm probably not explaining that in a great way. But the co-data is abstraction
and I think it led me on a different journey, which was like, "Okay, how do we
express abstraction in Haskell? And how can we use that effectively?" And
I think then that becomes a software engineering question. So to summarize,
co-data is directly connected to [inaudible 00:31:47] program. Data is
connected to functional programming. You can implement each other into other
languages and there is something, in my opinion, more concrete about data and
something about co-data that is related to abstraction.
Sandy:
Something you said about defining co-data in terms of how you use it, it
reminds me of continuation passing style.
Jonathan:
Yeah.
Sandy:
Is there a relationship there that you're aware of?
Jonathan:
I think that co-data is connected to continuation passing style. I think if you
look at final tagless encoding, I think that might be co-data and this relates
back to the category theory of it, where code data is a final co-algebra and
data is, I think, an algebra or an initial algebra. I'm probably getting that
wrong. There's actually a really great tweet recently by someone on Twitter,
I forgot their handle. But they're talking about how lenses describe
co-algebraic composition, so, lenses are just composition of co-data. And then
it all makes sense, because in object-oriented land accessing nested structure
is really easy. You just chain dots. And in Haskell, it's pretty hard and it's
because you're trying to talk about co-data composition in a database language.
Sandy:
That's a really interesting insight. I think I'm going to need to wrestle with
that a little further, maybe offline.
Jonathan:
Yeah.
Sandy:
Maybe see that the-
Jonathan:
I think it's, yeah, lenses are co-data composition.
Sandy:
To pop the stack a little bit, I was wondering what do you think makes a good
programming coach? And is that the same as what makes a good coach in the more
general sense?
Jonathan:
So, I think in a general sense, a good coach is someone who understands your
goals and helps you get there. So, that might have been why there was a little
bit of friction between me and Jimmy. Granted every session was great and he's
a great coach, but it didn't get me closer to getting a Haskell job, which
I needed to be honest about being my ultimate goal. I think being a programming
coach is particularly hard, because programming is really overloaded. There is
programming in the sense of a boot camp student who wants to just write React,
and that's totally fair.
Jonathan:
And there's functional. There's different disciplines of programming that you
can learn about. There's an academic aspect to programming. And so, it's really
unclear what you want to get good at. And there's also like just software
engineering principles in general, which is a fuzzy discipline. It's really
hard to nail down, but is obviously fairly important. And then on top of that,
all these things bleed into each other.
Jonathan:
And you can even see that from my investigation into co-data where it became
obvious that okay, at the core of co-data, there's something about abstraction.
Abstraction is this fuzzy notion in software engineering. It's a really
overloaded term. Those, I mean abstraction by putting an interface on
something, more like an existential type. That's actually how I did the co-data
encoding in Haskell was heavily using existentials.
Jonathan:
But you can see how the academic discipline of understanding co-data, final
co-algebras, initial algebras bleeds into this fuzzy idea of abstraction, which
is in some way related to interfaces and that's a huge aspect of software
engineering. So, it's really easy to blur the lines. It's really easy to talk
past each other. And it's really hard to move someone towards their goal and
even understand what they're trying to get out of the coaching session.
Sandy:
I've done a little tutoring myself, as the tutor and I found that was the
biggest challenge for me was trying to get a sense of what was the student's
goals. And so, it's nice to know that it's not just me who has that issue.
Jonathan:
Well, it's understanding their goals, and then it is also understanding how to
best move them forward. And also, hopefully, your skills align with their
goals. It's very easy, I think, as a coach to try and push the student towards
what you're interested in. And it's very hard to genuinely engage with them on
their terms about what they're interested in. Kind of reminds me of
a therapist. When you go to a therapist, a good therapist will not say what you
want to hear. They'll help you come to a conclusion yourself. And I think it's
really hard to be unopinionated like that when you're talking about
programming.
Sandy:
So, being a software engineer is like being a-
Jonathan:
Being a therapist. No, no, no. No, no, no. We just all need therapists.
Sandy:
You put together the Toronto Haskell Meetup and it sounds like inadvertently,
you did quite a lot of tutoring through that. And I would love to hear the
story of how it got put together and what happened there.
Jonathan:
Toronto actually has a surprising lack of functional programming. There's
a couple of closure companies, but there's not a lot of strongly-typed
functional programming. And because of that, there's not a lot of a community
around it. When I looked into it, when I was getting serious about Haskell and
really want to get better. Obviously, if I'm going to pay a coach, I'm also
going to go and seek out the community and try and get better that way. And it
wasn't there, but I found remnants of it. There was an old Google Groups about
a Haskell Meetup from five years ago. There was a secret CS cabal that
I couldn't really figure out how to get an invitation to.
Sandy:
That's what makes it a secret.
Jonathan:
Yeah, exactly. So I said, "Okay, if I can't find the community, I'll just
create one. There's obviously people who know this stuff in the city, because
there's the old groups. So, I'll just make the meetup and then all these
experienced Haskellers will come and I'll get really good at Haskell." And
obviously, it wasn't the case, so but when I made the Haskell Meetup, it became
very clear that there's a lot of people who know nothing about Haskell who are
very interested in learning it. And those were all the people who came. Lots of
people who hadn't coded in Haskell ever or people who are on the same level as
me who are going through learning a Haskell and the classic Haskell learning
materials.
Jonathan:
So, I ended up having to lead most of the meetups. And I remember my poor
girlfriend at that time, Claire, I was slaving away all week to learn material
to present at the meetup. And then I'd be gone for three hours during the
actual meetup, I'd come home and bring her cold pizza from the meetup. But
yeah, I basically, ended up doing a lot of teaching, and it was really good. It
really accelerated my learning, but it was a lot of work.
Sandy:
What do you think makes a good community?
Jonathan:
I mean, it all comes down to engaged community members. Luckily, there was
another developer who was maybe slightly ahead of me by a couple of months in
terms of this Haskell learning, who was also interested. And so, he shared the
burden of building the community. He came up with some of the ideas with me.
The community was good, but we had a very spotty attendance and that made it
really hard. It wasn't easy to predict how many people would come. It was hard
to get venues because I couldn't give concrete numbers. So obviously, an
engaged community.
Jonathan:
I think, what it takes to have an engaged community is consistency. So,
I noticed there was a huge uptick in attendance and repeat attendance when we
standardized on the day of the month that we would show up. And we were able to
get a more stable location that would host us for a couple of consecutive
months rather than having to get a different location every time. So, just your
goal as the person who's interested in building the community is to make sure
that you provide the foundation for an engaged community, I guess. And then an
engaged community is the key to a good community.
Sandy:
As a follow-up, how can members of a community contribute to the community? It
sounds like being engaged might be your number one answer on this? Is there
anything else that the members can do to help build it without necessarily
being organizers?
Jonathan:
Yeah, honestly, producing content is the biggest thing. I got a lot of thanks
for the pizza, I got a lot of thanks for finding the location, I got a lot of
thanks for being there early and staying late to close it down. But by far and
away, the biggest time commitment was generating the content. And so, if you
want to be an engaged community member, offering to give a talk is so important
or even offering opinions on how to direct the content. Because I found myself
a lot of the times, sending out polls on what people wanted to hear about and
nobody would respond. Yeah, so that's definitely the number one way to
contribute is providing content because it's the number one time suck.
Sandy:
How do you maintain motivation in that? It feels like you're producing so or
you're giving so much to a community and it feels like they might not be giving
back as much as you'd like. How do you maintain just excitement for it?
Jonathan:
Well, I think for me, it was dumb blind faith that Haskell is the answer.
I always say that I have like you know how people can hold three or five to
seven things in their head at once? I think my number is closer to three, but
Haskell holds a bunch of things in its head for me, so that's why I it so much.
It allows me to even function as a programmer. So, Haskell really did seem the
answer to all my problems, so I think that's what kept me going.
Jonathan:
Also, I think it's important to say that I was inspired by a lot of other great
Haskell communities. At that time, Haskell exchange was massive and I'm glad
they're back. Also, there's the New York Haskell Meetup was really active and
it was nice to see them. I think there was a smaller than the New York Haskell
Meetup, but there was a Vancouver Haskell Meetup. So, it was nice to see
a reference point within Canada to go off of. So I think the other Haskell
communities offered a lot of inspiration. And at that time, I was on house for
FP Slack a lot. And so, that was nice to see as well, like a digital
correspondence community. So yeah, I think the outer communities were the most
inspiring part.
Sandy:
One of the issues I find with Haskell is everybody who engages with it seems to
really love it but there almost aren't any meccas, right? Almost all of it is
online. And do you have any advice for people who'd want to try and build
a Haskell community locally, in order to get more of that, that vibe in person?
Jonathan:
I don't think that it makes sense to have one overarching Haskell Mecca.
I don't think it will ever work out. I think people need to find communities
that can better shape themselves to the needs of the individual users. So, for
example, Toronto Haskell group is a great example where we were comprised of
beginners. I desperately wanted us to be a bunch of expert Haskellers and for
me to be the dumbest person in the room, and therefore, learn really quickly.
But that just simply wasn't the case, so I had to tailor the content. So,
that's like a little aside about a Haskell Mecca.
Jonathan:
But building local communities, I think it's important to listen and engage
with the community members. It is very similar to AB testing or user interviews
from an industrial perspective. It's important to have constant touch points to
make sure that you're actually accomplishing something worth doing. And then
also, it's really helpful to find larger organizations that can help you out.
So, I was lucky.
Jonathan:
I had to find a ton of spots to host it, but there was a tiny crypto exchange
that did Haskell and so, they hosted us a couple of times. There was
a university where there was a PhD professor who was into Haskell. And so, she
let us use a room in the university for a little bit. There was a Scala company
that was desperately trying to hire, so I tricked them into letting us use
their office. So, these larger organizations definitely helped.
Jonathan:
The other one I was looking for was to embed the Haskell meetup within another
larger community. So, I was looking for something like there's a closure
community. I went to a couple of their meetups. It turned out, they were having
some of the same problems as us, so I couldn't really turn to them for help,
but I was looking in that direction. So I think, yeah, if you can find a big
brother to take care of you that can help you get the community off the ground.
Sandy:
About getting into programming, you said a quote, "Deep down, I had this
reverence for Philosophy. I truly believed it was a great foundation that set
me up for success." What did you mean by that?
Jonathan:
It was the direct subject or the subjects that directly map to something in
programming like analytic philosophy, logics, that kind of stuff. But I also
think, some of the softer philosophical disciplines like ethics, theories of
justice, meta ethics can be very useful as well. So, maybe I'll break down meta
or metaphysics, philosophy of language, and analytic philosophy are all
extremely logic based and very heavily formalized. You could probably even use
theorem provers to help you write a paper in those disciplines.
Jonathan:
And then there's the history of Philosophy, which is a bit soft. There's
a Philosophy of the mind. There's the schools of ethics and those are a bit
softer. But what those really helped me with was being able to hold two
positions in the same argument at once. So being able to, it's not quite
looking at something objectively, because especially with ethics, there's
really no objective answer.
Jonathan:
But being able to entertain an alternate position to your own, I think is
a really useful skill. I think it translates to programming really well,
because there's multiple ways of encoding the same thing and they're arguably
equally as good. And so being able to, sit there and maintain both perspectives
can be useful. It's also just useful like human skill to be able to see
arguments from the other person's side. But yeah, I definitely think that's
helped me on my programming journey.
Sandy:
In retrospect, do you think that your reverence for Philosophy was well placed?
Jonathan:
A lot of it is a bit silly. I mean, I think I even felt this at that time that
you're studying things that are patently wrong. You know that Plato had this
conception of the Earth as a plenum, which is a solid physical mass. And the
only thing that that caused there to be different textures and different
densities was the swirling currents of this mass. So, he talked about rivers
and eddies, and that was what made things hard or not and it's just obviously
wrong. I mean, it's not entirely wrong if you think of air as being just less
dense particles. But the way that Plato meant it, it was wrong.
Jonathan:
So, there's something that that does feel a bit silly about that. At the same
time, I think there is a redeeming quality in being able to just like treat it
metaphorically or trying to read it graciously. I mean, it's definitely
interesting from a historical perspective. But I guess, to answer your
question, I think that there are a couple of disciplines in Philosophy that are
really worthwhile like logic, meta ethics, maybe ethics, those things.
Philosophy of language is really good.
Jonathan:
But there's a lot that if you're looking for something that's practical, even
from the [inaudible 00:49:39] definition of what philosophers would call
practical. You're just looking in the wrong place. Actually, that there was an
initiative in the Humanities Department at my alma mater to add a coding liner
where they, because they're having trouble getting people into the Humanities.
There's a lot of people saying there's no jobs, which there isn't, so they're
trying to add coding.
Jonathan:
And I thought that was just completely wrong. I thought, I'm like, "You're just
deceiving people. If you want to do programming, do computer science, do a boot
camp. Learn yourself. Don't do a philosophy degree with a computer science
minor." It's just not going to, and it wasn't even a computer science minor,
I think it was a couple of courses and they would call it Humanities with
Engineering or something like that. It felt very silly to me.
Sandy:
True or false, Philosophy is just poorly done computer science?
Jonathan:
I'd say false, because I think that there is a more human aspect that is
interesting to get into. I think early on in the conversation, I talked about
people enjoying the ambiguity of language, specifically, I'm thinking of
English. English is an incredibly ambiguous language. And I think there is
something to be said for living in ambiguity. I think a lot of very powerful
art comes from the fact that the interpretation is ambiguous. So, I do think
there is room for Philosophy.
Jonathan:
On a related note, they used to say in the Philosophy Department, if Philosophy
has done its job right then you no longer need philosophy. And what they meant
is that early on, we had natural philosophers, but Philosophy did its job in
establishing a foundation and they became scientists, and you no longer need
philosophers. You have Philosophy of science, which is like a meta study, but
hopefully, that will do its job correctly and obviate itself as well. So,
I think Philosophy has this contradictory role where it's used to talk about
things that we have imperfect knowledge about. And then as we refine our view
of the subject, Philosophy very kindly takes a backseat and the applied
professionals takeover.
Sandy:
That makes a lot of sense to me. Thanks. You said that one of the best skills
of your philosophy training was the ability to entertain positions that you
don't necessarily believe in. What do you mean by that? And why is that an
important skill?
Jonathan:
So, maybe I can come up with a motivating example, first and then I'll try and
relate it to software. There's the obvious case where it's a debate where there
it's like, "Yes, this is right or no, this is wrong." And to be able to argue
both sides is clearly against you. But another one is when it's ambiguous or
you're entertaining models of the world that you know are incorrect, but it's
worthwhile to entertain the model anyway.
Jonathan:
So, a good example is in meta ethics. So, ethics is like, "Are you
a utilitarian? Are you a deontologist? Do you believe in maximizing the goo and
that's a normative structure? Or do you believe in these hard and fast rules
that you should obey and that dictate what's good or bad?" Meta ethics is like,
"How do we even talk about normativity? How do we even talk about what's good
or bad?" And so there, there was these school of emotivists who said that any
ethical phrase is actually just an exclamation of emotion. It's not even true
fact.
Jonathan:
So when you say like, "Hey, don't steal my bike," that's a moral claim. You're
saying, "It's unethical to steal my bike." The emotivist would say that that's
tantamount to going, "Urg, I'm unhappy that you're stealing my bike," which is
a funny thing to think about. Then there's the realists who go like, "No,
ethics is real and objective, and it's out there in the world." And when you
say, "Hey, don't steal my bike," you're saying, "Hey, there is a fundamental
law, whether it's maximizing the good or the principle that you shall not
steal, but you're breaking it."
Jonathan:
And so, these factions battled back and forth and the prevailing thought
nowadays, or at least back when I studied philosophy was error theory, which is
basically, that when you make an ethical claim, that is just wrong. That is not
true fact. You can't say, "Yes, it's good that they're stealing the bike, or
no, they're bad that they're stealing the bike." It's more like, "Hey, can you
close the door?" That's a statement that is neither true or false, it just is.
You're saying, "Hey, don't steal my bike." And so, the error theorists
acknowledge that it is an error to make an ethically charged claim, but it's
useful to conduct ourselves as if it's real.
Sandy:
Is the error here sort of a type error, in some sense?
Jonathan:
That's interesting. I didn't think of it as a type error, like an undefined
behavior maybe. I don't know. It's funny to think of, to look back on a subject
or a question that I found really interesting and apply what I know about
computers to that now. But the path that I was going with that is that these
error theorists live in this counterfactual world where they say, "Well, if it
makes sense to make an ethical claim, what is the fallout from that? Am I then
a utilitarian? Am I done with deontologist?"
Jonathan:
And it gives you this foundation to speak about ethics, even if the foundation
is somewhat shaky. So, you're able to not throw everything away while still
remaining logically consistent. And there's like it goes back to this two horns
problem and all of this stuff. But the interesting part is being able to hold
those that contradictory idea in your head and still make progress. So, that's
the concrete example.
Jonathan:
How does that apply to software? I think program design is often about forks in
your or decisions that you have to make about your program, but forks as you
move forward. And so, being able to entertain two of those forking approaches
is really valuable. That's a clear concrete example, I think. I think what's
nice about type functional programming, to go on tangent, is that it allows you
to encode those counterfactuals or those maybe not counterfactuals,
hypotheticals about how your program could be in types, see how things play
out. It's like a more zoomed out view.
Jonathan:
And you can establish whether this is a good foundation to move forward and
make progress with or if you should abandon it for something else. So, it gives
you a shortcut. And there are ways, there are tricks with types. I think you
can use to hold to different possibilities or two different possible paths in
your program at once. I might be misleading here. I'm sure someone will call me
out. But I'm thinking of parameterizing a type argument and deferring that
decision to later. That's an interesting way to keep two possible
implementations of the program alive at once.
Sandy:
I strongly believe that a lot of engineering is just pushing decisions as late
as possible until you have more information. And it sounds like that's what
you're advocating here.
Jonathan:
Yeah, yeah, I think that's right. More, I mean, I do think that's right.
I think what I was getting at or why that's so useful to me is being able to
put that stuff, put those thoughts down into the program, have it checked for
me to make sure it's consistent with the rest of my view of the world, and
being able to forget it, and then focus on a more local problem. Because again,
I have a hard time keeping a lot of things in my head.
Sandy:
To take at what, it seems like a jump, but I promise I'm going to circle back
on, you've described a lot of working programmers as being "critical or being
too abstract or getting lost in the abstraction." I wonder what you meant by
that.
Jonathan:
I don't want to be too condescending of working programmers, but I feel like
there is this, I think it's more fear of less well-tested approaches. So,
I think concrete implementation of a solution is very easy to wrap your head
around and there's not as much risk. There's not as much architectural risk as
making a higher order implementation. I think working programmers are really
bad at accounting for risk in the opposite direction, which is the risk of
overwhelming complexity or not being able to reuse your code, or there's
a myriad of other risks. It reminds me of loss aversion to humans. It's like
we'd rather come up with a concrete implementation that works today as we
expect an implementation that we're familiar with, rather than risk
overwhelming ourselves in complexity tomorrow.
Sandy:
Right. And so to circle back, I'm wondering if you can steal man the position
that maybe all of this abstraction isn't necessary. And to entertain the
counterfactual and give me a convincing argument for the other side.
Jonathan:
It always comes down to the premature optimization problem, I think, is when
I've seen the argument play out. And I mean, so if I were to take the other
side of the argument, I think I would make that I would say that you're
worrying about a problem that doesn't even exist today. I do hate that when
that argument comes up, because I feel like it's equivocation of, I feel like
we could say, "Oh, premature optimization is inherently bad. An abstract
implementation is a premature optimization. Therefore, an abstract
implementation is inherently bad." And I find that argument plays out a lot and
I find it really frustrating because it ignores all of the nuance.
Jonathan:
I don't know. I think just the abstract implementations probably require more
upfront thought. And I think the trend in software engineering has moved
towards like shipping things fast and getting something out in front of
customers. So, I think we've lost a lot of that upfront for a thought. And so,
then I think the state of the art and the skill that industrial software
engineers are trained at is concrete implementation. So, it's like this
negative feedback cycle. I would love to champion interesting higher order
solutions in an industrial settings, but that remains to be seen, I guess.
Sandy:
That actually dovetails really well into my next question, which is what are
some of the lowest hanging fruits in civilization right now? And are there any
domains in which you think, are just waiting for a computing revolution, in the
sense of throwing computing at the industrial world and getting really good
rewards from it?
Jonathan:
Maybe, I can frame it a little bit differently. I have been experiencing
recently there's a lot of questions of the structure. Why is it not the case
that we do these things? So, one example is like, "Why is there not an
industrial strength database of the stripe of PostgreS, that has a logic
programming front end. Logic program, it's funny, because I used to have this
strong reverence for SQL. I thought, I was like, "It's a beautiful, it's a DSL.
It's declarative. It's super performant. I can learn it really easily. It's
great."
Jonathan:
But as I learned a little bit about logic programming, I realized that SQL is
it's like chess and logic programming has a very few things. It's got rules and
predicates and from that, you can build up these very expressive queries.
PostgreS has select, which can only go in a certain spot, and where, which has
to come after a group bob. But it's got all these peculiarities that I think
are irrelevant to what it's actually getting at. So, that's really interesting.
I know there are databases with logic programming front ends like Datomic, but
it seems like it just hasn't taken off at all.
Jonathan:
I'm interested in the work of the category theory database work. I was hoping
that maybe they'd be agnostic to a front end. That's pretty interesting to me.
I've been thinking a lot, too, about permissioning. I feel, sorry, these are
all very concrete examples. But they're the ones that I bump up against every
day because every web app that I've worked on has deferred the decision of
being parameterized over permissions. They'd already always move forward with
the assumption of one user type has access to everything. And in the end, they
have all these really ad hoc solutions that add permissions back in.
Jonathan:
And so, I've been trying to think like, "How can you get a really beautiful
declarative permissioning system that you can use from the beginning, and it
adds no technical overhead?" It's as easy as the single user implementation and
then you can, in the future, add permissions. And so, there's a really cool
library. I think, by Simspace called Avaleryar. It's a bit of a mouthful, but
it's a logic programming interface to permissions.
Jonathan:
And I think that's really compelling, like outsourcing your permissions to
maybe a separate service or something and you just ask a question. You add this
question to the beginning of every auction. "Hey, based on some environment, am
I able to do this action? Yes or no." And you run it through this rule system.
And it's probably very easy to test. You could probably print out nice
documents of what your permission system is. So, that's another concrete thing.
Jonathan:
I know it's all logic programming, but I think, really, that's an accident.
What I'm really interested in is how can we throw our computer science
knowledge at problems to make them more declarative and make it easier to make
higher order decisions or more abstract decisions up front.
Sandy:
I'm so sympathetic to that goal. What about in context outside of programming,
of society more in general? Maybe like could you see a world in which we throw
computation at law or decision making or monetary policy or that sort of thing?
Jonathan:
Yeah, actually, well, so I'm a bit embarrassed. But I'm interested, I do want
to start my own startup and there's a bunch of ethical things that fall out of
that about believing in the Silicon Valley's startup ecosystem and all this
stuff. But I guess, I really want to have an outsized impact on the world. And
so maybe, that's just a dream that never gets realized, but it's informed a lot
of my thinking. And one of the things that I've thought about a lot is
government. I believe you're in Canada, as well and so, you're probably keenly
aware of a lot of the government inefficiencies. And as painful as someone who
considers themselves very liberal and believes in government programs and
social programs, but I have a tough time with the inefficiency of government
and it's really hard to reconcile those two beliefs.
Jonathan:
So, I would love to use technology to make government more efficient and
I think that's really actually not that wild of an idea. One of my friends is
a government or was a government worker for a long time and she had to deal
with a botched payment system that they've spent billions of dollars on. And
I was like, "Payment systems are part and parcel for tech startups. It's
a solved problem." How did we spend all this money and not end up with
something usable, and basically have to scrap it? So, that's a very obvious
example.
Jonathan:
Another one that's been interesting to me is the health care system. Canada has
very progressive health care ideals. The healthcare system has a lot of
problems. How could we apply tech to that? There's a lot of things with file
formats being incompatible that causes a lot of stress and that just seems like
very low hanging fruit to me. Parsers are very easy to write in functional
programming languages, so that's probably why I see those problems as low
hanging fruit.
Jonathan:
And then the other one is taxes. I'm not sure that computation can solve this.
Even though you would think just get smarter computers that know all the rules
and have perfect information and have them work out the taxes. I think there's
also a responsibility of the government to simplify the tax code. I think that
complicated tax code provides weird edge cases for people to abuse. But maybe
it'd be interesting to work out from both angles and have the government
simplify the tax system and maybe some property-based testing for loopholes in
the taxes. That's a wild idea, but something that seems like it's directionally
correct. So, I think there's a lot of room for improvement in that area.
Sandy:
Are these particular problems that you could think of throwing a type system
at? It's one thing to say technology would help here, but do you have a sense
of what exactly or what might be a promising approach?
Jonathan:
I think definitely a type system would help with taxes. I wish I just got
a compiler error.
Sandy:
Rather than an audit.
Jonathan:
Yeah. Yeah, I mean, it's such that I think that's one of the beautiful things
of Haskell in particular is that there's so much, so many interesting avenues
of research like logic programming embedded in Haskell, property based testing,
really advanced expressive types. I think as Haskell programmers, we're exposed
to these really beautiful and elegant solutions. And you can't help but see
them in the real world, like a type system for the taxes, more property-based
tests.
Jonathan:
It would be nice if our taxes were algebraic in some way and we could just fold
over them and come up with a number at the end. Or if we could, if our tax
rebates could do some automated clearing when we combine them. It's like it's
easy to play this game of thinking of specific and interesting examples. The
harder thing is dealing with the governments in practice. So, I don't actually
think it's a computation problem, I think it's a people problem.
Sandy:
I think all problems are people problems, yeah.
Jonathan:
That's true. But I've told people who are entrepreneurs about the kinds of
ideas I have and almost unanimously, I'm met with the response like, "Don't do
anything that touches government." Because the whole thing with startups,
you're supposed to move fast and the government is very slow. So yeah, it seems
I've been told it's a nonstarter, but I'm still holding out hope.
Sandy:
So, Jonathan, something that really impresses me is your studiousness. Your
bookshelves are full of serious textbooks. What's your process for getting
through them? How do you stay focused, and what's your purpose?
Jonathan:
My process for getting through them is not that effective. I just, I buy
whatever books are interesting to me at that time. It helps me chart a path for
the learning that I want to do by buying books that are relevant to my
interests at that time. So for example, I've got a slew of category theory
books, but I've hardly gotten through the first one. I've got some startup
business-related books, and I'm starting to work through those. And I like to
give myself the option to read whatever's interesting to me at that time.
Jonathan:
A habit that I'm actually trying to get into is allowing myself to not get
through a book. Because what I've actually found is that is a lot of books are
not that great or not necessarily right for me at that time. So, allowing
myself to get a quarter or halfway through a book, realize that I'm facing more
friction than the benefit that I'm getting and put that down to start something
else has been really helpful. But yeah, I love books. I think that they're
really important. I think it's still a great way to learn. I try to augment my
reading with something else to help my retention.
Jonathan:
So for example, we have planned to read conceptual mathematics and we're going
to try and prove some of the some of the theorems in Agda. I think that's
great. I mean, there's something as simple as taking notes, but generally,
I try and come up with a crystallized artifact from my reading of the book. And
another good way to do that is a reading group and maybe record your sessions
or something like that. But just trying to push myself to be more active
because the flip side is it's very easy to just buy books and skim through them
and feel like you're making a lot of progress and ticking things off list. And
so, a large portion of my learning time has been spent trying to find ways to
not just tick off boxes, because it feels good.
Sandy:
I think that's extremely good advice. I find, often I don't have the self
control to put down a book where I will just push through it and then because
it's such an awful experience, I also have to stop reading in general. And so,
maybe I'll take some advice from you there.
Jonathan:
Yeah, a good example of that for me was Bartosz Milewsk's Category Theory for
Programmers. It's a bit of a tough book to get through because it wasn't
initially set up as a book. It's a series of blog posts, but I've come back to
that three or four times, where I got to a point where things really didn't
make sense and I pushed and put it down and then when I came back, I was able
to get a little bit further. And I still haven't finished the book, but that's
just an example of how, it doesn't necessarily mean that the book is bad, it
just, it might mean that you're not ready for that kind of material.
Sandy:
Yeah, and there's also this idea that not every book is going to be good for
everybody, right? And some people are going to just need different things from
different places. And so, to use something a little more existential, offline
you said that one of your fears about being a nonstandard programmer is that
you're unlikely to ever be best in class technically. And I'm wondering, what
is it that you meant by that? What does it mean to be best in class? And why is
that important to you?
Jonathan:
So, I'll start with why it's important to me. I think the whole point of this
game of life is to try and have as large of an impact as you can. In my case,
I'd like to have a positive impact on the quality of life of a large swath of
humans, so that's a rough, abstract goal. And so, I think the more interesting
part of that question is what does it mean to have to be best in class. And
what I realized is that with a lot of our peers, I'm A, very far behind just
from the time that I started learning programming. But also, I just don't run
in academic circles. I'm not reading papers as studiously or as frequently as
some of these people.
Jonathan:
And so, say being the best type theorist is it's something that I'm probably
never going to achieve, at least in our group. So, what I try to do is I try to
reframe the question or reframe the game and adjust the rules such that they're
conducive to me being best in class. I know that might sound like cheating, but
I do have a lot of experiences that I think provide me advantages over some of
the people that we run with. So for example, I do have a decent amount of
experience in software engineering roles. So, I probably am better at React
Eli's than some of these people.
Jonathan:
I also my philosophy background, I think is really helpful. And I think that
I do have some interpersonal skills and strikes that I can use to position
myself in a way that I can be best in class at something. And I think that's
really good, because hopefully, I can work with the type theorists and the
programming language experts, and the next experts and all those people. And we
can work together to achieve something greater than what we could have
individually. So, that's kind of the game I'm playing as I'm trying to figure
out how I can have a significant impact, reframe the rules such that it fits my
skill set, and then try and double down on my strengths.
Sandy:
Maybe a different way of saying that is you're more aware of where your
competitive advantages are and playing within them?
Jonathan:
Yeah, exactly, exactly.
Sandy:
So, one last question here for you, Jonathan. And that is, what ideas do you
think more people should understand or be aware of? And I don't mean like
programming ideas, but what big life ideas do you suggest that people pay
attention to?
Jonathan:
There's something that I've been thinking about a lot particularly with some of
the group circles that I run in. Some of the groups that are interested in
these more abstract philosophical ideas in computer science. And what I'm
seeing is that there's a lot of really smart academically minded people that
are really comfortable playing around in their abstract ideas. They're happy to
talk to each other about structures that seem like they have no application to
the real world. And I think that we could maybe do with pushing ourselves to
try and apply those ideas or even to just try and apply ourselves to more
practical problems and push ourselves to collaborate and come up with something
more serious.
Jonathan:
It's obviously very scary to try and set a goal because as soon as or to set
a real world goal with implications and that's very concrete as to whether
you've achieved it or not, because then you necessarily invite the possibility
for failure. And I guess what I'm saying is I would suggest that maybe we'd be
more courageous and expose ourselves to the chance of failure more because I do
think that the payoff is worth it. And I do think we complain a lot about the
state of affairs of society, and I think we're more than capable to affect the
changes that we want to see.
Sandy:
That as a fantastic answer. And thank you so much for being on the podcast
today, Jonathan. Really appreciate you being here.
Jonathan:
Thank you, Sandy.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment