说说 “后台开发” 需要注意哪几点
(這篇文章題目雖然是后臺相關, 不過對于客戶端,前端等做工程的同學,估計也有一定的借鑒意義。)
后臺開發涉及的東西很多,一篇文章沒辦法覆蓋完,所以我這篇,就說說后臺開發的基礎要求吧 。
在正式開篇前,我想簡單說說, 對后端和后臺這兩個詞的理解。?
后端和后臺
后端和后臺這兩個詞,我特地去google 了一番,好像也沒有特別精確的定義,各種說法都有。
我主要是從事后臺開發的,我們一直以來的習慣叫法是后臺,公司內部的職位定義也是后臺開發,不是叫后端開發。
我仔細想了下這個事情。覺得后臺的稱呼更合適一些。 我們稱前端后臺。我覺得端和臺很形象,準確的描述了兩者的根本區別。前端,一個端,可以是一臺手機,一臺pc, 一個瀏覽器,所以稱為端。后臺,有可能是一臺服務器,但更多是幾臺,十幾臺,甚至幾百上萬臺服務器,有平臺的的感覺。所以我覺得后臺的叫法更加的形象和準確。 前端后臺,也很形象準確的描述前后之間的差異。 當然,這是我的一家之言,說的不對,還望指正。
言歸正傳,我們來看看一般后臺開發的基本要求
語言層面: 語言 + 對應的框架 + 運行時機制(語言解釋執行器,垃圾回收等)
數據庫: 有一種或幾種常用數據庫的操作經驗,至少能進行增刪查改的操作
算法數據結構: 常用數據結構, 隊列,堆,鏈表;常用的算法, 哈希, 各種排序,字符串查找等。
操作系統(類unix,windows, 類unix偏多): 線程,進程,cpu 調度, 內存分配機制,文件緩存系統,?epoll/select
網絡協議: tcp/udp, http, https 等
以上是基本需求,進階需求,各公司各崗位不太一樣,這里就不一一列舉了。
上面列舉的基本需求,可能很多同學在各個公司的招聘要求上也看過。
下面,我例舉些實際的例子,來看看這些知識或技能要求,在實際工作中的使用情況和對工作帶來的實際影響。
語言層面
例如java, python, php , c/c++ 等,和對應的開發框架。 這個是基本要求,因為你至少要熟悉一門語言和常用的框架,你才有可能接手正式的工作,要不你都干不了活。
語言和框架,包括對應的運行時環境,是貫穿整個職業生涯的東西。不同階段對語言和框架的要求是不一樣的;不同公司對新入職員工的要求也不一樣。大公司對畢業生甚至沒有框架的要求,就算你只會一門語言而不會任何框架也可以, 但相應的,對算法,操作系統等方面的要求就會高很多。中小公司就很看重入職新人語言框架方面的實際能力。因為中小公司本身的資源有限,沒有那么多的時間來培養新人,他們更想要進來就可以干活的。所以如果你的算法或其他方面很牛B,你可以不太理會這塊,想辦法去大廠。 但如果你其他方面都不怎么行,基本的語言和框架就是你的敲門磚了。
語言框架,這個算是最基本要求了,也是貫穿整個職業生涯的要求,越高階,需要掌握的程度也越高。
數據庫
對數據庫的要求跟語言框架是一樣的。 首先你得會,不會的話,就沒辦法工作。 現在大部分公司的數據庫都是mysql。 當然也有使用Mongodb ,Redis 等的。 數據庫的增刪查改操作是最基本的,是能干活的基礎。進階一點的時候,需要開始理解數據庫的存儲結構,索引實現,要對性能優化有所了解。 再進階,數據庫的鎖,事務,高并發設計等。數據庫的要求也是越高階越難的,到后面甚至出現自研數據庫的需求。 這個就是分布式存儲的領域了,很復雜,可以講很久了。對于新人而言,會增刪查改應該可以滿足初期需求了。后面需要開始對性能,對并發等有要求的時候,就需要對數據庫本身的實現機制有更進一步的了解了。這些可以在實際工作中慢慢學習和積累。
數據庫,必備的技能,貫穿整個職業生涯,隨著開發的等級越來越高,要求也會越來越高。
算法數據結構
算法的重要度,都已經不需要再次闡明了。 幾乎所有人,所有公司都是覺得很重要的。 就類似武俠小說里面的內功,擁有深厚的內功,才能將各種招式充分的發揮出來。我這里說說,在實際工程中,算法數據結構的應用情況。?
實際工程中,算法數據結構的實現和應用情況,可能跟大家想象的不太一樣。 對于通用的算法,類似快速排序,快速查找,都有現成的庫可以使用,一般團隊也不會讓你直接手寫一個快速排序---低效,說不準還會有bug。 而類似哈希,鏈表,隊列,這幾類的使用會多很多。 特別是哈希 和 鏈表,使用頻率最高。 不過,實際工程中, 對數據結構實現的要求跟教科書上的不太一樣。 對于哈希,你可能懂得用開放地址法或鏈表的方式來處理沖突,而實際工程中這些遠遠不夠。 實際的生產環境,基本都是多并發的環境, 你還需要保證你設計出的數據結構,是線程安全的,也就是可以多并發處理,而且可能還有一定的性能要求。 這個就要比較教科書難不少了。 再比如, 你可能會被要求去實現一個隊列,因為要應對并發,你的隊列要設計成多進多出的,所以你要加鎖,但因為要高效,所以最終你要設計一個無鎖隊列。這個也會比教科書的難。但在我的實際工作中,幾乎沒遇過要我去手寫一個平衡二叉樹的需求,好像我周圍的同事也幾乎沒遇到。我想除非是做數據庫的同學會遇到吧。這些都是實際工作和教科書的區別。?
算法數據結構,總的來說,是最重要的內功之一,但實際工程中的要求可能跟教科書的要求會有些不一樣。
操作系統(類unix, windows , 類unix偏多)
剛入行的時候, 對操作系統的理解還不需要太深入,只要知曉有操作系統的存在就行。在后面慢慢進階的過程中,操作系統對你整個工作的影響會越來越大。會影響你的整體設計,性能,更直接的是,你在實際工作中首次碰到的很多無法解釋的“靈異事件”,都可能跟操作系統的機制和策略有直接或間接的關系。 這里舉個實際設計中的例子: 我一個同事,早期的時候,做過一個自研的隊列組件(類似rabbitmq那種), 設計的極其復雜。我看他的文檔看了好久才明白其中的原理。 后面找他討論, 才發現他很多的設計都是為了追求極致的磁盤寫入性能。 他做了寫入緩存,做了各種數據對齊,這些又使得他的上層設計變得復雜。 后來跟他一起討論了linux文件系統的緩存機制,發現直接用 write 系統調用,順序的寫入文件就完美解決問題了。而他圍繞此處所有的設計都是多余的。類似的情況,我還遇到不少。所以操作系統的知識,特別是對操作系統機制和策略的深入理解,對后臺的設計,開發,真的會帶來完全不一樣的結果。如果一個后臺開發對操作系統的理解不能深入到一定程度,我覺得他是沒辦法在這條路上進階的。
操作系統,這個屬于進階需求,需要長遠在這個方向發展的話,就要注意這塊的積累。
網絡協議: tcp/udp, http, https 等
一般情況,網絡協議,?需要到達清楚理解機制的程度。
比如 tcp 和 udp 的區別。tcp 的鏈接建立和斷開的過程。http 和 https 的區別。 實際工作中, 如果你的工作涉及底層網絡框架的開發,那對tcp /udp的實現機制就需要有深入的理解了,要不你無法設計出高性能的框架。 其他協議也是類似。
總得來說,如果不是專門做網絡框架或涉及設計類似p2p等私有網絡協議的。 相對其他,個人覺得這個在實際工作中的運用相對沒有那么多。但是,大家不要混淆了網絡協議和 epoll / select 這種服務器開發機制的區別。 類似socket 套接字的使用,epoll/select 的深入理解,還是很重要的。目前很多公司已經不用從socket 套接字和epoll/select 層面來構建服務了,而是直接采用了現成的rpc框架,但對于想長期往后臺方向發展的同學,還是建議掌握socket epoll select 。我記得我當初進公司,第一個任務就是不用任何框架,實現一個服務器,要求高性能,支持高并發。基本都是采用socket 套接子 + epoll來實現。做完,基本可以熟悉和知曉在數據傳輸上需要解決的一些問題。
網絡協議,需要達到清楚理解機制的程度。如果是從事網絡框架開發或需要設計私有網絡協議, 則會有更高的要求。
上面說的東西,對于客戶端開發,基本也是匹配的。前端開發對操作系統的關注沒有那么高,會更關注瀏覽器的行為。本質上,都是要求,你在做設計和開發的時候,能從底層開始,知曉你所寫每一行代碼會帶來什么影響。這里在設計和開發有一個終極的要求:?一切盡在掌握。也是我們一直在追求的目標了。?
以上例舉了后臺開發的關鍵技能點,也例舉了一些實際工作中應用的例子。下面再來說說面試的一些情況。
一般面試,上面提到的知識都是會涉及的,雖然每個公司每個面試官問的具體問題不一樣,但基本都會考察的。?
除了以上的知識點,有以下情況的可以加分。
對于畢業生,如果你的算法牛B, 基本可以暢通無阻
這個在大廠基本是這樣的, 估計對于很高估值的獨角獸公司,也是如此。 這里算法牛B,一般是指ACM 省級以上的金銀牌,有的甚至要求,洲際級,國際級的那種。 基本都是頂尖人才了。如果你有這么牛, 你可以不太懂其他的基礎知識,沒有項目經驗。你一樣可以面過最后一輪,甚至拿到特殊offer。不過這種人太少了,基本簡歷一出現,就被搶走了。
有豐富的項目經驗,也是很受歡迎的
有豐富的項目經驗,也是面試官很喜歡的。 不過相對算法的考察,項目經驗的考察會偏主觀。因為判斷一個人的能力是從項目中判斷的,而一個項目的好壞以及個人在整個項目中的貢獻,都會因應聘者的描述,面試官的理解,造成差異,甚至經常出現各個面試官的意見不一致的情況。 所以拿項目經驗面試的時候,要注意自己的經驗跟面試官經驗的匹配度。 如果剛好面試官也是做這塊的,你通常會比較高分,反之就會差些。這種時候,就多試試吧。而且就經驗來看,一般社招,都是看項目經驗了,算法要求反而沒那么高了。
沒有特別突出的,就拼基本功了
這個沒辦法,也只能降低一些要求了。 大廠和獨家獸公司應該是比較難了。 不過如果以上列的基礎知識掌握的不錯,面試官問的都能回答出來,再加上一些自己做的小項目。比如一個個人網站,或者自己動手做的一個小游戲,都可以。也還是有比較大的通過機率的。
總的來說,如果你算法很牛或者你項目經驗很豐富,會有很大的優勢。 如果沒有這兩個,就基本押寶你的基礎知識了,例如我上面列出的那些。
最后希望上面的星星點點,能為你提供一些幫助。如今各個行業領域的分工都已經十分的精細,要想在一個特定領域的一個分支上做出成績,都需要幾年甚至十幾年以上的投入。在確定合適的方向后,剩下的就是持續的學習和積累了。沒有捷徑,唯有腳踏實地。
總結
以上是生活随笔為你收集整理的说说 “后台开发” 需要注意哪几点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从头搭建 IntelliJ IDEA 环
- 下一篇: 不想当亿万富翁的程序员不是好老板