
作者:阿諾,有删改
引言
John Z. Sonmez是一位來自矽谷的傑出程式員,2016年他出版了《軟技能:代碼之外的生存指南》一書。這本書在中國翻譯出版之後,引起了國内廣大程式員的熱烈讨論。
許多人從那本書中發現,原來程式員們可以在事業上有更多的選擇,從書中也學習到了很多提升效率,精進技術能力與管理水準的方法。
如今,John推出了他的新作《軟技能2:軟體開發者職業生涯指南》。這本書則将焦點放在了程式員的職業發展之路上,John以自己的經曆與體會告訴大家,如何突破職業瓶頸不斷進取。
一名程式員把代碼寫好,這是最基本的職業要求。但如果想要在軟體開發的職業道路上走得更遠,僅寫好代碼卻又是不夠的。幸好,John把那些除了寫代碼還需要學會的内容,都放進了《軟技能2:軟體開發者職業生涯指南》之中。
對于身處任何一個階段的程式員來說,這本書都是一個福音。當對職業發展感到迷茫的時候,不妨拿起這本書來翻一翻,興許就能找到突破口了。
成為程式員之前
廢話不多說,程式員要學會的第一件事當然就是寫代碼,看看《軟技能2》是如何指導新人學習寫代碼的吧!
打好基礎:算法與資料結構
無論是在校大學生還是程式設計愛好者,一定都接觸并使用過至少一種程式設計語言了。不管起步多麼Low,起碼是學會了基本的文法,知道順序、選擇、循環語句是怎麼回事。不過,到了實際工作中,需要達到怎樣的程式設計水準呢?
程式設計語言隻是一種工具,它能實作程式設計者利用計算機完成一項任務的意圖。決定程式設計水準的不僅是對程式設計語言的熟悉程度,還包括算法與資料結構能力。像算法與資料結構這樣的基礎課程卻是要必須先學好的。
計算機本質上就是一台資源有限的運算機器,程式員要做的是如何最大化地使用這些資源達成目标——先學會準确地判斷問題類型,然後評估實作的複雜度,這包括時間複雜度與空間複雜度,最後選取最合适的算法來解決問題。
資料結構則是對模組化能力很好的培養。所謂模組化能力,就是能夠很好地将現實問題,投射到計算機的運算空間,通過有限步的計算将問題加以解決。這決定了一名程式員掌控系統規模的能力,如果一個系統在開始時規劃模組化不合理,那麼其複雜度就會随着規模的擴張而線性增長,最後系統在錯綜複雜的細節裡崩潰。
是以,在學會使用程式設計工具之後,一定不要高興太早,還要花大量的時間學習算法與資料結構知識。這樣才能為接下來的學習打好基礎。
做中學:在實踐中領會
練好了基本功,接下來就是要為工作具備動手能力了。《軟技能2》建議在學習一項技術的時候,不要僅滿足于會用,而要尋找到一個實際的需求去應用這項技術。
Charles Deluvio 拍攝,來源:Unsplash
對于在校大學生來說,程式設計語言的課堂作業一般都會要求實作一個具體的應用。大學生們要重視這種實踐性的作業,不要覺得“做這個能有什麼用?” 而不去認真對待。因為程式設計能力是需要耐心和毅力才能培養出來的,不是說寄希望于進了公司會有人來教會自己。
至于更有追求一些的話,那則可以從自己感興趣的領域出發,去學習研究新技術。例如,作者John最早學習程式設計的動力,是想給自己開發遊戲玩。當然,他後來才知道開發一款遊戲和玩遊戲根本不是一碼事,但興趣已經支撐着他學會了不少技能。
“做中學”是一個很好的理念,它可以讓學習者将精力集中在最有用的點上。一門程式設計語言沒有必要掌握到100%的程度才去動手實踐,在Jonh看來,當掌握了程式設計語言20%最核心的部分時,就可以開展實際工作了。
因為隻有動手走起來,才會關注到怎樣通過程式設計去解決問題。例如,如何設計UI以采集資料;使用何種資料庫存儲資料;遇到性能問題時,如何優化算法提高效率。如果不是将做一個有實用功能的程式作為目标,恐怕連調試器都有可能不知道該如何使用。這便是做中學的意義與價值所在。
在這個過程中,學習者已經能夠使用開發工具,實作簡單功能的程式了。更深入一些的,應該還會使用架構,接觸到設計模式的知識了。
到了這一步,已經可以去挑戰一下,看看能不能找到一份軟體開發的工作了。
怎樣找到一份程式員的工作
開始找工作的第一步當然是給自己制作一份光鮮的履歷。盡管作為一名新人來說,不可能有多麼豐富的經驗,但在履歷上依然可以表現出自己的亮點。John的建議很有意思,他認為求職者不要自己寫履歷,而是交給專業的履歷寫作者。
寫履歷有一個重要的原則,就是一定要誠實可信,不能誇張到全是水份。因為有經驗的面試官兩三個問題就能探出虛實來,那時候吃虧的還是求職者自己。但履歷内容也不必一五一十好的壞的全寫出來,要突出表現出自己的亮點,這些可以是做過的實踐、資格認證、性格特點、興趣愛好等。說白了就是要學會誇自己,還要在事實的範圍以内。
當履歷有幸被HR選中,接下來就要坐到面試官的前面了。面試過程一般分為筆試與面談,筆試好說,現在網際網路上有海量的題可以去刷。面談才是一場面試中的重頭戲,說它占了七分甚至八分的比重都不為過。
有一點要注意的是,求職者在面談環節不必要去過分“表演”。每個人的性格都不相同,如果要擰着自己去彌補性格中的另一面,則多少有些得不償失。例如,一個平常内向少語的人,非得表現得外向健談,估計反而會給人不倫不類的感覺。是以,做真實的自己就可以,真誠自信才更容易打動面試官。
說到找軟體開發的工作,不能不提到市面上林林總總的程式設計教育訓練班。John在書中提到在美國也有這種形式,就是程式設計訓練營,這是那些非專業人士很好的選擇。但中國的國情顯然不同,美國的大學裡計算機教育水準高,學生動手能力也強。但中國的大學裡教學注重基礎理論,實用性不強,導緻很多專業的大學生畢業後也會選擇花錢去報一個程式設計教育訓練班。
我無意去比較程式設計教育訓練班哪家強,但隻要不是太坑的,基本上都會做到三件事。第一是在短時間内高強度地讓學員完成一個項目;第二是會給學員大量刷面試題;第三則是傳授面試中的各種套路及應對之策。
如果本身是有一定基礎的學員,通過程式設計教育訓練班強化一下,這對他來說是一次值得付出的投入。但如果本身專業功課沒有學好,指望程式設計教育訓練班突擊兩三個月就脫胎換骨,這是不現實的。
是以,一位有志于要投身程式員事業的新人,最好還是抛掉幻想,從基本功開始修練,将這看作一場十年甚至二十年的艱苦曆程。
成為程式員之後
成為一名職業程式員,僅是走出了第一步。相信大家都在網上看到過讨論,就是35歲以後的程式員要何去何從。程式員到了35歲就會被這個世界抛棄嗎?好在《軟技能2》告訴了我們程式員的精進之路。
職業素養
有一種我們都見過的程式員:說技術,他不好不賴;說業績,又沒有什麼亮點。總是看到他在很多項目裡出入,就像萬精油一樣四處被使用。加薪晉級又總是跟這樣的人無緣,看似做了不少事,混得卻像可有可無一樣。問題出在哪裡?
問題就是職業素養不過關。這樣的程式員有個共通之處,就是不喜歡承擔責任,安排什麼活就幹什麼。就算要幹還必須是很具體的活,如果任務定得大一些,他們就會找各處理由推托。久而久之,他能接到的也就是各種具體而繁瑣的工作,這對于個人成長來說顯然沒有助益。
是以,程式員要有承擔責任的意識。我們要站在比本職工作更高一級的角度來思考。書中John建議程式員要以比本職位高兩級的方式來着裝,這也暗含了思維也要站到更高一層的道理。說白了,程式員最好能充分地意識到自己所做的工作,在公司的業務中起到的是什麼作用。
其次,還需要做到重視自己的承諾,答應的事情是一定要做到的。責任承擔下來了,最後不了了之,這個結果更壞。承擔責任不是信口開河,而是在自己的能力邊界上剛好突破一些。每次都挑戰一下自己,累積下來的成功就很可觀了。
培養職業素養,就從勇于擔責,言出必行做起吧。
自動化思維
從瀑布式過程到靈活開發,不管軟體工程理論怎麼演化,實際工作中自動化已經是無可争議的趨勢。這些自動化工作包括開發管理、測試管理、持續內建與部署。可以說,不具備自動化思維的程式員,猶如還處在蠻荒時代一樣,做什麼事都靠着自己的蠻力去完成。辛苦自不必說,效率也被别人甩下幾條街,到頭來怎麼被淘汰的都不知道。
在這裡,程式員的技能就必須要擴充了,真的不能隻将程式員的工作定義為單純地寫代碼。就從開發管理說起,現在一般的公司都會有源碼管理服務,例如git、svn等。程式員們在完成一天的開發工作之後,就會将自己的代碼簽入源碼管理服務中。這在以前可能就萬事大吉,可以下班回家浪去了。
但要做到持續內建,則需要部署一套自動化的建構系統,當任何一段代碼被簽入時都會觸發一次建構活動。這就要求程式員在開發時就要把事情做完,包括編譯通過、自測完成。那麼問題來了,編譯好說,隻要編譯器不報錯就行,自測怎麼做?John給出的建議是程式員要編寫完善的單元測試。
為什麼要強調程式員一定要有自動化思維,重點就在這裡了。我們都知道要做單元測試的重要性,但偏偏實際工作中總有各種借口和理由不去完成它。例如工期太緊,項目着急上線等等,最後匆忙寫就的代碼上線就出各種問題,程式員們隻好熬夜打疲勞戰調bug,硬生生又讓工作回到了刀耕火種的時代。
單元測試還隻是最基本的自動化測試場景,在其上還能建構出元件測試、系統測試、內建測試等。系統部署工作也是一樣,在自動化思維指引下,devops這個概念就是賦予了程式員更多的運維職責。
從這些可以看出,以後開發、測試、運維工作的界限會越來越模糊。在各種工具和服務的協助下,程式員們的工作效率會變得越來越高,軟體産品的品質也會更有保障。其實很多公司都已經有這樣的系統和服務,程式員們也遵守着公司的規定在做,但如果能主動思考清楚其意義所在,明顯比隻是被動執行要強得多。
自動化思維可以說是程式員成長之路上的火箭助推器。
成為更厲害的程式員
到這裡,程式員已經是一名非常棒的職業人了。但John告訴我們,程式員們還可以上到更高的台階。他自己就是一個鮮活的例子,他通過線上課程影響了千百萬的程式員,寫作出書指導程式員職業發展之路,并且自己也實作了财富自由。下面我們就來看下John的做法和建議。
打造個人品牌
John最為推崇的一個建議就是程式員們要建立屬于自己的部落格,這個目的就是為了打造個人品牌。
建立個人部落格和打造品牌之間有什麼關系?John對此的回答是,我們要想具備影響力,給他人傳播價值是最好的方式。當自身的價值被認可,也就是品牌被樹立起來的時刻了。而程式員結合自己的技術專長,寫作有價值的文章,是再自然不過的途徑了。
John坦承,他的工作與生活是在部落格上的寫作之後發生了重大的轉變。他從一個默默無聞的職業程式員,轉而成為一名明星咨詢師,幫助了衆多的程式員們。用John自己的話來說,這就是一個名利雙收的過程。
當然,這樣的成就也絕非一夕之功。John的态度很簡單,從一開始就是單純地希望幫助到身邊的人。他在做這件事之前完全沒有想過,堅持寫作能讓他在财務上有多少收獲。隻是後來他的文章被更多的人看到并學習,他才意識到自己原來已經有了這麼大的影響力。
是以,想要在人生之路上更上一層樓的程式員們,趕緊打開自己久未更新的部落格,寫下新的篇章吧!
生活與工作不是平衡的
誠如John在書中所言,如果這本書隻看一章,他會建議讀者就看第39章“等量齊觀:工作與生活的平衡之道”。
在John對生活和工作的觀點看來,追求工作和生活對半開式的平等這是不可能的。一個人如果想要這樣的平衡,可能工作的時候惦記着家裡,在家裡卻又操心着沒完成的工作,結果哪件事都沒做好。
John的建議是改變對工作和生活的看法,不要将這兩者看作是二進制對立的關系,将工作也看作是生活的一部分。這并非鼓勵抛家不顧的工作狂式的精神,而是在一個階段内做好一件事情。這可以是專注地完成工作,也可以是全身心地投入到家庭的活動中去。總之在選擇做一件事時,就不要将其他事情放在心上,而是将它放在日程表上。
程式員們在事業上不斷進取時,也必然會遇到這個問題,就是家庭生活也需要自己的存在。首先認識到工作和生活從來就不是平衡的,這是解開心結的第一步。接下來就是和家人充分的溝通,制定工作和家庭活動的計劃日程表,過好每一天的生活。
千萬不要懷抱着“我拼命工作都是為了這個家”的想法,隻把給家庭帶來經濟利益放在第一位,卻忽略了家庭成員的感受。說一句大實話,工作上真不會少了誰就轉不開的。另外就是錢也是永遠賺不完的,而陪伴家人的時間一旦失去了,則是再也回不來的。
John希望我們思考清楚,并且努力去做到的,就是一個厲害的程式員,總是主動地在選擇自己想要的生活。
終身學習
程式員們不論上升到哪個階段,都要不斷地學習,保持旺盛的好奇心,培養對技術與市場的敏銳洞察力。在軟體開發這個職業上,想必怎麼強調學習的重要性都不為過。不過很多程式員會搞錯學習的重點。
有的程式員會将學習定義為工作上遇到搞不定的任務,就去搜尋一下,有現成的代碼拿來就用就好。如果是複雜一點的架構,那就花時間學習一下再用到工作中吧。不能否認這也是學習的一種,但它對于個人的成長來說幾乎無用。
因為這樣還是在個人的知識邊界之内,就好像繞着一個環形的跑道不停地在跑,始終在重複着手頭上那些事。隻有不斷地去突破邊界,才能看到更加廣闊的世界。到了那個時候,程式員們會發現,35歲這個話題不過是個僞命題而已。
最難的事情還就在于通過學習的方式突破自己。一份忙碌的工作,每月按時發放的薪水,會給人一種安全感,但這種感覺是虛幻的。因為網際網路行業競争太激烈,沒有哪家公司可以說自己是絕對安全的。身處這個行業中的程式員們就更要看清楚這一點。
是以,工作再忙,程式員們也要擠出時間來為自己的長遠将來做打算。學習的領域可以擴充到許多方面,例如上司力、内在成長、演講技能、寫作技能等。這些事情可能在目前看起來無甚影響,但在将來一定會産生不可思議的結果。
不要再說“等我有空了一定去學XXX”,現在就站起來去學習吧!
結語
《軟技能2》整本書看下來,可以說John再次給程式員們奉獻了一場認知的盛宴。John就他自己所知的内容,對程式員在職業發展上做了詳細的指導。從無經驗的新人如何起步,到職場老鳥如何讓自己揚名立萬,都是滿滿的幹貨。
誠然,道理都是簡單的,John苦口婆心地說了這麼多,終究還是要個人自己去體驗并實踐的。其實在軟體開發的職業這條道路上,沒有什麼捷徑可走,甚至可能比别的行業還要更辛苦一些,競争也更激烈一些。
但這也是軟體開發工作的迷人之處,它能讓人體會到創造的樂趣,通過許多人都在使用的軟體或者服務,開發者獲得了無以倫比的成就感。John以自己的經曆告訴我們,一位程式員可以達到怎樣的層次。更重要的是,他認為任何一位程式員其實都能做到這些。
真心希望看到此文的程式員們都能在職業之路上不斷前進,擁有自己想要的生活!
推薦閱讀
《軟技能2 軟體開發者職業生涯指南》
[美]約翰·森梅茲(John Sonmez)
本書是《軟技能:代碼之外的生存指南》一書作者的新作,主要圍繞軟體開發從業者職業生涯的發展曆程,描述軟體開發者在職場中需要具備的各種“軟技能”—如何入行成為軟體開發者,如何學會第一門程式設計語言,如何寫求職履歷,如何準備面試,如何選擇工作崗位,如何選擇技術方向,如何拓展技術技能,如何與團隊和上司融洽相處,如何以著書立說方式為自己在業界赢得贊譽,等等。
本書适合各層次的軟體開發者閱讀。盡管本書名義上是專門寫給軟體開發者的,但實際上這也是一本關于管理個人職業生涯以及如何獲得成功的書,對軟體開發行業的各類從業者做好職業發展規劃都很有幫助。
========
贈人玫瑰,手留餘香,不要忘記點贊、收藏、關注 @人民郵電出版社 哦!
一鍵三連,感恩有你~