前言:最近收到很多讀者朋友私信,問我如何學習程式設計,這個問題其實很難正面回答,而且本人也確信自己達不到指點別人學習的高度,這篇文章基於作者自己這幾年趟過的路,和大家聊聊程式設計學習的話題,僅供一些感到迷茫的朋友做點參考。
一、面對選擇
1、程式語言
學習程式設計的第一件事就是面對語言的選擇,程式語言五花八門種類繁多,不同的技術型別適應不同的應用場景,所以語言本身沒有高低之分存在即合理,學會做選擇才是入門的關鍵;
【建議】 在選擇之前對主流的技術選型做對比了解,熟悉不同程式語言的學習成本、難度、適用場景、市場需求等基本情況,具體如何選擇可以從如下幾個方面思考:
- 興趣使然:自己感興趣的東西才能更加容易的持之以恆,技術積累最需要的就是堅持不斷的沉澱,沒有其他所謂的捷徑可走;
- 主流語言:在單純做語言選擇的時候,更推薦從主流中選取,市場的工作機會多,這樣求職壓力就會減少,從各大招聘網站上搜尋即可得到參考性資料;
【建議】 在時間允許的情況下,除了深入學習一門主流語言,還可以對其他技術做入門級的學習即可,如果時間不允許,那就一定要專注在一門語言上,以提高專業水平和市場競爭力。
2、入職公司
工作上對於入職的公司選擇,網上各種分析帖已經說的十分透徹了,通常來說,如果真的具備選擇不同公司的能力,都不會糾結於如何選擇,首先看如下幾種型別的公司:
- 創業型:有資源、資金、好的想法的創業團隊,加入的門檻是最高的,如果能在公司初創期加入,可能3-5年就會成功的走出職場;
- 大公司:複雜的業務模式,龐大的系統架構,嚴謹的協作流程,這是大廠的基本標籤,所以在大廠不夠鍛鍊人的說法有點迷,職場絕不單看技術能力;
- 小公司:小公司與創業型公司有本質上的區別,這裡更多的指業務模式單一體量較小的公司,很容易出現一個人擔任多個角色的情況,確實鍛鍊人;
以上說法只是大概率的普遍現象,不針對個別不同的情況,通常主流的建議都是推薦選擇對自身發展有影響的公司,以便於更快的積累專業能力,這樣後續有更寬闊的選擇空間,在職場初期也大多會這樣選擇。
【事實】 上在職場沉澱幾年之後,多數人再次面對選擇的時候,首先考慮的就是薪水高低,人一但嘗過生活的五味雜陳,就能體會到經濟能力才是對選擇的最大支撐,用一句經典的話來解釋:人到中年身不由己,上有老下有小。基於普遍的真實狀況來看,薪水的高低與公司入職門檻的高低成正比。
3、發展路線
職場上發展路線是至關重要的,工作的前2年,需要不斷積累專業的技術能力,隨著經驗的積累薪水的提高,尤其是心態上的不斷變化,堅定不移的走技術路線的人很少,這與當下網際網路的環境有最直接的關係,這裡說幾個常見的發展路線:
- 技術路線:需要對技術追求抱有持續的興趣,技術既要具備深度也要具備廣度,大多數開發在職場初期可能都具備這種心理,但是隨著職場的不斷磨練和環境的影響,追求技術的熱情,也許會被磨的平淡;
- 管理路線:技術向管理角色的轉變,因為網際網路的環境原因或多或少存在一定的被動因素;多數公司站在需求與成本平衡的角度,對於極具技術深度的人才需求並不強烈,技術能力較好同時具備業務和團隊的管理能力更受職場的歡迎;
- 創業路線:在網際網路領域中機會還是比較多的,各行各業都在提倡網際網路+的背景下,如果在職場中有了足夠的能力、資源的積累,會有相當一部分選擇嘗試創業;
【注意】 如果把技術當成解決業務的工具,即使對技術深度的追求不多,也要對技術的使用做到細緻與熟練,對於專業範疇內的能力是不能打折的,遇見過少數的技術面試這樣解釋自己的綜合能力:因為追求於專案管理或者業務解決能力,所以欠缺技術細節方面的沉澱。這種思路當真是清奇。
二、技術棧整理
上面聊程式設計中關於選擇的熱點話題,這裡來說具體的技術積累,作為一名Java程式設計選手,下面主要圍繞相關主流的技術棧與進階過程做梳理,大致分為基礎、進階、高階三個階段,受到工作經歷與經驗的影響,所以在劃分的時候存在諸多主觀因素。
1、基礎篇
在衡量一個開發人員的能力時,通常會提到一句話:技術深度與業務高度,這裡說的技術深度,至少有6-7成的因素是指基礎能力的深度。經常閱讀框架的實現原始碼會發現,都是對於JDK原始碼、設計模式、結構演算法的排列組合,從而形成解決某類場景業務的元件。
【建議】 在有大量模組化空閒時間的階段,把主要精力持續放在以上基礎模組,是收益最大的選擇,這裡更多指大學階段。程式設計中越是基礎原理就越複雜,這是普遍認可的共識,所以這個模組在學習的時候對於時間成本要求較高,一旦進入工作階段,很難在抽出整體的時間細緻的回顧基礎模組。
假設Java的集合容器模組,用1-2周的時間,從API使用到原始碼邏輯,分析內在的擴容機制,涉及的演算法與資料結構,進而再上升到設計模式的實踐,流程這樣走下來對於基礎的理解就具備一定的深度了,也自然達到觸類旁通的效果,那麼對於IO流與併發也就是相同的原理。
2、進階篇
這裡羅列的是當前技術選型中常用的框架與元件,當進入工作階段之後,會接觸到各種不同的開發元件,學會熟練使用不同的元件去解決不同型別的需求是不可缺少的能力,這時候對於框架原理的理解,完全依賴於基礎能力的積累程度。
【說明】 一下,最近幾年隨著對網際網路資料的重視,很多公司都在做資料的採集沉澱與分析,同時大資料領域的開源元件推出,已經弱化了Java工程師與大資料工程師的邊界,所以對於大資料技術棧的瞭解,對於管理海量的業務資料是至關重要的,熟悉3-2個資料儲存查詢的元件,會提供更開闊的技術選型思路。
3、高階篇
當能力到達這個階段,基本上就是架構師級別的水準了,同樣的道理這個階段依賴於基礎和進階能力的沉澱,鑑於作者本人沒有歷經過架構師的職位,所以無法給到主觀的建議,只是對於團隊中架構師的職責做的分析,主要在於提供技術棧的選型和複雜業務的解決方案,流程自動化是分散式系統的必要支撐。
【注意】 這裡只是單純的技術進階的角度,關於衡量開發人員的另外一個核心因素:業務高度。站在客觀的角度去看的話技術與業務能力需要一比一提升,業務管理也是走出開發角色的基本要求。
三、業務管理
從入職場開始,因為沒有待過純技術型的公司,所以都是在圍繞業務場景做程式設計開發,能感覺技術能力有較大提升的階段,都是在解決複雜業務之後的反思。業務的底層邏輯是流程管理與模型建立,如何認知複雜的業務並進行抽象設計是技術水平的直接體現。
【然而】 在公司的日常面試工作中,時常會遇到少量求職者表達自己單方面的訴求:一種是希望公司可以提供技術發展路線,而不是常年累月的業務版本;另一種則希望公司能提供業務發展路線,入職之後可以慢慢脫離技術方向。如果站在招聘需求的角度去考慮,建議在求職面試時不要表達這種個人發展路線的追求,因為多數公司的招聘目的都是:需要技術人員來實現業務需求。
【誤區】 職場上的新人選手,很容易產生這樣一種心裡:每天都是理不清的業務需求,改不完的坑坑窪窪,然而換個公司和環境之後,會發現依舊是這種工作節奏。所以在新手階段就用樂觀的心態去面對各種業務模式,並且持續的學習和總結各種業務解決方案,這是開發同學技術轉型的核心競爭力。
【通常】 來說,業務是關聯公司各個角色的連線點,對於業務解決方案都會以各種文件的形式記錄並沉澱下來,這也是團隊常用的一種管理手段,也方便以後在類似的業務中提供借鑑參考,不斷提升業務落地的能力和效率。實際上大部分開發選手都會選擇技術與業務同時積累的方式,儘量放大自己職場的可能性。
四、擴充能力
擴充能力作為職場上必備的軟技能,並不是程式設計師才需要具備的,對於常說的管理能力、流程規範等都是經驗積累的體現,至於這些能力如何去積累很難一概而論,因為不同的環境經歷的不一樣,好的多借鑑,差的作為反面教材即可,這種能力通常在一段經歷之後花點時間總結反思就會明白。
【特別】 說一下關於認知這種抽象的話題,因為存在於產品開發的各個環節,在職場上也會經常聽到,認知導致思路對不齊,所以不管是產品、開發、專案經理;如果認知角度單一,看法就會片面,如此在流程協作中很容易產生極大的分歧。
五、學習與積累
專業的工作能力和經驗積累包括多個方方面面,技術、業務、軟能力。這種沉澱是一個持久的過程,以樂觀的心態去學習遇到的冷門技術棧,用平靜的心情去研究熱門的新框架,並且不斷的總結業務實現的方案。最後祝大家:風平浪靜、揚帆遠航。
同系列推薦