學習某件事的第一步是承認你不知道。這聽起來很正常,但經驗豐富的程式設計師還記得要真正讓自己承認這一點需要花多長時間。很多電腦科學專業的學生畢業的時候,都有一種很傲慢的態度,就是「我知道最好的」,但其實這只是一種虛張聲勢,他們不知道從**來的自信,就好像他們什麼都知道,並且需要向每一位新同事強烈的證明這一點。換句話說:你所謂的「我知道我在做什麼!」這種態度會妨礙你學習新的東西。
要想成為優秀的人,你必須學會吃一塹長一智。但是千萬小心,經驗也可能教會我們重複一些不良行為,甚至也教會我們養成一些不好的習慣。我們都遇到過有8年經驗的程式設計師。對於他們來說,同樣的經歷,重複了8次。為了避免這種綜合症,看看你做的每一種事情,然後問自己:「我怎樣才能讓它變得更好?」
新手(以及很多經驗豐富的開發人員)會看著他們自己寫的**,欣賞它的奇妙。他們編寫測試來證明他們寫的**是可以執行的,而不是試圖讓它執行失敗。真正優秀的程式設計師會積極地尋找他們的錯誤在**,因為他們知道終端使用者會發現這些遺漏的bug。
是的,你的第一步總是想寫出質量很高的**,而且**上面都寫滿了注釋。但是一般的程式設計師在這一點上就退出,然後繼續下一件事。
但是一旦「完成」就停止了這種思想就像是拍一張快照,然後期待它是一件藝術品一樣。偉大的程式設計師都知道第一次迭代只是一次迭代。它執行起來了,恭喜你!但你的工作還有很多。現在,使它變的更好。
其實這個過程就是在定義「更好」的含義。讓它變得更快能有什麼價值嗎?可重用更高有什麼好處嗎?更可靠嗎?答案隨著每個應用程式的不同而不同,但是過程都是一樣的。
好的程式設計師目標是寫出可以執行的軟體就可以了。偉大的程式設計師寫出來的軟體目標是執行得非常好。通過一次編寫這種情況幾乎不可能發生。最好的軟體通常被寫三次:
首先,編寫軟體以向你自己(或客戶)證明解決方案是可行的。其他人可能沒有意識到這只是乙個概念驗證,但你確實這麼做了。
第二次可以讓它正常地執行。
第三次你能夠讓它平穩的執行。
當你看到最優秀的開發人員的工作時,這種級別的工作可能並不明顯。他們所做的一切看起來都很出色,但你沒有看到的是,即使是開發界的大腕兒,也可能在向其他人展示他們的軟體之前就已經拋棄了第乙個和第二個版本。拋棄之前的**並開始編寫另乙個版本是一種強大的方式,可以將「更好地」融入到您的個人工作流程中。
如果沒有其他情況,通過「寫三次**」可以告訴你解決問題的方法有多少種。而且它可以防止你陷入停滯不前的狀態。
你可能希望我能夠引導這個建議,實際上,這也是提高程式設計技能的最常見和最有價值的建議。閱讀他人**的原因也很重要,只是不是很明顯而已。
警告:在不需要成為一名優秀程式設計師的情況下,很容易閱讀大量的**,就像乙個想要成為作家的人可以在不提高自己散文的情況下閱讀偉大的文學作品一樣。很多開發人員都在尋找開源或其他軟體來「找到答案」,而且很可能是複製和貼上**來解決類似的問題。這樣做實際上會讓你成為乙個更糟糕的程式設計師,因為你盲目地接受別人的智慧型而不去審視它。(另外,它可能比夏季野餐還要麻煩,但因為你沒有花時間去理解它,你永遠不會意識到你就像是大自然的搬運工一樣,只是在做體力勞動。)
從事個人程式設計專案有很多優勢。首先,它為你提供了一種學習工具以及學習技術的方法,而這些工具和技術在你當前的工作中是用不到的,但是這將使你在下乙份工作中更有市場。無論你是為開源專案做貢獻,還是為當地社群組織做公益工作,你都能獲得技術技能和自信。(此外,你的個人專案向潛在雇主證明,你是乙個從不停止學習的人。)
編寫**的另乙個好處是它強迫你自己去解決問題。你不能把這些難啃的問題留給別人,所以它會讓你過早地尋求幫助。
傾聽別人的意見是很有幫助的。這可能意味著結對程式設計,或者參加黑客馬拉松,或者加入乙個程式設計使用者組(比如vermont coders connection)。當你為乙個開源專案做貢獻時,要關注一下你從使用者和其他開發者得到的反饋意見。你在他們的批評中看到了什麼共同點?
這樣做你可能會很幸運地認識了一位可以完全信任的導師,無路是編碼技術還是職業決策,你都可以完全信任他。所以不要浪費這些機會。
程式語言、工具和方法這些都只是一時的。這就是為什麼需要你在這麼多的語言和框架中盡可能多的獲得經驗。重點關注程式設計基礎,因為基礎永遠不會改變;更關注體系結構而不是如何程式設計。如果你覺得做某件事只有一種正確的方式,那可能是時候進行現實核查了。條條框框的限制會妨礙你學習新事物的能力,也會使你很難適應變化。
我可以繼續前進,但自我提公升的關鍵原則是知道何時停止。
程式語言史
程式語言是一組用來定義電腦程式語法規則且被標準化交流語言,用來向計算機發指令。一種計算機語言使程式設計師準確定義計算機所需資料並精確定義不同情況應採行動。人們多次試圖創一種通用程式語言,卻無一成功。之所以有多種程式語言,是因程式語言設計初衷不同 對語言學習曲線追求不同 不同程式間執行成本差異等。下圖...
《金牌網管師》 10年的沉澱,18年的積累
網路管理不僅是我參加工作至今18年多的主要工作和學習方向,也是我近10年的散稿創作和近10年的圖書創作最主要方向。所以,無論是多職業本身,還是從技術層面來講,我對網路管理這一職業都應當是比較全面的。但計算機網路技術也就是在我這18年工作生涯中得到了極大的發展,無論是乙太網技術,還是wlan技術,還是...
letecode 程式設計學習(35)
給你乙個長度為 n 的整數陣列,請你判斷在 最多 改變 1 個元素的情況下,該陣列能否變成乙個非遞減數列。我們是這樣定義乙個非遞減數列的 對於陣列中所有的 i 0 i n 2 總滿足 nums i nums i 1 示例 1 輸入 nums 4,2,3 輸出 true 解釋 你可以通過把第乙個4變成...