算法竞赛入门经典:习题与解答
上QQ阅读APP看书,第一时间看更新

算法有什么用

我大学学的是机械专业,但由于对数学非常热爱,加之毕业后发现软件行业貌似比较好“混”,且工资待遇比其他行业高些,所以就进入了开发领域。经过一段时间的工作后,我发现自己经常会遇到以下一些问题:

  • 程序稍微复杂一些,代码就会写的很乱。
  • 程序出了问题,不知道该如何调试,只会到处修改,然后再看效果。
  • 用户需求稍作改变,就想骂街。
  • 特别重要的一点是,如果你想跳到外企去工作,面试时肯定会让你编一些很难的算法程序。

后来,我进入到了微软上海全球技术支持中心做外包技术支持,接触到了许多严谨、求是、好学的工程师前辈。从他们身上,我学到了一些非常有效的解决问题的思路,以及那种“活到老学到老”的人生态度。

我逐渐明白:程序是要设计的。为了设计得清晰,需要学习数据结构、操作系统原理等非常多的基础知识,而这些体系本质上是前辈人思维方法的结晶。

另外,令很多程序员头疼的调试过程,给我印象最深的是一句话:调试的本质实际上就是在定位。大多数时候,调试的过程(并发程序的调试可能就更复杂些)其实就是一个二分查找:假如有100行程序结果不对,就可以在第50行看看结果是否符合预期,如果OK,说明问题出在后50行,否则前50行一定有问题。如此递归下去,很快就能精准定位到有问题的代码。了解二分查找的朋友都知道,这个算法复杂度是O(logn)。

用C#开发服务端程序时,我经常会遇到内存问题,需要对垃圾收集(GC)的过程进行分析调试。深入学习之后我发现,其实GC模型的本质就是有向图。抱着这个思路再来分析解决内存问题,思路瞬间清晰了很多。

这样的例子还有很多。

在不断解决各类问题的过程中,我逐渐明白了—算法在本质上是诸多计算机学术以及实践领域积累下来的分析解决各种问题的思维方法。它不是象牙塔内的纯学术研究,更不是一堆仅能用来解决特定领域性能问题的高精尖技术。这个行业的技术人员,本质上正是以这些思维方法为武器,高效解决着不同行业领域不断涌现出的各类纷繁问题和挑战。

说到这里,我想到其他很多行业:京剧艺人每天早上要练嗓子,相声演员每天要练贯口,军人在战斗之余要进行大量训练,中医在繁忙之余要天天钻研《伤寒论》《黄帝内经》等经典……类似这样,需要认真对待并把基本功训练作为生活一部分的行业还有很多。对于笔者来说,算法思维就是IT相关行业的技术人员需要用同样态度持续不断进行训练的一项基本功。

所以,就有了这些年的学习过程,以及以本书作为省察的一个小小总结。