{"id":2219,"date":"2018-05-09T21:09:53","date_gmt":"2018-05-09T20:09:53","guid":{"rendered":"https:\/\/www.entropywins.wtf\/blog\/?p=2219"},"modified":"2018-07-31T12:56:52","modified_gmt":"2018-07-31T11:56:52","slug":"guidelines-for-new-software-projects","status":"publish","type":"post","link":"https:\/\/www.entropywins.wtf\/blog\/2018\/05\/09\/guidelines-for-new-software-projects\/","title":{"rendered":"Guidelines for New Software Projects"},"content":{"rendered":"<p>In this blog post I share the Guidelines for New Software Projects that we use at Wikimedia Deutschland.<\/p>\n<p>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 <a href=\"https:\/\/software.wikimedia.de\/\">software development department<\/a>, as since we did not have written down guidelines anywhere, both this department and the third-party lacked information they needed to do a good job. The guidelines are a short-and-to-the-point 2 page document that can be shared third parties and serves as a starting point when making choices for internal projects.<\/p>\n<p>If you do not have such guidelines at your organization, you can copy these, though you will of course need to update the &#8220;Widespread Knowledge at Our Department&#8221; section. If you have suggestions for improvements or interesting differences in your own guidelines, leave a comment!<\/p>\n<hr \/>\n<h2>Domain of Applicability<\/h2>\n<p>These guidelines are for non-trivial software that will need to be maintained or developed further. They do not apply to throw-away scripts (if indeed they will be thrown away) or trivial code such as a website with a few static web pages. If on the other hand the software needs to be maintained, then these guidelines are relevant to the degree that the software is complex and hard to replace.<\/p>\n<h2>Choice of Stack<\/h2>\n<p>The stack includes programming language, frameworks, libraries, databases and tools that are otherwise required to run or develop the software.<\/p>\n<p>We want<\/p>\n<ul>\n<li>It to be easy to hire people who can work with the stack<\/li>\n<li>It to be easy for our software engineering department to work with the stack<\/li>\n<li>The stack to continue to be supported and develop with the rest of the ecosystem<\/li>\n<\/ul>\n<p>Therefore<\/p>\n<ul>\n<li>Solutions (ie frameworks, libraries) known by many developers are preferred over obscure ones<\/li>\n<li>Custom\/proprietary solutions, where mature and popular alternatives are available, are undesired<\/li>\n<li>Solutions known by our developers are preferred<\/li>\n<li>Solutions with many contributors are preferred over those with few<\/li>\n<li>Solutions with active development are preferred over inactive ones<\/li>\n<li>More recent versions of the solutions are preferred, especially over unsupported ones<\/li>\n<li>Introducing new dependencies requires justification for the maintenance cost they add<\/li>\n<li>Solutions that are well designed (see below) are preferred over those that are not<\/li>\n<\/ul>\n<h3>Widespread Knowledge at Our Department<\/h3>\n<ul>\n<li>Languages: PHP and JavaScript<\/li>\n<li>Databases: MySQL and SQLite<\/li>\n<li>Frameworks: Symfony Components and Silex (discontinued)<\/li>\n<li>Testing tools: PHPUnit, QUnit, Selenium\/Mocha<\/li>\n<li>Virtualization tools: Docker, Vagrant<\/li>\n<\/ul>\n<h2>Architecture and Code Quality<\/h2>\n<p>We want<\/p>\n<ul>\n<li>It to be easy (and thus cheap) to maintain and further develop the project<\/li>\n<\/ul>\n<p>Therefore<\/p>\n<ul>\n<li>Decoupled architecture is preferred, including\n<ul>\n<li>Decoupling from the framework, especially if the framework has issues (see above) and thus forms a greater than usual liability.<\/li>\n<li>Separation of persistence from domain and application logic<\/li>\n<li>Separation of presentation from domain and application logic<\/li>\n<\/ul>\n<\/li>\n<li>The code should adhere to the SOLID principles, not be STUPID and otherwise be clean on a low-level.<\/li>\n<li>The applications logic should be tested with tests of the right type (ie Unit, Integration, Edge to Edge) that are themselves well written and not laden with unneeded coupling.<\/li>\n<li>Setup of the project for development should be automated, preferably using virtualization tools such as Docker. After this automated setup developers should be able to easily run the tests and interact with the application.<\/li>\n<li>If the domain is non-trivial, usage of Domain-driven design (including the strategic patterns) is preferred<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>In this blog post I share the Guidelines for New Software Projects that we use at Wikimedia Deutschland. I wrote&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":[197,365,285,336],"class_list":["post-2219","post","type-post","status-publish","format-standard","hentry","category-programming","tag-planet-wikimedia","tag-software-craftsmanship","tag-wikimedia","tag-wmde"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Guidelines for New Software Projects - 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\/05\/09\/guidelines-for-new-software-projects\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Guidelines for New Software Projects - Blog of Jeroen De Dauw\" \/>\n<meta property=\"og:description\" content=\"In this blog post I share the Guidelines for New Software Projects that we use at Wikimedia Deutschland. I wrote&hellip;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.entropywins.wtf\/blog\/2018\/05\/09\/guidelines-for-new-software-projects\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog of Jeroen De Dauw\" \/>\n<meta property=\"article:published_time\" content=\"2018-05-09T20:09:53+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2018-07-31T11:56:52+00:00\" \/>\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\\\/05\\\/09\\\/guidelines-for-new-software-projects\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2018\\\/05\\\/09\\\/guidelines-for-new-software-projects\\\/\"},\"author\":{\"name\":\"Jeroen\",\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/#\\\/schema\\\/person\\\/4e2ef14f2ca7dc3a0ac137d1692b66b7\"},\"headline\":\"Guidelines for New Software Projects\",\"datePublished\":\"2018-05-09T20:09:53+00:00\",\"dateModified\":\"2018-07-31T11:56:52+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2018\\\/05\\\/09\\\/guidelines-for-new-software-projects\\\/\"},\"wordCount\":568,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/#\\\/schema\\\/person\\\/4e2ef14f2ca7dc3a0ac137d1692b66b7\"},\"keywords\":[\"Planet Wikimedia\",\"Software Craftsmanship\",\"Wikimedia\",\"WMDE\"],\"articleSection\":[\"Programming\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2018\\\/05\\\/09\\\/guidelines-for-new-software-projects\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2018\\\/05\\\/09\\\/guidelines-for-new-software-projects\\\/\",\"url\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2018\\\/05\\\/09\\\/guidelines-for-new-software-projects\\\/\",\"name\":\"Guidelines for New Software Projects - Blog of Jeroen De Dauw\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/#website\"},\"datePublished\":\"2018-05-09T20:09:53+00:00\",\"dateModified\":\"2018-07-31T11:56:52+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2018\\\/05\\\/09\\\/guidelines-for-new-software-projects\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2018\\\/05\\\/09\\\/guidelines-for-new-software-projects\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2018\\\/05\\\/09\\\/guidelines-for-new-software-projects\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Guidelines for New Software Projects\"}]},{\"@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":"Guidelines for New Software Projects - 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\/05\/09\/guidelines-for-new-software-projects\/","og_locale":"en_US","og_type":"article","og_title":"Guidelines for New Software Projects - Blog of Jeroen De Dauw","og_description":"In this blog post I share the Guidelines for New Software Projects that we use at Wikimedia Deutschland. I wrote&hellip;","og_url":"https:\/\/www.entropywins.wtf\/blog\/2018\/05\/09\/guidelines-for-new-software-projects\/","og_site_name":"Blog of Jeroen De Dauw","article_published_time":"2018-05-09T20:09:53+00:00","article_modified_time":"2018-07-31T11:56:52+00:00","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\/05\/09\/guidelines-for-new-software-projects\/#article","isPartOf":{"@id":"https:\/\/www.entropywins.wtf\/blog\/2018\/05\/09\/guidelines-for-new-software-projects\/"},"author":{"name":"Jeroen","@id":"https:\/\/www.entropywins.wtf\/blog\/#\/schema\/person\/4e2ef14f2ca7dc3a0ac137d1692b66b7"},"headline":"Guidelines for New Software Projects","datePublished":"2018-05-09T20:09:53+00:00","dateModified":"2018-07-31T11:56:52+00:00","mainEntityOfPage":{"@id":"https:\/\/www.entropywins.wtf\/blog\/2018\/05\/09\/guidelines-for-new-software-projects\/"},"wordCount":568,"commentCount":0,"publisher":{"@id":"https:\/\/www.entropywins.wtf\/blog\/#\/schema\/person\/4e2ef14f2ca7dc3a0ac137d1692b66b7"},"keywords":["Planet Wikimedia","Software Craftsmanship","Wikimedia","WMDE"],"articleSection":["Programming"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.entropywins.wtf\/blog\/2018\/05\/09\/guidelines-for-new-software-projects\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.entropywins.wtf\/blog\/2018\/05\/09\/guidelines-for-new-software-projects\/","url":"https:\/\/www.entropywins.wtf\/blog\/2018\/05\/09\/guidelines-for-new-software-projects\/","name":"Guidelines for New Software Projects - Blog of Jeroen De Dauw","isPartOf":{"@id":"https:\/\/www.entropywins.wtf\/blog\/#website"},"datePublished":"2018-05-09T20:09:53+00:00","dateModified":"2018-07-31T11:56:52+00:00","breadcrumb":{"@id":"https:\/\/www.entropywins.wtf\/blog\/2018\/05\/09\/guidelines-for-new-software-projects\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.entropywins.wtf\/blog\/2018\/05\/09\/guidelines-for-new-software-projects\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.entropywins.wtf\/blog\/2018\/05\/09\/guidelines-for-new-software-projects\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.entropywins.wtf\/blog\/"},{"@type":"ListItem","position":2,"name":"Guidelines for New Software Projects"}]},{"@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-zN","jetpack-related-posts":[{"id":2278,"url":"https:\/\/www.entropywins.wtf\/blog\/2018\/08\/14\/bounded-contexts-in-the-wikimedia-fundraising-software\/","url_meta":{"origin":2219,"position":0},"title":"Bounded Contexts in the Wikimedia Fundraising Software","author":"Jeroen","date":"2018-08-14","format":false,"excerpt":"In this follow-up to rewriting the Wikimedia Deutschland fundraising I tell the story of how we reorganized our codebases along the lines of the DDD strategic pattern Bounded Contexts. In 2016 the FUN team at Wikimedia Deutschland rewrote the Wikimedia Deutschland fundraising application. This new codebase uses The Clean Architecture\u2026","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/www.entropywins.wtf\/blog\/category\/programming\/"},"img":{"alt_text":"Diagram depicting Clean Architecture + Bounded Contexts","src":"https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2018\/08\/Such-Clean-Diagram.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2018\/08\/Such-Clean-Diagram.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2018\/08\/Such-Clean-Diagram.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2018\/08\/Such-Clean-Diagram.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2018\/08\/Such-Clean-Diagram.png?resize=1050%2C600&ssl=1 3x"},"classes":[]},{"id":706,"url":"https:\/\/www.entropywins.wtf\/blog\/2010\/02\/10\/working-for-wikimedia-foundation\/","url_meta":{"origin":2219,"position":1},"title":"Working for Wikimedia Foundation","author":"Jeroen","date":"2010-02-10","format":false,"excerpt":"As of today I'm working for the Wikimedia Foundation as developer. I have a 3 month contract, after which I'll participate in GSoC 2010, and do a project for ... well... Wikimedia Foundation :) (I'll post more about GSoC 2010 later on, I have a really awesome project planned :d)\u2026","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/www.entropywins.wtf\/blog\/category\/programming\/"},"img":{"alt_text":"Wikimedia Foundation logo","src":"https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2010\/02\/Wikimedia_Foundation_RGB_logo_with_text.svg_.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":1841,"url":"https:\/\/www.entropywins.wtf\/blog\/2016\/11\/24\/rewriting-the-wikimedia-deutschland-funrdraising\/","url_meta":{"origin":2219,"position":2},"title":"Rewriting the Wikimedia Deutschland fundraising","author":"Jeroen","date":"2016-11-24","format":false,"excerpt":"Last year we rewrote the Wikimedia Deutschland fundraising software. In this blog post I'll give you an idea of what this software does, why we rewrote it and the outcome of this rewrite. The application Our fundraising software is a homegrown PHP application. Its primary functions are donations and membership\u2026","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/www.entropywins.wtf\/blog\/category\/programming\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2016\/11\/lloc-per-global.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2016\/11\/lloc-per-global.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2016\/11\/lloc-per-global.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2016\/11\/lloc-per-global.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":1363,"url":"https:\/\/www.entropywins.wtf\/blog\/2014\/07\/12\/component-design\/","url_meta":{"origin":2219,"position":3},"title":"Component design","author":"Jeroen","date":"2014-07-12","format":false,"excerpt":"This week I gave a presentation titled \"Component design: Getting cohesion and coupling right\" at Wikimedia Deutschland. Components are a level of organization, in between classes and layers. They are an important mechanism in avoiding monolithic designs and big balls of mud. While everyone can recognize a component when they\u2026","rel":"","context":"In &quot;Software&quot;","block_context":{"text":"Software","link":"https:\/\/www.entropywins.wtf\/blog\/category\/software\/"},"img":{"alt_text":"slides-0-first","src":"https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2014\/07\/slides-0-first-1024x547.jpg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2014\/07\/slides-0-first-1024x547.jpg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2014\/07\/slides-0-first-1024x547.jpg?resize=525%2C300&ssl=1 1.5x"},"classes":[]},{"id":1296,"url":"https:\/\/www.entropywins.wtf\/blog\/2014\/04\/04\/wikidata-code-review-2014\/","url_meta":{"origin":2219,"position":4},"title":"Wikidata Code Review 2014","author":"Jeroen","date":"2014-04-04","format":false,"excerpt":"One year ago we had the Qafoo guys come into the Wikimedia Deutschland office to review the software we had written for the Wikidata project. There is a summary of the review as well as a big PDF with all the details. This week I presented a follow up review\u2026","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/www.entropywins.wtf\/blog\/category\/programming\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2014\/04\/cr-300x238.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":1807,"url":"https:\/\/www.entropywins.wtf\/blog\/2016\/09\/09\/clean-architecture-diagram\/","url_meta":{"origin":2219,"position":5},"title":"Clean Architecture diagrams","author":"Jeroen","date":"2016-09-09","format":false,"excerpt":"I'm happy to release a few Clean Architecture related diagrams into the public domain (CC0 1.0). Update 2018-9-9: new diagrams featuring Bounded Contexsts are now available! These diagrams where created at Wikimedia Deutchland by Jan Dittrich, Charlie Kritschmar and myself for an upcoming presentation I'm doing on the Clean Architecture.\u2026","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/www.entropywins.wtf\/blog\/category\/programming\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2016\/09\/Clean_Architecture_core.svg_.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2016\/09\/Clean_Architecture_core.svg_.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2016\/09\/Clean_Architecture_core.svg_.png?resize=525%2C300&ssl=1 1.5x"},"classes":[]}],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/posts\/2219","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=2219"}],"version-history":[{"count":3,"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/posts\/2219\/revisions"}],"predecessor-version":[{"id":2222,"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/posts\/2219\/revisions\/2222"}],"wp:attachment":[{"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/media?parent=2219"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/categories?post=2219"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/tags?post=2219"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}