{
    "componentChunkName": "component---src-templates-note-note-js",
    "path": "/notes/abstractions",
    "result": {"data":{"mdx":{"body":"var _excluded = [\"components\"];\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : 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); }\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; }\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/* @jsxRuntime classic */\n/* @jsx mdx */\n\nvar _frontmatter = {};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"blockquote\", null, mdx(\"p\", {\n    parentName: \"blockquote\"\n  }, \"Moreover, different problems require different abstractions \\u2014 which means there\\u2019s not going to be one single abstraction to address all your needs.\")), mdx(\"blockquote\", null, mdx(\"p\", {\n    parentName: \"blockquote\"\n  }, \"We are all good at reasoning at a high level of abstraction, and moreover,\\xA0\", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"the higher the abstraction, the better we are at reasoning about it\")), mdx(\"ul\", {\n    parentName: \"blockquote\"\n  }, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://softwareengineering.stackexchange.com/questions/398893/do-higher-order-functions-violate-the-separation-of-data-and-code-principle\"\n  }, \"https://softwareengineering.stackexchange.com/questions/398893/do-higher-order-functions-violate-the-separation-of-data-and-code-principle\")))), mdx(\"h2\", null, \"what level of abstraction\"), mdx(\"blockquote\", null, mdx(\"p\", {\n    parentName: \"blockquote\"\n  }, \"We should not be building programs at the level of manipulating \\\"raw data\\\" any more than we should be designing cities at the level of the grains of sand and glue that make the concrete. Cities are\\xA0\", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"human systems\"), \", not\\xA0\", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"piles of concrete\"), \", and we analyze the performance of cities at the level of those systems. Programs are the same. We're building abstract systems, and we need to analyze their merits as complex systems.\")));\n}\n;\nMDXContent.isMDXComponent = true;","inboundReferences":[{"id":"68552061-1c05-5ff7-beca-fbef290c5fc6","slug":"Virtual-Machine"}]}},"pageContext":{"slug":"abstractions","node":{"childMdx":{"slug":"abstractions"}}}},
    "staticQueryHashes": []}