Mercurial > docs > unix-phil
comparison unix-phil.ms @ 23:f0511a56416e
rework in ch04 and spell check
author | meillo@marmaro.de |
---|---|
date | Tue, 02 Mar 2010 14:34:07 +0100 |
parents | 4c21f5b8d716 |
children | ec17b3a969c7 |
comparison
equal
deleted
inserted
replaced
22:4c21f5b8d716 | 23:f0511a56416e |
---|---|
189 .IP \(bu | 189 .IP \(bu |
190 .I Efficiency | 190 .I Efficiency |
191 (time behavior, resource utilization) | 191 (time behavior, resource utilization) |
192 .IP \(bu | 192 .IP \(bu |
193 .I Maintainability | 193 .I Maintainability |
194 (analysability, changeability, stability, testability) | 194 (analyzability, changeability, stability, testability) |
195 .IP \(bu | 195 .IP \(bu |
196 .I Portability | 196 .I Portability |
197 (adaptability, installability, co-existence, replaceability) | 197 (adaptability, installability, co-existence, replaceability) |
198 .LP | 198 .LP |
199 These goals are parts of a software's design. | 199 These goals are parts of a software's design. |
479 However, the Unix Philosophy has an \fIadditional\fP perspective on prototyping: | 479 However, the Unix Philosophy has an \fIadditional\fP perspective on prototyping: |
480 After having built the prototype, one might notice, that the prototype is already | 480 After having built the prototype, one might notice, that the prototype is already |
481 \fIgood enough\fP. | 481 \fIgood enough\fP. |
482 Hence, no reimplementation, in a more sophisticated programming language, might be of need, | 482 Hence, no reimplementation, in a more sophisticated programming language, might be of need, |
483 for the moment. | 483 for the moment. |
484 Maybe later, it might be neccessary to rewrite the software, but not now. | 484 Maybe later, it might be necessary to rewrite the software, but not now. |
485 .PP | 485 .PP |
486 By delaying further work, one keeps the flexibility to react easily on | 486 By delaying further work, one keeps the flexibility to react easily on |
487 changing requirements. | 487 changing requirements. |
488 Software parts that are not written will not miss the requirements. | 488 Software parts that are not written will not miss the requirements. |
489 | 489 |
578 and avoiding optimizations that introduce dependencies on specific hardware. | 578 and avoiding optimizations that introduce dependencies on specific hardware. |
579 Hardware has a much lower lifetime than software. | 579 Hardware has a much lower lifetime than software. |
580 By chaining software to a specific hardware, | 580 By chaining software to a specific hardware, |
581 the software's lifetime gets shortened to that of this hardware. | 581 the software's lifetime gets shortened to that of this hardware. |
582 In contrast, software should be easy to port \(en | 582 In contrast, software should be easy to port \(en |
583 adaption is the key to success. | 583 adaptation is the key to success. |
584 .\" cf. practice of prog: ch08 | 584 .\" cf. practice of prog: ch08 |
585 .PP | 585 .PP |
586 (2) | 586 (2) |
587 .I "Portability of data | 587 .I "Portability of data |
588 is best achieved by avoiding binary representations | 588 is best achieved by avoiding binary representations |
589 to store data, because binary representations differ from machine to machine. | 589 to store data, because binary representations differ from machine to machine. |
590 Textual represenation is favored. | 590 Textual representation is favored. |
591 Historically, ASCII was the charset of choice. | 591 Historically, ASCII was the charset of choice. |
592 In the future, UTF-8 might be the better choice, however. | 592 In the future, UTF-8 might be the better choice, however. |
593 Important is that it is a plain text representation in a | 593 Important is that it is a plain text representation in a |
594 very common charset encoding. | 594 very common charset encoding. |
595 Apart from being able to transfer data between machines, | 595 Apart from being able to transfer data between machines, |
598 .\" gancarz tenet 5 | 598 .\" gancarz tenet 5 |
599 .PP | 599 .PP |
600 (3) | 600 (3) |
601 A large | 601 A large |
602 .I "range of usability | 602 .I "range of usability |
603 ensures good adaption, and thus good survival. | 603 ensures good adaptation, and thus good survival. |
604 It is a special distinction if a software becomes used in fields of action, | 604 It is a special distinction if a software becomes used in fields of action, |
605 the original authors did never imagine. | 605 the original authors did never imagine. |
606 Software that solves problems in a general way will likely be used | 606 Software that solves problems in a general way will likely be used |
607 for all kinds of similar problems. | 607 for all kinds of similar problems. |
608 Being too specific limits the range of uses. | 608 Being too specific limits the range of uses. |
656 .NH 1 | 656 .NH 1 |
657 Case study: \s-1MH\s0 | 657 Case study: \s-1MH\s0 |
658 .LP | 658 .LP |
659 The last chapter introduced and explained the Unix Philosophy | 659 The last chapter introduced and explained the Unix Philosophy |
660 from a general point of view. | 660 from a general point of view. |
661 The driving force were the guidelines and references to | 661 The driving force were the guidelines, references to |
662 existing software were given only sparsely. | 662 existing software were given only sparsely. |
663 In this and the next chapter, concrete software will be | 663 In this and the next chapter, concrete software will be |
664 the driving force in the discussion. | 664 the driving force in the discussion. |
665 .PP | 665 .PP |
666 This first case study is about the mail user agents \s-1MH\s0 | 666 This first case study is about the mail user agents (\s-1MUA\s0) |
667 (``mail handler'') and its descendent \fInmh\fP (``new mail handler''). | 667 \s-1MH\s0 (``mail handler'') and its descendent \fInmh\fP |
668 (``new mail handler''). | |
669 \s-1MUA\s0s provide functions to read, compose, and organize mail, | |
670 but (ideally) not to transfer. | |
668 In this document, the name \s-1MH\s0 will be used for both of them. | 671 In this document, the name \s-1MH\s0 will be used for both of them. |
669 A distinction will only be made if differences between | 672 A distinction will only be made if differences between |
670 them are described. | 673 them are described. |
671 | 674 |
672 | 675 |
673 .NH 2 | 676 .NH 2 |
674 Historical background | 677 Historical background |
675 .LP | 678 .LP |
676 Electronic mail was available in Unix very early. | 679 Electronic mail was available in Unix very early. |
677 It is out of matter that in the beginning mail was only | |
678 transferred within one machine. | |
679 This chapter is about a mail user agent (\s-1MUA\s0), | |
680 which provides functions to read, compose, and organize mail, | |
681 but (ideally) not to transfer. | |
682 .PP | |
683 The first \s-1MUA\s0 on Unix was \f(CWmail\fP. | 680 The first \s-1MUA\s0 on Unix was \f(CWmail\fP. |
684 It was a small program that either prints the own mailbox file | 681 It was a small program that either prints the own mailbox file |
685 or appends text to someone elses mailbox file, | 682 or appends text to someone elses mailbox file, |
686 depending on the command line arguments. | 683 depending on the command line arguments. |
687 .[ | 684 .[ |
688 %O http://cm.bell-labs.com/cm/cs/who/dmr/pdfs/man12.pdf | 685 %O http://cm.bell-labs.com/cm/cs/who/dmr/pdfs/man12.pdf |
689 .] | 686 .] |
690 It was a program that did one job well. | 687 It was a program that did one job well. |
691 This job was emailing, which then was very simple. | 688 This job was emailing, which was very simple then. |
692 .PP | 689 .PP |
693 Later, emailing became more powerfull, and thus more complex. | 690 Later, emailing became more powerful, and thus more complex. |
694 The simple \f(CWmail\fP, which knew nothing of subjects, | 691 The simple \f(CWmail\fP, which knew nothing of subjects, |
695 independent handling of single messages, | 692 independent handling of single messages, |
696 and long-time storage of them, was not powerful enough anymore. | 693 and long-time storage of them, was not powerful enough anymore. |
697 At Berkeley, Kurt Shoens wrote \fIMail\fP (with capital `M') | 694 At Berkeley, Kurt Shoens wrote \fIMail\fP (with capital `M') |
698 in 1978 to provide additional functions for emailing. | 695 in 1978 to provide additional functions for emailing. |
699 Mail was still one program, but now it was large and did | 696 Mail was still one program, but now it was large and did |
700 several jobs. | 697 several jobs. |
701 Its user interface is modeled after the one of ed. | 698 Its user interface is modeled after the one of \fIed\fP. |
702 It is designed for humans, but is still scriptable. | 699 It is designed for humans, but is still scriptable. |
703 \fImailx\fP is the adaption of Berkeley Mail into System V. | 700 \fImailx\fP is the adaptation of Berkeley Mail into System V. |
704 .[ | 701 .[ |
705 %A Gunnar Ritter | 702 %A Gunnar Ritter |
706 %O http://heirloom.sourceforge.net/mailx_history.html | 703 %O http://heirloom.sourceforge.net/mailx_history.html |
707 .] | 704 .] |
708 Elm, pine, mutt, and today a whole bunch of graphical \s-1MUA\s0s | 705 Elm, pine, mutt, and today a whole bunch of graphical \s-1MUA\s0s |
709 followed Mail's direction. | 706 followed Mail's direction. |
710 They are large, monolithic programs which include all emailing functions. | 707 They are large, monolithic programs which include all emailing functions. |
711 .PP | 708 .PP |
712 A different way took the people of \s-1RAND\s0 Corporation. | 709 A different way was taken by the people of \s-1RAND\s0 Corporation. |
713 In the beginning, they also had used a monolitic mail system, | 710 In the beginning, they also had used a monolitic mail system, |
714 simply called \s-1MS\s0 for ``mail system''. | 711 called \s-1MS\s0 simply for ``mail system''. |
715 But in 1977, Stockton Gaines and Norman Shapiro | 712 But in 1977, Stockton Gaines and Norman Shapiro |
716 came up with a proposal of a new email system concept \(en | 713 came up with a proposal of a new email system concept \(en |
717 one that honors the Unix Philosophy. | 714 one that honors the Unix Philosophy. |
718 The concept was implemented by Bruce Borden in 1978 and 1979. | 715 The concept was implemented by Bruce Borden in 1978 and 1979. |
719 This was the birth of \s-1MH\s0 \(en the ``mail handler''. | 716 This was the birth of \s-1MH\s0 \(en the ``mail handler''. |
720 .PP | 717 .PP |
721 Since then, \s-1RAND\s0, the University of California at Irvine and | 718 Since then, \s-1RAND\s0, the University of California at Irvine and |
722 at Berkeley, and several others have contributed to the software. | 719 at Berkeley, and several others have contributed to the software. |
723 However, it's core concepts remained the same. | 720 However, it's core concepts remained the same. |
724 In the 90s, when development of \s-1MH\s0 slowed down, | 721 In the late 90s, when development of \s-1MH\s0 slowed down, |
725 Richard Coleman started with \fInmh\fP, the new mail handler. | 722 Richard Coleman started with \fInmh\fP, the new mail handler. |
726 This was in 1997. | |
727 His goal was to improve \s-1MH\s0, especially in regard of | 723 His goal was to improve \s-1MH\s0, especially in regard of |
728 the requirements of modern email. | 724 the requirements of modern emailing. |
729 Today, nmh is developed by various people on the Internet. | 725 Today, nmh is developed by various people on the Internet. |
730 .[ | 726 .[ |
731 %T RAND and the Information Evolution: A History in Essays and Vignettes | 727 %T RAND and the Information Evolution: A History in Essays and Vignettes |
732 %A Willis H. Ware | 728 %A Willis H. Ware |
733 %D 2008 | 729 %D 2008 |
751 This might not be true, | 747 This might not be true, |
752 but it reflects the situation pretty well. | 748 but it reflects the situation pretty well. |
753 .PP | 749 .PP |
754 While monolithic \s-1MUA\s0s gather all function in one program, | 750 While monolithic \s-1MUA\s0s gather all function in one program, |
755 \s-1MH\s0 is a toolchest of many small tools \(en one for each job. | 751 \s-1MH\s0 is a toolchest of many small tools \(en one for each job. |
756 Following is a list of important programs of \s-1MH\s0's toolchest: | 752 Following is a list of important programs of \s-1MH\s0's toolchest |
753 and their function: | |
757 .IP \(bu | 754 .IP \(bu |
758 .CW inc : | 755 .CW inc : |
759 incorporate new mail | 756 incorporate new mail |
760 .IP \(bu | 757 .IP \(bu |
761 .CW scan : | 758 .CW scan : |
789 send a prepared message | 786 send a prepared message |
790 .LP | 787 .LP |
791 \s-1MH\s0 has no special user interface like monolithic \s-1MUA\s0s have. | 788 \s-1MH\s0 has no special user interface like monolithic \s-1MUA\s0s have. |
792 The user does not leave the shell to run \s-1MH\s0, | 789 The user does not leave the shell to run \s-1MH\s0, |
793 but he uses \s-1MH\s0 within the shell. | 790 but he uses \s-1MH\s0 within the shell. |
791 Using a monolithic program with a captive user interface | |
792 means ``entering'' the program, using it, and ``exiting'' the program. | |
793 Using toolchests like \s-1MH\s0 means running programs, | |
794 alone or in combinition with others, even from other toolchests, | |
795 without leaving the shell. | |
796 .PP | |
794 \s-1MH\s0's mail storage is (only little more than) a directory tree | 797 \s-1MH\s0's mail storage is (only little more than) a directory tree |
795 where directories are mail folders and files are mail messages. | 798 where mail folders are directories and mail messages are text files. |
796 Working with \s-1MH\s0's toolchest is much like working | 799 Working with \s-1MH\s0's toolchest is much like working |
797 with Unix' toolchest: | 800 with Unix' toolchest: |
798 \f(CWscan\fP is like \f(CWls\fP, | 801 \f(CWscan\fP is like \f(CWls\fP, |
799 \f(CWshow\fP is like \f(CWcat\fP, | 802 \f(CWshow\fP is like \f(CWcat\fP, |
800 \f(CWfolder\fP is like \f(CWcd\fP, | 803 \f(CWfolder\fP is like \f(CWcd\fP, |
801 \f(CWrefile\fP is like \f(CWmv\fP, | 804 \f(CWrefile\fP is like \f(CWmv\fP, |
802 and \f(CWrmm\fP is like \f(CWrm\fP. | 805 and \f(CWrmm\fP is like \f(CWrm\fP. |
803 .PP | 806 .PP |
804 The context of the Unix tools is mainly the current working directory, | 807 The context of tools in Unix is mainly the current working directory, |
805 the user identification, and the environment variables. | 808 the user identification, and the environment variables. |
806 \s-1MH\s0 extends this context by two more items: | 809 \s-1MH\s0 extends this context by two more items: |
807 The current mail folder, similar to the current working directory, | 810 .IP \(bu |
808 for which \f(CWfolder\fP provides the functionality of | 811 The current mail folder, which is similar to the current working directory. |
809 \f(CWpwd\fP and \f(CWcd\fP. | 812 For mail folders, \f(CWfolder\fP provides the corresponding functionality |
810 And the current message, relative to the current mail folder, | 813 of \f(CWpwd\fP and \f(CWcd\fP for directories. |
814 .IP \(bu | |
815 The current message, relative to the current mail folder, | |
811 which enables commands like \f(CWnext\fP and \f(CWprev\fP. | 816 which enables commands like \f(CWnext\fP and \f(CWprev\fP. |
817 .LP | |
812 In contrast to Unix' context, which is chained to the shell session, | 818 In contrast to Unix' context, which is chained to the shell session, |
813 \s-1MH\s0's context is meant to be chained to a mail account. | 819 \s-1MH\s0's context is meant to be chained to a mail account. |
814 But actually, the current message is a property of the mail folder, | 820 But actually, the current message is a property of the mail folder, |
815 which is mainly a legacy. | 821 which appears to be a legacy. |
816 This will cause problems when multiple users work | 822 This will cause problems when multiple users work |
817 in one mail folder simultaneously. | 823 in one mail folder simultaneously. |
818 .PP | |
819 Using a monolithic program with a captive user interface | |
820 means ``entering'' the program, using it, and ``exiting'' the program. | |
821 Using toolchests like \s-1MH\s0 means running programs, | |
822 alone or in combinition with others, even from other toolchests, | |
823 without leaving the shell. | |
824 | 824 |
825 | 825 |
826 .NH 2 | 826 .NH 2 |
827 Discussion of the design | 827 Discussion of the design |
828 .LP | 828 .LP |
829 The following paragraphs discuss \s-1MH\s0 in regard to the tenets | 829 The following paragraphs discuss \s-1MH\s0 in regard to the tenets |
830 of the Unix Philosophy Gancarz identified. | 830 of the Unix Philosophy which Gancarz identified. |
831 | 831 |
832 .PP | 832 .PP |
833 .I "``Small is beautiful'' | 833 .I "``Small is beautiful'' |
834 and | 834 and |
835 .I "``do one thing well'' | 835 .I "``do one thing well'' |
848 %T unix-phil | 848 %T unix-phil |
849 %P 125 | 849 %P 125 |
850 .] | 850 .] |
851 .LP | 851 .LP |
852 The various small programs of \s-1MH\s0 were relatively easy | 852 The various small programs of \s-1MH\s0 were relatively easy |
853 to write as each of them is small, limited to one function, | 853 to write, because each of them is small, limited to one function, |
854 and has clear bounderies. | 854 and has clear boundaries. |
855 For the same reasons, they are also good to maintain. | 855 For the same reasons, they are also good to maintain. |
856 Further more, the system can easily get extended. | 856 Further more, the system can easily get extended. |
857 One only needs to put a new program into the toolchest. | 857 One only needs to put a new program into the toolchest. |
858 This was done when \s-1MIME\s0 support was added | 858 This was done, for instance, when \s-1MIME\s0 support was added |
859 (e.g. \f(CWmhbuild\fP). | 859 (e.g. \f(CWmhbuild\fP). |
860 Also, different programs can exist to do the basically same job | 860 Also, different programs can exist to do the basically same job |
861 in different ways (e.g. in nmh: \f(CWshow\fP and \f(CWmhshow\fP). | 861 in different ways (e.g. in nmh: \f(CWshow\fP and \f(CWmhshow\fP). |
862 If someone needs a mail system with some additionally | 862 If someone needs a mail system with some additionally |
863 functions that are nowhere available yet, he best takes a | 863 functions that are available nowhere yet, he best takes a |
864 toolchest system like \s-1MH\s0 where he can add the | 864 toolchest system like \s-1MH\s0 where he can add the |
865 functionality with little work. | 865 functionality with little work. |
866 | 866 |
867 .PP | 867 .PP |
868 .I "Data storage. | 868 .I "Data storage. |
869 How \s-1MH\s0 stores data was already mentioned. | 869 How \s-1MH\s0 stores data was already mentioned. |
870 Mail folders are directories (which contain a file | 870 Mail folders are directories (which contain a file |
871 \&\f(CW.mh_sequences\fP) under the user's \s-1MH\s0 directory | 871 \&\f(CW.mh_sequences\fP) under the user's \s-1MH\s0 directory |
872 (usually \f(CW$HOME/Mail\fP). | 872 (usually \f(CW$HOME/Mail\fP). |
873 Mail messages are text files located in a mail folder. | 873 Mail messages are text files located in mail folders. |
874 The files contain the messages as they were received. | 874 The files contain the messages as they were received. |
875 The messages are numbered in ascending order in each folder. | 875 The messages are numbered in ascending order in each folder. |
876 This mailbox format is called ``\s-1MH\s0'' after the \s-1MUA\s0. | 876 This mailbox format is called ``\s-1MH\s0'' after the \s-1MUA\s0. |
877 Alternatives are \fImbox\fP and \fImaildir\fP. | 877 Alternatives are \fImbox\fP and \fImaildir\fP. |
878 In the mbox format all messages are stored within one file. | 878 In the mbox format all messages are stored within one file. |
880 were only a few lines of text and were deleted soon. | 880 were only a few lines of text and were deleted soon. |
881 Today, when single messages often include several megabytes | 881 Today, when single messages often include several megabytes |
882 of attachments, it is a bad solution. | 882 of attachments, it is a bad solution. |
883 Another disadvantage of the mbox format is that it is | 883 Another disadvantage of the mbox format is that it is |
884 more difficult to write tools that work on mail messages, | 884 more difficult to write tools that work on mail messages, |
885 because it is always neccessary to first find and extract | 885 because it is always necessary to first find and extract |
886 the relevant message in the mbox file. | 886 the relevant message in the mbox file. |
887 With \s-1MH\s0 mailboxes, each message is a self-standing item, | 887 With the \s-1MH\s0 mailbox format, |
888 by definition. | 888 each message is a self-standing item, by definition. |
889 Also, the problem of concurrent access to one mailbox is | 889 Also, the problem of concurrent access to one mailbox is |
890 reduced to the problem of concurrent access to one message. | 890 reduced to the problem of concurrent access to one message. |
891 However, the issue of the shared parts of the context, | 891 However, the issue of the shared parts of the context, |
892 as mentioned above, remains. | 892 as mentioned above, remains. |
893 Maildir is generally similar to \s-1MH\s0's format, | 893 Maildir is generally similar to \s-1MH\s0's format, |
905 but the frontend issues the appropriate calls when the user | 905 but the frontend issues the appropriate calls when the user |
906 clicks on a button. | 906 clicks on a button. |
907 Providing easy-to-use user interfaces in form of frontends is a good | 907 Providing easy-to-use user interfaces in form of frontends is a good |
908 approach, because it does not limit the power of the backend itself. | 908 approach, because it does not limit the power of the backend itself. |
909 The frontend will anyway only be able to make a subset of the | 909 The frontend will anyway only be able to make a subset of the |
910 backend's power and flexibility available. | 910 backend's power and flexibility available to the user. |
911 But if it is a separate program, | 911 But if it is a separate program, |
912 then the missing parts can still be accessed at the backend directly. | 912 then the missing parts can still be accessed at the backend directly. |
913 If it is integrated, then this will hardly be possible. | 913 If it is integrated, then this will hardly be possible. |
914 | 914 |
915 .PP | 915 .PP |
936 By having the code in an interpreted language, like the shell, | 936 By having the code in an interpreted language, like the shell, |
937 portability becomes a minor issue, if we assume the interpreter | 937 portability becomes a minor issue, if we assume the interpreter |
938 to be widespread. | 938 to be widespread. |
939 This demonstration also shows how easy it is to create single programs | 939 This demonstration also shows how easy it is to create single programs |
940 of a toolchest software. | 940 of a toolchest software. |
941 Most of the single programs comprise less than a hundred lines of | 941 Most of them comprise less than a hundred lines of shell code. |
942 shell code. | |
943 Such small software is easy to write, easy to understand, | 942 Such small software is easy to write, easy to understand, |
944 and thus easy to maintain. | 943 and thus easy to maintain. |
945 Being a toolchest improved the possibility to only write some parts | 944 A toolchest improves the possibility to only write some parts |
946 and though create a working result. | 945 and though create a working result. |
947 Expanding the toolchest without global changes will likely be | 946 Expanding the toolchest without global changes will likely be |
948 possible, too. | 947 possible, too. |
949 | 948 |
950 .PP | 949 .PP |
959 create shell scripts that run a specific command line, | 958 create shell scripts that run a specific command line, |
960 build of several \s-1MH\s0 programs. | 959 build of several \s-1MH\s0 programs. |
961 There is few software that so much wants users to tailor their | 960 There is few software that so much wants users to tailor their |
962 environment and to leverage the use of the software, like \s-1MH\s0. | 961 environment and to leverage the use of the software, like \s-1MH\s0. |
963 Just to make one example: | 962 Just to make one example: |
964 One might prefere a different listing format for the \f(CWscan\fP | 963 One might prefer a different listing format for the \f(CWscan\fP |
965 program. | 964 program. |
966 It is possible to take one of the other distributed format files | 965 It is possible to take one of the other distributed format files |
967 or to write one yourself. | 966 or to write one yourself. |
968 To use the format as default for \f(CWscan\fP, a single line, | 967 To use the format as default for \f(CWscan\fP, a single line, |
969 reading | 968 reading |
971 .CW | 970 .CW |
972 scan: -form FORMATFILE | 971 scan: -form FORMATFILE |
973 .DE | 972 .DE |
974 must be added to \f(CW.mh_profile\fP. | 973 must be added to \f(CW.mh_profile\fP. |
975 If one wants this different format as an additional command, | 974 If one wants this different format as an additional command, |
976 he needs to create a link to \f(CWscan\fP, for instance titled | 975 instead of changing the default, he needs to create a link to |
977 \f(CWscan2\fP. | 976 \f(CWscan\fP, for instance titled \f(CWscan2\fP. |
978 The line in \f(CW.mh_profile\fP would then start with \f(CWscan2\fP, | 977 The line in \f(CW.mh_profile\fP would then start with \f(CWscan2\fP, |
979 as the option should only be in effect when scan was called as | 978 as the option should only be in effect when scan was called as |
980 \f(CWscan2\fP. | 979 \f(CWscan2\fP. |
981 | 980 |
982 .PP | 981 .PP |
984 is hard to find in \s-1MH\s0. | 983 is hard to find in \s-1MH\s0. |
985 The reason therefore is that most of \s-1MH\s0's tools provide | 984 The reason therefore is that most of \s-1MH\s0's tools provide |
986 basic file system operations for the mailboxes. | 985 basic file system operations for the mailboxes. |
987 \f(CWls\fP, \f(CWcp\fP, \f(CWmv\fP, and \f(CWrm\fP | 986 \f(CWls\fP, \f(CWcp\fP, \f(CWmv\fP, and \f(CWrm\fP |
988 aren't filters neither. | 987 aren't filters neither. |
988 However, they build a basis on which filters can operate. | |
989 \s-1MH\s0 does not provide many filters itself, but it is a basis | |
990 to write filters for. | |
989 | 991 |
990 .PP | 992 .PP |
991 .I "``Build a prototype as soon as possible'' | 993 .I "``Build a prototype as soon as possible'' |
992 was again well followed by \s-1MH\s0. | 994 was again well followed by \s-1MH\s0. |
993 This tenet, of course, focuses on early development, which is | 995 This tenet, of course, focuses on early development, which is |
994 long time ago for \s-1MH\s0. | 996 long time ago for \s-1MH\s0. |
995 But without following this guideline at the very beginning, | 997 But without following this guideline at the very beginning, |
996 Bruce Borden may have not convinced the management to ever | 998 Bruce Borden may have not convinced the management of \s-1RAND\s0 |
997 create \s-1MH\s0. | 999 to ever create \s-1MH\s0. |
998 In Bruce's own words: | 1000 In Bruce' own words: |
999 .QP | 1001 .QP |
1000 [...] but [Stockton Gaines and Norm Shapiro] were not able | 1002 [...] but [Stockton Gaines and Norm Shapiro] were not able |
1001 to convince anyone that such a[n \s-1MH\s0-like] system | 1003 to convince anyone that such a system would be fast enough to be usable. |
1002 would be fast enough to be usable. | |
1003 I proposed a very short project to prove the basic concepts, | 1004 I proposed a very short project to prove the basic concepts, |
1004 and my management agreed. | 1005 and my management agreed. |
1005 Looking back, I realize that I had been very lucky with my first design. | 1006 Looking back, I realize that I had been very lucky with my first design. |
1006 Without nearly enough design work, | 1007 Without nearly enough design work, |
1007 I built a working environment and some header files | 1008 I built a working environment and some header files |