Re: [心得] 非native开发app,反而让开发过程更痛苦

楼主: jsgoc (jsgoc)   2017-10-17 12:45:35
回一篇文章和大家交流一下 我想阐述的总结先写一下
[总结懒人包]
是每个程式语言都有它的特性和适合的地方
所以我的建议是 技术图多开不同语言 (不要只守单一语言)
这样才不会让自己视野和想法被限制住
[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(虽然都是购买国外机器和软件再修修改改)
作者: ian90911 (xopowo)   2017-10-17 13:04:00
作者: tz5514 (屁安)   2017-10-17 13:09:00
作者: diabloevagto (wi)   2017-10-17 13:09:00
现金(X) 现今(O)另外可以多了解每个语言/lib出现所要解决的问题可以帮助选择与评估
作者: pttworld (批踢踢世界)   2017-10-17 13:13:00
怎么记得gtk for c, Qt, wxWidget for c++
楼主: jsgoc (jsgoc)   2017-10-17 13:46:00
补一篇文章https://goo.gl/2Nv8yE 如果考虑code要放1年以上我觉得现在学kotlin是不错选择 他其实也是跑在JVM上不用担心相容性 但是语法更干净
作者: jackblack   2017-10-17 14:03:00
推这篇
作者: wildli0422 (wild)   2017-10-17 14:20:00
拜托不要删文阿阿阿 这篇好棒
作者: gmoz ( This can't do that. )   2017-10-17 14:20:00
优文
作者: bakedgrass (蒙古烤小草)   2017-10-17 14:46:00
作者: freedls (阿嬤覺得你冷)   2017-10-17 14:47:00
作者: zeussteven (小豆子)   2017-10-17 15:07:00
好文!! 真的不能死守一种语言。
作者: swallowcc (guest)   2017-10-17 16:30:00
作者: duck10704 (duck)   2017-10-17 17:42:00
push
作者: visa9527 (高级伴读士官长)   2017-10-17 18:20:00
JS的code寿命现在感觉超长,刚出时觉得都短命仔 script到底是谁把 JS 从浏览器的牢笼里放出来变大怪兽的...不过JS在浏览器上始终不是直接绘制UI,都是透过HTML+CSS它只是一个控制器而已,就算svg / canvas仍然只是控制
作者: dannypsnl (秦书)   2017-10-17 18:28:00
node吧?以前也有类似的努力,不过node特别成功
作者: makeman   2017-10-17 20:12:00
干嘛举gtk qt就全包了 XD
作者: hangigi (韩仔)   2017-10-17 20:31:00
推一个 赞赞赞
作者: Wolfken   2017-10-17 21:54:00
有两个关键的地方不一样,1. 超过20万行以上时,Java比C++容易维护,虽然是说规模大统统很难维护,但是C++更难而同样超过20万行,改成js并不会比Java容易维护,反而更难,因为动态语言跟js一些先天限制,导致超过一定行数就很难维护 2. npm社群快速扩张有好也有坏,其他语言要做什么事大致上都能找到一个go to lib,npm太多lib反而造成这个生态圈没有标准出来,每个团队的lib stack都不一样对技术累积跟转换反而带来门槛
作者: doranako (真爱无限)   2017-10-17 22:06:00
跨平台弱点就在于原生sdk跟os改太快,一年一大版,跟不上
作者: CaLeLu (苦逼人生1.0)   2017-10-17 22:33:00
详细推
作者: jjwei ( <囧> )   2017-10-18 08:38:00
push
作者: dreamnook (亚龙)   2017-10-18 08:49:00
用过几年Java跟c++的感想是:让我用Python(?
作者: zenixls2 (zenix)   2017-10-18 10:22:00
推这篇,不过除非跨平台可以自己parse原生api生wrapper不然都得慢慢等人implement
作者: atpx (秋雨的心情)   2017-10-18 18:46:00
好闻推
作者: remmurds (Stronghold)   2017-10-18 23:25:00
JAVA在安卓上快主要是因为aot还有gc的改进另外有个东西叫ReactiveX给原po参考一下
作者: SMNOONMS   2017-10-20 22:04:00
高级推。XD
作者: fuanan (摇滚安)   2017-10-20 22:40:00
这篇写得真的不错 推推!
作者: angusyu (〒△〒)   2017-10-24 09:18:00
aot ? ART吧

Links booklink

Contact Us: admin [ a t ] ucptt.com