許多“有抱負(fù)”或者熱愛編程的程序員,對全棧工程師可能都是孜孜以求鲤屡。全棧是一種極客精神损痰,對軟件的每一種編程語言、每一個(gè)開發(fā)平臺都有著濃厚的興趣酒来,并愿意為之付出努力卢未,全棧工程師應(yīng)該對軟件各個(gè)方面都有廣泛的接觸面,對軟件有深刻的洞察力,這種廣而深的見識將讓我們開發(fā)出更加高效率地開發(fā)應(yīng)用辽社。
我們周遭的人對全棧的描述往往是“我熟悉C/C++伟墙,java;swift滴铅,Ruby都會一點(diǎn)戳葵,還能開發(fā)IOS、Android汉匙、Windows應(yīng)用拱烁,Web前端后端都做過。用過這些框架:……”
是的戏自,在沒有接觸ThoughtWorks之前,我對全棧的定義就是這樣的伤锚,什么語言都“會”擅笔,至少寫過,各個(gè)平臺上的開發(fā)都有經(jīng)驗(yàn)屯援。在這種定義下猛们,我會略自負(fù)地講自己算是一個(gè)全棧工程師吧。甚至狞洋,哈哈阅懦,除了上面講的這些,我還開發(fā)過硬件平臺上的軟件(Arduino)徘铝,自己用PS為自己的Android客戶端設(shè)計(jì)過界面耳胎、圖標(biāo),鼓搗過圖標(biāo)字體惕它。是呀怕午,想想這就驕傲,突然發(fā)現(xiàn)自己會那么東西淹魄。(當(dāng)然了郁惜,理性地講,其實(shí)自己心知肚明也就是“會一點(diǎn)”甲锡。)
竊認(rèn)為我本人是一個(gè)對生活比較有想法的人兆蕉,當(dāng)我發(fā)現(xiàn)生活中有一些可以用軟件來解決問題的時(shí)候,我喜歡自己開發(fā)出軟件來解決:比如 我曾因?yàn)榭吹酱髮W(xué)請假不方便缤沦,然后開發(fā)出給學(xué)生虎韵、輔導(dǎo)員、任課老師使用的請假APP缸废,這個(gè)最后作為我Android開發(fā)實(shí)踐課的大作業(yè)作品包蓝,老師打了100分驶社;由于學(xué)校會經(jīng)常讓學(xué)生簽到,我和幾個(gè)同學(xué)利用微信公眾號首先讓學(xué)生在微信上簽到并且獲取他們的地理位置测萎;由于在火車上無聊亡电,我和幾個(gè)同學(xué)做出一個(gè)在火車上搭建局域網(wǎng)然后借助我們的系統(tǒng)讓乘客在火車上點(diǎn)餐、看電影硅瞧、看火車沿途風(fēng)景直播份乒、到站提醒的應(yīng)用……。在這個(gè)過程中腕唧,我得到很大的滿足感和成就感或辖,也學(xué)會了更多的軟件技術(shù),似乎離“全椝奈”更近了一步。
產(chǎn)品不僅是有想法就去干方咆,而是持之以恒的打磨月腋,它許多軟件開發(fā)的多個(gè)角色地合力完成
暑假在騰訊實(shí)習(xí)的兩個(gè)月,學(xué)習(xí)到的技術(shù)實(shí)際上是其次的瓣赂;甚至因?yàn)閷?shí)習(xí)顛覆了之前對BAT神一樣存在的看法榆骚。他們的代碼質(zhì)量的確很高,但是并不是不食人間煙火煌集,他們也會寫Hard code妓肢,也會滿百度、谷歌地貼代碼苫纤。實(shí)習(xí)中讓我看到的更多的是碉钠,一個(gè)好的互聯(lián)網(wǎng)企業(yè)善于讓多個(gè)角色之間進(jìn)行良好的互動,它有一個(gè)成熟地為開發(fā)代碼而做的系統(tǒng)卷拘;與我們在學(xué)校里不同的是喊废,一個(gè)來自與產(chǎn)品和測試的需求、Bug工單流傳到開發(fā)有一個(gè)完善嚴(yán)格的流程栗弟。
我做過的許多東西污筷,實(shí)際很多都沒有投入使用,僅僅是自己的自娛自樂乍赫,一個(gè)軟件產(chǎn)品真正投入大規(guī)模使用瓣蛀,需要大量人力去做產(chǎn)品、運(yùn)營雷厂。然后惋增,我熱愛開發(fā),但是覺得產(chǎn)品改鲫、運(yùn)營是個(gè)麻煩事器腋。
入坑越久,你以為越淵博,實(shí)際上不自知視野變小了
校招纫塌,加入了我一個(gè)很喜歡的公司:ThoughtWorks(TW)诊县,TW是一個(gè)崇尚分享的公司,她期望我們把我們自己的想法用文章的形式表達(dá)出來措左。在周末時(shí)間依痊,公司安排了職前培訓(xùn),其中有一項(xiàng)任務(wù)是讓我們在簡書上寫我們的學(xué)習(xí)過程怎披、分享心得感受胸嘁。同時(shí)公司的培訓(xùn)團(tuán)隊(duì)(“思沃大講堂”)還會定期統(tǒng)計(jì)我們的文章,統(tǒng)計(jì)方式是做了一個(gè)爬蟲抓取簡書上的文章信息然后匯總輸出報(bào)告凉逛。
當(dāng)時(shí)性宏,我正在學(xué)習(xí)Ruby網(wǎng)絡(luò)請求的知識,看見每周一次發(fā)來的文章統(tǒng)計(jì)報(bào)告状飞,我就萌生了做一個(gè)Ruby爬蟲的想法毫胜。做出來以后我輸出了一篇文章到簡書,負(fù)責(zé)TW培訓(xùn)的李鵬大哥(下稱“總理”)看到以后诬辈,便決定讓我的代碼來做幫助同學(xué)們統(tǒng)計(jì)文章的工作酵使,之后讓我專門成立了一個(gè)小團(tuán)隊(duì):思沃大講堂爬蟲項(xiàng)目組
我最初想成立這個(gè)項(xiàng)目組的目的,幫我們統(tǒng)計(jì)文章只是其一焙糟,更重要的是我想通過這個(gè)項(xiàng)目帶動自己的Ruby學(xué)習(xí)進(jìn)程口渔。而總理的目的則是,希望學(xué)習(xí)項(xiàng)目開發(fā)的過程穿撮,讓更多的人參與缺脉、合作。
到今天悦穿,幾個(gè)月過去了枪向,雖然爬蟲組雖然基本能定期給參加思沃大講堂的同學(xué)們發(fā)送一份統(tǒng)計(jì)報(bào)告,但是遠(yuǎn)遠(yuǎn)沒有達(dá)到初衷咧党。個(gè)人的出發(fā)點(diǎn)秘蛔,本來想把報(bào)告做的更漂亮一點(diǎn),頁面中加入一些圖片傍衡、報(bào)表等直觀的視覺效果深员,加入文章排行提高同學(xué)們的活躍度,通過簡單的算法實(shí)現(xiàn)好文章蛙埂、優(yōu)秀作者的推薦倦畅,找出最貼心的小buddy等等。從這些我想達(dá)到的初衷講绣的,這個(gè)項(xiàng)目顯然失敗了叠赐,而失敗的原因欲账,也正是總理 想要我們通過這一項(xiàng)目培養(yǎng)的項(xiàng)目開發(fā)、交流合作等方面的能力不足芭概。
這個(gè)項(xiàng)目中赛不,作為項(xiàng)目發(fā)起人,我最早為項(xiàng)目勾畫了一個(gè)藍(lán)圖罢洲,搭建起項(xiàng)目的框架踢故。一個(gè)在自己看起來很簡單的一個(gè)需求點(diǎn),對于自己看來實(shí)現(xiàn)起來也十分簡單惹苗,但是傳達(dá)給項(xiàng)目成員并實(shí)施卻十分困難殿较;首先,對于項(xiàng)目發(fā)起人桩蓉,可能會根據(jù)自己的一些經(jīng)驗(yàn)提出一些需求點(diǎn)淋纲,雖然這些需求在提出時(shí)就經(jīng)過自己的大腦過濾是可實(shí)現(xiàn)的,但是對于沒有相關(guān)經(jīng)驗(yàn)的其它團(tuán)隊(duì)成員來說院究,他們認(rèn)為的可不一定有那么簡單洽瞬。作為作為軟件工程科班出身的學(xué)生,在我們“稚嫩”的認(rèn)識中儡首,軟件的世界里似乎只有程序員這一個(gè)角色片任,當(dāng)然“只有”這個(gè)詞說的太偏執(zhí)偏友,誠然我還知道產(chǎn)品蔬胯、測試、運(yùn)營位他、運(yùn)維等角色氛濒,但是長期囿于學(xué)校里小型項(xiàng)目的學(xué)生,往往長期忽略了產(chǎn)品甚至測試的重要性鹅髓,產(chǎn)品舞竿,提需求的是我們;測試窿冯,我們寫代碼的自己測骗奖,不重要的地方就省掉吧;運(yùn)維醒串,隨便搭個(gè)服務(wù)器唄执桌。我們把軟件開發(fā)的絕大部分重心放在開發(fā)上面,做軟件就是開發(fā)芜赌,這一意識的植入仰挣,將會導(dǎo)致深重的開發(fā)本位思想,或者做事情的都站在開發(fā)的角度缠沈。比如作為一個(gè)項(xiàng)目發(fā)起人膘壶,我負(fù)責(zé)這個(gè)項(xiàng)目要實(shí)現(xiàn)什么樣的功能错蝴,帶著開發(fā)思維,是這樣提“工單”的:
實(shí)現(xiàn)數(shù)據(jù)庫中插入和更新文章信息(封裝成一個(gè)方法)颓芭,用于以后在爬蟲抓取文章信息后直接調(diào)用
甚至我還會寫明大家使用Sqlite3數(shù)據(jù)庫顷锰。這樣的工單開發(fā)思維就比較重了,作為項(xiàng)目發(fā)起人畜伐、作為產(chǎn)品馍惹、作為BA(業(yè)務(wù)分析),這樣的單子就嚴(yán)重越權(quán)了玛界,我們的職責(zé)應(yīng)該是作為一個(gè)角色万矾,要達(dá)到什么效果,這樣做有什么價(jià)值(As a role慎框,I want to …, so that …)良狈,具體怎么做應(yīng)該交給開發(fā),而不是用什么技術(shù)都要規(guī)劃好笨枯。當(dāng)總理指出我的錯(cuò)誤薪丁,我卻依舊帶著“開發(fā)”的思維來規(guī)劃項(xiàng)目時(shí),我想我“入坑”依舊了馅精。
或許严嗜,對于一個(gè)個(gè)人項(xiàng)目,我們可能有非常清晰的意圖知道自己接下來做什么洲敢,然而漫玄,做一個(gè)較大的項(xiàng)目始終依托團(tuán)隊(duì)來完成,作為“世界上最復(fù)雜的邏輯實(shí)體”压彭,軟件是越來越難被一個(gè)人完成的睦优。
我所看到“市面”上的“軟件工程師”,坦誠地講壮不,往往等同于“碼農(nóng)”汗盘,或者通俗地講就是“寫代碼的”。寫代碼询一,碼農(nóng)隐孽,從“軟件工程”的學(xué)科定義來講,并不能算的上是軟件工程師的健蕊,更談不上全棧軟件工程師菱阵。作為一名“科班出身”的“軟件工程”專業(yè)的學(xué)生,教科書上的定義翻譯成通俗點(diǎn)的話是這樣的:用工程化的方法來開發(fā)軟件绊诲。
而我想送粱,作為工程,應(yīng)該是怎樣規(guī)劃“施工”掂之,怎樣管理團(tuán)隊(duì)抗俄,怎樣讓工程更加高效脆丁、有序地進(jìn)行,而這正是軟件工程師區(qū)別于“寫代碼的”之本質(zhì)所在动雹。而全棧槽卫,也不僅僅是局限于開發(fā)技術(shù)上的全棧,而是包括業(yè)務(wù)分析胰蝠、項(xiàng)目管理等等軟件工程應(yīng)用上的全棧歼培。