{"id":457,"date":"2018-07-12T04:15:25","date_gmt":"2018-07-12T04:15:25","guid":{"rendered":"https:\/\/blog.hassler.ec\/wp\/?p=457"},"modified":"2018-06-27T17:18:11","modified_gmt":"2018-06-27T17:18:11","slug":"the-problem-you-solve-is-more-important-than-the-code-you-write-%f0%9f%94%8a","status":"publish","type":"post","link":"https:\/\/blog.hassler.ec\/wp\/2018\/07\/12\/the-problem-you-solve-is-more-important-than-the-code-you-write-%f0%9f%94%8a\/","title":{"rendered":"The Problem You Solve Is More Important Than The Code You Write\u00a0?"},"content":{"rendered":"<section class=\"section section--body section--first\">\n<div class=\"section-content\">\n<div class=\"section-inner sectionLayout--insetColumn\">\n<h2 id=\"0f3d\" class=\"graf graf--h4 graf-after--h3 graf--subtitle\">Software has a purpose sometimes forgotten<\/h2>\n<\/div>\n<div class=\"section-inner sectionLayout--fullWidth\">\n<figure id=\"faf2\" class=\"graf graf--figure graf--layoutFillWidth graf-after--h4\" data-scroll=\"native\">\n<div class=\"aspectRatioPlaceholder is-locked\">\n<div class=\"aspectRatioPlaceholder-fill\"><\/div>\n<div class=\"progressiveMedia js-progressiveMedia graf-image is-canvasLoaded is-imageLoaded\" data-image-id=\"1*zbgzcmKojF40TJGCbDrcpg.jpeg\" data-width=\"1024\" data-height=\"439\" data-scroll=\"native\"><canvas class=\"progressiveMedia-canvas js-progressiveMedia-canvas\" width=\"75\" height=\"30\"><\/canvas><img decoding=\"async\" class=\"progressiveMedia-image js-progressiveMedia-image\" src=\"https:\/\/cdn-images-1.medium.com\/max\/2000\/1*zbgzcmKojF40TJGCbDrcpg.jpeg\" data-src=\"https:\/\/cdn-images-1.medium.com\/max\/2000\/1*zbgzcmKojF40TJGCbDrcpg.jpeg\" \/><\/div>\n<\/div><figcaption class=\"imageCaption\">The picture of a hammer sitting on top of a wooden piece. There&#8217;s a threaded screw stuck to the wooden. The screw has been heavily hammered and is therefore bent.<\/figcaption><\/figure>\n<\/div>\n<div class=\"section-inner sectionLayout--insetColumn\">\n<figure id=\"2335\" class=\"graf graf--figure graf--iframe graf-after--figure graf--trailing\">\n<div class=\"aspectRatioPlaceholder is-locked\">\n<div class=\"aspectRatioPlaceholder-fill\"><\/div>\n<\/div>\n<\/figure>\n<\/div>\n<\/div>\n<\/section>\n<section class=\"section section--body\">\n<div class=\"section-divider\">Programmers seem to have forgotten the real purpose of software, that is to solve a real-world problem.<\/div>\n<div class=\"section-content\">\n<div class=\"section-inner sectionLayout--insetColumn\">\n<p id=\"652c\" class=\"graf graf--p graf-after--p\">50 years ago, in 1968, there was the\u00a0<a class=\"markup--anchor markup--p-anchor\" href=\"http:\/\/homepages.cs.ncl.ac.uk\/brian.randell\/NATO\/NATOReports\/\" target=\"_blank\" rel=\"noopener nofollow\" data-href=\"http:\/\/homepages.cs.ncl.ac.uk\/brian.randell\/NATO\/NATOReports\/\">Working Conference on Software Engineering<\/a>, sponsored by the NATO Science Committee. At that time, people started to notice software was becoming a fundamental part of society. However, it was also becoming too hard to understand. After that conference, programming started to become a whole industry. It started to move away from the control of business people.<\/p>\n<p id=\"66d7\" class=\"graf graf--p graf-after--p\">Regardless of the path programming has taken since then, there&#8217;s still a problem with the separation between business and software development\u200a\u2014\u200aor \u00abengineering\u00bb as the conference called for the first time. If developers become too narrowly focused on development, they can miss the purpose behind the software they write. They may not see hidden solutions that don\u2019t require any code.<\/p>\n<p id=\"e1fc\" class=\"graf graf--p graf-after--p\">Here&#8217;s an example.<\/p>\n<p id=\"1887\" class=\"graf graf--p graf-after--p\">There was a startup building a device to allow a person to unlock the door of their house using Bluetooth. The visual interface to communicate with the device was a widget, visible even when the phone was locked. It had a single button called \u201cOpen the door.\u201d<\/p>\n<p id=\"9d4e\" class=\"graf graf--p graf-after--p\">When the user came closer to the house, they would grab the phone, find the widget, and then click the button to open.<\/p>\n<p id=\"b59a\" class=\"graf graf--p graf-after--p\">Somebody looked at that workflow and asked:<\/p>\n<blockquote id=\"1bef\" class=\"graf graf--blockquote graf-after--p\"><p>If we\u2019re using Bluetooth and assuming whoever has the phone can enter the house, why do we need to make somebody grab the phone and push a button? Let\u2019s allow the door to unlock when it detects the device approach by 1 meter. This way we don\u2019t need to pay the cost to design and code a visual interface!<\/p><\/blockquote>\n<p id=\"8748\" class=\"graf graf--p graf-after--blockquote\">The Bluetooth story is an excellent example of narrow focus: The goal was to unlock the door with minimum effort. It makes no sense to design a visual interface if the sensors are wireless.<\/p>\n<p id=\"52ea\" class=\"graf graf--p graf-after--p\">If you&#8217;re aware of what the business is trying to achieve and what&#8217;s the value to the user, you can merge that knowledge with your knowledge of what&#8217;s possible with the technology. Only then you&#8217;ll have enough information to come up with better answers and conclude an interface is not necessary for a product.<\/p>\n<p id=\"0169\" class=\"graf graf--p graf-after--p\">That is an excellent example of how to solve a programming problem\u00a0<a class=\"markup--anchor markup--p-anchor\" href=\"https:\/\/medium.freecodecamp.org\/code-that-dont-exist-is-the-code-you-don-t-need-to-debug-88985ed9604\" target=\"_blank\" rel=\"noopener nofollow\" data-href=\"https:\/\/medium.freecodecamp.org\/code-that-dont-exist-is-the-code-you-don-t-need-to-debug-88985ed9604\">without having to write any additional code<\/a>. However,\u00a0<a class=\"markup--anchor markup--p-anchor\" href=\"https:\/\/levelup.gitconnected.com\/how-to-use-technical-debt-in-your-favor-98bae475ba68\" target=\"_blank\" rel=\"nofollow noopener\" data-href=\"https:\/\/levelup.gitconnected.com\/how-to-use-technical-debt-in-your-favor-98bae475ba68\">just like Technical Debt<\/a>,\u00a0<strong class=\"markup--strong markup--p-strong\">nothing should be used as an excuse<\/strong>\u00a0to write crap code in the rest.<\/p>\n<blockquote id=\"ae81\" class=\"graf graf--pullquote graf-after--p\"><p>Not every code is worth\u00a0writing<\/p><\/blockquote>\n<p id=\"4738\" class=\"graf graf--p graf-after--pullquote\">Sometimes, the fix for a severe bug may not be a priority. If you&#8217;re a crypto exchange and your system allowed a\u00a0<a class=\"markup--anchor markup--p-anchor\" href=\"https:\/\/medium.com\/@fagnerbrack\/the-day-a-bug-was-fixed-only-because-the-ceo-called-in-f653a34079eb\" target=\"_blank\" rel=\"noopener\" data-href=\"https:\/\/medium.com\/@fagnerbrack\/the-day-a-bug-was-fixed-only-because-the-ceo-called-in-f653a34079eb\">duplicate deposit<\/a>\u00a0to happen once, human intervention can be the best cost-benefit solution if the cost to fix the problem is high.<\/p>\n<p id=\"5692\" class=\"graf graf--p graf-after--p\">This trade-off between Severity and Priority reminds me of a model\u00a0<a class=\"markup--anchor markup--p-anchor\" href=\"https:\/\/www.facebook.com\/gazza\" target=\"_blank\" rel=\"noopener nofollow\" data-href=\"https:\/\/www.facebook.com\/gazza\">a colleague<\/a>\u00a0showed me recently. It&#8217;s called The Priority Matrix, a bi-dimensional\u00a0<a class=\"markup--anchor markup--p-anchor\" href=\"https:\/\/medium.com\/@fagnerbrack\/you-cant-call-yourself-an-explorer-without-a-map-4e19ce51daa3\" target=\"_blank\" rel=\"noopener\" data-href=\"https:\/\/medium.com\/@fagnerbrack\/you-cant-call-yourself-an-explorer-without-a-map-4e19ce51daa3\">model<\/a>\u00a0that can be used to prioritize bugs based on how many users it affects and the severity.<\/p>\n<figure id=\"efd8\" class=\"graf graf--figure graf-after--p\">\n<div class=\"aspectRatioPlaceholder is-locked\">\n<div class=\"aspectRatioPlaceholder-fill\"><\/div>\n<div class=\"progressiveMedia js-progressiveMedia graf-image is-canvasLoaded is-imageLoaded\" data-image-id=\"1*fLA3Xc_7sNVsCI2E_E8LGg.png\" data-width=\"494\" data-height=\"484\" data-scroll=\"native\"><img decoding=\"async\" class=\"progressiveMedia-image js-progressiveMedia-image\" src=\"https:\/\/cdn-images-1.medium.com\/max\/800\/1*fLA3Xc_7sNVsCI2E_E8LGg.png\" data-src=\"https:\/\/cdn-images-1.medium.com\/max\/800\/1*fLA3Xc_7sNVsCI2E_E8LGg.png\" \/><\/div>\n<\/div><figcaption class=\"imageCaption\">A picture which describes the bi-dimensional Priority Matrix. The Y dimension represents the column with the caption \u00abUsers affected\u00bb containing the values \u00abone,\u00bb \u00absome\u00bb and \u00aball.\u00bb The X dimension represents the column with the caption \u00abSeverity\u00bb containing the values \u00abcosmetic,\u00bb \u00abinconvenient\u00bb and \u00abstops work.\u00bb The priority of the bug is more or less significant according to the position in the axis. For example, if a bug is cosmetic and affects one user, the priority is 4; if a bug stops somebody&#8217;s work and affects some users, the priority is 1; if a bug stops somebody else&#8217;s work and affects all users, it has maximum priority with the value of\u00a0zero.<\/figcaption><\/figure>\n<p id=\"eb73\" class=\"graf graf--p graf-after--figure\">The single duplicate deposit issue described earlier falls into the category of\u00a0<strong class=\"markup--strong markup--p-strong\">inconvenience<\/strong>\u00a0that affects<strong class=\"markup--strong markup--p-strong\">\u00a0one user<\/strong>. Therefore, priority 3.<\/p>\n<blockquote id=\"6e19\" class=\"graf graf--pullquote graf-after--p\"><p>Not every bug is worth\u00a0fixing<\/p><\/blockquote>\n<p id=\"ec81\" class=\"graf graf--p graf-after--pullquote\">It&#8217;s very common as developers to try to write scripts for everything. However, some repeatable tasks may not be worth automating. You don&#8217;t need to spend the time to code scripts if you\u2019re going to hide essential knowledge of how the underlying command works.<\/p>\n<p id=\"0d03\" class=\"graf graf--p graf-after--p\"><span class=\"markup--quote markup--p-quote is-other\" data-creator-ids=\"anon\">There\u2019s a difference between encapsulation of complex logic and abstraction of useful knowledge<\/span>. Sometimes, information should be explicit to be comprehensible. If you abstract them, they can have the opposite effect and be harder to understand.<\/p>\n<p id=\"d60d\" class=\"graf graf--p graf-after--p\">It&#8217;s more useful to use some types of low-level commands in the CLI than a high-level command that abstracts knowledge,\u00a0<a class=\"markup--anchor markup--p-anchor\" href=\"https:\/\/medium.com\/@fagnerbrack\/it-doesnt-matter-how-fast-you-write-code-2e09b42bfff0\" target=\"_blank\" rel=\"noopener\" data-href=\"https:\/\/medium.com\/@fagnerbrack\/it-doesnt-matter-how-fast-you-write-code-2e09b42bfff0\">such as Git aliases<\/a>.<\/p>\n<blockquote id=\"4d59\" class=\"graf graf--pullquote graf-after--p\"><p>Not every command is worth scripting<\/p><\/blockquote>\n<p id=\"0b48\" class=\"graf graf--p graf-after--pullquote\">Years ago I worked on a project using\u00a0<a class=\"markup--anchor markup--p-anchor\" href=\"https:\/\/levelup.gitconnected.com\/code-less-think-more-incrementally-98adee22df9b\" target=\"_blank\" rel=\"nofollow noopener\" data-href=\"https:\/\/levelup.gitconnected.com\/code-less-think-more-incrementally-98adee22df9b\">Incremental Delivery<\/a>. It was an identity verification system that would ask for the user to submit some personal data to be verified by a third-party provider.<\/p>\n<p id=\"eefa\" class=\"graf graf--p graf-after--p\">There was this fancy field validation feature the team wanted to build. However, the validation story was being de-prioritized on every sprint planning as the deadline became closer and closer. In the end, the team figured out that it didn&#8217;t make any sense for the fancy validation to exist in the first place.<\/p>\n<p id=\"5dfb\" class=\"graf graf--p graf-after--p\">Here&#8217;s why: The verification was mandatory!<\/p>\n<p id=\"34d5\" class=\"graf graf--p graf-after--p\">It was in the user&#8217;s interest to provide valid information. If the user provided wrong data, they wouldn&#8217;t be validated and wouldn\u2019t be able to use the system. Besides, most browsers supported a standard HTML validation that was good enough.<\/p>\n<p id=\"4b20\" class=\"graf graf--p graf-after--p\">In the worse case scenario, users that couldn&#8217;t verify themselves would call support to be verified manually.<\/p>\n<blockquote id=\"c609\" class=\"graf graf--pullquote graf-after--p\"><p>Not every feature is worth\u00a0coding<\/p><\/blockquote>\n<p id=\"660c\" class=\"graf graf--p graf-after--pullquote\">As a developer, if you understand the problem you&#8217;re trying to solve, you\u2019ll be capable of coming up with better code, and sometimes no code at all. You are not a\u00a0<a class=\"markup--anchor markup--p-anchor\" href=\"https:\/\/www.urbandictionary.com\/define.php?term=code%20monkey\" target=\"_blank\" rel=\"nofollow noopener\" data-href=\"https:\/\/www.urbandictionary.com\/define.php?term=code%20monkey\">Code Monkey<\/a>\u00a0paid to write characters on a screen. You&#8217;re a professional paid to solve problems.<\/p>\n<p id=\"7ab7\" class=\"graf graf--p graf-after--p\">However, if you try to solve every problem with the technology without some thinking, as if the code is a\u00a0<a class=\"markup--anchor markup--p-anchor\" href=\"https:\/\/medium.com\/@fagnerbrack\/how-to-reject-the-belief-on-the-silver-bullet-1d86b686acbb%5C\" target=\"_blank\" rel=\"noopener\" data-href=\"https:\/\/medium.com\/@fagnerbrack\/how-to-reject-the-belief-on-the-silver-bullet-1d86b686acbb\\\">Silver Bullet<\/a>, you&#8217;ll have trouble to understand what gives value to the customer and be able to come up with great ideas.<\/p>\n<p id=\"fc32\" class=\"graf graf--p graf-after--p\">Your purpose and the purpose of the code you write is to generate value and make the existing world a better place, not to satisfy your egocentric view of what the world should be.<\/p>\n<p id=\"cd1b\" class=\"graf graf--p graf-after--p\">There\u2019s that saying: \u201cIf all you have is a hammer, everything looks like a nail.\u201d<\/p>\n<p id=\"a7db\" class=\"graf graf--p graf-after--p\">It&#8217;s better to have a nail first so that you can consider the need for a hammer.<\/p>\n<p id=\"5fea\" class=\"graf graf--p graf-after--p graf--trailing\">That is, if you need a nail in the first place.<\/p>\n<\/div>\n<\/div>\n<p>SOURCE:\u00a0<a href=\"https:\/\/medium.com\/@fagnerbrack\/the-problem-you-solve-is-more-important-than-the-code-you-write-d0e5493132c6\"><strong>https:\/\/medium.com\/@fagnerbrack\/the-problem-you-solve-is-more-important-than-the-code-you-write-d0e5493132c6<\/strong><\/a><\/p>\n<div class=\"section-content\">\n<h3 class=\"u-lineHeightTightest\"><a class=\"ds-link ds-link--styleSubtle ui-captionStrong u-inlineBlock link link--darken link--darker\" dir=\"auto\" href=\"https:\/\/medium.com\/@fagnerbrack?source=post_header_lockup\" data-action=\"show-user-card\" data-action-source=\"post_header_lockup\" data-action-value=\"7ef192b7f545\" data-action-type=\"hover\" data-user-id=\"7ef192b7f545\">Fagner Brack<\/a><\/h3>\n<div class=\"ui-caption ui-xs-clamp2 postMetaInline\">I write about challenging stuff you won\u2019t find anywhere else. ~5-minutes idea<\/div>\n<\/div>\n<\/section>\n","protected":false},"excerpt":{"rendered":"<p>Software has a purpose sometimes forgotten The picture of a hammer sitting on top of a wooden piece. There&#8217;s a [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":243,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[49,12,39,47,29],"tags":[],"class_list":["post-457","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-back-end","category-bloghassler-ec","category-escritores","category-medium","category-programacion"],"_links":{"self":[{"href":"https:\/\/blog.hassler.ec\/wp\/wp-json\/wp\/v2\/posts\/457","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.hassler.ec\/wp\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.hassler.ec\/wp\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.hassler.ec\/wp\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.hassler.ec\/wp\/wp-json\/wp\/v2\/comments?post=457"}],"version-history":[{"count":2,"href":"https:\/\/blog.hassler.ec\/wp\/wp-json\/wp\/v2\/posts\/457\/revisions"}],"predecessor-version":[{"id":535,"href":"https:\/\/blog.hassler.ec\/wp\/wp-json\/wp\/v2\/posts\/457\/revisions\/535"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.hassler.ec\/wp\/wp-json\/wp\/v2\/media\/243"}],"wp:attachment":[{"href":"https:\/\/blog.hassler.ec\/wp\/wp-json\/wp\/v2\/media?parent=457"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.hassler.ec\/wp\/wp-json\/wp\/v2\/categories?post=457"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.hassler.ec\/wp\/wp-json\/wp\/v2\/tags?post=457"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}