{"componentChunkName":"component---node-modules-gatsby-theme-medium-to-own-blog-src-templates-blog-post-js","path":"/7-years-from-the-monoglot-blog-post/","result":{"data":{"site":{"siteMetadata":{"siteUrl":"https://javame.netlify.app","githubUrl":"https://github.com/aterreno/blog"}},"mdx":{"fields":{"slug":"/7-years-from-the-monoglot-blog-post/"},"excerpt":"About  seven years ago I wrote a blog post  on how I thought that software development would benefit from using only one programming…","timeToRead":1,"frontmatter":{"title":"7 years from the #monoglot blog post","description":"About seven years ago I wrote a blog post on how I thought that software development would benefit from using only one programming…","categories":[],"date":"December 24, 2017","canonical_link":"https://javame.netlify.app//7-years-from-the-monoglot-blog-post-f13d9e776b14"},"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\": \"7 years from the #monoglot blog post\",\n  \"description\": \"About seven years ago I wrote a blog post on how I thought that software development would benefit from using only one programming…\",\n  \"date\": \"2017-12-24T19:01:02.315Z\",\n  \"categories\": [],\n  \"published\": true,\n  \"canonical_link\": \"https://javame.netlify.app//7-years-from-the-monoglot-blog-post-f13d9e776b14\",\n  \"redirect_from\": [\"/7-years-from-the-monoglot-blog-post-f13d9e776b14\"]\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, \"About \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://the-arm.com/monoglot-architecture-for-the-win-86bc010c61fb\",\n    \"target\": \"_blank\",\n    \"rel\": \"nofollow noopener noreferrer\"\n  }), \"seven years ago I wrote a blog post\"), \" on how I thought that software development would benefit from using only one programming language.\\xA0\", mdx(\"br\", {\n    parentName: \"p\"\n  }), \"\\n\", \"The reality is that 7 years ago neither JavaScript or the frameworks were ready but I think now that time has come.\"), mdx(\"p\", null, \"I am far from saying that JavaScript is a superior language, its limits are quite evident, however, an engineering team might benefit by not switching a programming language between the layers and the different (micro) services / Functions implemented.\"), mdx(\"p\", null, \"When I was at \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"http://www.forward.co.uk/\",\n    \"target\": \"_blank\",\n    \"rel\": \"nofollow noopener noreferrer\"\n  }), \"Forward\"), \" I remember changing from codebase to codebase and from programming language to programming language: we had fun but the context switch was expensive.\"), mdx(\"p\", null, \"At \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://www.thelabrador.co.uk/\",\n    \"target\": \"_blank\",\n    \"rel\": \"nofollow noopener noreferrer\"\n  }), \"Labrador\"), \", we\\u2019ve inherited an MVP built with lambdas in ES 6, and even if reluctant at first, we\\u2019ve embraced JS as the programming language of choice.\"), mdx(\"p\", null, \"ES6 is not bad at all, with \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"http://es6-features.org/#Constants\",\n    \"target\": \"_blank\",\n    \"rel\": \"nofollow noopener noreferrer\"\n  }), \"few new features\"), \" really improving the syntactic sugar and a lively ecosystem.\"), mdx(\"p\", null, \"So what\\u2019s our stack like? Lambdas in AWS written in ES6 using either the \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://serverless.com/\",\n    \"target\": \"_blank\",\n    \"rel\": \"nofollow noopener noreferrer\"\n  }), \"Serverless\"), \" Framework or \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://claudiajs.com/\",\n    \"target\": \"_blank\",\n    \"rel\": \"nofollow noopener noreferrer\"\n  }), \"Claudia.JS\"), \": we favour this last one and especially the \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://claudiajs.com/claudia-api-builder.html\",\n    \"target\": \"_blank\",\n    \"rel\": \"nofollow noopener noreferrer\"\n  }), \"API Builder\"), \" for building APIs.\"), mdx(\"p\", null, \"Our data is mainly stored in S3 or DynamoDB, in JSON so, it\\u2019s still JS!\\xA0\", mdx(\"br\", {\n    parentName: \"p\"\n  }), \"\\n\", \"And the fronted is built with React.JS.\"), mdx(\"p\", null, \"The only code that is not JS is our Terraform codebase, everything else is JS.\"), mdx(\"p\", null, mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://www.jetbrains.com/webstorm/\",\n    \"target\": \"_blank\",\n    \"rel\": \"nofollow noopener noreferrer\"\n  }), \"Webstorm\"), \" is our editor of choice, with the help of \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"http://jshint.com/\",\n    \"target\": \"_blank\",\n    \"rel\": \"nofollow noopener noreferrer\"\n  }), \"JSHint\"), \", it might be heavier than other IDEs but the support for keeping the source clean and tidy is brilliant.\"), mdx(\"p\", null, \"Are there any languages that you can use for a monoglot architecture? I don\\u2019t think so, there\\u2019s a constraint on the web browsers, JS if not the source code will always have to be at least the artefact \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://clojurescript.org/\",\n    \"target\": \"_blank\",\n    \"rel\": \"nofollow noopener noreferrer\"\n  }), \"ClojureScript\"), \" would be a good choice if you are into functional/Lisp-like languages, \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://www.typescriptlang.org/\",\n    \"target\": \"_blank\",\n    \"rel\": \"nofollow noopener noreferrer\"\n  }), \"Typescript\"), \" is very tempting.\"), mdx(\"p\", null, mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://www.sitepoint.com/10-languages-compile-javascript/\",\n    \"target\": \"_blank\",\n    \"rel\": \"nofollow noopener noreferrer\"\n  }), \"Here\\u2019s a list\"), \" of ten of them: I think the main benefits might come from using types and embracing immutability, while others seem just an expensive attempt to circumvent JS rather than embracing it.\"), mdx(\"p\", null, \"I think \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://leanpub.com/javascriptallongesix/read\",\n    \"target\": \"_blank\",\n    \"rel\": \"nofollow noopener noreferrer\"\n  }), \"modern JS can be easily functional and immutable\"), \", while types are definitely something that would be nice to optionally see in the language, it\\u2019s not a coincidence that as soon as a codebase grows large companies try safer paradigms: \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://slack.engineering/typescript-at-slack-a81307fa288d\",\n    \"target\": \"_blank\",\n    \"rel\": \"nofollow noopener noreferrer\"\n  }), \"TypeScript\"), \" at Slack, \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://flow.org/\",\n    \"target\": \"_blank\",\n    \"rel\": \"nofollow noopener noreferrer\"\n  }), \"Flow\"), \" at Facebook.\"));\n}\n;\nMDXContent.isMDXComponent = true;"},"allWebMentionEntry":{"nodes":[]}},"pageContext":{"id":"761f27e7-b3da-5921-b33e-0497a08bea57","previous":{"id":"409761ea-aa43-518a-954c-cf61db4583d5","fields":{"slug":"/what-i've-learnt-as-a-cto-in-the-last-6-months/","published":true},"frontmatter":{"redirect_from":["/what-ive-learnt-as-a-cto-in-the-last-6-months-1d328ba70fb4"],"redirect_to":null,"title":"What I’ve learnt as a CTO in the last 6 months"}},"next":{"id":"c5aacfca-ffb1-5f1b-9691-8acf1cbe583b","fields":{"slug":"/can-you-avoid-having-herbie-in-your-delivery-pipeline/","published":true},"frontmatter":{"redirect_from":["/can-you-avoid-having-herbie-in-your-delivery-pipeline-f3377ca21f1b"],"redirect_to":null,"title":"Can you avoid having Herbie in your delivery pipeline?"}},"permalink":"https://javame.netlify.app/7-years-from-the-monoglot-blog-post/","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"]}