diff --git a/pep-0350.txt b/pep-0350.txt index 08069169b..f4bae473b 100644 --- a/pep-0350.txt +++ b/pep-0350.txt @@ -14,16 +14,17 @@ Abstract ======== This informational PEP aims to provide guidelines for consistent use -of Codetags, which would enable the construction of standard utilities -to take advantage of the Codetag information, as well as making Python -code more uniform across projects. Codetags also represent a very -lightweight programming micro-paradigm and become useful for project -management, documentation, change tracking, and project health -monitoring. This is submitted as a PEP because I feel its ideas are -Pythonic, although the concepts are not unique to Python programming. -Herein are the definition of Codetags, the philosophy behind them, a -motivation for standardized conventions, a specification, a toolset -description, and possible objections to the Codetag project/paradigm. +of *codetags*, which would enable the construction of standard +utilities to take advantage of the codetag information, as well as +making Python code more uniform across projects. Codetags also +represent a very lightweight programming micro-paradigm and become +useful for project management, documentation, change tracking, and +project health monitoring. This is submitted as a PEP because its +ideas are Pythonic, although the concepts are not unique to Python +programming. Herein are the definition of codetags, the philosophy +behind them, a motivation for standardized conventions, some examples, +a specification, a toolset description, and possible objections to the +Codetag project/paradigm. This PEP is also living as a wiki_ for people to add comments. @@ -35,27 +36,32 @@ Programmers widely use ad-hoc code comment markup conventions to serve as reminders of sections of code that need closer inspection or review. Examples of markup include ``FIXME``, ``TODO``, ``XXX``, ``BUG``, but there many more in wide use in existing software. Such -markup will henceforth be referred to as *Codetags*. These Codetags +markup will henceforth be referred to as *codetags*. These codetags may show up in application code, unit tests, scripts, general documentation, or wherever suitable. +Codetags have been under discussion and in use (hundreds of codetags +in the Python 2.4 sources) in many places (e.g., c2_) for many years. +See References_ for further historic and current information. + Philosophy ========== -If you subscribe to most of these values, then Codetags will likely be +If you subscribe to most of these values, then codetags will likely be useful for you. 1. As much information as possible should be contained **inside the source code** (application code or unit tests). This along with - use of Codetags impedes duplication. Most documentation can be + use of codetags impedes duplication. Most documentation can be generated from that source code; e.g., by using help2man, man2html, docutils, epydoc/pydoc, ctdoc, etc. 2. Information should be almost **never duplicated** -- it should be recorded in a single original format and all other locations should be automatically generated from the original, or simply be - referenced. This is the *SPOT* rule. + referenced. This is famously known as the Single Point Of + Truth (SPOT) or Don't Repeat Yourself (DRY) rule. 3. Documentation that gets into customers' hands should be **auto-generated** from single sources into all other output @@ -63,58 +69,63 @@ useful for you. important to have a documentation system that can generate all of these. -4. Whenever information is subject to (and suited for) user - feedback/input (e.g., FAQ, RFC, PEP), it should be contained in a - **repository** (e.g. a wiki, usenet, or mailing lists). +4. The **developers are the documentation team**. They write the code + and should know the code the best. There should not be a + dedicated, disjoint documentation team for any non-huge project. -5. There should not be a dedicated, disjoint **documentation team** - for any non-huge project. The developers writing the code know the - code best, and they should be the ones to describe it. - -6. **Plain text** (with non-invasive markup) is the best form of +5. **Plain text** (with non-invasive markup) is the best format for writing anything. All other formats are to be generated from the plain text. -7. **Revision control** should be used for almost everything. And - modifications should be checked in at least daily. +Codetag design was influenced by the following goals: + +A. Comments should be short whenever possible. + +B. Codetag fields should be optional and of minimal length. Default + values and custom fields can be set by individual code shops. + +C. Codetags should be minimalistic. The quicker it is to jot + something down, the more likely it is to get jotted. + +D. The most common use of codetags will only have zero to two fields + specified, and these should be the easiest to type and read. Motivation ========== -* **Various productivity tools can be built around Codetags.** +* **Various productivity tools can be built around codetags.** See Tools_. * **Encourages consistency.** - Historically, a subset of these Codetags has been used informally in + Historically, a subset of these codetags has been used informally in the majority of source code in existence, whether in Python or in other languages. Tags have been used in an inconsistent manner with - different spellings, semantics, format, and placement. For example, + different spellings, semantics, format, and placement. For example, some programmers might include datestamps and/or user identifiers, - limit to a single line or not, spell the Codetag differently than + limit to a single line or not, spell the codetag differently than others, etc. * **Encourages adherence to SPOT/DRY principle.** - E.g., generating a roadmap dynamically from Codetags instead of + E.g., generating a roadmap dynamically from codetags instead of keeping TODOs in sync with separate roadmap document. * **Easy to remember.** - All Codetags must be concise, intuitive, and semantically + All codetags must be concise, intuitive, and semantically non-overlapping with others. The format must also be simple. * **Use not required/imposed.** - If you don't use Codetags already, there's no obligation to start, + If you don't use codetags already, there's no obligation to start, and no risk of affecting code (but see Objections_). A small subset - can be adopted and the Tools_ will still be useful (a few Codetags + can be adopted and the Tools_ will still be useful (a few codetags have probably already been adopted on an ad-hoc basis anyway). Also - it is very easy to identify and remove if a Codetag is no longer - deemed useful. Then it is effectively *committed* and recorded by - revision control simply by checking in. + it is very easy to identify and remove (and possibly record) a + codetag that is no longer deemed useful. * **Gives a global view of code.** @@ -123,224 +134,344 @@ Motivation * **A logical location for capturing CRCs/Stories/Requirements.** The XP community often does not electronically capture Stories, but - Codetags seem like a good place to locate them. + codetags seem like a good place to locate them. * **Extremely lightweight process.** Creating tickets in a tracking system for every thought degrades development velocity. Even if a ticketing system is employed, - Codetags are useful for simply containing links to those tickets. + codetags are useful for simply containing links to those tickets. Examples ======== -This shows a simple Codetag as commonly found in sources everywhere +This shows a simple codetag as commonly found in sources everywhere (with the addition of a trailing ``<>``):: - def foo(): - # FIXME: Seems like this loop should be finite. <> - while True: ... + # FIXME: Seems like this loop should be finite. <> + while True: ... -The following contrived example demonstrates a more common use of -Codetagging. It uses some of the available fields to specify the -owners (a pair of developers with initials *MDE* and *CLE*), the Work -Week of expected completion (*w14*), and the priority of the item -(*p2*):: +The following contrived example demonstrates a typical use of +codetags. It uses some of the available fields to specify the +assignees (a pair of programmers with initials *MDE* and *CLE*), the +Date of expected completion (*Week 14*), and the Priority of the item +(*2*):: - def foo(): - # FIXME: Seems like this loop should be finite. - while True: ... + # FIXME: Seems like this loop should be finite. + while True: ... + +This codetag shows a bug with fields describing author, discovery +(origination) date, due date, and priority:: + + # BUG: Crashes if run on Sundays. + # + if day == 'Sunday': ... + +Here is a demonstration of how not to use codetags. This has many +problems: 1) Codetags cannot share a line with code; 2) Missing colon +after mnemonic; 3) A codetag referring to codetags is usually useless, +and worse, it is not completable; 4) No need to have a bunch of fields +for a trivial codetag; 5) Fields with unknown values (``t:XXX``) +should not be used:: + + i = i + 1 # TODO Add some more codetags. + # Specification ============= This describes the format: syntax, mnemonic names, fields, and -semantics. +semantics, and also the separate DONE File. General Syntax -------------- -Each Codetag should be inside a comment, and can be any number of -lines. It should match the indentation of surrounding code. The end -of the Codetag is marked by a pair of angle brackets ``<>`` containing -optional fields, which must not be split onto multiple lines. +Each codetag should be inside a comment, and can be any number of +lines. It should not share a line with code. It should match the +indentation of surrounding code. The end of the codetag is marked by +a pair of angle brackets ``<>`` containing optional fields, which must +not be split onto multiple lines. It is preferred to have a codetag +in ``#`` comments instead of string comments. There can be multiple +fields per codetag, all of which are optional. -.. NOTE: This PEP's text originally did not conform to the "inside a - comment" rule. Documents can have comments too! I fixed that. - -Ed. +.. NOTE: It may be reasonable to allow fields to fit on multiple + lines, but it complicates parsing and defeats minimalism if you + use this many fields. -There can be multiple fields per Codetag, all of which are optional. - -In short, a Codetag consists of a mnemonic, a colon, commentary text, +In short, a codetag consists of a mnemonic, a colon, commentary text, an opening angle bracket, an optional list of fields, and a closing -angle bracket. E.g., :: +angle bracket. E.g., :: # MNEMONIC: Some (maybe multi-line) commentary. -.. FIXME: Add completion vs target date?? - Mnemonics --------- -The Codetags of interest are listed below, using the following format: +The codetags of interest are listed below, using the following format: | ``recommended mnemonic (& synonym list)`` | *canonical name*: semantics -``FIXME (XXX, DEBUG, BROKEN, RFCTR, OOPS, SMELL, NEEDSWORK)`` - *Fix me*: Areas of problematic or ugly code needing refactoring or - cleanup. +``TODO (MILESTONE, MLSTN, DONE, YAGNI, TBD, TOBEDONE)`` + *To do*: Informal tasks/features that are pending completion. -``NOFIX (DONTFIX, NEVERFIX, NOBUG)`` +``FIXME (XXX, DEBUG, BROKEN, REFACTOR, REFACT, RFCTR, OOPS, SMELL, NEEDSWORK, INSPECT)`` + *Fix me*: Areas of problematic or ugly code needing refactoring or + cleanup. + +``BUG (BUGFIX)`` + *Bugs*: Reported defects tracked in bug database. + +``NOBUG (NOFIX, WONTFIX, DONTFIX, NEVERFIX, UNFIXABLE, CANTFIX)`` *Will Not Be Fixed*: Problems that are well-known but will never be addressed due to design problems or domain limitations. -``!!! (ALERT)`` - *Alerts*: In need of immediate attention. - -``GLOSS (GLOSSARY)`` - *Glossary*: Definitions for project glossary. - -``DOC (DOCUMENT)`` - *Needs Documentation*: Areas of code that still need to be - documented. - ``REQ (REQUIREMENT, STORY)`` *Requirements*: Satisfactions of specific, formal requirements. +``RFE (FEETCH, NYI, FR, FTRQ, FTR)`` + *Requests For Enhancement*: Roadmap items not yet implemented. + ``IDEA`` *Ideas*: Possible RFE candidates, but less formal than RFE. -``BUG (BUGFIX)`` - *Bugs*: Reported defects tracked in bug database. +``??? (QUESTION, QUEST, QSTN, WTF)`` + *Questions*: Misunderstood details. + +``!!! (ALERT)`` + *Alerts*: In need of immediate attention. + +``HACK (CLEVER, MAGIC)`` + *Hacks*: Temporary code to force inflexible functionality, or + simply a test change, or workaround a known problem. + +``PORT (PORTABILITY, WKRD)`` + *Portability*: Workarounds specific to OS, Python version, etc. + +``CAVEAT (CAV, CAVT, WARNING, CAUTION)`` + *Caveats*: Implementation details/gotchas that stand out as + non-intuitive. ``NOTE (HELP)`` *Notes*: Sections where a code reviewer found something that needs discussion or further investigation. -``SEE (REF)`` +``FAQ`` + *Frequently Asked Questions*: Interesting areas that require + external explanation. + +``GLOSS (GLOSSARY)`` + *Glossary*: Definitions for project glossary. + +``SEE (REF, REFERENCE)`` *See*: Pointers to other code, web link, etc. -``STAT (STATUS)`` - *Status*: File-level statistical indicator of work needing done on - this file. - -``RFE (FEETCH, NYI, FR, FTRQ, FTR)`` - *Requests For Enhancement*: Roadmap items not yet implemented. - -``HACK (CLEVER)`` - *Hacks*: Temporary code to force inflexible functionality, or - simply a test change, or workaround a known problem. - -``CAV (CAVEAT, WARNING, CAUTION)`` - *Caveats*: Implementation details/gotchas that stand out as - non-intuitive. - -``RVDBY (REVIEWED)`` - *Reviewed By*: File-level indicator of programmer(s) who performed - recent code review. - -``??? (QUESTION, QUEST, QSTN, WTF)`` - *Questions*: Misunderstood details. +``DOCDO (TODOC, DODOC, NEEDSDOC, EXPLAIN, DOCUMENT)`` + *Needs Documentation*: Areas of code that still need to be + documented. ``CRED (CREDIT, THANKS)`` *Credits*: Accreditations for external provision of enlightenment. -``TODO (MLSTN, DONE, YAGNI, TBD, TOBEDONE)`` - *To do*: Informal tasks/features that are pending completion. +``STAT (STATUS)`` + *Status*: File-level statistical indicator of maturity of this + file. - .. NOTE: TBD and TOBEDONE belong here, not with FIXME +``RVD (REVIEWED, REVIEW)`` + *Reviewed*: File-level indicator that review was conducted. -``PORT (PORTABILITY, WKRD)`` - *Portability*: Workarounds specific to OS, Python version, etc. - -``FAQ`` - *Frequently Asked Questions*: Interesting areas that require - external explanation. - -File-level Codetags might be better suited as properties in the -revision control system. +File-level codetags might be better suited as properties in the +revision control system, but might still be appropriately specified in +a codetag. Some of these are temporary (e.g., ``FIXME``) while others are -persistent (e.g., ``REQ``). Synonyms should probably be deprecated in -the interest of minimalism and consistency. I chose a mnemonic over a -synonym using three criteria: descriptiveness, length (shorter is -better), commonly used. +persistent (e.g., ``REQ``). A mnemonic was chosen over a synonym +using three criteria: descriptiveness, length (shorter is better), +commonly used. -Choosing between ``FIXME`` and ``XXX`` is difficult. ``XXX`` seems to +Choosing between ``FIXME`` and ``XXX`` is difficult. ``XXX`` seems to be more common, but much less descriptive. Furthermore, ``XXX`` is a useful placeholder in a piece of code having a value that is unknown. -`Sun says`__ that ``XXX`` and ``FIXME`` are slightly different, giving -``XXX`` higher severity. +Thus ``FIXME`` is the preferred spelling. `Sun says`__ that ``XXX`` +and ``FIXME`` are slightly different, giving ``XXX`` higher severity. +However, with decades of chaos on this topic, and too many millions of +developers who won't be influenced by Sun, it is easy to rightly call +them synonyms. __ http://java.sun.com/docs/codeconv/html/CodeConventions.doc9.html#395 ``DONE`` is always a completed ``TODO`` item, but this should probably -be indicated through the revision control system. +be indicated through the revision control system and/or a completion +recording mechanism (see `DONE File`_). It may be a useful metric to count ``NOTE`` tags: a high count may -indicate a problem. +indicate a design (or other) problem. But of course the majority of +codetags indicate areas of code needing some attention. -``FAQ`` is probably more appropriately documented in a wiki where -users can more easily contribute. +An ``FAQ`` is probably more appropriately documented in a wiki where +users can more easily view and contribute. Fields ------ -All fields are optional. It should be possible for groups to define or -add their own, but the proposed standard fields are as follows: +All fields are optional. The proposed standard fields are described +in this section. Note that upper case field characters are intended +to be replaced. -``pN`` - *Priority* level. Range is from 0..3 with 3 being the highest. A - *Severity* field could also exist, or it could be factored into - this single number. +The *Originator/Assignee* and *Origination Date/Week* fields are the +most common and don't usually require a prefix. -``iN`` - Development cycle *Iteration*. Useful for grouping Codetags into +.. NOTE: the colon after the prefix is a new addition that became + necessary when it was pointed out that a "codename" field (with no + digits) such as "cTiger" would be indistinguishable from a username. + + +.. NOTE: This section started out with just assignee and due week. It + has grown into a lot of fields by request. It is still probably + best to use a tracking system for any items that deserve it, and + not duplicate everything in a codetag (field). + +This lengthy list of fields is liable to scare people (the intended +minimalists) away from adopting codetags, but keep in mind that these +only exist to support programmers who either 1) like to keep ``BUG`` +or ``RFE`` codetags in a complete form, or 2) are using codetags as +their complete and only tracking system. In other words, many of +these fields will be used very rarely. They are gathered largely from +industry-wide conventions, and example sources include `GCC +Bugzilla`__ and `Python's SourceForge`__ tracking systems. + +.. ???: Maybe codetags inside packages (__init__.py files) could have + special global significance. + +__ http://gcc.gnu.org/bugzilla/ +__ http://sourceforge.net/tracker/?group_id=5470 + +``AAA[,BBB]...`` + List of *Originator* or *Assignee* initials (the context + determines which unless both should exist). It is also okay to + use usernames such as ``MicahE`` instead of initials. Initials + (in upper case) are the preferred form. + +``a:AAA[,BBB]...`` + List of *Assignee* initials. This is necessary only in (rare) + cases where a codetag has both an assignee and an originator, and + they are different. Otherwise the ``a:`` prefix is omitted, and + context determines the intent. E.g., ``FIXME`` usually has an + *Assignee*, and ``NOTE`` usually has an *Originator*, but if a + ``FIXME`` was originated (and initialed) by a reviewer, then the + assignee's initials would need a ``a:`` prefix. + +``YYYY[-MM[-DD]]`` or ``WW[.D]w`` + The *Origination Date* indicating when the comment was added, in + `ISO 8601`_ format (digits and hyphens only). Or *Origination + Week*, an alternative form for specifying an *Origination Date*. + A day of the week can be optionally specified. The ``w`` suffix + is necessary for distinguishing from a date. + +``d:YYYY[-MM[-DD]]`` or ``d:WW[.D]w`` + *Due Date (d)* target completion (estimate). Or *Due Week (d)*, + an alternative to specifying a *Due Date*. + +``p:N`` + *Priority (p)* level. Range (N) is from 0..3 with 3 being the + highest. 0..3 are analogous to low, medium, high, and + showstopper/critical. The *Severity* field could be factored into + this single number, and doing so is recommended since having both + is subject to varying interpretation. The range and order should + be customizable. The existence of this field is important for any + tool that itemizes codetags. Thus a (customizable) default value + should be supported. + +``t:NNNN`` + *Tracker (t)* number corresponding to associated Ticket ID in + separate tracking system. + +The following fields are also available but expected to be less +common. + +``c:AAAA`` + *Category (c)* indicating some specific area affected by this + item. + +``s:AAAA`` + *Status (s)* indicating state of item. Examples are "unexplored", + "understood", "inprogress", "fixed", "done", "closed". Note that + when an item is completed it is probably better to remove the + codetag and record it in a `DONE File`_. + +``i:N`` + Development cycle *Iteration (i)*. Useful for grouping codetags into completion target groups. -``XXX[,YYY]...`` - List of *Initials* of owners of completion responsibility. There - should be no digits in initials. +``r:N`` + Development cycle *Release (r)*. Useful for grouping codetags into + completion target groups. - .. ???: should initials be uppercase or lowercase? I prefer - uppercase, personally. + .. NOTE: SourceForge does not recognize a severity and I think + that *Priority* (along with separate RFE codetags) should + encompass and obviate *Severity*. - .. NOTE: I agree that uppercase is better but I'll leave that open - to users. + .. NOTE: The tools will need an ability to sort codetags in order + of targeted completion. I feel that *Priority* should be a + unique, lone indicator of that addressability order. Other + categories such as *Severity*, *Customer Importance*, etc. are + related to business logic and should not be recognized by the + codetag tools. If some groups want to have such logic, then it + is best factored (externally) into a single value (priority) + that can determine an ordering of actionable items. -``wWW[.D]`` - *Workweek* target completion (estimate). A day of the week can be - optionally specified. Origination and completion are freebies - with revision control. +To summarize, the non-prefixed fields are initials and origination +date, and the prefixed fields are: assignee (a), due (d), priority +(p), tracker (t), category (c), status (s), iteration (i), and release +(r). - .. ???: Since *workweek* and *date* are redundant we might want to - decide on one or other. Date is longer but is better - understood by most so the likely keeper. +It should be possible for groups to define or add their own fields, +and these should have upper case prefixes to distinguish them from the +standard set. Examples of custom fields are *Operating System (O)*, +*Severity (S)*, *Affected Version (A)*, *Customer (C)*, etc. - .. NOTE: *Workweek* indicates a completion estimate, but *date* - simply indicates when the comment was added. They're not - redundant. However, rather than workweek (which isn't used - much in my experience), it might be better to have a "c" - (completion estimate) tag with date content. -``yyyy[-mm[-dd]]`` - The *Date* the comment was added, in `ISO 8601`_ format (digits - and hyphens only). +DONE File +--------- + +Some codetags have an ability to be *completed* (e.g., ``FIXME``, +``TODO``, ``BUG``). It is often important to retain completed items +by recording them with a completion date stamp. Such completed items +are best stored in a single location, global to a project (or maybe a +package). The proposed format is most easily described by an example, +say ``~/src/fooproj/DONE``:: + + # TODO: Recurse into subdirs only on blue + # moons. + [2005-09-26 Oops, I underestimated this one a bit. Should have + used Warsaw's First Law!] + + # FIXME: ... + ... + +You can see that the codetag is copied verbatim from the original +source file. The date stamp is then entered on the following line +with an optional post-mortem commentary. The entry is terminated by a +blank line (``\n\n``). + +It may sound burdensome to have to delete codetag lines every time one +gets completed. But in practice it is quite easy to setup a Vim or +Emacs mapping to auto-record a codetag deletion in this format (sans +the commentary). Tools ===== Currently, programmers (and sometimes analysts) typically use *grep* -to generate a list of items corresponding to a single Codetag. +to generate a list of items corresponding to a single codetag. However, various hypothetical productivity tools could take advantage -of a consistent Codetag format. Some example tools follow. +of a consistent codetag format. Some example tools follow. .. NOTE: Codetag tools are mostly unimplemented (but I'm getting started!) @@ -356,30 +487,35 @@ Code Statistics A project Health-O-Meter Codetag Lint - Notify of invalid use of Codetags, and aid in porting to Codetag + Notify of invalid use of codetags, and aid in porting to codetags Story Manager/Browser An electronic means to replace XP notecards. In MVC terms, the - Codetag is the Model, and the Story Manager could be a graphical + codetag is the Model, and the Story Manager could be a graphical Viewer/Controller to do visual rearrangement, prioritization, and assignment, milestone management. Any Text Editor - Used for changing, removing, adding, rearranging Codetags. + Used for changing, removing, adding, rearranging, recording + codetags. There are some tools already in existence that take advantage of a -smaller set of pseudo-Codetags (see References_). +smaller set of pseudo-codetags (see References_). There is also an +example codetags implementation under way, known as the `Codetag +Project`__. + +__ http://tracos.org/codetag Objections ========== -:Objection: Extreme Programming argues that such Codetags should not +:Objection: Extreme Programming argues that such codetags should not ever exist in code since the code is the documentation. -:Defense: Maybe put the Codetags in the unit test files instead. - Besides, it's tough to generate documentation from uncommented - source code. +:Defense: Maybe you should put the codetags in the unit test files + instead. Besides, it's tough to generate documentation from + uncommented source code. ---- @@ -392,11 +528,13 @@ Objections :Objection: Causes duplication with tracking system. -:Defense: Not really. If an item exists in the tracker, a simple - ticket number as the Codetag commentary is sufficient. Maybe a - duplicated title would be acceptable. Furthermore, it's too - burdensome to have a ticket filed for every item that pops into a - developer's mind on-the-go. +:Defense: Not really, unless fields are abused. If an item exists in + the tracker, a simple ticket number in the codetag tracker field + is sufficient. Maybe a duplicated title would be acceptable. + Furthermore, it's too burdensome to have a ticket filed for every + item that pops into a developer's mind on-the-go. Additionally, + the tracking system could possibly be obviated for simple or small + projects that can reasonably fit the relevant data into a codetag. ---- @@ -404,24 +542,120 @@ Objections :Defense: That is a good point. But I'd still rather have such info in a single place (the source code) than various other documents, - likely getting duplicated or forgotten about. + likely getting duplicated or forgotten about. The completed + codetags can be sent off to the `DONE File`_, or to the bit + bucket. ---- :Objection: Codetags (and all comments) get out of date. :Defense: Not so much if other sources (externally visible - documentation) depend on them being accurate. + documentation) depend on their being accurate. + +---- + +:Objection: Codetags tend to only rarely have estimated completion + dates of any sort. OK, the fields are optional, but you want to + suggest fields that actually will be widely used. + +:Defense: If an item is inestimable don't bother with specifying a + date field. Using tools to display items with order and/or color + by due date and/or priority, it is easier to make estimates. + Having your roadmap be a dynamic reflection of your codetags makes + you much more likely to keep the codetags accurate. + +---- + +:Objection: Named variables for the field parameters in the ``<>`` + should be used instead of cryptic one-character prefixes. I.e., + should rather be . + +:Defense: It is just too much typing/verbosity to spell out fields. I + argue that ``p:3 i:2`` is as readable as ``priority=3, + iteration=2`` and is much more likely to by typed and remembered + (see bullet C in Philosophy_). In this case practicality beats + purity. There are not many fields to keep track of so one letter + prefixes are suitable. + +---- + +:Objection: Synonyms should be deprecated since it is better to have a + single way to spell something. + +:Defense: Many programmers prefer short mnemonic names, especially in + comments. This is why short mnemonics were chosen as the primary + names. However, others feel that an explicit spelling is less + confusing and less prone to error. There will always be two camps + on this subject. Thus synonyms (and complete, full spellings) + should remain supported. + +---- + +:Objection: It is cruel to use [for mnemonics] opaque acronyms and + abbreviations which drop vowels; it's hard to figure these things + out. On that basis I hate: MLSTN RFCTR RFE FEETCH, NYI, FR, FTRQ, + FTR WKRD RVDBY + +:Defense: Mnemonics are preferred since they are pretty easy to + remember and take up less space. If programmers didn't like + dropping vowels we would be able to fit very little code on a + line. The space is important for those who write comments that + often fit on a single line. But when using a canon everywhere it + is much less likely to get something to fit on a line. + +---- + +:Objection: It takes too long to type the fields. + +:Defense: Then don't use (most or any of) them, especially if you're + the only programmer. Terminating a codetag with ``<>`` is a small + chore, and in doing so you enable the use of the proposed tools. + Editor auto-completion of codetags is also useful: You can + program your editor to stamp a template (e.g. ``# FIXME . ``) with just a keystroke or two. + +---- + +:Objection: *WorkWeek* is an obscure and uncommon time unit. + +:Defense: That's true but it is a highly suitable unit of granularity + for estimation/targeting purposes, and it is very compact. The + `ISO 8601`_ is widely understood but allows you to only specify + either a specific day (restrictive) or month (broad). + +---- + +:Objection: I aesthetically dislike for the comment to be terminated + with <> in the empty field case. + +:Defense: It is necessary to have a terminator since codetags may be + followed by non-codetag comments. Or codetags could be limited to + a single line, but that's prohibitive. I can't think of any + single-character terminator that is appropriate and significantly + better than <>. Maybe ``@`` could be a terminator, but then most + codetags will have an unnecessary @. + +---- + +:Objection: I can't use codetags when writing HTML, or less + specifically, XML. Maybe ``@fields@`` would be a better than + ```` as the delimiters. + +:Defense: Maybe you're right, but ``<>`` looks nicer whenever + applicable. XML/SGML could use ``@`` while more common + programming languages stick to ``<>``. References ========== -Some other tools have approached defining/exploiting Codetags. +Some other tools have approached defining/exploiting codetags. See http://tracos.org/codetag/wiki/Links. .. _wiki: http://tracos.org/codetag/wiki/Pep .. _ISO 8601: http://en.wikipedia.org/wiki/ISO_8601 +.. _c2: http://c2.com/cgi/wiki?FixmeComment .. Local Variables: