{"id":1761,"date":"2016-06-01T15:37:26","date_gmt":"2016-06-01T14:37:26","guid":{"rendered":"https:\/\/www.entropywins.wtf\/blog\/?p=1761"},"modified":"2018-07-31T13:01:59","modified_gmt":"2018-07-31T12:01:59","slug":"php-unconference-europe-2016","status":"publish","type":"post","link":"https:\/\/www.entropywins.wtf\/blog\/2016\/06\/01\/php-unconference-europe-2016\/","title":{"rendered":"PHP Unconference Europe 2016"},"content":{"rendered":"<p>Last week I attended the 2016 edition of the <a href=\"http:\/\/www.phpuceu.org\/\">PHP Unconference Europe<\/a>, taking place in Palma De Mallorca. This post contains my notes from various conference sessions. Be warned, some of them are quite rough.<\/p>\n<p><strong>Overall impression<\/strong><\/p>\n<p>Before getting to the notes, I&#8217;d like to explain the setup of the unconference and my general impression.<\/p>\n<p>The unconference is two days long, not counting associated social events before and afterwards. The first day started with people discussing in small groups which sessions they would like to have, either by leading them themselves, or just wanting to attend. These session ideas where written down and put on papers on the wall. We then went through them one by one, with someone explaining the idea behind each session, and one or more presenters \/ hosts being chosen. The final step of the process was to vote on the sessions. For this, each person got two &#8220;sticky dots&#8221; (what are those things called anyway?), which they could either both put onto a single session, or split and vote on two sessions.<\/p>\n<blockquote class=\"twitter-tweet\" data-lang=\"en\">\n<p dir=\"ltr\" lang=\"en\">Voting starts at <a href=\"https:\/\/twitter.com\/hashtag\/phpuceu?src=hash\">#phpuceu<\/a> <a href=\"https:\/\/t.co\/XRs7vp85nZ\">pic.twitter.com\/XRs7vp85nZ<\/a><\/p>\n<p>\u2014 Matthias Vianden (@mavia) <a href=\"https:\/\/twitter.com\/mavia\/status\/736489154595422208\">May 28, 2016<\/a><\/p><\/blockquote>\n<p><script src=\"\/\/platform.twitter.com\/widgets.js\" async=\"\" charset=\"utf-8\"><\/script><\/p>\n<p>One each day we had 4 such sessions, with long breaks in between, to promote interaction between the attendees.<\/p>\n<p>Onto my notes for individual sessions:<\/p>\n<p><strong>How we analyze your code<\/strong><\/p>\n<p>Analysis and metrics can be used for tracking progress and for analyzing the current state. Talk focuses on current state.<\/p>\n<ul>\n<li>Which code is important<\/li>\n<li>Probably buggy code<\/li>\n<li>Badly tested code<\/li>\n<li>Untested code<\/li>\n<\/ul>\n<p>Finding the core (kore?): code rank (like Google page rank): importance flows to classes that are dependent upon (fan-in). <a href=\"https:\/\/github.com\/Qafoo\/QualityAnalyzer\">Qafoo Quality Analyzer<\/a>. Reverse code rank: classes that depend on lots of other classes (fan-out)<\/p>\n<p>Where do we expect bugs? Typically where code is hard to understand. We can look at method complexity: <a href=\"https:\/\/modess.io\/npath-complexity-cyclomatic-complexity-explained\/\">cyclomatic complexity, NPath complexity<\/a>. Line Coverage exists, Path Coverage is being worked upon. Parameter Value Coverage. <a href=\"http:\/\/googletesting.blogspot.de\/2011\/02\/this-code-is-crap.html\">CRAP<\/a>.<\/p>\n<p>Excessive coupling is bad. Incoming and outgoing dependencies. Different from code rank in that only direct dependencies are counted. Things that are depended on a lot should be stable and well tested (essentially the <a href=\"http:\/\/c2.com\/cgi\/wiki?StableDependenciesPrinciple\">Stable Dependencies Principle<\/a>).<\/p>\n<p>Qafoo Quality Analyzer can be used to find dependencies across layers when they are in different directories. Very limited at present.<\/p>\n<p>When finding highly complex code, don&#8217;t immediately assume it is bad. There are valid reasons for high complexity. Metrics can also be tricked.<\/p>\n<p><strong>The evolution of web application architecture<\/strong><\/p>\n<p>How systems interact with each other. Starting with simple architecture, looking at problems that arise as more visitors arrive, and then seeing how we can deal with those problems.<\/p>\n<p>Users -&gt; Single web app server -&gt; DB<\/p>\n<p>Next step: Multiple app servers + load balancers (round robin + session caching server)<\/p>\n<p>Launch of shopping system resulted in app going down, as master db got too many writes, due to logging &#8220;cache was hit&#8221; in it.<\/p>\n<p>Different ways of caching: entities, collections, full pages. Cache invalidation is hard, lots of dependencies even in simple domains.<\/p>\n<p>When too many writes: sharding (split data across multiple nodes), vertical (by columns) or horizontal (by rows). Loss of referential integrity checking.<\/p>\n<p>Complexity with relational database systems -&gt; NoSQL: sharding, multi master, cross-shard queries. Usually no SQL or referential integrity, though those features are already lost when using sharding.<\/p>\n<p>Combination of multiple persistence systems: problems with synchronization. Transactions are slow. Embrace eventual consistency. Same updating strategies can be used for caches.<\/p>\n<p>Business people often know SQL, yet not NoSQL query languages.<\/p>\n<p>Queues can be used to pass data asynchronously to multiple consumers. Following data flow of an action can be tricky. Data consistency is still a thing.<\/p>\n<p>Microservices: separation of concerns on service and team level. Can simplify via optimal tech stack per serve. Make things more complicated, need automated deployment, orchestration, eventual consistency, failure handling.<\/p>\n<p><a href=\"http:\/\/mcfunley.com\/choose-boring-technology\">Boring technology<\/a> often works best, especially at the beginning of a project. Start with the simplest solution that works. Hold team skills into account.<\/p>\n<p><strong>How to fuck up projects<\/strong><\/p>\n<p>Before the project<\/p>\n<ul>\n<li>Buzzword first design<\/li>\n<li>Mismatching expectations: huge customer expectations, no budget<\/li>\n<li>Fuzzy ambitious vocabulary, directly into the contract (including made up words)<\/li>\n<li>Meetings, bad mood, no eye contact<\/li>\n<li>No decisions (no decision making process -&gt; no managers -&gt; saves money)<\/li>\n<li>Customer Driven Development: customer makes decisions<\/li>\n<li>Decide on environment: tools, mouse\/touchpad, 1 big monitor or 2 small ones, JIRA, etc<\/li>\n<li>Estimates: should be done by management<\/li>\n<\/ul>\n<p>During the project<\/p>\n<ul>\n<li>Avoid ALL communication, especially with the customer<\/li>\n<li>If communication cannot be avoided: mix channels<\/li>\n<li>Responsibility: use group chats and use &#8220;you&#8221; instead of specific names (cc everyone in mails)<\/li>\n<li>Avoid issue trackers, this is what email and Facebook are for<\/li>\n<li>If you cannot avoid issue trackers: use multiple or have one ticket with 2000 notes<\/li>\n<li>Use ALL the programming languages, including PHP-COBOL<\/li>\n<li>Do YOUR job, but nothing more<\/li>\n<li>Only pressure makes diamonds: coding on the weekend<\/li>\n<li>No breaks so people don&#8217;t lose focus<\/li>\n<li>Collect metrics: Hours in office, LOC, emails answered, tickets closed<\/li>\n<\/ul>\n<p>Completing the project<\/p>\n<ul>\n<li>3\/4 projects fail: we can&#8217;t do anything about it<\/li>\n<li>New features? Outsource<\/li>\n<li>Ignore the client when they ask about the completed project<\/li>\n<li>Change the team often, fire people on a daily basis<\/li>\n<li>Rotate the customer&#8217;s contact person<\/li>\n<\/ul>\n<p>Bonus<\/p>\n<ul>\n<li>No VCS. FTP works. Live editing on production is even better<\/li>\n<li><a href=\"http:\/\/whatthecommit.com\/\">http:\/\/whatthecommit.com\/<\/a><\/li>\n<li>Encoding: emjois in function names, umlaut in file names. Mix encodings, also in MySQL<\/li>\n<li>Agile is just guidelines, change goals during sprints often<\/li>\n<li>Help others fuck up: release it as open source<\/li>\n<li>git <a href=\"https:\/\/github.com\/jayphelps\/git-blame-someone-else\">blame-someone-else<\/a><\/li>\n<\/ul>\n<p><strong>The future of PHP<\/strong><\/p>\n<p>This session started with some words from the moderator, who mainly talked about performance, portability and future adoption of, or moving away from, PHP.<\/p>\n<ul>\n<li>PHP now fast enough to use many PHP libraries<\/li>\n<li>PHP now better for long running tasks (though still no 64 bit for windows)<\/li>\n<li>PHP now has an Abstract Syntax Tree<\/li>\n<\/ul>\n<p>The discussion that followed after was primarily about the future of PHP in terms of adoption. The two languages most mentioned as competitors where Javascript and Java.<\/p>\n<p>Java because it is very hard to get PHP into big enterprise, where people tend to cling to Java. A point made several times about this is that such choices have very little to do with technical sensibility, and are instead influenced by the eduction system, languages already used, newness\/ hipness and the <a href=\"http:\/\/whatis.techtarget.com\/definition\/HiPPOs-highest-paid-persons-opinions\">HiPPO<\/a>. Most people also don&#8217;t have the relevant information to make an informed choice, and do not do the effort to look up this information as they already have a preference.<\/p>\n<p>Javascript is a competitor because web based projects, be it with a backend in PHP or in another language, need more and more Javascript, with no real alternatives. It was mentioned several times that not having alternatives it bad. Having multiple JS interpreters is cool, JS being the only choice for browser programming is not.<\/p>\n<p><strong>Introduction to sensible load testing<\/strong><\/p>\n<p>In this talk the speaker explained why it is important to do realistic load testing, and how to avoid common pitfalls. He explained how <a href=\"http:\/\/jmeter.apache.org\/\">jMeter<\/a> can be used to simulate real user behavior during peak load times. <a href=\"https:\/\/stuff.qafoo.com\/16_05_28_load_testing.pdf\">Preliminary slides link<\/a>.<\/p>\n<p><strong>Domain Objects: not just for Domain Driven Design<\/strong><\/p>\n<p>This session was hard to choose, as it coincided with &#8220;What to look for in a developer when hiring, and how to test it&#8221;, which I also wanted to attend.<\/p>\n<p>The <a href=\"https:\/\/en.wikipedia.org\/wiki\/Domain-driven_design\">Domain Objects<\/a> session introduced what <a href=\"https:\/\/en.wikipedia.org\/wiki\/Value_object\">Value Objects<\/a> are, and why they are better than long parameter lists and passing around values that might be invalid. While sensible enough, all very basic, with unfortunately no information for me whatsoever. I&#8217;m thinking it&#8217;d have been better to do this as a discussion, partly because the speaker was clearly very inexperienced, and gave most of the talk with his arms crossed in front of him. (Speaker, if you are reading this, please don&#8217;t be discouraged, practice makes perfect.)<\/p>\n<p><strong>Performance monitoring<\/strong><\/p>\n<p>I was\u00a0only in the second half of this session, during which two performance monitoring tools where presented. <a href=\"https:\/\/tideways.io\/\">Tideways<\/a> by <a href=\"https:\/\/qafoo.com\/\">Qafoo<\/a> and <a href=\"https:\/\/www.instana.com\/\">Instana<\/a>.<\/p>\n<p><strong>Some tweets<\/strong><\/p>\n<blockquote class=\"twitter-tweet\" data-lang=\"en\"><p>Watching the sunrise in Palma, great way to be coding in the morning. A big THANK YOU to the organisers <a href=\"https:\/\/twitter.com\/hashtag\/phpuceu?src=hash\">#phpuceu<\/a> ? <a href=\"https:\/\/t.co\/37tyHovtJS\">pic.twitter.com\/37tyHovtJS<\/a><\/p>\n<p>\u2014 Eddie Jaoude (@eddiejaoude) <a href=\"https:\/\/twitter.com\/eddiejaoude\/status\/737152604908703744\">May 30, 2016<\/a><\/p><\/blockquote>\n<p><script src=\"\/\/platform.twitter.com\/widgets.js\" async=\"\" charset=\"utf-8\"><\/script><\/p>\n<blockquote class=\"twitter-tweet\" data-lang=\"en\">\n<p dir=\"ltr\" lang=\"en\"><a href=\"https:\/\/twitter.com\/hashtag\/phpuceu?src=hash\">#phpuceu<\/a> family photo 2016 <a href=\"https:\/\/t.co\/9zlAsoGas8\">pic.twitter.com\/9zlAsoGas8<\/a><\/p>\n<p>\u2014 Eddie Jaoude (@eddiejaoude) <a href=\"https:\/\/twitter.com\/eddiejaoude\/status\/736930445661732864\">May 29, 2016<\/a><\/p><\/blockquote>\n<p><script src=\"\/\/platform.twitter.com\/widgets.js\" async=\"\" charset=\"utf-8\"><\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Last week I attended the 2016 edition of the PHP Unconference Europe, taking place in Palma De Mallorca. This post&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":[3,7],"tags":[27,328,425,363,85,423,424,195,197,365,257,418],"class_list":["post-1761","post","type-post","status-publish","format-standard","hentry","category-events","category-programming","tag-application-architecture","tag-clean-code","tag-code-analysis","tag-code-quality","tag-event","tag-metrics","tag-performance","tag-php","tag-planet-wikimedia","tag-software-craftsmanship","tag-testing","tag-unconference"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>PHP Unconference Europe 2016 - 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\/2016\/06\/01\/php-unconference-europe-2016\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"PHP Unconference Europe 2016 - Blog of Jeroen De Dauw\" \/>\n<meta property=\"og:description\" content=\"Last week I attended the 2016 edition of the PHP Unconference Europe, taking place in Palma De Mallorca. This post&hellip;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.entropywins.wtf\/blog\/2016\/06\/01\/php-unconference-europe-2016\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog of Jeroen De Dauw\" \/>\n<meta property=\"article:published_time\" content=\"2016-06-01T14:37:26+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2018-07-31T12:01:59+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=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2016\\\/06\\\/01\\\/php-unconference-europe-2016\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2016\\\/06\\\/01\\\/php-unconference-europe-2016\\\/\"},\"author\":{\"name\":\"Jeroen\",\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/#\\\/schema\\\/person\\\/4e2ef14f2ca7dc3a0ac137d1692b66b7\"},\"headline\":\"PHP Unconference Europe 2016\",\"datePublished\":\"2016-06-01T14:37:26+00:00\",\"dateModified\":\"2018-07-31T12:01:59+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2016\\\/06\\\/01\\\/php-unconference-europe-2016\\\/\"},\"wordCount\":1389,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/#\\\/schema\\\/person\\\/4e2ef14f2ca7dc3a0ac137d1692b66b7\"},\"keywords\":[\"Application architecture\",\"Clean Code\",\"Code analysis\",\"Code Quality\",\"Event\",\"Metrics\",\"Performance\",\"PHP\",\"Planet Wikimedia\",\"Software Craftsmanship\",\"Testing\",\"unconference\"],\"articleSection\":[\"Events\",\"Programming\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2016\\\/06\\\/01\\\/php-unconference-europe-2016\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2016\\\/06\\\/01\\\/php-unconference-europe-2016\\\/\",\"url\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2016\\\/06\\\/01\\\/php-unconference-europe-2016\\\/\",\"name\":\"PHP Unconference Europe 2016 - Blog of Jeroen De Dauw\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/#website\"},\"datePublished\":\"2016-06-01T14:37:26+00:00\",\"dateModified\":\"2018-07-31T12:01:59+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2016\\\/06\\\/01\\\/php-unconference-europe-2016\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2016\\\/06\\\/01\\\/php-unconference-europe-2016\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2016\\\/06\\\/01\\\/php-unconference-europe-2016\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PHP Unconference Europe 2016\"}]},{\"@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":"PHP Unconference Europe 2016 - 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\/2016\/06\/01\/php-unconference-europe-2016\/","og_locale":"en_US","og_type":"article","og_title":"PHP Unconference Europe 2016 - Blog of Jeroen De Dauw","og_description":"Last week I attended the 2016 edition of the PHP Unconference Europe, taking place in Palma De Mallorca. This post&hellip;","og_url":"https:\/\/www.entropywins.wtf\/blog\/2016\/06\/01\/php-unconference-europe-2016\/","og_site_name":"Blog of Jeroen De Dauw","article_published_time":"2016-06-01T14:37:26+00:00","article_modified_time":"2018-07-31T12:01:59+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":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.entropywins.wtf\/blog\/2016\/06\/01\/php-unconference-europe-2016\/#article","isPartOf":{"@id":"https:\/\/www.entropywins.wtf\/blog\/2016\/06\/01\/php-unconference-europe-2016\/"},"author":{"name":"Jeroen","@id":"https:\/\/www.entropywins.wtf\/blog\/#\/schema\/person\/4e2ef14f2ca7dc3a0ac137d1692b66b7"},"headline":"PHP Unconference Europe 2016","datePublished":"2016-06-01T14:37:26+00:00","dateModified":"2018-07-31T12:01:59+00:00","mainEntityOfPage":{"@id":"https:\/\/www.entropywins.wtf\/blog\/2016\/06\/01\/php-unconference-europe-2016\/"},"wordCount":1389,"commentCount":0,"publisher":{"@id":"https:\/\/www.entropywins.wtf\/blog\/#\/schema\/person\/4e2ef14f2ca7dc3a0ac137d1692b66b7"},"keywords":["Application architecture","Clean Code","Code analysis","Code Quality","Event","Metrics","Performance","PHP","Planet Wikimedia","Software Craftsmanship","Testing","unconference"],"articleSection":["Events","Programming"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.entropywins.wtf\/blog\/2016\/06\/01\/php-unconference-europe-2016\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.entropywins.wtf\/blog\/2016\/06\/01\/php-unconference-europe-2016\/","url":"https:\/\/www.entropywins.wtf\/blog\/2016\/06\/01\/php-unconference-europe-2016\/","name":"PHP Unconference Europe 2016 - Blog of Jeroen De Dauw","isPartOf":{"@id":"https:\/\/www.entropywins.wtf\/blog\/#website"},"datePublished":"2016-06-01T14:37:26+00:00","dateModified":"2018-07-31T12:01:59+00:00","breadcrumb":{"@id":"https:\/\/www.entropywins.wtf\/blog\/2016\/06\/01\/php-unconference-europe-2016\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.entropywins.wtf\/blog\/2016\/06\/01\/php-unconference-europe-2016\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.entropywins.wtf\/blog\/2016\/06\/01\/php-unconference-europe-2016\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.entropywins.wtf\/blog\/"},{"@type":"ListItem","position":2,"name":"PHP Unconference Europe 2016"}]},{"@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-sp","jetpack-related-posts":[{"id":1703,"url":"https:\/\/www.entropywins.wtf\/blog\/2016\/05\/24\/i-t-a-k-e-2016\/","url_meta":{"origin":1761,"position":0},"title":"I T.A.K.E. 2016","author":"Jeroen","date":"2016-05-24","format":false,"excerpt":"Last week I attended the I T.A.K.E. unconference in Bucharest. This unconference is about software development, and has tracks such as code quality, DevOps, craftsmanship, microservices and leadership. In this post I share my overall impressions as well as the notes I took during the uncoference. Conference impression This was\u2026","rel":"","context":"In &quot;Events&quot;","block_context":{"text":"Events","link":"https:\/\/www.entropywins.wtf\/blog\/category\/events\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2016\/05\/you_down_wit_OPC-yeah_you_know_me.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2016\/05\/you_down_wit_OPC-yeah_you_know_me.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2016\/05\/you_down_wit_OPC-yeah_you_know_me.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2016\/05\/you_down_wit_OPC-yeah_you_know_me.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":1436,"url":"https:\/\/www.entropywins.wtf\/blog\/2015\/06\/08\/socrates-uk-2015\/","url_meta":{"origin":1761,"position":1},"title":"SoCraTes UK 2015","author":"Jeroen","date":"2015-06-08","format":false,"excerpt":"Last week I attended SoCraTes UK 2015, the UK edition of the International Software Craftsmanship and Testing Gathering. This blog post gives a short introduction to the conference, and holds a readable version of my notes from various sessions. What is SoCraTes SoCraTes is an unconference for open-minded software people\u2026","rel":"","context":"In &quot;Events&quot;","block_context":{"text":"Events","link":"https:\/\/www.entropywins.wtf\/blog\/category\/events\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2015\/06\/socrates-uk-reflections.jpeg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2015\/06\/socrates-uk-reflections.jpeg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2015\/06\/socrates-uk-reflections.jpeg?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2015\/06\/socrates-uk-reflections.jpeg?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":2101,"url":"https:\/\/www.entropywins.wtf\/blog\/2018\/01\/20\/php-project-template\/","url_meta":{"origin":1761,"position":2},"title":"PHP project template","author":"Jeroen","date":"2018-01-20","format":false,"excerpt":"Want to start a new PHP project? Perhaps yet another library you are creating? Tired of doing the same lame groundwork for the 5th time this month? Want to start a code kata and not lose time on generic setup work? I got just the project for you! Edit: there\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\/2018\/01\/php.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2018\/01\/php.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2018\/01\/php.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2018\/01\/php.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2018\/01\/php.png?resize=1050%2C600&ssl=1 3x"},"classes":[]},{"id":1303,"url":"https:\/\/www.entropywins.wtf\/blog\/2014\/04\/10\/diff-1-0-released\/","url_meta":{"origin":1761,"position":3},"title":"Diff 1.0 released!","author":"Jeroen","date":"2014-04-10","format":false,"excerpt":"I'm very happy to announce the 1.0 release of the PHP Diff library. Diff is a small PHP library for representing differences between data structures, computing such differences, and applying them as a patch. For more details see the usage instructions. I created this library as part of the Wikibase\u2026","rel":"","context":"In &quot;Software&quot;","block_context":{"text":"Software","link":"https:\/\/www.entropywins.wtf\/blog\/category\/software\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":2381,"url":"https:\/\/www.entropywins.wtf\/blog\/2018\/10\/28\/php-typed-properties\/","url_meta":{"origin":1761,"position":4},"title":"PHP Typed Properties","author":"Jeroen","date":"2018-10-28","format":false,"excerpt":"Lately there has been a lot of hype around the typed properties that PHP 7.4 will bring. In this post I outline why typed properties are not as big of a game changer as some people seem to think and how they can lead to shitty code. I start by\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\/2018\/10\/php-1.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2018\/10\/php-1.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2018\/10\/php-1.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2018\/10\/php-1.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2018\/10\/php-1.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2018\/10\/php-1.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":2848,"url":"https:\/\/www.entropywins.wtf\/blog\/2022\/01\/30\/value-objects-with-php-8-1\/","url_meta":{"origin":1761,"position":5},"title":"Value Objects with PHP 8.1","author":"Jeroen","date":"2022-01-30","format":false,"excerpt":"PHP has introduced a number of new features that allow you to write awesome Value Objects with PHP 8.1. In this post you will learn about each feature and how to put them all together. Back in the dark ages of 2016, shortly after PHP 7.0 was released, I wrote\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\/02\/i-will-always-favor-value-objects.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2016\/02\/i-will-always-favor-value-objects.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2016\/02\/i-will-always-favor-value-objects.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\/1761","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=1761"}],"version-history":[{"count":17,"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/posts\/1761\/revisions"}],"predecessor-version":[{"id":2259,"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/posts\/1761\/revisions\/2259"}],"wp:attachment":[{"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/media?parent=1761"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/categories?post=1761"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/tags?post=1761"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}