猿题库刚刚结束了北京地区的大规模校园招聘,国庆之后打算转战外地进行校招。我本人深度参与了此次的校招工作,包括笔试题命题、面试题命题以及具体的面试工作。
我在面试中发现了一个非常有意思的现象,就是大多数应届生都想做服务器端开发,但是他们却又不清楚服务器端开发具体要做些什么。
我和同事聊天的时候说起此事,我们认为可能应届生觉得:做服务器端开发可以让自己写的程序运行在很多台机器上,并且处理海量的数据,这很「牛逼」。而做客户端或前端开发太简单,成长会比较小。
于是我就写了本文,想给这些单纯的应届生泼泼冷水。先说说我的背景吧,我同时做过服务器端和客户端的开发。我在网易有道做过 1 年半的服务器端开发,产品涉及网易邮箱和微博产品,之后做了 3 年的 iOS 开发,产品涉及有道云笔记,猿题库和小猿搜题,所以我能够给大家分享服务器端和客户端开发的差别。
很多应届生认为做服务器端开发可以处理海量数据,管理上百台服务器。
但是 ——
处理海量数据就牛逼了?NO!
服务器端开发经过多年的发展,对于海量数据的处理早有了很多固定的解决方案。不管是用云服务,还是用 Hbase ,你都可以很轻松地依赖开源库,解决海量数据的存储问题。
还有一些同学想做大数据分析,如果你写过 MapReduce 程序就不会这么想了。现在的 MapReduce 程序写起来太 easy 了,很多时候简单到你就只需要写一条类似 SQL 的查询就行了。
运行在上百台服务器上就牛逼了?NO!
现在虚拟化技术发展迅猛,像小猿搜题所有服务都通过 Docker 来部署。很多时候,部署上线就是在 Web 管理界面上点击一个「Deploy」按钮即可。即使在过去,实际操作这些上百台服务器的也是运维同学,轮不到你来操作。
所以,除了 YY 一下这些程序跑在多个机器上,这并没有什么可以带来成就感的地方。
还有一些应届生觉得自己在学校做过网站,觉得在服务器开发方面有基础,做这方面更顺手。NO!企业里面的服务器开发完全不是你想的那样,基本上大家在学校做网站的经验等于零。
我给大家分享一下做服务器开发有什么苦的地方吧。
做为互联网公司,我们希望给用户提供 7 x 24 的不间断服务,那么服务万一需要中断怎么办?半夜上线呗。
根据我多年的观察,晚上 12 点一般都是上网高峰,所以上线一般都是凌晨 3 点-4 点的时候进行。但是,你以为上线就是凌晨 3 点点一下「Deploy」按钮就完了吗?NO! 一般上线都会涉及功能升级,难免会有考虑不周到的情况,于是就会发生,上线出问题的情况。
上线出问题怎么办?在网易,我们一般是两种做法:
当然,不会每次上线都是这种大升级,但是基本上,1、2 个月搞一次这种大上线还是挺常见的。
相对来说,客户端同学在这方面要轻松得多。iOS 和 Android 都是提交应用市场审核,所以客户端的同学可以选一个白天上班的时候提交审核,而不用等到半夜。
服务器端的问题,只要出现,影响都是巨大的,所以服务器端的同学需要随时待命,一旦有服务器异常报警,就立即处理,以免影响到用户。所以做服务器开发的同学手机都是开着的,在服务不稳定时,一不小心,几十条报警短信就过来了。服务器开发出去旅游什么的,一般都带着笔记本,以便出问题时能够及时响应。
相对来说,客户端同学在这方面要轻松得多,因为即使出现了 Bug,iOS 和 Android 客户端也是无法马上修复的,因为用户手机中的版本不会立即更新。所以客户端同学最多也是加班发布一个紧急版本提交审核,在时间上不会像服务器端那么着急。
另一方面,很多客户端的 Bug,可以通过服务器端通过一些「兼容」来处理,这其实就是替客户端「擦屁股」。例如,假设某应用的 iOS 1.2.0 版本当获得服务器端返回的用户头象是 png 格式的时候会闪退,那么服务器端可以特殊处理,对于这个版本的应用把 png 图片转成 jpg 返回。你看,最终还是服务器端同事成了要立即响应的人。
服务器端的开发经过了 10 多年的发展,而客户端的开发才刚刚兴起。2009 年 iPhone 3GS 推出之后,国内才有人做 iOS App 的开发,Android 开发的兴起也基本在 同一时期 。算下来,客户端的开发才经历了 6 年而已。而服务器端的开发呢?光 Spring 就出现了 10 多年了。
服务器端的技术长久发展的结果就是,基本上每个业务需求都已经有现成的轮子了。所以做服务器端开发很多时候就是学习各种开源组件的用法,并且熟悉这些组件的一些性能特点和坑。
你以为这很容易吗?其实不是的!这些轮子发展那么多年,已经非常复杂了,光 Spring 就包括非常多的特性,写一本 1000 页的书来介绍它也不为过。如果不是多年的使用,你能搞明白它的各种功能的优缺点吗?如果你搞不明白,遇到问题的时候除了抓瞎还能干嘛?
所以做服务器端的同学,要经过非常长时间学习(至少半年左右),才能上手进行实际的开发工作。上手之后,又需要经过非常长时间的学习,才能够熟悉自己使用的各种开源组件的特点和使用细节。
相对来说,客户端同学在这方面要轻松得多,基本上不管是 iOS 还是 Android,新手只需要一个月左右就能入门,三个月左右就能够比较熟练了。
刚刚说到服务器端复杂,这带来的结果就是分工与细化。每个做服务器开发的同学,可能只会涉及服务器开发的某一部分的业务逻辑和功能,甚至是某一部分业务逻辑的某一层。比如我在网易邮箱做服务器端开发时,就只是负责 Restful Api 这一层的开发工作。
从业务上来说,将复杂的系统拆分,然后每个人做独立的某一块当然是好的。但是对个人来说,服务器端开发却使终是一块迷雾环绕的大山,在这座大山上,你对你走过的路线很熟悉,而那些你没有接触过的服务器端技术,你使终是不清楚的。
对于一个服务器端开发同学,特别是进入大公司的应届生来说,在他头几年的工作中,肯定只会围绕着非常小一块功能业务来学习,那么一两年之后,他顶多是熟悉了他工作涉及的那些东西,对于别的东西仍然是不清楚的。
从这一点来说,去创业型的公司做服务器端开发又要比去大公司要好得多。
相对来说,客户端同学在这方面要爽得多。因为移动开发技术刚刚兴起,很多技术方案和框架还没有复杂到无法全面掌握的程度。移动开发技术就像一棵快速成长的小树,客户端同学将有幸伴随着它一起成长,等 5 年之后,移动开发技术成变成一棵参天大树,这一代的程序员,将会是唯一亲身经历它演进的人,每一处演进带来的改变,都将使得我们更加深刻理解移动开发系统的设计原则。
某种程度上说,服务器端开发在业务方面是轻松的,因为他们只需要设计好 API 接口,返回 JSON 数据,不用考虑 UI 的设计,交互细节的处理。服务器端开发经过了多年的发展,单元测试和性能测试框架也非常成熟,所以开发起来非常有章法。
所以服务器端的同学大多数时候只需要关注纯技术的知识,例如如何保证高可用,高扩展性,高并发,数据一致性,数据安全等。
客户端就苦了,UI 需要和美术设计得完全一样,交互细节还需要做到流畅,很多时候产品用一用觉得一些 UI 和交互有问题,我们还需要被迫接受调整。另外在测试上,因为和界面耦合太紧,虽然业界有一些解决方案,但基本上不管是 iOS 和 Android 都还没有非常成熟好用的单元测试框架。大部分的测试工作都是由黑盒的手工测试完成的。
但是,正因为客户端需要密切和产品经理,UI 设计师打交道,所以他们会频繁接触到产品设计思想和设计思想。这使得客户端的同学更加容易学习和积累编程之外的技能,包括产品和设计的思想以及沟通能力。另外,因为用户的 bug 都是通过客户端反馈,客户端同学还更容易接触到真实的用户。
所以相对于服务器端同学来说,客户端的同学的眼界更宽,由于非技术方面的沟通更多,所以他们的非技术方案的成长也越多。
从纯技术上的挑战来说,服务器端明显更大。服务器端开发动辄超过 10 人的团队,代码量稍微复杂一些就是接近百万行。而客户端一个平台的研发大多数也就在 5 人左右,代码量多在 10 万行以内。
但是,技术挑战大就表示工资待遇高吗?NO!市场价格是由供求关系来平衡的。虽然客户端的技术挑战小,但是基本上所有应届毕业生都想做服务器端开发,所以没有人做客户端开发呀!于是很多公司被迫从培训机构招人,很多人刚刚培训了 3 个月,就可以拿非常高的工资。这一点和 Web 前端类似,牛逼的 Web 前端人才非常少,但是不影响这个领域稍微牛逼一点的人拿非常高的薪水。
另一方面,由于服务器端人才的饱和,也使得竞争变得非常激烈,除非你成为这个领域的顶级人才,否则从平均薪资来说,做客户端开发的同学应该和服务器端的同学类似。
其实我这篇文章故意写得很片面,目的就是想让各位应届生同学们能够更加辩证地看待互联网行业中的工作。与其什么都不懂傻傻地选择服务器端开发,倒不如做客户端开发更有前途。
我以上所说的,都是错的。