写给那些傻傻的,想做服务器开发的应届生

前言

猿题库刚刚结束了北京地区的大规模校园招聘,国庆之后打算转战外地进行校招。我本人深度参与了此次的校招工作,包括笔试题命题、面试题命题以及具体的面试工作。

我在面试中发现了一个非常有意思的现象,就是大多数应届生都想做服务器端开发,但是他们却又不清楚服务器端开发具体要做些什么。

我和同事聊天的时候说起此事,我们认为可能应届生觉得:做服务器端开发可以让自己写的程序运行在很多台机器上,并且处理海量的数据,这很「牛逼」。而做客户端或前端开发太简单,成长会比较小。

于是我就写了本文,想给这些单纯的应届生泼泼冷水。先说说我的背景吧,我同时做过服务器端和客户端的开发。我在网易有道做过 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. 在线调试和修改 Bug,通常顺利的话,到早上 7,8 点的时候一般就能搞定了。
  2. 在线调试和修改 Bug,如果不顺利的话,到早上 7,8 点的时候回滚数据。然后,我们需要回家休息半天之后,继续在下一个凌晨 3 点上线。

当然,不会每次上线都是这种大升级,但是基本上,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 前端人才非常少,但是不影响这个领域稍微牛逼一点的人拿非常高的薪水。

另一方面,由于服务器端人才的饱和,也使得竞争变得非常激烈,除非你成为这个领域的顶级人才,否则从平均薪资来说,做客户端开发的同学应该和服务器端的同学类似。

总结

其实我这篇文章故意写得很片面,目的就是想让各位应届生同学们能够更加辩证地看待互联网行业中的工作。与其什么都不懂傻傻地选择服务器端开发,倒不如做客户端开发更有前途。

我以上所说的,都是错的。

来源:51CTO

时间: 2025-01-30 18:04:50

写给那些傻傻的,想做服务器开发的应届生的相关文章

想做 CloudKit 开发?先升级到 iOS 8 beta 5 还有 Yos

摘要: 本周一,苹果在给开发者的邮件中指出,诸如 iCloud Drive.Mail Drop.iCloud Photo Library.Safari History.Call History.CloudKit等 iCloud 最新特性至少得在 iOS 8 beta 5 及 OS X Yosemite DP 5 才运行得起来. 本周一,苹果在给开发者的邮件中指出,诸如 iCloud Drive.Mail Drop.iCloud Photo Library.Safari History.Call

想做GUI开发,但不知道有什么好用的插件

问题描述 谁有好用的可视化界面的插件,最好自己用过,给个下载链接和安装方法 解决方案 解决方案二:本人的版本是3.6.2的,本来想装WindowBuilderPro,但是试了各种办法都装不上,最好有个高手指导下,本人的QQ312817834,虚心求教解决方案三:WindowBuilderPro非常好用解决方案四:还不错解决方案五:我们用eclipse的VE(VisualEditor)插件开发界面程序.安装方法请看:http://wiki.eclipse.org/VE/Update所见即所得特性什

写给想做互联网产品经理的师弟师妹们一些话

最近我在微博上给一淘招产品经理,碰到好些学弟,学妹找我来问.是否可以给他们一个淘宝实习的机会,过来做产品经理.首先,我对这种积极主动,通过各种渠道找到相关人士,主动询问可能性,这种精神是非常赞赏的.机会,就是给有主动性的人.我们团队经常说一句话,你不问,怎么知道她会不会给你呢? 但是,他们问的问题确让我慢慢发现,很多学弟,学妹们,走入了很深的误区.为了不让一些人继续走入歧途,我认为,有必要写一篇文章,和大家来一起探讨互联网与互联网产品经理,是怎么炼成的. 先说一下互联网对新毕业大学生的魔力.互联

ios4年 想学习java linux服务器开发 请教一下学习步骤

问题描述 我因为主体是做ios开发近期想学学javalinux服务器开发不想学什么html之类的我就是想学习服务器什么postget方法以及调用数据库之类的请问我应该从哪里学起应该看些什么东西?是不是得租一个linxu服务器阿里云的按流量收费的服务器我来学习可以吗?请大家推荐个教程吧 解决方案 解决方案二:建议还是自己买个小本装linux吧,阿里云那个只是用来一个人学习的话,不划算解决方案三:虚拟机装个linux不就行了,红帽和乌班图都不错啊,而且都有图形化界面.再说,java和操作系统有什么关

我想做一个管理控制台应用程序的程序,应该用什么写?

问题描述 我的服务器上平时开着10多个控制台应用程序,都是用来抽取数据接收数据的,因为太多了不好管理,经常有一个挂掉了自己也没发现.现在想做一个可以监视所有应用程序,并且能在这程序上运行这些应用程序,现在只是有这么一个思路,该怎么做大家说说啊,有什么想法建议都可以说. 解决方案 解决方案二:写个程序看进程?解决方案三:每个客户端开启后有个进程,或者你暴漏一个GUID,然后写个监听程序可以试试解决方案四:监视进程呗.每个程序的进程名你应该都知道的吧解决方案五:可以在webform里写吗解决方案六:

想做一个vc程序,后台监控指定文件夹中是否存在数据库文件,如果有则将文件内容上传到服务器数据库中。

问题描述 想做一个vc程序,后台监控指定文件夹中是否存在数据库文件,如果有则将文件内容上传到服务器数据库中. 有说可以写服务来后台监控的,但是我不太明白原理,服务是怎么实现后台监控, vc倒是可以直接生成一个服务,但是不清楚原理,完全不知道应该从哪下手. 希望有高手给解答一下. 解决方案 参考:http://blog.sina.com.cn/s/blog_a6fb6cc901017us1.html

想做个很简单的服务器,但是不知道怎么做了,求指点,真的很简单

问题描述 想做个很简单的服务器,但是不知道怎么做了,求指点,真的很简单 就是c/s模型的服务器端,客户端在安卓手机上,通过URL请求服务器数据,服务器返回一串json数组就好.这个功能的服务器该看什么方面的东西??完全没做过,求大牛. 解决方案 最简单的,服务器用jsp写一个web service,客户端用httpclient连它.具体google下. 解决方案二: 参考:http://blog.csdn.net/ice343241993/article/details/22037829http

想做高性能web应用开发,求大神指导

问题描述 本人大学生,学习javaweb开发,掌握了Struts.springmvc.springsecurity.spring核心和hibernate等开发框架.并且掌握了一些web前段开发技术.目前想着手学习开发高性能的web应用,有一下问题请教各位大神:1.10万并发量以下的web应用,要优化性能,主要应该专注哪方面?钻研java语言机制,提高代码质量?钻研数据库,优化数据库访问?还是专注http.tcp方面?2.听老师说,nginx对静态资源访问的性能提升明显.我想知道,对于没有做高性能

服务器-android 本人想做一个登录注册的界面

问题描述 android 本人想做一个登录注册的界面 想要从服务器端获取数据 android studio怎么搭建呢 解决方案 android studio,跟这个没关系,你需要创建一个工程,然后用http协议去调用http接口,接口会返回给你json数据,你自己解析 解决方案二: 你后台也自己做吗?你之前用Tomcat,那就把这个url拿过来用就行了啊!把登录注册的数据post到你的服务器上就行了,具体返回就看你服务器怎么写了! 解决方案三: 我只想做一个平凡人我想做一个程序猿