diff --git a/404.html b/404.html index e7d14ec6b..f0ab7b2fb 100644 --- a/404.html +++ b/404.html @@ -10,7 +10,7 @@ - + diff --git a/Risk-First-Second-Edition.html b/Risk-First-Second-Edition.html index d8f6a5c6d..f72c23256 100644 --- a/Risk-First-Second-Edition.html +++ b/Risk-First-Second-Edition.html @@ -10,7 +10,7 @@ - + diff --git a/The-Menagerie.html b/The-Menagerie.html index d47a495d8..0036463f2 100644 --- a/The-Menagerie.html +++ b/The-Menagerie.html @@ -10,7 +10,7 @@ - + diff --git a/assets/js/0ab71eb8.d5d3bef3.js b/assets/js/0ab71eb8.8b4114be.js similarity index 78% rename from assets/js/0ab71eb8.d5d3bef3.js rename to assets/js/0ab71eb8.8b4114be.js index fc10269a1..366ea47bd 100644 --- a/assets/js/0ab71eb8.d5d3bef3.js +++ b/assets/js/0ab71eb8.8b4114be.js @@ -1 +1 @@ -"use strict";(self.webpackChunkrf_website=self.webpackChunkrf_website||[]).push([[931],{95592:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>a,metadata:()=>r,toc:()=>l});var i=n(74848),s=n(28453);const a={title:"Outsourcing",description:"Hiring external resources or companies to handle parts of the project.",tags:["Outsourcing","Practice"],featured:{class:"c",element:"Outsource"},practice:{aka:["Contracting","External Hiring","Third-Party Development"],mitigates:[{tag:"Staff Risk",reason:"Accesses external resources and skills that may not be available internally."},{tag:"Funding Risk",reason:"Can be cost-effective by leveraging economies of scale."},{tag:"Schedule Risk",reason:"Can speed up project timelines by adding more workforce."}],attendant:[{tag:"Agency Risk",reason:"Creates dependencies on third-party vendors and their reliability."},{tag:"Communication Risk",reason:"May introduce communication challenges with external teams."},{tag:"Security Risk",reason:"Potential risks related to data security and confidentiality."}],related:["../Planning-and-Management/Contract","../Communication-and-Collaboration/Stakeholder-Management","../Deployment-and-Operations/Configuration-Management"]}},o=void 0,r={id:"practices/External-Relations/Outsourcing",title:"Outsourcing",description:"Hiring external resources or companies to handle parts of the project.",source:"@site/docs/practices/External-Relations/Outsourcing.md",sourceDirName:"practices/External-Relations",slug:"/practices/External-Relations/Outsourcing",permalink:"/practices/External-Relations/Outsourcing",draft:!1,unlisted:!1,editUrl:"https://github.com/risk-first/website/blob/master/docs/practices/External-Relations/Outsourcing.md",tags:[{inline:!1,label:"Outsourcing",permalink:"/tags/Outsourcing"},{inline:!1,label:"Practice",permalink:"/tags/Practice"}],version:"current",frontMatter:{title:"Outsourcing",description:"Hiring external resources or companies to handle parts of the project.",tags:["Outsourcing","Practice"],featured:{class:"c",element:"Outsource"},practice:{aka:["Contracting","External Hiring","Third-Party Development"],mitigates:[{tag:"Staff Risk",reason:"Accesses external resources and skills that may not be available internally."},{tag:"Funding Risk",reason:"Can be cost-effective by leveraging economies of scale."},{tag:"Schedule Risk",reason:"Can speed up project timelines by adding more workforce."}],attendant:[{tag:"Agency Risk",reason:"Creates dependencies on third-party vendors and their reliability."},{tag:"Communication Risk",reason:"May introduce communication challenges with external teams."},{tag:"Security Risk",reason:"Potential risks related to data security and confidentiality."}],related:["../Planning-and-Management/Contract","../Communication-and-Collaboration/Stakeholder-Management","../Deployment-and-Operations/Configuration-Management"]}},sidebar:"tutorialSidebar",previous:{title:"Marketing",permalink:"/practices/External-Relations/Marketing"},next:{title:"Sales",permalink:"/practices/External-Relations/Sales"}},c={},l=[{value:"Description",id:"description",level:2},{value:"Discussion",id:"discussion",level:2},{value:"See Also",id:"see-also",level:2}];function d(e){const t={a:"a",blockquote:"blockquote",em:"em",h2:"h2",p:"p",strong:"strong",...(0,s.R)(),...e.components},{PracticeIntro:n,TagList:o}=t;return n||h("PracticeIntro",!0),o||h("TagList",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n,{details:a}),"\n",(0,i.jsx)(t.h2,{id:"description",children:"Description"}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:['"Outsourcing is an agreement in which one company hires another company to be responsible for a planned or existing activity that is or could be done internally, and sometimes involves transferring employees and assets from one firm to another." - ',(0,i.jsxs)(t.a,{href:"https://en.wikipedia.org/wiki/Outsourcing",children:["Outsourcing, ",(0,i.jsx)(t.em,{children:"Wikipedia"})]})]}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"Outsourcing in software development involves hiring external vendors or service providers to handle specific tasks or projects. This practice can help access specialized skills, reduce costs, and accelerate project timelines. However, it also introduces risks related to dependency, communication, and security that need to be managed effectively."}),"\n",(0,i.jsx)(t.h2,{id:"discussion",children:"Discussion"}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Pairing"})," and ",(0,i.jsx)(t.strong,{children:"Mobbing"})," as mitigations to ",(0,i.jsx)(t.a,{href:"/tags/Coordination-Risk",children:"Coordination Risk"})," are easiest when developers are together in the same room. But it doesn't always work out like this. Teams spread in different locations and timezones naturally don't have the same ",(0,i.jsx)(t.a,{href:"/tags/Communication-Risk",children:"communication bandwidth"})," and you ",(0,i.jsx)(t.em,{children:"will"})," have more issues with ",(0,i.jsx)(t.a,{href:"/tags/Coordination-Risk",children:"Coordination Risk"}),"."]}),"\n",(0,i.jsxs)(t.p,{children:['In the extreme, I\'ve seen situations where the team at one location has decided to "suck up" the extra development effort themselves rather than spend time trying to bring a new remote team up-to-speed. More common is for one location to do the development, while another gets the ',(0,i.jsx)(t.a,{href:"../Planning-And-Management/Issue-Management",children:"Support"})," duties."]}),"\n",(0,i.jsxs)(t.p,{children:["When this happens, it's because somehow the team feel that ",(0,i.jsx)(t.a,{href:"/tags/Coordination-Risk",children:"Coordination Risk"})," is more unmanageable than ",(0,i.jsx)(t.a,{href:"/tags/Schedule-Risk",children:"Schedule Risk"}),"."]}),"\n",(0,i.jsxs)(t.p,{children:["There are some mitigations here: video-chat, moving staff from location-to-location for face-time, frequent ",(0,i.jsx)(t.a,{href:"/tags/Review",children:"show-and-tell"}),", or simply modularizing accross geographic boundaries, in respect of ",(0,i.jsx)(t.a,{href:"/tags/Coordination-Risk",children:"Conway's Law"}),":"]}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:['"organizations which design systems ... are constrained to produce designs which are copies of the communication structures of these organizations." -\u2009',(0,i.jsx)(t.em,{children:(0,i.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Conways_law",children:"M. Conway"})})]}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:["When we add ",(0,i.jsx)(t.strong,{children:"Outsourcing"})," into the mix, we also have to consider ",(0,i.jsx)(t.a,{href:"/tags/Agency-Risk",children:"Agency Risk"}),": the consultancy you've hired is ",(0,i.jsx)(t.em,{children:"definitely"})," more interested in keeping themselves solvent than solving your business problems."]}),"\n",(0,i.jsx)(t.h2,{id:"see-also",children:"See Also"}),"\n",(0,i.jsx)(o,{tag:"Outsourcing"})]})}function u(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}function h(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},28453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>r});var i=n(96540);const s={},a=i.createContext(s);function o(e){const t=i.useContext(a);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),i.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkrf_website=self.webpackChunkrf_website||[]).push([[931],{95592:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>a,metadata:()=>r,toc:()=>l});var i=n(74848),s=n(28453);const a={title:"Outsourcing",description:"Hiring external resources or companies to handle parts of the project.",tags:["Outsourcing","Practice"],featured:{class:"c",element:"Outsource"},practice:{aka:["Contracting","External Hiring","Third-Party Development"],mitigates:[{tag:"Staff Risk",reason:"Accesses external resources and skills that may not be available internally."},{tag:"Funding Risk",reason:"Can be cost-effective by leveraging economies of scale."},{tag:"Schedule Risk",reason:"Can speed up project timelines by adding more workforce."}],attendant:[{tag:"Agency Risk",reason:"Creates dependencies on third-party vendors and their reliability."},{tag:"Communication Risk",reason:"May introduce communication challenges with external teams."},{tag:"Security Risk",reason:"Potential risks related to data security and confidentiality."}],related:["../Planning-and-Management/Contract","../Communication-and-Collaboration/Stakeholder-Management","../Deployment-and-Operations/Configuration-Management"]}},o=void 0,r={id:"practices/External-Relations/Outsourcing",title:"Outsourcing",description:"Hiring external resources or companies to handle parts of the project.",source:"@site/docs/practices/External-Relations/Outsourcing.md",sourceDirName:"practices/External-Relations",slug:"/practices/External-Relations/Outsourcing",permalink:"/practices/External-Relations/Outsourcing",draft:!1,unlisted:!1,editUrl:"https://github.com/risk-first/website/blob/master/docs/practices/External-Relations/Outsourcing.md",tags:[{inline:!1,label:"Outsourcing",permalink:"/tags/Outsourcing"},{inline:!1,label:"Practice",permalink:"/tags/Practice"}],version:"current",frontMatter:{title:"Outsourcing",description:"Hiring external resources or companies to handle parts of the project.",tags:["Outsourcing","Practice"],featured:{class:"c",element:"Outsource"},practice:{aka:["Contracting","External Hiring","Third-Party Development"],mitigates:[{tag:"Staff Risk",reason:"Accesses external resources and skills that may not be available internally."},{tag:"Funding Risk",reason:"Can be cost-effective by leveraging economies of scale."},{tag:"Schedule Risk",reason:"Can speed up project timelines by adding more workforce."}],attendant:[{tag:"Agency Risk",reason:"Creates dependencies on third-party vendors and their reliability."},{tag:"Communication Risk",reason:"May introduce communication challenges with external teams."},{tag:"Security Risk",reason:"Potential risks related to data security and confidentiality."}],related:["../Planning-and-Management/Contract","../Communication-and-Collaboration/Stakeholder-Management","../Deployment-and-Operations/Configuration-Management"]}},sidebar:"tutorialSidebar",previous:{title:"Marketing",permalink:"/practices/External-Relations/Marketing"},next:{title:"Sales",permalink:"/practices/External-Relations/Sales"}},c={},l=[{value:"Description",id:"description",level:2},{value:"Discussion",id:"discussion",level:2},{value:"See Also",id:"see-also",level:2}];function d(e){const t={a:"a",blockquote:"blockquote",em:"em",h2:"h2",p:"p",strong:"strong",...(0,s.R)(),...e.components},{PracticeIntro:n,TagList:o}=t;return n||h("PracticeIntro",!0),o||h("TagList",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n,{details:a}),"\n",(0,i.jsx)(t.h2,{id:"description",children:"Description"}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:['"Outsourcing is an agreement in which one company hires another company to be responsible for a planned or existing activity that is or could be done internally, and sometimes involves transferring employees and assets from one firm to another." - ',(0,i.jsxs)(t.a,{href:"https://en.wikipedia.org/wiki/Outsourcing",children:["Outsourcing, ",(0,i.jsx)(t.em,{children:"Wikipedia"})]})]}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"Outsourcing in software development involves hiring external vendors or service providers to handle specific tasks or projects. This practice can help access specialized skills, reduce costs, and accelerate project timelines. However, it also introduces risks related to dependency, communication, and security that need to be managed effectively."}),"\n",(0,i.jsx)(t.h2,{id:"discussion",children:"Discussion"}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Pairing"})," and ",(0,i.jsx)(t.strong,{children:"Mobbing"})," as mitigations to ",(0,i.jsx)(t.a,{href:"/tags/Coordination-Risk",children:"Coordination Risk"})," are easiest when developers are together in the same room. But it doesn't always work out like this. Teams spread in different locations and timezones naturally don't have the same ",(0,i.jsx)(t.a,{href:"/tags/Communication-Risk",children:"communication bandwidth"})," and you ",(0,i.jsx)(t.em,{children:"will"})," have more issues with ",(0,i.jsx)(t.a,{href:"/tags/Coordination-Risk",children:"Coordination Risk"}),"."]}),"\n",(0,i.jsxs)(t.p,{children:['In the extreme, I\'ve seen situations where the team at one location has decided to "suck up" the extra development effort themselves rather than spend time trying to bring a new remote team up-to-speed. More common is for one location to do the development, while another gets the ',(0,i.jsx)(t.a,{href:"../Planning-And-Management/Issue-Management",children:"Support"})," duties."]}),"\n",(0,i.jsxs)(t.p,{children:["When this happens, it's because somehow the team feel that ",(0,i.jsx)(t.a,{href:"/tags/Coordination-Risk",children:"Coordination Risk"})," is more unmanageable than ",(0,i.jsx)(t.a,{href:"/tags/Schedule-Risk",children:"Schedule Risk"}),"."]}),"\n",(0,i.jsxs)(t.p,{children:["There are some mitigations here: video-chat, moving staff from location-to-location for face-time, frequent ",(0,i.jsx)(t.a,{href:"/tags/Review",children:"show-and-tell"}),", or simply modularizing across geographic boundaries, in respect of ",(0,i.jsx)(t.a,{href:"/tags/Coordination-Risk",children:"Conway's Law"}),":"]}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsxs)(t.p,{children:['"organizations which design systems ... are constrained to produce designs which are copies of the communication structures of these organizations." -\u2009',(0,i.jsx)(t.em,{children:(0,i.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Conways_law",children:"M. Conway"})})]}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:["When we add ",(0,i.jsx)(t.strong,{children:"Outsourcing"})," into the mix, we also have to consider ",(0,i.jsx)(t.a,{href:"/tags/Agency-Risk",children:"Agency Risk"}),": the consultancy you've hired is ",(0,i.jsx)(t.em,{children:"definitely"})," more interested in keeping themselves solvent than solving your business problems."]}),"\n",(0,i.jsx)(t.h2,{id:"see-also",children:"See Also"}),"\n",(0,i.jsx)(o,{tag:"Outsourcing"})]})}function u(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}function h(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},28453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>r});var i=n(96540);const s={},a=i.createContext(s);function o(e){const t=i.useContext(a);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),i.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/493db859.6ee9411e.js b/assets/js/493db859.8cf02258.js similarity index 99% rename from assets/js/493db859.6ee9411e.js rename to assets/js/493db859.8cf02258.js index a8e9560c5..f59c24172 100644 --- a/assets/js/493db859.6ee9411e.js +++ b/assets/js/493db859.8cf02258.js @@ -1 +1 @@ -"use strict";(self.webpackChunkrf_website=self.webpackChunkrf_website||[]).push([[6907],{63776:(e,i,s)=>{s.r(i),s.d(i,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>a,toc:()=>l});var n=s(74848),t=s(28453);const o={title:"Software Dependency Risk",description:"Specific dependency risks due to relying on software.",slug:"/risks/Software-Dependency-Risk",featured:{class:"c",element:''},sidebar_position:9,tweet:"yes",tags:["Risks","Software Dependency Risk"],part_of:"Dependency Risk"},r=void 0,a={id:"risks/Dependency-Risks/Software-Dependency-Risk",title:"Software Dependency Risk",description:"Specific dependency risks due to relying on software.",source:"@site/docs/risks/Dependency-Risks/Software-Dependency-Risk.md",sourceDirName:"risks/Dependency-Risks",slug:"/risks/Software-Dependency-Risk",permalink:"/risks/Software-Dependency-Risk",draft:!1,unlisted:!1,editUrl:"https://github.com/risk-first/website/blob/master/docs/risks/Dependency-Risks/Software-Dependency-Risk.md",tags:[{inline:!1,label:"Risks",permalink:"/tags/Risks"},{inline:!1,label:"Software Dependency Risk",permalink:"/tags/Software-Dependency-Risk"}],version:"current",sidebarPosition:9,frontMatter:{title:"Software Dependency Risk",description:"Specific dependency risks due to relying on software.",slug:"/risks/Software-Dependency-Risk",featured:{class:"c",element:''},sidebar_position:9,tweet:"yes",tags:["Risks","Software Dependency Risk"],part_of:"Dependency Risk"},sidebar:"tutorialSidebar",previous:{title:"Deadline Risk",permalink:"/risks/Deadline-Risk"},next:{title:"Process Risk",permalink:"/risks/Process-Risk"}},d={},l=[{value:"Software Dependencies as Features",id:"software-dependencies-as-features",level:2},{value:"Programming Languages as Dependencies",id:"programming-languages-as-dependencies",level:2},{value:"Ergonomics Examined",id:"ergonomics-examined",level:2},{value:"Protocols and Ergonomics",id:"protocols-and-ergonomics",level:3},{value:"Designing Protocols",id:"designing-protocols",level:3},{value:"Types Of Software Dependencies",id:"types-of-software-dependencies",level:2},{value:"1. Code Your Own",id:"1-code-your-own",level:3},{value:"Unwritten Software",id:"unwritten-software",level:3},{value:"Conway's Law",id:"conways-law",level:3},{value:"2. Software Libraries",id:"2-software-libraries",level:3},{value:"Software Libraries - Attendant Risks",id:"software-libraries---attendant-risks",level:3},{value:"Sources",id:"sources",level:4},{value:"Complexity Risk?",id:"complexity-risk",level:3},{value:"3. Software-as-a-Service",id:"3--software-as-a-service",level:3},{value:"Sources",id:"sources-1",level:4},{value:"Funding Software Dependencies",id:"funding-software-dependencies",level:3},{value:"Choice",id:"choice",level:2}];function c(e){const i={a:"a",blockquote:"blockquote",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,t.R)(),...e.components},{RiskIntro:r}=i;return r||function(e,i){throw new Error("Expected "+(i?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("RiskIntro",!0),(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(r,{fm:o}),"\n",(0,n.jsxs)(i.p,{children:["In this section, we're going to look specifically at ",(0,n.jsx)(i.em,{children:"Software"})," dependencies, although many of the concerns we'll raise here apply equally to all the other types of dependency we outlined in ",(0,n.jsx)(i.a,{href:"/tags/Dependency-Risk",children:"Dependency Risk"}),"."]}),"\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.img,{alt:"Software Dependency Risk",src:s(29732).A+"",width:"580",height:"347"})}),"\n",(0,n.jsx)(i.p,{children:"In this section we will look at:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"How Dependencies Provide Features"}),". It might seem obvious, but the purpose of adding a software dependency is to ",(0,n.jsx)(i.em,{children:"reduce some other kind of risk"}),"."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"Dependencies on Programming Languages"}),". Although you can usually write a piece of code in any language, different languages provide different features, specialising them for certain tasks. This leads us on to consider..."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"Ergonomics"}),". The idea that software, just like any other tool, provides an ",(0,n.jsx)(i.em,{children:"interface"})," which should be designed to make it easy to use for a particular task."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"Different Types of Software Dependencies"}),". In a software project there are a number of ways you could depend on ",(0,n.jsx)(i.em,{children:"other software"}),". Here, we break it down into some specific types (write-your-own, libraries and services) and look at the risk characteristics of each."]}),"\n",(0,n.jsxs)(i.li,{children:["Finally, we look at how software dependencies are ",(0,n.jsx)(i.strong,{children:"Funded"})," - that is, how they survive over time. Here we focus on Open Source, Commercial and Ad-Supported options, and the risks introduced by each."]}),"\n"]}),"\n",(0,n.jsx)(i.h2,{id:"software-dependencies-as-features",children:"Software Dependencies as Features"}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.a,{href:"/tags/Software-Dependency-Risk",children:"Software Dependencies"})," allows us to construct dependency networks to give us all kinds of features and mitigate all kinds of risk. That is, the features we are looking for in a dependency ",(0,n.jsx)(i.em,{children:"are to mitigate some kind of risk"}),"."]}),"\n",(0,n.jsxs)(i.p,{children:["For example, I might start using ",(0,n.jsx)(i.a,{href:"https://en.wikipedia.org/wiki/WhatsApp",children:"WhatsApp"})," because I want to be able to send my friends photos and text messages. However, it's likely that those same features allow us to mitigate ",(0,n.jsx)(i.a,{href:"/tags/Coordination-Risk",children:"Coordination Risk"})," when we're next trying to meet up."]}),"\n",(0,n.jsx)(i.p,{children:"Let's look at some more examples:"}),"\n",(0,n.jsxs)(i.table,{children:[(0,n.jsx)(i.thead,{children:(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.th,{children:"Risk"}),(0,n.jsx)(i.th,{children:"Software Mitigating That Risk"})]})}),(0,n.jsxs)(i.tbody,{children:[(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.a,{href:"/tags/Coordination-Risk",children:"Coordination Risk"})}),(0,n.jsx)(i.td,{children:"Calendar tools, Bug Tracking, Distributed Databases"})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.a,{href:"/tags/Schedule-Risk",children:"Schedule-Risk"})}),(0,n.jsx)(i.td,{children:"Planning Software, Project Management Software"})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.a,{href:"/tags/Communication-Risk",children:"Communication-Risk"})}),(0,n.jsx)(i.td,{children:"Email, Chat tools, CRM tools like SalesForce, Forums, Twitter, Protocols"})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.a,{href:"/tags/Process-Risk",children:"Process-Risk"})}),(0,n.jsx)(i.td,{children:"Reporting tools, online forms, process tracking tools"})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.a,{href:"/tags/Agency-Risk",children:"Agency-Risk"})}),(0,n.jsx)(i.td,{children:"Auditing tools, transaction logs, Time-Sheet software, HR Software"})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.a,{href:"/tags/Operational-Risk",children:"Operational-Risk"})}),(0,n.jsx)(i.td,{children:"Support tools like ZenDesk, Grafana, InfluxDB, Geneos, Security Tools"})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.a,{href:"/tags/Feature-Risk",children:"Feature-Risk"})}),(0,n.jsx)(i.td,{children:"Every piece of software you use!"})]})]})]}),"\n",(0,n.jsxs)(i.p,{children:["With this in mind, we can see that adding a software dependency is a trade-off: we reduce some risk (as in the table above), but in return we pick up ",(0,n.jsx)(i.a,{href:"/tags/Software-Dependency-Risk",children:"Software Dependency Risk"})," as a result. Whether this trade-off is worth it depends entirely on how well that software dependency resolves the original risk and how onerous the new risks are that we pick up."]}),"\n",(0,n.jsx)(i.h2,{id:"programming-languages-as-dependencies",children:"Programming Languages as Dependencies"}),"\n",(0,n.jsxs)(i.p,{children:["In the earlier section on ",(0,n.jsx)(i.a,{href:"/tags/Complexity-Risk",children:"Complexity Risk"})," we tackled ",(0,n.jsx)(i.a,{href:"/risks/Complexity-Risk#kolmogorov-complexity",children:"Kolmogorov Complexity"}),", and the idea that your codebase had some kind of minimal level of complexity based on the output it was trying to create. This is a neat idea, but in a way, we cheated. Let's look at how."]}),"\n",(0,n.jsx)(i.p,{children:"We were trying to figure out the shortest (Javascript) program to generate this output:"}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{children:"abcdabcdabcdabcdabcdabcdabcdabcdabcdabcd\n"})}),"\n",(0,n.jsx)(i.p,{children:"And we came up with this:"}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-javascript",children:'const ABCD="ABCD"; (11 symbols)\n\nfunction out() { (7 symbols)\n return ABCD.repeat(10) (7 symbols)\n} (1 symbol)\n'})}),"\n",(0,n.jsxs)(i.p,{children:["Which had ",(0,n.jsx)(i.strong,{children:"26"})," symbols in it."]}),"\n",(0,n.jsxs)(i.p,{children:["Now, here's the cheat: the ",(0,n.jsx)(i.code,{children:"repeat()"})," function was built into Javascript in 2015 in ",(0,n.jsx)(i.a,{href:"https://www.ecma-international.org/ecma-262/6.0/",children:"ECMAScript 6.0"}),". If we'd had to program it ourselves, we might have added this:"]}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{className:"language-javascript",children:"function repeat(s,n) { (10 symbols)\n var a=[]; (7 symbols)\n while(a.length