声明:这篇只写给自己看,我相信很多人和我有不同的看法。
最近刷了一下ACM题,简单的难的都有。对于题目本身而言,没有什么好讲的,基本偏重于数据结构和算法方面。不同基础的人收获也不一样,猿猿只是拿来保持手感而已。我想说的是这些题目的评判标准与软件工程的异同点。
首先说说相同部分:效率、以及代码简短。这部分应该是所有码农都努力追求的方向。在实际问题下,空间和时间并总是一个矛盾体,有时紧凑的空间反而能够带来更高的效率。这个《编程珠玑》有介绍。在实际工程中,如果能够运用尽量简短的代码来高效解决遇到的问题,那肯定会被别人膜拜为“大牛”。
再说说不同的部分:评价标准和编码规范。写ACM的人大多不愿写复杂的注释,对于变量名称也是能简就简。做过实际工程的人一定被这类“天书”一般的代码折磨过。猿猿就曾经接手一份十万行级别的“天书”,不过那时候还有老员工可以问。现在自己刷题,确实也不愿意多写注释,总想着:“这东西做完又不会再看了”。而评价代码质量的标准,刷题时就仅仅是效率,实际工程中有更多远比效率更重要的东西,比如程序的可读性。
举一个例子:大家知道有个常用操作是swap。普通猿猿一般会声明一个临时变量做暂存,ACM大牛猿猿往往用各种异或来就地完成交换。如果是内存空间非常紧张的嵌入式,或许还有些道理。不过在PC上这么做,带来的麻烦就是几乎没有人看得懂这部分代码。要知道绝大多数的码农水平都只是so so。coding的目标是要让他们也能看懂,而不是孤芳自赏。
扯得有些远。有人会问:那要这些高级的奇淫技巧干什么?我的答案是:应付面试用,仅此而已。这些小trick都是针对特定问题的一些快速解法,没啥普遍性。真正需要仔细研读的是动态规划、线性规划、随机算法、近似算法之类更普遍的问题求解。包括最近研读的stl也是如此。每一个C++码农都用过stl,但绝大多数不会用stl。为啥?因为没有真正了解stl背后的泛型编程的思维方式。而这种思考问题的方式,也正是天朝码农也美帝码农在才能(薪资)上的差距。