<?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>Professional PHP &#187; Agile Methods</title>
	<atom:link href="http://www.procata.com/blog/archives/category/agile-methods/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.procata.com/blog</link>
	<description>PHP Programming, Web Development, PHP Advocacy and PHP Best Practices.</description>
	<lastBuildDate>Tue, 20 Oct 2009 00:57:46 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Software Development Team Diversity</title>
		<link>http://www.procata.com/blog/archives/2007/03/26/software-development-team-diversity/</link>
		<comments>http://www.procata.com/blog/archives/2007/03/26/software-development-team-diversity/#comments</comments>
		<pubDate>Mon, 26 Mar 2007 14:00:24 +0000</pubDate>
		<dc:creator>Jeff</dc:creator>
				<category><![CDATA[Agile Methods]]></category>
		<category><![CDATA[Software Design]]></category>
		<category><![CDATA[agile-php]]></category>
		<category><![CDATA[extreme-programming]]></category>
		<category><![CDATA[hiring]]></category>
		<category><![CDATA[programmer-education]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.procata.com/blog/archives/2007/03/26/software-development-team-diversity/</guid>
		<description><![CDATA[Matt Mullenweg has a post about Hiring Diversity.    A successful software project must fulfill many competing goals and factors and meet a wide variety of challenges.   Diversity is the combined arms of software development.  In my personal experience, the diverse team performs better.  A diverse team allows the [...]]]></description>
			<content:encoded><![CDATA[<p>Matt Mullenweg has a post about <a href="http://photomatt.net/2007/03/24/kapor-vs-zuckerberg/">Hiring Diversity</a>.    A successful software project must fulfill many competing goals and factors and meet a wide variety of challenges.   Diversity is the combined arms of software development.  In my personal experience, the diverse team performs better.  A diverse team allows the most appropriate team member to step up to a challenge.  The interaction between team members with different points of view helps a project balance competing goals.</p>
<h3>Technical Background</h3>
<p>A team needs members with a technical background.  These guys are the ones that ensure everything works.  They can write the hard bits of code, keep everything performing and make sure the code is maintainable.  Without these guys, you will have problems.  On the other hand, sometimes those with a technical background view problems solving as a puzzle, where the solution is the end in itself.<br />
In my experience, team members with a less technical background are more empathic toward the user community.  They view problem solving as a means to a goal.  A customer focus is what makes a project successful.  Software can be successful despite technical problems, but it cannot be successful if doesn&#8217;t meet the customer&#8217;s needs.  Having some non-technical people helps prevent your resident technocrats from building a system that will service 10,000 concurrent users, but doesn&#8217;t meet the needs of the 329 users you have today.<br />
Perhaps at the extreme end of this spectrum is the extreme programming practice of including a customer on the development team.</p>
<h3>Experience</h3>
<p>In <a href="http://www.procata.com/blog/archives/2005/05/10/expert-programmers/">expert versus novice programmers</a>, I make the distinction between skill level and experience.  Age, skill and experience often correlate, but not always.  Your young apprentice programmers are important to have on a team.  They can react faster.  Sometimes not knowing better is a bonus.  They&#8217;ll do things more senior team members don&#8217;t want to do.  They do things they&#8217;re not supposed to do, sometimes for the benefit of the team.<br />
I think people underestimate how long it takes to actually become an expert, as I mention in my previous post.  But, then they also underestimate how similar all software projects are.  They also overestimate the impact of their toolset.  Generally the technologies in the laundry lists that form most job listings are not the critical success factors for that project.<br />
People want a programmer with who can hit the ground running, who is familiar with all of the teams tools, languages and libraries.  But, this is a monoculture as well.  Sometimes you need people who aren&#8217;t from your toolset culture to point out where you have swallowed the hook too deeply or to introduce new tools and techniques from their alternate background.  Sometimes their learning process can teach you something.<br />
While some experience is valued in programmers, age sometimes isn&#8217;t.  However, you need the older, more stable people as well.  They keep the young ones from repeating the mistakes of the past.  They keep the project on an even keel.  It helps to have an older perspective on the team.  I think they help keep attention focused on what matters.  The tension between the older and younger team members helps keep the team on track.</p>
<h3>Traditional Diversity Factors</h3>
<p>I have no opinion on the impact of race.  I have an opinion about women on software teams.  I wish there were more of them.  I have worked on software development teams with diverse nationalities.  I regard that experience as positive.  Different cultures have different tolerances for risk, different respect for authority or tradition.  I think cultural diversity on a team is a good thing.</p>
<h3>Managing Diversity</h3>
<p>Over the years, there have been many methods proposed of matching people with the jobs they are best at.  The solution that works best is to ask them.  People gravitate toward the tasks that require their special skill sets.  Good team management means hiring diversely and allowing that migration.  On a well managed, diverse team, people will self select the jobs they are best at.  As a result, the diverse team is more resilient and I believe potentially more successful.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.procata.com/blog/archives/2007/03/26/software-development-team-diversity/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Dependency Injection in PHP</title>
		<link>http://www.procata.com/blog/archives/2006/06/26/dependency-injection-in-php/</link>
		<comments>http://www.procata.com/blog/archives/2006/06/26/dependency-injection-in-php/#comments</comments>
		<pubDate>Tue, 27 Jun 2006 04:17:53 +0000</pubDate>
		<dc:creator>Jeff</dc:creator>
				<category><![CDATA[Agile Methods]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Software Design]]></category>
		<category><![CDATA[dependency-injection]]></category>
		<category><![CDATA[php-architect]]></category>
		<category><![CDATA[phparch]]></category>

		<guid isPermaLink="false">http://www.procata.com/blog/archives/2006/06/26/dependency-injection-in-php/</guid>
		<description><![CDATA[The June issue of PHP Architect is out.  My column this month is on dependency injection, a topic which I&#8217;ve been warming up to lately.
First there was CORBA.  Then insane complexity of CORBA was supplanted by the intolerable complexity of EJB.  Influenced by an agile mindset and the power of Unit testing, [...]]]></description>
			<content:encoded><![CDATA[<p>The June issue of <a href="http://www.phparch.com/issue.php?mid=82">PHP Architect</a> is out.  My column this month is on dependency injection, a topic which I&#8217;ve been warming up to lately.</p>
<p>First there was <a href="http://acmqueue.com/modules.php?name=Content&#038;pa=showpage&#038;pid=396">CORBA</a>.  Then insane complexity of CORBA was supplanted by the intolerable complexity of <a href="http://acmqueue.com/modules.php?name=Content&#038;pa=showpage&#038;pid=398">EJB</a>.  Influenced by an agile mindset and the power of Unit testing, a group of java programmers began to construct simpler alternatives to EJB.  Thus, the inversion of control frameworks were born.  Martin Fowler came along, clarified and renamed the pattern <a href="http://www.martinfowler.com/articles/injection.html">dependency injection</a>.  This activity has originated in the Java world, but the pattern applies in PHP as well.</p>
<p>It is heartening to see an industry solve a problem over the course of a decade, moving from complex vendor driven middle-ware to simple patterns.  The thing I like most about DI is how dead simple it really is.</p>
<p>Fowler&#8217;s article is a must read on the topic. However, I have two problems with most of the introductions to dependency injection.  One is the use of irrelevant girl kisses boy style examples.  The other is the over-emphasis on the container.  The whole point of dependency injection is to move away from invasive component architectures, such as EJB.  From my point of view, it is far more interesting to explore what impact dependency injection has on your design than what features your container has.</p>
<p>With that in mind, I tried to write an introduction to dependency injection that avoiding talking about DI containers and that tried to use real, relevant examples.  For an example, I started with a typical, run of the mill dependency, torn from a popular PHP library that shall remain nameless, but easy to guess.  Then I build on that with a plug-able backend in a common PHP style and then again using dependency injection.</p>
<p>For me dependency injection is relatively new territory, but one that I feel is an important technique.  I&#8217;d like to see this technique become more widespread in PHP, especially in the current crop of frameworks.</p>
<p>I have a significant bias, but I think you should <a href="http://www.phparch.com/issue.php?mid=82">read the article</a>.  I hope you find it useful.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.procata.com/blog/archives/2006/06/26/dependency-injection-in-php/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>The Evolution of Design Patterns</title>
		<link>http://www.procata.com/blog/archives/2006/01/31/the-evolution-of-design-patterns/</link>
		<comments>http://www.procata.com/blog/archives/2006/01/31/the-evolution-of-design-patterns/#comments</comments>
		<pubDate>Tue, 31 Jan 2006 18:59:22 +0000</pubDate>
		<dc:creator>Jeff</dc:creator>
				<category><![CDATA[Agile Methods]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Software Design]]></category>
		<category><![CDATA[books]]></category>
		<category><![CDATA[design-patterns]]></category>
		<category><![CDATA[dynamic-typing]]></category>

		<guid isPermaLink="false">http://www.procata.com/blog/?p=172</guid>
		<description><![CDATA[Rebecca Wirfs-Brock suggests that it may be time for the GoF Design Patterns book to be refreshed.  She points out that the C++ and graphics programming examples may be less relevant to today&#8217;s C# and Java programmers.  She implies that state of the art has advanced in the twelve years since the book [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.wirfs-brock.com/2006/01/pattern-drift.html">Rebecca Wirfs-Brock suggests</a> that it may be time for the GoF <a href="http://www.amazon.com/exec/obidos/redirect?link_code=ur2&#038;tag=procata&#038;camp=1789&#038;creative=9325&#038;path=http%3A%2F%2Fwww.amazon.com%2Fgp%2Fproduct%2F0201633612%2Fqid%3D1138731933%2Fsr%3D2-1%2Fref%3Dpd_bbs_b_2_1%3Fs%3Dbooks%26v%3Dglance%26n%3D283155">Design Patterns</a> book to be refreshed.  She points out that the C++ and graphics programming examples may be less relevant to today&#8217;s C# and Java programmers.  She implies that state of the art has advanced in the twelve years since the book was written.  She also suggests that the GoF authors may have made some of the wrong tradeoffs when they specified some of the patterns.  </p>
<p>I know I would like to see an update to this groundbreaking work with more modern interpretations of what have become the canonical patterns.</p>
<p>Rebecca talks about how the interface type has come to replace the C++ abstract class.  One area that I am interested in is how <a href="http://en.wikipedia.org/wiki/Duck_typing">Duck typing</a> may replace the interface construct in many of the classic patterns.  I&#8217;m not sure that patterns intended for statically typed languages such as C++ and java necessarily have the same implementation in dynamically typed languages, such as smalltalk, Ruby and of course, PHP.</p>
<p>For the last few weeks, I&#8217;ve been doing an interesting educational exercise. I&#8217;ve been simultaneously reading <a href="http://www.amazon.com/exec/obidos/redirect?link_code=ur2&#038;tag=procata&#038;camp=1789&#038;creative=9325&#038;path=http%3A%2F%2Fwww.amazon.com%2Fgp%2Fproduct%2F0201633612%2Fqid%3D1138731933%2Fsr%3D2-1%2Fref%3Dpd_bbs_b_2_1%3Fs%3Dbooks%26v%3Dglance%26n%3D283155">Design Patterns</a>, <a href="http://www.amazon.com/exec/obidos/redirect?link_code=ur2&#038;tag=procata&#038;camp=1789&#038;creative=9325&#038;path=http%3A%2F%2Fwww.amazon.com%2Fgp%2Fproduct%2F0201485672%2Fqid%3D1138732395%2Fsr%3D2-1%2Fref%3Dpd_bbs_b_2_1%3Fs%3Dbooks%26v%3Dglance%26n%3D283155">Refactoring</a>, <a href="http://www.amazon.com/exec/obidos/redirect?link_code=ur2&#038;tag=procata&#038;camp=1789&#038;creative=9325&#038;path=http%3A%2F%2Fwww.amazon.com%2Fgp%2Fproduct%2F0321213351%2Fqid%3D1138732395%2Fsr%3D2-2%2Fref%3Dpd_bbs_b_2_2%3Fs%3Dbooks%26v%3Dglance%26n%3D283155">Refactoring to Patterns</a>, and <a href="http://www.amazon.com/exec/obidos/redirect?link_code=ur2&#038;tag=procata&#038;camp=1789&#038;creative=9325&#038;path=http%3A%2F%2Fwww.amazon.com%2Fgp%2Fproduct%2F0135974445%2Fqid%3D1138732599%2Fsr%3D2-1%2Fref%3Dpd_bbs_b_2_1%3Fs%3Dbooks%26v%3Dglance%26n%3D283155">Agile Software Development</a>.  I&#8217;m finding the cross-referencing between each of these highly complementary books to be be educational.  I&#8217;m hoping to add <a href="http://www.amazon.com/exec/obidos/redirect?link_code=ur2&#038;tag=procata&#038;camp=1789&#038;creative=9325&#038;path=http%3A%2F%2Fwww.amazon.com%2Fgp%2Fproduct%2F0201184621%2Fref%3Dwl_it_dp%3F%255Fencoding%3DUTF8%26colid%3D340RCXJY0586F%26coliid%3DISXN6HUYWJS3O%26v%3Dglance%26n%3D283155">Design Patterns Smalltalk Companion</a> and <a href="http://www.amazon.com/exec/obidos/redirect?link_code=ur2&#038;tag=procata&#038;camp=1789&#038;creative=9325&#038;path=http%3A%2F%2Fwww.amazon.com%2Fgp%2Fproduct%2F0973589825%2Fqid%3D1138732845%2Fsr%3D1-1%2Fref%3Dsr_1_1%3Fs%3Dbooks%26v%3Dglance%26n%3D283155">PHP|Architect&#8217;s Guide to PHP Design Patterns</a> (<a href="http://blog.casey-sweat.us/">Jason Sweat&#8217;s</a> book) to get a more dynamic perspective in the mix.  This is my reading project for the next few months.</p>
<p>That 10 years after first reading the Design Patterns book, i am still studying from it shows how much of a classic this book has become.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.procata.com/blog/archives/2006/01/31/the-evolution-of-design-patterns/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Delicious Outage Link Dump</title>
		<link>http://www.procata.com/blog/archives/2005/12/19/delicious-outage-link-dump/</link>
		<comments>http://www.procata.com/blog/archives/2005/12/19/delicious-outage-link-dump/#comments</comments>
		<pubDate>Mon, 19 Dec 2005 18:21:53 +0000</pubDate>
		<dc:creator>Jeff</dc:creator>
				<category><![CDATA[Agile Methods]]></category>
		<category><![CDATA[Misc]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Software Design]]></category>
		<category><![CDATA[Usability]]></category>
		<category><![CDATA[Web Design]]></category>

		<guid isPermaLink="false">http://www.procata.com/blog/?p=168</guid>
		<description><![CDATA[Del.icio.us has been down for a while.  I use it for my public bookmarks, which are listed on the side of this blog.  Here is a post with some recent random things that I would bookmark if I could.

The departure of the hyper-enthusiasts &#8211; &#8220;The Java hyper-enthusiasts have left the building&#8221;  (along [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.del.icio.us/blog/2005/12/continued_hiccu.html">Del.icio.us has been down</a> for a while.  I use it for my public bookmarks, which are listed on the side of this blog.  Here is a post with some recent random things that I would bookmark if I could.</p>
<ul>
<li><a href="http://www.artima.com/weblogs/viewpost.jsp?thread=141312">The departure of the hyper-enthusiasts</a> &#8211; &#8220;The Java hyper-enthusiasts have left the building&#8221;  (along the lines of <a href="http://www.procata.com/blog/archives/2005/09/29/why-isnt-php-the-natural-successor-to-java/">this</a>.)</li>
<li><a href="http://martinfowler.com/articles/newMethodology.html">The New Methodology</a> &#8211; Martin Fowler describes Agile methodologies &#8212; recently updated.</li>
<li><a href="http://wiki.caucho.com/PHP_Hello_World">PHP on Caucho</a> &#8211; PHP on the JVM.</li>
<li><a href="http://norman.walsh.name/2004/11/10/xml20">XML 2.0</a> &#8211; some thoughts on XML 2.0.</li>
<li><a href="http://www.webpatterns.org/">Web Patterns</a> &#8211; Under construction &#8212; check back later.</li>
<li><a href="http://www.welie.com/patterns/">Web Design Patterns</a>.</li>
<li><a href="http://www.agilealliance.org/resources/carnivaloftheagilists">Carnival of the Agilists</a>.</li>
</ul>
<p>I&#8217;m currently adding UTF-8 support to and generally improving WACT&#8217;s &#8220;liberal&#8221; xml/html parser.  A few sources of tests cases and information:</p>
<ul>
<li><a href="http://weblog.philringnalda.com/2005/12/18/who-knows-a-title-from-a-hole-in-the-ground">Who knows a title from a hole in the ground?</a></li>
<li><a href="http://decafbad.com/blog/2005/12/19/feedburner-feeds-give-heartburn-to-php-xml-parsers">FeedBurner feeds give heartburn to PHP XML parsers?</a></li>
<li><a href="http://www.is-thought.co.uk/book/home.htm">Web SGML and HTML 4.0 explained</a></li>
<li><a href="http://www.flightlab.com/~joe/sgml/cdata.html">CDATA confusion</a></li>
<li><a href="http://www.flightlab.com/~joe/sgml/comments.html">Comment syntax in SGML and HTML</a></li>
<li><a href="http://www.cs.tut.fi/~jkorpela/html/empty.html">Empty elements in SGML, HTML, XML, and XHTML</a></li>
<li><a href="http://www.w3.org/TR/NOTE-sgml-xml.html">Comparison of SGML and XML</a></li>
<li><a href="http://www.w3.org/XML/Test/">Extensible Markup Language (XML) Conformance Test Suites</a></li>
<li><a href="http://www.hixie.ch/tests/adhoc/html/parsing/">Ian Hixie&#8217;s HTML parsing test cases</a></li>
<li><a href="http://xmlconf.sourceforge.net/">Conformance Testing for XML and Related Technologies</a></li>
<li><a href="http://feedparser.org/">Universal Feed Parser</a> liberal feed parser with many test cases.</li>
<li><a href="http://schneegans.de/sv/test-cases/">XHTML test cases</a></li>
</ul>
<ul>
<li><a href="http://www.cl.cam.ac.uk/~mgk25/unicode.html">UTF-8 and Unicode FAQ for Unix/Linux</a></li>
<li><a href="http://www.w3.org/2001/06/utf-8-wrong/">bad UTF-8 test files</a></li>
<li><a href="http://validator.w3.org/dev/tests/">The W3C Markup Validation Service: Tests</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.procata.com/blog/archives/2005/12/19/delicious-outage-link-dump/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Code Coverage, Feedback and Open Source</title>
		<link>http://www.procata.com/blog/archives/2005/10/04/code-coverage-and-feedback/</link>
		<comments>http://www.procata.com/blog/archives/2005/10/04/code-coverage-and-feedback/#comments</comments>
		<pubDate>Tue, 04 Oct 2005 15:46:28 +0000</pubDate>
		<dc:creator>Jeff</dc:creator>
				<category><![CDATA[Agile Methods]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Software Design]]></category>
		<category><![CDATA[agile-php]]></category>
		<category><![CDATA[code-coverage]]></category>
		<category><![CDATA[extreme-programming]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[project-management]]></category>
		<category><![CDATA[test-driven-development]]></category>
		<category><![CDATA[unit-testing]]></category>

		<guid isPermaLink="false">http://www.procata.com/blog/archives/2005/08/04/code-coverage-and-feedback/</guid>
		<description><![CDATA[I&#8217;ve long wondered about the quality and extent of the PHP test suite.  During my posting hiatus, John Coggeshall addressed my question by posting a coverage report generated by running the test suite.  Unless I am mistaken, he also implies that the report will at some point become automated and available at http://cov.php.net/. [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve long wondered about the quality and extent of the PHP test suite.  During my posting hiatus, <a href="http://blog.coggeshall.org/archives/204_Code_Coverage_Support_for_PHP_5.html">John Coggeshall addressed my question</a> by posting a <a href="http://www.coggeshall.org/cov/">coverage report</a> generated by running the test suite.  Unless I am mistaken, he also implies that the report will at some point become automated and available at <a href="http://cov.php.net/">http://cov.php.net/</a>.  I see the availability of this report as a big step forward for PHPs future stability and maturity.</p>
<p>Agile software development methods including <a href="http://en.wikipedia.org/wiki/Extreme_Programming">extreme programming</a> (XP) have been growing in popularity and maturity alongside an increase in the popularity of open source projects.  One of the fundamental principles of XP is early and often feedback.  The value of feedback is obvious to anyone who has used a strange shower.  The shorter the time between turning the knob and feeling the temperature change, the faster you can arrive at the perfect temperature.  Nobody likes flailing between too hot and too cold in a lazy shower.  In the same way, immediate feedback on a development project can avoid wasted effort and produce a better result faster.</p>
<p>In XP and other Agile programming methods, an automated test suite provides important early and often feedback.  It is far better to catch a bug in the test suite than for the customer to find it.  But, how do you know if your tests are testing all of the features of your program?</p>
<p>The XP practice of <a href="http://en.wikipedia.org/wiki/Test_driven_development">test driven development</a> (TDD) demands that you only add features for which you have a failing test case.  Therefore, you write the test first, and then write the code to satisfy it.  For a theoretical perspective, this should give your code 100% code coverage.  Every line of code should be covered by a test.  Unfortunately, developers are human and any technique that relies of the perfection of people is doomed to fail. Unfortunately, the converse of the TDD coverage assertion is simply not helpful:  If you don&#8217;t have 100% test coverage, you aren&#8217;t correctly doing TDD.  If you are not doing TDD, how do you gauge the quality of your test suite?</p>
<p>Open source projects present a special challenge for the concept of TDD.  No project wants to reject useful contributions, yet many contributors may not write tests for their contributions.  Even if tests are required, there is no way to tell if they were written first, as in TDD, or after the fact.  XP would have the code author writing the unit tests.  In an open source project, this might not be possible or likely, although still desirable.</p>
<p>While certainly not perfect, code coverage tools do provide an indicator of how well tested a section of code is.  Code coverage reports are a feedback loop to help test writers find weak areas and to better target tests to specific lines of code. Just picking a file at random from PHP reveals low-hanging testing fruit: <a href="http://www.coggeshall.org/cov/Zend/zend_operators.c.gcov.html">zend_operators.c</a>.</p>
<p>I feel that a coverage report can be an important tool in an open source project.  More so than in other kinds of projects.  Test writing based on a coverage report inherently lends itself to the distributed nature of open source development.  Many people have a stake in the stability, robustness and reputation of PHP.  Tests are <a href="http://qa.php.net/write-test.php">easy enough to write</a>, easier perhaps than many other ways to contribute.  Hopefully easily available coverage reporting would help coordinate testing activities and draw people in that might not otherwise participate.</p>
<p>Ideally, contributions would be accompanied by test code contributed by the same author.  I also don&#8217;t think it is out of line to look at untested contributions with increased skepticism.  Coverage reports can help identify contributions that might cause future problems.  One can hope the existence of coverage reports might inspire contributors to include better tests by exposing their code as untested.  My (unverified) theory and hope is that the feedback of coverage reports can help inspire a culture of testing on an open source project.</p>
<p>While there are areas (such as GUI apps) where unit testing is difficult at best (thread safety may be another), PHP overall is very testable.  The stability and reputation of PHP can only be improved by increasing the coverage of its unit tests.</p>
<p>I am looking forward to seeing the availability of an automated <a href="http://cov.php.net/">http://cov.php.net/</a>, if indeed that is planned.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.procata.com/blog/archives/2005/10/04/code-coverage-and-feedback/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Why isn&#8217;t PHP the natural successor to Java?</title>
		<link>http://www.procata.com/blog/archives/2005/09/29/why-isnt-php-the-natural-successor-to-java/</link>
		<comments>http://www.procata.com/blog/archives/2005/09/29/why-isnt-php-the-natural-successor-to-java/#comments</comments>
		<pubDate>Thu, 29 Sep 2005 17:42:19 +0000</pubDate>
		<dc:creator>Jeff</dc:creator>
				<category><![CDATA[Agile Methods]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[language-comparison]]></category>
		<category><![CDATA[object-oriented-programming]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[php-frameworks]]></category>
		<category><![CDATA[programming-language]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[rubyonrails]]></category>

		<guid isPermaLink="false">http://www.procata.com/blog/?p=140</guid>
		<description><![CDATA[Loud thinking declares that Java has lost its aura of invincibility.  Jason Hunter sums it up nicely:
Ruby on Rails today looks poised to eat Java&#8217;s mindshare on the web tier. If not Rails, then something else.
It does seem like Java&#8217;s mindshare is on the decline, along with sun&#8217;s fortunes. There is some evidence that [...]]]></description>
			<content:encoded><![CDATA[<p>Loud thinking <a href="http://www.loudthinking.com/arc/000517.html">declares</a> that Java has lost its aura of invincibility.  Jason Hunter <a href="http://www.servlets.com/blog/archives/000068.html">sums it up</a> nicely:</p>
<blockquote><p>Ruby on Rails today looks poised to eat Java&#8217;s mindshare on the web tier. If not Rails, then something else.</p></blockquote>
<p>It does seem like Java&#8217;s mindshare is on the <a href="http://gnuvince.net/?p=62">decline</a>, along with sun&#8217;s fortunes. There is <a href="http://www.surveymonkey.com/DisplaySummary.asp?SID=1360166&#038;U=136016677100">some evidence</a> that rails is drawing mindshare from PHP as well.  (Mind share is the grown-up way of saying &#8220;what the cool kids are doing.&#8221;)</p>
<p>So why isn&#8217;t PHP that something else?</p>
<p>i think its the unit testing, &#8220;You aren&#8217;t gonna need it,&#8221; &#8220;Do the simplest thing that could possibly work&#8221; folk that are dismantling Java&#8217;s mindshare.  As they gain it, Java loses it.  Some of that is showing up in the java community itself in concepts like POJOs and dependency injection.  Some of it shows up in an exodus from Java to dynamic languages.</p>
<p>So why are the agile leaders like <a href="http://www.martinfowler.com/bliki/RubyPeople.html">Martin Fowler</a> and <a href="http://blogs.pragprog.com/cgi-bin/pragdave.cgi">Dave Thomas</a> working with Ruby instead of PHP?  David Heinemeier Hansson <a href="">directly credits</a> these guys with influencing his decision to stop programming rails in PHP and move to ruby.  I suspect that its the dynamic, smalltalk, like features of Ruby that appeal the the agile methods leaders.</p>
<p>Rails could have been a PHP framework, but wasn&#8217;t.  Although, I&#8217;m not sure that it would get the attention it is if it were a PHP framework.  The rails, ruby combination may be greater than the sum of the parts.</p>
<p>I can&#8217;t speak for anyone else, but I have some ideas about why PHP might not appeal to the agile method and java is too complicated folk:</p>
<ul>
<li>Too many globals &#8211; globals make unit testing more difficult and prevent integrating work from different developers, let alone different organizations.</li>
<li>No culture of objects &#8211; PHP has made great strides in this area, but I don&#8217;t get the impression that many of the folk that work on and with PHP really buy into object oriented programming the way that the agile methods folk do.</li>
<li>Crowded namespaces &#8211; How many functions is PHP up to?  Constants?</li>
<li>incomplete component model &#8211; This is another integration thing.  PHP has too many islands and not enough continents.  (I&#8217;m talking beans here, but definitely not EJB.)</li>
<li>No mature frameworks &#8211; Ruby has been around a long time, but didn&#8217;t really start gulping mindshare until Rails came along.  See <a href="http://www.procata.com/blog/archives/2004/11/28/the-value-of-mvc/">The Value of MVC</a>.</li>
<li>No closures &#8211; Its a dynamic thing.</li>
<li>Expert level gotchas &#8211; hopping on the learning curve is easy.  Reaching the top, not so much.</li>
</ul>
<p>I&#8217;ll elaborate on each of these points in a series of upcoming posts.</p>
<p>I&#8217;ll close by saying that life is not a zero sum game.  The success of Ruby and Rails does not diminish the success of PHP.  The cool kids were doing Java and now some of them are doing Ruby.  Oh, well.  Its disappointing that more of them aren&#8217;t doing PHP, but PHP has many things going for it.  That, however, is a different series of posts.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.procata.com/blog/archives/2005/09/29/why-isnt-php-the-natural-successor-to-java/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Expert and Novice Programmers</title>
		<link>http://www.procata.com/blog/archives/2005/05/10/expert-programmers/</link>
		<comments>http://www.procata.com/blog/archives/2005/05/10/expert-programmers/#comments</comments>
		<pubDate>Wed, 11 May 2005 04:22:24 +0000</pubDate>
		<dc:creator>Jeff</dc:creator>
				<category><![CDATA[Agile Methods]]></category>
		<category><![CDATA[Software Design]]></category>
		<category><![CDATA[career]]></category>
		<category><![CDATA[cognitive-science]]></category>
		<category><![CDATA[programmer-education]]></category>

		<guid isPermaLink="false">http://www.procata.com/blog/archives/2005/05/10/expert-programmers/</guid>
		<description><![CDATA[An article on Java World, Hiring the phantom Java architect, sparked an interesting debate at the server side regarding what it means to be a developer versus an architect.  I very much dislike the term architect and like to think of this instead in terms of programming skill level.
Cognitive science research on problem solving [...]]]></description>
			<content:encoded><![CDATA[<p>An article on Java World, <a href="http://www.javaworld.com/javaworld/jw-05-2005/jw-0509-architect.html">Hiring the phantom Java architect</a>, sparked an interesting <a href="http://www.theserverside.com/news/thread.tss?thread_id=33809">debate at the server side</a> regarding what it means to be a developer versus an architect.  I very much dislike the term architect and like to think of this instead in terms of programming skill level.</p>
<p>Cognitive science research on problem solving tries to examine the difference between experts and novices in a domain.  Rather than distinguish between developers and architects, I think it is better to distinguish between experts and novices at programming.  The Dreyfus model of skill acquisition details five skill levels to help in this task.  Here is a summary from <a href="http://www.codinghorror.com/blog/archives/000203.html">Coding Horror</a>:</p>
<blockquote><p>
Level 1: Beginner</p>
<ul>
<li>Little or no previous experience</li>
<li>Doesn&#8217;t want to learn: wants to accomplish a goal</li>
<li>No discretionary judgement</li>
<li>Rigid adherence to rules</li>
</ul>
<p>Level 2: Advanced Beginner</p>
<ul>
<li>Starts trying tasks on their own</li>
<li>Has difficulty troubleshooting</li>
<li>Wants information fast</li>
<li>Can place some advice in context required</li>
<li>Uses guidelines, but without holisitic understanding</li>
</ul>
<p>Level 3: Competent</p>
<ul>
<li>Develops conceptual models</li>
<li>Troubleshoots on their own</li>
<li>Seeks out expert advice</li>
<li>Sees actions at least partially in terms of long-term plans and goals</li>
</ul>
<p>Level 4: Proficient</p>
<ul>
<li>Guided by maxims applied to the current situation</li>
<li>Sees situations holistically</li>
<li>Will self-correct based on previous performance</li>
<li>Learns from the experience of others</li>
<li>Frustrated by oversimplified information</li>
</ul>
<p>Level 5: Expert</p>
<ul>
<li>No longer relies on rules, guidelines, or maxims</li>
<li>Works primarily from intuition</li>
<li>Analytic approaches only used in novel situations or when problems occur</li>
<li>When forced to follow set rules, performance is degraded</li>
</ul>
</blockquote>
<p>The Java World article laments about companies that advertise for experts, but don&#8217;t interview for it.  I have to say this struck a nerve with me.  <a href="http://shiflett.org/archive/115">Multiple choice</a> tests like the <a href="http://www.zend.com/store/education/certification/zend-php-certification.php">Zend Certification</a> disappoint me.  Tests like this don&#8217;t measure skill on this scale at all, they measure exposure.</p>
<p>In the past, I&#8217;ve used a coding sample as an interview question.  The code, about 250 lines, was distilled from an existing system and is horribly bad in so very many ways, but functional.  By showing the code to an interviewee and asking them what they would do to improve it, I found I could get a good idea of their skill level.  Novices simply had no idea what to do with it and would just move code around.  Sometimes they would insert comments, trying to make the code &#8220;better.&#8221;  Some candidates only found and fixed one problem (there were several major ones.)  No one fixed all the problems.  The one person that I interviewed and didn&#8217;t have look at the code (for time reasons), we had to let go.  He simply fooled us at his interview about his skill level.  The thing is that I am certain he could have passed a Delphi certification test.  (like the one I took at Brain Bench.)</p>
<p>Moving from novice to expert programmer takes a very long time.  From <a href="http://norvig.com/21-days.html">Teach Yourself Programming in Ten Years</a>:</p>
<blockquote><p>
Researchers (Hayes, Bloom) have shown it takes about ten years to develop expertise in any of a wide variety of areas, including chess playing, music composition, painting, piano playing, swimming, tennis, and research in neuropsychology and topology. There appear to be no real shortcuts: even Mozart, who was a musical prodigy at age 4, took 13 more years before he began to produce world-class music. In another genre, the Beatles seemed to burst onto the scene with a string of #1 hits and an appearance on the Ed Sullivan show in 1964. But they had been playing small clubs in Liverpool and Hamburg since 1957, and while they had mass appeal early on, their first great critical success, Sgt. Peppers, was released in 1967. Samuel Johnson thought it took longer than ten years: &#8220;Excellence in any department can be attained only by the labor of a lifetime; it is not to be purchased at a lesser price.&#8221; And Chaucer complained &#8220;the lyf so short, the craft so long to lerne.&#8221;
</p></blockquote>
<p>So you can&#8217;t become an expert without experience.  However, you can have experience without becoming an expert.  Some people just put in their time and never develop themselves.  So these people may have the answers to the certification trivia question for their specific environment and be able to get past the HR resume screeners with their buzzword detectors, but they will not have the impact that a true expert would have in the same situation.  Just like our Delphi Dud.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.procata.com/blog/archives/2005/05/10/expert-programmers/feed/</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>php testing and coverage</title>
		<link>http://www.procata.com/blog/archives/2005/04/08/php-testing-and-coverage/</link>
		<comments>http://www.procata.com/blog/archives/2005/04/08/php-testing-and-coverage/#comments</comments>
		<pubDate>Fri, 08 Apr 2005 15:18:30 +0000</pubDate>
		<dc:creator>Jeff</dc:creator>
				<category><![CDATA[Agile Methods]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[code-coverage]]></category>
		<category><![CDATA[simple-test]]></category>
		<category><![CDATA[unit-testing]]></category>

		<guid isPermaLink="false">http://www.procata.com/blog/archives/2005/04/08/php-testing-and-coverage/</guid>
		<description><![CDATA[I ran across this O&#8217;Reily article about SpikeSource today.  Very interesting.
They have released a coverage reporting tool, Spike PHP Coverage, for PHP that works with XDebug coverage data.  It works with Simple Test and it seems to be able aggregate the results of remote test runs, such as for web based tests.  [...]]]></description>
			<content:encoded><![CDATA[<p>I ran across <a href="http://www.oreillynet.com/pub/a/network/2005/04/07/spikesource.html">this O&#8217;Reily article</a> about <a href="http://www.spikesource.com/">SpikeSource</a> today.  Very interesting.</p>
<p>They have released a coverage reporting tool, <a href="http://www.spikesource.com/projects/phpcoverage/">Spike PHP Coverage</a>, for PHP that works with XDebug coverage data.  It works with Simple Test and it seems to be able aggregate the results of remote test runs, such as for web based tests.  I have wanted something exactly like this.  I can&#8217;t wait to get the chance to generate a consolidated coverage report for WACT.</p>
<p>It seems that they have the capability for generating and aggregating code <a href="http://www.spikesource.com/testresults.log/fedora-1-i386/1440/oss/comp/web/php5/test/coverage/coveragereport.txt">coverage reports</a> for <a href="http://www.spikesource.com/testresults/index.jsp?show=component-results&#038;category=all&#038;comp-id=65726#pkgtest">PHP</a> itself.  I haven&#8217;t had a chance to check this out, but its something that I have always wondered about.</p>
<p>Additionally, it looks like they accept <a href="http://www.spikesource.com/testupload/help_upload.php">contributions of Test Suites</a>.  If I understand this correctly, it means that I can upload the WACT test suite and that it can be used to test and generate coverage reports for PHP 4 and for PHP 5 as well as the framework.  If this is true, this is a big deal.  As there are more and more applications with automated test suites, it only makes sense to aggregate them to test PHP itself.</p>
<p>It also seems that they have embraced <a href="http://www.lastcraft.com/simple_test.php">Simple Test</a> for php testing.  Congratulations, <a href="http://www.lastcraft.com/blog/">Marcus</a>.  Simple Test is a fine piece of software.</p>
<p>I think code coverage measurements are important for gauging the quality of a test suite on open source projects, where there can be less formal development practices and a large number of contributers of varying skill levels and motivation.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.procata.com/blog/archives/2005/04/08/php-testing-and-coverage/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Knocked off the internet, a story of Windows and Macintosh</title>
		<link>http://www.procata.com/blog/archives/2005/03/15/knocked-off-the-internet-a-story-of-windows-and-macintosh/</link>
		<comments>http://www.procata.com/blog/archives/2005/03/15/knocked-off-the-internet-a-story-of-windows-and-macintosh/#comments</comments>
		<pubDate>Tue, 15 Mar 2005 16:35:19 +0000</pubDate>
		<dc:creator>Jeff</dc:creator>
				<category><![CDATA[Agile Methods]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Web Design]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[internet-explorer]]></category>
		<category><![CDATA[safari]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://www.procata.com/blog/archives/2005/03/15/knocked-off-the-internet-a-story-of-windows-and-macintosh/</guid>
		<description><![CDATA[This weekend the internal modem in my Mac died.  Living in a rural area, I am a dialup user.  Let me say that getting unexpectedly disconnected from the internet is very traumatic.
I&#8217;ve been following an iterative development cycle where I deploy to my client&#8217;s site every Friday.  (My old ERP colleagues would [...]]]></description>
			<content:encoded><![CDATA[<p>This weekend the internal modem in my Mac died.  Living in a rural area, I am a dialup user.  Let me say that getting unexpectedly disconnected from the internet is very traumatic.</p>
<p>I&#8217;ve been following an iterative development cycle where I deploy to my client&#8217;s site every Friday.  (My old ERP colleagues would be mortified &#8212; install on Friday?  My response: automated testing)  Thankfully, last Friday&#8217;s upload went through, although it was the last internet connection my internal modem would ever make.  It took me a couple days to rule out line quality and ISP problems and determine that the problem was hardware failure.</p>
<p>I have a PC with windows XP available.  Its not mine and I really don&#8217;t use it except for checking web sites in internet explorer and playing an occasional game.  So Sunday night I tried using it for some serious browsing for the first time.  After about five minutes, I realized that I can&#8217;t stand Internet Explorer.  The lack of a tabs felt like a missing finger.  I had no idea how much I used that feature in both Safari and in Firefox.  Also, the fonts under XP just plain looked bad.</p>
<p>Tiring with IE, I installed Firefox.  I&#8217;m impressed with Firefox on the PC.  I prefer Safari on the Mac, but I do use Firefox on the Mac for web development because of its ability to control and inspect headers, cookies, the DOM, etc.  I don&#8217;t use Firefox on the Mac for day to day browsing because its interface feels a little bit off.  No such feeling for Firefox on Windows.  Win Firefox felt very comfortable.  I like it.</p>
<p>When I upgraded this blog to WordPress 1.5, I integrated this blog with del.icio.us.  I have been using del.icio.us for my &#8220;to blog about later links.&#8221;  del.icio.us is very helpful when you have to browse in a foreign environment.</p>
<p>Sunday afternoon I had to start contemplating the idea that I might have do next Friday&#8217;s deployment from the XP machine or even temporarily move my development environment to the Windows machine.  It didn&#8217;t take long to rule out this option.  OS X comes pre-installed with Apache, PHP, CVS, SSH, and a bunch of other things that I probably take for granted.  Windows has none of that.  I decided that setting up a development environment under windows would probably take too much time.</p>
<p>I still remember the trauma from the last time I tried to ftp from a stock Windows machine.  Its probably better now, but I still decided that I didn&#8217;t want to try that route.  Besides, I just got my <a href="http://www.procata.com/blog/archives/2005/03/01/rsync-to-remote-server-via-ssh/">automated deployment scripts</a> working on the Mac.</p>
<p>So Monday morning, I drove 60 miles to go to pick up a USB Modem at Best Buy.  Now here is the problem with owning a Mac.  Best Buy has two models in stock.  Neither has OS X drivers.  I bought one anyway in case it might &#8220;just work.&#8221;  It doesn&#8217;t.  So I thought I was stuck until the USB modem I ordered from online arrives.</p>
<p>But then I realized that I had enough ethernet stuff in the basement to hookup a network between the PC and the Mac.  I have never done this before because I simply don&#8217;t use the windows machine enough to care.  Hooking up the network was a breeze.  A couple wizards, a few property dialogs and a half hours worth of reading was all it took to set up internet connection sharing on the PC side.  The Mac recognized the new network immediately and without configuration.  Sweet!</p>
<p>So, I am once again connected and now just waiting for my Mac compatible USB modem to come in the mail.</p>
<p>There is an added benefit.  Over the last year or so, I have been gradually switching from table based layout for my web pages to a CSS based layout.  I&#8217;ve quite a bit of trouble maintaining the same layout of older pages in CSS due to browser variances.  Some of my table based layout components are somewhat ambitious for CSS.  I never used to do much testing on Win IE because I was pretty familiar with how the table based layouts would look.  Win IE is very stable on these types of layouts and they almost always looked exactly on IE how I had developed them on the Mac.  Additionally, I had long ago worked out the cross browser kinks and was pretty much recycling the same debugged layout components.</p>
<p>This is definitely not the case for CSS.  I don&#8217;t yet have a full library of debugged layout components and I have to say my understanding of cross browser kinks is incomplete, although growing.  If you browse around on this blog in IE and in Firefox, you can see that while not terrible, it doesn&#8217;t render some pages correctly on IE.</p>
<p>Testing under IE was a pain for me.  Editing CSS files on Windows kept bringing up FrontPage instead of a plain text editor, which is what I wanted.  Now that the machines are networked, I can now just point windows to the test environment that is already running on my Mac and preview right from there.  I also have occasional access to a Windows Laptop, which will make this type of testing a lot easier.</p>
<p>I&#8217;m too far behind this week, but maybe next week I will finally figure out what is wrong with the style sheet for this blog under Win IE.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.procata.com/blog/archives/2005/03/15/knocked-off-the-internet-a-story-of-windows-and-macintosh/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Shipping Software is fun</title>
		<link>http://www.procata.com/blog/archives/2005/03/03/shipping-software/</link>
		<comments>http://www.procata.com/blog/archives/2005/03/03/shipping-software/#comments</comments>
		<pubDate>Thu, 03 Mar 2005 19:40:42 +0000</pubDate>
		<dc:creator>Jeff</dc:creator>
				<category><![CDATA[Agile Methods]]></category>
		<category><![CDATA[php-deployment]]></category>

		<guid isPermaLink="false">http://www.procata.com/blog/archives/2005/03/03/shipping-software/</guid>
		<description><![CDATA[Mark Lucovsky blogs about why he left Microsoft for Google (via John Lim).  He talks about how code at Microsoft has to rot in a CVS repository for years before shipping, while web based companies such as Google and Amazon can deploy almost instantly.
I have to agree with the sentiment.  I quit my [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://mark-lucovsky.blogspot.com/">Mark Lucovsky</a> blogs about why he left Microsoft for Google (via <a href="http://phplens.com/phpeverywhere/?q=node/view/174">John Lim</a>).  He talks about how code at Microsoft has to rot in a CVS repository for years before shipping, while web based companies such as Google and Amazon can deploy almost instantly.</p>
<p>I have to agree with the sentiment.  I quit my last job (in 2000) to work in web development largely for this reason.  I worked on a custom ERP package that was deployed in a few dozen manufacturing plants.  Deployment for developed code was a nightmare.  It wouldn&#8217;t surprise me if the effort involved with deploying a change was an order of magnitude greater than making it.  Testing, writing installation scripts, testing the installation scripts, sending a person to the plant to perform the installation and train the users, repeating for every plant.  Pray that there were no database changes.</p>
<p>The thing that attracted me to web development was that it felt much more &#8216;light weight,&#8217; and frankly, just more fun.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.procata.com/blog/archives/2005/03/03/shipping-software/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
