一、后台开发&服务器端开发
- 开发范围:服务器端开发> 后台开发
- 后台开发:指的是运行在服务器的程序,比如java/php/.net等等,你只需要会写Java/php等代码就行。
- 服务器端开发:可能是其他的高性能数据处理,分部式应用等等,这就需要有linux, c ,tcp/ip等知识才行。
去年实习生招聘的时候面试了腾讯的后台开发。这里的后台开发指的就是Linux上的C++编程。首先澄清一点,很多大学生(比如我以前)对后台开发的误解,通常人们说前端后台,后台就马上联想到web后台,java、php和各种web框架横飞的既视感。所以当时我看到招聘后台工程师,技能要求是C++也满是狐疑。
其实web后台属于后台,但后台(姑且称之为大后台)却不只有web后台。两者是包含关系。从网络协议的角度分析,web后台聚焦的是HTTP,而一般C++后台更多聚焦的是TCP。web后台可以看作是一个大后台最靠前的东西,它解析了HTTP请求,然后可能层层转发给了后面整个分布式系统的许多组件,然后调用他们的服务。公司内部服务器主机之间绝大部分是通过TCP来通信额。具体来说C++后台关注的是socket,也就是网络编程,还有并发的知识(当然了C++也可以做web后台的:CGI 逃)。
因为大公司的server一般都是Linux,所以应聘C++后台,一定要会Linux,这里的会Linux操作大致分为两类:
- 一类是Linux基本操作,包括常用Linux命令和工具的使用、shell脚本的编写,能通过脚本完成一些日常任务。
- 另一类才是重点——Linux环境编程,你需要对Linux/Unix环境下各种环境编程的API要熟悉(POSIX那些函数,当然ANSI标准库的函数也要熟)。经常考察的就是IO、各类IPC的操作方式、socket通信的流程、select/poll/epoll 等IO多路复用模型。socket和IO多路复用是网络编程的重点。
题主还问操作系统一般问什么,这些东西就是一般和操作系统杂糅到一起的,学习Linux环境编程绝对不仅仅是记忆几个函数接口那么简单,因为大多数是系统调用,参与内核操作的,所以需要了解其中的原理,而其中的原理就是操作系统的概念了,比如上面我说的IPC,就可以扯出fork函数,进而面试官就可以问题进程的其他东西,然后和线程做过比较之类的,线程又可以牵扯出同步、互斥锁等概念,怎么样是不是想起操作系统课本了。还没完。
其实面试制胜的关键并不是面试官会问你什么,而是你能主动给输出什么。面试不是做选择题,判断题。换句话说:要学会举一反三。比如他不问你Linux环境编程,他问了你一个malloc、new区别之类的东西,这个问题很好答,说完之后呢,你可以主动输出一些更深入的东西,通过它们的区别来深入谈论操作系统的内存管理,比如边界对齐,还有这块内存的首部或尾部包含其他信息等等。具体可以阅读CSAPP内存管理的章节,此外了解一下C++的placement new可以帮助你对malloc和new的区别有更深的了解,从而更好的回答这类问题。C/C++语言的一大特点就是,语言不仅仅是语言,你总能和操作系统扯上一腿。
另外无论是哪种后台,数据库是必然逃不开的。你肯定要对数据库有了解。不仅仅是SQL,还要懂一些优化,了解主键的原理(B树/B+树啊)。MySQL的话,了解一下引擎的知识吧。
数据结构、算法等内容也是必考,不过那不只针对C++后台开发,这里就不过多介绍了。
如果你想知道C++怎么写web后台的话,那么了解一下CGI。HTTP协议的内容也是知道比不知道要好。起码知道个get/post,cookie/session之类的。。
以上针对应届生,不是长期职业发展。因为我本人也是本科生,所以不确定研究生的面试是否会更深入。吐槽一下,在Java大法好的年代,我等C++码农越来越少了,不过如果你碰上招聘C++的公司的话,通过概率也较大哦,因为竞争也少。
三、问题&回答问题:
1. 后台开发 和 服务器开发有什么异同?腾讯的后台开发描述的是linux C/C++ TCP/IP 网络编程 ,服务器开发做哪方面的工作?
谢邀,没在腾讯干过,不了解腾讯的具体情况,只能泛泛谈下现在公司的一些情况。
在公司里,开发从应用来分,大致分为WEB应用开发(Web/App Dev),与系统应用开发 (System/Infrastructure Dev)。
在WEB应用开发上,大致又分成前台开发(Front-End)与后台开发(Back-End)。前台开发是侧重于与用户交互(JSP,Java,JS,CSS,HTML etc.),含有少部分业务逻辑;后台开发侧重于业务逻辑,主要开发工具是Java。
而系统应用开发是侧重于开发支撑整个系统的Foundation。比如搜索引擎(C++/Java);数据访问层(DAL: Data Access Layer,C++);云计算/IaaS/PaaS/SaaS(Java, Python)等等
在上面两类中,web应用开发与系统本身关系不大,更多的与业务有关;而系统应用开发与系统关系相当密切。
由于每个公司的组织结构,工作范围不可能完全一样(在我这里,不同部门间都很难说真正相互了解),想要了解在腾讯要做哪方面工作,可能直接去问相关的招聘人员是更合适的方法。
2. C++ 后台开发面试时一般考察什么?请问诸位前辈,C++方向后台开发一般考察什么呢?linux会考察多深?操作系统一般问什么?对于应届生来说,谢谢!
先后在腾讯和百度用 C++做推荐系统、搜索引擎的后台开发,说说我自己在面试应届生时的关注点:
1. C++基本的认识,问得比较多的是指针、多态(虚函数表、内存 layout等)、作用域、内存的管理等等。(通常只有宣称熟悉 C++或者简历中有很多 C++项目的人,我才会把这个当做一个重要的方面考察;对语言细节研究不深入,或者一直用其它语言比如 go/java 之类的,那也无妨,这块可以稍微放宽要求。)
2. 算法和数据结构,数据结构我比较关注哈希、优先级队列等,算法则是字符串处理、简单的 DFS、BFS、动态规划都有
3. 系统的知识:进程、线程、协程、锁的使用、消息队列、共享内存、还有网络协议、epoll、select等。顺便会考察一些处理问题的基本思路,比如通过哈希来划分、通过队列来序列化操作等等。此外,往往很多同学的项目经历中,有很多点可以结合系统的知识来考察,看看是否真的做过项目。比如我就碰到过自己写过 web server 的,搞过 key-value 数据库的,声称读过 redis 源码的,这些很适合配合系统知识考察,确认是不是真的做过这些项目,理解如何。
4. 和应聘者背景经历有关的知识,比如学信息安全,刚好是我的专业,我会问一些简单的安全知识,比如缓冲区溢出、SQL 注入、虚拟机、https、数字签名原理等等。当然,后面从事了个性化推荐有关的工作,机器学习也稍微懂一点,偶尔可以聊聊。这个主要是发现一些学习态度也特别好,但是又想做后台的同学。
=====================================================================
20151206 update有人说我问的都是知道不知道的东西,这些只需要翻翻某些书就可以了,而「编码习惯」「思维方式」才是「核心素质」。
首先以我对题主这个题目的理解,我想题主关注的应该是以哪些具体的知识作为「切入点」,以便将来成为一名「C++后台工程师」。如果我跟题主说,「改编思维方式」「改善编码习惯」才是最重要的,那么等于说了正确的废话。
我认为我们说的不是一个层面的东西。具体的知识只是切入点而已,如果没有知识储备作为切入点,说一个人有好的编码习惯、思维方式,那不是空谈吗?
我文中有表述到了我通常会根据面试者本身的背景和知识储备切入的意思,而且我并没有说我只问知道不知道概念,我先考察的是学习态度和知识储备,我认为这是筛选实际工作中可靠的工作伙伴的方式。
另外,编码习惯和思维方式,是需要具体的知识和问题来考察的,比如算法、系统设计,至于怎么挖掘出来,是面试技巧和面试官本人的能力问题了。
还有,并不是翻翻APUE就行了,很多知识,不是每个人都有能力理解和融会贯通。如果这么说的话,我说的2中的算法和数据结构知识点,是不是翻翻算法导论就可以了?
希望对大家有用。