我的编程生涯:
在大学那会儿基本上是主动放弃Java了,原因之一当然是已经对语言很熟了,但是觉得没有必要再去碰延伸开去的东西,例如SSH啊EJB啊什么的。虽然当时Java还是非常红的,Sun还很强,Eclipse 也是当时最强的IDE之一。
当时是看见这几件事情,决定放弃Java的:
大公司例如银行、保险、金融等等都招Java,为啥,因为他们的IT团队都很大随时有人走,随时要新人接着上。这说明了Java 很适合大团队管理,因为写法超死板,框架太强力,不需要个人发挥。
我大学时的同学就算以前没有编程,只要肯学,学Java 还是可以很容易追上我当时的水平(你要对我高中时肯自学JSP的那种劲头有信心),甚至后来都可以跟我一样帮大学老师做项目了。这说明了什么:用Java的核心竞争力不是经验,你写得越多,你的经验优势就越小。
当我开始想学习Unix,想学习编译器的时候,虽然我甚至因为Java的原因学习了一下 ANTLR,但我发现用Java写这些东西的代码时,实在距离我想表达的,我所知道的东西太远了:尤其是对比 C++ Template 的表现力的时候。
所以现在我看见有人觉得Java好,或者反驳某些语言炮的时候,我都跟着叫好。
我不应该写这个帖子的。
101
hepin1989 2015-05-11 10:44:06 +08:00
@noli 其实你是故意的,包括你的措辞。
java我觉得做的比较好的一点是,演进挺平滑的,比如你说的并发和异步支持,都是慢慢的以library的形式出现的,也就是加了词汇,而非语法。 NIO也是后来才有的,以及并发包。新的lambda在最好的情况下也是以前基于callback的5倍性能,并且还会提升。以及java9的模块化,以及java10的值类型,这些都能够看出,这个语言在演进上还是一步一个坎的。 不管怎么说我觉得java还是不错的,当然其他的语言也要多学习学习,每个人的工作范畴不一样,用到的工具不一样嘛,什么顺手用什么最好,你可以看看rust,我又给rust免费做推广了。 |
102
lvfujun 2015-05-11 11:19:28 +08:00
@djyde 你觉得 Android 选择 java是对的?
那你知不知道Android要放弃java 专用自已开发的语言? |
103
ybak 2015-05-11 11:38:50 +08:00
关键是,你是谁?你没做出成就前,没人会关心你用Go,还是Lisp, 语言的争论毫无意义.
|
104
noli OP @hepin1989
其实我还有另外一个看法,其实 NodeJs 也是很烂的工具,当然这很大部分是因为 Javascript 本来就是一个意外,发明 Javascript 的人根本就没有预料到当初写 HTML 页面效果的半吊子程序员要跟写服务器的人抢饭碗。 为什么这么说呢,因为 Nodejs 出了名的回调式写法使得代码极度难以维护和理解。尽管县级 ES6 还有各种库加入了 promise future 这种把异步嵌套变为同步流的库,但是 promise 的传染性还是会让代码非常难看。 所以我认为 Nodejs 只是解决了“完成”写高性能服务器的这一部分工作。 在我看来 NIO 也是同样的东西,也只是一个完成了高性能服务器基础能力的东西。 一个语言能够称为好的编程语言,是因为他能够很好地解决编程问题。 什么是一个编程问题,就是编程思想与现实实现之间的妥协问题。 像 nodejs 和 NIO,都是只解决了做不做到,没有解决能不能做好。 做到不做到,汇编是全能的能够做到任何计算机应该做到的事情。 但是汇编不能把事情做好,因为它没办法表达更高层次的概念,也就是高级编程思想的实现上,它是无能的。 在目前主流 OS 提供的 API 上实现一个高性能服务器,实际上是一个状态机如何实现的问题。这个很长,要另文解释。 我为什么在之前的回复里面特意提到 Coroutine 以及在很长一段时间里 Java 都不会有好用的 Coroutine 库。因为像 Coroutine 这种70年代就已经有的概念,并且也是解决状态机重复进入这类问题的利器,Java 居然原生无法支持。 这就很打脸了,Java 不是高级编程语言吗?为什么这种抽象能力都无法提供?只能用很低级很啰嗦的方式来实现?连 C 语言在解决这个问题上都可以比 Java 优雅简洁许多。 你说 Java 演进平滑。我就以 NIO 来简单说明为什么在这一点上它是不平滑的。 假设我在Java 提供 NIO 以前实现了一个 RingBuffer,那么这个 RingBuffer 能不能用在 NIO 上呢?答案是不能的,因为 NIO 的高性能实现依赖于它自己的另一套 Buffer。 你说这是什么道理?纯粹就是 Java 的解决能力天生不足。当 Java 致力于为傻瓜程序员提供一个理想国,实际上也扼杀了程序员回到人间的能力。 当然你可以说,你应该设计一个 interface 来抽象这个 RingBuffer 的实现,然后把 NIO 的 Buffer 注入到 这个 interface ,blah blah blah…… 毫无疑问,这又要增加解决问题需要依赖的工具。所以我说 Java 解决问题的方式啰嗦,把简单问题复杂化,天花龙凤很花巧但是能力平庸就是这个意思。 |
105
zenliver 2015-05-11 12:18:24 +08:00 2
楼主小学就开始接触编程, 按照正常发展趋势, 大学应该是大牛行列了,,,现在竟然还在纠结语言好坏,,,伤仲永啊
|
107
hepin1989 2015-05-11 12:28:28 +08:00
你看下Bytebuffer就知道了,别人就不让你继承好不好,而且我觉得你想问题太主观了,为何你设计的Ringbuffer要进入到JDK呢,如果不进入JDK,那么肯定就是你自己玩啊。in house的实现和public的实现肯定不一样的。如果要用NIO,写wrapper必须的吧。你有想要更加灵活,又不想写代码,怎么可能呢?
对coroutine,每个语言实现并发的模式不一样,在java上,原生的来说提供了N:N的线程,而上,你可以基于JDK提供的工具构建其他的并发模型,可能不是很优美,但是肯定好使。难道akka的性能不够好?forkjoin的性能不够好?clojure的async性能不够好? 至于好语言,您认为是得“一个语言能够称为好的编程语言,是因为他能够很好地解决编程问题。 ”。这个应该说是您的问题吧。每个人,每个阶段,或者说每份工作或者项目,面临的问题不一样,那么他或者她需要的工具也不一样,每个工具在特定的条件下,提供的杠杆作用是不一样的。 发展一门语言,需要考虑的东西很多,如果要大而全,又要设计优美,那么必然会话很多的心思来设计,实现,这就得花很多的时间,你可以说一个手机很好,但是别人买不到,那不是耍猴么?这样的语言会被那些快速迭代,小而精的语言替代,比较人们在解决问题的时候,是看身边有什么,先搞出啦不是么?我们平时用的,汉语,英语,也是在不断的发展中,所以没有好语言,只有更好,和不断发展的语言。 说到社区和历史包袱,如果说一个好东西好的不得了,我得加入,但是这个特性一加入,可能其他的东西就得跟着改了,比如你设计手机,都弄好了,然后呢,你说别人的手机可以检测心电,所以你得加入个心电检测,这问题来了,是不是电路那些都得改啊?我相信,java的设计者们,更多的是在考虑让那些东西不要加进来,而是加进来那些东西吧。有些东西,可以让社区来做的。再者,如果你加了一个东西,以前的东西都不好使了,是不是让所有的人都改代码呢?我相信只有某些人愿意吧,比较不是所有的人都爱尝鲜。 java 你可以吐槽不好,但是,一门语言发展了20年还没有被淘汰,不是因为大家都是傻缺,不是么?特定的场景下,用特定的语言,特定的工具,事半功倍,同样的,非要用个铅笔刀去砍树,那么不是自己坑自己么? 你要吐槽就继续吧,为了吐槽吐槽,真没意思,发展一门语言,远比你想的复杂。 |
108
miao1007 2015-05-11 12:31:32 +08:00
求晒出你的作品,这里不是贴吧。
|
109
riaqn 2015-05-11 12:34:46 +08:00
那些扯生态圈的真是醉了, 本帖是讨论单纯的语言设计的好坏.
还有说语言只是工具的, 程序员的水平更重要? 汽车和自行车都是代步工具, 把你的汽车和我的自行车交换好嘛? 反正汽车开10分钟, 自行车骑个1小时也就到了. 甭管谁骑车. 同意楼主的观点, java的设计就是为了普通公司的工程开发的. 为了交流方便, 另外考虑到代码人员水平层次不一, 设计的非常简单. 在这一点上java算是无可厚非. 但是你要和我说 优雅 抽象 什么的, 那玩意儿和java无关. 和大多数语言都无关. 在我眼里只有haskell之上的语言才能叫优雅. 啥? lisp? 对不起风太大我听不见~ |
110
Andiry 2015-05-11 12:36:41 +08:00 via Android 1
@riaqn Linus喷C++是别人先喷他他才反喷的,他可没有无聊到在lkml里专门发邮件喷C++
|
111
hepin1989 2015-05-11 12:38:56 +08:00
楼主这个语言炮 ,都到了虫族轨道炮的级别了。
|
112
heian0224 2015-05-11 12:39:35 +08:00
我为什么会选择java作为工作语言就是因为我知道java对于企业级应用开发持久的生命力。无论其他语言看起来多么多么好,但我知道我还没到能够讨论哪个轮子好的程度,不如安心好好用这个轮子。
|
113
how2code 2015-05-11 12:48:00 +08:00
好好好,先有C++后有天;C++秒天秒地秒空气,行了吧。C++才是世界上最好的语言,可以了吧。
看在我大船神的份上你就别来黑C++了。 |
114
noli OP @hepin1989 Coroutine 跟并发一毛线关系都没有,甚至跟线程的关系都不大……当然啦,考虑到你可能真的只是个 Java 程序员,才会把 Coroutine 和并发、异步什么的一起来考虑。看来你根本没弄懂我说什么,算我看错人了……
|
115
hepin1989 2015-05-11 13:17:51 +08:00
@noli 你说没关系就没关系吧,反正我已经输给你了,你看@how2code不说了么,你以及轨道炮了,秒天秒地秒空气了。
我两个拿在一起说了,因为我用来组织程序而已,coroutine java不直接支持,但是我可以有其他的方式来做到同样的好。 一个用户态的协作调度列程给你说的如天上没有地上也没有一样牛。还有如果你觉得java不行,你看看 http://docs.paralleluniverse.co/quasar/ 这个是不是你说的coroutine 完成一件事情很多方式,别瞎扯了,如上,贴你的C++工程,大家膜拜下。 |
117
66beta 2015-05-11 13:20:00 +08:00
楼主居然喷我打前端是半吊子程序员!
|
118
hepin1989 2015-05-11 13:24:14 +08:00
@noli 还有,我用的是actor并发模型,和你coroutine不是一路的,抱歉,反正你是轨道炮,talk is cheap,show us your code.
|
121
j16ZgMV9cs6ZB23n 2015-05-11 14:36:30 +08:00
@hepin1989 C++里ACE的Reactor之少十年前就有了。
@noli 其实你是想说C++里自由度更大吧。 我记得一个很印象深刻的例子,比如早先Java不支持Range(到Java SE 5才有),Java却无法用原有的构造来模拟新的语言特性。相比C++也是到C++11才有原生的Range支持,不过C++却可以有自己的方法来构造来模拟,比如Boost.range。 不同的语言确实是有自己的优势和劣势之处,不过C++在很大程度上更加灵活,适应的场合也比单一的其他语言要多得多。不过相应的代价就是更加复杂,更考验程序员的自身能力和经验。 @ 其他人 其他呢,个人认为大多数优秀的C++程序员更喜欢去阅读更多的书籍和代码或者实现更多的功能,而不是在这里cheap talk。那么show code呢? 个人不认为优秀的C++代码是随便一个外行人(请原谅我称非C++程序员说外行人,我没有别的恶意。。。)花10分钟就能理解到其精髓的,对于普通的C++程序员其实也是如此。Let the programs tell, 按现在往后数年之后,到底谁的程序好自然会有分晓。 |
122
hepin1989 2015-05-11 15:20:44 +08:00
@chilledheart 说的在理,cpp和c更底层也就更灵活当然也更考验功力,推广下,rust也不错。哈哈,话说seafile怎么成了华为的了现在?
|
123
monsabre1 2015-05-11 15:22:42 +08:00
|
124
noli OP @hepin1989
我当然知道 Java 也可以实现 Coroutine 的效果,而且说实话 Coroutine 其实就是个闭包而已嘛。别说Java 会演进增强,这些库迟早或是现在会有的。你给大家普及了这个库,我也是第一次看到。 但是,我从来就没有说过 Java 不能实现 Coroutine 的效果,我也一直不否认 Java 能写出 Coroutine 效果的库。 我一直强调的事情是,Java 是一个很不好的语言,这门语言的设计以及其规范鼓励的写代码的方式,不是解决问题的正确方式或者是最好的方式。 既然我们已经在 Coroutine 这个问题上短兵交接,那么我们也不妨就这个话题继续下去,看看: 1. 原生支持 Coroutine 的语言是怎样解决某一类问题的 2. C++可以写出怎样的库解决上述问题的 3. Java 可以写出怎样库解决上述问题 要解决的问题是: 一个 DFA 模块或者类,初始化的时候输入一系列规则,运行的时候逐个输入字符,并且可以随时查询已经 parse 出来了哪些终结符,正在 parse 的符号串可能是什么类型的终结符。 1. python class DFA: object def __init__(self, rules): pass def input(self, ch): # 在计算过程中用到的变量 status = calc_status() yield type, status 使用: DFA dfa_engine = DFA(rules) while(not EOF): type, status = dfa_engine.input(ch) 2. C++ 没有原生的 yield,但是,最起码, C++ 可以混编 ASM 保存函数栈以及寄存器内容,来实现 yield 的效果,具体实现看 boost::context。 更不用说 boost::coroutine 这个库了。 class DFA { public: static void *caller_context_; static void *input_context_; // ... other members public: std::tuple<Type, Status> input(const char ch) { // 需要 yield 的变量保存在一个 std::tuple<Type, status> 的指针中 void *yield_cont = ...; jump_fcontext(&input_context, caller_context_...); } // other functions... } 使用: DFA dfa_engine(rules); DFA::caller_context_ = make_fcontext(&parse ...) DFA::input_context_ = make_fcontext(std::bind(DFA::input) ...) void parse(..) { while (!EOF) { yield_cont = jump_fcontext(&caller_context, input_context_); } 可以看到,形式上,大概是跟 Python 的是差不多的。 3. Java 的,谁打算试试,请大家教我,我反正是好久没用 Java 了。 看这个例子并不是说,Java 的能不能做到 Coroutine 的效果,而是看: 实现的形式是不是足够 保持 问。题。的。原。型。 |
125
noli OP @chilledheart
不不不,我不是来秀 C++的优越感的,我很喜欢 C++ 这类的语言,很对我胃口。 但我还不是最满意,Rust 的话,最开始有跟过,后来变得太多,没时间跟下去了,但相信也不差。 我发这个贴是来专门打 Java 脸,以及打某些认为编程语言没有优秀低劣之分的人的脸的。或者说,某些人嘴里的语言炮(他们没说错)。 我觉得不承认语言之间确实有 优劣 之分的人,都没有找到正确的思维方式,我特喜欢打他们脸来为自己找找可怜的存在感…… (我这么说的话,那些不断揣测我是个 loser ,要求我上代码的人,是不是也很有满足感?哈哈哈哈,losers) |
126
monsabre1 2015-05-11 15:40:59 +08:00
@incompatible
python操纵hadoop spark引擎 运算速度和java的没区别 这个接近99.99%的性能 hadoop引擎你能用java改 但是你能保证比它好吗? python让使用者更加关注业务逻辑 同时开发成本更低 性能还不差 |
129
hepin1989 2015-05-11 16:08:14 +08:00
core.async
https://github.com/rssh/scala-gopher quasar 这个新出来的。。。 DFA写起来好看就是scala或者clojure。java写起来是有点。。。 val myDFA = dfa ('Z, 'S, 'q0, 'd, 'A) where 'Z ==> Set('a, 'b) and 'S ==> Set(0, 1) and 'q0 ==> 0 and 'A ==> Set(0) and 'd ==> Delta( (0, 'a) -> 0, (0, 'b) -> 1, (1, 'a) -> 0, (1, 'b) -> 1 ) println(myDFA accepts "aaab") 第一次接触这个,但是我觉得可以通过更好的写法,比如引入~>这样的符号来构建一个完整的graph,然后这个graph接受input,并且switch状态。 反正java写出来是不好看的。 |
130
hepin1989 2015-05-11 16:14:23 +08:00
比如一个stream,在scala里面表述。
http://doc.akka.io/docs/akka-stream-and-http-experimental/1.0-RC2/_images/simple-graph-example1.png in ~> f1 ~> bcast ~> f2 ~> merge ~> f3 ~> out bcast ~> f4 ~> merge 这样的写法是不是好很多? java的写法的确是有点冗长。 |
131
yahoo21cn 2015-05-11 16:35:07 +08:00
我感觉还是python灵活点
|
132
laipogo 2015-05-11 17:14:40 +08:00
po 主我能贴一下你的 github 地址吗?
|
134
zjengjie 2015-05-11 20:22:26 +08:00
你说的那些c++东西可能百分之七八十的情况下都用不到吧,考虑到Java的应用场景,可能90%以上的情况都用不到,即使用到了,用稍丑点的方式实现有什么关系。但是要精通这些却要花掉非常多的时间和精力。语言不过是工具,好程序员应该知道在什么场景选用哪种最优的工具,在各个方面做权衡和取舍。如果哪天让你带领公司开发个淘宝你也让员工全用c++?
|
135
noli OP @zjengjie
是是是,你说得对。 写 Java 的人恐怕连查询数据集合都用不着,所以能够支持 Linq 之类的语言基础也是不用的。用 ORM 就够了,其他什么的永远都用不着。 不承认 Java 很渣我还可以理解,毕竟可能很多人以前是用 ASM。但是不承认无知有害我就不能理解了。 |
136
j16ZgMV9cs6ZB23n 2015-05-11 21:00:22 +08:00
@hepin1989 最后一个问题,这是什么情况?
|
137
j16ZgMV9cs6ZB23n 2015-05-11 21:11:52 +08:00
@noli rust好不错,虽然我更看好最近新出的pony,全盘Actor设计。个人认为,编程一个一直在持续学习、应用、触坑、总结经验的过程,好多东西聪明的人指点一二或者触过几次坑就明白了,但是至于对于那些习惯于固执己见的人,现实会教会他们 他们是如何被坑的。。。
|
138
FrankHB 2015-05-11 21:17:31 +08:00
有前途,混WG21么。
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4453.pdf http://blogs.msdn.com/b/vcblog/archive/2014/11/12/resumable-functions-in-c.aspx 说句公道话——asm降智商功效怎么能和Java比。谁敢让手下撸Java的通通去折腾asm呢。 @miao1007 1.平衡?Android?那个传说中坑害显卡驱动的MC算不? 2.真以为越OO越能SRP是嘛…… 3.顶用的又有多少呢。 @zhea55 考虑“用的人”就行了? 好吧,checked exception看起来也是前无古人后无来者。 @riaqn 优雅?Haskell? (虽然某种意义上倒的确比C艹还C艹。) syntax……呵呵呵…… grammar……呵呵呵呵呵…… @zjengjie 花点时间折腾百分之七八十用不到的玩意儿和花百分之七八十时间折腾本来就没意义的玩意儿的成本,要哪个,自己掂量吧。 |
140
hepin1989 2015-05-11 21:38:45 +08:00
@chilledheart 看漏了,不好意思,haiwen,我看成了huawei.
|
141
noli OP |
143
shuiniushushu 2015-05-11 23:37:09 +08:00
@riaqn linus大爷是恨铁不成钢,他自己用C++特别多
|
144
wangfengmadking 2015-05-12 00:31:08 +08:00
在这个看脸的时代,我只看代码写出来之后是否整洁。反正C++的项目,我就没发现有写的让人看起来舒服的,总是感觉乱糟糟的。这个无关乎性能啥的,反正都是云时代了,有钱任性。
|
146
roricon 2015-05-12 09:16:24 +08:00 1
讨厌Java,但有的时候为了业务,是屎也得吃进去。
|
147
neilwong 2015-05-12 09:33:01 +08:00 via iPhone
在v2ex原来发引战贴这么容易啊,整个帖子没啥营养不说,感觉楼上吵架的都进了楼主圈套啊
|
148
xxgirl2 2015-05-12 09:38:04 +08:00
我非常缺钱。所以哪个来钱快我就学哪个用哪个。
语言之争还是交给有钱人或大牛考虑吧。所谓肉食者谋。 |
150
ibiger 2015-05-12 10:18:07 +08:00
没必要这样,合适的工具用在合适的地方就是极好的。
|
151
smithtel 2015-05-12 10:19:34 +08:00
看到这种帖子,我只能说一句呵呵,有种就去找oracle开炮。没种就在这种多元化社区说吧。
|
152
jun4rui 2015-05-12 10:29:12 +08:00
@cys 想多了,哪里有xxx程序员?程序员又不是要绑死在一棵树上,多学多看多理解各种思想才是正路。
只会Java(或者其他某一门语言)的恐怕难免步入井底之蛙的后尘,多学多看多练习,掌握编程的精髓不是正道吗? |
153
TianTao 2015-05-12 10:31:08 +08:00
前面说的都不对,PHP才是最好的语言
|
154
jun4rui 2015-05-12 10:32:45 +08:00
@smithtel Oracle太重了,我写一个小的玩意,就1K条数据内用sqllite3就好了,一个小型的APP用Redis也很不错,用oracle干啥?
工具都有适应范围,不要老想着有银弹,oracle也不是,C也不会是,汇编也不是 |
157
MrEggNoodle 2015-05-12 10:53:32 +08:00
去工作Java不失为一个好的选择,对于自己单干单飞的程序员,python其实更佳。我也是如此观点。
|
159
ioth 2015-05-12 11:28:11 +08:00
继续继续。
终于看到比csdn有意思的贴了。 |
160
jun4rui 2015-05-12 11:56:29 +08:00
@cys 译言网| 我的2010年开源软件之敌获奖名单
article.yeeyan.org/view/194678/164281 2011年1月7日 - 乍得-佩林将甲骨文列为他心目中2010年的开源软件之敌,还带上了美国联邦 ... 我的2010年开源软件之敌获奖名单(Oracle wins the 2010 Open .. 有理有据哦,或者你Google下其他年度的开源之敌? |
162
FrankHB 2015-05-12 12:44:22 +08:00
@miao1007
我看了三次确认你没有回错人。 (????)→廉价?看不懂你的逻辑。 不就是这种造成实际损失之前被指出没有漏注意的低级错误的情况么……你所在的星球难道没有对此叩首答谢的礼仪么。 “晒我的项目”貌似和这个主题没什么关系吧。 非要附会,那就勉为其难贴个参加过的: https://github.com/cplusplus/draft @noli 这个提案的一个动机就是减少新的关键字:如果直接加yield/async这样的,恐怕没法就这样收场。 考虑到没法指望syntax-rules之类的东西,只加一个关键字能满足这些需求,也算是比较现实的、可以忍的妥协了。 @shuiniushushu 能介绍一下Linus自己用C++特别多的项目么。 |
164
WispZhan 2015-05-12 13:51:27 +08:00
又见这种无聊帖子,做什么是用什么语言。更古不变的真理
|
165
zjengjie 2015-05-12 14:08:27 +08:00
|
167
monsabre1 2015-05-12 16:00:32 +08:00
其实python比java开发效率高和python是多范型语言有关 可以多种写法
也是多范型语言的c++的范型式编程有时强于纯oo java是成本相对开发成本不低的性能接近native的跨平台工业级纯oo语言 中规中矩 |
168
noli OP @FrankHB
我很确定自己暂时吃不透加入这个关键字会带来怎样的连锁反应。 至少有一点,加入 resumable 是不是真的那么“干净”,带有 resumable 修饰的函数类型怎么算。 最后就是,我也在弄一个fiber式网络库,我隐约觉得,令一个函数 yieldable 是有可能不用在 语言层面 hack 的 |
169
monsabre1 2015-05-12 18:02:20 +08:00
java c++是屠龙刀
有人不是用来屠龙 有人是用来切菜 |
170
WispZhan 2015-05-12 18:12:56 +08:00
@lvfujun 这个观点你就错了。这个要从商业角度出发,选择java的优势在于java程序员多,而且对于android开发而言语法简单易学,能很快产生一个规模不小的生态圈。至于性能在这些优势下早已被淹没。
再待生态圈日益成熟之际,切换开发语言改善性能。 |
171
FrankHB 2015-05-12 19:18:00 +08:00
@zjengjie 不特别针对谁,只是说一下现状。
不管是什么语言,不管是语言自身的演进、实现语言还是使用语言,本来一些事情,是可以和真正要解决的问题联系得更好的,不必要担心浪费多少时间,学了用得上还是用不上。 百分之七八十时间浪费在设计模式啊重构啊封装啊调优啊,不管实际上是不是真用得上或者是不是真得花这么多时间去做——这不是个别现象。 其实包括C++自身的设计其实很多也就是拾人牙慧罢了。只不过,表面上两者的合理性看起来近似,都有一坨历史包袱;骨子里呢?一小部分情况是对客观现实必要的妥协,另一部分则是给之前的愚蠢选择买单而已。 从Java的设计者到主流用户来看,后者的概率明显更大。而其它“复杂”语言的一些恶心之处反倒淘汰了一些不合适的用户,剩下的相对就不敢那么浮躁——如果不想一事无成的话。 @noli 如果原生支持一些语言构造的直接变换,不引入新关键字当然是可能的。但是,C++天生欠缺对这种扩展语言的方式的支持,在这种问题上会付出太大的代价。搞成像LISP方言那样就得扔掉一大半现有的特性,引入一大坨现在不存在的特性,这可不是“可持续发展”——不说语言规范维护的困难和用户切换的成本,就是可实现性都成问题。现在的提议可能仍然不是最好的,但明显是更可操作的。 |
172
ryan10107 2015-05-12 19:59:48 +08:00
当还在讨论语言谁优谁劣的人就仍是一坨shit。。。
|
174
jo32 2015-05-12 21:06:26 +08:00 via iPhone
这种讨论毫无意义,在无明确的 context 和目标下讨论语言优劣根本扯不完,受不了这种无意义的引战,要是可以给楼主评分,我愿意给负分滚粗
|
175
lvfujun 2015-05-13 00:08:51 +08:00
@WispZhan 你这么说确实有道理.不过等生态圈日益成熟起来再卸磨杀驴.不知可否想过.原来的java程序员转语言的学习成本.我估计到时候抵制的人绝对不少.想换语言也没那么容易.
顺带说一下.PHP是最好的语言! |
176
ryan10107 2015-05-13 08:13:57 +08:00
@FrankHB 你觉得这种讨论有意义吗,直接就这样讨论语言谁优谁劣,没有任何背景和使用场合。语言就像工具,拿着锄头去锤钉子,那有意思吗?无所谓好与坏,只有合不合适。语言发明者哪个会这样讨论,麻烦你指出。Java发明者有用Java来写操作系统吗,C++这么好,为什么还需要Lua?C++这么厉害,为啥不写前端,需要JS。
|
177
keke99love 2015-05-13 09:11:17 +08:00
这种讨论感觉真的没意义,哎
|
178
FrankHB 2015-05-13 09:11:53 +08:00
@ryan10107 我觉得很有意义。
语言作为“工具”,和API或者其它开发环境用到的依赖一样,并没有什么特殊的,有很大改善的空间。即便你自己没法发明语言,没法实现语言,仍然可以改进现有语言。这种改进的初步共识就是在这类讨论取得的——首先先要确认足够的动机——用户需求,具体点说就是多数用户对现状的不满。退一步讲,你没法改变一个语言,那么在一个语言不够合适的场合,换一个语言也很正常。这样,就有必要交流什么场合适用。 反过来,我倒是奇怪,强行“没有意义”党的底气是基于什么理论什么事实得到的?是已经修改过语言发现徒劳无功了?还是仅仅不愿意承认自己没有行动力?或者干脆就是斯德哥尔摩综合症? 恐怕其中的大部分,就是自己没有能力改进语言或者看不懂在说啥,干瞪眼不爽,于是就把对现状无力的反感迁怒到讨论这种形式上了吧。 我不同意“无所谓好与坏,只有合不合适”这个观点。一种解决方案合不合适的理由显然不可能全因为用户的选择。有一种情况是设计者自身不够料到变化的需求(没设计“好”),却错误地使用户相信这种解决方案合适。或者说,直接的问题就是“锄头去锤钉子”还不自知的用户太多了,反而还要为这种行为的合理性辩护。 语言这种大多数用户没有尝试去设计过的东西是这种误解的重灾区。正是因为这样才更有必要澄清。正面讨论语言的优劣是有效手段之一。 Java写操作系统有什么好奇怪的,又不是没人试过。 http://en.wikipedia.org/wiki/JavaOS http://en.wikipedia.org/wiki/JX_(operating_system) 你硬说作为“操作系统”绝对不合适?还真的未必——至少系统级别的GC没进程隔离阻碍回收资源那么坑(就这种设计而言,如果不适合造操作系统,就更不能指望适合开发用户空间程序)。只是造出来短期也不可能和现有的东西合拍就是了。 还有用Java造CPU的呢。 “C++这么好,为什么还需要Lua?C++这么厉害,为啥不写前端,需要JS。”——这是谁说的?我没在这个主题里见过支持因为C++可能可以用,所以就不需要其它语言的论据。而且,这看起来不正是因为你没法说出具体语言“好”“坏”在哪(如果要说语言自身就不可能只是合不合适)才有的疑问么。 题外话,语言可以作为工具,但绝不只是工具。大多数时候也不应该作为工具。从一个语言的话题就能影响这里那么多人的心智搞成宗教战争的架势来看,当作工具就已经上当了。 @all “请尽量让自己的回复能够对别人有帮助”——回复框下面的这句话我不希望是摆设。 要支持“无所谓好与坏”或者“这个问题讨论没有意义”请像楼上一样展开论述,一句“无聊”“负分滚粗”和一厢情愿的“毫无意义”只是浪费所有人的时间的损人不利己。 |
180
ryan10107 2015-05-13 09:39:11 +08:00
我已经在v2见过越来越多这种无聊的帖子,如果还是见到如此纯喷的帖子,我已无力反驳了。
@FrankHB 这种人也是我为什么后来远离了v2ex的原因。 |
181
FrankHB 2015-05-13 09:43:21 +08:00
@ryan10107 ……能抓重点么。
我不用Java写操作系统,是因为: 1.对我或者对写操作系统这个任务来说,Java不好用。即便非要用类似的设计,我也宁可用CLR+C#而不是JVM+Java。(当然,并不是说前者就够好用到让我付诸实践了。) 2.更重要的是,写操作系统对我来说没意义——我现在没这个需求。所以要是你也不写,只能参照别人。 为什么不作为工具就要作为其它什么的呢。你会拿汉语当爱人么?如果是,那么类似地,这里也请自便。我是没那种心情。 非要说的话,某人(嗯,早于王垠,那个也是拾人牙慧)早就说过,比起工具,更像是“材料”——它或多或少地嵌入到产出之中,影响成品的质量。 |
182
FrankHB 2015-05-13 09:46:15 +08:00
@ryan10107 “远离了v2”……你现在是打算重新接近么。那么建议还是请继续远离好了。这样对谁都好一点。
我当然也不曾指望过v2的多数用户在这类问题上有LtU之类的地方专业,然而某些版面就事论事的氛围都赶不上reddit之类的地方甚至一些有活人管的贴吧……只能说不曾接近v2也不亏。 |
183
noli OP @FrankHB
没必要把精力用来回复那种人。 当然,如果你对他的回复特别有感觉,不吐不快,这种情况除外。 请让我向你的分析致敬。 我来总结一下,目前为止在这篇帖子里面各种回复的人的逻辑吧(如果回复是有逻辑的话)。 1. 资格逻辑 我说:Java语言不好。Java 语言这里不好,那里不好 他说:你是谁,你有资格吗?你做过什么牛逼的东西? 这种人呢,有不懂言论自由精神的可能,也有可能是纯粹是来发泄的。他们的基本逻辑就是,你说的什么都不对,除非我服了你(by 作品 或者名声)。 这种根本不是就是论事的,没有必要理会。 2. 语言炮逻辑 我说:Java语言不好。Java 语言这里不好,那里不好。 他说:你是语言炮。不要跟语言炮交流。 这种人其实也没什么不好。只不过他们的预设前提是:炮轰一门语言太哗众取宠,一门语言的设计肯定有可取的地方(政治正确但没有实际价值的废话)。 如果他是作为一个政治家,这样很高明,先质疑动机,进而歪曲整个意图,然后我就不用听你说了。 不过我作为一个写代码的,我也不想跟他们说话。 3.实用主义逻辑 我说:Java语言不好。Java 语言这里不好,那里不好。 他说:语言没有好坏,看应用场景。更进一步,你举的场景都是Java 不强的地方。 这种人其实也没什么不好。只不过他们预设的前提是:就算有不足的地方,你说出来也是没用的,因为你改不了,或者说因为你不是语言发明者,又或者是你又改不了这个生态。 实用主义者相对于语言炮逻辑,又好了一点点。但是从根本上没办法避免实用主义的另一面,就是短视和功利。 说句很抱歉的话,我确实在写编译器,想发明语言。就算我不写编译器不发明语言,我觉得这样的讨论至少可以帮助程序员设计好的库来解决问题。 既然你们都是能用就好的想法。道不同不相为谋,诸君请吧。 诸位,请对号入座吧,玩得开心点。哈哈啊哈哈 |
184
zhoutianmao 2015-05-13 14:26:52 +08:00
@wangfengmadking 我一个同学就是因为C++写的代码不好看放弃C++的。
|
185
noli OP 再分享一下,我自己批判或者审视一门编程语言的一般思路,以感谢这么多位捧场。
我觉得一门语言绝对不仅仅是工具。 我认为,在编程的领域来说能称为工具的,应该说是思想,编程语言是思想的一个“现象”而已。我的意思是,编程思想是本质,编程语言是现象。 为什么可以这么说呢,你看看,其实很多编程语言,例如自称是OO的语言,都是可以共享相同的原则的。譬如 依赖倒置原则啊,Liskov 替换原则啊什么的。又譬如自称函数式编程的语言,都喜欢不变性啊,尾递归优化啊,代数数据类型啊,lambda啊这种东西。 如果编程语言之间可以拥有那么多的共同思想,显然把他们归类在"工具"这个范畴,是不够准确的。情形就好像:人和猿类,大家都有四肢五官,仅仅归类为哺乳类是很不准确的,猪也是哺乳类,但你指望猪能用手偷桃子你就要傻眼了。 正名这件事情是很重要的,不然脑子里面有一个不正确的印象,就没法把事情说清楚了。回到编程语言的话题,编程语言为什么不仅仅是工具呢。 在我们使用工具的时候,我们会预设一个用途,然后选定一个工具,挖土用铲,施加打击用锤。我们在解决编程问题的时候,也会预估编程问题的类型和范围,选定合适的技术(注意我的用词是“技术”),通常技术确定了,那么才会去敲定用一门或者多门语言解决问题。从这个角度来说,语言确实是很像工具。 但很可惜,语言不像工具的地方在于,工具是被动受人主观控制的,而语言不是。 语言有社区、有生态、有其他编程人员反过来会控制你或者对你施加影响。更加糟糕的情况是,当你使用一门糟糕的语言,反过来被糟糕的社区、生态、和糟糕的程序员等等,干扰的话。你就明白为什么编程语言不仅仅是工具。 最重要的是,这些东西会干扰你的思想,导致你做出一些你本来不设想会做的事情。C++程序员应该会很有体会的就是,假如你的同事不是特别精通模板,于是你设计的很多基础设施你就不得不花更多的心思精心去包装使之看起来不是那么可怕,或者甚至就不使用偏特化之类的特性了。你写的C++代码带有C++11 feature,那么你就不能指望在几年没关过机的Linux 上编译通过了。 工具不应该是这样的,工具不趁手,可能你想都不想就换其他了。 C++至少还是有向下兼容的能力,新的不行我用旧的方法还是可以挺过去的。但如果是语言向上不能,那么你就要吐血了。譬如 GCC 用 C 来写编译器,他可能从来没想过有朝一日IDE是要深度介入编译器前端的。用 C 的于是傻眼了,实在很难把控这么复杂的交互,只好逐步转C++,我猜测这是 GCC 转 C++ 的原因。 戏肉来了。我还是要批判 Java 的,别想再在 Java 语言封闭的世界里面继续图样图森破了。 要批判一门语言,就是要看他的编程思想能否自圆其说,这是最基本的。如果自相矛盾,那么不用玩了。 什么叫自圆其说,譬如说,Java 认为一切都是对象,没问题,在Java 里面确实所有的东西都是 Object,并且整个语言提供了这样的设施来实现这个思想。譬如你的方法返回的是一个 int,你想把int 放进容器里面是不行的,你要box 这个int。假如Java 不是这么做(其实我宁愿他不这么做),那么你在容器里面取出一个东西的时候,你就不能指望可以 toString(Object类的方法),也没办法GC了。 大多数能够流行起来的编程语言都是能自圆其说的。所以要看第二个层次,编程语言的思想和设计能解决什么程度的现实中的问题。 在这个层次上,Java 就不太妙了。Java 说一切都是对象,对象都是有生命周期的。他在JVM 的世界里做的很好,因为JVM 的GC确实很不错。但是去到JVM外的世界就有点麻烦了。简单的例子,文件是不是对象,连接是不是对象,所是不是对象?都是,但是这些东西的生命周期结束,指望用GC来自动关闭是会出事的。所以,Java 里面开始要有一些手动关闭的东西。所以,指望这些东西跟普通对象一样可以传来传去不用担心资源问题,有点变的不真实。 当然,C# 也有这种问题,所有带有GC 的语言都会面临这样的问题。 但是,C#的设计者一早就知道会有这样的问题,所以他们有 using。直到 Java 7 才有类似功能的语法糖。 又因为 Java 认为一切都是对象,所以他们认为泛型也是可以用对象来解决的,所以Java 开发者们很开心的有了一堆类型擦除的泛型容器。 还是因为 Java 认为一切都是对象,所以他们认为数据查询这种事情,应该是一种具体的对象提供的对外接口问题而不是语言要解决的问题。所以 Java 的开发者很开心地用各种 ORM 框架发起数据库查询,然后依然很开心地,用嵌套循环语句来查询自家树状数据结构中的对象。什么?你认为这不是一个问题而是两个问题?好吧,当我没说。 最后,因为 Java 认为程序员们已经有这么多的对象了,所以加班加点也不怕找不到对象了。 XD 当然 Java 还成功地使你们认为这不是同一个问题,是社会大环境问题,是公司管理问题,是自己能力的问题,总之不是Java 的问题。所以,不准别人诋毁心目中神圣无比,为你带来工作机会带来收入的Java! 啊哈哈哈哈哈。你不加班谁加班啊,活该! |
187
MurphyL 2015-05-13 15:13:40 +08:00
我不会和人宣称 JAVA 好,但我也不会和别人吐槽其它语言差……要做到了解一门语言的方方面面太难太难,以个人视角来评论一门语言会不会太过苍白?
|
188
monsabre1 2015-05-13 15:19:14 +08:00
@noli
有些偏激 java python一个是编译托管语言 一个是脚本里 java速度更快 安全性更高 银行电商不二选择 python呢 结合库引擎能实现比java不算太弱的功能 都是适合团队开发的好工具 scala不少人已经转回java了 swift其实也是不大不小的坑 有人不明就里就跳进去了 scala swift这些类脚本风格编译语言 没有人能超过python的 团队合作 很多坑 可读性强 python是王 有时新东西也是坑 话说我的win下的软件移植是delphi的 移植在维护 还支持osx了呢 哈哈 |
189
monsabre1 2015-05-13 15:34:14 +08:00
java出现是为了解决跨平台 性能是c++的一半左右
有些繁琐 但是程序可读性强 和python都是团队合作开发的好工具 python是牺牲部分性能追求开发速度 |
190
noli OP @jun4rui 其实不是面向对象不行,而是写 Java 的时候很多东西没去细想,想尽可能简单,所以就挖了很多没法填得坑。发明 Java 的时候注意了很多数据管理,数据很OO,但是对“计算”的本质并没有做 OO 分析…… 所以就坑了。
|
191
RisingV 2015-05-13 15:47:35 +08:00
计算机本身就是人类的造物,造物总没人本身重要。圈内真不缺乏会点技术而产生人格障碍甚至神经失常的。
|
192
jsjscool 2015-05-13 16:02:04 +08:00
一门语言,我还没开始学……光装环境就把人弄的半死。
|
193
monsabre1 2015-05-13 16:03:57 +08:00
|
194
monsabre1 2015-05-13 16:09:22 +08:00
linkedin因为技术栈简化也退回java了
我倒是希望白鼠们都用swift趟坑 这东西好写不好读 最后还得维护两种语言 嘿嘿 |
196
asj 2015-05-13 16:37:02 +08:00
@monsabre1 我不信我不信我不信,>_<,为什么Go比D还低啊?为什么Pascal还能排那么高啊?为什么还有FoxPro这样的妖孽啊……
|
198
monsabre1 2015-05-13 17:47:57 +08:00
我们的大javascript以后早晚前三
@jun4rui github上js是第一 (和node与前端有关) http://www.csdn.net/article/1970-01-01/2817922 不过这个是综合各种排名 http://www.idcps.com/news/20140722/76021.html http://www.idcps.com/uploadfile/2014/0722/20140722085126114.png @asj delphi啊 我也在用支持osx了 嘿嘿 工程开发讨论语言优劣 忽略 1.性能 (c c++ delphi java/nodejs/objectivec -scala/erlang-------python/ruby php 大概这个排位) 2.技术栈复杂度引起的成本 (如果能有一种语言搞定所有事情成本还低最好 可惜没有 以后也不会有 大javascript搞前端客户端前台 可后台复杂逻辑也是渣)语言大多几天几周就会了 但是库框架那是大山要爬 3.团队合作开发和维护的容易度 (好写和好读是两码事 个人开发和和团队合作开发是两码事 游戏和应用开发是两码事) 4.技术人员资源的丰富度(java php是优势) 5.开源资源的利用(技术栈允许的前提下降低成本) 6.未来发展 不合适 只看部分优点不综合权衡乱用新技术 就容易入坑做白鼠 小是个人辛苦 大是公司完蛋 有时公司里的个人出于各种想法会选择自己喜欢的方案(未必是最好的但是适合自己) 公司就要慎重了 仔细权衡能看远点最好 中小公司技术栈越简单越好(BAT可以吹求那最后都10%都性能提升) 简单不一定不伟大 dropbox技术栈很久一直是python github一直是ruby 都很伟大 个人是技术越越复杂越好 有人愿意出钱学东西还拿工资最好 |
199
monsabre1 2015-05-13 17:50:10 +08:00
我见过小公司内部4,5种语言的
就乐 cto天天忙着找人 当初会这几种的大拿背不住跳槽了 嘿嘿 |
200
monsabre1 2015-05-13 17:55:23 +08:00
java的经验程序员一样的工资找到的cocoa程序员估计多是小白
技术栈复杂引起的成本上升释然 公司用的语言 使用者烂大街其实最好 |