Web 开发不应该这么复杂

2016-08-17 03:18:42 +08:00
 FrankFang128
除了 React / Vue ,你还应该看看其他开发模式

原视频

本文作者:方应杭(微信: frank_fang )

本文很长,但请耐心看完,因为末尾有广告。。。

这个视频来自 RailsConf 2016 ,演讲者是 Sam Stephenson ,他主要的开源作品有 rbenvPowTrix,曾是 Rails 的核心开发人员。目前在 Basecamp 工作。

从这个视频,你可以明显地看出前后端开发者思考问题的差异。

好了我们进入正题,看看他讲了什么。括号里面的话是我说的,其他都是演讲者说的。


⬆️ 我们一共 10 个开发者,其他 6 个 Rails 开发、 2 个 iOS 开发和 2 个安卓开发,在 18 月完成了共 200 个设计图、部署到五个平台的 Basecamp 3 。

(你能想象不用纯前端开发者来开发一个 Web 应用吗?)


⬆️ 我们来回顾下从 2004 年开始, Web 开发经历了怎样的过程。


⬆️ J2EE ,典型的三层架构:数据层+业务逻辑层+表现层。(前端这个职业还没诞生吧)


⬆️ 然后是 PHP ( PHP 是招黑体质)


⬆️ 然后是以 Rails 为代表的 MVC 。那个时期是 Rails 的黄金时代,然而浏览器的性能令人沮丧。

整个 request-response 的循环简单而优雅。


⬆️ 我们对服务器渲染 HTML 的性能不是很满意,同时浏览器的性能进一步提高了,所以我们觉得可以把渲染放到浏览器上来做。

(可以看到简单的环状结构变得比较复杂了:浏览器从服务器获取 model ,同时自身维护着 router 、 view 和 controller 。)

浏览器从服务器得到一个空的页面,然后用 JS 启动这个页面。 JS 发起很多 API 请求。服务器接收 JSON ,输出 JSON 。所有的 HTML 渲染,由浏览器完成。

大家都觉得这主意不错,是吧?


⬆️ 但是,前端们还是觉得客户端 MVC 的性能不够好,所以又引入了虚拟 DOM 来最小化 DOM 操作。

想法很不错。既然 DOM 操作慢,我们就尽量不要操作 DOM 。

但是呢,有两个问题:

  1. 所以这些 JS 代码和 API 请求,让首页渲染,非常非常非常慢。
  2. 所有内容,都无法被搜索引擎检索到。

(没事,再加功能)

⬆️ 所以我们决定不用浏览器来渲染首屏了,让服务器来(回到老路子)。但是由于渲染逻辑我们不想做两遍,所以我们需要在服务器添加一个 JS runtime 来执行 JS 才行,这样浏览器端的渲染逻辑在服务器上也能跑起来了。

服务器也要支持虚拟 DOM ,因为客户端操作的就是虚拟 DOM 。

那么上面这个图就是全貌了,把我们 2004 年的设计,重新改写了。

但是复杂度,真的是爆炸性增长。

一个 Web 应用的依赖,已经成千上百了。

整个系统复杂到,一个人,不可能对其了然于胸。

我们的队员需要分别去掌握其中某个子系统。


⬆️ 康威定律

讲真,你们这些人知道康威定律吗?

系统的设计团队受其生产系统的约束,而生产系统又是根据设计团队的沟通结构决定的。

⬆️ 康威定律说,软件产品的结构就是其创造团队的组织结构的镜像。

我们正在使用的客户端渲染框架,来自于 Google 和 Facebook ,这两家公司有数千开发者,这些开发者隶属于数十个团队,组织结构就像这样:

⬆️ (是不是跟上面带有虚拟 DOM 的那种架构图很像?)

⬆️ (认清自己吧,少年)

你的团队面临的问题,很可能跟 Google 和 Facebook 所面临的不一样。

使用那些客户端框架时,我们是为了追逐性能,我们做的每个决定都是对的,但是放在一起看看结果,我们获得了微小的性能提升,却在工程方面花费了惨重的代价。

如果继续深入这条路,这条路就会变得越窄。


(还没完)

⬆️ 由于我们除了要支持 Web ,还要支持 iOS 和安卓,所以,我们要制造出三个类似的系统。

(讲述者没有再说 React Native 了,因为这个思路是一样的:开发者选择客户端渲染,同时不想做三次,只能让 JS 运行在三个平台上。这就是「路越来越窄」,开发者把自己限定死了的意思)


⬆️ Fuck that.

我们来重新审视一下吧。

如果我们希望一个小团队能做大项目,那么就不应该把系统搞得这么复杂。

⬆️ (又出现这张图)


⬆️ 让 iOS 和安卓直接使用 View 。

Web 的 View 可以作为 iOS 和安卓的基础,然后想办法优化使其体验起来像是本地应用。 Turbolinks 5 ,做的就是这件事情。


⬆️ 你的服务器依然渲染整个 HTML 。

Turbolinks 异步请求页面,然后使用得到的 head 和 body 替换当前页面。 head 会做合并, body 则直接替换。

(后面演讲者演示了 Turbolinks 的效果,有兴趣的人可以去看看视频。另外 Turbolinks 还提供了 iOS 和安卓的 SDK ,让移动端体验更顺滑)

(演讲者也承认,这样的模式渲染一个页面大概 300ms ,没有很快,但是绝对够用。我看了下在 iOS 下的表现,切换页面时的 loading 时间确实有点长,但是能忍,也许再加点优化可以做到 1s 左右)


相关观点:

《为什么我不喜欢「前后端分离」》 - 18596 views

《不依赖 Gulp 、 Babel 、 WebPack ,还能优雅地写代码吗》 - 6775 views

广告:

我现在在「彩程」(主要产品是「知人」和「 Tower 」),从事 Rails 开发,欢迎有志青年一起来「远程开发」,不用每天浪费三个小时在车上,而是用来学习新知识,真的很好。

邮箱: frankfang1990atgmail

13962 次点击
所在节点    JavaScript
84 条回复
quiz
2016-08-17 13:33:17 +08:00
@pepsin D3 可以过来学习,没关系,只要对浏览器 前端技术比较熟悉,学习起来还是很快的。有些可视化我们都是自己写的不一定非要依赖 D3 , D3 依赖 SVG 渲染,在大规模数据场景下会有性能瓶颈。
ecloud
2016-08-17 14:00:15 +08:00
@zxb 我做的某天文工控系统就差不多是这样的, web 界面的 php 就是个幌子,直接 passthru 调 C (你没看错就是 ANSI C )写的实际控制程序。
只有两段 JS ,一个用来显示动态曲线图,一个用来显示图片缩放。
因为这个系统要求的基本上是实时响应,去你娘的 web 渲染,哪有那闲情逸致。
不过说实话这样写的代码真的非常简洁清晰,很容易看懂,维护起来很方便,加个新功能也就半个小时(算上测试)的事情完事儿了。
ecloud
2016-08-17 14:12:47 +08:00
@YuJianrong 跟大小无关,关键看需求
IBM 以前的 CM 就是很低耦合的系统,也算是很复杂的东西了,但是 web 前端基本等于没有
然后一些客户就抱怨说你们的 web 太烂了,能不能给我们一个好看的界面
然后 IBM 收购了 FileNet ,用 FileNet 那套花哨的前端架在自己的后端 CM 上
结果是花了很多很多钱,人力物力。然后那帮客户后来又发现,在这个前端上他们要做二次开发可就迷糊了,又想退回去了
其实很多时候那些用户们并不知道他们究竟想要什么东西,这就是为什么 Jobs 能成功的秘诀
FrankFang128
2016-08-17 14:24:46 +08:00
@tflz514 他手画的
akira
2016-08-17 15:03:10 +08:00
看了下视频,其实就是在宣传 turbolink 的炫酷叼炸天
YuJianrong
2016-08-17 21:01:46 +08:00
@ecloud 这是产品要背锅的。如果有大量二次开发的需求,那么在第一时间就要考虑到二次开发怎么做,甚至把自己团队降低到第三方一样的高度来先搞好二次开发框架(其实也没有二次开发框架了,就是一样的开发)。
但这难度太大了,以 KPI 论的大商务软件公司真的很难搞(比如我司)。
Geeker
2016-08-17 21:17:24 +08:00
@quiz 什么叫数据可视化驱动。。 2333
ecloud
2016-08-17 21:18:58 +08:00
@YuJianrong 产品背锅?收购 FileNet 这么大的事情产品哪背得起这锅!大公司有些行为并不完全是简单的跟软件开发那套逻辑相关,还有很多七七八八匪夷所思的逻辑。所以小公司跟着学样会死得很惨。
比如,刚收购 FileNet 的时候,我发现他们的人工作态度比 IBM 的自己人好太多,然后唠叨给美国的架构师,结果那厮说, This is just what we wanted to pay for.
quiz
2016-08-17 21:52:50 +08:00
@Geeker 就是产品设计,技术选型,还有架构设计都是围绕数据可视化来做的,以把有价值的数据以最直观的方式展现给用户为目标驱动研发。语言是写的太精简了,主要怕影响大家灌水。本以为做过成熟商业软件开发的 v 友们都能 get 到 point ,实在不能理解的估计是经验还有看问题的思维比较不一样,不过可以一起探讨。跟檀木网站上比可能用语方式是不太一样可 v 站是专业技术社区,想必说的缩略点大多数专业极客 v 友们还是可以理解的,如果实在理解不能可以到漫展上约我当面切磋- -!
YuJianrong
2016-08-17 22:16:06 +08:00
@ecloud 我说产品背锅不是说背收购前端技术公司这种锅,而是对自己产品定义上的锅。不管收购了什么前端技术公司,只要能清晰定义出以扩展性为第一优先,所有技术都围绕如何方便和安全地扩展来开发,也能达到满足第三方扩展的需求。

只是这对于大公司来说太难了。

比如我司,也和 IBM 差不多,部门结构庞杂,部门做事主要要 show 给老板看,老板做事主要要 show 给更大的老板看,结果最容易受重视的就是看起来好看的东西(不仅仅是指视觉上),至于扩展性啦什么的,总以为以后慢慢加……但架构都定死了加什么加……

这么说来也不是产品这个职务的锅,主要还是回到产品原始定义上去,本来就定义成好看但不易扩展的产品,那自然就很难做出方便二次开发的产品。然而不幸的是,一般原始定义产品的时候,大佬们都只想着花三分钱办五分事,尽快把东西弄出来(毕竟人家的 KPI 是这个),而不是为以后真的推向市场的时候的扩展性来花十分功夫打基础。
shooter
2016-08-17 22:23:35 +08:00
@panlilu 这没必要吧
jadecoder
2016-08-18 01:18:39 +08:00
很好,第一次听说康威定律,值得深思
genffy
2016-08-18 01:21:25 +08:00
哎,天天扯这些没用的。
loser
2016-08-18 02:37:53 +08:00
tower / 知人 用户路过帮顶
选择适合自己的即可,没必要争论
over
tomatoo
2016-08-18 08:25:02 +08:00
Tower 用的是 Vue + API 模式吗?
为啥打开控制台没看到 vue ,是我打开的姿势不对吗?
seaify
2016-08-18 09:53:12 +08:00
@kshift

rails + vue, web 端我是这样弄,但是移动端这样弄,是指原生+webview ?求解惑
daysv
2016-08-18 10:28:14 +08:00
虽然我是前端(写 exe 的前端 XD ),其实我也觉得前端炒作过热了, 感觉市场真正需求的还是全栈。
但是全栈技术栈比较杂,很难互相匹配。
tomatoo
2016-08-18 13:20:02 +08:00
@daysv @FrankFang128 这样比较难招人吧 你让一个写后端的去做前端的事情,做出来的用户体验一般比较差的(前端不只是完成逻辑,更要重视用户体验),或者开发周期长,同样你让一个前端熟手去写后端,也会遇到各种性能问题,尤其是数据量大的情况下,这些都是我真实遇到过的。这个问题怎么解决呢?毕竟称得上 web 全栈的还是太少了。
ihuguowei
2016-08-18 16:56:00 +08:00
@kshift 你们的编辑器还维护吗,发邮件没人理,提 PR 也没人理……
FrankFang128
2016-08-18 17:09:01 +08:00
@ihuguowei simditor 吗? 不是有人理吗

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/299785

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX