我是被迫转型的,由于项目变动不得不做应用层开发。刚开始很痛苦,完全提不起兴趣。我之前有着国内大多数初出茅庐的技术小青年的通病:觉得做底层很牛B,
做应用开发门槛低,没前途。于是我迷茫啊,消极怠工啊,继续钻我感兴趣的底层,转型3个月后我觉得不能忍受了,于是准备跳去做solaris的
kernel(虽然当时sun已经风雨飘渺了)。后来和几个资深的长辈聊了几次,又没去(主要当时大家都不看好solaris,觉得sun一倒它迟早要被
干掉)。
后来我接手两个项目,都是做中间件,我白天coding一个项目,晚上coding另一个。这个时候我态度已经端正了,准备老老实实的做应用开发。这个过
程中,我才发现原来应用开发的难度远远超出我之前幼稚的想象。由于之前我没有相关经验,很多问题我根本就不知道业界通用的解决方法是什么。之所以说“业界
通用”,是因为在面对一个未知的问题时,我会首先去看已有的、成功的开源项目在解决这个问题时是怎么处理的,而不是自己想当然写出难看的Code。于是我
花费了很多开源项目的Code,其间读的很痛苦,因为很多库我都不熟悉,比如glib。做底层的经验给我带来的一个坏毛病是:喜欢钻牛角尖。比如当初我在
用glib的event
loop的时候,搞不清楚它怎么实现的,于是花很多时间去看glib的code,这耽误了我不少功夫。另一麻烦就是应用开发的很多工具不会用,例如
autoconf/automake/libtool这一套,也花了不少时间学习。总之是个非常艰难的转型,远不是当初想象的底层转做应用就是牛刀杀鸡一
样,难多了。
现在转型已经两年了,自己有一些经验。
1. Kernel is not difficult, it's just different
这话不是我说的,忘了是哪位大牛说的了。这里借用这句话,kernel泛指底层开发。说实话,要一辈子吃底层饭,绝对比一辈子吃应用开发的饭简单多了。原
因在于底层开发是个收敛系统,应用开发是个发散系统。底层受限于硬件,虽然有不断的新feature,但相比应用层技术的革新,那真是慢太多了。在底层开
发,时间越久经验越多,可谓一艺通,百艺精,你在一个子系统的经验很容易扩展到其它子系统。应用开发就不一样了,很多需要专业知识,例如你multi-
media搞的再精,也扩展不到语意网搞搜索。此外说底层开发收敛,是说在一个code
base的基础上,你要的东西都可以找到。例如你在内核中看到一个函数,就可以在内核中找到实现。而应用开发发散,当你看到一个没见过的函数时,很可能就
意味着你要学习一个新的库了。
2.国内大多数搞底层的人,涉及不到架构设计,只是修修补补
这个是现状。当然你的patch被kernel接收,那是很牛的,每年能贡献10几个patch,如果在国内是独立开发者的话那肯定是很有名的人了。但即
使这样的牛人,我认为他也无法但当起应用开发中architecture的角色。为什么?他缺乏大型项目的经验。搞底层的code量很小,如果是发
patch,上千行那是非常不得了了,基本上是在改写子系统。通常也就几行、百行左右的规模(当然,虽然code量少,但却是涉及的内容广)。但这和应用
开发中的架构设计完全不一样。应用开发没有个几万行(对于小项目)、10万行以上编程经验,拿到一个项目,要做架构设计,基本不可能。考虑的东西太多了,
这是应用开发的业务复杂决定的。一开始没设计好,随着代码量的增多,后来改就太麻烦,太难了。特别是做中间件,一开始可能你API文档都release出
去了,在实现过程中发现不对,要改,这对使用你库的用户来说简直是不可能接受的。这也是为什么我在做项目前要大量调查已有的开源项目如何解决问题的原因。
因为我之前的code量少,没有这种设计经验,所以我不得不大量阅读好的项目的代码,从中学习。
3.应用开发涉及太多的专业知识
例如前面举例的multi-media、语意网。很多时候你要花大量时间学习业务,这和底层学习硬件原理类似。不相同的是应用开发的业务很多没相通性,也就是说你无法重用你之前的经验。而硬件的相通性非常大的。
4.应用开发需要更多的技能
做底层把C搞精,再加个汇编,基本就行天下了。应用层就不说了,不是一门语言能解决所有问题的,不然我也不学C++了。
以上几点是我转型中感到底层转应用的难处。下面说几点好处:
1. 自下而上的学习,比自上而下的学习简单多了
抛开业务,仅从technical的角度讲,底层转应用,可能开始要学习的东西很纷杂,但能很快明白它们内在的机理。因为你有操作系统的知识,你知道系统
是怎么运行、程序是怎么跑的,所以你知道哪些事情在现有的计算机体系下可以做,哪些不能;哪些事情是编译器的工作、哪些是操作系统的工作,不会问出“假设
我有一个打开却忘了关闭的文件描述符,编译器能不能检测到这条语句,在后面加条语句关掉”之类的问题。如果一开始就做应用开发,又没有刨根问底的精神的
话,很容易停留在问题的表面,而忽略了技术背后的实质。
2. 你能写出更好的程序
这也是源于你的操作系统知识,在涉及到效率、性能的问题上时,你知道该如何写出好的程序。
3. 对于应用和内核交互的程序,你会得心应手一些
这是很明显的。
说一个应用开发烦人的地方:当你把架构设计好,业务熟悉后,很多工作就是体力coding,久了烦躁
以上就是我的一些经验。从这次转型,我觉得从对技术的认识上成熟了,不会轻视任何一项技术,也不会觉得任何一项技术是高不可攀的。例如我有个朋
友,CSDN的web专家,对我说PHP没什么难的,很容学,门槛低,言下之意没什么意思。但我觉得问题本身不在于这个语言的门槛如何,而在于你有长期的
web经验,加上你熟悉这个语言,于是你可以用它快速的解决问题,你的价值在于你知道很多业务在这个背景下业界如何解决,不在于市面上学习这门语言的人有
多少。又比如我以前觉得搞算法的很牛B,高不可攀,但我现在认为只是我们从事的工作不同而已,只要不是搞数学研究的,大部分做算法的还是把现成的、经典的
算法加以运用而已,这和懂很多硬件知识没有本质区别。
最后要说的是往应用走比往底层走,路宽些,说俗点就是容易发财些
此外对于很多搞应用的朋友,浮躁的缺点要避免,多把自己的项目搞深入点,不要做的多,懂的少。每做一个项目应该得到得收获是,你知道了业界对于这种项目通用的方案是什么,并且知道细节。当你做的项目多了后,你的经验累积那不得了,可以当consultant了
最后举个我老大的例子,当年我还啥都不懂时他带我出道的。我老大现在移民美国,在硅谷发展,走之前是世界最大存储公司的principal
engineer。他底层搞得很深,简历里写“A lot of knowledge in system architecture, such
as x86/ia64 architecture, MMU, cache, PCI, power management, ACPI,
BIOS, RAS, SMP, IOMMU, NIC and VGA
etc..”,上次听在美国的朋友说他感叹说自己的知识面太窄了。由此可以见底层的知识面和应用的知识面纯粹是两个范畴。
阅读(1281) | 评论(0) | 转发(0) |