Re: REST impact paper

"Stephen D. Williams" <[email protected]>
Newsgroups gmane.culture.people.rohit-khare
Message-ID <[email protected]>
On 9/8/17 10:54 AM, Gregory Alan Bolcer wrote:
> No, I think the design pattern of resuse came out of things that people didn't expect to get reused, so they throw spagehetti 
> against the wall in different ways hoping to optimize the reuse, though the *ilities that govern it are still not well known. But 
> there's promise....(and science).

Are you saying that the reusable tools, interfaces, and techniques in Unix were all an accident?

I don't read it that way.  Some of these principles are from circa 1978.  I've been using Unix, at work, since 1984, at the same 
time as Ataris, DOS 1.0/2.0, DRDOS, CP/M8/16, and VMS.  It took us a long time to find ways to reuse some of these principles much 
more widely, but we are in substantial ways now.  We have a lot more opportunity.

This book is thick with related wisdom; a sample:

https://www.google.com/search?q=kernigan+unix+reuse&ie=utf-8&oe=utf-8
[1] The Art of Unix Programming
The Unix philosophy (like successful folk traditions in other engineering disciplines) is bottom-up, not top-down. It is pragmatic 
and grounded in experience. It is not to be found in official methods and standards, but rather in the implicit half-reflexive 
knowledge, the expertise that the Unix culture transmits. It encourages a sense of proportion and skepticism — and shows both by 
having a sense of (often subversive) humor.

Doug McIlroy, the inventor of Unix pipes and one of the founders of the Unix tradition, had this to say at the time [McIlroy78]:

(i) Make each program do one thing well. To do a new job, build afresh rather than complicate old programs by adding new features.
(ii) Expect the output of every program to become the input to another, as yet unknown, program. Don’t clutter output with 
extraneous information. Avoid stringently columnar or binary input formats. Don’t insist on interactive input.
(iii) Design and build software, even operating systems, to be tried early, ideally within weeks. Don’t hesitate to throw away the 
clumsy parts and rebuild them.
(iv) Use tools in preference to unskilled help to lighten a programming task, even if you have to detour to build the tools and 
expect to throw some of them out after you’ve finished using them.

He later summarized it this way (quoted in A Quarter Century of Unix [Salus]):
This is the Unix philosophy: Write programs that do one thing and do it well. Write programs to work together. Write programs to 
handle text streams, because that is a universal interface.

Rob Pike, who became one of the great masters of C, offers a slightly different angle in Notes on C Programming [Pike]:
Rule 1. You can’t tell where a program is going to spend its time. Bottlenecks occur in surprising places, so don’t try to second 
guess and put in a speed hack until you’ve proven that’s where the bottleneck is.
Rule 2. Measure. Don’t tune for speed until you’ve measured, and even then don’t unless one part of the code overwhelms the rest.
Rule 3. Fancy algorithms are slow when n is small, and n is usually small. Fancy algorithms have big constants. Until you know that 
n is frequently going to be big, don’t get fancy. (Even if n does get big, use Rule 2 first.)
Rule 4. Fancy algorithms are buggier than simple ones, and they’re much harder to implement. Use simple algorithms as well as simple 
data structures.
Rule 5. Data dominates. If you’ve chosen the right data structures and organized things well, the algorithms will almost always be 
self-evident. Data structures, not algorithms, are central to programming.9
Rule 6. There is no Rule 6.

Ken Thompson, the man who designed and implemented the first Unix, reinforced Pike’s rule 4 with a gnomic maxim worthy of a Zen 
patriarch:
When in doubt, use brute force.

More of the Unix philosophy was implied not by what these elders said but by what they did and the example Unix itself set. Looking 
at the whole, we can abstract the following ideas:
1. Rule of Modularity: Write simple parts connected by clean interfaces.
2. Rule of Clarity: Clarity is better than cleverness.
3. Rule of Composition: Design programs to be connected to other programs.
4. Rule of Separation: Separate policy from mechanism; separate interfaces from engines.
5. Rule of Simplicity: Design for simplicity; add complexity only where you must.
6. Rule of Parsimony: Write a big program only when it is clear by demonstration that nothing else will do.
7. Rule of Transparency: Design for visibility to make inspection and debugging easier.
8. Rule of Robustness: Robustness is the child of transparency and simplicity.
9. Rule of Representation: Fold knowledge into data so program logic can be stupid and robust.
10. Rule of Least Surprise: In interface design, always do the least surprising thing.
11. Rule of Silence: When a program has nothing surprising to say, it should say nothing.
12. Rule of Repair: When you must fail, fail noisily and as soon as possible.
13. Rule of Economy: Programmer time is expensive; conserve it in preference to machine time. 14. Rule of Generation: Avoid 
hand-hacking; write programs to write programs when you can. 15. Rule of Optimization: Prototype before polishing. Get it working 
before you optimize it.
16. Rule of Diversity: Distrust all claims for “one true way”.
17. Rule of Extensibility: Design for the future, because it will be here sooner than you think.
If you’re new to Unix, these principles are worth some meditation. Software-engineering texts recommend most of them; but most other 
operating systems lack the right tools and traditions to turn them into practice, so most programmers can’t apply them with any 
consistency. They come to accept blunt tools, bad designs, overwork, and bloated code as normal — and then wonder what Unix fans are 
so annoyed about.



[5] The Unix Programming Environment


Stephen

>
> Greg
>
> On 9/8/2017 10:42 AM, Stephen D. Williams wrote:
>> B) Some things are designed to be reused in the widest possible ways without gatekeeping: The expected unexpected.  Practically 
>> everything in Unix is designed with that in mind which is why, after weathering a couple winters due to the ignorance and 
>> immaturity of too many, it is everywhere for everything.  !Unix/Linux is the exception.  Things like Docker et al are just 
>> reusing / building on / extending those principles in logical ways.

_______________________________________________
FoRK mailing list
http://xent.com/mailman/listinfo/fork
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.