为什么很多看起来不是很复杂的网站比如 Facebook、淘宝,需要大量顶尖高手来开发?
就拿淘宝来说说,当作给新人一些科普。
先说你看到的页面上,最重要的几个:
【搜索商品】——这个功能,如果你有几千条商品,完全可以用select * from tableXX where title like %XX%这样的操作来搞定。但是——当你有10000000000(一百亿)条商品的时候,任何一个数据库都无法存放了,请问你怎么搜索?这里需要用到分 布式的数据存储方案,另外这个搜索也不可能直接从数据库里来取数据,必然要用到搜索引擎(简单来说搜索引擎更快)。好,能搜出商品了,是否大功告成可以啵 一个了呢?早着呢,谁家的商品出现在第一页?这里需要用到巨复杂的排序算法。要是再根据你的购买行为做一些个性化的推荐——这够一帮牛叉的算法工程师奋斗 终生了。
【商品详情】——就是搜索完毕,看到你感兴趣的,点击查看商品的页面,这个页面有商品的属性、详细描述、评价、卖家信息等等,这个页面的每天展示次数在 30亿以上,同样的道理,如果你做一个网站每天有10个人访问,你丝毫感觉不到服务器的压力,但是30亿,要解决的问题就多了去了。首先,这些请求不能直 接压到数据库上,任何单机或分布式的数据库,承受30亿每天的压力,都将崩溃到完全没有幸福感,这种情况下要用到的技术就是大规模的分布式缓存,所有的卖 家信息、评价信息、商品描述都是从缓存里面来取到的,甚至更加极致的一点“商品的浏览量”这个信息,每打开页面一次都要刷新,你猜能够从缓存里面来取吗? 淘宝做到了,整个商品的详情都在缓存里面。
【商品图片】——一个商品有5个图片,商品描述里面有更多图片,你猜淘宝有多少张图片要存储?100亿以上。这么多图片要是在你的硬盘里面,你怎么去查找 其中的一张?要是你的同学想拷贝你的图片,你需要他准备多少块硬盘?你需要配置多少大的带宽?你们的网卡是否能够承受?你需要多长时间拷贝给他?这样的规 模,很不幸市面上已经没有任何商业的解决方案,最终我们必须自己来开发一套存储系统,如果你听说过google的GFS,我们跟他类似,叫TFS。顺便说 一下,腾讯也有这样的一套,也叫TFS。
【广告系统】——淘宝上有很多广告,什么,你不知道?那说明我们的广告做的还不错,居然很多人不认为它是广告,卖家怎么出价去买淘宝的广告位?广告怎么展示?怎么查看广告效果?这又是一套算法精奇的系统。
【BOSS系统】——淘宝的工作人员怎么去管理这么庞大的一个系统,例如某时刻突然宣布某位作家的作品全部从淘宝消失,从数据库到搜索引擎到广告系统,里面的相关数据在几分钟内全部消失,这又需要一个牛叉的后台支撑系统。
【运维体系】——支持这么庞大的一个网站,你猜需要多少台服务器?几千台?那是零头。这么多服务器,上面部署什么操作系统,操作系统的内核能否优 化?Java虚拟机能否优化?通信模块有没有榨取性能的空间?软件怎么部署上去?出了问题怎么回滚?你装过操作系统吧,优化过吧,被360坑过没,崩溃过 没?这里面又有很多门道。
不再多写了,除了上面提到的这些,还有很多很多需要做的技术,当然并不是这些东西有多么高不可攀,任何复杂的庞大的东西都是从小到大做起来的,里面需要牛叉到不行的大犇,也需要充满好奇心的菜鸟,最后这一句,你当我是别有用心好了。
功能上面虽然不复杂,但是要完成的细节却很多. 比如news feed里面的推荐算法就很重要,要根据用户之前的记录和与好友的关系来生成. 另外就是根据用户的信息和行为,要做机器学习和数据挖掘,从而来挑出最匹配的广告.这也是比较花人力的事情.
另外Facebook的用户量奇大无比. 假设你只是做一个学校内部用的社交网站, 那肯定很简单. 但是如果考虑到上亿人在上面用. 你首先服务器就必 须是一个分布式的机群,还要保证能抗住那么大的流量. 同时为了性能够好,不得不加上mem cache和网页分块加载等功能. 还有就是每天用户产生的总数据量(状态,留言,照片,分享等)有TB的数量级,你数据库是否撑住等等.
另外树大招风,你要一个很强的安全小组来保证网站在受攻击的时候能防御好,还有要防止垃圾信息和恶心广告或者程序的散播. 另外还有为了全球化而带来的多语言问题.
总之,一个网站做大了之后,很多问题就会产生,不是在校园里面做一个学期作业那么简单.狼大人,休,行。
某个历史上的大神曾经说过一句话:
要判断一个算法的好坏,只要给它足够的数据。
当用户、数据和系统规模上到一个程度之后,所有曾经可以忽视的问题都会变得必须用从来不可想象的精力和技术去解决。
来来来 看看这个 刚看到的《当用户点击“举报”后,Facebook在后台会做哪些事情》
很多东西并不是表面看到的那样简单
身为前端攻城师,就这方面说一下这样一个Facebook看起来“很简单的网站”需要顶尖高手来开发和维护
写前端程序要考虑很多,如下:可维护性,JS的执行高效性,JS文件的大小,用户体验等等
1. 可维护性
并不是所有人写的程序都具有可维护性,清晰易懂的,这个区别在刚接触编程和高手直接的差异体现的特别明显
2. JS的执行高效性
一个网页加载JS并执行,浏览器执行并渲染了半天还在渲染,相信很多用户都不想看到吧?非常上海用户体验。
如何提升JS的执行速度呢?相信我,初学者大部分都是不知道的(排除写过浏览器内核的同学),了解浏览器如何执行JS,如何渲染DOM能帮助开发者提升执行速度
3. JS文件的大小
JS文件或者HTML或者CSS文件过大,有很多缺点
第一,受网速影响,文件大,加载速度慢
第二,Facebook的用户量非常巨大,每个人访问就算多加载1KB(即使有cache,第一次总需要加载吧),可想而知,这个流量非常巨大,流量都是要钱的啊
4. 用户体验
略之
高手往往比非高手要注意的东西要多很多,这点相信大家不会质疑吧,只是就前端方面发表一些建议
如果要把一件简单的事情搞复杂,你需要的是市场总监
如果要把一件简单的事情搞简单,你需要的是产品经理
如果要把一件复杂的事情搞复杂,你需要的是一堆码农
如果要把一件复杂的事情搞简单,你需要的是顶尖高手
明白了吧,顶尖高手的意义就在于让你觉得这个东西看起来很简单。
学“懂”计算机系统结构之后,理解这个问题比较容易点吧。
比如,你打开知乎,简单的敲下几行字,点击提交,然后你看到了你的评论,这复杂吗?不复杂。
1、为什么知乎要用浏览器才能打开呢,记事本不能访问知乎?为什么用输入自己的知乎用户名和密码才能访问呢,我QQ密码为嘛不能用?为什么我只能看到我关注内容,而不是网站所有用户的所有内容呢?
2、当敲下键盘时,电脑是如何识别按下的具体哪个字符呢?是如何经过到达的CPU呢?CPU进行了如何的处理操作呢?显示器为什么可以显示相应的字符呢?
3、当点击“提交”时,发生哪些变化呢?显示的内容是保存了在本地电脑上了,还是保存在了知乎服务器上了呢?从本地的数据是如何传输到知乎服务器呢?从物 理层、数据链路层、网络层、传输层、会话层、表示层、应用层这一系列的过程提交的评论内容传输形式是经过一系列的如何变化过程呢?
PS.对于一个字符从输入到最后结果输出的处理流程我也没搞彻底清楚。随便说说。。。希望有高手能具体解释下啊。
手上没有网站的结构层次示意图,随便拿张图说明下原因吧。像计算机最初问世的时候,操作计算机的用户既是设计者也是维护者的时代已经过去。每个节点都应该 是一个属于一个节点的专属内容,对个每个节点都应该是更清晰化更简单化的:用户的操作的应该简单化,网络的传输应该简单化,数据的存储也应该是简单化。因 此对于用户来说只需要用户界面操作就足够了,没必要把数据库之类的东西也交给用户处理的。