{
    "componentChunkName": "component---src-templates-post-js",
    "path": "/blog/2013/05/21/size-and-composition-of-effective-teams",
    "result": {"data":{"site":{"siteMetadata":{"title":"your friend Joel's digital garden","description":"Articles and notes from a collaborator at egghead.io. Musings on software, business, and life from a skilled virtual assistant.","author":{"name":"Joel Hooks"},"keywords":["Video Blogger"]}},"mdx":{"excerpt":"The success or failure of  any  project is based on the team or teams working on\nit. Teams are like fingerprints and snowflakes. They are composed of individuals\nwith unique experiences and skillsets. When we set out to build large…","fields":{"github":"https://github.com/joelhooks/joelhooks-com/tree/master/content/legacy_blog/2013-05-21-size-and-composition-of-effective-teams.markdown"},"body":"var _excluded = [\"components\"];\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsxRuntime classic */\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"layout\": \"post\",\n  \"title\": \"Size and Composition of Effective Software Teams\",\n  \"date\": \"2013-05-21T00:00:00.000Z\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, _excluded);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"The success or failure of \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"any\"), \" project is based on the team or teams working on\\nit. Teams are like fingerprints and snowflakes. They are composed of individuals\\nwith unique experiences and skillsets. When we set out to build large\\napplications in a reasonable amount of time, we will generally build a larger\\nteam composed of specialists to get it done. The specialties range from UI\\ndevelopers to marketing experts, with many other areas of expertise in between.\"), mdx(\"p\", null, \"How does a big team organize to work together effectively? I've seen several\\napproaches, and I want to talk about two. The first, which is not my preference,\\nis the creation \\\"silos\\\" for teams based on areas if expertise. The second is to\\ncreate cross-functional autonomous teams.\"), mdx(\"h2\", null, \"Building silos\"), mdx(\"p\", null, \"The first approach is to group teams based on their areas of influence. In this\\ncase you might have a UI team, a server-side systems team, a qa team, a\\nmarketing team, etc...\"), mdx(\"p\", null, mdx(\"span\", {\n    parentName: \"p\",\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"1024px\"\n    }\n  }, \"\\n      \", mdx(\"a\", {\n    parentName: \"span\",\n    \"className\": \"gatsby-resp-image-link\",\n    \"href\": \"/static/bd3770618acdb3211c058f66c35f3748/72e01/silos.jpg\",\n    \"style\": {\n      \"display\": \"block\"\n    },\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }, \"\\n    \", mdx(\"span\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"66.40926640926641%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAIEAQP/xAAVAQEBAAAAAAAAAAAAAAAAAAABAv/aAAwDAQACEAMQAAABkbJopjgJ/8QAGhAAAgIDAAAAAAAAAAAAAAAAAQIAIRESMv/aAAgBAQABBQIEiFsBjbUu1P1//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAFxABAQEBAAAAAAAAAAAAAAAAAAEQEf/aAAgBAQAGPwLeor//xAAaEAADAQADAAAAAAAAAAAAAAAAAREhQWGR/9oACAEBAAE/IVGMermibuDYlpTr2N7H/9oADAMBAAIAAwAAABD0L//EABcRAAMBAAAAAAAAAAAAAAAAAAABMUH/2gAIAQMBAT8Qmjp//8QAFxEAAwEAAAAAAAAAAAAAAAAAAAERQf/aAAgBAgEBPxCJ4KQ//8QAHBABAAIBBQAAAAAAAAAAAAAAAQARMSFBUWGh/9oACAEBAAE/EKlQOYnlaticQAIRkgrWRXkBmxh1+0//2Q==')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  }), \"\\n  \", mdx(\"img\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"photo credit: PXLated\",\n    \"title\": \"photo credit: PXLated\",\n    \"src\": \"/static/bd3770618acdb3211c058f66c35f3748/72e01/silos.jpg\",\n    \"srcSet\": [\"/static/bd3770618acdb3211c058f66c35f3748/8356d/silos.jpg 259w\", \"/static/bd3770618acdb3211c058f66c35f3748/bc760/silos.jpg 518w\", \"/static/bd3770618acdb3211c058f66c35f3748/72e01/silos.jpg 1024w\"],\n    \"sizes\": \"(max-width: 1024px) 100vw, 1024px\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    },\n    \"loading\": \"lazy\",\n    \"decoding\": \"async\"\n  }), \"\\n  \"), \"\\n    \")), mdx(\"p\", null, \"These teams might even be divided along vendor lines, for a project that\\nutilizes consultants to help deliver a project. This has some potential for\\nconflict related to a breakdown in communication.\"), mdx(\"p\", null, \"What is wrong with this? It can lead to caustic relationships with \\\"us v them\\\"\\nmentality. Communication breaks down. Daily status meetings for teams don't\\ncross-pollinate ideas or current status of activities. Generally these teams\\nwill require some sort of \\\"ambassador\\\" that shuttles information between the\\nteams. It leads to \\\"waterfall\\\" development where the server-side team needs to\\nfinish work in order to hand it off to the UI team. The UI team will then finish\\ntheir part and hopefully hand it off to the QA team, unless they ran into issues\\nwith integration and it needs to be handed back to the server-team.\"), mdx(\"p\", null, \"This can work, but successful software is built on top of \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"communication\"), \", so\\nhow can we organize to help better facilitate that?\"), mdx(\"h2\", null, \"Cross-functional and Autonomous\"), mdx(\"p\", null, \"A cross-functional team is composed of members across the boundaries\\nspecialties. This team might consist of ui specialists, server-side experts, qa\\npros, as well as representitives from the business side of things including\\nproduct owner/business analyst and marketing gurus. These teams can shephard\\nvirtually any functionality from start to finish.\"), mdx(\"p\", null, mdx(\"span\", {\n    parentName: \"p\",\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"1024px\"\n    }\n  }, \"\\n      \", mdx(\"a\", {\n    parentName: \"span\",\n    \"className\": \"gatsby-resp-image-link\",\n    \"href\": \"/static/adc0d07485cf46410a20745d162fd588/72e01/rainbow.jpg\",\n    \"style\": {\n      \"display\": \"block\"\n    },\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }, \"\\n    \", mdx(\"span\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"35.13513513513513%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAHABQDASIAAhEBAxEB/8QAFwABAAMAAAAAAAAAAAAAAAAAAAMEBf/EABUBAQEAAAAAAAAAAAAAAAAAAAQD/9oADAMBAAIQAxAAAAGvMGvkh5P/xAAYEAACAwAAAAAAAAAAAAAAAAABAiEjMv/aAAgBAQABBQJNOayZ/8QAFhEAAwAAAAAAAAAAAAAAAAAAAxAy/9oACAEDAQE/ATSv/8QAGBEAAgMAAAAAAAAAAAAAAAAAAAECITH/2gAIAQIBAT8BnonR/8QAFxABAQEBAAAAAAAAAAAAAAAAAAFB8P/aAAgBAQAGPwK9qK//xAAXEAEBAQEAAAAAAAAAAAAAAAAAQQGR/9oACAEBAAE/IWVrjtP/2gAMAwEAAgADAAAAEPQf/8QAFhEBAQEAAAAAAAAAAAAAAAAAAQAR/9oACAEDAQE/EHqgMv/EABYRAQEBAAAAAAAAAAAAAAAAAAEAEf/aAAgBAgEBPxACZMX/xAAbEAABBQEBAAAAAAAAAAAAAAABABEhMVFB8P/aAAgBAQABPxAmlAvR5CZGAcsScfES6y6v/9k=')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  }), \"\\n  \", mdx(\"img\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"photo credit: Pink Sherbet Photography\",\n    \"title\": \"photo credit: Pink Sherbet Photography\",\n    \"src\": \"/static/adc0d07485cf46410a20745d162fd588/72e01/rainbow.jpg\",\n    \"srcSet\": [\"/static/adc0d07485cf46410a20745d162fd588/8356d/rainbow.jpg 259w\", \"/static/adc0d07485cf46410a20745d162fd588/bc760/rainbow.jpg 518w\", \"/static/adc0d07485cf46410a20745d162fd588/72e01/rainbow.jpg 1024w\"],\n    \"sizes\": \"(max-width: 1024px) 100vw, 1024px\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    },\n    \"loading\": \"lazy\",\n    \"decoding\": \"async\"\n  }), \"\\n  \"), \"\\n    \")), mdx(\"p\", null, \"When a team is composed in this fashion, daily status meetings start to take on\\nmore meaning. They facilitate active communication across disciplines and allow\\nmembers to interact more closely. It removes much of the us/them problem. It\\ndoesn't matter who writes an individual team member's check or what their area\\nof expertise might be. They are a member of a team that can fully deliver value\\nwith much less reliance on external dependencies.\"), mdx(\"p\", null, \"Autonomy and the ability to get work done at a comfortable speed without\\nhitting hard stops to wait on another team to deliver allows teams to succeed.\\nTeams are modular, allowing the business to add new teams that have the\\ncapability to deliver value to the project.\"), mdx(\"p\", null, \"In most cases developers will be on a single team. The exception might be an\\n\\\"architect\\\" or devops specialist that serves as \\\"glue\\\" between the different\\nteams providing consistency. The same is likely true for the business analyst\\nand marketing specialist. It is important not to spread the business liasons too\\nthin. The teams should have well-groomed backlogs of work from which to pull\\nfrom.\"), mdx(\"h2\", null, \"How big should a team be?\"), mdx(\"p\", null, \"My favorite \\\"rule\\\" for team size comes from Amazon's \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://www.fastcompany.com/50106/inside-mind-jeff-bezos\"\n  }, \"Jeff\\nBezos\"), \" who uses the\\nconcept of \\\"pizza teams\\\":\"), mdx(\"blockquote\", null, mdx(\"p\", {\n    parentName: \"blockquote\"\n  }, \"Bezos pursued his idea of a decentralized, disentangled company where small\\ngroups can innovate and test their visions independently of everyone else. He\\ncame up with the notion of the \\\"two-pizza team\\\": If you can't feed a team with\\ntwo pizzas, it's too large. That limits a task force to five to seven people,\\ndepending on their appetites.\")), mdx(\"p\", null, \"A \\\"pizza team\\\" might look like this:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"1 designer/UX Specialist\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"1 or 2 UI developers\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"1 or 2 server-side developers\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"1 QA expert\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"1 product owner/business analyst\")), mdx(\"p\", null, \"This is a very general list, but you get the idea. A team composed in this\\nfashion can \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"get shit done\"), \". This is the ultimate goal.\"), mdx(\"p\", null, \"Team size and composition is only one factor in the communication puzzle, but it\\nis an important one. In the end, whatever works for you and gets your software shipping is the best.\\nI've had experience working inside of both of these types of teams, and greatly\\nprefer the cross-functional approach. Regardless of how your teams are composed\\nremember that we are all on the \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"same team\"), \" and that the basic assumption that\\nthe members of the team are both \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"smart\"), \" and \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"capable\"), \" are essential.\"), mdx(\"p\", null, \"How do you organize teams? What has worked\\nfor you, and conversly what has been completely \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"FUBAR\"), \"?\"));\n}\n;\nMDXContent.isMDXComponent = true;","frontmatter":{"title":"Size and Composition of Effective Software Teams","date":"May 21, 2013","banner":null,"slug":null,"keywords":null}}},"pageContext":{"id":"38331ba3-a55e-5bf9-aa92-aa1db8f4edcc","prev":{"id":"64f13be9-1b51-56ea-aa1d-b6cea80074af","parent":{"name":"2013-05-22-lessons-learned-kicking-off-an-angularjs-project","sourceInstanceName":"legacy"},"excerpt":"After a year of working with a large AngularJS project, I thought I'd share a\nfew of the lessons that I learned in the process. Firstly, I love AngularJS. It\nsuits my needs exceedingly well, and I expect it will be my goto for the\nforseeable future…","fields":{"title":"Lessons Learned: A Year with a Large AngularJS Project","slug":"blog/2013/05/22/lessons-learned-kicking-off-an-angularjs-project","date":"2013-05-22T00:00:00.000Z"}},"next":{"id":"90f36e1d-df8c-5c05-8e75-02c2aa5e9541","parent":{"name":"2013-05-01-when-is-a-singleton-not-a-singleton","sourceInstanceName":"legacy"},"excerpt":"The Singleton is the Highlander of design patterns.  There can be only one . An example of a Singleton implementation might look something like this: from Tom Roggero The above JavaScript is from an  answer \nfrom StackOverflow that seemed resonable…","fields":{"title":"AngularJS, Dependency Injection, and when is a singleton not a Singleton?","slug":"blog/2013/05/01/when-is-a-singleton-not-a-singleton","date":"2013-05-01T00:00:00.000Z"}}}},
    "staticQueryHashes": ["1045846374"]}