現如今,可供選擇的技術、語言及平台可謂五花八門,因此作為軟體開發人員,要弄明白哪裡是花時間培養個人技能的最佳投資點也就難上加難。常常有人向我徵求關於如何成為更強的程式員的建議。人們問得最頻繁的問題可謂萬變不離其宗,即他們是否應該把時間花在某種與眾不同的特定程式設計語言或技術上。
最近我花了很多心思琢磨此問題,並想出了一些我認為最要緊且能讓你受益終生的技能,一旦軟體開發人員掌握了這些技能,不僅會給他們帶來最佳的工作機會,還會使他們變得卓有成效。
技能一:解決問題(Solving Problems)
以前我曾談到需要學會如何解決問題,甚至給出了如何學會解決問題的若干步驟,因為我認為這種技能對任何軟體開發人員都是至關重要的。軟體開發百分之百就是解決問題。
若毫無問題,就無需軟體。
所有軟體都被設計用於解決某些使用者問題,而通用解決方案就是由許多能搞定的小規模問題所組成的陣列。要是你不能解決問題,就不會精通軟體開發,而你所用的程式設計語言或技術也就無所謂了。在解決問題時,大多數開發人員的表現簡直糟糕透頂。
我常常會聽到一些關於求職面試太難的抱怨,因為面試官會要求開發人員去解決有一定難度的問題。我談過為何有難度的面試挺好,而其中的部分原因在於,面試官就是要測試開發人員解決問題的能力。我知道,許多開發人員仍然不同意我對此問題的觀點,而且他們也不明白像TopCoder[2]那樣的網站為何要不遺餘力地完善其開發技能,至少從我的親身經曆來看,那正是TopCoder解決問題的實踐活動,而參與此類實踐活動正是我職業生涯的轉折點。
假想你是木匠。要想成為出色的木匠,也許你應該擅長切削木材。也許你應該親手做過各種各樣的組件,同時也用過許多不同的工具切削木材。
無論你的木工經驗有多少年,抑或設計出的傢具或櫥櫃有多漂亮,每次你也要想方設法切削木材,努力做出各個組件。切削木材是木工活的基礎技能,就像解決問題是軟體開發的基礎技能一樣。
技能二:自學(Teaching Yourself)
在生活中,可能沒有比學會學習更重要的技能了。此種技能在軟體開發中尤其重要,因為據我所知,任何領域的變化速度都超不過軟體開發。你不可能無所不知、無所不曉。甚至你都來不及投入時間去成為某一特定架構或技術的大師——因為事物發展得太快了。反而,你需要這樣的能力,即為完成手頭任務而快速擷取所需知識的能力。
要是你真想具備某種能讓你在軟體開發職業生涯中始終與時俱進的技能,那就學習如何自學吧。
提高此種技能的唯一方法就是付諸實踐。走出去學習新的程式設計語言或技術,即使你認為決不會用得上它(也不妨學一下)。將來你會驚訝地發現,你竟然可以很快地把它撿起來,因為你早就對相關基礎知識一清二楚了。要是你能迅速適應日新月異的軟體開發市場、以及與之相關的各種技術和平台,你就會擁有那些總是很搶手的技能。
儘管我對蒂姆·費裡斯(Tim Ferris)的某些主張有點兒懷疑,不過他寫了本很棒的書,名為《4小時變身廚師》(4-Hour Chef),其中介紹了若干如何快速學習事物的絕招。(我那時也正打算寫本與此主題有關的書。)
技能三:命名(Naming)
要是有人問起我成天在做什麼,那我八成會說“研讀其他人命名的事物,以及給事物命名。”誠然,若沒人真那麼問,我也不會真這麼答,不過我的確有可能這麼答哦。
軟體開發就是在描述形而上學的內容。我們所構建的大多數內容都是看不見摸不著的。授權經理收到授權請求,然後發出授權響應,與此同時,使用者資產庫會調用使用者工廠去組建新使用者——我們必鬚根據以上描述在心中去構建起完整的環境。
每次你編碼時,就是在給事物命名。當閱讀自己或他人所寫的代碼時,你會從代碼中的事物名稱獲得對代碼的大部分理解。通過在開發人員親手編寫的代碼中查看方法、變數及類的命名方式,大多數情況下,我能準確預測出開發人員的技能水平。要給代碼中的概念及資料起合適的名字,而缺乏此能力的開發人員就像個啞巴翻譯。無論你能否明白某事,要是你不能妥善地解釋它,那麼此事會轉瞬即逝。
提高此種技能的最佳方式就是不斷實踐。只要我在讀代碼時有所領悟,我往往會重新命名代碼中的事物。由於我開始明白某個方法到底在做什麼,因此我會給方法改名,以便與我的理解相一致。在讀代碼時我會做這麼做,即便代碼沒有產生任何邏輯變化,也照樣會這麼做。
你越關注給事物起合適的名字,你就會越擅長此道。這也是你代碼中最顯而易見的一面。簡單看一眼你的代碼,很難分辨代碼正確與否或效率高低,但如果代碼能讓我一望而知,那麼我會認為你知道自己在做什麼。
技能四:待人接物(Dealing with People)
儘管我把此種技能排在最後,不過在許多情況下,你可能會說它是首要的或最要緊的技能。所到之處皆有人。除非你單獨工作,且只為你自己開發軟體,否則,作為軟體開發人員,其他人就會影響到你的職業生涯。我以前談過為何你可能不想批評某人,不過我們更多地是與他人打交道,而不是惹人煩。我總是會重新捧起戴爾·卡耐基(Dale Carnegie)的那本名著《人性的弱點》(How to Win Friends and Influence People),因為這本書對於學習如何做一名成功人士是如此重要。我以前說過,倘若你想提高人們的技能,那就閱讀此書吧。
基本問題是,人類不是合乎邏輯的生物,我們是情感生物。當然,我們喜歡為我們的推理能力而自豪,不過實際情況是,我們所做的大多數決策更多地受到情緒影響,而非理智。
作為軟體開發人員,此種技能對你的意義在於,除非你能妥善地處理與其他開發人員、經理、甚至客戶的關係,否則,即便你有許多好點子或很有用的技能,你還是會四處碰壁。一般說來,積极參与到軟體開發社區中去也會對你的職業生涯有很大協助。不要僅限於人際交流,而要把你的名字傳播出去,並廣結善緣。成功做到這一切直接取決於你待人接物的能力。(在學習如何待人接物時想走捷徑。那很簡單。請與人為善。)
怎樣看待實用技能。
請注意,在我的列表中並未包括任何特定技術,甚至連Web開發或移動開發這樣寬泛的技能也沒有,這是何原因。在一些技術領域具有堅實的基礎的確很重要,不過這些領域都不及我上面提到的這4種技能重要。要是你能夠解決問題、快速學習事物、恰當命名事物、以及待人接物,那麼與你專門從事任何特定技術相比,從長遠來看,你將會取得更大的成功。
有這樣一種說法,要深入學習一到兩門程式設計語言,並從事某個通用的專業領域,這當然很重要,不過,只要你還沒帶著那些抉擇在這條老路上走得太遠,並把精力集中在提高這4種重要技能上,你自會萬事大吉。(你甚至可以學習C++)
譯文出自:圖靈社區(譯者/高翌翔)