前些天买了一本新书《枕边算法书》([韩] 林栢濬 著;崔盛一 译,人民邮电出版社,2018),也是想作为睡前读物看看。看了一个晚上,确实如书名所言,文章主要以作者的经历,写的比较贴近程序员生活,不像传统的一些算法或编程书比较刻板。这么写的优点是作者通过自己的经历,从自身角度出发,通过一个个实际遇到的小问题小故事,写得生动有趣。当然,也有缺点,因为从自身出发,所以有些想法很主观,对现在的国内开发者,并不一定完全合适。
先说说看了第一章前几节的一些共鸣:对自己编写的代码进行单元测试,是“必须”的,而非“可选”环节。这点我深有感触,不能因为赶进度,自己都不测试一下就把代码提交,至少在团队协作中,每个人要对自己编写的代码负责,这确实是工作态度问题。大部分情况下,查找bug是考验韧劲和注意力的过程,与奇思妙想或精妙构思相比,查找bug更多地需要毅力。经常调试别人的代码时提高编程能力的捷径之一。这点我非常同意,因为我自身工作的原因,经常要对别人的代码进行二次开发,而这个过程可以学到很多技巧。而即使有遇到不明白的地方,由于工作原因,也会迫使自己去学习,或者去请教相关的知识。
而一些作者主观的内容,也很明显,也可能和作者国籍有关,有些我甚至觉得太为难自己。第一章里作者就几次通宵熬夜,这种不放弃的毅力值得学习,但我不支持常年加班熬夜,身体健康更为重要,毕竟“活着才能写出代码”。而他的另一个观点,“不能再承诺时间内完成任务的人,压根算不上是程序员”,我想了下,也许他是没遇到过需求一天变三变的产品经理吧。此外,作者觉得想“一下子”解开算法问题的都只是编程菜鸟,“高手”应该是一步一步向着最终目标前进的。我觉得,真正的高手才是那种“灵光一闪”,然后“一下子”解决问题的人,一步一步按部就班解决问题并不一定是“高手”,但是可以说是“阅历丰富”,至少很稳健。比如小学生做数学题:8x134,按部就班的学生会列“竖式”进行一步一步按位乘法计算,真正的高手会是8x134=8x(125+9)=1000+72=1072. 此外,作者觉得有纸笔的情况下,3分钟以内应该能解开爱因斯坦的那道逻辑题。我才疏学浅,开了个excel表记录,花了大概5分钟解开了。这种谜题如同作者所言像查找bug时找凌乱的线头,其实毅力更为重要,大家不用纠结是3分钟,还是5分钟。另外我想说的是,好记性不如烂笔头,借助工具可以让你更有效地提高效率。
接下去分享一下昨天看到的几个趣题,确实不错。
1. 一个岛上有N个和尚,红眼睛是被诅咒过的,如果知道自己是红眼睛,当晚就会自裁。但是他们规定,不能告诉别人或者问别人自己的眼睛颜色,岛上也没有镜子或其他可以看到自己眼睛颜色的条件。直到有一天,一个游客来玩,说了一句:你们之中至少有一人是红眼睛。接下去岛上发生了可怕的事。 这个故事最终从递归角度来讲,解释了所有情况,浅显易懂。
2. 大家要习惯写“防御型代码”,增加代码的健壮性。作者用了个很通俗易懂的例子来说明了Java中常见的NullPointerException,一道数学题:假设a=b, 那么a平方 = ab,a平方-b平方=ab-b平方,(a-b)(a+b)=b(a-b),a+b=b,b+b=b,2b=b,2=1。实际编程中经常遇到这种类似的看起来很低级的错误,因此需要写“防御型代码”规避类似的“低级错误”。
3.挑战一下自己,用Java或其他编程语言编写一段代码,内容是输出这段代码本身。
4. 爱因斯坦的那道逻辑题:五个国家的人住在5栋屋子里,彼此爱好不同的饮料、香烟,养不同的宠物。①英国人住红房子。②瑞典人养狗。③丹麦人喝茶。④绿房子紧邻在白房子左侧。⑤绿房子主人喝咖啡。⑥抽“长红”牌香烟的人养鸟。⑦黄房子主人抽“登喜路”牌香烟。⑧正中央房子的主人喝牛奶。⑨挪威人住在最左侧房屋。⑩抽Blends牌香烟的人住在养猫人隔壁。⑪养马人住在抽“登喜路”牌香烟的人隔壁。⑫抽Bluemaster牌香烟的人喝啤酒。⑬德国人抽Prince牌香烟。⑭挪威人和蓝房子主人相邻。⑮抽Blends牌香烟的人与喝矿泉水的人是邻居。问:谁养鸟?
这道逻辑题我正好身边没纸笔,借助了excel,感觉和做数独差不多,线索还是很线性很明显的。