{"id":203,"date":"2008-12-15T14:23:32","date_gmt":"2008-12-15T19:23:32","guid":{"rendered":"http:\/\/www.graphics-muse.org\/wp\/?p=203"},"modified":"2019-03-06T14:50:05","modified_gmt":"2019-03-06T21:50:05","slug":"top-ten-things-ive-learned-about-software-development","status":"publish","type":"post","link":"https:\/\/www.graphics-muse.org\/wp\/?p=203","title":{"rendered":"Top ten things I&#8217;ve learned about software development"},"content":{"rendered":"<p>As the year grows to a close I find myself finishing up projects and preparing for the new year.&nbsp; I put together roughly 90,000 lines of code this year on a single project with one other developer, probably split somewhere around 80\/20.&nbsp; It is, as I&#8217;ve told him, our boss and my wife, the best code I&#8217;ve ever designed and implemented.&nbsp; The things I&#8217;ve learned along the way would qualify for a series of masters, if I were so inclined to waste my time trying for such credibility.<\/p>\n<p>Not all projects end before the holidays, of course.&nbsp; Most simply take a short hiatus and start back up in earnest in early January.&nbsp; What I do with the time between now and then is to get organized &#8211; again.&nbsp; I clean up build systems, update wikis and bug databases, do post-mortems on the work completed and use that to plan the work ahead.<\/p>\n<p>As I started this process today it led me to think about what I&#8217;ve learned over my 20 years of software development and test experience.&nbsp;&nbsp; Much has changed in the industry and a lot has changed for me in the past 2 years.&nbsp; I would be remiss as an engineer if I didn&#8217;t share what I&#8217;ve learned with those who might be interested.&nbsp; With luck, maybe it will help them along as well.<\/p>\n<p>So without further fanfare, here are the top 10 things I&#8217;ve learned about the software development industry over the past 20 years.<\/p>\n<p><span style=\"color: #993300;\"><em><strong>10.&nbsp; Java, the language, is good.&nbsp; JVM, the environment, is bad.<\/strong><\/em><\/span><\/p>\n<p>Whoever decided that adding a layer of software between an application and the operating system was the best solution for the sole purpose of preventing porting-based recompiles and complex #ifdefs must have been on crack.&nbsp; A JVM does nothing but, at best, limit your access to 30 years of operating system advances or, at worse, tries to reinvent the same.&nbsp; Java, on the other hand, is an extremely well designed object-oriented language, far superior to the mess that is C++.&nbsp; As a C programmer for the majority of my career, I found it far easier to pick up Java (and even Perl&#8217;s object orientation) than to learn C++.<\/p>\n<p>If we could just get native compilers for Java and remove the need for JNI (but leave the linkage to C libraries), Java would be the ideal development language for 90% of computing.&nbsp; With JVMs, however, it is useful to only 10% of computing.<\/p>\n<p><span style=\"color: #993300;\"><em><strong>9.&nbsp; The Web is overkill and a mess<\/strong><\/em><\/span><\/p>\n<p>Our industry took a major dive when the world discovered the Internet and decided it was the newest oil field that needed drilling.&nbsp; Of course, few of the money hungry bastards that paid for the drilling knew anything about this field.&nbsp; They didn&#8217;t know drilling into thin air gets you &#8211; well, air.<\/p>\n<p>I will admit that you can do some amount of business on the Internet.&nbsp; I frequently make purchases.&nbsp; But this is nothing more than direct buy purchasing.&nbsp; You eliminate brick-and-mortar costs, including distribution and middle-men.&nbsp;&nbsp; But the Internet in and of itself is not something to make money on.&nbsp; Even with internet telephony you use the backbone as a transmission medium but still must provide services on top of it.&nbsp; You still need a product.&nbsp; The Internet is not a product.<\/p>\n<p>So the first mistake in this industry (or those we mistakenly let into our little club) was a lack of understanding of what the Internet is and what it can provide.&nbsp; The second was a misunderstanding of what the tools used to access this resource should be used for.&nbsp; Let me be perfectly clear here:<\/p>\n<blockquote><p><span style=\"color: #cc0000;\"><small><span style=\"font-family: Courier New;\"><strong>Not every application should be based in a browser.<\/strong><\/span><\/small><\/span><\/p><\/blockquote>\n<p>Forget for a minute the vast security issues like cross-site scripting.&nbsp;&nbsp; A <em>browser<\/em> is exactly that &#8211; it&#8217;s used to <strong>view information<\/strong>.&nbsp; Interactivity was never part of the plan and the mechanisms available for interactivity are horrible hacks that have overly complicated what should have been a moderately simple tool.&nbsp; More important, client side native applications can more effectively utilize 30 years of operating system experience and implementation (see previous rant on JVMs).&nbsp; Just because you can do something doesn&#8217;t mean it&#8217;s a good idea.&nbsp; You have to think about what you&#8217;re doing and why you want to do it.<\/p>\n<p>Unfortunately, building browser-based applications is a fad that, like rap music, simply won&#8217;t die.&nbsp;&nbsp; That means remote systems that can support those applications.&nbsp; And that means &#8211; gulp and yuck, in one breath &#8211; Web Services.<\/p>\n<p>My current work involves implementing a grid system over web services.&nbsp;&nbsp; The use of web services was decreed as part of the original contract for the product, which I was not involved with (though was hired just after the project started and was therefore stuck with it ad infinitum).&nbsp;&nbsp; Web Services has its good points.&nbsp; Synchronous communication allows for RPC-styled usage, for example.&nbsp; But over the network synchronous communication can be very slow.<\/p>\n<p>We implement on top of JBoss because it&#8217;s free &#8211; plain and simple.&nbsp; The contract stipulated open source solutions.&nbsp;&nbsp;&nbsp; JBoss works quite well if you get your eggs all lined up.&nbsp; But configuration using XML is ridiculous.<\/p>\n<p>XML as a data transfer protocol or as a data store format is not a bad idea.&nbsp; Utilizing existing parsers you can manage just about any incoming data and decide if you want to muck with it.&nbsp; But use the right tool for the job.&nbsp; XML is EVERYWHERE in Web Services.&nbsp; SOAP, for one, really gets in my way.&nbsp; Mixed with database transactions I have a hell of time sending the data the way I&#8217;ve been told i can (as serialized objects).&nbsp; Without diving into details I&#8217;ll say that Web Services is supposed to make interactivity with different applications easier but I find it does nothing but make things more complicated.&nbsp; What started out as a standardization effort has turned into an implementation nightmare.&nbsp; In the end, we got the server running the way we want it and avoid touching it at all costs.&nbsp; We do have an exposed Web Services interface but have wrapped that around a Java API.&nbsp; It&#8217;s much easier to use an API that try to decipher XML.&nbsp; God help us when we migrate to JBoss 5.<\/p>\n<p>Don&#8217;t get me wrong, there are some good applications for the web out there.&nbsp; Wikis and blogs (specifically, WordPress) are excellent targeted applications.&nbsp; But these are the exceptions, not the rule.&nbsp; And remember that wikis and blogs are not for trying to sell the Internet.&nbsp; They are for providing information.&nbsp; Exactly what the Internet was designed for &#8211; data dissemination.<\/p>\n<p><span style=\"color: #993300;\"><em><strong>8.&nbsp;&nbsp; Evolution, not revolution<\/strong><\/em><\/span><\/p>\n<p>Open source is being run by children.&nbsp; What they don&#8217;t understand, or worse <em>don&#8217;t like<\/em>, they reinvent.&nbsp; The GTK+ project recently ran into this problem.&nbsp; GNOME is being sucked into the Mono world for no valid reason.&nbsp; But my biggest gripe is probably with the change to init.&nbsp; Fedora (among others) recently started using upstart.&nbsp; The goal of that project is to speed boot up time.&nbsp; F10 uses this to parallelize boot processes.&nbsp; Personally, I see no difference.&nbsp; Speeding the boot process is an admirable goal but I think switching to upstart was more revolution than evolution and really didn&#8217;t address the problem.<\/p>\n<p>But then maybe I should give them the benefit of the doubt and follow the three release rule.&nbsp; Every first release is a proof of concept.&nbsp; It shows that what you want to do can be done if not specifically the way its been done with the first release.&nbsp; The second release is a solid implementation based on sound planning that typically lacks important components that will, in the end, require major changes to the design.&nbsp; The third release is the one that will seriously evolve.&nbsp;&nbsp; Upstart, from the end-user point of view, is still in the first release.<\/p>\n<p>The three release rule has been very applicable to the many projects I&#8217;ve worked on over the years.&nbsp; We&#8217;re currently on release 2 of the grid software and I can point to areas that, while architected, were not well implemented and will require some redesign work next time around.&nbsp;&nbsp; Previous products included blade servers and network management software (reached release 3 but never had a detailed plan that could apply it directly to the three release rule), a robotic storage system (never left release 1), an interactive cable system (never got past release 2 due to poor management vision), and operating systems (got stuck in release 2 before the project was killed by the morons at Dell).&nbsp;&nbsp; In every case the project itself evolved internally but only the operating system was truly evolutionary software.&nbsp; Everything else attempted to be revolutionary.<\/p>\n<p>The problem with revolutionary is that people don&#8217;t like change.&nbsp; They want things to work they way they used to.&nbsp; Added complexity, even to improve performance, seldom goes over well with end users.&nbsp; You have to ease them into the transition.&nbsp; The less they see the transition the happier they are.&nbsp; Take the Linux desktop, for example.&nbsp; Why doesn&#8217;t it simply overtake the Windows desktop?&nbsp; It&#8217;s free.&nbsp; Isn&#8217;t that enough?&nbsp; No, it&#8217;s also different.&nbsp; Never mind if it works better or more efficiently.&nbsp; It simply works different.&nbsp; And most people are resistant to change.<\/p>\n<p>You have to let software evolve.&nbsp; Revolution is a bloody, destructive process and can only succeed when evolution fails absolutely.<\/p>\n<p><span style=\"color: #993300;\"><em><strong>7.&nbsp;&nbsp; Patents suck<\/strong><\/em><\/span><\/p>\n<p>This one is obvious.&nbsp; If you write software you know you&#8217;ve never invented anything new.&nbsp; You&#8217;ve always taken another idea and expanded upon it.&nbsp; That is the true nature of software and it will never change.&nbsp;&nbsp; We all stand on the shoulders of giants.&nbsp; Patents make giants stand alone in their fields.&nbsp;&nbsp; Good for the giants.&nbsp; Bad for software.&nbsp; Patents suck.<\/p>\n<p>The other big problem with patents is that they go completely against the grain of true engineers.&nbsp; Engineers revel in the knowledge the gain and they&#8217;re ability to share that knowledge.&nbsp; Patents hide knowledge.&nbsp; They limit engineers.&nbsp; Plain and simple.&nbsp;&nbsp; Patents are anti-knowledge.<\/p>\n<p><span style=\"color: #993300;\"><em><strong>6.&nbsp;&nbsp; Engineers can&#8217;t write. Or even communicate.<\/strong><\/em><\/span><\/p>\n<p>If you&#8217;re in school now and wonder why they hell you have to take English classes I ask you to simply read all the manuals you have or can get your fingers on for any software you use.&nbsp; And try to match what you read with what you use.&nbsp;&nbsp; In most cases, there is no alignment.&nbsp;&nbsp;&nbsp; That&#8217;s because software engineers can&#8217;t write.&nbsp; They can&#8217;t communicate, period.&nbsp; They know very little about how to explain what they do, or have done, to others.&nbsp; They get flustered when others don&#8217;t just get it.&nbsp;&nbsp;&nbsp; In the end, the software developer creates something that no one knows what to do with.<\/p>\n<p>Granted there are technical writers that have learned the fine art of translating geek-speak into human language.&nbsp; But that&#8217;s not enough.&nbsp; Software developers need to learn social skills.&nbsp; Starting with the spoken word, leading to the written word.&nbsp; Without this, you&#8217;ll never get past item #1 in this list.<\/p>\n<p><span style=\"color: #993300;\"><em><strong>5.&nbsp;&nbsp; If it&#8217;s too large to grasp, it&#8217;s too large period<\/strong><\/em><\/span><\/p>\n<p>If you can&#8217;t remember where in the code something happens, then you&#8217;ve built something that is too complex and will be too hard to maintain.&nbsp; This applies to C modules, Java classes, Makfiles and ant scripts, and any other type of code.&nbsp; Refactoring is the buzz word du jour for this problem, but good developers have a better way (see item #1).<\/p>\n<p>If you write software, learn the Unix way:&nbsp; small components linked together.&nbsp; Object oriented development helps here but the tools are only as good as the developer who uses them.&nbsp; Learn to break things down into the smallest pieces, and then build them up from there.<\/p>\n<p>One of the things I&#8217;ve discovered recently in my coding is the use of plugins.&nbsp; Dynamic extensibility is a good way to add features, but it&#8217;s also a good way to patch a system.&nbsp; If everything is a plugin, then you need only update the plugin, not the entire system (except for those rare cases where the core plugin management needs to be updated).&nbsp; But the use of plugins requires you to think seriously about how data moves through the system and how various software components access that data.&nbsp; This requires, once again, item #1.<\/p>\n<p><span style=\"color: #993300;\"><em><strong>4.&nbsp;&nbsp; Stocks are bad.&nbsp; Bonuses are not salary.<\/strong><\/em><\/span><\/p>\n<p>C&#8217;mon guys.&nbsp; The dollar signs practically killed our industry in 2000.&nbsp; If you&#8217;re an engineer it should be obvious to you:&nbsp; stock holders know nothing about quality.&nbsp; If you work for a public company &#8211; leave immediately.&nbsp; Start your own business and never, and I mean NEVER, go public.&nbsp; Not if you want to create insanely great products with people who have the same vested interest in success that you do.&nbsp; Profits belong to the workers, not external shareholders.&nbsp; Direction should be determined by the company, not outside financial deal makers.&nbsp; If you&#8217;re in this business to get rich, you&#8217;re in it for the wrong reasons.&nbsp; We&#8217;re not doctors and we&#8217;re not lawyers.&nbsp; We actually love what we do and would do it for free (which explains the open source phenomenon to a great extent).&nbsp;&nbsp;&nbsp; If you wouldn&#8217;t do it for free, switch to Wall Street.&nbsp; They&#8217;re more you&#8217;re style.<\/p>\n<p>And speaking of money, stop expecting bonuses.&nbsp; I worked for RLXTechnologies for a year and received bonuses every quarter.&nbsp; Very nice bonuses.&nbsp; From a company that had never, in seven years of angel investing and start-up capitalization, made a dime.&nbsp; It&#8217;s no wonder they shuttered the place on December 23rd.&nbsp; Seriously.&nbsp; Two days before Christmas.&nbsp; If it seems to good to be true, it is.&nbsp; Bonuses are for when times are good.&nbsp; Save the money for the times when they&#8217;re not.<\/p>\n<p>More important, make sure you work for someone who understands this.&nbsp; I work for someone who isn&#8217;t taking a salary yet.&nbsp; He&#8217;s building the company.&nbsp; He has&nbsp; a plan and it doesn&#8217;t include investors.&nbsp; He has a plan for the people who work for him.&nbsp; This is a good thing.&nbsp; A very good thing.&nbsp; It is the sole thing makes working on government projects tolerable.&nbsp; You want to know why the auto industry is failing?&nbsp; Because the people on the front lines didn&#8217;t pay attention to what the people in charge understood.&nbsp; The people on the front lines are just as much to blame for the industry&#8217;s failures.&nbsp; In their unions they had the power to make changes.&nbsp; But they didn&#8217;t.&nbsp; They simply protected their salaries and jobs.&nbsp; That&#8217;s not enough.&nbsp; You have to take a more active role.&nbsp; And you have to work for people who know that.<\/p>\n<p><span style=\"color: #993300;\"><em><strong>3.&nbsp;&nbsp; IDEs are crutches<\/strong><\/em><\/span><\/p>\n<p>I won&#8217;t belabor this point.&nbsp;&nbsp; Just get your hands dirty.&nbsp; Drag and drop coding teaches you nothing.&nbsp; If you don&#8217;t understand why things work, you&#8217;re only adding paint to a system.&nbsp; You&#8217;re aren&#8217;t reinforcing its infrastructure.<\/p>\n<p><span style=\"color: #993300;\"><em><strong>2.&nbsp;&nbsp; The code is never complete.&nbsp;&nbsp;&nbsp; Ship it anyway.<\/strong><\/em><\/span><\/p>\n<p>If you haven&#8217;t tried coding then you won&#8217;t understand this.&nbsp; But the idea that something that didn&#8217;t exist before and can control the outside world (physically, financially or emotionally) can be created by you simply by typing is mind-blowing.&nbsp;&nbsp; Tweaking is never ending.&nbsp; The code is never complete.&nbsp; You&#8217;ll always find something more to do to it.&nbsp; That&#8217;s the great part.<\/p>\n<p>The bad part is that your code is never complete.&nbsp; Unless you made serious plans, you don&#8217;t know when you can ship it.&nbsp; The users never know what they&#8217;re getting.&nbsp; And you, great developer that you are, are sucked into the rot of feature creep.<\/p>\n<p>The only way around this is a plan.&nbsp; Developers need plans.&nbsp;&nbsp; Detailed, mind numbing, wordy and over diagrammed plans.<\/p>\n<p><span style=\"color: #993300;\"><em><strong>1.&nbsp; Plan first, code later<\/strong><\/em><\/span><\/p>\n<p>Real project development is 90% planning, 10% coding.&nbsp; All those ideas about extreme programming are worthless without a plan.&nbsp; You can still code, try, recode, try again &#8211; in fact during implementation there is nothing to prevent using extreme programming ideas (if that&#8217;s what gets you off &#8211; it doesn&#8217;t me).&nbsp; But coding is the smallest part of the problem.&nbsp; If you have no idea where you&#8217;re headed or have any idea how long it&#8217;ll take to get there then you&#8217;re running on treadmill.&nbsp; You get lots of work done but you get nowhere.<\/p>\n<p>My first job was at BNR, now Nortel, as a software test engineer for a data communications product (that eventually died without seeing the light of day).&nbsp; I was taught to write a high level test plan describing what I hoped to achieve followed by detailed level test plans that implemented the actual tests.&nbsp; That first job taught me how important planning really is.&nbsp; Since then, I&#8217;ve always sketched out what I was trying to accomplish before writing any code.&nbsp; This wasn&#8217;t always detailed or formalized, but recently it has gotten extremely formal thanks, in part, to the use of wikis for project planning.&nbsp; I create diagrams (with Dia) to define software components, the outline a high level design to explain these components and their interaction.&nbsp; Finally, a detailed architecture explains how each component should be implemented, including external resources that should be integrated with them.<\/p>\n<p>This kind of planning makes coding very easy.&nbsp; And while I say that the planning is 90%, I mean that only in the amount of serious though that is required.&nbsp; You don&#8217;t necessarily code faster, you just code better because you know what you&#8217;re trying to achieve.&nbsp; In mind numbing detail, you know what you&#8217;re trying to achieve.<\/p>\n<p>Though I&#8217;m pushing the importance of the plan, I need to make it clear that the plan has to be flexible.&nbsp; If you can&#8217;t change the architecture you might code yourself into a corner and end up either breaking the three release rule or never reaching release 3.&nbsp; So make a plan, and stick to it.&nbsp; But only as much as is reasonably necessary.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>As the year grows to a close I find myself finishing up projects and preparing for the new year.&nbsp; I put together roughly 90,000 lines of code this year on a single project with one other developer, probably split somewhere around 80\/20.&nbsp; It is, as I&#8217;ve told him, our boss and my wife, the best [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"jetpack_post_was_ever_published":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false},"version":2}},"categories":[6],"tags":[55,634,48,623,53,635,52,619,627,54,629,617],"class_list":{"0":"post-203","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-software-development","7":"tag-dell","8":"tag-fedora","9":"tag-gnome","10":"tag-gtk","11":"tag-holiday","12":"tag-java","13":"tag-jni","14":"tag-linux","15":"tag-open-source","16":"tag-patents","17":"tag-wordpress","18":"tag-writing","19":"czr-hentry"},"jetpack_publicize_connections":[],"aioseo_notices":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/pe9t8-3h","jetpack_sharing_enabled":true,"jetpack-related-posts":[],"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/www.graphics-muse.org\/wp\/index.php?rest_route=\/wp\/v2\/posts\/203","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.graphics-muse.org\/wp\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.graphics-muse.org\/wp\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.graphics-muse.org\/wp\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.graphics-muse.org\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=203"}],"version-history":[{"count":5,"href":"https:\/\/www.graphics-muse.org\/wp\/index.php?rest_route=\/wp\/v2\/posts\/203\/revisions"}],"predecessor-version":[{"id":6228,"href":"https:\/\/www.graphics-muse.org\/wp\/index.php?rest_route=\/wp\/v2\/posts\/203\/revisions\/6228"}],"wp:attachment":[{"href":"https:\/\/www.graphics-muse.org\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=203"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.graphics-muse.org\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=203"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.graphics-muse.org\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=203"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}