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

标签: 服务器 开发 | 发表时间:2015-10-07 12:05 | 作者:
出处:http://blog.devtang.com/

前言

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

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

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

于是我就写了本文,想给这些单纯的应届生泼泼冷水。先说说我的背景吧,我同时做过服务器端和客户端的开发。我在网易有道做过 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 前端人才非常少,但是不影响这个领域稍微牛逼一点的人拿非常高的薪水。

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

总结

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

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

Posted by 唐巧 Oct 7th, 2015 summary

关注我的「iOS开发」微信公众号,每天获得精选的 iOS 开发文章和创业心得:

原创文章,版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0

相关 [服务器 开发] 推荐:

使用epoll 在 linux 上开发高性能应用服务器

- - C++博客-首页原创精华区
epoll是linux提供一种多路复用的技术,类似各个平台都支持的select,只是epoll在内核的实现做了更多地优化,可以支持比select更多的文件描述符,当然也支持 socket这种网络的文件描述符. linux上的大并发的接入服务器,目前的实现方式肯定都通过epoll实现. 有很多开发人员用epoll的时候,会开多个线程来进行数据通信,比如一个线程专门accept(我个人早些年在FreeBSD用kqueue的时候,由于对内部机制没有基本了解也这样搞),一个线程收发,或者接收和发送都用各自独立的线程.

BitTorrent 开发出摆脱服务器的安全通信技术!

- - TECH2IPO创见
自从斯诺登揭露了美国国家安全局的监听项目后,如何使得线上的通信变得更加安全,就变成了当务之急. BitTorrent ,这种点对点的文件分享,多年来依赖于服务器处理,环节尽管易被攻击和侵入,但是就这么磕磕绊绊沿用下来了. 但是,现在基于 BitTorrent 开发出的技术,出现了更加先进的不依赖于服务器的通信方式:BitTorrent Chat.

大规模业务服务器开发总结

- - 五四陈科学院
以下内容由 [五四陈科学院]提供. 开发阶段,服务不稳定,一个大服务不如一堆小服务; 运维阶段,服务都稳定了,一堆小服务又不如一个大服务. 大规模的时候了,如果能够一个进程搞定的,尽量不要拆两个进程. 如果都是大服务,自然而然地,服务数量就少. 服务数量少,运维成本就相应低. 一个进程,跑得越快,qps越高,所能使用的资源越多,越能“物尽其用”.

hmailserver 简单设置当smtp邮件服务器供开发人员使用

- - 博客园_首页
如果你遇到下面情况就会使用:. 如果代码调用哪些免费的126 等之类的smtp服务器发送每天的免费数量不够用,而且不是自己的域名比如你想[email protected]发送,可是126之类的不行,影响企业形象,即使126可以免费提供企业邮箱,可以拥有自己的域名邮箱,但是每天的数量还是不够的. 可以使用hmailserver仅仅搭建smtp服务器,hmailserver免费又稳定.

Likwid-高性能服务器开发不可缺少的工具箱

- - 非业余研究
原创文章,转载请注明: 转载自 非业余研究. Likwid-高性能服务器开发不可缺少的工具箱. 做高性能服务器的时候,知道如何开发高性能代码是一个事情,开发出来的系统是不是高性能那就是另外一个事情了. 通常我们需要了解系统的CPU拓扑结构,内存使用情况,各种CPU性能计数器的数字,各种CPU Cache的使用情况,命中率等等信息,这些信息有效的结合在一起才能准确的分析出我们程序的缺陷,从而找到更好的优化点.

文章: James Ward谈使用HTML5和Java开发客户端/服务器应用

- - InfoQ cn
谈到应用开发,不管是客户端/服务器类应用、传统的Web应用还是移动Web应用,最近的趋势是使用像流式网格布局(Fluid Grid Layout)和响应式网页设计(Responsive Web Design)这样的模式,以及像HTML5、CSS3和JavaScript(客户端和服务器都支持)这样的技术.

Nginx+ffmpeg的HLS开源服务器搭建配置及开发详解

- - 互联网 - ITeye博客
          至目前为止,HLS 是移动平台上非常重要并十分流行的流媒体传输协议. 做移动平台的流媒体开发,不知道它不掌握它 ,真是一大遗憾. 而HLS的平台搭建有一定的难度,本文针对对该方向有一定了解的朋友,将方案实施中的一些细节和流程进行分享交流. 本文介绍了,使用开源服务器nginx 搭建 HLS 服务比较详细的方案.

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

- - 唐巧的技术博客
猿题库刚刚结束了北京地区的大规模校园招聘,国庆之后打算转战外地进行校招. 我本人深度参与了此次的校招工作,包括笔试题命题、面试题命题以及具体的面试工作. 我在面试中发现了一个非常有意思的现象,就是大多数应届生都想做服务器端开发,但是他们却又不清楚服务器端开发具体要做些什么. 我和同事聊天的时候说起此事,我们认为可能应届生觉得:做服务器端开发可以让自己写的程序运行在很多台机器上,并且处理海量的数据,这很「牛逼」.

开发者在 Siri 和苹果服务器间建立代理服务器,可以通过它调整家里的空调

- 请叫我火矞弟 - Engadget 中国版
靠着 Applidium 刚发现的 Siri 服务器沟通内容,美国的一名开发者 plamoni(这是他的 twitter 账号,本名不详)成功地在 iPhone 4S 和苹果的 Siri 服务器间建立了一个代理服务器,不仅可以看到 Siri 和苹果母舰间的交流,还可以自由地在中间插入信息和指令. 后面这点让 Siri 的可能性大增,以影片中的示范为例(影片在继续阅读里),plamoni 简单地用 Siri 检查代理服务器的状态,并且还可以通过 Siri 检查自已家的空调系统(支持 WiFI)的设定,并调节温度.

Asp.Net微型服务器,只有一个文件,并且才300K大小|建议从事Asp.Net开发的博友们人手一份

- Bloger - 博客园-首页原创精华区
其实我开发此助手已两年多了,也共享给了一些关系很好的朋友们,大伙儿用了都觉得不错,同时我也感觉到很开心,为了更多朋友们能享受到她给您带来的好处,不敢独享,特意在此共享给园来的博友们. 倘若您觉得她真的对您有用,您不防“推荐”一下,给予“艾伟”一个小小的“推荐”的关怀,也许能给您带来源之不尽的享受与方便快捷...多谢.