{"componentChunkName":"component---node-modules-gatsby-theme-medium-to-own-blog-src-templates-blog-post-js","path":"/spiking-with-spikes-what-is-a-spike/","result":{"data":{"site":{"siteMetadata":{"siteUrl":"https://javame.netlify.app","githubUrl":"https://github.com/aterreno/blog"}},"mdx":{"fields":{"slug":"/spiking-with-spikes-what-is-a-spike/"},"excerpt":"What is a spike?  That question came out at the second  Hong Kong Agile  meeting, last Wednesday.  I was surprised, a spike was something in…","timeToRead":2,"frontmatter":{"title":"Spiking with spikes: what is a spike?","description":"","categories":[],"date":"March 16, 2008","canonical_link":"https://javame.netlify.app//spiking-with-spikes-what-is-a-spike-83a783e09d89"},"body":"function _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  \"title\": \"Spiking with spikes: what is a spike?\",\n  \"description\": \"\",\n  \"date\": \"2008-03-16T00:00:00.000Z\",\n  \"categories\": [],\n  \"published\": true,\n  \"canonical_link\": \"https://javame.netlify.app//spiking-with-spikes-what-is-a-spike-83a783e09d89\",\n  \"redirect_from\": [\"/spiking-with-spikes-what-is-a-spike-83a783e09d89\"]\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, [\"components\"]);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"What is a spike?\\xA0\", mdx(\"br\", {\n    parentName: \"p\"\n  }), \"\\n\", \"That question came out at the second \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"http://agilehongkong.com/\",\n    \"target\": \"_blank\",\n    \"rel\": \"nofollow noopener noreferrer\"\n  }), \"Hong Kong Agile\"), \" meeting, last Wednesday.\\xA0\", mdx(\"br\", {\n    parentName: \"p\"\n  }), \"\\n\", \"I was surprised, a spike was something in my base knowledge, something obvious.\\xA0\", mdx(\"br\", {\n    parentName: \"p\"\n  }), \"\\n\", \"I think I\\u2019ve learned first the world spike in a programming context rather than spike in \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"http://www.google.com/search?client=safari&rls=en-us&q=define:spike&ie=UTF-8&oe=UTF-8\",\n    \"target\": \"_blank\",\n    \"rel\": \"nofollow noopener noreferrer\"\n  }), \"any other context\"), \".  \"), mdx(\"p\", null, \"Probably is not so obvious and makes sense to blog about it.\"), mdx(\"h4\", {\n    \"id\": \"knowledge-spikes\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", _extends({\n    parentName: \"h4\"\n  }, {\n    \"href\": \"#knowledge-spikes\",\n    \"aria-label\": \"knowledge spikes permalink\",\n    \"className\": \"anchor before\"\n  }), mdx(\"svg\", _extends({\n    parentName: \"a\"\n  }, {\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }), mdx(\"path\", _extends({\n    parentName: \"svg\"\n  }, {\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  })))), \"knowledge spikes\"), mdx(\"p\", null, \"My first spike was quite few years ago, on my first medium size Enterprise project.  \"), mdx(\"p\", null, \"The aim of the spikes was to understand a current system, from the database layer to the UI.  \"), mdx(\"p\", null, \"It was pain, I still remember it. It took me almost a week, asking help many times, it wasn\\u2019t an XP project.  \"), mdx(\"p\", null, \"At the end of the exercise I was able to understand very well the system, and able to contribute well on the project.  \"), mdx(\"p\", null, \"The code produced was checked in. To provide context, knowledge for future joiners in the project. Code that should not run in production.  \"), mdx(\"p\", null, \"\\xA0\", mdx(\"br\", {\n    parentName: \"p\"\n  }), \"\\n\", \"Basically it was a main class, instantiating all what you need to start up the full system.  \"), mdx(\"p\", null, \"I\\u2019ve to say that the codebase was definitely well designed, otherwise doing such an exercise cold be very very diffult.\"), mdx(\"h4\", {\n    \"id\": \"spikes-checked-in\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", _extends({\n    parentName: \"h4\"\n  }, {\n    \"href\": \"#spikes-checked-in\",\n    \"aria-label\": \"spikes checked in permalink\",\n    \"className\": \"anchor before\"\n  }), mdx(\"svg\", _extends({\n    parentName: \"a\"\n  }, {\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }), mdx(\"path\", _extends({\n    parentName: \"svg\"\n  }, {\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  })))), \"spikes checked-in?\"), mdx(\"p\", null, \"Conrad, while giving his presentation with Tom on Agile techniques stated that there should be no check in of the code, since that code should never go on production.  \"), mdx(\"p\", null, \"I disagree on most cases, there\\u2019s always a value on the spikes.  \"), mdx(\"p\", null, \"\\xA0\", mdx(\"br\", {\n    parentName: \"p\"\n  }), \"\\n\", \"The only spikes I would not check in are my personal trials to understand what\\u2019s going on, crappy code that I would not show us to anybody, so ugly that it doesn\\u2019t deserve the honor to go on the code repository: \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"One shot spikes\"), \".\"), mdx(\"h4\", {\n    \"id\": \"design-sets-spikes\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", _extends({\n    parentName: \"h4\"\n  }, {\n    \"href\": \"#design-sets-spikes\",\n    \"aria-label\": \"design sets spikes permalink\",\n    \"className\": \"anchor before\"\n  }), mdx(\"svg\", _extends({\n    parentName: \"a\"\n  }, {\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }), mdx(\"path\", _extends({\n    parentName: \"svg\"\n  }, {\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  })))), \"design sets\\xA0spikes\"), mdx(\"p\", null, \"On my last project with \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"http://www.thekua.com/atwork/\",\n    \"target\": \"_blank\",\n    \"rel\": \"nofollow noopener noreferrer\"\n  }), \"Pat\"), \" we tried different design sets (also including technology decisions) for a big problem of redesign/refactor we had.  \"), mdx(\"p\", null, \"Also in that case we put the code under version control. Why? For future joiners for instance, these was what we tried, the solution that won it\\u2019s on the trunk, the failures on a sperate trunk folder, spikes can be a good name right?  \"), mdx(\"p\", null, \"I\\u2019ll take the same approach also starting a new project. Let\\u2019s pretend I\\u2019ve to start a new java project, an app with a database layer. You can spike the database access with Hibernate, with Ibatis, with EJBS, etc\\u2026  \"), mdx(\"p\", null, \"It will help you in estimating future stories, in the understanding on how much the chosen solution is testable.\"), mdx(\"h4\", {\n    \"id\": \"estimations\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", _extends({\n    parentName: \"h4\"\n  }, {\n    \"href\": \"#estimations\",\n    \"aria-label\": \"estimations permalink\",\n    \"className\": \"anchor before\"\n  }), mdx(\"svg\", _extends({\n    parentName: \"a\"\n  }, {\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }), mdx(\"path\", _extends({\n    parentName: \"svg\"\n  }, {\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  })))), \"estimations?\"), mdx(\"p\", null, \"A spike should always be estimated, a fixed amount of time can be allocated during an estimation session.  \"), mdx(\"p\", null, \"A spike should always achieve a final goal.  \"), mdx(\"p\", null, \"\\xA0\", mdx(\"br\", {\n    parentName: \"p\"\n  }), \"\\n\", \"If a spike screw completely the estimation throw it away, something is wrong, probably the design, the technology you\\u2019re trying to use is too complex to play with it, don\\u2019t insist on.  \"), mdx(\"p\", null, \"Throw away but check it in, even if not working, on the spikes trunk! I can\\u2019t imagine any better documentation for new joiner to justify, to explain, that\\u2019s why we didn\\u2019t use EJBs, look at that!  \"), mdx(\"p\", null, \"Shall I write tests doing a spike? Why not. If you\\u2019re trying to find a design I can\\u2019t imagine anything better that some old good TDD, if you\\u2019re trying to understand the system you can write a main if you\\u2019re not familiar with tests or just some tests. A spike can be made of tests.\"), mdx(\"h4\", {\n    \"id\": \"more-on-the-web\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", _extends({\n    parentName: \"h4\"\n  }, {\n    \"href\": \"#more-on-the-web\",\n    \"aria-label\": \"more on the web permalink\",\n    \"className\": \"anchor before\"\n  }), mdx(\"svg\", _extends({\n    parentName: \"a\"\n  }, {\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }), mdx(\"path\", _extends({\n    parentName: \"svg\"\n  }, {\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  })))), \"more on the\\xA0web\\u2026\"), mdx(\"p\", null, \"Take a look also on the definitions on \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"http://c2.com/xp/SpikeSolution.html\",\n    \"target\": \"_blank\",\n    \"rel\": \"nofollow noopener noreferrer\"\n  }), \"C2.com\"), \".  \"), mdx(\"p\", null, \"\\xA0\", mdx(\"br\", {\n    parentName: \"p\"\n  }), \"\\n\", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"http://www.extremeprogramming.org/rules/spike.html\",\n    \"target\": \"_blank\",\n    \"rel\": \"nofollow noopener noreferrer\"\n  }), \"XP.org\"), \" has his definition as well.\"));\n}\n;\nMDXContent.isMDXComponent = true;"},"allWebMentionEntry":{"nodes":[]}},"pageContext":{"id":"dfe7e07b-a084-5387-ab4b-5b9cfef44c66","previous":{"id":"e35e52d4-9c46-5873-8cb4-2fa45db11c66","fields":{"slug":"/qi4j-an-implementation-of-composite-oriented-programming/","published":true},"frontmatter":{"redirect_from":["/qi4j-an-implementation-of-composite-oriented-programming-d09b3305b23c"],"redirect_to":null,"title":"Qi4j: an implementation of Composite Oriented Programming"}},"next":{"id":"530740e9-63a4-5807-bece-33585c0c3d5e","fields":{"slug":"/java-essentials/","published":true},"frontmatter":{"redirect_from":["/java-essentials-1689568c1f21"],"redirect_to":null,"title":"Java Essentials"}},"permalink":"https://javame.netlify.app/spiking-with-spikes-what-is-a-spike/","themeOptions":{"plugins":[],"config":{"title":"Antonio Terreno","description":"Antonio Terreno's blog archive","shortBio":"","bio":"Principal Consultant at Equal Experts","author":"Antonio Terreno","githubUrl":"https://github.com/aterreno/blog","siteUrl":"https://javame.netlify.app/","social":{"twitter":"javame","medium":"","facebook":"","github":"aterreno","linkedin":"antonioterreno","instagram":"tritonitri"},"goatCounterCode":null}}}},"staticQueryHashes":["4131332129","645483741"]}