Small Team Skills: Putting in the Work on a Drupal 7 Upgrade

Podcast episode player
0:00 0:00

Host Matt Kleve talks with Nevin Katz who is an experienced Drupal developer on a small team who recently went through the process of upgrading an old D7 site to D9.

Episode Guests

Nevin Katz

Headshot photo of Nevin Katz

Nevin has been involved with Drupal since 2013 as a developer and Project Manager. Working with the EDC he has a chance to handle many projects from many sides. He's also the author & illustrator of "Dr. Birdley Teaches Science." Nevin writes about JavaScript, Drupal, and other tech & science topics on Medium.

Transcript

Transcript

Matt Kleve: For April 25th, 2022. It's the Lullabot podcast.

Matt Kleve: Hey everybody, it's the Lullabot podcast episode 256. I'm Matt Kleve, a senior developer at Lullabot. With me is not Mike Herchel awkward? Yeah. Mike has moved on to greener pastures, no longer with us. We he's still in the Drupal community. We love him, we support him, he's just not here on the podcast. So for a little while, I'll be flying solo. The good news is, is that I'm bringing on smart guests, and we're still going to be talking about everything that is Lullabot strategy, design, development specifically a lot of Drupal stuff. And something caught my eye recently. There was an article that ended up in my Google Now feed. I was, you know, mindlessly scrolling somewhere, and often I get all kinds of weird things in my Google Now, so when it's Drupal related, it kind of caught my eye and I said, I need to read this. So there was an article on medium that was called The Seven Phases of My Drupal Website Migration, and I ended up reading it and it was really in depth. So I decided I needed to bring that author on, and we'd talk a little bit more about Drupal migrations. It's an important topic. It seems to be like what we just talked about on the podcast whenever we did that a few months ago, but I don't think it's too bad to to talk about it again. So with me today we have Nevin Katz. Hey, Nevin. Glad you're here.

Nevin Katz: Hey, thanks for having me, Matt. Great to be here. Excited to talk about Drupal.

Matt Kleve: Where are you?

Nevin Katz: I am coming from the Boston area. Okay. I'm over in Lexington, Mass. And we are our offices are at EDC are slowly opening back up, but for now, I'm working from home and have a nice, have a nice little setup going.

Matt Kleve: So I've been a Lullabot for, like, 12 years now. And this working from home thing is pretty great.

Nevin Katz: Yes. Yeah.

Matt Kleve: [Laughter] That's, that's all we do. So. Yeah, we're used to it, yeah.

Nevin Katz: No, it's it's it's good. It's good for concentrating and banging out code. Though, I look forward to getting back to the office every now and then.

Matt Kleve: There are some some good points to, you know, getting back with your coworkers and face to face. But I really like the, you know, banging away in my basement and getting stuff done. So anyway.

Nevin Katz: Yeah.

Matt Kleve: Nevin, it says you're you're a developer, with the EDC, which I Google further, and I learned that it's the Education Development Center. And based on your article, it tells me, like, you wear a lot of hats there so kind of tell me what you do.

Nevin Katz: Yeah. So I came into EDC as an online learning specialist. And so my initial role was building online courses in Moodle and facilitating online courses. Over the course of being there, I got more interested in what happens to courses and websites under the hood. It was about the time where mobile was starting to explode, so I was really interested in working on mobile apps and responsive websites. So I got my software engine degree while I was there, or software engine certificate and started getting more into working on apps and websites. And so now that's essentially what I do, I do a mix of web and app development, and I also do some project management. EDC is and I'll talk about it in a little bit, but it has both a US division and an international division. And on the international side a lot of what I do is Android app development coupled with some Drupal development. And on the USD side I do that mix of management and encoding. And that's, that's mainly geared towards their Drupal sites.

Matt Kleve: So your Drupal.org profile tells me you've you've done Drupal for almost nine years now. Is Drupal a part of your regular stack there?

Nevin Katz: Yes. Yeah. So it's it's been quite a journey. And we now probably like a lot of organizations, we have a mix of Drupal seven sites and Drupal nine sites. And so there there's some Drupal seven sites that we are looking to migrate, and then there's some Drupal nine sites that, you know, we've we've kind of cleared that hurdle and are breathing a sigh of relief. But it's been a real theme over the past you know, two years about the theme of Drupal migrations has kind of permeated our lives because there's always some site at some stage of migration that we have to deal with. Yeah. So, so that's my role at EDC and a little bit more about the EDC organization.

Matt Kleve: Sure.

Nevin Katz: It is a global nonprofit, and it's mainly focused on several areas improving education, promoting health, and expanding economic opportunities. It's been around since 1958, and it's risen to prominence as a leader in these areas, mainly thanks to programs that address challenges around the world like suicide prevention, early childhood development, youth workforce development. And one project that I've been on, the the Let's Read Zambia project that addresses low literacy levels. So it's been an exciting place to be. And I think part of what keeps me there is it's so mission driven.

Matt Kleve: That's that sounds like you're doing really good work, and you can keep coming to work feeling good about the the good stuff you're doing, so that's awesome.

Nevin Katz: Thanks. Yeah I do, I enjoy it and there's there's some great people there. And we, we have our US offices here that are opening back up, but we're also in around 80 countries around the world. One of which is is Zambia. But I've also done some work in the Philippines and some tech work for India as well. So it's, it's exciting kind of working on both the international and domestic fronts.

Matt Kleve: Is there ever any reason to send a developer to those locations?

Nevin Katz: It's been hard. There's sometimes is I actually did go out to the Philippines a few years back, and it was very interesting to kind of see the schools and see what the types of needs were. Connectivity is a challenge there, as you can guess, but it was I had just built an app and I'll talk about the app work a bit, but I was interested in going going over there, seeing how it worked, and talking with the teachers and students who were using it. So it actually does make sense in some cases, just to kind of see how your stuff is working. It sometimes can, you know, put you really in touch with the people who use it. And you know, to, you know, I don't like using the term end user, at least in this case. But, you know, I get to see kind of students and teachers and how they're responding to certain screens and everything and how they're responding to the learning.

Matt Kleve: So you talked about lots of different things and, you know, different versions of Drupal you might be running. How many Drupal sites are you do you oversee or how many Drupal sites do you have running?

Nevin Katz: Oh, that's a good question. So I...

Matt Kleve: Dozens?

Nevin Katz: [Laughter] No not dozens.

Matt Kleve: Okay.

Nevin Katz: It's actually I'm involved mainly with five right now.

Matt Kleve: Okay.

Nevin Katz: And one of them is the this stepping stone, which is a content authoring system. That's where I was kind of boots on the ground doing the Drupal migration. And there's several other sites that I've, I've had a role in. Their migrations have taken place as a result of external vendor tech work. And I've been in, in some capacity on each the vendor liaison, you know, at various stages of the project. One of them is stellar.edc.org for the stellar project. Another one is amgenbiotechexperience.com and that's affiliated with Amgen. It's a website that is tied to various Amgen Biotech Experience program offices that support teachers in professional development around biotech and also build out lab-based student learning experiences. So that's a very exciting project. I also have a role on sabes.org. I'm the tech lead there that help to coordinate projects. That's a real mix of management and tech work. I sometimes dive in to fix stuff, but more commonly, I'm ticking off pivotal tracker stories and you know, consulting on different parts of the site. So another and then the final site we have is actually a Drupal multi-site system of 18 different websites. And that is another Amgen site that is for is for our teachers. And so those those are kind of we have a site for Italy, we have a site for France, we have a site for Los Angeles. There's about 20 plus different program offices sprinkled around the globe. And we have a, a website for each, that's all within this one Drupal instance. And so that's exciting to work on as well.

Matt Kleve: If you're doing multi-site, I think that counts. I think you're getting closer to that dozens number than you want to be.

Nevin Katz: [Laughter] Yeah, I mean, it it is it is interesting because you have one code base, but you have like 20 different databases. So it's a it's a different job description because I end up being, you know, in some ways kind of just the, the site administrator. And even though I came into web development working more on the front end, you get into, you know, more back end stuff in terms of, you know, working with htaccess files and, you know, configuring databases and stuff like that.

Matt Kleve: Even building the site to think about the site as a system, right? It's not, I'm building a site. I'm building a system that will make all of these other sites and, and they all are going to be pretty much the same, but they're all going to be special in their own special way along the way. And it's kind of takes a little different approach.

Nevin Katz: Yeah. No, it definitely is. And I, I like your I like your use of the word system because that's exactly what it is. You have this kind of interoperable set of components, and it's each site ends up kind of having a flavor of its own, but they all pull from the same code base. So when you're thinking about something such as okay, well, I want to add new CSS for this banner or I want to add some new functionality to the slideshow or I want to add this widget. There is some consideration you have to pay to how is this affecting our other 17 sites? Or, you know, how is this going to affect maintenance down the road? And I remember when, you know, when I first started out and was really getting into web development, I was always kind of had my eye on the shiniest object and, oh, why can't we use this? Why can't we use sass? Why can't, you know? And now I find myself on the other side of things saying we better check those other sites and make sure that everything's going to still work once we go with the solution. So it definitely kind of puts you in a more, you know, in a more wary role, like, because you just have to think of those caveats whenever a new idea comes up.

Matt Kleve: Sure. Sure.

Nevin Katz: Yeah.

Matt Kleve: So it sounds like you definitely wear a lot of hats, and you're kind of keeping the Drupal balls in the air. Take us to the the migration that that you had written about. Explain, so you had Drupal seven site and you needed to, to get that up to date.

Nevin Katz: Yeah.

Matt Kleve: And I guess one thing that we, I should mention before we get too much further, is one thing we've talked about on the podcast before and something that was probably in your mind when you started, this was the end of life for Drupal seven. So the community was kind of going to cease support. It seems like that ball has been kicked down the road a little further.

Nevin Katz: I know.

Matt Kleve: I'll link to the PSA in the show notes. The current date is November 1st of 2023.

Nevin Katz: Yes!

Matt Kleve: But it's good that you got that project done because it's it's something that will have to be done for a lot of people...

Nevin Katz: I know.

Matt Kleve: ... In the future, if you if you want to keep keep up with security and you know, are to do it the right way.

Nevin Katz: Right. Yes. Yeah, I was, I was I was concerned at the time, because it had already been. It had already the migration had already been pushed back by a year due to, I believe it was because of COVID. And maybe some other factors. But at the time, November 2022 was front and center and there was no reason to think differently. And I was also in the midst of a security update, and I saw one of the modules being the group module had lost support and was no longer being updated. And it was kind of the first sign to me that that some of the modules we were depending on were starting to lose support. So even though we still had a little bit of time, I was like I better get started on this. So this particular site was it's a site called Stepping Stone. And the the link is sstone.edc.org it's not a fancy site because what it's mainly meant to be is a content authoring system for our internal staff. And if you're familiar with the idea of decoupled Drupal, that is the idea where Drupal serves as a content management system and you have some other front end, it's either an app or a website that somehow accesses content. Either it either fetches it while it's online or it pulls it down to run it offline. And so you have the separation of concerns, where you'll have your content up in Drupal and the and our, and in our case, we have Android apps that pull that content down and run it offline.

Nevin Katz: So the, the Stepping Stone idea, which is that you have kind of a low code or no code solution for our staff to kind of enter in e-learning content is is not a new one. It was pioneered in the early 2000s by my former colleague Scott Isbrandt, who's kind of gone on to do other interesting things. But it got started on flip phones, and at that point you would kind of load things into you would you would the app was built in Java, you would code up the or not, you would code up the app, have that ready, sitting on flip phones. And then there was another type of downloadable authoring package that staff would use and to create content and load them on. About five years ago we decided to come up with a different system that used Drupal and try to modernize it. We had already been using some Android tablets, but we that they still use Java, so we wanted a system that we maintained internally. So we came up with this decoupled Drupal system where you would have a Drupal site where people would enter content. And you would have various apps that we've used for, you know, say the Philippines and Zambia, that can then pull down that content and run offline.

Nevin Katz: And so that solves two issues that are challenging for developing areas, which are number one, online access which is there are a lot of far flung schools that have very limited connectivity and availability of developers. You don't want to have to go back to a developer every time you need to add new content. So the fact that Drupal has such great widgets and is so extensible allows us to kind of add that content it allows people without coding background to just add that content, and then apps can pull it down and run with it. So when I was kind of in that it was back in February 2021, where I noticed that, you know, these the group module was losing support. I was looking at the timeline and I was thinking, you know, we need to get this going with with Stepping Stone, where we, we kind of migrate this over because our apps are still going to need to pull content. I, we don't want to have to worry about having to move the site over at the last minute, and we would just want to make sure that all the modules we're running are secure and stay secure. So that was kind of...

Matt Kleve: To be clear you were talking the group module was losing support for Drupal seven, right?

Nevin Katz: Yeah, it was losing support for Drupal seven.

Matt Kleve: If you were to upgrade, it would be fine. Like there was a version that was good for the latest version of Drupal.

Nevin Katz: Exactly.

Matt Kleve: You needed to move if you were going to be supported by the contrib module. So that that was even, you know, predating, predating Drupal's end of life for support type things.

Nevin Katz: So yes.

Matt Kleve: Other things were pushing you along the way. So how long how long again had this site been up and running as a Drupal seven site?

Nevin Katz: It's a good question. It had been up and running since late 2016. So it, it it we got in a lot of mileage out of it.

Matt Kleve: Yeah.

Nevin Katz: Yeah. It it started off...

Matt Kleve: For a website. That's not bad, I mean yeah yeah.

Nevin Katz: Yeah. And it started off you know, looking like probably a site from the, you know, late 90s, just very slimmed down thing just for, you know, people to enter content. But we ended up beefing it up over time. And we kind of started our discovery phase, kind of taking inventory of the site and, and figuring out on a few levels, on the tech level, we were we were just kind of I was making a checklist of modules that were going out of date, modules that were not going to be in Drupal nine, modules that custom modules we had that we would either need to drop or rebuild, as well as different page architecture, you know, in terms of like, how do we want to rethink how navigation works to to make it easier. So we were kind of doing that on the tech side. And meanwhile I was talking with our content authors around the company, asking them what would they like to see different about a new Drupal nine site. We have, you know, an opportunity here to kind of make it easier. And so we were kind of doing both that thinking on kind of on the front end, what would we like to see different? And on the back end. On the back end, what should we be prepared to rebuild or simply install or drop? And so we had to kind of so that's how things started. Just kind of taking that inventory.

Matt Kleve: Okay. That's the discovery phase.

Nevin Katz: Yeah.

Matt Kleve: Kind of what, what the problem is, is and where we need to end up.

Nevin Katz: Right. Yeah. And so we were and and it also involved you know, as I went, one thing that I, I've kind of come to appreciate is that for these migrations, the discovery and kind of doing some some initial test migrations are are a bit intertwined because you don't really know what you're dealing with until you start going under the hood. And once I started doing some test migrations from the Drupal seven site to the Drupal nine site I noticed that that, you know, some things would migrate, migrate quite naturally, and then there would be some other things that would just not they wouldn't work. [Laughter] We had videos that didn't work, we had paragraphs that didn't work, so we had a lot of a lot of lovely error messages that were coming out.

Matt Kleve: So videos ended up probably becoming media of some kind or what was the...

Nevin Katz: They eventually did, yeah.

Matt Kleve: Okay.

Nevin Katz: And and that said, they're different from at least in how we treated them. They were different from images and audio. Those, those tended to come over naturally. And we we had to do a few shifts and change because some of them came over as files, we had to migrate them to media, which I gather is a common step in this journey. Videos, though, they didn't really come over at all, and we had to make a judgment call as to whether we wanted to write some custom scripts or just bite the bullet and move over videos manually. So that ended up being a manual step. And it didn't, it wasn't too big a deal. We just kind of moved over some videos, created a new...

Matt Kleve: How many were how many were we talking about?

Nevin Katz: I think it was around it was around 150 or so.

Matt Kleve: Okay. So it's annoying, but attainable. [Laughter]

Nevin Katz: Exactly. Yeah. And it came to be like, you know do we want to do we want to wrestle with writing a new migration script? I mean, to be candid, this was my first migration. And, you know, writing the script for paragraphs was a push for me in terms of learning the ins and outs for that. So we there was kind of a judgment call. And we see this even on current migrations is, you know, what do you want to solve with an automated script? And what do you want to just, you know, put some manual work into. And in some cases, it's nice to do manual work because you can change little things, like what is the alt? You know, if you want to make the the alt text for an image a little clearer, you know, something like that. But with the videos, we decided to go that way. But by contrast, I noticed early on during discovery that the the paragraphs, which are for those of you who are not familiar with paragraphs, they're basically like fields of fields. So if you have, you know, a...

Matt Kleve: I was surprised you had paragraphs in Drupal seven. I think that was kind of cutting edge at one point, right?

Nevin Katz: Yeah. So we had I think it was I first heard about it, I think in the late 2000s.

Matt Kleve: I think I probably would have solved that problem with Panels just because that's how I solved all of Drupal six and seven issues at that point. But so, so paragraphs existed. And so that was something that was a little tricky to to make the migration happen.

Nevin Katz: Yeah, it was. Yeah, it wasn't automated. And the challenge there was and this was for this counts for field collections, too, because it's kind of in two, those were kind of in a similar boat because both paragraphs and field collections are fields of fields. So if you have a if you have a multiple choice page or something, and each choice maybe has a picture, a piece of text and a URL, then you might take that and create a paragraph that has all those three fields, and then you can reuse that on your multiple choice question. You know, whatever multiple choice question you create. So this fields of fields thing did not come over naturally. Field, field collections just were a no go. There was nothing out there I could find that stated that field collections...

Matt Kleve: Yeah.

Nevin Katz: ... could be migrated.

Matt Kleve: It probably would have been tricky, but the data is the data, so a custom migration would would have been done. But you said it was a...

Nevin Katz: Right.

Matt Kleve: ... It was something that was that was unfamiliar to you, but you figured out a way to make it work, right?

Nevin Katz: Yeah, I went through I, I, we only had a few field collections, so I just migrated those manually. And then when it came to the paragraphs I went and looked at a few other recipes. And there was a useful one by this company, Softech, I believe there. I might not be saying that. Right. But they operate out of Romania, I believe, and they have a New York office. They had a really good tutorial on migrating Drupal paragraphs. And so I looked at what they did, there was, I think, for Drupal eight. So I made a few changes and tried to get it adapted to Drupal nine. The challenge with looking at a tutorial sometimes is because things evolve so fast. Things such as a plugin that a Drupal script might use may really quickly become out of date.

Matt Kleve: Yeah.

Nevin Katz: And so it just takes it's not enough sometimes to go to a tutorial, even even soft excuse, which was really, really good. You know, that it was a Drupal eight tutorial. So there were a little work required to a little work was required to get it Drupal nine ready. But then once I swapped in the plugins it worked fine. Even then, though, you know, there's, there can be edge cases. So just because it works for this one site I was using there, there can be, you know, certain an edge case such as maybe how do you deal with an empty field or something like that, that maybe I didn't have that issue. So it's always kind of a bit of an adaptive puzzle, you know, trying to figure out a, a workable recipe for paragraphs or something like that, you know, to, to automate something over.

Matt Kleve: Probably a dozen years ago, I was at, I think the way I remember the story, I was at Drupal Con San Francisco and Mike Ryan and Moshe Weitzman were talking about Migrate Module and figuring out how to do migrations. And I was really excited for that because I had a couple of projects in mind and things that I wanted to use migrate for. But then the talk was all about how they kept track of data with their spreadsheets. Like, there's this field that maps into that field, and this is the data type, and that's the data type and how it can be done. And I was kind of disappointed. I'm like, you know, I kind of wanted to know migrate. Once I kind of got started and figured out how things worked with migrate, it was like, oh, well, yeah. Of course, keeping the data straight is the is the hard part. Like figuring out where stuff goes and how it gets there is something that you can't really have a computer do for you, but you can tell a computer to do it right, so.

Nevin Katz: I know, yeah.

Matt Kleve: It sounds like you're running into a lot of the the common migrate issues. So it's it's.

Nevin Katz: Yeah. Yeah, I think it and it is I mean you bring up a good point of what, what do you have a computer do? What what are scripts good at doing and what are people good at doing, you know? So yeah, there are certain things where, you know, as we migrated, we had to make some judgment calls. And there are and then things like paragraphs. We wrote a script and we got it done.

Matt Kleve: This was also an active site, right? So there was content coming in along the way. So yes. Yeah.

Nevin Katz: Yes. Yeah. We had several projects that were actively creating content. And so in addition to the, the tech piece of kind of being under the hood, one thing that that it required was being in very close touch with content creation teams, letting them know what the Drupal timeline was. So one of the things that I took away from just working with other vendors was how they kind of demarcated specific phases of the project. So I looked at kind of the timelines that were clearest to me that that I felt conveyed the different milestones clearly. And I created an internal doc that I shared and updated and kept the team apprised of. And every so often I would say, you know, let them know when we would when the next stage of the migration was and ask them about the status of their content. Over time, it felt like content had to be very rigid when I was just using the graphic user interface part of Drupal.

Matt Kleve: You're talking migrate, right? You were using the GUI for migrate.

Nevin Katz: Okay, yeah, the GUI for the. Yeah. The migrate GUI. Yeah. And so...

Matt Kleve: Which if you, if you get started with migrations, it's a good place to get started, but you end up using drush, right?

Nevin Katz: Yes, exactly. So that was kind of my first, you know trial by fire a little bit, figuring out how to use the the GUI and making sure everything was wired up. That in itself was a little challenging, just to make sure that all the content moved over, but the limitations became clear. I mean, it's it's kind of like having a clunky car that it gets you from point A to point B, but point B is is not completely there, there's still other steps after that. So it it got me to the point where I'd say I had 80% of the content migrated. But number one, more content, more content is left. And number two, you really can only run it once, and then you have to if you're going to keep that database, you have to use some you have to use some custom scripts or you have to use drush. And if you install migrate plus migrate tools, migrate upgrade, you have on the command line a few common migration jobs you can select, such as moving over users, moving over nodes. And those became saving grace towards the end. At one point, when I was talking with the content team, you know, I would run the GUI migration several times, especially if there was a boatload of content that got done. And then at one point and I think it was maybe around November last year I did the final GUI migration, and I was basically and we all kind of decided that after this there would be some minor content work, but we were in good enough communication so that it was only a handful of content that got written, and it was all stuff that either could be migrated with Drush or we would just use, we would just kind of hand migrate it and just recreate a few nodes manually.

Matt Kleve: Okay.

Nevin Katz: But that is I mean, communication is such a huge piece of it because especially with an active project, you know, if there's people that rely on the site we really had to be in close touch and keep them apprised.

Matt Kleve: Cool.

Nevin Katz: Yeah.

Matt Kleve: So you talked a little bit about your site. The next step is, is recreating all of that sweet, sweet custom code that's already been written to do to do your fancy stuff. So was this the first Drupal eight or Drupal nine stuff you'd written, or were you ready for the changes that needed to be made?

Nevin Katz: I felt I felt semi-ready. I think it's the type of thing where I think...

Matt Kleve: You said you were doing, you were doing Android development, right? So. Yes, I did some of that a while back and I think it helped me become a Drupal eight developer because, you know, it was all object oriented, you know, Java, and you kind of get into figuring out how these patterns work and...

Nevin Katz: Yes, well, with with the Android development, we do I use the Cordova framework.

Matt Kleve: Okay.

Nevin Katz: And I do take an object oriented approach, though, to a lot of it as far as having having some JavaScript classes ready to use. And you know, I have I have user objects and I have teacher objects and things like that. But I think just by the fact that you get used to having to work with a really big code base, and you get used to how, you know, one, one update here is going to affect another part of your ecosystem. I mean, that did help me to get ready for Drupal in a way. I had also been building a lot of Drupal seven custom modules at the time. They were, you know, a good amount of them were front end, but some of them talked to the database as well. So by the time, by the time I got into thinking about building the custom modules for Drupal, I at least had some analogies in my head about how I wanted it to, to happen. And I was still getting used to twig files and YAML files and things like that, but I, I had done, you know, I'd been doing PHP for a while, so I had some idea of what I wanted to do.

Matt Kleve: Okay.

Nevin Katz: It was still I mean, it was still a lot of a lot of trying to figure stuff out and look stuff up. And, you know, it wasn't it was not a smooth ride.

Matt Kleve: It's still that for me, I get it.

Nevin Katz: Yeah, no it was...

Matt Kleve: I think I remember how to do that? [Laughter] Yeah.

Nevin Katz: Yeah. No it was and, and mainly I think and not to get too much into the tech nitty gritty, but we had a lot of the custom work that we do is, is to make it easier for our authors. Our Android app is the content it pulls down from Drupal usually shows up as these slides. You could almost think of them as PowerPoint slides, except some of them are interactive so some of them might be, you know, match the letter to the picture clue. And so it's important when the content author is creating content to see how what they create will look in the app. So we have a custom slide viewer module. And we had we how I built it in Drupal was I tried to actually reuse a good chunk of the code that the app used. So the app already uses JavaScript to talk to our Drupal site's API and pull down the content. Well, I built a custom module that talks to the API and doesn't pull down the content, but at least you know grabs it and uses it to kind of simulate it. So so fortunately, what I tried to do was use as much code reuse as I could because, you know, people like to kind of think of new things for the app to do all the time. So I wanted to if people wanted to add stuff, I at least wanted to have some, some, some common design patterns across both the site and the app so that if I updated it in one place, I could easily update it somewhere else.

Matt Kleve: And you've been with EDC for a long time, so you're ready to be the the person who ends up maintaining it, too.

Nevin Katz: Right, yeah.

Matt Kleve: Which is a different mentality than someone like me who comes in and works with a team for, I don't know, it could be a while, it could be a short period of time and then I'm gone. Like.

Nevin Katz: [Laughter] Yeah. So I mean, it's for myself. Yes. I think that maintenance is is I don't like to just make decisions based on maintenance. But I mean, upon reflecting on how I handled things with Drupal, the Drupal seven site and kind of building out our slide viewer for that, I had a totally separate approach from with the app, and I was thinking kind of going into this I'd like to make things a little more unified, where if somebody asks me to, you know, create a new Wordle template for our app I can just create it once and then just adapt it to the site a little bit and you know, have have that ready. So I did that and what it mainly amounted to was kind of using PHP mainly to set up the template and pull in some the JavaScript libraries I wanted to use, and then the the JavaScript code I wrote did a lot of the heavy lifting because that came from the app. So that was, that was part of the custom code. And then there was there was another authoring tool for a drag and drop slide where it there's, there's it's like a color forms activity from the 80s where you kind of you an item onto a stage and so used a little JavaScript magic to have the drag and drop work at the drop zones wired up and then dump whatever they were doing into a Drupal field.

Nevin Katz: So a lot of JavaScript, but it gets the job done and it, you know, stayed secure. I did that towards the end of the migration because it was it was so important to just get all the content migrated. And I think we actually did. Before I finished the custom modules, we actually ended up doing a soft launch of the site just so that the content people could keep going, and I could, I was just, okay, look, folks we're going to need...

Matt Kleve: Yeah.

Nevin Katz: We're going to need another couple of weeks for this custom module. So just hold off on doing image label for now, that was the name of the color forms template, you know. So we got it done though. And and so the custom code is, is all set. And the one, the one thing I'm working on now, which is it's not part of the site proper, but I also write PowerShell scripts for our site because it's not always realistic for the app to straight up download the content. So I'm right now writing a PowerShell script that pulls down content from the Drupal site and that allows you to have a nice little three gig content package that you can pull down to your computer, copy onto USB, and then import into a tablet.

Matt Kleve: With your content and your custom code, there's still a long ways to go. Oh, and I also wanted to point out before I get too far. There are there are plenty of people at Lullabot who who do a really good job with maintenance. We have a whole department of support and maintenance people and bless them for doing the yeoman's work of maintaining these websites. Anyway we're talking...

Nevin Katz: You build the environment that you live in.

Matt Kleve: [Laughter] Exactly. We're talking with Nevin Katz from the Education Development Center. He's talking about a Drupal seven to Drupal nine migration that he was a part of, that he wrote about on a Medium blog post. Blog? Is medium a blog? What's the word? Yeah?

Nevin Katz: I've still been trying to figure that out. Yeah, it's a it's a blogging platform where it's...

Matt Kleve: Yeah.

Nevin Katz: ... Kind of a mix of it's a mix of writers and readers. So you can, you know, go in, you can go in as a reader and read a bunch of stuff, or you can go in and you can write about all kinds of stuff.

Matt Kleve: We're talking with Nevin Katz, the Medium marketing department.

Nevin Katz: [Laughter].

Matt Kleve: And we'll we'll continue about we'll continue delving into the project that that he was writing about coming up right after this.

[Intro music]

Matt Kleve: Welcome back to the Lullabot podcast. We're talking with Nevin Katz about a project that he was on. So, hey, Drupal Con is coming up. Are you going?

Nevin Katz: Oh, where is that?

Matt Kleve: You're not going, are you?

Nevin Katz: [Laughter].

Matt Kleve: It's actually it's in Portland this year.

Nevin Katz: It's in Portland? No I don't think I'm going.

Matt Kleve: It's on the wrong side of the country for you, isn't it?

Nevin Katz: Yes. Yeah. I'm over here on the East Coast. Yeah.

Matt Kleve: I'm sadly not going to be there either. So, yeah, there's a a Lullabot retreat happening right before and two weeks gone. Might be a little long for the fam. So.

Nevin Katz: Yeah, I normally like to get over to Design4Drupal which that's takes place over at the MIT Stata Center. There have been some great talks over there over the past few years. And I always learn a lot. And as a person who's mainly working in the front end space when it comes to Drupal development, there's a lot of good stuff.

Matt Kleve: Isn't GovCon is often on the East Coast and probably has some good stuff too. I don't know if you've been there.

Nevin Katz: That's good to know about.

Matt Kleve: Yeah.

Nevin Katz: Yeah. That's great. What do they talk about? There is that kind of building...

Matt Kleve: It's government stuff, but it's it's kind of a mini Drupal Con from what I understand.

Nevin Katz: Oh cool!

Matt Kleve: Enough people get there and it's a lot, you know, pretty much anything you, you want to know. What percentage of your job would be Drupal do you think? How much Drupal do you do?

Nevin Katz: Oh, that's a good question. I would say I would say right now it's about 50% of my work. And I say that because usually the other 50% is Android app development. And so I'm mainly kind of writing, writing JavaScript code, writing CSS code. There's a few physics interactives I do also in JavaScript. So I guess that would kind of fall under that 50%. But then the rest of it is either managing Drupal work or creating some custom code for Drupal work or running a security update. So there's always something going on with Drupal.

Matt Kleve: We've been talking about your migration project. One question I'm not sure I asked was, how big this team is that that that did this? Is this you are you the lone gun here?

Nevin Katz: [Laughter] Yeah. For this particular site, I was I was the the main Drupal developer. I had I had help though during some phases. My colleague Melody Hachey was instrumental in being able to create some of the content, work through some of the views configurations, which I'll talk a little bit about and help to and she also helped to think through some of the content strategy and think about how the site should be improved for content authors. We also had some excellent person doing QA Moya Hynes, who I've been working with her for years. She's really great at catching all my mistakes. And she helped to make sure that the, you know, the Drupal site looked and worked the way it should and that the app talked well with it. So it was a real team effort on that front. And I also worked with a few others. Simon Richmond, who's he's always been kind of the Stepping Stone visionary since I started work on this back in 2017. And Sonia Tung, who helped a lot with inter-team communication. So it's a real team effort. I think that, you know, for myself, with developing the Drupal site, I had, I had been so close to it that I just felt like I needed to just take it on myself. Partially because there were so many things about it that there were so many intricacies of it that that had built up over the years. It just felt like all the all the work that it would take to kind of seek out a vendor do a RFP process, keep the vendor apprised of the changes, explain the site. It just felt like I might as well just build it because it's, you know, half of this is in my head.

Matt Kleve: Sure.

Nevin Katz: So, yeah. So that's kind of how I got into it. So even though I was doing I think mainly the, the coding end, you know, the PHP end the kind of the, the database end of it, there was, there was a great team I was working with. And it's, it's always so important for me to have that because people catch things that I don't and they're able to you know, give insight that I'm even in terms of what to call a content type. You know, there's there's little things like that that, you know, I can go back and forth on, but it really helps to have another pair of other pairs of eyes on it.

Matt Kleve: But the naming things can be important. I was on a project a couple three years ago where there was a discussion about what we should name something, and at this point I don't remember what side I was on, but I think I ended up being on the wrong side because when the same project or the part of the project got reused a year later for for an event because of what it was named, the person doing the work thought it was doing something that it wasn't doing. And it ended up causing a problem that, I mean, it got to be fixed, but it was just one of those things like, you know, if it just would have got name something slightly different and...

Nevin Katz: Yeah.

Matt Kleve: Moving on to building stuff, that's kind of where we are. We've talked about moving the data over and some of the custom code. A lot of the stuff doesn't come over like you, you had written about how you had a bunch of JSON feeds that were being consumed, and you had to kind of recreate those and make sure that it was going to work out for you. What did you find in Drupal, Drupal nine. How'd that work for you?

Nevin Katz: So so I found in Drupal nine some some good news and some not so good news. So the good news is that a lot of the stuff that I had relied on some third party code for being creating machine readable views in this syntax we call JSON was handled basically in Drupal core because they had the services module all set up, they have some other supporting modules for services. And that allows you to create using basically just some point and clicks some and without a lot of other module installs some pretty well rounded REST API. REST stands for Representational State Transfer. That's a fancy way of saying that when you have one system talking to another system, they don't really change state. And nothing is really saved in between exchanges. And it's this handshake that's pretty vital for our app, it's vital for the PowerShell scripts that kind of pull our content down, and it's also vital for the custom modules that simulate how the app looks. And none of that got moved over. And so what? And so the not so good news that I found, even though you can create all these great REST API goodies in in using core is that the syntax is only slight, it's just slightly different the way they have the the JSON arrays and the way they look in views...

Matt Kleve: Custom code could have gotten you the rest of the way.

Nevin Katz: Yeah.

Matt Kleve: But.

Nevin Katz: And and that it did and and that it did.

Matt Kleve: Okay.

Nevin Katz: But I decided to do it on the app side and not the Drupal side. Just because I could, it was the type of thing where I felt like I had more control over the app code base, and it just seemed more natural to add make make the app aware of which API it was using. So it involved kind of two areas of effort. And it introduced kind of a new phase after kind of moving over the bulk of the content, which was figuring out the API. And this involved recreating these Drupal views, which are they're all kind of JSON views. And if you go into Drupal views that you're using the the rest exports view and the rest export view is basically a view for machines. And since machines don't really care about how it looks, they just want they just want the stuff. It's just rendered in JSON. And you can view it in a browser to make sure it looks right, but ultimately it will be the app or website or whatever machine you're using to pull in that view. So I ended up, Melody and I did a good chunk of work recreating these JSON views. And at the same time, that was kind of part of it, and then the other part was re-creating a little more code in the app so that it could, number one figure out what type of view it was using Drupal seven or Drupal nine, because at the time our Drupal seven was still active.

Nevin Katz: And number two just be able to parse all the parse all the new JavaScript syntax based on the based on kind of the new format for it. And it was a subtle format. It was I don't want to get too into it, but it's it's how the how the multiple arrays were structured and, you know, the keys pointing to arrays and all that. So they they had a simpler, more streamlined version in Drupal nine, which now that we're done with it, it's great. I mean, I like the simpler version, but it was just a shift. So so we we built out the views. We built out the we built out the the custom code. Some of the views were rather complicated because like how I point out, we use paragraphs which are within, you know, they're, they're basically groups of content within larger content. So to help us to, to help kind of get things all into one JSON page. And that's also called an endpoint. It's like the destination URL that, you know, the app will request.

Nevin Katz: To get that all into one page, there were two modules that really helped the REST Export Nested, which allows you to nest, it allows for your JSON object to be a little more complicated. And then there's Views Field View, which allows a, it allows you to take one view you make and then nested within a larger view. And those were the two things we needed. But I'm glad that they, seem to be kept up to date and they worked pretty well for us, so.

Matt Kleve: Very cool.

Nevin Katz: Yeah, that's kind of how we how we went about building the API. So, you know, again, now that everything works, it's it's fine that the API syntax is different, but it's it did take a little bit of a shift, and I learned it. I figured it out early on during the discovery phase. So I, we budgeted for it, but at the same time, we didn't get to it until we got through those other hurdles. It becomes a real hierarchy of need thing with the migrations, because you just feel like you need to get your content over to survive the next day, and then you have then you have to build out the core functionality and then, you know, you get progressively get to, you know, the less critical things. So it still took a few months to get to the API.

Matt Kleve: Sure.

Nevin Katz: Yeah.

Matt Kleve: So it based on your list here, it looks like we're starting to get toward the end at this point. You know, we've got custom stuff going. We got the API working again. The next bullet point on the list is that you finished up with that final drush migration, and then you're ready to ready for the early launch, right? The soft launch.

Nevin Katz: Yeah. There was there was one other thing that that came before that which was just kind of working on the theming.

Matt Kleve: Okay. Yeah.

Nevin Katz: Yeah. And I, I just wanted to touch on that because one thing that I think Drupal has available that's nice are a lot of pre-built base themes. We ended up going with a bootstrap based theme and ended up building a child, a child theme off of that. We used because the site is parts of the site are rather complicated, and because I'm used to how sass works, we ended up using sass and compiling it to CSS.

Matt Kleve: Yep.

Nevin Katz: Used gulp to compile it.

Matt Kleve: All very normal these days. Yeah.

Nevin Katz: All very standard. All very standard. Uh, you know.

Matt Kleve: But but it's an extra layer of something you have to do.

Nevin Katz: Yeah. It is and yeah, fire up gulp watch. And you have to also make sure other people, if they're going to do theming work, are comfortable with you know, using that workflow.

Matt Kleve: Did you check in your CSS?

Nevin Katz: Yes.

Matt Kleve: This is a Knives Out moment.

Nevin Katz: Yeah. Yes, yes.

Matt Kleve: Okay.

Nevin Katz: So we had to make sure that all that was working and we also and it was a rather I think, informal theming process in the sense that we really wanted to concentrate most of the time and budget on just building the thing and getting it done. And because it's a small audience, we we try to port some of the colors of, in general, theme over to the new site. But we a lot of it was just kind of focusing on how to make things clearer and, you know, rethinking a few things with the, with the color palette. But fortunately we had a small team of small a small team on this. And so we had a few calls where we got together and I would show them some pages, show them the site map, kind of give them some direction about where I was going. And then they let us have at it. So so that got done. I, I don't want to make it seem like it was a huge like it was just a footnote because the theming was an important part. But I'd have to say that compared to some of the, you know, compared to, you know, the learning curve with the migration and even learning to build out the views and the custom modules, the theme kind of went, went without incident.

Nevin Katz: What I would say, though, for Drupal migrations in general in terms of theming is it's really good to get together with whoever is going to use the site and just walk through the site and talk about how the site is used from day to day. Because even if you have a design that's done, it can be it engineers, developers have to make these micro decisions about how to make certain things show up and certain, and sometimes there can be a gap between intent and what actually gets done. So I think the more you know, the more I was able to get a sense of how the content authors want to use the site, and that goes for other projects that I'm kind of more in a management role of. The more we can get a sense of how users use them day to day. The smoother it goes and, the less you know, the less migration aftershocks you end up having. So yeah.

Matt Kleve: Very good, very good. So then then did your drush scripts? Just run and everything was was peachy keen?

Nevin Katz: [Laughter].

Matt Kleve: Ready, ready to put in front of users.

Nevin Katz: We, we got tons and tons of errors. It's it's the type of thing, you know, I was used to kind of creating custom paragraph scripts. And so those took a lot of those took a lot of tuning. And it was the type of thing where things started to incrementally work, like maybe you got, you know, maybe you got you know, this set of paragraphs migrated, but oh, there's this set with a special condition that needs to be tried again. And we need to modify the script for this. Or, you know, we were able to get the we migrated the nodes before the paragraphs, we should have done it the other way around, you know. So there's all always that trial and error. But I mean, I'm, I'm under no illusions that anything will ever work the first time ever. So...

Matt Kleve: We've all kind of done that. It's the yay, yay. It's a different error message reaction, right?

Nevin Katz: Yeah. Pretty much. It's just a question of like how many error messages I'm going to get. So I'm like, oh, okay, I think I have about 20 errors to go, then this will probably work. I will say though that the, the, the custom drush migrations pretty much did work without incident. I mean, it was the type of thing, I'm sorry, not the custom drush migrations, but the boilerplate drush migrations where you would the boilerplate drush migrations would work without incident for the most part. If something didn't work, it just wouldn't work. And we would either. We would find another solution. But typically when we wanted to migrate over new nodes, and this was kind of in the twilight of the migration when people created a little bit of content on the Drupal seven site, we just wanted to move maybe a few video slide nodes over. We would just we would just kind of run that migration and, and the nodes would move over, we'd manually add the videos and that would be that. And there's not too much more. There's not too much more to do. There were some we had we ran into a few walls. I know that migrating files, I think was tricky from a drush standpoint. So so that was a tough one. And then another thing that required a bit of a custom solution was writing was converting files to media, which I think most people doing Drupal migrations are pretty familiar with that. So but it is something to be ready for if you haven't done it. Media has this nice, fun browser that allows you to reuse assets. But to do it, you got to migrate your files. So that was a step as well.

Matt Kleve: And then you turn the the users and in this case the computers loose on the new site and continue to iterate from there, right?

Nevin Katz: Yeah. Pretty much. By the time we did our official launch, we had already had people using the site for to some extent to just create content on a low key basis. What really became the test was when people started using the apps to pull down content from the site. And so that's when I was on pins and needles a bit kind of, you know, wondering how you know, this or that demo was going to go or wondering how wondering, you know, whether all the, all the content would be pulled down correctly. That's just as much about the API as it is about the site itself. It's also about the app to an extent. So we were, ee were turning tablets loose on the site, tablets downloading content. And then we had a real uptick in content entry there. And so one so one thing that we just that's just kind of become a, a tradition after the migration is, is just taking feedback about and this is about two or 1 or 2 weeks. One of the things that's become common is just getting some post-migration feedback from people about what needs to be changed, and that happens, that's happened with my site, it's happened with two sites that I was overseeing and it's happened with other sites. There's just it's the journey does not stop when you finish migrating. There's usually other things that have to be done. And in our case, I think it was just adjusting permissions on fields, making sure that everybody could get to the pages they needed to get to, and making the authoring interface is as intuitive as possible. So it's just kind of a combination of theming and going into the admin panels and checking some boxes. But we got there so.

Matt Kleve: Good.

Nevin Katz: Yeah.

Matt Kleve: What was your timeline? I guess I'm not sure I...

Nevin Katz: Oh, that's a good question. So we started it's difficult to to say the timeline. Kind of there wasn't like a, a complete continuous timeline because...

Matt Kleve: It's also not something you were focusing on every day of the week, right?

Nevin Katz: Exactly. It wasn't I wasn't able to. So there were I'd say we started in earnest in February of 2021, and then we ended up finishing in December of we ended up launching the thing in December of 2021. But there was, I think, a 2 or 3 month break where I, I didn't really do too much on it just because there was there was other EDC projects that I had to do and and people weren't ready. It didn't make sense because there was just this big boatload of content. So I, you know, that was another thing. I wanted to make sure that the content stabilized to the point where it just made sense to kind of pick back up again. But that was another kind of advantage of taking it internal, because I was able to kind of you know, read, read the tea leaves a little bit about when, when people were going to kind of wind down with the content entry and, you know, plan the migration push, you know, at various times. So yeah, but that was the timeline. So I guess it was a it was a little under it was a little under a year. But I think if, if it weren't for those breaks maybe it would be more, I don't know nine months or so. Maybe 7, 7 to 9 months. So it's hard though because it's like I said, it's not a totally clear timeline because there was so much going on.

Matt Kleve: Sure. And another question I had was what you were doing locally to I guess, virtualize the the current production environment and continue to work with that database. Were you doing something like Docker or?

Nevin Katz: Yeah. Yeah, that's a great question. So we so we, I elected to use Lando which is a, it's a command line dev tool that I think is pretty common around Drupal developers both within EDC and with other companies that we end up partnering with on migrations. So I'd gotten used to it with another website. So I fired up Lando and that Lando uses its Docker to set up its protected container. So my first migration using the GUI was using a Lando site. And part of it was I had a colleague who was using Lando and I wanted to I wanted to kind of use her recipe. [Laughter] So I was like, alright, if I'm using Lando, I know I have a shot at this working. So I did that. And as, as far as, the local setup. I set up two sites, of course, one being the Drupal seven site and one being the Drupal kind of a new Drupal nine site. Now the Drupal seven site was it doesn't did not function like you know, your our normal stepping stone Drupal site. I really had to prepare it for the migration. And so for that a big part of it was just turning off all the non-essential modules and you get a sense of what the non-essential modules are using that GUI script. Even the GUI script does not do everything right. But one thing that it does help you with is it can give you a sense of what can be, you know, what modules are causing problems and what could be tough to migrate over. So a lot of it was just kind of really stripping down the external functionality. And it's almost like having a local site running in safe mode, because nothing is really nothing is really on except the stuff that's needed to store the data. So.

Matt Kleve: And when you break it, you can build it again, like it's no big deal. Yeah.

Nevin Katz: Right. So I ended up then setting up my Drupal nine site, and the Drupal nine was a starter site. I learned quickly that you have to be really careful about what modules you turn on, and it's best to kind of make sure that those are fairly secure modules not in their alpha or beta states, because some of those are going to break the workflow as far as they're going to break the migration process. So it's best to be very conservative about what you turn on initially. So I only had on the modules that I felt were needed for the migration.

Matt Kleve: Okay.

Nevin Katz: And once I had those on, then I would run some test migrations and just back up every time there was a, there was even even a hint of a successful migration. I would back that thing up. And those those really ended up being kind of almost the save points in a video game. Just just, you know, you know, getting to that flag, saving that database. And if anything goes awry, you can kind of pull that Drupal nine database back in restart from where you left off. So I ran through that a few times so that, so that I, I felt like I knew what I was doing. I had a good sense of what would come over. And it really, I think over time, you know, became a dress rehearsal for the final migration because eventually you get to the final one, right? So all the content is in there, you have your local site that has all the content you really want to move over. And so what I did locally was basically run the GUI, run the GUI migration one last time, and then run through all my paragraph scripts, run through any sort of kind of boilerplate, boilerplate scripts I wanted to run through and then then push up the site and then and then then the rest was kind of fine tuning after that. One thing that kind of helps in this is the ability to export configurations.

Matt Kleve: Sure.

Nevin Katz: So if you do find yourself moving quite far along with a Drupal nine site and say you've built out some views and some content types and you're worried about for whatever reason, whether you're using the GUI or some other reason, having to, you know, roll back to an earlier database, you can export your database as a, as a configuration. And then if you have to import an earlier database, then you can reimport all those lovely changes you made. And with any luck, it won't it won't throw errors. But that that helped in a few cases where I had gotten far along with views and wanted to you know, pull my work back in.

Matt Kleve: Well, I appreciate your story today. Thank you for coming on. I enjoyed that, you know, you are an experienced Drupal person. You've been around for several years now and done plenty of Drupal work, but this was kind of the first project of of this type that you had done. And I enjoyed your article and, you know, kind of the blow by blow of everything you learned and had to figure out along the way. And it's something that a lot of people out there, and that's why I decided to talk to you, because it's something that a lot of people out there are going to have to figure out what their what their next step is with their Drupal seven sites. And they might have had a stay of execution, but

Nevin Katz: [Laughter]

Matt Kleve: It's still...

Nevin Katz: They may have had some amnesty.

Matt Kleve: Amnesty. There you go. At least it's been put off. It's like, yeah, you know, that that, that that date is going to be pushed off for a while, but it's still something that they're going to have to face in the future. And, you know, you had a team you were working with. But...

Nevin Katz: Yeah.

Matt Kleve: It was something that that you figured out along the way. And I it was a really I don't know, it was a cool story. Thanks.

Nevin Katz: Yeah. Thanks so much. I appreciate your kind words. Thanks so much for having me on. And happy to come back if needed. And best wishes with your future Drupal migrations.

Matt Kleve: Are you ready to do it again?

Nevin Katz: Would I do a migration again?

Matt Kleve: Yeah, 7 to 9.

Nevin Katz: Sure. Yeah. If the opportunity came along, I think there have been a lot of lessons learned. And it's always tricky kind of figuring out what to maintain and what to do internally versus, you know, what to partner with an external firm on. But yeah, if it if it came along again, it's it's definitely an interesting challenge. And you learn new stuff every time. So yeah, I think I'd, I'd be willing to climb that mountain. I think I'd have to probably you know, maybe take a few more months off before doing it. But, you know [laughter] it does take something out of you because, you know, it's it becomes once you start, it becomes a real grueling timeline. So I think I'd have to have to do a few meditation exercises before getting started again. But it's also you end up learning so much and it's a different it's a different space to be getting into. I've been doing Drupal for the better part of a decade, and getting into the migration was was a real new thing. And you end up learning a lot. And you know, some of it's fun, some of it's scar tissue, but you end up becoming a better developer for it.

Matt Kleve: Sure. Is there anything else you want to add before we wrap this up?

Nevin Katz: Nope. Just thanks for having me on. For those of you who are interested, I do have a few other articles out there on paragraph migrations. If it does help anyone out there who's sees the storm coming and there's some other pieces I have out there on how to get up and running with Lando. As as well as a few just other random tips on Drupal migrations. So if, if, if those help anyone out there, feel free to give those a read.

Matt Kleve: Very good. I do have one more question for you.

Nevin Katz: Yeah, sure.

Matt Kleve: In looking at your bio today, it says you're an author and illustrator. Tell me about Dr. Birdley Teaches Science.

Nevin Katz: Yeah. So before I was a web developer, I taught high school for eight years in both Western, Mass and in the Boston area. And while I was doing it I wanted to find a way to make science more accessible to to kids. And I was I also had just finished reading Scott McCloud's Understanding Comics, which was kind of an inspirational book. So I, I made this cartoon character, Dr. Birdley who was he was kind of a a thinly veiled kind of me character and and use that to just kind of write about science concepts. I started out as kind of a, you know, a ballpoint pen. Things kind of that I would do at, you know, at home, after school or during my prep. And then over time, I kind of made it a little more made it a little more refined and ended up expanding it into a set of curriculum materials in a book series. So it was a fun journey. And it was actually, I think, building the Dr. Birdley website, Birdley it's BirdleyMedia.com it's gone through a lot of evolution. But that was the thing that kind of got me into web development in part. And it was one of the things that kind of drew me to it because I enjoyed doing it. So but I look back on those days fondly. I don't have as much time to do illustration with all the Drupal migrations going on, but it was it was a fun part of my life.

Matt Kleve: Very good. Thanks, Nevin.

Nevin Katz: All right. Thanks so much.

[Intro music]