職業規划——后台開發


一、后台開發&服務器端開發

  • 開發范圍:服務器端開發> 后台開發
  • 后台開發:指的是運行在服務器的程序,比如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中的算法和數據結構知識點,是不是翻翻算法導論就可以了?

希望對大家有用。


 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM