{"id":807,"date":"2012-01-21T11:47:45","date_gmt":"2012-01-21T19:47:45","guid":{"rendered":"http:\/\/lianza.org\/blog\/?p=807"},"modified":"2016-11-12T10:00:07","modified_gmt":"2016-11-12T18:00:07","slug":"easy-problems","status":"publish","type":"post","link":"https:\/\/lianza.org\/blog\/2012\/01\/21\/easy-problems\/","title":{"rendered":"&quot;Easy&quot; Problems"},"content":{"rendered":"<p>In software, you wind up spending most of your time solving easy problems. Problems that have been solved before and, thanks to Google, have solutions available in an instant. Thousands of well-defined, no-risk, completely solvable problems.<\/p>\n<p>Virtually everything having to do with a user interface, if you&#8217;ve seen it done before, is &#8220;easy.&#8221; Gmail has a drag-and-drop attachment feature, so clearly that problem has been solved. Facebook has a live-scrolling ticker of events &#8211; piece of cake, just do what they did. Also, anything that has an open source solution is easy. Thank you <a href=\"http:\/\/lucene.apache.org\/solr\/\">Solr\/Lucene<\/a>, search is easy. Thank you <a href=\"http:\/\/hadoop.apache.org\/\">Hadoop<\/a>, doing computations on huge datasets is easy. Thank you <a href=\"http:\/\/rubyonrails.org\/\">Ruby on Rails<\/a>, building complete websites can be done <a href=\"http:\/\/www.youtube.com\/watch?v=Gzj723LkRJY\">in 15 minutes<\/a>.<\/p>\n<p>I actually do think all of these things are easy, to the extent that &#8220;easy&#8221; means you&#8217;re going to be able to solve them without needing to hire an expert and you won&#8217;t need to dust off your old Algorithms textbook at any point in the process. But there are a few things &#8220;easy&#8221; doesn&#8217;t mean:<\/p>\n<h2><b>Easy != Fast<\/b><\/h2>\n<p>Just because you know how to do it, that doesn&#8217;t mean it can be done quickly. We all know how to mow a lawn. Can you do 10 acres in 5 minutes?<\/p>\n<p>Depending on the problem you&#8217;re solving, usually one of two reasons explains why Easy != Fast<\/p>\n<p><b>1. The problem is clear, but tedious to solve<\/b><\/p>\n<p><a href=\"https:\/\/lianza.org\/blog\/wp-content\/uploads\/2012\/01\/box.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-thumbnail wp-image-812\" style=\"padding-right: 10px;\" title=\"Box.net signup\" src=\"https:\/\/lianza.org\/blog\/wp-content\/uploads\/2012\/01\/box-150x150.jpg\" alt=\"\" width=\"150\" height=\"150\" align=\"left\" \/><\/a> Building a sign-up form is simple &#8211; some text boxes, and a submit button. Of course, what sign-up form would be complete without validation, autocompletion\/correction, tooltips, markers for optional\/required, anti-bot\/spam protection&#8230; and <strong>each<\/strong> of those things is <strong>easy<\/strong> too, but you&#8217;ve just got a lot of lawn to mow. (photo from: <a title=\"Sign Up Form Design Patterns\" href=\"http:\/\/uxdesign.smashingmagazine.com\/2008\/07\/04\/web-form-design-patterns-sign-up-forms\/\">smashing magazine<\/a>)<\/p>\n<p><b>2. The problem is solved by a 3rd party tool, and it&#8217;s got it&#8217;s own&#8230; problems<\/b><\/p>\n<p><a href=\"http:\/\/lucene.apache.org\/solr\/\">Solr<\/a> does, in fact, make it very easy to build a search engine that produces fast, relevant results. Now, bone up on <a href=\"http:\/\/wiki.apache.org\/solr\/SchemaXml\">schema.xml<\/a>, <a href=\"http:\/\/wiki.apache.org\/solr\/DataImportHandler#Configuration_in_data-config.xml\">db-data-config.xml<\/a>, the <a href=\"http:\/\/wiki.apache.org\/solr\/SolrQuerySyntax\">various query parsers<\/a> and their associated syntaxes, then review what the best\/current libraries are for whatever language you&#8217;re using. It&#8217;s true, you don&#8217;t have to write any algorithms. You&#8217;ve also saved yourself time over building this thing from scratch &#8211; no question. But, you&#8217;re still about to spend a considerable amount of time on this.<\/p>\n<h2><b>Easy != Well Defined<\/b><\/h2>\n<p>There are still the fundamentals of software engineering at play. The example of the registration form above was also partially an tale of vague requirements.<\/p>\n<p>&#8220;We want a sign up form just like foo.com has&#8221; is the easiest way to spec a feature &#8211; you just point to something else and say &#8220;do it like that.&#8221; Even though that may seem <strong>less vague<\/strong> than &#8220;we want a sign up form&#8221;, unless you truly understand the thing you&#8217;re referring to you may have accidentally added <strong>more requirements<\/strong> than you meant to. Did you notice the foo.com has a live, password strength calculation and doesn&#8217;t let you sign up unless the password is strong enough? Did your developer just lose a few hours researching the best plugins\/schemes for that, then implementing them, all to build something you didn&#8217;t actually need?<\/p>\n<h2><b>Easy == Solved, but what does Solved mean?<\/b><\/h2>\n<p>Google makes billions of dollars on CPC ads. Paypal makes billions of dollars in processing payments. They each have plenty of competitors doing the same things, so the technologies behind processing CPC ads and sending payments are surely mature, and these are cases of solved problems.<\/p>\n<p>But how much time and effort do these companies spend fighting <strong>fraud<\/strong> every day? Google has an <a href=\"http:\/\/googleblog.blogspot.com\/2008\/03\/using-data-to-help-prevent-fraud.html\">Ad Traffic Quality<\/a> team. Paypal has a <a href=\"https:\/\/www.paypal.com\/cgi-bin\/webscr?cmd=xpt\/general\/SecurityFraud-outside\">Fraud Investigation Team<\/a>.<\/p>\n<blockquote><p>Sometimes a solved problem only looks that way because there is a <strong>metric ton<\/strong> of ongoing work making it appear that way.<\/p><\/blockquote>\n<p><a href=\"https:\/\/lianza.org\/blog\/wp-content\/uploads\/2012\/01\/Screen-Shot-2012-01-21-at-11.32.19-AM.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-thumbnail wp-image-824\" style=\"padding-right: 10px;\" title=\"Nordstrom search result for &quot;Shoes&quot;\" src=\"https:\/\/lianza.org\/blog\/wp-content\/uploads\/2012\/01\/Screen-Shot-2012-01-21-at-11.32.19-AM-150x150.png\" alt=\"\" width=\"150\" height=\"150\" align=\"left\" \/><\/a>Want to know why <a href=\"http:\/\/nordstrom.com\/\">Nordstrom<\/a> has beautiful, consistent photography of all of their products on their shopping pages, with the ability to zoom in on, and see a product at multiple angles? <strong>Solved problem<\/strong>: simply unbox every single thing you sell and photograph it the exact same way from the exact same angles. After that little exercise, adding a zoom feature is pretty straightforward.<\/p>\n<h2><b>Piece of Cake<\/b><\/h2>\n<p>I don&#8217;t object to using the word &#8220;easy&#8221; in software. It&#8217;s useful to acknowledge that something has minimal technical risk. But, be careful when it creeps into discussions about scheduling or operations. Time is not measured in units of difficulty.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In software, you wind up spending most of your time solving easy problems. Problems that have been solved before and, thanks to Google, have solutions available in an instant. Thousands of well-defined, no-risk, completely solvable problems. Virtually everything having to do with a user interface, if you&#8217;ve seen it done before, is &#8220;easy.&#8221; Gmail has [&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":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[9],"tags":[],"class_list":["post-807","post","type-post","status-publish","format-standard","hentry","category-techie"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p5TCqO-d1","jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/lianza.org\/blog\/wp-json\/wp\/v2\/posts\/807","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/lianza.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/lianza.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/lianza.org\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/lianza.org\/blog\/wp-json\/wp\/v2\/comments?post=807"}],"version-history":[{"count":2,"href":"https:\/\/lianza.org\/blog\/wp-json\/wp\/v2\/posts\/807\/revisions"}],"predecessor-version":[{"id":1077,"href":"https:\/\/lianza.org\/blog\/wp-json\/wp\/v2\/posts\/807\/revisions\/1077"}],"wp:attachment":[{"href":"https:\/\/lianza.org\/blog\/wp-json\/wp\/v2\/media?parent=807"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/lianza.org\/blog\/wp-json\/wp\/v2\/categories?post=807"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/lianza.org\/blog\/wp-json\/wp\/v2\/tags?post=807"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}