聊聊“新技术”

缘起

最近在微博上,有两位我认识的前端界的朋友,吵得不亦乐乎。一位是@尤小右 ,因为收听了一期Teahour的访谈,开始关注vue这个前端开源框架,以及框架背后的作者。另一位是@真阿当,是我在盛大创新院时的老同事,要说这二位的水平高下如何,以我的经验肯定是无法判断的。微博又非常的碎片化,这种技术话题,大家各自断断续续的发表些只言片语,令我们这些看客,看得非常的不过瘾。

幸好,这两位后来都各自写了一篇长文《真阿当:为这几天前端方向所撕的逼做个大总结》、《尤小右:谈谈前端『新』技术》,让我对于他们的观点,都算是有了较为完整的理解。结果一看之下,竟然都相当认同……还有中间的一些其他朋友的观点,比如@刘骥-JimLiu@张克军的一些看法,我也都很认同。

那么,问题来了:“你到底有没有底线啊?!个个都认同,你到底是哪边的啊?!”所以,我今天打算好好的表述一下,自己对于“新技术”的看法。

其实,阿当大概对于我进入创新院之前的经历,也不太了解,所以才会说:“11年你尝试从ror领域扩展前端知识,遇到了一堆坑,然后在知乎上发的贴子,求教前端难点所在的帖子,我还印象很深刻。你是11年那波对前端感兴趣的后端,很有典型性。但你对前端的态度要诚恳得多,点赞。” ps: Web 前端开发面临的挑战主要有哪些?

其实呢,我大概在2005~2006年的2年里,混过一段时间的前端圈子,能够拿得出手是一篇OpenDoc,名叫《Ajax新手快车道》。还有一次演讲的PPT,名叫《Ajax技术地图》。但是,在10年以后的今天,我必须老老实实的承认,我不懂前端。毕竟,前端技术这个领域,变化太快了……

不过,当初在《Ajax新手快车道》的序言里的一段话,放到今天,我觉得依然是正确的:

AJAX的相关组成技术,每一个都已经出现了N年以上了,对这些技术的组合运用,也远远早于AJAX这个名词出现之前。所以,我真正敬佩的,并非提出AJAX这个缩写的Jesse James Garrett。而是那些早在N年以前,就已经在探索、实践的先者,他们始终在追求的:是更好的用户体验,以及更好的开发体验。这样的精神,才是最可宝贵的,也是最值得我们学习的。许多年过去以后,当我们再回头来看当年的这些热门技术,也许早已经变得老土,变得落伍了。在这样的历程中,哪些人会成长为高手?会成长为大师呢?就是那些永不满足,永远在追求更好的用户体验,永远在追求更好的开发体验的人!

1、为啥我赞同@尤小右

首先是他所说的“对待新事物的态度”。从架构的角度来说,技术选型是永恒的命题,是否选用某种技术,要不要尝试某种新的技术,要不要推动team的小伙伴一起学点新东西,始终是一个架构师需要考虑的首要问题。无论是盲目拒绝,还是盲目追新,都是不可取的。

我也曾经在另一篇文章里,表达过类似的观点:以实践检验为荣,以道听途说为耻,如果某种技术,架构师自己都没有做过评测,没有看过框架代码,没有在过去的实践中应用过。却因为一篇文章,一个讲座,甚至某个大公司曾经用过这样的证据,就将一种技术引入到项目之中。这样的决策,很少有不失败的。

其次是因为在他的文章里,相当清晰的阐述了近年来前端领域的一些技术发展脉络,为何会出现那些新技术?以及他们分别想要解决什么问题?这令我获益匪浅。

再次,我赞同尤小右还因为vue在github上收到了13191个stars。这绝对是一个了不起的成就,在背后没有大公司的情况下,在前端框架领域,能够超过这个star数量的,几乎一只手就能数得出来!(全世界范围内)虽然阿当一直表现出对于“攒星星”的不屑,但是作为一个对于开源社区较为了解的人来说,有这样一个项目撑腰,他说的话,就得认真听,仔细吸收养分!

2、为啥我赞同@真阿当

首先当然是因为其中的一些观点,比如对CoffeeScript的看法。多年以前,Java社区曾经有一种技术叫GWT(Google Web Toolkit),系出名门啊!他的作用,就是帮助Java程序员,能够在不写JavaScript的情况下,编写Web应用。这种技术,从来就没有流行过。哪怕他背后站着Google。

我一直以来的观点是:如果你连学一门新语言都没兴趣,你怎么就敢贸然进入一个全新的领域?

阿当说这种技术是解决伪问题,我就很认同。虽然我很喜欢Ruby这门语言,但是我并不是一个只会Ruby的程序员。多学一门语言,很难吗?

类似的看法是对于nodejs的。在没有出现nodejs之前,前端程序员,要多学一门PHP或者Ruby/Python,很难吗?

曾经有半年的时间,我也跟过nodejs的风,在一家公司里,用nodesj写了一个消息队列处理的框架。说实话,到后来就会发现,真正需要解决的问题,都不是语言层面的,也不是前端知识领域的。一个曾经的后端程序员,能够用好nodejs。一个专攻前端的程序员,其实用不好nodejs。

但是,在技术圈子里,有太多傲慢的闯入者。面对一个其实存在传统方案的领域,既不愿意深入了解,也不愿意帮助原来的方案一起改进,而是自己再搞一套“新”的。

比如Java的无数种Web框架,有哪一种足够好用到撼动Rails的地位?真!没!有!我喜欢Ruby社区的一个重要原因,就是这个社区,不傲慢,不分裂,绝大多数劲,都往一处使。

我赞同真阿当的另一个原因,其实还是因为和他一样,见得多了。我有个朋友叫陈黎夫,多年以前曾经费了好大的力气,写了一本ASP.NET的Web Framework的书(书名与具体的技术不记得了),结果书刚刚写完,ASP.NET出新版本了。他写的那本书,几乎就可以扔掉。被坑得欲哭无泪!

大公司推出的很多新技术,当年吹得天花乱坠,花好稻好,到后来说没了也就没了。你跟得过来吗?(现在还有人知道XUL是啥吗?)现在,大公司也都学乖了,推新技术几乎全部都放在Github上开源,然后接受社区的评判,大家都凭Stars说话。

举个例子:TypeScript,再如何系出名门,我一看他的Stars,只有8930,还没有vue的多。我必然内心会打鼓:这东西,多半不靠谱吧?!

3、如何看待新技术

新技术层出不穷,是IT这个领域的常态。几乎每天都会诞生一种,据说会改变世界的革命性技术。对于程序员来说,终生学习也注定是常态。

准确判断一个新技术的价值,是一项重要的能力。在没有Github之前,甚至有公司敢于“推出不开源的新技术”。现在这世道比以前好了很多,新技术多半会开源,而且多半会放在Github上开源。我们在阅读一个项目的源代码之前,先看看他的几项基础数据:stars、forks、issues、commits、contributors,就基本可以掌握这个项目的“健康状况”、“活力程度”,再看看issues的内容,了解一下大概存在哪些已知的问题。然后,我可以决定,是否再仔细看看他的文档、代码,试着跑跑demo?

能够在一个大背景下理解一项新技术,是更加基础的能力。仅仅看stars是不够的,比如js这个领域,这两年非常火,较之其他的语言,starts往往在数量级上就高一级。如果缺乏对这一领域的较为全面的了解,就无法横向比较其优劣。当然,更加重要的,是对于该领域的技术发展趋势,要有自己的看法,某个发展方向是不是有前途?如果没有自己的看法,也只能随波逐流了。

虽然程序员需要终生学习,但是每个人的时间都非常有限,那么多新技术,怎么学得过来?不被忽悠,少走弯路,节约时间,才是更加高效的学习方案。

这也是我赞同阿当的根本原因。

#4、如何学习新技术 关于一个团队,如何引入新技术,如何学习新技术的话题,今天就不聊了。这个话题太大,可以专门写一篇来讨论。

今天只讨论,个人如何学习新技术?

我有一个一直以来的观点:“人家的子弟,就是拿来误的。”潜台词是:不要怕误人子弟!

为啥这么说?因为,回顾自己的成长历程,什么时候经验值涨的最快?一是项目紧张,压力山大的时候;二是掉在坑里,必须自己爬出来的时候。

对于一个善于学习的人来说,走弯路他也在学习。对于不善于学习的人来说,就算在一条直道上,他也根本就不走啊!

所以,我想劝劝阿当。你何必担心年轻人被坑?担心他们走弯路?这样才有利于他们成长嘛!当你以一种过来人的眼光,在那里痛心疾首的时候。他们还觉得你倚老卖老,固步自封呢。

对于年轻人而已,我并不建议他们太过审时度势。听说哪个热门,就去学吧!感觉什么好玩,就去玩吧!再怎么浪费时间,也比浪费在撸啊撸上要好吧!只要不是心猿意马,浅尝则止,总是会有收获的。再说了,那些所谓老家伙的先见之明,也未必都是对的。[嘿嘿]

不写结束语了,本来也难有啥结论…附赠一段当初写的文字吧


新手如何上路

软件开发这个领域,永远都在飞速发展,大家都必须不断的学习新的知识、技能、框架、IDE 、甚至新的语言。传说中的骨灰级高手们,就像传说中的大侠,任何武器、哪怕是一块木头到了他们手里,也能发挥惊人的威力,人家练了几十年的看家本领,他们随手使来,也竟然像是打娘胎里就开始练了一样。为什么?

就算不吹那么玄的,平常我们能够碰到的那些老手,在学新东西的时候,也比那些新手学得更快,理解得更深,运用得更熟练。而新手们呢?往往就会漫无头绪,焦头烂额,以一副张着茫然的大眼睛的经典表情,出现在各大论坛的新手求助区里。他们欠缺的,究竟是什么呢?为什么老手学新东西,就没遇到那么多困难呢?

泛泛地说,自然是经验上的欠缺。仔细地说来,又可以分为三个方面:

一、本质,一种技术与另一种技术之间,往往会有本质上的相通之处,当你对一种技术的理解与思考越来越深入时,学习一种新技术也会更加容易。触类旁通,举一反三的能力,就是来自于对于技术本质的追寻。

二、地图,本质上或多或少的相通,也提示着我们技术之间的相互关联,当你了解的技术越多,了解得越是深入,在你的内心,就能建立起越发清晰的技术地图。各种知识都有一个自然、合理的位置。那么当一个老手要学习一门新技术的时候,他其实并非在探索一个全新的、未知的领域,而是有很多脉络可寻,也很多已知可以帮助他们快速了解未知。

三、技巧,面对同样的未知,面对同样的难题,新手们一筹莫展,而老手们却掌握着更多的技巧和手段,帮助他们试探可能性、缩小问题的范围、迅速定位问题、不犯明显愚蠢的错误、甚至能够列举出更具命中力的搜索关键词,而这些技巧,都帮助老手在前进的道路上,更少跌倒,即使跌倒,也能更快的爬起来。

作为一本写给新手的入门书籍,我们希望展现给读者的,是一个老手如何学习新技术的过程。我们相信,这样的一个学习过程,对于新手来说,是更具有价值的。