天賦差的程序員,難道就只能半途而廢嗎?

編程不易,且行且珍惜。

在很多人看來,也許優秀的程序員靠的就是與生俱來的強大天賦,外加蜻蜓點水般的時間付出,就能夠煉就算無遺漏的編碼技能。那麼果真是如此嗎?身爲不太聰明的開發者難道就活該中途止步嗎?本文的作者就表示“不想承認自己太笨,學不會編程”,然後憑着這樣不服輸的精神以及對開發工作的熱愛,他加倍地努力,腳踏實地地一步步走出了自己的開發者之路。

在本文中,他分享了從最初的程序員小白、到現在的高級工程師,十四年的時間他是如何不斷提升自己的,希望藉此文,能夠給廣大的程序員們以勉勵:輸在了起點,並不意味着就輸掉了終點。

天賦差的程序員,難道就只能半途而廢嗎?
以下爲譯文:

在我看來,編程從來都不是易事。我第一次編程是在11歲,那時候我拿到了如下這本書。而且當時我很喜歡玩任天堂64,還夢想着以後自己製作遊戲。
天賦差的程序員,難道就只能半途而廢嗎?
《青少年遊戲編程》,這本書改變了我的一切。但是,想象是美好的,現實的我能力卻遠遠低於平均水平。

我曾在論壇寫了一篇文章尋求幫助如何理解一個while循環——毋庸置疑,我表現得像個渾身長滿刺的小刺頭,因爲我覺得那些比我聰明的人老是用高人一等的語氣跟我說話,告訴我應該好好學習一下基本知識,而不是一頭扎進電腦遊戲的製作。
天賦差的程序員,難道就只能半途而廢嗎?
當時的那些論壇大概像這樣(大約在2005年)

所以,雖然我的野心很大,但是這個TwisterMan(轉圈圈的小人)不會自己編程!(我完全是用微軟的畫圖軟件手動畫出來的......)
天賦差的程序員,難道就只能半途而廢嗎?
TwisterMan動畫框架,這個小人正在施展旋風腿

小心下面這個長刺的傢伙!天賦差的程序員,難道就只能半途而廢嗎?
嗷……

還有下面這個大Boss……

天賦差的程序員,難道就只能半途而廢嗎?
咩……?

重點在於我發現我不擅長編程(而且在設計方面也沒有天賦,呵呵!),我不明白如何才能像程序員那樣思考,而且我的學習之路也很崎嶇,因爲我沒有任何基礎知識。直到十四年的現在,我的編程技術纔有所進步。

爲什麼這麼呢?難道這意味着你必須經過14年的努力才能成爲一名優秀的程序員?還是說每個人的編程職業生涯都要從畫長刺的小人開始呢?在這篇文章中,我就來分享下幫助我提高編程能力的具體事宜,以及每個人在成長過程中所需要經歷的不同階段。

入門階段不要以爲自己能輕易做得很好
做人要謙虛,阻礙你成爲優秀的程序員的最大敵人就是你自己。此外,謙虛可以使人快樂,所以何妨一試呢?不過,即使嘴上說着你會試試看,但是固執己見的你根本就不會聽我的話,對不對?驕傲最難克服了。

認真學習基礎知識

在你開始學習基礎知識時,不用擔心基礎知識之外的東西,也不必將你的程序用圖形表示出來。

新手入門時你可以做的最大努力就是學會理解、遵循邏輯:理解如果if語句中的某些東西爲true,那麼if語句內部的語句會被運行;理解for循環的執行次數;理解大括號的用途;理解不同的原始數據類型......等等。

不必擔心算法問題

我十分不喜歡純算法的問題。我認爲這些問題並不能決定你是否是一名有經驗的程序員,這家獵頭公司也有相同的看法。

說實話,我就不太擅長一些數學編程算法,而且我也不擅長解邏輯謎題!要麼你喜歡算法,要麼你對它們漠不關心——所以不必擔心你屬於哪一種,重要的是你要有解決問題的能力。

變得勇敢

這一點很重要。姑且先不說程序員,如果在生活中如果遇到挫折你沒有勇氣再站起來,那麼你就會很痛苦。如果在編程的時候你不夠勇敢,那麼你會更痛苦。我認爲我成功的最大因素就在於勇敢。
勇敢的真實模樣
但是,要成爲勇敢的人並不容易。金錢買不來勇敢,你必須培養、鍛鍊、加強你的勇氣。最重要的是你需要一個培養勇氣的目標,如果沒有目標,那麼你會喪失前進的理由。

那麼我的目標是什麼?我如何成爲了一個勇敢的人?很諷刺的是,我的勇氣來自我的驕傲。我很固執,一門心思想學編程,因爲編程很難;而且我無法忍受這個事實——編程太難,我學不會。

所以我加倍地努力,因爲我不想承認自己太笨,學不會編程。

建立一個小項目

這個項目並一定要很大,你只需建立你感興趣的東西(或者在某些方面有用的東西),然後擴展並嘗試一些你沒做過的事情。

我做的第一個應用程序是一個控制檯應用程序,它可以接受一些輸入,例如作者的名字和姓氏,以及他們發佈的作品,然後按照美國現代語言協會的風格來格式化展示這些作品的頁面。

整個應用程序大約有70行,包含獲取用戶輸入的代碼(類似於C#中的ReadLine),然後以正確的格式輸出,就是如此簡單的一個控制檯應用。

新手階段
在這個階段,你可以編寫一些代碼了,但還無法編寫任何實質性的東西。你明白不同的類型,還知道一些不同的術語,但大部分編程方面的經驗可能僅限於在一個編輯器中使用一種語言。你也可以編寫簡單的練習,但前提是有人給你解釋清楚。

閱讀別人的代碼

我作爲新手的大部分時間都是在大學裏,我從StackOverflow上學到了很多東西。多看,多讀,注意別人寫代碼的方式。StackOverflow可以幫助你拿下學位,這可不是一句笑談,請看下圖。天賦差的程序員,難道就只能半途而廢嗎?隨着經驗的增長,你會越來越依賴StackOverflow
向那些沒有聽說過StackOverflow的人解釋一下,StackOverflow是一個編程答疑社區。人們在上面發佈有關編程的問題,社區負責解答。你可以給優秀的答案點贊,而質量較差的答案卻無法得到點贊。

在StackOverflow上你可以同時看到好的和壞的代碼(偶爾也會看到有趣的代碼),但是請不要過於依賴死記硬背如何編寫完美的代碼,你需要在經常訪問該網站的時候注意那些編程的模式。

學習面向對象

我估計大多數開發人員都會接觸到面向對象的系統,因此學習面向對象至關重要。簡而言之,面向對象可以按照對象的關係和邏輯組織你的程序,通常對象可以反映你正在使用的域。

想了解更多關於面向對象的內容,可以參看這個鏈接:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/object-oriented-programming

參加高難度的課程

這一條僅適用於學生,但如果你不在學校,那麼也可以在網上學習算法(https://www.coursera.org/specializations/algorithms)。

算法是必須學習的內容,你需要學習數據結構和算法,包括堆、堆棧、隊列/鏈表、指針等等。只要你順利通過這些高難度的課程(而不是矇混過關),那麼你的編程技術就可以得到進一步的發展了。我建議你至少拿到B或B+(或者你的在線課程的同等評分)。

但是很有可能有至少一半的人無法通過這個課程,或掌握這些概念。這門課程真的可以淘汰那些無法進一步發展的人(這就是爲什麼勇氣如此重要!!),祝你好運!

再次擴展項目

這時,你可以接受另一個比你以往從事過的項目更大的項目。合適的項目包括Web應用程序、硬件項目、爲開源庫做貢獻(如果你願意接受挑戰的話),或者也可以是桌面應用程序。

這些你可以參與的項目很有可能就是你的實習項目(或者可以讓你獲取相關的經驗來申請實習的職位),所以如果你對你感興趣的事情有一個大概的想法,那麼就可以在這個領域建立一個項目。

這一步看似很難,但沒關係,這一步本來就充滿了挑戰。參加這樣的項目有助於推動你成長,還可以讓你學到很多知識,這些都可以直接轉化爲將來你的編程工作需要做的任務。

收穫回報

到了這個階段,你就可以輔導或指導年輕的程序員了。抓住一切機會,教別人的同時你也能學到新的東西。你可以考慮加入這個網站(https://code.org/)做義務教學。考慮教學?寫博客怎麼樣?在職業生涯的後期階段你也可以隨時考慮如何回報社會

初級程序員

到了這個階段,你就擁有一些編碼經驗了,但還沒有太多現實世界的編程經驗。

誠實地問自己

你真的喜歡編程嗎?這是我希望自己長期從事的事業嗎?你可能不知道自己想要的究竟是什麼,但如果你喜歡學習新技術、成長和解決問題,那麼說明你選對了領域。

不管怎樣,不要害怕退縮。如果你不喜歡做程序員,那麼請誠實地面對自己,尋求更好地符合自己興趣的不同道路。

天賦差的程序員,難道就只能半途而廢嗎?回顧你的優點和缺點
爲自己建立長期目標

另一方面,如果你喜歡編程,那麼你希望自己往哪個方向發展?從事Web開發、嵌入式系統、物聯網、還是軟件開發?你不需要完全確定朝哪個方向發展,但是可以在路上每跨出一步就認真思考你是否要繼續前進,在線課程或認證可以幫助辨別你的發展方向。

你可以嘗試不同的領域,並找到自己感興趣的領域。

專攻

熟練使用各種編程語言,努力成爲專家——但不要試圖掌握所有。問問你自己,你是否可以在工作中擔任某個專業角色。如果你是自由職業者,那麼客戶會欣賞(並期望)你是某個具體領域的專家,而非廣而不精。

舉一個專業化的簡單例子——Web開發中的可視化,就要求專注於前端(JS、React或其他),或者專注於後臺(C#、PHP或Node等)。

淵博的知識儲備

這要求你掌握一門以上的語言。舉個例子,如果你從事Web開發,那麼你需要掌握CSS、JS和HTML;如果你從事軟件開發,情況也是如此。

你關注的東西越多,學到的就越多。

使用源代碼管理

你需要熟悉源代碼管理,並儘可能多地使用,因爲在大多數公司中工作都需要使用源代碼管理(除非假設你在銀行工作)。
天賦差的程序員,難道就只能半途而廢嗎?
說真的,上述提到的銀行只是開個笑話,一定要好好學習源代碼控制。

清楚何時提問

你可以在工作中學到該何時提問,但在正式參加工作之前,你可以閱讀這篇文章(https://debugandrelease.blogspot.com/2018/11/how-to-approach-problem-you-dont-know.html)。

中級程序員閱讀,閱讀,再閱讀
這個階段,你可以閱讀有關編程、技術和你正在使用的語言的博客、新聞文章、播客和視頻,還可以訂閱博客或電子郵件簡報。這裏就是一個包含大量C#資源的網站(https://medium.com/@jakubgarfield/how-to-keep-up-to-date-as-a-c-developer-387bff208158)。

對於一門語言以及該領域(以及兩者如何相互關聯)的信息瞭解得越多,你就越有可能成爲更加優秀的程序員。如果你想成爲擁有更高能力的優秀程序員,那麼這一點是必不可少的,所以一定要保持良好的習慣!

發現更多工具

發現持續性集成與持續×××付(即CI / CD,例如Jenkins,Visual Studio團隊服務)和自動構建等工具,可以更好地提供自行建立API文檔、IDE擴展、組件反編譯器、管理虛擬機、不同風格的包管理器(Chocolatey和NPM)、看板等等功能特性。

當然,以上這些只是一些主要的工具(也是我個人比較偏愛的一些工具)。工具的發展瞬息萬變,比如就在你讀這篇文章的時候,可能就出現了新的工具(同時也有些工具被淘汰了)。

參加各種會議

通常,公司都會出錢讓員工參加各種技術大會。這些會議可以爲你提供整個技術領域更廣闊的視野,以及創建了日常所用工具和軟件的專業人士的深刻見解。這些會議由一羣非常聰明的人組織和領導,你可以聆聽他們的談話,在滿屋子的聰明人中間你可以表現得很謙虛。
業餘項目

你可以繼續在Github上探索自己的興趣所在。嘗試創造任何你感興趣的東西,而不僅僅侷限於那些可能會賺錢的東西。建立一些你喜歡做的事情!以下幾個簡單的問題可以幫助你開始自己的業餘項目:

我想解決什麼問題?
我想學習哪些我現在不懂的知識?
汲取信息

從那些比你聰明的人那裏汲取信息:向他們提問題;問他們爲什麼選擇這種方式;問他們爲什麼選擇那個框架;問他們你未能完全理解的知識......

但是,要注意火候。

掌握自己的領域

我希望到此爲止你找到了某個自己可能感興趣的領域。無論是電子商務,還是農業、時尚、製造,領域本身並不重要,重要的是你需要積極地走出去學習你所從事的領域。你不應該再繼續一門心思地寫代碼,應該利用你的編程知識來解決某個領域的問題。

這就是爲什麼找到自己喜歡從事的職業非常重要的原因!

瞭解首字母縮略詞與術語

比如SaaS、DRY、SRP、SOLID、PaaS、Blue/green......等等。一旦掌握了這些,你就可以看看如何應用這些術語,以及如何在編程時應用它們了。

改善你的工作記憶

如果你有以下特質,那麼我確信你會是一名優秀的程序員:

邏輯思考的能力;
在限定時間掌握大量信息。
很明顯,你需要理解邏輯(解決問題這一類的邏輯),但是如果你無法在腦海中記住大量信息,那麼作爲一名程序員你就無法更好地掌握你遇到的(更抽象)的問題。

我們的工作記憶力很有限,除非我們能夠以某種方式清空我們的思想,否則我們根本就沒有足夠的腦力。爲此,我有一個建議——哈希表記憶,它極大地幫助我的大腦獲得了更多記憶空間。

通過這種記憶方式,我們不需要記住每個細節中的所有內容,而是隻需記住信息的存儲位置。天賦差的程序員,難道就只能半途而廢嗎?我傾向於寫下來,並在一些媒體(筆和紙,.docx,在線博客,類似於Confluence的服務)上記錄下我的知識。在下次需要回憶有關Powershell命令行的詳細信息時,我只需要知道查看什麼地方,而無需記住所有信息。

更多瞭解大廠商(PaaS,Iaas,Saas等)

到這個階段的時候,你應該知道哪些是主要廠商,以及他們在做什麼,但是你不需要成爲像他們一樣的專家。

舉幾個例子,比如 AWS、GCP和Azure。很可能你會在日常工作中使用其中一種產品,坦率地說,這是行業發展的方向。

如果你不喜歡使用在線平臺,或者你身處一個保守的工作場所,那麼你很可能仍然還在使用本地的服務。當負責超敏感數據(例如PCI或PHI)時,你也可以使用本地系統。

瞭解數據庫

關係型和非結構化,這兩種數據庫結構你都需要了解(或者至少擁有其中一個模型的工作經驗)。如果你使用大數據(Hadoop),那麼數據庫就更加不可或缺了。
高級程序員
掌握框架

爲了你的職業生涯邁向下一個階段,你必須清楚地瞭解你的框架。爲此,你可以廣泛地閱讀互聯網上的博客和文章,持續性地與他人交談並分享這些信息。這個博客(https://blogs.msdn.microsoft.com/dotnet/tag/c/)上就是.NET框架的基本知識。此外,框架的學習同時還包括學習鍵盤快捷鍵

在這一步中,你可以構建自己的解決方案(關於如何應用自己的知識,請參照下圖的示例)天賦差的程序員,難道就只能半途而廢嗎?
注重安全性

安全應該是所有應用程序的重要關注點。成爲高級程序員後,你可能需要參與對安全與權限有一定要求的工作或項目,你需要了解OAuth、OIDC、基於會話或Cookie的身份驗證、JWT以及一些活動目錄的知識。你還應該考慮如何保護應用程序中的API密鑰等的安全。

鍛鍊管理人員與項目的技巧

比如向老闆傳達項目狀態、識別和管理阻礙項目進展的因素、組織項目範圍、以及與利益關係人或非開發人員溝通等是你接下來必須掌握的技巧(雖然不必做到盡善盡美)。要注意你是生活在現實中的,這些事情避無可避。
天賦差的程序員,難道就只能半途而廢嗎?
如果你是自由職業者,那麼情況亦是如此!

聽取反饋

我們都不想聽到負面的反饋,但是忠言逆耳,你必須聽取負面的反饋。詢問你的同事、經理、或看過你代碼的人的意見,你不一定需要他們給你嚴格的編程反饋,也可以詢問是否有社交方面的問題可以改進——凡是有關個人的改進都可以讓你提高自己的編程能力。

加速流程

通過shell自動化來加快你的速度。如果你工作的公司還沒有建立好的實踐,那麼抓住機會自己動手創建腳本(使用shell腳本),或者按照正確(但更難)的方式執行腳本,併爲你的團隊構建一個有助於交付價值的流程。

承擔複雜的工作

這與改善工作記憶密切相關,迫使自己接手越來越難的代碼,會持續推動你的理解極限。

研究優化

你應該花一些時間學習優化。

對於C#來說,這包括異常、循環、字符串比較、ASCII、結構等等(https://www.dotnetperls.com/optimization)。掌握如何以及何時實現這些優化是普通程序員與優秀程序員的真正區別

此外,想了解有關包裝與解包裝性能的更多信息,可以查看這個鏈接:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/types/boxing-and-unboxing

資深程序員
事先說明,我還不是資深程序員,但是我很幸運能夠與那些比我更聰明的人共事,這些人身上充滿了資深程序員的特質。

選擇妥協

在這個階段,你所遇到的問題也許沒有明顯的正確或錯誤的答案,所以你必須選擇一個不那麼糟糕的選項。

舉個例子,最近我與一位同事進行了一次這樣的談話。

當時他正在討論在.NET Core Web應用程序中公開HttpContext的選項。問題是我們應該通過構造函數注入傳遞HttpContext,還是應該通過一個工廠(factory)訪問HttpContext。通過構造函數傳遞HttpContext可以很好地提供代碼,但是使用工廠可以提供額外的好處,例如自定義HttpContext類以及將來更容易修改(和添加)。

在這種情況下,HttpContext工廠需要創建成IServiceProvider調用的擴展,以關聯依賴關係。按照這種方式創建的工廠將限制可以使用擴展的主機(webhosts),因爲Web主機必須知道並使用IHttpContextAccessor。換句話說,如果應用程序切換主機,HttpContext工廠可能無法正常工作。

所以,最後我們得出的結論是,在這種情況下更好的選擇是創建HttpContext工廠選項,因爲應用程序主機不太可能會改變。

我們推斷在這種情況下更好的選擇是創建HttpContext工廠選項,因爲應用程序主機不太可能會改變。

主題專家

成爲無所不知無所不曉的專家。如果你還想繼續探索未知的領域,那麼可以考慮進入研究領域。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章