从我踏入大学的那一刻起,我似乎就被打上工程师的烙印。纵然我考上了公务员,但是我仍然无法放下那门技能。用Python折腾文本处理,用Django开发应用监控系统,用utils来刷刷亚马逊抢aptamil。我从不喜欢别人叫我码农,因为我不是那种像农民耕作代码,日复一日的人。我只认同我是一名攻城狮,因为在这个领域,我有我独特的性格,我有我喜好,不是所有的与计算机相关的东西我都愿意接触。我只愿意和我认为,精巧与优雅的技术打交道,我追求人类的更高的生存状态,我希望把某一种语言发挥到极致,挖掘特性用最少的语句完成尽量多的事情。我从来不认同那些默默加班,放弃品位,用时间换空间的做法;我可以加班,甚至可以通宵,可能最后的产物只有几句代码,但是绝不会把时间放在那些代码的体力活上。很庆幸,我在中兴和在电信的工作都是这样的。虽然我不是一个极有天赋,能力极强的攻城狮,但是对一般的工作还是可以应付的。google加stackoverflow的组合其实可以解决大部分的问题,所以上不去google的时候,那就是阴天,大阴天。在我眼中,其实没有太多太难的东西,只在于资源有没有找对。编程只是个范型,正如设计模式一样,基于众多范型的架构元范型。其实软件业和建筑业是何其的相似,都是一个集成了艺术,文化,结构以及技术的产物,甚至设计模式的想法都是来源于建筑业。技术高超的架构师和设计师的价值就在于如何规划与整合各个系统里头的资源与功能,这种工作绝对不可能是先埋头苦干先写代码就能出来的。
而当前的苦闷,正如人月神话的布鲁克斯所说的那样,项目就像一个巨兽和焦油坑的故事,越挣扎陷得越深,陷得越深越挣扎;当你拘泥于细节的时候,就如带领一个外科医师的手术团队,光有主刀医生,没有副手,麻醉师,护士以及好的工具。三年来,所有的专业技能没能制止巨兽掉入一个个焦油坑,也没能制止单人外科手术医生团队的出现,更无法阻止宏大的国际空港变成小直升机场。思成先生说,建筑师是幸福的,因为他可以看到很多美的东西;建筑师也是痛苦的,因为他也会看到很多丑的东西。我的痛苦不止于看到很多丑的东西,而是看着本来美的东西变丑却无能为力。或许这是每个软件工程师的痛苦,因为这份工作就要要求他考虑各种情况,各种异常,而且这个思考模式同时也融入了他的生活。同时包括我想放弃这份工作,换一种生活状态,我自己面临巨大的痛苦与挣扎,无不是各种switch和if-else的组合。
每个受过算法训练或者系统学习过算法知识的工程师都会发现,所有的算法都是当下社会的抽象。从如何组织数据到数据结构,到排序,到遍历树,遍历图,分治法,对策论,其实哪一个不是公共管理政策的体现?这个说法延伸到计算机技术里头都是想通的。我曾经很想以散文的形式聊聊程序与人生,但是作为一个不太能算工程师的工程师,说这个有说服力么,如果是vczh说的话,那就不一样;而且我人生也不算成功或出彩,似乎也不具备什么说服力。如果说程序与悲剧人生,估计还是有点看头,然而我也只是不顺,离悲剧吧还有点远,至少我忍受不了把美的东西破坏掉,且慢我人生虽然不是悲剧,但是我总是这些悲剧的观众,太难受了。我只想谈谈这其中的贪心算法,我们总会被教育要有长远的目光,要有长远的打算,可是有人定义过长远究竟是多长?1m,1km还是1光年?明显前面扯犊子了,应该是1年,5年还是10年还是20年,抑或是一辈子?
假若猴子有一個容量為 80 單位的背包(猴子應該不使用背包的,一笑!),桌上有幾個蜜桃,體積分別為 65、35、35、30、30、20 單位,作為一日工作的報酬,主人讓猴子隨意取走桌上的蜜桃,裝入背包內,惟不可貪心,取走多於背包的容量,且放了任何一個蜜桃入背包之後,不可退出。在未有量度背包容積和蜜桃的體積前,猴子按貪婪算法,選擇了最大的一個桃,放入背包。猴子往後再試,累皆失敗,最後只能取走 65 單位的蜜桃,遂與 30 + 30 + 20 = 80 單位的最優解無緣。
上面的两个例子,分别就是贪心算法的不成功和成功的情况,猴子选了当前最大的桃子,却不是利益化最大的组合;旅行商要选择旅游过程中最短的路径,明显是需要全遍历才能完成的,但是每次都选最近的一个地点,却很有可能是比较短的路径,只是可能,但是却很省事。所以贪心算法就是,人面临选择,总是选当前利益最大化的,期望能出现旅行商那条较短的路径(有可能的是最优的,也有可能是最远的),但是如果出现猴子的情况,那就糟糕了,怎么说呢其实也不算太糟糕了,如果你不要求利益最大化的话。
回到选择的问题上来,如果你是我,你会跳槽么?