Transcript: Django @Instagram - Carl Meyer
Hello, and welcome to Django Chat, a fortnightly podcast on the Django web framework. I'm Will
Vincent, joined by Carlton Gibson. Hi, Carlton.
Hello, Will.
And this week, we're very pleased to have Carl Meyer join us. Welcome.
Thank you. Good to be here.
Thank you for coming on.
Again, thank you for joining us. Maybe could you just quickly mention your backstory?
You're a big name in the Django world. But for those who don't know you,
how is it that you've come to be on our podcast?
well that's a good question um i don't know i besides we asked you yeah you emailed me and
asked me to come on no i i guess i uh i started a company in 2008 with my siblings doing a web
application development a consulting shop and we settled on django for back-end stack and so i
started building sites in Django and often fixing bugs in Django was more interesting than
building whatever the client needed so I ended up spending time doing that and
got into Django development that way I guess originally so what what version of that I mean
that was was that pre-1 when you first started getting involved it was pre-1 let me think it
was post magic removal this is gonna really be one for the old timers here um it was a pre-query
set refactor when i first started using django it was in the 0.97 days i guess which lasted for
quite some time well there's still some people on it no probably never managed to what day
and then you you're a major figure right because like so i you know acting as a fellow as i do now
like daily i'm trawling through the history of track and very often i'll come across you know
comment by comment you know how did you get involved in the mate in this um sort of maintenance
and running just just contributing or just just fixing the bugs as you said or yeah just uh
contributing and i guess having opinions um i attended that helps yeah and it happened in so
in 2008 when i started the company and started doing more with django i was living in northern
Indiana, so just an hour or two away from Chicago. And as luck would have it, PyCon was in Chicago
that year, 2008 and 2009. So I said, why not? I headed up to Chicago and attended PyCon for the
first time in 2008. And so I've been to every one since that actually happened, unlike this year.
And yeah, so I guess I attended a number of Django sprints at PyCons for a number of years in a row
and got to know the Django team, and I just became more involved.
When I think it was 2014 when you joined the technical board,
was that the inaugural technical board?
Yeah, that was the first technical board.
Yeah, I think I officially joined the Django team in 2010 maybe,
but then we had kind of the first big project governance restructuring
that Amrik Augustine spearheaded in 2013, 2014,
and that resulted in the creation of the technical word structure.
And so you must have been involved in the discussions
around the creation of the, say, for instance,
the API stability policy and these kind of decisions
where we don't, the deprecation policy,
where, you know, if we are going to change something,
we bring it in, we deprecate it, two releases later,
we'll take it out.
And that's, from my perspective, that's working phenomenally well,
especially compared to the early days when you know i was using 1.2 and upgrading and
ah it was always it was always really difficult right um so perhaps you could give us some light
in that discussion or because it for me it's just like oh wow it's but it's it's kind of why jango
is what it is at the moment yeah my memory is that that was kind of always the intent from the
beginning that jacob and adrian kind of set that uh set us down that path i think at various times
we've been more or less successful in maintaining the backwards compatibility that we intend to
maintain. But I think that was one of the reasons that 1.0 took so long to arrive because there was
I guess this idea that 1.0 was the moment when the backwards compatibility guarantees would
really kick in. And so there was a hesitance to actually declare 1.0. We wanted to make sure we
had all of the everything in place the way we wanted it. And after a while, it became clear
that that was kind of a fool's errand,
that the APIs will never be perfect.
And we were already trying to maintain backwards compatibility
even pre 1.0, because in practice,
it was a problem for people if we broke it.
So at some point, we just said,
yeah, it's time to do 1.0 now.
Yeah, but I don't recall a lot of changes
or discussions around changing that policy.
I could be forgetting something, but memory is,
we pretty much always had that intent
of giving a couple releases before changing something because okay that's interesting because
i would what would i say i'd say it's a different world now from say 1.5 1.6 1.7 where things were
still changing quite a lot and you know for good reasons and django grew with that but you know
comparing that to say 1.9 1.10 1.11 into 2.0 it's it's it's very easy to update now um and it's part
of that do you think it's just the maturity of django or do you think yeah i would put it down
to the maturity of Django mostly.
I mean, I think backwards compatibility
for a widely used library in Python is always tricky
because nothing is really private.
And as much as you might try
to maintain backwards compatibility,
it's very hard to know what people are relying on.
And I think in the 1.0 through 1.7, 1.8 era,
Django was changing very quickly
and there were major new components being added.
And I think that just made it hard
to always maintain the backwards compatibility
that we intended to.
And I would guess that if it's significantly better now,
it has a lot to do with just the core parts
not needing to change as much.
Yeah, they don't change.
Yeah, they don't change.
Okay, cool.
Well, to circle back to PyCons,
I was watching for the second time a PyCon 2012 talk
I think you gave on Django testing
because there aren't actually that many testing Django talks.
And one of the things you said in there,
which I thought, which just stood out to me was write less view code and maybe don't even test it
with unit tests, just do it with a functional or integration tests. I wonder, does that still hold
up for you? Do you still stand by that? Because I love the line you said something like, anytime I
see a view of more than 10 or 12 lines, it's sort of a smell test because I feel that way.
So I'm just curious, you know, eight years later, does that sort of general advice still
hold for you or how have your views changed how my views changed pun intended on testing in django
no no i still write short views so my views haven't changed um i think uh yeah that's still
basically what i believe i mean these days i don't it's been a number of years since i've really
written a django view to be honest uh so uh in practice it's not that particular question isn't
an issue for me but i still certainly believe in uh pulling pulling business business logic out
into testable components and isolating it from io uh in order to make things testable and that's
essentially what that advice boils down to right yeah no it's it's fantastic advice and i'm uh for
me i'm thinking of doing an in-depth django testing course at some point so i'm trying to review
to the extent there are best practices because that's one of them use pi test but it seems kind
of all over the map to me honestly aside from i don't i don't see any pure canonical way to
test in django but perhaps i'll find it yeah it's interesting uh coming to instagram and seeing sort
of what happens in a very large code base many years later uh it it certainly highlighted some
of the some of the things in early django's testing frameworks that maybe weren't ideal
like the the emphasis on the test client and on writing lots and lots of kind of end-to-end
functional tests and uh you know it's easy to say that that doesn't scale but seeing in practice
how it doesn't scale is another thing entirely you made you mentioned the big i word so i have
to ask so you can't you came to instagram it was built on django yes and then you know for me this
is you know super interesting topic because i've never worked on anything like that kind of scale
but i've worked on some big sites and people say can you scale django i'm like yeah of course you
can scale django but then there's a level above that so i guess you know what what can can you
sort of talk us through the the evolution of um to the extent you can for instagram and how they
hit those scaling problems and that you know the approaches that are needed to take and things
because it's something that i think most of us will never see yeah no it's a great question um
i gave a talk in 2016 at django under the hood in amsterdam where i really kind of go through a lot
of that history in in detail so it'd be an interesting thing to look up if you're curious
about sort of the scaling challenges as they came my memory from the research i did for that talk
is that, as you'd expect, I think the ORM was one of the first...
Well, there were some kind of funny minor things
that hit earlier on, like turns out sending an email
to the site maintainers every time there's a 404.
didn't scale particularly well that became evident early on uh but but yeah as far as
sort of big components i think the orm was the first one there was a uh there was a need i think
after about a year already to to be able to start the database and at that point it was still pre
multi-database i think uh i'm not sure multi-database support might have happened
around that time but i don't instagram certainly didn't have access to it and uh and there was no
real support for uh for sharding uh databases in the orm so mike krieger the the founder of
instagram basically sort of wrote a sharded orm kind of a very bare bones sharded orm
and moved from the django orm to that uh and then later from that to tau which is a
graph database built at facebook which is what instagram uses for the primary data store now
oh i recall i don't know here's an anecdote i'm not sure where i heard it but i believe it to be
true that in the early days uh there was a postgres issue with the space allocated to users
was so big that they couldn't figure it out and i think frank um at uh revsys there was some hack
at the time but helped them with but just these crazy scaling challenges i think it was just
you know the two founders and pushing the limits of software at the time yeah one of the funny
stories that oh definitely people told when i first arrived at instagram was in the early days
uh once instagram sort of really kind of made it mainstream and i think justin bieber was one of
the first big instagram users and uh because of the way that the sharding scheme was done
essentially like a user and all of their media were sharded together and which makes sense for
sort of access patterns but uh it caused a bit of a problem when you have sort of very popular users
like justin bieber would make a post and then everybody you know goes to like and comment on
that post and all of a sudden you have a ton of database activity all concentrated on one shard
uh and that apparently caused this was before my time at instagram but apparently that caused a lot
of problems and sort of memorizing justin beaver's user id was a requirement for uh instagram
operations for a period of time there because sort of every time he posted made a popular post it was
sort of an operations emergency that everyone had all hands on deck kind of thing but those things
are in a lot better shape now yeah i could i could similar stories about um twitter who where
they got popular users they sort of pre-populate that in a separate thing whereas the the average
user you well not you or me but like just a small small people you'd fetch them on demand because
they're not many fetches so python instagram you're wearing a python instagram shirt uh so
they're still using python but they're not using so much django can can you talk about where the
stack is today in terms of is there any django left in there and how much is python as opposed
to other back-end languages uh i mean instagram server is still a big python code base a big
and it's django at the core i mean it still runs through the the django request handling stack and
the middleware and views and url routing all of that is still django would look familiar to any
django developer just very big lots of views lots of urls lots of code um there's a lot of i mean
obviously the orm we don't use anymore the admin is very much based on the orm so that's not in
use anymore i mean there's a lot of components where django provides kind of pluggable backends
like sessions and authentication and for all of that stuff we've essentially rewritten the entire
system but we're actually still using the uh sort of django api for those things because it's
pluggable so i would call that a success story i mean in that we've been able to very smoothly
migrate away from the components that uh that no longer worked at our scale in many cases without
even having to change the client code uh touching those subsystems because django provides this
ability to swap out the uh swap out the back end so yeah and you know the django core request
support that we still use we're 100 async now so we've had to uh i mean already a few years ago we
kind of forked and modified a bunch of that to support uh async or concurrent handling of multiple
requests using async io uh so there are have been some changes but it's kind of cool that you still
got the that core request bit in there because i gave a talk at django con last year the one
that happened not this one that didn't um but talking just about that that core land there's
only like 160 lines in base handler right there's nothing there so there's no the point i made in
the talk was there's no room for it to be slow and clunky i mean that django sometimes gets
described as going down but when it's not doing anything it can't you know it can't be it's still
doing that same thing that all the red frameworks are doing so that's kind of that's really nice i
was wondering would would instagram at the scale they're at need needed to have moved away from
python to a you know a faster language quote unquote i mean you know there's certainly a
discussion of that uh python is not particularly efficient and how it uses uh cpu and there would
be more efficient languages and that would certainly save on server costs but uh there's
also a lot of code that would have to be rewritten and that also has a cost so there's certainly
always a debate about the pros and cons there uh so far the conclusion has been that we'd rather
work with python and try to improve python and make it more efficient uh rather than trying to
rewrite all the existing code in a different language okay that's cool and you said you said
you said improve python there so can you what might that mean i mean yeah well i mean that's
the team that I work on now is kind of actively looking at the Python language and runtime and
where we can tweak things to get a little more efficiency out of it or more developer efficiency.
So one of the projects we've talked about publicly is something we call strict modules. So like one
problem that we have with Python is the fact that when you import a module that can execute
arbitrary code which can do anything it can go out and talk to the network it can end up being
very slow it can fail and when the code base gets very large and there's really so so you can have
all these side effects of import and sometimes one side effect of importing one module can be a
prerequisite for some side effect of importing another module so they have to be imported in
a certain order. And that situation can arise even accidentally over time. But yet the order
that modules are imported isn't really fixed or determined anywhere. It's kind of an emergent
property of the entire system and all the imports and all the modules. So you end up with this very
kind of fragile state where somebody can remove or add an import in some module in one part of
the system. And that has a cascading effect of changing the order of imports. And then something
can fail just because two modules are being imported in a different order. So another side
effect of that or another consequence of that is that if you make a change to a Python module
and you have all of these modules loaded and running in your web server, say you're a developer
working on the code base, you make a change, there's really no safe way to say, let's just
reload the one module and sort of hot patch this one change that's been made. There's nothing you
can do that's safe other than start from scratch, start the entire process over again, and begin the
entire process of importing and loading all those modules. And, you know, when your code basically
is very large, that takes 30 seconds, 40 seconds, 50 seconds, a minute, which is a long time for a
developer to wait for making a simple change to one view before they can test that view in their
browser and see the effect of their change. So something that we're trying to do with strict
modules is do some static analysis to restrict what is allowed at the top level of a module
to say you know at the top level of a module you can define classes you can define functions
you can use decorators as long as they don't reach out and have external side effects
basically like you can do all the things that we normally associate with python
at the top level of a module but they have to be contained the only effect they can have is within
that module and it once you can guarantee that that's the case that unlocks a whole lot of
possibilities because now you can just safely uh re-import modules it doesn't matter what order
modules are imported in all these problems go away so that's one one kind of example of a project
we're working on more in the developer efficiency side of things okay that sounds really cool when
you talk about the static analysis i mean how does that tie into the kind of thing you see with the
um type hinting that is coming in and um like the pylance um thing that microsoft have got
doing the static analysis there and my pine related tools is it the yeah it's clearly it's
the same ballpark right so but you're using you're leveraging those yeah for sure yeah yeah it's i
mean so strict modules in particular doesn't make too much use of of uh of type hints but it's
It's definitely all in the same kind of area,
which I think is a really productive
and growing area right now of figuring out
how can we do more advanced analysis
make stronger assertions about what Python code does and doesn't do without actually having to
run the code to find out. And so type hinting is one example of that, that we've been very
excited about. We started adding type hints to our code base, I think already in 2017, maybe 20,
yeah, I think 2017 already. So at this point, our server code base is basically 100% typed,
everything has type annotations and we found that to be a big productivity boost for developers
and makes the code safer and so we're looking at you know how to further leverage type hints and
and static analysis to to make python both faster and and more efficient for developers okay and can
i ask a follow-up then because we had a discussion about whether we would bring type hints type
anything into django itself and we were the conclusion that the technical world came to
well not right now because it's difficult and you know the technology is still nascent and
so if you could give us some advice like what would you say to you know if how is it feasible
are we going to be able to get django there what should we be looking at can we start small and
grow in what just as your sort of you know yeah no i'm a big fan of of typed python i think it's
improvement to the language. But I think that the decision the technical board made on that was a
reasonable decision, probably the right decision. It is very early days still. I mean, at a place
like Instagram, we can kind of go all in on something that's still a little rough around
the edges. And our developers are kind of willing to put up with some rough edges in order to get
the benefits of typing. But for a framework like Django that is so widely used, I think it does
make sense to wait until the technology has matured a little bit and some of the rough edges
of usability are smoothed out. So I think that was a good choice. I think it's always a challenge
to bring static typing to code that wasn't developed with static types in mind, because
patterns are used that just don't lend themselves to static typing. So I think
it's been fine for us at Instagram because we don't use the ORM. There's parts of Django that
are particularly challenging for static typing that we don't use anyway. So for us, it's been
pretty easy to just have some stub files that cover the APIs that we use. And that pretty much
covers our needs as far as typing Django itself, it will be challenging to do a good job of typing
all of Django, especially given the backwards compatibility constraints. The other thing is
when we're typing Instagram code that was written in a very sort of dynamic way that doesn't lend
itself to static types, you know, if it's internal code, we can just rewrite it or, you know, change
the pattern. And for Django, that's much more challenging because of the backwards compatibility
constraints so uh i think it'd be great if someday yeah you can say for this code you have to pass an
integer not int or any right exactly and we can just you know go through the entire code base and
change all the call sites and make sure they all do the right thing and just ship that as a diff
and you know you can't ship diffs to all of the code that uses django in the world so question i
have is so you talked about what you've been working on recently but it's been what i think
five, five years or so since you've been at Instagram, there's always this, I always have
this mystery of when someone like you, so Django core developer goes to a large company, it's a
little bit of a black hole in terms of like, what do they do there? Like, how does it work? Do you
come in and they say, what do you want to work on? Or do they say you have to do this? Like how,
how does that evolve? Right. When you, I mean, you're focusing on, you know, eking out performance
in Python and, and advantages for developers, but yeah, I'm just curious what your story was like.
And if there's any sort of standard paths when, you know, a well-known figure goes into
a large company and then, you know, isn't doing open source work all the time.
Yeah, I'm sure it varies by company.
So I can only really speak to my experience in general.
And this would apply to any engineer, not just someone who's coming from an open source
community.
Facebook and Instagram have a very kind of engineer driven culture.
so you know there's a pretty wide latitude for an engineer coming in to pick the teams and the
projects that are interesting to them and then the culture is sort of you you decide what you
want to do and then you have to show that the things you did had some benefit rather than
somebody telling you what to do so there's a lot of opportunity in that it can also be a little bit
scary. Uh, but, uh, but yeah, so that was my experience coming in was that there was a lot
of freedom to, to say, well, this is, this is what I'm seeing here. This is what I think is
important for us to work on. And so I'm going to go work on that. One of the public facing things
I saw, I forget how many years ago is that there was a small team that switched from Python two to
Python three over the course of, I believe was only like three or so months at Instagram, which
was perhaps an example of people wanting to make a change, taking on their responsibility,
um but i'll link to that post i mean that was it was pretty amazing that even at the size of
instagram's code base back then a small team was able to do it relatively quickly yeah no it was
very impressive that was one of the first projects i worked on it was already uh kind of it was kind
of it had just been started when i joined so it was kind of something that was already happening
that was easy to jump in on and i thought it was important for us to do so uh i worked quite a bit
on that on that project um and yeah i mean it it felt like it took us a while but i think it was
under a year which is impressive given the amount of code that we were talking about
for django maybe this is a prosaic question but so what version of django to the extent that there
is django at instagram are you running right now yeah unfortunately we're still on um 1.8 so when
i joined in 2016 we were on django 1.3 which was already quite old at that point and uh we upgraded
to 1.8, the biggest motivation for that was to allow the Python 3 upgrade, because Django 1.3
didn't support Python 3. So we did the 1.8 upgrade, we did Python 3. And, you know, the problem at
this point is just given the amount of Django code that we use, you know, there's some big
deprecations that happened in 1.9, 1.10, things like string views went away, string view names
and url configurations went away and there's a bunch of new restrictions around like uh the
import of models files anyway some things that would be a fair amount of work for us to adapt
to and there just really isn't a lot of corresponding um benefit uh because the i mean
you know i don't think django's development should be oriented around the needs of a company like
Instagram. That's not the 90 or even 99% use case. And so the things that are being done in Django
by and large are things that we either already have our own solutions for or just aren't going
to be relevant to what we're doing. So I think at this point, given the forks we've already had to
make for things like async, the most likely path forward is that we end up pulling in the remaining
django code that we use and just kind of continuing to iterate on it as kind of our own internal thing
rather than probably ever doing another django upgrade yeah that's kind of
clearly going to be the case i guess as you say it's not even the 99 that you know five nines out
it's like the one in a one in a million um but it's also kind of sad it's like oh you know
yeah yeah yeah no it's definitely been one of the one of the sad things about
uh the way that my work has evolved over the last four or five years has been that i'm very
disconnected from django development these days i don't even really have a clear sense of what's
in the recent django versions because i'm not getting to use them obviously so that is a little
sad but you know i'm still having fun working on python so it's all good that's fair enough you'll
have to start a side project i wanted to um ask you then so if you're not getting to contribute
to django and work on django anymore what about other things open source things are you are you
able to do open source work or i've made uh i've made and helped with some um contributions to
python itself some small things in the standard library and um a few other patches that we needed
One thing was we had kind of a silly issue with the way that our development process works via the local development server.
We actually run uWSGI, which we run in production and also for local development.
But it runs as root just because of kind of legacy of how the operational systems developed.
And so if you enabled PYC file creation, it would sprinkle all these PYC files owned by root through the code tree.
that obviously doesn't really work.
So at some point years ago, before I even got there,
someone just turned off a PYC file creation for local development.
And at some point after I got there,
I was looking at this problem of how long it takes to start up the server
in local development when someone makes a change,
how long it takes to restart it.
And I was like, well, we have no PYC files.
So not only are we re-importing all these modules every time someone
makes a change, we're actually like recompiling them from scratch
because we don't even have PYC files and that's costing us 25% time, which is really silly.
then there's there wasn't really a great solution to that so i just wrote a feature for python where
you can set an environment variable and say put all my pyc files over in this other directory
somewhere else and just kind of have a parallel directory tree elsewhere of all your pyc files
which works great for us now we can do that and we get the benefits of pyc file caching
so that's just one small example of like uh and then yeah i contributed that upstream i think it
came out in python 3.9 maybe 3.8 i think 3.8 came out in so so yeah a few things here and there with
python but not as much as i would like okay and do they do they give you time i mean like yeah
i don't think they'd still do it anymore but google used to have this 20 time or whatever
that i don't as i said i don't think it's still there but do you get that kind of thing or is it
only if it's project related you don't have to yeah there isn't a kind of a explicit 20 time
or anything like that um it's kind of like i mentioned earlier like anything you work on here
it's like you can do what you want you just have to at some point be able to say hey hey i did
something useful this app so it's kind of up to you how to how to allocate your time okay that's
cool i'm curious about feature flipping uh at scale you know in django there's like i like
there's this project called django waffle that's really great but instagram is a whole different
beast um are there things what things crop up you know flipping features like i think i've seen
instagrams and playing around with removing the like button in canada or a whole bunch of countries
like what does it even take to roll out something like that yeah if you ask me about specific
features and where they're being rolled out or what's being experimented with i have no idea
that's like very far away from the things that i deal with on a daily basis but certainly feature
flagging in general is, uh, is critical. Um, and you know, not even, not even for sort of big
experimental features, but for almost anything, uh, that gets rolled out, gets rolled out behind
a flag. So it can be turned off. And one, I mean, in some ways, uh, that's not,
it's not just about sort of experimentation. It's also just a necessity of working at this scale
because the changes to the code base are coming so quickly
that there's really no possibility
of maintaining a long-running branch for a new feature.
So you can't have this development style
where you sort of branch and work on your feature
for a long time until it's just perfect.
And then like a month and a half later,
you merge a big branch back in.
There's just no way that would work.
It'd be a huge-
No home run merges, yeah.
No, exactly.
So it really forces you into this
sort of continuous integration development style
where everything has to land in the same trunk branch
that's constantly being rolled out to production
in fairly small increments.
And so that means if you're developing
any significantly sized feature or change,
it forces you to figure out
how can I do this incrementally and backwards compatibly
and have things in a fully working state
at every point along the way
and gate the feature off
until it's really ready to be rolled out and all that stuff so so yeah it's a very big big part of
what we do so you're not using the orm but you're like the issue there is that always happens is
migrations right it's migrating the database store and how i when you take the field out when you put
it in or yeah yeah i mean it's the same issue just even worse because like uh you know there's
There's no possibility, you know, with a large number of servers and obviously many, many database servers, there's no such thing as like, okay, I'm going to synchronize this code rollout with this database migration and everything will roll out together.
like every change you make to the data store i mean first of all it's a big deal to roll out any
uh change to the data schema but any change you make has to be backwards and forwards compatible
you always have to have things work if it's new code running against the old schema if it's old
code running against the new schema all that has to work so um there's that certainly has a a cost
in terms of attacks on development speed but it's just it's the only option can i ask how long does
it take to run the test suite you know i mean because i i know of like small sites that take
an hour you know because they have an optimizer done this and the other thing i mean how is it
not take months for a little committed instagram so the good news is that we have a lot of tests
pretty good test coverage um the bad news is that i've mentioned earlier about sort of how early
django really pushed you into this path of writing a lot of kind of end-to-end http tests using the
test client and there's a lot of that legacy still in the code base so the bad news is that
the good news is we have lots of tests the bad news is a lot of them are slow tests when you
have a lot of slow tests you have a very slow test suite uh so really i mean our our only solution to
that is that we uh throw hardware at it so when we i i literally think that nobody in the world
has any idea how long it would take to run the instagram server test suite and and sequentially
one test at a time because i don't think i think it's been six years since anyone has done that
like when we actually run the test suite it runs uh sharded out to a bunch of different machines
um so like there's like a bunch of machines all running tests in parallel and sending the results
back and with that kind of a system you know we can effectively run the test suite for 15 15 or
20 minutes which is uh good enough um but yeah enough to go get a drink but not yeah enough to
a drink, but not so much that you're like on Twitter for an hour in between every.
Yeah, exactly. And obviously, people don't generally run the whole test suite every time
they're working locally, like they'll figure out which specific tests are relevant and run
those locally. And then we'll run the whole test suite before we ship it.
So that's something I'm going to keep in mind when people tell me about test suites that take
more than 20 minutes. I'd be like, well, I heard Instagram is under 20. So, you know, think about
that. I like your point, though, on hardware, though, like, because that reminds me that
the only thing at scale I worked on is Quizlet, which was a top 100 site at the time. And we were
on joint and we had the whole executive team come in and this, that, and the other thing after a
full day, they're like, yeah, you just need more hardware. It's just like the people who wrote it
were just like, eh, hardware. Sometimes throwing a computing power at the problem is the most
efficient option. Yeah. Oh, there's something in a way beautiful, like, you know, from a business
perspective, if you can just throw money and solve an engineering problem, that's sort of great,
actually it's like you'd take that we didn't talk about odd bud i don't know what that is or other
things i mean yeah odd bird is the company i mentioned that i founded with my siblings in 2008
ah we just said yeah odd bird is still going strong i'm not i'm not there anymore on a daily
basis but uh yeah they make you work on thanksgiving i checked in with my siblings now
and then see how things are going if they need help but yeah it's still going still going well
still using a lot of Django. I think they're up to six or seven people now. So it's a, if you need
a Django application, Django site or application built, and you're looking to contract it out,
I mean, Oddbird does everything from the backend to the UI design and kind of figuring out what
the user needs are. So it's a great option. Well, maybe one final question. So we're on video.
You're not in California, you're remote. I think you've been the whole time you've been
remote and Instagram. Is that right? How has that been? Cause my sense is most of the team is there
and obviously now everyone's remote, but I'm just broadly curious how, you know, remote learning the
last odd number of years. And then today where everyone's out of the office. Yeah, I've been
remote pretty much my whole career. So, uh, it's kind of like a fish in water. Uh, I never really
had a a big issue with it uh even when i was one of the few people remote i did travel out to the
office in california pretty frequently which i think is important there's really no substitute
for getting to know people in person at some point and so just to sort of have those relationships
with the team and i think it was important to make those trips out but on a daily basis you know we
of good video conferencing uh pretty much everybody's already using you know the funny
thing is like the the instagram or facebook offices are so big that half the time people
are meeting over vc anyway just because they're in different buildings and they don't want to walk
across to the other building so so really everybody's already using kind of these remote
working tools on a daily basis anyway so i didn't feel that out of place using all the same tools i
felt like i was able to keep up and now of course yeah it's the world that everyone lives in so
right well that's one one step further than i remember in uh in san francisco i was actually
i think on the same block as the instagram founders i was on second street um you know
around the same time uh 2010 but it was it you know it's even if i'm sitting right next to someone i
would send them a you know a chat message because it's rude to poke someone with headphones on the
middle of something right it's like you know unless it's lunch like i don't want to get
poked on a question just like you know toss it my chat thing and i'll so now here we are you know
extending that out but you know yeah it makes sense right it's it takes however many 10-15
minutes to get into a flow state anyways and if you're constantly being interrupted even if you're
right there yeah it's rude to poke a co-worker yep great so carlton can you take us out well
all i can say carl is thanks for coming on it's really interesting chat and love um love to get
the back story and then you know the story of instagram and how they grow up and you know
that's super thanks for coming thank you it's been a pleasure i've really really enjoyed the
conversation well as ever we are at django chat.com chat django on twitter were you gonna say
something carlton or did i talk over you no i was just gonna say join us next time all right
bye-bye everyone bye-bye thanks guys