搬砖与拓荒

开发人员们经常自嘲是IT民工、“搬砖”的。在我们外行听来只是自嘲,笑一笑就过去了。不懂他们每天在工作中面对的是什么,我们其实并不理解他们为什么这样自嘲。

最近和同学合作了一个小项目,是个微信H5,其中有数据提交的部分。我负责设计与前端开发,他搞定后端与服务器、域名。在这个项目里略微接触到了一点点后端的东西,对“搬砖”这个话题忽然有种顿悟的感觉,也更进一步理解了开发的难处,这真是一种非常不同于其他工种的工作。考虑到正在阅读这篇文章的你很可能不了解开发,我尽量用大家都能理解的方式来讲这个故事。

这个H5项目的分工方式,是标准的前后端分离。所谓前端与后端,可以理解为事情发生在什么地方,靠近用户就是前,远离用户就是后,中间连接两者的是错综复杂的光纤、Wifi。我负责的前端部分,主要是把页面的外观做出来,展现到用户的手机上,并且处理一些发生在用户手机上的逻辑,例如输入框里填写邮箱要遵循一定格式,没有@符号当然不是邮箱,不能提交。我同学负责的后端部分,就是在网络的另一头接收用户发过去的信息,存到服务器上的数据库里,并做好统计工作。

这里面有一部分工作需要我们共同完成,我们得约定好,我在前端把用户填写的内容以什么样的形式、通过什么方式传输给后端,他在后端接收到这些内容之后要给我怎样的反馈,如果中间出了什么差错,他又会给我什么样的反馈。这就属于开发们天天挂在嘴边的“接口”。

既然合作方式是这样的,双方就有一定程度的相互依赖。我先把前端部分的代码写好了,但是和接口相关的代码要怎么测试?没有后端的配合,我不知道我这些代码写得对不对。这时候同学的后端代码还没写好,我就得等着他。当然,实际工作中,开发人员并不会真的这么傻傻等着,有许多种方式来让其中一方模拟另一方的工作,我们也是这么做的。

他写了一小段代码给我,用的语言是Python,让我在本地模拟这个接口。我一点也不懂Python语言,打开他的代码直接懵B。来来回回仔细看了好几遍,终于理出一点头绪。结合我们之前约定好的接口,大概明白这些代码做了哪几件事情。然后我要做的,就是把我自己的电脑当做一个小型的服务器,把同学的这段代码在我电脑上运行起来,用我的前端代码向这个小服务器提交内容。他的代码自然会给我反馈,让我得以测试自己的代码有没有起作用。

不过事情进展并不顺利,实际上最终是失败了。问题出在运行我同学这段Python代码上。要把这段代码运行起来,有一些前提条件。首先,我的电脑上得有Python这种语言,这个没问题,mac系统自带Python 2.7。然后要安装一些业内广泛使用的代码模块,这些也是用Python写的,同学的代码里用到了这些代码模块。安装其中几个模块时就遇到了问题,电脑报了错误,没有安装成功。

刚开始以为是mac系统的文件夹权限问题,用了许多种方式获得了超级用户权限,没什么作用。各种开发者社区里提供了一些解决方法,升级或重装某些模块,但也没解决我的问题。然后我想会不会是Python版本问题,装了Python 3.6,把mac自带的python2.7换掉了,又重装各种代码模块,电脑给我报了一个语法错误。查资料发现从Python 3开始,有些语法和Python 2不一样,把同学的代码语法稍作修改,语法错误解决了。但最早报的那个错误又来了,继续查资料了解到,我同学用的某个代码模块在Python 3中已经不支持了,需要用另一个模块来代替,这就要对我同学的代码本身进行改造了,彻底超出我能力范围。我也不愿再折腾换回Python 2.7去尝试其他方法了。这条路没走通,最终放弃。

换了一条路,用同学推荐给我的一个现成的工具,也可以模拟后端接收信息和反馈。只是这工具能做的事情有限,不像直接上代码那样神通广大,如果以后有更复杂的需求,也许就不够用了。算了,至少在这个项目中管用,起码问题解决了。

经过这么一番折腾,顿时觉得开发们太不容易了,这种工作和我们做设计的有根本区别。我们用的设计工具、设计方法是不是还算稳定可靠?即使出了问题也基本上能很快解决,重启治百病,再不行重装,我们可以专注于自己的设计工作。对开发人员来说,他们使用的编程语言、代码模块、开发环境就是他们的工具,这些东西出问题的概率比我们的设计工具高多了。有时候是不兼容,有时候是设置不对,有时候是些莫名其妙的问题。这有点像装修工人,一会儿锯条断了,一会儿电钻坏了。狭义地来看,解决这些问题并不属于正常开发工作的一部分,但他们不得不花许多时间来解决。

仔细想一想我熟悉的前端开发,也是这样啊。举个例子,移动端页面里,手指按下按钮时可以加上一个反馈效果,和电脑上鼠标悬停的效果差不多。但是这背后也有一个不明不白的坑,你可以在代码里定义,某个按钮按下时颜色变深,然后你会发现这个代码没起作用,颜色没变。怎么办呢?查一下资料,才知道要加一句代码才能生效,但是这句代码本质上什么也没做。就像下象棋时你抓起马,在棋盘上空挥舞一圈再默默放回原处,你一步也没走。就这样一个神操作却能让手指按下效果生效,这合逻辑吗?不需要合逻辑,你记住这么写就行了。解决这种问题,并不创造任何东西,但这就是开发人员工作中经常要面对的事情。我也相信,多数开发应该不喜欢去解决这种问题,这些事情是苦活累活,真正的创造工作会让他们更有成就感。

深想一层,开发真是一个了不起的职业,不得不为无米之炊。有时候会看到一些技术大V在吐槽,某个最新版开发包又bug百出啦,某个接口挂了又导致产品功能受影响啦。实际工作中,也会听到开发同事被一些与项目无关的技术问题绊住。但是反过来,他们的工作性质很像美国淘金热时期拓荒者,茫茫荒原什么也没有,一批又一批人自己制作工具、盖房子、修铁路。有他们解决种种鸡毛蒜皮与疑难杂症,创造了这些基础设施,后来者才能在前人的基础上建设出城市,创造出繁荣。我们日常工作和生活中,能用上各种稳定可靠的产品,都离不开他们的摸索与折腾。

当然啦,我并不喜欢做这种性质的工作,前端技术也是点到为止,学到能用的程度就行了。对另一个行业胡乱评价了一番,也不知到不到位。不管怎样,心怀敬畏,还是好好做我的设计吧~