Django Regrets

This video features Adrian Holovaty at Django Birthday 2015 in Lawrence, Kansas, USA.

Django Regrets
0:30:22
Published July 14, 2015
2,546 views

Adrian Holovaty
http://www.pyvideo.org/video/3664/django-regrets
https://djangobirthday.com/talks/#django-regrets
With the benefit of hindsight, here are a bunch of things I've regretted about doing, and not doing, in helping develop Django. Learn from my mistakes!

Summary

Adrian Holovaty reflects on the personal and technical decisions he regrets from Django’s first decade. He urges people to document important periods with photos, avoid rushing weak contributions or decisions into an open-source project, and provide stable releases sooner. He also critiques Django’s settings architecture, monolithic design, template system, neglected admin, and data-browse feature, while arguing that mature projects need active stewards for each major component. He closes by remembering Malcolm Tredinnick and thanking the Django community, which he regards as the project’s best part.

Key takeaways

  • Capture photos and other records of important work because the chance to preserve those memories may not come later.
  • A project should not accept contributions too quickly simply because it needs contributors; rushed work can remain a long-term liability.
  • Django’s origins in real-world newsroom code made it practical but also left it with monolithic architecture, awkward settings, and other historical baggage.
  • The template system, data-browse feature, and parts of the admin show the cost of adding or retaining code without an active long-term steward.
  • Open-source projects benefit from real releases and backwards-compatibility commitments rather than expecting everyone to track the latest development code.
  • Personal investment and community relationships are central to sustaining a project over time.

Summarised automatically from the transcript.

Chapters

  1. 0:00 Introduction Adrian Holovaty frames the talk around Django’s imperfections and the lessons behind his regrets.
  2. 2:22 Preserving Memories A regret about not taking enough photographs leads to advice on documenting meaningful work and experiences.
  3. 7:04 The Django Pony Adrian revisits the infamous photo shoot, the “Why Django Sucks” keynote, and Django’s unwanted pony mascot.
  4. 9:50 Framework Origins He examines how extracting Django from real-world newsroom code shaped both its strengths and its technical baggage.
  5. 12:10 Settings and Library Design Adrian discusses Django’s settings module, monolithic architecture, and the difficulty of making the framework more modular.
  6. 15:16 The Template System He explains the design limitations of Django’s template parser and why its underlying architecture is difficult to improve.
  7. 17:12 Early Open-Source Contributions Adrian reflects on accepting internationalization and transaction-management contributions too quickly.
  8. 18:57 The Influence of Guido He describes adding an inelegant template behavior mainly because Guido van Rossum requested it.
  9. 21:00 DataBrowse Adrian explains why the abandoned read-only data browser should have remained a third-party add-on rather than entering Django’s core.
  10. 23:07 Releases and the Admin He covers the costs of relying on Subversion for too long and the need for a dedicated steward of Django’s admin.
  11. 26:23 Music and Community The talk closes with Django Reinhardt, the Django community, and a tribute to Malcolm Tredinnick.

Transcript

4,612 words · auto-generated Show

Automatically transcribed, so expect mistakes in names and technical terms.

0:02

Speaker 1: And so Adrienne represents sort of the the other half of that. And you know, as I was reflecting on what to say about Adrienne and Simon, how to introduce them, I recalled our slogan that we came up with. Django for perfectionists with deadlines. And it occurred to me that our two last speakers represent, Simon represents the damn it get it done deadline. And Adrian represents our perfectionists. Adrian is incredibly detail focused, incredibly precise and accurate about everything he does, cares deeply about doing things doing things right. Doing them doing something isn't sufficient if you're not going to do it correctly, if you're not going to do it right. And he cares about sustainability and keeping things online for the the long term.

0:48

Speaker 1: You know, it's sort of those long-term thinking I think that maybe comes from the journalism background. I'm not I'm not sure. And it reflecting on the time that I spent learning from these two, it i it it very much feels like I managed to learn these these a way to reconcile these two sometimes competing these sometimes competing notions. Because if you think about you know perfectionism and deadlines, these things don't naturally go together. These are you don't normally think of doing things fast and doing them well. And Django represented the coming together of those two things and the need to sort of consolidate uh uh those two competing ideas. So I don't know how much more I can say about about Adrian other than uh please welcome our resident perfectionist Adrian Holavani.

1:35

Speaker 2: Hello. Thanks, Jacob, and uh audio is on Okay. Thank you. It's awesome to be here. I haven't been back in Lawrence for ten years. It's like an old friend. changes uh just in small little ways. So uh I'm glad for that intro and especially uh given the uh talk about perfectionism because it's a very nice segue into my talk which is Django regrets. What about it is not perfect? But of course, I uh especially given that this is the last talk, which I did not expect, I don't want to be a downer. So uh I'll only talk about some bad stuff.

2:22

Speaker 2: Uh what do I regret doing or not doing over the course of the last ten years? Uh with each one of these things, I'll explain it and then hopefully I want to give you a takeaway and explain the lesson. Like when you go forward and work on your stuff, maybe this is something you should think about, learn from my mistakes, etc. The first one is a little so a lot of these are soft as opposed to technical. The first one is soft. This is Simon and me back when we were working on Django. Simon used to have really long hair. I don't know if you can see that. It went down to his shoulder. I completely forgotten about that.

3:08

Speaker 2: Here's another picture of uh The early journal world team, there's Simon in the foreground, David Ryan who spoke about the history of Lawrence is in the right, and Wilson Minor, designer, is in the back there. Here's the problem and here's my regret. These are basically my only two photos of that whole era. There's another one of these that has my wife in it, but she likes to be private, so I'm not gonna show that one But that's really it. And this was a very special time of my life, and I regret not taking more photos. So as you work on stuff, Take some photos. Because you never know. Oh, here's a third one. Uh I moved to Chicago and Simon came to visit me, so we were hacking

3:54

Speaker 2: on laptops rather than going out to the bars. So yeah, that's us. Oh, and then there's a classic extra one. Simon at the gun gallery at Cabela's, which for those of you who don't know, it's like an outdoors shop. And Simon went here and uh got American. Funny thing about this, Simon at the time, he had a year-long internship, as he explained. And he had a blog called a yearincansas. com, where he talked about his zany journeys as a British guy living in Kansas. And he posted this to his blog and Like the very next day

4:40

Speaker 2: I had a voicemail on my work phone. This was before cell phones were prevalent. I didn't have a cell phone. So It was like the only number that Simon could be reached at was my work phone, and it was Simon's dad. I think he must have been like very shaken by this. Because he he just like he didn't explicitly talk about it, but he said, Yeah, Simon, I just want to check in on you, make sure everything's good. So The gun gallery. But aside from that, uh those are the only photos that I have. So uh something that I've started doing over the last few years is take a lot of photos of s experience that experiences that I might want to reflect on in the future.

5:28

Speaker 2: I don't even have uh and as uh Joseph Uh Cochor Hans will know I took a lot of pictures surreptitiously at every block where we worked together just because I thought it was a cool team and I'd like to remember it. And I'm glad I did that. So as you go forward and work on stuff, take photos. A sad thing about this is I don't have any photos of myself with Jacob. And in fact, we've never lived in the same city. Uh when he was hired at the Lawrence Journal World, I had moved to Chicago like a week before. So we never have lived in the same city. And the earliest photo of the two of us together is this atrocity.

6:17

Speaker 2: This is an absolutely horrible idea. Whose idea was this? Why did they line us up? Uh, but yeah, they lined us up in uh was the most horrible photo shoot I've ever taken part in. So uh here's why this was doubly bad. At face value it's a horrible, horrible series of photos. But then it was fuel for the fire. Can I have a microphone maybe for the uh audio? Is it over here? It's kinda right at the top yet. I'll just hold on because I have like a ton of audio. At DjangoCon in 2008, how many of you were there?

7:04

Speaker 2: Nice, nice percentage of you. Uh Cal Henderson gave the keynote, why Django Sucks. Let's just take a look at what he said. Hopefully my audio is up.

7:17

Speaker 3: We've got struts, serious business. Rails is pretty cool. I think you'll agree. Django.

7:27

Speaker 2: Yeah. I

7:34

Speaker 3: I think I have this guy's album, actually. So

7:39

Speaker 2: it became a punchline. I really regret uh taking that series of photos. And what's the deal? I did not at I didn't tell anyone I was gonna talk about this. And like three other presentations have used that photo. Please can we over the next 10 years never reference that photo shoot again You know, speaking of that 2008 Django Khan and Cal Henderson's talk, he uh m made a little suggestion in that talk. Let's have a look

8:12

Speaker 3: I could take a framework seriously that had a mascot with magical powers.

8:17

Speaker 2: Is that audio coming in? I could take a framework seriously if it had a mascot with magical powers. Later on, Jacob and I did a Q<unk>A thing, and here's what I said. I never thought I'd say it, but we want to hear your pony requests. Did that come through? I never thought I'd say it, but we want to hear your pony requests. Later on. Does that appear That's all I have in town. Is it time for your ponies? Is it time for ponies? No. It is never time for ponies. Never So let me tell you the story for those of you who are not hip to the culture.

9:04

Speaker 2: Somebody put two and two together and heard Cal 's demand that we have a mascot with magical powers and uh heard this request for pony requests which of course is a old thing make a pony request ask for something that's That's maybe a little unreasonable, and put together the Django Pony, which I really regret, which I really hate. And uh I don't regret it because I had really nothing to do with it directly except this and to the extent that I'm affiliated with it in any way, I really regret any iota of involvement or blame. So I think it's unprofessional and it's just dumb.

9:50

Speaker 2: God, I'm gonna move on. Okay. Let's talk about some actual technical stuff. Uh as as Simon uh sorry I don't have uh credit for this. It came directly from God. As Simon talked about, you know, in his origin story, Django came out of real-world code. And we'd work on it for probably two years or a year and a half or something before it became an open source project. And I think that that is responsible that fact is responsible for a lot of the foundation that's good and a lot of the foundation that's bad in Django is sort of the original sin. It was also the original good thing,

10:37

Speaker 2: but it was also the original sin. So what do I mean by that? There are a lot of nice things about the fact that it came out of a real-world site. For instance, It worked and it was uh proven, you know, and and we could point to real-world websites that it was being used on. And uh it not only worked for one purpose, but we were operating a good number of sites that used it, and so it therefore dealt with a lot of different cases. And a lot of different situations. So uh out of the box, the day we open sourced, it did a lot of cool stuff. Of course, the flip side is that it only really worked for our cases that we had thought of And because it was extracted from

11:24

Speaker 2: code that we had never intended to write a framework for, uh it sort of became a framework going backwards, we sort of walked backwards into creating a framework instead of just setting out to create a framework. And like I said, that's that's good and that's also bad. Uh let me talk about some of the bad things. Uh I'm sure somebody in the back can't read this. Uh uh there have been many commits over the years. Uh That say this should only affect world online. We removed this old hairy, smelly thing, but it should only affect world online. So there's a lot in there that was just you know only for world online

12:10

Speaker 2: and obviously if we hadn't extracted it from the code we wouldn't have had to deal with that. Uh when Django originally shipped, I think uh the email setting was set to me and Jacob Fun fact, did you know that when Django was originally open sourced, we didn't have a run server. You had to install Apache and Mod Python on your computer. Who here was using it at that point? Okay. The few, the proud. Yeah, so uh a lot of the niceties just we didn't think of because Because it had been extracted from this real world thing. My biggest technical regret is, I don't know , I would never say biggest, never say never, but one of the biggest is this Django settings module.

12:58

Speaker 2: Uh it assumes that, or just the fact that you have to set jetting Django settings module environment variable for things to work, or if you can get around that by using settings. configure. Either way, it's looking at it the other way than it's looking at it as this big monolithic framework as opposed to being a nice library that you you can pick and choose stuff. This has really bothered me for a decade. And I really wish it bothered me just enough so that I would do something about it. Uh but it yeah, this is what I consider to be the biggest wart, like right on the person's f the framework's face. It's just bad news. There is uh some has been a patch lying around for like years, the unsettings patch.

13:43

Speaker 2: Where they they change some bits of the framework to take arguments instead of relying on settings and it falls back to the settings so it's backwards compatible. Uh maybe I'll work on that someday Or I I'd encourage you guys out there to pick that up. It's somewhere in GitHub. The unsettings patch. It's fantastic. I can't wait for that wart to be removed. This is sort of related to this concept of library versus framework. When we were originally building this Python code, we considered it a library. We didn't really I don't know. I don't know if it's fair to say if we were building a framework, we were considering just, you know, making some Python tools. And of course a big criticism of Django over the years have been

14:29

Speaker 2: it's this big monolithic thing, it doesn't play well with others, it's This framework that I have to do everything the framework's way as opposed to just using bits and pieces. And that definitely is a regret. I wish there were some way that we could Turn it into bits and pieces that you could just like, hey, I just want to use the Django email library or just I just want to use the admin, but I want to use some different thing behind it. it. And I don't think that uh that really would have been possible. Um that just the way that Django was created, this is just how it ended up being, and I don't think we can really do anything about it in retrospect. But there are little bits and pieces that we can still do to make it more library-ish, but it's sort of a framework for good.

15:16

Speaker 2: Another technical thing I regret is the template system, which Simon and I pair programmed. uh at the building next door in the basement. And uh Simon, who was a computer science student at the time, had just taken a compiler's class. 101. Not even 102. And I was a dumb journalism major. I had a computer science minor which I didn't actually finish. So I was like, oh man, this guy knows compilers. So not not to put the blame, but uh we we did both work on it and the problem with it is uh is very nicely articulated by Armin 's uh summer of code report from a couple bet a couple years ago. He basically examined why the Django template system

16:04

Speaker 2: and can't get any faster. This is the guy who wrote Jinja templates. And the uh just look for Django template compilation post mortem. It's a fantastic document very readable. And the problem is that, you know, there's this thing called the abstract syntax tree, the parse tree. You you take the raw text of the template and you convert that into an in-memory structure that you can then do things with. The problem is with the Django approach, it actually does that one tag at a time. So if you're in a tag, it then The the tag itself is responsible for parsing everything after it. Uh so all bets are off. A tag can have anything it wants in it. It can be invalid Django template stuff and it's just a bad scene and it's not how a proper compiled uh

16:52

Speaker 2: AST system should work. So in the words of Austin Powers, the train has sailed on that one. But of course we have Ginja to use and Yeah. All right, here's another little video from the snakes and rubies thing. Hopefully the audio is a little louder.

17:12

Speaker 4: Uh the first really, really big contribution From the community after we open sourced it is internationalization so that any app in Django can

17:23

Speaker 2: so the first big contribution after we open sourced it was internationalization. Soon after that, the uh the database uh transactions was the first big one uh the second big one uh at the time we sort of rubber stamped both of those and I regret doing that. Uh uh we were young and naive and uh and a very young open source project. We weren't sure whether people would actually use it. And then this guy from Germany, I believe, did the internationalization system and also the transaction system and we were just like whoa I don't want to speak for everyone but I I was like whoa yeah that looks awesome I don't know anything about internationalization we've never had to deal with it strangely

18:08

Speaker 2: in the middle of Kansas So yeah, looks good. We'll take your patch. And then for the same thing happened for the transaction management. And looking back, I wish that we would have been a little more skeptical because that transaction API was not good at all. Fortunately things have changed, but my advice glean from that would be if you're a young open source open source project and you've got You know, you're desperate for contributions, don't be too desperate because the stuff you get might not be up to your own standards. Similarly, uh another example where I jumped the gun a little too quickly, at some point

18:57

Speaker 2: Guido, the creator of Python, found out about Django. And he was experimenting with it. And he sent me a long email with a bunch of questions and requests. And he said, is there a way to set the default substitution in the template languages, in the template language? to something like undefined, so we can quickly scan his pages for typos in the variable names. So if there's a missing, so if he is trying to access a variable whose name is not defined, instead of just an empty string, he wants there to be some loud thing. And I believe I got this at like 10 o'clock at night, and I was so excited to hear from Guido. He's like a deity for us in the Python. World that I wrote it up right then and there and

19:43

Speaker 2: actually like added the feature to Django template string if invalid. I really regret doing that. It's a very hacky solution. I was actually surprised to see it's still in the framework, although it's been moved into the template settings. thing. It is very inelegant. It's horrible. And this was an example of me doing something not in the best interest of the uh of the tech it was in the best interest of uh getting in good with the creator of Python. Uh I think there probably were some benefits of that, but I'm sure he would have sort of had the same uh thoughts about Django had I not done this. So uh it's something I try to be cognizant of as a

20:31

Speaker 2: former BDFL if I'm ever looking at a patch. And I I try to understand that maybe if someone's just getting into Django, if they see wow like one of the creators of Django is responding, I don't want to be too heavy-handed or I don't want to make people do dumb things just because they see you know an important person. So uh learn from my mistake there. Uh what is this? I forgot what this one is. Let's take a listen.

21:00

Speaker 4: Integrate the admin with data browse. So

21:06

Speaker 2: oh god. How many of you have ever used data browse? What? Who are you? It's like 30, 40% of you. Data browse, oh man. For those of you who don't know, this was a Django. contrib thing where you could uh it was like a read-only admin. It would just give you a list of all your s the stuff in your database. You could browse, you could see every object's fields. And it was just a way of and it was all automatic. So it was a way of giving you a Browsing your data, data browse, it's right in the name. Problem with that was I made it and I never

21:51

Speaker 2: touched it again. So it languished, but it was kind of good enough that it stayed in there for just a little bit too long. So I regret even putting it in Django proper. I think if anything, I should have made it a third-party thing. But actually another thing I didn't mention was that back in the day, just to give you some historical context. This was when Django was released, there was no pip, there was no easy distribution of uh there was no dependencies, there was no virtual end. So if you wanted to make something like a Django add-on As as a committer to Django, I figured, well, I'll just put it directly in Django because it'll be easier for people. They'll just have it immediately. And nowadays I don't think that would happen, but back in the day, that was my

22:38

Speaker 2: mistake. So the problem here was writing some code that just enough people were interested in, but it probably shouldn't have stuck around in in the core framework. So how many of you actually still use data brows? Okay. Case endpoint, zero. What is this? How's the audio on this? Is it better now? Yeah.

23:07

Speaker 1: One of the things that Adrian didn't mention in his history lesson was this awesome, awesome thing called replaces module.

23:15

Speaker 2: Oh god. Let's not even talk about that. Okay, next one. For the first man, three or four years of Django's open sourcing, I was pretty religious about uh pushing people to just use the uh trunk just the subversion repository and in fact there was no release. Uh when was the first release in relation to the open sourcing? A couple years into it? A year? Seven or eight years? Oh 2007, okay. Four years. Three years. Okay. So for three years, the only way you could get Django was to do a subversion checkout. I thought that was awesome because we were adding new features and fixing bugs at such a rapid pace

24:04

Speaker 2: that, yeah, let everyone just use the latest stuff. And uh, you know, when I look at like auto-updating uh iOS apps or browsers and are auto-updating, I love that. And I love the fact that everyone's on the same latest version. But it did not, it was not a good thing for adoption. And I didn't realize that until we actually had a release, and then everyone was you know, the download stats spiked super big. Uh and then the the second part of that is once we had the 1. 0 version, then a lot more people started using it because they were assured backwards compatibility. So I wish we would have done backwards compatibility earlier.

24:50

Speaker 2: I wish we'd had a real release earlier and learned from my mistakes When you go to slash admin on any site that I've built, uh probably for five or Maybe eight five six seven eight years. Uh you don't get anything. In some cases I do a little Easter egg and I just redirect to the Django admin documentation. The reason is I stopped needing to use the admin. When Django was first built, it was in a newsroom where there was a clear delineation of people writing code and then people putting content into the system. And the admin was a very natural outgrowth of that. But

25:36

Speaker 2: the last couple years I've been working on things that don't need an admin. So uh My my lesson here is I I wish I would have found someone earlier who would be a steward of the admin. So back in the early days of of Django, when I was using the admin actively, I was adding new features to it, people were, you know, improving it. Then I sort of stopped using it. Maybe some of the other contributors stopped using it and progress to it kind of languished. And I wish here's my regret is that I didn't find someone to be the steward Of it. I think that it it's it's a good idea to have someone who's personally invested in it

26:23

Speaker 2: lead the product or lead the section of the product. So for a big open source project like Django I would hope that every bit of it gets someone who's not just, you know, the maintainer, but is someone who's maintaining it and has an active interest because something that they make every day, that they work on every day. uses it, so hence their they have a vested interest. So a softer thing. At a couple of Django cons and PyCons over the years, I've opened the talk by asking how many of you uh came to Python because of Django. Actually, how many of you came to Python because of Django? Awesome. And how many of you uh learned about the musician Django Reinhardt because of Django?

27:12

Speaker 2: Wow, like 80% of you. This is amazing. Okay. Ulterior motive. Success. Uh over the years, you know, I'm I see all these tweets. Oh, it took me the Django web framework to introduce me to Django Reinhardt. Great working music. Fun fact, pro tip, it's more for just working music. You can listen to it Listening to Django Reinhardt on Pandora. How often does his reading about a web framework lead you to new kinds of music? Yes. Awesome. My ulterior motive. Django Reinhardt, the musician. Yes. Uh my regret is that I haven't exploited that more. If only there were other third-party modules that maybe use some of my other favorite musicians.

27:57

Speaker 2: or uh even just exploding Django Reinhardt. I don't I think we can do a better job maybe tossing Django Reinhardt's photo on our homepage or I don't know something. Have an autoplay of his music on our site. Uh subtle. So uh with that I'm happy to announce a couple of new open source projects. Oh shit. Uh my new JavaScript library, the Gonzalo Bergara Quartet. And uh here's a new uh asset pipeline thing, Harry Nilsson's late sixties stuff. Check 'em out, do a pull request.

28:47

Speaker 2: Uh so a lot has been said about the community, and the community I agree is the best part of Django. I've met a lot of amazing, incredible people. uh gotten to travel the world and hang out with these people and uh one of my favorite was this guy It's uh Malcolm Trednik. How many of you got to interact with Malcolm? Wow, like 40% So he a couple other speakers mentioned him. Really loves getting to know him. And I regret not spending more time with him when I could. Uh this was

29:33

Speaker 2: sorry, getting a little emotional. Uh I uh spent the day with him in Sydney once and he showed me around. Super awesome. Uh and he was just a awesome guy. So with that, just wanted to say for uh Jacob, Simon, all the Django people I've been uh working with over the last 10 years. I love you guys like family. Never got to say that to this guy. Thanks for using Django. Alright.

Questions this talk answers

Why does Adrian regret not taking more photos while working on Django?

That period was special, and he has very few photos from it. His lesson is to document experiences because you may want to remember them later.

Discussed at 3:08

What were the benefits and drawbacks of Django coming from a real-world website?

Using Django in production meant it worked from the beginning and handled varied real-world cases. But it also encoded assumptions specific to the original sites and became a framework accidentally, leaving behind site-specific code and missing conveniences.

Discussed at 10:37

Why does Adrian regret Django requiring a settings module?

The settings-module requirement makes Django behave like a large, monolithic framework rather than a collection of reusable libraries. He considers it one of the framework’s biggest warts and wishes settings could be passed in more cleanly.

Discussed at 12:58

Why is Django considered too monolithic, and what would Adrian prefer?

Django does not always play well with other tools because it expects applications to work its way. Adrian would prefer users to be able to take individual pieces, such as the email library or admin, and combine them with alternatives.

Discussed at 14:29

Why does Adrian regret Django’s template system design?

The template parser builds its structure tag by tag, allowing each tag to parse what follows instead of constructing a proper abstract syntax tree. That design prevents the system from becoming much faster, although users can use Jinja instead.

Discussed at 15:16

How should young open-source projects evaluate contributions?

They should not accept contributions too eagerly just because they need help. Adrian says Django accepted early internationalization and transaction patches without enough skepticism, and the transaction API suffered as a result.

Discussed at 17:23

Why does Adrian regret adding the string-if-invalid template feature?

He added it quickly after Guido van Rossum requested a way to expose missing template variables. Adrian now considers the implementation hacky and inelegant, and says he prioritized impressing Python’s creator over the technical quality of the framework.

Discussed at 19:43

What was Django’s data browse feature, and why did Adrian regret including it?

Data browse was a read-only, automatic interface for inspecting database objects. Adrian created it but did not maintain it, so he thinks it should have been a third-party add-on rather than part of Django’s core.

Discussed at 21:06

Why was making users install Django from Subversion instead of providing releases a mistake?

Adrian liked having everyone use the newest code, but requiring a Subversion checkout hurt adoption. A proper release and an early promise of backward compatibility would have made more people comfortable adopting Django.

Discussed at 24:04

Why does Adrian regret not finding a steward for Django’s admin?

The admin was important in Django’s newsroom origins, but progress slowed after Adrian stopped using it. He believes each major part of a large open-source project needs an actively invested maintainer who uses and improves it.

Discussed at 25:36

What does Adrian regret about his relationship with Malcolm Tredinnick?

He regrets not spending more time with Malcolm while he had the opportunity. He remembers Malcolm as an exceptional person and wishes he had told him how much he valued him.

Discussed at 28:47

Note: We understand that names change, people change, and bodies change. We respect each individual's journey and privacy. If you have any concerns about a video or need us to remove content, please don't hesitate to contact us. We will handle your request with care and promptly address any issues.

More videos by Adrian Holovaty

More videos from Django Birthday