回一篇文章和大家交流一下 我想阐述的总结先写一下
[总结懒人包]
是每个程式语言都有它的特性和适合的地方
所以我的建议是 技术图多开不同语言 (不要只守单一语言)
这样才不会让自己视野和想法被限制住
[JAVA & C]
现在大家在使用android lib时候 都是直接使用jar档到Gradle
所以久而久之就忘记里面也很多C语言 (JAVA透过JNI呼叫C,这也是JAVA流行原因之一)
因为鲁叔经历过痛苦JNI过度的日子 就是JNI要自己刻 所以JAVA和C都要会之互博之术
虽然很多现成的C lib可以直接用JNI包起来 但是测试起来还是颇累(要编译)
2006左右曾经有个案子 当时博班学长听到要用JAVA实作都皱眉头(JAVA刚流行)
嚷嚷说C++才是最强 全部都用C++才是王道 (学长是199X~200X?年代学C++,非JAVA)
最后考虑平台移植性(我们使用很多不同application layer protocol,ex:diameter,AAA)
老板还是决定用JAVA(200X~以后几乎是必修) 结果那份code活过了4~5年
如果当时选择使用C++的话程式码活不超过1年 需要重新编写
这就是当选用语言时会考虑到你写的以后还会不会有人使用
回顾2004~2006左右 当时JAVA在推广的时候 就是遇到JNI的缺乏(需要有人去填洞)
但因JNI是开放的 所以大家都可以来填洞 (也可以纯JAVA实作)
由于JAVA跨平台特性 可以跑在linux(免钱)可以跑在windows(要钱) (当年很潮der)
内存又开始便宜的时候 JAVA的优势就渐渐跑出来 虽然很跑很慢 现在还是很慢...
那为什么大家手上android手机apk跑得还不错 (不管SOC里面是intel或arm)
因为现今JNI已经相当完善加上纯JAVA的package也变多 而且都在github可以找到
(有时候呼叫的虽然是JAVA内建API 你去追下去的话 有时候也会发现他也是呼叫JNI的C)
需要效能的都是透过JNI然后用C去跑 (需要加速注重效率的部分就用C就对了)
而UI抽象逻辑部分(Button/Dialog等等之类)考虑跨平台的就还是使用JAVA(其实底层还是C去画图)
这样就可以兼顾跨平台和效能 厂商不会因为芯片不一样要一直不断地重复编写编译apk
一个apk可以到处跑 (有JVM前提)
跨平台只要重新编译JNI的C (如果有cpu instruction加速也写在这边)
JAVA的Source Code都可以完全保留
举个例子 如果有在使用android media player的人 我们来看ExoPlayer
https://github.com/google/ExoPlayer/blob/release-v2/extensions/ffmpeg/src/main/jni/ffmpeg_jni.cc
对 没错 decoder是使用c来实作 原因是什么
c语言的特性 省内存/有效率/可呼叫DSP加速/直接输出direct buffer(直接控制内存)
加上已经很多以实现实作的decoder可以使用 为什么还要用JAVA写一次?
那JAVA特性是什么 UI抽象元件可以跨平台 TCP之上的protocol也很适合跨平台
像OKHttp里面的parser/protocol就是使用JAVA实作
如果你是效能控 没有最快不甘心 你也可以用C实作parser/protocl再用jni包起来
但是如果此段程式码只占一个操作的1% 你疯狂加速这段让速度快50%
可是总体速度只快0.5% 这你就要考虑有无必要用C去实现
所以掌握好每个程式语言特性 你的视野会变得比较开阔
如果你要说JAVA 484寄生在C身上啊 我会说他们是互补足彼此的缺点
所以写JAVA不代表不需要写C (遇到效能问题用C就对了)
同样的写js不代表以后不需要写JAVA (遇到有现成ecosystem先用jar就对了)
你会发现很多react-native-XXXX很多只是包一层ReactPackage再包jar
为什么? 因为没必要再写一次啊 有现成就用现成 和当初C decoder一样啊 现成 赞赞赞
而且JNI编译一次之后 就可以改你常改你的java soure code (JNI编译时间可以省掉 赞)
RN也是
RN编译一次后就可以疯狂画图UI 每改一次UI都不用重新包装media player jar.. etc
[js & JAVA]
js的特性是动态 不需重新编译就可以运行 语法干净简洁 这是他最大优势
而JAVA和C的缺点就是需要编译 所以当大量需要客制化UI时候或测试捞web api资料时候
js的优势就跑出来 加上FB对于React的Virtual DOM实作是使用js 可以直接现成使用
加上大量flux pattern lib都是使用js实现(PS:你也可以使用JAVA或C++实现以上东西,只是目前没有)
也导致React Native出现(里面有个东西叫做ReactPackage类似以前JNI)
而这一波我觉得比较可怕的是 npm现在已经有很多现成的js package
而且npm社群相当庞大 所以后劲会比以前JAVA那一波更大
(当时JAVA很多lib只有几个公司努力自己刻+一些社群力量+公司自己客制化的JNI(没公开))
而现在npm社群力量很强大(很多人下载就会被FB或Google带走) 再加上FB公司在后面支撑
如react, redux(Author去FB), redux ecosystem, flux, immutable, rxjs(Author去Google)
另外让我觉得比预期还短的是 RN的黑暗时期比我想像中的短
(这里黑暗时期是指有比较规模人数加入社群开始计算到有企业使用,不是指RN推出时候)
例如airbnb和ig都有使用且产品化 我的低阶手机跑的也是顺畅
加上从去年开始js直接跳过JAVA直接呼叫C来做CSS layout时候 UI效能有很明显的提升
理论上CSS layout js -> JAVA -> C,去年js -> C (JAVA???)
那js的UI未来可以跨到哪 有ios/android/web/windows
而后面两个还在发展 还有PWA/Webassembly的加入 所以未来结果是怎样我也说不明白
不过我可以确定的是跨平台和语言特性 从2003到现在一直是领导软件发展的走向
(从以前跨OS/CPU 到现在 跨Web和APP)
还有就是程式语言/环境生态不断的进化 让更多人加入一起写程式
例一:程式语言语法
java:当时就让看不懂C pointer的能可以一起来写程式
js:免除了JAVA/C++一堆语法(syntax)包袱 做一样的事情 但是程式码变得更简洁
例二:抓gps location
c++:(open com port->select protocol->parsing string->get position->close com)
js:navigator.geolocation.getCurrentPosition done
一行就把以前要做的事情都包起来 我就只是想知道我位置啊 还要去研究硬件知识
gps是用serial沟通还是i2c 用什么protocol
结论
多看多摸 不要只守住单一语言 对你和未来发展是有帮助的
打算守住单一语言 吃到退休 不是不可能 只是案例很少
尤其台湾软件开发都是跟者美国在走 就好像当初JAVA的UI取代比C/C++的gtk/qt的UI一样
现在大家手持的跑JAVA还是居多 手持装置跑gtk ui不是没有 只是很少和凋零
未来你说js会不会普遍和广泛使用 目前看来后势是相当不错的
至少npm环境和很多大公司(FB/Google/Microsoft)都参与进来
我觉得比十几年前那时候好的太多 我写下去的程式码 以后可以重复使用
现在时间点很像2004~2007时候一样 JAVA会不会大量广泛使用?
但是现在台湾金融业/电信业已经普遍使用JAVA(虽然都是购买国外机器和软件再修修改改)