作者jsgoc (jsgoc)
看板Soft_Job
标题Re: [心得] 非native开发app,反而让开发过程更痛苦
时间Tue Oct 17 12:45:35 2017
回一篇文章和大家交流一下 我想阐述的总结先写一下
[总结懒人包]
是每个程式语言都有它的特性和适合的地方
所以我的建议是 技术图多开不同语言 (不要只守单一语言)
这样才不会让自己视野和想法被限制住
[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(虽然都是购买国外机器和软体再修修改改)
1F:推 ian90911: 推 10/17 13:04
2F:推 tz5514: 推 10/17 13:09
3F:→ diabloevagto: 现金(X) 现今(O) 10/17 13:09
4F:→ diabloevagto: 另外可以多了解每个语言/lib出现所要解决的问题 10/17 13:13
5F:→ diabloevagto: 可以帮助选择与评估 10/17 13:13
6F:→ pttworld: 怎麽记得gtk for c, Qt, wxWidget for c++ 10/17 13:13
补上
8F:→ jsgoc: 我觉得现在学kotlin是不错选择 他其实也是跑在JVM上 10/17 13:46
9F:→ jsgoc: 不用担心相容性 但是语法更乾净 10/17 13:47
10F:推 jackblack: 推这篇 10/17 14:03
11F:推 wildli0422: 拜托不要删文阿阿阿 这篇好棒 10/17 14:20
12F:推 gmoz: 优文 10/17 14:20
13F:推 bakedgrass: 推 10/17 14:46
14F:推 freedls: 推 10/17 14:47
15F:推 zeussteven: 好文!! 真的不能死守一种语言。 10/17 15:07
16F:推 swallowcc: 推 10/17 16:30
17F:推 duck10704: push 10/17 17:42
※ 编辑: jsgoc (110.28.233.145), 10/17/2017 17:58:09
18F:推 visa9527: JS的code寿命现在感觉超长,刚出时觉得都短命仔 script 10/17 18:20
19F:→ visa9527: 到底是谁把 JS 从浏览器的牢笼里放出来变大怪兽的... 10/17 18:21
20F:→ visa9527: 不过JS在浏览器上始终不是直接绘制UI,都是透过HTML+CSS 10/17 18:22
21F:→ visa9527: 它只是一个控制器而已,就算svg / canvas仍然只是控制 10/17 18:23
22F:推 dannypsnl: node吧?以前也有类似的努力,不过node特别成功 10/17 18:28
23F:推 makeman: 干嘛举gtk qt就全包了 XD 10/17 20:12
24F:推 hangigi: 推一个 赞赞赞 10/17 20:31
25F:推 Wolfken: 有两个关键的地方不一样,1. 超过20万行以上时,Java比 10/17 21:54
26F:→ Wolfken: C++容易维护,虽然是说规模大统统很难维护,但是C++更难 10/17 21:55
27F:→ Wolfken: 而同样超过20万行,改成js并不会比Java容易维护,反而更 10/17 21:55
28F:→ Wolfken: 难,因为动态语言跟js一些先天限制,导致超过一定行数就 10/17 21:56
29F:→ Wolfken: 很难维护 2. npm社群快速扩张有好也有坏,其他语言要做什 10/17 21:56
30F:→ Wolfken: 麽事大致上都能找到一个go to lib,npm太多lib反而造成这 10/17 21:56
31F:→ Wolfken: 个生态圈没有标准出来,每个团队的lib stack都不一样 10/17 21:57
32F:→ Wolfken: 对技术累积跟转换反而带来门槛 10/17 21:57
33F:推 doranako: 跨平台弱点就在於原生sdk跟os改太快,一年一大版,跟不 10/17 22:06
34F:→ doranako: 上 10/17 22:06
35F:推 CaLeLu: 详细推 10/17 22:33
36F:推 jjwei: push 10/18 08:38
37F:→ dreamnook: 用过几年Java跟c++的感想是:让我用Python(? 10/18 08:49
38F:推 zenixls2: 推这篇,不过除非跨平台可以自己parse原生api生wrapper 10/18 10:22
39F:→ zenixls2: 不然都得慢慢等人implement 10/18 10:23
40F:推 atpx: 好闻推 10/18 18:46
41F:→ remmurds: JAVA在安卓上快主要是因为aot还有gc的改进 10/18 23:25
42F:→ remmurds: 另外有个东西叫ReactiveX给原po参考一下 10/18 23:33
43F:推 SMNOONMS: 高级推。XD 10/20 22:04
44F:推 fuanan: 这篇写得真的不错 推推! 10/20 22:40
45F:→ angusyu: aot ? ART吧 10/24 09:18