对技术的态度
最近人品爆发,图灵社区,InfoQ,51CTO相继对我做了采访,前两天我把InfoQ对我的采访张贴了出来,今天,图灵社区和51CTO对我的采访发布了(图灵的访谈 ,51CTO的访谈),我是一个有技术焦虑症的人,我的经历比较特殊,对大家来说可能也没有什么意思,这两个采都有一些重叠的部分,不过有些观点我想再加强一些,并放在这里和大家一起分享一下。
目录
对于日新月异的新技术,你是什么态度?
遇到新技术我会去了解,但不会把很大的精力放在这些技术(如:NoSQL,Node.js,等)。这些技术尚不成熟,只需要跟得住就可以了。技术十年以上可能是一个门槛。有人说技术更新换代很快,我一点儿都不觉得是这样想。虽然有不成熟的技术不断地涌出,但是成熟的技术,比如Unix,40多年,C,40多年,C++,30多年,TCP/IP,20多年,Java也有将近20年了……,所以,如果你着眼成熟的技术,其实并不多。
我的观点是——要了解技术就一定需要了解整个计算机的技术历史发展和进化路线。(这个观点,我在《程序员练级攻略》和《C++的坑多吗?》中提到过多次了。)因为,你要朝着球运动的轨迹去,而不是朝着球的位置去,要知道球的运动轨迹,你就需要知道它历史上是怎么跑的。
如果要捋一个技术的脉络,70年代Unix的出现,是软件发展方面的一个里程碑,那个时期的C语言,也是语言方面的里程碑。(当时)所有的项目都在Unix/C上,全世界人都在用这两样东西写软件。Linux跟随的是Unix, Windows下的开发也是 C/C++。这时候出现的C++很自然就被大家接受了,企业级的系统很自然就会迁移到这上面,C++虽然接过了C的接力棒,但是它的问题是它没有一个企业方面的架构,而且太随意了,否则也不会有今天的Java。C++和C非常接近,它只不过是C的一个扩展,长年没有一个企业架构的框架。而Java在被发明后,被IBM把企业架构这部分的需求接了过来,J2EE的出现让C/C++捉襟见肘了,在语言进化上,还有Python/Ruby,后面还有了.NET,但可惜的是这只局限在Windows平台上。这些就是企业级软件方面语言层面就是C -> C++ -> Java这条主干,操作系统是Unix -> Linux/Windows这条主干,软件开发中需要了解的网络知识就是Ethernet -> IP -> TCP/UDP 这条主干。另外一条脉络就是互联网方面的(HTML/CSS/JS/LAMP…)。我是一个有技术忧虑症的人,这几条软件开发的主线一定不能放弃。
另外,从架构上来说,我们可以看到,
- 从单机的年代,到C/S架构(界面,业务逻辑,数据SQL都在Client上,只有数据库服库在S上)
- 再到B/S结构(用浏览器来充当Client,但是传统的ASP/PHP/JSP/Perl/CGI这样的编程也都把界面,业务逻辑,和SQL都放在一起),但是B/S已经把这些东西放到了Web Server上,
- 再到后来的中间件,把业务逻辑再抽出一层,放到一个叫App Server上,经典的三层结构。
- 然后再到分布式结构,业务层分布式,数据层分布式。
- 再到今天的云架构——全部移到服务器。
另外,我听到有很多人说,一些技术不适用,一些技术太学院派,但对我来说,无论是应用还是学术,我都会看,知识不愁多。何必搞应用的和搞学术的分开阵营,都是知识,学就好了。
技术的发展要根植于历史,而不是未来。不要和我描述这个技术的未来会多么美好(InfoQ 的 ArchSummit大会上有一个微软来的人把Node.js说得跟仙女一样,然后给了一个Hello World),我承认你用一些新的技术可以实现很多花哨的东西。但是,我认为技术都是承前的,只有承前的才会常青。所以说“某某(技术)要火”这样的话是没有意义的,等它火了、应用多了,规模大了,再说。有些人说:“不学C/C++也是没有问题的”,我对此的回应是:如果连技术主干都可以不学的话,还有什么其他的好学呢?这些是计算机发展的根、脉络、祖师爷,这样的东西怎么可以不学呢?
另外,我们要去了解整个计算机文化,我觉得计算机文化源起于Unix/C这条线上(注意,我说的是文化不是技术)。我也写过很多与Unix文化相关的文章,大家可以看看我写的“Unix传奇(尤其是下篇)”。
可是在应用环境中,对新技术的需求是很高的,你觉得在教育领域计算机科学的侧重应该是什么样的?
学校教的大部分都是知识密集型的技术,但是社会上的企业大部分都是劳动密集型的。什么是劳动密集型的企业呢?麦当劳炸薯条就是劳动密集型的工作,用不到学校教授的那些知识。如果有一天你不炸薯条了,而要去做更大更专业的东西,学校里的知识就会派上用场。有人说一个语言、一个技术,能解决问题能用就行了,我不这样认为。我觉得你应该至少要知道这些演变和进化的过程。而如果你要解决一些业务和技术难题,就需要抓住某种技术很深入地学习,当成艺术一样来学习。
我在“软件开发‘三重门’”里说过,第一重门是业务功能,在这重门里,的确是会编程就可以了;第二重门是业务性能,在这一重门里,技术的基础就很管用了,比如:操作系统的文件管理,进程调度,内存管理,网络的七层模型,TCP/UCPUDP的协议,语言用法、编译和类库的实现,数据结构,算法等等就非常关键了;第三重门是业务智能,在这一重门里,你会发现很多东西都很学院派了,比如,搜索算法,推荐算法,预测,统计,机器学习,图像识别,分布式架构和算法,等等,你需要读很多计算机学院派的论文。
总之,这主要看你职业生涯的背景了,如果你整天被当作劳动力来使用,你用到的技术就比较浅,比较实用,但是如果你做一些知识密集型的工作,你就需要用心来搞搞研究,就会发现你需要理论上的知识。比如说,我之前做过的跨国库存调配,需要知道最短路径的算法,而我现在在亚马逊做的库存预测系统,数据挖掘的那些东西都需要很强的数学建模、算法、数据挖掘的功底。
我觉得真正的高手都来自知识密集型的学院派。他们更强的是,可以把那些理论的基础知识应用到现在的业务上来。但很可惜,我们国内今天的教育并没有很好地把那些学院派的理论知识和现实的业务问题很好地接合起来。比如说一些哈希表或二叉树的数据结构,如果我们的学校在讲述这些知识的时候能够接合实际的业务问题,效果会非常不错,如:设计一个IP地址和地理位置的查询系统,设计一个分布式的NoSQL的数据库,或是设计一个地理位置的检索应用等等。在学习操作系统的时候,如果老师可以带学生做一个手机或嵌入式操作系统,或是研究一下Unix System V或是Linux的源码的话,会更有意思。在学习网络知识的时候,能带学生重点学一下以太网和TCP/IP的特性,并调优,如果能做一个网络上的pub/sub的消息系统或是做一个像Nginx一样的web server,那会更好。如果在学图形学的过程中能带领学生实践一个作图工具或是一个游戏引擎,那会更有意思。
总之,我们的教育和现实脱节太严重了,教的东西无论是在技术还是在实践上都严重落后和脱节,没有通过实际的业务或技术问题来教学生那些理论知识,这是一个失败。
那么,现在做一个软件开发者是否更加困难了?
我觉得倒不是。做一个软件开发者更简单了。因为现在互联网很发达,你可以找到很多共享的知识——相对于我那个时候。第一,知识你容易查到,然后社区很多,文章、分享的人也越来越多。我们那个时候没有的。上网一查,什么都没有。都得去自己琢磨,自己去调查。所以我觉得相比我们那个时候更容易了。第二,工具变多了。现在的工具比那个时候好用多了。我们那个时候就是一天到晚在vi里面,连个自动提示都没有,连个版本库管理都没有。不光工具变多,框架也多了,各种各样的编程框架。我们那时候都是生写。写JavaScript,生写,连个jQuery都没有。没有这些辅助性的、让你提高生产力的东西。J2EE那时候也没有。而且整个(开发环境)都很不成熟。一个服务器的最高配置就1GB的情况下,一个WebSphere起来就占了900多MB——这还能跑什么应用?所以只能去用最基础的系统。所以我觉得现在,无论是环境,还是开发的过程,都更规范了。以前我做开发的时候就是,什么都不懂就上了,瞎搞,没有什么开发规范,没有人理你,反正你搞得好就搞好,搞不好就搞不好了,全靠自己,包括做测试维护等等。我觉得现在的软件开发就很好,你一上去,就有好的工具,有好的知识库,有好的社区,有好的开发框架,还有好的流程,方法,甚至还有人帮你做测试,还有人告诉你应该怎么做。幸福得很。现在好多人还说这个不好那个不好,开发难什么的。其实容易多了。
但是,有个东西我觉得是现在的软件开发者比我们那时候变得更难的。就是,你享福了以后,人就变懒,变娇气了。对很多东西的抱怨就开始多了。我们那个时候哪有什么好抱怨的?没啥好抱怨的,有活就干,有东西学就赶快学。现在呢,学个什么东西还挑挑拣拣的,抱怨这个语言太扯,那个IDE不好,这个框架太差,版本管理工具太扯,等等。这就好像以前我没东西吃,只有个糠吃,要是有面包有馒头,我就觉得非常非常好了。现在是,好吃的东西多了我们还学会挑食了,这也不好用,那也不好用。
根本就不是技术变难了,环境变差了,是程序员变娇气了。所以软件开发变难,归根结底还是程序员们自己变娇气了。
你如何在进度压力下,享受技术带来的快乐?
中国人中庸的思想,入世和出世,每天的工作就是入世。举个例子,我十年前在上海的时候,给交通银行做项目的时候,每周休息一天,早九点到晚十点,每天工作12个小时,这样的工作持续了一整年,没有节假日,项目上的技术也没什么意思。当时我晚上十点回到住处,还想学一些C++/Java和Unix/Windows的技术,于是就看书到晚上11:30,每天如此,一年下来学到很多东西,时间没有荒废,心里就很开心。我觉得当时是快乐的,因为有成长的感觉是快乐的。
现在的我,工作、写博客、养孩子,事情其实更多。我早上7:30起床,会浏览一下国外的新闻,hacker news, tech church, reddit, highavailability之类的站点,9点上班。晚上6、7点钟下班,开始带孩子。十点钟孩子睡了觉,我会开始重新细读一下这一天都发生了些什么事情。这个时间也有可能会用来看书。学习的过程(我)是不喜欢被打断的,所以从十点到十二点,家人都睡了,这正是我连续学习的好时间。可能从晚上11:30开始,我会做点笔记或者写博客。我现在对酷壳文章的质量要求比较高一些,所以大概积累一个星期的时间才可以生成一篇文章。每天我大概都在一两点钟才会睡觉。没办法,我有技术焦虑症。但是觉得这样的生活很充实,也很踏实。
另外,任何一门技术玩深了,都是很有意思的。有些人形成了一个价值取向,“我只做什么,绝不做什么”。前段时间有一个刚来亚马逊的工程师,他原来做的是数据挖掘推荐系统,原来的公司重组要让他做前端,他不肯就离职了,他说他不想做前端。我觉得,前端后端都是编程,Javascript是编程,C++也是编程。编程不在于你用什么语言去coding,而是你组织程序、设计软件的能力,只要你上升到脑力劳动上来,用什么都一样,技术无贵贱。你可以不喜欢那个技术,但是还是要了解了解,也没有必要完全不用,完全抛弃。Javascript啊——只要能被Javascript实现的,未来总有一天会被Javascript所取代。
回到问题,怎么才能享受到快乐呢?
- 第一,入世和出世要分开,不要让世俗的东西打扰到你的内心世界,你的情绪不应该为别人所控,也不应该被世俗所污染,活得真实,活得真实你才会快乐。
- 第二,就是要有热情,有了热情,你的心情就会很好,加班都可以是快乐的,想一想我们整个通宵用来打游戏的时光,虽然很累,但是你也很开心,这都是因为有了热情的缘故。
总之一句话——如果你没有兴趣,什么都是借口,如果你有兴趣了,什么都是好玩的。
(全文完)
(转载本站文章请注明作者和出处 酷 壳 – CoolShell ,请勿用于任何商业用途)
《对技术的态度》的相关评论
软件开发三重门那段里的 TCP/UCP应该是TCP/UDP把
Javascript啊——只要能被Javascript实现的,未来总有一天会被Javascript所取代。
这句啥意思,是想说能被java实现的都会被javascript取代么
写得太好了!
Javascript啊——只要能被Javascript实现的,未来总有一天会被Javascript所取代。
这句话有点意思
学长的文章一直很赞哈,很多观点都深有共鸣,经典、伟大的技术耐得住时间的打磨,都是经得起考验的。李彤院长在上操作系统上也一直在强调这一观点,特别是Unix方面。只不过觉得大学的操作系统课难免理论讲授成分过多了,而我们动手实践的时间和机会很少,只能是很抽象的理解操作系统的概念。这个状况和学长对大学目前的教育状况剖析基本一致。还是边读Unix源代码变理解操作系统的相关原理和概念才觉得有滋有味。期待学长能有更多好的文章分享给大家!^_^
能解释下,这句我没看懂,还以为是写错了。求解答@weisi
现在刚刚入世 对工作没有100%的投入 反倒是做自己的小东西 即使没技术含量的也很投入很happy。
记得《黑客与画家》里说 那时的hacker都有2份工作 一份白天的正常工作 一份晚上自己真正喜欢的。
以博主自勉,循着自个的兴趣,一步一步走,现在赶脚很充实! ^_^
@虫
意思就是说Javascript能实现很多东西,比如linux模拟器,gameboy模拟器等。。而用Javascript开发又很简单,就没必要用复杂的语言写了。
刚说道模拟器,这不就来了个:http://hulkholden.github.com/n64js/ javascript写的N64模拟器,很慢就是了。所以说只要以后性能上去了就不是问题。
JavaScript有着很多问题,你认为几年内会有较大的进化么?会向什么方向进化?
另外,你如何看到Google的Dart和Mozilla的Rust?你认为他们或者其他类似的技术终会取代JavaScript么?
赞一个,受教了。
关于软件开发是不是变难了,其中开发者态度和王垠的很想,英雄所见吧。大家都希望别人能够解决自己遇到的问题,希望等到更称手的、符合自己习惯的工具。而这样的东西是不可能存在的。
拜读了
写的真心不错,我父亲也是一个30年经历的程序员,中国第一代系统分析员,也是天天提醒我要打捞自己的基础。对于工具的态度,和我们自己写程序的能力和态度比起来,工具的选择往往还不是最最重要的问题。希望自己也能够坚持天天学习,持续进步吧。
这些是计算机发展的根、脉络、祖师爷,这样的东西怎么可以不学呢?
这个论证不太好吧…..比如汇编,比如内核
虽然大部分计算机科班的都要学汇编
@kk
用Javascript开发很简单………………
JS 只是在大家的机器上不需要安装什么都能跑起来而已。
“每天一两点睡觉,七点半起床” —— 不要命了呀!
@依云
我觉得 javascript 开发其实很不简单,开发简单的东西还说,稍微上点复杂性,那测试呀,什么的都很麻烦,主要是太灵活了。
“每周休息一天,早九点到晚十点,…….. 于是就看书到晚上11:30,每天如此”,实在佩服楼猪,要么是神要么你就睡公司,10点下班 看书到晚上11点30 ,除去路上N分钟,回家洗个澡,尼玛你哪来时间看书,NB吹大了,最BS这种尼玛说话不经过大脑
@真YY 呵呵。当时在银行封闭式开发,你可以认为是睡公司,呵呵。
佩服老师的气度@陈皓
TCP/IP的发明,貌似不是20多年,而是超过30年快40年了吧?
写得真好
陈浩老师要是能来高校教书该多好啊!
真理:”学校教的大部分都是知识密集型的技术,但是社会上的企业大部分都是劳动密集型的。”
收益良多。
我刚工作两年,身边不少朋友也喜欢谈论技术。 我们有些浮躁, 说这个不好, 那个不好,这个不愿意学,那个不愿学。
看了这篇文章, 可以让我们踏实一点。
谢谢。
【麦当劳炸薯条就是劳动密集型的工作,用不到学校教授的那些知识】这个有点外行歧视了吧,怎么高效、安全、可口、低成本,也是需要知识+实践的。
【刚来亚马逊的工程师】的离职,也许只是因为公司不让他发挥专长,觉得公司太随意、不尊重,而这样的公司。。。。
其他基本认同,只是对js的看好,感觉有点像当年的java/xml崇拜了
1)【麦当劳炸薯条就是劳动密集型的工作,用不到学校教授的那些知识】怎么看出歧视啊?
2)【刚来亚马逊的工程师】的离职,你理解错了,是他离职来亚马逊。
多谢指教@kk
这是唯一真实而能让我反思提高自己的地方。比起其他地方无尽的虚火,真是难能可贵
很同意博主的说法,编程重点不在用的是什么语言,关键还是软件设计架构的能力。
收获很多。多谢分享!
很好。兴趣是最好的老师。
一直关注博主的博客,受益良多,谢谢。
关于javascript,那句话说的没错,云是未来的趋势,所有业务都向两极分化 — 向前端和后端 ,客户端上的事未来js都能包办,虽然移动终端现在还是native app多,但是从pc的进化趋势上,移动终端以后也是web的天下
“这就好像以前我没东西吃,只有个糠吃,要是有面包有馒头,我就觉得非常非常好了。现在是,好吃的东西多了我们还学会挑食了,这也不好用,那也不好用。”—— 专业术语是 边际效益递减 :)
呵呵,该博客竟然会记住评论的用户,第一次发现
如果你没有兴趣,什么都是借口,如果你有兴趣了,什么都是好玩的。
最近有些浮躁,看了这篇文章,平静多了。
说的太好了,受益非浅,感触很多
建议楼主早些休息,注意生活节奏.个人觉得,技术/知识是无止境的,life是有止境的.不能以有涯求无涯.
谢谢关心!
一直在看,从来没发言,今天也来顶一个。高质量的文章,一周一篇也值了;至少我在每篇文章里都收获不少,值得花时间去读。非常钦佩这种对读者负责的态度。
先发表言论再看。我是觉得电脑辐射太强了,像我这样回家就光着膀子面对电脑的感觉皮肤都快变了。以前看过皓哥好像说是每天2点以后才休息,还有云风也似乎是夜里码code中午起来的,感觉牛人大部分都是类似。本人上班期间基本不加班,晚上不熬夜,只是充分利用上班时间和课余一些时间(晚上11点以前)来学习,借口就是:超级解霸的梁肇新说过他都是12点睡觉,产品要上市时只熬过一次夜,因此牛人也有不熬夜的。呵呵,虽然本人跟他比差了十万八千里。我觉得码农们还是多注意身体,王江民、张孝祥都挂了,IT界过劳挂的也不在少数,晚上是身体各种器官恢复的时候,能不熬夜的还是尽量不熬夜吧。
谢谢关心!你说得对!熬夜是非常不好的,我要注意了。
看完了,先睡觉。最近辞职了稍微闲,明天再请教皓哥一些对我来说比较严肃的问题,是我这几年一直憋在心里没有高人指点而积累起来的困惑,相信皓哥能回答我。首先感谢皓哥,提供了这么一个地方让大家自由地交流,并且不像其他一些高人那样不屑于回答初学者或者在自己看来简单的问题。我从这里学到很多东西,虽然具体也说不出来一二,但有一些潜移默化,并且开阔了视野,就如同几年前我从刘未鹏的博客上所得到的。
收益匪浅。自从今年6月就一直关注库壳。虽然不怎么了解陈老师,但是能从博客的回复中看到老师的渊博,谦虚,执着,淡泊,宽容。虽然我还只是一个大学生,但是我希望以后能成为一名优秀的程序员。之前看了老师的程序员练级攻略到程序员的三重门,也是觉得收益匪浅。顿时感觉通向未来的路明亮了一点。老师最让我敬佩的一点便是:技术没有国界,没有隔阂,没有谁好谁不好,保持学习的热情和时间。目前的程序员可能普遍缺乏一些意识层面上的东西,而对技术过于执着。比如像三重门这片文章讲的3个阶段让我想起了这个东西(http://www.ted.com/talks/simon_sinek_how_great_leaders_inspire_action.html)里面强调的what how why 3个stage,而可能现在很多程序员的眼界,或者说职业规划还没有达到这样的高度以至于他们的阶段停留在what和how而不能上升到why。虽然老师的某些blog现在我依然看不懂,但是我相信那些更技术的,我以后会从中学到很多,就像现在这篇一样。支持陈老师,持续关注中!
.NET,不会局限在Windows平台上,也可以通过#Mono#跑在Linux/Unix
谁敢把Mono用在生产系统里啊。
技术焦虑,不如说是职业焦虑更好。当任何工作不能成为终身职业时,都会使从业者产生焦虑。另外,从市场、新产品的角度看,技术的关键在于新,跟踪者产生焦虑情绪是一种必然。然而,最根本的原因是,开发者本来应该是是创新者,许多人已经自觉或不自觉的变为了新技术的消费者,这种角色的错位是产生焦虑的主要原因。
原来挺喜欢酷壳的,从作者输出价值观开始就不怎么喜欢了