先不说王垠水平能不能开发出Nginx和Redis这样的软件。
这个问题下某些回答给人的感觉是只要懂了底层原理,大部分人都会觉得Nginx和Redis不难。那既然“大部分人”都觉得不难,你们怎么没写个Nginx和Redis出来?哦,然后你又要说国内996,修福报,35岁下岗,怎么有时间写?或者是这么简单的事,我这么牛逼,我不屑于写。那你跟你口中说的王垠有啥区别?
不才Redis源代码没看过,不评价了。我看Nginx源代码的时候Nginx的版本号才1.2.6,现在已经到1.19.0了。断断续续看了近5年才差不多融会贯通。各位觉得大部分能写个差不多的大佬,如果有这个自信,NGINX, Inc.在2019年被F5收购了,卖了6.7亿美元,你要能写出个差不多的,你还干个鸡毛现在的工作啊?直接写个差不多的干翻Nginx得了,到时候说不定哪个公司看上你写的东西,你不成了人生赢家了?
Nginx难在哪儿?
首先,Nginx作者Igor编写代码不按套路出牌,我相信很多人学C语言的时候,教科书或者老师都会说最好不要使用void *这种指针,因为它类型不明,编写的时候麻烦,调试的时候更麻烦,Igor偏不,老子到处用void *,不只void *,老子还要用void ****。敢问觉得不难的大佬们,你们能画出这个void ****的数据结构吗?
其次,Nginx是全异步(其实按照异步的定义看,不算异步)非阻塞的,异步非阻塞有个问题,就是回调函数地狱。调试Nginx不像调试一般的C语言程序,从上往下一步一步执行就行了,你以为这个函数执行完了,并没有,它可能被挂到定时器或者epoll(kqueue)去了,一会儿可能还会执行。你说这不简单么?函数指针赋值的时候看准了它是哪个函数,打个断点就行了。这不是最骚的操作,最骚的操作是运行时换回调函数。那你看源代码里很多地方有类似这种调用方式:
ev->handler(ev);
你猜猜这个handler它究竟是啥?
然后,Nginx依赖的数据结构与算法,基本上都是作者自己造的轮子。Nginx只依赖了PCRE(正则表达式),OpenSSL(加密)和zlib(压缩)这三个库,而且可以通过configure去掉。想必是大佬们人均红黑树水平,分分钟造出一堆基本的数据结构和算法。
再然后,Nginx为什么高效?十有九个都只能回答出Nginx用了epoll(Linux)和kqueue(FreeBSD,包括苹果的MacOS)等高效的网络IO复用接口(包括这个问题下的回答)。然后呢?回答不出来了。如果只靠这一点的话,在反向代理服务器(七层)和静态Web服务器领域,用epoll和kqueue的千千万,为什么越来越多的网站首选Nginx呢?
最后,从Nginx诞生起,到现在的版本,源代码大的框架基本上没大改过,编写一个第三方模块,在最新的Nginx源代码中可以顺利编译,大概率它也可以在10年前的Nginx源代码中顺利编译(可能要加些#if#else#endif,修改一下config,毕竟早期的一些函数参数跟后来的不一样了,1.9.11开始支持了动态模块)。可能很多人觉得这不算啥,那你回过头去看看自己写的代码,别说10年前,现在的代码拿到一年前的系统中编译可能都错误百出。所以可以看出,Nginx提供了很出色的接口抽象能力,便于用户编写程序介入Nginx而不需要修改Nginx的源代码。
所以,不要以为中国历史上早晚会出现个朱元璋,他干了一番惊天动地的事业,你看了史书记载后,你就觉得这有什么难的,我也会。
一个nginx最基础的feature,就是nginx的conf配置。
就这么个配置文件的设计,能支持全世界无数大型商业应用,十多年不变,从单体应用到如今service mesh时代~~~
就这个,国内基本就没见过能做到的。这东西说起来原理也不复杂,无非是不要hard code实现逻辑,抽离出来松耦合。
就这么点原则,要国内的好好设计一下像是要他们命。
你要国内的“高手”来讲,一来就给你讲原理讲理论,说原理并不复杂(就cs发展到现在,有什么原理很复杂?区块链还是metaverse很复杂?),实际实现简直惊掉大牙。。
*****
评论区大把人认为我拿conf说事是侮辱了nginx,说没讲到点子,说没有抓住nginx精髓…
这就是国内从业人员的弊病:精髓?讲到点子?什么东西?一天到晚扯epoll什么的不嫌烦?你能从其中学到个啥?
就拿每个人都会接触到的conf来说话,就拿最直白的…各位动辄精髓或者奥义的,你们自己项目代码里的配置文件,请问怎么设计的?适配了多少场景?
王垠能不能写出来不知道
不过光这个话题下面好像已经有至少半打人表示“不难”,“可以做到”了
知乎毕竟就是知乎
这个问题其实就是“Talk is cheap, show me the code”的翻版,不过把code换成tool,换汤不换药。而老王早在下面的博客中对这个观点批判了一番:
代码不能代替思想交流和讨论。代码不能清晰的表达一个人的想法,也不能显示一个人的思维深度。任何程序员都可以写出复杂冗长的代码,你有时间去看吗?就算水平很高的程序员,他的代码组织方式你不熟悉,也会看不出来本来的想法。实际的代码里面往往会充斥着因为编程语言,硬件,系统,历史遗留问题导致的各种复杂性。如果每个想法真要“show me the code”才被考虑的话,那效率实在太低了。
简单来说,老王的价值观里,像代码及其工具不过是一系列相对简单的Idea的最终产品。而在垠·王的审美光谱中,这些最终产品是位于价值谱系的最末端,如同尼采笔下最被鄙视和无价值的末人。相反,他将那些大道至简的idea视为最具有价值的事物。拥有great idea的human在垠的眼中仿佛是尼采笔下具有超人意志的大神,应该被世人尊敬。
所以,以老王的性格,估计根本不屑于浪费时间做一个像nginx和redis这类原理简单、但是实现复杂的系统。估计看到这话题,老王的想法只会是“这类繁琐无聊的工作就交给那些审美和思想贫乏的996员工去搞定好了,我垠·王要干的是启迪众生智商的大业”。
这大概就是为啥老王开始搞在线教育的原因吧(雾
以王垠的水平,开发出nginx,redis 这样的软件,能力足够,但是实际就是做不出来。
国内一些程序员有能力也能实际做出这样的软件,技术上这两个软件不是那种做不出的难题,只是选择做与不做的问题,商业上的考虑,做到多快和多大规模的问题,以及是否作为长期战略任务的考量。我们团队也有做过性能超过 memcache 的指令集全兼容的自研软件,3万多行代码,初始版本也就几个月的开发量。
以下纯属调侃,
以王垠的经历推测,开始开发前先发一篇博客,我的XXXABC计划,各种完美的设想和理想化架构,前几个月能写出一些代码,很快被完成的美好代码感动,32行代码 震铄古今,先发一篇博客,美上几天。完成一个模块例如B+树模块,新写的代码很棒,明显已经前无古人后无来者了,太优秀了,这么优秀,给经理讲了,为什么还不马上升职加薪,从此走向人生巅峰? 这么多天过去了, 开篇博客开喷,这么优秀的人天天干这种脏活累活,还不被周围每个人认可,光凭完成的这个模块,已经足以说明能力完全可以胜任更高层次的理论专家的位置了,这是赤裸裸的剥削。因为长期遭受不公正待遇决定不干活了,先写一篇博客《一个人的罢工》,这几个月发呆中,等待公司反省亏欠优秀员工的问题。几个月后,一篇宏大博文 《我为什么离开XXXX公司》面世,资本太残酷,王垠太天真,又被某公司剥削了一次。开始的 ABC 计划由于资本的无良自然是无法完成了。
他应该不屑于干这种脏活儿……
本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度,google,bing,sogou 等
© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有