萬字長(zhǎng)文!資深大牛談?dòng)螒虺绦騿T的個(gè)人修煉
程序員成長(zhǎng)有很多外因,好的時(shí)機(jī)、好的公司、好的同事,會(huì)讓你的成長(zhǎng)更順利。
這次我們聊聊剛?cè)胄械某鯇W(xué)者該怎么提升自己,用個(gè)流行的說法,咱們來談點(diǎn)觀念,理清概念,才能更好地成長(zhǎng)。
適合初學(xué)者的幾點(diǎn)提升要訣
提高業(yè)務(wù)能力
對(duì)初學(xué)者,入行后最重要的肯定是抓緊提高自己的業(yè)務(wù)能力。對(duì)校招渠道入職的新員工,公司的期望一般不高,能干活,有潛力即可。
新員工的***要?jiǎng)?wù),當(dāng)然是要迅速上手。在一個(gè)中小項(xiàng)目里,上手一般不是太大的難題。
我們看看 UI 開發(fā)的例子。初學(xué)者的***份工作,經(jīng)常會(huì)是簡(jiǎn)單的邏輯、菜單、UI 等等。
它們共同的特點(diǎn)是不難但很繁瑣,一般只要照著前人的工作,依樣畫葫蘆,就能做得八九不離十。
在這個(gè)過程中,新人可以很好鍛煉自己在軟件工程方面的實(shí)踐,學(xué)習(xí)如何同團(tuán)隊(duì)成員配合;如何和跨領(lǐng)域的策劃美術(shù)交流,盡快熟悉游戲的設(shè)計(jì)、開發(fā)、構(gòu)建、測(cè)試等流程。如果項(xiàng)目快上線了,那還能順便鍛煉身體,加班熬夜。
關(guān)于做 UI 和邏輯,初學(xué)者常常抱怨,沒有技術(shù)深度,不出彩,但特別繁瑣,做起來很累。屬于做好了沒功勞,做砸了要背鍋,摧殘人性,讓人痛不欲生。
這也是一個(gè)老生常談,簡(jiǎn)單的工作也需要有人做,如果有心,在 UI 開發(fā)里面也可以找到個(gè)人的積累和發(fā)展,有幾個(gè)事情不妨嘗試一下:
提高自己的效率
做得更好、更快、更少 Bug。有了效率,就能提高質(zhì)量。以前見過新的同事,學(xué)有余力,做一個(gè)功能,往往會(huì)自己發(fā)揮,做兩三個(gè)不同版本讓 Leader 挑選,這樣的同學(xué)很快就能脫穎而出。
提高程序團(tuán)隊(duì)的效率
看看 UI 從設(shè)計(jì)、開發(fā)到驗(yàn)收,有什么流程可以改進(jìn),提高功能開發(fā)效率。Leader 或者其他 Senior 程序員往往有其他領(lǐng)域要關(guān)心,沒精力關(guān)心這一塊。
讓領(lǐng)導(dǎo)放心不就是我們職場(chǎng)應(yīng)盡的義務(wù)么,在這個(gè)子領(lǐng)域,初學(xué)者也有機(jī)會(huì)發(fā)揮的。
或者你也可以看看是不是能做通用控件,讓整個(gè) UI 團(tuán)隊(duì)效率更高。通用控件由于要考慮方方面面的需求,開發(fā)有一定的難度,能很好地提高個(gè)人的能力。
提高項(xiàng)目整體效率
UI 和邏輯上更多應(yīng)用數(shù)據(jù)驅(qū)動(dòng),合理架構(gòu),減少硬編碼,把一部分UI編碼工作變成配置工作,開放給策劃,既減少了工作量,策劃也會(huì)覺得更靈活。
分開邏輯和表現(xiàn)代碼,便于調(diào)整功能,也方便寫單元測(cè)試。做點(diǎn)力所能及的重構(gòu),關(guān)注一下 UI 的內(nèi)存和性能,別給整個(gè)項(xiàng)目增加不必要的風(fēng)險(xiǎn),這都是可以嘗試的。
無論在什么職業(yè)中,業(yè)務(wù)能力總是最重要的。有了業(yè)務(wù)能力,才能贏得大家的尊重。即使***份工作內(nèi)容并沒那么有深度,也要認(rèn)真做好它,從中學(xué)習(xí),快速成長(zhǎng)。
持續(xù)學(xué)習(xí),找到 Unbroken Time
本職工作做好之后,千萬別滿足。我想聊的下一個(gè)話題,就是關(guān)于持續(xù)學(xué)習(xí)。
程序員族群,早就身處在一個(gè)終身學(xué)習(xí)的時(shí)代,入行就是焦慮的開始,持續(xù)的學(xué)習(xí),不能保證百尺竿頭,但至少能回避逆水行舟的惶恐。
雖說程序員都在學(xué)習(xí),學(xué)習(xí)的質(zhì)量差別還是比較大的。相當(dāng)多的程序員并沒有良好的學(xué)習(xí)習(xí)慣,忽略了提前儲(chǔ)備知識(shí)的過程,只是被動(dòng)的學(xué)習(xí)如何解決迫在眉睫的問題,掌握明天上班要用的技能。
學(xué)習(xí)和積累的主題以后單獨(dú)展開,這里只說一個(gè)小習(xí)慣,也是個(gè)人效率里一個(gè)很重要的概念,找到你的不被打斷的時(shí)間。
程序相關(guān)知識(shí)往往燒腦,沒有沉下心,便不能理解。一整段不被打擾的時(shí)間,是必須的。
但碎片化的時(shí)代,整段時(shí)間早被手機(jī)的滾滾洪流碾得粉碎,大家前仆后繼,把完整時(shí)間碎片化,刷刷朋友圈,回個(gè)微信,收個(gè)郵件,一個(gè)小時(shí)就過去了。
我們要做的,是盡量給自己創(chuàng)造條件,空出不受打擾的時(shí)間,用個(gè)人的意志抵制碎片化。
我工作早年使用的是公交車等座位大法。反向坐公交車到終點(diǎn)站,排個(gè)座位,上車,拿本書慢慢看。
那年代心還很靜,手機(jī)還被叫做大哥大,沒什么車上娛樂??炜旆^看得懂的頁(yè),看不懂的低頭想想,每個(gè)工作日有那么一個(gè)小時(shí)可以靜心閱讀,不知不覺幾年間啃掉了很多艱澀難懂的大部頭。
后來開車上下班就悲劇了,嘗試了各種方法,但還是沒法專心閱讀,車上的時(shí)間只能聽聽 Podcast。
要深度學(xué)習(xí),要省出不被打擾的時(shí)間。實(shí)踐下來最有效的還是早到公司法。早上提前 30 分鐘從家出發(fā),路上車沒那么堵,往往還可以省出 15 分鐘路上的時(shí)間。
到了公司也很清靜,千萬不要收郵件,也別去倒茶,要警惕碎片化陷阱。趕緊拿上要看的書,離開你的電腦,離開你的手機(jī),去會(huì)議室學(xué)習(xí)。
另一些能用的方法包括早起法,晚睡法,打出租車上下班法,一個(gè)人去很貴很清靜的館子吃飯法等等,大家可以自行發(fā)揮。
有了完整的不被打擾的時(shí)間,可以深度儲(chǔ)備業(yè)務(wù)知識(shí),可以橫向掃描行業(yè)進(jìn)展,可以回顧工作得失,可以總結(jié)輸出知識(shí)。
雖然每天幾十分鐘不起眼,但如果能堅(jiān)持幾年的話,你一定能看見自己的成長(zhǎng)。
信息樞紐(Info Hub)
下一個(gè)對(duì)我很有幫助的觀念,是需要努力成為團(tuán)隊(duì)中信息的樞紐。
信息樞紐是我的一個(gè)生造的概念,靈感來源于 HUB(集線器)。網(wǎng)絡(luò)中的集線器,匯集了所有的信息,再?gòu)V播給其他設(shè)備。
對(duì)我們信息從業(yè)人員來說,你做好了本職業(yè)務(wù),積累了廣泛的跨領(lǐng)域知識(shí)后,應(yīng)該考慮如何逐漸讓自己變成團(tuán)隊(duì)內(nèi)開發(fā)知識(shí)溝通的中心,讓自己在團(tuán)隊(duì)中更不可替代。
回到我的個(gè)人經(jīng)歷,我在 2001 年作為公司前幾批開發(fā)人員,接觸 Unreal2 引擎。
當(dāng)時(shí)的項(xiàng)目使用 Unreal2,我做邏輯,做網(wǎng)絡(luò)對(duì)戰(zhàn),有了持續(xù)的積累后,我很快在 Unreal 的邏輯開發(fā)上積累了豐富經(jīng)驗(yàn)。
雖然在整體開發(fā)經(jīng)驗(yàn)方面我還是比不上其他開發(fā)者,但在 Unreal 邏輯這一塊我比較專業(yè)。
我在公司內(nèi)做了一些相關(guān)知識(shí)的分享,然后在后續(xù)的項(xiàng)目里面堅(jiān)持到處看看,幫助其他同事 Debug ,或者介紹相關(guān)的模塊,讓他們也能快速上手。
逐漸的,我發(fā)現(xiàn)了一些有趣的變化。很多同事碰到這個(gè)領(lǐng)域的知識(shí),有問題都會(huì)先來咨詢我。當(dāng)然這些問題我也并不是全部能回答的,我擇其易者答之,其不易者學(xué)之。
因?yàn)槭诸^工作也很多,對(duì)那些不了解的問題,我通常會(huì)說讓我研究一下,抽點(diǎn)時(shí)間看看能不能解決,然后再回復(fù)同事。幫助大家次數(shù)多了,我就自然成為了 Info Hub。
成為信息樞紐以后,對(duì)團(tuán)隊(duì)的好處顯而易見,你潤(rùn)滑了團(tuán)隊(duì),順暢了知識(shí)通路,自身價(jià)值變得更重要。對(duì)個(gè)人的好處不那么明顯,卻更重要。
各類信息在你這里集結(jié),回答已知問題可以鞏固你的知識(shí),研究未知問題可以擴(kuò)展你的邊界,信息在你身邊流過,自然可以滋潤(rùn)你的認(rèn)知。變成更好的自己,不就是我們一直的追求?
當(dāng)然,成為 Info Hub 并不容易,需要個(gè)人努力,也需要一些機(jī)緣巧合。新項(xiàng)目、新技術(shù)的早期拓荒者,很有可能成為信息樞紐。
但新項(xiàng)目和技術(shù)有一定的風(fēng)險(xiǎn),不是新的就是好的,新方向會(huì)失敗,會(huì)毀了你統(tǒng)治信息的野望。
于我而言,在 2001 年這個(gè)節(jié)點(diǎn),Unreal 也許就是一個(gè)新方向,在 2001 年后的八年里,熟悉 Unreal 給我?guī)砹司薮蟮幕貓?bào),甚至很多影響點(diǎn)點(diǎn)滴滴影響了開發(fā)自己引擎。
如果運(yùn)氣并不那么好,研究了沒落的技術(shù),參與了失敗的項(xiàng)目怎么辦?事情沒有你想象的那么糟糕。
沒落的技術(shù),即將無人問津,但它是細(xì)分領(lǐng)域的知識(shí),領(lǐng)域越窄,越少人懂,越方便你成為專家。
總結(jié)一下這個(gè)技術(shù)為什么失敗,橫向?qū)Ρ纫幌缕渌晒夹g(shù),談?wù)勞厔?shì),都能讓你自己提高。
至于失敗的項(xiàng)目,就更無所謂。項(xiàng)目的失敗,意味著公司或者團(tuán)隊(duì)損失了機(jī)會(huì)成本,但項(xiàng)目中的每一個(gè)人,確確實(shí)實(shí)得到了成長(zhǎng),吃一塹就能長(zhǎng)一智。
時(shí)??偨Y(jié),在失敗中找到自己的成長(zhǎng),才是我們要關(guān)注的。
我剛開始用 Unreal,***個(gè)項(xiàng)目是被公司砍掉的,也沒有任何人有把握說,Unreal 將來能得到巨大的應(yīng)用,但積累在那里,說不定哪天會(huì)給你帶來豐厚的回報(bào)。
再來談一個(gè)對(duì)初學(xué)者成長(zhǎng)有幫助的概念。
跨界和好奇
如果讓我總結(jié)怎么讓自己變得更有價(jià)值,跨界無疑是一個(gè)非常重要的關(guān)鍵字。
所謂的跨界,是指擁有多個(gè)和本專業(yè)不同領(lǐng)域的開發(fā)知識(shí),并可以靈活運(yùn)用在開發(fā)過程中。
當(dāng)你有了跨界的能力,就可以在開發(fā)和交流中,利用跨領(lǐng)域的知識(shí),幫助團(tuán)隊(duì)更好的溝通、設(shè)計(jì)、實(shí)現(xiàn)功能。
跨界的意義有幾個(gè),重要性依次遞增,增加溝通效率,提升產(chǎn)品質(zhì)量,超越已有認(rèn)知。我們分別展開討論。
增加溝通效率是最容易理解的,游戲開發(fā)需要多工種合作,大家說著不一樣的行話,做著不一樣的工作。工種和工種之間,有壁壘,阻礙了交流。
擁有跨界的知識(shí),邏輯程序員了解一點(diǎn)關(guān)卡策劃的工作,渲染程序員懂一點(diǎn)技術(shù)美術(shù)的工具,引擎程序員接手一下工具程序員的模塊。
這些跨界的認(rèn)知,都能很好提高團(tuán)隊(duì)溝通效率,幫助不同職能同事更快的達(dá)成共識(shí)。
擁有足夠的跨界知識(shí),溝通會(huì)更精準(zhǔn),也不用經(jīng)常拉上其他同事一起討論問題,減少溝通環(huán)節(jié),降低溝通中的失真,就順理成章了。
人和人的信任,本就是從工作的合作細(xì)節(jié)開始,你會(huì)發(fā)現(xiàn)那些擁有跨界知識(shí)的同事,不知不覺間,就成了項(xiàng)目中心,加薪升職贏取白富美,從此過上了幸福的生活。
提升產(chǎn)品質(zhì)量是下一個(gè)水到渠成的事情,當(dāng)擁有了別的領(lǐng)域的知識(shí),我們?cè)谠O(shè)計(jì)和實(shí)現(xiàn)功能的時(shí)候,就可以考慮到用戶的需求,把手頭的工作做到更好。
舉個(gè)簡(jiǎn)單例子說明一下。比如開發(fā)編輯器時(shí),很常見的一個(gè)需求,就是編輯參數(shù)的界面。
比如我們要調(diào)整一個(gè)游戲內(nèi)物件的參數(shù),最常見的做法,就是選中這個(gè)對(duì)象,彈出屬性表單,可以調(diào)整參數(shù)。
這個(gè)功能所有引擎都有,一般的實(shí)現(xiàn)方式是在引擎內(nèi)表示對(duì)象參數(shù)的時(shí)候,對(duì)每一個(gè)參數(shù)有元信息描述,表示參數(shù)的類型、編輯方式、取值范圍等等。
屬性表單彈出后只需要遍歷這個(gè)對(duì)象的參數(shù)元信息,然后為每個(gè)可調(diào)整參數(shù)創(chuàng)建顯示和編輯的控件即可。
有了基礎(chǔ)功能,下一個(gè)訴求,是一個(gè)對(duì)象會(huì)有非常多的參數(shù),不是所有參數(shù)都需要暴露給編輯器編輯,全部暴露出來反而降低開發(fā)效率,容易誤操作。
所以多數(shù)引擎一般在參數(shù)元信息加上標(biāo)志,需要暴露的參數(shù),才會(huì)被編輯器顯示在屬性表單內(nèi)。
到目前為止一切都還好。但策劃又提出新要求,同一個(gè)對(duì)象,在另一個(gè)特殊的編輯界面,也要調(diào)整參數(shù),這次需要顯示的參數(shù),和普通界面需要暴露的參數(shù)不一樣。
這個(gè)需求的本質(zhì),就是針對(duì)同一套數(shù)據(jù) Model,定義多個(gè)不同的 View。如果按照原有的元信息系統(tǒng)發(fā)展下去,我們要加上新的參數(shù)標(biāo)志,讓這些參數(shù)開放給另一個(gè) View。
當(dāng) View 變多的時(shí)候,整個(gè)設(shè)計(jì)就會(huì)比較臃腫,每多一個(gè)不同的 View,就需要修改 Model 的元信息,這個(gè)路徑有點(diǎn)長(zhǎng),會(huì)動(dòng)到已有的結(jié)構(gòu)。
這個(gè)思路有點(diǎn)不對(duì),為什么不同的 View,需要?jiǎng)拥綌?shù)據(jù)的 Model 呢?不同 View 的復(fù)雜性,就應(yīng)該放在 View 里面啊。
當(dāng)工具程序員設(shè)計(jì)參數(shù)元信息和屬性表單的時(shí)候,如果能提前想到策劃可能有這樣的需求,那么設(shè)計(jì)角度就可以做點(diǎn)調(diào)整。不必通過在元信息上打標(biāo)記,而是搜索的方式。
比如我們 Mac 電腦上的 Finder,它有智能文件夾,本質(zhì)上就是一個(gè)組合的 Filter,用 Search 來進(jìn)行文件的篩選,不同的搜索,保存成智能文件夾,就可以快速便捷的歸類文件。
同樣,對(duì)我們的屬性表單,我們也可以使用正則表達(dá)式來進(jìn)行屬性的篩選。這樣針對(duì)不同的 View,只需要定義不同的過濾表達(dá)式就可以了。
正則表達(dá)式還可以數(shù)據(jù)驅(qū)動(dòng),策劃要什么參數(shù)就改改配置文件就好了。正則表達(dá)式來定義 View 的內(nèi)容,既強(qiáng)大,也精準(zhǔn)。
所以當(dāng)你擁有了跨界的知識(shí),了解用戶的需求,了解其他領(lǐng)域的巧妙設(shè)計(jì),就有可能設(shè)計(jì)出更好的系統(tǒng)。
超越已有認(rèn)知是跨界更重要的好處,可以做出不同的設(shè)計(jì),或更精簡(jiǎn),或更高效,或更突破,或兼而有之。
舉幾個(gè)例子:
- 尋路問題是個(gè)搜索問題,可以用來計(jì)算最短路徑,那我就可以用它來計(jì)算聲音在室內(nèi)的傳播了。
- 序列化不僅僅可以用在保存上,也可以用來做垃圾回收的標(biāo)記,做文本數(shù)據(jù)和配置文件的打包和二進(jìn)制化,做數(shù)據(jù)文件的壓縮和加密,做項(xiàng)目廢舊資源的標(biāo)記和刪除。
- 誰說我們一定要在同一個(gè)進(jìn)程里讀寫數(shù)據(jù),為什么不在另一個(gè)進(jìn)程里面統(tǒng)一讀寫數(shù)據(jù),便于多開游戲進(jìn)程可以共享讀取的Cache,也可以對(duì)并發(fā)的讀取進(jìn)行重新排序,降低磁盤尋道開銷。
既然跨界知識(shí)如此重要,如何來培養(yǎng)自己的跨界能力呢?我給的答案是好奇心,對(duì)技術(shù)有好奇,多看多問,多想多總結(jié),自然就跨界了。
初學(xué)者最重要的品質(zhì)就是好奇心,幫助你探索未知的邊緣。游戲開發(fā)的客戶端技術(shù),業(yè)務(wù)領(lǐng)域眾多,我們簡(jiǎn)單細(xì)分一下,就可以分出邏輯、UI、工具、渲染、引擎、物理、音頻、動(dòng)畫、AI、構(gòu)建等等領(lǐng)域。
相當(dāng)多的方向,既廣又深。再考慮到和周邊業(yè)務(wù)團(tuán)隊(duì)接口,還需要對(duì)后臺(tái)技術(shù)、美術(shù)技術(shù)、策劃領(lǐng)域有一定的了解。
對(duì)技術(shù)的好奇,可以幫助你加速跨越崗位之間的邊界。試著放縱一下自己的好奇,完成本職工作之余,向?qū)γ娴墓ぷ鲀?nèi)容張望幾眼。多看看,就懂了。
我從業(yè)最初工作內(nèi)容是 UI 邏輯,逐漸做了 Unreal 引擎上的開發(fā),先寫腳本和邏輯,然后支持關(guān)卡策劃做邏輯相關(guān)開發(fā),工作之余,游戲 Crash 時(shí)候,就順便往腳本解釋器里面搗鼓搗鼓,Debug 一下腳本編譯器和解釋器。
引擎程序員和邏輯程序員之間并沒有分明的涇渭,看幾次,沒啥學(xué)不會(huì)的,逐漸也就熟悉了相關(guān)模塊,再逐漸拓展到引擎其他模塊,哪里有問題,過去看幾眼,不懂找高手問問。
再不懂,放一下,職業(yè)生涯很長(zhǎng),現(xiàn)在不懂的,將來會(huì)懂,保持好奇,總會(huì)到彼岸。幾年下來,也就把 Unreal 引擎方方面面磨了個(gè)透。
任何一個(gè)大項(xiàng)目,大引擎,都是知識(shí)的寶庫(kù),不用舍近求遠(yuǎn),認(rèn)真做好手邊的項(xiàng)目,就會(huì)成長(zhǎng)。如果有幸能參與到***的項(xiàng)目中,成長(zhǎng)速度會(huì)更快。
我的職業(yè)生涯前幾年在 UBISOFT 工作,參與了很多 AAA 項(xiàng)目,即使沒有太多的主動(dòng)學(xué)習(xí),眼界和能力也能有很大的增長(zhǎng)。如果沒有機(jī)會(huì)參與高端項(xiàng)目,也不需要?dú)怵H。
游戲技術(shù)領(lǐng)域的知識(shí)相當(dāng)公開和透明,關(guān)注 GDC 以及其他開發(fā)會(huì)議,留心歐美新出版的技術(shù)書籍,定期掃一遍,就大致知道技術(shù)圈發(fā)生了些什么事情了,找個(gè)感興趣的領(lǐng)域深入看進(jìn)去,堅(jiān)持幾年,就會(huì)有很大的提高。
總結(jié)一下這寫的一些觀點(diǎn)。劃一下重點(diǎn),這幾道是送分的必考題:
- 初學(xué)者要專注提高專業(yè)能力,即使是簡(jiǎn)單的工作,也能提高自己的能力。
- 培養(yǎng)自己對(duì)技術(shù)的好奇心,多看看,提升自己跨界的能力,對(duì)項(xiàng)目或者對(duì)自己都好。
- 培養(yǎng)良好的習(xí)慣,找到不被打擾的時(shí)間段,持續(xù)學(xué)習(xí)。
- 試圖成為信息的集散地,幫助別人,才能幫助自己。
技術(shù)瓶頸期如何轉(zhuǎn)崗轉(zhuǎn)職?
前篇講了從 Junior 到 Senior 程序員的成長(zhǎng)過程,現(xiàn)在談?wù)勣D(zhuǎn)職。從我自己的工作經(jīng)歷來看,工作了 5-6 年以后,就遇到了技術(shù)上的瓶頸期。
當(dāng)我開發(fā)很久的邏輯和 AI,也包括一部分網(wǎng)絡(luò)對(duì)戰(zhàn)模塊,在幾個(gè)不同項(xiàng)目中鍛煉后,多數(shù)相關(guān)的細(xì)分領(lǐng)域都接觸過了。我逐漸對(duì)這些技術(shù)提不起興趣了,于是想轉(zhuǎn)崗去做點(diǎn)引擎相關(guān)的事情。
職場(chǎng)新人是一張白紙,有機(jī)會(huì)在不同領(lǐng)域換崗位。而工作幾年的老人,常常有自己擅長(zhǎng)的領(lǐng)域,不如小朋友可塑性強(qiáng),且體力也不如年輕人。
這時(shí)候要轉(zhuǎn)新的崗位,就有一定的難度。常??匆姾芏嗳讼胱鲣秩尽⑾胱鲆?,但卻沒有太多的知識(shí)儲(chǔ)備。
問他們?yōu)槭裁床惶崆皽?zhǔn)備,他們就說:工作很忙,沒空學(xué)習(xí)渲染和引擎,但你不讓我做一下,我沒有經(jīng)驗(yàn),又怎么會(huì)有能力做好渲染和引擎呢?非常遺憾,這個(gè)邏輯是錯(cuò)的。
這里有一個(gè)必須注意的地方。在轉(zhuǎn)崗這個(gè)事情上,公司是不會(huì)為了你的理想和野心買單,他們只會(huì)為你的能力買單。
我們把它翻譯成人類的語(yǔ)言,就是公司一般不會(huì)僅僅因?yàn)槟阆朕D(zhuǎn)崗就讓你轉(zhuǎn)崗,只有你具備了新崗位需要的能力,才有可能讓你轉(zhuǎn)崗。
舉個(gè)例子進(jìn)一步說明,職場(chǎng)潛規(guī)則里,如果有幾方利益相關(guān)團(tuán)隊(duì)要推動(dòng)一件事情,潛規(guī)則就是哪個(gè)團(tuán)隊(duì)受益多,哪個(gè)團(tuán)隊(duì)就會(huì)更主動(dòng)推動(dòng)這件事。
你的小算盤是轉(zhuǎn)個(gè)崗,學(xué)點(diǎn)新東西,公司想的是每個(gè)人安分做一顆螺絲釘,做好自己最擅長(zhǎng)的事情,工作效率才高。
雙方利益有一定的沖突,這時(shí)候如果你表示,我已經(jīng)具備新崗位的能力,對(duì)公司來說,只不過是把你這個(gè)螺絲釘換了一個(gè)位置,而不是重新在新崗位造一個(gè)螺絲釘出來,這樣公司會(huì)容易接受得多。
所以結(jié)論就是,想轉(zhuǎn)崗,先自己學(xué),能勝任了再去提。
回到我的個(gè)人經(jīng)歷,由于參與的幾個(gè)項(xiàng)目都是使用了 Unreal,所以技術(shù)上有比較好的一致性。
由于自己平時(shí)也比較重視跨界知識(shí),引擎那一塊基本也有一定的熟悉度。于是和領(lǐng)導(dǎo)提了一下想轉(zhuǎn)做引擎的事情,領(lǐng)導(dǎo)說忙完這個(gè)項(xiàng)目就讓你去搞引擎。
很快找到了一個(gè)好機(jī)會(huì),開始去 Splinter Cell 4 項(xiàng)目做引擎。接到的***個(gè)任務(wù),是獨(dú)立把 Unreal 引擎移植到 Xbox360 的 Alpha 版開發(fā)機(jī)上。
當(dāng)時(shí)接到任務(wù),虎軀一震。Xbox360 架構(gòu)和 PC 不太一樣,當(dāng)時(shí) Epic Games 官方也沒有 Xbox360 版本的 UE 可用,我們找了一個(gè)其他游戲 Xbox360 移植參考,但參考價(jià)值不大。
因?yàn)?Ubisoft 喜歡深度定制引擎,Unreal2 的引擎部分已經(jīng)被 Splinter Cell 組改得面目全非,估計(jì)連 Tim Sweeney(Unreal 引擎的爸爸)都認(rèn)不出這是 Unreal 了。第三方的引擎移植無法直接參考。
那就開始搞吧,拉了一個(gè)分支版本,二百萬行代碼,無從入手,先編譯通過再說吧。
我建立了 Xbox360 的項(xiàng)目,開始編譯,不停修改編譯錯(cuò)誤,一時(shí)搞不定的大問題,就先把整個(gè)模塊注釋掉,做好筆記以備后續(xù)修復(fù)。
當(dāng)時(shí)開發(fā)環(huán)境也比較差,Xbox360 編譯器 Bug 還挺多,而且預(yù)編譯頭文件設(shè)置有 Bug,預(yù)編譯頭文件非常小,且無法通過參數(shù)擴(kuò)大。
這就導(dǎo)致大量代碼無法放入預(yù)編譯,偏偏 Unreal 的結(jié)構(gòu)重度依賴預(yù)編譯,我的代碼編譯速度極慢。編譯的時(shí)候就只能看看文檔,什么都做不了干著急。
我沒日沒夜搞了 1 個(gè)多月都沒有完全編譯通過項(xiàng)目。每次開周會(huì)的時(shí)候,都覺得自己快死了,翻來覆去就只能匯報(bào)說自己還在和編譯器搏斗。
游戲引擎的前期移植,不比大規(guī)模開發(fā),前期移植通常只能讓很少的人參與,基本無法并行操作,你都編譯不過,別人怎么插手。
如果我搞不定,就要換一個(gè)人來搞,浪費(fèi)很大。估計(jì)老板也是心里罵娘但嘴上不說,鼓勵(lì)幾句讓我繼續(xù)搞。
心理壓力是一方面,能力短板也是另一方面的問題。雖然我做了很多引擎技術(shù)的提前儲(chǔ)備,真正面對(duì)整個(gè)引擎規(guī)模的移植,還是發(fā)現(xiàn)缺口不少。
我在業(yè)余時(shí)間拼命補(bǔ)課,把不懂的東西學(xué)會(huì),才能推進(jìn)。但很快又碰到新問題,有些領(lǐng)域是 Unreal 專業(yè)領(lǐng)域的知識(shí),并非通用知識(shí),很難學(xué)習(xí),也找不到人咨詢,而且涉及到的面比較廣,沒有辦法在短時(shí)間里面全部看透。
這就需要我在信息不完備的情況下做技術(shù)決策,這個(gè)模塊大致應(yīng)該往什么方向做,如果出了問題怎么辦,我可以怎么回溯。
做一兩個(gè)決策還好,但往往是一個(gè)決策套著一個(gè)決策,前后的技術(shù)決策有依賴關(guān)系,要回溯就要一起推翻。
沒有什么堅(jiān)實(shí)落地的技術(shù)決策,就好像走在半空的索橋,每一次搖晃,都在動(dòng)搖我信心的根基,做到后來都懷疑人生,覺得這活真不是人干的。
好在終于還是編譯通過了...然后就是調(diào)試程序,要讓引擎運(yùn)行起來,哪怕沒有渲染也不要緊,只要有主循環(huán)跑起來就好了。只有那樣,更多的同事才能參與進(jìn)來幫忙。
后面斷斷續(xù)續(xù)又有了很多的障礙,Xbox360 的內(nèi)存模型以及 Alpha Kit 的 Bug,序列化的 Big Endian 和 Little Endian 的區(qū)別,F(xiàn)ix Function Pipeline 在 Xbox360 里面完全被去除了,性能的問題等等。
硬著頭皮一一搞定,終于勉強(qiáng)在電視屏幕上畫出點(diǎn)像素,雖然各種飛面,光照全錯(cuò),一會(huì)就會(huì) Crash,但至少把主循環(huán)跑起來了,當(dāng)然也是基于很多不知道是正確還是錯(cuò)誤的技術(shù)決策。
先快速走通流程,比什么都重要,鋪好了路,咱們的大部隊(duì)就能一起來和我并肩作戰(zhàn)啦。
當(dāng)時(shí)已經(jīng)和主干的開發(fā)版本分開兩個(gè)多月了,于是又花了 2 周來 Merge ***的改動(dòng),整個(gè)開發(fā)團(tuán)隊(duì)那時(shí)候就有 20 多個(gè)程序員,幾十個(gè)美術(shù)和 10 多個(gè)關(guān)卡策劃瘋狂的上傳,Merge 的過程也是非常不順利。
Merge 了幾輪,才勉強(qiáng)追上項(xiàng)目的進(jìn)展。然后趁大家周末休息的時(shí)候,一口氣上傳了所有的改動(dòng),還要抓緊測(cè)試看看主干版本,帶上了 Xbox360 的代碼,是不是還能編譯,是不是還能正常運(yùn)行。相關(guān)的工具也都需要簡(jiǎn)單測(cè)試一下。
忙完這一切以后,自己有了非常大的變化。最重要的變化,是終于有了技術(shù)上的自信。覺得沒什么是自己搞不定的了,只要給我足夠的時(shí)間。
尼采說過,殺不死我的,只會(huì)讓我更堅(jiān)強(qiáng)。做過一個(gè)規(guī)模足夠大的工作,在絕望里掙扎過,這樣的經(jīng)歷非常能鍛煉人。
那幾個(gè)月整天低頭 Coding,基本不用和別人說話,一坐就是一天,和編譯器斗,和 Xbox360 Kit 斗,和 Unreal 斗,經(jīng)常陷入困境,也時(shí)不時(shí)會(huì)有突破,隨時(shí)進(jìn)入心流狀態(tài),收獲自信和滿足。
現(xiàn)在回憶起來,那幾個(gè)月也成為我技術(shù)歷程中***的一個(gè)飛躍。
今后的很多工作中,有了這個(gè)自信,就開始敢在技術(shù)上決策,在團(tuán)隊(duì)里面,有些事情自己搞不定的話,別人也很難搞定,也就不再想太多。和團(tuán)隊(duì)也逐漸建立起了信任,大家就更愿意讓我做決定。
做到這一步,整個(gè)引擎勉強(qiáng)能跑,但沒什么東西是正確的,渲染模塊還是一團(tuán)混沌,邏輯方面都沒有正確工作,還需要艱苦的工作。
后續(xù)還需要把我一路 Rush 過程中欠下的技術(shù)債一一償還,把整個(gè)版本弄成 Xbox360 上可以順利跑起來,再做架構(gòu)調(diào)整,適應(yīng)新主機(jī)的新架構(gòu),充分利用多核框架。
2005 年搞多核引擎框架,還是個(gè)高科技。很多可以做的,很多可以學(xué)習(xí)的。非??上?,由于工作上的調(diào)整,我被調(diào)離了這個(gè)項(xiàng)目,去另一個(gè) FPS 小項(xiàng)目做 AI Leader。
這個(gè)經(jīng)歷下面接著聊,主題就是從 Senior 程序到 Leader 的過程中,又有什么是重要的。
快速總結(jié)一下中心思想:
- 公司不為你的野心買單,為你的能力買單。你想要什么,先讓自己能配得上它。
- 經(jīng)歷過絕望掙扎,才能變得更強(qiáng)大,迎接挑戰(zhàn),建立你的技術(shù)自信。
如何做好技術(shù)管理?
上面聊到,好不容易轉(zhuǎn)職,做了一陣子引擎移植,漲了很多經(jīng)驗(yàn),結(jié)果做了一半被公司調(diào)動(dòng)去做另一個(gè)項(xiàng)目的組長(zhǎng)。
技術(shù)專精到技術(shù)管理,并不是那么順利。不是能做好技術(shù)攻關(guān),就能做好技術(shù)管理。這里聊聊在這個(gè)過程中的收獲和成長(zhǎng)。
我接手的團(tuán)隊(duì)大約有 10 人左右,在一個(gè) Unreal 引擎開發(fā)的 FPS 項(xiàng)目中做 AI 邏輯。整個(gè)項(xiàng)目團(tuán)隊(duì)規(guī)模不到 100 人,程序團(tuán)隊(duì)就分了三組,引擎、網(wǎng)絡(luò)和 AI 邏輯。
新角色的定位,是一個(gè)沖在一線的技術(shù)管理職位。這也是我***次做 Leader。
對(duì)我來說,擺在面前的難題有幾個(gè):
- 團(tuán)隊(duì)融入
- 個(gè)人效率
- 大局觀
團(tuán)隊(duì)融入
先要做的是團(tuán)隊(duì)融入。UBISOFT 那段時(shí)間的人員流失不多,國(guó)內(nèi)強(qiáng)力的網(wǎng)游公司不多,沒競(jìng)爭(zhēng)力,所以組長(zhǎng)級(jí)別以上的都是熟人,合作多年,不存在什么問題。但組員就比較麻煩,多數(shù)都是新加入公司的,不知道能力。
和軟件開發(fā)一樣,我融入方法是小步迭代,逐步了解團(tuán)隊(duì)成員的能力。對(duì)不熟悉的同事,分配一點(diǎn)簡(jiǎn)單的工作,了解能力的同事,可以領(lǐng)一點(diǎn)更困難的工作。然后定期跟進(jìn)后續(xù)的,過一段時(shí)間差別就很明顯了。
如果把開發(fā)者能力作為 Y 軸,把積極性作為 X 軸的話,我們就可以構(gòu)建四個(gè)象限,把開發(fā)者們一一對(duì)號(hào)入座:
- 積極且能力強(qiáng)的,明顯學(xué)有余力,保質(zhì)保量完成工作,而且非常積極,主動(dòng)來要新的任務(wù)。
- 積極但能力弱的,做得很努力,不是很能跟得上節(jié)奏,但也是非常投入。
- 不積極但能力強(qiáng)的,能比較快做完安排的任務(wù),然后也不幫別人,也不來匯報(bào),自己在角落 happy。
- 又不積極且能力弱的,組里倒是沒發(fā)現(xiàn),也是萬幸。
了解了幾類人,就可以分別用不同的形式管理:
- 積極且能力強(qiáng)的,可以給更難的任務(wù),讓他放手去做,然后主動(dòng)匯報(bào)進(jìn)展即可,平時(shí)也不用太多催他,能搞定的自然能搞定,不能搞定的他也會(huì)提前匯報(bào)。
- 積極但能力弱的,給一些稍簡(jiǎn)單的任務(wù),同時(shí)加強(qiáng)輔導(dǎo),幫助他在技術(shù)上能提高,多回答他的問題,給他更好的個(gè)人發(fā)展方向。
- 不積極但能力強(qiáng)的,是比較難處理的。任務(wù)可安排稍難的,但要特別注意回避那些需要多方溝通、模糊地帶的任務(wù)。
- 此類同學(xué)往往比較懶,不善于或者不愿意推動(dòng)事情,經(jīng)常會(huì)卡住。然后要多跟進(jìn),除了正常的 daily/weekly 的匯報(bào),還要常常關(guān)心一下他的進(jìn)展,讓他了解到,Big brother is watching you。
- 不積極且能力弱的,試試能不能挽救,不行也只能放棄了。
那怎么能準(zhǔn)確的判斷員工是哪種屬性呢?新團(tuán)隊(duì)的磨合,其實(shí)就是一個(gè)彼此試探的過程。
你做得好,就領(lǐng)更多的任務(wù),我對(duì)你信任+1;你做砸了,我就給你更簡(jiǎn)單的任務(wù),信任-1。
主動(dòng)積極匯報(bào)和領(lǐng)任務(wù)有印象分+1,看見你偷懶進(jìn)度慢就印象分-1。細(xì)心觀察一陣子,就很快有準(zhǔn)確結(jié)論了。
而且猜錯(cuò)也沒有關(guān)系,這是一個(gè)持續(xù)調(diào)整和逼近的過程,這次錯(cuò)了,下次改回來就好了。
這是一個(gè)主觀判斷,也許有些同事和你合作就是表現(xiàn)不好,有些同事和你工作就會(huì)有超常發(fā)揮。但沒關(guān)系,管理就是一個(gè)比較主觀的事情,在你的團(tuán)隊(duì)里,怎么用人還是由你來判斷的。
個(gè)人效率
下一個(gè)問題是個(gè)人效率管理問題。之前做開發(fā)者,同一時(shí)刻需要跟進(jìn)的事情并不是那么多,一個(gè)簡(jiǎn)單的 To Do List,或者往桌上貼點(diǎn)報(bào)事貼,基本就能把要關(guān)心的、要搞定的事情都跟蹤起來了。
做了 Leader 以后明顯不一樣,同時(shí)要關(guān)心很多事情,而且不同的事務(wù),輕重緩急不同,時(shí)間屬性不一樣。
怎么對(duì)任務(wù)進(jìn)行合理的分類管理,是擺在面前的一個(gè)大問題。我嘗試了很多個(gè)人效率管理的手段,***找到 GTD 系統(tǒng),能滿足我的需求,這是我的一個(gè)非常重要的 Life Changer。
我翻了國(guó)內(nèi)外論壇的幾千篇 Mailinglist,接觸到各種奇奇怪怪的 Lifehack 理念,嘗試了幾次,成功實(shí)踐起這個(gè)流程,極大地改變了我的生活和工作。
個(gè)人效率管理系統(tǒng),本質(zhì)上,是一個(gè)減壓系統(tǒng),降低你的焦慮,幫你跟進(jìn)瑣事,讓你把精力聚焦在真正需要思考的事情,而不用擔(dān)心又遺忘了什么承諾。
很多人會(huì)覺得個(gè)人效率管理太麻煩,生活不就應(yīng)該是自由自在的嗎?我認(rèn)同的卻是,自律才能得到自由,個(gè)人效率管理是通向自律的一扇窗。
對(duì)每一個(gè)認(rèn)真對(duì)待生活和工作的職場(chǎng)人,應(yīng)該要去了解一下適合自己的個(gè)人效率管理系統(tǒng)。
GTD 也許太龐大,太重度,不適合你,那就做個(gè)更簡(jiǎn)化的系統(tǒng),很多理念是有價(jià)值的,當(dāng)你知道了,實(shí)踐了,就再也回不去原來那個(gè)紛亂無序的生活。
GTD 系統(tǒng)就不展開說了,書籍、討論非常多,也有很多以 GTD 為核心做了精簡(jiǎn)的管理系統(tǒng)。
只提幾個(gè)重要的觀念:
- 好的個(gè)人管理系統(tǒng),可以幫助大腦減壓,把對(duì)他人或?qū)ψ约旱某兄Z記下,就可以從腦中 unload 這些承諾,降低了記憶負(fù)擔(dān),真正可以做到Mind like water,關(guān)注手頭工作。
- To Do List 是有 context 的,本質(zhì)上是為了減少使用 list 時(shí)候的無效精力開銷。這個(gè)我模模糊糊也知道,但一直不知道如何合理分類。
GTD 給了非常好的示范,類似 Errands、Waiting For 列表,給很多不知如何分類的任務(wù)以***的歸宿,真正做到以盡可能低的成本,跟進(jìn)盡可能多的事情。
- Next Action 是推進(jìn)很多事情的關(guān)鍵,但凡執(zhí)行一件事稍有阻礙,我們就可能拖延。分解 Next Action 可以降低這個(gè)阻礙。
當(dāng)然我見過好多有才能的人,并不重視個(gè)人效率管理,依然取得了巨大的成績(jī)。
每個(gè)人有自己的活法,一套好的個(gè)人效率管理系統(tǒng),會(huì)增加你人生的吞吐量,要想富先修路,沒有 I/O 怎么能升職加薪呢。平凡的我們,通過合理的效率管理,也許就能在職場(chǎng)上走得更遠(yuǎn)一點(diǎn)點(diǎn)。
大局觀
大局觀是一個(gè)比較難培養(yǎng)的能力,不在其位,不憂其心,就不會(huì)有機(jī)會(huì)鍛煉。
***個(gè)和大局觀有關(guān)的是跨團(tuán)隊(duì)協(xié)作。項(xiàng)目中不只有你一個(gè)團(tuán)隊(duì),AI 邏輯團(tuán)隊(duì)作為一個(gè)中央樞紐,要把關(guān)卡策劃服務(wù)好,對(duì)接 UI 美術(shù),把引擎功能包裝整合,配合 Online 組開發(fā) Match Making,和每個(gè)組都有或多或少的聯(lián)系。
很多時(shí)候,本團(tuán)隊(duì)工作安排***不代表全項(xiàng)目工作安排***,跨團(tuán)隊(duì)的合作,該強(qiáng)硬的時(shí)候要強(qiáng)硬,該讓步的時(shí)候要讓步,一切以項(xiàng)目利益***化為目的。
由于 Leader 們私交都不錯(cuò),合作多年,相對(duì)來說跨團(tuán)隊(duì)合作都還好,沒有太大的問題。
第二個(gè)和大局觀有關(guān)的問題是對(duì)自己團(tuán)隊(duì)工作的把握。什么時(shí)候該鼓勵(lì)團(tuán)隊(duì)探索一些先進(jìn)技術(shù),并且在研究不順利的時(shí)候決定繼續(xù)還是喊停,什么時(shí)候應(yīng)該保守一點(diǎn),收斂需求,確保能完成相關(guān)特性,這就是一個(gè)典型的例子。
這方面要做好,需要有廣泛的領(lǐng)域知識(shí),也需要一些跨界知識(shí),更需要多個(gè)項(xiàng)目的經(jīng)驗(yàn)。
因?yàn)樽鰶Q定的時(shí)候,也是在信息不完備的情況下,一個(gè)好的決定也需要一點(diǎn)點(diǎn)運(yùn)氣。
第三個(gè)和大局觀有關(guān)的問題是控制團(tuán)隊(duì)工作節(jié)奏。要試圖理解整個(gè)項(xiàng)目階段,我們團(tuán)隊(duì)的工作對(duì)項(xiàng)目交付有什么影響,什么時(shí)候我們是瓶頸,要加速做,什么時(shí)候我們有閑暇,可以放松一下,做點(diǎn)長(zhǎng)遠(yuǎn)技術(shù)投資或是清償一下技術(shù)債。
當(dāng)然,AI 和邏輯團(tuán)隊(duì)永遠(yuǎn)都是瓶頸,所以也不用想太多,努力工作就是了。
第四個(gè)和大局觀有關(guān)的問題是組內(nèi)的工作交付問題。有些同事雖然很努力,但總不能交付理想的成果,是換人來做,還是只好選擇原諒他?
換人來做意味著新同事要重新熟悉這一塊的工作,老同事會(huì)覺得很沮喪,不被組織信任。換了新人如果搞不定怎么辦?
有幾種可能,要么這件事就是不容易搞定,要么第二個(gè)同事還是不給力。所以換人做的話,一定要確保新接手的同事是信得過的,避免再次出現(xiàn)換人。只要新接手同事沒做成,就告訴自己此路不通,我們想辦法繞路。
第五個(gè)和大局觀有關(guān)的問題是你要控制你自己。Leader 相對(duì)來說總是一個(gè)團(tuán)隊(duì)技術(shù)***的,看見大家搞不定事情總想著要沖上去幫忙,找一下智商優(yōu)越感。
也很正常,人總是希望做自己擅長(zhǎng)的事情。一起干活本沒有錯(cuò),也能很好提高團(tuán)隊(duì)士氣,但是時(shí)機(jī)和工作內(nèi)容要選好。
千萬不要選擇在關(guān)鍵路徑上的任務(wù),如果搞不定會(huì)影響整個(gè)項(xiàng)目進(jìn)展。因?yàn)?Leader 在中前期總有各種重要的技術(shù)選型和決策要做,在中后期總是陪加班和調(diào)配資源,應(yīng)付突發(fā)事件,哪件事都比上去搞定幾個(gè)任務(wù)重要。
如果手頭有關(guān)鍵路徑任務(wù),往往都是最難的,工作中又無法抽出整段時(shí)間專心做,很可能會(huì)拖累整個(gè)項(xiàng)目。
找點(diǎn)可以獨(dú)立的事情,可以是比較難的長(zhǎng)線任務(wù),也可以是沒有太多依賴的疑難問題 Debug,或者是做做優(yōu)化,這些事情既能找到滿足感,沒時(shí)間搞定,也不會(huì)對(duì)項(xiàng)目有太大沖擊。
總結(jié)一些中心思想:
- 了解好組員,用最適合的方式管理大家。
- 個(gè)人效率管理對(duì)提高個(gè)人吞吐量至關(guān)重要,降低自己的焦慮,幫助自己成為一個(gè)更可靠的人。
- 培養(yǎng)大局觀,做好協(xié)作,把握工作方向,控制工作節(jié)奏,關(guān)注組內(nèi)同事交付,控制自己想做技術(shù)的沖動(dòng)。
緩解焦慮,走出舒適區(qū)
做完那個(gè)項(xiàng)目的 AI 團(tuán)隊(duì) Leader,后續(xù)繼續(xù)回 Splinter Cell 組做引擎相關(guān)工作。
Leader 已經(jīng)做好了多線程的架構(gòu),我進(jìn)一步在 Xbox360 上做優(yōu)化,很多有趣的優(yōu)化點(diǎn)或者高難度的 Bug,在 Bug 往事那里都說過,就不重復(fù)了。
后續(xù)項(xiàng)目在一個(gè)很小的項(xiàng)目里面做主程序,目標(biāo)是 4 個(gè)月完成 Rayman 瘋狂兔子的 Wii 到 Xbox360 移植,并提交審核。
之前的積累效果就顯示出來了,一開始還是只有我一個(gè)人做前期工作,移植 Wii 版本的 Jade 引擎到 Xbox360。有了信心,就不再驚慌,加上運(yùn)氣不錯(cuò),一個(gè)多星期就完成了初步移植。
但總體來說,今后的 2-3 年里面,沒有突破性的提升,無論是技術(shù)上還是管理上:
- 從管理上來說,外企普遍有的玻璃天花板,在 UBI 也存在,中方員工在發(fā)展上總是吃點(diǎn)虧。
- 在技術(shù)上,沒有機(jī)會(huì)從頭做一個(gè)引擎,總是遺憾。
UBISOFT 是一個(gè)很強(qiáng)的技術(shù)公司,內(nèi)部技術(shù)相當(dāng)出色。但對(duì)引擎程序員,有一個(gè)非常大的限制,就是基本沒有機(jī)會(huì)從頭參與開發(fā)一個(gè)引擎。
你的選擇,無法在已有的 Unreal 為代表的商業(yè)引擎,或者法國(guó)人做出的 Open Space 以及相關(guān)各種分支引擎,或者加拿大分公司的一堆引擎里面選擇。
而當(dāng)時(shí)國(guó)內(nèi)公司,各種自研引擎已經(jīng)滿天飛,面試招聘的時(shí)候經(jīng)常碰到各路小團(tuán)隊(duì) CTO、技術(shù)指導(dǎo),表示做過某某引擎,還有人語(yǔ)重心長(zhǎng)的勸我,表示做引擎沒啥難的,想做就做一個(gè)唄!
大多數(shù)此類引擎的水準(zhǔn),大致停留在 10 年前,往往只有渲染部分處在 5 年前的”領(lǐng)先”水準(zhǔn),工具鏈、跨平臺(tái)、多人協(xié)作等各方面,都沒有看見什么深入的考慮。
但另一方面,在 UBI 這樣的公司呆久了,不自覺的對(duì)從頭做一個(gè)引擎有著巨大的恐懼感,公司內(nèi)部有足夠多的好選擇,必要性不大,而且見過了***的引擎,龐大的工具鏈,會(huì)不由自主高估困難性。
但內(nèi)心的蠢蠢欲動(dòng),還是推動(dòng)著我,走出下一步。2009 年結(jié)束的時(shí)候,來到了騰訊。先去各個(gè)部門打了一下醬油,了解了一下公司,然后參與了天涯明月刀 OL 項(xiàng)目。
對(duì)我而言,這個(gè)項(xiàng)目是我***個(gè)正規(guī)的網(wǎng)游項(xiàng)目,雖然在前公司也參與過一個(gè)網(wǎng)游項(xiàng)目,但外企在思路轉(zhuǎn)型上遠(yuǎn)遠(yuǎn)談不上到位,國(guó)內(nèi)免費(fèi)游戲都做了很多年了,外國(guó)老板表示還有免費(fèi)模式,真能行嗎?
這個(gè)項(xiàng)目也是一個(gè)好機(jī)會(huì),讓我有機(jī)會(huì)帶團(tuán)隊(duì)真正從頭做一個(gè)現(xiàn)代的引擎。
天涯明月刀的引擎和游戲開發(fā)經(jīng)歷按下不細(xì)說,和咱們這個(gè)主題不一致。還是圍繞個(gè)人成長(zhǎng),展開說說。
一到騰訊的時(shí)候就非常緊張,過來的時(shí)候 Title 是高級(jí)架構(gòu)師,我有著極其強(qiáng)烈的不能勝任感。
對(duì)我來說,有一些領(lǐng)域是全新的,首先在客戶端領(lǐng)域接觸到了國(guó)內(nèi)常用的 Game byro 等引擎,和 UBI 一系技術(shù)完全不同,當(dāng)時(shí)也無從判斷究竟 Game byro 之類的引擎是不是代表了先進(jìn)方向。
其次在服務(wù)器領(lǐng)域也是見到了國(guó)內(nèi)常用的技術(shù),在協(xié)議處理等角度來看,是相當(dāng)簡(jiǎn)單粗暴的,習(xí)慣了歐美一套復(fù)雜處理方法,非常不適應(yīng)。
更大的挑戰(zhàn)在于,以前大量項(xiàng)目都是基于移植或者成熟大型引擎,現(xiàn)在一下子擁有更大的技術(shù)發(fā)揮自由度,在更簡(jiǎn)陋的開發(fā)環(huán)境中,反而不知道從何做起了。
在這么多年的個(gè)人發(fā)展中,總在那些關(guān)鍵時(shí)刻,有一些不能勝任感,然后奮起直追,讓自己慢慢勝任。
直到前些年在騰訊的經(jīng)歷,才讓我意識(shí)到這適度的焦慮給我?guī)淼膸椭?,我也開始更刻意的讓自己常常有一些不能勝任感,以避免自己過于安逸。這個(gè)不能勝任感,換另一個(gè)說法可能更能被人接受,叫做走出自己的舒適區(qū)。
為了緩解焦慮,開始了瘋狂的學(xué)習(xí)。那兩、三年的閱讀量非常大,每天都有 3-4 小時(shí)在看技術(shù)資料,做筆記,分析和思考。
先要補(bǔ)上自己的短板,把自己不熟悉的領(lǐng)域熟悉起來。好在孩子還沒有讀書,也有足夠精力,我每天早上提前一個(gè)多小時(shí)就到單位晨讀,晚上回家還會(huì)抽出很多時(shí)間閱讀。出差時(shí),晚上或者周末也在酒店閱讀。
幾年的高強(qiáng)度學(xué)習(xí),逐漸緩解了我的焦慮,系統(tǒng)的閱讀了大量主題書籍、Gems 類型書籍和會(huì)議 PPT 等,大致找到了感覺??梢院蛣e人侃侃而談,不再會(huì)在拿出名片的時(shí)候臉紅于架構(gòu)師的 Title 了。
從一個(gè)技術(shù)指導(dǎo)(Tech director)的角度上,我不需要事事都會(huì)做,自有優(yōu)秀的同事來搞定,我只是偶爾需要在必要時(shí)刻,保持一定的突擊能力,可以沖在一線解決困難的問題。
但我必須事事了解,知道技術(shù)大致的 Tradeoff,知道復(fù)雜度,知道和其他系統(tǒng)的關(guān)系。換句話說,這個(gè)時(shí)刻,技術(shù)廣度對(duì)我來說,比深度更重要。
技術(shù)深度的方法可以通過突擊學(xué)習(xí),廣度積累當(dāng)然也可以,但還有其他方法可以做到。
畢竟這時(shí)候我也工作了十幾年了,不如剛畢業(yè)的時(shí)候精力旺盛,孩子也是一個(gè)精力黑洞,如何多快好省的培養(yǎng)自己能力,提高效率,變得更重要了。
介紹一些有趣的實(shí)踐方法,可以幫助積累技術(shù)廣度:
面試學(xué)習(xí)法
我常年負(fù)責(zé)游戲客戶端領(lǐng)域的技術(shù)通道面試,技術(shù)通道面試可以簡(jiǎn)單理解成對(duì)面試者定級(jí)別的復(fù)試。
同時(shí)我自己的團(tuán)隊(duì)也招了很多人,面試非常多。從 HR 的反饋來看,被面試的人,表示我面試時(shí)候領(lǐng)域知識(shí)問得深入,且范圍很廣。
在面試時(shí),面試官有巨大的優(yōu)勢(shì),面試者的經(jīng)歷簡(jiǎn)單掃一遍后,就可以隨意發(fā)問。
我有主動(dòng)權(quán),可以聲東擊西,選擅長(zhǎng)的深入問,不懂的可以簡(jiǎn)單帶過,保證不露怯。
也可以長(zhǎng)驅(qū)直入,對(duì)自己感興趣的領(lǐng)域,讓面試者深入講講,聽個(gè)大概,成為自己事后了解這個(gè)領(lǐng)域的入門材料。
可以左右互搏,對(duì)于一些面試者的有趣觀點(diǎn),隨手記下,下次可以問另一個(gè)面試者怎么看這個(gè)問題,讓他們的觀點(diǎn)彼此 PK。
可以溫故知新,順便和面試者討論討論一些主題問題,把平時(shí)學(xué)習(xí)的新技術(shù)用上,如果他回答不出來,正好復(fù)述一遍,既幫他開拓眼界,也可以加深自己對(duì)這個(gè)技術(shù)的印象。
面試學(xué)習(xí)法很適合快速拓展知識(shí)面,每次面試都是一次技術(shù)切磋,如果有機(jī)會(huì)面試級(jí)別高的開發(fā)者,更是一個(gè)很好的成長(zhǎng)經(jīng)歷。
項(xiàng)目評(píng)審學(xué)習(xí)法
公司內(nèi)部的項(xiàng)目評(píng)審技術(shù)評(píng)審,也是一個(gè)不錯(cuò)的學(xué)習(xí)途徑。騰訊的內(nèi)部游戲開發(fā),有較完善的流程,除了產(chǎn)品評(píng)審環(huán)節(jié),也有技術(shù)評(píng)審環(huán)節(jié)。
我做了幾年技術(shù)評(píng)委,通過參加評(píng)審,我有機(jī)會(huì)了解每個(gè)項(xiàng)目大致面臨的技術(shù)難題,也經(jīng)常能看見一些閃光點(diǎn)。
比起面試學(xué)習(xí)法,技術(shù)評(píng)審接觸的都是公司內(nèi)部同事,即使有什么東西當(dāng)時(shí)沒有理解正確,或是過了很久想到這個(gè)技術(shù),細(xì)節(jié)都忘了,也可以找到當(dāng)時(shí)的同事請(qǐng)教。
職級(jí)晉升學(xué)習(xí)法
公司內(nèi)部對(duì)程序員的技術(shù)能力升級(jí),有一整套考核,到了一定的職級(jí),就需要有正式的答辯環(huán)節(jié)。
我常年負(fù)責(zé)技術(shù)評(píng)審,申請(qǐng)晉級(jí)的同事們會(huì)準(zhǔn)備自己的工作成果展示,我能看見大量技術(shù)問題的分析和解決方案。
和項(xiàng)目評(píng)審中的學(xué)習(xí)有所不同,項(xiàng)目評(píng)審時(shí)角度更宏觀,具體技術(shù)細(xì)節(jié)不會(huì)涉及太多,而自己職級(jí)評(píng)審中,每個(gè)同學(xué)都是竭盡所能,從各個(gè)角度介紹自己的技術(shù),有問必答,還有事后給面試官送補(bǔ)充說明材料的。
剛參與技術(shù)評(píng)審的時(shí)候,兩天評(píng)審中,往往能有 2-3 個(gè)技術(shù)點(diǎn)讓我眼前一亮。
當(dāng)然這個(gè)學(xué)習(xí)的衰減速度非??欤皫啄甑脑u(píng)審,往往兩天聽完,也沒有什么有趣的技術(shù)點(diǎn)了。
業(yè)界會(huì)議學(xué)習(xí)
游戲圈子比較開放,每年的 GDC 或者其他開發(fā)大會(huì),都會(huì)有開發(fā)者無償公布很多新的技術(shù),或者總結(jié)自己項(xiàng)目的得失,介紹好的實(shí)踐。
參與這些會(huì)議,是***的手段,可以快速和國(guó)際***水平開發(fā)者對(duì)齊。你需要的只是一張來回機(jī)票,幾天住宿,一張門票和英語(yǔ)聽力。
每次參加完會(huì)議,總是特別興奮,有很多好想法想和團(tuán)隊(duì)分享,有很多改進(jìn)可以做進(jìn)我們自己的引擎。
如果沒有那么好的條件可以去現(xiàn)場(chǎng)參加會(huì)議,也可以關(guān)注會(huì)后放出來的免費(fèi)材料,或是購(gòu)買付費(fèi)會(huì)員賬號(hào)。
上述的學(xué)習(xí)實(shí)踐,本質(zhì)上就是多聽多看多聊,和其他項(xiàng)目多社交,多聊聊技術(shù),出去多看看其他公司怎么做項(xiàng)目,堅(jiān)持做一陣子,自然就有了技術(shù)廣度理解。
即使做到了自學(xué)成才主攻技術(shù)深度,也做到了多社交主攻技術(shù)廣度,依然有可能有不足。
群體學(xué)習(xí)
上面聊到擴(kuò)展自己的知識(shí)廣度,可以通過社交化手段(面試、評(píng)審等),或是參加專業(yè)會(huì)議來達(dá)成。
我們的學(xué)習(xí)方法,還差一個(gè)環(huán)節(jié)。進(jìn)一步可以做的是群體學(xué)習(xí)。發(fā)動(dòng)團(tuán)隊(duì)的力量,大家一起來學(xué)習(xí),補(bǔ)足自己精力的缺失,也幫助團(tuán)隊(duì)提高能力。
以前在項(xiàng)目組,會(huì)做一個(gè)每周分享的活動(dòng)。不管 Senior 還是 Junior,按照姓名排序,輪流來做一個(gè) 30 分鐘的分享。
涉及主題可以是新技術(shù),可以是工作中解決的重要問題,可以是外部的有趣技術(shù)分享,可以是展會(huì)、讀書心得,找自己擅長(zhǎng)的就可以。
每周兩個(gè)同事分享,占用整個(gè)團(tuán)隊(duì) 1 小時(shí)左右,因?yàn)閳F(tuán)隊(duì)人比較多,輪一遍要好幾個(gè)月,所以這個(gè)活動(dòng)對(duì)聽眾是一個(gè)很好的放松,也不會(huì)對(duì)分享人造成非常大的壓力。
做這件事,無論是對(duì)個(gè)人,還是對(duì)團(tuán)隊(duì),都有很大的意義:
- 擴(kuò)展廣度:可以充分發(fā)揮團(tuán)隊(duì)力量,開拓視野,經(jīng)常能看見一些讓人眼前一亮,但自己掃描的時(shí)候被疏漏的技術(shù)點(diǎn)。
- 提高學(xué)習(xí)質(zhì)量:逼著大家在閱讀之余做總結(jié)歸納。一個(gè)知識(shí)如果看完了只是模模糊糊有所了解,那么說明你對(duì)它的了解還不夠深刻。
如果能總結(jié)出來,分享給別人,那你肯定就能深入了解它了。***的學(xué)習(xí),就是把這個(gè)知識(shí)教給別人。
- 鍛煉表達(dá)能力:程序員往往內(nèi)向不善表達(dá),促進(jìn)大家分享,也是一個(gè)好機(jī)會(huì)可以教大家怎么和人溝通,怎么把知識(shí)點(diǎn)更好的表達(dá)出來。軟性技能在個(gè)人發(fā)展的中后期非常重要,但卻往往被人疏忽。
- 促進(jìn)團(tuán)隊(duì)交流:促進(jìn)團(tuán)隊(duì)間互相了解,比起吃喝類型的團(tuán)建,這類活動(dòng)更能讓大家在工作上達(dá)成默契。
有時(shí)候工作中碰到某個(gè)技術(shù),想起前段時(shí)間有別的同事分享過,就可以翻出 PPT 再看看,看不懂也可以直接和這位同事溝通,得到進(jìn)一步的幫助。
- 減少團(tuán)隊(duì)流失:促進(jìn)學(xué)習(xí)氛圍建設(shè),也能穩(wěn)定團(tuán)隊(duì)。游戲開發(fā)總是很忙,如果沒有機(jī)會(huì)讓大家有所提升,做幾年技術(shù)人員很容易荒廢。
看上去很美的團(tuán)隊(duì)學(xué)習(xí),實(shí)行一段時(shí)間以后,也發(fā)現(xiàn)了不少問題:
- 能力不匹配:團(tuán)隊(duì)能力和精通領(lǐng)域參差不齊,導(dǎo)致很多話題,一些人聊得津津有味,另一些人完全聽不懂;或是 Senior 對(duì)很多初階主題明顯不感興趣,給 Junior 程序員很大的心理壓力。
- 有些員工分享能力實(shí)在不行,很好的選題,但講的時(shí)候就是平鋪直敘,不考慮目標(biāo)聽眾的理解。
- 工作進(jìn)度有壓力,不能一直堅(jiān)持。輪到某個(gè)里程碑版本要沖刺,就很難保證分享活動(dòng)持續(xù)進(jìn)行了。
- 大家隨意分享,廣度有了,系統(tǒng)性不足。
針對(duì)這些問題也可以做一些改進(jìn):
- 能力不匹配,可以想辦法通過提前審核選題,來確保題目是多數(shù)人感興趣的,也可以通過小范圍組織分享,找更合適的小團(tuán)隊(duì)來群體學(xué)習(xí)。
- 分享能力不夠,可以通過更多的輔導(dǎo),幫助串起技術(shù)、提煉分享線索、考慮受眾接受度、提前準(zhǔn)備逐字稿等方法提高質(zhì)量。
- 工作進(jìn)度壓力客觀存在,真堅(jiān)持不了分享,就暫停一陣子,等忙完再恢復(fù)好了,對(duì)學(xué)習(xí)來說,來日方長(zhǎng),不爭(zhēng)朝夕。
- 系統(tǒng)性不足,可以通過組織主題學(xué)習(xí)的方法,或者有專人掃描某一次會(huì)議所有議題,或者一起深入讀一本好書,輪流分享其中章節(jié),或者針對(duì)某一技術(shù)領(lǐng)域,遍讀相關(guān)文章,做全面介紹。
堅(jiān)持團(tuán)隊(duì)學(xué)習(xí)大原則的前提下,細(xì)節(jié)上可以靈活把握,變著花樣,讓大家有新鮮感,養(yǎng)成良好的學(xué)習(xí)習(xí)慣,也能從隊(duì)友的進(jìn)步上有所收獲。
另一個(gè)容易被忽視的地方,是整個(gè)流程一定要足夠的輕,越輕,越容易推動(dòng),太重的流程,容易胎死腹中。
專業(yè)領(lǐng)域的積累差不多就聊這些,作為技術(shù)總監(jiān),還有更多的軟性技能需要鍛煉。
從技術(shù),走向一線的技術(shù)管理,遇到的***問題是個(gè)人效率。而從一線技術(shù)管理走向間接的技術(shù)管理后,新的問題又涌現(xiàn)。
隨著級(jí)別提高,管理范圍的擴(kuò)大,個(gè)人的工作逐漸呈現(xiàn)碎片化和間接化。對(duì)事的管理,漸漸變?yōu)閷?duì)人的管理,也給我?guī)砹撕芏嗟睦_。
碎片化是首當(dāng)其沖的問題。在新的崗位上,業(yè)務(wù)復(fù)雜性大大增加,精力會(huì)被極大地碎片化。
大公司的流程本來就復(fù)雜,除了項(xiàng)目,還會(huì)有各種其他部門和外部公司,為了滿足他們的 KPI,來占用你”一點(diǎn)點(diǎn)”的時(shí)間。
每個(gè)團(tuán)隊(duì)真的只會(huì)占用你一點(diǎn)點(diǎn)的時(shí)間,但架不住團(tuán)隊(duì)多。這是外部復(fù)雜性,如果咬咬牙還能避免困擾,大不了在最忙的時(shí)候,就拉下面子全推掉所有的邀約,也能有個(gè)清靜。
外部復(fù)雜性可以翻臉,但是內(nèi)部復(fù)雜性是無可避免的。做組員的時(shí)候,會(huì)覺得項(xiàng)目開發(fā)是有周期的,有忙有閑,除了最終版本是持續(xù)沖刺,其他時(shí)候很明顯會(huì)有段落節(jié)奏感。
但在新的崗位上,再也沒找到過節(jié)奏感。我當(dāng)時(shí)主崗不在項(xiàng)目,天涯明月刀項(xiàng)目是兼崗。
往往是項(xiàng)目沖刺的時(shí)候一起熬夜,搞完一陣子大家放松了,我開始處理主崗的積壓工作,差旅奔波。
組員回血的時(shí)候,我在回顧上一階段得失,在制定一下階段規(guī)劃,接下來該做什么,該怎么做,如何動(dòng)員內(nèi)部資源,是不是要引入外部資源協(xié)助。組員加班沖刺的時(shí)候,也要跟著一起往前跑。
而且大項(xiàng)目,總有這樣那樣的問題,天天忙著救火,這里消停了,那里又出問題了,要輪流去關(guān)注,經(jīng)常去支持。
工作中對(duì)碎片化問題需要特別警惕。技術(shù)學(xué)習(xí)需要不被打擾的 Unbroken Time 技術(shù)管理和決策更需要 Unbroken Time。
但在工作中,技術(shù)管理者是很難享受到不被打擾的時(shí)間。在開放的辦公環(huán)境,人來人往,大家向著你的工位,帶著他的疑問和訴求,希望能分享你的一點(diǎn)點(diǎn)時(shí)間,來讓整個(gè)項(xiàng)目變得更美好。
你又怎么忍心拒絕他們,關(guān)閉心門?最常見的做法,當(dāng)然就是割下你的一小片時(shí)間,分給你的隊(duì)友,換取和諧和共同進(jìn)步。
悄悄的他走了,正如他悄悄的來
他揮一揮衣袖,留下了一只猴子(注1)
注 1:[別讓猴子跳回背上(豆瓣)],有趣的個(gè)人效率管理理論,把任務(wù)比作猴子,每個(gè)人身上都爬滿了猴子,上級(jí)要避免把下屬的猴子接過來。
這是一部關(guān)于職場(chǎng)陷害和反陷害的書,反映了資本家管理者和白領(lǐng)員工不可調(diào)和的結(jié)構(gòu)性矛盾。
但當(dāng)你的時(shí)間支離破碎,你就沒有辦法去做高質(zhì)量的技術(shù)決策,沒時(shí)間思考項(xiàng)目方向,沒精力考慮團(tuán)隊(duì)管理。那些才是你更重要的職責(zé),對(duì)團(tuán)隊(duì)會(huì)產(chǎn)生更長(zhǎng)遠(yuǎn)的影響。
工作中的幸福程度,和你同時(shí)需要關(guān)注的事情成反比。
by 某總監(jiān)
讓我們一起來做些什么,打響反碎片化的***槍:
- 帶上筆記本電腦,從工位上消失。寫報(bào)告、做 PPT、做規(guī)劃的時(shí)候,這一招最有效。
相當(dāng)于你有一個(gè)虛擬的會(huì)議,這個(gè)會(huì)議就是你和自己的約定,說好了這次一定要搞定的呢,別給別人打斷你的機(jī)會(huì)。
- 和大家溝通,說明自己的情況,然后約定溝通的方式和時(shí)間段,把同步的溝通變?yōu)楫惒降臏贤?,小事留言,大事發(fā)郵件,天塌下來才可以找我。
當(dāng)然本質(zhì)上這是影響其他人效率的,所以適可而止,只在最需要的時(shí)候才用這招。
- 每周空出一段固定的時(shí)間思考,不約會(huì)議,不排任務(wù),身體和靈魂,總要有一個(gè)在思考,如果不是兩個(gè)都在思考的話。
時(shí)間是有彈性的,每次面臨出差或是休假,總能在***幾天把任務(wù)全部 Close 掉,效率會(huì)得到提高,同理,如果每周預(yù)留出一個(gè)時(shí)間段給自己來思考,那剩下的時(shí)間無疑會(huì)更高效。
當(dāng)然實(shí)際沒有那么理想化,總有這樣那樣的例外,總有不合適的時(shí)機(jī)。但只要有這個(gè)意識(shí),試圖給自己留出一些高質(zhì)量的思考時(shí)間,就會(huì)有幫助。
碎片化不可避免帶來了焦慮和壓力。專業(yè)能力上我逐漸找到了感覺,但在面對(duì)壓力時(shí),還是會(huì)恐慌。
本質(zhì)上來說,壓力來源于目前的能力不足以支撐你的野心。無論是我早期的引擎移植中遇到的專業(yè)能力,還是做這個(gè)項(xiàng)目遇到的管理壓力,都來自己能力的不足。
治大國(guó)若烹小鮮(肉)
by 老子,道德經(jīng)
沒有太好的手段來解決壓力和焦慮,舉重若輕的自信,來自于更高維度的能力。
對(duì)我而言,***次成功的引擎跨平臺(tái)移植后,面對(duì)新的類似任務(wù),壓力就小很多。管理過 30 人以上的程序團(tuán)隊(duì),回頭再管理 10 人團(tuán)隊(duì),也不會(huì)有什么焦慮。
沒有捷徑可以不焦慮,但有一些簡(jiǎn)單的方法緩解焦慮:
- 短期來看,良好的作息習(xí)慣。如果天天加班,回家就好好休息吧。別總是覺得公司加班的時(shí)間是留給公司的,晚上回家一定要給自己留點(diǎn)時(shí)間,熬夜玩一下。沒什么是晚上早早睡覺不能解決的,如果有,那就再補(bǔ)一個(gè)午睡。
- 中期來看,搞點(diǎn)體育鍛煉,據(jù)說 XX 能很好改善精力,且有巨大快感。這一點(diǎn)我深表懷疑,因?yàn)閺奈矣邢薜倪\(yùn)動(dòng)經(jīng)歷來看,每次運(yùn)動(dòng)完,我都沒有那種酣暢淋漓的感覺,一般的感覺都是更累了。
考慮到時(shí)代在變,白領(lǐng)們裝的方式也在變,現(xiàn)在就是流行說自己愛鍛煉,鍛煉包治百病,想來體育運(yùn)動(dòng)對(duì)緩解焦慮應(yīng)該也有一定的幫助吧。