在編程世界里怖亭,技術(shù)的打磨往往像是工匠雕琢作品搀擂,但若無法轉(zhuǎn)化為產(chǎn)品的成功,所有的精致都不過是空中樓閣。讀《程序員修煉之道》時潭千,我深刻意識到国撵,務(wù)實不僅僅是技術(shù)的選擇怀伦,更是產(chǎn)品迭代和商業(yè)模式成功的關(guān)鍵柳琢。
在現(xiàn)代社會,全身心投入之前盅抚,測試想法并得到反饋是至關(guān)重要的漠魏。由用戶參與評判,夠好的軟件就是最好的妄均,而不能過度追求完美柱锹。好改,能適應(yīng)使用者的就是好的設(shè)計丛晦。
貫穿商業(yè)模式奕纫、產(chǎn)品到軟件設(shè)計,有一個原則就是其實誰也沒有標準答案烫沙,盡早交付匹层,通過持續(xù)的收集信息,不斷調(diào)整方向瞄準锌蓄,直到擊中升筏,這是最重要的原則。作者在書中嚴格地區(qū)分了原型和曳光彈這兩種探索正確產(chǎn)品方向的方法瘸爽。
從技藝精進到產(chǎn)品突破:刻意練習(xí)的反思
有幾年的時間您访,我自己對于刻意練習(xí)非常偏執(zhí),在技巧剪决、熟練度和手藝的提升上確實有很大的收獲灵汪,但是當(dāng)時感受到兩個問題。
首先柑潦,光是單純的磨練技藝享言,是無法帶來產(chǎn)品和商業(yè)模式上的成功的。過度的修飾和精煉很多時候反而會消磨前進的動力渗鬼。相比之下览露,使用曳光彈,快速原型譬胎、溝通反饋差牛,數(shù)據(jù)驅(qū)動命锄,才是更好的解決方案。
其次偏化,就是缺乏對前沿知識的關(guān)注脐恩,總是在特定的波段上溫故已有知識,有種停滯的感覺侦讨。這樣會想被盈,大學(xué)時,一個學(xué)期十八門課搭伤,定期考試,用產(chǎn)出來推動的學(xué)習(xí)的模式袜瞬,雖然不那么舒適怜俐,但是這種方式的確更適合學(xué)習(xí)大量新知識。
像專業(yè)投資理財一樣學(xué)習(xí)
對于閱讀技術(shù)書籍邓尤,其實作者的要求不是很高拍鲤,在廣泛閱讀的同時,一個月一本技術(shù)書是基準汞扎。我覺得還可以在一年里季稳,集中性的再抽出一個月時間,大量閱讀技術(shù)書澈魄,效果也會很好景鼠,可以嘗試一下。
作者非常務(wù)實的思想痹扇,還體現(xiàn)在铛漓,對于成功投資原則的理解,完全不亞于專業(yè)書籍和理財專家鲫构。我們對于專業(yè)技術(shù)浓恶,計算機軟件工程和科學(xué)知識,也應(yīng)該這樣投資结笨。
正規(guī)投資者有定期投資的習(xí)慣包晰,多樣化是長線成功的關(guān)鍵,聰明的投資者會平衡保守型和高風(fēng)險高回報型投資組合炕吸,投資者用低買高賣來獲得最大的回報伐憾;同時還應(yīng)該定期審查和重新平衡投資組合。
正交性與DRY原則
務(wù)實的軟件開發(fā)方法中算途,如果說有一條最重要的原則塞耕,我覺得一定是正交性。正交可以帶來低耦合嘴瓤,分離關(guān)注點扫外、單一職責(zé)都是正交的體現(xiàn)莉钙。微服務(wù)同樣也是在部署層面和團隊職能上的正交。
DRY(不要重復(fù)自己)筛谚,也是很重要的原則磁玉。但是我們知道,在軟件開發(fā)中復(fù)用不是最重要的事驾讲,關(guān)鍵是語義清晰蚊伞,知識必須單一、明確吮铭、權(quán)威时迫,看似一樣的代碼未必是重復(fù)。這也正是編程中藝術(shù)的地方谓晌。
可測試性與解耦
可測試性和正交解耦是分不開的掠拳,具備良好可測試性的代碼,一定是沒有對全局變量的依賴纸肉,保持不可變性溺欧,確定的輸入產(chǎn)生特定的輸出。還有對外部資源的的引用柏肪,也應(yīng)遵循這一原則姐刁,因為任何可變的外部資源,都是全局數(shù)據(jù)烦味,也就是有副作用聂使,會被共享。
把所有都外部依賴封裝成抽象是一個良好的實踐谬俄,依賴抽象而不是實現(xiàn)岩遗,可以提高整個系統(tǒng)的靈活性。
對此凤瘦,我覺得非常同意作者說的宿礁,保持代碼簡潔,不要打破第一扇窗戶蔬芥。
軟件開發(fā)就像園藝:可測試和重構(gòu)的思考
測試是從代碼中獲取反饋的過程梆靖,而不僅僅是尋找Bug。正如作者所說笔诵,測試的好處更主要來自對測試的思考返吻,什么樣的代碼設(shè)計出來更易于測試,思考可測試性對代碼的影響乎婿,用這樣的方式测僵,設(shè)計出的代碼就是可測試的。
關(guān)鍵在于對代碼的思考和理解,而不是必須真的寫出來的自動測試代碼捍靠。這也是很偏藝術(shù)的地方沐旨。當(dāng)然,如果是時間和成本允許的話榨婆,在遵循測試金字塔原則的情況下磁携,還是盡量應(yīng)該把自動化測試的代碼寫出來。
自動測試同樣面臨邊際收益遞減良风,屬于過度追求完美谊迄,任何對完美和健壯性的追求,都應(yīng)該適可而止烟央,不要超過能看見的范圍统诺,這個可以確定的預(yù)見的范圍,不管對于產(chǎn)品還是開發(fā)疑俭,都應(yīng)該是幾周篙议,最多不超過一兩個月。
在作者看來怠硼,重構(gòu)也應(yīng)該是非常微小步驟的改進,任何大規(guī)模的重寫移怯,都不能算是重構(gòu)香璃,就像裁剪樹枝一樣。所以說軟件開發(fā)更像園藝舟误,軟件并非磚石堆砌葡秒,而是一個有機體,無法得到計劃中結(jié)果的東西都需要刪除或者修剪嵌溢。
我覺得軟件開發(fā)中眯牧,有一個很有用的原則,在決定代碼到底分還是合的時候很有用赖草,可以根據(jù)最小刪除成本來考慮学少。
用文本來存儲知識
此外作者毫不掩飾用可以版本化的純文本來持久化存儲知識的偏愛,只要不是確定為了性能要壓縮信息秧骑,用可以自解釋的文本永遠是最佳選擇版确。這也是我自己非常認同,并且在實踐中采用的原則乎折。
首先是可讀性绒疗,代碼和數(shù)據(jù)不僅僅是機器執(zhí)行的指令,更是開發(fā)者之間溝通和協(xié)作的橋梁骂澄。在沒有足夠的精力吓蘑,維護大量冗余文檔的時候,所見即所得的文本信息坟冲,是最好的文檔磨镶,沒有任何二義性溃蔫,也不需要額外跳轉(zhuǎn)和查詢知識。
然后是關(guān)于建模棋嘲,這是有點類似活文檔的概念酒唉,在我們開發(fā)軟件的時候,第一步沸移,其實是對物理世界痪伦,或者需求的建模,將物理世界的所有概念雹锣,反映到系統(tǒng)中网沾,所有概念一一對應(yīng),是基礎(chǔ)蕊爵,只要有完備的結(jié)構(gòu)化文本辉哥,我們可以通過各種代碼生成器、規(guī)則引擎攒射,自動的生成代碼或者執(zhí)行邏輯醋旦;文檔本身就解釋了程序的行為。
敏捷思維與組織架構(gòu)
敏捷思想關(guān)注的是如何有效地工作会放,是關(guān)于如何做事的饲齐,邁出一小步,評估并根據(jù)反饋調(diào)整下一步行動咧最,持續(xù)針對流程做實驗捂人,改進流程,才是敏捷團隊的核心矢沿,而不是迷信時髦的方法滥搭。
康威定律決定了,任何軟件的架構(gòu)捣鲸,最終都是組織溝通結(jié)構(gòu)的反映瑟匆。應(yīng)用康威定律,可以有意識地按照代碼所期待的樣子栽惶,來組織團隊∨Ч睿現(xiàn)在比較流行說的組織能力,我覺得也是類似的概念媒役。
我覺得需要注意的是祝谚,組織的溝通結(jié)構(gòu),不可避免要受到創(chuàng)始人的性格酣衷、預(yù)算交惯、收入來源和融資結(jié)構(gòu)的影響,而不是空中樓閣。
編程席爽、架構(gòu)意荤、產(chǎn)品設(shè)計和經(jīng)營都是一樣,采取經(jīng)過深思熟慮的小步驟只锻,及時檢查數(shù)據(jù)和用戶反饋玖像,應(yīng)該在推進前不斷調(diào)整,避免過大的步驟和任務(wù)齐饮,用反饋頻率作為節(jié)拍器捐寥。
構(gòu)建軟件的唯一方法是增量式的,逐步構(gòu)建端到端功能的小塊祖驱,一邊工作一邊解決問題握恳,在解決問題的過程中不斷學(xué)習(xí),應(yīng)用過程中學(xué)到的知識充實代碼捺僻,讓客戶參與每一個步驟并讓他們指導(dǎo)這個構(gòu)建的過程乡洼。
結(jié)語:務(wù)實之道
說到具體的軟件開發(fā)實踐,我覺得匕坯,在結(jié)果難以預(yù)測的產(chǎn)品探索過程中束昵,每次迭代都應(yīng)該在整個開發(fā)流水線上避免重復(fù)的工作。每個工序和步驟都應(yīng)該盡快將可用的產(chǎn)出交付到下游葛峻,就像在黑暗中射擊一樣锹雏,不必追求完美主義,關(guān)鍵是盡可能交付可演示且能正常工作的內(nèi)容泞歉,交付的過程就是溝通和學(xué)習(xí)的過程。當(dāng)然匿辩,推進時要牢記約束理論的指導(dǎo)腰耙,及時識別并優(yōu)化瓶頸,并根據(jù)瓶頸調(diào)整節(jié)奏铲球,以確保整個流程的高效進行挺庞。
在《程序員修煉之道》中,務(wù)實的方法論貫穿始終稼病。技術(shù)的打磨是基礎(chǔ)选侨,但只有通過迭代、反饋與不斷適應(yīng)然走,才能成就偉大的產(chǎn)品援制。真正的成功在于打破迷霧,精益求精芍瑞,最終讓產(chǎn)品在市場上成功晨仑。