作為一位在軟件工程領域工作多年的專業人士,我做過研發中心總經理,也一直擔任軟件企業技術培訓機構的負責人,還領導過工程效能部門,甚至組建並親自帶領過軟件技術文檔團隊。一直以來,我看到不少軟件工程師和軟件開發管理者,對軟件研發普遍存在一些錯誤的認識。
他們認為,隻要掌握好編程技能就好,把常用的編程語言和軟件工具掌握得越熟練就越有競爭力,他們將大量的精力花在鑽研編程技能上,這也和很多用人單位的價值取向有密切關繫。在面試和考查軟件工程師時,很多用人單位多半考查的是和編程能力相關的內容,一般不考查工程素養。這強化了軟件工程師的錯誤認知,他們更加錯誤地認為隻要會編程就能找到工作。他們還認為,在工程意識或工程素養上的不足,是可以迅速補齊的短板,這些根本不是難事兒,隨時都可以改變和提升。
業界還普遍存在一種錯誤認知,即對於開發某領域的軟件,領域知識和編程技能比軟件開發的工程意識更為重要,軟件如何構建、開發任務如何組織等涉及工程意識的因素,沒有得到足夠重視,很多人甚至認為這些降低了軟件開發的效率,或者干脆對此嗤之以鼻的也大有人在。
我親身經歷了很多項目的失敗,究其原因就是軟件工程師的工程意識和相關能力偏弱,他們忽視了很多比編程能力更為重要的工程化思維和作為軟件工程師的行為約束。他們沒有意識到,能力、意識和素養是需要長時間養成的,就像一個人的氣質不能在幾天之內速成一樣。
互聯網企業的大多數工程師一畢業就進入公司工作,他們很聰明,技術功底很扎實,但缺乏對實際項目的工程化錘煉,就職公司更需要培養他們的工程意識和素養;也有很多工作多年的軟件工程師,因為常年趕任務,也常常忽視工程化能力的培養。
章淼老師在研發一線工作,他在百度技術培訓中心開設的“代碼的藝術”課程,專門講授如何提升軟件工程師的工程思維、工程素養和工程意識。《代碼的藝術》這本書中的很多內容來自章老師的培訓課程和演講材料,也有部分內容來自他以“代碼的藝術”為題在多家大型互聯網企業分享的內容。在代碼、文檔和項目管理等多個方面,這本書既介紹了方法,又有他親身經歷的實際案例解剖。無論是剛參加工作的從業者,還是有多年經驗的軟件工程師,都反映良好,“代碼的藝術”課程也因此在百度大受工程師歡迎,他本人也連續多年被百度技術培訓中心評為“金牌講師”。
本書通俗易懂,可以幫助讀者迅速掌握軟件研發中的關鍵要領,並將書中的方法運用到實際項目實踐中,能夠幫助讀者掌握正確的軟件研發意識,為未來的職業發展打下良好基礎。
——陳尚義 百度技術委員會理事長
應章淼博士之邀為他的新書《代碼的藝術》寫推薦序,我感到不勝榮幸。
這本書由章博士在百度內部為上萬名工程師進行代碼培訓的課件結集而成。章博士還基於該課件給等互聯網公司的工程師做過培訓,並得到了大家的廣泛贊譽。因此,這本書實用性極強。三年前,章博士帶著基於該課件總結和凝練出的部分內容,來到清華大學“軟件工程”課堂上,給計算機繫本科生做了《代碼的藝術》技術分享,非常受同學們的歡迎,由此看來這本書的內容也比較適合初學者。
章博士既有高校任教經歷,又有多年在創業公司、互聯網大廠做軟件開發的豐富經驗,同時還擔任過百度代碼規範委員會主席。因此一方面,他深知軟件工程師面臨的挑戰和不足,另一方面又了解如何能夠讓工程師逐步提升軟件開發的能力,以及如何具備正確的軟件開發意識,並終形成代碼編寫的完整體繫。這本書就是章博士經千錘百煉總結出的關於代碼開發的精華。
因此,我強烈向各位軟件工程師推薦這本書!
——裴丹 清華大學計算機繫長聘副教授,博士生導師;清華大學計算機繫本科生必修課“軟件工程”任課教師
眾所周知,Knuth大師寫了《計算機程序設計藝術》一書,他認為編程是一種藝術活動,理由是我們還無法自動編程,同時編程本身蘊含了優雅、美麗、美學(Elegance、Beauty、Aesthetics)。福樓拜曾說過:“科學和藝術總在山頂重逢。”本書一以貫之,鼓勵軟件工程師培養代碼品位、追求“代碼藝術家”(Code Artist)的境界。以“碼農”自嘲的程序員,其實是這個時代很fashion的人。
不要被“藝術”這個字眼嚇到,本書講的是實戰。作者基於多年在產品項目實踐和公司內外培訓中對各種誤區、問題的觀察,並在軟件工程師需具備的10點素質能力中抽出了其中3點形成本書。讀者若能對其中的建議踐行不輟,必可習慣成自然,在軟件開發的路上留下堅實的腳印。
我的主要工作聚焦於測試和研發效能,書中關於代碼、文檔、項目管理三件事的思考和總結,我深以為然。代碼質量不是測出來的,而是內建的,從業者理應加大在缺陷預防方面的投入(包括但不限於代碼評測試等);文檔是產品長期可維護的關鍵,但現實情況是,它總跟不上代碼的步伐,有個段子說,程序員討厭的四件事是“寫注釋、寫文檔、別人不寫注釋、別人不寫文檔”;項目管理者們(包括RD)面對DDD(Deadline Driven Development,戲稱為“上弔繩驅動的開發”)疲於奔命。
互聯網繫統越來越龐大,當快速迭代證明了業務可行性並實現了業務增長以後,巨大的代碼資產庫變得復雜,還有個段子說,“世界上遙遠的距離不是生與死,而是你親手制造的BUG就在你眼前,你卻怎麼都找不到它。”面對軟件開發的根本性困難(復雜性、非一致性、易變性和不可見性),我們需要Back to basics(回到根本),那些基本守則永遠不會過時。實際上,很多公司仍在為了落地這些簡單的規則而努力。
《代碼的藝術》這本書風格樸實無華、內容深入淺出,書中有方法有案例,相信軟件工程領域不同背景的讀者都能從中受益。非常期待作者在工程能力方面的更多作品問世。
——李中傑 高德研發效能中心負責人
Frederick P. Brooks教授在40年前提出一個論斷:復雜度和可變性是軟件研發中的根本困難,概念結構在說明、設計和測試上的復雜度,在短期內沒法通過更好的編程語言和更好的工具來消除。雖然軟件行業在這40年裡蓬勃發展,但從業者依然在消除復雜度上缺乏卓有成效的建樹,這也導致軟件行業在工業化的進程中依然極度依賴程序員的工程能力,然而優秀的程序員和平庸的程序員之間的效率差異巨大。
《代碼的藝術》是一本關於如何提升工程能力的書,然而它又不同於《代碼整潔之道》《代碼大全》等偏重討論編程技能的書。本書在強調“更高效率為客戶持續交付價值”的前提下,討論如何通過提升工程能力來提升交付價值的能力,包括識別價值、質量、持續交付,以及持續提升研發效率等,這是一本值得每個有志於提升自身能力的程序員閱讀的書。在新技術層出不窮的當下,通過持續學習提升工程能力,對每個程序員都非常重要——通過提升工程能力來提高效率,並形成良性循環,從而避免陷入繁重混亂工程的“焦油坑”。
——何 波 中泰證券股份有限公司金融科技委員會主任
首先非常榮幸可以在時間閱讀到本書的手稿,也更榮幸被章博士邀請為本書寫推薦序。
其實在收到書稿時,多少還是被書名所驚訝到。把“擼碼”升華到藝術層面的思考,真是一個大膽且有想法的角度。當完整閱讀完書稿後,作為一個從業十多年的程序員,回首自己的經歷,真有一種“閱讀恨晚”的感覺。雖說自己也是科班出身,有過在外企和大廠工作的經歷,卻很少真正繫統化地思考和總結過自己的工作,所以真心希望此書能被更多對編碼工作有更高追求的讀者所閱讀,相信讀完此書,大家會對目前的工作產生非常大的認知蛻變。
說起代碼,大家都知道它是承接人與計算機的溝通載體,所以應該具備兩面性:對人友好,並能讓計算機高效執行。但在很多場景下,我們往往容易忽略前者,特別是身處當前快節奏的IT時代,大家更多地把編碼當作一份工作工具,而非職業。這兩者的區別是,視為工具則是目標驅使,視為職業則是成長驅使。而隻有真正地把編碼視為職業,我們纔會在編碼前、中、後三個階段來體繫化地思考與探索如何把每一步做到好。
回到本書的內容,讀者會現發作者花了很多心思,力求教會大家一些正確的意識,而非簡單“復制”一些技巧,所以全篇並沒有很多編碼技巧這一類的陳述,而是從軟件工程的意義、對代碼工作的認識、項目文檔的價值以及項目管理方法等多個方面整體性地講解各自的意義與價值,從根本上幫助大家正確了解當前的工作與目標,同時又結合一些實際案例,終能夠提升大家對編碼工作的認識。
後由衷地預祝獲得本書的讀友,能夠開啟一段全新的旅程!
——謝馬林 百度架構師,JProtobuf github開源項目作者
看到這本書的名字,可能很多讀者會聯想到這本書主要講解如何寫好代碼,幫助大家順利拿到offer。對於企業裡的軟件工程師來說,代碼研發不代表全部工作,事實上寫代碼可能僅僅占20%的時間。完整的軟件研發過程涉及需求分析、產品設計、技術預研、軟件開發、調試測試和運行維護等多個環節,同時需要多人緊密協作纔能完成。
這讓我想到了大學時代那門枯燥的軟件工程課程。軟件工程一直以來都是本科計算機專業的必修課程之一,但是我相信大部分讀者可能和我一樣,在上學的時候對於這門課程的印像,可能僅僅是記住了一個所謂的基於“瀑布模型”的軟件開發流程的概念,至於其他內容我相信早已還給老師了。而且在學校大家也很少能得到專業的軟件工程訓練。大部分人在參加工作參與了生產級軟件的研發後,纔逐步體會到軟件工程的重要性。軟件研發是一個群體性活動,需要多工種、多團隊緊密協同,而軟件工程正是讓軟件研發得以順利協同而總結出來的科學的軟件研發方法論,是保證大型軟件保質保量、按期交付的基礎學科。
軟件工程和其他計算機課程有著很大的不同,我認為軟件工程是介於工科和理科之間的綜合性學科,它沒有編程語言那樣非常具體的技術體繫,是基於長時間實踐總結出來的實踐,是技術和團隊組織能力的綜合體現。軟件工程作為一門源於實踐的學科,必須在實踐中不斷體會和鍛煉纔能逐步取得進步。
和其他介紹軟件工程體繫的圖書不同,本書沒有一味地深入到偏學術性的講解過程中,而是完全源於作者日常工作的實踐積累。章淼老師近幾年來一直參與提升公司軟件工程能力的培訓工作,本書的很多內容都來自公司軟件工程的相關培訓素材,並且融合了數萬名工程師的培訓反饋和心得體會。很多來自一線工程師的反饋也深深地體現了廣大工程師對軟件工程知識的匱乏,以及對掌握軟件工程方法的渴望,我想這也正是促使章淼老師寫作本書的原動力之一。
章淼老師具有20多年關於企業級大型軟件的研發經驗,在公司主導了大量的軟件工程課程的制作和講解,在軟件工程領域擁有扎實的理論體繫和實踐經驗。作為和章淼老師共同參與公司工程能力建設的同事,非常榮幸能為這樣一本源於實踐的書寫一點文字。希望本書能夠為廣大致力於軟件研發的工作者提供一點幫助,讓更多的軟件工程師能夠按照科學和高效的方法從事軟件研發工作,早日擺脫“996”的窘境,為中國的軟件行業正常化發展貢獻微薄的力量。
——鄭 然 百度基礎架構部,傑出研發架構師
我和章老師相識已有二十多年,我們也早過了軟件行業“35歲危機”的年齡。人到中年,會不時聽到朋友們聊起“年齡危機”這個話題。然而,也有一些朋友不僅沒有“年齡危機”的感覺,反而路還越走越寬。為什麼他們沒有普遍存在的焦慮感呢?我嘗試從“技藝人”的角度來說說我的理解。
漢娜阿倫特在《人的境況》中將人類的活動分為勞動(Labour)、工作(Work)和行動(Action)。姑且不論這種分類是否合理,單就軟件開發活動而言,勞動和工作的這種區別就很具有討論的意義。他認為,“勞動”的目的是維持生命,其成果是消耗品,因此“勞動”必須是周而復始的;而“工作”的目的是建立世界,其成果是可存續的,因此“工作”是一勞永逸的。從事“工作”的人,阿倫特稱之為“技藝人”。
日復一日的編碼、改BUG、開會、反復修改方案……沒有明確的開端,也沒有明確的結束—這些畫面就像卓別林的電影《摩登時代》裡描繪的那樣,勞動被異化,勞動者成為了實施手段和生產工具。這種不可控的狀態,讓人失去了自由。這種活動,就是阿倫特所定義的“勞動”。
“技藝人”做事則完全不同:“技藝人”的目標是做成一件完整的作品,他清楚地知道成果是什麼樣的,知道在使用正確方法的前提下,能在確定的時間得到確定的成果;“技藝人”在工作過程中有著清晰的階段性目標和明確的反饋,能感受到過程賦予的自信與快樂。換言之,“技藝人”的工作能獲得確定性的成功。經過數百萬年的進化,人類已經具備了將事情“做成”的本能,因此“技藝人”的工作能帶來成功的喜悅,獲得心靈的自由。
能將軟件“做成”的工程師,就是軟件行業的“技藝人”。他們采用繫統化和科學化的方法,不斷提升研發效率,通過高效、持續的交付高質量軟件來向用戶提供價值。“技藝人”不存在軟件行業裡所謂的“35歲危機”。
在本書中,章老師將軟件工程能力作為“技藝人”的核心能力,在代碼、文檔和項目管理三個方面進行了細致全面的闡述。本書書名中雖含有“藝術”兩個字,但章老師將“藝術”變成了可以習得的能力。軟件工程師的“意識”比“知識”更重要,但“意識”總有些說不清、道不明的感覺(這也是人們認為編程是一門藝術的原因之一)。我過去認為“意識”很難培養,“道可道,非常道”是理所當然。但當我讀完本書初稿,看到“藝術”竟然能被一步步習得,不禁對章老師在軟件工程和教學方面的功力心悅誠服。
讀完本書,我作為從業“老手”,很是汗顏。按照本書描述的工程能力,對於我過去的工作,絕大多數都要算是“失敗”的項目或產品。像我這種喫過苦、踩過“坑”的人,很容易和章老師產生共鳴,看到本書會如獲至寶。對於技術團隊管理者來說,我認為本書可以用於團隊能力評估、培訓,也能用於總結SOP、實踐。對於“老手”“老團隊”而言,他們好將本書放在手邊,隨時翻閱,以做“吾日三省吾身”之用。
對於踩“坑”不多的“新手”而言,在讀本書的過程中,他們也許很難有“老手”那種“悔不當初”的深刻感受,但恰恰由於“新手”還沒有養成壞習慣,或者壞習慣還不夠根深蒂固,所以用心理解、認真實踐,相信很快就能通過學習本書提升軟件工程能力。一般而言,我們是按照知、行、信的順序學習知識和技能的。但在閱讀本書時,我建議將順序稍作調整,先“信”,然後“知”和“行”。正如前面所說,從某種程度上說,開發軟件是一門“藝術”,以“意識”為先。當你還沒有足夠的歷練時,不妨敞開心扉,先“信”,之後就能夠更積極地去知、去行。
讀完本書,我對章老師說:“我所在的這家公司團隊要是早十年看了這本書,並去實踐,至少能多掙一個億。”雖然像是一句玩笑話,但我認為本書確有這樣的價值。
“種一棵樹好的時間是十年前,其次是現在。”閱讀本書,也是如此。
——戚文敏 北京海華鑫安生物技術有限責任公司產品總監
在這個技術創新的時代,以物聯網、雲計算、大數據為代表素影響著我們的商業活動與生活,所有人開始關注技術力量,並希望通過技術驅動業務乃至改變世界,從國家政策的“互聯網 ”到各領域數字化轉型,這一切離不開技術賦能,開發者(工程師)迎來高光時刻!
如何更好地承接和實現開發目標,這給開發者提出了更高要求。從代碼構建、軟件工程到項目管控和溝通等,提升開發者的綜合應戰能力成為組織的必修課,百度技術培訓中心金牌課程“代碼的藝術”正是這樣一門課程,章淼老師歷經十餘個班的授課,終歸納總結成《代碼的藝術》一書,期待給開發者們帶來良策、指引,並實現目標。
—— 劉付強 msup創始人兼CEO
中國整個社會以及互聯網行業都轉向高質量發展階段,原來靠各種紅利就能有不錯結果的日子已經一去不復返。無論對企業、團隊,還是個人而言,認真探索並遵循客觀規律,苦練基本功和專業所需核心能力(對程序員而言就是本書的主題——工程能力),已越來越重要。本書公開了國內一線大廠的實踐總結,是難能可貴的學習資料,出版恰逢其時。
—— 劉 江 北京智源人工智能研究院副院長,前CSDN和《程序員》雜志總編
多年前在百度和章博士一起共事,我們共同推動了百度代碼規範和Code Master體繫的建立。看到章博士持之以恆,致力於工程能力和意識的培訓與倡導,並將我們的工作發揚光大,由衷欽佩。參與創業多年,我愈發感到工程能力是zui容易被忽視但又是非常重要的成功因素。高質量的軟件,來自卓越的工程師和團隊,而不是靠“堆人頭”實現的。
這本書名為《代碼的藝術》,但它並不僅僅講編碼,更像是一本軟件工程師的自我修煉手冊。章博士是知名開源軟件BFE的作者,又是工程能力的布道者,始終堅持在“學習—思考—實踐”中提升。這本書是集章博士多年經驗之大成,既有來自一線、非常落地的實踐,又有實踐背後的深入思考。相信對追求卓越的工程師和希望打造高效研發團隊的管理者都有非常好的指導和啟發意義,強烈推薦!
—— 蔣錦鵬 醫渡雲首席架構師,百度代碼規範委員會首任主席
0和1是軟件工程師的指尖藝術,每一位工程師都需要將專業方法和體繫化思考作為工作上的指導,以此全面提升軟件工程能力。《代碼的藝術》一書的作者基於大量實踐總結出實踐方法論,從意識形態層面傳遞多維度的軟件工程能力,讓讀者更體繫化、有針對性地建立自身的能力圖譜。
—— 單致豪 騰訊開源聯盟主席
在我們接觸的眾多軟件開發人員中,我們發現軟件工程能力是關乎一個人能走多遠、能發揮多大作用的重要的能力之一。而在高校軟件開發類人纔培養體繫中,關於軟件工程能力方面的培養是非常欠缺的。本書基於作者在大廠的長期從業經歷,以及在與公司技術開發人員的研討和培訓過程中積累的大量實踐,因此對於培養開發者的軟件工程意識具有極強的引導作用。本書語言平實,實用性強,是軟件工程方面非常好的參考書目。
—— 王 浩 開課吧聯席總裁
很榮幸聽過章淼老師的一次現場演講,當時就被他對軟件工程的深刻理解所震撼。當拿到《代碼的藝術》這本書並快速翻閱後,我就知道這本書已經脫離過往很多圖書專注於一招一式的層面上。和章淼老師一樣,我一直認為語言隻是工具,關於代碼的組織、審閱和文檔編寫,甚至當啟動一個新項目時的調研工作和項目進度管理,以及橫向溝通能力都是一個項目成功的關鍵。這方方面面,我們總結為工程的方法論,或者叫“代碼的藝術”。我之前看過《架構整潔之道》和《實現領域驅動設計》,相信這本書也可以給你帶來一樣的感受,再次強烈推薦!
—— 毛 劍 bilibili基礎架構部負責人
記得在一次 Gopher China 晚宴上,章博士給我們分享了軟件工程師能力知識圖譜。那一次讓我對軟件工程師有了全新認識,軟件工程師應該具備編碼、文檔和管理三種層次的能力,而現在大多數軟件工程師都將精力放在編碼上。章博士這本書全方位、深層次地給大家分享了軟件工程師應該具備的能力。強烈推薦有志於提升自我能力的工程師都深讀一下。
—— 謝孟軍 Gopher China社區創始人,積夢智能CEO