Hmmm, both long *and* late.  Network outages are never a good thing.
This was promised this weekend, but I couldn't get it out.  It's a
little long: actual ideas and proposals begin around "Perl Masters."


The Perl Apprenticeship Program: Developing Perl Developers

In the not-so-grim past -, to be
specific - Alan Burlison suggested an apprenticeship program be
established to, and I'll paraphrase heavily here, accomplish three
major goals:

1) Improve the overall quality of Perl 6.  By limiting the design and
implementation of critical sections to a small(ish), established core
team, Perl 6 would not suffer from ill-advisable or incomplete attempts
by well-intentioned, but otherwise ignorant, volunteers.

2) Solidify the future of Perl's development and maintenance base.  By
coupling experienced Perl developers with those new to the scene, the
community will be taking a step to grow its own support cadre from
within, as opposed to forcing them to make that transition on their

3) Allow wider community involvement.  Perl development is more than
internal development.  There is documentation to document; there are
scripts to script; there are tests to test.  More than peripheral,
these tasks are an excellent way for a broad range of people to be able
to contribute to the cause, as well as good starting point for those
who wish to delve deeper.  There should be nearly as varied a set of
developers *of* Perl as there as developers *with* Perl.

There were two major decisions associated with the Perl 6 start-up that
makes *now* a good time to start a Perl Apprentice program.  The first,
and most obvious, decision was to explicitly make Perl 6 a community
effort.  Although previous Perls were open to the public, there was
never quite the "call to arms" that there was with Perl 6.  And whether
the response was less than expected or overwhelming, there *was* a
response.  And both the old and the new have encountered frustrations
because of it.  It is, I should hope, the community's desire and
expectation that Perl should continue to grow with new features, new
technology, new users, and new contributors.  What is unmanageable now
will surely become more so.

The second decision was to formally split Perl development on logical
boundaries.  For Perl 5, for instance, even though a subsection (such
as regular expressions) had its own experts and champions, the entire
support experience was still centered around the encompassing p5p
group.  It very nearly forced learning the whole to concentrate on a
single part.  The proposed segregation of various sections and
subsections of Perl 6 can limit the amount of required learning to the
very core of Perl, allowing more people to bring what they *do* know to
the Perl effort more quickly.  Furthermore, the several smaller
sections can allow an apprenticeship program itself to be developed -
first, by allowing a relatively isolated trial run; and second, by
allowing each section to tailor the program to its own needs.

Will it work?  The growth and dispersal of the development effort is
critically dependent on having the people necessary to keep it that
way. The more people that are forced to work in multiple areas of Perl,
the closer those areas get to one another, until critical mass is
reached and Perl 6 is simply, from a support perspective, Perl 5 + 1.

So what, exactly, is an Perl Apprentice?

In the earliest of days, apprenticeships were more often than not
gained by physical (or mental) prowess, traditions and customs, and/or
parental choice.  In fields as diverse as blacksmiths, medicine men,
and Jedi Knights, the apprentice-to-be merely needed to be raw material
able to emerge alive and able on the far end of a rather lengthy term
of servitude.  

Later, with the establishment of trade schools and guilds, just plain
raw material no longer sufficed.  Now one had to be raw material with

Eventually, as the overall level of worldly knowledge increased, and
the truly gifted artisans and craftsmen rose high above their
predecessors, it became necessary to have the fundamental knowledge of
the field in order to learn from "one in the know."

Apprentices would start small, usually by doing various menial tasks
and following around the master during the normal course of business. 
Over time, the apprentice's responsibilities would grow to handling
various parts of the craft itself.  After completing a number of years
under the tutelage of a master, the apprentice would set out on his
own, sufficient enough to survive, and hopefully to thrive. 
Eventually, as reputations spread, new apprentices would seek the
apprentice-turned-master, and the cycle would continue.

Or something like that.  In any case, this last example is closest to
the model of apprenticeship that Perl needs.  The Perl
Apprentice-To-Be's need a fundamental understanding of the underlying
technology that they will be expected to further develop.  The current
Perl Masters need to develop those fundamental skills so that they are
Perl oriented.

In Perl-speak, that may mean starting up with secretarial skills, and
moving to documentation, Q&A forums, testing, and simple component
coding.  The rest of this excruciatingly lengthy document is a series
of ideas and suggestions as to how Perl 6 could put an apprenticeship
program into use.  It has been modified to reflect some of the recent
posts to the groups.

Perl Masters

Perl Masters (not to be confused with Perl masters) should be composed
of an entirely voluntary force.  Let's face it, everyone has a different 
level of tolerance and patience for the ignorant.  For some, it's zero.  
No one should be forced to play along.

Perl Masters should be comprised of Perl masters, who will largely be
self-nominated, with consensus provided from the other central gurus. 
This means the initial seed of the group will need to somehow gel into
place - somehow, I don't think that's a problem.  p5p is a good place
to start.

Masters should also be able to choose if they want to mentor someone
directly, or take advantage of a "group apprentice."  In other words, a
Master can decide to drag around a couple of dedicated apprentices to
do his or her dirty work, or relegate items to a handful of general
apprentices assigned to the group as an entity.  Either method has its
advantages and disadvantages, and it's entirely a matter of personal 

As a potential apprenticeship program - not necessarily the one below -
develops, there is probably no reason an person can't master in one area, 
but apprentice in another.

Perl Apprentices

Apprenticeship should also voluntary, as should the area a person wants
to apprentice in.  This is not to say that everyone will get their
wish, or won't be asked to move aside or step down.  If an apprentice
wishes to apprentice in, say, installation procedures, but only the
English documentation, he or she may be asked to reconsider if written
English skills aren't really a forte.  (For instance, how about writing
the documentation in Language X, which he or she is native in?)

Apprentices should also expect to start small.  A volunteer may want to
help design and code the regexp engine, for example, but may start by
writing weekly summaries of the regexp working group.

And, unfortunately, some apprentices should also expect to be, um,
asked to apprentice in a different area.  Don't take it personally,
(unless, of course, it *is* personal :-).


Here's where it gets fuzzy.  I'm not overly fond of a centralized
registry of folks and their skill sets.  But coordination would
probably be easier if *some* list(s) existed somewhere.  So I'll
present a couple of possibilities.

No registry - every task destined for an apprentice will need to be
"bid on" by every interested party.  Although each task is likely to
get an interested (and current) person, excess traffic will be
generated, and may make it more difficult to manage tasks across all of

Section registry - each section of Perl maintains its own list, along
with whatever information is necessary (such as language fluency for
documentation and platform availability for testers).  The list chairs
would be a good person to set this up.  Work can be distributed among
the volunteers within that group, and it's a little easier to manage
work across the whole of Perl.

Central registry - Perl has a single volunteer list that the various
groups can pull from.  This list might be segregated by what they want
to do - coding, testing, etc.  I suspect that this would eventually
degrade into a section registry scheme.

Apprentice Tasks

Any task vaguely Perl related can be apprenticed out.  Here is a sample

- Documentation, both internal and external, including, for instance,
programming guides, DDDs, user documentation, API documentation, coding
standards, etc.

- Writing weekly summaries of the groups and other stuff the list chair
is currently doing (or should be doing).

- Q&A or "Help Desk" between working groups, or between a working group
and a public forum.

- Writing test code, both internal and external.

- Fleshing out simple stub code.

- Research and prototyping.

- Mananging new apprenctices, or the program itself.


I'll give an example scenario based on Nat's suggestion of ten gurus
working on the Internals API.  This is an example, and only an
example.  Attributed behavior is "for example" only.  Example, get it?

Nat and Dan pick ten people to begin work on the API design.  Of the
ten, Nick decides that he's going to grab a couple of volunteers to be
his apprentices, Simon decides that he wants no part of the whole
thing, and everyone else is ambivalent.  Dan also picks three other
volunteers to be a general pool of apprentices for the group.

One apprentice is told to write up a weekly summary of the topics,
document it fully, and send it to the group, Nat, Larry, and the public
list.  Another apprentice is told to monitor the public list, answer
any questions he or she is able, and write up a weekly summary of the
feedback and questions to give to the group.

One day, Nick, Simon, and Andy get into a heated discussion about whether 
foo can really bar the work the way gork can.  Across all platforms.  
Dan gives them a week to come up with some benchmarks.

Simon codes his implementation of foo, documents his findings, etc. 
Nick codes his implementation of metafoo, farming off the coding of
some of his trivial stubs to one of his helpers.  Andy codes a foo-gork
comparison test, asking Dan to have one of the group apprentices do the
actual benchmarking, since he'll be too busy with something else.  Dan
then pings on one of the group apprentices to grab the code and run the

Truncation station.  Feedback?  On track, or waaaaaaaaaaaay off base?

Bryan C. Warnock
RABA Technologies

Reply via email to