<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
	xmlns:cc="http://web.resource.org/cc/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" >

<channel>
<title>Adventures in Software</title>
<link>http://adventuresinsoftware.com</link>
<description>Lessons learned on the road to quality computing</description>
<language>en</language>
<copyright>Michael L Perry</copyright>
<managingEditor>mperry@adventuresinsoftware.com</managingEditor>
<generator>Liberated Syndication - libsyn.com</generator>
<webMaster>podcasts@libsyn.com (Liberated Syndication)</webMaster>
<lastBuildDate>Wed, 02 Apr 2008 04:22:00 GMT</lastBuildDate>
<ttl>180</ttl>
<itunes:subtitle>Lessons learned on the road to quality computing</itunes:subtitle>
<itunes:summary>An Internet talk show about software quality for software professionals.</itunes:summary>
<itunes:category text="Technology">
	<itunes:category text="Software How-To" />
</itunes:category>
<itunes:keywords>computers software interface patterns</itunes:keywords>
<itunes:author>Michael L Perry</itunes:author>
<itunes:owner>
<itunes:email>mperry@adventuresinsoftware.com</itunes:email>
</itunes:owner>
<itunes:image href="http://libsyn.com/podcasts/ais/images/AdventuresinSoftware.jpg" />
<image>
<url>http://libsyn.com/podcasts/ais/images/AdventuresinSoftware.jpg</url>
<title>Adventures in Software</title>
<link>http://adventuresinsoftware.com</link>
</image>
<itunes:explicit>No</itunes:explicit>
<item>
<title>AiS 41: Scrum Doesn't Suck (repost)</title>
<link>http://ais.libsyn.com/index.php?post_id=323965#</link>
<description><![CDATA[Repost due to phantom audio track in previous encoding.<br/>]]></description>
<category>podcasts</category>
<pubDate>Wed, 2 Apr 2008 04:22:00 GMT</pubDate>
<guid isPermaLink="true">http://ais.libsyn.com/index.php?post_id=323965#</guid>
<enclosure url="http://media.libsyn.com/media/ais/AiS41.mp3" length="33650542" type="audio/mpeg"/>
<itunes:duration>00:35:01</itunes:duration>
<itunes:author>Michael L Perry</itunes:author>
<itunes:explicit>No</itunes:explicit>
</item>
<item>
<title>AiS 40: Microsoft Office Developers Conference</title>
<link>http://ais.libsyn.com/index.php?post_id=308470#</link>
<description><![CDATA[<p>Derek, Ricky, and I attended the Office Developers Conference in San Jose, CA. There we competed in the national Infusion Sleepless SharePoint Developer's Competition. After the all-night coding competition, we enjoyed the ODC.</p>
<p dir="ltr">At the Bill Gates keynote, I had the opportunity to ask &quot;What is the next killer app?&quot; The answer was that it is not one app as it has been in the past, but the ability to quickly develop custom applications. I agree completely.</p>
<p dir="ltr">We presented our solution during the ODC, with Rock Band playing in the background. Even though we didn't have all the pieces working perfectly, our story really came together. We presented our solution with confidence, and the judges seemed genuinely impressed.</p>
<p dir="ltr">During the keynotes of the second day, they announced the winners. Apparently the judges were impressed, because team Strongbad took the grand prize! We had the rest of the ODC to celebrate our <span>victory</span>, learn even more about SharePoint, and play some <a href="http://www.youtube.com/watch?v=MBzqho_bPN8">Rock Band</a>.</p>
<p dir="ltr">If I ever have the opportunity to compete in this kind of event again, I'll jump at it. The skills I learned and the people&nbsp;I met will stay with me for a long time. Winning is just icing.</p>
]]></description>
<category>podcasts</category>
<pubDate>Mon, 18 Feb 2008 05:23:00 GMT</pubDate>
<guid isPermaLink="true">http://ais.libsyn.com/index.php?post_id=308470#</guid>
<enclosure url="http://media.libsyn.com/media/ais/AiS40.mp3" length="29695414" type="audio/mpeg"/>
<itunes:duration>00:30:54</itunes:duration>
<itunes:author>Michael L Perry</itunes:author>
<itunes:explicit>No</itunes:explicit>
</item>
<item>
<title>AiS 39: Infusion Sleepless Roadshow</title>
<link>http://ais.libsyn.com/index.php?post_id=302604#</link>
<description><![CDATA[The <a href="http://infusion.com/sleepless">Infusion Sleepless Roadshow</a> was an intense weekend of SharePoint training and competition. It was a thrill to participate.<br/><br/>I'd like to thank Infusion for presenting the event, and Microsoft for being a fantastic host. In particular, from Infusion:<br/><br/>Sheldon Fernandez<br/>Nadeem Mitha<br/>Devon Jones<br/>Rory Richardson<br/><br/>And from Microsoft:<br/><br/>Zain Naboulsi<br/>Chris Koenig<br/><br/>And special thanks to my teammates:<br/><br/>Derek Sanderson<br/>Ricky Ma<br/><br/>]]></description>
<category>podcasts</category>
<pubDate>Fri, 1 Feb 2008 06:45:00 GMT</pubDate>
<guid isPermaLink="true">http://ais.libsyn.com/index.php?post_id=302604#</guid>
<enclosure url="http://media.libsyn.com/media/ais/AiS39.mp3" length="33991606" type="audio/mpeg"/>
<itunes:duration>00:35:22</itunes:duration>
<itunes:author>Michael L Perry</itunes:author>
<itunes:explicit>No</itunes:explicit>
</item>
<item>
<title>AiS 38: Use Cases</title>
<link>http://ais.libsyn.com/index.php?post_id=299833#</link>
<description><![CDATA[Ivar Jacobson codified <a id="nvxg" href="http://en.wikipedia.org/wiki/Use_case" title="Use Case">Use Case</a>
Analysis in 1986 as a way of expressing functional requirements. Since
that time, the technique has been improved and formalized. It is now
part of the <a id="jhb8" href="http://en.wikipedia.org/wiki/Rational_Unified_Process" title="Rational Unified Process">Rational Unified Process</a>.<br/><br/>
Why should I write use cases?<br/><ol><li>Use Cases help the systems analyst or software designer to understand the system under construction.<br/></li><li>Help customers understand the system being built.&nbsp; Users can validate that the use cases are correct.<br/></li><li>Use cases are an easy to understand and interpret way of communication the functionality of a system to an implementor.<br/></li></ol>
<br/><br/>What goes into a use case?<br/><ol><li>The name of the use case</li><li>An
identification number that will uniquely identify the use case.&nbsp; This
number WILL NOT CHANGE, even if the use case is modified or deleted.&nbsp;
This is important for tracking history.</li><li>Actor - What actor or actors are going to be the focus of this use case?<br/></li><li>Goal - What is the end result of this use case.</li><li>Preconditions - What must already be true about the actor or system before this use case is valid.</li><li>Triggers
- What triggers this use case?&nbsp; A user inserting their ATM card?&nbsp; The
predetermined nightly batch processing time?&nbsp; etc.</li><li>The Success
Path - What happens when everything goes right with this use case.&nbsp;
This description should start with the trigger and tell the story of
how the state of the target system changes.</li><li>Alternate Paths - This section talks about what can go wrong and how the system will respond to those error conditions.</li><li>Post Conditions - This describes what state the system will be in once the use case has been executed to completion.&nbsp; <br/></li><li>Business Rules - Call out any business rules that apply to this use case.&nbsp; <font color="#3366ff">(RE:&nbsp; I'm not sure about this one...I got this from Wikipedia...not sure I like it)</font><br/></li></ol>
<br/>What is the scope of a use case?<br/><br/>How does a use case compare to a <a id="l2of" href="http://martinfowler.com/bliki/UseCasesAndStories.html" title="story">story</a> in agile methodologies like Scrum?<br/>&nbsp; <a id="dscf" href="http://www.mountaingoatsoftware.com/article_view/27-advantages-of-user-stories-for-requirements" title="Advantages of User Stories">Advantages of User Stories</a><br/>&nbsp; Do I have to choose one or the other?<br/>
<br/><br/>Should I strive for 100% feature coverage with use cases?<br/>
<br/>
As a developer, if my company doesn't perform use case analysis, can I write use cases on my own?<br/><br/>When you have all of your use cases, what next?&nbsp; (discussion about dynamic behavior running through static strcuture)<br/><br/>Good Links:<br/>&nbsp;&nbsp;&nbsp; Use Case Tutorial -- http://readysetpro.com/whitepapers/usecasetut.html<br/><br/>]]></description>
<category>podcasts</category>
<pubDate>Thu, 24 Jan 2008 06:57:00 GMT</pubDate>
<guid isPermaLink="true">http://ais.libsyn.com/index.php?post_id=299833#</guid>
<enclosure url="http://media.libsyn.com/media/ais/AiS38.mp3" length="39720136" type="audio/mpeg"/>
<itunes:author>Michael L Perry</itunes:author>
<itunes:explicit>No</itunes:explicit>
</item>
<item>
<title>AiS 37: .NET Generics</title>
<link>http://ais.libsyn.com/index.php?post_id=276749#</link>
<description><![CDATA[.NET generics are useful for more than just containers. They are a powerful mechanism for code reuse.<br/><br/>We've used generic collections. Instead of just a list of objects, we can declare a list of Person. This is good, because the compiler helps us ensure that only Person objects are stored in the list. It also eliminates the unnecessary cast as we extract a Person from the list. And finally, this lets us type a dot after a list method and see the properties of a Person.<br/><br/>But the power of generics goes deeper than that. They let you declaratively compose types in order to create behaviors in relatively few lines of code. Instead of creating a custom class off in another file to perform a specific function, you can put together pieces right where you need them. This composition is declarative, so your intent is captured as concisely as possible. To get started, you need to master the syntax and learn a few basic patterns.<br/><br/>A strategy is a specific procedure for accomplishing a goal. The goal itself is expressed as an interface. The interface separates the consumer of the goal from its various implementations. By replacing the implementation, you can change the behavior of the system.<br/><br/>A policy is more general than a strategy. It is a generic set of rules with room for interpretation. When the strategy is itself generic, then it is a policy; it can be applied to several types.<br/><br/>A strategy or policy is chosen to accomplish its own goal. But a generic algorithm composes smaller snippets of code to accomplish a larger goal. Unlike a strategy, an algorithm has little value on its own. It must be put into context to be truly useful.<br/><br/>One algorithm can be written in terms of another. It can use the encapsulated code and alter its behavior. This lets us declare a new algorithm by composing existing ones, rather than implementing entire new classes.<br/><br/>A factory method wraps the constructor of a generic class so that the compiler can use type inference. When used appropriately, the syntax for expanding generics disappears.<br/>]]></description>
<category>podcasts</category>
<pubDate>Sun, 11 Nov 2007 04:54:00 GMT</pubDate>
<guid isPermaLink="true">http://ais.libsyn.com/index.php?post_id=276749#</guid>
<enclosure url="http://media.libsyn.com/media/ais/AiS37.mp3" length="28707768" type="audio/mpeg"/>
<itunes:duration>00:29:52</itunes:duration>
<itunes:author>Michael L Perry</itunes:author>
<itunes:explicit>No</itunes:explicit>
</item>
<item>
<title>AiS 36: Branching, Tagging, and Promotion</title>
<link>http://ais.libsyn.com/index.php?post_id=245679#</link>
<description><![CDATA[At Handmark, we use Subversion for source code control. Like most systems, it supports concepts like branching and tagging. The mechanics for each system varries, so check your documentation for those details. But a more interesting question is, how do you manage branches and tags? Where do you make your changes? What steps do you take when it's time to release?<br/><br/>There are essentially two schools of thought for branching: for features or for releases. We've chosen to branch for features and merge into the trunk to build a release. But another option would be to make all code changes in the trunk and branch at the point of release. You choose your policy based on where you will accept instability. If you can tolerate an unstable trunk, then branch for releases. If you need to isolate instability in the branches, then branch for features.<br/><br/>We've chosen to branch for features because our priorities change quickly. This strategy allows us to isolate changes away from each other, put them on hold for a time if necessary, and keep the trunk stable. All builds are performed from the trunk, so changes must be merged from their branches to the trunk prior to release.<br/><br/>Once we've build a release, it moves through various staging areas. A build starts in integration, moves to testing, and finally into production. At each point along the way, there are checks in place to ensure that it is ready to move forward. The pipeline is rigid in that no build may pass another on the way to production, and no build can move backward. If a build fails one of the checkpoints, it drops out of the pipeline. If we need to expidite a change to production, the build that's currently in the pipeline is dumped.<br/><br/>We find that this policy works best for our environment. It may or may not apply to yours. Choose the policy that fits your team, discuss it, document it, and stick to it.<br/>]]></description>
<category>podcasts</category>
<pubDate>Thu, 16 Aug 2007 02:21:00 GMT</pubDate>
<guid isPermaLink="true">http://ais.libsyn.com/index.php?post_id=245679#</guid>
<enclosure url="http://media.libsyn.com/media/ais/AiS36.mp3" length="11675465" type="audio/mpeg"/>
<itunes:duration>00:12:08</itunes:duration>
<itunes:author>Michael L Perry</itunes:author>
<itunes:explicit>No</itunes:explicit>
</item>
<item>
<title>AiS 35: Scalable Enterprise Applications</title>
<link>http://ais.libsyn.com/index.php?post_id=242878#</link>
<description><![CDATA[Russell Elledge and I have been conducting interviews at Handmark, looking for help on our Pocket Express and On Demand applications. In this office, we work on the server side, focusing on making these applications robust enough to handle the large numbers of cell phones that are out in the world. So one question that Russell likes to ask our candidates is as follows:<br/><br/>Name five things that you always do in a scalable enterprise application.<br/><br/>This is an open-ended question designed to create discussion and debate, as well as to test the boundaries of their experience. I thought we could all benefit from Russell's experience, so I asked him to answer the question. This is his list:<br/><br/>1. All information must be a transient in memory.<br/>2. All information must be in a universally accessible data store or file system.<br/>3. Use an RPC technology to force the creation of tiers in a system.<br/>4. Use SOA where possible to help force vertical scalability.<br/>5. Control your resources.<br/>6. Author in administrative capability.<br/>7. Seperate OLTP processing from reporting.<br/>8. Optimize<br/><br/>]]></description>
<category>podcasts</category>
<pubDate>Tue, 7 Aug 2007 12:20:00 GMT</pubDate>
<guid isPermaLink="true">http://ais.libsyn.com/index.php?post_id=242878#</guid>
<enclosure url="http://media.libsyn.com/media/ais/AiS35.mp3" length="21988241" type="audio/mpeg"/>
<itunes:duration>00:22:52</itunes:duration>
<itunes:author>Michael L Perry</itunes:author>
<itunes:explicit>No</itunes:explicit>
</item>
<item>
<title>AiS 34: The Interaction Layer</title>
<link>http://ais.libsyn.com/index.php?post_id=239025#</link>
<description><![CDATA[The three-tiered application is a ubiquitous pattern for a solid design. The three tiers are:<br/><br/>* User interface<br/>* Business logic<br/>* Data access<br/><br/>The dependency is straight down. The user interface depends upon the business logic. It feeds events from the user back into the business logic. It does not directly access the data. The business logic layer invokes the data access layer in order to read and write raw data from the database and other sources, like web services.<br/><br/>While this pattern successfully sheids the user interface from the raw data, it does not effectively sheild the user from the implementation.<br/><br/>Alan Cooper's book About Face 2.0: Essentials of User Interaction Design describes the difference between the implementation model and the conceptual model. The conceptual model is how the user thinks about the problem, and the implementation model is how the program solves it. The differences between the two cause confusion on the user's part, and bugs on the program's. The user interface's direct dependency upon the business logic means that the implementation of the business logic becomes visible to the user.<br/><br/><span style="font-weight: bold;">Here's my solution</span><br/>On several occasions, I have had the need to insert a fourth layer into an application. Between the user interface and the business logic, I have added an interaction layer. In this case, the dependency is not straight down: the interaction layer does not completely hide the business logic from the user interface. Instead, the interaction layer is the entry point into the business layer. It fills in the gaps when the conceptual model differs from the implementation model, but it steps out of the way when the two coincide.<br/><br/>* User interface<br/>* Interaction<br/>* Business logic<br/>* Data access<br/><br/>It is difficult to inject this layer after the fact, so I have resolved to put it in place on every application, whether it seems to need it or not. The application might really be what-you-see-is-what-you-get. But just in case you need to see something slightly different, the hook is in place.<br/>]]></description>
<category>podcasts</category>
<pubDate>Thu, 26 Jul 2007 06:04:00 GMT</pubDate>
<guid isPermaLink="true">http://ais.libsyn.com/index.php?post_id=239025#</guid>
<enclosure url="http://media.libsyn.com/media/ais/AiS34.mp3" length="6338166" type="audio/mpeg"/>
<itunes:duration>00:06:34</itunes:duration>
<itunes:author>Michael L Perry</itunes:author>
<itunes:explicit>No</itunes:explicit>
</item>
<item>
<title>AiS 33: Service Factory</title>
<link>http://ais.libsyn.com/index.php?post_id=235043#</link>
<description><![CDATA[Yesterday I attended a presentation at the Dallas .NET User's Group (ddnug.net). Norm Headlam presented the Microsoft Patterns and Practices Web Service Software Factory (or Service Factory for short). You can download this tool from http://msdn2.microsoft.com/practices. Follow the &quot;Web Service Software Factory&quot; link.<br/><br/>Norm demonstrated how the Service Factory generates a solution with a set of well-organized projects. It generates a service layer, a data contract, a business layer, and a data access layer. Each of these assemblies has one and only one role. The service layer defines the web service. The data contract defines the data types that are exchanged between the client and the server. The business layer contains all of your business rules. And the data access layer interfaces with the database.<br/><br/>No longer will you return a dataset from a web service. These layers are separated according to best practices.<br/><br/>Norm showed how the Service Factory offers ongoing guideance. It doesn't just generate this skeleton and leave you to fill it in. Instead, you right-click on your projects to add data objects, data containers, and service endpoints. As you work, the Service Layer keeps a log of your changes. And it gives you links to your most likely next step.<br/><br/>Web services are no longer generated from your code. Instead, your code is generated from your contracts. You can import a database schema as a data object in the data access layer. Or you can import an XML schema to generate an object in the data contract. This is not like NHibernate, where the data layer is generated at runtime from business objects. This actually does it the right way, where the stored procedures that your DBA authors are honored, and all code is generated at design time.<br/><br/>The only problem I have with Microsoft's Web Service Software Factory is the name. This is not a Software Factory.<br/><br/>According to the book (Software Factories: Assembling Applications with Patterns, Models, Frameworks, and Tools), a software factory is a set of tools that generate several products within a software product line. All products in a product line serve the same vertical domain. They are described using domain specific languages.<br/><br/>&quot;Web services&quot; is not a product line. It is a horizontal slice of software technology, not a vertical problem domain. And these tools, useful as they are, are not a domain specific language. I look forward to using Service Factory on a real project in the near future, but I will also continue to create software factories in the real sense of the term.<br/>]]></description>
<category>podcasts</category>
<pubDate>Sat, 14 Jul 2007 04:17:00 GMT</pubDate>
<guid isPermaLink="true">http://ais.libsyn.com/index.php?post_id=235043#</guid>
<enclosure url="http://media.libsyn.com/media/ais/AiS33.mp3" length="13625696" type="audio/mpeg"/>
<itunes:duration>00:14:09</itunes:duration>
<itunes:author>Michael L Perry</itunes:author>
<itunes:explicit>No</itunes:explicit>
</item>
<item>
<title>AiS 32: Computers Don't Crash</title>
<link>http://ais.libsyn.com/index.php?post_id=231979#</link>
<description><![CDATA[Colorful language is not terribly helpful in a bug report. The best quality assurance professionals document what they were doing, the expected behavior, and the actual behavior. The outstanding quality assurance engineers probe deeper to find patterns. Let me tell you about one such individual: Chris Sachnik.<br/>]]></description>
<category>podcasts</category>
<pubDate>Wed, 4 Jul 2007 03:02:00 GMT</pubDate>
<guid isPermaLink="true">http://ais.libsyn.com/index.php?post_id=231979#</guid>
<enclosure url="http://media.libsyn.com/media/ais/AiS32.mp3" length="8374881" type="audio/mpeg"/>
<itunes:duration>00:08:41</itunes:duration>
<itunes:author>Michael L Perry</itunes:author>
<itunes:explicit>No</itunes:explicit>
</item>
<item>
<title>AiS 31: The Switch</title>
<link>http://ais.libsyn.com/index.php?post_id=229605#</link>
<description><![CDATA[If you're new to the show, then welcome. If not, then you probably know that I am a Java programmer by day, and .NET by night. So it may come as a surprise to you that I have purchased a Mac. I got a 15 inch MacBook Pro. The &quot;entry-level&quot; version with a 2.2 GHz processor, not the 2.4. And certainly not the 17 inch boat that frankly should come with a set of trucks so you can ollie and rail slide your way to work.<br/><br/>If you are not new to the show, then you probably know that I am passionate about quality. I'm on a constant quest for quality in my own software and in the software that I use. I've heard it said that people who love software want to build their own hardware, but I didn't really understand that until I used my new Mac. This thing was built to run quality software.<br/><br/>For one thing, you have the specs. This, like I said, is a 2.2 GHz laptop. It comes with 2 Gig of memory and a 5400 RPM hard drive standard. You can't choose anything less and still have a MacBook Pro. Apple just won't let you. Other manufacturers sell similar specs for the money, but their stuff appears less expensive because you can buy less machine.<br/><br/>For another thing, you have the screen. This 15.4 inch monitor has a 1440x900 resolution. That's the same as the 22 inch panel on my desktop. Do the math ... the not new among you know that I love to do the math ... and you see that this screen is twice as dense! Apple won't let you see a pixely picture. There's a reason that Safari looks bad on Windows ... it was designed for a Mac!<br/><br/>So this is hardware worthy of quality software. It begs for quality software. In fact, if you write crappy software for the Mac, nobody will use it. The Apple community has come to expect a certain level of polish on their apps. Sure, some of them only go skin deep, but at least the effort is visible. I use an open-source instant messenger called Adium, and even this little app has the clean simple look of OS X. It even has a gorgeous little green duck icon that looks great sitting in the dock next to the Garage Band guitar. I'm a Java developer, so I know. You're lucky if we replace the coffee cup. And when I'm writing a Windows app, 16 colors and a copy of Paint is good enough.<br/><br/>But you know that I can't live without my .NET. Having written in C#, I never want to go back to C++. The Mono Project isn't keeping up, so I, of course, installed Boot Camp and Vista on this baby. And let me tell you, it runs Vista like a dream. I can't imagine the heat that the Boot Camp team gets in Cupertino for writing Windows drivers, but they did an excellent job.<br/><br/>Anyway, it's not my intent to become a Mac bigot or to convince you to switch. I just know quality when I see it, and the not new know that I'm all about the user experience.<br/><br/>My name is Michael L Perry, and I run Windows on the Mac.<br/><br/>]]></description>
<category>podcasts</category>
<pubDate>Wed, 27 Jun 2007 02:20:00 GMT</pubDate>
<guid isPermaLink="true">http://ais.libsyn.com/index.php?post_id=229605#</guid>
<enclosure url="http://media.libsyn.com/media/ais/AiS31.mp3" length="6850155" type="audio/mpeg"/>
<itunes:duration>00:07:06</itunes:duration>
<itunes:author>Michael L Perry</itunes:author>
<itunes:explicit>No</itunes:explicit>
</item>
<item>
<title>AiS 30: Web Development Techniques</title>
<link>http://ais.libsyn.com/index.php?post_id=227175#</link>
<description><![CDATA[Charles Martin of Before You Are Gone (<a href="http://beforeyouaregone.com">http://beforeyouaregone.com</a>) shares some of his time-tested web development techniques. And we even make some up on the spot.<br/><br/>First, consider creating separate servers. You need at least four. Start with a development server where the team can first integrate their code and see if it works. Then deploy to a test server where your QA team can exercise it. Practice your deployment on a staging area separate from the others so that you can be certain that you can upgrade the current production release to the next one. Finally, of course, you have the production environment, far removed from the others.<br/><br/>For the love, don't develop in production!<br/><br/>Second, the separation of style from content is essential to modern web development. Always create a CSS file rather than embedding style within the page. Understand how specificity determines how styles are applied to elements of a document. And to test your CSS file, consider creating a single template page that includes examples of all elements that you use in the entire site. This gives you one place to look to see if your CSS change affects anyone else.<br/><br/>And third, configure your environment to report all Javascript errors. Web browsers are very forgiving by default. They have to be because of all the legacy code that is out there on useful sites today. Since you don't have a compiler to check for errors, you have to rely on the browser to perform that function. Let it tell you about all the errors on your pages, and test each page on all major platforms. Now that we have Safari for Windows, the Mac - and the iPhone - cannot be ignored.<br/><br/>]]></description>
<category>podcasts</category>
<pubDate>Wed, 20 Jun 2007 05:51:00 GMT</pubDate>
<guid isPermaLink="true">http://ais.libsyn.com/index.php?post_id=227175#</guid>
<enclosure url="http://media.libsyn.com/media/ais/AiS30.mp3" length="18142174" type="audio/mpeg"/>
<itunes:duration>00:18:52</itunes:duration>
<itunes:author>Michael L Perry</itunes:author>
<itunes:explicit>No</itunes:explicit>
</item>
<item>
<title>AiS 29: The New Programming Model</title>
<link>http://ais.libsyn.com/index.php?post_id=224860#</link>
<description><![CDATA[Several recent events are converging on a common theme. <br/><br/>Windows Presentation Foundation brings new user interface possibilities to Vista. Silverlight delivers WPF to the browser. Microsoftâs surface computer letâs us interact with the computer on a near-tactile level. Steve Jobs announced that the programming model for the iPhone is Ajax in Safari. Apple ported Safari to Windows. And Google Gears allows you to run a web application while not on the web.<br/><br/>All of these events demonstrate that the new programming model is markup and script. This has been the programming model for Web 2.0, but it is now it is breaking out of the browser.<br/><br/>This programming model has some promise, but there is a dark side. This moves us away from computer science based in proof. The tools that we have chosen to use for the new programming model are usually dynamically typed. With the exception of C# in WPF, the scripting languages that we bolt on to the markup are neither compiled nor statically typed.<br/><br/>Static typing is not just a way to give us intellisense, but it is a way to express intent in the form of a contact. Type checking is one simple way for the compiler to check a contract. But wouldnât it be great if the compiler could do even more for us? Current research languages can prove that null pointers are not derefferenced. And with existing theorem provers, it is feasible to verify preconditions and post conditions at compile time. Despite the apparent evidence to the contrary, the web model is leading away from a path of increased productivity.<br/><br/>In addition, the web model does not support real-time collaboration. The best we can achieve with a request/response protocol like HTTP is rapid refresh. That solution is not scalable, and not feasible for many kinds of highly collaborative applications. And even when it works, the programming model forces developers to be aware of the fact that they are checking for updates. They canât just express the relationships among objects and leave it at that.<br/><br/>I see a new programming model on the horizon after the markup/script wave has passed. In this programming model, the code represents the relationships between objects, not the triggers that cause the next domino to fall in a Rube Goldberg machine made of script. The compiler and the runtime can work together to make inter-related objects behave in a provably consistent way.<br/><br/>Update Controls is the first step along this path. With this library, you express the relationships between your user interface components and your data. You say what is to be displayed; the runtime takes care of when. If the data is changed in one window, the library pushes that change to the others automatically.<br/><br/>The next step is a collaborative object model that pushes those changes across the wire. When that step is ready, data can be changed on one computer, and the effect will automatically appear on another. Best of all, application developers wonât need to code that behavior. They simply express the relationships among objects and the runtime makes it happen.<br/><br/>I hope you will be with me for the next few steps in our evolution. The future is rapidly approaching in which we bring great value to our clients. Itâs closer than you think.<br/><br/><a href=âhttp://msdn2.microsoft.com/en-us/library/ms754130.aspxâ>WPF</a>
<a href=âhttp://microsoft.com/surfaceâ>Microsoft Surface</a>
<a href=âhttp://www.apple.com/pr/library/2007/06/11iphone.htmlâ>iPhone programming model</a>
<a href=âhttp://www.apple.com/pr/library/2007/06/11safari.htmlâ>Safari for Windows</a>
<a href=âhttp://gears.google.comâ>Google Gears</a>
<a href=âhttp://updatecontrols.netâ>Update Controls</a>]]></description>
<category>podcasts</category>
<pubDate>Wed, 13 Jun 2007 04:20:00 GMT</pubDate>
<guid isPermaLink="true">http://ais.libsyn.com/index.php?post_id=224860#</guid>
<enclosure url="http://media.libsyn.com/media/ais/AiS29.mp3" length="21263493" type="audio/mpeg"/>
<itunes:duration>00:22:07</itunes:duration>
<itunes:author>Michael L Perry</itunes:author>
<itunes:explicit>No</itunes:explicit>
</item>
<item>
<title>AiS 28: Closure</title>
<link>http://ais.libsyn.com/index.php?post_id=222523#</link>
<description><![CDATA[A recent article in MSDN magazine introduces several new features of C# 3.0. The goal of these changes was to add query capabilities to the language. Lambda expressions were added so that the where clause could be written. Lambda expressions required type inference. Type inference allows for anonymous types. But anonymous types could not be stored without implicitly typed variables.<br/><br/>These features could not be added individually. Each feature brings capabilities to the language that are incomplete without the others. This is an excellent example of closure.<br/><br/>The idea of closure appears often in mathematics. The set of integers, for example, is closed under the operations of addition, subtraction, and multiplication. If you add, subtract, or multiply two integers, the result will be an integer. Introduce the concept of division, however, and the system is no longer closed. Now you need a larger set to express the possible outcomes. You need rational numbers. Introduce exponentiation, and now you need the reals.<br/><br/>In software, closure is often a consideration in language design. But it can also be applied to applications. The set of states that can be represented should be closed under the set of operations that the user can perform. If the user can perform an operation on the system that would put it in an invalid state, then that operation is a design flaw.<br/><br/>Join the panel as we discuss several issues from past experience that were solved or could have been avoided by applying the concept of closure.<br/><br/>http://msdn.microsoft.com/msdnmag/issues/07/06/CSharp30/<br/><br/>]]></description>
<category>podcasts</category>
<pubDate>Wed, 6 Jun 2007 05:01:00 GMT</pubDate>
<guid isPermaLink="true">http://ais.libsyn.com/index.php?post_id=222523#</guid>
<enclosure url="http://media.libsyn.com/media/ais/AiS28.mp3" length="23630795" type="audio/mpeg"/>
<itunes:duration>00:24:35</itunes:duration>
<itunes:author>Michael L Perry</itunes:author>
<itunes:explicit>No</itunes:explicit>
</item>
<item>
<title>AiS 27: Mapping, Scope, and Partial Order</title>
<link>http://ais.libsyn.com/index.php?post_id=219546#</link>
<description><![CDATA[On the SSG oven software project, Raymond and I used several mathematical truths to prove that the design met the stated requirements. Three of those truths are mapping, scope, and partial order.<br/><br/>A mapping is a function from one set, called the domain, to another set, called the range. The range is not larger than the domain. If the mapping is one-to-one, then a reverse mapping exists and the range is exactly the same size as the domain. A hash is a many-to-one mapping, so the range is smaller than the domain. Therefore, no reverse mapping exists.<br/><br/>A scope is a context in which simpler objects reside. You can abstract the relationships among the enclosed objects as relationships among the scopes in which they live.<br/><br/>A partial order is a transitive relationship between objects in a set. It is not as restrictive as a full order, but allows for some independence. A partial order, because it is transitive, must be acyclic. Replacing a full order with a partial order can relax the constraints on a design, and give you room for optimization.<br/><br/>Your homework is to design an Integrated Circuit designer. Allow the user to build a component out of other components. Prove that your design does not allow the user to create a recursive cycle.<br/><br/>http://www.beforeyouaregone.com/<br/>http://www.clipperz.com/<br/><br/><br type="_moz"/>]]></description>
<category>podcasts</category>
<pubDate>Tue, 29 May 2007 06:26:00 GMT</pubDate>
<guid isPermaLink="true">http://ais.libsyn.com/index.php?post_id=219546#</guid>
<enclosure url="http://media.libsyn.com/media/ais/AiS27_copy_1.mp3" length="19390207" type="audio/mpeg"/>
<itunes:duration>00:20:10</itunes:duration>
<itunes:author>Michael L Perry</itunes:author>
<itunes:explicit>No</itunes:explicit>
</item>
<item>
<title>AiS 26: The Case for Proven Design</title>
<link>http://ais.libsyn.com/index.php?post_id=217304#</link>
<description><![CDATA[If youâve taken a course in analysis of algorithms, then youâve learned how to prove that an algorithm will have a certain result. Youâve proven that quicksort will terminate, that it will actually sort the list, and that it will complete in n log n time. But in the real world, all of the sorting and searching algorithms are already written. We no longer need to prove algorithms. Now we need to prove designs.<br/><br/><span style="font-weight: bold;">Cycle of discovery</span><br/>Programmers tend to work in a code-test cycle. Weâll write some code, then weâll see if it does what it should. Then weâll go back and change the code and test again. The cycle continues until the feature is complete. This is a cycle of discovery. This is how we explore new things. This is the scientific process. This is not how other engineering professions work. Sure, it gets the job done, but itâs not the most efficient way to do it.<br/><br/>Agile development techniques put new labels on the cycle of discovery. Now instead of code-test we have red-green-refactor. But itâs still the same cycle. We donât know ahead of time that the code we are about to write is correct. We just keep typing until it works. In this world you donât know how close you are to the finish line until you cross it. How are we ever to estimate our work? Or mitigate risk?<br/><br/>Would you buy a house from someone who says, âletâs just keep nailing boards together until it looks like a buildingâ? Of course not. But most software is more complex than a house. It takes longer to build. It has more moving parts. Itâs more expensive. We should be doing at least as much as a home builder to ensure that we will deliver the right product, at high quality, on time, and on budget.<br/><br/>We can do that by proving our design.<br/><br/><span style="font-weight: bold;">Cycle of proof</span><br/>In my day-to-day work, I follow a different cycle. Iâll learn the requirements of a feature, design the feature, code it once, and then fix bugs. I donât spin in a tight code-test cycle. Once I know what the design should be, I just sit down and write it all out. Sure, I may have bugs and typos, but they tend to be easy to fix. I may go days between compiles, but in the end I know that it will work. I know because Iâve proven it.<br/><br/>]]></description>
<category>podcasts</category>
<pubDate>Tue, 22 May 2007 06:04:00 GMT</pubDate>
<guid isPermaLink="true">http://ais.libsyn.com/index.php?post_id=217304#</guid>
<enclosure url="http://media.libsyn.com/media/ais/AiS26_copy_1.mp3" length="17770609" type="audio/mpeg"/>
<itunes:duration>00:18:29</itunes:duration>
<itunes:author>Michael L Perry</itunes:author>
<itunes:explicit>No</itunes:explicit>
</item>
<item>
<title>AiS 25: Case Study: SSG</title>
<link>http://ais.libsyn.com/index.php?post_id=212797#</link>
<description><![CDATA[Raymond and I have been working on a time crunch project for the past week. We take a break from our design work to discuss the project so far. We've been fortunate to work with an experienced team of professionals -- SSG -- who understand how to make a softawre project succeed.<br/><br/>SSG pulled together an exhaustive requirements document. This document is an outline-numbered list of line itens, each one describing one functional aspect of the system. The requirements document gives the team a common set of goals from which to work. It doesn't explain exactly how each of these functional requirements are met. That job is left to the user experience designers.<br/><br/>SSG hired a user experience design team to construct a conceptual model of the system and translate that into a series of wire frame designs. A wire frame shows the visual components that comprise a system, but don't attempt to make those components attactive. For that, SSG has hired user interface designers.<br/><br/>The user interface design team is skilled in graphics design. They provide the artistic talent to make the user experience look good. That leaves Raymond and myself on product development. We are primarily responsible for making the system work.<br/><br/>SSG was seeking a parallel workflow between user interface design and product development. They chose to use Windows Presentation Foundation to separate those two processes. However, Raymond and I decided that the introduction of such a new technology to such an urgent project would add too much complexity. So we advised that we use Update Controls instead.<br/><br/>Fortunately, we may be able to bring WPF back into the project after the demo. It seems entirely reasonable that a XAML document could lay out Update Controls in addition to the more typical components. This should give us the best of both worlds: parallel development tracks and isolation of user interface components.<br/><br/>One other developer is involved in the project. While Raymond and I are creating the user facing parts of the system, an employee of SSG is working on integration with custom hardware. To mitigate risk on this integration, we designed an interface ahead of time. The interface accepts memento objects instead of business objects to further mitigate the risk of changes to the interface. Whereas business objects are likely to change, mementos tend to be more stable.<br/><br/>The design and techonogy decisions that we've made are driven by not only the requirements of the system, but also the structure of the team that is building it, and the time table in which it must be delivered. In future episodes we'll delve into some of the detail of design and implementation, and let you know how the project is progressing.]]></description>
<category>podcasts</category>
<pubDate>Wed, 9 May 2007 04:55:00 GMT</pubDate>
<guid isPermaLink="true">http://ais.libsyn.com/index.php?post_id=212797#</guid>
<enclosure url="http://media.libsyn.com/media/ais/AiS25.mp3" length="19173687" type="audio/mpeg"/>
<itunes:duration>00:19:56</itunes:duration>
<itunes:author>Michael L Perry</itunes:author>
<itunes:explicit>No</itunes:explicit>
</item>
<item>
<title>AiS 24: Refactoring</title>
<link>http://ais.libsyn.com/index.php?post_id=210078#</link>
<description><![CDATA[Refactoring is the process of changing the structure of code without changing its behavior. Martin Fowler coined the term when he wrote the book on the subject. Not only does the book define refactoring and describe when to use it, but it also provides a catalog of recipes for refactoring code. By iteratively applying these transformations to a system, Fowler says that you can evolve the design of existing code.<br/><br/>I use refactoring in my day-to-day coding, but not in the way that Fowler recommends. I design my software systems up front. I don't expect the design to evolve into a good solution. However, I will often use the automated refactoring built into tools like Eclipse as a way to edit code. The tool is a faster typist than I am, and it won't make a mistake due to a copy/paste fumble.<br/><br/>Refactoring, as most agile development techniques, works best when you have a small team of talented developers working in uncharted territory. Agile techniques move the methodology out of their way and allow them to be talented. However, if you know where you are going, it is much better to draw up a plan to get there.<br/><br/><br/>http://www.refactoring.com/<br/>http://www.eclipse.org/<br/>http://www.jetbrains.com/resharper/<br/><br type="_moz"/>]]></description>
<category>podcasts</category>
<pubDate>Wed, 2 May 2007 06:16:00 GMT</pubDate>
<guid isPermaLink="true">http://ais.libsyn.com/index.php?post_id=210078#</guid>
<enclosure url="http://media.libsyn.com/media/ais/AiS24.mp3" length="19681503" type="audio/mpeg"/>
<itunes:duration>00:20:28</itunes:duration>
<itunes:author>Michael L Perry</itunes:author>
<itunes:explicit>No</itunes:explicit>
</item>
<item>
<title>AiS 23: XML Inside Out</title>
<link>http://ais.libsyn.com/index.php?post_id=206621#</link>
<description><![CDATA[XML is not a religion. XML is a tool. A religion tells you what is right and what is wrong. A tool is only concerned with what is useful.<br/><br/>At the 2007 Dallas Code Camp, I presented 4 different XML parsing strategies currently available in .NET. XmlDocument is easy to use and supports input as well as output, but it loads the entire document into memory. XPathDocument is just as easy and slightly faster, but it is read-only. XmlSerializer is the easiest of all since it works with the .NET type system, but it tightly couples your data types with the schema and doesn't support all schemas. And XmlReader is the fastest and most powerful, but incredibly difficult to use.<br/><br/><br/>I added a fifth strategy called DeclarativeXmlParser. This library wraps XmlReader with a dot-chained schema declaration that makes XmlReader dirt simple to use. This library and the demonstration code used in the presentation are available at <a href="http://dirtsimplexml.com">http://dirtsimplexml.com</a>.<br/><br/>This presentation was inspired by work that I do at <a href="http://express.handmark.com/">Handmark</a>, and data provided by <a href="http://oag.com">OAG</a>. Additional information was found at <a href="http://support.softartisans.com/kbview.aspx?ID=673">Softartisans</a>.<br/>]]></description>
<category>podcasts</category>
<pubDate>Mon, 23 Apr 2007 02:51:00 GMT</pubDate>
<guid isPermaLink="true">http://ais.libsyn.com/index.php?post_id=206621#</guid>
<enclosure url="http://media.libsyn.com/media/ais/AiS23.mp3" length="26572817" type="audio/mpeg"/>
<itunes:duration>00:27:39</itunes:duration>
<itunes:author>Michael L Perry</itunes:author>
<itunes:explicit>No</itunes:explicit>
</item>
<item>
<title>AiS 22: Website Attacks</title>
<link>http://ais.libsyn.com/index.php?post_id=204899#</link>
<description><![CDATA[Cross site scripting and SQL injection attacks both take advantage of vulnerabilities in websites. In the case of a cross site scripting vulnerability, data can be rendered to the browser, causing it to run unintended code. In the case of a SQL injection attack, data is executed by the database as SQL code. In both cases, input that a malicious user provides is interpreted in a way that the designer did not intend.<br/><br/>Both of these vulnerabilities are software defects. In both cases, data in a natural language is rendered as if it were a programming language. Web developers and designers need to take extra precautions to prevent this from happening. But what are the right precautions?<br/><br/>One solution is to validate all inputs to ensure that no script or SQL code is included. Unfortunately, this approach is nearly impossible to implement correctly. Any inconsistencies between the way the validator parses the input and the way the browser or database interprets it can leave a hole for a hacker to slip through. Furthermore, it may be perfectly valid for the data to contain HTML or SQL code. What if you are running a blog about software? Shouldn't you be able to post code to the blog?<br/><br/>A better solution is to escape the data. If you are converting a natural language string into SQL, you have to be sure to escape the quotes. In HTML, you must escape the angle brackets. Several tools are already at your disposal to perform the escaping function. Please take full advantage of them.<br/><br/><a href="http://www.bitlbee.org">http://www.bitlbee.org</a><br/><a href="http://toc2rta.com">http://toc2rta.com</a><br/><a href="http://jakarta.apache.org/commons/lang">http://jakarta.apache.org/commons/lang</a><br/><a href="http://jakarta.apache.org/commons/codec">http://jakarta.apache.org/commons/codec</a><br/><a href="http://www.unixwiz.net/techtips/sql-injection.html">http://www.unixwiz.net/techtips/sql-injection.html</a><br/><br/>]]></description>
<category>podcasts</category>
<pubDate>Wed, 18 Apr 2007 04:25:00 GMT</pubDate>
<guid isPermaLink="true">http://ais.libsyn.com/index.php?post_id=204899#</guid>
<enclosure url="http://media.libsyn.com/media/ais/AiS22.mp3" length="23565602" type="audio/mpeg"/>
<itunes:duration>00:24:31</itunes:duration>
<itunes:author>Michael L Perry</itunes:author>
<itunes:explicit>No</itunes:explicit>
</item>
<item>
<title>AiS 21: Getting Started</title>
<link>http://ais.libsyn.com/index.php?post_id=202388#</link>
<description><![CDATA[Each member of the panel got started in software because of something inside them. Some of us had a love of mathematics, some of us understood data, and some felt compelled in mysterious ways. Whatever drew us to software, we knew we had to follow.<br/><br/>Having found our calling, we've each taught ourselves the skills that we need day-to-day. We recognized that neither school nor employer is responsible for our training. We cracked books, installed compilers, and searched the web for the information we needed.<br/><br/>This path is a common one. It is still the way that most people find their way into computer programming. Formal training in software is not necessary. Some of the best programmers have been trained in accounting, electrical engineering, music, or mathematics. Many programmers get into software via other jobs, such as data entry, media, or support.<br/><br/>However you get here, it's not about the money. It's about the love.<br/><br/>Shameless plugs:<br/><a href="http://updatecontrols.net">http://updatecontrols.net</a><br/><a href="http://d20universe.com">http://d20universe.com</a><br/><a href="http://orbit1.com">http://orbit1.com</a><br/><a href="http://beforeyouaregone.com">http://beforeyouaregone.com</a><br/><a href="http://mallardsoft.com">http://mallardsoft.com</a><br/><a href="http://mobilescannersofamerica.com">http://mobilescannersofamerica.com</a><br/><a href="http://yahsaves.org">http://yahsaves.org</a><br/><a href="http://webcudgel.com">http://webcudgel.com</a><br/><br type="_moz"/>]]></description>
<category>podcasts</category>
<pubDate>Wed, 11 Apr 2007 03:57:00 GMT</pubDate>
<guid isPermaLink="true">http://ais.libsyn.com/index.php?post_id=202388#</guid>
<enclosure url="http://media.libsyn.com/media/ais/AiS21.mp3" length="32354447" type="audio/mpeg"/>
<itunes:duration>00:33:40</itunes:duration>
<itunes:author>Michael L Perry</itunes:author>
<itunes:explicit>No</itunes:explicit>
</item>
<item>
<title>AiS 20: Process Alignment</title>
<link>http://ais.libsyn.com/index.php?post_id=199531#</link>
<description><![CDATA[All groups within a project team must be able to communicate in order for the team to succeed. The groups need to speak the same language, and for that they need a common tool set. A tool that one group is comfortable with might not translate into the work of the other group. A business analyst might be comfortable creating a mock-up in VB, but it is not the ideal tool for communicating with web developers. A picture is worth a thousand words. But that's because there are a thousand different interpretations of one picture. If the team shares a common language, that significantly limits the number of possible interpretations. The needs of the project, the culture of the workplace, and the resources available all contribute to the tool selection.<br/><br/>An agile process might be the right choice for your team, but be careful of the underlying assumptions. Agile methods assume that the cost for change remains constant over time (Beck, Kent. Extreme Programming Explained. Addison-Wesley, 2000). It assumes that management can tolerate dramatic changes to architecture later in the project, when the need for that architecture becomes apparent. Agile development requires the highest quality developers, who can recognize when those changes are necessary and make them quickly. If you don't have extremely tolerant management and extremely good programmers, don't use an extreme process.<br/><br/>The process and the architecture should both emerge from the needs of the business. In the case of Handmark, we aggregate content from multiple sources, each of which dictates the technology they use to deliver the content. Therefore, the process includes a New Technology and Content Plan. This document lays out the decisions made while researching the new provider and documents how the system will communicate with them.<br/><br/>The goal of an engineering process is the flow of information among the various individuals and groups on the project team. Each component of a process is an &quot;IPO&quot;, input-process-output. In this way, components fit together like pieces of a work flow. With a good process, the team becomes an organism, where information is its life blood. Just like the different parts of the organism rely upon one another for survival, the project team relies upon each of its members to be successful. The right process makes this possible.]]></description>
<category>podcasts</category>
<pubDate>Tue, 3 Apr 2007 04:04:00 GMT</pubDate>
<guid isPermaLink="true">http://ais.libsyn.com/index.php?post_id=199531#</guid>
<enclosure url="http://media.libsyn.com/media/ais/AiS20.mp3" length="22381943" type="audio/mpeg"/>
<itunes:duration>00:23:17</itunes:duration>
<itunes:author>Michael L Perry</itunes:author>
<itunes:explicit>No</itunes:explicit>
</item>
<item>
<title>AiS 19: Engineering Processes</title>
<link>http://ais.libsyn.com/index.php?post_id=196868#</link>
<description><![CDATA[Carl Honore, author of In Praise of Slowness. Less is More<br/><a href="http://ted.com/tedtalks/tedtalksplayer.cfm?key=c_honore">http://ted.com/tedtalks/tedtalksplayer.cfm?key=c_honore</a><br/><br/>The goal of any engineering process is to get a group of people on a complex project to work together. But the process should be as simple as possible. The process should never itself become the goal.<br/><br/>The process should facilitate communication. Put gates into the process in those places where information is handed off from one individual or team to another. The process should also promote progress. Give people ownership, responsibility, and the right to say &quot;no&quot;. This empowers them and gives them pride in their work.<br/><br/>The key features of the Handmark Server Process are:<br/><ol><li>Define use cases to extract requirements.</li><li>Create an implementation plan to decide what needs to be done to implement the use cases.</li><li>Track changes in order to build a deployment plan.</li><li>Aggregate the changes to produce a build.</li><li>Review the build in operations prior to deployment to ensure that it is re-runnable.</li></ol>
]]></description>
<category>podcasts</category>
<pubDate>Tue, 27 Mar 2007 05:07:00 GMT</pubDate>
<guid isPermaLink="true">http://ais.libsyn.com/index.php?post_id=196868#</guid>
<enclosure url="http://media.libsyn.com/media/ais/AiS19.mp3" length="21141026" type="audio/mpeg"/>
<itunes:duration>00:21:59</itunes:duration>
<itunes:author>Michael L Perry</itunes:author>
<itunes:explicit>No</itunes:explicit>
</item>
<item>
<title>AiS 18: Project Management</title>
<link>http://ais.libsyn.com/index.php?post_id=195086#</link>
<description><![CDATA[Berkun, Scott. The Art of Project Management<br/>http://books.google.com/books?id=q1dJZv4Ycr8C&amp;dq=the%20art%20of%20project%20management&amp;psp=1<br/><br/>Project Management Institute<br/>http://www.pmi.org/info/default.asp<br/><br type="_moz"/>]]></description>
<category>podcasts</category>
<pubDate>Thu, 22 Mar 2007 03:42:00 GMT</pubDate>
<guid isPermaLink="true">http://ais.libsyn.com/index.php?post_id=195086#</guid>
<enclosure url="http://media.libsyn.com/media/ais/AiS18.mp3" length="24914777" type="audio/mpeg"/>
<itunes:duration>00:25:55</itunes:duration>
<itunes:author>Michael L Perry</itunes:author>
<itunes:explicit>No</itunes:explicit>
</item>
<item>
<title>AiS 17: Open Source Software</title>
<link>http://ais.libsyn.com/index.php?post_id=191748#</link>
<description><![CDATA[The panel continues the buy vs. build discussion with relation to open source software.<br/>]]></description>
<category>podcasts</category>
<pubDate>Tue, 13 Mar 2007 03:46:00 GMT</pubDate>
<guid isPermaLink="true">http://ais.libsyn.com/index.php?post_id=191748#</guid>
<enclosure url="http://media.libsyn.com/media/ais/AiS17.mp3" length="21553551" type="audio/mpeg"/>
<itunes:duration>00:22:25</itunes:duration>
<itunes:author>Michael L Perry</itunes:author>
<itunes:explicit>No</itunes:explicit>
</item>
<item>
<title>AiS 16: Buy vs. Build</title>
<link>http://ais.libsyn.com/index.php?post_id=189662#</link>
<description><![CDATA[Should you invest your money in off-the-shelf software, or write it all yourself? The full panel weighs in.<br/>]]></description>
<category>podcasts</category>
<pubDate>Wed, 7 Mar 2007 05:59:00 GMT</pubDate>
<guid isPermaLink="true">http://ais.libsyn.com/index.php?post_id=189662#</guid>
<enclosure url="http://media.libsyn.com/media/ais/AiS16.mp3" length="20682099" type="audio/mpeg"/>
<itunes:duration>00:21:31</itunes:duration>
<itunes:author>Michael L Perry</itunes:author>
<itunes:explicit>No</itunes:explicit>
</item>
<item>
<title>AiS 15: Abstraction</title>
<link>http://ais.libsyn.com/index.php?post_id=187077#</link>
<description><![CDATA[Michael and Raymond introduce Update Controls .NET, then dive into the concept of abstraction. An abstraction hides details so that you can solve problems at a higher level. A good abstraction hides the accidental complexity of the problem space, and reveals only the essential complexity of the solution. Abstraction is a key concept in the construction of Software Factories, which create abstractions within problem domains.<br/><br/><ol><li><a href="http://updatecontrols.net">http://updatecontrols.net</a></li><li><a href="http://en.wikipedia.org/wiki/Abstraction_%28computer_science%29">http://en.wikipedia.org/wiki/Abstraction_%28computer_science%29</a></li><li>Jack Greenfield, Keith Short, Steve Cook, Stuart Kent, John Crupi, Software Factories: Assembling Applications with Patterns, Models, Frameworks, and Tools, ISBN 0-471-20284-3</li></ol>
<br/><br/>]]></description>
<category>podcasts</category>
<pubDate>Wed, 28 Feb 2007 05:55:00 GMT</pubDate>
<guid isPermaLink="true">http://ais.libsyn.com/index.php?post_id=187077#</guid>
<enclosure url="http://media.libsyn.com/media/ais/AiS15.mp3" length="17620964" type="audio/mpeg"/>
<itunes:duration>00:18:19</itunes:duration>
<itunes:author>Michael L Perry</itunes:author>
<itunes:explicit>No</itunes:explicit>
</item>
<item>
<title>AiS 14: Lessons Learned</title>
<link>http://ais.libsyn.com/index.php?post_id=184398#</link>
<description><![CDATA[Anecdotes and stories from experience, and the lessons we've learned from them:<br/><ol><li>Deploy changes to a database and application simultaneously.</li><li>Define and stick to your process.</li><li>Don't forget your where clause!</li><li>Have a successful code review.</li><li>Manage dependencies.</li><li>Put a stop to scope creep.</li><li>Be agile ... but not too agile.</li><li>Think it through.</li><li>Don't stifle creativity.</li><li>Use patterns wisely.</li><li>Avoid tight coupling, especially inheritance.</li><li>Fear financial applications.<br type="_moz"/></li></ol>
]]></description>
<category>podcasts</category>
<pubDate>Wed, 21 Feb 2007 05:57:00 GMT</pubDate>
<guid isPermaLink="true">http://ais.libsyn.com/index.php?post_id=184398#</guid>
<enclosure url="http://media.libsyn.com/media/ais/AiS14.mp3" length="34911940" type="audio/mpeg"/>
<itunes:duration>00:36:20</itunes:duration>
<itunes:author>Michael L Perry</itunes:author>
<itunes:explicit>No</itunes:explicit>
</item>
<item>
<title>AiS 13: Object-Relational Mapping</title>
<link>http://ais.libsyn.com/index.php?post_id=181846#</link>
<description><![CDATA[The ideas of identity, mementos, and database design come together in a
technique known as Object-Relational Mapping (ORM). While ORM
frameworks cut initial development time, they do come at a price.
Should you invest in a framework, or do it all yourself?<br/><br/><a href="http://www.hibernate.org/">http://www.hibernate.org/</a><br/>Hybernate, an ORM framework for Java and .NET<br/><br/>Fowler, Martin; David Rice, Matthew Foemmel, Edward Hieatt, Robert Mee, and Randy Stafford (November 2002). Patterns of Enterprise Application Architecture. Addison-Wesley. ISBN 0-321-12742-0.<br/><br/><a href="http://warpelican.com/?page_id=8">http://warpelican.com/?page_id=8</a><br/>Big-O notation<br/><br/>]]></description>
<category>podcasts</category>
<pubDate>Wed, 14 Feb 2007 04:11:00 GMT</pubDate>
<guid isPermaLink="true">http://ais.libsyn.com/index.php?post_id=181846#</guid>
<enclosure url="http://media.libsyn.com/media/ais/AiS13.mp3" length="15521987" type="audio/mpeg"/>
<itunes:duration>00:16:08</itunes:duration>
<itunes:author>Michael L Perry</itunes:author>
<itunes:explicit>No</itunes:explicit>
</item>
<item>
<title>AiS 12: Database Normalization</title>
<link>http://ais.libsyn.com/index.php?post_id=179331#</link>
<description><![CDATA[<a href="http://dev.mysql.com/tech-resources/articles/intro-to-normalization.html">MySQL AB :: An Introduction to Database Normalization</a><br/>http://dev.mysql.com/tech-resources/articles/intro-to-normalization.html<br/>A good description of database normalization to third normal form.<br type="_moz"/>]]></description>
<category>podcasts</category>
<pubDate>Wed, 7 Feb 2007 07:52:00 GMT</pubDate>
<guid isPermaLink="true">http://ais.libsyn.com/index.php?post_id=179331#</guid>
<enclosure url="http://media.libsyn.com/media/ais/AiS12.mp3" length="20132910" type="audio/mpeg"/>
<itunes:duration>00:20:56</itunes:duration>
<itunes:author>Michael L Perry</itunes:author>
<itunes:explicit>No</itunes:explicit>
</item>
<item>
<title>AiS 11: Data Transformation</title>
<link>http://ais.libsyn.com/index.php?post_id=175588#</link>
<description><![CDATA[The interview with DBA Chris Simonton continues.<br/><br/>DTS<br/>Data Transformation Services<br/><a href="http://en.wikipedia.org/wiki/Data_Transformation_Services">http://en.wikipedia.org/wiki/Data_Transformation_Services</a><br/>A tool found in previous versions of Microsoft SQL Server to extract, transform, and load data. Since replaced by SQL Server Integration Services.<br/><br/>E. F. Codd<br/><a href="http://en.wikipedia.org/wiki/E.F._Codd">http://en.wikipedia.org/wiki/E.F._Codd</a><br/>Mathematician who invented the theory of relational databases.<br/><br/><br/>]]></description>
<category>podcasts</category>
<pubDate>Tue, 30 Jan 2007 03:19:00 GMT</pubDate>
<guid isPermaLink="true">http://ais.libsyn.com/index.php?post_id=175588#</guid>
<enclosure url="http://media.libsyn.com/media/ais/AiS11.mp3" length="15781952" type="audio/mpeg"/>
<itunes:duration>00:21:53</itunes:duration>
<itunes:author>Michael L Perry</itunes:author>
<itunes:explicit>No</itunes:explicit>
</item>
<item>
<title>AiS 10: Database Administration</title>
<link>http://ais.libsyn.com/index.php?post_id=173883#</link>
<description><![CDATA[An interview with Chris Simonton, Database Administrator at Handmark. Strategies for database normalization, separation, and replication.<br/>]]></description>
<category>podcasts</category>
<pubDate>Tue, 23 Jan 2007 07:59:00 GMT</pubDate>
<guid isPermaLink="true">http://ais.libsyn.com/index.php?post_id=173883#</guid>
<enclosure url="http://media.libsyn.com/media/ais/AiS10.mp3" length="20536660" type="audio/mpeg"/>
<itunes:duration>00:21:21</itunes:duration>
<itunes:author>Michael L Perry</itunes:author>
<itunes:explicit>No</itunes:explicit>
</item>
<item>
<title>AiS 9: Advanced Unit Testing Techniques</title>
<link>http://ais.libsyn.com/index.php?post_id=171279#</link>
<description><![CDATA[Object Oriented Software Construction<br/><a href="http://archive.eiffel.com/doc/oosc/">http://archive.eiffel.com/doc/oosc/</a><br/>A defnition and study of Contract-Based Programming.<br/><br/>Continuous Integration<br/><a href="http://en.wikipedia.org/wiki/Continuous_integration">http://en.wikipedia.org/wiki/Continuous_integration</a><br/>The process of using automated nightly builds to discover integration problems early.<br/><br/>Hanselminutes<br/><a href="http://hanselminutes.com/">http://hanselminutes.com/</a><br/>Scott Hanselman and Carl Franklin talk about all aspects of programming.<br/><br/>Depedency Injection<br/><a href="http://en.wikipedia.org/wiki/Dependency_injection">http://en.wikipedia.org/wiki/Dependency_injection</a><br/>A pattern for depending upon abstractions rather than concrete classes.<br/><br/>Flow Analysis<br/><a href="http://en.wikipedia.org/wiki/Flow_analysis">http://en.wikipedia.org/wiki/Flow_analysis</a><br/>A technique used in compiled languages to analyze the flow of logic through the source code.<br/><br/>NMock2<br/><a href="http://sourceforge.net/projects/nmock/">http://sourceforge.net/projects/nmock/</a><br/>A mock-object framework for .NET. Creates test harnesses that let you set and validate expectations.<br/><br/>EasyMock<br/><a href="http://www.easymock.org/">http://www.easymock.org/</a><br/>A mock-object framework for Java. Scott Hanselman called this a &quot;TiVo&quot; for unit tests. Record your expectations, then replay them within the unit test. EasyMock works with intellisense, whereas many other frameworks do not.<br/><br/><br/>Team System<br/><a href="http://msdn.microsoft.com/vstudio/teamsystem/">http://msdn.microsoft.com/vstudio/teamsystem/</a><br/>Microsoft's all-encompasing development engine. It includes source control, defect tracking, project management, and testing, among other features. Its unit testing framework is relatively poor when compared to NUnit, but it integrates into the build system.<br/><br/>ISerializable - MbUnit vs. NUnit vs. Team System<br/><a href="http://weblogs.asp.net/rosherove/archive/2006/09/24/MbUnit-vs.-NUnit-Vs.-Team-System-Unit-Testing-_2D00_-Choosing-a-unit-test-framework.aspx">http://weblogs.asp.net/rosherove/archive/2006/09/24/MbUnit-vs.-NUnit-Vs.-Team-System-Unit-Testing-_2D00_-Choosing-a-unit-test-framework.aspx</a><br/>A comparison of unit test frameworks for .NET.<br/><br/>]]></description>
<category>podcasts</category>
<pubDate>Tue, 16 Jan 2007 03:09:00 GMT</pubDate>
<guid isPermaLink="true">http://ais.libsyn.com/index.php?post_id=171279#</guid>
<enclosure url="http://media.libsyn.com/media/ais/AiS9.mp3" length="18785939" type="audio/mpeg"/>
<itunes:duration>00:26:03</itunes:duration>
<itunes:author>Michael L Perry</itunes:author>
<itunes:explicit>No</itunes:explicit>
</item>
<item>
<title>AiS 8: Unit Testing</title>
<link>http://ais.libsyn.com/index.php?post_id=169362#</link>
<description><![CDATA[.NET Rocks!<br/>http://dotnetrocks.com/<br/>Weekly podcast with Carl Franklin and Richard Campbell.<br/><br/>DNR TV<br/>http://dnrtv.com/<br/>Video companion to .NET Rocks!<br/><br/>JUnit<br/>http://www.junit.org/<br/>The most popular unit testing framework for Java.<br/>&quot;Never in the field of software development was so much owed by so many to so few lines of code&quot; Martin Fowler<br/><br/>NUnit<br/>http://www.nunit.org/<br/>Originally a port of JUnit to .NET, NUnit now takes full advantage of the platform, including attributes.<br/><br type="_moz"/>]]></description>
<category>podcasts</category>
<pubDate>Wed, 10 Jan 2007 06:24:00 GMT</pubDate>
<guid isPermaLink="true">http://ais.libsyn.com/index.php?post_id=169362#</guid>
<enclosure url="http://media.libsyn.com/media/ais/AiS8.mp3" length="15656556" type="audio/mpeg"/>
<itunes:duration>00:21:42</itunes:duration>
<itunes:author>Michael L Perry</itunes:author>
<itunes:explicit>No</itunes:explicit>
</item>
<item>
<title>AiS 7: Techniques for Quality Improvement</title>
<link>http://ais.libsyn.com/index.php?post_id=167000#</link>
<description><![CDATA[User interaction design<br/>Unit testing<br/>Automated testing<br/>Code generation<br/>Contract-based design<br/>Use-case analysis<br/>Litterate programming]]></description>
<category>podcasts</category>
<pubDate>Wed, 3 Jan 2007 05:33:00 GMT</pubDate>
<guid isPermaLink="true">http://ais.libsyn.com/index.php?post_id=167000#</guid>
<enclosure url="http://media.libsyn.com/media/ais/AiS7.mp3" length="14917417" type="audio/mpeg"/>
<itunes:duration>00:20:40</itunes:duration>
<itunes:author>Michael L Perry</itunes:author>
<itunes:explicit>No</itunes:explicit>
</item>
<item>
<title>Episode 6: Datacenter Separation</title>
<link>http://ais.libsyn.com/index.php?post_id=164561#</link>
<description><![CDATA[Advice for keeping development and production servers separate.<br/>]]></description>
<category>podcasts</category>
<pubDate>Tue, 26 Dec 2006 03:52:00 GMT</pubDate>
<guid isPermaLink="true">http://ais.libsyn.com/index.php?post_id=164561#</guid>
<enclosure url="http://media.libsyn.com/media/ais/AiS6.mp3" length="9345176" type="audio/mpeg"/>
<itunes:duration>00:12:56</itunes:duration>
<itunes:author>Michael L Perry</itunes:author>
<itunes:explicit>No</itunes:explicit>
</item>
<item>
<title>Episode 5: Web Services</title>
<link>http://ais.libsyn.com/index.php?post_id=162972#</link>
<description><![CDATA[Lessons Learned about Web Services:<br/><br/>Lesson #1 - Don't put example code from books into production code.<br/>Lesson #2 - Don't reinvent the wheel.<br/>Lesson #3 - Don't jump on the early technology that is not fully proven.<br/>Lesson #4 - Don't expect interoperability between programming platforms or libraries right out of the box (or in version 1.0).<br/><br type="_moz"/>]]></description>
<category>podcasts</category>
<pubDate>Tue, 19 Dec 2006 06:57:00 GMT</pubDate>
<guid isPermaLink="true">http://ais.libsyn.com/index.php?post_id=162972#</guid>
<enclosure url="http://media.libsyn.com/media/ais/AiS5.mp3" length="19151116" type="audio/mpeg"/>
<itunes:duration>00:26:33</itunes:duration>
<itunes:author>Michael L Perry</itunes:author>
<itunes:explicit>No</itunes:explicit>
</item>
<item>
<title>Episode 4: Identity-Based Patterns</title>
<link>http://ais.libsyn.com/index.php?post_id=160520#</link>
<description><![CDATA[Java Enums:<br/><a href="http://www.javaworld.com/javaworld/jw-07-1997/jw-07-enumerated.html">http://www.javaworld.com/javaworld/jw-07-1997/jw-07-enumerated.html</a><br/><a href="http://www.javaworld.com/javaworld/javatips/jw-javatip122.html">http://www.javaworld.com/javaworld/javatips/jw-javatip122.html</a><br/><a href="http://java.sun.com/j2se/1.5.0/docs/guide/language/enums.html">http://java.sun.com/j2se/1.5.0/docs/guide/language/enums.html</a><br/><br/>Command:<br/><a href="http://en.wikipedia.org/wiki/Command_pattern">http://en.wikipedia.org/wiki/Command_pattern</a><br/><br/>Easy Mock (Java only)<br/><a href="http://www.easymock.org/">http://www.easymock.org/</a><br/><br/>NMock<br/><a href="http://nmock.org/">http://nmock.org/</a><br/><br/>.Net port of Easy Mock<br/><a href="http://www.easymock.net/">http://www.easymock.net/</a><br/><br/>Action command object:<br/><a href="http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/Action.html">http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/Action.html</a><br/><br/>Strategy:<br/><a href="http://en.wikipedia.org/wiki/Strategy_pattern">http://en.wikipedia.org/wiki/Strategy_pattern</a><br/><br/>State:<br/><a href="http://en.wikipedia.org/wiki/State_pattern">http://en.wikipedia.org/wiki/State_pattern</a><br/><br/>Lex<br/><a href="http://en.wikipedia.org/wiki/Lex_programming_tool">http://en.wikipedia.org/wiki/Lex_programming_tool</a><br/><br/>Microsoft Windows Workflow Foundation<br/><a href="http://msdn.microsoft.com/workflow">http://msdn.microsoft.com/workflow</a><br/>]]></description>
<category>podcasts</category>
<pubDate>Tue, 12 Dec 2006 06:25:00 GMT</pubDate>
<guid isPermaLink="true">http://ais.libsyn.com/index.php?post_id=160520#</guid>
<enclosure url="http://media.libsyn.com/media/ais/AiS4.mp3" length="23822166" type="audio/mpeg"/>
<itunes:duration>00:49:19</itunes:duration>
<itunes:author>Michael L Perry</itunes:author>
<itunes:explicit>No</itunes:explicit>
</item>
<item>
<title>AiS 3: Identity</title>
<link>http://ais.libsyn.com/index.php?post_id=158181#</link>
<description><![CDATA[Michael, Raymond, and Charles discuss the fundamental law of object -oriented programming: identity.<br/><br/><a href="http://en.wikipedia.org/wiki/James_Rumbaugh">James Rumbaugh</a>, <a href="http://en.wikipedia.org/w/index.php?title=Michael_Blaha&action=edit" class="new" title="Michael Blaha">Michael Blaha</a>, <a href="http://en.wikipedia.org/w/index.php?title=William_Premerlani&action=edit" class="new" title="William Premerlani">William Premerlani</a>, <a href="http://en.wikipedia.org/w/index.php?title=Frederick_Eddy&action=edit" class="new" title="Frederick Eddy">Frederick Eddy</a>, <a href="http://en.wikipedia.org/w/index.php?title=William_Lorensen&action=edit" class="new" title="William Lorensen">William Lorensen</a>: <i>Object-Oriented Modeling and Design</i>, Prentice Hall, <a href="http://en.wikipedia.org/w/index.php?title=Special:Booksources&isbn=0136298419" class="internal">ISBN 0-13-629841-9</a><br/><br/><br/><a href="http://en.wikipedia.org/wiki/Identity_%28object-oriented_programming%29">http://en.wikipedia.org/wiki/Identity_%28object-oriented_programming%29</a><br/><br/><br type="_moz"/>]]></description>
<category>podcasts</category>
<pubDate>Tue, 5 Dec 2006 05:44:00 GMT</pubDate>
<guid isPermaLink="true">http://ais.libsyn.com/index.php?post_id=158181#</guid>
<enclosure url="http://media.libsyn.com/media/ais/AiS3.mp3" length="16169945" type="audio/mpeg"/>
<itunes:duration>00:33:23</itunes:duration>
<itunes:author>Michael L Perry</itunes:author>
<itunes:explicit>No</itunes:explicit>
</item>
<item>
<title>AiS 2: Design Patterns</title>
<link>http://ais.libsyn.com/index.php?post_id=155921#</link>
<description><![CDATA[<ul>
  <li>Charles Martin. <a href="http://webcudgel.com">http://webcudgel.com</a></li>
  <li>Raymond Jensen. <a href="http://jensensoftware.com">http://jensensoftware.com</a></li>
</ul>

<br/><ol>
  <li>Erich Gamma, et al. Design Patterns. a.k.a. Gang of Four: <a href="http://en.wikipedia.org/wiki/Design_Patterns">http://en.wikipedia.org/wiki/Design_Patterns</a></li>
  <li>Martin Fowler. Patterns of Enterprise Application Architecture: <a href="http://en.wikipedia.org/wiki/Martin_Fowler">http://en.wikipedia.org/wiki/Martin_Fowler</a></li>
  <li>Stelting and Maassen. Applied Java Patterns.</li>
  <li>Steven John Metsker. Design Patterns in C#.</li>
  <li>Ron Jacobs. ARCast. Patterns and Anti-Patterns for SOA. <a href="http://arcast.net">http://arcast.net</a></li>
  <li><a href="http://www.codeproject.com/">http://www.codeproject.com/</a></li>
  <li>Microsoft Patterns and Practices. <a href="http://msdn.microsoft.com/practices/">http://msdn.microsoft.com/practices/</a></li>
  <li><a href="http://www.patternshare.org/">http://www.patternshare.org/</a></li>
</ol>

<br/>]]></description>
<category>podcasts</category>
<pubDate>Tue, 28 Nov 2006 06:22:00 GMT</pubDate>
<guid isPermaLink="true">http://ais.libsyn.com/index.php?post_id=155921#</guid>
<enclosure url="http://media.libsyn.com/media/ais/AiS2_copy_1.mp3" length="16586448" type="audio/mpeg"/>
<itunes:author>Michael L Perry</itunes:author>
<itunes:explicit>No</itunes:explicit>
</item>
<item>
<title>AiS 1: User Interface Design</title>
<link>http://ais.libsyn.com/index.php?post_id=153816#</link>
<description><![CDATA[Michael talks with special guest Charles Martin, web designer at <a href="http://www.webcudgel.com">http://www.webcudgel.com</a>. We discuss user interaction design as described in <a href="http://www.cooper.com/content/insights/cooper_books.asp">Alan Cooper's About Face 2.0: The essentials of interaction design</a>. We talk about a poor user interface that we both worked on in the past, as well as a good one in the <a href="http://hamachi.cc/">Hamachi VPN</a>. We round out the conversation with a comparison of Windows vs. Mac.<br/>]]></description>
<category>podcasts</category>
<pubDate>Tue, 21 Nov 2006 06:21:00 GMT</pubDate>
<guid isPermaLink="true">http://ais.libsyn.com/index.php?post_id=153816#</guid>
<enclosure url="http://media.libsyn.com/media/ais/AiS01.mp3" length="24836028" type="audio/mpeg"/>
<itunes:duration>00:34:17</itunes:duration>
<itunes:author>Michael L Perry</itunes:author>
<itunes:explicit>No</itunes:explicit>
</item>
</channel></rss>
