<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Code Emporium &#187; Reviews</title>
	<atom:link href="http://www.codeemporium.com/category/reviews/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.codeemporium.com</link>
	<description>Coding eclecticism, and other large words</description>
	<lastBuildDate>Mon, 31 May 2010 13:30:52 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>I Get the Feeling that the Debugging Discipline has a Bright Future Ahead</title>
		<link>http://www.codeemporium.com/2010/01/31/i-get-the-feeling-that-the-debugging-discipline-has-a-bright-future-ahead/</link>
		<comments>http://www.codeemporium.com/2010/01/31/i-get-the-feeling-that-the-debugging-discipline-has-a-bright-future-ahead/#comments</comments>
		<pubDate>Sun, 31 Jan 2010 08:22:17 +0000</pubDate>
		<dc:creator>Bryce Thomas</dc:creator>
				<category><![CDATA[Reviews]]></category>
		<category><![CDATA[andreas]]></category>
		<category><![CDATA[debugging]]></category>
		<category><![CDATA[delta]]></category>
		<category><![CDATA[historical debugging]]></category>
		<category><![CDATA[program slices]]></category>
		<category><![CDATA[zeller]]></category>

		<guid isPermaLink="false">http://www.codeemporium.com/?p=512</guid>
		<description><![CDATA[When I debug, I use what I&#8217;d consider to be a set of pretty stock standard tools and strategies.  We&#8217;re talking breakpoints, conditional breakpoints, stepping into code, stepping out of code, stepping over code, variable watches, stack traces, you know the likes&#8230;  
Just recently though I finished reading Why Programs Fail, Second Edition: [...]]]></description>
			<content:encoded><![CDATA[<p>When I debug, I use what I&#8217;d consider to be a set of pretty stock standard tools and strategies.  We&#8217;re talking breakpoints, conditional breakpoints, stepping into code, stepping out of code, stepping over code, variable watches, stack traces, you know the likes&#8230;  </p>
<p>Just recently though I finished reading <a href="http://www.amazon.com/gp/product/0123745152?ie=UTF8&#038;tag=codeempo-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=0123745152">Why Programs Fail, Second Edition: A Guide to Systematic Debugging</a><img src="http://www.assoc-amazon.com/e/ir?t=codeempo-20&#038;l=as2&#038;o=1&#038;a=0123745152" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /> by Andreas Zeller.</p>
<p><a href="http://www.amazon.com/gp/product/0123745152?ie=UTF8&#038;tag=codeempo-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=0123745152"><img border="0" src="http://www.codeemporium.com/http://www.codeemporium.com/wp-content/uploads/2010/01/why_programs_fail.jpg"></a><img src="http://www.assoc-amazon.com/e/ir?t=codeempo-20&#038;l=as2&#038;o=1&#038;a=0123745152" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>
<p>This is no &#8220;Learn to Debug in 24 Hours Using Visual Studio&#8221;; it&#8217;s an entirely different treatment of debugging.  Just when you thought you knew everything there was to know about debugging, Andreas Zeller came along and unleashed this little gem.  The debugging concepts and techniques presented in this book are way ahead of the curve compared to what is commonplace in industry right now.  I wanted to dedicate this post to going over just a few of the concepts presented in this book, to give you a taste of all that is still left to come for mainstream debugging.  So here we go.</p>
<p><strong>1. Debugging Backwards In Time</strong><br />
The traditional way to conduct a debugging session is to set some breakpoints, fire up your debugger, wait until a breakpoint is hit then start inspecting the program&#8217;s variables and execution, stepping through the code line at a time.  If you&#8217;re anything like me, you rarely find the problem cause on the first run through.  By the time you reach a line of code where you notice your variables aren&#8217;t as they should be, you&#8217;ve gone too far.  Time to set some more breakpoints, fire up a new debugging session and see how many more times you can overstep the problem before you actually get it right.</p>
<p>Enter Backwards Debugging.  Wouldn&#8217;t it be great if you could run your debugging session once, realise when you&#8217;ve stuffed up and stepped too far ahead in your code and be able to press rewind?  Even better, being able to replay that mangled piece of code back again as many times as you like without ever having to start a new debugging session?  It&#8217;d be like getting to listen to the 6 minutes of The Verve&#8217;s <em>Bitter Sweet Symphony</em> on track repeat without ever having to subject yourself to the other 69 minutes of torture that is the remainder of the album.</p>
<p>Well, guess what?  Backwards debugging tools already exist (for some languages at least).  In fact, the first experimental backwards Java debugger, or &#8220;Omniscient Debugger&#8221; (as coined by Bill Lewis) seems to have been released all the way <a href="http://www.lambdacs.com/debugger/Article.html">back in 2002</a> (Yes, 8 years is a long time in the world of technology).  <a href="http://www.lambdacs.com/debugger/debugger.html">Here is a more recent page</a> about the Omniscient Java Debugger.</p>
<p>For the Microsofties among us (myself partially included), you&#8217;ll be pleased to know that Microsoft Visual Studio 2010 is going to come equipped with a &#8220;<a href="http://channel9.msdn.com/posts/VisualStudio/Historical-Debugger-and-Test-Impact-Analysis-in-Visual-Studio-Team-System-2010/">Historical Debugger</a>&#8221; that lets you step backwards in time through your program.  Hopefully this will give backwards in time debugging the exposure it needs to get people excited enough to demand it from other non-.NET programming languages.</p>
<p><strong>2. Program Slices</strong><br />
A program slice is a subset of a program that influences a particular program statement or the subset of a program that is influenced by a particular program statement.  Now you&#8217;re confused.  It&#8217;s really very simple.  Let&#8217;s give an example.  Imagine for a moment that you have the following function (this one happens to be written in Python):</p>
<pre name="code" class="python">
def summul(a, b):
    sum = 0
    mul = 1
    while (a <= b):
        sum = sum + a
        a = a + 1
        mul = mul * a
    print(sum)
    print(mul)
</pre>
<p>Don't worry too much about what this function does.  It's really not important.  Now though, say that the value we see printed for <code>mul</code> when calling this function isn't what we expected it to be.  For a small sample of code like this, it's easy enough to look back over the whole piece of code and figure out what's wrong.  For a larger piece of code though, it'd be nice to be able to look at only those statements which influence the value being printed out for <code>mul</code> without all of the noise from the other statements that are completely irrelevant.  So how would we go about isolating only those statements that affect the value printed for <code>mul</code>?  Well, we can manually do it by looking back through the code and finding which lines <em>directly</em> and also <em>indirectly</em> influence the value of <code>mul</code>.  Let's give that a go.</p>
<p>- Obviously line #9 influences what is printed for <code>mul</code> because it's what does the printing.<br />
- Line #8 in no way influences the value of <code>mul</code> and so in no way influences the value printed for <code>mul</code>.<br />
- Looking back we see that the value of <code>mul</code> is influenced by line #7, as it multiplies <code>mul</code> by <code>a</code>.  So line #7 influences what is printed for <code>mul</code>.<br />
- Now we have an indirect or <em>transitive</em> dependency between line #6 and the value of <code>mul</code>, because line #6 affects the value of <code>a</code>, and <code>a</code> affects the value of <code>mul</code> in line #7.  So line #6 influences the value printed for <code>mul</code>.<br />
- Line #5 reads the value of <code>a</code>, but doesn't modify it, so <code>mul</code> is <em>not</em> dependent on line #5 and therefore the value printed for <code>mul</code> is not dependent on line #5.<br />
- Line #4 affects <code>mul</code> as the <code>while</code> statement controls the execution of other statements affecting <code>mul</code>.  Therefore line #4 influences what is printed for <code>mul</code>.<br />
- Line #3 is where the value of <code>mul</code> is initially set.  So line #3 influences what is printed for <code>mul</code>.<br />
- Line #2 has no influence over <code>mul</code> as <code>sum</code> is neither directly nor indirectly connected to <code>mul</code>.  Therefore line #2 in no way influences the value printed for <code>mul</code>.<br />
- Line #1 influences <code>mul</code>, as the arguments for both <code>a</code> and <code>b</code> are passed in here; both of which affect the value of <code>mul</code>.  Therefore line #1 influences what is printed for <code>mul</code>.  </p>
<p>So if we are debugging a misprinted value of <code>mul</code>, we can trace the problem back to somewhere in lines 1, 3, 4, 6, 7 and 9.  So we only need be looking at:</p>
<pre name="code" class="python">
def summul(a, b):

    mul = 1
    while (a <= b):

        a = a + 1
        mul = mul * a

    print(mul)
</pre>
<p>That was kind of tedious you say, and it only eliminated 3 lines of code.  Yep, but 3 lines is 33% of the code and you've been able to completely rule out those 3 lines as the cause.  Really though, the important thing to note here is that creating program slices like these is a great candidate for automation.  For those of us (un)?lucky enough to be writing code in C/C++, there's a tool called <a href="http://www.grammatech.com/products/codesurfer/overview.html">CodeSurfer</a> that does just this, with the ability to automatically generate program slices and highlight the lines of code that influence any given statement.  I'd love to see this kind of functionality built into Visual Studio or Eclipse.  I can envisage rolling my mouse over a variable during a paused debug session and having it show not only the variable's value, but fade out all of the lines of code which had no bearing on how that value came to be.</p>
<p>I haven't gone into too much detail on all of the program slice variants; they're covered in much more depth in the text.  Particularly interesting is the difference between static slices and dynamic slices though.  The idea behind a static slice is that you cover all of your bases (all possible execution paths), regardless of what variable values your program actually executes with.  Dynamic slices however are a further refinement that narrow down the number of dependent lines of code based on known variable values in a given run of a program.  Take this basic (and pointless) piece of code for example:</p>
<pre name="code" class="python">
def pointless(c,d):
    if c > 5:
        d = d + 3
    d = d + 1
    print(d)
</pre>
<p>Assume we execute this function passing in the value <code>4</code> for <code>c</code> and <code>2</code> for <code>d</code>.  If we wanted to know which lines could influence the value printed for <code>d</code>, a static program slice would say lines 5, 4, 3, 2 and 1 (all of them).  A static slice has no knowledge of the values being passed in for <code>c</code> and <code>d</code> and so covers its bases saying that it's quite possible that lines #2 and #3 may affect the value printed for <code>d</code> if the <code>if</code> statement evaluates to <code>True</code>.  </p>
<p>A dynamic program slice on the other hand looks at a specific execution of the program.  The dynamic slice would realise that the value of <code>c</code> is not greater than 5, and so lines #2 and #3 would have no bearing on the value printed for <code>d</code>, at least not under this specific execution.  Therefore the dynamic slice would only include lines 1, 4 and 5 as those capable of influencing what is printed for <code>d</code>.  </p>
<p><strong>3. Delta Debugging</strong><br />
Delta Debugging is a fancy (and in retrospect more concise) way of saying "find the difference between an old working version of my program and a new broken version of my program and narrow down the change(s) within that difference that is causing my new version to be broken".  Much like program slices, delta debugging is all about automation.  It's about saying to the computer "here's my old working code, here's my new broken code, figure out what part of the difference between the two is giving me a headache".  </p>
<p>It's worth noting here that we're not just talking about doing a diff between the new and old version of the program code and having a programmer manually read through all of the changed lines looking for potential problem causes.  No, delta debugging is more advanced than that.  Delta debugging says "I'm going to use a binary search to automatically narrow down what part of the diff is giving you problems".  By executing the program multiple times with only <em>some</em> of the new changes applied, delta debugging aims to find out <em>which</em> of those new changes is causing the problem.</p>
<p>That all sounds nice you say, but how the hell does this all work?  Well, delta debugging does assume a few things.  The first assumption is that you have your code under version control.  It's pretty hard to compare an old version against a new version if the old version no longer exists.  The other assumption is that you have a test suite of some sort so that the computer has some way of determining which executions qualify as "passing" and which executions qualify as "failing".  It can be hard to convince people of the merits of unit testing, especially when so much of the supporting evidence is empirical and given the unprecedented levels of fanboyism surrounding it.  To anyone who preaches unit testing, here's my advice: start your sermon with "unit testing lets you automate debugging".  From here on it should be mostly smooth sailing.</p>
<p>Back to delta debugging though.  Time for an example.  You've got your version control and your test suite in place.  Your old version of code is committed after passing the test suite and you've just now added 100 new lines of "enhancements" for your program.  You run the test suite again and it now reports EPIC FAIL (by the way, I don't know of any testing frameworks that report this, but if you work on one, please consider it, at least for say > 80% test failure rate).  So now all you know is that something in that 100 lines of code is causing your test suite to fail.  </p>
<p>You throw delta debugging at it.  Your delta debugger splits those 100 lines in half, takes 50 of them, mixes them in with your old working code and runs it through the test suite again.  Does the test suite now pass?  If it does, then those 50 lines of code aren't causing the problem, so trying running the program through the test suite again with the other 50 lines of code.  If it doesn't pass, then split those 50 lines of code in half again and try running the program through the test suite with only 25 lines of code changes applied.  You probably get the idea from here.  It's basically a binary search for the problem in your code changes.</p>
<p>You can see how this process can be automated to isolate which line(s) of code amongst all those changed lines of code cause the test suite to fail.  My example is of course highly contrived.  In fact, there is only a very small class of problems where you can simply split a piece of code in half and expect it not to break.  There's dependencies between variables on different lines and many of these splits would result in compile errors.  There's further discussion in the book about more advanced methods that build on the same principles, including automated techniques that are syntax aware and not quite so brutish about where splits are made.  The example I presented here was only designed to demonstrate how automation can be used to try a large number of program variants to establish what code changes cause the program to fail.</p>
<p>A delta debugging plugin by the name of <a href="http://ddchange.martin-burger.de/wiki/moin.cgi/DdchangeEclipse">DDCHANGE</a> exists for Eclipse which helps automate debugging using some of the concepts described here.  There's also a nice little <a href="http://ddchange.martin-burger.de/samples/DDchangeEclipse-in-action/001/">Flash video</a> demonstrating it.  I haven't tried DDCHANGE myself, but it certainly looks promising.</p>
<p>One of the things which is nice about backwards in time debugging and program slices is that they don't require any special supporting infrastructure.  If you want your program to do anything, you have to write the code for it, so everything a backwards debugger/program slicer needs is kind of already there for it.  With delta debugging, you need some kind of versioning system as well as a test suite in order for it to be of any use.  If you develop with these anyway then it's really not a problem.  It does however present a bit more of a barrier to simple experimentation.</p>
<p><em>And a bit of a wrap up...</em>  I'm tempted to say this book is up there in the same league as <a href="http://www.amazon.com/gp/product/0735619670?ie=UTF8&#038;tag=codeempo-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=0735619670">Code Complete</a><img src="http://www.assoc-amazon.com/e/ir?t=codeempo-20&#038;l=as2&#038;o=1&#038;a=0735619670" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />.  Sure, it doesn't cover the same breadth of topics, but the writing style is straight forward and methodical and you can tell that the author knows the subject matter extremely well.  It's just got that same feel to it.  For some languages/IDEs the tools are still quite immature/non-existent, but it wouldn't surprise me if most of these debugging techniques become commonplace over the next 5 years or so.  Either way, it's a book that's definitely worth checking out and the best I've read in some time.    </p>
]]></content:encoded>
			<wfw:commentRss>http://www.codeemporium.com/2010/01/31/i-get-the-feeling-that-the-debugging-discipline-has-a-bright-future-ahead/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Facts and Fallacies of Software Engineering</title>
		<link>http://www.codeemporium.com/2009/07/14/facts-and-fallacies-of-software-engineering/</link>
		<comments>http://www.codeemporium.com/2009/07/14/facts-and-fallacies-of-software-engineering/#comments</comments>
		<pubDate>Tue, 14 Jul 2009 10:45:16 +0000</pubDate>
		<dc:creator>Bryce Thomas</dc:creator>
				<category><![CDATA[Reviews]]></category>
		<category><![CDATA[facts and fallacies]]></category>
		<category><![CDATA[robert glass]]></category>
		<category><![CDATA[software engineering]]></category>

		<guid isPermaLink="false">http://www.codeemporium.com/?p=168</guid>
		<description><![CDATA[So I&#8217;ve just graduated from university.  No longer having that on my mind, I&#8217;ve taken the opportunity to take a step back and have a look at what&#8217;s important for me to be working on over the longer term.  One of the things that I feel I should be doing is to ensure [...]]]></description>
			<content:encoded><![CDATA[<p>So I&#8217;ve just graduated from university.  No longer having that on my mind, I&#8217;ve taken the opportunity to take a step back and have a look at what&#8217;s important for me to be working on over the longer term.  One of the things that I feel I should be doing is to ensure that I continue reading and learning autonomously while I&#8217;m out of educational institutions.  Idea being, if I learn just a little more with each new day, I might wake up one morning (or afternoon) and find that I&#8217;m not half bad at this whole software thing (or just suck less).  Label it self-betterment if you like, but I promise running over hot coals won&#8217;t become a part of my repertoire (or at least if it does, I&#8217;ll destroy all evidence of this post). </p>
<p>Back at university I was kept well busy with plenty of prescribed texts to read.  I also made time to read a few other non-prescribed texts, but never as many as I would have liked.  Now that I&#8217;ve got some time, I&#8217;m making a point of reading some of the other software texts that have been on my &#8220;to read&#8221; list for quite some time.  As I make my way through these books, I&#8217;ll voice my thoughts on them here.  Anyway, the book which I&#8217;ve just finished reading (or victim #1) is <em>Facts and Fallacies of Software Engineering</em> by Robert L. Glass.</p>
<p><a href="http://www.amazon.com/gp/product/0321117425?ie=UTF8&#038;tag=codeempo-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=0321117425"><img border="0" src="http://www.codeemporium.com/http://www.codeemporium.com/wp-content/uploads/2009/07/facts-and-fallacies-of-software-engineering.jpg"></a><img src="http://www.assoc-amazon.com/e/ir?t=codeempo-20&#038;l=as2&#038;o=1&#038;a=0321117425" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>
<p>I heard about this book a while back.  It sounded like an interesting enough read so I grabbed a copy.</p>
<p>So what is there to be had out of this book?  Well, as you might have guessed, or at least been hoping, there are some interesting facts (and fallacies) about software engineering contained within.  When talking about facts, here&#8217;s the overarching topics the text discusses:</p>
<ul>
<li>People</li>
<li>Tools and Techniques</li>
<li>Estimation</li>
<li>Reuse</li>
<li>Requirements</li>
<li>Design</li>
<li>Coding</li>
<li>Error Removal</li>
<li>Testing</li>
<li>Reviews and Inspections</li>
<li>Maintenance</li>
<li>Quality</li>
<li>Reliability</li>
<li>Efficiency</li>
<li>Research</li>
</ul>
<p>Most of the facts in each of these sections are rules of thumb; &#8220;generally speaking&#8221; type statements.  A few quick example facts:</p>
<p>Fact #3: <em>Adding people to a late project makes it later.</em><br />
Fact #31: <em>Error removal is the most time-consuming phase of the lifecycle.</em><br />
Fact #42: <em>Enhancements represent roughly 60 percent of maintenance costs.</em></p>
<p>The facts take up the majority of the book; fifty-five facts in total.  There&#8217;s only ten fallacies, which according to Glass are what many in the software engineering field believe to be true, but turn out to be false upon closer inspection.  For example:</p>
<p>Fallacy #1: <em>You can&#8217;t manage what you can&#8217;t measure.</em><br />
Fallacy #6: <em>To estimate cost and schedule, first estimate lines of code.</em></p>
<p>If you&#8217;d like an exhaustive list of the fifty-five facts and ten fallacies, then check out <a href="http://www.codinghorror.com/blog/archives/001083.html">revisiting the facts and fallacies of software engineering</a>.</p>
<p>I think my personal favourite fact out of this book was Fact #5: <em>&#8220;Hype (about tools and technology) is a plague on the house of software&#8221;</em>.  It&#8217;s noted that most software tools and technique improvements actually account for about a 5 to 35 percent increase in productivity and quality, and yet at one point or another someone will invariably have touted &#8220;order of magnitude&#8221; benefits.  Glass points out that the sources of such hype almost always have some form of vested interest, whether it be product sales, high-priced courses or research funding.  Admittedly you could label me a hypocrite at this point, having linked that book cover to my Amazon associate sales account just a few paragraphs back.  I&#8217;ll do my best to remain objective though, and I certainly won&#8217;t be claiming order of magnitude benefits from reading this single book.  </p>
<p>The discussion of hype in fact five reminded me very much of a Ruby on Rails course I took at university.  Even if it had have been the greatest thing since sliced bread, there was nothing like a bunch of dogmatic pseudo-cultured Mac user stereotypes to turn me off the product.  Ruby on Rails as a technology was fine, but there&#8217;s only a certain amount of narcissism one can ingest.  Strangely enough, it didn&#8217;t work half as easily for me as it did for the guy giving the paid seminars. For anyone who has ever gotten caught up in the hype of a technology or methodology, only to find yourself bitterly disappointed that it couldn&#8217;t in fact single-handedly cure cancer and eradicate poverty, then reading this book should make you feel somewhat better.</p>
<p>To be fair, and while on the subject of narcissism, I think Glass has easily earned the &#8220;most references to my own work&#8221; award with this book.  The text seems to be laced with pointers to other books or journal articles that he has authored.  Then again, the book does come across as somewhat of a summary of much of his earlier findings which makes the heavy self-referencing (or self-promotion?) a little more forgivable.</p>
<p>I&#8217;d like to kick back by the fire with a glass of whiskey and a cigar and reminisce about the good old days, noting how many age-old lessons and timely reminders are contained within Facts and Fallacies of Software Engineering.  The problem is, I don&#8217;t smoke, I don&#8217;t have a fireplace and I&#8217;ve only been working in software for two and a half years (and as an undergraduate).  With the new alcohol taxes in Australia, I probably can&#8217;t afford whiskey either.  Anyway, you&#8217;ve probably deduced that I&#8217;m no portrait of experience.  It&#8217;s therefore not my place to pontificate on how all this stuff is congruent with the last <em>n</em> decades of my professional career.  Nonetheless, I did identify with some of the facts and fallacies in the book; a.k.a. lessons that I&#8217;ve already learnt the hard way.  The other facts and fallacies I&#8217;ll keep in mind and see how well they align with my own experiences over the coming years.</p>
<p>All in all it was a pretty good read.  It&#8217;s relatively short (224 pages) and is the kind of book that you can read away from the computer.  You certainly won&#8217;t learn the quickest way to sort one million 32-bit integers and if that&#8217;s the level of technical detail your after then find another book (and <a href="http://www.davidslog.com/25617758/barack-obama-how-to-sort-one-million-32-bit">don&#8217;t ask Barrack</a>).  Some might even say the book is a little too high level, without enough meat to it.  You can at least be assured that there&#8217;s plenty of references to more detailed works (even if half of those works are the author&#8217;s own ink).  If I had to compare it to a fairly popular yardstick, I&#8217;d say it&#8217;s like a <a href="http://www.amazon.com/gp/product/0735619670?ie=UTF8&#038;tag=codeempo-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=0735619670">Code Complete</a><img src="http://www.assoc-amazon.com/e/ir?t=codeempo-20&#038;l=as2&#038;o=1&#038;a=0735619670" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />but with a little less detail and a little more controversy.  This shouldn&#8217;t be too much of a deterrent though, as Glass still makes plenty of valid points and the book still provides a pretty good summary of issues in the field of software engineering.  </p>
<p>Facts and Fallacies of Software Engineering is the kind of book that you don&#8217;t need to invest a lot of time in and one that you can pick up right where you left off if you find yourself interrupted.  Because of this I found the book perfect for filling those sporadic segments of idle time that have a habit of creeping into my life.  Still, it was interesting enough that I wanted to come back and continue reading it, even outside of those &#8220;idle&#8221; periods.  For anyone that reads software engineering texts on a regular basis, I imagine that much of this book will come as old news.  Still, it&#8217;s the kind of book that you&#8217;d want to read even as a refresher on everything you&#8217;ve learnt and forgotten about software engineering over the years.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codeemporium.com/2009/07/14/facts-and-fallacies-of-software-engineering/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
