如果作者具有一定的 Node.js 功底,并且确实文章中有干货的话,那么帖子就可以加精华。
当然每个人的干货都会夹带着自己的偏好。这时候评论中各种想法的碰撞也是值得一看的。
最近的几个帖子,争议比较大,一方面是因为各位对于异步范式的喜好不同,一方面也是因为该作者言辞比较激烈。
对于前者,百花齐放挺好。但是对于后者,我也在劝作者适当缓和一下言辞。
个人觉得评价的依据应该还是文章的内容为主,node功底这个东西太虚了不好说,举个例子https://cnodejs.org/topic/550671cfc34008306435e30c
Rocore或许看在原创和分享的面子上,其他讨论事件编程的,版主你会写那样的代码么?你对event-proxy比较熟悉,你内心也应该有一个自己的评价。
或许我们应该更多一点质疑的声音,回调模式下的事件是不是一个错误?事件是不是应该运用到最合适的地方,而不是搞出自己绑定自己东西出来标新立异。事件是留给别人的接口,是让别人注册来使用的,event-proxy总不至于事件接口都不给人留吧。
node本身的模式都有被质疑的必要,更不要说这种错了没影子的东西了,加精不要紧,但评价还是慎重点好,那么多东西在那里,骂人的话可以删掉,但是技术上的讨论大家都可以去看。
@JexCheng 我现在对node也是持批判态度的,我现在更愿意把他作为工具。感觉node就是libuv被javascript绑架的产物,很多东西很美好,但是又没那么美好。如果在这里讲javascript的不是,被喷的可能性是很大的,但这也许跟语言没有多大关系,而是因为语言被滥用了,或者说被自以为是的滥用了。
说一个很现实的问题,fibjs很热闹那会,我就在思考这个问题,如果一旦出现一个性能上不差,能够完美将异步转化为同步编程模式的东西出现,程序员们会不会再次用脚投票呢?我最后的结论是,node被抛弃不抛弃都是无关紧要的,最紧要的是我们能够提升自己,尽自己最大的努力去探究底层的,这样不管上层的东西如何变,我们自然可以以不变应万变了。fibjs不知道能不能火,但如果fibjs能够更多的融入开源社区,机会肯定更大一点。
我又重新翻了翻那个帖子,我的确是被一个无所不通的人教训得像个小学生,但是回想起来了,自己年轻的时候,也是有过老子天下第一的阶段的,但随着年龄的增长,反而越来越不自信了,比自己牛逼的人海去了。读得代码越多,越觉得自己像个小学生。
@coordcn 那什么语言美好呢?PHP?Java?Python?
什么语言没有缺陷,什么语言没有自身的优点。
的确如你所说,跟语言没多大关系,而跟用的人有关。Java 是好语言,但是被滥用了,名声就臭了,一个道理。
现在用 Node.js 写代码的人很多都不是科班出身的。实际上不是科班出身不要紧,可以慢慢来慢慢学,只是如果不是科班出身再加上态度上的问题的话,这样的人一多名声自然就臭了。
比如各种坑人的培训机构出来的各种 Java 的程序员、PHP 的程序员等等等等。
语言什么的都是次要的,这只是一种工具。而编程真正的灵魂在于思维和算法。
@xadillax 我没有贬低javascript的意思,所有语言在我眼里都是工具,非要按自己的喜好排个次序,我的顺序是C,Lua,Javascript,很意外没有你列举的语言吧,我就是你所说的不是科班出身的人,不过我也庆幸自己没去过培训机构。有的时候,科班真的不是那么重要,自己喜欢远比科班出身重要,不是科班只是高考的时候分数差了那么几分而已。为了那几分,我用一生来弥补还不行么?
曾经我们说“我们不能打一辈子星际,但能做一辈子朋友”,是的我们不能打一辈子星际,但是我们可以编一辈子程序,不为别的,只因喜欢。
强烈同意编程真正的灵魂在于思维和算法,共勉。
@coordcn 科班不科班是不重要。重要的是态度——很多人不是科班了还态度恶劣,自以为天下我有的感觉。
就我自己而言的话,顺序差不多,C / C++ / Node.js。
还有其它的一些形如 Clojure 之类的玩具。
笑死人了,以为你TM是谁啊,一个小型的百度贴吧而已。
给你转个帖子,还当自己多大回事是的。
就一个阿里巴巴的小论坛,还把自己当回事呢。
阿里巴巴的程序员,在我那还真不是回事呢。
这个地方,源代码写的shi一样,流量b一样,装逼装的挺大。
我看我也学某人,闪的远远的吧。
菜比聚集地!!!
转帖列表上有这个地址就是个错误。
谢谢管理员几天前帮我整理了好几个代码格式。当时忙于辩论,没来得及感谢。补上。
本来见到烂人烂代码不断地被加精,正考虑鼓动别人另开根据地呢,或者从此少来这里,发现事情有变化,稍感欣慰。疾病邪恶腐烂绝对地有扩张性传染性,没有抗体是非常麻烦的事情,人没有抗体很难活过一整天。抗体比如T细胞,对待可疑物,在必要的时候完全是嫉恶如仇赶净杀绝(需要网友去识别、公开驳斥,不一定是管理员,但管理员需要有同样的警觉心),这样才稍微可以对抗身体的疾病和腐烂。
我来插句嘴: 本以为做技术的同学应该都比较理智的…… 思路和习惯都没有绝对的好与坏,个人喜好罢了。 程序员不谈国事,不谈国事又有什么说不明百的呢? 希望这篇帖子能永远保留,程序员需要这种激情,只要不动刀子,吵两句嘴,正常!
@tulayang 来社区就是为了交流,为了相互学习,相互帮忙。你觉得这样继续骂别人下去能解决问题吗?你换位思考一下,你是楼主,你看到这样的回复,心里还会和气地回复你吗?永远保持一颗菜鸟的心,才能不断地坚持学习。在一定场景你不是菜鸟,但是还了一个场景,你也可能是别人眼中的菜鸟。程序员社区应该是逻辑性比较好的集中地,没必要这样啊。你就消消气吧,如果你juede社区的同学对你不好,我在这里跟你陪个不是,请你原谅。 自豪地采用 CNodeJS ionic
不以成败论英雄,真正被人们铭记于心的英雄是那些身体力行把力量贡献给人们的普通人。 墙内的developers都知道一些nodejs的疑难杂症,大部分都是从这个小社区找到答案的。 我还是坚持 ,任何花费自己休息时间,整理文字,代码,分享到这个社区的人,都是值得尊重的!
@LongHorn-C 我没有低看javascript的意思,我自己的语言排序是C,Lua,Javascript,我个人不太看好从C++,可能我脑子不太灵光,对太过复杂的东西无法掌控,所以只能选择C。Lua之所以摆在javascript的前面,是因为我觉得相对于javascript,与c的绑定lua更简单一些。lua的很多概念跟javascript是类似的。这种选择其实跟个人能力有关,跟语言本身的优劣无关。
@tulayang 我想你完全误解大家的意思了,大家跟你的帖子,指出一些技术上的问题,根本不是对你个人有什么看法。程序员都比较顶真,但大多无恶意,也无贬低别人的意思,仔细思考一下吧,我想你是能分清楚的。
你好像很吊的样子,写了几年半残不残从shell脚本扣下来的PHP,做了几天网页,觉得自己懂编程了? 连PHP作者都TM说自己根本不懂如何设计一门语言。 Facebook天天花着流水般的钱,用C C++给这白痴才用的语言所写的源代码补窟窿。 你在这里天天穷BB你妈的逼呀! 给你爹学着点,EventEmitter的源代码是什么:
function EventEmitter() {
this._events = {};
}
EventEmitter.prototype.on = function (type, f) {
this._events[type] = f;
return this;
};
EventEmitter.prototype.emit = function (type/*, arg1, arg2, ...*/) {
this._events[type].apply(this, Array.prototype.slice.call(arguments, 1));
};
var eem = new EventEmitter();
eem
.on('A', function () {
console.log('A');
this.emit('B');
})
.on('B', function () {
console.log('B');
})
.emit('A');
@tulayang 不要这个样子,技术交流大家都没恶意。你今年多大了?能做个自我介绍么?我现在对你倒比较好奇了,你这种状态肯定也属于少年得志的。技术上大家没有完全否定你的意思,我认为你还是那种对技术有追求的人,就是表达方式有些问题,什么屎啊尿的,我们文明人,不能好那口啊。
这就是你TMB的编程功力,装你M的逼呀,自己看看这是哪个SB写的代码: 看你TMB代码写的那穷酸相,连TMB空格都不带写的
function __walk(p, fn, regexp, dir, done){
fs.readdir(p, function(err, files){
if(err){
if(err.code === 'ENOENT'){
done(null, null);
}else if(err.code === 'ENOTDIR'){
if(!regexp || (regexp && regexp.test(p))){
fn(p, function(err1){
err1 ? done(err1) : done(null, p);
});
}else{
done(null, null);
}
}else{
done(err);
}
}else{
if(files.length){
var f = files.map(function(item){
return path.join(p, item);
});
tasks.map(f, function(item, callback){
fs.stat(item, function(err2, stat){
if(err2){
callback(err2);
}else if(stat.isFile()){
if(!regexp || (regexp && regexp.test(item))){
fn(item, function(err3){
err3 ? callback(err3) : callback(null, item);
});
}else{
callback(null, null);
}
}else if(stat.isDirectory()){
__walk(item, fn, regexp, dir, function(err4, files){
if(err4){
callback(err4);
}else{
callback(null, files);
}
});
}
});
}, function(err5, results){
if(err5){
done(err5);
}else{
if(dir){
if(!regexp || (regexp && regexp.test(p))){
fn(p, function(err6){
if(err6){
done(err6);
}else{
results.unshift(p);
done(null, results);
}
});
}else{
done(null, results);
}
}else{
done(null, results);
}
}
});
}else{
if(dir){
if(!regexp || (regexp && regexp.test(p))){
fn(p, function(err7){
err7 ? done(err7) : done(null, p);
});
}else{
done(null, null);
}
}else{
done(null, null);
}
}
}
});
}
@tulayang 做个类比不行么?从本质上讲,所有能够保持状态的值不都是存在内存里的?当然闭包肯定和static不是分配在一个地方的,static是编译器预先分配好的,生命周期是整个程序运行期,闭包可能是malloc出来的,不被外界引用就要还给系统。我认为他们都可以使函数保持状态,从这个方面说,他们类似有何不可?
@tulayang 我就这个能力了,能写到这样我都觉得很费劲了,你如果觉得代码太垃圾的话,自己也实现一个吧。
异步遍历目录和文件,很多朋友都有需求,有需求就值得去做,我这个东西,我自己都不会用,只能用来证明我会堆代码而已。
@tulayang 对不起,没有老师教我,我只能自己学。你自己再仔细想想闭包要不要分配内存?没有内存状态数据状态怎么保持的?跟函数的关联怎么做的?malloc只是内存分配的一个比喻,你总不敢说闭包不需要内存的分配。
至于static的用法,我知道的只有三个,修饰函数外变量函数内变量,这两种都是编译器分配在静态区的,生命周期与程序运行周期相同,还有一种修饰函数,表示函数只在本文件内使用。其他的你可以补充。
@tulayang 你懂的话,就把你懂的说出来。就如我的代码,你不喜欢,自然可以重写一个更好的。这里大家都在讨论,只要不骂脏话。你知道你满嘴脏话我为什么不骂回去么?你满嘴脏话骂不到别人,骂的都是自己的父母,我没有资格,也没有义务替你的父母来教育你,抱歉。
@alsotang 千万不要啊,由他带起的讨论让大家也可以多学点知识,我也是受益者,希望给他个机会,继续发挥自己的作用,只要不骂人就行了。当然他要骂也没办法,给他骂就是了,骂不死不是。
他说我那代码垃圾,说得一点也不错,那个代码是我费了好大劲写出来的,写完一看,自己也不满意,仅仅为了实现功能。不过异步目录和文件遍历本身的确比较难,我倒是想看看其他人是怎么实现了,反正对自己的很不满意。
@coordcn 装B,目标就是让你觉得他很懂。你还向这个水货请教,那他目标就达到了。我都不回复他了,他还要跑过来 at 我,可见他装X的瘾还远没满足呢。在我眼里他就像在光屁股裸奔,他就仗着你们看不出来他是个水货,他才敢痛痛快快地裸奔
@alsotang 我是说的内部实现,闭包如果不分配内存状态记录在哪里?
至于说static,我认为还是可以对比下的。
function test(){
var i = 0;
return function(a){
i = a + i;
return i;
}
}
var c = test()(3);
int test(int a){
static int i;
i += a;
return i;
}
这两者不是很类似么?i作为一个闭包,自己要存储状态,肯定需要内存,还要跟返回的函数关联,这肯定也要内存,所以我认为我提到内存并没有什么不妥。说白了他们都是解决变量的作用域与生命周期的问题。
@JexCheng 我当然知道他是什么心态,但是公平的说,这些讨论还真都由他引起的,他的水平怎么样且不说,但他能让大家热烈的讨论,本身就是好事情,就像那个事件编程,我本来也没好好想过他的问题在哪里,只是觉得那种代码是脱裤子放屁(函数调用就能解决),经过你提醒知道,才意识他自己把事件给绑了。至于他骂人,那是个人教养问题,当没看见就是了。
@coordcn 用不着这么去理解,我经常说的是,理解语言机制,不要从其实现上去理解。比如大部分人都搞不清什么叫按引用传值,别多想,什么“传地址”的说法都是错的,他们的错误就是,没有分清语言设计和具体实现。明白这点就行,不要走上歧路。(我会说闭包不一定需要为你说的“存储状态”分配内存么?因为闭包不一定不是纯函数啊?)
PS:static变量始终只有一个,并且是永生的。闭包变量当然不是这样。
@JexCheng 我用static作比是我自己的一种理解方式,c语言是有其本身局限性的,static是静态分配的,灵活性肯定不如闭包。
为了不必要的误解,我澄清一下,闭包是闭包,c的static的是static,两者其实是风马牛不相及的东西,他们要说一样,顶多是作用上的类似,都是实现了一定作用域内变量访问。闭包是动态分配的内存,static是由编译器静态分配的内存。
对那个喷子有任何幻想的,我是说对他的技术水平有幻想的,请看:https://cnodejs.org/topic/552f49cee6ca0c7d05ebb217 到最后,他自己不好意思就把so beautiful的一个帖子自己删了(本坛子被删的帖子仍可根据网址访问)。另外那个柯里化的帖子,还有其它,他觉得被戳穿就自删了,可以避免认错。
本来他以为"不借助框架[3]"为他保住面子呢,所以但留此贴不删,结果发现自己的代码实在不能见光,无奈删去也。
@LongHorn-C 你错了,你还是低估了他的阿Q精神,虽然别人看起来他是在装X,但他却是自以为自己真牛X,要是一个人稍有那么一点点自知之明的话怎么也不会喷得这么毁三观的(前面他还又自告奋勇地帖了一个错误的EventEmitter实现,真是无语,我看他就像在看一个原始人光着屁股在你面前跳来跳去一样,你感受一下)。你看他博客:http://www.jianshu.com/users/eefc22646652/latest_articles 。那些低级代码都留着呢。他删帖绝不可能是因为他意识到自己错了没脸了。