<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>software-maintenance on S Anand</title>
    <link>https://www.s-anand.net/blog/tag/software-maintenance/</link>
    <description>Recent content in software-maintenance on S Anand</description>
    <generator>Hugo -- 0.164.0</generator>
    <language>en-us</language>
    <lastBuildDate>Tue, 19 May 2009 20:24:55 +0000</lastBuildDate>
    <atom:link href="https://www.s-anand.net/blog/tag/software-maintenance/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Organisational amnesia</title>
      <link>https://www.s-anand.net/blog/organisational-amnesia/</link>
      <pubDate>Tue, 19 May 2009 20:23:36 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/organisational-amnesia/</guid>
      <description>&lt;p&gt;It’s amazing how much of a dependency there is on individuals writing IT systems. Reminds me of that &lt;a href=&#34;http://dilbert-search.appspot.com/dilbert/19940610&#34;&gt;Dilbert strip&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.s-anand.net/blog/assets/flickr-19940610_3545523502_o-gif.webp&#34; title=&#34;Dilbert: 1994-06-10&#34;&gt;&lt;img alt=&#34;19940610&#34; loading=&#34;lazy&#34; src=&#34;https://www.s-anand.net/blog/assets/flickr-19940610_3545523502_o-gif.webp&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A few weeks ago, I was trying to figure out in what happens when there are multiple promotions. (Our client is a retailer.) I mean, if there’s a phone that costs £100 and there are 2 promotions: 10% off on phones and £10 off on phones. Do you apply the 10% off first and pay £80 or the £10 off and pay £81?&lt;/p&gt;
&lt;p&gt;Funnily enough, the organisational answer is, “I don’t know.” The person who determined the logic is no longer with the firm. The person who wrote the code was a contractor and moved on to another project. The vendor hadn’t gotten around to documenting the code. Sure, the code’s &lt;strong&gt;there&lt;/strong&gt;, and you just had to read it to figure out what it does. But no human knew what it was supposed to do.&lt;/p&gt;
&lt;p&gt;Last week, there was a decision to rewrite some code that was 10 years old. A colleague who wasn’t quite involved in this work said, “I’m going to have to set aside 2-3 weeks for this. I wrote this stuff when I was a developer. The docs have vanished. The business owners have vanished. I’m the only one who has any clue on what it’s supposed to do.”&lt;/p&gt;
&lt;p&gt;This week, we were trying to figure out how their store locator system works. After fiddling around with &lt;a href=&#34;http://www.fiddler2.com/&#34;&gt;Fiddler&lt;/a&gt;, and seeing that it used Microsoft Virtual Earth, I was able to figure out that it identified stores near a location using a simple JSON API. But can we get the documentation around that? Nope. Tough luck. Nobody knows how it works any longer.&lt;/p&gt;
&lt;p&gt;Personally, I don’t think this is unusual. We forget. Companies forget. But it’s usually good if what we forget is derivable. That’s how I got through my high-school physics exams: not by remembering stuff, but by being able to derive the stuff from a few principles.&lt;/p&gt;
&lt;p&gt;Organisations can do the same. But to be able to do that, you need to have commonly understood principles. As Fred Brooks put it in &lt;strong&gt;The Mythical Man Month&lt;/strong&gt;,&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I contend that conceptual integrity is the most important consideration in system design. It is better to have a system omit certain anomalous features and improvements, but to reflect one set of design ideas, than to have one that contains many good but independent and uncoordinated ideas.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;One of the biggest enemies of conceptual integrity is growth. Too many people too soon, and the important decisions are taken by people who’ve never had a long chat about things. There’s another reason not to grow too fast.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;comments&#34;&gt;Comments&lt;/h2&gt;
&lt;!-- wp-comments-start --&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Kalpesh&lt;/strong&gt; &lt;em&gt;20 May 2009 2:27 am&lt;/em&gt;:
I guess, it should help having a debug log of things as the code is executed &amp;amp; the decision made in the code based on the data available.
e.g. the code will put the log (conditionally)
gave 10% discount, thus derived value of 90 (100 - 10)
reducing $10 of the calculated value above = 80 (90 - 10)
Basically, having a log of the sequence of steps, the state on which the code relies, input any function takes and output thereafter (but in a user understandable manner or in business language).
One step closer to this could be writing code in a language that is relevant to business
I feel we still write our code in terms of technology (arrays, exceptions, serializations etc).
I don&amp;rsquo;t mean that we should not worry about those things. But, those things should be covered under a layer which makes easy for business people OR a new comer to come back to the code and read it like a specification.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;http://nagarjunv.blogspot.com&#34;&gt;Nagarjun&lt;/a&gt;&lt;/strong&gt; &lt;em&gt;13 Dec 2009 10:50 am&lt;/em&gt;:
We faced same situation while trying to find out how the comission is calculated. In the end it so happened that the commision was being calculated based on data that was 5 years old. Nobody had realised that the new data was not comin into the system :)&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- wp-comments-end --&gt;
</description>
    </item>
    <item>
      <title>Programming theorems</title>
      <link>https://www.s-anand.net/blog/programming-theorems/</link>
      <pubDate>Wed, 08 Nov 2006 12:00:00 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/programming-theorems/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.minds.nuim.ie/~dez/serendipity/index.php?/archives/102-Programming-Theorems.html&#34;&gt;Programming theorems&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The likelihood of Perl being involved in a system is directly proportional to the length of time the system has been in maintenance.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Every 5 minutes you spend writing code in a new language is more useful than 5 hours reading blog posts about how great the language is.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Think twice before presuming that CSV is a nice little easy file format. (see &lt;a href=&#34;http://secretgeek.net/csv_trouble.asp&#34;&gt;Leon&lt;/a&gt;)&lt;/p&gt;
&lt;/blockquote&gt;
</description>
    </item>
    <item>
      <title>Facts and Fallacies in Software Engineering</title>
      <link>https://www.s-anand.net/blog/facts-and-fallacies-in-software-engineering/</link>
      <pubDate>Tue, 22 Aug 2006 12:00:00 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/facts-and-fallacies-in-software-engineering/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.informit.com/articles/article.asp?p=30091&amp;amp;rl=1&#34;&gt;Facts in Software Engineering&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;People&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The most important factor in software work is the quality of the programmers.&lt;/li&gt;
&lt;li&gt;The best programmers are up to 28 times better than the worst programmers.&lt;/li&gt;
&lt;li&gt;Adding people to a late project makes it later.&lt;/li&gt;
&lt;li&gt;The working environment has a profound impact on productivity and quality.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Tools and Techniques&lt;/strong&gt;&lt;/p&gt;
&lt;ol start=&#34;5&#34;&gt;
&lt;li&gt;Hype (about tools and techniques) is the plague on the house of software.&lt;/li&gt;
&lt;li&gt;New tools/techniques cause an initial loss of productivity/quality.&lt;/li&gt;
&lt;li&gt;Software developers talk a lot about tools, but seldom use them.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Estimation&lt;/strong&gt;&lt;/p&gt;
&lt;ol start=&#34;8&#34;&gt;
&lt;li&gt;One of the two most common causes of runaway projects is poor estimation.&lt;/li&gt;
&lt;li&gt;Software estimation usually occurs at the wrong time.&lt;/li&gt;
&lt;li&gt;Software estimation is usually done by the wrong people.&lt;/li&gt;
&lt;li&gt;Software estimates are rarely corrected as the project proceeds.&lt;/li&gt;
&lt;li&gt;It is not surprising that software estimates are bad. But we live and die by them anyway!&lt;/li&gt;
&lt;li&gt;There is a disconnect between software management and their programmers.&lt;/li&gt;
&lt;li&gt;The answer to a feasibility study is almost always &amp;ldquo;yes&amp;rdquo;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Reuse&lt;/strong&gt;&lt;/p&gt;
&lt;ol start=&#34;15&#34;&gt;
&lt;li&gt;Reuse-in-the-small is a well-solved problem.&lt;/li&gt;
&lt;li&gt;Reuse-in-the-large remains a mostly unsolved problem.&lt;/li&gt;
&lt;li&gt;Reuse-in-the-large works best for families of related systems.&lt;/li&gt;
&lt;li&gt;Reusable components are three times as hard to build, and should be tried out in three settings.&lt;/li&gt;
&lt;li&gt;Modification of reused code is particularly error-prone.&lt;/li&gt;
&lt;li&gt;Design pattern reuse is one solution to the problems of code reuse.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Complexity&lt;/strong&gt;&lt;/p&gt;
&lt;ol start=&#34;21&#34;&gt;
&lt;li&gt;For every 25 percent increase in problem complexity, there is a 100 percent increase in solution complexity.&lt;/li&gt;
&lt;li&gt;Eighty percent of software work is intellectual. A fair amount of it is creative. Little of it is clerical.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Requirements&lt;/strong&gt;&lt;/p&gt;
&lt;ol start=&#34;23&#34;&gt;
&lt;li&gt;One of the two most common causes of runaway projects is unstable requirements.&lt;/li&gt;
&lt;li&gt;Requirements errors are the most expensive to fix during production.&lt;/li&gt;
&lt;li&gt;Missing requirements are the hardest requirements errors to correct.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Design&lt;/strong&gt;&lt;/p&gt;
&lt;ol start=&#34;26&#34;&gt;
&lt;li&gt;Explicit requirements &amp;ldquo;explode&amp;rdquo; as implicit (design) requirements for a solution evolve.&lt;/li&gt;
&lt;li&gt;There is seldom one best design solution to a software problem.&lt;/li&gt;
&lt;li&gt;Design is a complex, iterative process. Initial design solutions are usually wrong, and certainly not optimal.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Coding&lt;/strong&gt;&lt;/p&gt;
&lt;ol start=&#34;29&#34;&gt;
&lt;li&gt;Designer &amp;ldquo;primitives&amp;rdquo; (solutions they can readily code) rarely match programmer &amp;ldquo;primitives&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;COBOL is a very bad language, but all the others (for business applications) are so much worse.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Error-removal&lt;/strong&gt;&lt;/p&gt;
&lt;ol start=&#34;31&#34;&gt;
&lt;li&gt;Error-removal is the most time-consuming phase of the life cycle.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Testing&lt;/strong&gt;&lt;/p&gt;
&lt;ol start=&#34;32&#34;&gt;
&lt;li&gt;Software is usually tested at best at the 55-60 percent (branch) coverage level.&lt;/li&gt;
&lt;li&gt;100 percent coverage is still far from enough.&lt;/li&gt;
&lt;li&gt;Test tools are essential, but many are rarely used.&lt;/li&gt;
&lt;li&gt;Test automation rarely is. Most testing activities cannot be automated.&lt;/li&gt;
&lt;li&gt;Programmer-created, built-in, debug code is an important supplement to testing tools.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Reviews/Inspections&lt;/strong&gt;&lt;/p&gt;
&lt;ol start=&#34;37&#34;&gt;
&lt;li&gt;Rigorous inspections can remove up to 90 percent of errors before the first test case is run.&lt;/li&gt;
&lt;li&gt;But rigorous inspections should not replace testing.&lt;/li&gt;
&lt;li&gt;Post-delivery reviews (some call them &amp;ldquo;retrospectives&amp;rdquo;) are important, and seldom performed.&lt;/li&gt;
&lt;li&gt;Reviews are both technical and sociological, and both factors must be accommodated.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Maintenance&lt;/strong&gt;&lt;/p&gt;
&lt;ol start=&#34;41&#34;&gt;
&lt;li&gt;Maintenance typically consumes 40-80 percent of software costs. It is probably the most important life cycle phase of software.&lt;/li&gt;
&lt;li&gt;Enhancements represent roughly 60 percent of maintenance costs.&lt;/li&gt;
&lt;li&gt;Maintenance is a solution, not a problem.&lt;/li&gt;
&lt;li&gt;Understanding the existing product is the most difficult task of maintenance.&lt;/li&gt;
&lt;li&gt;Better methods lead to MORE maintenance, not less.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Quality&lt;/strong&gt;&lt;/p&gt;
&lt;ol start=&#34;46&#34;&gt;
&lt;li&gt;Quality IS: a collection of attributes.&lt;/li&gt;
&lt;li&gt;Quality is NOT: user satisfaction, meeting requirements, achieving cost/schedule, or reliability.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Reliability&lt;/strong&gt;&lt;/p&gt;
&lt;ol start=&#34;48&#34;&gt;
&lt;li&gt;There are errors that most programmers tend to make.&lt;/li&gt;
&lt;li&gt;Errors tend to cluster.&lt;/li&gt;
&lt;li&gt;There is no single best approach to software error removal.&lt;/li&gt;
&lt;li&gt;Residual errors will always persist. The goal should be to minimize or eliminate severe errors.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Efficiency&lt;/strong&gt;&lt;/p&gt;
&lt;ol start=&#34;52&#34;&gt;
&lt;li&gt;Efficiency stems more from good design than good coding.&lt;/li&gt;
&lt;li&gt;High-order-language code can be about 90 percent as efficient as comparable assembler code.&lt;/li&gt;
&lt;li&gt;There are tradeoffs between size and time optimization.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;About Research&lt;/strong&gt;&lt;/p&gt;
&lt;ol start=&#34;55&#34;&gt;
&lt;li&gt;Many researchers advocate rather than investigate.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href=&#34;http://www.informit.com/articles/article.asp?p=30032&amp;amp;rl=1&#34;&gt;Fallacies in Software Engineering&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;About Management&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Fallacy: You can&amp;rsquo;t manage what you can&amp;rsquo;t measure.&lt;/li&gt;
&lt;li&gt;Fallacy: You can manage quality into a software product.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;People&lt;/strong&gt;&lt;/p&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;Fallacy: Programming can and should be egoless.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Tools and Techniques&lt;/strong&gt;&lt;/p&gt;
&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;Fallacy: Tools and techniques: one size fits all.&lt;/li&gt;
&lt;li&gt;Fallacy: Software needs more methodologies.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Estimation&lt;/strong&gt;&lt;/p&gt;
&lt;ol start=&#34;6&#34;&gt;
&lt;li&gt;Fallacy: To estimate cost and schedule, first estimate lines of code.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Testing&lt;/strong&gt;&lt;/p&gt;
&lt;ol start=&#34;7&#34;&gt;
&lt;li&gt;Fallacy: Random test input is a good way to optimize testing.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Reviews&lt;/strong&gt;&lt;/p&gt;
&lt;ol start=&#34;8&#34;&gt;
&lt;li&gt;Fallacy: &amp;ldquo;Given enough eyeballs, all bugs are shallow&amp;rdquo;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Maintenance&lt;/strong&gt;&lt;/p&gt;
&lt;ol start=&#34;9&#34;&gt;
&lt;li&gt;Fallacy: The way to predict future maintenance cost and to make product replacement decisions is to look at past cost data.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;About Education&lt;/strong&gt;&lt;/p&gt;
&lt;ol start=&#34;10&#34;&gt;
&lt;li&gt;Fallacy: You teach people how to program by showing them how to write programs.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;These are from Robert Glass&amp;rsquo; book &lt;a href=&#34;http://www.amazon.com/gp/product/0321117425/?tag=sanand-20&#34;&gt;Facts and Fallacies in Software Engineering&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
  </channel>
</rss>
