天賦差的程式設計師,難道就只能半途而廢嗎?
【CSDN編者按】程式設計不易,且行且珍惜。
在很多人看來,也許優秀的程式設計師靠的就是與生俱來的強大天賦,外加蜻蜓點水般的時間付出,就能夠煉就算無遺漏的編碼技能。那麼果真是如此嗎?身為不太聰明的開發者難道就活該中途止步嗎?本文的作者就表示“不想承認自己太笨,學不會程式設計”,然後憑著這樣不服輸的精神以及對開發工作的熱愛,他加倍地努力,腳踏實地地一步步走出了自己的開發者之路。
在本文中,他分享了從最初的程式設計師小白、到現在的高階工程師,十四年的時間他是如何不斷提升自己的,希望藉此文,能夠給廣大的程式設計師們以勉勵:輸在了起點,並不意味著就輸掉了終點。
譯者 | 彎月
責編 | 郭芮
出品 | CSDN(ID:CSDNnews)
以下為譯文:
在我看來,程式設計從來都不是易事。我第一次程式設計是在11歲,那時候我拿到了如下這本書。而且當時我很喜歡玩任天堂64,還夢想著以後自己製作遊戲。
《青少年遊戲程式設計》,這本書改變了我的一切
但是,想象是美好的,現實的我能力卻遠遠低於平均水平。
我曾在這些論壇(http://mojolabs.nz/forums.php)寫了一篇文章尋求幫助如何理解一個while迴圈——毋庸置疑,我表現得像個渾身長滿刺的小刺頭,因為我覺得那些比我聰明的人老是用高人一等的語氣跟我說話,告訴我應該好好學習一下基本知識,而不是一頭扎進電腦遊戲的製作。
當時的那些論壇大概像這樣(大約在2005年)
所以,雖然我的野心很大,但是這個TwisterMan(轉圈圈的小人)不會自己程式設計!(我完全是用微軟的畫圖軟體手動畫出來的......)
TwisterMan動畫框架,這個小人正在施展旋風腿
小心下面這個長刺的傢伙!
嗷……
還有下面這個大Boss……
咩……?
重點在於我發現我不擅長程式設計(而且在設計方面也沒有天賦,呵呵!),我不明白如何才能像程式設計師那樣思考,而且我的學習之路也很崎嶇,因為我沒有任何基礎知識。直到十四年的現在,我的程式設計技術才有所進步。
為什麼這麼呢?難道這意味著你必須經過14年的努力才能成為一名優秀的程式設計師?還是說每個人的程式設計職業生涯都要從畫長刺的小人開始呢?在這篇文章中,我就來分享下幫助我提高程式設計能力的具體事宜,以及每個人在成長過程中所需要經歷的不同階段。
入門階段
不要以為自己能輕易做得很好
做人要謙虛,阻礙你成為優秀的程式設計師的最大敵人就是你自己。此外,謙虛可以使人快樂,所以何妨一試呢?不過,即使嘴上說著你會試試看,但是固執己見的你根本就不會聽我的話,對不對?驕傲最難克服了。
認真學習基礎知識
在你開始學習基礎知識時,不用擔心基礎知識之外的東西,也不必將你的程式用圖形表示出來。
新手入門時你可以做的最大努力就是學會理解、遵循邏輯:理解如果if語句中的某些東西為true,那麼if語句內部的語句會被執行;理解for迴圈的執行次數;理解大括號的用途;理解不同的原始資料型別......等等。
不必擔心演算法問題
我十分不喜歡純演算法的問題。我認為這些問題並不能決定你是否是一名有經驗的程式設計師,這家獵頭公司也有相同的看法(https://triplebyte.com/)。
說實話,我就不太擅長一些數學程式設計演算法,而且我也不擅長解邏輯謎題!要麼你喜歡演算法,要麼你對它們漠不關心——所以不必擔心你屬於哪一種,重要的是你要有解決問題的能力。
變得勇敢
這一點很重要。姑且先不說程式設計師,如果在生活中如果遇到挫折你沒有勇氣再站起來,那麼你就會很痛苦。如果在程式設計的時候你不夠勇敢,那麼你會更痛苦。我認為我成功的最大因素就在於勇敢。
勇敢的真實模樣
但是,要成為勇敢的人並不容易。金錢買不來勇敢,你必須培養、鍛鍊、加強你的勇氣。最重要的是你需要一個培養勇氣的目標,如果沒有目標,那麼你會喪失前進的理由。
那麼我的目標是什麼?我如何成為了一個勇敢的人?很諷刺的是,我的勇氣來自我的驕傲。我很固執,一門心思想學程式設計,因為程式設計很難;而且我無法忍受這個事實——程式設計太難,我學不會。
所以我加倍地努力,因為我不想承認自己太笨,學不會程式設計。
建立一個小專案
這個專案並一定要很大,你只需建立你感興趣的東西(或者在某些方面有用的東西),然後擴充套件並嘗試一些你沒做過的事情。
我做的第一個應用程式是一個控制檯應用程式,它可以接受一些輸入,例如作者的名字和姓氏,以及他們釋出的作品,然後按照美國現代語言協會的風格來格式化展示這些作品的頁面。
整個應用程式大約有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;如果你從事軟體開發,情況也是如此。
你關注的東西越多,學到的就越多。
使用原始碼管理
你需要熟悉原始碼管理,並儘可能多地使用,因為在大多數公司中工作都需要使用原始碼管理(除非假設你在銀行工作)。
Git中的分支
說真的,上述提到的銀行只是開個笑話,一定要好好學習原始碼控制。
清楚何時提問
你可以在工作中學到該何時提問,但在正式參加工作之前,你可以閱讀這篇文章(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)、看板等等功能特性。
當然,以上這些只是一些主要的工具(也是我個人比較偏愛的一些工具)。工具的發展瞬息萬變,比如就在你讀這篇文章的時候,可能就出現了新的工具(同時也有些工具被淘汰了)。
參加各種會議
通常,公司都會出錢讓員工參加各種技術大會。這些會議可以為你提供整個技術領域更廣闊的視野,以及建立了日常所用工具和軟體的專業人士的深刻見解。這些會議由一群非常聰明的人組織和領導,你可以聆聽他們的談話,在滿屋子的聰明人中間你可以表現得很謙虛。
VSLive是Windows / C#開發人員的會議
業餘專案
你可以繼續在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工廠選項,因為應用程式主機不太可能會改變。
主題專家
成為無所不知無所不曉的專家。如果你還想繼續探索未知的領域,那麼可以考慮進入研究領域。
原文:https://debugandrelease.blogspot.com/2018/12/how-to-become-better-programmer.html
本文為 CSDN 翻譯,如需轉載,請註明來源出處。
熱 文 推 薦
☞ 今日頭條收購錘子?ofo 半月退 24 萬戶押金;鬥魚索賠主播 1.5 億元 | 極客頭條
程式設計師有話說 | 大專生畢業 6 年月薪 3W+:不從眾也不普通
☞ 網友們票選的2018 Best Paper,你pick誰?
print_r('點個好看吧!');
var_dump('點個好看吧!');
NSLog(@"點個好看吧!");
System.out.println("點個好看吧!");
console.log("點個好看吧!");
print("點個好看吧!");
printf("點個好看吧!\n");
cout << "點個好看吧!" << endl;
Console.WriteLine("點個好看吧!");
fmt.Println("點個好看吧!");
Response.Write("點個好看吧!");
alert("點個好看吧!")
echo "點個好看吧!"
點選“閱讀原文”,開啟 CSDN App 閱讀更貼心!
喜歡就點選“好看”吧!相關文章
- 程式設計師的開發專案總是半途而廢程式設計師
- 為什麼程式設計師的開發專案總是半途而廢?程式設計師
- 程式設計師是一個需要天賦的職業嗎?程式設計師
- 難道C++程式設計師不也是人嗎? (轉)C++程式設計師
- 中年程式設計師只能坐等被裁嗎?程式設計師
- 漫談程式設計師系列:程式設計師的生活就這樣嗎程式設計師
- 程式設計師也難逃的二八定律,成為頂級程式設計師真的有那麼難嗎?程式設計師
- 程式設計師何苦為難程式設計師?程式設計師
- 程式設計師何必難為程式設計師程式設計師
- 程式設計師與非程式設計師的思維差異程式設計師
- 差異程式設計師-評《程式設計感悟》程式設計師
- 大公司和小公司的程式設計師差別在哪?程式設計師能去小公司嗎?程式設計師
- 程式設計師差別的本質程式設計師
- 程式設計師的一天程式設計師
- 自學程式設計難度大嗎?程式設計
- 招個程式設計師,難?程式設計師
- 糟糕的、差勁的,以及不該來當程式設計師的程式設計師程式設計師
- 學完Java後只能做Java程式設計師嗎?求職方向有哪些呢?Java程式設計師求職
- 內向的人很難成為群體程式設計師嗎?程式設計師
- 程式設計不需要天賦和激情程式設計
- 漫談程式設計師系列:一張圖道盡程式設計師的出路程式設計師
- 程式設計師只能吃青春飯?程式設計師該怎麼規劃自己的未來程式設計師
- 程式設計師的路好走嗎程式設計師
- 程式設計師如何做出“不難看”的設計程式設計師
- 程式設計師創業的兩難困境程式設計師創業
- 為什麼美國程式設計師不用加班,而中國程式設計師就只能996?程式設計師996
- 程式設計天賦是一種危險的神話程式設計
- 程式設計師 你幸福嗎?程式設計師
- 更慢的程式設計師效率更高嗎?程式設計師
- 你是浪漫的程式設計師嗎?程式設計師
- HTML5:大神級程式設計師和普通程式設計師差異分析HTML程式設計師
- 程式設計師,你只能有一個媳婦兒!程式設計師
- 一個程式設計師失業的66天程式設計師
- 程式設計師打工人的一天程式設計師
- 為什麼微軟製造差的程式設計師?微軟程式設計師
- Java程式設計師的10道XML面試題Java程式設計師XML面試題
- Java程式設計師的筆試題10道Java程式設計師筆試
- 禪道程式設計師的10條原則程式設計師