作为程序员,你必须知道这些关于计算机存储的知识——块设备、文件系统、集群文件系统、分布式文件系统、FiberSCSI、iSCSI、RAID等网络——以太网、光纤网络、蜂窝网络、WIFI、VLAN等计算机体系结构,主要是CPU指令集。x86、ARM等USB协议。需要了解URB包。PCI协议,PCI-E协议。现代计算机的外设都是基于PCI协议和PCI-E协议的。现在显卡都是通过PCI-E协议连接到电脑上的。相对来说,减少了很多需要学习的知识。搞虚拟化需要深入掌握PCI协议。图像处理——图像压缩、视频实时编码等3D游戏关系型数据库NoSQL数据库操作系统分布式操作系统编译原理机器学习——现在要用大数据!了解这些领域知识还包括了解该领域现有的商业硬件、商业软件和开源软件。很多时候,您想要完成的工作已经有了现成的工具。您只需使用现成的工具即可完成任务,无需开发。有时,您只需要结合现有工具并编写一些脚本即可完成工作。比如我想一次实现一个双向同步任务。找了一个优秀的开源软件Unison,写了一个配置文件,圆满完成了任务。无需编码。还有一次,为了实现高可用,用Python调用几个开源软件很容易就实现了。编写安装程序,自定义操作系统,了解操作系统的领域知识,写几行脚本就可以轻松搞定。没有领域知识的人可能要做很多无谓的开发,甚至开发久了才发现这是死路一条。此外,扎实的领域知识可以大大提高编程调试和错误检查的能力。了解编译器和编程语言运行时的工作方式可以让您根据编译错误和警告快速修改代码。了解操作系统的底层运行机制,可以快速找到运行时错误的根源。比如我曾经写过一个windows升级服务程序。它是一个windows服务,需要执行一个dos脚本,它会替换掉windows服务本身。我发现有时候脚本的执行是无效的。检查了一晚上,发现windows服务安装后,第一次执行脚本的时候会出现权限问题。日志是正确的,但脚本的实际执行没有任何效果。但是windows服务程序启动一次就ok了。这肯定是Windows操作系统底层安全机制的问题,因为我对Windows内核了解不多,所以花了很长时间才发现这个问题,也不知道这个问题的根本原因问题。Segment0—Domainknowledge菜鸟对领域知识了解不多,通过搜索引擎找到一些该领域软硬件的介绍性文章,按照文章的说明配置和使用软件。几乎无法使用现有的硬件和软件。第一阶段——知识领域专家了解领域内常用的硬件,深入掌握领域内常用软件的配置和使用技巧。能够利用现有的软硬件熟练构建解决方案,能够解决实际工作中遇到的各种问题。第二阶段——领域知识专家当你不仅掌握了该领域的软件和工具,知道如何使用它,而且知道它的原理,“知其然,知其所以然”,你就是该领域的知识专家这个领域。如果你知道网络协议的原理,当网络出现问题时,你就可以知道哪里可能出现问题。是mac冲突,ip冲突,还是网络环路?只有了解了存储原理,才能知道为什么这种存储方式不适合虚拟化,哪种存储方式适合虚拟化,还有一种方式适合数据备份。如果您了解PCI协议,您就会知道如何虚拟化硬件设备。只有知道了网卡硬件协议,才能模拟出虚拟机可以正常使用的虚拟网卡。只有了解了视频编码格式和原理,才能知道哪种视频格式占用带宽最少,哪种视频格式占用CPU最少。只有了解了IntelVT/AmdV指令集,才能知道虚拟化是如何实现的。您了解工作流实际上是一个状态机。只有遇到复杂的工作流,才能知道如何设计出符合要求的工作流引擎。第3段——科学家你是领域知识的专家,但你的知识来自书本和其他人。如果你满足于成为领域知识的专家,你就只能吸取别人的智慧,永远不要试图超越它。别人的研究成果不一定愿意告诉你。等到有人告诉你的时候,它可能已经发现了更新的理论,新一代可能正在路上。科学家是探索未知、创新、推动人类社会进步的人。传说思科的一位高管曾半开玩笑地说:“如果思科停止新技术的研发,华为就会迷失方向。”这是在嘲笑华为只是领域知识专家级别,只能复制,无法超越。我不知道华为的实际情况,但我希望现在的华为已经走到了领导者的位置。欧文·雅各布斯发现了CDMA码分多址的原理,发现它在通信方面大有可为,成立了高通公司。高通公司主要靠专利许可费为生,并聘请了大量科学家在通信领域进行研究。有人说高通是专利流氓。这些人不了解知识的价值。在他们眼里,Windows的合理价格应该是5元,一张CD的价格。iPhone裸机价格应该在1000元以上。高通是专利流氓,那你也流氓一个CDMA,让我看看LTE!X86芯片在设计时并未考虑虚拟化。所以就会出现所谓的“虚拟化漏洞”。也就是说,当执行一些CPU特权指令时,虚拟机环境不会抛出异常,所以不可能切换到Host。这样虚拟机就无法在X86芯片上运行了。VmWare于1998年由美国的几位科学家创立。他们发现可以使用二进制翻译技术在X86计算机上运行虚拟机。Xen虚拟化软件也是由几位科学家发明的。他们发现,只要修改虚拟机操作系统和宿主机操作系统的内核,在需要执行“虚拟化漏洞”指令时直接调用宿主机的函数,就可以实现虚拟化,操作虚拟机的性能大大提高。后来Intel在自家芯片中加入了IntelVT指令集,Amd在自家芯片中加入了AmdV指令集,以弥补“虚拟化漏洞”。于是就有了KVM虚拟机软件,直接使用CPU硬件指令来实现虚拟化。KVM在执行CPU指令时,直接在物理CPU上运行,因此效率极高。但是,虚拟机运行虚拟外设时,必须通过软件模拟,所以虚拟机的IO访问速度很慢。IBM科学家RustyRussell借鉴Xen的研发经验,创造了VirtIO技术。就是在虚拟机里面写一套PCI虚拟设备和驱动,这套虚拟PCI设备有一个虚拟设备内存。这个虚拟设备内存Host是可以访问的,虚拟机也可以通过VirtIO驱动访问。即虚拟机和宿主机共享一块内存,解决了虚拟机的IO性能问题。再讲一个关于搜索引擎的故事:很久以前,我想给一个程序加一个搜索功能。刚开始用sql查询实现,发现太慢了。后来找到了开源的Lucene项目。它采用倒排索引技术,通过在文件中建立倒排索引,大大提高了搜索速度。Google的两位创始人发现了html中链接的秘密。他们发现可以通过html页面的链接关系来设置每个html页面的权重。这就是PageRank算法。因此,谷歌的自动搜索引擎击败了雅虎的手动分类搜索引擎。OK,利用反向索引技术和PageRank,以及一个简单的html爬虫机器人,我们就可以创建一个搜索引擎了。但是,互联网非常庞大,每天都会产生大量的新网页,因此要为整个互联网建立一个反向索引是非常困难的。几年后,Google发表了三篇论文:Googlefs、Mapreduce和Bigtable。于是Lucene项目的开发者基于Google的Mapreduce论文开发了Hadoop项目。MapReduce就是利用大量的计算机来存储数据和计算,最后汇总结果。使用Hadoop+倒排索引+PageRank,你可以创建一个搜索引擎。雅虎、百度等公司都基于Hadoop开发了自己的搜索引擎。然而,其他公司的搜索引擎性能仍然无法与谷歌相提并论。我们程序员最了解这一点。像我一样,我总是出去,只是为了谷歌。吴军博士的一些文章发表在GoogleBlackboardNews上,介绍了很多机器学习知识。从文中可以看出,谷歌实际上使用机器学习来分析收集到的页面。谷歌显然不会公开这个公式。即使哪天谷歌真的公开了这个公式,可想而知谷歌一定开发出了更犀利的作弊手段,假冒产品的搜索引擎效果还是不如谷歌。山寨是创新的必由之路。在成为该领域的领先者和领导者之前,需要经历学习和模仿的阶段。但要成为行业的领头羊,成为Champion,就必须要有弯道超车的勇气,勇于走上创新之路,成为真正的科学家,真正的大牛!总结编程能力可以分为两个维度:一是编程技能水平,二是领域知识水平。一些程序员可能会把所有的精力都花在提高自己的编程技能上,而对领域知识知之甚少,这在他们的日常工作中实际上是极其有害的。有些需求可能已经有了现成的、开源免费的解决方案,或者结合现有的几个软件就能很快解决,但又要花很多时间自己开发。另外,由于缺乏领域知识,当程序出现意外情况时,很难快速定位问题根源并解决bug。
