编程迷思
2017.06.12 17:53:05

前一阵子买了一套王小波的合集,其中的《沉默的大多数》自序一开始王小波就写到:

“我以写小说为主业,但有时也写些杂文,来表明自己对世事的态度。作为一个寻常人,我的看法也许不值得别人重视,但对自己却很重要。这说明我有自己的好恶、爱憎,等等。假如没有这些,做人也没什么味道。这些看法常常是在伦理的论域之内,所以对它们,我倒有一种平常心,罗素先生曾说,对伦理的问题无法做科学的辩护。我同意这个观点。举例来说,我认为,思维可以给人带来很大的乐趣,我看不出有什么理由可以剥夺这种乐趣。这个看法也在伦理的论域之内。所以,我举不出科学上的理由来说明自己是对的。假如有人说不思维才快乐,我只有摇头,却无话可说。”

我此刻的心境如同王小波的上述想法。对于一个在软件开发行当里摸爬滚打二十多载,而且可预见还要继续现状的老程序员,总会有各种跟编程相关的想法冒出来,前几年更多念着技术和编程,现在则在工作/写代码累了之余,却更愿意让思绪天马行空般去思考一些跟技术有若干关系的非直接技术方面的问题。这些思考更多是写给自己的,所以我无需做啥科学的辩护......

技术问题很多并非技术问题

思考缘由是:

多少年来,老的Java程序员早已习惯用Struts、Servlet/JSP、Spring以及各种模板引擎如FreeMarker、Velocity等一套经年不变的稳定技术栈来做开发,而且这一整套技术栈也能支撑起业务的运转。如果某个时刻要引入新技术/新模式,必然带来开发环境的改变,包括分工及合作方式、架构、接口,乃至地位、重要性等各个方面。在冲击方面,年轻人没有太多的利益负担,而老人的常年的利益积累必然要削弱或多或少的一部分。比如合作模式的改变,以往一直都是老人带新人、老人分配指导新人,有朝一日醒来发现新人催着自己提供接口数据了:“咦?这小子反过来要求我了?”......

对于技术革新,如果不是到了非改不可,上演“宫廷内战”、然后最终不合者分道扬镳已是固定剧本。所以这时候的问题,最后往往变成了不再聚焦于技术的纷争。而革新的效果,可能需要若干年后才能清晰审视。而若干年后,原来那一拨人可能还会耿耿于怀,继续争论。

我觉得,要推动技术革新,在以下条件满足时,会比较清晰:

  1. 团队自身有强烈需求。比如,业务或技术结构上的坑,让团队忍无可忍;
  2. 团队相对年轻,或者整个团队/老程序员有技术热情,有接受新技术趋势的较强烈意愿;
  3. 存在有权威有能力的技术带头人,善于分析,并登高一呼;
  4. 团队资源和时间有弹性,不至于腾不出来;
  5. 上层各级决心大,能够给技术革新提供强有力保障——很关键的一条,否则很可能最后落得个“吃力不讨好”。

如果确定想推动技术演进,但是仍遇到有人想不通怎么办?

要知道,如果不到非改不可的程度,是很难界定“哪套方案更合适”的,这也是口水战的根源。关键看革新的决心有多大,如果必须去做这个决定,那就:一是召集目标一致的合适人选;二是招兵买马,“外来的和尚好念经”。这样最可能的结果就是,那些想不通的程序员有一部分发现形势比人强,会有所转变,而另一部分“坚持者”则将离去。所谓“铁打的营盘流水的兵”,任何完美的方案都是不存在的,只有利弊大小的权衡罢了......但采取行动的一个非常重要的前提条件是——取得上层各级的绝对支持——而且不能仅仅是直接上级,还需要利益相关方的各层上级,这样才可能领到足够推动进展的“尚方宝剑”。

退一步讲,如果想做技术革新但又不是太迫切,条件不太成熟,则可将欲引进的新技术当成研发任务项,甚至作为备用技术的储备,这种情况下,基本不太会出现激烈现象。

技术选择

为什么会有这么多技术层面的口水战?因为现在技术太多了,同质性的轮子太多了,然后就会出现各种比较,各种比较又带有各种倾向性,这些倾向性最终影响了开发者,开发者基于自己对各种轮子的偏好及理解,产生出差异化的个人观点,所以口水就多了。

最典型的就是“这个语言不行那个语言不错”、“XX框架比不上YY框架”......

其实行不行真不是你说了算。关键还是看社区支持程度、看成熟度、看流行程度、看开发效率、看执行效率、看储备程度......

但是话又说回来了,像“React、Angular和Vue哪个好?”诸如此类的问题,其实我觉得如果应用程度都非常普及的情况下,找一个、两个先试试、用用就是了,况且用起来又不是什么难事。我相信绝大部分的应用规模和复杂度根本到不了一定要纠结哪个更好的程度,如果真是这样,恐怕还是要靠自己造轮子了。所以,过多的口水其实毫无意义。

今天还看到了一条这个内容:

话是这么说,但如何“用尽可能少的时间,用尽可能少的精力,用尽可能少的成本”来达成目标呢?没有一系列的长期积累做铺垫,如何做到?[允悲]

技术的选择,一定要是发现了局限或尝到了痛苦,然后采取行动,才靠谱;靠兴趣或直觉推动的选择,则会有风险。另一方面,要选择靠谱的技术,必须做尝试,甚至大量较长时间的尝试。不然,光靠口水中的观点是帮不上你忙的......

两个误区

经常看到这两种观点:编程语言/工具不重要,重要的是算法、思想。

对于编程语言,如果光顾着编程语言,就可能真成为码农了,稍微遇到一些深入的问题、思路(如算法优化、架构/模式等),则知识面的局限性就凸显。

反过来,现代的编程语言,早已远不止语法,趋势是一个语言一个生态、一个社区,延伸出丰富的包/库,乃至需要平台的支持。要掌握一门编程语言,就必须在熟悉语法之外,熟悉它的包/库、平台运作机制!——每门编程语言其实都不简单!熟悉它是一个相对长的过程。轻视编程语言,算法亦很难以优雅、高效的方式表达出来,你会有一种使不上劲的感觉......对编程语言不了解,就分不清好代码,写不出好代码。

为什么大学里的教授学富五车、理论高深,但在商业上取得成就的却绝大部分不是他们呢?其实还是看你专注的领域。你是科学家、数学家,则可能觉得编程语言不重要;如果你是工程师,你也说编程语言不重要?

这些都不重要,你要解决的问题域决定了哪些方面对你而言是重要的,作为程序员,恰好编程语言和算法、思想等,都是重要的。

最后,团队不能烂,烂团队谁都救不了......


P.S. 有人说做Java的跟前端没嘛关系呀?其实呐,以前的jQuery代码基本都是Java人员写的,那时候可没有什么前端......哦,还记得ExtJS吗?


(3)
评论(1条)

jupiter 2017.07.15 18:15

从历史角度来看,现在正是各种语言百家争鸣的时期。


发表评论请先登录或注册