<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5704901458470135557</id><updated>2012-01-12T08:58:08.922-08:00</updated><category term='sca source code analysis'/><category term='fixing bugs audit priority'/><category term='challenges'/><category term='backlog static analysis'/><category term='continuous integration'/><category term='agile software development'/><category term='usage'/><category term='incentives'/><category term='consequences'/><title type='text'>Code Integrity Blog</title><subtitle type='html'>Code Integrity Solutions (CIS) is a professional services firm that helps customer get the most out of their source code analysis and build tools investment.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://codeintegrity.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://codeintegrity.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Andy</name><uri>http://www.blogger.com/profile/06705630945588101293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>51</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5704901458470135557.post-7528734146169413791</id><published>2011-06-10T17:01:00.000-07:00</published><updated>2011-06-10T17:02:24.140-07:00</updated><title type='text'>The Speed of Development</title><content type='html'>We were recently working with a company that had a very large codebase.&amp;nbsp; It took 2 hours to build and took another 4 to 24 hours to run a variety of tests such as unit tests and static analysis.&amp;nbsp; Developers were doing full builds locally on their sad, underpowered machines.&amp;nbsp; In this time of multi-core computing, developers were doing parallel computing the old fashion way:&amp;nbsp; using the lengthy build and test time to catch up on email.&lt;br /&gt;&lt;br /&gt;In the worst case, you find a problem that you need to fix.&amp;nbsp; Guess what? Verifying whether the fix was sufficient creates yet another cycle.&amp;nbsp; Not only that, if the build systems have a problem, the turnaround on fixing those problems can literally fritter away critical days from the development cycle. Enlightened companies realize that this is a lot of time wasted but most importantly, creates a latency to the information you need to move code toward the finish line.&amp;nbsp; If you are going to fail, you should fail fast so you can fix it quickly.&lt;br /&gt;&lt;br /&gt;Software is complex and brittle.&amp;nbsp; Not surprisingly, the infrastructure to build and test and manage the software can be similarly unreliable.&amp;nbsp; There is good reason:&amp;nbsp; software systems must support many multiple operating systems, integrations and devices and development cycle times have been compressed with Agile methodology.&lt;br /&gt;&lt;br /&gt;After this company spent effort (and some hardware) to move their build to 15 minutes and all of their tests to run in 5 hours, their developers could at least get same day response times.&amp;nbsp; One more iteration meant that higher quality features could be checked in faster making their developers more productive.&lt;br /&gt;&lt;br /&gt;They created a rough matrix: &lt;br /&gt;&lt;br /&gt;Build/Test&lt;br /&gt;========&lt;br /&gt;15 minute = "immediate" feedback&lt;br /&gt;30 minute = basically "on demand"&lt;br /&gt;1 hour -&amp;gt; 3 hours = run multiple times per day&lt;br /&gt;4 hours -&amp;gt; 6 hours = potentially same day response time&lt;br /&gt;7 hours -&amp;gt; 14 hours = overnight process (ready by next morning)&lt;br /&gt;&lt;br /&gt;Their next goal, through further optimizations was to get to multiple times per day.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5704901458470135557-7528734146169413791?l=codeintegrity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeintegrity.blogspot.com/feeds/7528734146169413791/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeintegrity.blogspot.com/2011/06/speed-of-development.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/7528734146169413791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/7528734146169413791'/><link rel='alternate' type='text/html' href='http://codeintegrity.blogspot.com/2011/06/speed-of-development.html' title='The Speed of Development'/><author><name>Andy</name><uri>http://www.blogger.com/profile/06705630945588101293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5704901458470135557.post-4615793006932040868</id><published>2011-05-27T16:26:00.000-07:00</published><updated>2011-05-27T16:26:53.389-07:00</updated><title type='text'>Building a Better Build System</title><content type='html'>Here's an interesting and lengthy interview with Peter Smith, author of a new book, Software Build Systems: Principles and Experiences.&amp;nbsp; For the full interview, please see this &lt;a href="http://www.informit.com/articles/article.aspx?p=1702971"&gt;link&lt;/a&gt;: &lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.informit.com/articles/article.aspx?p=1702971"&gt;http://www.informit.com/articles/article.aspx?p=1702971&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5704901458470135557-4615793006932040868?l=codeintegrity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeintegrity.blogspot.com/feeds/4615793006932040868/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeintegrity.blogspot.com/2011/05/building-better-build-system.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/4615793006932040868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/4615793006932040868'/><link rel='alternate' type='text/html' href='http://codeintegrity.blogspot.com/2011/05/building-better-build-system.html' title='Building a Better Build System'/><author><name>Andy</name><uri>http://www.blogger.com/profile/06705630945588101293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5704901458470135557.post-5624049405239459638</id><published>2011-04-07T14:07:00.000-07:00</published><updated>2011-04-07T14:07:15.989-07:00</updated><title type='text'>Another Tuning Story...</title><content type='html'>One customer that we worked with in the past has a medium sized codebase that handles financial-based transactions.&amp;nbsp; Their business deals with a lot of money and is highly regulated. Management has very high expectations that their software development team build their products with superior quality.&amp;nbsp; Not surprisingly they have turned to many modern techniques and technologies to keep up with the pace and scale of development.&amp;nbsp; They began using source code analysis a few years ago in order to detect and fix problems before release.&lt;br /&gt;&lt;br /&gt;In their first run alone, the source code analysis tool reported over 20,000 potential defects.&amp;nbsp; They didn't know where to begin.&amp;nbsp; Even if it took 1 minute to go over each defect it would take over 40 business days to complete.&amp;nbsp; Realistically to query up the result, understand the defect report in the code, prioritize and document it briefly would take more on the order of 5-10 minutes per issue.&amp;nbsp; That's of course averaging the occasional really easy issue and really difficult issue.&amp;nbsp; At 7.5 minutes per issue that becomes 312 business days -- a significant investment by any standard.&amp;nbsp; Of course static analysis is one of the best ways to improve the systemic quality of your code as it is much less expensive to find and fix problems before release.&lt;br /&gt;&lt;br /&gt;But there is a better way than using brute force to fix static analysis defects.&amp;nbsp; Tuning the analysis almost always results in significant improvements in the analysis quality, which means fewer false defects and more real defects.&amp;nbsp; After just a couple of days with this customer we knocked their queue down to about 9000 defects.&amp;nbsp; Actually, we knocked it down to about 8000 defects but then found an additional 1000 new defects that weren't being detected before.&amp;nbsp; The time savings, as you can imagine are large. The psychological effect was even better.&amp;nbsp; Although 9000 is still a mountain to climb, it's psychologically a lot better to hike up Kilimanjaro than scale Mount Everest.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5704901458470135557-5624049405239459638?l=codeintegrity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeintegrity.blogspot.com/feeds/5624049405239459638/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeintegrity.blogspot.com/2011/04/another-tuning-story.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/5624049405239459638'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/5624049405239459638'/><link rel='alternate' type='text/html' href='http://codeintegrity.blogspot.com/2011/04/another-tuning-story.html' title='Another Tuning Story...'/><author><name>Andy</name><uri>http://www.blogger.com/profile/06705630945588101293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5704901458470135557.post-3232027703791268963</id><published>2011-03-11T21:23:00.007-08:00</published><updated>2011-03-11T21:23:30.970-08:00</updated><title type='text'>Power to the Developer</title><content type='html'>Increasingly, we've seen software development organizations wanting  to give power to their developers to find and fix problems prior to  check-in.&amp;nbsp; There are several very good reasons for this:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;If  management has instituted an acceptance criteria - such as no new static  analysis defects, then naturally developers will be evaluated based on  whether they fix static analysis defects.&amp;nbsp; A developer analysis gives  power to the developers to find and fix problems locally before it  becomes publicly visible in a system analysis.&lt;/li&gt;&lt;li&gt;Finding and fixing problems before check-in makes the codeline  higher quality.&amp;nbsp; Rather than checking in potential bugs, the code can be  cleaned earlier.&amp;nbsp; Everyone pulls from higher quality code, particularly  in agile and continuous integration environments.&lt;/li&gt;&lt;li&gt;Giving developers analysis results right when they want it increases  efficiency.&amp;nbsp; Rather than waiting for the nightly or even weekly  results, minimizes context switching.&amp;nbsp; In addition, fixing a problem can  generate another problem.&amp;nbsp; Being able to iterate multiple times quickly  at one time is much more efficient than fixing and then waiting a day  or even a week to see if no new problem has been created.&lt;/li&gt;&lt;/ul&gt;&amp;nbsp;Of course working from the desktop may require more  coordination.&amp;nbsp; You have to ensure that the analysis being used locally  is the same as being used for the system build -- consistency ensures  that everyone is working towards the same goal.&amp;nbsp; Generally, you don't  want developers to be analyzing either more or less than the established  criteria.&amp;nbsp; Also system analyses can generate some different bugs than  the desktop analysis - most of the times very slightly.&amp;nbsp; This is natural  because the system analysis usually has more complete information and  thus has better analyses at its disposal.&amp;nbsp; Still, this can cause  confusion when a developer analysis doesn't pick up something that the  system analysis picked up.&lt;br /&gt;&lt;br /&gt;Desktop analysis is also an  extra flow that requires additional time and training.&amp;nbsp; However, many  would say that it is a small price to pay given the benefits.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5704901458470135557-3232027703791268963?l=codeintegrity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeintegrity.blogspot.com/feeds/3232027703791268963/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeintegrity.blogspot.com/2011/03/power-to-developer_11.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/3232027703791268963'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/3232027703791268963'/><link rel='alternate' type='text/html' href='http://codeintegrity.blogspot.com/2011/03/power-to-developer_11.html' title='Power to the Developer'/><author><name>Andy</name><uri>http://www.blogger.com/profile/06705630945588101293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5704901458470135557.post-3116982454971588475</id><published>2011-01-11T12:37:00.000-08:00</published><updated>2011-01-11T12:37:25.832-08:00</updated><title type='text'>Managing Branches in Static Analysis</title><content type='html'>In some respects, making software isn't much different than making sausage - it's messy and most would rather skip the details.&amp;nbsp; For those that choose the software development career, you have to live it everyday.&amp;nbsp; One area where I've seen significant mess is in the management of branches.&amp;nbsp; Delivery of software is seldom a one-time effort - with future versions expected to be delivered frequently.&amp;nbsp; Add to that the complexity of:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;software being available on different platforms and operating systems&lt;/li&gt;&lt;li&gt;emergency software patches being made available&lt;/li&gt;&lt;li&gt;different versions of the software customized to specific customers&lt;/li&gt;&lt;li&gt;new major updates/rearchitectures/research simultaneously in the works as a production version&lt;/li&gt;&lt;/ul&gt;Pretty soon you may have branches all over the place.&amp;nbsp; Most organizations have a main branch which is the "gold master" with development branches being forked from it.&amp;nbsp; Many organizations will make it a requirement that the main branch should be release ready at any time.&amp;nbsp; Some organizations won't even allow edits on the main branch, instead requiring all changes to be made in forked development branch from the main branch.&amp;nbsp; Other organizations have developers happily chipping away at the main branch as well as creating multiple branches that may eventually be released.&amp;nbsp; Chaos ensues in these environments.&lt;br /&gt;&lt;br /&gt;For those organizations that at least have a main and development branches, changes can be tested in the development branch prior to merge into the main branch.&amp;nbsp; Of course there may have been other merges that have taken place during the time that development branch was worked on and thus integration can be painful.&amp;nbsp; Software has lots of dependencies and when the assumptions are changed, software breaks in unpredictable ways.&lt;br /&gt;&lt;br /&gt;The increasingly popular continuous integration process is designed to limit the pain of branch integration by doing it early and often.&amp;nbsp; Hand in hand with Agile, continuous integration has reduced the risk of complexity and therefore delay in releasing software.&lt;br /&gt;&lt;br /&gt;Where does static analysis fit in?&lt;br /&gt;&lt;br /&gt;There are lots of places where you can run the analysis.&amp;nbsp; You can run it regularly on the main branch (which probably already has a nightly scheduled build or continuous integration process).&amp;nbsp; This is a great way to quickly find out if something has broken, particularly during a merge.&lt;br /&gt;&lt;br /&gt;Some organizations want to run it also on development branches - in a sense, creating a no new defects policy from branch pull to branch integration.&amp;nbsp; Of course when the development branch merges back into main, an analysis should be performed as part of the testing to see what breaks when things get merged.&amp;nbsp; This can be done on a manual basis.&lt;br /&gt;&lt;br /&gt;Performing analysis on the development branch may not be entirely required -- it depends on when you want to be made aware of problems and when you want to enforce your acceptance criteria.&amp;nbsp; Analyzing every development branch will add to the IT costs as you will need more hardware to run the analyses on development branches.&amp;nbsp; For some organizations this is overkill - for others this is essential as their branches may be long lived and they need to meet their criteria as early as possible.&lt;br /&gt;&lt;br /&gt;One additional way to still have the acceptance criteria enforced at the main branch but still enable developers to find and fix problems as they develop in the development branches is to have developers analyze the code they are working on in their own desktops.&amp;nbsp; Some static analysis tools provide a "desktop" version of their tool so that developers have the power to analyze the code they are working on and iteratively fix problems well in advance of a merge.&amp;nbsp; This enables them to find and fix problems early.&amp;nbsp; However, one must keep in mind that the development branch and particularly the code being worked on by a specific developer may vary quite a bit from the main branch and thus not all problems can be found at the desktop.&amp;nbsp; Frequent merging should help solve that problem.&amp;nbsp; Regardless, doing some analysis on the development branches enables developers to fix problems sooner which pays off in higher quality software earlier and better productivity.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5704901458470135557-3116982454971588475?l=codeintegrity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeintegrity.blogspot.com/feeds/3116982454971588475/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeintegrity.blogspot.com/2011/01/managing-branches-in-static-analysis.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/3116982454971588475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/3116982454971588475'/><link rel='alternate' type='text/html' href='http://codeintegrity.blogspot.com/2011/01/managing-branches-in-static-analysis.html' title='Managing Branches in Static Analysis'/><author><name>Andy</name><uri>http://www.blogger.com/profile/06705630945588101293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5704901458470135557.post-2081600569181987406</id><published>2010-12-15T14:27:00.000-08:00</published><updated>2010-12-15T14:27:30.395-08:00</updated><title type='text'>Static Analysis Reporting For Success</title><content type='html'>When looking at effective reporting with static analysis, you have to consider the following:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Who is the audience of the information?&lt;/li&gt;&lt;li&gt;How do you turn data into actionable information?&lt;/li&gt;&lt;li&gt;How does the information support business goals?&lt;/li&gt;&lt;li&gt;How is this information delivered?&lt;/li&gt;&lt;/ul&gt;Static analysis improves software quality and security and so there are a number of potential "actors" that are affected by the information.&amp;nbsp; These may include:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;CEO/CTO&lt;/li&gt;&lt;li&gt;VP of Engineering, VP of Products&lt;/li&gt;&lt;li&gt;Director of Engineering, QA&lt;/li&gt;&lt;li&gt;Manager of Engineering, QA&lt;/li&gt;&lt;li&gt;Director of Tools, Infrastructure, Build/Release&lt;/li&gt;&lt;li&gt;Manager of Tools, Infrastructure, Build/Release&lt;/li&gt;&lt;li&gt;Architect&lt;/li&gt;&lt;li&gt;Engineer / Developer / Programmer&lt;/li&gt;&lt;li&gt;Tools, Build/Release Engineer&lt;/li&gt;&lt;li&gt;QA Engineer&lt;/li&gt;&lt;li&gt;Governance / Compliance Analyst&lt;/li&gt;&lt;li&gt;Product Manager&lt;/li&gt;&lt;/ul&gt;Each individual has a stake in the successful usage of static analysis. Each constituent has their piece of the puzzle to manage or be aware of.&amp;nbsp; We unfortunately do not have room in the blog post to cover each of these roles.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Business Goals&lt;/b&gt;&lt;br /&gt;Creating metrics without business goals as a framework will create wasted cycles, missing information and superfluous data.&amp;nbsp; Some common business goals that we see for static analysis are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;No static analysis defects in code (sometimes called "Clean") &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;ul&gt;&lt;li&gt;The business goal is to improve software quality and security by addressing all potential issues reported by static analysis.&lt;/li&gt;&lt;li&gt;Variations of this include:&amp;nbsp; "no critical or high priority issues" or no defects in a particular safety-critical component of the code&lt;/li&gt;&lt;li&gt;This often requires it to be "managed" down, meaning that there should be planned downward slope to the number of defects.&lt;/li&gt;&lt;li&gt;Targets may be established at certain milestones, for instance,  the number of defects should be reduced by 10% for every release or  month.&amp;nbsp; Possibly only the high and critical defects would be managed in this way.&lt;/li&gt;&lt;li&gt;Some organizations even manage down "false positives" with the goal that the code should be written so cleanly that a static analyzer couldn't be confused. &lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;No new defects (sometimes called "No new harm") &lt;br /&gt;&lt;ul&gt;&lt;li&gt;The business goal is to at least keep software quality and security at status quo.&amp;nbsp; The business argument is that new code tends to be the buggiest and that legacy code has already had a chance to be "exercised."&lt;/li&gt;&lt;li&gt;Variations of this include:&amp;nbsp; "no new critical or high priority issues" or no new defects in a particular safety-critical component of the code.&amp;nbsp; Complexity metrics can also be used as indicators of trouble areas. &lt;/li&gt;&lt;li&gt;A baseline should be established (such as the beginning of a branch pull) and all new defects (or a high and critical subset) introduced through changes in the code should be fixed&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Improve Quality and Security Through Voluntary Usage&lt;/li&gt;&lt;ul&gt;&lt;li&gt;The business goal is to provide a convenience to the developers to optionally fix software problems.&amp;nbsp; In practice though, usage typically decreases over time.&lt;/li&gt;&lt;li&gt;Total number of defects fixed should be reported in order to quantify tool's worth &lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Benchmark Against Competition&lt;/li&gt;&lt;ul&gt;&lt;li&gt;The business goal is to be at parity or better than the industry benchmarks&lt;/li&gt;&lt;li&gt;Defect density's are compared to publicly available data, such as open source.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;b&gt;Sample Reports&lt;/b&gt;&lt;br /&gt;&lt;b&gt; &lt;/b&gt;&lt;br /&gt;The number and types of reports that organizations use to more effectively use static analysis is too numerous to put in blog or article form.&amp;nbsp; We include just a few report concepts to give you an idea of the type of reporting that has proven useful to organizations:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Executive Dashboard&lt;/i&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Number of defects outstanding in current development branch.&amp;nbsp; Defects of course are likely to be the types of defects that are required to be fixed as part of an acceptance criteria.&lt;/li&gt;&lt;li&gt;Trend of high priority defects that have been reported and that have been fixed since the branch pull.&amp;nbsp; Graph with pretty pictures always impress executives.&lt;/li&gt;&lt;li&gt;Benchmark of quality level compared to industry standards&lt;/li&gt;&lt;li&gt;Defect density (current and trend)&lt;/li&gt;&lt;li&gt;Latest analysis run statistics - was it broken?&amp;nbsp; How much coverage was there?&lt;/li&gt;&lt;/ul&gt;&lt;i&gt;Managerial dashboard&lt;/i&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Number of new defects reported since yesterday&lt;/li&gt;&lt;li&gt;Number of open defects for each component owner&lt;/li&gt;&lt;li&gt;Ranked list of number of fixes by component and by developer&lt;/li&gt;&lt;li&gt;Trend in complexity and defect type&lt;/li&gt;&lt;li&gt;False positive rate overall and by component and by developer&lt;/li&gt;&lt;li&gt;List of open defects by priority and by age&lt;/li&gt;&lt;/ul&gt;&lt;i&gt;Administrator dashboard&lt;/i&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Latest build statistics including lines of code analyzed, number of new defects, analysis times, coverage statistics&lt;/li&gt;&lt;li&gt;New false positives marked to review for configuration changes&lt;/li&gt;&lt;li&gt;Alerts for broken builds or builds that exceed certain performance and coverage thresholds&lt;/li&gt;&lt;/ul&gt;&lt;i&gt;Architects&lt;/i&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Complexity trend over time&lt;/li&gt;&lt;li&gt;Ranking of complexity by function&lt;/li&gt;&lt;li&gt;New false positives marked for review to audit&lt;/li&gt;&lt;li&gt;Defect density by component&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;i&gt;Developers&lt;/i&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt; New defects introduced in my code&lt;/li&gt;&lt;li&gt;Outstanding defects in my queue&lt;/li&gt;&lt;li&gt; Code complexity for my code&lt;/li&gt;&lt;li&gt;Benchmarks against other developers in my company&lt;/li&gt;&lt;/ul&gt;And much, much more.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Information Delivery&lt;/b&gt;&lt;br /&gt;How information is received plays an important role in how usable the system is.&amp;nbsp; In general, utilize whatever existing process flows exist - for instance:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Generate email as alerts with a link to get to the details&lt;/li&gt;&lt;li&gt;Create a new bug tracking entry for new defects (if they meet a specific criteria).&amp;nbsp; Some organizations group static analysis bugs into a single bug tracking entry&lt;/li&gt;&lt;li&gt;Display information in an existing continuous integration dashboard&lt;/li&gt;&lt;li&gt;Publish information in a wiki or equivalent intranet&lt;/li&gt;&lt;li&gt;Display information in a code review tool&lt;/li&gt;&lt;li&gt;Generate a PDF of information as part of an executive dashboard&lt;/li&gt;&lt;/ul&gt;The fewer additional steps required the more likely the tool will be used.&amp;nbsp; Creating separate, independent paths to the information will often cause the tool to not be used.&lt;br /&gt;&lt;ul&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5704901458470135557-2081600569181987406?l=codeintegrity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeintegrity.blogspot.com/feeds/2081600569181987406/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeintegrity.blogspot.com/2010/12/static-analysis-reporting-for-success.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/2081600569181987406'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/2081600569181987406'/><link rel='alternate' type='text/html' href='http://codeintegrity.blogspot.com/2010/12/static-analysis-reporting-for-success.html' title='Static Analysis Reporting For Success'/><author><name>Andy</name><uri>http://www.blogger.com/profile/06705630945588101293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5704901458470135557.post-3465280857399512089</id><published>2010-11-23T15:26:00.001-08:00</published><updated>2010-11-24T08:15:50.813-08:00</updated><title type='text'>What's In Your Static Analysis Build Log and Why You Should Care</title><content type='html'>&lt;style&gt;@font-face {  font-family: "Arial";}@font-face {  font-family: "Arial Unicode MS";}p.MsoNormal, li.MsoNormal, div.MsoNormal { margin: 0in 0in 0.0001pt; font-size: 12pt; font-family: "Times New Roman"; }p.MsoBodyText, li.MsoBodyText, div.MsoBodyText { margin: 0in 0in 6pt; font-size: 12pt; font-family: "Times New Roman"; }span.BodyTextChar { font-family: "Arial Unicode MS"; }div.Section1 { page: Section1; }&lt;/style&gt;     &lt;br /&gt;&lt;div style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: black; font-family: Arial; font-size: 10pt;"&gt;Static analysis tools are often used to help detect defects in source code. Simple in concept, they analyze the code and report potential defects. Of course, what everyone wants is a tool with zero false positive reports and zero unreported defects (or false negatives).&amp;nbsp; Developers in particular will be resistant to using a tool that they do not see as accurate.&amp;nbsp; Improving the tools accuracy often requires looking under the hood.&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0.0001pt;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="color: black; font-family: Arial; font-size: 10pt;"&gt;Like most build engines, your static analysis tool(s) create a log somewhere of the steps it takes to analyze the code. Most tools I'm familiar with call it a build log.&amp;nbsp; The build log, I believe, is the first important place to look.&amp;nbsp; Why should you look there?&amp;nbsp; There are&amp;nbsp;&lt;i&gt;errors&lt;/i&gt;&amp;nbsp;that are reported in the build log that are not reported any where else. Specifically errors are reported by the compiler ( for each file it looks at) and then by the analysis engine itself.&amp;nbsp; In their default configuration not all compilation errors are visible in the defect list.&lt;/span&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: black; font-family: Arial; font-size: 10pt;"&gt;What this means is if you run an analysis and then look at just the results these tools provide you may not be getting the whole picture. For example if an entire file fails to compile, static analysis tools will often record this as a error and be duly reported to the end user or administrator. &amp;nbsp;However if just a single function or data structure is unable to be resolved or in some cases include files cannot be found, this may actually go unreported except in the log files.&amp;nbsp;&amp;nbsp; Of course when details are lost so too will analysis fidelity.&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0.0001pt;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: black; margin-bottom: 0.0001pt;"&gt;&lt;span style="font-family: Arial; font-size: 10pt;"&gt;To take a recent example I was working with a customer where the analysis build summary reported zero errors. &amp;nbsp;However as is my practice, I searched the build log for error messages from the analysis compiler. I found that the analysis compiler reported 75 errors in which it could not find some include files.&amp;nbsp; In this particular case when we added the include files to the compiler configuration we found that out of 1362 defect that were reported by the original analysis, 315 became "fixed", resulting in a reduction of approximately 25% in the defect density.&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0.0001pt;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: black; font-family: Arial; font-size: 10pt;"&gt;So what's an analysis administrator to do?&amp;nbsp; I recommend you count the errors in your build log at the end of every build and if any occur, evaluate them and attempt to fix them. &amp;nbsp;Usually it's pretty straight forward. &amp;nbsp;Sometime it takes more effort, sometimes it's not worth the effort. Usually the payoff is worthwhile. &amp;nbsp;In this case, it took a couple of hours to resolve 315 defect reports.&amp;nbsp; As a result I reduced the number of defects needed to be triaged for this team by 25% (without any loss of real bugs), saving significant time.&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0.0001pt;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0.0001pt;"&gt;&lt;span style="color: black; font-family: Arial; font-size: 10pt;"&gt;-- Kenneth Kron&amp;nbsp;&lt;/span&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5704901458470135557-3465280857399512089?l=codeintegrity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeintegrity.blogspot.com/feeds/3465280857399512089/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeintegrity.blogspot.com/2010/11/whats-in-your-static-analysis-build-log.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/3465280857399512089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/3465280857399512089'/><link rel='alternate' type='text/html' href='http://codeintegrity.blogspot.com/2010/11/whats-in-your-static-analysis-build-log.html' title='What&apos;s In Your Static Analysis Build Log and Why You Should Care'/><author><name>Andy</name><uri>http://www.blogger.com/profile/06705630945588101293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5704901458470135557.post-7230969316804703480</id><published>2010-11-09T06:51:00.000-08:00</published><updated>2010-11-09T06:51:17.438-08:00</updated><title type='text'>Static Analysis Metrics - A Window into Development</title><content type='html'>You can't manage what you can't measure right?&amp;nbsp; In addition to detecting problems in source code, static analysis can be used to produce metrics that provide insight into productivity, code quality, security and more.&amp;nbsp; We all know the &lt;i&gt;dangers of managing solely by metrics&lt;/i&gt;, yet, metrics serve as a highly useful window into your software development process.&amp;nbsp; In this post, we most certainly won't focus on the general challenges of using metrics because they've been written about in many other forums.&amp;nbsp; We will discuss some static analysis metrics here that when pieced with other information can provide useful information.&lt;br /&gt;&lt;br /&gt;Static analysis is typically integrated at the system build level.&amp;nbsp; These days, most organizations build their code on a frequent basis - which are convenient points of time to generate static analysis results.&amp;nbsp; If you are running a nightly build, you can get static analysis output on a daily basis.&amp;nbsp; If you run it on a continuous integration basis you get output at the frequency you choose (sometimes static analysis takes longer than a continuous integration cycle if you haven't tuned it but then simply perform static analysis on every 2nd or 3rd cycle).&amp;nbsp; Metrics can be used to get a sense for where you are (status) and point to potential problem areas too (alerts).&amp;nbsp; Thresholds can be set to spur action - such as block a release, or trigger a code review or design review.&lt;br /&gt;&lt;br /&gt;Every organization has different priorities and thus every organization should have a different set of metrics that they should track to maintain alignment with goals.&amp;nbsp; We list just a few common metrics that can come from static analysis tools.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Management Level Metrics&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Most static analysis tools can easily generate output such as:&lt;b&gt; &lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Lines of code, number of new lines of code, churn &lt;/li&gt;&lt;li&gt;Number of defects outstanding, number of new defects introduced&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Defects per thousand line of code (defect density)&lt;/li&gt;&lt;li&gt;Number of defects fixed so far, number of defects fixed in last period&lt;/li&gt;&lt;li&gt;Comments per line of code&amp;nbsp;&lt;/li&gt;&lt;li&gt;Cyclomatic complexity, function points&lt;/li&gt;&lt;/ul&gt;Supporting Metrics to Ensure Compliance&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Code coverage for tests (100% or near 100% should be attained)&lt;/li&gt;&lt;li&gt;Average time to resolve issues&lt;/li&gt;&lt;li&gt;Number of defects marked as false positives (or low priority)&lt;/li&gt;&lt;/ul&gt;A couple of considerations about this data:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Breakdowns&lt;/b&gt;&lt;br /&gt;The entire codebase should be measured and tracked however convenient breakdowns can be created to make the information more actionable.&amp;nbsp; For instance, data could be collected on a team by team basis (or component by component).&amp;nbsp; Individuals metrics can also be calculcated in order to hone in on specific problem areas or better yet, to highlight improvement areas worth rewarding.&amp;nbsp; In addition, team leads may be interested in tracking information on a function by function basis.&lt;br /&gt;&lt;br /&gt;All defect related metrics should be broken down by priorities and/or severities.&amp;nbsp; Metrics that lump in low priorities become diluted.&amp;nbsp; This is particularly important if you have an acceptance criteria that requires all critical and high defects to be fixed before release.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What Is Measured&lt;/b&gt;&lt;br /&gt;Because static analysis usually operates at the build level, you can get meaningful statistics on a per codebase perspective.&amp;nbsp; Thus if you have multiple targets (e.g. different operating systems, devices, etc.) you can produce statistics for each. You can find build target specific bugs as well as bugs in shared code.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Absolute Versus Relative&lt;/b&gt;&lt;br /&gt;A number without context provides almost no value.&amp;nbsp; Let's say the tool spits out a defect density rate of 1 bug per 1000 lines of code.&amp;nbsp; What can you do with the information?&amp;nbsp; The data becomes rich information when you are able to compare it to other numbers.&amp;nbsp; The most common way to use these metrics is to benchmark against industry standards.&amp;nbsp; &lt;a href="http://www.coverity.com/"&gt;Coverity&lt;/a&gt; has an interesting database of open source defects from their Department of Homeland Security grant.&amp;nbsp; While comparing your codebase with open source statistics may not be ideal (wouldn't it be great if you could benchmark against your competitors), it provides at least some real world data that you can use to compare and contrast.&amp;nbsp; Are you above or below the average and by how much?&lt;br /&gt;&lt;br /&gt;Another common way to interpret the numbers is to evaluate them over time.&amp;nbsp; Take a baseline - a snapshot in time and then measure against that baseline to see how you are trending.&amp;nbsp; A convenient time to take a baseline is at the beginning of a branch pull.&amp;nbsp; Some organizations have the goal of toeing the line - meaning "no new harm."&amp;nbsp; Quite simply the goal is to maintain the same level of quality as prior to any new development efforts.&amp;nbsp; Others at least want to see improvement over time - showing that they are making progress.&amp;nbsp; The high level defect density as well as the overall defect number are very typical KPI's (key performance indicators) chosen by development organizations.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Frequency&lt;/b&gt;&lt;br /&gt;Note again that the frequency is as often as you run static analysis.&amp;nbsp; As part of a system build, this is typically run regularly, either every evening, every few days or every continuous integration cycle.&amp;nbsp; Advanced organizations also provide static analysis at the developer level so that they can run on-demand static analysis.&amp;nbsp; &lt;a href="http://www.klocwork.com/"&gt;Klocwork&lt;/a&gt; has some strong capabilities in this area.&amp;nbsp; In this way developers can proactively identify and fix potential problems prior to check-in.&amp;nbsp; Giving the power to the developers to view and improve the metrics as they work, results in better system-level metrics faster and much less chance of having to deal with an emergency later in the development cycle.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Trending&lt;/b&gt;&lt;br /&gt;All data should be stored and accessible to get a historical context.&amp;nbsp; Graphical charts enable a quick interpretation of results.&amp;nbsp; Historical context helps you see how you are doing relatively.&amp;nbsp; Start with a baseline and see how you are doing from that point onward.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Data Consistency&lt;/b&gt;&lt;br /&gt;Static analysis tools are complex, with many settings that are tweakable in order for it to understand the myriad of different codebases that it can analyze.&amp;nbsp; Think what kind of bugs would be useful to find in a 10,000 line of code embedded device (like a stack overflow) versus a 10 million line of code server application (like a concurrency bug).&amp;nbsp; If not set up properly, the static analysis tool can create challenges in keeping the data stable so that you get consistent numbers to compare over time.&amp;nbsp; For instance, if you upgrade the static analysis tool, new and improved checkers may suddenly change the defect count.&amp;nbsp; New checkers will find new bugs, which may falsely signal that there was a sudden increase in the number of defects in your codebase.&amp;nbsp; Those bugs were always there :-). Similarly, an improved checker may suddenly report many fewer false positives but maybe at the cost of a few real bugs that are no longer found.&lt;br /&gt;&lt;br /&gt;If analyses can be run in multiple places (for instance, developers running the analysis tool locally on their machine) then discrepancies can occur if the configurations and the code being analyzed are not identical.&amp;nbsp; Even changing some settings that you wouldn't imagine could possibly cause a data consistency problem can mysteriously change the numbers.&amp;nbsp; While static analysis tools are designed to find bugs, that doesn't mean they don't have bugs themselves.&amp;nbsp; These tools are doing a lot of complex analyses behind the scenes and don't always provide consistent results in every possible scenario.&lt;br /&gt;&lt;br /&gt;In a future blog post, we'll look at some sample dashboards so that you get a sense for what can be used for reporting and how these data points can be used.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5704901458470135557-7230969316804703480?l=codeintegrity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeintegrity.blogspot.com/feeds/7230969316804703480/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeintegrity.blogspot.com/2010/11/static-analysis-metrics-window-into.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/7230969316804703480'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/7230969316804703480'/><link rel='alternate' type='text/html' href='http://codeintegrity.blogspot.com/2010/11/static-analysis-metrics-window-into.html' title='Static Analysis Metrics - A Window into Development'/><author><name>Andy</name><uri>http://www.blogger.com/profile/06705630945588101293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5704901458470135557.post-8466145727149099899</id><published>2010-10-24T13:51:00.000-07:00</published><updated>2010-10-24T18:44:15.387-07:00</updated><title type='text'>Technical Debt And Static Analysis</title><content type='html'>&lt;a href="http://www.castsoftware.com/"&gt;CAST Software&lt;/a&gt;, a maker of software analysis and measurement solutions &lt;a href="http://www.castsoftware.com/Resources/Research-Labs.aspx"&gt;published&lt;/a&gt; some interesting findings on the quality and security of software applications across a number of different industries and applications.&amp;nbsp; (75 organizations, 288 custom applications).&lt;br /&gt;&lt;br /&gt;While clearly, vendor funded need to be taken with a grain of salt (for instance the calculation was based on their tool's defect density and a fix rate presumably from their experience), the approach and findings do cast an interesting light on the quantification of quality initiatives.&amp;nbsp; To start with, they define "technical debt" as "cost of the effort required to fix problems that remain in the code when  an application is released to operation.&amp;nbsp; Like financial debt,  Technical Debt incurs interest in the form of the extra effort it takes  to maintain and enhance an application due to the structural quality  flaws left in that code."&lt;br /&gt;&lt;br /&gt;In summary, some of the findings are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The average technical debt was found to be about $1M with the average code size being 374,000 lines of code.&amp;nbsp; &lt;/li&gt;&lt;li&gt;The average maintenance cost per line of code was $2.82 assuming a $75/hour average, fully loaded wage for a developer and that a bug takes about an hour to fix.&lt;/li&gt;&lt;li&gt;C/C++ applications had wider variability but on average had lower technical debt that some of the Web technologies such as Java and .NET.&lt;/li&gt;&lt;/ul&gt;My assumption though is that this number was calculated from the defects that came  from the Cast tool that would presume to be fixed and therefore is a subset of the actual technical debt for an application  (presumably there are many other bugs that would need to be fixed, not  found by a static tool).&amp;nbsp; If true, I would conclude that they are saying that if you use the Cast tool to the level they suggest, that it would save $1M in technical debt, an amount that over time would grow larger due to interest.&lt;br /&gt;&lt;br /&gt;One could argue either way whether the number is bigger or smaller.&amp;nbsp; On the one hand, there is a cost to fixing, starting from the license cost all the way to the extra hardware, training and usage cost.&amp;nbsp; On the other hand, the calculation of technical debt was only done based on developer time and not on the effect of a defect, which can be many multiple times more costly than simply the time it takes to fix a bug.&amp;nbsp; We sometimes call these the "million dollar bug" and it varies significantly among industries and application types.&amp;nbsp; While this cost may not technically be a part of the technical debt calculation, you may wish to figure the cost of a defect in deciding whether to use static analysis or not.&amp;nbsp; Sure, these defects are few and far between but if you can find just one...&lt;br /&gt;&lt;br /&gt;Either way, static analysis does appear to save money and help developers produce better quality software - the hard part has been in measuring it.&amp;nbsp; Technical debt is one interesting way to measure it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5704901458470135557-8466145727149099899?l=codeintegrity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeintegrity.blogspot.com/feeds/8466145727149099899/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeintegrity.blogspot.com/2010/10/technical-debt.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/8466145727149099899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/8466145727149099899'/><link rel='alternate' type='text/html' href='http://codeintegrity.blogspot.com/2010/10/technical-debt.html' title='Technical Debt And Static Analysis'/><author><name>Andy</name><uri>http://www.blogger.com/profile/06705630945588101293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5704901458470135557.post-548604635660674240</id><published>2010-10-08T23:16:00.000-07:00</published><updated>2010-10-09T06:50:23.504-07:00</updated><title type='text'>Why Have Static Analysis Tools Not Yet Hit the Mainstream</title><content type='html'>Over the past few weeks, there has been an interesting and lively discussion going on in a &lt;a href="http://www.linkedin.com/groups?mostPopular=&amp;amp;gid=1973349"&gt;Linkedin group&lt;/a&gt; focused on static analysis.&amp;nbsp; The original question was along the lines of "Why hasn't static analysis penetrated the market further?"&amp;nbsp; The conversation has reached 97 comments and counting from developers, managers and vendors alike.&lt;br /&gt;&lt;br /&gt;One &lt;i&gt;could&lt;/i&gt; argue that static analysis is actually fairly pervasive, particularly among companies who produce shipped software as their business and where quality and security is critical.&amp;nbsp; If you count the organizations who use static analysis (and ignore some overlap) it would number well into the thousands.&amp;nbsp; In addition, opensource tools like Findbugs and others have a decent following as do free static analysis tools bundled with IDE's and compilers.&amp;nbsp; And yet, static analysis still has a way to go before it becomes a part of the standard toolchain that most every organization uses.&amp;nbsp; Getting static analysis used effectively within the organization is a second order challenge once an organization decides to use static analysis.&lt;br /&gt;&lt;br /&gt;I will attempt to summarize some of the interesting points that were surfaced in the sometimes heated discussion.&amp;nbsp; Some I agree with and some I don't.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Static analysis tools can be noisy - producing false positives.&amp;nbsp; Does static analysis consistently produce real issues? Are the issues reported comprehensible and actionable?&lt;/li&gt;&lt;li&gt;Static analysis tools were overhyped many years ago causing expectations to be set too high.&amp;nbsp;&amp;nbsp; &lt;/li&gt;&lt;li&gt;Developers are protective of their code and don't like a tool poking at their "treasured creations".&lt;/li&gt;&lt;li&gt;Static analysis vendors are still small or medium-sized and therefore don't yet have the marketing budgets to communicate to the broad market.&amp;nbsp; HP and IBM's recent acquisitions of Fortify Software and Ounce Labs may change this at least in the security space.&lt;/li&gt;&lt;li&gt;Static analysis is often viewed as as an additional step after a "successful build" when it should be release criteria for passing or failure. &amp;nbsp; &lt;/li&gt;&lt;li&gt;The term "static analysis" is boring and doesn't reflect the sophistication of the analysis&lt;/li&gt;&lt;li&gt;A multitude of defects are reported and developers don't know where to start or how to create a real process that addresses the issues&lt;/li&gt;&lt;li&gt;Ignorance of the value of tools in the software development process.&amp;nbsp; The all too frequent way that managers and senior staff treat software as an art that cannot be improved through better process and tools.&lt;/li&gt;&lt;li&gt;Need a clearer demonstration of the value static analysis provides (the benefit minus the costs).&lt;/li&gt;&lt;/ul&gt;Static analysis is growing particularly among organizations where quality issues and security vulnerabilities are most damaging but it will take a combination of improvements to the technology, changes to the attitude of development organizations and industry accepted best practices to take static analysis past the chasm towards the mainstream.&amp;nbsp; On the services front, we help many organizations overcome these issues through best practices in people/process/technology, mentoring, training, support and a multitude of other services.&amp;nbsp; When done right, organizations who take on static analysis do gain a competitive advantage.&amp;nbsp; These companies not only improve the quality and security of their products, they do so often with an overall productivity gain.&amp;nbsp; Invest in the right way and get some payback. Approach it with the wrong steps and a complacent attitude and then you are left to cross that chasm yourself.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5704901458470135557-548604635660674240?l=codeintegrity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeintegrity.blogspot.com/feeds/548604635660674240/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeintegrity.blogspot.com/2010/10/why-have-static-analysis-tools-not-yet.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/548604635660674240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/548604635660674240'/><link rel='alternate' type='text/html' href='http://codeintegrity.blogspot.com/2010/10/why-have-static-analysis-tools-not-yet.html' title='Why Have Static Analysis Tools Not Yet Hit the Mainstream'/><author><name>Andy</name><uri>http://www.blogger.com/profile/06705630945588101293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5704901458470135557.post-4234645336117956734</id><published>2010-09-24T10:49:00.000-07:00</published><updated>2010-09-24T10:50:09.035-07:00</updated><title type='text'>False Positives versus Intentional's</title><content type='html'>Bugs need to be categorized so that the appropriate action can be taken.&amp;nbsp; The traditional bug reported by customers, support, field engineers, etc. are examined by developers to determine if it is a bug.&amp;nbsp; If it is a bug, its priority and severity are usually assessed.&amp;nbsp; If it is not a valid bug report it may have been rejected as not a bug, unfixable, already fixed, duplicate or any of a number of different categories that say that no further work will be done on it.&lt;br /&gt;&lt;br /&gt;Static analysis defects have a slightly different flavor.&amp;nbsp; Static analysis reports potential defects, meaning an inconsistency or flaw has been detected that needs to be verified by a developer or review team and handled appropriately.&amp;nbsp; Bugs determined to be real ("true positives") need to be assessed for priority - usually a combination of type of bug reported, whether it is on a specific conditional path/exception path, what part of the code it is found in (new code/old code/component/3rd party library), etc.&amp;nbsp; Static analysis solutions may also include a "score" to give further information to help prioritize it.&lt;br /&gt;&lt;br /&gt;Some static analysis results however may be "false positives" which are essentially "not a bug" characterizations.&amp;nbsp; Herein lies a distinction.&amp;nbsp; Vendors often like to make a distinction between a "false postive" and an "intentional"&amp;nbsp;status.&amp;nbsp; A "false positive" signals a situation where the analysis incorrectly identified a problem as a bug.&amp;nbsp; If you will, it's a bug or limitation of the static analysis tool.&amp;nbsp; An "intentional" status signals a situation where a valid bug is reported but that the developer had intentionally coded it this way and so no further action is required.&amp;nbsp; The presumption here is that for "intentional's", the analysis did what it was supposed to do correctly.&lt;br /&gt;&lt;br /&gt;Some organizations lump everything that they don't want to fix into the "false positive" category.&amp;nbsp; If they weren't going to change any code, then it shouldn't have been reported.&amp;nbsp; Other organizations take a more sophisticated approach by making this distinction - the presumption being that&amp;nbsp;intentional's should be reviewed, like a sanity check.&amp;nbsp; A variety of reasons why they categorize it as such include:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;wanting to get an accurate "false positive rate" for the tool.&amp;nbsp; Lumping "intentional's" artificially increases the false positive rate&lt;/li&gt;&lt;li&gt;the workflow for "intentional" and "false positive" may be different.&amp;nbsp; While both should be reviewed/audited, a static analysis administrator may review "false positives" for tuning and configuration opportunities.&amp;nbsp; False positives should be reported back to the vendor for fixing as well.&amp;nbsp; "Intentional's" may be reviewed by architects to understand what strange coding practices are taking place.&amp;nbsp; Intentional's typically need a good reason to explain why it was coded in the way it was.&lt;/li&gt;&lt;/ul&gt;Of course the advantage to finer grain categorizations have to be weighed with the cost of explaining the distinctions.&amp;nbsp; There is a cost to data acquisition, but if you value the ability to measure the tool's effectiveness and have a process for improving your analysis and improving your code through examination of intentional's then it may be well worth it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5704901458470135557-4234645336117956734?l=codeintegrity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeintegrity.blogspot.com/feeds/4234645336117956734/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeintegrity.blogspot.com/2010/09/false-positives-versus-intentionals.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/4234645336117956734'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/4234645336117956734'/><link rel='alternate' type='text/html' href='http://codeintegrity.blogspot.com/2010/09/false-positives-versus-intentionals.html' title='False Positives versus Intentional&apos;s'/><author><name>Andy</name><uri>http://www.blogger.com/profile/06705630945588101293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5704901458470135557.post-3935680096768467252</id><published>2010-08-17T11:01:00.000-07:00</published><updated>2010-08-17T11:01:31.201-07:00</updated><title type='text'>Power of 10 for Safety Critical Code</title><content type='html'>Just reminding programmers of a good set of safety critical programming rules from the rocket scientists at JPL/NASA.&amp;nbsp; Gerard Holzmann wrote the &lt;a href="http://www.spinroot.com/p10/"&gt;Power of 10&lt;/a&gt; rules which are a set of good programming practices that should be considered for programs that demand high levels of quality.&lt;br /&gt;&lt;br /&gt;The rule that most applies to static analysis is "Rule 10" which is noted below:&lt;br /&gt;&lt;br /&gt;"Compile with all warnings enabled, in pedantic mode, and use  one or  more modern static source code analyzers.  All code must be  compiled, from the first day of development, with all compiler warnings  enabled at the compiler's most pedantic setting. All code must compile  with these setting without warnings. All code must be checked on each  build with at least one, but preferably more than one, state-of-the-art  static source code analyzer and should pass the analyses with zero  warnings."&amp;nbsp;&lt;span style="font-size: x-small;"&gt;&lt;i&gt; (Rule 10 of Power of 10 Rules)&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Gerard notes that "there is no excuse for any serious software  development effort not to make use of this technology."&amp;nbsp; Some may view  the "rule of zero warnings" as draconian but Gerard notes that if the  analysis gets confused enough to report a problem, then the code should  be rewritten to be "trivially valid."&amp;nbsp; Good code doesn't need to be complex.&amp;nbsp; If the code is clean, it's not only much less error-prone but also much easier to manage and maintain ongoing.&amp;nbsp; Think also about the next developer who may be inheriting the code.&amp;nbsp; Static analysis will find bugs but will also help code be more readable and maintainable.&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign="top" width="10%"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td width="5%"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5704901458470135557-3935680096768467252?l=codeintegrity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeintegrity.blogspot.com/feeds/3935680096768467252/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeintegrity.blogspot.com/2010/08/power-of-10-for-safety-critical-code.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/3935680096768467252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/3935680096768467252'/><link rel='alternate' type='text/html' href='http://codeintegrity.blogspot.com/2010/08/power-of-10-for-safety-critical-code.html' title='Power of 10 for Safety Critical Code'/><author><name>Andy</name><uri>http://www.blogger.com/profile/06705630945588101293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5704901458470135557.post-8042507458807028125</id><published>2010-08-06T14:32:00.000-07:00</published><updated>2010-08-10T08:50:38.349-07:00</updated><title type='text'>Dr. Dobbs Article on Porting to 64-bit Platforms</title><content type='html'>Irving Rabin, Senior Consultant at &lt;a href="http://www.codeintegritysolutions.com/"&gt;Code Integrity Solutions&lt;/a&gt; recently published an article on porting to 64-bit platforms.&lt;br /&gt;&lt;br /&gt;You can read it on Dr. Dobbs at: &amp;nbsp; &lt;a href="http://www.drdobbs.com/cpp/226600156;jsessionid=ZVI3ENP4W0F0VQE1GHOSKH4ATMY32JVN?queryText=porting+64-bit+platforms"&gt;Porting to 64-bit Platforms&lt;/a&gt;.&lt;a href="http://www.drdobbs.com/cpp/226600156;jsessionid=ZVI3ENP4W0F0VQE1GHOSKH4ATMY32JVN?queryText=porting+64-bit+platforms"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Enjoy and have a great weekend! &lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5704901458470135557-8042507458807028125?l=codeintegrity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeintegrity.blogspot.com/feeds/8042507458807028125/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeintegrity.blogspot.com/2010/08/dr-dobbs-article-on-porting-to-64-bit.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/8042507458807028125'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/8042507458807028125'/><link rel='alternate' type='text/html' href='http://codeintegrity.blogspot.com/2010/08/dr-dobbs-article-on-porting-to-64-bit.html' title='Dr. Dobbs Article on Porting to 64-bit Platforms'/><author><name>Andy</name><uri>http://www.blogger.com/profile/06705630945588101293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5704901458470135557.post-6116240084527836923</id><published>2010-08-02T12:03:00.000-07:00</published><updated>2010-08-02T12:03:41.270-07:00</updated><title type='text'>Getting Buy-In For Static Analysis From Management.</title><content type='html'>I recently read an interesting article (&lt;a href="http://www.itmanagement.com/features/8-ways-to-get-buyin-061708/"&gt;8-Ways To Get Buy In From Management&lt;/a&gt;) on how to get buy-in from IT Management.&amp;nbsp; While the document is mostly focused on IT related activities, there are some valuable lessons that can be learned for any technical undertaking within an organization.&amp;nbsp; In this entry, we discuss some of the issues focused on static source code analysis.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1. Learn what management values.&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Software development management has a different set of concerns than most individual contributors have.&amp;nbsp; Clearly there &lt;i&gt;should&lt;/i&gt; be alignment between management and worker-bees but that is too often not the case.&amp;nbsp; Static source code analysis will help you find bugs so that developers can fix them early in the development process.&amp;nbsp; From management's perspective, static analysis is almost a no-brainer. Caper Jones' estimates that static analysis can have a defect removal efficiency that can top 95% (presumably in a well configured, effective system and process). Other ways to describe the benefits include:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Fewer defects and vulnerabilities in the field, meaning lowered support costs, fewer patches and better customer satisfaction&lt;/li&gt;&lt;li&gt;Increased developer productivity&lt;/li&gt;&lt;li&gt;Lower risk of late releases&lt;/li&gt;&lt;/ul&gt;Particularly for technology companies, arming developers with good tools so that they increase their effectiveness is a must.&amp;nbsp; How management couches the benefits is industry and company dependent.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. Propose projects in  management terms, not technical terms.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The benefits in #1 are real, but how tangible are they?&amp;nbsp; The more the benefits can be quantified, the easier it is to make a decision whether to institute static analysis or not.&amp;nbsp; A convenient way to break down benefits is to look at increases in opportunities, lowering of costs and reduction in risk.&amp;nbsp; Static analysis typically does not increase opportunities directly but an argument can be made that any reduction in development time enables more value-added features to be built.&amp;nbsp; Lowered costs are definitely significant.&amp;nbsp; Lowered support costs (in technical support, developer support (patches, etc.)) as well as increased productivity can be estimated.&amp;nbsp; Many companies use automated source code analysis to find problems quickly in an fast-paced Agile environment.&amp;nbsp; This enables increased throughput overall.&amp;nbsp; Reduction in risk can take many forms - the risk of late release, the risk of poor quality, the risk of lowered customer satisfaction, the risk of failing compliance etc.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3. Show management  case studies and examples that support your point for cost savings or  revenue enhancement.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Certainly leverage the vendor.&amp;nbsp; While they are not impartial, they often have good case studies.&amp;nbsp; References are also very important.&amp;nbsp; A lot of companies are using static analysis so leverage your contacts.&amp;nbsp; Better always to do backdoor references so you can get a balanced view.&amp;nbsp; People seem happy to discuss their experiences.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;4.  Find ways to minimize the project's expense.&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;While reducing license cost is a subject better left for closed door negotiations, there are ways to maximize the benefit you get from static analysis tools.&amp;nbsp; Make sure you take the time to tune it for your needs, integrate it into your process (both technically and organizationally) and try to tie metrics of value to release criteria.&amp;nbsp;&amp;nbsp; Another way to get more value is to use the tool's extensibility capabilities to build your own custom checkers so that you leverage the analysis engine and the place in the workflow.&amp;nbsp; Wouldn't it be great to find and fix additional problems, violations in coding standards and more borrowing from what you are already doing.&amp;nbsp; When more people use the tool, more value is derived.&amp;nbsp; To get more people to use the tool, make it super easy to use, make the results as relevant as possible and make it clear as possible what is expected of all participants.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;5.  If your department's IT budget isn’t big enough, get help from another  department.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;A lot of folks can benefit from static analysis.&amp;nbsp; We've seen static analysis budgets come from not only the development organization but also from quality assurance, central tools, security groups and even governance organizations.&amp;nbsp; While they are not users, they can clearly benefit from the results and may help fund its usage.&amp;nbsp; Static analysis can also come from other overarching budgets such as from a quality and security initiative or projects related to moving to Agile / continuous integration and software development infrastructure automation.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;6. Break up the project into  easy-to-swallow pieces.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Breaking up projects into pieces not only makes it easier to swallow, it reduces risk.&amp;nbsp; As you see success in the early projects, it gives you knowledge (and confidence) to continue with the other phases of the project.&amp;nbsp; Start with a pilot group and see how that goes.&amp;nbsp; Set clear metrics for what is considered success for that pilot and work to meet it.&amp;nbsp; You'll learn significantly from the project to help you make better decisions down the line.&amp;nbsp; Use of static analysis as an integral part of a software development process is relatively new and thus haven't been ingrained into the DNA of most people and organizations.&amp;nbsp; That's changing but we're not quite there yet.&lt;br /&gt;&lt;b&gt;&lt;br /&gt;7.  Look for ways to outsource part of the project. &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;This advice may be a bit self-serving, but I will mention that it never ceases to amaze me how many companies opt to do everything in-house.&amp;nbsp; The short term benefit from doing this is that organizations build some expertise in-house while not incrementally add budget.&amp;nbsp; But, they rarely get a best practices implementation. In addition, they have to give up some opportunity cost of having that developer take on a nonstrategic project versus something more relevant to the goals of the company.&amp;nbsp; In addition, by doing it all in-house it often takes a lot longer for them to get it done.&amp;nbsp; All too often, we see engineers struggle to do it in-house only to never really do a good job, never complete it and waste significant amounts of time doing so. &amp;nbsp; Outsource for expertise, outsource for opportunity cost, outsource to save a considerable amount of time.&lt;br /&gt;&lt;b&gt;&lt;br /&gt;8. Pick your battles carefully.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Static tools are not cheap -- not only to buy but also to effectively put into one processes.&amp;nbsp; The evaluation process for many static tools give you a good sense for what it can do for you so take full advantage of it.&amp;nbsp; If you need to, start small.&amp;nbsp; De-risk the project as best you can through prototypes and smaller rollouts.&amp;nbsp; Bringing in static analysis does require a commitment but pays off big-time when done correctly.&amp;nbsp; By its very nature, static analysis is proactive.&amp;nbsp; If you don't get funding the first time around, it shouldn't take long for the next emergency to make the situation more "favorable"for bringing in tools to more efficiently improve quality and security.&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5704901458470135557-6116240084527836923?l=codeintegrity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeintegrity.blogspot.com/feeds/6116240084527836923/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeintegrity.blogspot.com/2010/08/getting-buy-in-for-static-analysis-from.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/6116240084527836923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/6116240084527836923'/><link rel='alternate' type='text/html' href='http://codeintegrity.blogspot.com/2010/08/getting-buy-in-for-static-analysis-from.html' title='Getting Buy-In For Static Analysis From Management.'/><author><name>Andy</name><uri>http://www.blogger.com/profile/06705630945588101293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5704901458470135557.post-265798224252988680</id><published>2010-07-20T16:43:00.000-07:00</published><updated>2010-07-20T16:43:04.295-07:00</updated><title type='text'>Detecting Endian Issues With Static Analysis</title><content type='html'>Our own Carl Ek, architect at &lt;a href="http://www.codeintegritysolutions.com/"&gt;Code Integrity Solutions&lt;/a&gt; had his article on detecting Endian issues published in the esteemed Dr. Dobbs Journal.&amp;nbsp; Here is the first paragraph and link:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;"There are 0010 0000 kinds of people in the world:  Those that  understand the difference between Big Endian and Little Endian, and  those that do not."&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Since all binary processors (hardware or software) have an endian  design, correct processing of the data based on that endian design is  extremely important.  The statement above is a version of another joke,  but with a twist:  the binary is represented in little endian, giving  some mild humor for those that understand.  For those that don't  understand endianness, the humor is lost, much like a processor which  has an  endian processing defect.  In this article, I describe the kinds  of defects which occur, and methods where static analysis tools can  help detect programming errors and enforce correct programming.&lt;br /&gt;&lt;a href="http://www.blogger.com/goog_2107333007"&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.drdobbs.com/windows/226000073;jsessionid=M2RNTVOZTQ42LQE1GHOSKH4ATMY32JVN"&gt;Detecting Endian Issues With Static Analysis&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5704901458470135557-265798224252988680?l=codeintegrity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeintegrity.blogspot.com/feeds/265798224252988680/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeintegrity.blogspot.com/2010/07/detecting-endian-issues-with-static.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/265798224252988680'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/265798224252988680'/><link rel='alternate' type='text/html' href='http://codeintegrity.blogspot.com/2010/07/detecting-endian-issues-with-static.html' title='Detecting Endian Issues With Static Analysis'/><author><name>Andy</name><uri>http://www.blogger.com/profile/06705630945588101293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5704901458470135557.post-1032891419949465830</id><published>2010-07-13T17:01:00.000-07:00</published><updated>2010-07-13T17:01:28.552-07:00</updated><title type='text'>What Should You Be Good At?</title><content type='html'>Any reasonably powerful software tool has enough complexity and flexibility to handle a multitude of scenarios.&amp;nbsp; Having a lot of knobs and buttons are essential in the software development arena where environments are typically comprised of stitched together home-grown and commercial tools.&amp;nbsp; Rarely is the whole toolchain packaged and nicely integrated. The ability for development tools to be customized means that it is highly possible to solve your business problem using best of breed technologies.&amp;nbsp; It also doesn't hurt that engineering teams are highly capable of building most anything. However, the path to achieving that goal through in-house resources is often difficult and oftentimes impractical.&lt;br /&gt;&lt;br /&gt;Any department, particularly the engineering department, must recognize that they &lt;i&gt;must&lt;/i&gt; have a set of core competencies that are strategically essential for their company to succeed.&amp;nbsp; Providers of software are in a highly competitive environment where differentiation is critical. Not surprisingly, these core competencies are the areas that must be focused on, cultivated and maintained from an engineering standpoint.&amp;nbsp; Some examples of core competencies are the ability to: &lt;br /&gt;&lt;ul&gt;&lt;li&gt;produce particularly high performance, highly scalable transaction systems&lt;/li&gt;&lt;li&gt;add relevant features quickly to be first to market&lt;/li&gt;&lt;li&gt;consistently deliver the most reliable systems&lt;/li&gt;&lt;li&gt;deliver the most elegantly designed and easy to use systems &lt;/li&gt;&lt;/ul&gt;Successful companies deliver on the levers that matter the most in a competitive industry.&amp;nbsp; It could be feature leadership, process leadership, user experience leadership or likely a combination of things.&amp;nbsp; The ability to leverage your core competencies comes from having the right talent and the right environment to help them succeed.&lt;br /&gt;&lt;br /&gt;Where are your levers?&amp;nbsp; Where should you focus your team's efforts?&amp;nbsp; What competencies should you build and what should you outsource?&amp;nbsp; Where should you invest and by how much?&amp;nbsp; Should your team be experts at building features that matter or having expertise in software development infrastructure?&lt;br /&gt;&lt;br /&gt;In the most extreme case, one could argue that you should outsource everything that is not within your core competence.&amp;nbsp; The benefit is that you can focus on being best of breed in the areas that matter to your business while getting best of breed from outside providers in the areas that matter less.&amp;nbsp; In the other extreme, you can do everything in-house, the "not invented here" syndrome.&amp;nbsp; The benefit is that you have control but the downside is that your focus is diluted and your costs greatly increase as your needs change.&amp;nbsp; Culturally, engineers have tended towards the "build it in-house" approach because they can.&lt;br /&gt;&lt;br /&gt;With regards to static analysis, how much of software development infrastructure is truly strategic to your company?&amp;nbsp; How much can and should be outsourced to some outside help?&amp;nbsp; Where can you get the most leverage from your team's resources to focus on the areas that will make your software development organization a leader in the industry?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5704901458470135557-1032891419949465830?l=codeintegrity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeintegrity.blogspot.com/feeds/1032891419949465830/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeintegrity.blogspot.com/2010/07/what-should-you-be-good-at.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/1032891419949465830'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/1032891419949465830'/><link rel='alternate' type='text/html' href='http://codeintegrity.blogspot.com/2010/07/what-should-you-be-good-at.html' title='What Should You Be Good At?'/><author><name>Andy</name><uri>http://www.blogger.com/profile/06705630945588101293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5704901458470135557.post-8323454238409336156</id><published>2010-07-09T10:12:00.000-07:00</published><updated>2010-07-09T10:12:04.332-07:00</updated><title type='text'>Static Analysis Typically Results in 85% Defect Removal Efficiency</title><content type='html'>Caper Jones put together a nice article titled "&lt;a href="http://www.drdobbs.com/architecture-and-design/225701139;jsessionid=5Z044V44D45LKQSNDLSCKHA"&gt;Getting Software Quality Right&lt;/a&gt;."&amp;nbsp; He makes an important case for static analysis helping to increase the defect removal efficiency.&amp;nbsp; He also notes:&lt;br /&gt;&lt;blockquote&gt;Combining inspections, static analysis, and testing is cheaper than testing by itself and leads to much better defect removal efficiency levels. In concert, these approaches also shorten development schedules by more than 45% because, when testing starts after inspections, almost 85% of the defects already will have been addressed.&lt;/blockquote&gt;The range for defect removal efficiency for static analysis is listed from 55% - 90% depending upon how correctly it is used.&amp;nbsp; It's a &lt;b&gt;wide&lt;/b&gt; range and most likely highly dependent upon whether best practices are implemented or not.&amp;nbsp; Clearly a tool can be easily misapplied both from a process and product implementation perspective.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5704901458470135557-8323454238409336156?l=codeintegrity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeintegrity.blogspot.com/feeds/8323454238409336156/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeintegrity.blogspot.com/2010/07/static-analysis-typically-results-in-85.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/8323454238409336156'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/8323454238409336156'/><link rel='alternate' type='text/html' href='http://codeintegrity.blogspot.com/2010/07/static-analysis-typically-results-in-85.html' title='Static Analysis Typically Results in 85% Defect Removal Efficiency'/><author><name>Andy</name><uri>http://www.blogger.com/profile/06705630945588101293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5704901458470135557.post-468886069127804959</id><published>2010-06-30T15:52:00.000-07:00</published><updated>2010-06-30T15:52:46.350-07:00</updated><title type='text'>One Easy Way to Improve the Quality of Third Party Components</title><content type='html'>Software products these day are increasingly made up of components from a variety of different sources.&amp;nbsp; These components provided by the open source community, supplier companies and software vendors provide functionality for user interface management, operating system access, security interaction, connections to device and more.&amp;nbsp; In addition, software developers also use code generation tools that enable developers to manage the application at a higher abstraction.&lt;br /&gt;&lt;br /&gt;By using third party components, an application with much more functionality can be pieced together much more quickly than ever before. &lt;br /&gt;&lt;br /&gt;Yet the customer who receives the product, be it a smartphone, router, medical device, software application certainly doesn't care how it's developed - only that it works.&amp;nbsp; Developers increasingly must be able to manage not just the code that they've written but also the code that they integrate into the overall solution.&amp;nbsp; Although it is in one sense, out of their sphere of control, they must manage the integration of the code so that the overall solution has the needed quality, security, performance, reliability and more that is expected of the finished product.&amp;nbsp; Managing the interfaces well in some cases is not enough -- many developers must opt to own the source code so that they can make the needed modifications to make it work for their needs.&lt;br /&gt;&lt;br /&gt;We work with many companies who run into this situation.&amp;nbsp; They analyze source code using static analysis on their codebase to find all sorts of problems to fix.&amp;nbsp; In order for the source code analysis to work better, they also analyze the third party code that is bundled with their end product.&amp;nbsp; This is an important step because many bugs stem from the improper interaction of components - and without analyzing the whole program you either miss out on a lot of bugs or get an inordinate number of false positives depending upon the static analyzer's conservative or aggressive assumptions.&amp;nbsp; Clearly, defects that result from the direct interaction with these third party components should be fixed.&amp;nbsp; This is something within the control of developers.&amp;nbsp; Defects found &lt;i&gt;in the source code of the third party code &lt;/i&gt;should also be fixed although many developers find themselves powerless to change the vendor's code or realize that they must increase their overhead by making changes to the source code and managing that change for future versions.&amp;nbsp; It's extra work.&lt;br /&gt;&lt;br /&gt;But the developer has some leverage.&amp;nbsp; We have worked with many forward thinking companies who lean on their suppliers to do their own code analysis, and to fix up the problems.&amp;nbsp; For those companies with extra leverage, they have even demanded their suppliers to provide clean code as an acceptance criteria. These companies take a whole product view of the code, realizing that a bug in a third party component doesn't make a bit of difference to an end customer who's system or application is broken.&lt;br /&gt;&lt;br /&gt;So if you do run an analysis and find problems in third party code, put the burden on the supplier to fix up their code.&amp;nbsp; It's very reasonable for a company to run a quick analysis and to put a concerted effort to fix the problems (although they will have to obtain their own license).&amp;nbsp; You may be surprised at how much leverage you have.&amp;nbsp; And demanding good, clean code is something in everyone's interest.&amp;nbsp; It will save you a significant amount of time downstream and more importantly provide the quality experience that your users expect.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5704901458470135557-468886069127804959?l=codeintegrity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeintegrity.blogspot.com/feeds/468886069127804959/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeintegrity.blogspot.com/2010/06/one-easy-way-to-improve-quality-of.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/468886069127804959'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/468886069127804959'/><link rel='alternate' type='text/html' href='http://codeintegrity.blogspot.com/2010/06/one-easy-way-to-improve-quality-of.html' title='One Easy Way to Improve the Quality of Third Party Components'/><author><name>Andy</name><uri>http://www.blogger.com/profile/06705630945588101293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5704901458470135557.post-4915637131312623670</id><published>2010-05-24T12:29:00.000-07:00</published><updated>2010-05-24T12:30:20.666-07:00</updated><title type='text'>Defect Database Bugs Versus Static Source Code Analysis Bugs</title><content type='html'>Static analysis has been around for quite some time.&amp;nbsp; Recently they've been pointed to the very practical application of finding bugs in source code.&amp;nbsp; Many modern tools do a very good job of uncovering very good bugs -- the big value of which that the tools find them early in the development cycle.&amp;nbsp; Because the bugs are found in code, the reports point specifically to where in the source code the problem manifests.&amp;nbsp; Easy to find, easy to fix.&lt;br /&gt;&lt;br /&gt;But there are some subtle differences that can greatly affect the expectations that users have of the tool and the process workflow that is needed to support these tools well.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;A Dose of Reality&lt;/b&gt;&lt;br /&gt;Contrary to what every developer desires, static source code analysis tools do not &lt;i&gt;ONLY&lt;/i&gt; find critical, crash-causing defects.&amp;nbsp; Like any other discovery or analysis tool, it's going to find a mix of great stuff, good stuff, so-so stuff and stuff that's plain wrong.&amp;nbsp; In industry parlance, these would be problems categorized as critical, high, medium, low priorities and "false positives."&amp;nbsp; In static analysis, there's even an additional state commonly used called "intentional" which is that the tool correctly found something that looks like a problem but that the programmer intentionally coded it that way (usually due to an assumption that the static analysis tool is not privy to - such as assumptions in the environment that the code operates in).&amp;nbsp; Modern tools have improved their analysis significantly to reduce the lower value stuff and raise the likelihood of uncovering higher value stuff.&lt;br /&gt;&lt;br /&gt;That being said, every organization has a different definition of priority but for the vast majority of software development organizations, priorities are mapped to a stage in the process.&amp;nbsp; Often, priorities such as "critical" and "high" are mapped to specific requirements - such as part of an acceptance criteria for release.&amp;nbsp; Mediums and lows are relegated to "if you have time, fix it" or "we'll never get to it."&amp;nbsp; That's fine - rarely does an organization have the resources to address all issues (safety critical code being the notable exception).&amp;nbsp; Defects reported by static analysis tools should be treated no differently.&amp;nbsp; Some are important to fix and others are less important to fix.&amp;nbsp; When &lt;a href="http://www.codeintegritysolutions.com/"&gt;we&lt;/a&gt; go over static analysis defects with groups of developers, you'll invariably have the whole room resoundingly agree that a particular segment of code is poorly written and "should be rewritten."&amp;nbsp; However, resource constraints don't always make that the best business decision.&amp;nbsp; Most developers know that the regular low priority defects in their bug tracking database &lt;i&gt;should&lt;/i&gt; be fixed, but will likely never be touched again.&amp;nbsp; Everyone wants to fix them but nobody has the time.&amp;nbsp; Lower priority results from static analysis tools fit that too, with the only caveat that the chance for opportunistic fixes is greater because they are discovered during coding. &lt;br /&gt;&lt;br /&gt;When introducing static analysis tools to developers, they should be of the mindset that it's not going to find &lt;i&gt;every&lt;/i&gt; critical problem and that the problems it does find are not &lt;i&gt;all&lt;/i&gt; going to be critical.&amp;nbsp; These are unrealistic expectations for any tool.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Checks and Balances&lt;/b&gt;&lt;br /&gt;Another key difference with static analysis defect handling is that they are being reported by a tool and not by a customer, support or QA.&amp;nbsp; Thus the decision process for prioritization is not handled by an "outside" party to engineering.&amp;nbsp; Some organizations let the developers decide on defects which is okay as long as developers are properly trained and all have the same minimum standard for what is acceptable.&amp;nbsp; Many developers without the right expectations and training end up marking bugs incorrectly as false positives or perform unnatural acts to make the "tool shut up".&amp;nbsp; To mitigate these problems, organizations can set up a different review/prioritization team or have an audit process on the tail end to ensure accuracy and build learning into the organization.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Making Lemonade Out of Lemons&lt;/b&gt;&lt;br /&gt;One might think that a "false positive" or "intentional" is a terrible waste of time and needs to go straight to the wastebucket without further ado.&amp;nbsp; However, these reports do provide information that can be useful to the organization:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;False positives show when the tool did not correctly report a problem.&amp;nbsp; This is often a case where tuning the analysis can improve the results.&amp;nbsp; By configuring the analysis to understand your code better, you can significantly lower false positives and increase the valid bug count for future analyses.&amp;nbsp; In this case, some false positives should be assigned to a static analysis expert to retune the analysis to improve the results.&amp;nbsp; Fixing false positives in this way is significantly more efficient than having developers wade through incorrect results.&amp;nbsp; False positive "fatigue" is a frequent cause for miscategorization as well.&lt;/li&gt;&lt;li&gt;False positives often are a signal of poor coding practices.&amp;nbsp; If the tool is confused by the code, then it is more likely that the code may be confusing to a new developer inheriting the code.&amp;nbsp; False positives tend to show around code that could be improved through refactoring.&lt;/li&gt;&lt;li&gt;Intentional's are also an interesting area to look.&amp;nbsp; The most common reason for dismissing a bug report as intentional is that the tool did not have access to an assumption.&amp;nbsp; Of course, the root of many errors is a changed assumption which causes problems to occur in the future.&amp;nbsp; Intentional's often signal an opportunity for defensive coding.&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Process and Alignment&lt;/b&gt; &lt;br /&gt;Static analysis tools often come with their own defect tracking information, which is usually quite useful because they also include a browser which helps developers more quickly debug a report.&amp;nbsp; And yet, having another database and UI is extra work.&lt;br /&gt;&lt;br /&gt;Borrowing as much of the already existing bug workflow is key.&amp;nbsp; Developers don't want to learn an additional process on top of their already busy day.&amp;nbsp; Borrow what you can, recognize the differences and institute unobtrusive additional processes to handle them.&amp;nbsp; Every solution we've instituted follow the same general principles but have varying levels of implementation because everyone's process is different.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5704901458470135557-4915637131312623670?l=codeintegrity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeintegrity.blogspot.com/feeds/4915637131312623670/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeintegrity.blogspot.com/2010/05/defect-database-bugs-versus-static.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/4915637131312623670'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/4915637131312623670'/><link rel='alternate' type='text/html' href='http://codeintegrity.blogspot.com/2010/05/defect-database-bugs-versus-static.html' title='Defect Database Bugs Versus Static Source Code Analysis Bugs'/><author><name>Andy</name><uri>http://www.blogger.com/profile/06705630945588101293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5704901458470135557.post-5203984492611626241</id><published>2010-05-06T10:03:00.000-07:00</published><updated>2010-05-06T10:04:40.282-07:00</updated><title type='text'>Offshoring Quality in Static Source Code Analysis</title><content type='html'>Companies who buy static source code analysis solutions will invariably run into the problem of the backlog.&amp;nbsp; After all, they already have a mountain of working code, accumulated from decades to hundreds of person-years of development.&amp;nbsp; There are bugs in the code and a static source code analysis tool will dutifully march through the code and find all sorts of potential problems.&lt;br /&gt;&lt;br /&gt;At &lt;a href="http://www.codeintegritysolutions.com/"&gt;Code Integrity Solutions,&lt;/a&gt; we've seen backlogs as small as a few hundred on a small codebase to over 50,000 on the largest codebases in the world.&amp;nbsp; Average backlogs are in the thousands.&amp;nbsp; Getting through this backlog takes time, effort and skill.&amp;nbsp; The rewards are usually worthwhile because within this backlog are usually some very good showstoppers.&amp;nbsp; And yet software development teams are always short on resources.&amp;nbsp; Rarely will a product owner stop all development to through the backlog to find those gems hidden among the other high, medium, low and false positive results.&lt;br /&gt;&lt;br /&gt;Oftentimes, we see the engineering management suggest, "why don't we have our offshore team do it."&amp;nbsp; The offshore team may already be charged with maintenance and so it seems a logical group to address a big backlog of static analysis defects.&amp;nbsp; It certainly is a cost effective solution and it &lt;i&gt;will&lt;/i&gt; make the backlog go away.&amp;nbsp; Problem neatly solved and management is happy.&lt;br /&gt;&lt;br /&gt;Of course, successful development through offshore teams is a discipline all unto its own.&amp;nbsp; We won't repeat any of that here.&amp;nbsp; We discuss here the static analysis flavors of these challenges below.&amp;nbsp; These problems exist in &lt;b&gt;any&lt;/b&gt; team but are amplified in an offshore environment. &lt;br /&gt;&lt;ul&gt;&lt;li&gt;The backlog must be prioritized.&amp;nbsp; The question is who should own the prioritization? Who has a vested interest in quality that you trust to make that decision?&amp;nbsp; The backlog will go away but will it be done in a way that results in significantly improved quality?&lt;/li&gt;&lt;li&gt;Teams are heterogeneous and thus the quality of the prioritization and the quality of the fix will be heterogeneous&lt;/li&gt;&lt;li&gt;Configuration and optimization almost always beats brute force.&amp;nbsp; If a static source code analysis tool misunderstands a construct in your code, this can result in a cascade of false positives.&amp;nbsp; Oftentimes a quick configuration change can wipe away hundreds to thousands of defects saving time (now and in the future) and making the analysis better understand the codebase.&lt;/li&gt;&lt;/ul&gt;What can result from mismanagement is poor results done inefficiently.&amp;nbsp; Falsely identifying issues, fixing problems that aren't real, and plowing through report after report inefficiently can result in wasted dollars, missed opportunities to improve the quality and tensions between offshore and on-shore teams.&amp;nbsp; Keep in mind that when the future showstopper invariably hits, management will ask, "was this problem found by our static analysis tool and could we have avoided it if we had done it right the first time."&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Any good manager knows that they need to provide the right support, infrastructure and structure to make their team successful.&amp;nbsp; For example:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Set good standards for diagnosis of issues.&amp;nbsp; Everyone needs to understand what a critical, high, medium, low, etc. categorization is.&amp;nbsp; Some prioritize based on checker types (e.g. memory leaks, concurrency, etc.).&amp;nbsp; Some prioritize based on whether the bug is found in a critical path, conditional path or in an exception path.&amp;nbsp; Some prioritize based on what part of the code it is found in.&amp;nbsp; Some use the built-in prioritization mechanisms of the static tool.&amp;nbsp; Most use a combination.&lt;/li&gt;&lt;li&gt;Train the team.&amp;nbsp; We found mentoring the team through real bugs is the best way to get everyone on the same page.&amp;nbsp; Expectation setting is critical here.&amp;nbsp; These sessions help gain consistency in results.&amp;nbsp; In addition, finding the &lt;a href="http://www.informationweek.com/news/development/tools/showArticle.jhtml?articleID=224600143"&gt;"ah-ha" &lt;/a&gt;moments gets the team jazzed and energized to do good.&lt;/li&gt;&lt;li&gt;Set up a trust but verify model where results are audited.&amp;nbsp; Use these audits as learning opportunities to steer the team in the right direction and finetune further.&amp;nbsp; We've audited results and identified many opportunities to improve standards, to train the team appropriately on certain topics and to open up discussion on how best to handle certain situations.&lt;/li&gt;&lt;li&gt;Have an expert on hand who is aggressively seeking ways to tune the analysis.&amp;nbsp; It is much more efficient than brute-force going through the backlog and it set ups the analysis to be much more accurate in the future.&amp;nbsp; A simple configuration change can save weeks of effort.&amp;nbsp; &lt;a href="http://www.grammatech.com/products/codesonar/media/ESC_SJ_2010/"&gt;Paul Anderson, the VP of Engineering at Grammatech recently did a presentation at the ESC Show in San Jose&lt;/a&gt; that suggested that the more false positives there are the more exponentially higher misdiagnoses there are.&lt;/li&gt;&lt;/ul&gt;Of course the challenge of instituting a successful static source code analysis process takes a lot more than following a few bullet points.&amp;nbsp; If you decide to go off-shore instead of outsourced or doing it with your on-shore team, it can be successful.&amp;nbsp; With the right effort and expertise, you can effectively kill the backlog, improving your quality without having to stop everything else in its tracks.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5704901458470135557-5203984492611626241?l=codeintegrity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeintegrity.blogspot.com/feeds/5203984492611626241/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeintegrity.blogspot.com/2010/05/offshoring-quality-in-static-source.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/5203984492611626241'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/5203984492611626241'/><link rel='alternate' type='text/html' href='http://codeintegrity.blogspot.com/2010/05/offshoring-quality-in-static-source.html' title='Offshoring Quality in Static Source Code Analysis'/><author><name>Andy</name><uri>http://www.blogger.com/profile/06705630945588101293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5704901458470135557.post-3169616571945615664</id><published>2010-04-29T20:01:00.000-07:00</published><updated>2010-04-29T20:01:21.490-07:00</updated><title type='text'>Cramming More Value Into the Static Analysis Workflow</title><content type='html'>Static analysis tools find bugs in source code during the earliest part of development.&amp;nbsp; Where in the process static analysis is used varies widely, depending upon the software development organization's specific goals and the environment in which it will operate in.&amp;nbsp; Some organizations run static analysis on entire codebases just before release.&amp;nbsp; Others run static analysis on a nightly basis or several times a day during a continuous integration process.&amp;nbsp; Still others run static analysis locally on a developer's desktop so that they can find and fix problems on the snippet of code they are working on.&lt;br /&gt;&lt;br /&gt;One can make a distinction of when static analysis MUST be run versus when it is CONVENIENT to be run.&amp;nbsp; Organizations are increasingly using the results of static analysis as part of the acceptance criteria for a codebase.&amp;nbsp; Meeting acceptance criteria may be just before release, before collapsing a development branch into the main line or even before a developer checks in code.&amp;nbsp; It makes a lot of sense to ensure that all reported issues have been addressed as part of graduating the code from one level to the next.&lt;br /&gt;&lt;br /&gt;Of course, we all know it's a good practice to prepare well in advance of a future requirement.&amp;nbsp; By providing static analysis throughout the development process, you eliminate the situation where you're two days before release and you run the static analysis tool and find that you have hundreds of problems yet to be addressed.&amp;nbsp; Clearly, fixing bugs as you develop will improve the quality and security of the software early, letting you more comfortably coast into and through your acceptance process.&lt;br /&gt;&lt;br /&gt;What else should be in your acceptance process?&amp;nbsp; The static analysis workflow is a convenient place to find and fix other problems other than just bugs.&amp;nbsp; Here are some additional things that static analysis can help you enforce, conveniently borrowing the same workflow.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Industry coding standards such as MISRA, Scott Meyers Effective C++&lt;/li&gt;&lt;li&gt;Government compliance standards such as DO-178B, PCI and FDA&lt;/li&gt;&lt;li&gt;Internal coding standards&lt;/li&gt;&lt;li&gt;Architectural coding standards&lt;/li&gt;&lt;/ul&gt;Using the same workflow makes it easier and efficient for developers and administrators.&amp;nbsp; Tools are starting to combine their capabilities to help software development organizations solve bigger problems.&amp;nbsp; One of the major vendors in the static analysis space recently announced the support for &lt;a href="http://www.klocwork.com/news/press-releases/releases/2010/PR-2010_04_27-Klocwork-Announces-Support-For-MISRA.php"&gt;MISRA&lt;/a&gt;.&amp;nbsp; Many vendors offer the ability to author custom checks to find and fix a wide range of problems.&amp;nbsp; They provide a huge benefit because these checks can find problems across all codebases in the company and can be modified to meet the changing needs of the organization.&amp;nbsp;&amp;nbsp; Custom checks can be written to enforce coding standards, architectural requirements and find defect categories that are particularly important to your company.&amp;nbsp; Custom checking can also serve as a complement to code review.&lt;br /&gt;&lt;br /&gt;So leverage existing workflows by adding other types of checking during the right points in the development process.&amp;nbsp; And then arm the developers with the ability to meet their goals easily.&amp;nbsp; The more you can push checking up front, the more likely you'll meet your time pressure goals.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5704901458470135557-3169616571945615664?l=codeintegrity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeintegrity.blogspot.com/feeds/3169616571945615664/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeintegrity.blogspot.com/2010/04/cramming-more-value-into-static.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/3169616571945615664'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/3169616571945615664'/><link rel='alternate' type='text/html' href='http://codeintegrity.blogspot.com/2010/04/cramming-more-value-into-static.html' title='Cramming More Value Into the Static Analysis Workflow'/><author><name>Andy</name><uri>http://www.blogger.com/profile/06705630945588101293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5704901458470135557.post-5974705155851683921</id><published>2010-04-22T14:08:00.000-07:00</published><updated>2010-04-22T14:08:20.432-07:00</updated><title type='text'>Lowering Developer Resistance to Static Analysis Tools</title><content type='html'>Imagine a team of software engineers who embraces the software development process.&amp;nbsp; They&amp;nbsp; dutifully create their unit tests before writing a line of code, run and fix all necessary static analysis and dynamic tests prior to check-in, fix all compiler warnings, participate actively in code review.  They write code that is brilliant, yet easy to understand and maintain.  They write unbrittle code that can withstand the inevitable changes to the assumptions that surround the code.  Everything of course is well documented.&lt;br /&gt;&lt;br /&gt;They realize that their code is bigger than themselves -- that it has to work as part of a larger ecosystem of code created by engineers from around the world.  They realize also that their code may last for decades and may change ownership several times.  They realize that taking proactive efforts to make good code mean less reaction down the road.&amp;nbsp; They welcome new process that will help them write better code overall even if it means a little more work upfront.&lt;br /&gt;&lt;br /&gt;Most developers won't disagree with these ideals, however, when instituting process that is "good for us to do", they bristle at, argue with and/or ignore the change.  It's not their fault.  Developers are often set up to fail at following the process right from the beginning.&lt;br /&gt;&lt;br /&gt;With every new change comes an investment in time and energy to make it happen.  If you were asked to add a new step in your development process, you have to make an investment (sometimes sizable) at the beginning to understanding and instituting the change and subsequent investments every time you perform that new added step.  &lt;br /&gt;&lt;br /&gt;We all know that developers are under immense pressure to deliver more for less. They simply aren't given enough time to make the upfront and ongoing investments.  Routinely asking engineers to do feature X in 2 days instead of 3 days will result in cries of "foul" every time something might get in the way of their already oversubscribed status quo.  Clearly the managers and project managers must understand and manage properly the time pressures.&lt;br /&gt;&lt;br /&gt;In addition, the upfront and ongoing investments in time and energy can be significantly reduced.&amp;nbsp; When instituting static analysis tools at various companies, we've found the following to be helpful:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Training can be a huge time saver.&amp;nbsp; But not all people learn the same way.&amp;nbsp; Some like it fed to them and some like to go and get it.&amp;nbsp; &lt;a href="http://www.codeintegritysolutions.com/"&gt;We&lt;/a&gt;'ve found that taking a multi-pronged approach, by offering training, group and individual mentoring, a centralized resource with good, simple step-by-step instructions, a helpdesk, a forum/wiki and more get just about everyone onboard.&lt;/li&gt;&lt;li&gt; Package it well.&amp;nbsp; Developers can figure out just about anything technical.&amp;nbsp; But, it doesn't mean they have to.&amp;nbsp; Having to fiddle with getting a tool installed may provide some individual technical satisfaction but doesn't mean they've done anything useful towards meeting a business goal.&amp;nbsp; Multiply that by how many developers you have and you've created a large time sink.&amp;nbsp; You'll also lose support by developers in this way by making it hard to use.&lt;/li&gt;&lt;li&gt;Keep the standard workflow simple.&amp;nbsp; We worked with one organization which gave every developer the standard training and then washed their hands of it.&amp;nbsp; After having thrown it over to the developers, it was no wonder that a year later hardly anyone was using it.&amp;nbsp; One of the biggest problems was the tool was given to the developer with no workflow and no purpose.&amp;nbsp; No queries were set up.&amp;nbsp; No screens were customized. The developers had to suddenly become experts at using the tool -- a foolish use of time given tool usage was certainly not a core competence of the organization.&amp;nbsp; Spoon feeding a simple, easy-to-follow process doesn't mean you think your developers are dumb.&amp;nbsp; It means that they get to spend less time wrestling with the tool and more time doing what they are paid to do - write great code that solves the company's mission.&amp;nbsp; Again, without the right process, you'll lose support.&lt;/li&gt;&lt;li&gt;Automation is key.&amp;nbsp; Having multiple steps in the process across multiple tools in the toolchain mean added time, human error and frustration.&amp;nbsp; Integrating static analysis with bug tracking, source control management, LDAP, policy databases, build scripts, etc. lowers the ongoing investment.&lt;/li&gt;&lt;li&gt;Another area ripe for improvement is performance.&amp;nbsp; We've run into codebases where the analysis takes 30 hours or more.&amp;nbsp; Static analysis has to analyze a lot of stuff but there are ways to improve the performance dramatically.&amp;nbsp; We've tuned some analyses down to minutes depending upon the deployment model.&amp;nbsp; This significantly lowers the "cost" and opens up new possibilities for when and where analysis can be performed&lt;/li&gt;&lt;li&gt;One of the biggest complaints you'll hear from developers is that the results have false positives - meaning results that are incorrectly noted as issues.&amp;nbsp; Every static analysis tool will generate false positives but the more the tool understands your code (usually through configuration), the more it will produce better results.&amp;nbsp; Every time a developer has to examine an issue that is eventually is false is wasted time (although some will argue that not all of the time is wasted because false positives can signal poorly written code).&amp;nbsp; Lower this cost and raise the value of the tool through tuning.&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;If you aren't a developer get them involved.&amp;nbsp; There's nothing like having a champion or two help you get buy-in.&amp;nbsp; Involve them in defining the process - after all, nobody knows the process better than the developers themselves.&amp;nbsp; Developers have to see and believe in the true value, not the inflated value.&amp;nbsp; Do this by running mentoring sessions where everyone can plainly see the value and the limitations of the tool.&amp;nbsp; Set expectations all around accordingly.&lt;/li&gt;&lt;/ul&gt;In concept, static analysis tools are simple to use.&amp;nbsp; In addition, your developers are smart, so it's tempting to just give them the tools and let them figure out the value.&amp;nbsp; It's a given your developers have too many features to deliver in too short a time.&amp;nbsp; You need to lower the cost of adding static analysis to their workflow.&amp;nbsp; You'll lower resistance and improve their efficiency while improving the overall quality and security of the code.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5704901458470135557-5974705155851683921?l=codeintegrity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeintegrity.blogspot.com/feeds/5974705155851683921/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeintegrity.blogspot.com/2010/04/lowering-developer-resistance-to-static.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/5974705155851683921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/5974705155851683921'/><link rel='alternate' type='text/html' href='http://codeintegrity.blogspot.com/2010/04/lowering-developer-resistance-to-static.html' title='Lowering Developer Resistance to Static Analysis Tools'/><author><name>Andy</name><uri>http://www.blogger.com/profile/06705630945588101293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5704901458470135557.post-2675389197570561915</id><published>2010-04-11T08:33:00.000-07:00</published><updated>2010-04-12T06:53:11.707-07:00</updated><title type='text'>Two Views of Static Analysis</title><content type='html'>Engineers have differing expectations of static source code analysis tools. Opinions of its usefulness vary widely but generally fall into one of two extreme camps.  &lt;br /&gt;&lt;br /&gt;On the one hand, some engineers think that program analysis couldn't possibly produce anything worthwhile.  They believe all the results are useless and not worth the effort to examine.  They may have had experience in the past with products such as Lint, which produced copious amounts of “useless” warnings.   These “naysayer” engineers will rarely give static analysis a real chance and instead avoid using it, or worse yet, dismiss every result as a “false positive” or “never going to happen”. &lt;br /&gt;&lt;br /&gt;Conversely, some engineers have the unrealistic expectation that static analysis will only produce valid, critical defects that must be fixed.  These “naive” engineers may not have a good grounding of how static analysis technologies work and what its limitations are.  They may equate static analysis tools with dynamic tools, which almost always report real bugs but lack the coverage and ease of static tools.  These engineers will very quickly be disappointed.  Static analysis finds potential problems based on sophisticated algorithms.  These algorithms operate on source code and build-level information and may not have access to all of the run-time assumptions.  Highly complex or very custom code can also cause the tool to misfire unless the tool has been properly tuned.  Naive engineers may also "fix" issues that don't really need fixing on blind faith or to quiet the tool. Attempted bug fixes can cause other areas to break.&lt;br /&gt;&lt;br /&gt;Nearly every organization has these polar extremes and everything in between.  Naysayers cause others to lose confidence in the tool.  The naive engineers may lose credibility by overstating the tool’s capability. Somewhere in between is the truth -- that static analysis produces good and useful but not perfect results.  There are going to be good bugs you really want to fix.  There are also going to be low priority issues that you don’t really need to fix (similarly, very few organizations fix even a quarter of the bugs logged in their bug tracking system).  Other issues will be just plainly wrong (a false positive) and signals that the tool couldn’t understand that part of the code well or that the analysis needs to be configured.&lt;br /&gt;&lt;br /&gt;Engineers need to understand not just what the tool can do, but what it can’t do as well.  When an engineer is trying to interpret a result, it helps to understand what the tool did to produce that result.  There are many strategies for getting a group of engineers to understand the range of value a static tool provides.  Training, documentation and process changes are necessary but not every engineer learns by reading a manual or attending training class.  One of the most effective ways for engineers to learn is to do some joint triaging of results.  For &lt;a href="http://www.codeintegritysolutions.com"&gt;Code Integrity Solutions&lt;/a&gt;, we’ve ran very successful sessions by simply going through bugs with a group of engineers in the room.  We discuss a handpicked set of bugs, debate them and resolve them together.  These sessions  (even as short as an hour) enable everyone to come to a general conclusion around a common set of results and start the basis for a standard by which to triage defects.  Senior engineers shine in these types of environments because they not only quickly understand the tool's capabilities but also are able to impart their standards to the less experienced team members.&lt;br /&gt;&lt;br /&gt;We often hear these points made:&lt;br /&gt;* This is not really a bug but this is poorly written code and needs to be redone&lt;br /&gt;* Ah, I see why the tool is reporting this incorrectly.  All I have to do is make a mod to the analysis to fix that&lt;br /&gt;* I wouldn't have thought that it was a bug.  I now see why it is after taking a deeper look.&lt;br /&gt;* If we change this assumption slightly, then this would become a bug.  For defensive coding reasons, we should change it, especially since we occasionally change ownership of code.&lt;br /&gt;* I understand why this tool is not catching this type of problem.  I need to use a different method for finding these types of problems.&lt;br /&gt;&lt;br /&gt;Invariably the naysayer comes to understand the value the tool can provide for him or her and the rest of the organization.  By also showing false positives, the naive engineers can see any limitations of the tool.  For everybody involved, they see the nuances of the tool and the level of effort required for effectively evaluating results.  A few hours of time makes for weeks of productivity gains.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5704901458470135557-2675389197570561915?l=codeintegrity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeintegrity.blogspot.com/feeds/2675389197570561915/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeintegrity.blogspot.com/2010/04/two-views-of-static-analysis.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/2675389197570561915'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/2675389197570561915'/><link rel='alternate' type='text/html' href='http://codeintegrity.blogspot.com/2010/04/two-views-of-static-analysis.html' title='Two Views of Static Analysis'/><author><name>Andy</name><uri>http://www.blogger.com/profile/06705630945588101293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5704901458470135557.post-523619402759255749</id><published>2010-03-20T15:00:00.000-07:00</published><updated>2010-03-20T15:15:07.931-07:00</updated><title type='text'>The False False Positive</title><content type='html'>Static analysis tools report potential bugs in source code by analyzing the structure of the code for inconsistencies and flaws.  Sometimes they get it right and sometimes they get it wrong depending upon how strong the analysis is and how complex the code may be.  These days, static analysis tools are getting more and more sophisticated, doing statistical analysis and interprocedural analysis (where information is tracked across functions) across all the logical paths (sometime numbering many millions) in the code.  Dataflow analysis can track values across functions to produce bug reports that span multiple levels of calls.&lt;br /&gt;&lt;br /&gt;While increased sophistication means that static analysis tools can catch more problems with a higher degree of accuracy, the burden increases on the reviewer of the results to interpret them correctly.  If you were grep'ing through some code for something you can quickly review (and dismiss) many of the results because you understand what your "analysis" is doing.  With static source code analysis, this is much less apparent. &lt;br /&gt;&lt;br /&gt;We see many engineers look at a complex bug report and not take the necessary time to understand the problem and fix it.  This is mostly because they don't understand what the static analysis tool is doing and how deep it is analyzing the code.  The result is a real bug being marked as a false positive - or a "false false positive" if you will.  These bugs then disappear off the queue never to be seen again - a lost opportunity.&lt;br /&gt;&lt;br /&gt;How do you minimize the number of false false positives?  Lots of different ways:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Training and/or mentoring of the reviewer team helps the team see how to properly disposition a defect&lt;/li&gt;&lt;li&gt;Auditing of false positives either periodically or all-the-time.  Incorrect markings are great learning opportunities to correct incorrect usage.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Metrics that monitor the general false positive rate so that individuals can be benchmarked against them to detect anomalies.  If one engineer is marking 80% of the defects as false positives versus a general 30% average, then this is likely a correctable problem.&lt;/li&gt;&lt;li&gt;Have double reviews of defects.  Similar to pair programming make sure each disposition has "two pairs of eyes" on it&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;By making triaging more accurate you get much more value from your tool and minimize the incorrect throwaway.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5704901458470135557-523619402759255749?l=codeintegrity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeintegrity.blogspot.com/feeds/523619402759255749/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeintegrity.blogspot.com/2010/03/false-false-positive.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/523619402759255749'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/523619402759255749'/><link rel='alternate' type='text/html' href='http://codeintegrity.blogspot.com/2010/03/false-false-positive.html' title='The False False Positive'/><author><name>Andy</name><uri>http://www.blogger.com/profile/06705630945588101293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5704901458470135557.post-4981722911827760330</id><published>2010-03-08T12:32:00.000-08:00</published><updated>2010-03-08T17:05:18.013-08:00</updated><title type='text'>Does One Size Fit All With Static Source Code Analysis?</title><content type='html'>If you take a look at all the software written in this world you'd find a vastly heterogeneous set of applications.  The list of these applications include medical devices, military/aerospace, banking, games, network telecommunications, automotive, gaming, accounting, wireless and much much more.&lt;br /&gt;&lt;br /&gt;As to the importance of quality, security and reliability, even a gaming application can demand good quality and high performance.  While a game crashing may be a trivial situation for an individual games customer, the game publisher may be faced with an expensive patch they must rollout or a poor review to hurt their sales.  Good software quality and quality is good business.&lt;br /&gt;&lt;br /&gt;Static source code analysis is up to the task of helping software developers improve the quality and security of their code in the earliest part of the development process.  Finding critical problems in source code is simply easier and faster to fix.  However, codebases are very different.  They use different libraries, have autogenerated code.  They have different memory allocation mechanisms and concurrency and locking mechanisms.   They have different internal coding standards by which they adhere to.  They support many different platforms.  They may come in very different flavors like C, C++, C# and Objective-C some of which bear very little resemblance to the other.  Even within C, there are different implementations of the C standard.  What's a static analyzer to do? &lt;br /&gt;&lt;br /&gt;Static source code analysis does its best job to interpret the code at the cost of potential false positives.  Clearly if the static analyzer cannot understand the codebase it has less information to make good decisions.  Static source analysis vendors ship out their best configuration but it's a one-size fit all.  A medical devices company analyzing 50,000 lines of code for a pacemaker is getting the same settings as a networking company with a 18,000,000 lines of code operating system.  What's important for one company may be extremely different from another.  For instance, a company who provides accounting software that runs on the desktop could care less about memory leaks as the application is frequently exited and reentered.  Counter that with network routing software that must be up 99.999% of the time and may run continuously for years.  A crash on an embedded system on an airplane or automobile may be different in priority than to a crash on a web application where automatic failover to a different server is built into the infrastructure.&lt;br /&gt;&lt;br /&gt;In addition, the way an application is coded may be different.  The application may use standard memory allocators provided by the operating system or the application may use its own proprietary memory management techniques. &lt;br /&gt;&lt;br /&gt;The analysis may be more conservative or aggressive than desired.  A medical devices company who wants to find every potential bug has a different tolerance for the "noise" than a large gaming application which has to deal with tens of thousands of bugs and only wants to hit the highest priority ones.&lt;br /&gt;&lt;br /&gt;One size cannot fit all.  Only one version of the software comes from the provider with the same factory settings as everybody else.  That same version is used for all industries and even in vendor presales situations as well.  It's understandable that this is the case.  Vendors understandably must provide the tool with the best possible setting for as many different situations as possible.&lt;br /&gt;&lt;br /&gt;But clearly it can't address all situations optimally.  With just some smart tuning, the analysis can be much smarter about the specific codebase it is looking at and make the results more relevant and accurate.   In some cases, we've been able to tune away thousands of defects with just a single configuration change which saves weeks of collective developer time.   Other cases of tuning have resulted in hundreds of more critical bugs being reported that wouldn't have otherwise with the "factory settings."  The payoff to good expert tuning is both immediate and long term.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5704901458470135557-4981722911827760330?l=codeintegrity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeintegrity.blogspot.com/feeds/4981722911827760330/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeintegrity.blogspot.com/2010/03/does-one-size-fit-all-with-static.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/4981722911827760330'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/4981722911827760330'/><link rel='alternate' type='text/html' href='http://codeintegrity.blogspot.com/2010/03/does-one-size-fit-all-with-static.html' title='Does One Size Fit All With Static Source Code Analysis?'/><author><name>Andy</name><uri>http://www.blogger.com/profile/06705630945588101293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5704901458470135557.post-2683884154020326666</id><published>2010-02-27T07:23:00.000-08:00</published><updated>2010-02-27T07:48:25.422-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fixing bugs audit priority'/><title type='text'>Who's Guarding the Henhouse When Fixing Source Code Analysis Bugs?</title><content type='html'>What happens when you have a large development team where each developer is responsible for their own quality?  On the face of it, this is what every development organization wants.  Developers should feel ownership of their code. However, without the right minimum standards instituted you end up with inconsistency and a false sense of security.&lt;br /&gt;&lt;br /&gt;Development organizations are heterogeneous.  You have great developers and you have developers that may be well, not so great.  You have experienced developers and you have junior developers.  One thing is for sure, is that everyone has their own sense for what is sufficient.  Training, code review, institution of clear standards are all important ways to raise the bar at least to what is acceptable.  This is why a transparent acceptance criteria is so important.&lt;br /&gt;&lt;br /&gt;Yet, source code analysis often misses the bar.  Many organizations have started to integrate source code analysis into their development process and have put in acceptance criteria gates.  They are most commonly, "no new static analysis defects should be introduced" or even the more stringent "no static analysis defects in code."    All very good criteria that greatly improve the quality and security of the developed product while also improving developer efficiency.&lt;br /&gt;&lt;br /&gt;But many organizations fall down in execution.  Developers analyze code, they see the results and fix the bugs.  All seems good.  But, I've seen in many high end software development organizations, where developers routinely mark reported defects as "false positive" or "intentional" (meaning this is how I intended it to be - not a bug).  We find by auditing these defects that they are indeed real bugs, some of them quite nasty.&lt;br /&gt;&lt;br /&gt;The developer who is under time pressure just marks these problems away.  Other developers, who may have their own biases against source code analysis simply don't take time to understand what the tool is uncovering.  Good bugs that could be caught at its earliest point in the development cycle get missed, only to be found in later, more expensive downstream process.&lt;br /&gt;&lt;br /&gt;The problem occurs when you have developers deciding on their own criteria.  Unlike bugs from a bug database, many organizations let the developers self-prioritize.  In doing so, the "bad" developers do whatever they can to shut the tool up and move on.  The good developers take the time to understand.  Source code analysis is great for good developers but even more needed for bad developers.&lt;br /&gt;&lt;br /&gt;What Can Be Done?&lt;br /&gt;Training is useful.  Prioritization by a different developer or a review team is important and can be tied to release criteria.  Code review can create good learning experiences.  Spot-checking and other type of auditing can help catch bugs and present new learning opportunities.&lt;br /&gt;&lt;br /&gt;A good way to start is to do a good audit of your "false positives" and "intentional"'s.  At &lt;a href="http://www.codeintegritysolutions.com"&gt;Code Integrity Solutions&lt;/a&gt;, we provide audits to companies' results so that companies can&lt;br /&gt;&lt;ul&gt;&lt;li&gt; get a sense for how pervasive the problem is&lt;/li&gt;&lt;li&gt;catch a few good bugs that they would have missed&lt;/li&gt;&lt;li&gt;identify problem areas for training&lt;br /&gt;&lt;/li&gt;&lt;li&gt;identify learning opportunities to help developers know what is acceptable&lt;/li&gt;&lt;li&gt;help provide needed data for coding standards and acceptance criteria&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Having the developers take ownership of quality through static analysis is critical to creating a good scalable process.  But without the right checks and balances in place you defeat the benefit of improving the areas that need it the most.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5704901458470135557-2683884154020326666?l=codeintegrity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeintegrity.blogspot.com/feeds/2683884154020326666/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeintegrity.blogspot.com/2010/02/whos-guarding-henhouse-when-fixing.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/2683884154020326666'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/2683884154020326666'/><link rel='alternate' type='text/html' href='http://codeintegrity.blogspot.com/2010/02/whos-guarding-henhouse-when-fixing.html' title='Who&apos;s Guarding the Henhouse When Fixing Source Code Analysis Bugs?'/><author><name>Andy</name><uri>http://www.blogger.com/profile/06705630945588101293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5704901458470135557.post-6017900022945888885</id><published>2010-02-07T08:35:00.000-08:00</published><updated>2010-02-07T08:39:46.501-08:00</updated><title type='text'>Must Read Article on Static Analysis</title><content type='html'>Coverity recently published an insider's view to &lt;a href="http://portal.acm.org/citation.cfm?id=1646353.1646374"&gt;building a static analysis tool&lt;/a&gt;.  It does a great job of explaining the practical issues in building a world-class tool that is depended upon by so many software development organizations in so many different industries.&lt;br /&gt;&lt;br /&gt;If you've ever used Coverity, or any other static analysis tool, you will have a more healthy appreciation of how difficult static analysis can be.  It just might explain some headscratchers you may be experiencing.  Static analysis can never be perfect, but it can be darn good enough to provide significant value in the software development process.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5704901458470135557-6017900022945888885?l=codeintegrity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeintegrity.blogspot.com/feeds/6017900022945888885/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeintegrity.blogspot.com/2010/02/must-read-article-on-static-analysis.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/6017900022945888885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/6017900022945888885'/><link rel='alternate' type='text/html' href='http://codeintegrity.blogspot.com/2010/02/must-read-article-on-static-analysis.html' title='Must Read Article on Static Analysis'/><author><name>Andy</name><uri>http://www.blogger.com/profile/06705630945588101293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5704901458470135557.post-4969830339646315905</id><published>2010-01-29T09:15:00.000-08:00</published><updated>2010-02-02T21:44:35.489-08:00</updated><title type='text'>Handling an Embarrassment of Riches</title><content type='html'>&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; text-indent: 36.0px; font: 18.0px 'Times New Roman'"&gt;&lt;span class="Apple-style-span"  style=" ;font-family:'times new roman', serif;"&gt;A good commercial static analysis tool will probably find more bugs in your company's code than you have time to fix.  This sounds like bad news, but take a moment for some attitude adjustment:  The bugs were there all along, so this is actually a good thing, albeit embarrassing.  But it means that your top priority is prioritizing the bugs—which, unfortunately, is a weak point of these tools.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; text-indent: 36.0px; font: 18.0px 'Times New Roman'"&gt;&lt;span class="Apple-style-span"  style="font-family:'times new roman';"&gt;So tweak the heck out of your settings.  There's a lot you can configure, and the vendor’s support staff probably left you with a fairly generic configuration—something that won’t cause problems for them, but which is suboptimal for your needs.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; text-indent: 36.0px; font: 18.0px 'Times New Roman'; min-height: 21.0px"&gt;&lt;span class="Apple-style-span"  style="font-family:'times new roman';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; text-indent: 36.0px; font: 18.0px 'Times New Roman'"&gt;&lt;span class="Apple-style-span"  style="font-family:'times new roman';"&gt;Triage a representative sample of the defects, and if a checker doesn't seem to be producing a lot more signal than noise, move it to the bottom of your public priority list.  (More on this later.)  If a checker seems totally bogus (which is fairly rare) or is irrelevant to your company's concerns (far more common), turn it off completely.  Do this sparingly, as it may be politically impossible to reenable a checker once you've turned it off.  (Conversely, it's also worth looking at the checkers your vendor turns off by default—some of them produce surprisingly important defects.)  If a checker seems flakey, check the configuration and error logs.  It's regrettably easy to waste a &lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-family:'times new roman';"&gt;lot&lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-style-span"  style="font-family:'times new roman';"&gt; of time on false positives caused by build errors.  And if build configuration problems are causing obvious false positives, they're probably causing invisible false negatives as well.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; text-indent: 36.0px; font: 18.0px 'Times New Roman'"&gt;&lt;span class="Apple-style-span"  style="font-family:'times new roman';"&gt;Be cynically realistic about which part of your codebase you're actually going to fix soon. Define components so you can skip analysis on the code you're not going to fix.  For instance, if your product uses third-party code, in theory you're responsible for its quality, and should patch bugs in it. In practice, such bugs rarely get fixed. And if it's mature third-party code, the false positive rate will be high.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; text-indent: 36.0px; font: 18.0px 'Times New Roman'"&gt;&lt;span class="Apple-style-span"  style="font-family:'times new roman';"&gt;Conversely, in-house code that everyone knows is going to be replaced, can be a rich source of accurate bugs that nobody cares about.  Try to get buy-in on excluding such code from analysis. Skipping don't-care code will also speed up the analysis.  Components also help with assigning individual responsibility for defects, which I've found crucial to getting them fixed.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; text-indent: 36.0px; font: 18.0px 'Times New Roman'; min-height: 21.0px"&gt;&lt;span class="Apple-style-span"  style="font-family:'times new roman';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; text-indent: 36.0px; font: 18.0px 'Times New Roman'"&gt;&lt;span class="Apple-style-span"  style="font-family:'times new roman';"&gt;Give a lot of thought to how you report defects, and in what order; the commercial tools aren't going to share your priorities.  Their primary means of reporting defects is on a web page, but their page won't fit your concerns.  Spend a little time reverse-engineering the URL format for browser display of defects.  Do a little URL scripting to generate a simple web page with the links &lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-family:'times new roman';"&gt;your&lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-style-span"  style="font-family:'times new roman';"&gt; organization cares about, in priority order.  Give this page a short, simple, URL and publicize it internally.  (I once used a lovely, scary Coverity poster of a bug under a microscope for this; I put the URL and poster over the corporate pinball machine.)&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; text-indent: 36.0px; font: 18.0px 'Times New Roman'"&gt;&lt;span class="Apple-style-span"  style="font-family:'times new roman';"&gt;If different parts of your organization own different components, segment the report so that an engineer can just look at what he or she cares about.  Be as fine-grained as possible in the report; ideally, have a separate row for each engineer, with his or her name prominently displayed.  (Programmers' pride is one of your most important tools.)&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; text-indent: 36.0px; font: 18.0px 'Times New Roman'"&gt;&lt;span class="Apple-style-span"  style="font-family:'times new roman';"&gt;Within each section, put the most important links first.  This may just be a live link for defects found by the checker(s) that do the best on your code—where what’s best will take judgement and experience to decide.  It will be a tradeoff between how rarely the checker is wrong, versus how serious a bug is when it's right. &lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; text-indent: 36.0px; font: 18.0px 'Times New Roman'"&gt;&lt;span class="Apple-style-span"  style="font-family:'times new roman';"&gt;Another candidate for top billing on your report is new bugs.  If you've started with an unmanageable number of bugs in your old code, you may at least be able to forbid adding new ones.  One last thing you might want on the report is a manually-maintained Top Ten List of particularly amusing bugs.  Used carefully, humor can be an important tool for getting developers' attention, and it can take the sting out of facing harsh truths—which static analysis is embarrassingly good at turning up.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; text-indent: 36.0px; font: 18.0px 'Times New Roman'; min-height: 21.0px"&gt;&lt;span class="Apple-style-span"  style="font-family:'times new roman';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; text-indent: 36.0px; font: 18.0px 'Times New Roman'"&gt;&lt;span style="text-decoration: underline"&gt;&lt;span class="Apple-style-span"  style="font-family:'times new roman';"&gt;Acknowledgements&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; text-indent: 36.0px; font: 18.0px 'Times New Roman'"&gt;&lt;span class="Apple-style-span"  style="font-family:'times new roman';"&gt;This posting is partly based on a talk I gave at the Stanford Computer Science Department and a posting at StackOverflow.  My main debt is to "Weird Things that Surprise Academics Trying to Commercialize a Static Checking Tool" by Dawson Engler, Andy Chou, Ben Chelf, Chris Zak, et al., and to "The Benefits of Source Code Analysis" by Andy Yang.  After I wrote this post, a follow-on to "Weird Things" was published, which covers some of the same issues, and which I highly recommend: &lt;a href="http://cacm.acm.org/magazines/2010/2/69354-a-few-billion-lines-of-code-later/fulltext"&gt;"A Few Billion Lines of Code Later: Using Static Analysis to Find Bugs in the Real World."&lt;/a&gt; &lt;/span&gt;&lt;/p&gt;&lt;div style="text-indent: 18px;"&gt;&lt;span class="Apple-style-span"   style="font-family:'Times New Roman', serif;font-size:180%;"&gt;&lt;span class="Apple-style-span"  style="font-size:18px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5704901458470135557-4969830339646315905?l=codeintegrity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeintegrity.blogspot.com/feeds/4969830339646315905/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeintegrity.blogspot.com/2010/01/handling-embarrassment-of-riches.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/4969830339646315905'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/4969830339646315905'/><link rel='alternate' type='text/html' href='http://codeintegrity.blogspot.com/2010/01/handling-embarrassment-of-riches.html' title='Handling an Embarrassment of Riches'/><author><name>Flash Sheridan</name><uri>http://www.blogger.com/profile/13677318551997068520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5704901458470135557.post-5796154709093907285</id><published>2010-01-22T11:11:00.000-08:00</published><updated>2010-01-22T13:31:14.837-08:00</updated><title type='text'>The Irrelevant Tools Team</title><content type='html'>Software development tools teams have always been a critical part of a software development organization.  The tools engineers, build and release engineers and architects help ensure that the software development infrastructure is contributing to the best and most efficient software development. But what is the extent with which a tools group can positively affect the development organization?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;A Tale of Two Cities&lt;/span&gt;&lt;br /&gt;Recently I was speaking with a tool manager who described his organization as "IT" (information technology) for the software development organization.  His job was to support the development organizations essentially doing "whatever the development managers wanted him to do."  It was clear that his team was handed tasks to do and his job was to manage the resources to address those needs.  He clearly wasn't setting the agenda - instead he was really acting as a direct report to the development organization.&lt;br /&gt;&lt;br /&gt;Contrast that with a similarly sized organization with a completely different tools team.  The tools team there is responsible for much larger range issues - not just the installation and operational aspects of the tools infrastructure.  There they play a pivotal role in defining process and architecting solutions that meet their largest quality, productivity and security goals.  In this type of organization, the tools team is well recognized and funded by the engineering executive management.  By centralizing these functions, they take full advantage of improvements across all the different development groups.  In addition, they provide a healthy counterpoint to the software development organization - pushing for improvements that need to be made that in many other organizations, software developer's resist.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Case in Point&lt;/span&gt;&lt;br /&gt;At &lt;a href="http://www.codeintegritysolutions.com"&gt;Code Integrity Solutions&lt;/a&gt; we work with a lot of organizations to successfully institute static analysis into their organization.  In the first organization, the software development managers had purchased the tool, thinking it would be a good productivity tool.  They then passed ownership over the static analysis solution over to the tools team. The tools team's idea of success was to install the static analysis solution and make the URL available to the developers and to provide support for them if any problems arose.  As you can guess, nobody ended up using the tool and their investment in static analysis had a negative return.&lt;br /&gt;&lt;br /&gt;In the second organization, the purchase was made by the development managers and the tools team in order to solve their larger quality and productivity needs.  There, the tools team was charged with a very different set of criteria:  no new static analysis defects would be introduced for any software development.  The tools team then had to figure out how to set up a deployment and process that would meet that goal.  This necessitated changes to each developer's process, reports to measure progress to multiple parties and the creation of a robust infrastructure that changed the way they developed software.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Search for Relevance&lt;/span&gt;&lt;br /&gt;In recounting these situations, I'm reminded of all the experiences and literature I've read about IT organizations in large corporations.  IT, when considered as just the folks who operate the helpdesk, distribute your username/passwords and come over to fix your machine when it breaks down, is a support infrastructure that is nonstrategic and a target for outsourcing to whoever can provide it the cheapest.  IT organizations who search for ways to create significant efficiencies or enable new business models are the treasured goal of any CIO or VP of IT.&lt;br /&gt;&lt;br /&gt;Tools teams are not that much different in this respect.  When tools teams make the business of developing software better, faster and cheaper, they have a seat at the table, playing a strategic role in making product development organizations more competitive.  Which organization type do you think brings more value?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5704901458470135557-5796154709093907285?l=codeintegrity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeintegrity.blogspot.com/feeds/5796154709093907285/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeintegrity.blogspot.com/2010/01/irrelevant-tools-team.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/5796154709093907285'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/5796154709093907285'/><link rel='alternate' type='text/html' href='http://codeintegrity.blogspot.com/2010/01/irrelevant-tools-team.html' title='The Irrelevant Tools Team'/><author><name>Andy</name><uri>http://www.blogger.com/profile/06705630945588101293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5704901458470135557.post-6432654248139562338</id><published>2010-01-06T10:34:00.000-08:00</published><updated>2010-01-06T11:40:57.232-08:00</updated><title type='text'>Now is the Time.</title><content type='html'>It's a new decade.  Time to turn over a new leaf.  Time to make those significant changes that you had always planned.  We speak to so many software development organizations who have had grand plans to improve the competitiveness of their software development organizations but lack the time, energy and resource to do so.  The fact is, most software development organizations over the years have only made minimal, incremental changes to their software development processes and practices.  The emergencies of the day always take precedence.&lt;br /&gt;&lt;br /&gt;However, even simple improvements to improve the productivity of developers can mean that many more market-winning features.  Being able to deliver fractionally higher productivity than the competition can mean the difference for market leadership.  Engineering will always be the bottleneck, with a long backlog of desired features.  Improving the productivity of that bottleneck provides huge gains to product companies.&lt;br /&gt;&lt;br /&gt;So when is the right change to change the wheels on a moving car?  This economy has provided a convenient time to retrench.  After the drastic cutting of resources, the sluggish nature of the economy has provided an ample opportunity for software development organizations to take a step back and improve the software development process.  When the economy turns around, more new people are hired, the market becomes more competitive and the chance to make internal improvements dwindle.  With the new decade ahead of us, and the economy still not yet turning the corner, Q1 2010 represents a golden opportunity to make improvements for improved scalability of team and business.&lt;br /&gt;&lt;br /&gt;We've met many such companies looking at this time as a way to institute new practices.  Software development organizations mired in waterfall are now using this time to move to Agile development.  Teams used to doing massive, painful integrations are moving to continuous integration.  Organizations used to performing significant manual labor are moving to automation like static source code analysis so that they can squeeze not only more productivity from their employees but also improve the quality of the output.  They know changing the wheels now is a lot easier than changing it later.&lt;br /&gt;&lt;br /&gt;What do you have to show for the last year and a half of economic woe?  Will it have been a time of "sitting on your hands" or a time to wipe the slate clean and make those bold changes that will make your organization a strategic part of the business?&lt;br /&gt;&lt;br /&gt;Upper management won't look kindly to a "hold the fort" strategy.  If you take the opportunity during this down period to make those impactful changes, you'll be using this time wisely to set yourself up for the inevitable upswing.  It's time to take action.  Change is hard but the alternative is worse.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5704901458470135557-6432654248139562338?l=codeintegrity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeintegrity.blogspot.com/feeds/6432654248139562338/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeintegrity.blogspot.com/2010/01/now-is-time.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/6432654248139562338'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/6432654248139562338'/><link rel='alternate' type='text/html' href='http://codeintegrity.blogspot.com/2010/01/now-is-time.html' title='Now is the Time.'/><author><name>Andy</name><uri>http://www.blogger.com/profile/06705630945588101293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5704901458470135557.post-944141359681036808</id><published>2009-12-13T20:18:00.000-08:00</published><updated>2009-12-13T20:35:37.339-08:00</updated><title type='text'>Who Owns Quality?</title><content type='html'>The architect at &lt;a href="http://www.codeintegritysolutionscom"&gt;Code Integrity Solutions&lt;/a&gt; and I were talking the other day about ownership of static analysis.  Who truly "owns" static analysis and therefore drives its success or failure?&lt;br /&gt;&lt;br /&gt;If you look at most large organizations, a central tools group ends up supporting the static analysis tool.  I say "ends up" purposely because oftentimes they were not the drivers for bringing in the static analysis tool -- in some cases, they find out after the fact and simply told to support it once brought in-house.   How well that tool is supported is a big factor in the tool's eventual success within the organization - however what is more important is knowing who is truly responsible for its adoption.  Without a business driver, and therefore the metrics to understand whether the goal is being met, the source code analysis tool is left as a voluntary, nice-to-have tool that gets underutilized for the price paid.&lt;br /&gt;&lt;br /&gt;Tools organizations without these strong business drivers are left to try to deploy a "carrot" solution, enticing the developers with its value.  Left to their own devices, many developers have too much on their plate to do and may not see the big picture of how it can not only improve quality but also productivity.  Inexperienced developers see the short term.&lt;br /&gt;&lt;br /&gt;Some tools teams are very well tied into the business of building software and have the right knowledge and influence to make successful tools rollouts.  Most tools team feel it is sufficient to set it up and let the developers decide if they want to use it.  Someone in the organization has to care about its adoption and successful use.  In some cases it's the development managers.  In other cases it's the executive team who's tired of talking about quality and would rather talk about features.  Quality assurance and central security also should have a vested interest in the use of these types of tools in the development process.&lt;br /&gt;&lt;br /&gt;With the right business driver(s), the right process can be put in place to ensure usage, individual developers know that there are incentives and consequences to use of static analysis and progress can be measured to ensure successful adoption.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5704901458470135557-944141359681036808?l=codeintegrity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeintegrity.blogspot.com/feeds/944141359681036808/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeintegrity.blogspot.com/2009/12/who-owns-quality.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/944141359681036808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/944141359681036808'/><link rel='alternate' type='text/html' href='http://codeintegrity.blogspot.com/2009/12/who-owns-quality.html' title='Who Owns Quality?'/><author><name>Andy</name><uri>http://www.blogger.com/profile/06705630945588101293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5704901458470135557.post-6128997386565023359</id><published>2009-10-19T13:55:00.000-07:00</published><updated>2009-10-19T17:50:00.510-07:00</updated><title type='text'>Inserting Static Analysis Into Your Agile Processes</title><content type='html'>Most software development organizations are moving to Agile development processes. All flavors of companies have started instituting Agile whether the organization is an IT organization supporting their business units or product companies who are developing software for customers.  An important benefit of Agile is the ability to improve cycle times.  Agile enables organizations to iterate much faster on market requirements and to iterate much faster on delivering working software to the market.&lt;br /&gt;&lt;br /&gt;To meet these demands, software development organizations are using everything they can get their hands on to help them accomplish their goals.  Whether it's continuous integration servers or static analysis solutions, development teams are arming themselves with new tools and new processes to capitalize on their ability to meet market needs faster and with less risk.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;From Nightly Analysis to Continuous Analysis.&lt;/span&gt;&lt;br /&gt;Static analysis can help in a number of ways.  Many organizations already have a nightly build in which they require their developers to check-in only code that has been verified as clean.  By making sure their software builds successfully every day, they minimize the risk of having broken code and complex integration steps towards the latter stage of the development process.  It's not a stretch to increase the check-in requirement to also include addressing of all new static analysis defects.  In fact, being alerted to these issues during development make them much easier to fix than when reported later in the development process.&lt;br /&gt;&lt;br /&gt;Continuous integration is a further step in ensuring that the code is being constructed earlier and often.  The challenge for most organizations is having static analysis operate at a reasonable performance to keep up with the build frequency.  A typical large project may take only 15 minutes to build in an optimized environment but take 4-5 hours to analyze.  With the right tweaks, static analysis can be optimized to be much faster.  Often, it takes some outside expertise to assist.&lt;br /&gt;&lt;br /&gt;Inserting static analysis whenever you build is an ideal time.  Builds are a convenient time to run statistics, run automated tests and perform static analysis on your code.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Meeting the Demands&lt;/span&gt;&lt;br /&gt;No developer wants to be the person who breaks the build.  If there are new criteria required to check-in code, then those requirements should be testable by the developer in their development environment so they get a chance to address any problems prior to the more visible tests.  They should therefore be able to make changes to their code and test, fix and iterate until they feel sure that their changes will pass the criteria.  Arming the developers with this capability is not easy.  Static analysis is doing complicated stuff.  The computations that occur take time.  Moving static analysis to the desktop requires both proper performance levels as well as the right usability model.  At&lt;a href="http://www.codeintegritysolutions.com/"&gt; Code Integrity Solutions&lt;/a&gt; we've worked with extremely large codebases (tens of millions of lines of code) that whose analysis times can be chopped down to just minutes).  Better quality code gets checked in when developers can iterate multiple times.  Investing in a developer desktop model provides orders of magnitude benefit including better quality software earlier in the process and improved developer productivity.&lt;br /&gt;&lt;br /&gt;Invest in a good, fast solution for both developers and your software development infrastructure and you'll see your Agile pay off faster!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5704901458470135557-6128997386565023359?l=codeintegrity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeintegrity.blogspot.com/feeds/6128997386565023359/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeintegrity.blogspot.com/2009/10/inserting-static-analysis-into-your.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/6128997386565023359'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/6128997386565023359'/><link rel='alternate' type='text/html' href='http://codeintegrity.blogspot.com/2009/10/inserting-static-analysis-into-your.html' title='Inserting Static Analysis Into Your Agile Processes'/><author><name>Andy</name><uri>http://www.blogger.com/profile/06705630945588101293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5704901458470135557.post-4761498820080161775</id><published>2009-09-21T13:53:00.001-07:00</published><updated>2009-09-21T15:49:00.153-07:00</updated><title type='text'>Static Analysis: Isn't This Supposed to Make my Life Easier?</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://ts4.mm.bing.net/images/thumbnail.aspx?q=1206761952023&amp;amp;id=761b305e1924e096afef3ad612af0a33&amp;amp;url=http%3a%2f%2faliscot.com%2fservicios%2ftyca%2fcompfreak.gif"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 127px; height: 160px;" src="http://ts4.mm.bing.net/images/thumbnail.aspx?q=1206761952023&amp;amp;id=761b305e1924e096afef3ad612af0a33&amp;amp;url=http%3a%2f%2faliscot.com%2fservicios%2ftyca%2fcompfreak.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Software developers have a tough job.  They have to produce working, good quality code from scratch, under immense time pressure and often without a good specification to provide guidance.  Project estimates are always optimistic which leaves the developer in a situation where they have to work twice as hard to deliver what had been promised.  Rarely are developers able to write code to the level of quality that they want to write.  There just isn't enough time in the day.  Is it any wonder that software developers resist adding more things to do in their process?&lt;br /&gt;&lt;br /&gt;Along comes static source code analysis.  Most developers don't want to add an additional step in their already harried process to check bugs that were found by another program.  Here are the typical rants we hear from software developers?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;False positives!!&lt;/span&gt;  Nothing hurts the credibility of the tool more than false positives.  If a tool is more wrong than right, developers won't trust the tool and consider it a waste of time to use.  For most static analysis tools, you spend more time reviewing defects than actually fixing them.  Fix the analysis so that it reports less wrong reports.  Have a team (inside or outside the company) weed out the bad stuff so the development team can focus on developing.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Blend it into the process!! &lt;/span&gt; Forcing developers to take extra steps "out-of-band" not only slows them down but also makes them forget to run it in the first place.  Make it run automatically with each build.  Make it automatically assign defects to developers.  Make it easily create a bug tracking report.  Notify the developers rather than request them to look for it.  Make it easy for them to do their jobs.  Make it so that you don't need any documentation.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Tuning!!  &lt;/span&gt;Developers are already busy enough -- they don't want to add static analysis expert to their growing list of responsibilities.  If the analysis falsely identifies an issue as a bug, there are usually steps that can be taken to improve the analysis so that it understands the code better.  Requiring the engineer to learn the system to be able to modify a configuration, add rules, etc. is a waste of time.  Asking them to write their own static analysis checks is an effort that is often wasted.  Have a static analysis expert make it understand the codebase and have them write the checks that are needed to be productive.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Make it faster!!&lt;/span&gt;  Waiting for builds is bad enough.  Waiting for static analysis to finish can be a time sink especially if it's a requirement to check in "clean code."  Have an expert optimize the performance of the system.  Cut down the analysis so that it analyzes only the stuff that has been changed.&lt;br /&gt;&lt;br /&gt;Truly getting adoption from developers is a tough challenge.  If they don't see the value, they won't use it.  Maximizing the benefit returned from using the tool is just as important as minimizing the cost of learning and operating the tool.  The key to bringing value is to manage this equation so that maximum return is achieved at an individual developer level.  You'll never get perfect adoption without creating some artificial requirements (like not allowing a release without addressing all bugs).  However, you'll have to fight a lot fewer battles if you make your user base as happy as possible.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5704901458470135557-4761498820080161775?l=codeintegrity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeintegrity.blogspot.com/feeds/4761498820080161775/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeintegrity.blogspot.com/2009/09/static-analysis-isnt-this-supposed-to.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/4761498820080161775'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/4761498820080161775'/><link rel='alternate' type='text/html' href='http://codeintegrity.blogspot.com/2009/09/static-analysis-isnt-this-supposed-to.html' title='Static Analysis: Isn&apos;t This Supposed to Make my Life Easier?'/><author><name>Andy</name><uri>http://www.blogger.com/profile/06705630945588101293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5704901458470135557.post-5415435528298604282</id><published>2009-09-09T10:53:00.001-07:00</published><updated>2009-09-09T11:58:46.845-07:00</updated><title type='text'>Are Static Source Code Analysis Solutions One Size Fit All?</title><content type='html'>Automated source code analysis solutions worth their salt are complex products that do heavy duty analysis on complex codebases.  They churn through thousands to millions of lines of code written by teams of developers each with their own skill levels and style.  Millions of paths are typically analyzed in a single run producing what it thinks are valid defects to be examined.&lt;br /&gt;&lt;br /&gt;On one level, you'll hear people say that code is the same whether it is written in Java, C++, C or C#.  After all, some universities give computer science homework assignments that can be written in your language of choice.  On the other hand, there is a high degree of variability in the customer base that a static analysis vendor must provide. There are just some of the significant differences:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Industry - some industries care about different things.  A router company is going to care more about memory leaks because their code may be in operation for months to years at a time.  A desktop application may not care at all about memory leaks because they know their application will be open and closed frequently.  You can imagine that a military aerospace or medical devices company would have vastly different priorities than a SaaS product where the system can be controlled much more easily.  Some organizations may want to squeeze every last possible defect the tool can find at the cost of getting some additional noise.  Others may be looking for a good "bang for the buck" and fix bugs opportunistically without having to wade through false positives.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Development environment - the software development tools space is highly fragmented.  There are hundreds of vendors that provide source control systems, compilers, bug tracking systems, build and continuous integration tools, automated test tools, etc.   On top of that, there may be third party libraries in use and/or code generation tools that supplement the hand-written codebase.  Software applications are almost always built in a custom way and it's hard for a third party tool to get an accurate picture of what the shipped code actually is without a significant amount of tweaking and integration.  A static tool may simply not understand a custom memory allocator or a source/sink for a data flow analysis.  They may also have some compiler incompatibility issues.  What can happen is that you don't get 100% coverage. Tools will typically "fail" silently or make it nonobvious how to find out what your true coverage is.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Development process - similar to the diversity of the software development infrastructure, software development organizations are often very chaotic.  Some organizations follow the traditional waterfall methodology and others follow Agile processes.  These requirements place demands on how a source code analysis is deployed and used.  Some organizations are global with offshore development teams making significant contributions.&lt;/li&gt;&lt;li&gt;Platforms - software development organizations typically commit to a single development platform (usually a specific Unix flavor, Linux, Windows, Mac OS X, etc.).  However, they may be building software that will run on many different target platforms.  Each of these applications use different libraries and may have significant functionality differences.&lt;/li&gt;&lt;/ul&gt;What's a static analysis tool to do to satisfy everybody?  Should the default settings be set conservatively or aggressively?  Are the settings designed to give a good demo/trial or are they  set for a specific industry?  The clear answer is that no tool comes out of the box optimized for your specific codebase.  There is too much variability.&lt;br /&gt;&lt;br /&gt;What's important to do is to build or obtain the expertise to optimize the tool for &lt;span style="font-weight: bold; font-style: italic;"&gt;your&lt;/span&gt; codebase.  After all, you are paying the license fee for the full benefit of the tool.  If you don't take the extra effort to make sure you are optimized, then you are overpaying for the tool. &lt;br /&gt;&lt;br /&gt;We've worked with many organizations who have taken different approaches.  Some of built their expertise in-house with just the standard training as their starting point.  This can take years to obtain expertise, however, the competency remains in-house.  Others take a hybrid approach and allocate the right resources and get an expert to mentor them through the process.  Others use consultants to get them all set up and running and then use their in-house staff to manage and administrate it.  Others outsource everything related to the tool to an outside expert so that they can focus on their core competencies.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5704901458470135557-5415435528298604282?l=codeintegrity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeintegrity.blogspot.com/feeds/5415435528298604282/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeintegrity.blogspot.com/2009/09/are-static-source-code-analysis.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/5415435528298604282'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/5415435528298604282'/><link rel='alternate' type='text/html' href='http://codeintegrity.blogspot.com/2009/09/are-static-source-code-analysis.html' title='Are Static Source Code Analysis Solutions One Size Fit All?'/><author><name>Andy</name><uri>http://www.blogger.com/profile/06705630945588101293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5704901458470135557.post-3566703668074194275</id><published>2009-08-30T16:57:00.000-07:00</published><updated>2009-08-30T19:04:20.869-07:00</updated><title type='text'>What You Didn't Buy When You Bought That Static Analysis Tool</title><content type='html'>When you are buying things, be it at the store or through a vendor for your company, you are really buying results.  The tool or object you purchase is just a means to an end.  Like the old adage goes, you don't go to a hardware store to buy drills, you go there to buy holes.  Static source code analysis solutions are great tools for helping software development organizations find defects earlier in the development process.  However, because they are a technology entering the mainstream, most organizations don't have the experience to know entire effort required to effectively use static analysis.&lt;br /&gt;&lt;br /&gt;When you purchase a static analysis solution you are really buying the defects that are valuable enough for you to take action to fix.  A good measure of the value of the tool is the number of defects that you indeed fix.  What you aren't purchasing are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;the set up and customization required to get the tool set up, tuned and integrated into the toolchain&lt;br /&gt;&lt;/li&gt;&lt;li&gt;the management and administration needed to keep the tool running&lt;/li&gt;&lt;li&gt;the additional hardware required to run it with good performance&lt;br /&gt;&lt;/li&gt;&lt;li&gt;the training and rollout required to bake the tool into the process&lt;/li&gt;&lt;li&gt;the political process required to get people to change their behavior&lt;br /&gt;&lt;/li&gt;&lt;li&gt;the additional steps required for each user to change their process&lt;br /&gt;&lt;/li&gt;&lt;li&gt;the defects that were reviewed and put in the 'not fix' bucket.  These include false positives, don't care alerts, low priority reports and ones that haven't been reviewed.&lt;/li&gt;&lt;li&gt;the time and expertise required to further improve upon the tool or take advantage of  features and capabilities not yet used&lt;/li&gt;&lt;/ul&gt;Even with all of this effort taken together, it's hard to beat the value that a good static analysis tool can bring.  Just remember that buying the tool is just the first in a series of steps that need to be taken to get to success.  Sometimes you have to pay a little bit to get the big payoff.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5704901458470135557-3566703668074194275?l=codeintegrity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeintegrity.blogspot.com/feeds/3566703668074194275/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeintegrity.blogspot.com/2009/08/what-you-didnt-buy-when-you-bought-that.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/3566703668074194275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/3566703668074194275'/><link rel='alternate' type='text/html' href='http://codeintegrity.blogspot.com/2009/08/what-you-didnt-buy-when-you-bought-that.html' title='What You Didn&apos;t Buy When You Bought That Static Analysis Tool'/><author><name>Andy</name><uri>http://www.blogger.com/profile/06705630945588101293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5704901458470135557.post-7565946297943408465</id><published>2009-08-23T22:38:00.001-07:00</published><updated>2009-08-23T22:38:59.656-07:00</updated><title type='text'>Who's Really In Charge Now?</title><content type='html'>Static analysis is fast becoming a standard part of every software development effort. Companies ranging from medical devices companies to Internet ecommerce vendors to car manufacturers to network equipment providers are purchasing static analysis solutions on the promise that finding defects sooner in their development process will save them time, money and embarrassment. The concept sells well at the developer and management levels because it makes sense.&lt;br /&gt;&lt;br /&gt;And, static analysis tools are good these days.  They aren't perfect, but with the right &lt;span style="font-style: italic; font-weight: bold;"&gt;usage&lt;/span&gt; they provide a good bang for the buck. I stress the word "usage". Many companies buy the tool. The vast majority install the tool but a surprisingly high number don't get past running the tool even a couple of times. The product sits on the shelf.&lt;br /&gt;&lt;br /&gt;There are many reasons why this occurs but the one we'll explore today is owner&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.hartmann.com/shop/images/tour/factory_tour_open.gif"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 193px; height: 193px;" src="http://www.hartmann.com/shop/images/tour/factory_tour_open.gif" alt="" border="0" /&gt;&lt;/a&gt;ship. Someone has to own the tool and what happens to the results reported by the tool. Technical ownership is fairly straightforward. Static analysis tools are usually owned the tools group, who is responsible for setting up the software development infrastructure. They set up the factory floor, making sure that the engineers have all the tools they need to be efficient and effective. Automation plays a key role, helping to scale benefits across an entire team. However, unless the proper organizational and process infrastructure is in place, they are likely doomed to failure.&lt;br /&gt;&lt;br /&gt;The purview of the tools group varies but does not include setting up new processes in isolation from the software development team. Oftentimes static tools are thrust on the tools group. The tools group then sets it up with the only goal of offering it as a voluntary service to the software development team. What ends up happening is a static analysis tool that is used by only a few enterprising software developers who believe in the value of tools and of software quality. The tools group is powerless to force more developers to use the tool and only a fraction of the potential value of the tool is realized.&lt;br /&gt;&lt;br /&gt;Tools groups can lower the cost of usage by making it as simple as possible to use, by integrating the tools within their development process more effectively and by providing training, support and mentorship to developers. Tools groups also can take responsibility for tuning the analysis to make sure the results are as relevant as possible. But while carrot approaches are important and necessary, it won't get everyone over. You need to foster experts within the organization who can establish and defend the tool's worth. When you can set check-in, commit or release criteria that include static analysis, then you start getting the usage that will provide the payoffs that were paid for.&lt;br /&gt;&lt;br /&gt;We've seen organizations that mandate that all new issues get addressed. Even false positives are "fixed" because if the code is confusing enough to fool a static tool, it will likely be confusing to the next person who must maintain the code. Others simply require that at least everything needs to be reviewed and it is up to the developers to determine whether they should fix them (the developers must document why they don't fix a problem). Others require specific classes of bugs to be fixed. The rules simply must match the business goals.&lt;br /&gt;&lt;br /&gt;So even though tools groups are essential to the success of static analysis, they cannot be the only owner. Like any change within an organization, it requires executive sponsors, champions and a technical and organizational infrastructure to make it happen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5704901458470135557-7565946297943408465?l=codeintegrity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeintegrity.blogspot.com/feeds/7565946297943408465/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeintegrity.blogspot.com/2009/08/whos-really-in-charge-now.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/7565946297943408465'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/7565946297943408465'/><link rel='alternate' type='text/html' href='http://codeintegrity.blogspot.com/2009/08/whos-really-in-charge-now.html' title='Who&apos;s Really In Charge Now?'/><author><name>Andy</name><uri>http://www.blogger.com/profile/06705630945588101293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5704901458470135557.post-2362728632220940583</id><published>2009-08-03T16:42:00.000-07:00</published><updated>2009-08-04T13:13:43.982-07:00</updated><title type='text'>Hiring, Repurposing, Consulting, Contractors, Outsourcing, Offshoring or Part-timers for Static Source Code Analysis?</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://i280.photobucket.com/albums/kk184/asxoliastos_2008/computer_programming.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 240px; height: 180px;" src="http://i280.photobucket.com/albums/kk184/asxoliastos_2008/computer_programming.jpg" alt="" border="0" /&gt;&lt;/a&gt;When it comes to getting resources to get static analysis underway within your organization, you have a lot of options.  You can hire full-time (or use an already existing teammember), you can get a contractor, you can get consultants and you can outsource/offshore.&lt;br /&gt;&lt;br /&gt;When it comes to designing and operating your static analysis solution, there are many options you can go with.  I like to think that the institution of static analysis in an organization as being divided into several phases.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Requirements - what goals do you hope to get out of it, usage models&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Design / Architecting of the solution within your existing infrastructure&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Implementation - the fine art of setting it all up and automating it&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Maintenance - the ongoing management of the solution, including dealing with the inevitable changes to the code, build environment and the static analysis solution&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt; Clearly, each step requires a different skill set.  These steps can be handled by one senior person (who has all the skills) or by a combination of people each specializing in their own areas.&lt;br /&gt;&lt;br /&gt;We walk through the various choices with their own advantages and disadvantages:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Full-time&lt;/li&gt;&lt;li&gt;Part-time&lt;/li&gt;&lt;li&gt;Contractor&lt;/li&gt;&lt;li&gt;Consulting Firm&lt;/li&gt;&lt;li&gt;Outsourcing / Offshoring&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt; As someone who has hired many people full and part-time, and who has worked with contractors, consultants and outsourcing firms and have founded and worked in two consultancies, I have a few experiences and scars to share.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Full-Time Employee&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Advantages:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Institutionalize all the expertise with your employees&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Flexibility to control your resources and move them to different responsibilities rapidly&lt;/li&gt;&lt;li&gt;Employees benefit from already existing relationships in the company&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt; &lt;span style="font-style: italic;"&gt;Disadvantages:&lt;br /&gt;&lt;/span&gt; &lt;ul&gt;&lt;li&gt;The fully loaded costs of a full-time employee are significantly higher than the salary.  Put in the cost of insurance, training, office space, machine costs, etc. and a $100,000 employee starts looking like a $150,000 cost.  The budgeting process reflects these extra costs and the cost of extra headcount.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Employees are often fairly flexible resources that are assigned many different responsibilities but are therefore constantly being pulled onto other urgent projects of the day.&lt;/li&gt;&lt;li&gt;Hiring takes extra effort.  Employee hiring should be looked upon as a permanent action.  Will this person with these specialized skills be the optimum fit years from now?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;You may need to train this person.  It's hard to hire someone who is both flexible for the long term and highly specialized for your need today.  It takes months to even years of investment to develop a good level of expertise in-house.&lt;/li&gt;&lt;li&gt;Gaps in time such as for vacation and sick days require coverage, particularly for ongoing management and administration.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt; &lt;span style="font-weight: bold;"&gt;Part-Time Employee&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Advantages:&lt;br /&gt;&lt;/span&gt; &lt;ul&gt;&lt;li&gt;Some roles don't need to be full-time.  Particularly for a younger company, you may not be able to justify a full-time build engineer or a static analysis expert.&lt;/li&gt;&lt;li&gt;Part-time enables you to pay for only what you need but still get what you need for the amount that you need it for.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;   &lt;span style="font-style: italic;"&gt;Disadvantages:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;If you predict growth, then part-timers are not very scalable.&lt;/li&gt;&lt;li&gt;Part-timers also carry a fully-loaded cost, oftentimes higher in proportion to a full-time employee.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt; &lt;span style="font-weight: bold;"&gt;Contractor&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Advantages:&lt;br /&gt;&lt;/span&gt; &lt;ul&gt;&lt;li&gt;Contractors need to prove their existence every day.  They know they have to provide a high level of service or be replaced.&lt;/li&gt;&lt;li&gt;Contractors can be started up quickly and can be removed at the end of the project without any HR headache.  Some projects make sense for a period of time and not forever.&lt;/li&gt;&lt;li&gt;You can hire contractors that are highly specialized.  Perhaps it's a particular product expertise, or a particular process expertise - you can hire highly experienced people from a temporary time period to get best practices.&lt;/li&gt;&lt;li&gt;Contractors enable you to focus your best resources on the most strategic activities while leaving the rest to nonstrategic resources.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;   &lt;span style="font-style: italic;"&gt;Disadvantages:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Contractors need start up time.  They are used to getting up to speed fast but still require ramp up time.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Contractors may or may not be available after the project completes.&lt;/li&gt;&lt;li&gt;If you don't plan properly for this, contractors will leave at the end of the project (or even midway in extenuating circumstances) with all the institutional knowledge gained during the process.  You should build in time early to transition knowledge through mentorship and documentation throughout the project.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Contractors need to develop relationships during the project.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt; &lt;span style="font-weight: bold;"&gt;Consulting Firm&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Advantages:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;You have a firm to back you up.  If you need to have varying levels of expertise throughout a project, it's up to the consulting firm to provide the right person.  You can draw upon a larger set of expertise from a consulting firm.  You can get the best experts in every area you need that don't need any training.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Consulting firms tend to be solutions and results focused.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;You can ramp up and down a team easily - from a whole team down to a part-time consultant.&lt;/li&gt;&lt;li&gt;You get coverage when you need it.  No need to worry about sick and vacation days.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;You have one place to go to for as many of your needs as possible&lt;/li&gt;&lt;li&gt;You allocate budget and responsibilities and are less able to be sidetracked than an employee&lt;/li&gt;&lt;li&gt;Consulting firms enable customers to focus their best resources on their company's strategic needs while still leaving nonstrategic items to experts in their field&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;   &lt;span style="font-style: italic;"&gt;Disadvantages:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Consultants require some ramp up time&lt;/li&gt;&lt;li&gt;If you don't plan properly for this, consultants will leave at the end of the project with institutional knowledge.  You need to work in transition time through mentorship and documentation.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Depending upon market rates, consultants may be more expensive than the fully loaded costs of an employee.&lt;/li&gt;&lt;li&gt;Consultants must develop relationships during the project.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt; &lt;span style="font-weight: bold;"&gt;Outsourcing / Offshoring&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Advantages:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The cost advantage is usually significant&lt;/li&gt;&lt;li&gt;Outsourcing is a good way to pass off non-core competence work leaving your developers to focus on more strategic work&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;span style="font-style: italic;"&gt;Disadvantages:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Communication is usually difficult.  Many outsourced teams are located in different countries with different timezones and languages spoken.&lt;/li&gt;&lt;li&gt;Management overhead is increased.  Interfaces between teams must be micromanaged.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Hybrid approach.  &lt;/span&gt;&lt;br /&gt;Every organization is different.  No one solution fits all.  The key though is to have the expertise you need when you need it in order to institute static analysis as quickly, efficiently and effectively as possible.  Consider these questions as you consider what are your best options:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Many organizations recognize the investment required to develop expertise in-house.  Is the investment of becoming static analysis experts worthwhile or not?&lt;/li&gt;&lt;li&gt;Do you value best practices?  Will having an expert who's done it many times before guide you through the process more efficiently than trying to do it yourself?&lt;/li&gt;&lt;li&gt;What are my architecting versus operating costs?  How can I create the best solution that requires the least amount of management and administration?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;How much time is required and what expertise is needed for architecting and operating static analysis?  It may not be full-time.&lt;/li&gt;&lt;li&gt;What are my contingency plans if priorities change or people leave?&lt;/li&gt;&lt;li&gt;What are your true core competences?  What do you want to be best at doing?&lt;/li&gt;&lt;li&gt;What kind of budget do you have?  Initially and ongoing?  What is the return you get to justify the expenditure?&lt;/li&gt;&lt;li&gt;Are pieces of the requirements-architect-implement-administrate better served by the same person or different people?  Is continuity of resource more valuable than best practices in each area?&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt; &lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5704901458470135557-2362728632220940583?l=codeintegrity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeintegrity.blogspot.com/feeds/2362728632220940583/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeintegrity.blogspot.com/2009/08/consulting-contractors-outsourcing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/2362728632220940583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/2362728632220940583'/><link rel='alternate' type='text/html' href='http://codeintegrity.blogspot.com/2009/08/consulting-contractors-outsourcing.html' title='Hiring, Repurposing, Consulting, Contractors, Outsourcing, Offshoring or Part-timers for Static Source Code Analysis?'/><author><name>Andy</name><uri>http://www.blogger.com/profile/06705630945588101293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5704901458470135557.post-2680473947096084115</id><published>2009-07-24T16:18:00.000-07:00</published><updated>2009-07-27T13:47:50.621-07:00</updated><title type='text'>What Motivates People to Buy Static Analysis</title><content type='html'>&lt;a href="http://www.codeintegritysolutions.com/"&gt;We&lt;/a&gt;’ve visited a lot of companies who are using static analysis to improve their software development.  What drives companies to use static analysis varies considerably from com&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.retailmarketingblog.com/wp-content/uploads/2006/11/roi1.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 152px; height: 190px;" src="http://www.retailmarketingblog.com/wp-content/uploads/2006/11/roi1.jpg" alt="" border="0" /&gt;&lt;/a&gt;pany to company and from industry to industry.  We attempt to categorize the most common drivers for using static analysis into various buckets.  We’d love to hear about other drivers as well so please let us know if you have others to contribute.&lt;br /&gt;&lt;br /&gt;There are a lot of factors to consider when trying to understand what drives a company to use static analysis.  You have to consider not only what are the business drivers and benefits but also who are the people who are driving and influencing the decision.&lt;br /&gt;&lt;br /&gt;We have bucketed them accordingly&lt;br /&gt;•    The opportunists&lt;br /&gt;•    The code reviewers&lt;br /&gt;•    The engineering management&lt;br /&gt;•    The quality portfolio manager&lt;br /&gt;•    The compliers&lt;br /&gt;•    The automators&lt;br /&gt;&lt;br /&gt;No categorization is discrete.  There’s quite a bit of overlap and different roles can exist within the same company.  Benefits can be felt across a wide range of people.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Opportunists&lt;/span&gt;&lt;br /&gt;The Opportunists use static analysis tactically, to capture the low hanging fruit in the codebase.  They recognize that one of the biggest benefits of static analysis is finding and fixing bug&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.uncabaret.com/images3/pearsontree.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 102px; height: 156px;" src="http://www.uncabaret.com/images3/pearsontree.jpg" alt="" border="0" /&gt;&lt;/a&gt;s are much cheaper than most any other means.  But, Opportunists only want to invest as little time in the tool as possible.   They try to find and fix as many of the easy problems as they can find and focus only on the areas that they feel are most important to them for example like focusing on crashes or memory leaks.&lt;br /&gt;&lt;br /&gt;The downside of this approach is that incrementally, Opportunists get a really high ROI because their "Investment" is low and their "Return" is good.  However, they must take into consideration the license and support costs plus any other costs associated with the tool such as training, set up and configuration.  With all parts of the equation adequately modeled, the ROI can suddenly become much less attractive.   In order to keep the costs low, many Opportunists  just run the tool out of the box with the default settings, not even taking the time to tune the analysis to find more of the low hanging fruit that they want to fix.  Clearly there is more benefit opportunity for Opportunists, to better increase the marginal utility from the marginal cost they put into it.&lt;br /&gt;&lt;br /&gt;The opportunist is usually a single developer or a few developers who are highly proactive in improving the quality and security of their code.  They are also usually extremely busy with little time to devote to static analysis.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Code Reviewers&lt;/span&gt;&lt;br /&gt;Code Reviewers can live within the software development organization (such as a cod&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_XByh0m7lJiQ/R_8vzTUS77I/AAAAAAAAARQ/UJBjh9KcPwY/s400/magnifyingGlass2.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 126px; height: 89px;" src="http://bp0.blogger.com/_XByh0m7lJiQ/R_8vzTUS77I/AAAAAAAAARQ/UJBjh9KcPwY/s400/magnifyingGlass2.jpg" alt="" border="0" /&gt;&lt;/a&gt;e review team) or outside, such as in the case of a security review team. Manual code review is a tedious, error-prone and non-scalable process.  While static analysis doesn’t replace manual code review, it helps make the manual code review process much more focused on higher value activities.  At the same time, static analysis helps reviewers gain significantly more coverage, reduce human error and provide more consistency in the review process.&lt;br /&gt;&lt;br /&gt;Code reviewers like to have a well-tuned analysis, specific to the codebase with all the right settings to find the class of problems that are most relevant to them, for example, security reviewers like sources and sinks defined as part of their data flow analyses (without it, the data flow analysis doesn't have much to work with).  The analysis can also be tuned to find a wider range of problems at the cost of a little less accuracy.  Code Reviewers can also write analysis rules to find specific classes of problems or enforce coding rules.  When put into a regression test, these rules can make sure the problem or coding violation doesn’t arise again either in the original place it was found in or in any other place in the codebase or even in other codebases that are being analyzed.&lt;br /&gt;&lt;br /&gt;The main challenge in these environments is the natural friction caused by reviewers versus developers.  When handled improperly, developers can become defensive and push back on static analysis reports as “not bugs.”  Code Reviewers need to be sensitive in how they assign and discuss potential problems.  Developers take a lot of pride in their work but should also be open minded of efficient ways to improve the quality of their output.  When working well, this model has great checks and balances in place to ensure proper usage of the tool.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Engin&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.kdubiq.org/kdubiq/images/fieldsets_final/Management_Board_3831143_.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 258px; height: 193px;" src="http://www.kdubiq.org/kdubiq/images/fieldsets_final/Management_Board_3831143_.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;eering Management&lt;/span&gt;&lt;br /&gt;We’ve all heard the analogy of how software development should borrow more from the manufacturing industry.  Many software development managers recognize that static analysis actually saves overall development time and can improve cycles times.  Finding defects earlier in the process can most definitely save on overall time and costs.&lt;br /&gt;&lt;br /&gt;Management’s big challenge is to ensure broad, consistent usage so that the benefits can be realized.  Not every developer recognizes the benefits amidst the negatives.  Static analysis is not perfect and requires some learning, to understand defect reports, process changes and most importantly dealing with false positives and “don’t care” reports which, if not handled properly, can decimate the morale of the developers.&lt;br /&gt;&lt;br /&gt;The biggest challenges to these environments is lowering the cost of usage through deep integration with the current software development process and automation to minimize any manual work.  In addition, tuning of the analysis to lower the rate of false positives and “don’t care” reports will lower the cost significantly and provide a big psychological boost.  Using outsourced teams to review the defects first help maximize your most precious resource – your developer’s time.&lt;br /&gt;&lt;br /&gt;Administrating the tool requires effort and most tools engineers are already too busy to not only learn the tool but manage it ongoing.  Contractors and consultants can help either to jump start the process or to take ownership of the management and administration ongoing.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Quality Portfolio Manager&lt;/span&gt;&lt;br /&gt;There’s no silver bullet to quality and security.  In order to get acceptable quality and security, you have to take a multi-pronged approach.  Unit tests, code review and now, static analysis are parts of the overall strategy to lower the risk of field defects.&lt;br /&gt;&lt;br /&gt;Holistic approaches to quality are often driven by a forward thinking engineering or QA manager, or as a response to a serious bug or serious class of bugs that has now driven a top-down quality initiative.  Other companies may realize that bugs are causing a high recall rate or high support costs which is driving down profitability. This realization create the necessary organizational capital to move static analysis forward.&lt;br /&gt;&lt;br /&gt;The challenges that arise from these types of initiatives stem higher than those faced by the Engineering Management example.  Specific ownership and clear goals are too often not considered when instituting a static analysis solution from the top down.  When static analysis becomes just a checkbox among a range of other strategies, it often doesn't get the necessary attention to make it succeed. Ensure that the ownership of the tool has &lt;a href="http://codeintegrity.blogspot.com/2009/07/does-your-software-quality-practices.html"&gt;teeth&lt;/a&gt;, whether it be owned by someone internally or externally.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Complier&lt;/span&gt;&lt;br /&gt;In som&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://tbn0.google.com/images?q=tbn:QLqk4srxf5RQPM:http://www.hedgeco.net/hedgeducation/hedge-fund-articles/wp-content/uploads/2008/06/compliance.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 102px; height: 114px;" src="http://tbn0.google.com/images?q=tbn:QLqk4srxf5RQPM:http://www.hedgeco.net/hedgeducation/hedge-fund-articles/wp-content/uploads/2008/06/compliance.jpg" alt="" border="0" /&gt;&lt;/a&gt;e industries, you just don’t get much choice.  If you are developing software that will be implanted into someone, or go up into space, or guide a missile, then you have to be concerned about regulations and industry guidelines such as FDA, DO-178B and MISRA.  In all of these industries the government either requires or recommends the use of static code analysis to improve the quality and security of the delivered product.&lt;br /&gt;&lt;br /&gt;The challenges faced by the Complier are similar to the Quality Portfolio Manager.  The further away the driver for a solution is from the implementer and maintainer of the solution, the more that will be lost in translation and commitment.  Developing the expertise in-house is not insignificant.  Creating ownership with real incentives and consequences is critical.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Automator&lt;/span&gt;&lt;br /&gt;Automation is&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://kmintegrators.com/images/industrial_automation.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 232px; height: 155px;" src="http://kmintegrators.com/images/industrial_automation.jpg" alt="" border="0" /&gt;&lt;/a&gt; the fashion, particularly with the movement towards Agile methodology where cycle times are much more rapid.  Continuous integration builds are becoming more common and creates better software earlier in the process.  Automators recognize that static analysis is perfect for this.  Static analysis doesn’t require test cases and can be automated as part of the build process (as most modern static analysis is integrated with the build process).  Results can be churned out in minutes or hours.  Developers can even analyze code as they are developing it allowing organizations to institute rules that code must be free from any static analysis errors before check-in.&lt;br /&gt;&lt;br /&gt;The largest challenges here is that automation takes some work.  It’s not hard but it’s also not necessarily turnkey.  Being able to have the right deployment model so that the analysis is fast for each developer can be tricky but is most certainly possible.  Automation usually is two pronged – where developers can run a fast analysis locally on their changed code while a central analysis handles a full integration analysis.  Automation is well worth the effort even in the short term.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Many Reasons, Many Options&lt;/span&gt;&lt;br /&gt;Clearly there are many drivers for static analysis. In conert, the optimum deploym&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://ts2.images.live.com/images/thumbnail.aspx?q=977200158349&amp;amp;id=0540adb713975dcfd92f1d883a45a58d&amp;amp;url=http%3a%2f%2fwww.acesoft.com%2fimages%2foptions.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 135px; height: 160px;" src="http://ts2.images.live.com/images/thumbnail.aspx?q=977200158349&amp;amp;id=0540adb713975dcfd92f1d883a45a58d&amp;amp;url=http%3a%2f%2fwww.acesoft.com%2fimages%2foptions.jpg" alt="" border="0" /&gt;&lt;/a&gt;ent model varies considerably. For example, tuning an analysis to find everything under the sun may not be a good model for the Opportunists.  Likewise, a full developer deployment model may not be a good choice for the Reviewer's.  Matching the deployment model and the analysis tuning to the business need will increase by orders of magnitude the ROI you get from a static tool.  Companies have woken up to the fact that developing this expertise in-house is an investment that is appealing to some and unappealing to others.  Some prefer a jump start mentoring program to help them get pointed in the right direction and others prefer to outsource to get best practices static analysis expertise.   Regardless, static analysis can provide a multitude of benefits for most software development organizations. By recognizing the drivers, you can create a great custom solution that makes almost everybody who involved get what they need out of it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5704901458470135557-2680473947096084115?l=codeintegrity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeintegrity.blogspot.com/feeds/2680473947096084115/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeintegrity.blogspot.com/2009/07/what-motivates-people-to-buy-static.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/2680473947096084115'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/2680473947096084115'/><link rel='alternate' type='text/html' href='http://codeintegrity.blogspot.com/2009/07/what-motivates-people-to-buy-static.html' title='What Motivates People to Buy Static Analysis'/><author><name>Andy</name><uri>http://www.blogger.com/profile/06705630945588101293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_XByh0m7lJiQ/R_8vzTUS77I/AAAAAAAAARQ/UJBjh9KcPwY/s72-c/magnifyingGlass2.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5704901458470135557.post-4957570616379719844</id><published>2009-07-22T17:26:00.000-07:00</published><updated>2009-07-23T19:16:22.330-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='usage'/><category scheme='http://www.blogger.com/atom/ns#' term='incentives'/><category scheme='http://www.blogger.com/atom/ns#' term='consequences'/><title type='text'>Do Your Software Quality Practices Have Teeth?</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.abc.net.au/unleashed/images/iron_teeth_400.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 198px; height: 132px;" src="http://www.abc.net.au/unleashed/images/iron_teeth_400.jpg" alt="" border="0" /&gt;&lt;/a&gt;These days, no one has time to do the extra things that should be done. We only have time to do the things that absolutely need to be done. We don’t strive for perfection – instead we strive for barely acceptable. Working in business today is all about compromise -- prioritizing our efforts on the things that are important AND urgent with little to no room for anything else.  Over time, urgent takes precedence over important.   In general, quality clearly falls into the important but nonurgent category.  Proactive measures, such as using static analysis to improve quality are abandoned or delayed to address the need of the day.&lt;br /&gt;&lt;br /&gt;Organizations see static analysis (or source code analysis) as a great way to:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;find costly bugs and security vulnerabilties earlier in the development process &lt;/li&gt;&lt;li&gt;save developer time and money and to shorten delivery cycles&lt;/li&gt;&lt;li&gt;detect severe defects before letting them get out into production&lt;/li&gt;&lt;li&gt;increase code coverage along many more paths than dynamic testing and code review&lt;/li&gt;&lt;li&gt;improve software as the code is being written to get better working software faster&lt;/li&gt;&lt;/ul&gt;While organizations may spend significant money to rightfully purchase the best static analysis tools, they frequently don’t set up the right process and role structure for success. The ownership of the tool becomes a side responsibility for an already harried tools engineer &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.jiscinfonet.ac.uk/infokits/time-management/ui-matrix"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 267px; height: 225px;" src="http://www.jiscinfonet.ac.uk/infokits/time-management/ui-matrix" alt="" border="0" /&gt;&lt;/a&gt;and the tool is simply made available for developer use on a voluntary basis. Time and again, the engineers who least need static analysis, end up using it the most – these are the engineers who use everything to their advantage to  improve the quality of their code. While a generalization, the engineers who complain the most often are the ones who should be using it more.  Usage then degrades rapidly over time and it becomes an expensive tool that is run only occasionally delivering only a fraction of the benefit.&lt;br /&gt;&lt;br /&gt;In most organizations, addressing the results from a static tool is frankly not considered urgent. Resolving static analysis issues provides great value but it is not putting out fires. When urgent AND important issues come up (which is status quo), the use of static analysis falls to the wayside, or never even gets started. Why?&lt;br /&gt;&lt;ul&gt;&lt;li&gt;static analysis reports flaws in source code. The effect on a customer isn't always apparent. For instance, it might detect a memory leak on a specific line of code but it doesn't have the same effect as a bug report from your biggest customer.&lt;/li&gt;&lt;li&gt;static analysis defects are reported from a tool, not from customer support or a sales person trying to win a deal. Problems found by a tool in the development process don’t have nearly as much urgency.&lt;/li&gt;&lt;li&gt;static analysis tools aren’t always right.  In fact, some tools have very high false positive rates where the tool is more wrong than it is right.  This makes it very hard for many developers to trust the tool and feel it is a good use of their time.&lt;/li&gt;&lt;/ul&gt;What's a development organization to do? How does a software development group save time overall while improvin&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.takepart.com/blog/wp-content/uploads/2009/03/carrot-and-stick.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 206px; height: 123px;" src="http://www.takepart.com/blog/wp-content/uploads/2009/03/carrot-and-stick.jpg" alt="" border="0" /&gt;&lt;/a&gt;g quality with static analysis?  As with any new process you want to introduce to a group of people, it has to have some teeth to it. If using static analysis is purely voluntary then there's not much hope you’ll achieve the type of benefits you had hoped for.&lt;br /&gt;&lt;br /&gt;If you want to have some teeth in using static analysis you have to have both tangible incentives and consequences for using static analysis. Or, if you prefer, this is the carrot and stick analogy.  Because every organization is varied in people's skill levels and motivations, having real incentives and consequences is critical to moving the whole organization in a consistent fashion.&lt;br /&gt;&lt;br /&gt;Some examples of incentives are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;educating the team on the benefits of static analysis. This is typically the job of the hampion or managers to make sure that the benefits to the organization and to the individual are spelled out.&lt;/li&gt;&lt;li&gt;peer pressure is also a powerful tool to motivate people to use the tool. If the top developers are bought into the process and are using the tool then you're more likely to get more people in the organization to follow. Cultivating the influential leaders is necessary.&lt;/li&gt;&lt;li&gt;public recognition drives many developers, oftentimes more than salary and benefits. Recognizing proper usage of the tool helps the rest of the organization see the benefits of using static analysis and drive developers to  perform the right behaviors.&lt;/li&gt;&lt;li&gt;lower the barriers for usage. Make it simple to use. Automate everything as much as possible so that you lower the cost for a developer to use static analysis. Integrate with the workflow and minimize change to the process flow.&lt;/li&gt;&lt;li&gt;don't penalize people for its usage. Some developers are afraid of showing flaws in their code. After all, it's a tool that points out mistakes, sometimes really dumb ones. Set up usage models that enable developers to find all of their mistakes up front to give them a chance to fix problems before everyone knows.&lt;/li&gt;&lt;/ul&gt;Some examples of consequences are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt; make it a check-in criteria to have all static analysis issues inspected and addressed. Developers have a lot of pride in their work. Nobody wants to be the developer that holds up the release.&lt;/li&gt;&lt;li&gt;managers typically set MBO's for their employees. Managers can set specific static analysis goals such as meeting thresholds for fixing critical problems as minimizing regressions&lt;/li&gt;&lt;li&gt;published metrics can create peer pressure. Breaking out reports by individual developers can promote healthy, productive competition. Using negative reinforcement techniques have to be coupled with the right culture. Metrics can also create the wrong behavior. For instance, publishing defect fixes could cause gaming – the creation of intentional defects in order to produce a high fix rate. Metrics focused on the overall desired results such as the number of times the developers checked code with unaddressed defects.&lt;/li&gt;&lt;/ul&gt;You either want the tool to be used or you don't. Without the proper incentives and consequences the tool will likely languish. There's a reason why people deride the phrase, "If you build it, they will come." Simply putting a tool out there for use doesn't mean it's going to be used. If the tool isn't used, then what are the consequences? Are there any ramifications for choosing not to use the tool?&lt;br /&gt;&lt;br /&gt;There are too many things to do with too few hours to do them. Change is only worthwhile if you are going to follow through with it.  Setting yourself up for success with static analysis is not hard, but because it falls into the important but nonurgent bucket, you need to set up the right structure so that it is addressed to the level where it will provide good value.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5704901458470135557-4957570616379719844?l=codeintegrity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeintegrity.blogspot.com/feeds/4957570616379719844/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeintegrity.blogspot.com/2009/07/does-your-software-quality-practices.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/4957570616379719844'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/4957570616379719844'/><link rel='alternate' type='text/html' href='http://codeintegrity.blogspot.com/2009/07/does-your-software-quality-practices.html' title='Do Your Software Quality Practices Have Teeth?'/><author><name>Andy</name><uri>http://www.blogger.com/profile/06705630945588101293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5704901458470135557.post-1300439565983223049</id><published>2009-07-13T13:56:00.000-07:00</published><updated>2009-07-21T19:46:10.417-07:00</updated><title type='text'>Usage Models for Static Analysis</title><content type='html'>Static analysis (or source code analysis) hasn't yet hit the mainstream yet.  Leading organizations are using it to gain a quality and security advantage over their com&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.ok.gov/okohstest/images/chain.jpg.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 166px; height: 206px;" src="http://www.ok.gov/okohstest/images/chain.jpg.jpg" alt="" border="0" /&gt;&lt;/a&gt;petitors, but it's not yet part of the standard tool chain. With regards to tooling, nearly every software organization starts with a source code repository, bug tracking database, compiler, automated test frameworks, etc.  They standardize on these functions because a software development team needs to collaborate effectively to produce a final product.&lt;br /&gt;&lt;br /&gt;However, there are other parts of the tool chain which are often (but not always) left to individual preferences, such as editors like emacs, vi, Eclipse.  Other tools that often fit in this category can be architectural tools, debugging tools and static analysis tools, such as Lint.  Rarely is it a requirement for every developer to look at all Lint issues.  Lint is more of an option, left to the individual developer's decision on if and when to use it.  Recent static analysis vendors like &lt;a href="http://www.coverity.com/"&gt;Cove&lt;/a&gt;&lt;a href="http://www.coverity.com/"&gt;rity&lt;/a&gt; and &lt;a href="http://www.klocwork.com/"&gt;Klocwork&lt;/a&gt; and &lt;a href="http://www.fortifysoftware.com/"&gt;Fortify Software&lt;/a&gt; are providing to the market place a more holistic solution, meant for every developer in an organization.  The market has evolved quickly in recent years with more team and organization oriented tools.&lt;br /&gt;&lt;br /&gt;The deployment model needed for a given organization depends heavily on what the goal is they want to accomplish.  Success and failure can take many different forms when using static analysis.  Some organizations are perfectly happy finding the occasional killer bug and leaving the rest of the reported defects unaddressed.  Others, want to use the tool as essentially a cornerstone to their code review efforts and to find every possible problem that could exist.  All of these call for different analysis options and for different deployment models.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Process Structure of Code Analysis&lt;/span&gt;&lt;br /&gt;This is a simplification, but for most static analysis deployments the following roles need to be addressed:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Administrator - who installs and manages the tool&lt;/li&gt;&lt;li&gt;Triager - who reviews the reports that come from the tool and prioritizes the results&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Fixer - who fixes the problems&lt;/li&gt;&lt;li&gt;Verifier - who verifies the fix worked and didn't introduce new problems&lt;/li&gt;&lt;/ul&gt;These roles can be filled by internal and external staff in various combinations.  The most common deployment models &lt;a href="http://www.codeintegritysolutions.com/"&gt;we&lt;/a&gt; see are the following:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;"The static analysis guy"&lt;/span&gt; -- this is where one developer has been dubbed as "the static analysis guy" and performs all of the above functions.  This person runs the to&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.denali.net/%7Eleif/TestPics/Harlequin.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 218px; height: 211px;" src="http://www.denali.net/%7Eleif/TestPics/Harlequin.jpg" alt="" border="0" /&gt;&lt;/a&gt;ol on their machine periodically usually for a couple of minutes every day or at a milestone during the latter part of a release cycle.  This developer often reviews the defects and either fix the bugs or distribute them to developers. This option is great for companies who care only about the "low hanging fruit" bugs.  This options has several advantages:&lt;br /&gt;&lt;br /&gt;+ one person who is responsible for everything and therefore "one neck to wring"&lt;br /&gt;+ few handoffs&lt;br /&gt;&lt;br /&gt;But...&lt;br /&gt;&lt;br /&gt;-   Process is inherently unscalable&lt;br /&gt;-   No checks and balances in place to make sure the person responsible hasn't made any mistakes or is using the tool suboptimally&lt;br /&gt;-   Putting someone in charge of static analysis takes someone "off the bench".  Usually a senior developer is put in charge of static analysis causing s/he to invest considerable time in becoming a tools expert than focusing on building features for their product.&lt;br /&gt;&lt;br /&gt;Regrettably, some organizations who have every intention to roll static analysis out to their organization never get past this point.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;"Special teams"&lt;/span&gt; - this deployment option takes advantage of different specialties.  The administration side is taken care of by the tools group.  The triaging is typically handled by a separa&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://i24.photobucket.com/albums/c22/mdgcfb/KCBL-AM_21791_9.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 225px; height: 120px;" src="http://i24.photobucket.com/albums/c22/mdgcfb/KCBL-AM_21791_9.jpg" alt="" border="0" /&gt;&lt;/a&gt;te team such as, a security review team or a quality review team who examine the problems up front and then distribute them to the developers who handle the fixing.  The verification process is usually handled by the security or quality team to ensure the fixes are done right and that no new issues are introduced.  The advantage of this model include:&lt;br /&gt;&lt;br /&gt;+  Great checks and balances in play that help the overall quality improve.  Healthy tensions between triagers, fixers and verifiers drive quality.&lt;br /&gt;+  Saves significant time from your most precious resources - your developers.  The largest cost for many organizations using static analysis is in reviewing the defects (see earlier post on &lt;a href="http://codeintegrity.blogspot.com/2009/07/hidden-cost-of-source-code-analysis.html"&gt;the hidden cost of static analysis&lt;/a&gt;).&lt;br /&gt;+ Highly scalable structure&lt;br /&gt;&lt;br /&gt;But of course it is not without its costs:&lt;br /&gt;-   Handoffs of defects requires more coordination and can create errors&lt;br /&gt;-   Development skills are required in every role.  A tools engineer must be able to understand code and be able to tune the analysis based on developer feedback.  Security reviewers, quality engineers, etc. must also have software development skills.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;"Managed Service"&lt;/span&gt; -- this option focuses the software development team on their core competences .  When people buy static analysis, they are buying essentially the defects that they end up fixing.  They aren't buying the administration burden, they aren't buying false positive reports that come from the tool -- they are buying the defects that are reported which they take action upon.  In this model, the administration is managed by an outside consultant.  The triaging is handled by a specialist security or quality review team.  The fixing is handled by an off-shore software development team - the same type of team that regularly handle maintenance for software products.  The verification is handled by either a skilled QA team or the review team.  There are several key advantages and disadvantages:&lt;br /&gt;&lt;br /&gt;+ Consultants are specialists in their field - so you get the best practices implementation without false starts&lt;br /&gt;+ Consultants are responsible for hand delivering only the defects you want to fix so that you don't have to "lift a finger" in managing the tool or triaging the results.  This enables the team to focus on what they do best - building features.  This is one of the main reasons why managed services in general have taken off.&lt;br /&gt;+ Resources can be scaled up and down as needed, for instance you can have a larger team handle the triage of a big backlog and then once the backlog is down to zero, have a smaller team deal with the bugs caused by incremental changes. For most organizations, administration is only a part-time job.&lt;br /&gt;+ Consulting organizations take all of the brunt of scheduling.  You don't have to worry about sick/vacation days or deal with HR issues.&lt;br /&gt;&lt;br /&gt;However,&lt;br /&gt;&lt;br /&gt;-   Working with consultants requires some handoff both in startup and ongoing work.&lt;br /&gt;-   Consultants also require some overhead to manage.&lt;br /&gt;-   In particular for fixing, consultants can't know the code as well as your developers.  Some collaboration is required in order to make the consultants efficient and effective, just as in the case when an offshore team takes responsibility for a codebase.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;"Every developer is responsible for quality"&lt;/span&gt;  In this model, each and every developer owns quality and security.  In this case, the software developers are responsible for reviewing the results and fixing them.  Verification can also be done by the developers depending upon how much you tolerate the "fox guarding the henhouse" approach.  The advantages:&lt;br /&gt;&lt;br /&gt;+  Puts more of the responsibility for quality into the hands of the developers&lt;br /&gt;+  Brings defects to the developer's at the absolute earliest time - right as they are coding versus waiting for results from a nightly build.&lt;br /&gt;+  Helps developers check in better code, a benefit for Agile development and continuous integration models.&lt;br /&gt;&lt;br /&gt;But,&lt;br /&gt;&lt;br /&gt;-   Requires a consistent approach.  There is a wide variance between the best and the worst developers in a given software development group.  A common saying in the static analysis community is that the developers who ignore or rebel against static analysis tend to be the ones who need it the most.&lt;br /&gt;-  Lack of checks and balances.  Over time, some developers will just write code that makes the tool "shut up" even at the cost of making less stable code.  If the improper incentives are put in place then this kind of suboptimal behavior can result.&lt;br /&gt;-  While the total time to review bugs every day may be small, added up across every developer every day can result in a significant amount of time.  For most organizations, the time for triage significantly surpasses the time it actually takes to fix bugs.&lt;br /&gt;-   Training is required for every developer as well as every future developer who comes into the organization.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;"Hybrid approach" &lt;/span&gt; Nearly every other combination exists in some way shape or form.  Many organizations opt for a hybrid of the above, most typically a tools group responsible for the administration of the tool (in-house or outsourced), a review team (in-house or outsourced engineers) and an in-house development team to fix the reported defects.  In this way, developers are focused on what they do best, building features, not on becoming experts at running a static analysis tool.  In addition, having a separate triage team saves time, freeing your developers from having to wade through "don't care"'s, false positives and low priority items.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Have it Your Way&lt;/span&gt;&lt;br /&gt;Using a good static analysis tool can significantly improve the quality and security of code. Whether the goal is to address compliance, find every last possible memory leak, or to occasionally find some bugs, there is a deployment model that should work.  Each method has its pluses and minuses. Over time needs will change, the deployment model should change as well.   We don't doubt that there are quite a few other potential configurations out there to get the most out of the static analysis tools.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5704901458470135557-1300439565983223049?l=codeintegrity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeintegrity.blogspot.com/feeds/1300439565983223049/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeintegrity.blogspot.com/2009/07/deployment-models-for-static-analysis.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/1300439565983223049'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/1300439565983223049'/><link rel='alternate' type='text/html' href='http://codeintegrity.blogspot.com/2009/07/deployment-models-for-static-analysis.html' title='Usage Models for Static Analysis'/><author><name>Andy</name><uri>http://www.blogger.com/profile/06705630945588101293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5704901458470135557.post-3437576415238866192</id><published>2009-07-06T12:57:00.000-07:00</published><updated>2009-07-06T15:54:34.480-07:00</updated><title type='text'>The Hidden Cost of Source Code Analysis</title><content type='html'>Static analysis (or source code analysis) seems like a no-brainer.  The analysis runs on your source code, bugs get produced and you fix them.  The sooner you fix problems, the cheaper it is, often by orders of magnitude.  However, there is a hidden cost to static analysis -- one that most organizations need to take into consideration but rarely do, until the rollout is well under way.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Let's Take a Deeper Look&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://tbn0.google.com/images?q=tbn:EqFcOH5cAVYwgM:http://k41.pbase.com/u34/photobyjdp/upload/22548806.stillife1.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 143px; height: 107px;" src="http://tbn0.google.com/images?q=tbn:EqFcOH5cAVYwgM:http://k41.pbase.com/u34/photobyjdp/upload/22548806.stillife1.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Are all static analysis defects created equal?  Certainly not.  There are some issues that are more important to address than others.  Every organization categorizes defects differently.  For some a memory leak may be important, particularly for long running applications where even a tiny memory leak can add up to a big problem.  For others applications, like a desktop application that loads and exits frequently, memory may be hardly an issue but crashes may be a serious priority.  Other factors that affect priority can include effect (such as data corruption), frequency, compliance, etc.  Regardless of any company's individual priority, one can roughly bucket static analysis defects in these categories:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Critical - we should fix it now (e.g. don't check it in)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;High - we should fix it before the next milestone&lt;/li&gt;&lt;li&gt;Medium - we should fix it at the next appropriate milestone&lt;/li&gt;&lt;li&gt;Low - nice to have - fix it if opportunistic situation&lt;/li&gt;&lt;li&gt;Ignore - analysis is doing the right thing but the problem doesn't need to be fixed (might be in test code, 3rd party code or perhaps the defect is incorrect because it couldn't take into account an environmental assumption)&lt;/li&gt;&lt;li&gt;False positive - the analysis goofed and the bug report is wrong&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;"&gt;The Problem With Prioritization&lt;/span&gt;&lt;br /&gt;Keep in mind that most bugs are prioritized based on the effect of the bug, which is easier to tie to a business problem.  Static analysis defects are reports of flaws in the code -- for instance, it might show a potential memory leak along a specific path in the code.  It may be difficult to discern how much memory is being leaked, what the specific steps are that cause the leak and what happens if enough memory leaks.   Static analysis defects are thus, harder to prioritize.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;A "Typical" Distribution&lt;/span&gt;&lt;br /&gt;The distribution of defect types varies greatly among organizations.  Some organizations (like a company that writes mil-aero software) consider any coding defect a serious issue.  Based on experience with customers at &lt;a href="http://www.codeintegritysolutions.com/"&gt;Code Integrity Solutions&lt;/a&gt;, we often see defect distributions like this:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Critical - 10%&lt;br /&gt;&lt;/li&gt;&lt;li&gt;High - 10%&lt;/li&gt;&lt;li&gt;Medium - 10%&lt;/li&gt;&lt;li&gt;Low - 10%&lt;/li&gt;&lt;li&gt;Ignore - 45%&lt;br /&gt;&lt;/li&gt;&lt;li&gt;False positive - 15%&lt;/li&gt;&lt;/ol&gt; With different codebases, different static analysis solutions and even different triagers you may get varying results.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Biggest Cost?&lt;/span&gt;&lt;br /&gt;In addressing the defects reported from a static analysis tool, you need to:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Make sure the analysis is set up properly&lt;/li&gt;&lt;li&gt;Someone needs to triage the results meaning interpreting the results for action&lt;/li&gt;&lt;li&gt;Someone needs to address the issue, typically by fixing the problem&lt;/li&gt;&lt;li&gt;Someone needs to verify that the issue is addressed&lt;/li&gt;&lt;/ol&gt;#1 is typically handled by an administrator skilled in the static analysis tool.  #2 may take anywhere from 5-10 minutes on average (we'll assume 10 minutes on average because some go quick, and some take longer).  #3 often takes 20 minutes to throughly understand the issue, find the right solution, make the necessary code changes and then review/QA the change.  #4 we don't have reliable data for.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Back of the E&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://blog.lodewijkvdb.com/img/pile.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 141px; height: 188px;" src="http://blog.lodewijkvdb.com/img/pile.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;nvelope&lt;/span&gt;&lt;br /&gt;Most organizations purchase a static analysis solution for a product after the product has already been released.  Therefore there is a considerable amount of "legacy" code already there.  When you run a static analysis solution it finds problems consistently across old and new code.  Thus, many organizations who recently purchased a static analysis start by running the analysis and creating a backlog of sometimes thousands, if not tens of thousands of defects.&lt;br /&gt;&lt;br /&gt;Let's use a fictitious example.  Let's say an organization has 3 million lines of code and finds 3000 defects in their backlog.  In order to triage all of the defects, it would take 3000 defects x 10 minutes per defect = 500 hours (62.5 developer days).  For a team of 12 developers, this would take a little over 5 business days or essentially a full week.  Assuming the distribution above, the distribution of defects would be around:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Critical - 10% = 300 defects&lt;/li&gt;&lt;li&gt;High - 10% = 300 defects&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Medium - 10% = 300 defects&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Low - 10% = 300 defects&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Ignore - 45% = 1350 defects&lt;br /&gt;&lt;/li&gt;&lt;li&gt;False positive - 15% = 450 defects&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;To fix 300 defects would take approximately 300 defects x 20 minutes per defect = 100 hours.  For the same team of 12 developers, this would take 8.3 hours or a little over 1 day.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://scienceblogs.com/notrocketscience/Iceberg.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 149px; height: 217px;" src="http://scienceblogs.com/notrocketscience/Iceberg.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Hidden Cost&lt;/span&gt;&lt;br /&gt;So to triage all the defects takes a team of 12 developers 1 full week.  To fix the defects that you care most about, it takes 1 day.  That's a whopping ratio of 5:1. Clearly, one of the largest costs of static analysis is triaging the results - to sift through to determine which are the ones worth fixing and which are the ones worth ignoring.  In addition, some static analysis tools have much higher false positive rates which means much of the time is spent in reviewing defects rather than the actual time performing the fixes.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Case for Outside Help&lt;/span&gt;&lt;br /&gt;For most organizations, developer time is precious - the most constrained of resources.  A week of a team of 12's time can mean a significant number of customer-focused features developed.  Many organizations are turning to outside teams to help review defects so that their developers can focus on their core competence - developing capabilities within their product rather than developing expertise reading static analysis results.&lt;br /&gt;&lt;br /&gt;An additional strategy is to address the defects even earlier in the software development process, e.g. to the developers as they are coding.  This may slightly reduce triage time overall.&lt;br /&gt;&lt;br /&gt;However, whether you use an outside team or not, the time required to triage defects must be taken into consideration.  It's surprising for many that the most time consuming aspect of using static analysis is in the &lt;span style="font-style: italic;"&gt;triaging&lt;/span&gt; of results rather than the actual &lt;span style="font-style: italic;"&gt;fixing&lt;/span&gt; of defects.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5704901458470135557-3437576415238866192?l=codeintegrity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeintegrity.blogspot.com/feeds/3437576415238866192/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeintegrity.blogspot.com/2009/07/hidden-cost-of-source-code-analysis.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/3437576415238866192'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/3437576415238866192'/><link rel='alternate' type='text/html' href='http://codeintegrity.blogspot.com/2009/07/hidden-cost-of-source-code-analysis.html' title='The Hidden Cost of Source Code Analysis'/><author><name>Andy</name><uri>http://www.blogger.com/profile/06705630945588101293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5704901458470135557.post-6878015537211479151</id><published>2009-06-29T15:36:00.000-07:00</published><updated>2009-06-29T19:23:39.885-07:00</updated><title type='text'>Not All Bugs Have to be Fixed</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.freewebs.com/organicpestcontrol/Company%20Logo.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 196px; height: 152px;" src="http://www.freewebs.com/organicpestcontrol/Company%20Logo.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;We live in a world where there just aren't enough software developers.  No matter what stage of development you may be at, your team could always use just a few more developers to build that great feature marketing wants, fix that extra bug that's been nagging technical support, help build some tools so that software development can work more efficiently, etc.   But sadly, we live in a world of constraints and that means that the marginal cost of any investment has to be paired with the marginal benefit it will bring.&lt;br /&gt;&lt;br /&gt;The approach to fixing defects is no different.  When fixing problems you need to look at the resource required and the benefit it brings. You'll see a wide range of perspectives when you ask developers about source code analysis.   Naysayers view the results as noise, "nice-to-have" defects that never reveal themselves in the field.  Supporters believe source code analysis helps them find not only critical defects but also potential coding problems that can affect future maintainability and scalability.  Most developers fall in between these two extremes.  We often see a good mix of problems reported:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;critical problems that need to be fixed soon&lt;/li&gt;&lt;li&gt;medium to low priority items that are certainly bugs or poor programming but aren't of high priority to fix immediately&lt;/li&gt;&lt;li&gt;false positives - where the tool reports something that is clearly wrong&lt;/li&gt;&lt;li&gt;"ignores" - where the analysis is doing what it should be doing but the prioritizer doesn't think it's important to do anything about&lt;/li&gt;&lt;/ul&gt;Depending upon the organization's needs, the numerical distribution of these categorie&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.safarikscience.org/satellite.gif"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 161px; height: 196px;" src="http://www.safarikscience.org/satellite.gif" alt="" border="0" /&gt;&lt;/a&gt;s vary greatly.  For a company sending a satellite into space, they may view most issues as in the "need to fix" category, even going so far as to saying that if a static analysis tool is confused enough to get it wrong, then the code should be changed so that the code is easier to maintain for the owner, code reviewers and all future owners.  For these organizations, there is zero tolerance for failure.&lt;br /&gt;&lt;br /&gt;For other organizations that are strapped for resources and have more than enough critical bugs they need to fix: then addressing just the "low hanging fruit" may be sufficient.  Such organizations can tactically use static analysis to help them but they probably have larger issues they need to deal with.  Of course, most companies fit somewhere in between the extremes.&lt;br /&gt;&lt;br /&gt;However, it's important to revisit the marginal cost versus marginal benefit equation.  Defects reported by static analysis tools point to specific lines of code where the problem may exist.  This level of granularity makes the marginal cost of fixing a defect miniscule in comparison to fixing defects reported by QA or by customer support.  No test cases, no debugging tools, no setting up the environment to recreate the problem is required. With a marginal cost so low, the pool of defects worth fixing suddenly expands.  For most organizations, not every defect needs to be fixed, but the number of defects worth fixing is considerable.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5704901458470135557-6878015537211479151?l=codeintegrity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeintegrity.blogspot.com/feeds/6878015537211479151/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeintegrity.blogspot.com/2009/06/not-all-bugs-have-to-be-fixed.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/6878015537211479151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/6878015537211479151'/><link rel='alternate' type='text/html' href='http://codeintegrity.blogspot.com/2009/06/not-all-bugs-have-to-be-fixed.html' title='Not All Bugs Have to be Fixed'/><author><name>Andy</name><uri>http://www.blogger.com/profile/06705630945588101293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5704901458470135557.post-4897603906851924153</id><published>2009-06-19T16:24:00.000-07:00</published><updated>2009-06-22T09:55:41.558-07:00</updated><title type='text'>Tools versus Solutions</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.allproducts.com/manufacture100/coeazy/product5-s.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 368px; height: 131px;" src="http://www.allproducts.com/manufacture100/coeazy/product5-s.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;"People don't go to the hardware store to buy drills -- they go to buy holes"&lt;br /&gt;&lt;br /&gt;When buying for a business, it always comes down to the bottom line - a problem must be solved, a pain alleviated, a cost saved or additional revenue made.  Simply buying a tool won't solve any problem.  When making a tool into a solution one must consider:&lt;br /&gt;&lt;ul&gt;&lt;li&gt; Does this tool fit into my process?  How will it be integrated?&lt;/li&gt;&lt;li&gt;Who will install and configure this tool custom to my needs?&lt;/li&gt;&lt;li&gt;Who will use this tool?   Does the users' process require them to use the tool?  What are the incentives to use it and consequences for not using the tool?&lt;/li&gt;&lt;li&gt;Will the users be able to understand the tool?  Will training be required and effective?&lt;/li&gt;&lt;li&gt;Who will administrate the tool?  How will they gain the expertise to administrate it well?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Who will own the success and failure of the tool?&lt;/li&gt;&lt;li&gt;Who will be able to evolve the tool as the group's priorities and environment shift?&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Organizations must consider how much they wish to invest in the tool in terms of time and resource. Building expertise within the organization can be expensive - almost always more than you expect.  Some organizations go so far as to outsource everything that isn't within their core competence knowing that specialists can do a far better job.  When taking on a tool, think about what it truly takes to bring a tool to success within your organization.&lt;br /&gt;&lt;br /&gt;At &lt;a href="http://www.codeintegritysolutions.com/"&gt;Code Integrity Solutions&lt;/a&gt;, we've see this often.  Organizations have the best of intentions when purchasing a tool but fail to make the necessary investment to make it a success.  The word "investment" covers a lot of ground - it not only means license cost but all the other associated costs in making it happen. When purchasing a tool, no one has the intention to see it fail, and yet if it's not given the right priority and investment, it's chances of success are slim.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://nurturingfaith.files.wordpress.com/2007/10/plant-nurtured-by-hands.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 175px; height: 139px;" src="http://nurturingfaith.files.wordpress.com/2007/10/plant-nurtured-by-hands.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;With static analysis, it's common to underestimate the needed cost.  Static analysis is not yet an established part of every software development organization. Many companies don't know what it takes to administrate the tool, configure it properly and to how to integrate it well into their process.  Many firms take a "hope" strategy by making the tool available as a service, not realizing that the people who end up using the tool are usually the people who least need it.&lt;br /&gt;&lt;br /&gt;Yet, leading companies see the advantage it brings and are using it to gain a competitive advantage but many get just a fraction of its benefits. Usually the solution settles into an implementation that is "good enough for now".  It's not a bad place to be temporarily but a tool is always a tool no matter what the problems are.  A solution can solve much bigger problems if the right approach, right expertise and right investment are made.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5704901458470135557-4897603906851924153?l=codeintegrity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeintegrity.blogspot.com/feeds/4897603906851924153/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeintegrity.blogspot.com/2009/06/tools-versus-solutions.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/4897603906851924153'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/4897603906851924153'/><link rel='alternate' type='text/html' href='http://codeintegrity.blogspot.com/2009/06/tools-versus-solutions.html' title='Tools versus Solutions'/><author><name>Andy</name><uri>http://www.blogger.com/profile/06705630945588101293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5704901458470135557.post-7799879966029550860</id><published>2009-06-07T10:00:00.000-07:00</published><updated>2009-06-15T09:52:44.983-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><title type='text'>Source Code Analysis and Continuous Integration - A Perfect Marriage</title><content type='html'>Saw a good &lt;a href="http://devlicio.us/blogs/derik_whittaker/archive/2009/06/04/what-i-expect-my-continuous-integration-server-to-do-for-me.aspx?CommentPosted=true#commentmessage"&gt;post&lt;/a&gt; last week on continuous integration (CI). Software development organizations are moving towards continuous integration in order to improve cycle times. By successfully integrating early and often, they minimize the risk of integration while reducing the overall integration and therefore delivery time.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://dotnet.org.za/blogs/cjlotz/WindowsLiveWriter/ContinuousIntegrationSomeTheoryandPracti_D266/image_2.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 205px; height: 154px;" src="http://dotnet.org.za/blogs/cjlotz/WindowsLiveWriter/ContinuousIntegrationSomeTheoryandPracti_D266/image_2.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;In this post, the blogger mentioned his desire for his continuous integration server to do more, including:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Monitor source repository and build on changes&lt;/li&gt;&lt;li&gt;Run unit tests&lt;/li&gt;&lt;li&gt;Run various static analysis metrics  &lt;/li&gt;&lt;li&gt;Publish assemblies for usage (could be to a test server, a file server or ftp server)&lt;/li&gt;&lt;li&gt;Build a clean copy of the database from setup scripts&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Be able to commit versioned assemblies back into the repository for other teams to use (if needed)&lt;/li&gt;&lt;li&gt;Create visual graphs/trends for tracking&lt;/li&gt;&lt;li&gt;Be able to run a build which creates and packages an installer (for deployment)&lt;/li&gt;&lt;li&gt;Send notifications (emails/post to discussion boards, twits, etc) when there are issues&lt;/li&gt;&lt;/ul&gt; The thing I would add here is to include source code analysis by a static analysis tool for detecting defects and problems. Just as code should build cleanly with no compile errors, code should be free from poorly written code that results in obvious problems. Static tools are great at quickly finding logic type problems that are obviously wrong and can be easily fixed. In addition, for more sophisticated static analysis tools who can do a full-analysis across components, many complex integration oriented problems can be discovered. In addition, they don't require test cases, and can easily be automated into the process to find scores of problems with the newly written code. Minimizing the time between finding problems and fixing them increases the efficiency of building quality into the code by many times.&lt;br /&gt;&lt;br /&gt;Some static tools though, can be noisy and therefore can be more trouble than they are worth. However, by skimming through the problems regularly, developers can catch the low hanging fruit and fix the obvious problems before a backlog builds and gets out of hand.&lt;br /&gt;&lt;br /&gt;More advanced software development organizations make it a requirement to review and address every problem as they pop up but it often takes either a separate group or a few consultants to handpick the high priority stuff so that the developers can be most productive.&lt;br /&gt;&lt;br /&gt;Static analysis for defect detection is increasingly becoming an integral part of the continuous build process for many leading companies. By cleaning up the code early and often, software development organizations improve their quality while also improving their overall efficiency.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5704901458470135557-7799879966029550860?l=codeintegrity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeintegrity.blogspot.com/feeds/7799879966029550860/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeintegrity.blogspot.com/2009/06/source-code-anaylsis-and-continuous.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/7799879966029550860'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/7799879966029550860'/><link rel='alternate' type='text/html' href='http://codeintegrity.blogspot.com/2009/06/source-code-anaylsis-and-continuous.html' title='Source Code Analysis and Continuous Integration - A Perfect Marriage'/><author><name>Andy</name><uri>http://www.blogger.com/profile/06705630945588101293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5704901458470135557.post-979888897836689029</id><published>2009-06-04T12:18:00.000-07:00</published><updated>2009-06-08T06:43:44.277-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile software development'/><title type='text'>Agile Software Development and Automated Static Analysis</title><content type='html'>I was recently at an Agile conference where I heard from leading software development organizations.  They described their experiences bringing Agile software development practices into their organizations.  Some of these organizations were the typical, nimble Internet companies while others were large scale, healthcare and medical devices companies.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.uwyo.edu/dbmcd/molmark/lect11/Cheetah.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 208px; height: 155px;" src="http://www.uwyo.edu/dbmcd/molmark/lect11/Cheetah.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I was particularly keen on the aspects of software quality and Agile.  Agile enables organizations to be more responsive to ever changing market demands.  Agile enables organizations to have much faster cycle times, providing more of an iterative approach to delivery than in the traditional waterfall.  With this comes features that better match the current market needs, faster delivery to market and in some cases improved quality.&lt;br /&gt;&lt;br /&gt;Most of these organizations were fully in process with Agile software development but were playing "catchup" with testing.  QA plays an interesting role in Agile environments.  Many of these Agile practitioners went through the realization that QA no longer plays the same role that they did previously.  Now that product owners are much more involved in the process, QA plays less of a role in determining whether the release meets requirements.  QA instead plays more of a role on the delivery team - working closely with engineers to ensure that the proper tests are built and that the project passes all of the tests.   Setting up the right acceptance tests are a critical role for the QA engineer.  The goal of the developer is to write code that will pass the acceptance tests that are generally written at the beginning of the project.&lt;br /&gt;&lt;br /&gt;The role of the developer also changes significantly.  In order to meet quality needs, all agreed that test driven development (TDD) was the way to go.  They also lamented about the challenges, such as developer resistance to writing and performing tests.&lt;br /&gt;&lt;br /&gt;The biggest recommendation for testing was to automate tests as much as possible.  Given the rapid cycle times, there is little time for traditional testing.  Automating the test enables organizations to include testing within the sprint and deliver a production ready project at the end.  Organizations that were in process of building good automation had to resort to follow on sprints after the sprint for testing.  They would schedule a mini-sprint where developers and QA would test what was created in the prior sprint to make sure the quality was at a releasable state.  Of course with a good test framework in place, developers and testers could automate their tests as they were "sprinting" so that during the next iteration, they could perform the same test without any manual intervention.&lt;br /&gt;&lt;br /&gt;Static analysis also plays a big role here.  Static analysis (or source code analysis) enables organizations to bring automated testing right to the developer.  By analyzing their code before checking in their code, they can find potentially critical problems during the earliest part of the development cycle.  Minimizing the time between coding and detection of problems makes  developers makes them more efficient.  Static analysis is an ideal automated testing tool because it requires no testcases and can generate a lot of good bugs in a short amount of time.  Several leading organizations make it a requirement that all static analysis reports are at least looked at and fixed.  Fixing a static analysis defect also usually takes a trivial amount of time.&lt;br /&gt;&lt;br /&gt;Continuous integration was also another area of discussion.  With multiple sprints on the same codebase going on in parallel, performing a system test on the entire system was a challenge for many organizations.  Ensuring continuous integration enabled organizations to gain more efficiency from testing, especially with the fast cycle times many of these organizations have established and results in better code earlier.&lt;br /&gt;&lt;br /&gt;Almost half of all software development organizations have moved or are moving to Agile. Building quality into the development process becomes even more paramount in an Agile process -- but it's not nearly as easy as it sounds.  It's a long road to get there, fraught with not just tools issues but political and process issues -- but it's an integral part of making Agile work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5704901458470135557-979888897836689029?l=codeintegrity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeintegrity.blogspot.com/feeds/979888897836689029/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeintegrity.blogspot.com/2009/06/agile-software-development-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/979888897836689029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/979888897836689029'/><link rel='alternate' type='text/html' href='http://codeintegrity.blogspot.com/2009/06/agile-software-development-and.html' title='Agile Software Development and Automated Static Analysis'/><author><name>Andy</name><uri>http://www.blogger.com/profile/06705630945588101293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5704901458470135557.post-4709499553731382543</id><published>2009-06-04T09:46:00.000-07:00</published><updated>2009-06-04T11:16:23.694-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='backlog static analysis'/><title type='text'>The Cost of Static Analysis Backlogs</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://blog.lodewijkvdb.com/img/pile.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 211px; height: 282px;" src="http://blog.lodewijkvdb.com/img/pile.jpg" alt="" border="0" /&gt;&lt;/a&gt;As we visit leading software development organizations around the world, one thing that we see again and again is a huge backlog of defects reported by their static analysis tool.  Static analysis (or source code analysis) tools are great at quickly finding lots of critical problems in software code.  No test cases and minimal setup are required and so there are few barriers to getting immediate value out of the tool.  In addition, while analysis requires a significant amount of processing, the wall clock time required to get results is insignificant.  To analyze millions of lines of code takes just hours resulting in thousands of potential problems.&lt;br /&gt;&lt;br /&gt;But, many organizations run the tool, cherry pick a few problems and then leave the backlog there, sometimes sitting there for weeks and months.  One would ask why would anyone do this:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;there are real critical bugs in the backlog, some of which are likely to be showstoppers&lt;/li&gt;&lt;li&gt;bugs reported from static analysis tools are easy to fix, because they point to problems in right in the source code&lt;/li&gt;&lt;li&gt;license costs for static analysis tools are not insignificant&lt;/li&gt;&lt;li&gt;the value of a static tool is not in how bugs are found, but in how many good bugs are fixed&lt;/li&gt;&lt;/ul&gt;But there are real reasons why these backlogs sit unaddressed:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;handling source code analysis results are not a part of the standard development process.  When it becomes an extra step, it won't be done without the right incentives and consequences.&lt;/li&gt;&lt;li&gt;getting developers trained on code analysis takes an investment in time and resource.  Most organizations don't have the political will and timing is often important.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;source code analysis results vary in quality.  Keep in mind that a source code analysis solution can only derive information from the source code and has no knowledge of environmental issues or usage/intent issues.  Depending upon the quality of the tool, you may find that 10-20% of problems reported are high priority issues.  The challenge, of course is knowing which ones are the 10-20%.  Engineers must wade through lower priority issues, false positives and "don't cares" in order to find the good ones.  Some tools have higher than a 50% false positive rate.  Developers quickly tune out after a few false positives or "don't care" reports.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;people don't have enough time.  Everyone is being pulled in 10 different directions and the results from a static analysis solution get deprioritized and ignored.  It becomes a thing they'll get to when they have time.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;There is a high probability that there are true, highly critical bugs in the backlog, some of which may cost the organization hundreds of thousands of dollars once they surface.  And the bugs are not hard to fix - it's just that there are so many of them  - how can one get started?&lt;br /&gt;&lt;br /&gt;We've seen many organizations deal with this problem.  Some organizations have allocated resources on their team and created "bug fest" days to bring the backlog down to a manageable level. Other organizations have looked to outside firms such as &lt;a href="http://www.codeintegritysolutions.com/"&gt;ours&lt;/a&gt; to bring in expertise to kill a backlog quickly and efficiently.   Others have "bit the bullet" and rolled static analysis to the general development organization with quota's and status reports to address the backlog.&lt;br /&gt;&lt;br /&gt;Getting a backlog down to zero is an important part of starting a larger rollout of static analysis within the organization.  In many organizations, the incremental changes to a codebase are minimal compared to the size of the overall legacy code.  By addressing the backlog first, you get rid of any major potential problems and start with a clean slate to address any new defects that may arrive from code changes.  It sets the stage for a successful rollout, declutters the reports coming from the tool and addresses potentially serious problems that may be lurking, unaddressed in your defect reports. &lt;br /&gt;&lt;br /&gt;Depending upon the size of the backlog and the cost of a typical bug reported by a static analysis solution (typically crashes, memory leaks, buffer overruns, etc.) not addressing a backlog may be an extremely costly mistake.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5704901458470135557-4709499553731382543?l=codeintegrity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeintegrity.blogspot.com/feeds/4709499553731382543/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeintegrity.blogspot.com/2009/06/cost-of-static-analysis-backlogs.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/4709499553731382543'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/4709499553731382543'/><link rel='alternate' type='text/html' href='http://codeintegrity.blogspot.com/2009/06/cost-of-static-analysis-backlogs.html' title='The Cost of Static Analysis Backlogs'/><author><name>Andy</name><uri>http://www.blogger.com/profile/06705630945588101293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5704901458470135557.post-7286782079151477628</id><published>2009-05-26T08:52:00.000-07:00</published><updated>2009-05-26T09:14:32.589-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sca source code analysis'/><category scheme='http://www.blogger.com/atom/ns#' term='challenges'/><title type='text'>The Challenges of Source Code Analysis</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.codinghorror.com/blog/images/rock-climbing.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 217px; height: 240px;" src="http://www.codinghorror.com/blog/images/rock-climbing.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;W&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;hat are the challenges of Source Code/Static Analysis (SCA&lt;/span&gt;)&lt;br /&gt;SCA in practice is far from perfect.  Simply buying a tool doesn’t solve any problems. Almost certainly making a tool available to your team is not going to result in adoption. In fact, it rarely does.&lt;br /&gt;&lt;br /&gt;Think of the old adage: “you don’t go to a hardware store to buy a drill, you go to buy holes.”  When you purchase an SCA tool you are buying fixed defects and addressed vulnerabilities.  The tool, by itself, will get you only small part of the way there.  The biggest challenges we’ve seen from hundreds of deployments are:&lt;br /&gt;&lt;br /&gt;•    Lack of integration into the process&lt;br /&gt;•    Misconfiguration and setup of technology to match business goals&lt;br /&gt;•    Lack of trust in what the tool is reporting&lt;br /&gt;•    Lack of management support&lt;br /&gt;•    Lack of commitment&lt;br /&gt;•    Insufficient staffing in number and in expertise&lt;br /&gt;•    Lack of ownership&lt;br /&gt;&lt;br /&gt;When you purchase an SCA tool, your work has only just begun.  Just as with most other tools, after the license and support costs, there are tangible and intangible costs to operate the tool effectively from both a technical and process standpoint.  These investments have to be made otherwise, the tool will sit on the shelf, nobody will use it and the purchase will have been a waste.  Luckily, these costs are not generally large and most of the issues can be addressed with some good planning and allocation of the right resources and budget.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Belief in the tools value&lt;/span&gt;&lt;br /&gt;It is very difficult to calculate the ROI on an SCA tool.  By definition, you are fixing problems before they go out into the field, and so it is difficult to predict the full extent of what the benefit would have been if you hadn’t used the tool.  Several companies have tried to measure a tool’s value by correlating found results to past defects with some success.  Results have varied greatly depending upon the codebase and the methodology used to analyze the results.  Most see a big benefit but are not able to quantify it well.&lt;br /&gt;&lt;br /&gt;In addition, SCA tools provide at best, educated guesses and therefore can be incorrect.  This should be fully expected.  For example, SCA tools have limited ability to account for environmental assumptions like configuration settings or usage constraints. False positives (incorrectly flagged defects) or irrelevant (“that will never happen” issues) can cause users to lose confidence in it.  Defect reports pile up or worse yet, valid bugs are incorrectly marked as false because the developer didn’t trust the tool enough to investigate the report in enough detail.  SCA reported defects then become low priority and remain unaddressed.  Bugs and vulnerabilities you could have caught in development instead slip through into production.&lt;br /&gt;&lt;br /&gt;The initial usage of the tool is an important time when lasting impressions are formulated.  Many SCA tools report problems equally with little guidance as to what is higher priority than others.  To be fair, priority is different for every organization and is usually comprised of severity of effect, how likely it will occur in production and how it affects functionality of the product.  Therefore it is typically not calculated. To the developer using the tool with a large pile of bug reports, they don’t know where to begin.  SCA tools do not prioritize well.&lt;br /&gt;&lt;br /&gt;In software development organizations, there is a constant battle between what is urgent and what is important.  SCA tools fit more under the important category and are often deprioritized from daily activities in an environment where everything is urgent.   Some organizations unfortunately are more reactive than proactive. If everything is urgent, then in general you are understaffed.  If people are pulled onto different projects and can never accomplish their goals, then you have not made a serious commitment to SCA.  Get ready to put the SCA tool on the shelf.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Changing behavior is hard&lt;/span&gt;&lt;br /&gt;Most organizations who use SCA require the software developer who owns the code to fix the problems reported.  Getting participants to change their process is never easy.  Extra steps are never welcome.  Expect resistance from a vocal minority.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.benlacy.net/blog/wp-content/uploads/2008/02/frustrated.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 148px; height: 101px;" src="http://www.benlacy.net/blog/wp-content/uploads/2008/02/frustrated.jpg" alt="" border="0" /&gt;&lt;/a&gt;If the tool is not easy then it won’t get used.  It has to be baked into the process.  The tool has to be easy to use and the users trained.  In addition, individuals have to feel that it adds value to their job.  Incentives and consequences are extremely important.  People who use the tool to accomplish business goals should be rewarded loudly.  Likewise, there need to be penalties or consequences for not fixing problems reported from the SCA tool.  Techniques like the “wall of shame” and MBO’s help align everybody to the common goal but must be used carefully.  Displaying high bug counts can be a powerful political force but can cause undesired effects such as developers overzealously marking their defects as false or ignore’s.  You have to balance the culture with the proper checks and balances to have the right effect.&lt;br /&gt;&lt;br /&gt;Management support has to be strong and steady.  It’s hard to prioritize quality and security over features and functionality. If management doesn’t believe it is a priority, then it will never succeed.  Setting up the right process and the correct incentive structures are critically important to changing behavior.  That being said, management should always be evaluating whether an investment in a tool is required or not.  Having the right reporting in place can help management monitor the contribution SCA is making to the overall development process. Market conditions and therefore priorities change rapidly from day to day.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Giving the right support&lt;/span&gt;&lt;br /&gt;Lack of ownership is a huge issue.  In addition to management support, there needs to be ownership from both a tools operation perspective and from the user perspective.  Often, a small percentage of a single resource is charged with owning the SCA tool.  Most SCA tools come preconfigured to accomplish goals that may be misaligned with your own.  Without th&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://northphoenixagent.files.wordpress.com/2008/04/man-peeking-out-of-moving-box.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 170px; height: 114px;" src="http://northphoenixagent.files.wordpress.com/2008/04/man-peeking-out-of-moving-box.jpg" alt="" border="0" /&gt;&lt;/a&gt;e proper expertise and time commitment, most SCA administrators resort to using the SCA tools out of the box, resulting in higher false positives rates, incomplete code coverage, increased false negatives (where the tool should have reported a bug but didn’t) and suboptimal performance.   SCA tools are sophisticated and can be tuned to optimum capabilities for a specific codebase.  Expecting your SCA operator (who may have many other responsibilities) to be an expert administrator of the tool is unrealistic and a set up for failure.&lt;br /&gt;&lt;br /&gt;Companies who gain the most value from SCA allocate expert staff with “static analysis” in their titles.  They, in turn, took years to develop the level of proficiency that transform their organizations into big quality and security success stories.&lt;br /&gt;&lt;br /&gt;At &lt;a href="http://www.codeintegritysolutions.com/"&gt;Code Integrity Solutions&lt;/a&gt;, we've worked with many leading organizations (both small and large) to help them overcome these challenges.  But every organization is different.  Let us know what challenges you've seen with source code analysis/static analysis in your organization.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5704901458470135557-7286782079151477628?l=codeintegrity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeintegrity.blogspot.com/feeds/7286782079151477628/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeintegrity.blogspot.com/2009/05/challenges-of-source-code-analysis.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/7286782079151477628'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/7286782079151477628'/><link rel='alternate' type='text/html' href='http://codeintegrity.blogspot.com/2009/05/challenges-of-source-code-analysis.html' title='The Challenges of Source Code Analysis'/><author><name>Andy</name><uri>http://www.blogger.com/profile/06705630945588101293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5704901458470135557.post-1630186315867377550</id><published>2009-05-22T10:30:00.000-07:00</published><updated>2009-05-22T10:40:25.729-07:00</updated><title type='text'>Whitepaper Excerpt: The Benefits of Source Code Analysis</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.schwartzmarketing.com/images/road_sign_1_g4vr.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 268px; height: 185px;" src="http://www.schwartzmarketing.com/images/road_sign_1_g4vr.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:arial;"&gt;I recently authored a whitepaper focused on how companies can succeed with their source code analysis efforts -- most importantly to match their source code analysis efforts with whatever their business-focused goals are.  We at &lt;a href="http://www.codeintegritysolutions.com/"&gt;Code Integrity Solutions&lt;/a&gt; have seen dozens to hundreds of deployments.  We have taken what we consider the best practices and put the information in a whitepaper.  If you are interested in getting a copy of the whitepaper, please contact us at info@codeintegritysolutions.com.  I included an introductory excerpt below:&lt;/span&gt;&lt;span style="font-weight: bold;font-family:arial;" &gt;&lt;br /&gt;&lt;br /&gt;What is Static Source Code Analysis&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Source code analysis, sometimes known as static analysis, is a technology that uses sophisticated algorithms to analyze source code (such as C, C++, Java and C# code) and report on findings.  Typically, source code analysis (hereby known as SCA) is performed to find defects or security vulnerabilities in source code or provide structural information on the architecture of the code.  Many modern SCA tools can analyze all the paths in the code providing significantly more coverage than traditional dynamic testing tools.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-family:arial;" &gt;What are the Benefits of SCA&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Finding defects and vulnerabilities in source code enables software development organizations to develop better quality, more secure software cheaper.  Finding and fixing a bug in the development process can be 100 times cheaper than having the bug slip through to production.  SCA doesn’t require test cases (since it doesn’t operate on running code), can report hundreds and thousands of defects in a short amount of time and can report problems right in the source code, making it easier for software developers to fix.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Many organizations have used SCA to greatly improve the quality and security of released code.   The business benefits include:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Better Engineering Efficiency &lt;br /&gt;•    increased developer productivity&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;•    faster time to market&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;•    better trained developers who write better quality code as part of the development process&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;•    more maintainable code&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;Compliance&lt;br /&gt;•    adherence to industry standards&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;•    compliance to government standards such as FDA requirements&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;Minimized Risk &lt;br /&gt;•    decreased quality and security risk&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;•    increased confidence in offshore or outsourced code&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;•    increased confidence in third party licensed code&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;L&lt;span style="font-family:arial;"&gt;ower Business Cost    &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;•    lower cost of recalls, returns&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;•    lower support costs, field issues&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;•    increased customer satisfaction&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;•    increased renewals&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;Stronger marketing claims &lt;br /&gt;•    higher availability and uptime statistics&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;•    fewer security vulnerabilities&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Just to name a few.  In our next post, we'll talk about some of the challenges!&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5704901458470135557-1630186315867377550?l=codeintegrity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeintegrity.blogspot.com/feeds/1630186315867377550/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeintegrity.blogspot.com/2009/05/whitepaper-excerpt-benefits-of-source.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/1630186315867377550'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/1630186315867377550'/><link rel='alternate' type='text/html' href='http://codeintegrity.blogspot.com/2009/05/whitepaper-excerpt-benefits-of-source.html' title='Whitepaper Excerpt: The Benefits of Source Code Analysis'/><author><name>Andy</name><uri>http://www.blogger.com/profile/06705630945588101293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5704901458470135557.post-6110622138197643705</id><published>2009-05-16T18:15:00.000-07:00</published><updated>2009-05-16T19:41:04.520-07:00</updated><title type='text'>People, Process and Technology</title><content type='html'>A former colleague of mine who was in enterprise sales used to always say, it's all about people, process and technology.  I've found that to be a great way to frame how software tools not only get sold but also adopted.  Having a great technology is only one small part of the battle for success.  In fact, many companies become highly successful without having the best technology compared to the competition.  Having a best in class product makes success easier, but it does not nearly guarantee success.  Many piece are required to fall into place.&lt;br /&gt;&lt;br /&gt;Process considerations are highly underrated.  Many software companies clearly see the value their tool brings to their customers but they often don't see the changes that must be made in the way the target market adopts the solution.  Making their customer's lives easier in one aspect of their job may introduce headaches in others just as easily.  Making a change to accommodate another tool may be just too much for an already overstretched company to handle.  Even if the result is a much more streamlined process, the initial cost of changing the organization to a newer process may be daunting in both effort and risk.  Organizations may be experts at what they build, but may not be experts at instituting a new process that helps them get to their goals faster.&lt;br /&gt;&lt;br /&gt;People issues always are the most dynamic and unpredictable.  Organizations are made up of people who have their own MBO's and most importantly, their own personal agendas.  Finding who owns the pain and who can alleviate that pain is critical.   Often many initiatives fail to have a true owner, someone who has the skill, the fortitude and the necessary bandwidth to gain success.  No wonder project success rates are abysmal.  People are pulled on different projects as priorities change, and a string of unfinished initiatives are left hanging.  Taking on an initiative also has its challenges.  The risk of failure can be high and nobody wants to be associated with a failed initiative.  Taking on risk is important for any company to survive -- but minimizing the risk through proper resource allocation, outside expertise and good planning is essential.&lt;br /&gt;&lt;br /&gt;At &lt;a href="http://www.codeintegritysolutions.com"&gt;Code Integrity Solutions&lt;/a&gt;, we have worked with many different customers in many different industries.  It's amazing to see how such skilled individuals are being asked to do the impossible - to drive important initiatives in the face of constantly changing requirements.  We've seen people responsible for numerous other important initiatives while also trying to drive a source code analysis intiative throughout a large organization.  The challenges are great for companies trying to find solutions that satisfy not just their technology needs but also their people and process issues.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5704901458470135557-6110622138197643705?l=codeintegrity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeintegrity.blogspot.com/feeds/6110622138197643705/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeintegrity.blogspot.com/2009/05/people-process-and-technology.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/6110622138197643705'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/6110622138197643705'/><link rel='alternate' type='text/html' href='http://codeintegrity.blogspot.com/2009/05/people-process-and-technology.html' title='People, Process and Technology'/><author><name>Andy</name><uri>http://www.blogger.com/profile/06705630945588101293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5704901458470135557.post-6450358021025028342</id><published>2009-05-02T14:09:00.001-07:00</published><updated>2009-05-03T11:30:48.982-07:00</updated><title type='text'>The Challenges (and Benefits) of Source Code Analysis</title><content type='html'>&lt;span style="color: rgb(255, 0, 0);font-size:180%;" &gt;&lt;span style="font-weight: bold;"&gt;S&lt;/span&gt;&lt;/span&gt;ource code analysis, (or static analysis) has been used for many years now to perform detection of defects.  Lint was one of the more popular early technologies for catching potential problems in code.  Since then, the technology for finding defects has greatly improved enabling software development organizations to automatically detect problems with greater depth and accuracy than ever before.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm1.static.flickr.com/63/188697388_69e96534cb.jpg?v=0"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 172px; height: 129px;" src="http://farm1.static.flickr.com/63/188697388_69e96534cb.jpg?v=0" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The qualitative arguments have always been apparent.  Finding and fixing a defect after a product has shipped can be orders or magnitude more expensive than if you found the problem during development.   The cost of recreating a bug, debugging it and then fixing it is significantly larger than a tool pointing to where in the source code your problem is while you are developing it.&lt;br /&gt;&lt;br /&gt;While many leading organizations agree that source code analysis is important, it is often too hard for these same organizations to fully bake it into their process and use it in a disciplined way.  There are numerous reasons why:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Results from static analysis tools always have false positives.  The tolerance level of a software developer for false positives is very low.  If they see more false positives than true positives, then they begin to mistrust the results.  The downward cycle begins as they investigate each new report as likely to be incorrect.  We saw in several customer situations where developers will incorrectly ignore a report because they assumed it was incorrect and did not investigate it as fully as they should have.&lt;/li&gt;&lt;li&gt;Source code analysis is not yet part of the standard "reference architecture" for software development.  Everyone needs a source control system, bug tracking system, editors, etc. but source code analysis is still not standard issue for most organizations.  Adoption of such tools thus requires more effort in training and customization for rollout.  In addition, organizations can utilize static analysis at many different points -- some in the IDE, some as part of a nightly build and some on a per sprint or release basis.  Very few organizations have experienced static analysis practitioners to establish the right structure and processes for the organization.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Source code analysis can be more "vitamin" than "aspirin".  When an executive comes to engineering complaining about the latest bug that is causing you to lose customers, there is an easy way to value the pain.  Get it done and don't go home until you do.  With a problem reported in static analysis, the pain levels are perceived to be much lower.  It is often too difficult to understand how a source code flaw would manifest in production.  A developer can be too far removed from how it might affect customers (and which customers).  Business metrics are also hard because it isn't easy to cleanly measure field impact to defects fixed from static analysis.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;In these economic times, organizations have to do more with less.  Resources are constantly being pulled on to different projects.  Organizational structures can change several times in a year.  Priorities seem like they change with the wind to meet market conditions.  Time and again, we see many organizations purchase tools but then get 10% of the value because they don't have the resources.  Due to the way budgeting is performed, hiring headcount means the "wrong" kind of costs.  The result is that no one has true ownership of making it happen and the tool effectively sits on the shelf.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:180%;"&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;I&lt;/span&gt;&lt;/span&gt;t's a shame.  &lt;a href="http://www.coverity.com/"&gt;Coverity&lt;/a&gt; has provided some metrics that they have been able to increase developer productivity by 12.5%, accelerate development cycles by 10-15% and reduce field defects by 30%.  Caper Jones says that defects can be reduced by up to a factor of six.  Although the mileage varies with each of these statistics, these are nevertheless significant numbers, particularly if your business is the technology that you're building.  Many leading firms like Microsoft and Cisco and government organizations like the Air Force have made significant investments into static analysis and have successfully made it an integral part of their software development process.  The road isn't hard but not easy either.  The right combination of executive sponsorship, appropriate processes and incentives, accurate and effcient tools, ownership and in-house and outsourced expertise can help most any organization improve their software development organization significantly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5704901458470135557-6450358021025028342?l=codeintegrity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeintegrity.blogspot.com/feeds/6450358021025028342/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeintegrity.blogspot.com/2009/05/challenges-and-benefits-of-source-code.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/6450358021025028342'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/6450358021025028342'/><link rel='alternate' type='text/html' href='http://codeintegrity.blogspot.com/2009/05/challenges-and-benefits-of-source-code.html' title='The Challenges (and Benefits) of Source Code Analysis'/><author><name>Andy</name><uri>http://www.blogger.com/profile/06705630945588101293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5704901458470135557.post-697975729614115303</id><published>2009-05-01T20:17:00.000-07:00</published><updated>2009-05-03T11:35:06.698-07:00</updated><title type='text'>Greetings from Code Integrity Solutions (CIS)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.nagpals.com/blog/assets/content//images/bug.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 250px; height: 220px;" src="http://www.nagpals.com/blog/assets/content//images/bug.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codeintegritysolutions.com/"&gt;Code Integrity Solutions&lt;/a&gt; (CIS) is a provider of software integrity professional services.  Started by former executives of &lt;a href="http://www.coverity.com/"&gt;Coverity&lt;/a&gt;, Inc., CIS's mission is to help leading software organizations gain the most from their static analysis investment.&lt;br /&gt;&lt;br /&gt;Through this blog, we hope to provide you with news, insight and commentary on software quality, source code analysis, software security and a host of other software development issues.  We invite your comments and a healthy debate on issues that software development organizations face every day.&lt;br /&gt;&lt;br /&gt;Thanks for listening!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5704901458470135557-697975729614115303?l=codeintegrity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeintegrity.blogspot.com/feeds/697975729614115303/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeintegrity.blogspot.com/2009/05/greetings-from-code-integrity-solutions.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/697975729614115303'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5704901458470135557/posts/default/697975729614115303'/><link rel='alternate' type='text/html' href='http://codeintegrity.blogspot.com/2009/05/greetings-from-code-integrity-solutions.html' title='Greetings from Code Integrity Solutions (CIS)'/><author><name>Andy</name><uri>http://www.blogger.com/profile/06705630945588101293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
