开篇词 | 如何解决语言问题?
开篇词 | 如何解决语言问题?
讲述:周爱民
时长10:27大小9.56M
问对问题
语言
语言的特性
体系性
学这门课
赞 50
提建议
精选留言(50)
- crown2019-11-12老师好,我工作主要用node. js开发游戏服务器和web服务器的,按照我对操作系统的理解,单线程容易写对逻辑,非阻塞io如文件操作等+ epoll可以实现异步io,开多进程可以利用多核心。 可是大家都说node是单线程做游戏服务器不行,但是游戏逻辑不太好用多线程表达吧。。。 说node不适合写游戏服务器,主要说是js运行效率的缺陷?
作者回复: 在涉及纯计算效率的问题上,js确实是要差一些的,要不然也不会专门再弄出一个BigInt类型出来,以及还有所谓的TypedArray。但是,如果仅仅是说能不能做游戏服务器,开发游戏应用代码,那么坦率的说:1、没问题,2、效率还错,3、开发挺快的;4、网络实现也很简洁……但是如果游戏需要处理传输层的编解码,等等与计算效率相关的情况,那么(前面已经说过了)就得换方案了。 你提到多线程问题,对于最新的Node.js来说,原生多线程也是内置的了,但并不比传统开发工具下的简单。——所以除了语言或工具的习惯性之外,它也并没有什么优势。另外,在线程操作这个层级上,大家提供的都是差不多的核心操作或API,所以使用复杂度,面临的问题集之类的也差不多。只不过,相对于其它语言或应用环境,Node.js缺少在多线程基础上的开发库,这方面基本为0。 最后,还是从纯语言的角度上来回答你的问题。事实上决定它合不合适写游戏的,根本之处(从语言的角度上来讲)与你所提的绝大多数特性都无关。如果游戏规模大一些,那么就不适合直接用JavaScript来开发了。在任何的、包括游戏开发在内的大型的应用开发中,JavaScript最大的缺陷其实是缺乏静态类型声明与检查。在动态类型体系下开发大型程序几乎是一种灾难,即使你再能控制类型的使用、团队的编码习惯等等,都很难避免。 因此如果你非得在这种场景下使用JavaScript,我非常建议你考虑TypeScript,哪怕是Flow也行。当然,最终运行的执行环境仍然可以是Node.js,这就是个效率问题了,而与语言无关。
49 - 烤迪2019-11-15老师可以推荐一些有利于洞悉语言本质的书吗,可以结合专栏阅读或者后面继续学习的书
作者回复: 裂墙推荐。^^. https://github.com/aimingoo/my-ebooks#程序原本 老实讲,比这里用js来讲的内容要易读得太多了。这里讲js吧,我还得注意“js/ecma到底如何实现”,或者这个特性那个特性什么的。而《程序原本》里只讲本质就好了。^^.
共 4 条评论29 - 小伟2019-11-11js是我最早接触的语言,也是一直敬畏的语言,你以为掌握了,但在debug的时候,error会给你致命一击19
- lunar2019-11-24小岳岳不仅会说相声,js还这么好?😱😱8
- 余文郁2019-11-12function Foo() { getName = function() { console.log(1); } return this; } Foo.getName = function() { console.log(2); } Foo.prototype.getName = function() { console.log(3); } var getName = function() { console.log(4); } function getName() { console.log(5); } Foo.getName(); getName(); Foo().getName(); getName(); new Foo.getName(); new Foo().getName(); new new Foo().getName(); 老师,我做了一道网上的题目,发现做不出来,运行后,发现在node环境会报错,浏览器环境会依次输出2 4 1 1 2 3 3,老师可以帮我解释一下吗,确实有点懵了展开
作者回复: 按浏览器上的执行效果理解就对了。 NodeJS加载的文件是运行在一个模块中,因此function Foo()的代码中的"return this;"并不能得到global,从而导致“Foo().getName();”这一行不能得到global.getName出错。
共 4 条评论6 - 余文郁2019-11-20老师,今天突然想到一个问题,就是为什么js中有高阶函数这个东西,可以把函数当参数,还可以返回一个函数,其他语言里没有,这跟js诞生有什么联系吗
作者回复: 函数式语言特性并不是js独有的,它是一种被广泛认可的语言特性。但在函数式特性方面,Eich没有太强调他在早期语言设计中受到何种影响。 现在的tc39中的成员们,从整体趋势上来看,是更认可js中的函数式特性,而否定其中的oop特性的。 所以,有时候感觉这门语言(的特性)已经开始变得怪怪的了。:(
共 2 条评论6 - ericluo2020-05-18周老师好,您能具体分享一下用LUA做的金融级的风控产品的背景吗? 如为什么当时技术选型使用了lua脚本语言?当时的解决方案还有那些,然后最后为什么选择了lua,谢谢
作者回复: 关于选择lua,其实主要是没有太好的选项。当时的服器环境是nginx的,如果想在server端做一些重量级的事情,那就只有nginx_lua好用,当时的nginx_javascript官方支持已经出来了,我考察了一下,很不成熟。所以很大程度上,选lua只是因为如果需要“运行在nginx中”,那么只有他跟nginx配合得很好。 有些风控方案是将风控系统运行在外部的,这种情况下nginx_lua就不是必须的,也不是最优的。而我当时需要做到实时的风控,因为金融级的必须在最短的时间实现反向控制。所以最可行的选择,就是在nginx内加入监控点、ai决策和反向控制逻辑。 另外,关于这个产品你可以看一下ngx_cc这个项目,在这里: > https://github.com/aimingoo/ngx_cc 在它的wiki里有一些简介和架构参考: > https://github.com/aimingoo/ngx_cc/wiki/简介
共 2 条评论5 - 鸡蛋火腿酥饼2019-11-14老师您好,我现在正在一家公司实习,使用JS为公司开发功能需求的外部库,但是总觉得自己的代码风格和效率差,不知从哪学起,也不知学您这个适合吗?
作者回复: 如果是这个目的,那么不太适合。因为这个课程的内容,讲工程应用的较少,对代码风格也缺乏讨论。 这个课程更多的是构建语言的学习与认知的体系,而不是提供应用开发的技能,二者目的不太相同。
5 - 张三2019-11-14老早就看了爱民老师的绿皮书。两个字“牛B”。共 2 条评论4
- ssala2019-11-12接触的语言中,js是唯一一门让我头大的语言,打算跟随老师一起学习。共 2 条评论4
- 温晓东2019-11-12爱民开课 支持 希望看见更多的课
作者回复: 谢谢支持✊
4 - 翅膀2019-11-12第n+1次,学js. 这次要坚持住
作者回复: 加油!
3 - Jack Q2019-11-11掌控代码,而不是被代码掌控。
作者回复: ^^. 完全赞同楼上观点
3 - kkxue2021-05-10爱民老师,请指点下如何阅读《编程原本》
作者回复: 从头到尾,读到读不懂为止。 这本书是由浅入深的,由抽象到具体讲的,所以越早的部分跟你现有的知识重合度越高(越易懂)。 但是因为越早的越抽象,所以有“似是而非(看起来像是,细读下觉得说得不同)”之感,这种情况下要多思考,但不见得是你理解得不正确。 如果往后,有读来觉得“知而不解(就是看起来知识点都知道,但是不懂作者表达的意思)”,那就是你现在知识体系中理解得有误的部分了,忘掉已知的,跟随文中的思维逻辑重新理解一遍。 最后的部分(尤其是“系统”相关的部分),那是架构师的入门之径,如果读不懂也不要紧,看下,记住,要用的时候自然就懂了。 这本书的后续是《我的架构思想:基本模型、理论与原则》,那是按架构师的要求标准来写的,读法就更不一样了。
共 2 条评论2 - undefined2021-04-23- [LINK](https://time.geekbang.org/column/article/163480) - 这个专栏我听了和看了多遍,同样的内容,每次学习的感受却不尽相同,总会发现一些新的知识点或是新的理解。 - 不同的人,对于不同学习形式的接受能力也是不同的。有些人喜欢阅读书籍,有些人则更倾向于视频教程。对我自己而言,我并没有特别大的偏好。 - 针对这个专栏,我通常是先粗略的听几遍,了解大概内容,然后再细读原文。再听,再阅读,周而复始。阅读时速度更快,会下意识的跳过部分解释,偶尔会错过重要的知识点。而听的时候,往往容易发现自己忽略的部分,甚至觉得自己读了假的文章。 - 对于刚接触这个专栏的同学,我个人建议先去看看加餐部分的《捡豆吃豆的学问》两篇文章,掌握学习思路后再来学习。 - 按照《捡》里提及的学习方法,首先应当自己设问。针对开篇词,我列了如下问题: - **自己提问题** - 周爱民是谁 - 什么是语言问题 - JavaScript有哪些语言问题 - 怎样学习JavaScript - 这个专栏应该怎样学习 - 这个专栏需要什么样的基础 - 怎样发现问题 - 怎样发现自己的问题 - **求解答案** - 对于上述问题的求解因人而异,而我也没有找到所有的解答。 - 解答的过程,应该贯穿整个学习过程,很难一次搞定。 - 尝试用文字总结,而不只是浅尝辄止。复述和重新描述,本身也很考验自己的理解和表达。 - **学习总结** - 应当尽早建立自己的知识体系,宜早不宜晚。 - 学习遇到困难,应该是件高兴的事儿。因为一旦解决了这些问题,就能获得可感知的进步和成就感。当然,在解决的过程中,倘若遇到始终无法搞定的难题,不妨直接跳过,过段时间再来尝试。如果有高人指导的话,寻求帮助也未尝不可。 - 不妨时不时读点 Specification,从标准的角度理解 JavaScript 的实现。 - **相关链接** - [加餐 | 捡豆吃豆的学问(上):这门课讲的是什么?](https://time.geekbang.org/column/article/171116) - [加餐 | 捡豆吃豆的学问(下):这门课该怎么学?](https://time.geekbang.org/column/article/171125) - **时刻准备推翻再来** - 为什么? - 相关的技术会更新,已知内容可能会失效。 - 同样的问题,随着实践的增加,可能会产生新的感悟。 - 存在着错误的理解,当时的自己并未发觉。展开
作者回复: 👍👍🏻+5
共 6 条评论3 - 一步2019-11-11JS这门语言成也灵活,败也灵活 熟练的怎么写怎么舒服,不熟悉的人感觉没有规范太灵活了容易出错 希望通过这个专栏形成语言的体系2
- 潇潇雨歇2019-11-11上个月就在期待了,看了课程预告那会2
- 潇潇雨歇2019-11-11一直期待着这门课程,终于来了;我觉得js是一门坑比较多的语言,因为当初作者设计编写的时候比较匆忙以及领导意思,但是毫不影响它的优秀,我们应该尽量去其糟粕,搞懂核心和特性。再也不怕了。然后就是ES6的到来,js变得越发强大了,我期待他能更加优秀,越来越强大。2
- 勿闻轩外香2019-11-11今天立flag,没事儿的时候盘一盘 :)2
- 翰弟2019-11-14早闻其名,以为老师曾已经输出过那么多,以为这次课可能没那么多真知,听了开篇词我先保证学完这个课。 另外发现技术科程的订阅量和得到之类的课不同比。我决定让女票也看这开篇词,接收“新”东西。 我是一个好不纯粹的程序员1