{"id":2330,"date":"2018-08-30T00:09:17","date_gmt":"2018-08-29T23:09:17","guid":{"rendered":"https:\/\/www.entropywins.wtf\/blog\/?p=2330"},"modified":"2018-08-30T03:08:22","modified_gmt":"2018-08-30T02:08:22","slug":"base-libraries-should-be-stable","status":"publish","type":"post","link":"https:\/\/www.entropywins.wtf\/blog\/2018\/08\/30\/base-libraries-should-be-stable\/","title":{"rendered":"Base Libraries Should be Stable"},"content":{"rendered":"<p>In this post I go over the principles that govern package (library) design and one specific issue I have come across several times.<\/p>\n<p>Robert C Martin has proposed six <a href=\"https:\/\/en.wikipedia.org\/wiki\/Package_principles\">Package Principles<\/a>. Personally I find the (linked) description on Wikipedia rather confusing, especially if you do not already understand the principles. Here is my take on library design using short and simple points:<\/p>\n<p>Libraries should<\/p>\n<ul>\n<li>cover a single responsibility<\/li>\n<li>provide a clean and well segregated interface to their users<\/li>\n<li>hide\/encapsulate implementation details<\/li>\n<li>not have cyclic dependencies<\/li>\n<li>not depend on less stable libraries<\/li>\n<\/ul>\n<p>The rest of this post focuses on the importance of the last point.<\/p>\n<h2>Stable Base Libraries<\/h2>\n<p>I am assuming usage of a package manager such as <a href=\"https:\/\/getcomposer.org\/\">Composer<\/a> (PHP) or NPM. This means that each library defines its dependencies (if any) and the version ranges of those that it is compatible with. Libraries have releases and these follow <a href=\"https:\/\/semver.org\/\">semver<\/a>. It also means that libraries are ultimately consumed by applications that define their dependencies in the same way.<\/p>\n<p>Consider the scenario where you have various applications that all consume a base library.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"2332\" data-permalink=\"https:\/\/www.entropywins.wtf\/blog\/2018\/08\/30\/base-libraries-should-be-stable\/lib-used-by-apps\/\" data-orig-file=\"https:\/\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2018\/08\/lib-used-by-apps.png\" data-orig-size=\"586,181\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"lib-used-by-apps\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2018\/08\/lib-used-by-apps.png\" class=\"alignnone size-full wp-image-2332\" src=\"https:\/\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2018\/08\/lib-used-by-apps.png\" alt=\"\" width=\"586\" height=\"181\" \/><\/p>\n<p>If this library contains a lot of concrete code, it will not be very stable and it will now and then be needed or desired to make a major release. A major release is one that can contain breaking changes and therefore does not automatically get used by consumers of the library. These consumers instead need to manually update the version range of the library they are compatible with and possibly adjust their code to work with the breaking changes.<\/p>\n<p>In this scenario that is not a problem. Suppose the library is at version 1.2 and that all applications use version 1.x. If breaking changes are made in the library, these will need to be released as version 2.0. Due to the versioning system the consuming applications can upgrade at their leisure. There is of course some cost to making a major release. The consumers still do need to spend some time on the upgrade, especially if they are affected by the breaking changes. Still, this is typically easy to deal with and is a normal part of the development process.<\/p>\n<p>Things change drastically when we have an unstable library that is used by other libraries, even if those libraries themselves are unstable.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"2339\" data-permalink=\"https:\/\/www.entropywins.wtf\/blog\/2018\/08\/30\/base-libraries-should-be-stable\/lib-hierarchy-used-by-app\/\" data-orig-file=\"https:\/\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2018\/08\/lib-hierarchy-used-by-app.png\" data-orig-size=\"741,307\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"lib-hierarchy-used-by-app\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2018\/08\/lib-hierarchy-used-by-app.png\" class=\"alignnone wp-image-2339\" src=\"https:\/\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2018\/08\/lib-hierarchy-used-by-app.png\" alt=\"\" width=\"591\" height=\"245\" \/><\/p>\n<p>In such a scenario making breaking changes to the base library are very costly. Let&#8217;s assume we make a breaking change to the base library and that we want to use it in our application. What do we actually need to do to get there?<\/p>\n<ul>\n<li>Make a release of the base library (Library A)<\/li>\n<li>Update library B to specify it is compatible with the new A and make a new release of B<\/li>\n<li>Update library C to specify it is compatible with the new A and make a new release of C<\/li>\n<li>Update library D to specify it is compatible with the new A and make a new release of D<\/li>\n<li>Update our application to specify it is compatible with the new version of A<\/li>\n<\/ul>\n<p>In other words, we need to make a new release of EVERY library that uses our base library and that is also used by our application. This can be very painful, and is a big waste of time if these intermediate libraries where not actually affected by the breaking change to begin with. This means that it is costly, and generally a bad idea, to have libraries depend on another library that is not very stable.<\/p>\n<p>Stability can be achieved in several ways. If the package is very abstract, and we assume good design, it will be stable. Think of a package providing a logging interface, such as <a href=\"https:\/\/packagist.org\/packages\/psr\/log\">psr\/log<\/a>. It can also be approached by a combination of following the package principles and taking care to avoid breaking changes.<\/p>\n<h2>Conclusion<\/h2>\n<p>Keep the package principles in mind, and avoid depending on unstable libraries in your own libraries where possible.<\/p>\n<h2>See also<\/h2>\n<ul>\n<li><a href=\"https:\/\/www.entropywins.wtf\/blog\/2014\/07\/12\/component-design\/\">Component Design (blog)<\/a><\/li>\n<li><a href=\"http:\/\/bit.ly\/component-design\">Component Design (slides)<\/a><\/li>\n<li><a href=\"https:\/\/en.wikipedia.org\/wiki\/Package_principles\">Package Principles (Wikipedia)<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>In this post I go over the principles that govern package (library) design and one specific issue I have come&hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_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}},"categories":[7],"tags":[328,353,340,197,316],"class_list":["post-2330","post","type-post","status-publish","format-standard","hentry","category-programming","tag-clean-code","tag-component-design","tag-components","tag-planet-wikimedia","tag-software-design"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Base Libraries Should be Stable - Blog of Jeroen De Dauw<\/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:\/\/www.entropywins.wtf\/blog\/2018\/08\/30\/base-libraries-should-be-stable\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Base Libraries Should be Stable - Blog of Jeroen De Dauw\" \/>\n<meta property=\"og:description\" content=\"In this post I go over the principles that govern package (library) design and one specific issue I have come&hellip;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.entropywins.wtf\/blog\/2018\/08\/30\/base-libraries-should-be-stable\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog of Jeroen De Dauw\" \/>\n<meta property=\"article:published_time\" content=\"2018-08-29T23:09:17+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2018-08-30T02:08:22+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2018\/08\/lib-used-by-apps.png\" \/>\n<meta name=\"author\" content=\"Jeroen\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@https:\/\/twitter.com\/JeroenDeDauw\" \/>\n<meta name=\"twitter:site\" content=\"@JeroenDeDauw\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jeroen\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2018\\\/08\\\/30\\\/base-libraries-should-be-stable\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2018\\\/08\\\/30\\\/base-libraries-should-be-stable\\\/\"},\"author\":{\"name\":\"Jeroen\",\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/#\\\/schema\\\/person\\\/4e2ef14f2ca7dc3a0ac137d1692b66b7\"},\"headline\":\"Base Libraries Should be Stable\",\"datePublished\":\"2018-08-29T23:09:17+00:00\",\"dateModified\":\"2018-08-30T02:08:22+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2018\\\/08\\\/30\\\/base-libraries-should-be-stable\\\/\"},\"wordCount\":674,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/#\\\/schema\\\/person\\\/4e2ef14f2ca7dc3a0ac137d1692b66b7\"},\"image\":{\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2018\\\/08\\\/30\\\/base-libraries-should-be-stable\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/wp-content\\\/uploads\\\/2018\\\/08\\\/lib-used-by-apps.png\",\"keywords\":[\"Clean Code\",\"Component design\",\"Components\",\"Planet Wikimedia\",\"Software design\"],\"articleSection\":[\"Programming\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2018\\\/08\\\/30\\\/base-libraries-should-be-stable\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2018\\\/08\\\/30\\\/base-libraries-should-be-stable\\\/\",\"url\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2018\\\/08\\\/30\\\/base-libraries-should-be-stable\\\/\",\"name\":\"Base Libraries Should be Stable - Blog of Jeroen De Dauw\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2018\\\/08\\\/30\\\/base-libraries-should-be-stable\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2018\\\/08\\\/30\\\/base-libraries-should-be-stable\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/wp-content\\\/uploads\\\/2018\\\/08\\\/lib-used-by-apps.png\",\"datePublished\":\"2018-08-29T23:09:17+00:00\",\"dateModified\":\"2018-08-30T02:08:22+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2018\\\/08\\\/30\\\/base-libraries-should-be-stable\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2018\\\/08\\\/30\\\/base-libraries-should-be-stable\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2018\\\/08\\\/30\\\/base-libraries-should-be-stable\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/wp-content\\\/uploads\\\/2018\\\/08\\\/lib-used-by-apps.png\",\"contentUrl\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/wp-content\\\/uploads\\\/2018\\\/08\\\/lib-used-by-apps.png\",\"width\":586,\"height\":181},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2018\\\/08\\\/30\\\/base-libraries-should-be-stable\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Base Libraries Should be Stable\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/\",\"name\":\"Entropy Wins\",\"description\":\"A blog on Software Architecture, Design and Craftsmanship\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/#\\\/schema\\\/person\\\/4e2ef14f2ca7dc3a0ac137d1692b66b7\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/#\\\/schema\\\/person\\\/4e2ef14f2ca7dc3a0ac137d1692b66b7\",\"name\":\"Jeroen\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d62e6b5b8e332335cf17854fac850d9c70ba367c4692872613c3110ebd4e009b?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d62e6b5b8e332335cf17854fac850d9c70ba367c4692872613c3110ebd4e009b?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d62e6b5b8e332335cf17854fac850d9c70ba367c4692872613c3110ebd4e009b?s=96&d=mm&r=g\",\"caption\":\"Jeroen\"},\"logo\":{\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d62e6b5b8e332335cf17854fac850d9c70ba367c4692872613c3110ebd4e009b?s=96&d=mm&r=g\"},\"sameAs\":[\"https:\\\/\\\/www.linkedin.com\\\/in\\\/jeroendedauw\\\/\",\"https:\\\/\\\/x.com\\\/https:\\\/\\\/twitter.com\\\/JeroenDeDauw\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Base Libraries Should be Stable - Blog of Jeroen De Dauw","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:\/\/www.entropywins.wtf\/blog\/2018\/08\/30\/base-libraries-should-be-stable\/","og_locale":"en_US","og_type":"article","og_title":"Base Libraries Should be Stable - Blog of Jeroen De Dauw","og_description":"In this post I go over the principles that govern package (library) design and one specific issue I have come&hellip;","og_url":"https:\/\/www.entropywins.wtf\/blog\/2018\/08\/30\/base-libraries-should-be-stable\/","og_site_name":"Blog of Jeroen De Dauw","article_published_time":"2018-08-29T23:09:17+00:00","article_modified_time":"2018-08-30T02:08:22+00:00","og_image":[{"url":"https:\/\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2018\/08\/lib-used-by-apps.png","type":"","width":"","height":""}],"author":"Jeroen","twitter_card":"summary_large_image","twitter_creator":"@https:\/\/twitter.com\/JeroenDeDauw","twitter_site":"@JeroenDeDauw","twitter_misc":{"Written by":"Jeroen","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.entropywins.wtf\/blog\/2018\/08\/30\/base-libraries-should-be-stable\/#article","isPartOf":{"@id":"https:\/\/www.entropywins.wtf\/blog\/2018\/08\/30\/base-libraries-should-be-stable\/"},"author":{"name":"Jeroen","@id":"https:\/\/www.entropywins.wtf\/blog\/#\/schema\/person\/4e2ef14f2ca7dc3a0ac137d1692b66b7"},"headline":"Base Libraries Should be Stable","datePublished":"2018-08-29T23:09:17+00:00","dateModified":"2018-08-30T02:08:22+00:00","mainEntityOfPage":{"@id":"https:\/\/www.entropywins.wtf\/blog\/2018\/08\/30\/base-libraries-should-be-stable\/"},"wordCount":674,"commentCount":0,"publisher":{"@id":"https:\/\/www.entropywins.wtf\/blog\/#\/schema\/person\/4e2ef14f2ca7dc3a0ac137d1692b66b7"},"image":{"@id":"https:\/\/www.entropywins.wtf\/blog\/2018\/08\/30\/base-libraries-should-be-stable\/#primaryimage"},"thumbnailUrl":"https:\/\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2018\/08\/lib-used-by-apps.png","keywords":["Clean Code","Component design","Components","Planet Wikimedia","Software design"],"articleSection":["Programming"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.entropywins.wtf\/blog\/2018\/08\/30\/base-libraries-should-be-stable\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.entropywins.wtf\/blog\/2018\/08\/30\/base-libraries-should-be-stable\/","url":"https:\/\/www.entropywins.wtf\/blog\/2018\/08\/30\/base-libraries-should-be-stable\/","name":"Base Libraries Should be Stable - Blog of Jeroen De Dauw","isPartOf":{"@id":"https:\/\/www.entropywins.wtf\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.entropywins.wtf\/blog\/2018\/08\/30\/base-libraries-should-be-stable\/#primaryimage"},"image":{"@id":"https:\/\/www.entropywins.wtf\/blog\/2018\/08\/30\/base-libraries-should-be-stable\/#primaryimage"},"thumbnailUrl":"https:\/\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2018\/08\/lib-used-by-apps.png","datePublished":"2018-08-29T23:09:17+00:00","dateModified":"2018-08-30T02:08:22+00:00","breadcrumb":{"@id":"https:\/\/www.entropywins.wtf\/blog\/2018\/08\/30\/base-libraries-should-be-stable\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.entropywins.wtf\/blog\/2018\/08\/30\/base-libraries-should-be-stable\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.entropywins.wtf\/blog\/2018\/08\/30\/base-libraries-should-be-stable\/#primaryimage","url":"https:\/\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2018\/08\/lib-used-by-apps.png","contentUrl":"https:\/\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2018\/08\/lib-used-by-apps.png","width":586,"height":181},{"@type":"BreadcrumbList","@id":"https:\/\/www.entropywins.wtf\/blog\/2018\/08\/30\/base-libraries-should-be-stable\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.entropywins.wtf\/blog\/"},{"@type":"ListItem","position":2,"name":"Base Libraries Should be Stable"}]},{"@type":"WebSite","@id":"https:\/\/www.entropywins.wtf\/blog\/#website","url":"https:\/\/www.entropywins.wtf\/blog\/","name":"Entropy Wins","description":"A blog on Software Architecture, Design and Craftsmanship","publisher":{"@id":"https:\/\/www.entropywins.wtf\/blog\/#\/schema\/person\/4e2ef14f2ca7dc3a0ac137d1692b66b7"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.entropywins.wtf\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.entropywins.wtf\/blog\/#\/schema\/person\/4e2ef14f2ca7dc3a0ac137d1692b66b7","name":"Jeroen","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/d62e6b5b8e332335cf17854fac850d9c70ba367c4692872613c3110ebd4e009b?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/d62e6b5b8e332335cf17854fac850d9c70ba367c4692872613c3110ebd4e009b?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d62e6b5b8e332335cf17854fac850d9c70ba367c4692872613c3110ebd4e009b?s=96&d=mm&r=g","caption":"Jeroen"},"logo":{"@id":"https:\/\/secure.gravatar.com\/avatar\/d62e6b5b8e332335cf17854fac850d9c70ba367c4692872613c3110ebd4e009b?s=96&d=mm&r=g"},"sameAs":["https:\/\/www.linkedin.com\/in\/jeroendedauw\/","https:\/\/x.com\/https:\/\/twitter.com\/JeroenDeDauw"]}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p74TBF-BA","jetpack-related-posts":[{"id":1151,"url":"https:\/\/www.entropywins.wtf\/blog\/2013\/11\/24\/datavalues-library\/","url_meta":{"origin":2330,"position":0},"title":"DataValues library","author":"Jeroen","date":"2013-11-24","format":false,"excerpt":"Last week I released the first version of the DataValues library. This blog post serves as an introduction to that library, explaining the motivations behind it, and providing a historical context. (Originally posted on November 24, 2013) A bit over a year ago, I wrote down a basic strategic outline\u2026","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/www.entropywins.wtf\/blog\/category\/programming\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1479,"url":"https:\/\/www.entropywins.wtf\/blog\/2015\/11\/08\/rewindable-php-generators\/","url_meta":{"origin":2330,"position":1},"title":"Rewindable PHP Generators","author":"Jeroen","date":"2015-11-08","format":false,"excerpt":"Today I was refactoring some code in one of my libraries, and ended up replacing a named Iterator class with a Generator. To my surprise this changed behaviour, which I noticed due to a broken test. A test verifying that I could iterate multiple times through the iterator - good\u2026","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/www.entropywins.wtf\/blog\/category\/programming\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1160,"url":"https:\/\/www.entropywins.wtf\/blog\/2013\/11\/28\/my-adventures-with-autoloading-in-php\/","url_meta":{"origin":2330,"position":2},"title":"My adventures with autoloading in PHP","author":"Jeroen","date":"2013-11-28","format":false,"excerpt":"This post has as audience developers and will provide readers with insights on how to cleanly autoload classes in PHP. For a long long time, I\u2019ve been one of those MediaWiki developers that just added classes and file names to $wgAutoloadClasses, without really knowing how this made class loading work\u2026","rel":"","context":"In \"Autoloading\"","block_context":{"text":"Autoloading","link":"https:\/\/www.entropywins.wtf\/blog\/tag\/autoloading\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1488,"url":"https:\/\/www.entropywins.wtf\/blog\/2015\/11\/14\/entitystore-and-termstore-for-wikibasewikidata\/","url_meta":{"origin":2330,"position":3},"title":"EntityStore and TermStore for Wikibase\/Wikidata","author":"Jeroen","date":"2015-11-14","format":false,"excerpt":"I'm happy to announce the public release of two new PHP libraries that provide services around Wikibase, the software behind Wikidata. They are called QueryR EntityStore and QueryR TermStore. Both these libraries provide persistence and lookup services for specific Wikibase data. These services are build on top of Doctrine DBAL,\u2026","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/www.entropywins.wtf\/blog\/category\/programming\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":2219,"url":"https:\/\/www.entropywins.wtf\/blog\/2018\/05\/09\/guidelines-for-new-software-projects\/","url_meta":{"origin":2330,"position":4},"title":"Guidelines for New Software Projects","author":"Jeroen","date":"2018-05-09","format":false,"excerpt":"In this blog post I share the Guidelines for New Software Projects that we use at Wikimedia Deutschland. I wrote down these guidelines recently after a third-party that was contracted by Wikimedia Deutschland delivered software that was problematic in several ways. The department contracting this third-party was not the software\u2026","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/www.entropywins.wtf\/blog\/category\/programming\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1162,"url":"https:\/\/www.entropywins.wtf\/blog\/2013\/12\/01\/datavalues-geo-0-1-1-released\/","url_meta":{"origin":2330,"position":5},"title":"DataValues Geo 0.1.1 released","author":"Jeroen","date":"2013-12-01","format":false,"excerpt":"I\u2019m happy to announce the release of DataValues Geo 0.1.1. DataValues Geo is a library containing value objects to represent geographical information, parsers to turn user input into such value objects, and formatters to turn them back into user consumable representations. It is part of the DataValues set of libraries.\u2026","rel":"","context":"In \"DataValues\"","block_context":{"text":"DataValues","link":"https:\/\/www.entropywins.wtf\/blog\/tag\/datavalues\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/posts\/2330","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/comments?post=2330"}],"version-history":[{"count":7,"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/posts\/2330\/revisions"}],"predecessor-version":[{"id":2341,"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/posts\/2330\/revisions\/2341"}],"wp:attachment":[{"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/media?parent=2330"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/categories?post=2330"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/tags?post=2330"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}