李智勇《程式設計師生存定律》讀後感

李智勇《程式設計師生存定律》讀後感

  書中作者從四個維度,即自己可以控制的變數對程式設計師的生存定律進行闡釋和說明。它們分別是:自身的價值—自己能幹什麼?自身價值上的表達力—別人認為你能幹什麼?自身的稀缺性—市場對自身掌握技術的需求程度?所處公司的平臺—公司平臺能給自己提供什麼樣學習、展示機會?

  在程式設計師的職業發展道路中,最好要使努力和規律相吻合,並且在掙得選擇權的時候做出正確的選擇,才能使人生的效能最大化;

  要想掙得選擇權並且避免誤用,就要對程式世界蘊含的規律洞若觀火。首先要知道程式設計師人生的出口有哪些;影響這些出口的職場定律是什麼;在職場定律中哪些是預設前提;哪些是可控變數;其中可控變數是自己可以透過努力改變的,所以對自身而言,可控變數是掙得選擇權,並且避免選擇權被誤用的關鍵;

  程式設計師的人生出口:

  程式設計師的出口通常有五種:提前退場、維持現狀的老碼農、轉向管理層、成為超一流的高手、積累爆發創業;

  影響人失出口的因素有很多:機緣、天分、努力。機緣、天分皆為命數使我們不能改變的,我們能改變的、打破既定命數的砝碼只有努力。上帝是公平的,分給每個人的時間是一樣的,不一樣的只是人透過努力實現的效能不同而已。

  努力本身不是單純的付出,還包括方向的選擇、對形式的順應、對環境的駕馭。不考慮這些因素的努力,往往會努力但顆粒無收。

  職場生存定律:

  前提:交換是職場生存的根本;交換的兩端分別為:自身能創造的價值與自己的職位(包含收入的等);最終決定交換價值的是主要有兩個因素:內含價值與市場因素(稀缺性等)。

  0.生存定律總綱:假設一個人的技能所帶來的價值為S,實現程度為A,那麼S*A即為一個人可為公司創造的可見價值,也就是可以從公司交換到的最大價值;影響A的因素主要有:自身價值的表達力、自身價值的稀缺性、公司的特質和未來。

  1.自身的價值;

  人創造價值的基本途徑有兩個:一個是完全依賴自身技能,另一個則是假於他人之手。

  自身價值的實現過程中注意兩點:一個是如果想走技術路線,就走以技術為核心支撐的公司;如果想走管理就不要去純開發環境中。二是無論走那條路線都要努力走到專業和高階;

  2.自身的表達力;

  表達力不僅僅是語言層面的東西,過往的經歷、舉止、性格、習慣等都是表達力的一部分。

  適當推銷自己、讚揚別人、適當的從眾、搞好人際關係這類印象管理的手段來管理個人表現面也是一種不錯的方式。

  3.自身的價值的稀缺性;

  稀缺性是一種大勢,作為個人幾乎不能改變,只能做選擇以對應將來,在特定的時間點,做出恰當判斷的問題;

  稀缺性是有時效性的。

  4.所處公司的特質和未來:

  法律面前公司與公司是平等的,但是實際上公司和公司上的差異可能比人與猴子的差距還要大;

  總結:我們可以把這個定律和種種要素當做鏡子來用,看自己過去的失誤、現在的短板、未來的道路。

  軟體的世界是什麼樣子的:

  1.介入門檻低;

  避免使自己陷入只做應用級的開發被後來者淘汰的命運。

  2.技術更新快;

  很多傳統行業的技能往往依賴於自然規律,軟體行業所需的東西往往依賴於某個組織或者公司。

  資料結構和演算法算是比較長效的東西。

  越抽象、越偏向研究的東西其價值越長久,越具體、越立即可用的東西其時效性越強;

  3.同樣是軟體,但是,軟體與軟體的差距很大;

  對個人發展而言,要關注知識的可流動性這類問題。學習必須聚焦。

  對方法論而言,任何一種方法不僅要陳述自己的方法,還要陳述自己方法的使用邊界。

  總結:軟體行業中的特徵還有很多,但和程式設計師關聯比較大且無法改變的主要有上述三種。這三者類似於全域性變數、而程式設計師自身的努力相當於區域性變數,它們共同在生存定律下起作用,影響人生的最終高度。

  程式設計師的增值之路:

  對程式設計師而言,最根本的是提升自身的價值,忽略提升自己而單純的沉溺於成功學、方法論這些東西,自己早晚會吃苦果子。

  增值之路將從三方面來講:如何選定自己的方向、如何開始自己的學習、如何持續進階成為高手。

  1.方向的選擇:技術還是管理

  1.1技術和管理的差別:

  一旦走上管理崗位,那麼就會和PPT打交道的時間越來越長。雖然也會關注技術的最新動向,但是不會再去關注技術的實現細節了。

  管理和技術的工作有本質的區別:管理是和人打交道,就意味著處理事情的時間被碎片化了,處理的事情更加瑣碎了,被打斷的機率大大增加,不能專注的去寫程式碼了,而寫程式碼是需要專注的。

  1.2技術路徑長短對前途的影響:

  當一個公司的核心技術並沒有創造太大的價值,而是靠人力規模、商業模式來支援業務的時候,那麼我們可以稱之為技術路徑短的公司。

  單純在既定介面下實現已經定義的業務邏輯就是技術路徑比較短的工作,是體力密集型的。而分析業務邏輯,控制整體架構或者去研究TTS演算法則是智力密集型的,技術路徑較長。

  在選擇方向上,要避免選擇了技術卻去技術路徑比較短的公司,選擇了管理卻在純技術流的公司。

  1.3什麼樣的程式設計師適合轉管理

  外傾型(喜歡群居,善於社交和自我決斷)和經驗開放性(富有創造性,凡是好奇,具有藝術的敏感性。反之,則保守對熟悉的食物感到舒適和滿足)。

  1.4管理工作的負效應

  通純技術相比,管理工作的(特別是中層管理)的可流動性可能會非常低。

  2.增值之路的起點:

  2.1從哪裡開始程式設計生涯:

  軟體開發是實踐性非常強的科目,最好的學習方式是:學一點、實踐一點、再學習一點、再實踐一點。

  自己獨立做一個3000行左右的獨立程式,實現中包含UML圖和程式碼。

  精讀一個上點規模的(1到5萬行最佳)獨立性比較強的應用程式。選擇標準有兩個:一個是儘可能和自己未來期望的方向相吻合,二是儘可能比較獨立和經典;精讀過程中可能需要幾類書籍:平臺框架相關(執行緒機制)、模式相關、工具型的書籍(如何除錯)。

  精讀之後,再找一個專案實踐,最好能想知名開源專案提交程式碼;

  各種基礎知識中比較例外的是的計算機體系結構、資料結構和演算法這類理論性比較強的東西,這種學習曲線比較陡的東西需要結合大學課程把它學會,接下來在實踐中逐漸應用,而不能一邊做事學習。原因是學習曲線比較陡的東西需要大塊時間,畢業之後在學習會效率會比較低。

  2.2打牢根基VS速成之路

  如果形成對IDE的過度依賴,會導致根基薄弱,做事情被限制在某個有限的範圍內,無法應對新領域。

  打牢程式設計根基需要讀的書籍:計算機體系結構《深入理解計算機系統》,演算法和資料結構《演算法導論》,設計原則和模式《敏捷軟體開發:原則、模式和實踐》、GOF《設計模式》,軟體工程《程式碼大全》、《人月神話》。讀的工程中穿插實踐。

  如果非要速成,死磕一種流行的開源程式。

  2.3掌握讀程式碼的方法和技巧

  讀程式碼這事,要先分為精讀還是泛讀。

  從學習的目的來看,一定要精讀一定量的經典程式碼,而精讀是指每行都能讀懂,而不看程式碼就能在腦子裡勾勒出程式的基本結構。判斷標準:滿腦子都是程式碼,放不下。

  泛讀較大規模程式碼的方法:①先把規格說明書弄清楚,對於應用程式要先大致整清楚它的使用方法、使用場景;對應庫則弄清楚它對外介面的定義。②把涉及到的專業知識提前搞定。【接下來從大到小,從面到點】③弄清程式碼的基本靜態結構,如:包結構、類構成等,搞清楚每個部分的核心職責。④最常用的典型場景,思考上面靜態結構是如何發揮作用的,資料流的變遷。在腦子中生成比較高層次的靜態和動態結構圖,類似UML中的sequence圖和類圖。⑤關注程序、執行緒結構。⑥對自己負責的部分深入挖掘,可以把功能型的模組優先順序降低。判斷讀懂的依據為:單靠紙和筆能能描繪出程式典型場景的sequence圖。

  讀程式碼的背後有兩個基本技巧很重要:①掌握程式裡內嵌的Log機制,要能看Log,必要時候還能加Log。②基本除錯方法。

  2.4從哪門程式語言開始學習

  C語言必須學習;

  學習階段學習語言的目的是為了掌握程式設計的基本概念併為了更快速的掌握另一門程式語言。

  總結:

  寫程式、讀程式、學好學習曲線陡的知識、避免IDE依賴這些事情的根本目的是為了打好基礎。

  3.如何順利的成為高手

  3.1高手的定義和養成關鍵

  高手意味著專業,專業是生存和發展最為重要的一個前提;在特定領域內,能搞定大部分人搞不定的事情就是高手。

  要想成為高手,必須經歷:學習、思考、實踐、總結、分享的步驟。

  成為高手的路上要考慮軟體的三個基本特徵(技術更迭快、介入門檻低、多內部分野),人的黃金學習時間是畢業後的10年左右的時間。成為高手有三點比較關鍵:①要有一張全域性性的地圖,以便選好方向②知道都有那些坑,避免它③要有足夠的熱情和動力能夠持續的堅持下去。

  3.2全域性性的地圖

  每個人根據自己的情形建立一張分類的知識地圖,然後按照地圖選擇一條自己的路線,持續積累,尋找實踐機會。進階方向:①由程式設計師而架構師②由程式設計師而CodeGuru(捷徑:找一個應用廣,有深度的開源專案,參與進去)③由程式設計師而管理。

  要有產品的視角。

  3.3避免增值路上常見的.“坑”

  ①學習失去焦點。一旦誤讀了知識和目的間的因果關係,就會造成學習失焦,進而造成負效應,畢竟相對人的而言,世界上的知識不是太少,而是太多。一般認識是隻要學習就必有所得,對人生的的影響一定是正面的,然而在軟體行業裡面,這種想法不太正確,因為軟體的更迭速度快,子領域眾多的特質使得軟體相關的知識是爆炸性增長的。避免失去焦點,最有效的的方式是分類,清楚自己的目標,對軟體開發進行分類,對軟體所關聯的知識進行分類,形成自己的大局觀和整體檢視。

  ②學習與實踐相分離。很多人自學的東西和工作中用的東西完全沒有關係,這是很低效的。軟體是一種固化思維,軟體開發更多是一種實踐而非理論。軟體開發內,很多領域,總體上看體現的是複雜而不是艱難,不論是前端開發還是驅動開發。軟體開發的學習過程中,實踐很重要,純理論知識的權重較低,當然基本的演算法複雜度,還是要明白的。能做和做好之間的鴻溝需要大量的實踐來填平。最好的方式是以當前參加的專案為根基展開學習,這樣才能比較好的調和學習和實踐。

  ③“博”與“專”上面的迷失

  可以分兩次迭代:第1次,達到兩個基本目標。第一個目標是為產品貢獻自己力量,但程式碼質量一般。(比如:瞭解某了語音、平臺、IDE、業務相關的知識。用到的則要學透,不管接觸到哪個框架,都要了解它的記憶體機制、執行緒機制、異常處理元件構建和國際化處理這些全域性性的機制)第二個目標把事情做好,並能負擔起層次更高的工作。(比較深入的瞭解面向物件,結構化方法,設計模式,理解設計原則)。第2次有兩個方向可以選擇。考慮專的問題(在特定領域裡把知識深化下去,警惕邊界效應);考慮博的問題(熟悉專門領域的專業知識、即存框架下的特性、提高使用者體驗的關鍵點)。選擇的總的原則是以當下工作為根基,以實用為目的甄選各種知識,並追求平衡點。

  ④錯過人生中的好時機

  40歲左右,一個人達到人生的頂點,學習要順應自然規律,基本上講35歲之前學習

  比較硬、學習曲線比較陡的技能以及工作中所需要的主要技能。35歲以後主要關心知識的更新和軟技能。學習硬技能要投入大塊時間,集中精力,一次完成。比較硬的技能列表(精通一門最常用的語言、瞭解最常用平臺的基本機制(記憶體管理、執行緒)、UML圖和麵向物件分析設計方法、設計原則、設計模式、《程式碼大全》裡講的一切、精讀一個有點規模的開源程式、累積一定的程式碼量(獨立完整的做過一個數萬行的東西)、掌握基本演算法和資料結構、養成清晰的編碼風格、有自己的專業(金融、高併發網站、影象處理、TTS等))。

  ⑤停止知識的更新

  判斷自己是否停止知識更新的標準是:一年一本書沒看、一年一點新知識沒有接觸、一年中工作負荷基本不滿。

  3.4給自己找一個驅動力

  必須要有所執著,持續的運用你的腦力、體力去做某件事情。

  ①純物質上的驅動力。②興趣的力量。③使人生永動的勢能。人的思維和慾望具有無邊界特質,只有在未來和現實之間製造一種差距,那麼就會產生無盡的勢能,人也就會不斷前行。物質需要、成就渴望、不安全感的驅離、技術上的追求都可以使自己的勢能。

  總結:

  驅動力(讓自己的人生有歸屬感,有一種持續的驅動力)、明確方向(Guru,架構師還是管理者)、全域性檢視(對名目繁多的各種知識進行分類)、提高效能(避開學習和實踐相分離這種降低效能的增值方式)。

  自身的表達力磨礪:

  0.表達力的類別和作用:

  不同公司間不同的是對錶達力的需求程度,而不是表達力是否有其存在價值。

  表達力和技術技能不是一種對立關係,而是一種疊加關係。

  表達力並非僅限於語言,現實亦可作為表達力的佐證,但凡影響一個人在組織、他人的形象的東西都可以視為表達力。表達力是言行合一後的力量。

  1.改善表達力的途徑:

  1.1使自己有資歷;

  資歷本身並不能增加一個人的能力,但是它可以增加一個人左右的力量,影響個人力量的表達。資歷之中包含了三方面的力量:忠誠、信任、對既有規則和人員的熟悉。

  結論:資歷有助於提升個人能力,所以要給自己一點資歷,在徹底沒有希望的時候換工作。只有在自身價值無法增長且自己不願意混日子的時候換工作。不要低估資歷的影響而頻繁換工作,換工作是可以的,但想透過頻繁換工作而提高獲取較高職位的機率是緣木求魚。人這一生,跟對人是非常重要的。

  1.2.克服性格和習慣中的致命缺點;

  ①人情練達。與人合作,從他人那裡獲得更多支援並取得成績這一事需要人情練達。幾條傳統的智慧:欠別人的要記清楚,別人欠自己的可以含糊;要言而有信;不要為無所謂的事情的爭吵,乃至惡言;不要透過別人來證明自己;不要惡意欺騙他人。②有條件的順應環境。天下沒有完美的公司:很多人聚集在一起的地方几乎必然是名利場,名利場中幾乎一定有不堪的地方。知道哪類事情必須順應:最不應該順應的東西主要有兩個:一個是公司中處處顯失公平,一是個人在公司完全看不到發揮的機會和未來。從長期視角來看,主動去做,錯了也是對的

  ,被動做事,對了也是錯的。③去除致命的壞習慣:一是忽視細節,這會導致別人認為 你不具備做事的能力;二是負不起責任,這會導致別人認為你不用心做事。

  2.善用借勢:

  ①借勢的價值:取他人、他物為我所用,始終有著不可忽略的價值。借勢的一個小技巧:很多時候糊塗一點、包容一點,如果心思太細,眼睛太亮,那就很容易與所有人疏離。②借勢的具體方法:天時(公司的發展時期)。地理(公司的地理位置)。人和層面的借勢,直接接觸人群中的借勢AND社交媒體中的借勢。技術上的借勢。

  3.瞭解一點“政治”;

  ①程式設計師離不開“政治”,如果想往管理方向發展,那麼基本躲不開,如果想往技術方向發展,那麼依賴於公司的傳統。②可參考的政治手段:印象管理—誠實的宣傳自己,獲得更多的認可。常見的權術手段:合法性—強調自己的請求和組織的政策規則一致;理性說服—透過邏輯論證和事實依據來說明請求的合法性;鼓舞式訴說—透過所選人物的價值觀、需求等來開發情緒承諾;商議—透過讓他人參與決策如何執行計劃和變革來提高對目標的激勵、獲得更多的支援;交換—透過獎勵目標人物一定的利益和好處來交換接下來的請求。個人式訴求—使用友誼或忠誠獲得同意;逢迎—提出請求前,先吹捧、讚揚或使用友好的行為。施壓—透過警告和威脅,反覆重複你的要求;聯盟;③檢查自己的表達力:自己換工作的頻度是不是太高了?自己是不是一個惹人厭煩的人?自己有沒有一點影響力?

  總結:

  我們對錶達力進行了重定義,把它定義為資歷、性格、借勢、政治應對綜合後所表現出來的一種力量,而不是單純的言語表達。

  自身的價值的稀缺性:

  改善自己的稀缺性,通常需要同時做兩方面的工作:一是提升自己,一是順應時勢。

  1.奔向價值高地:(1)拓寬自己橫向的面(程式語言,業務邏輯,外語,網路知識等等)(2)成為專家型人才;注意關注的不是技術本身,而是是否能完整的做成一件與商業價值聯絡比較緊密的事情;考慮學習知識的可流動性;

  2.走在技術潮流前面或者裡面:基於現實擁抱學習新技術,基於現實要考慮到技術的實際價值,以及技術的學習實踐不可分離特性;新技術要以知識塊為單位;

  3.檢驗自己的稀缺性有兩種方式:方式一:如果一個畢業生做這件事情的話,多久能做好?方式二:自己掌握的技術是否即將過時?(為保持對技術動向的敏感度,定期閱讀別人的架構非常重要)自己掌握的技術還有多少人同樣掌握?(單純的會使用某種語言某種框架,稀缺性一定沒有。但對資料庫的設計有相當程度的掌握,能夠較好的透過負載均衡、快取等手段保證系統的效能才算有一定的稀缺性)。

  4.總結:從技術角度看,稀缺性就是選定一個技術路徑長,不處在衰落期的領域,不停的打磨,不停的前行。在技術大潮中的位置——》技術上的高度——》稀缺性。

  程式設計師的公司選擇:

  公司提供的崗位決定了你所接觸的技術、人物,進一步決定了你的眼界、能力和人脈,也一定程度上決定了你履歷的價值。這些都是對一個人至關重要的東西。

  1.公司的分類:

  地域(地域主要影響可流動範圍,一線適合事業,二線適合生活。)、行業(選擇主營是軟體且子行業在高速發展的公司)、分工所處的位置(儘可能考慮上游的公司,因為這種分工上的位置對成長和收入都會有比較大的影響)、時間軸(發展期,成熟期,衰落期。避免衰落期,儘可能選擇成熟期。)、核心競爭力(選擇有核心競爭力,技術導向的公司)、公司文化;

  外包行業:(從好到差排序)知名的獨立軟體開發商、前景比較好的獨立軟體供應商、高階外包業務的公司、低端外包業務的公司。

  網際網路行業:搜尋引擎,大資料,社交網路可以認為是網際網路,但是挪到網際網路上ERP也還是ERP,不能算網際網路行業。

  外企:透明天花板(國內企業高於歐美企業,歐美企業高於日韓企業);規範程度(越是本土企業,反倒會差一點)。

  受非市場因素影響較大的公司:應該規避這類公司。

  2.選擇公司的方法:

  做選擇的過程基本是這樣的:先給公司分類並且搞清楚特定公司的利弊得失(看一下公司的核心競爭力和技術路徑);考慮自身的狀況進行選擇(考慮兩件事情:工作要和自己的根基契合,要揚長避短;在發展、賺錢、安穩和興趣之間找到平衡點,興趣>發展>賺錢>安穩)。

  選擇知名網際網路公司(規避子公司)、技術路徑長、主營產品為軟體(不是主營軟體的公司會碰到的情況:永遠要用最簡單最直接的技術做基本能用的軟體;可能不會被重視,會和周圍的人格格不入)的公司;

  技術牛人的成長經歷感悟:

  1.自學能力是競爭之本。

  2.自信能讓你與眾不同,儘管有時的自信有點莫名其妙。

  3.興趣是學習效率的催化劑,培養自己的職業興趣。

  4.學習應給自己設定虛擬的專案目標,以做專案的形式提升學習效果,只有這樣學習的內容才會深入而實用,切忌無目標的學到哪裡算哪裡。

  5.話語權首先來自能力,而不是職位權力。

  6.難學的技能一旦掌握,更具有競爭優勢。

  7.用階段性成果不斷增強自己的自信,但最終支援自信的是能力,而不是自大。

  8.做自己喜歡的事情,如果那是自己興趣的話更好。

  9.無論身處多麼困難的環境,即使覺得前途渺茫,也不要放棄學習,否則就是“自斷筋骨”。

  10.機遇很重要,但是你得有能力才能抓住它。

  11.職場比拼的不是智商,而是堅持和好習慣。

  12.當短期利益與長期利益無法兼得的時候,選擇長期利益。

  13.學歷是很重要的敲門磚,即使你得能力很強,學歷儘管很重要,但能力才是最終的通行證。

  14.技術細節掌握的越深,解決問題是就越能遊刃有餘。

  15.技能的發展應採取深度先於廣度且交替進行的方式,只有這樣,面對新知識時候,才能更加淡定。

  16.越難的技術問題,其背後蘊藏的知識越豐富,越具有學習的價值。

  17.每次積累的點滴知識,一定會在將來不知不覺發揮效能。

  18.透過文件化的方式傳承知識給後繼者是你的基本責任。

  19.別人對你價值的認可,不僅僅根據你的自身能力,而是根據你對他人和團隊的貢獻。

  20.英語的聽說讀寫,只要有合適的環境,並用於張嘴的練習的情況下能快速的提高。

  21.在軟體開發活動中,應設法透過有效的技術途徑去解決工程困境。

  22.不要用沉默的方式一味迎合別人的要求,據理力爭或許才是作為的表現。

  23.流程、文件的作用,不僅引導我們完事,還規範我們的行為培養我們的習慣。

最近訪問