The President, my name is Ryan Barr. Hi, Brian. Could we get you to sit over there so we can get you on camera? All right. So super quick background. Well, as Vice President, last term, so last two years, took over President after Joe in May. So it's my first time really going through it. So bear with me, but I think I got a good team around me. Does everyone have a copy of? Can I just print it off? Thank you, Ryan. Yeah. So what you'll see on the cover page, where it says expenditures and income, that's our cover. That's our older format that kind of does a basic breakdown. To start off, we're looking at a 9.61% increase over last year, getting into it a little bit more. We'll run through some changes that are kind of notable. In the income section, you'll see that our donations are down 50% from 2000 to 1,000. And then down a little bit lower, various fundraisers is up 100%. We doubled from 3,000 to 6,000. That's just a wide item change. We did a really successful fundraiser that we think we're going to continue. So overall, we're looking at a 6.3% increase in our income. How much did you make during that successful?  We made about $12,000. We don't want to count on that every year, because that was the first time we've done it in a lot of years. But we do plan on doing it again, both of which from the letter campaign, we made about 11,000. And then from pie breakfast, we made about 1,200 somewhere in there. That's why you'll see 6,000 for the fundraisers. And the donations, we feel, are just unmarked in donations. So someone sends us a check and we cash it, whereas fundraisers are more of that. And then moving on to admin. You'll see a new item. Various fundraisers are expensive. That's to go with the fundraisers that we just talked about. Annual dinner has a 33% increase, as well as computer and reporting software right below that, which has a 30% increase. Both of those are kind of just out of our control. The cost of food and renting locations has gone up as well as the cost of software. We use the same software. We're not purchasing anything new. Just the cost went up. Moving down a little bit more. Insurance is a big one. You'll see about $10,000 increase there. I will circle back to that when we get down to benefits a little bit more. But beyond that, there's not a whole lot of increase. That 10% increase is mostly due to that $10,000 increase in the insurance growing down a little bit more. Vehicles and emergency benefits would be the next one. Retirement went up 20%. I believe that's just the cost of it. I don't think we've changed anything. I'm not saying we're safe. That's due to the number of individuals that are enrolled and also the number of individuals who are collecting. So that number is all dependent on whose on our departments and collecting benefits. Urine stipend is where you'll see the biggest increase overall. We did this because we felt that a lot of our people in our department spent a lot of time outside of the responding, as well as responding. We did roughly 800 calls this year, with 300 being fire service and 500 being FAST squad, which is our medical side. We also have a lot of roles, so President and Vice President and our assistant treasurer, Secretary, all of that. They spent a lot of time outside of this that isn't necessarily reimbursed. I know I spend 15 hours a week, 20 hours a week, 20 hours a week. I know our treasurer spends more than that some weeks and a little bit less some weeks. But there's a lot of time that isn't necessarily reimbursed for. So we're hoping to start incentivizing that. In the last couple of years, we've had a lot of problems just getting people to sign up for them because there's a big time commitment and not a lot of reimbursement for it. So we decided to increase that by 18,000 with the hope of trying to shift our plan to incentivize those positions as well as continue to incentivize respond to calls. I should backtrack a little bit. I don't know if anyone, does everyone know our system? So we have the stipend check budget. And then for every two hours, you put in one point, round it up. So if you put in an hour, it's still one point. And then at the end of the year, all the points are totaled up and then divided by that number. So on average, it comes out to, in the last year, I think it was $6 a point. In years past, it's been $3 a point. So $3 for two hours or $6 for two hours is kind of how it breaks down to. So everybody gets the stipend based on their number of hours. Correct. But the officers are going to get more? No. So we do currently have the plan in place where the president or the vice president, whatever, they get a certain number of points for being in that position. I think right now, the president gets 30 points at the end of the year for just being in that position, which doesn't break down to a whole lot. For the time spent. So the hope is to re-ship those to be more concurrent. I know we haven't changed those in a lot of years, and the workload's kind of increased. Our call volume's increased, our workload's increased in the last couple of years. So that's the hope behind that. The points, if you don't mind, like cutting in. The points program gives points for the recording. My name is Nick Karbalacic. I've been on the Berlin Fire Department for 30 years. I've been a town resident since 97. And I'm actually the initial proposer of the point system years ago when we came up with this plan. The idea and the intent of it was that guys, people, firefighters, responding to the station were burning their own fuel, using their own vehicles, coming to the station and doing work. And it was to help reimburse people for the fuel used back then. And so the plan was a total number of points for the end of the year, with a fixed dollar amount to be divided up. And the more the people do, the more they get out of that portion of money. And that way, it was a fixed dollar amount that wasn't necessarily by the hour or an hourly rate where an hourly rate with a minimum wage cost and whatnot could be blown out of proportion with a disaster event and could really kill a budget with a disaster event. So the points program was to help pay the members back for the time that they committed to various tasks. So any meeting they attend, attendance is kept, business meetings, trainings, in-house of the department, out-of-house of the department. And people doing administrative work have provided that they document and submit a point sheet for the tasks they're doing. It is submitted for approval by upper management. And basically, as long as what they do took longer than an hour or so, they would get a point for that. Thank you. Yeah. Thank you. So I'm going to keep moving forward if we can sort back to that in just a minute. Anyone has questions? We, Paychips is something we implemented last year, last budget. That's essentially on the weekends right now. We pay someone, two people, four hours each on Saturday and four hours each on Sunday to be in the station doing some of the things that might not get done throughout the week, whether it be checking our trucks or doing paperwork or whatnot. Anything that might not get done during the week. And the whole plan is that we get those things out of the way and we can post our Tuesdays on training some more. And in the change, you'll see that last year, last week's budget, 2024, we budgeted 25,000. And in 2025, we actually dropped it a little bit and then moved some of that to insurance. We didn't quite proceed a $7,000 increase in work that's gone, which is what we had, which is in the insurance section. So we moved it to insurance and then bumped down the budget to reflect that. So when we came up with the $25,000 number, that was for the shift itself, plus some extra insurance increase. We didn't quite proceed $7,000, which was a bigger number. So that's why it went down and then insurance went up. Does that make sense? So that's why that number, that line item for that section is our biggest one, with a 26% increase. And then moving on a little bit more, building. So our building is getting older and there's some more things that need to be kept up. So that's why our building maintenance has gone from $8,500 to $12,500, which is a 47% increase. There's also some things that we're planning on doing, flooring the hallway or the tiling the hallway. We've talked about doing the stand-on building, that kind of thing, that will need to be done soon to keep it functioning. Kibble on the internet, increased by 1,020%. Our electric, 6%, heating, 20% increase from $25,000 to $30,000. Most of these are anything on our side that we've changed. The phone, we did switch phone systems to a newer system. But most of these haven't changed anything on our end. They're just increasing over time. And then moving on to vehicles emergency response. Communications equipment has gone up 33% from $7,500 to $10,000. Everything's getting more expensive. I can go back to that, but unfortunately, it's the truth. We have a plan to purchase X number of radios and pagers every year. And this kind of falls that guideline. I don't have John here. I don't remember what that number is, but it's similar to what we've been doing every year. I think it was $12,500 on the budget line. Probably the number of radios and pagers. I just don't know how many pagers that is, videos like this. And then our dispatch, 4% increase. That's a year over year, 4% increase. And then, which is out of your control? Correct. OK, correct. That is something that's set by dispatch. That's under control of the Capital Fire Users Group and with negotiations with capital dispatch. You'll see a 30% decrease in funding purchase. We're trying. Last year in 2004, we are trying to outfit our utility to be more of an all-purpose response. That's why we pumped it up for that one specific year from $12,500 to $18,000. We're just going back to $12,500. We just actually, this week, outfitted that utility, which is getting older. And so we're trying to increase the lifespan of it, as well as our rescue, which is our primary response for a lot of calls. And so we're trying to transfer some of the response away from that rescue, which is a really expensive piece of equipment that's starting to get older and starting to break more. We just spent $12,000 preparing the suspension and all that and then a couple more thousand on the generator. So that piece of equipment is getting really old. And we're trying to transfer towards the utility and get some more life out of rescue. The rescue is talking about about 20 years old. Our gear purchase, again, that's three sets of gear, I believe, for the $14,000, which is what we've been doing in the previous year. And then another big change, post-testing. So that's something that we have been trying to do at house. It went from $1,500 to $5,000. It takes a lot of manpower. It takes a lot of hours to go through all of our hose and test it in-house. And the hope is that we can have a company come in when they're servicing other providers in the area. And we can have them test it in one day versus us spending an hour and tying up a bunch of people and spending a lot of time. It's multi-hour, multi-people. So that's why we increased that. Beyond that, there's not a whole lot of increase. The vehicle and emergency response section actually went down, I'll also present, which is pretty nice. I think, I'll go back, I'm just summarizing it real quick. We're looking at a 6.3% increase in income, our department income, with a 9.34% increase in total expenditures. So we'd be seeking a 9.61% increase from the town. How come the insurance went up so much? So that goes back to switching some away from the paid shifts, which, again, was that $7,000. But what was the cause of the increases from the league? Do they say why it's more expensive? So we don't use the league. Oh, you don't? We are insured by VFIS. I don't believe we're able to use the city of town because we're a private organization. But either way, with having people in the station. That's what caused the increase? Yeah. So the more that we're in there, the more liability there is to the more increase there is. So when we went to this paid shift program on retail, my understanding is that being that now we have people working as a paid position that we're paying out of the rate, my understanding is that the insurance company looked at that and said, OK, you've got people actually working on the cloth. And therefore, our workers' comp insurance took a hit. Gotcha. And they increased the workers' comp insurance. Understood. Yeah, it's a double-edged short bar. It's nice to have people in there able to respond. Unfortunately, it costs a lot more to do that. OK, I just understood you. Yeah, there, thanks. Any questions? Any more questions for the board of fire department? Yeah, Tom. Thank you, Brad. There's talk of emerging the town and the fire company. Have you looked at the value of that with respect to this budget? I believe that's a couple of steps ahead. I hope that maybe the merger committee can touch upon that, as well as the short answer, no. I know there would be some savings in accounting and, potentially, insurance if you go to the league, but no, not like a dollar-for-dollar person. I would think the constituency would like to have that number when it comes to that time. I mean, I think it would be an important number for you guys to have in your background. I wanted to say that it was a good presentation and detailed. And also, I'd like that you're going to go forward with the letter campaign again and another pie breakfast, because they were very successful. Yeah, one of the things I personally love is community outreach. I love doing public event type people in the station. It also helps with the recruiting. The more people are familiar with our station, the more comfortable they are to come in and go on to at a time, whether it be an emergency response status or just helping out with fundraisers like that or helping out with it, something like that. That's a very good point. I would just encourage you that you don't do these things in a silo, because we have our planning mission struggles with this, our DRB struggles with this, is if we could act more as a community and so other entities, like the planning commission, can get involved in this thing, I think we have a greater reach in different social media points. Yeah, so keep that in back your mind. On everything you do, then you keep these, not just the select board, but these other groups involved. They have a, you're probably not on it, but the town has a distribution of agendas for these various committees, and I would just encourage you to get on it. You can always delete it when it's in your inbox, but there may be something that's on it that it's something that you could work collaboratively with. Thank you. Great suggestion. Any other questions or comments from the Brown Park Department? Here we go, thank you very much. Thank you very much. Thank you. Thank you very much. Thank you all for everything you do. It's really appreciate it. Thank you. Very much so. Much appreciated. Next on the agenda is the Washington Unified School District to revisit mailing your ballots. Tour? Mr. Chair, we've discussed that the past couple meetings, we have special guests with us tonight. We'll let her go into the actual details, but just on history, we voted on this December 20th, which was the late meeting from the 18th, we voted twice in the 12th both times with a short-handed forward. Since he happened on December 26th, we were short-handed again, so we did not take a vote on that. So we're with it again tonight and I would like to turn it over to Floor from the Supervisory Unit to go over the more detailed, the proposal and everything. So take it away, Floor. Thank you. Thank you for that introduction. Thank you for having me with you. I'm sorry I couldn't be there in person. I love coming to your offices and I haven't been there in a while, but I think you guys will receive, I'm not gonna read the language. I'm just gonna explain why I'm here. So in order for us as a district to send, to have all of our school ballots send out, we need to have the agreement of all of the five towns. So right now we Wooster, Kalas, East Montpelier have already voted yes to send their ballots and middle sex too. So I'm hoping that tonight when you have a bigger turnout for your select or we could bring, we would be able to make this possible for our district. Expanding access to vote by mail has been a major step for accessibility for a lot of people. I know that we don't always see as much of the, we don't have the data really to see how much of an impact this has made on our district, but it makes a considerable difference for people that sometimes have no access to transportation or wanna avoid lines. It just makes it easier for people to make their voices heard. And that is really important for us at Washington Central to make sure that we have as many people represented in this vote. And we have done it this past few years.  So with one town withholding, we wouldn't be able to send any ballots. We need to be able to have all the towns in agreement in order for us to do it. So that's why I'm here. And I'm happy to go through the language, but I know that you have it there. And it's basically, we take care of the expenses and our clerk would be, it's still some work for Rachel, obviously, but it doesn't mean that you won't be open on town meeting day. Of course, there's some people that are gonna come and wanna vote there. And we can mail our carrier center ballots. So we still are, because that would require us to lobby 18 towns because I also sit in the carrier center vote board. So this is really important. And that's why I'm sitting here today with you. Just please help us make it possible. Since we had one dissenting vote previously, Tor, your thoughts on this? I'm still have great concerns about security associated with the universal vote by mail. I don't believe it's a proven concept yet. And I think for the integrity of the process, we should not proceed forward this. Okay, any other comments on this? I was comfortable with what Rachel said as far as the voting and how it's handled. And I'll move that we approve the mailing of the ballots. You're second. I'll second. Any other discussion? So how much work is it on Rachel? Oh, she's in favor of it. Okay. She gets paid by the hour. How much work is it extra for? My sense is there was really no additional because the folks who come to your ballots come here anyways and have to get process so there's really no additional time. I was the impression I had as well. Any other comments? Hearing none, those in favor? Aye. Those opposed? Aye. Motion passes. Thank you. Yep. Thank you for coming. Thank you for coming, Laura. Thank you. Thank you, sir. Yeah. Thank you very much. I really appreciate it. Not a problem. This is the year 25 budget highways. Did we get the printouts for everybody? Got them right there. And did Tim show up? Yeah, he's here. It's all new to the folks tour. I think maybe they're looking for some guidance on where maybe some of the numbers came from. We have some color-coded things here. Maybe we start with that. I am trying to figure out... There, he's got it done, sharing it now. Oh, great. Is that coming through? It is, tour, yes. Thank you, tour. I'm not very good at this, though. I'm not going to highlight. Yeah, so we're going just to highlight. So if you go down, I always look towards you in the hallway. There's actually a couple sections of highways. You break it down into summer ropes. Starting there, 10-1-90-10. The wages for the summer roads, looking at a 3% increase, just like in the wages, just like we're looking at across the board. Overtime, just increasing a little bit. It took 2,500. Roadside mowing, tree trimming, small increase of 12,000 even. Chloride increasing a little bit to 35,000. Covert materials, keeping levels to 15,000. Summer equipment, maintenance and repairs, level funding at 25,000. And fuel increasing just a little bit to 35,000 due to perceived increases. We can just take it back. Moving on to the next section, which is winter roads. Here again, the wages and overtime, looking at a 3% increase in that. The blue item, the wages on call. That's where there's somebody on call. You know, primarily on weekends, they're given $100 a week. I believe that may currently be included in the regular wages, in which cases just the double open can be eliminated, but just checking on the common practices on that. In the past, there was a separate line item, but I believe now it's incorporated into the regular wages. Sand, we're keeping level funding at 80,000, same with the salt, the equipment, repairs and increase on the winter fuel. Any questions so far? Moving on to Highway General, asphalt marketing, stealing, looking at level funding at 160,000. I know we have about 97,000 from the Pine Hill that we did not get done this year. That we look to carry over. This may be one area that we may want to look at in the future. Gravel, looking at a small increase in there, to 155,000, 1500 and bridge maintenance, which is level funded. This is something we may want to look at increasing in the future as we did get some bridge reports last year, showing some deficiencies, nothing major, but I'm of the opinion that we can be more proactive in this and take care of some of the smaller items now and keep them from becoming larger items in the future. Roadside, level funded at 4,000, and same with guard rails at 10,000. Now, the big item right there, the 795,000, that is a worst case scenario for what we will be out of pocket for with our major projects from the flood, the Painter and Pike North, we're looking at about 150,000 there, 160,000. We're starting to get some numbers from the Federal Highway administration on that. Plus, we've got the Darling, Colbert, and the Wurchton Road Colberts. So that front. Yeah, we're gonna have to do the Junction Road there. Junction Road Colbert, okay. So then the last item, a lot of blue, that's areas we're waiting on, numbers from Cali as far as the workers comp and the FICA and disability and all those items like that. I would expect there to be an increase in the nose areas, but not much, just in line with everything else. Going down further, supplies with more increase in mares from 6,500 to 7,000, advertising level funded at 500,000, training level funded at 1,000, small increase in telephones from 3,600 to 4,000, garage maintenance utility, small increase from 20,000 to 22,000, energy improvements funded at 5,000, small increase in street lights from 12,000 to 12,500, same thing with traffic lights, small increase from 2,000 to 2,200, miscellaneous level funded and the same with uniforms, 10,500. And then if you go down a little bit further into the capital budget area, highway equipment and structures I have in there, 253,000 for a new loader, that's been something that's been identified for a couple of years now that needs to be replaced. So I have a lot of money in there for that. So I will let Tim jump in with any comments he has. He adores everything that I thought and it's little increases here and there, mainly fuel when it went off, try to keep it somewhat small due to the fact of what went through this summer, we still got a little bit of work to do next summer, but by the sounds of it, we might be able to pass that back onto the FEMA side as far as like grappling some of these roads that we didn't get sufficient amount of gravel on. We just covered them this fall. But by the sounds of it, we're gonna be able to do a little quick math, figure out how much more gravel we're gonna need and then just kind of pat the, they're still waiting for an answer if that's how they're gonna do things through FEMA or not, but not much for increases. The salt prices staying the same? They went up a little bit more this year. Every year they keep creeping. Yeah. Well, it takes fuel to mine it.  So without either coming from Massachusetts or Canada, Barrett's is really the only option we have for tons of Vermont. And they went up, it was $7 difference last year. This year it was a dollar. So every year they're going up a little bit. Good. Question. Just going back to the unreinversed FEMA flood damage, the $500,000 and then the paying term by local match, or match, sorry. Could you just go back and explain that again to me, to her? Okay, the FEMA doesn't cover 100% of our expenses on these. There is a local match, just like any type of dealing with federal or state governments. So the 795,000 is a worst case scenario at this point for the four major projects we have coming up that still need to be repaired. And that our local share would be the paying term by North, the estimate right now is 1.6 million total, which would give us 160,000 local match alone on that. Or does that include Richardson Road? That is included in that 795. So why she says 500,000, am I missing something? Yeah, well that's why I'm going at the 795. Doesn't say 795. I see five. I may be sharing the wrong screws then. Okay, that's why I was confused. So yeah, so I did break up that 160,000 from the 795,000. So there might be two lines. I would say 500,000 and 157,000. Okay, all right, so yeah. So yeah, I broke that out into two separate line irons. So that doesn't equal 795. So is the 500 supposed to be more? No, it's just better estimates of what we're looking for. Okay, that's all right. You mentioned a 200 sum K for a loader. That's total costs.  So that's spread out over several years. We're going to look to try to avoid financing that, but that is an option. I know we've tried to get away from financing over the last couple of years. And here, without wanting to get into the options tax and everything like that and capital budgeting process, you know, look at the future.  Any other questions for Tim? Yeah, street lights and traffic lights. Was that maintenance, repair? Is it a power bill? Is it a, well, all-encompassing? What is that? Three lights I can't, as far as I know, unless, I agree, my power bills us for the lights that are around here for bulb changes or maintenance on it. But street light, as far as traffic light, is the hospital light that we maintain. Fisher Road and the mall entrance. And they've been saying for a while now that that's getting to the point where at some point it's going to be even upgrade in the computer system. We keep going. Everyone's been a while, we'll have a little glitch and turn into a lot of shit and everything else, but also the bulbs, whenever they replace the bulbs now, they replace them without any fees or anything close to being out of all the old stuff. So it's maintenance and power bill all the way up to something. Yeah, but it is a power bill. Okay. And that's correct on the street lights, that is the power bill from Greenmont Power. Did you have a question? Hearing none, thank you very much, Tim. Thank you, Tim. Thanks, Tim. Thank you. Crew of licenses permits, vouchers and applications. I make a motion to approve payable warrant 24G15 with check number 23625 to 23646 in the amount of $15,477.98. Also payroll warrant 24-15 for payroll from December 17th of this year to December 31 of 2023, paid on January 3rd of 2024 this year in the amount of $59,444.91. So it was from December 17th of 23 to December 31 of 23. Just to clarify. I'll second that. Any discussion? All those in favor? Aye. Aye. Both motion carries. Round table, go. Yeah, so if you remember, probably about a year back, Deputy Chief Halsworth came up and gave a presentation on communication, communication, let's say, grant that he was looking to apply for. Okay. Went through the process and just before it was issued, basically the state pulled back. And so we did not get that grant money to do the upgrade that we were looking to do for now. There was two parts that communicate that presentation. One was the grant to do it now and also to then plan for the future and have something 10 years down the road. So Capital Fire is having a meeting on the 17th and we're looking to have all the legislators there and probably looking for some support from our local community to select board to go there to ask the questions. And this is important. Communication is huge. I don't care if it's fire, if it's EMS or PD. We've been struggling with that, with the PD and the new radio system. So that's, I'm just saying, I would really like to see a number of you there at that January 17th meeting, which will be at Alumni Hall in Perry. At what time? 7 p.m. Thank you. Can you send a reminder? I will.  What's that? Slow? Nothing for me tonight. Thank you though. Carla? I can't think of anything. I'll have to come up with something for next time. Dora? Received an email from the town clerk. There are three select board positions up for reelection this year. Carla was finishing up the three year term, which is up and then Joe and myself with one year terms, give me instructions and everything on how to submit petitions. I think it was due by January 29th, if I recall, hang on a second. Also, talking with Rachel, we had moved a couple years ago. The town meeting, pre-town meeting will be Saturday, March 2nd, starting at 10 a.m. Hopefully the fire department lunch and the following are just keeping those states on your mind. I have nothing. Entertain a motion to adjourn? I make the motion to. Go ahead. Yes. Just last year, when we talked about a cross-down I want to ask you guys tonight, because that was going to come around sooner than later. Last year, when we talked about it, I believe it was under the influence of the guys who said it was up to me as long as I don't notice that everybody is still good with that or... Probably revisit it next meeting. I think that would be good. It doesn't have to be right off. Okay.  You might be surprised. We just looked through it a week ago. That should have been closed. The roads were breaking up. That was awful. Okay, motion to adjourn. I make the motion to adjourn tonight's select board meeting. Check it out. All those in favor? Aye. Aye. We adjourned.


I'm Chris Chang, you can find me on GitHub at CRC Check, my Twitter handle is ccrrccrccr. You can also find me on IMDB, I'm Chris Chang too. I'm also looking for more Pinterest friends, I'm Cphanel on Pinterest. I currently work at Tabbed Out, but a lot of the knowledge that I'm going to be sharing is things I've learned from a lot of my time at the Texas Tribune too. You may have seen a lot of other Texas Tribune people around, oh I see something right there. So everyone always talks like this with dictionary definitions, Wikipedia says technical debt can be thought of as work that needs to be done before a particular job can be considered complete or proper, and then something Gene Kim says is left unchecked, technical debt will ensure that the only work that gets done is unplanned work. Another thing Gene Kim says about technical debt is that it's what you feel the next time you want to make a change. And for me personally, technical debt is every line of code. And just in case you're curious, I checked and Urban Dictionary does not have a definition for technical debt, but I also think it's important to just know about what technical debt feels like, and it's when you fix one bug, only to create another bug. And it's when you can't even deliver features anymore, because you don't know what repercussions your change will have. And it can get so bad where you can't even install security patches because you don't know what will break. And it's when you're using a rapid development framework and you can't rapidly develop. It's when you hear a lot of, it works for me around the office every time you're trying to replicate something. And the great thing about Django is it does let you build things very quickly, but it can also get you into this technical debt trap. And the main thing that I learned is that you don't want to let Django become the scapegoat for your team's inability to develop new features.  So like there's no magic trip tips for how to clean and technical debt. So anyways, here's some tips. I've kind of organized them from things you can do on your own to things that you can do amongst your team and finally things that require going outside your team and to the non-technical people in your organization. So first thing is Django testing. You should do it. There's three other sessions at DjangoCon about testing. Don't let your dreams be dreams. Yesterday you said you would write tests today, so just do it. Make your dreams come true. Just do it. So when should you write a test? Because a lot of times a lot of people will just, there's a lot of, I find that there's a lot of reluctance to writing tests in the first place. So maybe if you can ease people in, that would help a lot. And something that I always thought was if you're making an assumption, that's a good sign that you should be writing a test to check that assumption. And I can see justifying not writing a lot of tests up front, like doing TDD. A lot of people might consider that premature optimization to be writing a lot of tests up front.  And you will get, you will sleep better when you have good test coverage. That's a fact. So I want to give an example about testing your assumption. Let's say I had a function where I just wanted to turn in a zip plus nine or a zip, a U.S. postal zip, I just wanted the first five. So that's pretty easy. I mean, it's a string, I'll just take the first five. But if you look at these examples I've set up, and I've written this as in the form of a doc test, which I personally don't use, but it fits nice on a slide. You start to see at the bottom my assumption that taking the first five digits falls apart. And if you have tests then you'll be able to catch that. And if you don't have a single test, here's one that someone posted recently, and that's if you just use the client to load your homepage, I don't have the facts to back it up, but you'll get 80% test coverage just from this one test. And the thing that I really like is if you like a feature, you better write a test for it. So coverage is another great tool for just helping you discover where you should be where you're missing tests. And a lot of organizations will strive to get 100% coverage, but it's more important that your tests are quality. If you're writing a test to get, for example, just checking the Unicode method of a model, may or may not actually be useful, you'll have to find that on your own. So some signs that your tests are crappy. One is like, can other people read and extend your tests? Will they take your tests and use it as a template for their own tests and be happy with it? Are the tests getting maintained whenever the code is getting maintained? Or are people getting frustrated because they have to also maintain the tests? And the tests describe the problem in a way where you could throw away the code and people could use the test to rebuild the code. And it's not only the tests, but the same could be said about your documentation and maybe even your readme. Could you throw away all your code and could someone use the readme to reconstruct your entire application? Another thing that's a big source of technical debt is bit rot, also known as software entropy. And I think that if you're not actively touching a piece of code, it's getting worse just lying around. It's also a sign for me, it's a smell as an organization if you don't have the manpower to actively maintain all of your code. And if you're interested in this kind of learning more about this, there's a series of management books called the Improvement Cota, also known as the Toyota Cota.  But maybe you'll have better luck. So if you imagine the code of your organization as a globe, are there areas where there's like hereby dragons where people just don't know what that code is and they don't want to touch it and no one knows what it is? That's why it's important that everyone at the organization knows as much as the code as possible. And one tool that will help developers be a lot more productive in this is continuous integration. One quote that I made up based off of this other quote is, any task you do at least once a month should take less time than it takes to get a coffee. There's a post, it's been there the whole time. There's this guide here that is a really great intro to a lot of CI tools. Some that I particularly like are Jenkins if you're doing stuff yourself. Travis CI is really great if you're doing open source stuff. The great thing about Travis CI is you can even do like post GIS testing. I didn't know you could do that till last year and I think it's great that a free tool will let you write tests that require postures. Tox is another great tool. It'll help you run your test suite against different versions of Python and Django just to know will the next version of Django break my tool or not? Here's an XKCD I really like that just basically tells you whether or not it's worth to automate a task. And here's the opposite XKCD saying that you should never automate a task, I guess. So code quality is also a really basic thing. There's a difference between a senior developer and a junior developer. Practice makes perfect. Always iterate on your code. A great thing to help with this is just working on open source projects. Keep your code simple. Code that requires less context to read is more understandable.  You can do fancy stuff in your code as long as it's a pattern that's reused across your code base and that the people you're working with are also familiar with it. For example, if you're in a Django project and you're using pandas to do some filtering, that may not be simple, but if everyone on your team is also a data scientist, that may be the most obvious tool for everyone on the team. Avoid special snowflake patterns. I always choose readability over performance. Let the tools catch up to coding style, not the other way around. It's not like Python is being directly executed by your computer anyways. And the great thing is Python has something built in called import this, and if you never run it, this is what it looks like. Except I was just wondering if anyone else constantly misspells import like I do. I cut it off, but import this will just give you the Zen of Python by Tim Peters, and I actually had it printed out and put it up on my desk. And if you're looking at a piece of code and you're wondering what you should be doing with it, it's good to have this in the back of your mind too. Here's an example of two ways to do the same thing. Let's say I've got an iterable of objects and I want to get the Instagram attribute out. I really love functional style, so I personally love using map, but every time I do it in code review, my teammates say I should just use a list comprehension. So I guess now I do a list comprehension. But I guess just look at this like right now and just see which one looks more readable to you. And there's so much discussion around code quality. Here are some of the keywords you can look up. There's whether or not comments actually help or hurt code readability. There's something I really like called cyclomatic complexity. The great thing is that you can quantify readability, and if you throw this into something like a Jenkins job, you can actually track how readable your code is over time. There's the whole Pepe discussion, and PyFlex is kind of an extension of that. So I mentioned code review. Code review is probably the same most practical way that you as a team can get better. A lot of people say that people take too much time to review, and people just want to deliver. And some people might say, I'm the boss, or I'm the big boss. I don't need code review. Or we need to push this Hophix out ASAP. But we all know that coding under pressure is the best. And it's always perfect.  Can you still do code review? You can, I guess. What I do a lot is I'll sleep on a change. Just opening a pull request puts all the code in front of you. It gives you a new view of everything. You'll discover patterns that were, oh, why did I name it one way up here? And change the name down here. That's things you can't see on a commit level. But you'll be able to catch that on a pull request. And if you just want to practice, you can practice with others on an open source project. And this quote I really like, it's as iron sharpen, it's iron. So does one person sharpens another. And that really applies, I think, to code reviews. And to do a code review, you do a pull request, usually. And the general rule about pull requests is, a lot of people would say the best practice for pull request is one pull request is only one change. And I am saying, if you want to reduce technical debt, you should bend this rule. There's something I learned called the Boy Scout rule. And I thought it was do a good turn daily. And I wasn't sure what that had to do with pull requests. And then I thought it was be prepared. And I wasn't sure how that worked either. But it turns out that the Boy Scout rule is based off of the quote from Robert Baden-Powell, leave the world a little better than you found it. And the idea is, if you're in a pull request and you're going in and you see typos, just go ahead and fix them.  And the cutoff for this, though, I would say is, if you start having to mess with tests while you're doing this, that's a sign that this little change you're making is going to be, is going to actually hurt the readability of the diff enough of the pull requests where you should leave it alone, open a ticket, revisit it later. And code review is also a lot more than just reviewing code. When you're reviewing code, you should also be making sure that what the code is doing is repeatable. I guess, for example, that is I wrote this utility last week and I was trying to run it and it wasn't working. So I went back to the pull request that added it and discovered that I was using the utility in the complete wrong way. But I had it documented in the pull request with the right way to use it was. And also along with the code is documentation. For example, if you're adding a new feature to your CMS, there's users for that CMS. You have to make sure that they know that this change is coming and they know you have to educate them about the changes that are upcoming. I think I just said that. And then there's also just, is this code maintainable? Does the feature you're adding justify the technical debt that you're adding? For example, you may decide that to get this in the template, you use a template tag. But then during code review, you may decide, wait a second, you can just use this jQuery one-liner to do the same thing. And that's an example of doing like two things, one with significantly more technical debt than the other. And if you're really interested in code review, I think Raymond Heddinger's Beyond Pepe Talk is really great. It is the most hyped talk that I've ever heard, I think. And I think it justifies it. And going back to how, if something is maintainable or not, there's something that I liked doing on my pull request at the Texas Tribune. And that's, I would add a technical debt note. And the basis of that is on fiscal bills, they would have something called a fiscal note. And I'll read with the legislative budget board of Texas says about that. And just substitute in your head the technical pull request version. A fiscal note is a written estimate of the cost savings, revenue gain, or revenue loss that may result from an implementation of requirements in a bill or joint resolution. It serves as a tool to help legislators better understand how a bill might impact the state budget as a whole, individual agencies, and in some instances local governments. So you can see the idea is that when you're building code, you have to make sure that you can deliver it over the long term. And probably the best way to actually really accelerate the code review process is paraprogramming. It's like a code review, but instead of having to wait for someone to comment, then you're like right next to them and it only takes a few seconds. My preferred tools for doing this are TeamX and Vim. But you can also just stand next to each other. We're not stand or sit. And just be on the same, you can even be on the same machine. In this case, the human is the driver and the cat is the navigator. And there's also a variation of this that I've learned about. I've never tried it, but I'm curious about it. It's called PeanPonPairGramming. And so where one person writes a test, then the other person implements the test. And then they swap it back and forth. And the difference, one difference is that with PeanPonPairGramming, it's actually an async process. You don't actually have to be there next to each other. So you can do it, I mean, you won't have it as tight as a feedback loop as actually being next to each other. But you can get close to true pair programming without that. And it's also very important that you just get along with your teammates. When you're hiring, you should make sure that you only hire people that you get along with. I know back at the Tribune, we assumed that once people came to us, they were technically proficient. And at that point, we would just hire them based off of whether or not we would get along with them highly. And I would say that the worst coworker ever is probably past you. So now going outside the organization, I mentioned this a few times already, but any action you can take to get a faster feedback loop over every action and every change is something that you're going to try and do, want to do. You should learn how to say no. You should learn how to embrace failure as an organization. What I like to do is try to make myself obsolete. I think you should always work like you're training your replacement. And the idea behind that is that if you're automating away all the routine stuff you have to do, it frees you up to do the more creative things. And can you go on vacation or a conference without bringing your laptop? And as an organization, you should admit that technical debt is a problem. That way you can start treating technical debt as a ticket to be worked on instead of something that just swept under the carpet. If you treat paying off technical debt as a feature, then you can actually act upon it. One thing that'll help is actually writing out your technical debt items as actionable small tasks. Something like upgrade Django to version, change this old view to this new pattern that we started using. And something I like doing is I really like just writing a list of technical debt.  I use poop for things that might be publicly embarrassing. And then I use this table flip guy and I change the size of the table based off of how frustrating it will be to code the solution. And so there's some things about agile that I think even with you're using agile or not, there's things you can take away from it. The main thing is it's not just about sprints and tasks, but it's also what I really like about agile is you're always improving the process that you work. And I think a lot of agile is actually just common sense wrapped in marketing jargon. So Django is great. It lets you write things with less technical debt, I think. The testing framework of Django is the best I've ever seen anywhere else. Every time I use another framework, I wish I was using Django just for the testing. It has batteries included. There's less boilerplate to do a lot of the same things. And it's got a lot, it's got a great community. If there's a feature you want, someone else has probably already worked on it. But I do have some tips for working with Django. One is don't customize the Django admin. Think of the admin as a developer interface, not a CMS. If it seems like it's a lot of technical debt to write your own CMS, it's based off of my experience, it's actually not. Because when you're writing an extension to the Django admin, what you're doing is you're tightly coupling your admin to something that keeps you from upgrading Django in the future. Because guess what, the Django admin changes without every version too. And a side benefit is if you write your own CMS, you'll often end up with a better user experience for your customers. And if you want to use a custom admin element, guess what? There's hundreds of them. This is just a screenshot of the Django packages page for admin extensions. The other thing you can do is clean as you cook. When you're in your code, just delete it. That's what source control is for. If you think that there's a feature that you might actually want, don't comment it out with a block comment. Wrap it in an if statement.  You could even extend that and use something like Django Waffle or an AP testing framework to actually turn it into a feature switch. And the main thing is if you find something, if you see something, say something. If you see something terrible, make a ticket for it so it's not forgotten. Another thing with Django is naming things is also really important. There's actually a talk about this on Wednesday. Are the names you're picking greppable? For example, if you're using S for a variable name and you want to find and replace all instances of S, you're going to have a bad time. Use unique app and model names. And the main reason for that is the Django will let you have your own namespaces and build your own apps and model names, but there's enough places where they all come together where it's worth it just to try and make everything unique. And the other thing is make your variables in your test read as if they're English. And for example, here's a contrived testing example. Let's say I have an article and I want a manager that only gives me the active ones. So I've got all these required fields. So when I make an article, I have to add all these fields. But here's an example using factory boy where now my test setup only has what's relevant to the test. If I'm only testing active articles, here I've explicitly said, give me an article that's active. And then as opposed to like assert A is in this query set, now it's assert this article is in this query set, which reads more like English. And the thing about unique names is I really love shell plus, which is part of Django extensions. A great thing it does is from one line, you can start missing with objects immediately. And if you don't have unique names using shell plus, you lose that ability of shell plus unless you start adding more technical debt in the form of shims around shell plus. And another tip I would have say is avoid the Django test client. Don't use it for unit tests, but do use it for integration tests. Because when you use the test client, you're not only hitting your view, you're also hitting the URL router, the request middleware, all the parts of the review, the response middleware, the context processor. And who knows what else? I would say avoid model inheritance. There's not to plug Django extensions again, but Django extensions does come with some examples of what an abstract base class or a mix-in should do. There's a timestamp, date field, there's a title, slug field, things like that that are very routine. You can definitely do that as a mix-in, but you shouldn't read the feature that Django has model mix-ins and then jump to try and use it everywhere. For one thing, it'll make it very hard to trace what field comes from where and where you're jumping around. You'll just get lost very quickly. Another thing is this goes back to kind of touching everything. Something I like to do is every time I have a pull request, I just like checking to see what's at a date, and I like bumping any requirement that I can. Of course, this only works when you have test coverage. And the other thing you can do is you can trade, you can purposely get rid of technical debt and purposely give yourself technical debt for depending on what you're optimizing for. Something that I think freed up the work at the Texas Tribune a lot is something I call a Tuck-up Bell feature. And there were a lot of sections of the site that were frozen, and there was a lot of content. But the problem is even though this was old content, whenever we added new content, it would change all the old content as a side effect. So the idea was, is there a way to freeze this content in a way so that we can continue developing without having to worry about what changed? And you should ask me or anyone else about how that works. And the great thing is after we did that, we deleted so many templates, so many CSS files. We could delete so many models after that. It was amazing. And when you're developing a feature, you should decide upfront what you're optimizing for. Is it more important that you deliver the MPVP as quickly as possible, or is it more important that this be something that that it can sustain for a while? Like if you're a startup, getting the first to market is a real thing that is probably more important than building something maintainable. I'm surprised how many people haven't really seen this. This works for contractors, but it also works for code. You should decide, good fast or cheap, pick two. You can't pick three. You can also pick one, but what are you doing? And so I like to write crappy code sometimes. My general rule is if everything can fit in one screen of code, I can make it as crappy as I want. In fact, if this is throwaway code, I introduce errors on purpose just to make it look, just to make it obvious. Because there's nothing worse than finding a piece of code that was hastily written, but also has unit tests and documentation and then realizing that the author had no idea what they were doing and was just making stuff up. So in preparation for this, there's a lot of material about this that I found I really enjoyed. These are actually videos, not reading. I've got links to these, and if you just Google these words, they'll also take you to the right place. Here's some reading lists that are, here's actual reading. I actually read a real book in preparation for this called The Phoenix Project. So you'll have to find that in a bookstore. Look for this book when you're there. And if you can't find that book, look for this book. So there's a lot of other similar tangential discussions about that. Each one of these could be their own talk and are talks too. There's like microservices versus monoliths. There's the single responsibility principle. One that I really like is knowing about the not invented here principle or syndrome.  And I put insert product development buzzword here. But really, if you're really caring about this stuff, you should look into, go outside, technical talks and just look at business strategy and product development. So this is my homework for you. These are all the important things. You should get frustrated while you're at work, but get frustrated in a constructive way. I also think you should be as lazy as possible. Automate away as many routine things as possible. Try to always get a faster feedback loop in any process. Always be touching all your code. Treat fixing and technical debt as a feature. Clean as you code. Foster a generally good coding culture at your office. Remember that everything must be repeatable and plan ahead for the whole life cycle of the product. And thanks. Keep making Django sausages. There's a link to view my talk. And for some reason, you can also run my talk as a Docker container. Okay, question. So when you're coding along and you're looking at this code and it's all building up and inevitably every programmer in the world looks at and goes, I'm going to have to change that later. I just know I'm going to have to change that later. But I need to get this out. How do you decide? Because inevitably some technical debt will build up because of schedule, because of lack of information at that moment. But you could in theory stop and take the time to do it the perfect way. And either way could be reasonable. So how do you make that call? I'd say it's called by by management almost. And what I like to do is I like to litter my code with with to do's. And I have like keywords I use. One thing that I really liked is with you can have a Jenkins job actually that just indexes all the to do's in your code. And you can kind of track that over time too. Thank you question. And just to note statements to begin, I have a comment or not a question. Do you have any experience with a wide variety of skill sets where some people are far ahead with newer technology or far ahead with more of the legacy things you're working with and keeping people on the same page when moving forward? Yeah, having as much overlap as possible is something you should strive to do. Pair programming is the best way to achieve that. But it's everyone's different. So that's not a real answer. You should try to do code review and pair programming. They can. And I kind of like that. But they can also turn into bike shedding sessions too, which is why you should keep the pool request as small as possible. Where does where does bit rot come from if the code itself isn't actually changing? I hadn't heard that. Well, I think the requirements is a good example. If you're if you can't if you freeze your requirements and you never upgraded them, your app will always work. But eventually you'll want to make a change and you'll discover that it's not backwards compatible. There's one of my links actually talks about the organizational debt. Is the way we look at tickle is wrong. One of the points he makes is that if code is left alone, it's fine as long as it works. And there's the truth in that, too. If you've got code that's drowned and works, I would say just if you have to change it, be prepared to throw the whole thing away, though. Hi, thanks for the talk. A really important topic, especially for large projects. I wanted to ask you about Django Waffle and AB testing framework. How do you keep something like that from kind of exploding all the branches in your code? And like, how do you manage all that complexity it creates? I don't have that much experience with Waffle, but in my own mental planning for that, I always thought if you can track what switches you're actually using and make it a task to go through and turn dead switches to static code. If you make that a feature that you have to code and you plan for, then I would say that's how I would deal with that. Hey, thanks for the awesome talk. It was great. I was wondering, do you have any tips for how to incentivize good code quality within a team? Because I find like the stick method is definitely much less effective than the carrot method of like getting developers to buy into this kind of stuff. Yeah, my thought about this is to use bots. Basically, if you have a GitHub as a new feature where you can't merge pull requests and let us meet criteria now, some people just may not listen. That's why also like the whole hiring thing is also part of it too. It's kind of terrible, but sometimes you just need to change your team. But also, people may have a hard time listening to a human, but if you have a bot that says the simple medical complexity of your code is too high, reduce it, or the code coverage is not there at it, I want to say that people will look more likely to listen to a bot than another human. And thank you very much.