你知道有能力勝任和精通之間的區別是什么嗎?今天動寶兒來給大家講解一下,讓大家努力做精通型的程序員。
這聽起來像一個很難回答的問題,因為這兩者似乎意味著同樣的事情。但它們之間的微妙區別至關重要。
有能力勝任是指有足夠的經驗和知識來完成各項工作;精通涉及知道為什么你要用某種方式來做事情,以及如何融入到大局中。換句話說,精通型從業者總是有能力勝任,但反之可能不成立。
本篇文章主旨是大多數軟件開發人員都會碰到的瓶頸:跨越從勝任到精通的溝壑。
因此,首先,我們要知道的是,這里勝任的工作定義是“我知道該怎么做”——雖然過于簡化,但非常貼合我們的需要。公平地說,不管你工作在什么樣的職業,知道怎么做是非常重要的。如果你是一個程序員,學習該怎么做是你工作的重要部分:
• 我需要知道如何使用版本控制
• 我需要知道如何使用一種一致的編碼風格
• 我需要知道如何建立一個持續集成服務器
• 我需要知道如何查詢數據庫
• 我需要知道如何實現響應式布局
• 我需要知道如何使用服務API
不要誤會我的意思:知道怎么做,是非常重要的。不要停止去學習怎么做,否則,你很快就會發現自己會失去這份工作。
但是,處于兩者之間的程序員往往會被卡住(很多因此而裹足不前),而他們被卡住的地方被認為是初學者和大神之間的差別,可以用來衡量你知道多少東西。這里只有一半是正確的,并且它強調的是不那么重要了的一半。
這正是精通的來源。并且精通的實質是“為什么你要用某種方式做事”-——是單獨理解問題的每個部件與理解部分是如何融入整體之間的差異。
勝任和精通之間的差距可以解釋為什么如此多的人想要攀登高層次的編程思想,例如設計模式。
一個有能力勝任的程序員當然可以閱讀MementoPattern并理解如何去實現它。他們或許甚至能夠確定可以應用模式的場景。但是,如果沒有更多地了解大局,他們仍可能會應用不適當的模式。
相比之下,精通型程序員則能夠確定何時MementoPattern失敗。他們或許會知道一些可考慮的替代方案,在模式并非很好匹配的時候。他們還對如何在Memento背后采用基本概念有一些想法,然后應用這些想法以創建一個自定義更適合特定用例的解決方案。
更為重要的是,精通型程序員能夠識別正確和錯誤的設計模式——如果建設概念驗證功能,適當代碼設計的問題可能就變得無關緊要。如果向初學者解釋代碼庫,精通型開發者可能會堅持著重于代碼實際上是做什么的,而不會拋出命名模式,并告訴新手“在問我任何問題之前,先去閱讀《GangofFour》”。
所以精通還意味著有整體思維的靈活性。
模式,原則,風格,庫,語言功能——這些都是工具。但是,一個真正的精通型程序員會讓工具來匹配工作,而不是工作匹配工具。
許多人從來沒有專門專注于發展精通能力,因為坦率地說,勝任能力更直接。但是,如果你想要改變重點并得到一些幫助來攀登一段新的歷程,那么不妨試試這些:
• 解釋為什么你想要用某種方式做事的原因推理,不依賴于通用的“最佳做法”或社區準則。單單只在你要解決的當前問題的背景下討論利弊。
• 了解的東西越少,了解得越深。然后嘗試在不同的上下文中加以應用,看看它們在哪里有效,在哪里無效。從失敗中尋找機會來尋求新的工具,可以幫助拓寬你的技能集的工具,但只在你已經確立了明確要求的時候。
• 尋找其他人“打破規則”并取得成功的范例。偶爾打破自己的一些規則,看看是會傷害你,幫助你,還是沒有變化。
• 挖掘基本的資源,而不僅僅是閱讀摘要。這需要更多的時間和精力,但可以幫助你弄清楚基礎和技術界限,同時也給你一個機會來生成由核心原則啟發的新想法。
• 深入鉆研一個你不熟悉的項目,并且試著不依賴記憶套路、習慣和規則,找到你自己的做事方式。
• 要求別人解釋為什么他們要這樣做事,但不要只是接受教條式的推理。要求例子并詢問上下文背景,以便于你可以嘗試著設身處地地去想。這樣做是非常有價值的,因為可以讓你看到他們自然習慣中的長處和短處。
• 挑選少數特定你只是擅長但不精通的技能,然后開發勝任的能力到top,到幾乎偏執的程度。一旦你到達頂峰,檢查深刻且高度專業化知識的利弊。
關于精通,一次一步,有很長的路要走。你需要超凡程度的勝任才能夠在“懂和會”上脫穎而出——但即使是松散的明白“如何在正確的時間做正確的事情”也會帶你走得很遠。
關于精華的部分是:一旦你開始注重于精通程度,那么你有很大的機會發現解決謎團的正確路徑。