docs/unix-phil

view unix-phil.ms @ 54:0a435d76b868

applied corrections by Dieter@be; and did spell checking
author meillo@marmaro.de
date Thu, 15 Apr 2010 13:53:12 +0200
parents 14f5ff66ad8a
children acd63ecc3606
line source
1 .so style
3 .TL
4 .ps +4
5 Why the Unix Philosophy still matters
6 .AU
7 markus schnalke <meillo@marmaro.de>
8 .AB
9 .ti \n(.iu
10 This paper explains the importance of the Unix Philosophy for software design.
11 Today, few software designers are aware of these concepts,
12 and thus a lot of modern software is more limited than necessary
13 and makes less use of software leverage than possible.
14 Knowing and following the guidelines of the Unix Philosophy makes software more valuable.
15 .AE
17 .FS
18 .ps -1
19 This paper was prepared for the ``Software Analysis'' seminar at University Ulm.
20 Mentor was professor Franz Schweiggert.
21 Handed in on 2010-04-12.
22 You may retrieve this document from
23 .CW \s-1http://marmaro.de/docs \ .
24 .FE
26 .H 1 Introduction
27 .LP
28 The Unix Philosophy is the essence of how the Unix operating system,
29 especially its toolchest, was designed.
30 It is no limited set of fixed rules,
31 but a loose set of guidelines which tell how to write software that
32 suites well into Unix.
33 Actually, the Unix Philosophy describes what is common to typical Unix software.
34 The Wikipedia has an accurate definition:
35 .[
36 wikipedia
37 unix philosophy
38 .]
39 .QP
40 The \fIUnix philosophy\fP is a set of cultural norms and philosophical
41 approaches to developing software based on the experience of leading
42 developers of the Unix operating system.
43 .PP
44 As there is no single definition of the Unix Philosophy,
45 several people have stated their view on what it comprises.
46 Best known are:
47 .IP \(bu
48 Doug McIlroy's summary: ``Write programs that do one thing and do it well.''
49 .[
50 mahoney
51 oral history
52 .]
53 .IP \(bu
54 Mike Gancarz' book ``The UNIX Philosophy''.
55 .[
56 gancarz
57 unix philosophy
58 .]
59 .IP \(bu
60 Eric S. Raymond's book ``The Art of UNIX Programming''.
61 .[
62 raymond
63 art of unix programming
64 .]
65 .LP
66 These different views on the Unix Philosophy have much in common.
67 Especially, the main concepts are similar in all of them.
68 McIlroy's definition can surely be called the core of the Unix Philosophy,
69 but the fundamental idea behind it all, is ``small is beautiful''.
71 .PP
72 The Unix Philosophy explains how to design good software for Unix.
73 Many concepts described here, base on facilities of Unix.
74 Other operating systems may not offer such facilities,
75 hence it may not be possible to design software in the way of the
76 Unix Philosophy for them.
77 .PP
78 The Unix Philosophy has an idea of how the process of software development
79 should look like, but large parts of the philosophy are quite independent
80 from a concrete development process.
81 However, one will soon recognize that some development processes work well
82 with the ideas of the Unix Philosophy and support them, while others are
83 at cross-purposes.
84 Kent Beck's books about Extreme Programming are valuable supplemental
85 resources on this topic.
86 .PP
87 The question of how to actually write code and how the code should looks
88 like in detail, are out of focus here.
89 ``The Practice of Programming'' by Kernighan and Pike,
90 .[
91 kernighan pike
92 practice of programming
93 .]
94 is a good book that covers this topic.
95 Its point of view matches to the one of this paper.
97 .H 1 "Importance of software design in general
98 .LP
99 Software design is the planning of how the internal structure
100 and external interfaces of software should look like.
101 It has nothing to do with visual appearance.
102 If we take a program as a car, then its color is of no matter.
103 Its design would be the car's size, its shape, the locations of doors,
104 the passenger/space ratio, the available controls and instruments,
105 and so forth.
106 .PP
107 Why should software get designed at all?
108 It is general knowledge, that even a bad plan is better than no plan.
109 Not designing software means programming without plan.
110 This will pretty sure lead to horrible results.
111 Software that is horrible to use and horrible to maintain.
112 These two aspects are the visible ones.
113 Often invisible though, are the wasted possible gains.
114 Good software design can make these gains available.
115 .PP
116 Software design deals with quality properties.
117 Good design leads to good quality, and quality is important.
118 Any car may be able to drive from A to B,
119 but it depends on the car's properties whether it is a good choice
120 for passenger transport or not.
121 It depends on its properties if it is a good choice
122 for a rough mountain area.
123 And it depends on its properties if the ride will be fun.
125 .PP
126 Requirements for software are twofold:
127 functional and non-functional.
128 .IP \(bu
129 Functional requirements define directly the software's functions.
130 They are the reason why software gets written.
131 Someone has a problem and needs a tool to solve it.
132 Being able to solve the problem is the main functional goal.
133 It is the driving force behind all programming effort.
134 Functional requirements are easier to define and to verify.
135 .IP \(bu
136 Non-functional requirements are called \fIquality\fP requirements, too.
137 The quality of software are the properties that are not directly related to
138 the software's basic functions.
139 Tools of bad quality often do solve the problems they were written for,
140 but introduce problems and difficulties for usage and development, later on.
141 Quality aspects are often overlooked at first sight,
142 and are often difficult to define clearly and to verify.
143 .PP
144 Quality is hardly interesting when software gets built initially,
145 but it has a high impact on usability and maintenance, later.
146 A short-sighted might see in developing software, mainly building something up.
147 But experience shows, that building software the first time is
148 only a small amount of the overall work.
149 Bug fixing, extending, rebuilding of parts \(en maintenance work \(en
150 does soon take over the major part of the time spent on a software project.
151 And of course, the time spent actually using the software.
152 These processes are highly influenced by the software's quality.
153 Thus, quality must not be neglected.
154 However, the problem with quality is that you hardly ``stumble over''
155 bad quality during the first build,
156 although this is the time when you should care about good quality most.
157 .PP
158 Software design has little to do with the basic function of software \(en
159 this requirement will get satisfied anyway.
160 Software design is more about quality aspects of software.
161 Good design leads to good quality, bad design to bad quality.
162 The primary functions of software will be affected modestly by bad quality,
163 but good quality can provide a lot of additional gain,
164 even at places where one never expected it.
165 .PP
166 The ISO/IEC\|9126-1 standard, part\|1,
167 .[
168 iso product quality
169 .]
170 defines the quality model as consisting out of:
171 .IP \(bu
172 .I Functionality
173 (suitability, accuracy, inter\%operability, security)
174 .IP \(bu
175 .I Reliability
176 (maturity, fault tolerance, recoverability)
177 .IP \(bu
178 .I Usability
179 (understandability, learnability, operability, attractiveness)
180 .IP \(bu
181 .I Efficiency
182 (time behavior, resource utilization)
183 .IP \(bu
184 .I Maintainability
185 (analyzability, changeability, stability, testability)
186 .IP \(bu
187 .I Portability
188 (adaptability, installability, co-existence, replaceability)
189 .LP
190 Good design can improve these properties of software,
191 bad designed software likely suffers in these points.
192 .PP
193 One further goal of software design is consistency.
194 Consistency eases understanding, working on, and using things.
195 Consistent internal structure and consistent interfaces to the outside
196 can be provided by good design.
197 .PP
198 Software should be well designed because good design avoids many
199 problems during a software project's lifetime.
200 And software should be well designed because good design can offer
201 much additional gain.
202 Indeed, much effort should be spent into good design to make software more valuable.
203 The Unix Philosophy shows a way of how to design software well.
204 It offers guidelines to achieve good quality and high gain for the effort spent.
207 .H 1 "The Unix Philosophy
208 .LP
209 The origins of the Unix Philosophy were already introduced.
210 This chapter explains the philosophy, oriented on Gancarz,
211 and shows concrete examples of its application.
213 .H 2 Pipes
214 .LP
215 Following are some examples to demonstrate how applied Unix Philosophy feels like.
216 Knowledge of using the Unix shell is assumed.
217 .PP
218 Counting the number of files in the current directory:
219 .DS
220 ls | wc -l
221 .DE
222 The
223 .CW ls
224 command lists all files in the current directory, one per line,
225 and
226 .CW "wc -l
227 counts the number of lines.
228 .PP
229 Counting the number of files that do not contain ``foo'' in their name:
230 .DS
231 ls | grep -v foo | wc -l
232 .DE
233 Here, the list of files is filtered by
234 .CW grep
235 to remove all lines that contain ``foo''.
236 The rest equals the previous example.
237 .PP
238 Finding the five largest entries in the current directory.
239 .DS
240 du -s * | sort -nr | sed 5q
241 .DE
242 .CW "du -s *
243 returns the recursively summed sizes of all files in the current directory
244 \(en no matter if they are regular files or directories.
245 .CW "sort -nr
246 sorts the list numerically in reverse order (descending).
247 Finally,
248 .CW "sed 5q
249 quits after it has printed the fifth line.
250 .PP
251 The presented command lines are examples of what Unix people would use
252 to get the desired output.
253 There are also other ways to get the same output.
254 It's a user's decision which way to go.
255 .PP
256 The examples show that many tasks on a Unix system
257 are accomplished by combining several small programs.
258 The connection between the single programs is denoted by the pipe operator `|'.
259 .PP
260 Pipes, and their extensive and easy use, are one of the great
261 achievements of the Unix system.
262 Pipes between programs have been possible in earlier operating systems,
263 but it has never been a so central part of the concept.
264 When, in the early seventies, Doug McIlroy introduced pipes into the
265 Unix system,
266 ``it was this concept and notation for linking several programs together
267 that transformed Unix from a basic file-sharing system to an entirely new way of computing.''
268 .[
269 aughenbaugh
270 unix oral history
271 .]
272 .PP
273 Being able to specify pipelines in an easy way is,
274 however, not enough by itself.
275 It is only one half.
276 The other is the design of the programs that are used in the pipeline.
277 They need interfaces that allow them to be used in such a way.
279 .H 2 "Interface design
280 .LP
281 Unix is, first of all, simple \(en Everything is a file.
282 Files are sequences of bytes, without any special structure.
283 Programs should be filters, which read a stream of bytes from standard input (stdin)
284 and write a stream of bytes to standard output (stdout).
285 If the files \fIare\fP sequences of bytes,
286 and the programs \fIare\fP filters on byte streams,
287 then there is exactly one data interface.
288 Hence it is possible to combine programs in any desired way.
289 .PP
290 Even a handful of small programs yields a large set of combinations,
291 and thus a large set of different functions.
292 This is leverage!
293 If the programs are orthogonal to each other \(en the best case \(en
294 then the set of different functions is greatest.
295 .PP
296 Programs can also have a separate control interface,
297 besides their data interface.
298 The control interface is often called ``user interface'',
299 because it is usually designed to be used by humans.
300 The Unix Philosophy discourages to assume the user to be human.
301 Interactive use of software is slow use of software,
302 because the program waits for user input most of the time.
303 Interactive software requires the user to be in front of the computer.
304 Interactive software occupy the user's attention while they are running.
305 .PP
306 Now to come back to the idea of combining several small programs,
307 to have a more specific function.
308 If these single tools would all be interactive,
309 how would the user control them?
310 It is not only a problem to control several programs at once,
311 if they run at the same time,
312 it also very inefficient to have to control each of the single programs
313 that are intended to act as one large program.
314 Hence, the Unix Philosophy discourages programs to demand interactive use.
315 The behavior of programs should be defined at invocation.
316 This is done by specifying arguments to the program call
317 (command line switches).
318 Gancarz discusses this topic as ``avoid captive user interfaces''.
319 .[ [
320 gancarz unix philosophy
321 .], page 88 ff.]
322 .PP
323 Non-interactive use is, during development, also an advantage for testing.
324 Testing of interactive programs is much more complicated,
325 than testing of non-interactive programs.
327 .H 2 "The toolchest approach
328 .LP
329 A toolchest is a set of tools.
330 Instead of having one big tool for all tasks, one has many small tools,
331 each for one task.
332 Difficult tasks are solved by combining several of the small, simple tools.
333 .PP
334 The Unix toolchest \fIis\fP a set of small, (mostly) non-interactive programs
335 that are filters on byte streams.
336 They are, to a large extent, unrelated in their function.
337 Hence, the Unix toolchest provides a large set of functions
338 that can be accessed by combining the programs in the desired way.
339 .PP
340 There are also advantages for developing small toolchest programs.
341 It is easier and less error-prone to write small programs.
342 It is also easier and less error-prone to write a large set of small programs,
343 than to write one large program with all the functionality included.
344 If the small programs are combinable, then they offer even a larger set
345 of functions than the single large program.
346 Hence, one gets two advantages out of writing small, combinable programs:
347 They are easier to write and they offer a greater set of functions through
348 combination.
349 .PP
350 But there are also two main drawbacks of the toolchest approach.
351 First, one simple, standardized interface has to be sufficient.
352 If one feels the need for more ``logic'' than a stream of bytes,
353 then a different approach might be of need.
354 But it is also possible, that he just can not imagine a design where
355 a stream of bytes is sufficient.
356 By becoming more familiar with the ``Unix style of thinking'',
357 developers will more often and easier find simple designs where
358 a stream of bytes is a sufficient interface.
359 .PP
360 The second drawback of a toolchest affects the users.
361 A toolchest is often more difficult to use.
362 It is necessary to become familiar with each of the tools,
363 to be able to use the right one in a given situation.
364 Additionally, one needs to combine the tools in a sensible way himself.
365 This is like a sharp knife \(en it is a powerful tool in the hand of a
366 master, but of no good value in the hand of an unskilled.
367 However, learning single, small tools of a toolchest is easier than
368 learning a complex tool.
369 And the user will already have a basic understanding of a yet unknown tool,
370 if the tools of a toolchest have a common, consistent style.
371 He will be able to transfer knowledge over from one tool to another.
372 .PP
373 Moreover, the second drawback can be removed to a large extent
374 by adding wrappers around the basic tools.
375 Novice users do not need to learn several tools, if a professional wraps
376 complete command lines into a higher-level script.
377 Note that the wrapper script still calls the small tools;
378 it is just like a skin around them.
379 No complexity is added this way.
380 But new programs can get created out of existing one with very low effort.
381 .PP
382 A wrapper script for finding the five largest entries in the current directory
383 could look like this:
384 .DS
385 #!/bin/sh
386 du -s * | sort -nr | sed 5q
387 .DE
388 The script itself is just a text file that calls the command line,
389 which a professional user would type in directly.
390 It is probably worth to make the program flexible on the number of
391 entries it prints:
392 .DS
393 #!/bin/sh
394 num=5
395 [ $# -eq 1 ] && num="$1"
396 du -sh * | sort -nr | sed "${num}q"
397 .DE
398 This script acts like the one before, when called without an argument.
399 But one can also specify a numerical argument to define the number of lines to print.
400 One can surely imagine even more flexible versions, however,
401 they will still relay on the external programs,
402 which do the actual work.
404 .H 2 "A powerful shell
405 .LP
406 The Unix shell provides the possibility to combine small programs into large ones.
407 But a powerful shell is a great feature in other ways, too.
408 For instance by being scriptable.
409 Control statements are built into the shell.
410 The functions, however, are the normal programs of the system.
411 Thus, as the programs are already known,
412 learning to program in the shell becomes easy.
413 Using normal programs as functions in the shell programming language
414 is only possible because they are small and combinable tools in a toolchest style.
415 .PP
416 The Unix shell encourages to write small scripts,
417 by combining existing programs, because it is so easy to do.
418 This is a great step towards automation.
419 It is wonderful if the effort to automate a task equals the effort
420 to do the task a second time by hand.
421 If this holds,
422 then the user will be happy to automate everything he does more than once.
423 .PP
424 Small programs that do one job well, standardized interfaces between them,
425 a mechanism to combine parts to larger parts, and an easy way to automate tasks,
426 this will inevitably produce software leverage.
427 Getting multiple times the benefit of an investment is a great offer.
428 .PP
429 The shell also encourages rapid prototyping.
430 Many well known programs started as quickly hacked shell scripts,
431 and turned into ``real'' programs, written in C, later.
432 Building a prototype first, is a way to avoid the biggest problems
433 in application development.
434 Fred Brooks explains in ``No Silver Bullet'':
435 .[
436 brooks
437 no silver bullet
438 .]
439 .QP
440 The hardest single part of building a software system is deciding precisely what to build.
441 No other part of the conceptual work is so difficult as establishing the detailed
442 technical requirements, [...].
443 No other part of the work so cripples the resulting system if done wrong.
444 No other part is more difficult to rectify later.
445 .PP
446 Writing a prototype is a great method for becoming familiar with the requirements
447 and to run into real problems early.
448 .[ [
449 gancarz
450 unix philosophy
451 .], page 28 f.]
452 .PP
453 Prototyping is often seen as a first step in building software.
454 This is, of course, good.
455 However, the Unix Philosophy has an \fIadditional\fP perspective on prototyping:
456 After having built the prototype, one might notice, that the prototype is already
457 \fIgood enough\fP.
458 Hence, no reimplementation, in a more sophisticated programming language,
459 might be of need, at least for the moment.
460 Maybe later, it might be necessary to rewrite the software, but not now.
461 By delaying further work, one keeps the flexibility to react on
462 changing requirements.
463 Software parts that are not written will not miss the requirements.
465 .H 2 "Worse is better
466 .LP
467 The Unix Philosophy aims for the 90% solution;
468 others call it the ``Worse is better'' approach.
469 Experience from real life projects shows:
470 .PP
471 (1) It is almost never possible to define the
472 requirements completely and correctly the first time.
473 Hence one should not try to; one will fail anyway.
474 .PP
475 (2) Requirements change during time.
476 Hence it is best to delay requirement-based design decisions as long as possible.
477 Software should be small and flexible as long as possible
478 to react on changing requirements.
479 Shell scripts, for example, are more easily adjusted as C programs.
480 .PP
481 (3) Maintenance work is hard work.
482 Hence, one should keep the amount of code as small as possible;
483 it should just fulfill the \fIcurrent\fP requirements.
484 Software parts that will be written in future,
485 do not need maintenance till then.
486 .PP
487 See Brooks' ``The Mythical Man-Month'' for reference.
488 .[ [
489 brooks
490 mythical man-month
491 .], page 115 ff.]
492 .PP
493 Starting with a prototype in a scripting language has several advantages:
494 .IP \(bu
495 As the initial effort is low, one will likely start right away.
496 .IP \(bu
497 As working parts are available soon, the real requirements can get identified soon.
498 .IP \(bu
499 When software is usable and valuable, it gets used, and thus tested.
500 Hence problems will be found at early stages of the development.
501 .IP \(bu
502 The prototype might be enough for the moment,
503 thus further work can get delayed to a time
504 when one knows better about the requirements and problems,
505 than now.
506 .IP \(bu
507 Implementing now only the parts that are actually needed at the moment,
508 introduces fewer programming and maintenance work.
509 .IP \(bu
510 If the global situation changes so that the software is not needed anymore,
511 then less effort was spent into the project, than it would have be
512 when a different approach had been used.
514 .H 2 "Upgrowth and survival of software
515 .LP
516 So far it was talked about \fIwriting\fP or \fIbuilding\fP software.
517 Although these are just verbs, they do imply a specific view on the work process
518 they describe.
519 The better verb, however, is to \fIgrow\fP.
520 Creating software in the sense of the Unix Philosophy is an incremental process.
521 It starts with a first prototype, which evolves as requirements change.
522 A quickly hacked shell script might become a large, sophisticated,
523 compiled program this way.
524 Its lifetime begins with the initial prototype and ends when the software is not used anymore.
525 While being alive it will get extended, rearranged, rebuilt.
526 Growing software matches the view that ``software is never finished. It is only released.''
527 .[ [
528 gancarz
529 unix philosophy
530 .], page 26]
531 .PP
532 Software can be seen as being controlled by evolutionary processes.
533 Successful software is software that is used by many for a long time.
534 This implies that the software is needed, useful, and better than alternatives.
535 Darwin talks about: ``The survival of the fittest.''
536 .[
537 darwin
538 origin of species
539 .]
540 Transferred to software: The most successful software, is the fittest,
541 is the one that survives.
542 (This may be at the level of one creature, or at the level of one species.)
543 The fitness of software is affected mainly by four properties:
544 portability of code, portability of data, range of usability, and reusability of parts.
545 .PP
546 (1)
547 .I "Portability of code
548 means, using high-level programming languages,
549 sticking to the standard,
550 .[ [
551 kernighan pike
552 practice of programming
553 .], chapter\|8]
554 and avoiding optimizations that introduce dependencies on specific hardware.
555 Hardware has a much lower lifetime than software.
556 By chaining software to a specific hardware,
557 its lifetime gets shortened to that of this hardware.
558 In contrast, software should be easy to port \(en
559 adaptation is the key to success.
560 .PP
561 (2)
562 .I "Portability of data
563 is best achieved by avoiding binary representations
564 to store data, because binary representations differ from machine to machine.
565 Textual representation is favored.
566 Historically, \s-1ASCII\s0 was the charset of choice.
567 For the future, \s-1UTF\s0-8 might be the better choice.
568 Important is that it is a plain text representation in a
569 very common charset encoding.
570 Apart from being able to transfer data between machines,
571 readable data has the great advantage, that humans are able to directly
572 read and edit it with text editors and other tools from the Unix toolchest.
573 .[ [
574 gancarz
575 unix philosophy
576 .], page 56 ff.]
577 .PP
578 (3)
579 A large
580 .I "range of usability
581 ensures good adaptation, and thus good survival.
582 It is a special distinction if software becomes used in fields of action,
583 the original authors did never imagine.
584 Software that solves problems in a general way will likely be used
585 for many kinds of similar problems.
586 Being too specific limits the range of usability.
587 Requirements change through time, thus use cases change or even vanish.
588 As a good example in this point,
589 Allman identifies flexibility to be one major reason for sendmail's success:
590 .[
591 allman
592 sendmail
593 .]
594 .QP
595 Second, I limited myself to the routing function [...].
596 This was a departure from the dominant thought of the time, [...].
597 .QP
598 Third, the sendmail configuration file was flexible enough to adapt
599 to a rapidly changing world [...].
600 .LP
601 Successful software adapts itself to the changing world.
602 .PP
603 (4)
604 .I "Reuse of parts
605 is even one step further.
606 Software may completely lose its field of action,
607 but parts of which the software is built may be general and independent enough
608 to survive this death.
609 If software is built by combining small independent programs,
610 then these parts are readily available for reuse.
611 Who cares if the large program is a failure,
612 but parts of it become successful instead?
614 .H 2 "Summary
615 .LP
616 This chapter explained central ideas of the Unix Philosophy.
617 For each of the ideas, the advantages they introduce were explained.
618 The Unix Philosophy are guidelines that help to write more valuable software.
619 From the view point of a software developer or software designer,
620 the Unix Philosophy provides answers to many software design problem.
621 .PP
622 The various ideas of the Unix Philosophy are very interweaved
623 and can hardly be applied independently.
624 However, the probably most important messages are:
625 .I "``Keep it simple!''" ,
626 .I "``Do one thing well!''" ,
627 and
628 .I "``Use software leverage!''
632 .H 1 "Case study: \s-1MH\s0
633 .LP
634 The previous chapter introduced and explained the Unix Philosophy
635 from a general point of view.
636 The driving force were the guidelines; references to
637 existing software were given only sparsely.
638 In this and the next chapter, concrete software will be
639 the driving force in the discussion.
640 .PP
641 This first case study is about the mail user agents (\s-1MUA\s0)
642 \s-1MH\s0 (``mail handler'') and its descendant \fInmh\fP
643 (``new mail handler'').
644 .[
645 nmh website
646 .]
647 \s-1MUA\s0s provide functions to read, compose, and organize mail,
648 but (ideally) not to transfer it.
649 In this document, the name \s-1MH\s0 will be used to include nmh.
650 A distinction will only be made if differences between
651 \s-1MH\s0 and nmh are described.
654 .H 2 "Historical background
655 .LP
656 Electronic mail was available in Unix very early.
657 The first \s-1MUA\s0 on Unix was \f(CWmail\fP,
658 which was already present in the First Edition.
659 .[ [
660 salus
661 quarter century of unix
662 .], page 41 f.]
663 It was a small program that either printed the user's mailbox file
664 or appended text to someone else's mailbox file,
665 depending on the command line arguments.
666 .[
667 manual mail(1)
668 .]
669 It was a program that did one job well.
670 This job was emailing, which was very simple then.
671 .PP
672 Later, emailing became more powerful, and thus more complex.
673 The simple \f(CWmail\fP, which knew nothing of subjects,
674 independent handling of single messages,
675 and long-time email storage, was not powerful enough anymore.
676 In 1978 at Berkeley, Kurt Shoens wrote \fIMail\fP (with capital `M')
677 to provide additional functions for emailing.
678 Mail was still one program, but now it was large and did
679 several jobs.
680 Its user interface is modeled after the one of \fIed\fP.
681 It is designed for humans, but is still scriptable.
682 \fImailx\fP is the adaptation of Berkeley Mail into System V.
683 .[
684 ritter
685 mailx history
686 .]
687 Elm, pine, mutt, and a whole bunch of graphical \s-1MUA\s0s
688 followed Mail's direction.
689 They are large, monolithic programs which include all emailing functions.
690 .PP
691 A different way was taken by the people of \s-1RAND\s0 Corporation.
692 In the beginning, they also had used a monolithic mail system,
693 called \s-1MS\s0 (for ``mail system'').
694 But in 1977, Stockton Gaines and Norman Shapiro
695 came up with a proposal of a new email system concept \(en
696 one that honored the Unix Philosophy.
697 The concept was implemented by Bruce Borden in 1978 and 1979.
698 This was the birth of \s-1MH\s0 \(en the ``mail handler''.
699 .PP
700 Since then, \s-1RAND\s0, the University of California at Irvine and
701 at Berkeley, and several others have contributed to the software.
702 However, it's core concepts remained the same.
703 In the late 90s, when development of \s-1MH\s0 slowed down,
704 Richard Coleman started with \fInmh\fP, the new mail handler.
705 His goal was to improve \s-1MH\s0 especially in regard of
706 the requirements of modern emailing.
707 Today, nmh is developed by various people on the Internet.
708 .[
709 ware
710 rand history
711 .]
712 .[
713 peek
714 mh
715 .]
717 .H 2 "Contrasts to monolithic mail systems
718 .LP
719 All \s-1MUA\s0s are monolithic, except \s-1MH\s0.
720 Although there might actually exist further, very little known,
721 toolchest \s-1MUA\s0s, this statement reflects the situation pretty well.
722 .PP
723 Monolithic \s-1MUA\s0s gather all their functions in one program.
724 In contrast, \s-1MH\s0 is a toolchest of many small tools \(en one for each job.
725 Following is a list of important programs of \s-1MH\s0's toolchest
726 and their function.
727 It gives a feeling of how the toolchest looks like.
728 .IP \(bu
729 .CW inc :
730 incorporate new mail (this is how mail enters the system)
731 .IP \(bu
732 .CW scan :
733 list messages in folder
734 .IP \(bu
735 .CW show :
736 show message
737 .IP \(bu
738 .CW next\fR/\fPprev :
739 show next/previous message
740 .IP \(bu
741 .CW folder :
742 change current folder
743 .IP \(bu
744 .CW refile :
745 refile message into different folder
746 .IP \(bu
747 .CW rmm :
748 remove message
749 .IP \(bu
750 .CW comp :
751 compose new message
752 .IP \(bu
753 .CW repl :
754 reply to message
755 .IP \(bu
756 .CW forw :
757 forward message
758 .IP \(bu
759 .CW send :
760 send prepared message (this is how mail leaves the system)
761 .LP
762 \s-1MH\s0 has no special user interface like monolithic \s-1MUA\s0s have.
763 The user does not leave the shell to run \s-1MH\s0,
764 instead he uses the various \s-1MH\s0 programs within the shell.
765 Using a monolithic program with a captive user interface
766 means ``entering'' the program, using it, and ``exiting'' the program.
767 Using toolchests like \s-1MH\s0 means running programs,
768 alone or in combination with others, also from other toolchests,
769 without leaving the shell.
771 .H 2 "Data storage
772 .LP
773 \s-1MH\s0's mail storage is a directory tree under the user's
774 \s-1MH\s0 directory (usually \f(CW$HOME/Mail\fP),
775 where mail folders are directories and mail messages are text files
776 within them.
777 Each mail folder contains a file \f(CW.mh_sequences\fP which lists
778 the public message sequences of that folder,
779 for instance the \fIunseen\fP sequence for new messages.
780 Mail messages are text files located in a mail folder.
781 The files contain the messages as they were received.
782 They are named by ascending numbers in each folder.
783 .PP
784 This mailbox format is called ``\s-1MH\s0'' after the \s-1MUA\s0.
785 Alternatives are \fImbox\fP and \fImaildir\fP.
786 In the mbox format all messages are stored within one file.
787 This was a good solution in the early days, when messages
788 were only a few lines of text and were deleted soon.
789 Today, when single messages often include several megabytes
790 of attachments, it is a bad solution.
791 Another disadvantage of the mbox format is that it is
792 more difficult to write tools that work on mail messages,
793 because it is always necessary to first find and extract
794 the relevant message in the mbox file.
795 With the \s-1MH\s0 mailbox format, each message is a separate file.
796 Also, the problem of concurrent access to one mailbox is
797 reduced to the problem of concurrent access to one message.
798 The maildir format is generally similar to the \s-1MH\s0 format,
799 but modified towards guaranteed reliability.
800 This involves some complexity, unfortunately.
801 .PP
802 Working with \s-1MH\s0's toolchest on mailboxes is much like
803 working with Unix' toolchest on directory trees:
804 \f(CWscan\fP is like \f(CWls\fP,
805 \f(CWshow\fP is like \f(CWcat\fP,
806 \f(CWfolder\fP is like \f(CWcd\fP and \f(CWpwd\fP,
807 \f(CWrefile\fP is like \f(CWmv\fP,
808 and \f(CWrmm\fP is like \f(CWrm\fP.
809 .PP
810 \s-1MH\s0 extends the context of processes in Unix by two more items,
811 for its tools:
812 .IP \(bu
813 The current mail folder, which is similar to the current working directory.
814 For mail folders, \f(CWfolder\fP provides the corresponding functionality
815 of \f(CWcd\fP and \f(CWpwd\fP for directories.
816 .IP \(bu
817 Sequences, which are named sets of messages in a mail folder.
818 The current message, relative to a mail folder, is a special sequence.
819 It enables commands like \f(CWnext\fP and \f(CWprev\fP.
820 .LP
821 In contrast to Unix' context, which is maintained by the kernel,
822 \s-1MH\s0's context must be maintained by the tools themselves.
823 Usually there is one context per user, which resides in his
824 \f(CWcontext\fP file in the \s-1MH\s0 directory,
825 but a user can have several contexts, too.
826 Public sequences are an exception, as they belong to a mail folder,
827 and reside in the \f(CW.mh_sequences\fP file there.
828 .[
829 man page mh-profile mh-sequence
830 .]
832 .H 2 "Discussion of the design
833 .LP
834 This section discusses \s-1MH\s0 in regard to the tenets
835 of the Unix Philosophy that Gancarz identified.
837 .PP
838 .B "Small is beautiful
839 and
840 .B "do one thing well
841 are two design goals that are directly visible in \s-1MH\s0.
842 Gancarz actually presents \s-1MH\s0 in his book as example under the
843 headline ``Making \s-1UNIX\s0 Do One Thing Well'':
844 .[ [
845 gancarz
846 unix philosophy
847 .], page 125 ff.]
848 .QP
849 [\s-1MH\s0] consists of a series of programs which
850 when combined give the user an enormous ability
851 to manipulate electronic mail messages.
852 A complex application, it shows that not only is it
853 possible to build large applications from smaller
854 components, but also that such designs are actually preferable.
855 .LP
856 The various programs of \s-1MH\s0 were relatively easy to write,
857 because each of them is small, limited to one function,
858 and has clear boundaries.
859 For the same reasons, they are also good to maintain.
860 Further more, the system can easily get extended.
861 One only needs to put a new program into the toolchest.
862 This was done, for instance, when \s-1MIME\s0 support was added
863 (e.g. \f(CWmhbuild\fP).
864 Also, different programs can exist to do the basically same job
865 in different ways (e.g. in nmh: \f(CWshow\fP and \f(CWmhshow\fP).
866 .PP
867 If someone needs a mail system with some additionally
868 functions that are not available anywhere yet, he best expands a
869 toolchest system like \s-1MH\s0.
870 There he can add new functionality by simply adding additional
871 programs to the toolchest.
872 There he does not risk to break existing functionality by doing so.
874 .PP
875 .B "Store data in flat text files
876 is followed by \s-1MH\s0.
877 This is not surprising, because email messages are already plain text.
878 \s-1MH\s0 stores the messages as it receives them,
879 thus any other tool that works on \s-1RFC\s0\|2822 mail messages can operate
880 on the messages in an \s-1MH\s0 mailbox.
881 All other files \s-1MH\s0 uses are plain text, too.
882 It is therefore possible and encouraged to use the text processing
883 tools of Unix' toolchest to extend \s-1MH\s0's toolchest.
885 .PP
886 .B "Avoid captive user interfaces" .
887 \s-1MH\s0 is perfectly suited for non-interactive use.
888 It offers all functions directly and without captive user interfaces.
889 If, nonetheless, users want a graphical user interface,
890 they can have it with \fIxmh\fP, \fIexmh\fP,
891 or with the Emacs interface \fImh-e\fP.
892 These are frontends for the \s-1MH\s0 toolchest.
893 This means, all email-related work is still done by \s-1MH\s0 tools,
894 but the frontend calls the appropriate commands when the user
895 clicks on buttons or pushes a key.
896 .PP
897 Providing easy-to-use user interfaces in form of frontends is a good
898 approach, because it does not limit the power of the backend itself.
899 The frontend will anyway only be able to make a subset of the
900 backend's power and flexibility available to the user.
901 But if it is a separate program,
902 then the missing parts can still be accessed at the backend directly.
903 If it is integrated, then this will hardly be possible.
904 An additional advantage is the possibility to have different frontends
905 to the same backend.
907 .PP
908 .B "Choose portability over efficiency
909 and
910 .B "use shell scripts to increase leverage and portability" .
911 These two tenets are indirectly, but nicely, demonstrated by
912 Bolsky and Korn in their book about the Korn Shell.
913 .[
914 bolsky korn
915 korn shell
916 .]
917 Chapter\|18 of the book shows a basic implementation
918 of a subset of \s-1MH\s0 in ksh scripts.
919 Of course, this is just a demonstration, but a brilliant one.
920 It shows how quickly one can implement such a prototype with shell scripts,
921 and how readable they are.
922 The implementation in the scripting language may not be very fast,
923 but it can be fast enough though, and this is all that matters.
924 By having the code in an interpreted language, like the shell,
925 portability becomes a minor issue, if we assume the interpreter
926 to be widespread.
927 .PP
928 This demonstration also shows how easy it is to create single programs
929 of a toolchest software.
930 Eight tools (two of them have multiple names) and 16 functions
931 with supporting code are presented to the reader.
932 The tools comprise less than 40 lines of ksh each,
933 in total about 200 lines.
934 The functions comprise less than 80 lines of ksh each,
935 in total about 450 lines.
936 Such small software is easy to write, easy to understand,
937 and thus easy to maintain.
938 A toolchest improves the possibility to only write some parts
939 and though create a working result.
940 Expanding the toolchest, even without global changes,
941 will likely be possible.
943 .PP
944 .B "Use software leverage to your advantage
945 and the lesser tenet
946 .B "allow the user to tailor the environment
947 are ideally followed in the design of \s-1MH\s0.
948 Tailoring the environment is heavily encouraged by the ability to
949 directly define default options to programs.
950 It is even possible to define different default options
951 depending on the name under which a program is called.
952 Software leverage is heavily encouraged by the ease of
953 creating shell scripts that run a specific command line,
954 built of several \s-1MH\s0 programs.
955 There is few software that so much wants users to tailor their
956 environment and to leverage the use of the software, like \s-1MH\s0.
957 .PP
958 Just to make one example:
959 One might prefer a different listing format for the \f(CWscan\fP
960 program.
961 It is possible to take one of the distributed format files
962 or to write one yourself.
963 To use the format as default for \f(CWscan\fP, a single line,
964 reading
965 .DS
966 scan: -form FORMATFILE
967 .DE
968 must be added to \f(CW.mh_profile\fP.
969 If one wants this different format as an additional command,
970 instead of changing the default, he needs to create a link to
971 \f(CWscan\fP, for instance titled \f(CWscan2\fP.
972 The line in \f(CW.mh_profile\fP would then start with \f(CWscan2\fP,
973 as the option should only be in effect for a program that is called as
974 \f(CWscan2\fP.
976 .PP
977 .B "Make every program a filter
978 is hard to find in \s-1MH\s0.
979 The reason therefore is that most of \s-1MH\s0's tools provide
980 basic file system operations for mailboxes.
981 It is the same reason because of which \f(CWls\fP, \f(CWcp\fP, \f(CWmv\fP,
982 and \f(CWrm\fP aren't filters neither.
983 \s-1MH\s0 does not provide many filters itself, but it is a basis
984 to write filters for.
985 An example would be a mail text highlighter,
986 that means a program that makes use of a color terminal to display
987 header lines, quotations, and signatures in distinct colors.
988 The author's version of such a program is an awk script with 25 lines.
990 .PP
991 .B "Build a prototype as soon as possible
992 was again well followed by \s-1MH\s0.
993 This tenet, of course, focuses on early development, which is
994 long time ago for \s-1MH\s0.
995 But without following this guideline at the very beginning,
996 Bruce Borden may have not convinced the management of \s-1RAND\s0
997 to ever create \s-1MH\s0.
998 In Bruce' own words:
999 .[ [
1000 ware rand history
1001 .], page 132]
1002 .QP
1003 [...] but [Stockton Gaines and Norm Shapiro] were not able
1004 to convince anyone that such a system would be fast enough to be usable.
1005 I proposed a very short project to prove the basic concepts,
1006 and my management agreed.
1007 Looking back, I realize that I had been very lucky with my first design.
1008 Without nearly enough design work,
1009 I built a working environment and some header files
1010 with key structures and wrote the first few \s-1MH\s0 commands:
1011 inc, show/next/prev, and comp.
1012 [...]
1013 With these three, I was able to convince people that the structure was viable.
1014 This took about three weeks.
1016 .H 2 "Problems
1017 .LP
1018 \s-1MH\s0 is not without problems.
1019 There are two main problems: one is technical, the other is about human behavior.
1020 .PP
1021 \s-1MH\s0 is old and email today is very different to email in the time
1022 when \s-1MH\s0 was designed.
1023 \s-1MH\s0 adapted to the changes pretty well, but it is limited, though.
1024 \s-1MIME\s0 support and support for different character encodings
1025 is available, but only on a moderate level.
1026 This comes from limited development resources.
1027 More active developers could quickly change this.
1028 But \s-1MH\s0 is also limited by design, which is the larger problem.
1029 \s-1IMAP\s0, for example, conflicts with \s-1MH\s0's design to a large extent.
1030 These design conflicts are not easily solvable.
1031 Possibly, they require a redesign.
1032 \s-1IMAP\s0 may be too different to the classic mail model,
1033 which \s-1MH\s0 covers, so that \s-1MH\s0 may never support it well.
1034 .PP
1035 The other kind of problem are human habits.
1036 In this world, where almost all \s-1MUA\s0s are monolithic,
1037 it is very difficult to convince people to use a toolbox style \s-1MUA\s0
1038 like \s-1MH\s0.
1039 The habits are so strong, that even people who understand the concept
1040 and advantages of \s-1MH\s0 do not like to switch,
1041 simply because \s-1MH\s0 is different.
1042 Unfortunately, the frontends to \s-1MH\s0, which could provide familiar look'n'feel,
1043 are quite outdated and thus not very appealing, compared to the modern interfaces
1044 of many monolithic \s-1MUA\s0s.
1045 One notable exception is \fImh-e\fP which provides an Emacs interface
1046 to \s-1MH\s0.
1047 \fIMh-e\fP looks much like \fImutt\fP or \fIpine\fP,
1048 but it has buttons, menus, and graphical display capabilities.
1050 .H 2 "Summary
1051 .LP
1052 \s-1MH\s0 is an \s-1MUA\s0 that follows the Unix Philosophy in its design.
1053 It consists of a toolchest of small tools, each of them does one job well.
1054 The toolchest approach offers great flexibility to the user.
1055 It is possible to utilize the complete power of the Unix shell with \s-1MH\s0.
1056 This makes \s-1MH\s0 a very powerful mail system.
1057 Extending and customizing \s-1MH\s0 is easy and encouraged.
1058 .PP
1059 Apart from the user's perspective, \s-1MH\s0 is development-friendly.
1060 Its overall design follows clear rules.
1061 The single tools do only one job, thus they are easy to understand,
1062 easy to write, and good to maintain.
1063 They are all independent and do not interfere with the others.
1064 Automated testing of their function is a straight forward task.
1065 .PP
1066 It is sad, that \s-1MH\s0's differentness is its largest problem,
1067 as its differentness is also its largest advantage.
1068 Unfortunately, for most people their habits are stronger
1069 than the attraction of the clear design and the power, \s-1MH\s0 offers.
1073 .H 1 "Case study: uzbl
1074 .LP
1075 The last chapter took a look on the \s-1MUA\s0 \s-1MH\s0,
1076 which is an old and established software.
1077 This chapter covers uzbl, a fresh new project.
1078 Uzbl is a web browser that adheres to the Unix Philosophy.
1079 Its name comes from the \fILolspeak\fP word for ``usable'';
1080 it is pronounced identical.
1082 .H 2 "Historical background
1083 .LP
1084 Uzbl was started by Dieter Plaetinck in April 2009.
1085 The idea was born in a thread in the Arch Linux Forums.
1086 .[
1087 arch linux forums
1088 browser
1089 .]
1090 After some discussion about failures of well known web browsers,
1091 Plaetinck (alias Dieter@be) came up with a very sketchy proposal
1092 of how a better web browser could look like.
1093 To the question of another member, if Plaetinck would write that program,
1094 because it would sound fantastic, Plaetinck replied:
1095 ``Maybe, if I find the time ;-)''.
1096 .PP
1097 Fortunately, he found the time.
1098 One day later, the first prototype was out.
1099 One week later, uzbl had an own website.
1100 .[
1101 uzbl website
1102 .]
1103 One month after the first code showed up,
1104 a mailing list was installed to coordinate and discuss further development,
1105 and a wiki was added to store documentation and scripts that showed up on the
1106 mailing list and elsewhere.
1107 .PP
1108 In the, now, one year of uzbl's existence, it was heavily developed on various branches.
1109 Plaetinck's task became more and more to only merge the best code from the
1110 different branches into his main branch, and to apply patches.
1111 .[
1112 lwn uzbl
1113 .]
1114 About once a month, Plaetinck released a new version.
1115 In September 2009, he presented several forks of uzbl.
1116 .[ [
1117 uzbl website
1118 .], news archive]
1119 Uzbl, actually, opened the field for a whole family of web browsers with similar shape.
1120 .PP
1121 In July 2009, \fILinux Weekly News\fP published an interview with Plaetinck about uzbl.
1122 .[
1123 lwn uzbl
1124 .]
1125 In September 2009, the uzbl web browser was on \fISlashdot\fP.
1126 .[
1127 slashdot uzbl
1128 .]
1130 .H 2 "Contrasts to other web browsers
1131 .LP
1132 Like most \s-1MUA\s0s are monolithic, but \s-1MH\s0 is a toolchest,
1133 most web browsers are monolithic, but uzbl is a frontend to a toolchest.
1134 .PP
1135 Today, uzbl is divided into uzbl-core and uzbl-browser.
1136 Uzbl-core is, how its name already indicates, the core of uzbl.
1137 It handles commands and events to interface other programs,
1138 and also displays webpages by using \fIwebkit\fP as render engine.
1139 Uzbl-browser combines uzbl-core with a bunch of handler scripts, a status bar,
1140 an event manager, yanking, pasting, page searching, zooming, and more stuff,
1141 to form a ``complete'' web browser.
1142 In the following text, the term ``uzbl'' usually stands for uzbl-browser,
1143 so uzbl-core is included.
1144 .PP
1145 Unlike most other web browsers, uzbl is mainly the mediator between the
1146 various tools that cover single jobs.
1147 Therefore, uzbl listens for commands on a named pipe (fifo), a Unix socket,
1148 and on stdin, and it writes events to a Unix socket and to stdout.
1149 Loading a webpage in a running uzbl instance requires only:
1150 .DS
1151 echo 'uri http://example.org' >/path/to/uzbl-fifo
1152 .DE
1153 The graphical rendering of the webpage is done by webkit,
1154 a web content engine.
1155 Uzbl-core is built around libwebkit.
1156 .PP
1157 Downloads, browsing history, bookmarks, and the like are not provided
1158 by the core itself, like they are in other web browsers.
1159 Uzbl-browser also only provides, so called, handler scripts that wrap
1160 external applications which provide the actual functionality.
1161 For instance, \fIwget\fP is used to download files and uzbl-browser
1162 includes a script that calls wget with appropriate options in
1163 a prepared environment.
1164 .PP
1165 Modern web browsers are proud to have addons, plugins, and modules, instead.
1166 This is their effort to achieve similar goals.
1167 But instead of using existing, external programs, modern web browsers
1168 include these functions.
1170 .H 2 "Discussion of the design
1171 .LP
1172 This section discusses uzbl in regard of the Unix Philosophy,
1173 as identified by Gancarz.
1175 .PP
1176 .B "Make each program do one thing well" .
1177 Uzbl tries to be a web browser and nothing else.
1178 The common definition of a web browser is, of course, highly influenced by
1179 existing implementations of web browsers, although they are degenerated.
1180 Web browsers should be programs to browse the web, and nothing more.
1181 This is the one thing they should do.
1182 .PP
1183 Web browsers should not, for instance, manage downloads.
1184 This is the job download managers exist for.
1185 Download managers do primary care about being good in downloading files.
1186 Modern web browsers provide download management only as a secondary feature.
1187 How could they do this job better, than programs that exist only for
1188 this very job?
1189 And how could anyone want less than the best download manager available?
1190 .PP
1191 A web browser's job is to let the user browse the web.
1192 This means, navigating through websites by following links.
1193 Rendering the \s-1HTML\s0 sources is a different job, too.
1194 It is covered by the webkit render engine, in uzbl's case.
1195 Audio and video content and files like PostScript, \s-1PDF\s0,
1196 and the like, are also not the job of a web browser.
1197 Such content should be handled by external programs \(en
1198 programs that were written to handle such data.
1199 Uzbl strives to do it this way.
1200 .PP
1201 Remember Doug McIlroy:
1202 .I
1203 ``Write programs that do one thing and do it well.
1204 Write programs to work together.''
1205 .R
1206 .PP
1207 The lesser tenet
1208 .B "allow the user to tailor the environment
1209 matches good here.
1210 There was the question, how anyone could want anything less than the
1211 best program for the job.
1212 But as personal preferences matter, it is probably more important to ask:
1213 How could anyone want something else than his preferred program for the job?
1214 .PP
1215 Usually users want one program for a specific job.
1216 Hence, whenever the task is, for instance, downloading,
1217 the same download manager should be used.
1218 More advanced users might want to have this download manager in this
1219 situation and that one in that situation.
1220 They should be able to configure it this way.
1221 With uzbl, one can use any download manager the user wants.
1222 To switch to a different one, only one line in a small handler script
1223 needs to be changed.
1224 Alternatively it would be possible to query the program to use by
1225 reading a global file or an environment variable, in the handler script.
1226 Of course, one can tell uzbl to use a different handler script, too.
1227 This requires a one line change in uzbl's config file.
1228 .PP
1229 Uzbl does neither have its own download manager nor depends on a
1230 specific one, hence uzbl's browsing abilities will not be lowered by having
1231 a bad download manager.
1232 Uzbl's download capabilities will be just as good as the ones of the best
1233 download manager available on the system.
1234 Of course, this applies to all of the other supplementary tools, too.
1236 .PP
1237 .B "Use software leverage to your advantage" .
1238 Uzbl is designed to be extended by external tools.
1239 These external tools are usually wrapped by small handler shell scripts.
1240 Shell scripts are the glue in this approach.
1241 They make the various parts fit together.
1242 .PP
1243 The history mechanism of uzbl shall be presented as an example.
1244 Uzbl is configured to spawn a script to append an entry to the history
1245 whenever the event of a fully loaded page occurs.
1246 The script to append the entry to the history is not much more than:
1247 .DS
1248 #!/bin/sh
1249 file=/path/to/uzbl-history
1250 echo `date +'%Y-%m-%d %H:%M:%S'`" $6 $7" >> $file
1251 .DE
1252 \f(CW$6\fP and \f(CW$7\fP expand to the \s-1URL\s0 and the page title.
1253 .PP
1254 For loading an entry, a key is bound to spawn a load-from-history script.
1255 The script reverses the history to have newer entries first,
1256 then displays \fIdmenu\fP to let the user select an item,
1257 and afterwards writes the selected \s-1URL\s0 into uzbl's command input pipe.
1258 With error checking and corner case handling removed,
1259 the script looks like this:
1260 .DS
1261 #!/bin/sh
1262 file=/path/to/uzbl-history
1263 goto=`tac $file | dmenu | cut -d' ' -f 3`
1264 echo "uri $goto" > $4
1265 .DE
1266 \f(CW$4\fP expands to the path of the command input pipe of the current
1267 uzbl instance.
1269 .PP
1270 .B "Avoid captive user interfaces" .
1271 One could say, that uzbl, to a large extent, actually \fIis\fP
1272 a captive user interface.
1273 But the difference to most other web browsers is, that uzbl is only
1274 the captive user interface frontend (and the core of the backend).
1275 Many parts of the backend are independent of uzbl.
1276 Some are distributed with uzbl, for some external programs,
1277 handler scripts are distributed,
1278 but arbitrary additional functionality can be added if desired.
1279 .PP
1280 The frontend is captive \(en that is true.
1281 This is okay for the task of browsing the web, as this task is only relevant
1282 for humans.
1283 Automated programs would \fIcrawl\fP the web.
1284 That means, they read the source directly.
1285 The source includes all the semantics.
1286 The graphical representation is just for humans to transfer the semantics
1287 more intuitively.
1289 .PP
1290 .B "Make every program a filter" .
1291 Graphical web browsers are almost dead ends in the chain of information flow.
1292 Thus it is difficult to see what graphical web browsers should filter.
1293 Graphical web browsers exist almost only to be interactively used by humans.
1294 The only case when one might want to automate the rendering function is
1295 to generate images of rendered webpages.
1297 .PP
1298 .B "Small is beautiful"
1299 is not easy to apply to a web browser, because modern web technology
1300 is very complex, hence the rendering task is very complex.
1301 Modern web browsers have to consist of many thousand lines of code,
1302 unfortunately.
1303 Using the toolchest approach and wrappers can split the browser into
1304 several small parts, tough.
1305 .PP
1306 As of March 2010, uzbl-core consists of about 3\,500 lines of C code.
1307 The distribution includes another 3\,500 lines of Shell and Python code,
1308 which are the handler scripts and plugins like a modal interface.
1309 Further more, uzbl uses functionality of external tools like
1310 \fIwget\fP and \fIsocat\fP.
1311 Up to this point, uzbl looks pretty neat and small.
1312 The ugly part of uzbl is the web content render engine, webkit.
1313 Webkit consists of roughly 400\,000 (!) lines of code.
1314 Unfortunately, small web render engines are not possible anymore
1315 because of the modern web.
1317 .PP
1318 .B "Build a prototype as soon as possible" .
1319 Plaetinck made his code public, right from the beginning.
1320 Discussion and development was, and still is, open to everyone interested.
1321 Development versions of uzbl can be obtained very simply from the code
1322 repository.
1323 Within the first year of uzbl's existence, a new version was released
1324 more often than once a month.
1325 Different forks and branches arose.
1326 They introduced new features, which were tested for suitability
1327 for the main branch.
1328 The experiences of using prototypes influenced further development.
1329 Actually, all development was community driven.
1330 Plaetinck says, three months after uzbl's birth:
1331 ``Right now I hardly code anything myself for Uzbl.
1332 I just merge in other people's code, ponder a lot, and lead the discussions.''
1333 .[
1334 lwn
1335 uzbl
1336 .]
1339 .H 2 "Problems
1340 .LP
1341 Similar to \s-1MH\s0, uzbl, too suffers from being different.
1342 It is sad, but people use what they know.
1343 Fortunately, uzbl's user interface can look and feel very much the
1344 same as the one of the well known web browsers,
1345 hiding the internal differences.
1346 But uzbl has to provide this similar look and feel to be accepted
1347 as a ``normal'' browser by ``normal'' users.
1348 .PP
1349 Though, the more important problem is the modern web.
1350 The modern web is simply broken.
1351 It has state in a state-less protocol,
1352 it misuses technologies,
1353 and it is helplessly overloaded.
1354 The result are web content render engines that must consist
1355 of hundreds of thousands lines of code.
1356 They also must combine and integrate many different technologies,
1357 only to make our modern web accessible.
1358 Website to image converter are hardly possible to run without
1359 human interaction because of state in sessions, impossible
1360 deep-linking, and unautomatable technologies.
1361 .PP
1362 The web was misused to provide all kinds of imaginable wishes.
1363 Now web browsers, and eventually the users, suffer from it.
1366 .H 2 "Summary
1367 .LP
1368 ``Uzbl is a browser that adheres to the Unix Philosophy'',
1369 that is how uzbl is seen by its authors.
1370 Indeed, uzbl follows the Unix Philosophy in many ways.
1371 It consists of independent parts that work together,
1372 while its core is mainly a mediator which glues the parts together.
1373 .PP
1374 Software leverage can excellently be seen in uzbl.
1375 External tools are used, independent tasks are separated
1376 in independent parts and glued together with small handler scripts.
1377 .PP
1378 As uzbl, more or less, consists of a set of tools and a bit
1379 of glue, anyone can put the parts together and expand it
1380 in any desired way.
1381 Uzbl is very flexible and customizable.
1382 These properties make it valuable for advanced users,
1383 but may keep novice users from using it.
1384 .PP
1385 But uzbl's main problem is the modern web, that makes it hard
1386 to design a sane web browser.
1387 Despite this bad situation, uzbl does a fairly good job.
1390 .H 1 "Final thoughts
1392 .LP
1393 This paper explained why good design is important.
1394 It introduced the Unix Philosophy as guidelines to good design,
1395 in order to create good quality software.
1396 Then, real life software, that was designed with the Unix Philosophy
1397 in mind, was discussed.
1398 .PP
1399 Throughout the paper, the aim was do explain \fIwhy\fP something
1400 should be done the Unix way.
1401 It was tried to give reasons that expose that the Unix Philosophy
1402 is a preferable way for designing software.
1403 .PP
1404 The Unix Philosophy is close to the software developer's point of view.
1405 Its main goal is taming the beast ``software complexity''.
1406 Hence it strives first and foremost for simplicity, of software.
1407 It might appear, that usability for people is a minor goal.
1408 Actually, the Unix Philosophy sees usability as a result of sound design.
1409 Sound design does not need to be most intuitive,
1410 but it will provide a consistent way to access the enormous power
1411 of software leverage.
1412 .PP
1413 Being able to solve some concrete problem becomes less and less important,
1414 as there is software available for nearly every possible task today.
1415 But the quality of software matters.
1416 It is important that we have \fIgood\fP software.
1417 .sp
1418 .LP
1419 .B "But why the Unix Philosophy?
1420 .PP
1421 The largest problem of software development is the complexity involved.
1422 It is the only part of the job that computers cannot take over.
1423 The Unix Philosophy fights complexity as main enemy.
1424 .PP
1425 On the other hand,
1426 the most unique gain of software is its ability to leverage.
1427 Current software still fails to make the best possible use of this ability.
1428 The Unix Philosophy concentrates much on exploiting this great opportunity.
1431 .bp
1432 .TL
1433 References
1434 .LP
1435 .XS
1436 .sp .5v
1437 .B
1438 References
1439 .XE
1440 .ev r
1441 .nr PS -1
1442 .nr VS -1
1443 .[
1444 $LIST$
1445 .]
1446 .nr PS +1
1447 .nr VS +1
1448 .ev
1450 .bp
1451 .TL
1452 Table of Contents
1453 .LP
1454 .PX no