{"id":2877,"date":"2022-09-21T18:33:39","date_gmt":"2022-09-21T17:33:39","guid":{"rendered":"https:\/\/www.entropywins.wtf\/blog\/?p=2877"},"modified":"2022-12-20T15:30:38","modified_gmt":"2022-12-20T14:30:38","slug":"advice-for-junior-developers","status":"publish","type":"post","link":"https:\/\/www.entropywins.wtf\/blog\/2022\/09\/21\/advice-for-junior-developers\/","title":{"rendered":"Advice for junior developers"},"content":{"rendered":"<p>Over the 15+ years of my development career, I have learned several things that significantly increase my effectiveness. In this post, I share those learnings with you.<\/p>\n<p>Structure:<\/p>\n<ul>\n<li><strong>Generic Advice<\/strong> &#8212; Important context and motivation for the technical advice<\/li>\n<li><strong>Technical Advice<\/strong> &#8212; The main course<\/li>\n<li><strong>Recommended Reading<\/strong> &#8212; Links to high-quality books and blogs that are great for getting started<\/li>\n<\/ul>\n<p>This blog post mentions and links valuable concepts that you can explore further as you see fit.<\/p>\n<h2>Generic Advice for Juniors<\/h2>\n<h3>1. Code is not the Point<\/h3>\n<p>As developers, we like writing code. Most of us want to be given a nice unambiguous task. A fun technical puzzle to solve without paying attention to the rest of the world.<\/p>\n<p>Put reasonable effort into making sure that you are solving the right problem. To quote Peter Drucker: <a href=\"https:\/\/medium.com\/swlh\/there-is-nothing-so-useless-as-doing-efficiently-something-that-should-not-have-been-done-at-all-8c5d2282319d\">There is nothing so useless as doing efficiently that which should not be done at all<\/a>. Gather feedback early and often, typically by continuous delivery to real users. <a href=\"https:\/\/agilemanifesto.org\/\">Be<\/a> <a href=\"https:\/\/agilemanifesto.org\/principles.html\">Agile<\/a>.<\/p>\n<p>Software development is expensive, with the vast majority of the effort of real-world projects typically going into maintenance. Combine this with the goal being user\/business outcomes, <a href=\"https:\/\/blog.codinghorror.com\/the-best-code-is-no-code-at-all\/\">the best code is often no code<\/a>. To quote Bill Gates: &#8220;Measuring programming progress by lines of code is like measuring aircraft building progress by weight.&#8221;<\/p>\n<p>See also: <a href=\"https:\/\/en.wikipedia.org\/wiki\/You_aren%27t_gonna_need_it\">YAGNI<\/a>, <a href=\"https:\/\/en.wikipedia.org\/wiki\/KISS_principle\">KISS<\/a>, <a href=\"https:\/\/blog.codinghorror.com\/the-last-responsible-moment\/\">The Last Responsible Moment<\/a>.<\/p>\n<h3>2. Software Design Matters<\/h3>\n<p>During the first 5 years of my development career, I thought that software design is for software architects or other people with special roles. I was focused on &#8220;getting things done&#8221;, and saw software design and practices such as writing tests, as a distraction at best. My code worked, and I was getting a lot of things done. Or so I thought.<\/p>\n<p>Then I read <a href=\"https:\/\/www.goodreads.com\/book\/show\/3735293-clean-code\">Clean Code<\/a>, by <a href=\"https:\/\/cleancoders.com\/\">Robert C. Martin<\/a>. This book motivates caring about software design and contains examples and many technical heuristics. The central takeaway of the book is: &#8220;<strong>The only way to go fast is to go well<\/strong>&#8220;. In other words, <a href=\"https:\/\/martinfowler.com\/articles\/is-quality-worth-cost.html\">if you make a mess, it will slow you down<\/a>. See also: <a href=\"https:\/\/martinfowler.com\/bliki\/TradableQualityHypothesis.html\">TradableQualityHypothesis<\/a>, <a href=\"https:\/\/martinfowler.com\/bliki\/DesignStaminaHypothesis.html\">DesignStaminaHypothesis<\/a><\/p>\n<p>Learning how to write well-designed clean code of course takes time and effort. And when you start, you will be slower and make mistakes. <a href=\"https:\/\/www.entropywins.wtf\/blog\/2017\/01\/02\/simple-is-not-easy\/\">Simple is not Easy<\/a>.<\/p>\n<h3>3. Use the BEST Practices<\/h3>\n<p>Writing tests tends to be beneficial. There are exceptions, but most of the time, it makes a lot of sense to write automated tests. Writing tests is an example of a best practice.<\/p>\n<p>If you are new to writing tests, just follow the best practice and write tests for everything. <strong>When starting, blindly following the best practice will be better than following your own underdeveloped judgment<\/strong>. Over time you will learn how to write tests effectively, and be able to tell the difference between you have messed up, and situations where writing a test is not worth it. You will also start to understand the value tests bring on a more visceral level, by having experienced the decrease in debugging sessions and the worry-free refactoring enabled by your tests. <strong>After developing your judgment, you will be able to transcend the best practice<\/strong>.<\/p>\n<p>This advice applies to best practices in any area that you are a junior in. Automated tests are just an example.<\/p>\n<p>One big gotcha is that it is not easy to tell the difference between a sensible best practice and something nonsensical or even counterproductive. This is made more complicated by most existing code being a mess, and by most developers, including &#8220;experienced&#8221; and &#8220;senior&#8221; ones, not knowing software design basics. This makes having a good mentor extremely valuable. Barring that, one piece of advice based on my own experiences is to be wary of best practices specific to the community of your language or framework. Look for evergreen advice that has been around for decades.<\/p>\n<h2>Technical Advice for Juniors<\/h2>\n<p>Our focus will be on technical topics. Many other areas are essential, such as health, happiness, career, and soft skills. Knowing how to avoid a technical pitfall won&#8217;t help you if you are sleep deprived and working on the wrong problem for a toxic boss that underpays you.<\/p>\n<h3>4. Write Tests<\/h3>\n<p>Write automated tests. Perhaps write tests before the code, such as via <a href=\"https:\/\/en.wikipedia.org\/wiki\/Test-driven_development\">Test Driven Development<\/a> (TDD). This makes it easy to verify your code is correct in a repeatable manner, thus saving you from much manual retresting and from debugging sessions.<\/p>\n<blockquote><p>You think test-first is difficult? Try debug-after.<\/p><\/blockquote>\n<p>Perhaps even more importantly, tests give you the safety net to refactor your code. And continuous refactoring is needed to keep your code clean. Without a reliable test suite, it is all the more likely that your code will rot.<\/p>\n<p>Writing tests is difficult if the design of your code is poor, such as when using inheritance for code reuse, or when using static functions. If on the other hand, you have <a href=\"https:\/\/en.wikipedia.org\/wiki\/SOLID\">SOLID<\/a> classes, with no global dependencies, then writing nice tests is not so difficult.<\/p>\n<p>Test design matters because poorly written tests will slow you down. Avoid binding your tests to implementation details of the code under test or to the structure of the system. Avoid overusing Mocks and <a href=\"https:\/\/www.entropywins.wtf\/blog\/2016\/05\/13\/5-ways-to-write-better-mocks\/\">write better Test Doubles<\/a>.<\/p>\n<h3>5. Do Not Use Inheritance For Code Reuse<\/h3>\n<p>This is one of those best practices that bring to mind the &#8220;Use the Best Practices&#8221; section. My advice: do not use inheritance for code reuse at all when you are starting out. It is rarely the right call and can do a lot of harm. <a href=\"https:\/\/en.wikipedia.org\/wiki\/Composition_over_inheritance\">Favor composition over inheritance<\/a>.<\/p>\n<h3>6. Write Object-Oriented code<\/h3>\n<p>Write <a href=\"https:\/\/en.wikipedia.org\/wiki\/SOLID\">SOLID<\/a> code that is not <a href=\"https:\/\/williamdurand.fr\/2013\/07\/30\/from-stupid-to-solid-code\/\">STUPID<\/a>. There is so much value in understanding these principles and anti-patterns.<\/p>\n<p>Actually create objects. Classes with only static methods are not OO. Try to avoid using static code altogether.<\/p>\n<p>See also: <a href=\"https:\/\/www.entropywins.wtf\/blog\/2017\/02\/17\/why-every-single-argument-of-dan-north-is-wrong\/\">my defense of SOLID<\/a>.<\/p>\n<h3>7. Write Functional Code<\/h3>\n<p>(<a href=\"https:\/\/en.wikipedia.org\/wiki\/Functional_programming\">Functional programming<\/a> is not to be confused with <a href=\"https:\/\/en.wikipedia.org\/wiki\/Imperative_programming\">imperative<\/a> <a href=\"https:\/\/en.wikipedia.org\/wiki\/Structured_programming\">structural programming<\/a>.)<\/p>\n<p>This point is not about entriely switching to a functional language. You can benefit from using a functional style in your OO language. <a href=\"https:\/\/www.entropywins.wtf\/blog\/2018\/10\/24\/readable-functions-minimize-state\/\">Minimize state<\/a>, especially mutable state, and <a href=\"https:\/\/www.entropywins.wtf\/blog\/2018\/10\/30\/readable-functions-do-one-thing\/\">do one thing in your functions<\/a>. See also: <a href=\"https:\/\/www.destroyallsoftware.com\/screencasts\/catalog\/functional-core-imperative-shell\">functional core, imperative shell<\/a>.<\/p>\n<h3>8. Use Informed Duplication<\/h3>\n<p>Copy-pasting big chunks of code to multiple places is almost always unwise. Any self-respecting developer soon learns this and starts to follow some form of <a href=\"https:\/\/en.wikipedia.org\/wiki\/Don%27t_repeat_yourself\">Don&#8217;t Repeat Yourself<\/a> (DRY). Unfortunately, the well-intended pursuit of DRY often leads to overengineering and accidental complexity. This is where the counterpart of DRY comes in: Write Everything Twice (WET). The idea behind WET is to only deduplicate on the third occurrence of duplication.<\/p>\n<p>For a more in-depth look at the costs and benefits of deduplication, see <a href=\"https:\/\/www.entropywins.wtf\/blog\/2017\/09\/06\/the-fallacy-of-dry\/\">The Fallacy of DRY<\/a>.<\/p>\n<h3>9. Types, Names and Comments<\/h3>\n<p>Try to write self-documenting code and avoid comments.<\/p>\n<blockquote><p>Every time you write a comment, you should grimace and feel the failure of your ability of expression. &#8212; Robert C. Martin<\/p><\/blockquote>\n<p>Comments are dangerous because they can lie. The code can change without the comment being updated. New code can be added right under the comment. The comment might have been wrong or inaccurate in the first place. When this happens, the comment not only becomes useless, it becomes misleading.<\/p>\n<p>To write self-documenting code:<\/p>\n<ul>\n<li><a href=\"https:\/\/www.entropywins.wtf\/blog\/2018\/10\/30\/readable-functions-do-one-thing\/\">Do one thing in your functions<\/a>\n<ul>\n<li>By doing a single thing in a function, you can give it a clear name<\/li>\n<li>Feel the need to explain what different sections of your function do by adding comments? Instead, extract each section into its own well-named function.<\/li>\n<li>&#8220;<a href=\"https:\/\/verraes.net\/2013\/09\/extract-till-you-drop\/\">Extract till you drop<\/a>&#8220;: if you can meaningfully extract a function, then you probably should. Don&#8217;t be afraid of small functions.<\/li>\n<li><a href=\"https:\/\/martinfowler.com\/bliki\/CommandQuerySeparation.html\">Command Query Separation<\/a><\/li>\n<li>Similar to the <a href=\"https:\/\/en.wikipedia.org\/wiki\/Single-responsibility_principle\">Single Responsibility Principle<\/a> for classes (The S in SOLID)<\/li>\n<\/ul>\n<\/li>\n<li><a href=\"https:\/\/www.entropywins.wtf\/blog\/2018\/10\/24\/readable-functions-minimize-state\/\"><strong>Minimize state<\/strong><\/a><\/li>\n<li><strong>Use types<\/strong>. Combined with a test suite that executes the code, you can rely on the types telling the truth.<\/li>\n<li><strong>Avoid mixed types<\/strong>. Avoid parameters or return values that can be an integer, a boolean, or a string. This naturally happens if you write focused functions that only do one thing.<\/li>\n<li><strong>Write tests<\/strong>. A well-written and comprehensive test suite shows you how the production code can be used, and how it behaves.<\/li>\n<\/ul>\n<p><a href=\"https:\/\/www.goodreads.com\/book\/show\/3735293-clean-code\">Clean Code<\/a> by Robert C. Martin has some good rules of thumb about naming and comments.<\/p>\n<h2>Recommended Reading for Juniors<\/h2>\n<h3>Books<\/h3>\n<ul>\n<li><strong><a href=\"https:\/\/www.goodreads.com\/book\/show\/3735293-clean-code\">Clean Code<\/a>, 2007 book by Robert C. Martin<\/strong><\/li>\n<li><strong><a href=\"https:\/\/www.goodreads.com\/book\/show\/5608045-apprenticeship-patterns\">Apprenticeship Patterns: Guidance for the Aspiring Software Craftsman<\/a>, 2009 book<\/strong><\/li>\n<li><a href=\"https:\/\/www.goodreads.com\/book\/show\/44919.Working_Effectively_with_Legacy_Code\">Working Effectively with Legacy Code<\/a>, 2004 book by Michael Feathers<\/li>\n<li><a href=\"https:\/\/www.goodreads.com\/book\/show\/44936.Refactoring\">Refactoring: Improving the Design of Existing Code<\/a>, 1999 book<\/li>\n<li><a href=\"https:\/\/www.goodreads.com\/book\/show\/23215733-the-software-craftsman\">The Software Craftsman<\/a>, 2014 book<\/li>\n<\/ul>\n<h3>Blogs<\/h3>\n<ul>\n<li><a href=\"https:\/\/martinfowler.com\/\">MartinFowler.com<\/a> &#8211; Tons of high-quality articles about all things software development<\/li>\n<li><a href=\"https:\/\/www.entropywins.wtf\">EntropyWins.wtf<\/a> &#8211; Clearly the best blog on the internet \ud83d\ude42<\/li>\n<\/ul>\n<p>See also: <a href=\"https:\/\/blog.codinghorror.com\/recommended-reading-for-developers\/\">Recommended Reading for Developers<\/a> by Jeff Atwood<\/p>\n<h2>Bonus links<\/h2>\n<ul>\n<li><a href=\"https:\/\/martinfowler.com\/bliki\/TellDontAsk.html\">Tell Don&#8217;t Ask<\/a> &#8212; Encapsulation best practice<\/li>\n<li><a href=\"https:\/\/wiki.c2.com\/?LawOfDemeter\">Law of Demeter<\/a> &#8212; Coupling best practice<\/li>\n<li><a href=\"https:\/\/en.wikipedia.org\/wiki\/Domain-driven_design\">Domain Driven Design<\/a> &#8212; A sizeable toolbox. More advanced, good to first learn the basics.<\/li>\n<li><a href=\"https:\/\/williamdurand.fr\/2013\/06\/03\/object-calisthenics\/\">Object Calisthenics<\/a> &#8212; Rules that restrict what you can do in programming. Nice for learning how to do things differently<\/li>\n<li><a href=\"https:\/\/en.wikipedia.org\/wiki\/Pair_programming\">Pair Programming<\/a> &#8212; A great way to learn from each other<\/li>\n<li><a href=\"https:\/\/codingdojo.org\/kata\/\">Code katas<\/a> &#8212; Simple programming, great for practicing a specific technique or skill such as Test Driven Development<\/li>\n<\/ul>\n<blockquote class=\"twitter-tweet\" data-dnt=\"true\"><p><a href=\"https:\/\/twitter.com\/ProWikis\/status\/1572655811314462720\"><br \/>\n<i class=\"fab fa-twitter\"><\/i> Comment and retweet on Twitter<br \/>\n<\/a><\/p><\/blockquote>\n<p><script async src=\"https:\/\/platform.twitter.com\/widgets.js\" charset=\"utf-8\"><\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Over the 15+ years of my development career, I have learned several things that significantly increase my effectiveness. In this&hellip;<\/p>\n","protected":false},"author":1,"featured_media":2886,"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,363,179,365,316,396,257],"class_list":["post-2877","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-programming","tag-clean-code","tag-code-quality","tag-oop","tag-software-craftsmanship","tag-software-design","tag-solid","tag-testing"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Advice for junior developers - Blog of Jeroen De Dauw<\/title>\n<meta name=\"description\" content=\"Learn how to quickly become an effective developer. Jump ahead of the competition by learning simple principles unknown to most developers.\" \/>\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\/2022\/09\/21\/advice-for-junior-developers\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Advice for junior developers - Blog of Jeroen De Dauw\" \/>\n<meta property=\"og:description\" content=\"Learn how to quickly become an effective developer. Jump ahead of the competition by learning simple principles unknown to most developers.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.entropywins.wtf\/blog\/2022\/09\/21\/advice-for-junior-developers\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog of Jeroen De Dauw\" \/>\n<meta property=\"article:published_time\" content=\"2022-09-21T17:33:39+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-12-20T14:30:38+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2022\/09\/code.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"628\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\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\":\"TechArticle\",\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2022\\\/09\\\/21\\\/advice-for-junior-developers\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2022\\\/09\\\/21\\\/advice-for-junior-developers\\\/\"},\"author\":{\"name\":\"Jeroen\",\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/#\\\/schema\\\/person\\\/4e2ef14f2ca7dc3a0ac137d1692b66b7\"},\"headline\":\"Advice for junior developers\",\"datePublished\":\"2022-09-21T17:33:39+00:00\",\"dateModified\":\"2022-12-20T14:30:38+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2022\\\/09\\\/21\\\/advice-for-junior-developers\\\/\"},\"wordCount\":1533,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/#\\\/schema\\\/person\\\/4e2ef14f2ca7dc3a0ac137d1692b66b7\"},\"image\":{\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2022\\\/09\\\/21\\\/advice-for-junior-developers\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/wp-content\\\/uploads\\\/2022\\\/09\\\/code.jpg\",\"keywords\":[\"Clean Code\",\"Code Quality\",\"OOP\",\"Software Craftsmanship\",\"Software design\",\"SOLID\",\"Testing\"],\"articleSection\":[\"Programming\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2022\\\/09\\\/21\\\/advice-for-junior-developers\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2022\\\/09\\\/21\\\/advice-for-junior-developers\\\/\",\"url\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2022\\\/09\\\/21\\\/advice-for-junior-developers\\\/\",\"name\":\"Advice for junior developers - Blog of Jeroen De Dauw\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2022\\\/09\\\/21\\\/advice-for-junior-developers\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2022\\\/09\\\/21\\\/advice-for-junior-developers\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/wp-content\\\/uploads\\\/2022\\\/09\\\/code.jpg\",\"datePublished\":\"2022-09-21T17:33:39+00:00\",\"dateModified\":\"2022-12-20T14:30:38+00:00\",\"description\":\"Learn how to quickly become an effective developer. Jump ahead of the competition by learning simple principles unknown to most developers.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2022\\\/09\\\/21\\\/advice-for-junior-developers\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2022\\\/09\\\/21\\\/advice-for-junior-developers\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2022\\\/09\\\/21\\\/advice-for-junior-developers\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/wp-content\\\/uploads\\\/2022\\\/09\\\/code.jpg\",\"contentUrl\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/wp-content\\\/uploads\\\/2022\\\/09\\\/code.jpg\",\"width\":1200,\"height\":628},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/2022\\\/09\\\/21\\\/advice-for-junior-developers\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.entropywins.wtf\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Advice for junior developers\"}]},{\"@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":"Advice for junior developers - Blog of Jeroen De Dauw","description":"Learn how to quickly become an effective developer. Jump ahead of the competition by learning simple principles unknown to most developers.","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\/2022\/09\/21\/advice-for-junior-developers\/","og_locale":"en_US","og_type":"article","og_title":"Advice for junior developers - Blog of Jeroen De Dauw","og_description":"Learn how to quickly become an effective developer. Jump ahead of the competition by learning simple principles unknown to most developers.","og_url":"https:\/\/www.entropywins.wtf\/blog\/2022\/09\/21\/advice-for-junior-developers\/","og_site_name":"Blog of Jeroen De Dauw","article_published_time":"2022-09-21T17:33:39+00:00","article_modified_time":"2022-12-20T14:30:38+00:00","og_image":[{"width":1200,"height":628,"url":"https:\/\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2022\/09\/code.jpg","type":"image\/jpeg"}],"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":"TechArticle","@id":"https:\/\/www.entropywins.wtf\/blog\/2022\/09\/21\/advice-for-junior-developers\/#article","isPartOf":{"@id":"https:\/\/www.entropywins.wtf\/blog\/2022\/09\/21\/advice-for-junior-developers\/"},"author":{"name":"Jeroen","@id":"https:\/\/www.entropywins.wtf\/blog\/#\/schema\/person\/4e2ef14f2ca7dc3a0ac137d1692b66b7"},"headline":"Advice for junior developers","datePublished":"2022-09-21T17:33:39+00:00","dateModified":"2022-12-20T14:30:38+00:00","mainEntityOfPage":{"@id":"https:\/\/www.entropywins.wtf\/blog\/2022\/09\/21\/advice-for-junior-developers\/"},"wordCount":1533,"commentCount":2,"publisher":{"@id":"https:\/\/www.entropywins.wtf\/blog\/#\/schema\/person\/4e2ef14f2ca7dc3a0ac137d1692b66b7"},"image":{"@id":"https:\/\/www.entropywins.wtf\/blog\/2022\/09\/21\/advice-for-junior-developers\/#primaryimage"},"thumbnailUrl":"https:\/\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2022\/09\/code.jpg","keywords":["Clean Code","Code Quality","OOP","Software Craftsmanship","Software design","SOLID","Testing"],"articleSection":["Programming"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.entropywins.wtf\/blog\/2022\/09\/21\/advice-for-junior-developers\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.entropywins.wtf\/blog\/2022\/09\/21\/advice-for-junior-developers\/","url":"https:\/\/www.entropywins.wtf\/blog\/2022\/09\/21\/advice-for-junior-developers\/","name":"Advice for junior developers - Blog of Jeroen De Dauw","isPartOf":{"@id":"https:\/\/www.entropywins.wtf\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.entropywins.wtf\/blog\/2022\/09\/21\/advice-for-junior-developers\/#primaryimage"},"image":{"@id":"https:\/\/www.entropywins.wtf\/blog\/2022\/09\/21\/advice-for-junior-developers\/#primaryimage"},"thumbnailUrl":"https:\/\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2022\/09\/code.jpg","datePublished":"2022-09-21T17:33:39+00:00","dateModified":"2022-12-20T14:30:38+00:00","description":"Learn how to quickly become an effective developer. Jump ahead of the competition by learning simple principles unknown to most developers.","breadcrumb":{"@id":"https:\/\/www.entropywins.wtf\/blog\/2022\/09\/21\/advice-for-junior-developers\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.entropywins.wtf\/blog\/2022\/09\/21\/advice-for-junior-developers\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.entropywins.wtf\/blog\/2022\/09\/21\/advice-for-junior-developers\/#primaryimage","url":"https:\/\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2022\/09\/code.jpg","contentUrl":"https:\/\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2022\/09\/code.jpg","width":1200,"height":628},{"@type":"BreadcrumbList","@id":"https:\/\/www.entropywins.wtf\/blog\/2022\/09\/21\/advice-for-junior-developers\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.entropywins.wtf\/blog\/"},{"@type":"ListItem","position":2,"name":"Advice for junior developers"}]},{"@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":"https:\/\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2022\/09\/code.jpg","jetpack_shortlink":"https:\/\/wp.me\/p74TBF-Kp","jetpack-related-posts":[{"id":1327,"url":"https:\/\/www.entropywins.wtf\/blog\/2014\/04\/30\/wikibase-datamodel-entity-v2\/","url_meta":{"origin":2877,"position":0},"title":"Wikibase DataModel: Entity v2","author":"Jeroen","date":"2014-04-30","format":false,"excerpt":"In a recent blog post I introduced the new Term classes introduced in Wikibase DataModel 0.7.3. It also outlined plans for making some big changes to the Entity class and it's derivatives. We have now taken the most difficult step in the process, which is already resulting in much nicer\u2026","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/www.entropywins.wtf\/blog\/category\/programming\/"},"img":{"alt_text":"dm-complexity","src":"https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2014\/04\/dm-complexity.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":1703,"url":"https:\/\/www.entropywins.wtf\/blog\/2016\/05\/24\/i-t-a-k-e-2016\/","url_meta":{"origin":2877,"position":1},"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":2044,"url":"https:\/\/www.entropywins.wtf\/blog\/2017\/05\/24\/generic-entity-handling-code\/","url_meta":{"origin":2877,"position":2},"title":"Generic Entity handling code","author":"Jeroen","date":"2017-05-24","format":false,"excerpt":"In this blog post I outline my thinking on sharing code that deals with different types of Entities in your domain. We\u2019ll cover what Entities are, code reuse strategies, pitfalls such as Shotgun Surgery and Anemic Domain Models and finally Bounded Contexts. Why I wrote this post I work at\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":1201,"url":"https:\/\/www.entropywins.wtf\/blog\/2014\/03\/17\/big-ball-of-mud\/","url_meta":{"origin":2877,"position":3},"title":"Big Ball of Mud","author":"Jeroen","date":"2014-03-17","format":false,"excerpt":"A while back I somehow stumbled upon a little paper about the Big Ball of Mud patten. This was an interesting and amusing read. In this blog post I'm adding some additional thoughts from my side, on things I found to be missing, misleadingly explained or disagree with altogether. To\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":1553,"url":"https:\/\/www.entropywins.wtf\/blog\/2016\/01\/24\/the-liskov-substitution-principle\/","url_meta":{"origin":2877,"position":4},"title":"The Liskov Substitution Principle","author":"Jeroen","date":"2016-01-24","format":false,"excerpt":"I have a number of web-based presentations online on the software craftsmanship topic. You can find these on the software craftsmanship page of my website. I've just written an abstract for a presentation on the so-called Liskov Substitution Principle. This is a presentation I've done a number of times and\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\/01\/lsp0.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2016\/01\/lsp0.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2016\/01\/lsp0.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2016\/01\/lsp0.png?resize=700%2C400&ssl=1 2x"},"classes":[]}],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/posts\/2877","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=2877"}],"version-history":[{"count":14,"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/posts\/2877\/revisions"}],"predecessor-version":[{"id":2910,"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/posts\/2877\/revisions\/2910"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/media\/2886"}],"wp:attachment":[{"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/media?parent=2877"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/categories?post=2877"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/tags?post=2877"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}