这篇博客原作者的博客链接:https://blog.csdn.net/analogous_love

写在前面的话

我在七八年前就看过这篇文章,那个时候我还是一名学生,它深深地影响了我学生时代以及后来的人生轨迹。(所以原文绝对不是首次发表于2015年,我猜想可能是后来的作者2015年修改了原作者的一些内容,并增加了一些自己的东西,让它"与时俱进")。我学生时代深受这篇文章的影响,以至于我印象中的服务器开发的样子和地位就是这篇文章中所描述的。

我的工作经历

我毕业的时候,一心想做 Windows C/C++ 客户端开发,当时为了做这个开发放弃了我熟悉的flash编程和web开发,当然薪资也是比较低的。做了几年Windows客户端后,我毅然以一定的代价转到了linux服务器开发。到今天为止,大致做过股票资讯、交易系统、游戏服务器、即时通讯系统和直播类型的服务器,架构的能力也由最初的千人到后来的百万在线。我从不后悔我当初转行服务器开发,甚至很庆幸当初的抉择,然而我可能更喜欢的还是客户端开发。

《写给那些傻傻的,想做服务器开发的应届生》一文中的有些观点,根据我的经历,我不敢赞同,或者说我的感受与之大相径庭。

加班的情况

首先说下加班的情况,不管是大公司还是小公司,由于现在的各种测试、预警机制、监控策略和公司发布流程的不断完善,一个月内经常为各种服务器bug、和应急的情况加班的现状已经大为改善不少,当然偶尔发版或者赶项目加班还是有的,不过一个月的频率也就那么一两次。如果你们团队频繁地为了修正紧急bug、解决服务器稳定性问题,那么你们真要好好考虑你们的方法是不是有问题了。

服务器开发与轮子

其次,服务器开发,不仅仅如文中所说的,利用或者组装各种轮子。一个稳定的服务器架构,必须是建立在设计师良好的基础知识和见多识广的经验基础上,即使是使用现有的轮子,也是对这个轮子足够熟悉的基础上,才能让轮子最大地适用自己的公司的业务。也就是说,服务器核心项目人员虽然不一定要造轮子,但一定要具备造轮子的能力。开源的东西好用是好用,但是要么不出问题,一旦出问题往往很难修改。我们去年做类似“冲顶大会”、“百万英雄”这类直播答题应用,由于这类游戏是从美国HQ刮过来的风,国内各大公司为了迅速抢占市场与用户,都想着要比别人早点做出来上线,所以我们公司当时deadline压得比较紧。我们那个时候,最不想看到的人就是项目经理,天天跟着我们后面催项目的进度。项目进度紧不说,另外还有一个技术挑战,由于节目比较火热,同一个房间里面可能会达到百万人同时在线,而这百万人可能同时都会发弹幕消息。假设某个时刻,房间里面有n个人,某个人发一条消息,其他n-1个人收到,服务器需要推送n-1次。如果n个人同时发消息,那么服务器同一时间就要推送n*n,如果n等于1百万的时候,那么单秒的数据量将非常恐怖,这个是我们需要解决的一个技术难题,解决目标是最少延迟的情况下,弹幕最多的送达率;另外一个难题就是,保证出题和答案不能有太多的延时(小于1秒),并在用户给出答案后,服务器能够迅速统计出答案结果并应答客户端。(没办法,所以此时主持人的作用就发挥了,万一延迟太厉害,主持人可以和观众各种唠嗑,当然这是下下策,如果频繁出现这种情况,领导的脸色肯定也不好看,我们做技术的脸上也没有光彩。)那段时间基本上是周六周日都要加班,甚至连周末都可能要到凌晨才能回去。注意:我把这段经历并没有放在上面的关于服务器开发是否频繁地加班的栏目下,这里我想说明的并不是服务器开发要经常加班,我想说的是,如果你平常只会用轮子,而不注重基础内功的修养,这种场景你是很难应对的,首先是单机服务性能要做到极致,其次是多个服务之间的高效配合。很多人可能觉得这种场景也不难,甚至有的人号称单机服务就能解决,这些都是站着说话不腰疼了。像熊猫tv的“冲顶大会”和西瓜视频的“百万英雄”前几次的答题活动中,也出现了服务中断或者题目延迟厉害,甚至“百万英雄”还出现过一次因技术问题答题活动被迫延期的事故。

技术与产品思维

接着说下,技术和产品方面的,服务器开发与客户端开发的思维方式和理念其实是不一样的,如果说客户端产品是一个产品的脸面,那么服务器端就是产品的灵魂。这里可能比喻有点不恰当,与客户端开发相比,优秀的服务器开发应该尽量在单机服务上的性能做到极致,必须尽量利用少的资源给尽可能多的客户端服务(在资源总量有限的情况下,你为单个客户端服务使用的资源越少,你才可能为越多的客户服务)。而服务器开发必须有条不紊地处理与每个客户端的交互,不能纠结或把资源花费在某一个客户端上。但是客户端不一样,客户端只需要管理好自己的一亩三分地就可以了,而且客户端的大多数逻辑和细节在界面(UI)逻辑上。但是我不赞成文中作者所说的客户端代码比服务器代码少很多,相反,我经历过的项目,都是客户度代码比服务器代码多很多。因为客户端代码往往有大量的界面逻辑,如果服务器端没有UI的话,其核心除了网路通信部分,剩下的就是各种业务逻辑(包括存储逻辑,也就是业务逻辑服务器和客户端都有,但是客户端还有界面逻辑)。而从开发团队的人数配比上来说,一般单个端(比如pc、安卓、ios中的一端)的人数要小于服务器开发人员的数量,因为一般一个高级客户端开发,往往可以一个人搞定一个客户端,但是一般很少有一个高级服务器开发可以单独搞定一套服务开发的。(说的是通常情形,请不要走极端)。服务器开发的核心字眼体现在“服务”上,如何为客户端提供稳定的、高效的服务,这是关键的地方。这里“稳定”也包括容灾容错。大凡有一定规模的用户群体的产品,如果服务器不稳定,那后果将是灾难性的,试想QQ或者微信服务器中断一两个小时,后果会怎样?而客户端更侧重的就是产品的细节、用户的体验,当然尽管有些用户体验可能是由服务器端决定的,但是最终还是由客户端反映出来。我不赞同文章中说,客户端更能积累除了技术以外的其他知识,服务器开发也一样的,不管是客户端还是服务器,只有具有产品思维的开发才是好的开发,而功能的设计与规划服务器端的开发在时间点上一般先于客户端开发的。而具体的功能点,也是需要服务器开发人员与产品人员乃至客户沟通的。

薪资方面

最后说下,薪资方面。一般大于两年且同样的工作年限的服务器开发人员要比客户端开发人员高至少三分之一左右。当然不排除一些非常优秀的客户端开发人员可能不在这个规则内。

结语

总结起来,选择了哪条路就选择了什么样的生活。做服务器开发的可以在高并发、高可用方向进一步努力,而做客户端开发可以在用户体验、设计细节方面下功夫。不管怎样,都是我们想要的生活,那里倾洒了我们的汗水,也收获了我们自己的成就感。

写给那些傻傻想做服务器开发的朋友相关推荐

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

    前言 猿题库刚刚结束了北京地区的大规模校园招聘,国庆之后打算转战外地进行校招.我本人深度参与了此次的校招工作,包括笔试题命题.面试题命题以及具体的面试工作. 我在面试中发现了一个非常有意思的现象,就是 ...

  2. ios开发转行_做了几年嵌入式,想转服务器开发,该学什么?

    我是学通信工程专业毕业的,大学毕业后做的也是嵌入式相关的工作.开始做嵌入式linux应用开发,驱动开发,后来也做基于STM32单片机的开发,产品都是无线通信设备.后来机缘巧合在2011年,移动互联网大 ...

  3. 想做硬件开发的人员必看

    转眼间,已经毕业一年了,在这一年中经历了很多,工作已经换了两个了,住的地方好像已经换了两三个了,这中间不包括跨地区生活.  我刚大四的时候,应聘一家网络公司做硬件开发,03年的时刚过完年,我就千里 ...

  4. 想做web开发 就学JavaScript

    想做web开发 就学JavaScript   有一天我被问到,为了快速地在 web 开发工作上增加优势,应该学习什么语言.我的思绪回到了大学,那时候我用 Pascal.Fortran.C和汇编语言,不 ...

  5. 想做游戏开发?Unity3D值得你了解一下!

    很多人爱玩游戏,也有很多人想制作属于自己的游戏. 炫酷场景.角色设定.极佳的游戏体验.丰富的社交活动,好玩的游戏总有属于它本身的独特吸引力. 论移动端游戏引擎最瞩目的还是属于虚幻引擎4和Unity3D ...

  6. 想做分布式开发,需要懂哪些技术?

    [阅读建议]文章多处链接别处详细文章,客观莫急建议先把文章总体阅读完毕后,再点进去慢慢品味具体细节点,阅读本文大概需要10分2秒. 目录 一.前言 二.分布式篇 1 这个技术框架,它是什么东西? 2 ...

  7. Java做服务器开发语言

    随着游戏市场的兴起,特别是网页游戏.手机游戏的崛起,对游戏开发技术的需求越来越多.网络游戏开发是一个庞大的体系,总体来说是客户端与服务器端.客户端是玩家接触的游戏图像显示端,服务器是处理游戏运行中的各 ...

  8. 想做游戏开发,我应该会点啥?

    在知乎上,经常能看到类似"如何入门游戏开发"这样的问题,对于进入游戏行业快三年的我来说,现在应该有能力解答这个问题了. 之前偶然在Gad上看到一个游戏开发入门系列的视频,觉得内容挺 ...

  9. 想做游戏开发要深入c/c++还是c#?

    根据题主描述提三点建议: 先选择一个语言.选择一个引擎能入行 确保精通一个及已入行的情况下,技多不压身 不必想日后的"退而求其次",现在的事情还没有开始做就想以后,太过虚无及功利了 ...

最新文章

  1. Java 8特性探究(1):通往lambda之路_语法篇
  2. Docker私有仓库搭建与配置
  3. 华为擎云w510_苹果 iPhone 12 全家桶谍照曝光;华为台式机擎云W510现身官网
  4. 关于文件的INode与Java中的文件操作接口
  5. 关于JS中的严格模式
  6. 第二届360杯全国大学生信息安全技术大赛_几道小题解析
  7. 公里与英里的换算c语言函数_这些天然气单位换算你知道吗?
  8. Java学习笔记之设计模式(1)设计模式简介
  9. 在内核中构造一个UDP 数据
  10. Apache Ant 安装教程
  11. mysql 两阶段加锁_MySQL的两阶段加锁协议
  12. 天地图行政区划描边_百度地图api-在中国范围内的多行政区选择与反选(增加屏蔽层)...
  13. Qt自定义控件大全文章导航
  14. 【转载】2005中文博客排名报告
  15. 兼容Android 11 相机拍照,从相册中选择,裁剪图片
  16. 【Response】全面总结并理解response
  17. JAVA中JVM的重排序详细介绍(写得很明白)
  18. 360网站卫士SQL注入绕过案例一个
  19. 【Java】函数式接口
  20. MySQL所有问答题

热门文章

  1. Linux防火墙端口
  2. 生成ResultMap
  3. C# 将字符串转换成二维码
  4. 用宝塔配置PHP环境
  5. java编写微信公众账号收发消息
  6. 从工厂妹到月入十万的微商:成长之路并非一帆风顺
  7. Android VoLTE 视频通话是否可用状态读取与监听
  8. Ubuntu更新源切换为香港中文大学
  9. 怎样把照片中的头像扶正_抖音账号名称,头像,个人签名设置的重要性
  10. PowerDesigner16 画时序图教程