Learn a Little Bit Math Again
工作以后,做Web开发,做DBA,数学似乎没有太多的用武之地,其他的学科如物理、化学、 生物就更不用说了,时间一长,它们就会很快被遗忘;若不是需要解决一些实际问题,恐怕很难再捡起来。当然,若是对此有兴趣就另当别论,比如这位Matrix67,北大中文系应用学专业,却是一位数学宅,认为生活中的数学无处不在,无时不影响着我们的生活。
计算机领域同样如此,所以有人说,计算机是数学家一次失败思考的产物,这涉及到计算机的理论基础、发展历史,是一个很宏大的主题,以我的水平很难说出一二来。不过,倒是断断续续看过一点相关的东西,如《编码:隐匿在计算机软硬件背后的语言》 (英文版《Code: The Hidden Language of Computer Hardware and Software》),以及阮一峰:四位计算机的原理及其实现。 看完这些,可以明白计算机的基本原理,若是手脚勤快点,也可以动手做一个雏形。
但实际情况是,我们往往会认为知易行难。这有点儿类似于理论与实践的关系了,结果是,道理人人都懂,但并不是每个人都懂得如何运用。面对这种情况,有可能会导致另外一个极端,那就是只重实践而忽视理论。
对我们程序猿而言,似乎更容易这样,因为”Talk is cheap, show me the code!”,所有的关注点都放在了如何实现上面;即使有设计,那时的设计也会轻易的深陷于某些语言或框架。我所接触的Web项目大抵如此,这里建议程序猿们不妨读一读刘未鹏的这篇方法论、方法论——程序员的阿喀琉斯之踵 以及文中的延伸链接;至于项目经理这类决策者、管理者请慎入,基于我的经历和偏见,稍后另写一篇博客以作总结。最近的一年多我在做DBA,虽然入行不久,但这方面的体会还有一些。开始的一年,一个人单挑近十台生产环境的服务器,因为从小白入门顿觉各种不会和压力山大,为了存活下来,数据库、应用、主机、网络、存储甚至硬件都要懂一点,但DBA又作为IT部门的打杂工、客服人员,经常会被打断、围绕着一个一个问题做Solution或Workaround,可以自由自配的时间少之又少,甚至连总结反省的时间只能通过加班来弥补,结果是看完一本Oracle Online Document就需要一年多的时间。这还不算什么,其中还有很多有趣的故事,为避免追捕我就不一一提及;概括起来,就是入门的 DBA(包括系统管理员)往往会被一些”奇技淫巧”所累:相比理解那些基础的概念,掌握一个个工具、一个个命令、一个个操作解决问题才会让人觉得你有多么牛,至于为什么要这样做、基本原理是什么、如何有效避免等往往从不过问和思考,所以同样的问题和操作会以一种令人恶心的频率重现,当然这样的人自然会经验丰富:-D。还有另外一个十分重要的话题,性能问题:堆叠硬件、搭建集群似乎成了银弹;而下此结论往往有太充足的理由:立项和购置服务器时没有料到有这么大的并发量;性能监控和测试报告显示CPU、内存不足,偶尔还有大规模的网络延时。对此,我也可以说是手足无措,再者机器似乎往往比程序猿便宜,而且还很靠谱;但你不觉得结论和补救措施来得太匆忙了吗?从一个低水平DBA团队里得出这样的结论,我又会认为这是一件很正常的事儿,只可惜有了”大胆假设”却缺乏小心求证”的钻研精神。说到这儿,顺手推荐几篇文章:陈皓:性能调优攻略,The C10K Problem;使用Oracle数据库的程序猿请看看叶老的一篇老文面向程序员的数据库访问性能优化法则;把Tomcat用到生产环境或用Tomcat搭建集群的同学可以看看FAQ/Performance and Monitoring - Tomcat Wiki,Tuning Tomcat Performance For Optimum Speed - A Step By Step Guide,以及Fronting Tomcat with Apache or IIS - Best practices,说不定可以打打鸡血,补充一些理论知识和解决方法。
(以上有点扯远了,虽然提到的是性能问题,但归结起来,也可以说是理论不足所致)后来的情况似乎会好转一些,因为陆续新增了一些DBA,人手一多,每个人的责任范围会缩小,投入的时间和精力会更加集中,经过反复的瞎折腾,总能找到适合自己的一条路慢慢探索下去,只是不要成为另一种意义上的堆叠和集群就好。作为一个打不死的小强,自认为还保留了一些”知其所以然” 的”超能力”,所以还不忘刨根问底,不忘多问一个为什么,也不忘多看看基本原理和概念,只是眼下已经不做DBA了。
还是回到数学上来,这也是一种理论,但似乎比人尽皆知的道理更加难以运用。
大学学到的高等数学、线性代数、数理统计与概率论等等数学知识差不多已经忘光了,现在对数学再次产生学习的动力和兴趣始于工作期间看过的关于贝叶斯推断的一系列博客以及由此扩散开来的一些阅读:
- 最先看的一篇是 Peter的How to Write a Spelling Corrector,中文翻译见徐宥:怎样写一个拼写检查器。初看到这个题目,有点无从下手,但只要你认真看看Peter在乘飞机途中娓娓道来的讲解,你会惊讶于他是怎么样一步一步化猜测为理论模型并和贝叶斯扯上关系的;当你试着敲完代码 进行拼写检测时,会发现这个程序还真的会读懂你的心思;但回过头来看看,里面运用的只是大伙儿所熟知的全概率公式,可是为什么我就想不到呢。
- 紧接着,看了阮一峰的贝叶斯推断及其互联网应用系列博客,见(一):定理简介,(二):过滤垃圾邮件,(三):拼写检查,以及刘未鹏:数学之美番外篇:平凡而又神奇的贝叶斯方法,熟悉了贝叶斯方法的原理和常见应用。
- 再接着直接买了吴军的《数学之美》,利用每天中午休息的时间看一点点,这时的情绪体验会更加愉悦:初窥数学之美,了解了一些隐 藏在复杂问题背后的数学模型和原理。
- 直到最近看CS61A:SICP with Python,在讲Functions的小节中遇到怎样使用加减乘除运算来求一个数的平方根的问题,这时Newton’s method出现了(如果初小教育靠谱的话,应该有老师讲过)。
以上博客或书中提到的问题,没有一些数学基础,单从理论上就很难解决,直接编程实现就有点像无头苍蝇,若真碰巧解决了,我能说是瞎猫碰上死耗子吗。近来掀起的Data science热、Machine learning热等等离开了数学根本就没法玩。
鉴于以上原因,我需要再学习一点数学知识,打打理论基础,并重理论和实践,不玩瞎猫捉死耗子的游戏。
发一张励志的图:
延伸阅读
- 刘未鹏:康托尔、哥德尔、图灵 – 永恒的金色对角线
- 刘未鹏:方法论、方法论——程序员的阿喀琉斯之踵
- 阮一峰:四位计算机的原理及其实现
- 陈皓:性能调优攻略
- The C10K Problem
- FAQ/Performance and Monitoring - Tomcat Wiki
- Tuning Tomcat Performance For Optimum Speed - A Step By Step Guide
- Fronting Tomcat with Apache or IIS - Best practices
- Peter Norvig: How to Write a Spelling Corrector
- 徐宥:怎样写一个拼写检查器
- 阮一峰:贝叶斯推断及其互联网应用(一):定理简介
- 阮一峰:贝叶斯推断及其互联网应用(二):过滤垃圾邮件
- 阮一峰:贝叶斯推断及其互联网应用(三):拼写检查
- 刘未鹏:数学之美番外篇:平凡而又神奇的贝叶斯方法
关于工作
- 陈皓:软件开发的”三重门”
- 陈皓:挑战无处不在
- 陈皓:加班与效率
- 陈皓:《Rework》摘要及感想
- 陈皓:编程能力与编程年龄
- 刘未鹏:什么才是你的不可替代性和核心竞争力
- 刘未鹏:怎样花两年时间去面试一个人
- 阳志平:记住你的样子:写给毕业生的十篇文章
相关书籍
博客专栏
资源索引
Wiki条目
- No Silver Bullet
- Math
- Newton’s method
- Thomas Bayes
- Bayes’ theorem
- List of things named after Thomas Bayes
- Computer science
- History of computer science
- Artificial Intelligence
- History of Artificial Intelligence
- Data science
- Machine learning
blog comments powered by Disqus