{
    "componentChunkName": "component---src-pages-blog-post-tsx",
    "path": "/blog/2020-03-24/the-importance-of-portability",
    "result": {"data":{"site":{"siteMetadata":{"siteUrl":"https://www.architect.io"}},"allMdx":{"edges":[{"node":{"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  \"title\": \"The importance of portability\",\n  \"slug\": \"the-importance-of-portability\",\n  \"date\": \"2020-03-24T00:00:00.000Z\",\n  \"author\": \"Dan Barrett\",\n  \"image\": \"./release-cycle.jpg\"\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 evolution of software might be told as a story of innovation in delivery channels - the\\nmainframe to the personal computer, hardware-specific applications to cross-architecture\\ncompilation, desktop to mobile, on-premise to cloud. Looking closer, each of these new delivery\\nmethods represented a new opportunity for developers to reach more users with the \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"same\"), \"\\napplication. The benefits are obvious: write once, make available anywhere. We might use the word\\n\", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"portability\"), \", then, in very general terms, as a characteristic of software: highly portable\\nsoftware can be written once and deployed anywhere.\"), mdx(\"p\", null, \"Portable applications require less development and operational effort even as they are exposed to\\nmore potential users. This same value, though, also applies to the internal operations of software\\nteams. In modern microservice architectures developers also play the role of consumers- consuming\\nthe services and APIs created by other teams both inside and outside of their organization. In this\\nway, application portability matters greatly to the internal operations of software companies.\"), mdx(\"p\", null, \"In this article, we'll shed light on what portability means in the context of cloud software and why\\nit's important for both your customers and your team members.\"), mdx(\"h2\", {\n    \"id\": \"it-works-on-my-machine\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, \"\\\"It works on my machine\\\"\", mdx(\"a\", {\n    parentName: \"h2\",\n    \"href\": \"#it-works-on-my-machine\",\n    \"aria-label\": \"it works on my machine permalink\",\n    \"className\": \"anchor after\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\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\", {\n    parentName: \"svg\",\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  })))), mdx(\"p\", null, \"Software teams generally use the word \\\"environment\\\" to describe the context in which an application\\nruns. It's a broad term- you might use it to refer to a specific machine, an OS, or an entire\\nnetwork. Importantly, the word captures a fundamental concept with a serious implication: \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"context\"), \"\\ndiffers across environments, and if your software depends on context then its \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"behavior\"), \" will differ\\nacross environments! This distinction is often the culprit of poorly functioning software: it\\nseemingly works in one place, but is buggy when you run it somewhere else.\"), 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\": \"728px\"\n    }\n  }, \"\\n      \", mdx(\"a\", {\n    parentName: \"span\",\n    \"className\": \"gatsby-resp-image-link\",\n    \"href\": \"/static/365e357f6702c32a474d7416ee416c31/7f450/works-on-my-machine.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\": \"83.6%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAARABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAECAwX/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAH20ydgWBoH/8QAGRABAAIDAAAAAAAAAAAAAAAAAQARECAx/9oACAEBAAEFAmVWHqLDT//EABQRAQAAAAAAAAAAAAAAAAAAACD/2gAIAQMBAT8BH//EABQRAQAAAAAAAAAAAAAAAAAAACD/2gAIAQIBAT8BH//EABkQAAEFAAAAAAAAAAAAAAAAADEAARAgQf/aAAgBAQAGPwLUXk1//8QAHRAAAgIBBQAAAAAAAAAAAAAAAAERMSEQQVFxgf/aAAgBAQABPyFVc+DFMghHnt2MVxKDoV6f/9oADAMBAAIAAwAAABAjAAD/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/EB//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/EB//xAAfEAEAAgMAAQUAAAAAAAAAAAABABEhMUEQYXGBkaH/2gAIAQEAAT8QQlByVpvsTYqcUp/J3is6gkH5UlVAcxHfMnsy6n1+5sm7x//Z')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  }), \"\\n  \", mdx(\"img\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"works-on-my-machine\",\n    \"title\": \"works-on-my-machine\",\n    \"src\": \"/static/365e357f6702c32a474d7416ee416c31/7f450/works-on-my-machine.jpg\",\n    \"srcSet\": [\"/static/365e357f6702c32a474d7416ee416c31/0479a/works-on-my-machine.jpg 250w\", \"/static/365e357f6702c32a474d7416ee416c31/41099/works-on-my-machine.jpg 500w\", \"/static/365e357f6702c32a474d7416ee416c31/7f450/works-on-my-machine.jpg 728w\"],\n    \"sizes\": \"(max-width: 728px) 100vw, 728px\",\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, \"Picking apart the logic of your software from the characteristics of the environment is a central\\nskill in developing any software application, and it's a skill that strives toward the above prize:\\nportability. A developer who has isolated their software from its environment finds themselves with\\nan elegant bundle of business logic that will behave the same regardless of where it is run: their\\nown machine, the company QA environment, their production cloud; even their customer's cloud!\"), mdx(\"h2\", {\n    \"id\": \"who-benefits-from-portability\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, \"Who benefits from portability?\", mdx(\"a\", {\n    parentName: \"h2\",\n    \"href\": \"#who-benefits-from-portability\",\n    \"aria-label\": \"who benefits from portability permalink\",\n    \"className\": \"anchor after\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\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\", {\n    parentName: \"svg\",\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  })))), mdx(\"h3\", {\n    \"id\": \"it-departments-commoditizing-cloud-providers\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, \"IT departments: commoditizing cloud providers\", mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#it-departments-commoditizing-cloud-providers\",\n    \"aria-label\": \"it departments commoditizing cloud providers permalink\",\n    \"className\": \"anchor after\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\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\", {\n    parentName: \"svg\",\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  })))), mdx(\"p\", null, \"A smart business will limit their hard dependencies if given the chance. Vendor lock-in introduces a\\ncentral point of failure that exposes a company both to disruptions in service and the pricing whims\\nof the vendor. Horizontal application portability is characterized by minimizing environment\\nswitching costs such that an IT department can avoid vendor lock-in. If you can run your application\\njust as easily on GCP or AWS you avoid pinning your company to the service-uptime and pricing of one\\nparticular cloud provider.\"), mdx(\"h3\", {\n    \"id\": \"developers--devops-building-and-releasing-extensible-services\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, \"Developers & DevOps: building and releasing extensible services\", mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#developers--devops-building-and-releasing-extensible-services\",\n    \"aria-label\": \"developers  devops building and releasing extensible services permalink\",\n    \"className\": \"anchor after\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\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\", {\n    parentName: \"svg\",\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  })))), mdx(\"p\", null, \"It is not uncommon for environments to multiply rapidly in even small software teams: developers\\nneed to run the application locally, quality engineers in a test environment, sales reps in a demo\\nenvironment, and operators of course run the application in staging and production environments.\"), 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\": \"818px\"\n    }\n  }, \"\\n      \", mdx(\"a\", {\n    parentName: \"span\",\n    \"className\": \"gatsby-resp-image-link\",\n    \"href\": \"/static/01537ce9d31a1f54a1e255afe96504c8/22492/release-cycle.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\": \"101.2%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAMEBf/EABcBAQEBAQAAAAAAAAAAAAAAAAIDAAH/2gAMAwEAAhADEAAAAd+W9aS0Ij2uEy6oK//EABsQAAICAwEAAAAAAAAAAAAAAAIDAAEEEhMi/9oACAEBAAEFAn7nOblUDKId+bbYuLDyxQsocUOk/8QAGREBAAIDAAAAAAAAAAAAAAAAAQARECFB/9oACAEDAQE/ARs3Bancf//EABkRAAEFAAAAAAAAAAAAAAAAAAABEBExQf/aAAgBAgEBPwGhYMb/xAAfEAABBAAHAAAAAAAAAAAAAAABABAREgIDIjFBocH/2gAIAQEABj8Crlkj1TbtjfZVGIEnhtSky3//xAAbEAEAAwEBAQEAAAAAAAAAAAABABExIVFxof/aAAgBAQABPyFgoDyKW7919lyeOM1iJY6wNjybvWcs6Ymxtp9urmT/2gAMAwEAAgADAAAAEJA4/P/EABgRAQEAAwAAAAAAAAAAAAAAAAEAEBEx/9oACAEDAQE/EER6nh1IYf/EABgRAAMBAQAAAAAAAAAAAAAAAAABESEQ/9oACAECAQE/EJaiwS8E3x//xAAdEAEAAgMAAwEAAAAAAAAAAAABABEhMUFRYYHR/9oACAEBAAE/EFyngYKOLwhazVqiGWC2z9hlqWiuzQYGrQciUQZ8aZdO/IKwIIlq3DQhZboRsjBZUWvQPPMAABQaJ//Z')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  }), \"\\n  \", mdx(\"img\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"software-release-cycle\",\n    \"title\": \"software-release-cycle\",\n    \"src\": \"/static/01537ce9d31a1f54a1e255afe96504c8/22492/release-cycle.jpg\",\n    \"srcSet\": [\"/static/01537ce9d31a1f54a1e255afe96504c8/0479a/release-cycle.jpg 250w\", \"/static/01537ce9d31a1f54a1e255afe96504c8/41099/release-cycle.jpg 500w\", \"/static/01537ce9d31a1f54a1e255afe96504c8/22492/release-cycle.jpg 818w\"],\n    \"sizes\": \"(max-width: 818px) 100vw, 818px\",\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, \"The develop/test/demo/deploy lifecycle has a cost that is directly correlated to the portability of\\nthe application. Software that requires much environment-related configuration and tuning will cost\\ntime and effort as new versions move through the lifecycle. Portability saves time and mental\\noverhead for anyone involved in moving new versions of the software across environments.\"), mdx(\"h3\", {\n    \"id\": \"sales-increasing-addressable-market\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, \"Sales: increasing addressable market\", mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#sales-increasing-addressable-market\",\n    \"aria-label\": \"sales increasing addressable market permalink\",\n    \"className\": \"anchor after\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\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\", {\n    parentName: \"svg\",\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  })))), mdx(\"p\", null, \"For security reasons, many potential customers prefer to run vendor software on their own premises.\\nIf a business makes rigid software- requiring specific operating systems, cloud providers, embedded\\nsecurity, and extensive environment configuration- the business is inadvertently limiting their\\naddressable market to those customers that satisfy these conditions. A company that ships portable\\nsoftware, on the other hand, removes these restrictions on their addressable market.\"), mdx(\"h2\", {\n    \"id\": \"the-3-dimensions-of-portability\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, \"The 3 dimensions of portability\", mdx(\"a\", {\n    parentName: \"h2\",\n    \"href\": \"#the-3-dimensions-of-portability\",\n    \"aria-label\": \"the 3 dimensions of portability permalink\",\n    \"className\": \"anchor after\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\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\", {\n    parentName: \"svg\",\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  })))), mdx(\"p\", null, \"Building software that is portable actually encourages patterns that support a host of other\\nworthwhile properties. If you make it easier for your software to be run here \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"or\"), \" there, it follows\\nthat it is easier to run it here \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"and\"), \" there: supporting replication within and across environments\\nand enabling engineers across teams and orgs to operate the software themselves. In the same way, an\\napplication that provides full portability and is easy for developers to run is easier to build on\\ntop of: an application with great portability lends itself to great extensibility.\"), mdx(\"p\", null, \"So how do we know if our apps and services are portable? Can they be portable in some ways and not\\nothers? In order to determine this for ourselves, let's evaluate three different dimensions in which\\nour application can be portable:\"), mdx(\"h3\", {\n    \"id\": \"1-replication-deep\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, \"1. Replication (deep)\", mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#1-replication-deep\",\n    \"aria-label\": \"1 replication deep permalink\",\n    \"className\": \"anchor after\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\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\", {\n    parentName: \"svg\",\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  })))), mdx(\"p\", null, \"The first dimension of portability is crucial to operating cloud applications at scale - scaling and\\nreplication. The ability for your service to maintain multiple running instances that work as a\\ncohesive unit is paramount to it's ability to support concurrent users at scale. Consistent\\npackaging mechanics, like virtual machine images and containers, are often the key to automating the\\nreplication of services in cloud environments to better manage scale, but this replication also\\ndemands consistent methods for load balancing and distributing incoming traffic. By combining\\npackaging consistency with API gateways, service meshes, and other load balancing solutions, teams\\ncan easily achieve deep application portability.\"), mdx(\"h3\", {\n    \"id\": \"2-platformprovider-migration-horizontal\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, \"2. Platform/provider migration (horizontal)\", mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#2-platformprovider-migration-horizontal\",\n    \"aria-label\": \"2 platformprovider migration horizontal permalink\",\n    \"className\": \"anchor after\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\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\", {\n    parentName: \"svg\",\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  })))), mdx(\"p\", null, \"The second dimension of portability is the one that many first picture when they think of cloud\\nportability - cloud migration and/or multi-cloud deployments. The ability for your application to be\\nrun on multiple platforms is a great defensive strategy to ensure that cloud apps can remain cost\\neffective and protected from outages. Designing applications to be run on commodity infrastructure\\n(e.g. linux vs. windows) or on multiple cloud providers (e.g. AWS vs. Azure vs. GCP) enables teams\\nto run in multiple locations concurrently, or swap out providers should pricing prove beneficial.\"), mdx(\"h3\", {\n    \"id\": \"3-development-lifecycle-vertical\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, \"3. Development lifecycle (vertical)\", mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#3-development-lifecycle-vertical\",\n    \"aria-label\": \"3 development lifecycle vertical permalink\",\n    \"className\": \"anchor after\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\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\", {\n    parentName: \"svg\",\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  })))), mdx(\"p\", null, \"The third dimension of portability is often the most overlooked despite being far more impactful\\nthan horizontal mobility - portability through the software development release cycle. As we noted\\nearlier, software developers are constantly building or modifying services inside an application\\nstack, and as such find themselves with ample need to test early and often in environments that they\\ncan be sure will match production. The consistency of the application context from local\\ndevelopment, through test/QA/staging, and finally to production environments, is crucial to ensuring\\ntrust, maintaining a strong development flow, and ensuring that product features get in front of\\ncustomers quickly and safely.\"), mdx(\"h2\", {\n    \"id\": \"history-and-future\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, \"History and Future\", mdx(\"a\", {\n    parentName: \"h2\",\n    \"href\": \"#history-and-future\",\n    \"aria-label\": \"history and future permalink\",\n    \"className\": \"anchor after\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\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\", {\n    parentName: \"svg\",\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  })))), mdx(\"p\", null, \"The yearning for portable software is not new. The development of the Java Virtual Machine in the\\nearly 90s is among the most successful software portability innovations to date: a single compiled\\n.jar file can be run with identical behavior on any machine and any OS (so long as it has a JVM\\ninstalled...). Docker took this a step further: an entire OS can be shipped as a lightweight\\nartifact and run anywhere (so long as there is a Docker daemon installed...).\"), mdx(\"p\", null, \"Note the caveats, and note the seeming inconsistencies with the entire concept of portability! If\\njava needs a JVM installed, isn't that a hard violation of everything we've discussed? Alas, it\\nseems so. Here lies another, related- even inverse- concept to portability: the platform. Portable\\nsoftware still needs to be executed \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"by\"), \" something; a platform, an OS: an environment. So as\\ndevelopers struggle to make their applications more portable, companies struggle to make the\\n\\\"universal platform\\\" on which all portable applications might be run: Microsoft tried it with an OS,\\nOracle with a narrow VM, Docker with a more general VM, and most recently Kubernetes with an\\nopen-source hardware abstraction and Terraform/Cloudformation with reproducible\\ninfrastructure-as-code templates.\"), mdx(\"p\", null, \"So are we done? Are applications truly portable? The best way to answer that is to look at our own\\napplications. Are my applications portable? Can I share my application with other developers and\\nhave them run or access it using their own tools and hardware?\"), mdx(\"p\", null, \"We've made enormous strides toward allowing cloud software to become portable, but with each\\ninnovation comes a new opportunity for software architecture to push the boundaries even further.\\nYesterday I could make a portable monolithic application by putting it in an AMI or Docker image,\\nbut today my app contains multiple images that run separately yet still need to connect together.\\nThe pursuit of portability is an ever ongoing effort, but the value of the pursuit always remains.\"));\n}\n;\nMDXContent.isMDXComponent = true;","excerpt":"The evolution of software might be told as a story of innovation in delivery channels - the\nmainframe to the personal computer, hardware-specific applications to cross-architecture\ncompilation…","tableOfContents":{"items":[{"url":"#it-works-on-my-machine","title":"\"It works on my machine\""},{"url":"#who-benefits-from-portability","title":"Who benefits from portability?","items":[{"url":"#it-departments-commoditizing-cloud-providers","title":"IT departments: commoditizing cloud providers"},{"url":"#developers--devops-building-and-releasing-extensible-services","title":"Developers & DevOps: building and releasing extensible services"},{"url":"#sales-increasing-addressable-market","title":"Sales: increasing addressable market"}]},{"url":"#the-3-dimensions-of-portability","title":"The 3 dimensions of portability","items":[{"url":"#1-replication-deep","title":"1. Replication (deep)"},{"url":"#2-platformprovider-migration-horizontal","title":"2. Platform/provider migration (horizontal)"},{"url":"#3-development-lifecycle-vertical","title":"3. Development lifecycle (vertical)"}]},{"url":"#history-and-future","title":"History and Future"}]},"frontmatter":{"title":"The importance of portability","description":null,"author":"Dan Barrett","date":"2020-03-24","image":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","images":{"fallback":{"src":"/static/01537ce9d31a1f54a1e255afe96504c8/f011f/release-cycle.jpg","srcSet":"/static/01537ce9d31a1f54a1e255afe96504c8/84d82/release-cycle.jpg 205w,\n/static/01537ce9d31a1f54a1e255afe96504c8/1730f/release-cycle.jpg 409w,\n/static/01537ce9d31a1f54a1e255afe96504c8/f011f/release-cycle.jpg 818w","sizes":"(min-width: 818px) 818px, 100vw"},"sources":[{"srcSet":"/static/01537ce9d31a1f54a1e255afe96504c8/d1526/release-cycle.webp 205w,\n/static/01537ce9d31a1f54a1e255afe96504c8/0cd80/release-cycle.webp 409w,\n/static/01537ce9d31a1f54a1e255afe96504c8/45892/release-cycle.webp 818w","type":"image/webp","sizes":"(min-width: 818px) 818px, 100vw"}]},"width":1000,"height":1012.2249388753057}}}}},"next":null,"previous":null}]}},"pageContext":{"slug":"the-importance-of-portability"}},
    "staticQueryHashes": ["764694655"]}