Hello. This is Successfully Integrate Teams of internal and external developers, so hopefully you are in the right spot and are comfortable. I'll get started now. My name is Meg Ponkett and today hopefully I'll be able to provide you with some insight and possible suggestions on how you can work in a team or project manager team that is not just made up of in-house people. A little bit about me. I'm a senior front-end developer at Volunteer.net. I have about five years experience specifically managing and working with mixed teams in a developer capacity and so internal and in-house development teams are being inundated with requests for more and more work. These are development teams at large organizations and medium-sized organizations and groups that are finding that they can't support the amount of requests being made for new apps, new web properties, products, integrations and services. With this influx, it's even difficult for them to maintain their current properties and services that they already provide and because they're overwhelmed by the sheer number of responsibilities and properties that need to be refreshed and new features that needed to be added to existing applications, they most of the time do not have the resources to feasibly implement the work. So they then need to supplement their team or department in another way. So here are some situations when organizations decide to hire externally. They need additional resources. They don't have HUD count or budget. They need to supplement their internal team with a missing skill set or if there's a lack of expertise for a new product or service and if they're unable to find suitable local development talent and also if remote full-time work or telecommuting is not an option. It could just be that project development needs to move faster or they need a specific service like consulting, external project management, design, analytics, etc. So what do I mean when I say a mixed team? It's really a development team that consists of members that are not all employed by a single company or organization at the top level. So how does this affect project management? I believe that managing mixed teams provides a unique but not unusual set of circumstances in talking to people. A lot of groups are experiencing that they are not only or are no longer just working with an agency and having them do all the work. They're really trying to work with the people they have in their organization along with the people that the agency or vendor provides. So mixed teams can certainly successfully deliver a product or project. They just need to work together to accomplish the goals of the project in a different way than a strictly in-house team might. These teams do have the same goals of an in-house team like completing work on time, coming in under budget and making the stakeholders happy. The only difference is that they have some added challenges. So positive, possible positive outcomes for projects of mixed teams are that the project can finish ahead of schedule or on time because of increased velocity. The work could be of higher quality because of the expertise of the developers or project managers that you've brought on. They may have previous relevant experience in what you're trying to build and the project can finish at or under budget as the people who are not on your in-house team can switch to other projects when they're not allocated or resource to your project. Some cons though, this mixed teams can mean more work for project managers or scrum masters or team leads. Building trust and reliability, which are both fundamental to achieve success, is harder to accomplish with a mixed team. The project can take longer than expected because you're dealing with a lot of different resources and then the work quality can take a hit if the project is not ruined or it's rushed or untested. And if your project is close to being over budget already, hiring more people definitely pushes that budget over. So before we discuss what can go wrong, let's talk about preparation in an effort to maybe avoid some of these things. So I think as a project manager or scrum master, you're situated in such a way that with the right preparation, you can set up your team for success. So in order for internal and external individuals to work well together, I think that in-house teams need to be invested in the idea from the beginning. So it's likely that the external individuals that you're going to be bringing on are experienced with working with mixed teams due to the nature of them being at an agency. But your internal team members may have not worked already with people from an agency or developer. And so if, for example, an internal team member doesn't really feel that they want to make the effort to work well with external or temporary contractors, that can pose a very large issue for you later. So getting them ready is great, and if you can build enthusiasm for the idea, that's even better. And so I would encourage including your existing team members in the agency selection process. So a lot of times when an organization or company is going to start working with external people, it kind of happens over here, and the development team doesn't have a lot of say in who or what or when it's going to happen. So getting your team on board with the idea and working with vendors or external developers from the start of the process can be beneficial. And you can even ask your team, like, what roles do you think we need to fill, who would be best suited to help us with this new project, and so on. You can do some research with your team, request references, ask for recommendations, examples of work, case studies, ask to see work from the agency that is similar to what you might be trying to build, and you can even request recommendations from that agency or vendor's previous clients. And I think if you also ask to meet with the people who may be working with you from the agency, you can ask them what project did they recently work on, how long have they been working professionally, in what ways can they add value to your team, and then allow your team members or select set of them to review the code of the applicants if you're hiring specifically for a dev role. And I think that this increases that team buy-in that you're trying to build. So once you've narrowed down some options, ask your team if they've worked with the agency before, if they know anyone who's worked with them, and then for Drupal-specific work, you can look up the company on Drupal.org because you're trying to review and come to some sort of consensus about who you're going to go with. So just in summary, investment from your internal team plus preparation equals a strong foundation. You want to set your team up for success, and you also want to set expectations that the internal members will be collaborating with the external developers. Like they're not just going to come in, take the project away, and then all the stuff is going to happen, and no one will have any say. You're building the idea that it's going to be a collaborative effort. But then there are pitfalls. So I'll go through some and then quickly review the main ones that I've seen in my experience. So pitfall is a hidden or not easily recognized danger or difficulty. So number one is over-resourcing the team. And this may seem a little strange, but an over-resourced team is one that has excessive or unnecessary resources, especially one that is overfunded or overstaffed. So having too many people on your project can actually lead to an inferior result. And so if you start accepting or bringing on additional developers that are offered to you because they're available from an agency due to your timeline and deadlines, even if they're not needed, that's going to add some complexity to your project. Likewise, requesting developers with skill sets that duplicate skills you already have on your team without enough work to cover all of those people makes things a little bit more complicated. And then keeping on developers that you aren't able to keep at capacity due to the ebbs and flows of your project makes the team quite a bit larger and more, that means more work when you're managing them. So pitfall number two is neglecting to leave room in your budget for additional costs. And these costs can be things like bringing vendors on site for kickoffs, big meetings, and product launches that travel on the onsite accommodations and meals need to be billed to somewhere. So that's what I'm talking about, leaving some room. Also if you're having a long term onsite arrangement, like you need to take into account the commute costs, again, housing meals and incidentals because you're having those people live where they're working. And then you may need to improve the external developers tech stack to match what your in-house developers are using. So that could be hardware, software, licensing accounts, which I'll get into a little bit later. And then if you are bringing on people from outside of the country you're where you are, you'll have to get some temporary work reviews for international vendors. So you need to leave room in your budget for these types of costs. Pitfall number three is filling to allow time for additional communication. And I know that communication is a big thing that a lot of us struggle with, but maintaining the vendor relationship can take more meetings, more calls, more check-ins, and that's additional project management overhead. So regularly communicating with the vendor side management about the project takes time, like this update emails, communicating changes and decisions, coordinating between multiple vendors, that's all added time. The extra communication and feedback with the vendor's management when things aren't going well is also an additional communication cost. And negotiating the ongoing terms of your arrangement will, as the contract ends, will need some extra massaging and probably some extra calls. So external work will stop on the end contract date if you don't have a new agreement ready. So it's really important to start these discussions early with enough lead time before that end date. And then it can also be justifying the cost of adding external developer time to your upper management or stakeholders. So that can result in extra meeting time that you were anticipating during your week. Pitfall number four is attempting to save money by hiring less experienced people. So if you're signing on with developers who may be less experienced in order to save money, that can end up costing you more in the long term. Their hourly rate may be lower if they say you're going to learn some things from your team and like get up to speed, but that might mean extra time for them to complete tasks. They may not be able to identify problems early. They could be less confident in promoting great solutions and or conversely overconfident in promoting a flawed solution. It could take more revisions to get the work 100% right and you could have that work done again by a more experienced person later if you can't just like figure out what's going on. Generally, you'll have more questions coming to you about the requirements or if things are looking the way they're supposed to, like with more explicit instruction. And this all requires you as a project manager to dedicate more time to documenting and specifying tasks so people aren't left guessing. And last my pitfall number five is adding more developers to a project that is behind schedule. So if any of you have read or heard of the book the mythical man minds essays on software engineering. It is a book on software and project management by Fred Brooks. The central theme is that adding manpower to a late project makes it later. This is idea is known as Brooks law and it's presented basically in that signing on too many resources at once in order to get work done faster on a late project instead of ramping it up will cost more time, money, effort, etc. So you can think about this as onboarding and resourcing per person multiplied to an already late project. So this is just a quick summary of those five pitfalls resource the team based on the work that you have and need them to do already budget for unexpected costs allow time for extra communication hire the right experience level for the work and add and remove developers deliberately from your project. Okay so those are things that can go wrong but most of the talk is about how to identify things in your organization and then some team building that you can do to make your internal and external developers work together well. So issues can arise on these mixed teams due to the fact that the external developers don't have the same organizational exposure as the in-house developers they haven't been working with you for a long time they may not know for example how the politics of higher ed play out and so they're kind of just coming on to the project and with the desire to help you but they need a little bit more context. So these are my suggestions on how you can onboard new members to your team whether they're external or not. So these developers will not necessarily be familiar with your organization or industry and with that in mind it's helpful to bring people up to speed during that onboarding process. Excuse me so if you leave adequate time for onboarding or the training when I mean when I say onboarding I mean the training time needed to bring new members up to speed. If you leave adequate time then you're really setting them up for success so if you cultivate a culture of documentation in your project not only will that help people get to know what's going on then you also have a resource going forward and a strong set of onboarding documents helps external team members and new hires in general have a great integration experience and so another thing I like to point out is introducing the external members to your team as though you would introduce a new internal hire. So that only lets people on the team know who it will be joining them but it makes them feel like they're part of the team and not just some hired person that's going to be writing code. You can explain any acronyms that are widely used in your organization and similarly define or clarify any internal jargon and what I mean by that is special words or expressions that the team uses and it's also helpful to explain the hierarchy of your organization like who reports to who and additionally if there are changes in the hierarchy it's critical to update the external team members promptly so if they had a contact with one person and they're not there anymore that they know what's going on. So defining project roles and responsibilities this is critical especially on larger and multidisciplinary teams. It's important to make sure that the role each person will play on the team is clear so you don't have overlapping role responsibilities and define who is responsible for what so who is the overall project lead, who is the scrum master, who is the release manager, so on and so forth and maybe these things seem obvious but if they're not then it helps to make it clear from the beginning. You can delegate the management of an external developer or any contractors coming on to other employees on your team that aren't yourself in-house and that can save you time if you have a large amount of responsibilities as the project managers on the project but assigning that responsibility to a team member who's not expecting it can cause issues so they may not know that they need to keep that person busy and assign them work or they may not have the time to check in with them regularly and review things while additionally getting their work done so you just want to make sure that if I'm paired with the front-end developer on the in-house side that we both know that and we're going to be checking in with each other and that she's going to give me work and I will keep her updated on what I'm working on so before developers start work it's helpful to get them set up with whatever they'll need to do their job so that means providing necessary accounts and granting their permission granting them permissions where they need it so this is a very dense slide but just some examples of things that if you can get them sorted ahead of time make work progress a lot faster initially so that can mean email account access to any sort of document services you use any project management software chat accounts SSH keys to servers VPN access all these things kind of make sense but fall through the cracks when you're starting to bring new people onto your team things like giving them grant github permissions to your projects software licenses and if you're going to be having the external developers come into your office think about getting them set up with the building that you work in office access keys or badges id cards and then any security clearance training and of course a desk or workspace and along with that is optimizing calendars and scheduling because this can get very complicated as I'm sure you know if the entire team is not using the same calendar software it's possible to double book meetings for people to miss meetings and so on and so forth if you ask for and note the external team schedule holiday vacations and then communicate those dates to your team and then also similarly share your team holiday vacations it clears up who's going to be working when and why if they show up to the office no one's there it's happened so it's also nice to let the external team members know if you have a holiday whether they're expected to be working or not you can make sure to add meetings in the calendars of people that need to be there that doesn't always happen and then mark individuals as optional if possible and I'm very sorry if like all of this seems obvious but these are just things that have happened and cause issues with projects getting completed on time so you can also share any type of organizational office expectations you have because it may not be obvious for example we work from home on Fridays so please also feel free to do so would be a great way to let everyone know what is going on or we bring in lunch on Tuesdays and we eat together and learn so that way people coming in will know that they will be encouraged to participate with your team building or professional development time so let's get into resourcing and resourcing both internal and external developers is challenging keeping everyone tasked and unblocked on a large multi disciplinary team can be complicated and I have some ideas you can preserve the allocated time that you're paying for and what I mean is that sometimes people will rotate external developers on and off the project quickly on short intervals and every time you do that it adds more time to environment setup onboarding ramping up time and energy from you and the rest of the team so if possible you want to set yourself up in a way where you're starting with the developers from the agency and they're going to work with you throughout the end of your agreement might be mindful of not allocating developers beyond their contract that can cause issues and that means like reconciling their time against how much time you're going to be paying for and then also in the beginning when they're starting to work with you if you can assign clear and straightforward tasks that don't require a lot of background or context of the entire project initially that will help them like get warmed up in your code base and with how things on the team work so that they feel like they're productive and that they add value to your team early on and if you are resourcing to be a fast approaching deadline as I'm sure we've all been in that sort of scenario before if you can figure out what work is in the external developers wheelhouse and assign it to them when possible that means that they're going to be getting that work done really quickly because they already know what they're looking at and they're just going to get it done and you want to give the long-term work to your internal team members in circumstances like this whenever possible because you never know what's going to happen and you just want to make sure that you're setting everything up in such a way that it's not going to cause problems lit down the road if someone was working on a huge migration and then they're not working with you anymore. Just being pragmatic about who's doing what at this stage and focusing your internal members on the highest priority or sensitive tasks like be it security or what have you whenever the skill sets align in such a way it's it's better when a stakeholder comes in and is very motive about what's going on if you can say the internal developer that you know and have seen in the face of before is working on this problem to address it as opposed to having this person that they've never seen before and haven't had the opportunity to get to know yet so kind of um creates a little bit more comfort for people who aren't necessarily in your day-to-day team happenings so let's talk a little bit about team dynamics and as a project manager or scrum master you are in the best position to impact the dynamics of your team specifically being clear with all members on start and end dates time and availability so for example D will start on June 1st and will be working with us through the end of December or we have 30 hours of SAM's time for the next four weeks you know these things as a project manager and you're situating everyone on the team in such a way that they know what's going on and can adjust the dynamics of the team accordingly no and that also prevents surprises later on so fostering the experience of a cohesive team it's imperative to set the tone an example be an example of how the team will function as a unit the external developers do have an extra layer of management and responsibility to their company but you can still make them feel like they're part of the team um so that means create creating and follow a set of processes that work so maybe what was working for your in-house team before you brought on people isn't working now that you have some external people coming in to work with you to work with you I'm sorry so being flexible and adjusting some of those norms can be immensely helpful and you can adjust and iterate just as you would with bringing on a new internal hire uh it's nice to have higher-ups or stakeholders in your group recognize and thank external members for their work just you as they would an internal employee for work well done it just allows people to feel like they know that what they're doing means something to um ultimately the people who care the most and then um you can engage in team building just as you would uh with any other team so that means that if you want to go um to of some sort of sport event or um something outside of work and and you have external developers that are working with you on site feel free to invite them to come and like have them be a part of whatever you're doing in order to make it feel like you're all in this together increasing productivity on your team um you can make some of those process changes like trying heads down blocks of time that uh don't have any interruptions um you can scope work well for all the team members not just the external ones and not just junior or new members and you can set realistic goals and deadlines and obviously that's very simplistic but I think it's worth mentioning again that um these types of process changes can take time but do allow for things to go better and then maybe upgrading tools or making changes to your tools can increase productivity um if you provide better equipment if you're able or the next tier of software because you're hitting the max capacity um even something like the finally getting down to it to figure out why the internet keeps going out um all of these things contribute to increase productivity on your team so how can we improve collaboration when we're adding external developers um check in with your team frequently about whether you think the work being done and how things are going are going well I find that once we get into a project um we kind of stop talking about how things are going it's more about just getting through to the end of the sprint but I think it's valuable to really assess and step back if not in a retrospective but just casually like so how do you think things are going because those uh conversations do help create change for the better you want to know if the quality of the work is suffering and if tasks are accomplished in a timely manner but you also want to know if people are happy with what's going on um so in addition to checking in with just the internal team you can have check-ins with the entire team including the external developers if they're getting enough work not too much not enough or not the right kind of work for them and it's nice to do these things even in stressful sprints because then it feels like if people had something that was going wrong you could they have an opportunity to share that with you where they might not have been comfortable doing that if you didn't ask directly um because non-internal team members may not have the trust or feel comfortable pointing out blockers issues or so on and so forth if they've only been on the project for let's say three weeks um of course you if you're using agile you're going to be having scrum but one-on-one check-ins are also helpful and um this is especially true for people who are working on things that are hard for them because you want to keep the line of dialogue open to make sure that they're not just drowning in this long-winded task that may not ever have an end um I would to prevent that sort of situation encourage your all developers to work together and that you have a type of team where people can ask each other for help so that doesn't mean like only the internals asking other internals that means that there's communication happening across the team in all directions um and if possible if you can make the right people available to the other people that let's that those channels kind of happen naturally because if some of the critical team members are always in meetings or always um heads down that means that some things that could be solved in 10 minutes may take uh two hours because a quick conversation wasn't possible and then you can always ask for insight or ideas from not just your internal team members but the external team members and could be pleasantly surprised with any suggestions they may have for you communication is critical to success um so we want to communicate with skill uh some small things are uh learning everyone's name on the team and it happens it's difficult we struggle but it's really important and I think even making the effort to pronounce their name the way that they want you to could make a huge difference in them trusting you and feeling that you are valuable that you value them on your team uh this can also mean learning their preferred pronouns and using them and so when you make an effort in this way it makes people feel like they're an individual that is important other ideas for skillful communication uh you want to consistently communicate across the team this is assisted by using the same communication tools across the team whether that be chat email phone video calls what have you um you want to share any meeting links if you're working with remote people or people that aren't in your office in the calendar invitation because that means that they know where to go so that they can be in your meeting on time and ready to go and you also want to communicate changes or new decisions in a way that is accessible to all like posting meeting notes in a sock channel or in a google doc or sending out an email what have you a lot of times um this doesn't happen and then some time is lost to getting people up to speed recognizing barriers is also something that i think a lot of us struggle with um and don't really address so recognizing and adjusting to any language barriers be that um either technical terminology or what language we're using to communicate um that can be a barrier on your team and if you recognize it earlier then you have the opportunity to make changes as you go along you can if you also can recognize location barriers like if someone is unable to join the meeting remotely or if they can't clearly hear because half of your team is in a meeting room around a small um tablet device and everyone else is remote on a hangout um that is a barrier for them to clearly hear and know what has been said and what decisions that everyone else knows that they didn't get um and if you're following the agile methodology you really need to have all the team members participate in the stand-up as a developer i think the most important meeting of my day is often the stand-up and when you're working with people who either are in a different time zone or location if they're not making the stand-up that's a problem if they're a blocker for me or i'm a blocker for them because then we don't know that so if it's not feasible to have everyone participate in real time in the stand-up um using other ways of communicating the status and blocker information like notes in Slack or JIRA or google.com email getting that out on a regular interval helps keep the momentum of the sprint rolling uh just and of course everyone's unpleasant experiences do happen so how can you address problems and mitigate issues before they arise on a mixed team? I would encourage you to discuss the issue with the individual before going to their agency side manager um because if you go to their agency first before discussing with them you don't really give them the opportunity to work it out with you um as you would with maybe internal member you would take them aside and have a quick conversation if you neglect to give the opportunity to an external member um that can cause some uh conflict in an already probably unpleasant situation um and if you aren't sure if something is not if if something is not going well or something's amiss you can ask your internal team member that is working with that external member to see if they have suggestions of why something may not be working in a constructive and positive way but in an unpleasant situation for example if you have a developer that has become unreliable their dates are slipping um and even if you discuss it with them and nothing really seems to change my first step would be to reassign their priority tickets to other team members and assign them lower priority work and I say that because sometimes these things can take time to work out but you don't want your project progress to take a hit while that is happening so um you can try to meet with the team to resolve any group issues but if all of that doesn't really seem to make a difference then it's time to go and have a conversation with the representative from the agency or vendor so in a specific well specifically I've been talking a lot about how you might have your in-house team and you have external people coming in to work at your office but I didn't specifically talk about when you're working with external people and their remote and I know that a remote work is becoming a lot more prevalent especially in our sphere but I think there are some things that specifically relate to project management um that you can do to help to keep your team in sync um I will mention one of the benefits of having the external developers be remote is that they're less exposed to the politics and turnover in your company so if something is going on then they're able to continue working when there are issues um and then but one of the downsides could be that team cohesion and continued trust in the working relationship when you have external remote people could require further reaching out an effort on your part in order to prevent them from feeling detached or excluded from your team um so you need to go the distance to keep all members engaged and I think that external developers working remotely are a great asset to a mixed team and some ways to reinforce that they are an integral part of the team are to make a point that you acknowledge their efforts and provide positive feedback when the work is going well you can also find creative ways to include them in your team celebrations so if you had a great launch and you had shirts or water bottles made you can just mail them one so that they have the water bottle too or you can invite them to FaceTime or video call during a team happy hour or coffee break just making sure ahead of time that they know to have coffee or beer or what have you on hand um if you're going to have a team lunch you can send them a stipend or credit so that they can have lunch at their place of work at the same time and it's nice if they've chosen to share their birth date with you if you send them a card or just acknowledge it and stand up all these little things kind of make it feel like you are a part of a group that cares um it's also nice to provide updates on things that are meta to your external remote people so when someone receives a promotion letting them know that they can congratulate that person or if someone is going on leave that they can like let them know um and then any public announcements that happen in your office just translating that to the remote people is very helpful it's always nice if possible to pair an internal member of your team with an external remote person specifically because it provides a teamwork opportunity for them to work together and get to know each other on a more individual level as opposed to only seeing their face during a stand up time zones are difficult but they can be an advantage or a disadvantage a team that works across multiple time zones can definitely speed up progress but it can slow it down and a great thing is when you have a team working around the clock because you have them offset by six or nine hours but if they miss a day or blocked then you have to wait a whole another cycle for them to be back on track but if you establish working hours and have some overlap at the beginning of the end of their working day i think that helps prevent that sort of disjointed this person is asleep when i'm awake and vice versa um so clarifying who is supposed to be working when and then if you have early or late meetings or after hours meetings switching those off so that it's not always the one person missing dinner with their family but that you just have to get up earlier sometimes so that it's more fair oftentimes larger in-house organizations will work with multiple vendors or agencies on their projects and i just want to talk quickly about how you can have successful handoffs and transitions so establishing and maintaining documentation and spending valuable time on specific on specifications comments read me any testing documents when you're switching from one partner to another will definitely save some time because you have a central document that everyone can read if you have a clear start date and end date for each agency or vendor and you can possibly have them overlap then they can hand off their design work to the next agency's developers and get things quickly moving a lot of times people don't feel comfortable having their vendors talk to each other um but i think if you can facilitate that in a way where it's not a contentious transition um you can be in the room and just make sure that they can maybe have some knowledge share of what was working why they made some decisions and what's not working you never really want radio silence when you're working with agencies or vendors because that means that you're not up to date on what's going on with your project or product i always think that always having concise deliverables what is expected at the end of a arrangement or contract can be make things a lot more clear when you're switching from one to another or an agreement is ending so what should we do when we're done working with an external team um maybe things went great maybe things didn't go well at all but i think it's valuable to hold a team retrospective so that those things are clarified um you want to make sure that the site app or deliverables whatever they were working on are in your possession before you leave before they leave i'm sorry so that means having the designs in your dropbox or driver server and not theirs um making sure that you have access to all the accounts especially the admin accounts that were created in the process of your website development um that can mean hosting services and critical emphasis on the administrative accounts um so that you have control of what you've paid for today and then i'll think that a lot of people forget is to then recent permissions from agency or vendor developers on their last day and changing your passwords and you don't even have to feel bad about doing that it's just a safe way to protect your investment and not have any sort of um question about whether things were going on that you weren't aware of so thank you very much i hope that you have some good takeaways to go back to your team with and i appreciate you coming during lunch um if you please have time take uh or please take the opportunity to provide some feedback and uh again i'm sure everyone's been telling you but sprint day is tomorrow and everyone is invited so we need product managers we need bug reporters qa testers people to help write documentation so um please come tomorrow if you will still be around and uh if you have any questions please come up to the mic i'd be happy to answer sure how do you deal with slacking jira do you have any recommendations so you know you have all of these jira tickets flying into your inbox in the mail and you know pilot the members of the team are going off in in this last channel how do you get that so uh for me personally i always have my inbox empty so for example if i'm getting jira tickets and notifications i have some filters set up but i'll open the jira ticket in a new tab in chrome and um know that if i'm supposed to be if that's my priority i'll start working on that and close all the other jira tickets that i was working on um with noisy channels be it hip chat slack uh chat what have you um it is a lot but it helps to make an effort to set up channels and provide some sort of structure for your people in this channel so if you have a main general channel and that's it and everyone's talking in there that can be very noisy because you are seeing all of these messages fly by as opposed to having like this is our be hat channel where we talk about testing and this is for the front end things and this is our release channel so kind of being mindful about what needs to be talked about where and then you can mute channels during like i will have the release channel muted when i'm not responsible for being part of a release and then you can also set up and enforce people to use like at someone and not have at here or at all or at channels so that kind of creates a bit more space around people's resource and energy and ability to focus


Hello, thank you for joining me. It's early one morning just south of Tyne and Weir and today is the day of the IFA Road Run around to Tyne Valley and Northumberland. My larder is parked just down there. I've got here a bit early because this is where we're meeting. The reason I got here early because I just had to come up this hill to have a look at this. You can see it everywhere and I just had to come up and have a look. It's like a replica of the Parthenon. It's called the Penshaw Monument up inside because it's so big. I mean I've not been to the Parthenon so it's probably quite small compared to the Parthenon but when you're here it feels really big. It's owned by the National Trust so this is first time I've been to a National Trust place for a while, although if you may have seen some of the videos I made in lockdown, I talked about National Trust passports. There's no shop or anything so I can't actually get a stamp in my National Trust passport but it's just so impressive. Looks like at night it's all lit up so what we're going to do we'll find our way in so it's high on this plinth. There are some steps to take us up into the monument so have a look at that and look at the views. Before we go in there's a trig teller here so for those who don't know what trippler is they use for OSNAT so each one of these all line up with another trig teller and this one and this one are obscured by trees and this one is obscured by the monument but I could see another hill which I think probably was the hill with the other trig puller on so here is the monument. Got these steps just here.  So there's no roof on it, it's open to the elements but I think it's a really impressive building and great place to start the IFA road run. It looks as though in this column here, unfortunately we can't go up here but it looks like there's a staircase probably as far as staircase you can see there's a door and there's a little window there so there must be a small staircase going up. It'd be great to get on the roof and walk all around the top but I don't know if that's ever possible but I just really think it's a really impressive building as I said I've never been to the Parthenon in Greece I'd love to do it one day but in the meantime I'm quite happy to be up here and enjoying the view. So what I've got to do now for the IFA road run basically I've got to keep an eye out when I start to see a load of Thrabant and Larders appearing down there I'm going to make my way down there so we're even meeting we're meeting down basically at the bottom of this hill or possibly in the country park across the road so I'm going to walk back down get in the car and we're going to drive all round Northumberland in a big convoy so I'll show you Northumberland from the Eastern Block car rally. So as I come down from the Penchon Monument just a little bit of history it was built in 1844 as a monument to John Lampton he was the Earl of County Durham who had died four years earlier it's a hundred feet long and I think it was a replica of the Parthenon it's actually a replica of the Temple of Pesius in Athens and also Penchon Monument and here so as we come out here is where my Larder is waiting and a couple of them two straight motorbikes have turned up so they're we taking part in the rally today so I'm going to get in the Larder and we're going to go all around Northumberland I'll give you one last view of them. So here we are at the country park now across the road from the monument you might just be able to see the monument there above the trees the trees kind of obscure the view so as for the other cars that are joining us for this rally we have some Larders at the double it's Larder that's the saloon it's also Larder Reaver it's a 1600 SLX it's like the most luxury Larder Reaver sold in Great Britain we've got some Trevants free Trevants a Skoda in the middle and we'll go that side we can have a look and a moment ago when we got to the foot of the hill of the monument there was those two Eastern Block motorbikes I don't know too much about motorbikes so apologies I'm not going to be able to tell you what they are but here's those two motorbikes so we'll get the back views of the Larders here we have a tune from shades of yellow Trevant Skoda Google Wagon Trevant that doesn't have sides and I don't know if they're joining us off they're just here but that's quite a nice thing to see and it looks like we haven't had anything to do with it so that's it so quite an exciting thing to see so what's probably going to happen now a few more cars probably will arrive and as I said we're going to go for a huge drive for that 150 mile road trip all around the time valley and Northumberland before we get going now there's one person I want to introduce you to so majority of us are driving some are passengers some are sharing a drive but one passenger we have today in this motorbike is Olive Olive hello hello Olive I'm just putting you on YouTube I hope you don't mind so this is Olive she rides in the sidecar of this motorbike so she's going to enjoy 150 mile round trip around Northumberland after a spectacular drive across the Moorlands we've come fairly high up and I noticed we were going along by an old railway line which is here and if we turn around here we have the old parkhead station and quite a few recent block cars are mixed in with various other cars so we'll go down have a look at what which cars have come up here and because the old parkhead station is now a tea room so I've I've been driving this leg it was a really really nice drive I really enjoyed it and I might not drive the next leg and so I might be able to get a few shops of cars going along from the car but I've been obviously in my larder and it was quite nice because in the wing mirrors I could see another larder behind me some of the trams which are also coming this way so it's been quite an exciting drive oh we had so down where we started we had larders at the dub at the triple here we have skoders at the double so that's quite a nice ride it's been old um must have been old miners carriage when they'd taken miners on a narrow gauge railway down into the mine this railway would have been a standard gauge railway I believe this was just a good station it's all northeastern territory so before our next leg off the journey I'm going to go and get a cup of tea I'm just going to film this a bit arrived in hexon there's my larder with a trebant and a walk burger steak there's a few more of the cars down there and um we have another larder there and there's the one more larder over here so I was just thinking I wonder when the last time you could have come to a Tesco's walked around the car park and seen three larders it's um quite unusual to say to to say the least I should think at some point probably in the 1990s was the last time and you know you'd have seen more than one larder I mean because now it's very rare to see a larder anywhere and it's um you see me or one of the other larders out and about so we've got various trebants some skoders what I'm going to do though we're here in hexon never been to this town before I've passed through on the train for the past what I'm going to do I'm going to have a quick explore around hexon I'm going to put that in a separate video so do look out for that I'm going to explore hexon and show you around get lunch as well and then we're going to continue our 150 mile road trip around time valley northumberland we've arrived at Kilda water some of the other convoy just arriving it's a trevant arriving there's the uh Zaffer jet just parking up a few trebby's over there warburg I'll park next to the other larder because I'm really enjoying the opportunities that always go to park next to another larder and the blue skoda the blue skoda blue larder they go nicely together here's the yellow trabida warburg and um it's not part of our convoy but there's a rather nice rover just happens to be here as well there's the rest of the convoy the skoda warburg larder and the kubelwagen trebant as for where we've come to we have come to killed a water which is a very very large reservoir so I'm just about to show you that then we're gonna we've had a very very scenic drive really nice scenery up from hexon to here so it's really enjoyable drive this is where I've ended up look at that vastness of water stretching out across there it's a man made reservoir I could see the dam down the end as we came into here so this is where we've come for our afternoon break we're then going to continue back towards a new castle we've got one more place um that I certainly intend to stop so um you'll see where that is in a moment well we've just arrived at our final stop it's six o'clock we've been going since 10 o'clock this morning there's another larder now we've been driving around the northeast the time valley so there's only really one logical place to finish it angel of the north let's go and have a look I've never been here before seen it from the train a few times um and when I went to Newcastle a few years ago I could sit in the distance but I never visited it I wouldn't go as far as saying it's the first time a larder has been to Angel of the North but probably the first time you know this many eastern block cars have turned up at Angel of the North. There's put an electric charging station in it's not going to be much used to us a lot though and uh Skoda. So yeah quite exciting for all these eastern block cars to turn up here at Angel of the North and look at that for a cameo a traby an angel of the north as it uses some sort of sculpture perhaps somewhere more like um in Germany or Poland or Hungary but now we are here up in Gateshead and um here this really just completes what's been a great great low trip around um Northumberland and the time valley it's been really good fun so we've done about 150 miles today and um it's all been great and this is where we're finishing it so I'm just going to walk up to the Angel of the North have a look and um then I think um I might just jump in the larder drive to a metro station perhaps get a metro into Newcastle but I won't put that in the video I'll just be my relaxing after all this driving around today so here it is we're kind of approaching it sideways on it's pretty big go just down here so you can get a little I know I'm looking very silhouetted but so is the Angel of the North how big it is so we started at one monument and now we're finishing it possibly the most different monument to what we started at and um yeah I can't get it in one screen it's just too big we've got up close see what it looks so it looks like up close I've always wondered let's have a look so here we are literally I'm at the foot of Angel of the North you can just see the arms or the wing the wings yeah it's Angel of the wings hanging out both sides it's amazing so that really does conclude the road run of um the northeast and the time valley I hope you enjoyed this video thanks very much for watching um you never know you might be out driving one then if you see a load of ladders and trebants driving around then it's probably us a lot off on another one of our road trips because we will do these again later on in the year and for years to come we'll do similar road trips so thank you very much for watching please do feel free to like subscribe and comment from Angel of the North


Cool. Thank you. Well, thank you Jason for inviting me. Hello Dev Nation. I'm gonna share my screen here real quick Whoa, we just had an inception moment. Okay Already can everyone see my slides Everything was good. Cool. Great. Thank you so Hello Dev Nation, my name is Pandy Knight and I'm the automation Panda and I am a big Python fan just like y'all Currently, I'm the lead software engineer and test for precision lender a Q2 and Today, I'm going to be talking with you about Decorators and Python. So have you ever seen those at tags on top of Python functions? Maybe you've seen them on top of methods and classes. Those are decorators one of Python's niftiest language features Decorators are essentially wrappers. They wrap additional code around existing definitions When used right, they can clean up your code better than OxyClean Today, let's learn how to use them. So here's a regular old hello world function When we run it It prints hello world Nothing fancy here. Now. Let's take that function and BAM! add a decorator Using this at sign. We just added a decorator named tracer to the hello world function So what is this decorator? Tracer is just another function But it's special because it takes in another function as an argument that named funk Since tracer decorates hello world the hello world function is passed into tracer as that argument. Wow So what's inside tracer? This decorator has an inner function named wrapper Can you even do that? Well with Python? Yes, you can The wrapper function prints entering calls the function originally passed into the decorator and then prints exiting When tracer decorates hello world that means hello world will be the will be wrapped by entering an exiting print statements Finally, the decorator returns the new wrapper function Anytime the decorated function is called it will effectively be replaced by this new wrapper function So when we call hello world the trace statements are now printed, too Wow, that's amazing That's how decorators work Decorators wrap functions around functions Think about them like candy bars The decorator is like this foil wrapper and the decorated function is the chocolate bar inside But how is this even possible? That decorator code looks confusing Decorators are possible because in Python functions are objects In fancy language, we say functions are first-order values Since functions are just objects We can pass them into other functions as arguments Define new functions inside existing functions and Return a function from a function This is all part of a paradigm called functional programming Python supports functional programming because functions can be treated like objects and that's awesome So using functions as objects decorators change how functions are called Decorators create an outer decorator function around an inner decorated function Remember the outer function is like the foil wrapper and the inner function is like the chocolate Creating an outer function lets you add new code around the inner function Some people call this advice You can add advice before or after an inner function You could even skip the inner function entirely The best part is decorators can be applied to any function. They make sharing code easy So you don't need to repeat yourself Decorators are reminiscent of a paradigm called aspect oriented programming in which code can be cleverly inserted before and after points of execution neat So remember decorators wrap functions around functions like candy bars. Hold on now We have a problem in that Python code. We just saw if the wrapper function effectively replaces hello world Then what identity does hello world report its name is wrapper and its help is also wrapper That's not right in Python we use name and help to kind of figure out what functions do and if they're misnamed that can become very confusing Never fear. There's an easy solution to this The funk tools module provides a decorator named wraps Put funk tools dot wraps on the wrapper function and it passes the inner function object and Decorated functions once again show the right identity That's really cool But wait, we have another problem. How do decorators work with inputs and outputs? What if we decorate a function with parameters and a return value if we applied the current tracer decorator?  We can fix that too First we need to add star args and star star kw args to the wrapper functions parameters And then pass them through to the inner function This will make sure all arguments go through to the decorator in the decorated function then more mods We captured the inner functions return value and return it from the wrapper function This makes sure return values also pass through If the inner function has no return value, don't worry. The decorator will pass through a none value Pretty nifty thing about Python. So now when we call the function with the updated tracer We'll see the tracing is now once again successful And when we check that return value It's exactly what we expected it works pass through is awesome. Yeah, that's awesome But wait, there's more You can write a decorator to call a function twice Start with the decorator template that we had before and Now simply call the inner function twice it has a return value make sure to return the final value for continuity Bam, it works, but wait, there's more You could write a timer decorator Start with that template we had before Add the inner function and surround it with timestamps using the time module Bam now you can time any function, but wait, there's more You can also add more than one decorator to a function This is what we call nesting Be careful because order matters Decorators are executed in the order of closeness to the inner function so in this case Call twice is applied first and then timer is applied even though timer is the one on top If these decorators are reversed in order Then each inner function is called with timed cool You guessed it. Wait, there's more You can scrub and validate functional arguments Check out these two simple math functions add and subtract Create a decorator to scrub and validate the inputs as integers Add the wrapper function and make sure it has positional args Then cast all arguments as integers before passing them into the inner function What we see here on that line of new args is what we call a list Comprehension it makes processing list-based data really efficient in Python now when we call those math functions add and subtract All numbers are integers even if we pass them in as float values Using non-numeric inputs also raises a value error such as if you were to pass in ABC in This we can somewhat protect and coax our input arguments for safety, but wait, there's more You can create decorators with parameters. What? Yeah, I mean in Python. You can basically do anything Here's a decorator that will repeat a function five times The repeat function is a little different Instead of taking the inner function object It takes in the parameter which is the number of times to repeat the inner function Inside there's a repeat decorator function that has a parameter for the inner function The repeat function returns the repeat decorator function Inside repeat decorator is the wrapper function that we remember from our typical template It uses func tools wraps and passes through all the arguments using star args and star star KW args Repeat decorator returns wrapper Finally wrapper contains the logic for calling the inner function multiple times according to the repeat decorators parameter value So you can see we have a for loop for blank in a range. We can discard the iterator variable and Inside this for loop. We just call that function however many times are in the range Now hello world what runs five times? That's really nifty if we wanted to run it four times we say repeat four We run it want to run it 57 times we repeat 57 Even though this decorator is a bit more complicated and seems like inception upon inception it all still works That's cool. But wait, there's more Decorators can be used to save state Here's a decorator that will count the number of times the function is called Count calls has that standard decorator format but Little differently outside the wrapper a count attribute is initialized to zero This attribute is added to the wrapper function objects We can do this in Python because remember functions are first-order values and treated as objects and You can dynamically add attributes in Python to any object. So this is perfectly valid Inside the wrapper the count is incremented before calling the inner function The count value because it's attached to the wrapper object will persist across multiple calls Initially the hello world count value is zero But after calling hello world twice That value goes up and it persists together with that original function. That's really awesome But wait, there's more Decorators can be used in classes. They're not just limited to functions. You can do this on classes Here the inner decorator is applied to the hello method Or a timer. I'm sorry. I can't even read my own text. I'm sorry. Happy Wednesday, everybody Here the timer decorator is applied to hello As long as parameters and return values are set up correctly Decorators can be applied equally to functions as well as methods Decorators can also be applied directly to the class When a decorator is applied to a class it wraps the constructor Note that it does not wrap each method in the class. That tends to be something people misunderstand They think if you put a decorator on the class level then every single method would be wrapped But that's not the case Since decorators can wrap classes and methods in addition to functions It would technically be more correct say that decorators wrap callables around callables in Python a callable is literally anything that can be called Function is a callable a method is a callable and technically a class can even be a callable So in in broader terms, we would say decorators wrap functions around functions But we could also say more broadly decorators wrap callables around callables So that's all great But can decorators be tested? Good code must arguably be testable code Well today's your lucky day because yes, you can test decorators and as the automation Panda I'm gonna show you how to do it Testing decorators can be a challenge We should always try to test the code we write but decorators given the level of inception We saw can be a bit tricky. Here's some advice First separate tests for decorator functions from the decorated functions For decorator functions focus on the intended outcomes Try to focus on the wrapper instead of the inner function Because remember decorators can be applied to any callable. So cover the parts that make decorators unique Decorated functions should have their own separate unit tests Second apply decorators to fake functions used only for testing These functions can be simple or they could be mocked That way unit tests won't have dependencies on existing functions that could change Testers will also be or tests will also be simpler if they use slimmed down decorated functions third Make sure decorators have test coverage for every possible way it could be used Cover decorated parameters Decorated function arguments and return values Make sure the name and the help are correct as we saw before Check any side effects like saving state such as when we did the count Try it on methods and classes as well as functions With decorators most failures happen due to overlooked edge cases So let's take a look at a few short decorator tests We'll use that count calls decorator from earlier There are two decorated functions to use for testing The first one here is a no operation or no op function that literally does nothing Just pass these get out of there It has no parameters or returns The second one is a function that takes in one argument and returns it Notice that both of these are very simple But they represent two separate equivalence classes of decoratable functions The test cases will verify outcomes of using the decorator For count calls that means tests will focus on the count attribute added to the decorated functions The first test case here verifies that the initial count value for any function is zero We could add a second test that calls the function three times and verifies that the count is three The third test exercises the same function to make sure arguments and return values work correctly It calls the same function Asserts the return value and asserts the count value as well This collection of tests is by no means complete It simply shows how to start writing tests for decorators It also shows that you don't need to overthink unit tests for decorators either As we all know in python the zen of python goes simple is better than complex Up to this point, we've covered how to write your own decorators However, python has several decorators available in the language and in various modules that you can use The best part is they're absolutely free Decorators like class method static method and property can apply to methods in a class Frameworks like flask and pie tests have even more decorators Let's take a closer look at some of these Let's start by comparing the class method and static method decorators We'll revisit the greeter class we saw before The class method decorator will turn any method into a class method instead of an instance method That means this hello method can be called directly from the class itself instead of from an object of the class This decorator will pass a reference to the class into the method So the method has some context of the class Here the reference is named cls instead of what we typically see with self for instance methods And the method uses it to get the class's name This method can be called using greeter.hello Wow The static method decorator works almost the same as the class method decorator Except that it does not pass a reference to the class into the method Notice there's no cls And notice as well nothing needs to be passed in Methods can still be called from the class here with greeter goodbye You could say that static method is just a simpler version of class method Now let's take a look at another decorator property To show how to use it we'll create a class called accumulator to keep a count of a tally Accumulator's init method initializes a count attribute to zero An add method adds an amount to the count So far here there's nothing unusual Now let's add a property This count method has the property decorator on it This means that count will be callable as an attribute instead of a method Meaning that it won't need those parentheses It is effectively a getter The calls to count in the init and add methods will actually call this property instead of a raw variable Inside the count property the method returns an attribute named underscore count The underscore means that this variable should be private However, this class hasn't set that variable yet That variable is set in the setter method Setters are optional for properties Here the setter validates that the value is set to something not negative The value is good then it sets underscore count If the value is negative then it raises a value error Under score count is handled internally while count is handled publicly as the property The getter and setter controls Added by the property decorator let you control how the property is handled In this class the setter protects the property against bad values So let's use this class when an accumulator object is constructed its initial count is zero After adding an amount to the object the count goes up Its count can be directly set to a non-negative value But attempting to set count directly in a negative value raises an exception as expected Protection like this is great Python packages also frequently contained Frequently contained decorators For example, Flask is a very popular web micro framework that enables you to write web APIs with very little python code Here's an example Hello world flask app taken directly from the flash docs online It imports the flask module Creates the app And defines a single endpoint at the root path that returns the string. Hello world Flask's app.root decorator can turn any function into a web API endpoint That's awesome Just these five lines here is a fully sufficient flask app Another popular python package with decorators is PyTest Python's most popular test framework One of PyTest's best features is the ability to parameterize test functions to run for multiple input combinations Test parameters empower data-driven testing for wider coverage To show how this works I will use a simple test for basic arithmetic test addition It asserts that a plus b equals c The values for a b and c must come from a list of tuples For example, one plus two equals three zero plus one equals one and so forth The PyTest.mark.parameterize decorator connects the list of test values to the test function It runs the test once for each tuple in the list And it injects the tuple values into the test case as function arguments The test case would run four times Test parameters are a great way to rerun test logic without repeating test code Don't repeat yourself So act now before it's too late When should you use decorators in your python code? Use decorators for aspects An aspect is a special cross-cutting concern There are things that happen in many parts of code and they frequently require repetitive calls Think about something like logging If you want to add logging statements to different parts of the code Then you'll need to write multiple logging calls in all those places Logging itself is one concern But it cross-cuts the whole code base One solution for logging could be to use decorators Much like we saw earlier with the tracer decorator Good use cases for decorators include logging profiling input validation retries and registries These are things that typically require lots of extra calls inserted in duplicative ways So ask yourself this Should the code you're writing wrap something else? If yes, then you have a good candidate for a decorator However, decorators aren't good for all circumstances You should avoid decorators for what we would consider main behaviors Because those should probably be put directly in the body of the decorated function Avoid logic that's complicated or has heavy conditionals too Because simple is better than complex You should also try to avoid completely side-stepping the decorated function because that could really confuse people Ask yourself this is the code you want to write the wrapper or the candy bar itself Rappers make good decorators, but candy bars do not So I hope you found this infomercial about decorators useful If you want to learn more Then check out this real python tutorial named primer on python decorators It covers everything i've shown here plus more So thank you very much for listening again. My name is panty knight and i'm the automation panda If you like my talk then please read my blog at automation panda dot com and follow me on twitter at automation panda Finally if you want to hear more talks like this then definitely please come to a python conference Their conference is happening all around the world all the time And due to the covid pandemic they've basically all gone virtual. So there's no reason not to join The python community would love to welcome you