{"id":55147,"date":"2020-11-20T09:00:15","date_gmt":"2020-11-20T17:00:15","guid":{"rendered":"https:\/\/github.blog\/?p=55147"},"modified":"2020-11-20T09:49:33","modified_gmt":"2020-11-20T17:49:33","slug":"nbdev-a-literate-programming-environment-that-democratizes-software-engineering-best-practices","status":"publish","type":"post","link":"https:\/\/github.blog\/developer-skills\/programming-languages-and-frameworks\/nbdev-a-literate-programming-environment-that-democratizes-software-engineering-best-practices\/","title":{"rendered":"Nbdev: A literate programming environment that democratizes software engineering best practices"},"content":{"rendered":"<p>At GitHub, we are deeply invested in democratizing software development. Part of this is accomplished by serving as the home of open source and providing <a href=\"https:\/\/classroom.github.com\/\">tools to educators<\/a> and <a href=\"https:\/\/education.github.com\/students\">students<\/a>. We are also building features that lower the barrier to entry for software development, such as <a href=\"https:\/\/github.com\/features\/codespaces\">Codespaces<\/a>. However, there is much work left to be done in order to make software development more approachable and to make it easier to employ best practices, such as <a href=\"https:\/\/docs.github.com\/en\/free-pro-team@latest\/actions\/guides\/about-continuous-integration\">continuous integration<\/a>, <a href=\"https:\/\/github.com\/features\/packages\">distribution<\/a>, and documentation of software.<\/p>\n<p>This is why we decided to assist <a href=\"https:\/\/github.com\/fastai\">fastai<\/a> in their development of a new, <a href=\"https:\/\/en.wikipedia.org\/wiki\/Literate_programming\">literate programming<\/a> environment for Python, called <a href=\"https:\/\/github.com\/fastai\/nbdev\">nbdev<\/a>. A discussion of the motivations behind nbdev as well as a primer on the history of literate programming can be found in this <a href=\"https:\/\/www.fast.ai\/2019\/12\/02\/nbdev\/.\">blog post<\/a>. For the uninitiated, literate programming, as described by Donald Knuth, it is:<\/p>\n<blockquote><p>&#8230;a move away from writing computer programs in the manner and order imposed by the computer, and instead enables programmers to develop programs in the order demanded by the logic and flow of their thoughts.<\/p><\/blockquote>\n<p>While a subset of ideas from literate programming have shown up in tools, such as <a href=\"https:\/\/en.wikipedia.org\/wiki\/Swift_Playgrounds\">Swift Playgrounds<\/a>, <a href=\"https:\/\/jupyter.org\/\">Jupyter<\/a>, and <a href=\"https:\/\/www.wolfram.com\/mathematica\/\">Mathematica<\/a>, there has been a lack of tools that encompass the entire software development life cycle. <a href=\"https:\/\/nbdev.fast.ai\/example.html\">nbdev<\/a> builds on top of Jupyter notebooks to fill these gaps and provides the following features, many of which are integrated with GitHub:<\/p>\n<ul>\n<li>Automated generation of docs from Jupyter notebooks hosted on <a href=\"https:\/\/docs.github.com\/en\/free-pro-team@latest\/github\/working-with-github-pages\">GitHub Pages<\/a>. These docs are searchable and automatically hyperlinked to appropriate documentation pages by introspecting keywords you surround in backticks. An example of this documentation is the official <a href=\"https:\/\/docs.fast.ai\/\">fastai docs<\/a>.<\/li>\n<li>Continuous integration (CI) comes setup for you with GitHub Actions, which will run unit tests automatically for you. Even if you are not familiar with <a href=\"https:\/\/github.com\/features\/actions\">GitHub Actions<\/a>, this starts working right away without any manual intervention.<\/li>\n<li>The nbdev environment, which consists of a web server for previewing a docs site, a Jupyter server for writing code, and a series of CLI tools are set up to work with <a href=\"https:\/\/github.com\/features\/codespaces\"><b>GitHub Codespaces<\/b><\/a>, which makes getting started even easier. A detailed discussion of how CodeSpaces integrates with nbdev is discussed in this <a href=\"https:\/\/fastpages.fast.ai\/codespaces\">blog post<\/a>.<\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">As a teaser, this is a preview of this literate programming environment in Codespaces, which includes a notebook, a docs site and an IDE:<\/span><\/p>\n<div style=\"width: 1280px;\" class=\"wp-video\"><video class=\"wp-video-shortcode\" id=\"video-55147-1\" width=\"1280\" height=\"720\" loop autoplay preload=\"metadata\" controls=\"controls\"><source type=\"video\/mp4\" src=\"https:\/\/github.blog\/wp-content\/uploads\/2020\/11\/4_reload_small.mp4#t=0.001?_=1\" \/><a href=\"https:\/\/github.blog\/wp-content\/uploads\/2020\/11\/4_reload_small.mp4#t=0.001\">https:\/\/github.blog\/wp-content\/uploads\/2020\/11\/4_reload_small.mp4#t=0.001<\/a><\/video><\/div>\n<p>&nbsp;<\/p>\n<p>In addition to this GitHub integration, nbdev also offers the following features:<\/p>\n<ul>\n<li>A robust, two-way sync between notebooks and source code, which allow you to use your IDE for code navigation or quick edits if desired.<\/li>\n<li>The ability to write tests directly in notebooks without having to learn special APIs. These tests get executed in parallel with a single CLI command and also with GitHub Actions.<\/li>\n<li>Tools for merge\/conflict resolution with notebooks in a human readable format.<\/li>\n<li>Utilities to automate the publishing of <a href=\"https:\/\/pypi.org\/\">pypi<\/a> and <a href=\"https:\/\/docs.conda.io\/\">conda<\/a> packages.<\/li>\n<\/ul>\n<p><a href=\"https:\/\/github.com\/fastai\/nbdev\">nbdev<\/a> promotes software engineering best practices by allowing developers to write unit tests and documentation in the same context as source code, without having to learn special APIs or worry about web development. Similarly, GitHub Actions run unit tests automatically by default without requiring any prior experience with these tools. We believe removing friction from writing documentation and tests promotes higher quality software and makes software more inclusive.<\/p>\n<p>Aside from using nbdev to create Python software, you can extend nbdev to build new types of tools. For example, we recently used nbdev to build <a href=\"https:\/\/github.com\/fastai\/fastpages\">fastpages<\/a>, an easy to use blogging platform that allows developers to create blog posts directly with Jupyter notebooks. <a href=\"https:\/\/github.com\/fastai\/fastpages\">fastpages<\/a> uses GitHub Actions and GitHub Pages to automate the conversion of notebooks to blog posts and offers a variety of other features to Python developers that democratize the sharing of knowledge. We have also used nbdev and fastpages to create <a href=\"https:\/\/github.com\/github\/covid19-dashboard\">covid19-dashboards<\/a>, which demonstrates how to create interactive dashboards that automatically update with Jupyter notebooks.<\/p>\n<p>We are excited about the potential of nbdev to make software engineering more inclusive, friendly, and robust.\u00a0 We are also hopeful that tools like nbdev can inspire the next generation of literate programming tools. To learn more about nbdev, please see the following resources:<\/p>\n<ul>\n<li>The official <a href=\"https:\/\/nbdev.fast.ai\/\">nbdev docs<\/a><\/li>\n<li><a href=\"https:\/\/nbdev.fast.ai\/example.html\">A minimal example<\/a> of using nbdev end-to-end<\/li>\n<li><a href=\"https:\/\/www.fast.ai\/2019\/12\/02\/nbdev\/\">The blog post<\/a> discussing the background and motivations behind nbdev, by its creator, <a href=\"https:\/\/www.fast.ai\/about\/#jeremy\">Jeremy Howard<\/a><\/li>\n<li><a href=\"https:\/\/www.youtube.com\/watch?v=9Q6sLbz37gk\">A presentation discussing nbdev<\/a> from a keynote at this year\u2019s <a href=\"https:\/\/jupytercon.com\/\">JupyterCon<\/a><\/li>\n<\/ul>\n<p>Finally, If you are building any projects with nbdev or would like to have further discussions, please feel free to reach out on <a href=\"https:\/\/forums.fast.ai\/c\/fastai-users\/nbdev\">the nbdev forums<\/a> or on <a href=\"https:\/\/github.com\/fastai\/nbdev\">GitHub<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Learn about nbdev, a new literate programming environment for Python.<\/p>\n","protected":false},"author":1617,"featured_media":55149,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_gh_post_show_toc":"","_gh_post_is_no_robots":"","_gh_post_is_featured":"","_gh_post_is_excluded":"","_gh_post_is_unlisted":"","_gh_post_related_link_1":"","_gh_post_related_link_2":"","_gh_post_related_link_3":"","_gh_post_sq_img":"","_gh_post_sq_img_id":"","_gh_post_cta_title":"","_gh_post_cta_text":"","_gh_post_cta_link":"","_gh_post_cta_button":"","_gh_post_recirc_hide":"","_gh_post_recirc_col_1":"","_gh_post_recirc_col_2":"","_gh_post_recirc_col_3":"","_gh_post_recirc_col_4":"","_featured_video":"","_gh_post_additional_query_params":"","_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"_wpas_customize_per_network":false,"_links_to":"","_links_to_target":""},"categories":[3298,3304],"tags":[],"coauthors":[],"class_list":["post-55147","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-developer-skills","category-programming-languages-and-frameworks"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.3 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Nbdev: A literate programming environment that democratizes software engineering best practices - The GitHub Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/github.blog\/developer-skills\/programming-languages-and-frameworks\/nbdev-a-literate-programming-environment-that-democratizes-software-engineering-best-practices\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Nbdev: A literate programming environment that democratizes software engineering best practices\" \/>\n<meta property=\"og:description\" content=\"Learn about nbdev, a new literate programming environment for Python.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/github.blog\/developer-skills\/programming-languages-and-frameworks\/nbdev-a-literate-programming-environment-that-democratizes-software-engineering-best-practices\/\" \/>\n<meta property=\"og:site_name\" content=\"The GitHub Blog\" \/>\n<meta property=\"article:published_time\" content=\"2020-11-20T17:00:15+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2020-11-20T17:49:33+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/github.blog\/wp-content\/uploads\/2020\/11\/nbdev_logo11.png?fit=1200%2C630\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Hamel Husain\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/github.blog\/wp-content\/uploads\/2020\/11\/nbdev_logo11.png?fit=1200%2C630\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Hamel Husain\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/github.blog\\\/developer-skills\\\/programming-languages-and-frameworks\\\/nbdev-a-literate-programming-environment-that-democratizes-software-engineering-best-practices\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/github.blog\\\/developer-skills\\\/programming-languages-and-frameworks\\\/nbdev-a-literate-programming-environment-that-democratizes-software-engineering-best-practices\\\/\"},\"author\":{\"name\":\"Hamel Husain\",\"@id\":\"https:\\\/\\\/github.blog\\\/#\\\/schema\\\/person\\\/d76319a9b865a8143ac6c5f20d95c568\"},\"headline\":\"Nbdev: A literate programming environment that democratizes software engineering best practices\",\"datePublished\":\"2020-11-20T17:00:15+00:00\",\"dateModified\":\"2020-11-20T17:49:33+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/github.blog\\\/developer-skills\\\/programming-languages-and-frameworks\\\/nbdev-a-literate-programming-environment-that-democratizes-software-engineering-best-practices\\\/\"},\"wordCount\":783,\"image\":{\"@id\":\"https:\\\/\\\/github.blog\\\/developer-skills\\\/programming-languages-and-frameworks\\\/nbdev-a-literate-programming-environment-that-democratizes-software-engineering-best-practices\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/github.blog\\\/wp-content\\\/uploads\\\/2020\\\/11\\\/nbdev_logo11.png?fit=1200%2C630\",\"articleSection\":[\"Developer skills\",\"Programming languages &amp; frameworks\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/github.blog\\\/developer-skills\\\/programming-languages-and-frameworks\\\/nbdev-a-literate-programming-environment-that-democratizes-software-engineering-best-practices\\\/\",\"url\":\"https:\\\/\\\/github.blog\\\/developer-skills\\\/programming-languages-and-frameworks\\\/nbdev-a-literate-programming-environment-that-democratizes-software-engineering-best-practices\\\/\",\"name\":\"Nbdev: A literate programming environment that democratizes software engineering best practices - The GitHub Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/github.blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/github.blog\\\/developer-skills\\\/programming-languages-and-frameworks\\\/nbdev-a-literate-programming-environment-that-democratizes-software-engineering-best-practices\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/github.blog\\\/developer-skills\\\/programming-languages-and-frameworks\\\/nbdev-a-literate-programming-environment-that-democratizes-software-engineering-best-practices\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/github.blog\\\/wp-content\\\/uploads\\\/2020\\\/11\\\/nbdev_logo11.png?fit=1200%2C630\",\"datePublished\":\"2020-11-20T17:00:15+00:00\",\"dateModified\":\"2020-11-20T17:49:33+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/github.blog\\\/#\\\/schema\\\/person\\\/d76319a9b865a8143ac6c5f20d95c568\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/github.blog\\\/developer-skills\\\/programming-languages-and-frameworks\\\/nbdev-a-literate-programming-environment-that-democratizes-software-engineering-best-practices\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/github.blog\\\/developer-skills\\\/programming-languages-and-frameworks\\\/nbdev-a-literate-programming-environment-that-democratizes-software-engineering-best-practices\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/github.blog\\\/developer-skills\\\/programming-languages-and-frameworks\\\/nbdev-a-literate-programming-environment-that-democratizes-software-engineering-best-practices\\\/#primaryimage\",\"url\":\"https:\\\/\\\/github.blog\\\/wp-content\\\/uploads\\\/2020\\\/11\\\/nbdev_logo11.png?fit=1200%2C630\",\"contentUrl\":\"https:\\\/\\\/github.blog\\\/wp-content\\\/uploads\\\/2020\\\/11\\\/nbdev_logo11.png?fit=1200%2C630\",\"width\":1200,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/github.blog\\\/developer-skills\\\/programming-languages-and-frameworks\\\/nbdev-a-literate-programming-environment-that-democratizes-software-engineering-best-practices\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/github.blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Developer skills\",\"item\":\"https:\\\/\\\/github.blog\\\/developer-skills\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Programming languages &amp; frameworks\",\"item\":\"https:\\\/\\\/github.blog\\\/developer-skills\\\/programming-languages-and-frameworks\\\/\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Nbdev: A literate programming environment that democratizes software engineering best practices\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/github.blog\\\/#website\",\"url\":\"https:\\\/\\\/github.blog\\\/\",\"name\":\"The GitHub Blog\",\"description\":\"Updates, ideas, and inspiration from GitHub to help developers build and design software.\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/github.blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/github.blog\\\/#\\\/schema\\\/person\\\/d76319a9b865a8143ac6c5f20d95c568\",\"name\":\"Hamel Husain\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/8559ff90c3d3634c9323fe6712034231d4bc474d7c5e8e6b9ccb49482c892459?s=96&d=mm&r=g864feb2bdaca5e9252640651cf5a7686\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/8559ff90c3d3634c9323fe6712034231d4bc474d7c5e8e6b9ccb49482c892459?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/8559ff90c3d3634c9323fe6712034231d4bc474d7c5e8e6b9ccb49482c892459?s=96&d=mm&r=g\",\"caption\":\"Hamel Husain\"},\"sameAs\":[\"http:\\\/\\\/hamel.io\"],\"url\":\"https:\\\/\\\/github.blog\\\/author\\\/hamelsmu\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Nbdev: A literate programming environment that democratizes software engineering best practices - The GitHub Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/github.blog\/developer-skills\/programming-languages-and-frameworks\/nbdev-a-literate-programming-environment-that-democratizes-software-engineering-best-practices\/","og_locale":"en_US","og_type":"article","og_title":"Nbdev: A literate programming environment that democratizes software engineering best practices","og_description":"Learn about nbdev, a new literate programming environment for Python.","og_url":"https:\/\/github.blog\/developer-skills\/programming-languages-and-frameworks\/nbdev-a-literate-programming-environment-that-democratizes-software-engineering-best-practices\/","og_site_name":"The GitHub Blog","article_published_time":"2020-11-20T17:00:15+00:00","article_modified_time":"2020-11-20T17:49:33+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/github.blog\/wp-content\/uploads\/2020\/11\/nbdev_logo11.png?fit=1200%2C630","type":"image\/png"}],"author":"Hamel Husain","twitter_card":"summary_large_image","twitter_image":"https:\/\/github.blog\/wp-content\/uploads\/2020\/11\/nbdev_logo11.png?fit=1200%2C630","twitter_misc":{"Written by":"Hamel Husain","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/github.blog\/developer-skills\/programming-languages-and-frameworks\/nbdev-a-literate-programming-environment-that-democratizes-software-engineering-best-practices\/#article","isPartOf":{"@id":"https:\/\/github.blog\/developer-skills\/programming-languages-and-frameworks\/nbdev-a-literate-programming-environment-that-democratizes-software-engineering-best-practices\/"},"author":{"name":"Hamel Husain","@id":"https:\/\/github.blog\/#\/schema\/person\/d76319a9b865a8143ac6c5f20d95c568"},"headline":"Nbdev: A literate programming environment that democratizes software engineering best practices","datePublished":"2020-11-20T17:00:15+00:00","dateModified":"2020-11-20T17:49:33+00:00","mainEntityOfPage":{"@id":"https:\/\/github.blog\/developer-skills\/programming-languages-and-frameworks\/nbdev-a-literate-programming-environment-that-democratizes-software-engineering-best-practices\/"},"wordCount":783,"image":{"@id":"https:\/\/github.blog\/developer-skills\/programming-languages-and-frameworks\/nbdev-a-literate-programming-environment-that-democratizes-software-engineering-best-practices\/#primaryimage"},"thumbnailUrl":"https:\/\/github.blog\/wp-content\/uploads\/2020\/11\/nbdev_logo11.png?fit=1200%2C630","articleSection":["Developer skills","Programming languages &amp; frameworks"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/github.blog\/developer-skills\/programming-languages-and-frameworks\/nbdev-a-literate-programming-environment-that-democratizes-software-engineering-best-practices\/","url":"https:\/\/github.blog\/developer-skills\/programming-languages-and-frameworks\/nbdev-a-literate-programming-environment-that-democratizes-software-engineering-best-practices\/","name":"Nbdev: A literate programming environment that democratizes software engineering best practices - The GitHub Blog","isPartOf":{"@id":"https:\/\/github.blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/github.blog\/developer-skills\/programming-languages-and-frameworks\/nbdev-a-literate-programming-environment-that-democratizes-software-engineering-best-practices\/#primaryimage"},"image":{"@id":"https:\/\/github.blog\/developer-skills\/programming-languages-and-frameworks\/nbdev-a-literate-programming-environment-that-democratizes-software-engineering-best-practices\/#primaryimage"},"thumbnailUrl":"https:\/\/github.blog\/wp-content\/uploads\/2020\/11\/nbdev_logo11.png?fit=1200%2C630","datePublished":"2020-11-20T17:00:15+00:00","dateModified":"2020-11-20T17:49:33+00:00","author":{"@id":"https:\/\/github.blog\/#\/schema\/person\/d76319a9b865a8143ac6c5f20d95c568"},"breadcrumb":{"@id":"https:\/\/github.blog\/developer-skills\/programming-languages-and-frameworks\/nbdev-a-literate-programming-environment-that-democratizes-software-engineering-best-practices\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/github.blog\/developer-skills\/programming-languages-and-frameworks\/nbdev-a-literate-programming-environment-that-democratizes-software-engineering-best-practices\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/github.blog\/developer-skills\/programming-languages-and-frameworks\/nbdev-a-literate-programming-environment-that-democratizes-software-engineering-best-practices\/#primaryimage","url":"https:\/\/github.blog\/wp-content\/uploads\/2020\/11\/nbdev_logo11.png?fit=1200%2C630","contentUrl":"https:\/\/github.blog\/wp-content\/uploads\/2020\/11\/nbdev_logo11.png?fit=1200%2C630","width":1200,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/github.blog\/developer-skills\/programming-languages-and-frameworks\/nbdev-a-literate-programming-environment-that-democratizes-software-engineering-best-practices\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/github.blog\/"},{"@type":"ListItem","position":2,"name":"Developer skills","item":"https:\/\/github.blog\/developer-skills\/"},{"@type":"ListItem","position":3,"name":"Programming languages &amp; frameworks","item":"https:\/\/github.blog\/developer-skills\/programming-languages-and-frameworks\/"},{"@type":"ListItem","position":4,"name":"Nbdev: A literate programming environment that democratizes software engineering best practices"}]},{"@type":"WebSite","@id":"https:\/\/github.blog\/#website","url":"https:\/\/github.blog\/","name":"The GitHub Blog","description":"Updates, ideas, and inspiration from GitHub to help developers build and design software.","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/github.blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/github.blog\/#\/schema\/person\/d76319a9b865a8143ac6c5f20d95c568","name":"Hamel Husain","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/8559ff90c3d3634c9323fe6712034231d4bc474d7c5e8e6b9ccb49482c892459?s=96&d=mm&r=g864feb2bdaca5e9252640651cf5a7686","url":"https:\/\/secure.gravatar.com\/avatar\/8559ff90c3d3634c9323fe6712034231d4bc474d7c5e8e6b9ccb49482c892459?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/8559ff90c3d3634c9323fe6712034231d4bc474d7c5e8e6b9ccb49482c892459?s=96&d=mm&r=g","caption":"Hamel Husain"},"sameAs":["http:\/\/hamel.io"],"url":"https:\/\/github.blog\/author\/hamelsmu\/"}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/github.blog\/wp-content\/uploads\/2020\/11\/nbdev_logo11.png?fit=1200%2C630","jetpack_shortlink":"https:\/\/wp.me\/pamS32-elt","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/posts\/55147","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/users\/1617"}],"replies":[{"embeddable":true,"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/comments?post=55147"}],"version-history":[{"count":8,"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/posts\/55147\/revisions"}],"predecessor-version":[{"id":55158,"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/posts\/55147\/revisions\/55158"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/media\/55149"}],"wp:attachment":[{"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/media?parent=55147"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/categories?post=55147"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/tags?post=55147"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/coauthors?post=55147"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}