軟體工程師應該知道的9件事
三年前,我還在巴塞羅那的神經科學實驗室工作,忙著研究腦電波、教授心理學上的認知系統課程。而今天,我以設計和寫軟體為生。
你或許會滿頭黑線:隔行如隔山,這轉變也忒快了吧。其實不然,早在以前我就已經寫過很多軟體了——比如想理解掃描出來的有40GB那麼多的大腦資料,我得捋起袖子、埋頭苦幹,寫個能緊縮這些資料的指令碼。所以我一直以來就是一個能幹的程式設計師。但是直到我最終下定決心辭去了這份在學術上能有所建樹的工作,轉去一家朝氣蓬勃的創業公司打工,我才明白了什麼是軟體工程師——而更重要的一點是,知道了軟體工程師是幹什麼的。軟體工程師並不意味著你得學會更多的程式語言、類庫、演算法和設計模式。它是一種心態。
如果我能早點懂得這些,我的工作肯定要輕鬆的多。不過亡羊補牢,猶未晚矣。
下面是我寫給自己的注意事項,是我在這三年裡學到的經驗教訓,有的甚至是慘痛的。
1.智力不是萬能的
如果你還年輕,聰明機智慧讓你的道路走得更加順暢。聰明能讓你鶴立雞群。如果你有強大的表達能力就更妙了。老實說,聰明和好口才能讓我們在高中和大學裡所向披靡,輕輕鬆鬆就能拿到個好成績。——如果你兩項都具備,那麼首先要恭喜你,你是一個幸運兒。但是同時你也很不幸。因為當你毫不費力地考上一個好學校,隨便看看就能通過考試,其他智力不如你的人卻因此學到了將來會受益無窮的品質:勤奮、耐心、協作等等。
當今社會太過於看重智力。當我告訴別人我曾經在神經科學方面工作過,大家第一個反應往往是:“哇,你肯定超聰明的!”我不得不說,我認識很多人或許智力方面不及我,但是卻的的確確是更為優秀的神經科學家。
智力毫無疑問能為你開啟前行的大門,但是如果光有聰明,工作是永遠不可能做好的。勤奮、嚴謹、可靠的網路,最後還有守信等等,不光是在軟體工程領域甚至在其他專業都是必須的基本品質。而這些是學校不會教給你的。
2.為你自己鼓掌
這句話可能大家看到過很多次了,但是這的確有著其不可忽視的重要意義。無論結果如何,只要努力了,那麼就應該為自己自豪,為自己鼓掌。不是所有努力都會有成果。我們誰都喜歡在報刊雜誌上出現自己的名字,但是中間過程卻異常艱辛。首先得想出一個好的課題,否決一些假設,然後才能一步一步進行研究——這個課題可以大至人類也可以小至在試管裡漂浮——根據需要而定,然後嚴格分析資料和驗證統計資料,如果發現有錯誤就毫不猶豫重新開始。看著過程就頭皮發麻!
寫軟體意味著要規劃特點、研究現有的開原始碼、學習新的模式和程式語言、修復bug、重構及維護等等。如果在這些過程中你絲毫沒有感覺到樂趣,只是把這些步驟當做是得以發表論文、釋出產品的工具,那麼你永遠也不可能在這個領域真正有所建樹。如果你在提升自己技能方面沒啥目標,那麼我建議你還是儘快轉行,哪怕是去做科學家、工程師還是別的什麼,都比現在這樣浪費時間要好。
為自己鼓掌、以自己為榮意味著,你在做的專案是自己喜歡的,可能這些專案看上去又小又蠢,為了不影響整個專案的順利完工,可能根本沒有必要投入精力馬上去做,但是你就是孜孜不倦、刻苦攻關。只因為兩個字:喜歡。有意思的是,這似乎在軟體社群是個相當普遍的現象——我們每天在用的很多產品開始僅僅是因為開發者個人的愛好而已——但是卻在科學界極為少見。下面是Konrad Lorenz(奧地利動物學家、動物心理學家、鳥類學家、諾貝爾獎優勝者)寫的我最喜歡的一段話之一,和大家分享:
“對研究型科學家而言,
在早飯前
回顧丟棄寵物的假設
就是最棒的晨練了。”
如果你感覺這聽起來很愚蠢,那麼也許你並不應該成為研究型科學家。
3.學習新工具
學習新工具不只能夠擴大抽象的知識領域,並且在有的時候藉助這些工具還能幫助我們解決問題。付出總有回報,一切很快就會見分曉。
學習新工具的一個好辦法就是類似上面提到的要自己喜歡,畢竟興趣才是最好的老師。當你構建好新模型或者別的什麼之後,可以試著用另一種工具再構建一次。要記得,失敗是成功之母,人都是在逆境中成長,在失敗裡學習的。不過如果你認為沒必要繼續了,學到的已經足夠了,或者不可能成功,或者對此你已毫無興趣,又或者你發現這個挑戰超出了你的能力範圍,那麼就此放棄也可以。
以下是我強烈建議學習的一些好工具:
- Git和Github。有了Git,媽媽再也不用擔心我的備份了。而Github上有超多的事例程式碼,這樣你就不必老是自己重新寫過了。
- 插圖軟體。我個人比較喜歡Inkscape,不過Adobe Illustrator和新出來的Sketch 也一樣棒。
- 學習如何有效使用文字和程式碼編輯器。
- 學會如何講話。
- 涉獵Python, R, HTML 和 Javascript等等的基礎知識。
對一個問題的解決方案往往會受到我們所用工具的限制。學習新工具也是為了能跳出這個框,從其他的角度看問題。
如果你還在上大學,那麼我強烈建議你每週定一天時間用於學習新工具。如果你已經是在搞研究的博士,那麼可以每週兩天。從長遠來看,這會節約你解決問題的時間,別人會因為你的高效率而震驚讚嘆。如果你覺得你沒有那麼多空餘的時間,也不需要給自己壓力,可以向年長的同事請教,如何去正確分配時間。
4.成為利益相關者
眾所周知,主管以及CEO總是把公司的利益放在首位,這是他們的工作職責。
但我們談到公司的最大利益,我們往往指的是利益相關者的最大利益。而現在的問題是:哪些是主管和CEO眼中的利益相關者,這些利益相關者的利益又佔多少比重?
如果你的老闆認為他/她自己是唯一的利益相關者,那麼趕緊走吧。不然的話,要是找到合適的傢伙,你就會被拋棄。還有哪些會是利益相關者呢?投資者或者慷慨的捐獻者,員工,學生,還是全人類,都有可能,關鍵是要儘快找出來。並且如果你不在利益相關者當中,那麼離開。
5.釋出
“釋出”這詞已經成為了科技領域的新寵。它的意思是把我們的產品從倉庫中取出來展示給消費者。這不僅僅是一個動作,更是一種心態。如果不能把產品成功交付給客戶,那麼意味著我們以前的工作毫無價值,是無用功。關於這一點,是我們要時刻謹記的。
以前在學術界的時候,我寫的大多數軟體必須一一對應系統。而現在要為五十萬使用者寫軟體,這真的大不相同。
這也意味著,如果不能釋出一個完美的產品,我們就得一直迭代。所以如果想盡快得到一個完美的產品,那麼釋出吧!有壓力才有動力,集思廣益,查漏補缺。
6.瞭解80/20法則
80/20法則的基本意思是,花上20%的時間能實現專案80%的預期效果,然後剩下20%的專案成果則需要80%的時間才能拿下。舉個例子,假如你從郊區開車前往市區:在20%的時間裡走了80%的路程,但是當你碰上交通堵塞,呵呵,剩下20%的路程就會用去你很多很多時間。
那麼瞭解這個法則有什麼意義?因為如果沒有這個法則指導,很多人往往會低估完成一個專案所需要的時間。科學家和工程師更是容易犯這種錯誤。不光是這個法則,還有部分是經驗問題:懂得越多,就越能更好的預測開工之後會遇到的各種問題,而這一點是很多人想不到的。
如果你還沒有這方面的經驗,那麼可以將你認為所需要的時間乘以五,希望經過五分之一的時間之後,你會明白對80/20法則有所瞭解。
7.不要出賣自己的靈魂
我攻讀我的博士學位完全是個錯誤。其中一個錯誤我把它叫做“學術犯罪”。因為那個時候我覺得如果我不去讀博士完全是浪費了我的天賦。不過我覺得我有所虧欠於那些支援我學術生涯的人——教授和支付我獎學金的人——因為我最後並沒有去搞研究。他們投資了我的未來但是很可能會失望,因為他們的投資並沒有成果——我並沒有成為一名偉大的科學家。不過這是他們的問題,不是我的。
這同樣也適用於任何其他工作。人們給你投資,是他們利益最大化的選擇。這並不意味著你由此需要出賣自己的靈魂。
8.離開自己的安樂窩
以下是我對世界的看法:
在一個你熟悉的地方,舒適又安全,你可能學進去很少。然而當處於恐慌的心態中,你可能啥都學不會。
每個人都有自己的“狗窩”,在這裡,你放浪形骸無拘無束,角落裡藏著什麼都清清楚楚。不過如果你想學到新事物並且能夠迅速成長起來,那麼首先你得離開這個“安樂”的地方,自己在學海里迎風破浪“苦作舟”。
當然,如果你感覺不堪重負,那麼其實矯枉過正,已經處於恐慌的境地了。可憐的你,風浪太大掉海里了!現在唯一能做的就是儘量保證自己能活著等別人來搭救。
而正如上圖所示,在到達恐慌的境地之前的最高點,我們能學得更多,成長得更快,變得更優秀。找到你的學習最高點。
9.馴服思維之猴
舒適地坐下來,閉上眼睛,平穩的吸氣呼氣。感覺一下噹噹空氣流出你的鼻子流過上嘴脣皮膚帶來的美好。什麼都別想,好好感受。
大腦放空多久了?有五分鐘了?可能不會。一分鐘?太棒了。20秒或者更少?好吧,這才是正常值。你的思緒就像一隻猴子,它在樹上跳來跳去,看到哪個枝幹最近就抓著哪個跳過去。你可能還不理解,我再重新用專有名詞表述一下:現在比較流行的說法是聯想性思維。如果你想發明創造,那麼聯想性思維絕對是不可或缺的好工具,但是它卻是專注的殺手。幸運的是,專心致志是可以學習的。現在有非常非常多號稱“能提高生產力的高科技”,但是都還停留在表面因素。誰都不希望在寫軟體的時候,思緒飄啊飄得在想義大利麵怎麼做才更好吃。我們需要馴服這隻頑皮的猴子,一勞永逸。
不過適合我的方法可能並不適合你。我通過定期使用上述沉思的方法(這方法還有其他有益之處)從而獲得了很大的成效。不過即便是如此,我也不敢保證每個人都適合。我所要推薦的是,要保持你的頭腦處於最佳狀態,這很重要。還覺得冥想是在浪費時間?我們每週都會去健身房鍛鍊身體,不過在心理鍛鍊上你得花上至少兩倍於此的時間:減去幾磅雜念。鍛鍊自己的思緒以便保證在工作時自己的頭腦可以專注更長時間。
相關文章
- 作為軟體工程師你應該知道的100件事 - Harish軟體工程工程師
- docker – 你應該知道的10件事Docker
- IT安全專業人員應該知道的12件事
- 程式設計師最應該知道的20件事程式設計師
- 關於iPhone SE你應該知道的20件事iPhone
- 大規模執行MongoDB應該知道的10件事MongoDB
- 在IT界取得成功應該知道的10件事
- 程式設計師應該知道的97件事程式設計師
- 軟體工程師必學的9件事軟體工程工程師
- 每個軟體工程師都應該嘗試的5件事軟體工程工程師
- 每個軟體工程師都應該嘗試的5件事情軟體工程工程師
- 每個程式設計師應該知道12件事程式設計師
- 新手程式設計師應該知道的7件事程式設計師
- 軟體架構師應該知道的97件事架構
- 獨立開發者入行之前應該知道的8件事
- C#開發人員應該知道的13件事情C#
- 《深入HTML5》之你應該知道的5件事HTML
- 網站開發人員應該知道的61件事網站
- 網站開發人員應該知道的62件事網站
- 專案經理應該知道的97件事 --譯者序
- SQL Server 2005:你應該知道的13件事(轉)SQLServer
- 每個Java軟體架構師都應該知道的20件事Java架構
- 你應該知道的9個優秀的CSS框架CSS框架
- 作為軟體工程師,我學到的9件事軟體工程工程師
- 你應該知道的 9 個 Docker 技術知識Docker
- 每個黑帶大師都應該知道的10件事(建議收藏)
- 關於 Unicode 每個程式設計師應該知道的 5 件事Unicode程式設計師
- 《專案經理應該知道的97件事》讀後評價
- 關於計算機書籍,你應該知道的五件事。計算機
- 資訊圖:你應該知道的Android使用者的7件事情Android
- [Flutter翻譯]開始使用Flutter Web之前應該知道的7件事FlutterWeb
- 程式設計師應知道的12件事程式設計師
- Ruby開發者應該明瞭的15件事
- 你應該知道的FlutterFlutter
- 你應該知道的RocketMQMQ
- 前端應該知道的GraphQL前端
- (轉)程式設計師應知道的12件事程式設計師
- 寫程式碼之前應該做的幾件事