jjgod / blog Random notes by Jjgod Jiang.

什么是坏的系统设计

什么是好的系统设计?我不知道,但依我看,LaTeX 是坏的系统设计的一个典型,MFC 也如此,而坏的系统最重要的一个特点是,使用者不能把它作为一个黑匣子看待,而必须了解其内部构造才能有效使用它。

凡系统构造的时候,总希望隐藏内部的复杂性于简洁的接口背后,这样,用户只需要知道如何调用接口、这个接口实现了哪个功能就可以了,而不必了解其实现的细节。尽管 LaTeX 也是如此宣称的,可事实上并非如此,不了解实现细节,终究只能用到一些皮毛,稍微复杂一点的问题便解决不了。

举个例子,前些日子我希望实现这么一个功能,把每个章节标题的序号单独放在一列中,而正文与章节标题的文字对齐。如下:

  1  Hello world..
     A quick brown fox jumps over
     a lazy dog. 

按照默认的情况则是:

1 Hello world 

A quick brown fox jumps over
a lazy dog. 

可是,就算是实现书籍排版上这么常见的一个功能,LaTeX 也没有提供任何接口做到,不仅标准的文档类里面没有,连附加的宏包也没有实现这一功能的。所幸辗转所得一段代码能解决这个问题:

\makeatletter
\def\@seccntformat#1{\protect\makebox[0pt][r]{\csname
the#1\endcsname\quad}}
\makeatother

然而这段代码,根本是重新定义了 article 文档类中所用到标题数字格式,用到的纯属 TeX 的方法,和 LaTeX 简直毫无关系,试问若不看 article 的代码,怎能写出这段重定义的代码来,而这样一来,LaTeX 又怎么能算提供了一个黑匣子?

为什么说 LaTeX 对开发者来说也是糟糕的呢?是因为要写出这段代码来解决问题,首先你得对 LaTeX 的编程有所了解,否则 \makeatletter\makeatother 是什么意思无从得知,第二得对纯 TeX 有了解,不然 \def 是什么意思也肯定不大了然,第三,你还得对别人写好的 article 文档类分析透彻,否则 \csname 是什么?\@seccntformat 又该放在哪里,有几个参数,从何得知?

这是 LaTeX 这种以编程的形式来排版的坏处,当然,也不能全归咎于形式,从 Knuth 始,大量的 LaTeX 开发人员,以及宏包的作者,都有一种把简单问题复杂化的倾向,好像不说得那么复杂无以显得自己水平多么高。明明一个参数就能解决问题的函数,非搞得七八个参数,看似灵活性高了,实则让人学起来、用起来头痛,没事谁愿意记你这个参数是干什么的?

最重要的是,这种方式不像 WYSWYG 的形式那么容易让人举一反三:同样一个功能,Adobe FrameMaker 中也没提供具体实现它的选项,但 FrameMaker 提供了几个很直观的功能:

首先,标题可以自动编号,你可以定制标题编号的格式 第二,可以创建一个在正文左侧的 column,成为 side-head,这一列保持空白,但标题可以跨越到这一列中 第三,标题编号的格式可以包含制表符

因此我自己就发现了可以用下述方法实现上边提到的功能: 首先,创建两个制表符:

     *    *
然后,把正文放在 side-head 右边的 column 里,标题则跨越到 side-head 中,但标题编号设置为 \t<n +>\t (</n><n +> 表示阿拉伯数字的编号,\t 表示一个制表符的宽度)。 接下来,只需要保证第二个制表符的位置,和 side-head 的右边界相同便可以实现我需要的功能了。

这让我想起 Web 标准推行中表格与 CSS 之争,表格该不该用于排版,现在倒是没什么好争的了,但大家却甚少考虑,为什么表格用于排版会会这么流行?W3C 可从来么鼓励过大家这么做,但为何只需要一人介绍,便应者云集?其实正是因为表格比 CSS 直观得多,表格一画,哪边居左,多少留右,上边高度多少,底部留多长,一目了然,设计者容易构思,而不像 CSS,还要考虑什么绝对宽度、相对宽度、固定位置,甚至还要用浮动之类的方法来扭扭捏捏的实现……

好的技术首先应该是易学的,否则纵然再好,也必然为公众所抛弃。


6 Comments

关于MFC,部分同意。其实争论已有很多。不过我觉得,很多人学习Desect MFC,MFC Internal还是抱着学习的目的的。

Posted by Meng Yan on 9 July 2005 @ 12pm

全完同意你的所有观点,但最后几句合在一起理解好像是Web标准要被抛弃了?^_^ Web标准目前最大的问题确实是没有好的WYSWYG工具,不过这不能说明它难学(当然我也承认它不易学)。如果没有DW,我想对大多数人来说,用table布局code出一个页面的难度远大于用CSS…其实浮动和绝对定位是很合常理的布局方式,只是大家习惯了用table划框框的办法。

Posted by Shark on 10 July 2005 @ 1am

用Table去画框框看是简单,但是要扩展还是比较难的,比如要适应1024768和800600,用DW去画还真没有什么好办法. DW工具催生了简单定制TABLE的功能,如果能扩展定制CSS就perfert啦.

Posted by bear on 10 July 2005 @ 3am

哈哈,我也只是发发牢骚,觉得 CSS 那些谈定位的东西有点走火入魔了,其实嘛,哪里有适合所有人的定位方法,还是理解原理,自己发明来得方便。可是要理解的原理太多了,人又哪有那么多时间呢。

Posted by jjgod on 10 July 2005 @ 12pm

是啊!是啊!从mfc到web 真是一个痛苦的经历!真不只到下面一个痛苦是什么!

Posted by leihs on 3 November 2005 @ 4pm

latex本来得哲学就是不让你控制页面得摆布。别人从来就没又claim自己会做这种事。你的批评基本上属于无中生有。

Posted by netghost on 11 October 2006 @ 4pm

Leave a Comment

说点感想 Web 与排版学上的字体问题