從知乎上看到“全棧開發者”討論之后的自黑

怎樣成為Full Stack Developer
服務器君一共花費了69.036 ms進行了4次數據庫查詢,努力地為您提供了這個頁面。
試試閱讀模式?希望聽取您的建議

今天在知乎上看到一個關于怎樣成為全棧工程師(Full Stack Developer)?的討論,身中N槍,為警示自己,故在此自黑一下。自黑是一種精神,也是一種勇氣嘛。

馬宏菩,Hexcles / Programmer / (Wanna be) Hacker

竊以為 full stack 不是那么簡單的事情。當然,不同的地方可能有不同的標準,且聽我慢慢道來。

既然大家都在以 Web 為例,那我也說 Web 好了。不過事實上 full stack 也有可能是其他方面的。

租個 VPS ,從裝系統配環境開始,然后拿個 PHP/Python/Ruby/Node.js 什么的寫個后端(少不了用一些框架吧, 后端框架多如牛毛,不說 PHP , Python 用個 django 、 Ruby 弄個 rails ,都挺方便吧),再給它擼個好看的頁面(表現層多半也會用個 bootstrap 之類的,如果設計能力強一點的話就用一些更輕便的 helper frame 然后主要自己手寫;邏輯控制層高端一點弄個 backbone 甚至 angular 之類搞個重 AJAX 、帶前端模板及路由的新潮 HTML5 應用)。弄好以后上線,性能出問題了,看看日志 Google 一番調調參數,甚至多買一兩臺 VPS 來弄個負載均衡什么的。再要不,我們換成實體機,然后順便玩玩網絡和虛擬化什么的?

吐槽:表示基本中槍。看過我的博客之后,很多網友跟我說,你的技能好全能啊,從前端,然后服務器端腳本PHP/Python/Ruby,還有數據庫,Linux運維,Android什么都會。每次看到網友這么跟我說,我都會很不好意思……雖然看起來很全,但是基本都是拿不出手啊。或者說,我懂的技術剛剛夠建立與運營這個網站,不對,是因為建立這個網站我才去學習這些技術的……

看起來很全能了,但是問題是,這樣算不算 full stack 呢?

也許在一些小公司可以算是了(不過現在很多互聯網創業公司水平都很高,所以也不能完全看大小)。但在真正高水平的公司,以上的任何一點都達不到相應領域“工程師”的標準。

吐槽:“以上的任何一點都達不到相應領域“工程師”的標準”。這哥們戳中我的痛處了……

裝個系統調調參數甚至弄個簡單的負載均衡就叫運維了?你確定這不是網管?從幾臺機器到成百上千臺機器是有一個量變到質變的(雖然經過這個質變以后,對于運維工程師來說兩者就差別不大了),更別說弄個機房,搞個異地數據中心什么的。不說CCNP,CCNA總該有吧?再者,如果不說這么大(這么大了可能就涉及到“架構師”了),往小一點說,也有很多可深挖的:性能調優只是根據網上的文章隨便調調參數?我見過不少牛逼的 Web 運維都讀過 Apache 和 nginx 甚至部分 kernel 代碼。沒有自動化的監控程序和運維工具難道得死死守在機器前一遍遍地敲命令?合格的運維不但熟練使用已有的工具,還會根據需要自己寫腳本、工具,因為現實情況太復雜通用工具不一定適合。很多公司里,運維還要兼顧安全問題,那么又是一個大坑。備份、冗余、風控個個門道都很深。

吐槽:運維的話,我基本算是個網管級別的。技能羅列一下,無非就是會在服務器Linux上裝裝?PHP/Python/Ruby/Node.js 的運行環境,然后網站出問題了,簡單排查一下而已。

再說后端。會用 django 或者 RoR 寫點東西很厲害?這些本來都是 RAD 框架,就是拿來快速開發、快速上手的,降低了門檻。但不同的程序員編程功底和代碼質量還是會對最終成果造成很大影響。濫用 ORM 導致性能低下的例子我就不多說了。明明用了這樣的框架還能寫出帶有 SQL 注入的程序也不少見,有的甚至還存在邏輯安全漏洞,至于什么加鹽、防 CSRF 、 XSS 、 replay attack 、 session fix 、應用層 DoS 等等,多少人都是只聽說過名字知道個大概然后用一個“厲害”的框架就以為一勞永逸?不知道原理也沒看過框架代碼,不知道框架到底是怎么實現的、是否有一定局限……再說軟件工程方面。寫幾個測試數據就叫單元測試了?提前寫測試數據再開發就成 TDD 了?三天兩頭重構就叫敏捷了? QA 、版本控制、協作、文檔,都不是那么簡單的事吧。

吐槽:后端的話,我還稍微好點,畢竟我是程序出身的。PHP學得還比較深,前些年還特別看過一次PHP的內核,并將它們全部寫成博客,不信可以看看這個系列:PHP內核探索。Python的話,大概在應用級別吧,不是特別厲害,寫Web的話喜歡Tornado,也曾經研讀過Tornado的源碼:“Tornado源碼解析篇”導讀索引。還研讀過很多語言,框架的源碼,這里就不再列舉了,編程上我還是自認為勉勉強強算及格吧?但僅僅限于編程,后面提到的軟件工程方面的知識我就比較薄弱了。

然后說前端。 HTML/CSS 本來就是以方便表示內容和布局樣式而開發的,只是“會寫”應該不算什么難事吧?何況還有各種布局、排版庫。 JS 靈活得很,有一點 C 語法基礎的人學起來也很快,感謝 jQuery ,就算是不知道什么是閉包、不知道 JS 原型繼承等等的三腳貓功夫也能實現大多數需求了。那么這樣就是前端工程師?真是這樣的話為何前幾天知乎還有人問好的前端工程師為什么這么難找?能寫出在所有瀏覽器表現一致并且方便維護的樣式需要不少經驗積累和勤奮實踐,對瀏覽器渲染原理的了解也不可少。這還只是第一步,加上 JS 這玩意兒以后復雜度其實陡然上升了。在一個真正的大項目里,要保證各個組件正常運行不是一件容易的事, JS 本來就缺乏一些“軟件工程”特性,導致大型代碼組織不便,糟糕的 JS 程序很容易就污染了命名空間、搞錯了作用域、漏掉了異常、弄錯了類型、在異步和回調之中迷失……一不小心,就搞掛了頁面,調起來還麻煩(就算現在有了 Chrome )。這還沒算上性能、兼容性、安全等等問題呢。這也是為什么前端工具/技術特別多的原因之一。好的前端工程師不但緊跟技術前沿,還樂于知道這些牛逼的技術都是怎么實現的,然后靈活運用。

吐槽:前端的話,更不用說了……我前端很弱,僅僅會用HTML/CSS寫點自認還不算太丑的頁面而已,JavaScript呢,大概就是可以寫出自己想要的效果,效率什么的就不考慮那么多了。

可能有人會說人的精力有限, full stack 有了廣度自然要犧牲一下深度。那么我想說,再怎么犧牲深度,如果各領域都像上文舉的反例那樣,那肯定是不夠的。那樣可能只算是一個愛折騰的 geek 而不是工程師。我一個大二學生就能很好地完成開頭提到的情景,并且還可以再深一點(比方網絡方面有個差不多CCNA的水平和一些經驗, PHP 自認為還是比較扎實的= =,對于安全、性能優化、分布式等方面也有一些了解……),但我也只覺得自己大多數時候還只是“折騰”而已,還有太多不足和有待提高之處。事實上,上述任何一個領域中的真正的工程師都肯定能憑借自己的學習能力和極客精神輕松地在業余時間完成開頭所說的那個例子:看看 github 上那些有趣的個人開源項目和搭建起來的 demo 吧,大部分作者的本職應該都只是前端、后端或其他等等的其中之一。更不用說還有很多工程師的博客也是自己寫(我是指寫一個博客系統)、自己搭的。

吐槽:啊,原來我的水平大概就跟一個大二學生差不多啊?(驚恐……)我原來也只算是一個愛折騰的 geek?而不是工程師。幸好我的博客系統是自己寫的,這點還好還好……

full stack 一定是很難的。其實我自己作為一個互聯網領域的學徒,也面臨著這樣的困惑:我發現自己什么都會一點、什么都不算精(按照某些標準大概已經算是一個“full stack”了吧)。到底以后應該怎樣呢?是朝真正的 full stack 努力還是好好專精一個?看了不少招聘要求,現在就算是創業小團隊也很少會直接招 full stack 的,所以覺得大概是先做好一個性價比高一些?不知道題主為何想要成為一個 full stack 呢,是因為已經是某一領域的工程師想要做做其他方面么(這個也會影響到“怎樣成為”這個問題)?

不好意思,似乎跑題了。不要太浮躁,把全棧說得太過輕易。

吐槽:看來我離?full stack 還是路漫漫……

郭佳,http://douban.fm/?cid=1006168

全棧工程師不是為了工作本身,是為了方便實現自己的夢。作為一個標準的全棧工程師來答下,全棧工程師不是培養出來的,是逼出來的~不是公司逼的,是自己逼自己逼出來的~

因為我要創業,我經濟壓力又大沒法辭職,我沒法忽悠其他人一起免費干活......而且作為一個寫了13年程序的老程序員(貌似知乎上比我老的程序不會很多了。。。。),本來工作語言就已經用過 Delphi, C++,Java,Perl,PHP,Lua,ObjectiveC,NodeJS,Tcl。這些都是工作中用的哦,估計這樣的經歷就很難了。

之前創業三年,一開始就我一個技術,所以運維幾十臺Linux 服務器我也順便管了(我之前工作平時就工作在 Solaris 下面,差距不大),我老婆是前端工程師,所以 HTML,CSS,JS 我也一起學了。

所以多學一些語言對我來說真的不是件事情......

做過幾年游戲制作人(做制作人我也同時每天 寫代碼....),策劃,UI 都還有心得。而且我這十三年怎么過的呢?別人朝九晚五,我每天工作到半夜2點,周末也很少休息。

誰都能做到,并且不是一直專注于一個崗位,我相信都能成為全棧工程師。回到起點,全棧工程師不是為了工作本身,是為了方便實現自己的夢。

沒錯,如一些答主所說,你各方面都半吊子,我承認。我現在每天工作是寫 C++和 Lua。Lua 部分還好,C++要遍歷個 std::map 我到現在記不住,每次現搜索。作為一個 C++程序員我不夠好,只能算是入門,或者說我一直是重視實現功能而非鉆技術細節的人。我不關心技術上多牛,我關心功能的實現。C++反正我掌握的部分足以我寫 Cocos2d-x 了,反正公司安排的開發工作我都能完成。

沒錯,如果是這樣,作為一個 C++程序員的話,我依然對不起我的工資。

但我的價值根本不在于是一個 C++程序員,而是我可以從前端到后端到運維提供一攬子方案,視野廣闊,任何點都可以選擇最合適的技術,如果是創業,我可以自己一個人完成這個純應用層面難度的開發的全部工作。

如果不是創業,我的價值可能也就是個2w 多工資的架構師或者技術經理,這個價格遠遠對不起我這13年的付出。一個真正的全棧工程師,目標只有一個:創業。

吐槽:感謝郭佳……我也是為了追夢才被逼走上了full stack這條修羅之道的,你們甚至不知道,我為了要做自己心中的游戲,還自學3D建模/游戲編程/繪畫……但是發現是個深坑,而且時間/精力/金錢各方面原因暫時被擱置了。

Cat Chen,上知乎,求歡樂

既然原文是說,Facebook 工程師說 Facebook 只招 full stack engineer,那我就來說說 Facebook engineer 都是怎樣的人啦。

我覺得任何一方面的具體經驗都不重要,重要的是思維方式和學習能力。

首先說思維方式,那就是不為自己設限,不會想著自己是前端工程師,所以后端的東西我就一點也不碰。Facebook 的工程師,級別越高就需要保持越大的影響力。如何創造更大的影響力,就是尋找當前杠桿效應最明顯的問題來解決。有些問題你解決了的話,投入進去的時間每小時能換回來一千美元;有些問題你解決了的話,投入進去的時間每小時能換回來一百萬美元。然而哪些問題更值得解決,這是動態的,往往還存在衰減效應。如果現在性能瓶頸在后端,你做了一個季度兩個季度優化后,瓶頸就已經不在后端了,你再優化下去衰減效應就會越來越明顯。等瓶頸變成前端了,你是不是就說因為你不懂,所以不愿意碰?那就相當于寄望于公司有個前端很懂性能優化的人來解決,但如果公司沒有這樣的人那就沒有人來解決了。

Facebook 的眾多海報當中,有一張寫的是「任何一個 Facebook 的問題,都不是別人的問題」。有問題,你就需要去評估是否值得解決。如果值得解決,你就應該著手去解決,而不是假設公司內會有另外一個人比你更合適解決這個問題。這時候很可能你就需要去做你從來沒有做過的事情,需要學習你原本可能完全不懂的技術。如果你是個專門做數學模型的博士,加入 Facebook 原本是打算做搜索結果優化的,結果發現這不是最急需解決的問題,JavaScript 性能才是最需要解決的問題,你怎么辦?如果你以為 Facebook 需要的是你做數學模型的經驗,那你就錯了。Facebook 需要的是你完成博士學位的學習能力。你從來沒做過 JavaScript 并且覺得 JavaScript 很惡心?正確的做法是立即在網上買幾本 JavaScript 入門的書連夜看完,然后著手分析性能瓶頸并且解決。在你完成手動優化后,你還可以思考一下能否把這做成自動化,例如說在代碼提交時分析 JavaScript 語法樹并且指出可能成為性能瓶頸的地方,又或者說從用戶瀏覽器那里收集性能數據扔到 Hive 然后再從中分析產生瓶頸的特征。這些都可能涉及到一些你沒有做過也沒有學過的東西,但問題擺在那里你就需要去解決,而無論這要求你去鉆研什么。這就是我所說的學習能力。

這是高級工程師和初級工程師的主要差距。盡管在高級到初級這一維度上,美國工程師和中國工程師是有重疊的,但美國的教育體系和行業傳統使得美國應屆生比一般中國工程師更偏向于高級那一端。美國學生的優勢在于,他們的教育體系讓他們習慣面對開放性問題。一家公司萬千問題當中,此時此刻哪一個最值得解決?這不是中國工程師擅長的問題,因為實在是太開放了。中國教育讓人擅長在給定條件下解決問題,太開放反而不知道從何入手。此外因為絕大多數文獻都是英文的,所以要鉆研什么對于能讀懂英文的人來說都可以非常成體系的學習,這對于很多拒絕閱讀英文的中國工程師來說很不利。拒絕閱讀英文意味著永遠只能接受別人的二手資料,對于很多概念的理解只能停留在技師的層面,而無法上升到工程師或者科學家的層面。

吐槽:“任何一個 Facebook 的問題,都不是別人的問題”,說得很好。任何我遇到的問題,都不是別人的問題,我要努力嘗試自己去解決它們。

小結

FSD 即 full stack developer,正如 Cat Chen 說的,努力著手解決眼前的問題,就會走上 FSD 的路上。我剛畢業那會第一份工作是從事 Java,后來打算建立我自己的網站,于是自學 PHP,還有 HTML/CSS/JavaScript 。如果你看到我的舊博客,你會發現上面一大堆入門級別的技術博文,那就是我自學時留下的足跡。后來隨著興趣什么的,JQuery/Ajax/Flex等各種衍生技術,Python/Ruby/Node.js等各種腳本語言,Linux運維,還有各種開源項目都慢慢開始涉獵,這些都是我在通過建設“簡明現代魔法”這個網站的過程中獲得的技能。所以,如何成為一個FSD?有個好辦法,那就是 —— 自己去做一個網站,并維護它。

而且成為了 FSD 有一個巨大的好處,那就是成為了 FSD 那就意味著你具備了單人創業的能力

有些網友很吃驚,甚至質疑,你的網站真的是你一個人做的么?真是我一個人做的……我很珍視我的這個小站,也花了同齡人無法想象的時間去建設與維護這個網站。我是把它當作一個創業項目去做的。

以一個正常人的精力和學習速度來說,想在 full stack 的每一個層面都達到頂級的精通顯然是很困難的事情。但是我覺得,做到這么一點,就足夠了:

a genuine interest in all software technology. (對所有的軟件技術抱有一種真摯的興趣)

正如本博客的副標題所說的:成功,唯有積累,沒有奇跡。要成為 FSD,也是沒有捷徑,靠的是吃苦和經驗積累。

本文地址:http://www.zqhthc.tw/librarys/veda/detail/2583,歡迎訪問原出處。

不打個分嗎?

轉載隨意,但請帶上本文地址:

http://www.zqhthc.tw/librarys/veda/detail/2583

如果你認為這篇文章值得更多人閱讀,歡迎使用下面的分享功能。
小提示:您可以按快捷鍵 Ctrl + D,或點此 加入收藏

大家都在看

閱讀一百本計算機著作吧,少年

很多人覺得自己技術進步很慢,學習效率低,我覺得一個重要原因是看的書少了。多少是多呢?起碼得看3、4、5、6米吧。給個具體的數量,那就100本書吧。很多人知識結構不好而且不系統,因為在特定領域有一個足夠量的知識量+足夠良好的知識結構,系統化以后就足以應對大量未曾遇到過的問題。

奉勸自學者:構建特定領域的知識結構體系的路徑中再也沒有比學習該專業的專業課程更好的了。如果我的知識結構體系足以囊括面試官的大部分甚至吞并他的知識結構體系的話,讀到他言語中的一個詞我們就已經知道他要表達什么,我們可以讓他坐“上位”畢竟他是面試官,但是在知識結構體系以及心理上我們就居高臨下。

所以,閱讀一百本計算機著作吧,少年!

《浪潮之巔》 吳軍 (作者)

近一百多年來,總有一些公司很幸運地、有意識或無意識地站在技術革命的浪尖之上。在長達十年甚至幾十年的時間里,它們代表著科技的浪潮,直到下一波浪潮的來臨。從19世紀末算起,AT&T公司、IBM公司、蘋果公司、英特爾公司、微軟公司、思科公司、雅虎公司和Google公司都先后被幸運地推到了浪尖。雖然,它們來自不同的領域,中間有些已經衰落或正在衰落,但是它們都極度輝煌過。吳軍的這本《浪潮之巔》系統地介紹了這些公司成功的本質原因及科技工業一百多年的發展。在這些公司興衰的背后,有著它必然的規律。《浪潮之巔》不僅講述科技工業的歷史,更重在揭示它的規律性。

更多計算機寶庫...

英超直播吻球网