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