comparison discussion.roff @ 171:346ff7e201f5

Applied suggestions by Boris.
author markus schnalke <meillo@marmaro.de>
date Tue, 10 Jul 2012 16:49:03 +0200
parents f4ffe121a0a2
children 4c7db172fb59
comparison
equal deleted inserted replaced
170:97461b0b34d2 171:346ff7e201f5
4 mmh project. 4 mmh project.
5 It is structured along the goals set for the project. 5 It is structured along the goals set for the project.
6 The concrete work undertaken 6 The concrete work undertaken
7 is described in the examples of how the general goals were achieved. 7 is described in the examples of how the general goals were achieved.
8 The discussion compares the current version of mmh with the state of 8 The discussion compares the current version of mmh with the state of
9 nmh just before the mmh project started, i.e. Fall 2011. 9 nmh just before the mmh project started, i.e. fall 2011.
10 Current changes of nmh will be mentioned only as side notes. 10 Current changes of nmh will be mentioned only as side notes.
11 .\" XXX where do I discuss the parallel development of nmh? 11 .\" XXX where do I discuss the parallel development of nmh?
12 12
13 13
14 14
43 to be beaten by projects that focus only on integrating existing mail 43 to be beaten by projects that focus only on integrating existing mail
44 components to create a homogeneous system. 44 components to create a homogeneous system.
45 .P 45 .P
46 The limiting resource in the community development of Free Software 46 The limiting resource in the community development of Free Software
47 is usually man power. 47 is usually man power.
48 .\" XXX FIXME ref!
48 If the development power is spread over a large development area, 49 If the development power is spread over a large development area,
49 it becomes even more difficult to compete with the specialists in the 50 it becomes even more difficult to compete with the specialists in the
50 various fields. 51 various fields.
51 The concrete situation for MH-based mail systems is even tougher, 52 The concrete situation for MH-based mail systems is even tougher,
52 given their small and aged community, concerning both developers and users. 53 given their small and aged community, concerning both developers and users.
187 Later, the essential complexity of email increased. 188 Later, the essential complexity of email increased.
188 (Essential complexity is the complexity defined by the problem itself.\0 189 (Essential complexity is the complexity defined by the problem itself.\0
189 .[[ 190 .[[
190 brooks no silver bullet 191 brooks no silver bullet
191 .]]) 192 .]])
192 Email systems reacted to this change: They grew. 193 Email systems reacted to this change: they grew.
193 RFCs started to introduce the concept of mail agents to separate the 194 RFCs started to introduce the concept of mail agents to separate the
194 various tasks because they became more extensive and new tasks appeared. 195 various tasks because they became more extensive and new tasks appeared.
195 As the mail systems grew even more, parts were split off. 196 As the mail systems grew even more, parts were split off.
196 For instance, a POP server was included in the original MH; 197 For instance, a POP server was included in the original MH;
197 it was removed in nmh. 198 it was removed in nmh.
204 that covers the field. 205 that covers the field.
205 Today, this is a reasonable exchange. 206 Today, this is a reasonable exchange.
206 .P 207 .P
207 .\" XXX ueberleitung ??? 208 .\" XXX ueberleitung ???
208 Functionality can be added in three different ways: 209 Functionality can be added in three different ways:
209 .BU 210 .LI 1
210 Implementing the function in the project itself. 211 Implementing the function in the project itself.
211 .BU 212 .LI 2
212 Depending on a library that provides the function. 213 Depending on a library that provides the function.
213 .BU 214 .LI 3
214 Depending on a program that provides the function. 215 Depending on a program that provides the function.
215 .P 216 .LP
216 .\" XXX Rework sentence 217 .\" XXX Rework sentence
217 While implementing the function in the project itself leads to the 218 While implementing the function in the project itself leads to the
218 largest increase in code size and requires the most maintenance 219 largest increase in code size and requires the most maintenance
219 and development work, 220 and development work,
220 it increases the project's independence of other software the most. 221 it increases the project's independence of other software the most.
600 .P 601 .P
601 Customization is a double-edged sword. 602 Customization is a double-edged sword.
602 It allows better suiting setups, but not for free. 603 It allows better suiting setups, but not for free.
603 There is the cost of code complexity to be able to customize. 604 There is the cost of code complexity to be able to customize.
604 There is the cost of less tested setups, because there are 605 There is the cost of less tested setups, because there are
605 more possible setups and especially corner-cases. 606 more possible setups and especially corner cases.
606 Additionally, there is the cost of choice itself. 607 Additionally, there is the cost of choice itself.
607 The code complexity directly affects the developers. 608 The code complexity directly affects the developers.
608 Less tested code affects both, users and developers. 609 Less tested code affects both, users and developers.
609 The problem of choice affects the users, for once by having to choose, 610 The problem of choice affects the users, for once by having to choose,
610 but also by more complex interfaces that require more documentation. 611 but also by more complex interfaces that require more documentation.
754 and 755 and
755 .Ev PAGER 756 .Ev PAGER
756 if they are set. 757 if they are set.
757 Today, mmh determines the editor to use in the following order, 758 Today, mmh determines the editor to use in the following order,
758 taking the first available and non-empty item: 759 taking the first available and non-empty item:
759 .IP (1) 760 .LI 1
760 Environment variable 761 Environment variable
761 .Ev MMHEDITOR 762 .Ev MMHEDITOR
762 .IP (2) 763 .LI 2
763 Profile entry 764 Profile entry
764 .Pe Editor 765 .Pe Editor
765 .IP (3) 766 .LI 3
766 Environment variable 767 Environment variable
767 .Ev VISUAL 768 .Ev VISUAL
768 .IP (4) 769 .LI 4
769 Environment variable 770 Environment variable
770 .Ev EDITOR 771 .Ev EDITOR
771 .IP (5) 772 .LI 5
772 Command 773 Command
773 .Pn vi . 774 .Pn vi .
774 .P 775 .LP
775 .Ci f85f4b7ae62e3d05a945dcd46ead51f0a2a89a9b 776 .Ci f85f4b7ae62e3d05a945dcd46ead51f0a2a89a9b
776 .P 777 .P
777 The pager to use is determined in a similar order, 778 The pager to use is determined in a similar order,
778 also taking the first available and non-empty item: 779 also taking the first available and non-empty item:
779 .IP (1) 780 .LI 1
780 Environment variable 781 Environment variable
781 .Ev MMHPAGER 782 .Ev MMHPAGER
782 .IP (2) 783 .LI 2
783 Profile entry 784 Profile entry
784 .Pe Pager 785 .Pe Pager
785 (replaces 786 (replaces
786 .Pe moreproc ) 787 .Pe moreproc )
787 .IP (3) 788 .LI 3
788 Environment variable 789 Environment variable
789 .Ev PAGER 790 .Ev PAGER
790 .IP (4) 791 .LI 4
791 Command 792 Command
792 .Pn more . 793 .Pn more .
793 .P 794 .LP
794 .Ci 0c4214ea2aec6497d0d67b436bbee9bc1d225f1e 795 .Ci 0c4214ea2aec6497d0d67b436bbee9bc1d225f1e
795 .P 796 .P
796 By respecting the 797 By respecting the
797 .Ev VISUAL /\c 798 .Ev VISUAL /\c
798 .Ev EDITOR 799 .Ev EDITOR
987 988
988 989
989 990
990 .H2 "Command Line Switches 991 .H2 "Command Line Switches
991 .P 992 .P
992 The command line switches of MH tools follow the X Window style. 993 The command line switches of MH tools is similar to the X Window style.
994 .\" XXX ref
993 They are words, introduced by a single dash. 995 They are words, introduced by a single dash.
994 For example: 996 For example:
995 .Cl "-truncate" . 997 .Cl "-truncate" .
996 Every program in mmh has two generic switches: 998 Every program in mmh has two generic switches:
997 .Sw -help , 999 .Sw -help ,
1460 .Sw -mmdf 1462 .Sw -mmdf
1461 switches. 1463 switches.
1462 .Sw -mbox 1464 .Sw -mbox
1463 is the sole behavior now. 1465 is the sole behavior now.
1464 .Ci 3916ab66ad5d183705ac12357621ea8661afd3c0 1466 .Ci 3916ab66ad5d183705ac12357621ea8661afd3c0
1465 In the same go, 1467 Further rework in both tools made the
1466 .Pn packf
1467 and
1468 .Pn rcvpack
1469 were reworked and their
1470 .Sw -file 1468 .Sw -file
1471 switch became unnecessary. 1469 switch unnecessary.
1472 .Ci ca1023716d4c2ab890696f3e41fa0d94267a940e 1470 .Ci ca1023716d4c2ab890696f3e41fa0d94267a940e
1473 1471
1474 .BU 1472 .BU
1475 Mmh's tools will no longer clear the screen (\c 1473 Mmh's tools will no longer clear the screen (\c
1476 .Pn scan 's 1474 .Pn scan 's
2139 mode. 2137 mode.
2140 In mmh, 2138 In mmh,
2141 .Sw -auto 2139 .Sw -auto
2142 is not dangerous anymore. 2140 is not dangerous anymore.
2143 Two changes were necessary: 2141 Two changes were necessary:
2144 .BU 2142 .LI 1
2145 Any directory path is removed from the proposed filename. 2143 Any directory path is removed from the proposed filename.
2146 Thus, the files are always stored in the expected directory. 2144 Thus, the files are always stored in the expected directory.
2147 .Ci 41b6eadbcecf63c9a66aa5e582011987494abefb 2145 .Ci 41b6eadbcecf63c9a66aa5e582011987494abefb
2148 .BU 2146 .LI 2
2149 Tar files are not extracted automatically any more. 2147 Tar files are not extracted automatically any more.
2150 Thus, the rest of the file system will not be touched. 2148 Thus, the rest of the file system will not be touched.
2151 .Ci 94c80042eae3383c812d9552089953f9846b1bb6 2149 .Ci 94c80042eae3383c812d9552089953f9846b1bb6
2152 .LP 2150 .LP
2153 Now, the outcome of mmh's 2151 Now, the outcome of mmh's
2406 .Fn pgpkeys . 2404 .Fn pgpkeys .
2407 Unless public keys are found for all recipients, 2405 Unless public keys are found for all recipients,
2408 .Pn send 2406 .Pn send
2409 will refuse to encrypt and send it. 2407 will refuse to encrypt and send it.
2410 Currently, messages with hidden (BCC) recipients can not be encrypted. 2408 Currently, messages with hidden (BCC) recipients can not be encrypted.
2411 This corner-case requires a more complex solution. 2409 This work is pending because it requires a structurally more complex
2412 Covering it is left to do. 2410 approach.
2413 .P 2411 .P
2414 The integrated message signing and encrypting support is one of the 2412 The integrated message signing and encrypting support is one of the
2415 most recent features in mmh. 2413 most recent features in mmh.
2416 Feedback from users and the experience I will gather myself 2414 Feedback from users and the experience I will gather myself
2417 will direct the further development of the facility. 2415 will direct the further development of the facility.
2472 .Fn draft 2470 .Fn draft
2473 in the MH directory, which is treated special. 2471 in the MH directory, which is treated special.
2474 On composing a message, this draft file was used. 2472 On composing a message, this draft file was used.
2475 When starting to compose another message before the former one was sent, 2473 When starting to compose another message before the former one was sent,
2476 the user had to decide among: 2474 the user had to decide among:
2477 .BU 2475 .LI 1
2478 Using the old draft to finish and send it before starting with a new one. 2476 Using the old draft to finish and send it before starting with a new one.
2479 .BU 2477 .LI 2
2480 Discarding the old draft and replacing it with a new one. 2478 Discarding the old draft and replacing it with a new one.
2481 .BU 2479 .LI 3
2482 Preserving the old draft by refiling it to a folder. 2480 Preserving the old draft by refiling it to a folder.
2483 .P 2481 .LP
2484 It was only possible to work in alternation on multiple drafts. 2482 It was only possible to work in alternation on multiple drafts.
2485 Therefore, the current draft needed to be refiled to a folder and 2483 Therefore, the current draft needed to be refiled to a folder and
2486 another one re-used for editing. 2484 another one re-used for editing.
2487 Working on multiple drafts at the same time was impossible. 2485 Working on multiple drafts at the same time was impossible.
2488 The usual approach of switching to a different MH context did not 2486 The usual approach of switching to a different MH context did not
2507 It is the more powerful and more natural concept. 2505 It is the more powerful and more natural concept.
2508 The draft folder is a folder like any other folder in MH. 2506 The draft folder is a folder like any other folder in MH.
2509 Its messages can be listed like any other messages. 2507 Its messages can be listed like any other messages.
2510 A draft message is no longer a special case. 2508 A draft message is no longer a special case.
2511 Tools do not need special switches to work on the draft message. 2509 Tools do not need special switches to work on the draft message.
2512 Hence corner-cases were removed. 2510 Hence corner cases were removed.
2513 .P 2511 .P
2514 The trivial part of the work was activating the draft folder with a 2512 The trivial part of the work was activating the draft folder with a
2515 default name. 2513 default name.
2516 I chose the name 2514 I chose the name
2517 .Fn +drafts 2515 .Fn +drafts
2541 Yet, one draft-related switch remained. 2539 Yet, one draft-related switch remained.
2542 .Pn comp 2540 .Pn comp
2543 still has 2541 still has
2544 .Sw -[no]use 2542 .Sw -[no]use
2545 for switching between two modes: 2543 for switching between two modes:
2546 .BU 2544 .LI 1
2547 .Sw -use 2545 .Sw -use
2548 to modify an existing draft. 2546 to modify an existing draft.
2549 .BU 2547 .LI 2
2550 .Sw -nouse 2548 .Sw -nouse
2551 to compose a new draft, possibly taking some existing message as template. 2549 to compose a new draft, possibly taking some existing message as template.
2552 .P 2550 .LP
2553 In either case, the behavior of 2551 In either case, the behavior of
2554 .Pn comp 2552 .Pn comp
2555 is deterministic. 2553 is deterministic.
2556 .P 2554 .P
2557 .Pn send 2555 .Pn send
2812 Quoting the original message in the reply. 2810 Quoting the original message in the reply.
2813 .Ci 67411b1f95d6ec987b4c732459e1ba8a8ac192c6 2811 .Ci 67411b1f95d6ec987b4c732459e1ba8a8ac192c6
2814 .BU 2812 .BU
2815 Forwarding messages using MIME. 2813 Forwarding messages using MIME.
2816 .Ci 6e271608b7b9c23771523f88d23a4d3593010cf1 2814 .Ci 6e271608b7b9c23771523f88d23a4d3593010cf1
2817 .P 2815 .LP
2818 In consequence, a setup with a profile that defines only the path to the 2816 In consequence, a setup with a profile that defines only the path to the
2819 mail storage, is already convenient to use. 2817 mail storage, is already convenient to use.
2820 Again, Paul Vixie's ``edginess'' call supports the direction I took: 2818 Again, Paul Vixie's ``edginess'' call supports the direction I took:
2821 ``the `main branch' should just be modern''. 2819 ``the `main branch' should just be modern''.
2822 .[ 2820 .[
3078 .Sw -number 3076 .Sw -number
3079 switch is only necessary in combination with 3077 switch is only necessary in combination with
3080 .Sw -delete , 3078 .Sw -delete ,
3081 but not with 3079 but not with
3082 .Sw -list . 3080 .Sw -list .
3083 In the former case it is even necessary. 3081 .P
3084 .P 3082 Trying to fix these problems on the surface would not have solved
3085 Trying to fix these problems on the surface would not have solved it truly. 3083 them truly, as they originate from a discrepance between the semantic
3086 The problems discovered originate from a discrepance between the semantic
3087 structure of the problem and the structure implemented in the program. 3084 structure of the problem and the structure implemented in the program.
3088 Such structural differences can not be cured on the surface. 3085 Such structural differences can not be cured on the surface.
3089 They need to be solved by adjusting the structure of the implementation 3086 They need to be solved by adjusting the structure of the implementation
3090 to the structure of the problem. 3087 to the structure of the problem.
3091 .P 3088 .P
3103 .Sw -delete 3100 .Sw -delete
3104 introduce modes of operation. 3101 introduce modes of operation.
3105 Historically, 3102 Historically,
3106 .Pn anno 3103 .Pn anno
3107 had only one operation mode: adding header fields. 3104 had only one operation mode: adding header fields.
3108 With the extension, it got two moder modes: 3105 With the extension, it got two more modes:
3109 listing and deleting header fields. 3106 listing and deleting header fields.
3110 The structure of the code changes did not pay respect to this 3107 The structure of the code changes did not pay respect to this
3111 fundamental change to 3108 fundamental change to
3112 .Pn anno 's 3109 .Pn anno 's
3113 behavior. 3110 behavior.
3166 3163
3167 3164
3168 .U3 "Path Conversion 3165 .U3 "Path Conversion
3169 .P 3166 .P
3170 Four kinds of path names can appear in MH: 3167 Four kinds of path names can appear in MH:
3171 .IP (1) 3168 .LI 1
3172 Absolute Unix directory paths, like 3169 Absolute Unix directory paths, like
3173 .Fn /etc/passwd . 3170 .Fn /etc/passwd .
3174 .IP (2) 3171 .LI 2
3175 Relative Unix directory paths, like 3172 Relative Unix directory paths, like
3176 .Fn ./foo/bar . 3173 .Fn ./foo/bar .
3177 .IP (3) 3174 .LI 3
3178 Absolute MH folder paths, like 3175 Absolute MH folder paths, like
3179 .Fn +friends/phil . 3176 .Fn +friends/phil .
3180 .IP (4) 3177 .LI 4
3181 Relative MH folder paths, like 3178 Relative MH folder paths, like
3182 .Fn @subfolder . 3179 .Fn @subfolder .
3183 .P 3180 .LP
3184 The last type, relative MH folder paths, are hardly documented. 3181 The last type, relative MH folder paths, are hardly documented.
3185 Nonetheless, they are useful for large mail storages. 3182 Nonetheless, they are useful for large mail storages.
3186 The current mail folder is specified as `\c 3183 The current mail folder is specified as `\c
3187 .Fn @ ', 3184 .Fn @ ',
3188 just like the current directory is specified as `\c 3185 just like the current directory is specified as `\c
3204 char *m_mailpath(char *); 3201 char *m_mailpath(char *);
3205 char *m_maildir(char *); 3202 char *m_maildir(char *);
3206 VE 3203 VE
3207 .P 3204 .P
3208 My investigation provides the following description: 3205 My investigation provides the following description:
3209 .BU 3206 .LI 1
3210 The second parameter of 3207 The second parameter of
3211 .Fu path() 3208 .Fu path()
3212 defines the type of path given as first parameter. 3209 defines the type of path given as first parameter.
3213 Directory paths are converted to absolute directory paths. 3210 Directory paths are converted to absolute directory paths.
3214 Folder paths are converted to absolute folder paths. 3211 Folder paths are converted to absolute folder paths.
3215 Folder paths must not include a leading `@' character. 3212 Folder paths must not include a leading `@' character.
3216 Leading plus characters are preserved. 3213 Leading plus characters are preserved.
3217 The result is a pointer to newly allocated memory. 3214 The result is a pointer to newly allocated memory.
3218 .BU 3215 .LI 2
3219 .Fu pluspath() 3216 .Fu pluspath()
3220 is a convenience-wrapper to 3217 is a convenience-wrapper to
3221 .Fu path() , 3218 .Fu path() ,
3222 to convert folder paths only. 3219 to convert folder paths only.
3223 This function can not be used for directory paths. 3220 This function can not be used for directory paths.
3224 An empty string parameter causes a buffer overflow. 3221 An empty string parameter causes a buffer overflow.
3225 .BU 3222 .LI 3
3226 .Fu m_mailpath() 3223 .Fu m_mailpath()
3227 converts directory paths to absolute directory paths. 3224 converts directory paths to absolute directory paths.
3228 The characters `+' or `@' at the beginning of the path name are 3225 The characters `+' or `@' at the beginning of the path name are
3229 treated literal, i.e. as the first character of a relative directory path. 3226 treated literal, i.e. as the first character of a relative directory path.
3230 Hence, this function can not be used for folder paths. 3227 Hence, this function can not be used for folder paths.
3231 In any case, the result is an absolute directory path. 3228 In any case, the result is an absolute directory path.
3232 The result is a pointer to newly allocated memory. 3229 The result is a pointer to newly allocated memory.
3233 .BU 3230 .LI 4
3234 .Fu m_maildir() 3231 .Fu m_maildir()
3235 returns the parameter unchanged if it is an absolute directory path 3232 returns the parameter unchanged if it is an absolute directory path
3236 or begins with the entry `.' or `..'. 3233 or begins with the entry `.' or `..'.
3237 All other strings are prepended with the current working directory. 3234 All other strings are prepended with the current working directory.
3238 Hence, this functions can not be used for folder paths. 3235 Hence, this functions can not be used for folder paths.
3267 prefixed with a dot character. 3264 prefixed with a dot character.
3268 In consequence, the dot character could no longer be an alias for the 3265 In consequence, the dot character could no longer be an alias for the
3269 current message. 3266 current message.
3270 .Ci cff0e16925e7edbd25b8b9d6d4fbdf03e0e60c01 3267 .Ci cff0e16925e7edbd25b8b9d6d4fbdf03e0e60c01
3271 Third, I created three new functions to replace the previous mess: 3268 Third, I created three new functions to replace the previous mess:
3272 .BU 3269 .LI 1
3273 .Fu expandfol() 3270 .Fu expandfol()
3274 converts folder paths to absolute folder paths, 3271 converts folder paths to absolute folder paths,
3275 without the leading plus character. 3272 without the leading plus character.
3276 Directory paths are simply passed through. 3273 Directory paths are simply passed through.
3277 This function is to be used for folder paths only, thus the name. 3274 This function is to be used for folder paths only, thus the name.
3278 The result is a pointer to static memory. 3275 The result is a pointer to static memory.
3279 .BU 3276 .LI 2
3280 .Fu expanddir() 3277 .Fu expanddir()
3281 converts directory paths to absolute directory paths. 3278 converts directory paths to absolute directory paths.
3282 Folder paths are treated as relative directory paths. 3279 Folder paths are treated as relative directory paths.
3283 This function is to be used for directory paths only, thus the name. 3280 This function is to be used for directory paths only, thus the name.
3284 The result is a pointer to static memory. 3281 The result is a pointer to static memory.
3285 .BU 3282 .LI 3
3286 .Fu toabsdir() 3283 .Fu toabsdir()
3287 converts any type of path to an absolute directory path. 3284 converts any type of path to an absolute directory path.
3288 This is the function of choice for path conversion. 3285 This is the function of choice for path conversion.
3289 Absolute directory paths are the most general representation of a 3286 Absolute directory paths are the most general representation of a
3290 path name. 3287 path name.
3483 when you run mh commands in a script, you want all the defaults to be 3480 when you run mh commands in a script, you want all the defaults to be
3484 what the man page says. 3481 what the man page says.
3485 when you run a command by hand, then you want your own defaults... 3482 when you run a command by hand, then you want your own defaults...
3486 .QE 3483 .QE
3487 .LP 3484 .LP
3488 Yet, I consider this explanation short-sighted. 3485 Yet, I consider this explanation shortsighted.
3489 We should rather regard theses two cases as just two different MH setups, 3486 We should rather regard theses two cases as just two different MH setups,
3490 based on two different profiles. 3487 based on two different profiles.
3491 Mapping such problems on the concepts of switching between different 3488 Mapping such problems on the concepts of switching between different
3492 profiles, solves them once for all. 3489 profiles, solves them once for all.
3493 .P 3490 .P
3743 as well. 3740 as well.
3744 As the mail storage and the configuration were not separated sensibly 3741 As the mail storage and the configuration were not separated sensibly
3745 in the first place, I did it now. 3742 in the first place, I did it now.
3746 .P 3743 .P
3747 Personal mmh data is grouped by type, resulting in two distinct parts: 3744 Personal mmh data is grouped by type, resulting in two distinct parts:
3748 The mail storage and the configuration. 3745 the mail storage and the configuration.
3749 In mmh, the mail storage directory still contains all the messages, 3746 In mmh, the mail storage directory still contains all the messages,
3750 but, in exception of public sequences files, nothing else. 3747 but, in exception of public sequences files, nothing else.
3751 In difference to nmh, the auxiliary configuration files are no longer 3748 In difference to nmh, the auxiliary configuration files are no longer
3752 located there. 3749 located there.
3753 Therefore, the directory is no longer called the user's \fIMH directory\fP 3750 Therefore, the directory is no longer called the user's \fIMH directory\fP
3923 This saved the need to execute these programs with 3920 This saved the need to execute these programs with
3924 .Fu fork() 3921 .Fu fork()
3925 and 3922 and
3926 .Fu exec() , 3923 .Fu exec() ,
3927 two expensive system calls. 3924 two expensive system calls.
3928 Whereis this approach improved the time performance, 3925 Whereas this approach improved the time performance,
3929 it interweaved the source code. 3926 it interwove the source code.
3930 Core functionalities were not encapsulated into programs but into 3927 Core functionalities were not encapsulated into programs but into
3931 function, which were then wrapped by programs. 3928 function, which were then wrapped by programs.
3932 For example, 3929 For example,
3933 .Fn uip/annosbr.c 3930 .Fn uip/annosbr.c
3934 included the function 3931 included the function
3967 but the code reader needed to read all of the code first to know which 3964 but the code reader needed to read all of the code first to know which
3968 parts were used. 3965 parts were used.
3969 .P 3966 .P
3970 As I have read a lot in the code base during the last two years, 3967 As I have read a lot in the code base during the last two years,
3971 I learned about the easy and the difficult parts. 3968 I learned about the easy and the difficult parts.
3972 Code is easy to understand if: 3969 Code is easy to understand if the influenced code area is small
3973 .BU 3970 and its boundaries are strictly defined.
3974 The influenced code area is small. 3971 Further more, the code needs to solve the problem in a straight-forward way.
3975 .BU
3976 The boundaries are strictly defined.
3977 .BU
3978 The code is written straight-forward.
3979 .P 3972 .P
3980 .\" XXX move this paragraph somewhere else? 3973 .\" XXX move this paragraph somewhere else?
3981 Reading 3974 Reading
3982 .Pn rmm 's 3975 .Pn rmm 's
3983 source code in 3976 source code in
4107 By changing the command line interfaces of tools, it is 4100 By changing the command line interfaces of tools, it is
4108 the developer's job to adjust the invocations of these tools as well. 4101 the developer's job to adjust the invocations of these tools as well.
4109 As this is a manual task and regression tests, which could detect such 4102 As this is a manual task and regression tests, which could detect such
4110 problems, are not available yet, it is prone to errors. 4103 problems, are not available yet, it is prone to errors.
4111 These errors will not be detected at compile time but at run time. 4104 These errors will not be detected at compile time but at run time.
4112 Installing regression tests is a task left to do. 4105 Installing regression tests is a pending task.
4113 In the best case, a uniform way of invoking tools from other tools 4106 In the best case, a uniform way of invoking tools from other tools
4114 can be developed to allow automated testing at compile time. 4107 can be developed to allow automated testing at compile time.
4115 4108
4116 4109
4117 .ig 4110 .ig