二手的前端开发

题目源自老郭早年的段子,“我是个二手的科学家”。
我觉得现在我就是二手的前端开发。。。

最近一周多的时间,一直在做些前端相关的东西。
因为没有专职的前端开发来对接。。。虽然我以前也用jquery写过一些小的内部系统,但这次又刷新了我对前端的认知。。。随便写些感想吧。

上手容易,深入很难。html、css都算不上一门语言,只是一种标记,可读性很强,简单看看就能理解。but,理解不代表会用,要想达到自己想要的效果很难,要一遍遍尝试。
js上手也很快,脚本语言上手都快。但是用着就会发现有很多坑。。。坑爹的undefined,各种诡异的boolean判断,各种隐式的类型转换,各种callback。
说到callback,当我不知道promise对象的时候,满屏幕的function(){},现在是满屏幕的done()。。。

js是个有点奇怪的语言。最让我纠结的是函数也是对象这点。就跟光的波粒二象性一样。。。很难想象。对象不是由函数定义的么(构造函数)?Object()/Number()/String()其实都是函数吧?函数等价于一个Function对象?那Function这个函数是怎么定义的?于是变成了鸡生蛋蛋生鸡的问题。
对使用上倒没什么影响,但不能在逻辑上自圆其说让我很纠结。想要搞清楚这个可能要看看执行引擎是如何实现的了。
感觉js糅合了很多东西,但没做好。强行OO,可能当年非OO的语言都不会有人用吧。

混乱。js的标准很混乱。官方标准就有ES5/6,而且各个浏览器的支持程度还不一样。我这个项目是没什么历史包袱的,想尝试些新特性,比如解构,结果chrome还不支持。。。非官方的还有typescript/coffeescript之类的,还有更奇葩的GWT之流,用java写前端,简直就是妖孽啊。。。虽然我对java更熟,但也觉得这种方式很奇怪,而且肯定很多坑。google的东西也不会总是好的。
css的支持也是因浏览器而异,一些样式在safari中不支持。。。HTML5的标准也是。
不过相对于前些年,现在应该好很多了吧。
更混乱的是各种MV*框架。本来我打算选一个框架来用的,但不知道怎么挑。angular/react/vue/ember/backbone各种。本来想尝试下angular,听说它是按后端的逻辑来写前端,但又听说它是个大坑。。。而且1和2还不兼容,这种断代式的升级是非常讨厌的,想想python。。。而且这些框架可能很快也会过时,还特么互不兼容。
也许专业的前端不觉得乱吧,但对想入门的新人而言,还是很头疼的。
咨询了一个前端的同学,最后还是决定老老实实用jquery了,继续折腾DOM,土就土点吧。

发展迅猛,有活力。也许这是“混乱”的另一种说法。。。最直观的表现是开源项目非常多,基本我能想到的需求,都有开源实现,稍微改下就能用。我还找到了用js写的sql语法解析器。。。还有jquery的各种插件。各种主题、样式也非常多,可以找到很多酷炫的UI KIT。
我觉得原因之一是做前端的人普遍更活跃,不像搞后端的都比较闷。。。至少从我接触到的人看是这样,无论online/offline。我相信编程语言真的是能影响一个人的行为模式的。

css真是给程序员用的?真的有程序员手写css么?那么多效果是怎么记住的啊,关键是怎么脑补出在浏览器中的显示效果。。。我只会用css做一些简单的布局,但效果总是跟我想得不一样,很诡异。。。
但好的css真的是非常漂亮,我觉得这不是给程序员用的,是给设计师用的吧。css也有一些模板语言,less/stylus,但我从来没用过。我已经放弃自己写css了,直接找了套bootstrap的模版。

HTML5是个好东西。html是一切前端技术的载体。想起了若干年前用editplus写html的场景。。。对我来说html5最好用的是session/local storage,一些状态信息完全可以存在前端了,否则就只能存在cookie里。
新增的一些input类型也很好用,但好像在一些浏览器下无效。

前端不只是技术,还有很多的UI/交互设计,甚至可以说是艺术。我以前写的一些页面,界面丑就丑吧,反正是给内部用的。如果是我自己用的,有个命令行就满足了。但当你真的要去面对用户时,就会去考虑如何设计页面、如何能让使用更方便。比如整个站点的配色是否一致?风格?交互是否应该优化?点击删除按钮,要不要弹出一个确认的对话框?一些操作是否要有进度条提示?
对我这种强迫症患者,这个比技术问题还让我头疼,经常纠结在一些细节上。比如某个复选框,我想把它换成iphone风格的开关,折腾了一天。这样很容易拖慢整体的进度。。。
我算是体会到UED的难处了。

所有业务逻辑放在前端真的好么?在这次的项目中,我大部分的业务逻辑都是用js实现的,后端对我而言只是个数据库,提供给我增删改查的REST接口就好了。我觉得这样设计比较自然,但这样真的好么?设计中最重要的事情是解耦。也许这种模式确实把后端和显示的逻辑解耦了,但感觉只是把复杂性转移了,并没有真正解决。至少我的js代码和html耦合还是非常紧,因为jquery依赖于整个DOM的结构和各种元素的id。如果以后html改了,要改js就会很头疼。这个我还不知道如何解耦。也许用一些框架会好些?
而且这种方式会不会有性能问题?如果数据量变大的话,是否会超出js的处理能力?

前端更容易有成就感。至少对我而言是这样。因为做的是看得到的事情,比较有存在感。。。直接面对用户,接收用户的反馈,知道自己的东西真的有人在用。做出好看的页面,酷炫的效果时,都会很开心,没想到自己真的能做出来。


想到哪写到哪,顺便写写其他的事吧。

如何跟他人合作?或者说,如何让一个团队协同工作?其实道理说起来很简单,还是解耦,每个人负责的工作必须要独立,尽量减少人与人之间的直接沟通,成本太大了。只要定义好各个模块之间的接口。但实行时还是会遇到各种问题,要根据实际情况处理。如无必要,我不想去修改别人的代码,别人也不要改我的代码。每个人只对自己的接口负责即可。
我经历的一些项目中,两个人共同写同一个类,甚至是同一个方法,真是噩梦。。。尤其是他人的逻辑跟你完全不同时。这是个教训,当初的设计和分工都有问题。
以前身边都是大牛,不用我来考虑这种事情。。。现在不行了。。。
题外话,设计中常用的解耦手段:1.MQ;2.事件驱动;3.REST,或者说基于HTTP的接口。至少是我经常用的。

一些怪事。或者说我见到的一些坏习惯。我最近也是看了不少奇葩代码。。。

  • 为什么爱自己造轮子?不愿意用一些现成的类库。比如guava,我已经离不开了,但很少看到别人用。。。还有其他一些已经成为业界标准的库,比如apache commons系列、slf4j之类。
  • 为什要敲一些无脑的代码。。。比如POJO,有人手写setter/getter,这种代码完全不用经过大脑啊。这会显得自己有事做?一副很忙的样子?
  • 为什么不愿意格式化下代码。。。eclipse都提供快捷键了,按一下很麻烦么。
  • 实现一个只有public staitc常量的接口是要闹那样。。。

一个感受是,很多时候撕逼的能力比技术更重要。。。都是血泪的教训,不多说了。
另一个感受是,做的好不如说的好,这真是悲哀,但这是现实。懂的自然懂。

不知不觉写了这么多。。。我都觉得自己很唠叨。
二手前端生涯已经告一段落了,我还是回去干老本行了。。。