积累的力量
我现在编写 C++ 程序,比 2014、2016 年刚开始使用开源有限元算法库的时候更为得心应手。那个时候还在为如何定位、调试、解决基本的语法错误而提心吊胆。到如今,常见的 C++ 编程错误与弯路都大体上都已走了一遍,基本做到了“不二过”,或者即便有错误,也能很快地发现和纠正。同时,对于各种现代 C++ 编程技术与风格也都越来越熟悉了。在整个过程中,项目代码的数量也在不断累积,软件架构与测试框架也逐渐得到了丰富和充实。
同时,在算法的设计与实现方面,多次验证了将自底向上与自顶向下方法相结合的有效性。若仅拘泥于自底向上的开发模式,就会只见树木不林,缺乏整体架构的设计与组织;若仅采用自顶向下的方式,无论我多么地耐心与细致,总会因为对问题细节的认知不足,出现自身的理解力与洞察力无法触及最底层的情况。究其原因,我想编程活动绝不是一种在事先设定好的体系结构的指导下按部就班的被动过程,而是其本身就是一种理解整个软件体系与技术细节的过程。这种在有限的、不完整的设计下开展编程的活动肯定会遇到设计不合理的情况,而这一点是通过项目中的不断迭代来完成的。程序设计与编码活动既是我们解决问题的方法与过程,也是我们认识事物、理解问题的有效手段。
相对于按图设计的办公或业务软件,我在数值算法与科学软件的开发过程中,除了需要实现一般的业务逻辑与操作流程,还需要解决大量的科学问题与数学问题,这便带来了更多的难点与挑战。因此,在经过一段时间的纯理论研究和纯思想设计后,就需要具体实践的配合,对理论方法的正确性以及数据结构与算法流程的有效性予以检验。可以看出,这也充分体现了“知行合一”的重要性。
基于上述编程技术、算法设计与具体实现等方面的经验,我切实地体会到了持续向一个软件项目添砖加瓦,并看着它不断发展壮大、臻于完善的美妙感受。想要有这样一个能够不断发展的系统和促成理论学习、公式推导、算法开发、软件设计融汇贯通的良好生态,想来第一步就是要以长远的设想、坚定的信心播撒下能够独立生长的种子,然后用踏实的工作去浇灌和滋养它。尽管在一开始做出的东西看上去无比弱小和粗糙,但它所有的内部机制因为是出于自己的一手设计,所以都是可以完全理解与把握的,也因而是可控的、可扩展的、可持续生长的。有这样的原型作为基础,后续也就有机会对其做出大的修改与重构,令其脱胎换骨,获得质的提升。