写程序有感

How to proceed when being stuck
(Reflection on my programming experience)

最近在写程序。按理说,平常写程序,除了成就感和挫败感之外,似乎再难有别的感受;但我这次略不同,也许是多年未写程序的缘故,久别重逢,竟也有新的体会。六年前学过的算法,早已化作模糊的术语,我遇到类似场景时已不容易联想到了。也是因祸得福,从新的视角审视过去习以为常的事。

我想实现某个功能A,却又对它有畏惧之心。这程序整体都有点费脑子,几乎每个功能都需要递归操作树、图等数据结构。而想加的这个功能A呀,尤其复杂。要实现它,就要一口气设计那么多算法、数据结构和函数接口,那么多的新代码交错在一起,想想调试的场面就头疼:那么多东西不知对错,出了问题该改哪里好呢?恐怕要重写一遍吧。

如何实现这个功能?啊呀呀,早有预感,也许我不配想这么难的算法。

既然不敢动手写A,那干脆先去写次要功能B好了,简单些。虽然知道它不会成为A的一部分,但反正迟早也要写它。我实现了这个简单而意义不大的功能B……哈,实现得不错。接着来!我又照葫芦画瓢,实现了一个稍复杂些的类似功能C,写的时候几乎是照着B抄过来再小心翼翼地加以修改。再来!有了实现前两个功能B和C的经验,我的程序已经有了比较清晰、完善的数据结构,也有了一段我比较信任的算法模板。这回,我又实现了一个更复杂的功能D,也是照着B和C抄来修改的。意外的是,虽然功能越来越复杂,但我却写得越来越轻松。

我顺手就写出了原以为很难的功能A。为什么它变简单了?因为我在实现其它功能时,对相关的数据结构都变得熟悉起来,这让我在重新思考功能A时,能快速排除许多看似不重要但实际必须面对的障碍,集中考虑几个已被简化的核心问题。

类似的事情发生了四五次,我都快形成条件反射了:碰到难以下手的问题,怎么办?先找个略微沾边的最简单的例子。无论它与原目标差异多大,都先试试。不去担心山顶有多远,先爬上路边的小山包,看看远方。

休息时找了个吉他玩。初学,想学弹唱,学一首我很喜欢的歌。我想快快练好这首歌需要的技能:几个和弦,按照谱子上的次序弹。很快,两三天就能按顺序弄出声响了,然而声音不饱满,节奏也相当吃力。

如何练好这首歌?看上去最高效的做法是只练歌中的动作,但情况并没这么简单:很多基本动作没学过,很多细节弹不完美,看似只要重复针对训练就能解决这些问题,但要想“练好”,还是离不开更普适的基本功。

我开始练基本功。找了本练习曲。大部分的练习似乎和那首歌毫无联系,但我还是学了学。然而效果居然不错——练好这些“毫无联系”的基本功后,原来那首歌曲似乎变简单了。究其原因,无非是我的姿势变好了,双手变灵活了,熟悉了琴弦、学会了发力、适应了按节拍分工合作。如何练好一首歌?也许这样“绕远”才是捷径。

生活中总有些目标,很大,很模糊。不知如何前进时,想想,难道只有这一个目标吗?也许,随便做些其它有益的事,渐渐地就靠近了原来的目标,再后来,跳一跳就可以轻松够到。

“敢问路在何方?路在脚下。” 道理浅显易懂,难的是想起来用它。

 

更新
书《How to Solve It: A New Aspect of Mathematical Method》也讲到,面对难题,可以先回顾与之相似的问题,也可以先解决它简化后的子问题。这些步骤能帮我们重新定义原问题。

Advertisements

7 thoughts on “写程序有感

  1. Pingback: Why junior PhD students are miserable | jiasi

  2. Pingback: Back to programming | jiasi

  3. Pingback: Nature of research vs. schoolwork | jiasi

  4. Dezhong Deng

    感悟很赞!
    很多道理浅显易懂, 但是身在其中却很难摸索. 我也会经常在一些业余爱好中总结出一些对干活很有帮助的小的tips, 这样想想和你对弹吉他的感悟还挺相通的. 哈哈~

    Reply
  5. Chiyuan Zhang

    觉得很有道理,然后好像还有另外一类人,情况刚好相反,太沉迷于基础和工具,比如要写程序结果所有的时间都花在学习各种各样以后也许会用到的算法和数据结构基础上,或者是想要弹琴然后一门心思要把所有的和弦音乐理论全都搞清楚再去碰真正要弹的曲子,最后可能把所有的时间 budget 用完了还是没有开始做真正要做的事情。也许需要在两个极端之间找一个平衡点。

    Reply

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s