《什么是软件设计?》再后记
----Jack Reecves,2002,邓辉(译)
当我回顾几乎10年前所写的东西时,有几点让我印象深刻。第一点(也是和本书最有关的)是,现今,我甚至比那时更加确信我试图去阐述的要点在本质上的正确性。随后的一些年中,许多流行的软件开发方法增强了其中的许多观点,这支持了我的信念。最明显的(或许也是最不重要的)是面向对象编程语言的流行。现在,除了C++外,出现了许多其他的面向对象编程语言。另外,还有一些面向对象设计符号,比如:UML。我关于面向对象语言之所以得到流行是因为它们允许在代码中直接表现出更具表达力的设计的论点,现在看来有点过时了。
重构的概念——重新组织代码基础,使之更加健壮和可重用——同样也和我的关于设计的所有方面的内容都应该是灵活的并且在验证设计时允许改变的论点相似。重构只是提供了一个过程以及一组如何去改善已经被证实具有缺陷的设计的准则。
最后,文中有一个敏捷开发的总的概念。虽然极限编程是这些新方法中最知名的一个,但是它们都具有一个共同点:它们都承认源代码是软件开发工作中的最重要的产品。
另一方面,有一些观点——其中的一些我在论文中略微谈到过——在随后的一些年中,对我来说变得更加重要。第一个是构架,或者顶层设计的重要性。在论文中,我认为构架只是设计的一部分内容,并且在构建/测试循环对设计进行验证的过程中,构架需要保持可变。这在本质上是正确的,但是回想起来,我认为我的想法有点不成熟。虽然构建/测试循环可能揭示出构架中的问题,但是更多的问题是常常由于改变需求而表现出来的。 一般来说,设计软件是困难的,并且新的编程语言,比如:Java或者C++,以及图形化的符号,比如:UML,对于不知道如何有效地使用它的人来说,都没有多大的帮助。此外,一旦一个项目基于一个构架构建了大量的代码,那么对该构架进行基础性的更改,常常相当于丢弃掉该项目并重新开始一个,这就意味着该项目没有出现过。即使项目和机构在根本上接受了重构的概念,但是他们通常仍然不愿意去做一些看起来就像是完全重写的事情。这意味着第一次就把它作对(或者至少是接近对)是重要的,并且项目变得越大,就越要如此。幸运的是,软件设计模式有助于解决这方面问题。
还有其他一些方面的内容,我认为需要更多地强调一下,其中之一就是辅助文档,尤其是构架方面的文档。虽然源代码就是设计,但是试图从源代码中得出构架,可能是一个令人畏惧的体验。在论文中,我希望能够出现一些软件工具来帮助软件开发者自动地维护来自源代码的辅助文档。我几乎已经放弃了这个希望。一个好的面向对象构架通常可以使用几幅图以及少许的十几页文本描述出来。不过,这些图(和文本)必须集中于设计中的关键类和关系。糟糕的是,对于软件设计工具可能会变得足够聪明,以至于可以从源代码的大量细节中提取出这些重要方面的内容这一点,我没有看到任何真正的希望。这意味着还得必须由人来编写和维护这种文档。我仍然认为,在源代码完成后,或者至少是在编写源代码的同时去编文档,要比在编写源代码之前去编写文档更好一些。
最后,我在论文的最后谈到了C++是编程——并且因此是软件设计——艺术的一个进步,但是还需要更大的进步。就算我完全没有看到语言中出现任何真正的编程进步来挑战C++的流行,那么在今天,我会认为这一点甚至要比我首次编写它时更加正确。