{"id":891,"date":"2019-01-14T21:53:41","date_gmt":"2019-01-14T20:53:41","guid":{"rendered":"https:\/\/craft-coders.de\/3bpizkrx8k\/?p=891"},"modified":"2024-08-14T15:29:10","modified_gmt":"2024-08-14T13:29:10","slug":"clean-code-the-hard-facts-and-figures","status":"publish","type":"post","link":"https:\/\/craft-coders.de\/3bpizkrx8k\/clean-code-the-hard-facts-and-figures\/","title":{"rendered":"Clean Code: The hard facts and figures"},"content":{"rendered":"\r\n<p class=\"wp-block-paragraph\">A couple of weeks ago I began to read Uncle Bob&#8217;s old developer bible: Clean Code. I was excited about the presented concepts and put a lot of thought into applying them into code. One day I was lying on the couch of our office, reading <em>Chapter 2: Meaningful Names.<\/em> Meanwhile, I overheard our team discussing the best troll name for a new database. Another day, I was reading the next chapter. <em>Chapter 3: Functions should be small and do one thing only.<\/em> Back at my desk, I found myself scrolling through functions with hundreds of lines of code.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Although most teams I know try to produce clean code, it seems to be a hard thing to keep a project clean while it grows. I began to wonder: How much clean code is really out there in the wild? Followed by: How can a project even be considered as clean? So I picked some famous open source projects and analyzed them!<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">What makes a project clean?<\/h2>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">First, let&#8217;s summarize what I did: My first intent was to check a static code analysis tool like SonarQube, but I could hardly find an open-source project which also published the results of such tooling. This is when <a href=\"https:\/\/github.com\/djuelg\/Metrilyzer\">Metrilyzer<\/a> was born. An analysis tool of mine (<a href=\"https:\/\/craft-coders.de\/3bpizkrx8k\/explore-the-unexplored-tech-world\/\">private projects again<\/a>^^) which can read almost every Java-based project to do some data analysis on it. At first, I focused on the following metrics:<\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li>Classes per package<\/li>\r\n<li>Lines per class<\/li>\r\n<li>Methods per class<\/li>\r\n<li>Lines per method<\/li>\r\n<li>Parameter per method<\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Of course, they are not enough to consider a project as &#8220;cleanly coded&#8221; but in my opinion they give a good indication on code modularity and compliance with single responsibility principle. This is one of the hardest things to accomplish from my point of view. So using these metrics you can at least see clearly when a project is not clean coded. \ud83d\ude09 Here are the results.<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Cassandra, ElasticSearch, Spring Boot &#8211; The hard figures<\/h2>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image\"><img decoding=\"async\" class=\"wp-image-912\" src=\"https:\/\/craft-coders.de\/3bpizkrx8k\/wp-content\/uploads\/2019\/01\/lpc-1.png\" alt=\"\" \/><\/figure>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">The four tested projects are <a href=\"https:\/\/github.com\/apache\/cassandra\/tree\/cassandra-3.11\">Cassandra 3.11<\/a>, <a href=\"https:\/\/github.com\/elastic\/elasticsearch\/tree\/6.5\">ElasticSearch 6.5<\/a>, <a href=\"https:\/\/github.com\/spring-projects\/spring-boot\/tree\/2.1.x\">Spring Boot 2.1<\/a> and <a class=\"\" href=\"https:\/\/github.com\/djuelg\/Neuronizer\">Neuronizer Notes<\/a> (an Android app of mine). In the boxplots you can see the number of <strong>lines per class<\/strong> (y-axis) per project (x-axis). N is the number of classes in the project (which could be analyzed by Metrilyzer). The maximum values are somehow obscured so that the rest of the plot looks better, but you can still read them in the table. If you don&#8217;t know how boxplots work look here: <a href=\"https:\/\/www.dummies.com\/education\/math\/statistics\/what-a-boxplot-can-tell-you-about-a-statistical-data-set\/\">What a Boxplot Can Tell You about a Statistical Data Set<\/a><\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">You can see that most of the classes are very small and more than 75% of all classes are smaller than 100 lines of code. Despite every project having a couple of huge classes. It seems like the bigger the project, the longer the longest class is. Not very surprising, but things get more interesting when you compare different metrics. Let&#8217;s take a look at <strong>lines per method<\/strong> for example:<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image\"><img decoding=\"async\" class=\"wp-image-913\" src=\"https:\/\/craft-coders.de\/3bpizkrx8k\/wp-content\/uploads\/2019\/01\/mpc.png\" alt=\"\" \/><\/figure>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Like the classes, most of the methods are very small and more than 75% are smaller than 15 lines per method. Despite a large number of methods Spring Boot does a very good job at keeping them small. With a maximum of 54 lines per method. Also interesting is the correlation between N in the two metrics (which is the <strong>average number of methods per class<\/strong>):<\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li>Cassandra: 19393 methods in 4162 classes = 4,65 methods per class<\/li>\r\n<li>Elastic Search: 36027 methods in 8021 classes = 4,51 methods per class<\/li>\r\n<li>Spring Boot: 14140 methods in 5963 classes = 2,37 methods per class<\/li>\r\n<li>Neuronizer Notes: 571 methods in 173 classes = 3,30 methods per class<\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">I have to mention that getter and setter methods are excluded so in reality, the numbers are slightly higher (see metrics at the end). Neuronizer which is a small application has an easy time at keeping classes and methods small. As you can see Cassandra and Elastic Search do have a harder time. But Spring Boot is doing very well in comparison to the others. They have even smaller methods than my little android app. Okay, now let&#8217;s take a look at the most problematic classes.<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Pinning down problems<\/h2>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">What you can see here are the five most biggest classes for each project.<\/p>\r\n\r\n\r\n\r\n<table class=\"wp-block-table\">\r\n<tbody>\r\n<tr>\r\n<td>\u00a0<\/td>\r\n<td><strong>Lines per class<\/strong><\/td>\r\n<\/tr>\r\n<tr>\r\n<td><strong>Cassandra<\/strong><\/td>\r\n<td>org.apache.cassandra.service.StorageService: \u00a0\u00a0\u00a0\u00a04300<br \/>org.apache.cassandra.cql3.validation.operations.SelectTest: \u00a0\u00a0\u00a0\u00a02427<br \/>org.apache.cassandra.service.StorageProxy: \u00a0\u00a0\u00a0\u00a02244<br \/>org.apache.cassandra.db.LegacyLayout: \u00a0\u00a0\u00a0\u00a02160<br \/>org.apache.cassandra.db.ColumnFamilyStore: \u00a0\u00a0\u00a0\u00a02136<\/td>\r\n<\/tr>\r\n<tr>\r\n<td><strong>Elastic Search<\/strong><\/td>\r\n<td>org.elasticsearch.index.engine.InternalEngineTests: \u00a0\u00a0\u00a0\u00a04653<br \/>org.elasticsearch.index.translog.TranslogTests: \u00a0\u00a0\u00a0\u00a02804<br \/>org.elasticsearch.index.shard.IndexShardTests: \u00a0\u00a0\u00a0\u00a02652<br \/>org.elasticsearch.index.engine.InternalEngine: \u00a0\u00a0\u00a0\u00a02631<br \/>org.elasticsearch.index.shard.IndexShard: \u00a0\u00a0\u00a0\u00a02566<\/td>\r\n<\/tr>\r\n<tr>\r\n<td><strong>Spring Boot<\/strong><\/td>\r\n<td>org.springframework.boot.context.properties.ConfigurationPropertiesTests: \u00a0\u00a0\u00a0\u00a01509<br \/>org.springframework.boot.test.json.JsonContentAssert: \u00a0\u00a0\u00a0\u00a01277<br \/>org.springframework.boot.SpringApplicationTests: \u00a0\u00a0\u00a0\u00a01269<br \/>org.springframework.boot.SpringApplication: \u00a0\u00a0\u00a0\u00a01267<br \/>org.springframework.boot.test.web.client.TestRestTemplate: \u00a0\u00a0\u00a0\u00a01234<\/td>\r\n<\/tr>\r\n<tr>\r\n<td><strong>Neuronizer<\/strong><\/td>\r\n<td>de.djuelg.neuronizer.presentation.ui.fragments.TodoListFragment: \u00a0\u00a0\u00a0\u00a0458<br \/>de.djuelg.neuronizer.presentation.ui.fragments.PreviewFragment: \u00a0\u00a0\u00a0\u00a0285<br \/>de.djuelg.neuronizer.presentation.ui.fragments.ItemFragment: \u00a0\u00a0\u00a0\u00a0251<br \/>de.djuelg.neuronizer.storage.TodoListRepositoryImpl: \u00a0\u00a0\u00a0\u00a0248<br \/>de.djuelg.neuronizer.storage.TodoListRepositoryImplTest: \u00a0\u00a0\u00a0\u00a0214<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">What I recognized at first were the test classes. Since the teams out there (at least those I have been part of) care less about test code quality vs. productive code quality it makes sense they can get very long. You can also see that long classes lead to long test classes. Elastics <em>InternalEngine <\/em>and <em>InternalEngineTests <\/em>for example. As test classes grow it gets harder and harder to keep them maintainable, so a well thought-out model for test classes should be applied. Regarding large test classes, I can recommend the article <a href=\"https:\/\/www.petrikainulainen.net\/programming\/testing\/writing-clean-tests-small-is-beautiful\/\">Writing Clean Tests \u2013 Small Is Beautiful.<\/a><\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Another important thing you can learn from this table is where the application has not been modeled carefully. Cassandras <em>StorageService<\/em>, for example, has a very generic name and became the biggest god class in the project. Elastics <em>Engine<\/em> and <em>InternalEngine<\/em> had a similar destiny. These classes could easily be separated in a couple of subclasses, but as they are now they just cannot be clean.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">For the interested guys out there, here are the other metrics in an uncommented form. They will be mentioned in the Conclusion though. All visualizations have been done using <a href=\"https:\/\/goodcalculators.com\/\">goodcalculators.com.<\/a><\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-gallery columns-3 is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\">\r\n<li class=\"blocks-gallery-item\">\r\n<figure><img decoding=\"async\" class=\"wp-image-916\" src=\"https:\/\/craft-coders.de\/3bpizkrx8k\/wp-content\/uploads\/2019\/01\/cpp.png\" alt=\"\" data-id=\"916\" data-link=\"https:\/\/craft-coders.de\/3bpizkrx8k\/?attachment_id=916\" \/>\r\n<figcaption>Classes per package<\/figcaption>\r\n<\/figure>\r\n<\/li>\r\n<li class=\"blocks-gallery-item\">\r\n<figure><img decoding=\"async\" class=\"wp-image-917\" src=\"https:\/\/craft-coders.de\/3bpizkrx8k\/wp-content\/uploads\/2019\/01\/mpc-1.png\" alt=\"\" data-id=\"917\" data-link=\"https:\/\/craft-coders.de\/3bpizkrx8k\/?attachment_id=917\" \/>\r\n<figcaption>Methods per class<\/figcaption>\r\n<\/figure>\r\n<\/li>\r\n<li class=\"blocks-gallery-item\">\r\n<figure><img decoding=\"async\" class=\"wp-image-922\" src=\"https:\/\/craft-coders.de\/3bpizkrx8k\/wp-content\/uploads\/2019\/01\/ppm-1.png\" alt=\"\" data-id=\"922\" data-link=\"https:\/\/craft-coders.de\/3bpizkrx8k\/?attachment_id=922\" \/>\r\n<figcaption>Parameter per method<\/figcaption>\r\n<\/figure>\r\n<\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Probably, you already thought in the beginning: You can&#8217;t put hard figures on the rules of Clean Code like &#8220;Oh boy, this class here is 5 lines too long! Are you dumb?&#8221; But you can use these metrics as an orientation. You can aim for the Pareto principle. For example: Refactor the highest 20% of each metric. Try to be in the lower 80% with all your new code. When you reach 100 lines of code in a class, for example, there could be better ways to modularize that piece of code. Here are the 80% boundaries for each metric (based on all analyzed projects):<\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li>80% of all classes are smaller than 100 lines<\/li>\r\n<li>80% of all methods are smaller than 12 lines<\/li>\r\n<li>80% of all packages have less than 25 classes<\/li>\r\n<li>80% of all classes have less than 8 methods<\/li>\r\n<li>80% of all methods have less than 3 parameter<\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Despite this being a rather shallow analysis on the topic of clean code, the results were quite interesting. Using Metrilyzer on a single project with tailored visualizations can be even more helpful to improve modularity and to locate trouble spots. Maybe you want to give it a try to analyze your own projects. If so, I would be glad to hear from you \ud83d\ude42<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\"><strong>Greets, Domi<\/strong><\/p>\r\n","protected":false},"excerpt":{"rendered":"<p>A couple of weeks ago I began to read Uncle Bob&#8217;s old developer bible: Clean Code. I was excited about the presented concepts and put a lot of thought into applying them into code. One day I was lying on the couch of our office, reading Chapter 2: Meaningful Names. Meanwhile, I overheard our team discussing the best troll name &#8230; <a href=\"https:\/\/craft-coders.de\/3bpizkrx8k\/clean-code-the-hard-facts-and-figures\/\" class=\"more-link\">Read More<\/a><\/p>\n","protected":false},"author":2,"featured_media":2404,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[183,111,108],"tags":[],"class_list":["post-891","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-clean-code","category-field-report","category-java"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.7 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Clean Code: The hard facts and figures - CraftCoders.app<\/title>\n<meta name=\"description\" content=\"How much clean code is really out there in the wild? I picked some famous open source projects (Cassandra, ElasticSearch, Spring Boot) and analyzed them!\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/craft-coders.de\/3bpizkrx8k\/clean-code-the-hard-facts-and-figures\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Clean Code: The hard facts and figures - CraftCoders.app\" \/>\n<meta property=\"og:description\" content=\"How much clean code is really out there in the wild? I picked some famous open source projects (Cassandra, ElasticSearch, Spring Boot) and analyzed them!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/craft-coders.de\/3bpizkrx8k\/clean-code-the-hard-facts-and-figures\/\" \/>\n<meta property=\"og:site_name\" content=\"CraftCoders.app\" \/>\n<meta property=\"article:published_time\" content=\"2019-01-14T20:53:41+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-08-14T13:29:10+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/craft-coders.de\/3bpizkrx8k\/wp-content\/uploads\/2019\/01\/ferfr-850x708-3.png\" \/>\n\t<meta property=\"og:image:width\" content=\"850\" \/>\n\t<meta property=\"og:image:height\" content=\"708\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Sebastian Gellweiler\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Sebastian Gellweiler\" \/>\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\":\"WebPage\",\"@id\":\"https:\/\/craft-coders.de\/3bpizkrx8k\/clean-code-the-hard-facts-and-figures\/\",\"url\":\"https:\/\/craft-coders.de\/3bpizkrx8k\/clean-code-the-hard-facts-and-figures\/\",\"name\":\"Clean Code: The hard facts and figures - CraftCoders.app\",\"isPartOf\":{\"@id\":\"https:\/\/craft-coders.de\/3bpizkrx8k\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/craft-coders.de\/3bpizkrx8k\/clean-code-the-hard-facts-and-figures\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/craft-coders.de\/3bpizkrx8k\/clean-code-the-hard-facts-and-figures\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/craft-coders.de\/3bpizkrx8k\/wp-content\/uploads\/2019\/01\/ferfr-850x708-3.png\",\"datePublished\":\"2019-01-14T20:53:41+00:00\",\"dateModified\":\"2024-08-14T13:29:10+00:00\",\"author\":{\"@id\":\"https:\/\/craft-coders.de\/3bpizkrx8k\/#\/schema\/person\/6f9796e91040e01b1bee774c6579bf63\"},\"description\":\"How much clean code is really out there in the wild? I picked some famous open source projects (Cassandra, ElasticSearch, Spring Boot) and analyzed them!\",\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/craft-coders.de\/3bpizkrx8k\/clean-code-the-hard-facts-and-figures\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/craft-coders.de\/3bpizkrx8k\/clean-code-the-hard-facts-and-figures\/#primaryimage\",\"url\":\"https:\/\/craft-coders.de\/3bpizkrx8k\/wp-content\/uploads\/2019\/01\/ferfr-850x708-3.png\",\"contentUrl\":\"https:\/\/craft-coders.de\/3bpizkrx8k\/wp-content\/uploads\/2019\/01\/ferfr-850x708-3.png\",\"width\":850,\"height\":708},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/craft-coders.de\/3bpizkrx8k\/#website\",\"url\":\"https:\/\/craft-coders.de\/3bpizkrx8k\/\",\"name\":\"CraftCoders.app\",\"description\":\"Jira and Confluence apps\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/craft-coders.de\/3bpizkrx8k\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/craft-coders.de\/3bpizkrx8k\/#\/schema\/person\/6f9796e91040e01b1bee774c6579bf63\",\"name\":\"Sebastian Gellweiler\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/craft-coders.de\/3bpizkrx8k\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/94c3cc018b377696074027b4b55c298ce53ca6262a9389fefa3ea460909c71fe?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/94c3cc018b377696074027b4b55c298ce53ca6262a9389fefa3ea460909c71fe?s=96&d=mm&r=g\",\"caption\":\"Sebastian Gellweiler\"},\"url\":\"https:\/\/craft-coders.de\/3bpizkrx8k\/author\/tom\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Clean Code: The hard facts and figures - CraftCoders.app","description":"How much clean code is really out there in the wild? I picked some famous open source projects (Cassandra, ElasticSearch, Spring Boot) and analyzed them!","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:\/\/craft-coders.de\/3bpizkrx8k\/clean-code-the-hard-facts-and-figures\/","og_locale":"en_US","og_type":"article","og_title":"Clean Code: The hard facts and figures - CraftCoders.app","og_description":"How much clean code is really out there in the wild? I picked some famous open source projects (Cassandra, ElasticSearch, Spring Boot) and analyzed them!","og_url":"https:\/\/craft-coders.de\/3bpizkrx8k\/clean-code-the-hard-facts-and-figures\/","og_site_name":"CraftCoders.app","article_published_time":"2019-01-14T20:53:41+00:00","article_modified_time":"2024-08-14T13:29:10+00:00","og_image":[{"width":850,"height":708,"url":"https:\/\/craft-coders.de\/3bpizkrx8k\/wp-content\/uploads\/2019\/01\/ferfr-850x708-3.png","type":"image\/png"}],"author":"Sebastian Gellweiler","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Sebastian Gellweiler","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/craft-coders.de\/3bpizkrx8k\/clean-code-the-hard-facts-and-figures\/","url":"https:\/\/craft-coders.de\/3bpizkrx8k\/clean-code-the-hard-facts-and-figures\/","name":"Clean Code: The hard facts and figures - CraftCoders.app","isPartOf":{"@id":"https:\/\/craft-coders.de\/3bpizkrx8k\/#website"},"primaryImageOfPage":{"@id":"https:\/\/craft-coders.de\/3bpizkrx8k\/clean-code-the-hard-facts-and-figures\/#primaryimage"},"image":{"@id":"https:\/\/craft-coders.de\/3bpizkrx8k\/clean-code-the-hard-facts-and-figures\/#primaryimage"},"thumbnailUrl":"https:\/\/craft-coders.de\/3bpizkrx8k\/wp-content\/uploads\/2019\/01\/ferfr-850x708-3.png","datePublished":"2019-01-14T20:53:41+00:00","dateModified":"2024-08-14T13:29:10+00:00","author":{"@id":"https:\/\/craft-coders.de\/3bpizkrx8k\/#\/schema\/person\/6f9796e91040e01b1bee774c6579bf63"},"description":"How much clean code is really out there in the wild? I picked some famous open source projects (Cassandra, ElasticSearch, Spring Boot) and analyzed them!","inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/craft-coders.de\/3bpizkrx8k\/clean-code-the-hard-facts-and-figures\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/craft-coders.de\/3bpizkrx8k\/clean-code-the-hard-facts-and-figures\/#primaryimage","url":"https:\/\/craft-coders.de\/3bpizkrx8k\/wp-content\/uploads\/2019\/01\/ferfr-850x708-3.png","contentUrl":"https:\/\/craft-coders.de\/3bpizkrx8k\/wp-content\/uploads\/2019\/01\/ferfr-850x708-3.png","width":850,"height":708},{"@type":"WebSite","@id":"https:\/\/craft-coders.de\/3bpizkrx8k\/#website","url":"https:\/\/craft-coders.de\/3bpizkrx8k\/","name":"CraftCoders.app","description":"Jira and Confluence apps","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/craft-coders.de\/3bpizkrx8k\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/craft-coders.de\/3bpizkrx8k\/#\/schema\/person\/6f9796e91040e01b1bee774c6579bf63","name":"Sebastian Gellweiler","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/craft-coders.de\/3bpizkrx8k\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/94c3cc018b377696074027b4b55c298ce53ca6262a9389fefa3ea460909c71fe?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/94c3cc018b377696074027b4b55c298ce53ca6262a9389fefa3ea460909c71fe?s=96&d=mm&r=g","caption":"Sebastian Gellweiler"},"url":"https:\/\/craft-coders.de\/3bpizkrx8k\/author\/tom\/"}]}},"_links":{"self":[{"href":"https:\/\/craft-coders.de\/3bpizkrx8k\/wp-json\/wp\/v2\/posts\/891","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/craft-coders.de\/3bpizkrx8k\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/craft-coders.de\/3bpizkrx8k\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/craft-coders.de\/3bpizkrx8k\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/craft-coders.de\/3bpizkrx8k\/wp-json\/wp\/v2\/comments?post=891"}],"version-history":[{"count":8,"href":"https:\/\/craft-coders.de\/3bpizkrx8k\/wp-json\/wp\/v2\/posts\/891\/revisions"}],"predecessor-version":[{"id":2411,"href":"https:\/\/craft-coders.de\/3bpizkrx8k\/wp-json\/wp\/v2\/posts\/891\/revisions\/2411"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/craft-coders.de\/3bpizkrx8k\/wp-json\/wp\/v2\/media\/2404"}],"wp:attachment":[{"href":"https:\/\/craft-coders.de\/3bpizkrx8k\/wp-json\/wp\/v2\/media?parent=891"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/craft-coders.de\/3bpizkrx8k\/wp-json\/wp\/v2\/categories?post=891"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/craft-coders.de\/3bpizkrx8k\/wp-json\/wp\/v2\/tags?post=891"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}