⑴ 程序員的核心競爭力是什麼為什麼
終於有一個問題可以好好說說我遇到過的彎路了。我認為程序員的核心競爭力如下:1. 整合現有資源的能力,什麼時候造輪子,什麼時候不造輪子,什麼情況下利用公司自己的輪子,什麼情況下利用開源的輪子。2. 產品發展方向的規劃能力,一個技術類的框架,產品,平台,需要程序員明確什麼問題是要解決的,什麼問題是不要解決的,產品相對其他競爭產品的優勢在哪些方面。3. debug能力,有了線上問題,可以一擼到底,無論問題在哪裡,操作系統,文件系統,虛擬機,框架,等等,都可以定位問題所在。4. 文檔、pr能力,作出了產品,可以迅速了解優勢所在並推廣5. 編碼習慣,比如嚴謹的持續集成,測試樣例先行,之所以說是習慣不是技巧,是因為好的編碼習慣,可以持續為團隊帶來更大收益,而好的編碼技巧沒有那麼大的效果。切忌以下行為:1. 長時間調研沒結果,學習了很多框架,做法,無法認真對比優劣,這就是不能抓住核心的問題2. 被需求牽著鼻子走,失去了產品的規劃方向,或是走到哪算到哪,做出來的東西因為臃腫的需求越做越繁瑣3. 隨口亂說release時間,總是失約
⑵ 為什麼技術的深度比廣度更重要呢
1.廣度學習,盡可能多學相關的內容,了解主流技術以及粗略的原理;
2.深度學習,按一個點深挖到低層代碼和設計模式;
3.優先廣度,先找主流技術,感興趣或應用廣的先深挖;
4.優先深度,先找某個點,同一層次的去了解相關的實現;
廣度優缺點:
1.優點:認知面廣,對抽象理解更深刻;
2.缺點:掌握了很多「知道」,但是很少有可以轉化為技術的;
深度優缺點:
1.優點:深刻理解程序員用技術改變世界,產品、測試、運維改變程序員;
2.缺點:缺乏大局觀,像挖井工人,挖完一個挖下一個,總能挖到煤,但是不知道下次挖到煤需要多久。
其實沒有誰更重要,這是個先後問題。
建議先廣度,因為現實中不會有公司輕易就給你錢,而工作內容只是研究一個不一定有產出的技術點。廣度優先的核心就是要能夠做事,能夠有產出,解決個人和部門、公司的經濟問題,在經濟不成問題,沒有很大產出壓力的情況下,仍建議廣度優先,主要是為了明確方向和目標,確立了目標後,以目標為導向,該深的地方深,該廣的地方廣。
⑶ 程序員必須掌握哪些演算法
一.基本演算法:
枚舉. (poj1753,poj2965)
貪心(poj1328,poj2109,poj2586)
遞歸和分治法.
遞推.
構造法.(poj3295)
模擬法.(poj1068,poj2632,poj1573,poj2993,poj2996)
二.圖演算法:
圖的深度優先遍歷和廣度優先遍歷.
最短路徑演算法(dijkstra,bellman-ford,floyd,heap+dijkstra)
(poj1860,poj3259,poj1062,poj2253,poj1125,poj2240)
最小生成樹演算法(prim,kruskal)
(poj1789,poj2485,poj1258,poj3026)
拓撲排序 (poj1094)
二分圖的最大匹配 (匈牙利演算法) (poj3041,poj3020)
最大流的增廣路演算法(KM演算法). (poj1459,poj3436)
三.數據結構.
串 (poj1035,poj3080,poj1936)
排序(快排、歸並排(與逆序數有關)、堆排) (poj2388,poj2299)
簡單並查集的應用.
哈希表和二分查找等高效查找法(數的Hash,串的Hash)
(poj3349,poj3274,POJ2151,poj1840,poj2002,poj2503)
哈夫曼樹(poj3253)
堆
trie樹(靜態建樹、動態建樹) (poj2513)
四.簡單搜索
深度優先搜索 (poj2488,poj3083,poj3009,poj1321,poj2251)
廣度優先搜索(poj3278,poj1426,poj3126,poj3087.poj3414)
簡單搜索技巧和剪枝(poj2531,poj1416,poj2676,1129)
五.動態規劃
背包問題. (poj1837,poj1276)
型如下表的簡單DP(可參考lrj的書 page149):
E[j]=opt{D+w(i,j)} (poj3267,poj1836,poj1260,poj2533)
E[i,j]=opt{D[i-1,j]+xi,D[i,j-1]+yj,D[i-1][j-1]+zij} (最長公共子序列) (poj3176,poj1080,poj1159)
C[i,j]=w[i,j]+opt{C[i,k-1]+C[k,j]}.(最優二分檢索樹問題)
六.數學
組合數學:
1.加法原理和乘法原理.
2.排列組合.
3.遞推關系.
(POJ3252,poj1850,poj1019,poj1942)
數論.
1.素數與整除問題
2.進制位.
3.同餘模運算.
(poj2635, poj3292,poj1845,poj2115)
計算方法.
1.二分法求解單調函數相關知識.(poj3273,poj3258,poj1905,poj3122)
七.計算幾何學.
幾何公式.
叉積和點積的運用(如線段相交的判定,點到線段的距離等). (poj2031,poj1039)
多邊型的簡單演算法(求面積)和相關判定(點在多邊型內,多邊型是否相交)
(poj1408,poj1584)
凸包. (poj2187,poj1113)
中級(校賽壓軸及省賽中等難度):
一.基本演算法:
C++的標准模版庫的應用. (poj3096,poj3007)
較為復雜的模擬題的訓練(poj3393,poj1472,poj3371,poj1027,poj2706)
二.圖演算法:
差分約束系統的建立和求解. (poj1201,poj2983)
最小費用最大流(poj2516,poj2516,poj2195)
雙連通分量(poj2942)
強連通分支及其縮點.(poj2186)
圖的割邊和割點(poj3352)
最小割模型、網路流規約(poj3308)
三.數據結構.
線段樹. (poj2528,poj2828,poj2777,poj2886,poj2750)
靜態二叉檢索樹. (poj2482,poj2352)
樹狀樹組(poj1195,poj3321)
RMQ. (poj3264,poj3368)
並查集的高級應用. (poj1703,2492)
KMP演算法. (poj1961,poj2406)
四.搜索
最優化剪枝和可行性剪枝
搜索的技巧和優化 (poj3411,poj1724)
記憶化搜索(poj3373,poj1691)
五.動態規劃
較為復雜的動態規劃(如動態規劃解特別的旅行商TSP問題等)
(poj1191,poj1054,poj3280,poj2029,poj2948,poj1925,poj3034)
記錄狀態的動態規劃. (POJ3254,poj2411,poj1185)
樹型動態規劃(poj2057,poj1947,poj2486,poj3140)
六.數學
組合數學:
1.容斥原理.
2.抽屜原理.
3.置換群與Polya定理(poj1286,poj2409,poj3270,poj1026).
4.遞推關系和母函數.
數學.
1.高斯消元法(poj2947,poj1487, poj2065,poj1166,poj1222)
2.概率問題. (poj3071,poj3440)
3.GCD、擴展的歐幾里德(中國剩餘定理) (poj3101)
計算方法.
1.0/1分數規劃. (poj2976)
2.三分法求解單峰(單谷)的極值.
3.矩陣法(poj3150,poj3422,poj3070)
4.迭代逼近(poj3301)
隨機化演算法(poj3318,poj2454)
雜題(poj1870,poj3296,poj3286,poj1095)
七.計算幾何學.
坐標離散化.
掃描線演算法(例如求矩形的面積和周長並,常和線段樹或堆一起使用)
(poj1765,poj1177,poj1151,poj3277,poj2280,poj3004)
多邊形的內核(半平面交)(poj3130,poj3335)
幾何工具的綜合應用.(poj1819,poj1066,poj2043,poj3227,poj2165,poj3429)
高級(regional中等難度):
一.基本演算法要求:
代碼快速寫成,精簡但不失風格
(poj2525,poj1684,poj1421,poj1048,poj2050,poj3306)
保證正確性和高效性. poj3434
二.圖演算法:
度限制最小生成樹和第K最短路. (poj1639)
最短路,最小生成樹,二分圖,最大流問題的相關理論(主要是模型建立和求解)
(poj3155, poj2112,poj1966,poj3281,poj1087,poj2289,poj3216,poj2446
最優比率生成樹. (poj2728)
最小樹形圖(poj3164)
次小生成樹.
無向圖、有向圖的最小環
三.數據結構.
trie圖的建立和應用. (poj2778)
LCA和RMQ問題(LCA(最近公共祖先問題) 有離線演算法(並查集+dfs) 和 在線演算法(RMQ+dfs)).(poj1330)
雙端隊列和它的應用(維護一個單調的隊列,常常在動態規劃中起到優化狀態轉移的目的). (poj2823)
左偏樹(可合並堆).
後綴樹(非常有用的數據結構,也是賽區考題的熱點).(poj3415,poj3294)
四.搜索
較麻煩的搜索題目訓練(poj1069,poj3322,poj1475,poj1924,poj2049,poj3426)
廣搜的狀態優化:利用M進制數存儲狀態、轉化為串用hash表判重、按位壓縮存儲狀態、雙向廣搜、A*演算法. (poj1768,poj1184,poj1872,poj1324,poj2046,poj1482)
深搜的優化:盡量用位運算、一定要加剪枝、函數參數盡可能少、層數不易過大、可以考慮雙向搜索或者是輪換搜索、IDA*演算法. (poj3131,poj2870,poj2286)
五.動態規劃
需要用數據結構優化的動態規劃.(poj2754,poj3378,poj3017)
四邊形不等式理論.
較難的狀態DP(poj3133)
六.數學
組合數學.
1.MoBius反演(poj2888,poj2154)
2.偏序關系理論.
博奕論.
1.極大極小過程(poj3317,poj1085)
2.Nim問題.
七.計算幾何學.
半平面求交(poj3384,poj2540)
可視圖的建立(poj2966)
點集最小圓覆蓋.
對踵點(poj2079)
⑷ 對於年輕的程序員,知識的深度還是廣度哪個更重要
對年輕的程序員,知識的廣度必須要具備,見多識廣,職責分明,但是在處理和識別事物上就必須要有深度的內涵去處理事情。
⑸ 程序員的職業發展路線應該是由廣度到深度還是由深度到廣度
五部曲:
1. 打基礎
2. 廣泛涉獵
3. 深入某領域
4. 研究哲學與藝術
5. 研究頸椎病的治療方法
⑹ 程序員的十種級別
第一級:神人,天資過人而又是技術狂熱者同時還擁有過人的商業頭腦,高瞻遠矚,技術過人,大器也。如丁磊,
求伯君。
第二級:高人,有天賦,技術過人但沒有過人的商業頭腦,通常此類人不是頂尖黑客就是技術總監之流。
第三級:牛人,技術精湛,熟悉行業知識,敢於創新,有自己的公司和軟體產品。
第四級:工頭,技術精湛,有領導團隊的能力,此類人大公司項目經理居多。
第五級:技術工人,技術精湛,熟悉行業知識但領導能力欠加,此類人大多為系分人員或資深程序員,基本
上桀驁不遜,自視清高,不願於一般技術人員為伍,在論壇上基本以高手面目出現。
第六級:熟練工人,技術有廣度無深度,喜歡鑽研但淺嘗輒止。此類人大多為老程序員,其中一部分喜歡利用工
具去查找網上有漏洞的伺服器,干點壞事以獲取成績感。如果心情好,在論壇上他們會回答菜鳥的大部
分問題。此級別為軟體業苦力的重要組成部分。
第七級:工人,某些技術較熟練但缺乏深度和廣度,此類人大多為程序員級別,經常在論壇上提問偶爾也回答菜
鳥的問題。為軟體產業苦力的主要組成部分。
第八級:菜鳥,入門時間不長,在論壇上會反復提問很初級的問題,有一種唐僧的精神。雖然招人煩但基本很可
愛。只要認真鑽研,一兩年後就能升級到上一層。
第九級:大忽悠,利用中國教育的弊病,頂著一頂高學歷的帽子,在小公司里混個軟體部經理,設計不行,代碼
不行,只會胡亂支配下屬,拍領導馬屁,在領導面前胡吹海侃,把自己打扮成技術高手的模樣。把勾心
斗角的辦公室文化引入技術部門,實在齷齪!
第十級:驢或傻X,會寫SELECT語句就說自己精通ORALCE,連寄存器有幾種都不知道就說自己懂匯編,建議全部
送到日本當IT產業工人,掙了日本人的錢還嚴重打擊日本的軟體業!
⑺ 從深度和廣度上開源是什麼意思
開源(open source)這個術語是指人們可以修改和共享的東西,因為它的設計是可以公開訪問的。
該術語起源於軟體開發的上下文,用於指定創建計算機程序的特定方法。但是,今天,「開源」指的是更廣泛的價值集,我們稱之為「開源方式」。開源項目,產品或計劃包含並贊揚開放交流,協作參與,快速原型製作,透明度,精英管理和面向社區的發展的原則。
什麼是開源軟體?
開放源碼軟體是帶有源代碼的軟體,任何人都可以對其進行檢查、修改和增強。
「源代碼」是大多數計算機用戶從未見過的軟體的一部分;這是計算機程序員可以用來更改軟體(即「程序」或「應用程序」)工作方式的代碼。有權訪問計算機程序源代碼的程序員可以通過向計算機程序添加功能或修復無法始終正常運行的部件來改進該程序。
開源軟體和其他類型的軟體有什麼區別?
有些軟體的源代碼只有創建它的個人、團隊或組織才能修改,並且保持對它的獨占控制。人們稱這種軟體為「專有的」或「閉源的」軟體。
只有專有軟體的原始作者才能合法地復制,檢查和更改該軟體。並且,為了使用專有軟體,計算機用戶必須同意(通常通過簽署他們首次運行此軟體時顯示的許可),他們不會對軟體作者未明確允許的軟體做任何事情。Microsoft Office和Adobe Photoshop是專有軟體的示例。
開源軟體則不同。它的作者將它的源代碼提供給其他想要查看、復制、學習、修改或共享代碼的人。LibreOffice和GNU圖像處理程序就是開源軟體的例子。
就像使用專有軟體一樣,用戶在使用開放源代碼軟體時必須接受許可條款,但是開放源代碼許可的法律條款與專有許可的法律條款有很大不同。
開源許可證影響人們使用、研究、修改和分發軟體的方式。一般來說,開放源碼許可證允許計算機用戶將開放源碼軟體用於他們希望的任何目的。一些開源許可,有些人稱之為「left」許可,規定任何發布修改過的開源程序的人必須同時發布該程序的源代碼。此外,一些開放源碼許可證規定,任何修改和與他人共享程序的人也必須共享該程序的源代碼,而不收取任何許可證費用。
通過設計,開源軟體許可證促進了協作和共享,因為它們允許其他人對源代碼進行修改,並將這些修改合並到他們自己的項目中。他們鼓勵計算機程序員隨時訪問、查看和修改開放源碼軟體,只要他們在共享工作時允許其他人也這樣做。
開源軟體僅對計算機程序員重要嗎?
開源技術和開源思想對程序員和非程序員都有好處。
因為早期的發明者將互聯網本身建立在開源技術之上,比如Linux操作系統和Apache Web伺服器應用程序,今天任何使用互聯網的人都能從開源軟體中受益。
每當計算機用戶瀏覽網頁、查看電子郵件、與朋友聊天、在線播放音樂或玩多人視頻游戲時,他們的計算機、行動電話或游戲機都會連接到計算機的全球網路,使用開源軟體將數據路由並傳輸到他們面前的「本地」設備。完成所有這些重要工作的計算機通常位於用戶看不到或無法實際訪問的遙遠地方,這就是為什麼有些人稱這些計算機為「遠程計算機」 。
越來越多的人依賴遠程計算機來執行他們本可以在本地設備上執行的任務。例如,他們可能使用在線文字處理、電子郵件管理和圖像編輯軟體,而這些軟體並不是安裝在他們的個人電腦上運行的。相反,他們只是通過Web瀏覽器或行動電話應用程序訪問遠程計算機上的這些程序。當他們這樣做時,他們從事的是「遠程計算」。
有些人把遠程計算稱為「雲計算」,因為它涉及的活動(如存儲文件、共享照片或觀看視頻)不僅包括本地設備,還包括形成周圍「氛圍」的遠程計算機全球網路。
雲計算是日常生活中越來越重要的一個方面,有了互聯網連接的設備。一些雲計算應用,比如谷歌應用,是專有的。其他的,比如ownCloud和Nextcloud,都是開源的。
雲計算應用程序運行在幫助它們平穩高效運行的附加軟體之上,因此人們經常會說運行在雲計算應用程序之下的軟體充當了這些應用程序的「平台」。雲計算平台可以是開源的,也可以是封閉的。OpenStack是開源雲計算平台的一個例子。
人們為什麼喜歡使用開源軟體?
人們出於多種原因,更喜歡開源軟體而不是專有軟體,其中包括:
控制。許多人喜歡開源軟體,因為他們對這種軟體有更多的控制權。他們可以檢查代碼以確保它沒有做任何他們不希望做的事,並且可以更改不喜歡的部分。非程序員的用戶也將從開源軟體中受益,因為他們可以將其用於任何期望的目的,而不僅僅是他人認為的方式。
訓練。有些人喜歡開源軟體,因為它可以幫助他們成為更好的程序員。由於開放源代碼是可公開訪問的,因此學生在學習製作更好的軟體時可以輕松地學習它。 學生還可以在發展技能時與他人分享他們的作品,邀請他們發表評論和批評。當人們發現程序源代碼中的錯誤時,他們可以與他人共享這些錯誤,以幫助他們避免自己犯同樣的錯誤。
安全。有些人喜歡開源軟體,因為他們認為它比專有軟體更安全和穩定。因為任何人都可以查看和修改開源軟體,所以有人可能會發現並糾正程序原始作者可能錯過的錯誤或遺漏。而且由於有如此多的程序員可以在不要求原始作者許可的情況下開發一款開源軟體,因此與專有軟體相比,他們可以更快地修復,更新和升級開源軟體。
穩定性。對於重要的長期項目,許多用戶更喜歡開源軟體而不是專有軟體。由於程序員公開分發開源軟體的源代碼,因此依靠該軟體執行關鍵任務的用戶可以確保,如果他們的原始創建者停止開發它們的工具,他們的工具也不會消失或停用。 另外,開源軟體傾向於結合並根據開放標准進行操作。
社區。開源軟體常常會激發用戶和開發人員圍繞它形成一個社區。這並不是開源所獨有的;許多流行的應用程序都是聚會和用戶組的主題。但是在開源的情況下,社區不僅僅是一個購買(情感上或經濟上)精英用戶群的粉絲基礎;是那些開發、測試、使用、推廣並最終影響他們所喜愛的軟體的人。
「開源」不就是免費的嗎?
這是對「開源」含義的普遍誤解,這個概念的含義不僅是經濟上的。
開源軟體程序員可以為他們創建的或貢獻的開源軟體收費。但是在某些情況下,因為開放源碼許可可能要求他們在向其他人出售軟體時發布源代碼,所以一些程序員發現向用戶收取軟體服務和支持費用(而不是軟體本身)更有利可圖。通過這種方式,他們的軟體仍然是免費的,他們通過幫助他人安裝、使用和故障排除來賺錢。
雖然有些開源軟體可能是免費的,但是掌握編程和排除開源軟體故障的技能是很有價值的。許多僱主特別希望僱傭有開發開源軟體經驗的程序員。
什麼是「軟體之外」的開源?
開源不僅是開發和許可計算機軟體的一種方式,也是一種態度。接觸生活的方方面面「開源方式」意味著表達一種分享的意願,以一種透明的方式與他人合作(這樣其他人也能看到並加入),接受失敗作為一種改進的方式,並期待,甚至鼓勵其他人也這樣做。
這也意味著致力於在改善世界中發揮積極作用,只有當每個人都可以使用設計世界的方式時,這才有可能實現。
這個世界充滿了「源代碼」,包括藍圖,食譜,規則,它們指導並塑造了我們在其中思考和採取行動的方式。我們認為此基礎代碼(無論其形式如何)都應該是開放的,可訪問的和共享的,因此許多人可以將其改進。
⑻ 程序員學習技術是深度優先還是廣度優先
個人建議廣度優先。 因為你必須知道適合什麼, 才能夠確定自己想要深入的。公司有個孩子做了四年流媒體,發現根本不是自己喜歡的行業, 然後轉行ios, 又開始從最底層做起。 轉型有痛點, 如果不能博覽整個行業, 沒有一個整體的知識體系, 很容易淪為重復勞動的碼農。
⑼ 做程序員需要靠關系嗎
程序員固然要靠實力取勝,但是吃青春飯的,中年以後晉升管理層就需要人脈了。其實,不管做什麼行業,人脈都很重要,人脈意味著能優先接觸更多機會。加油!
⑽ 由程序員到架構師,應該是先注重技術的廣度還是深度
架構師要對框架的原理理解透徹,對設計模式深入理解。
而程序員更多的是熟練掌握一門語言,在需求設計明確之後予以實現(此時框架都已經確定好了)。
二者所需的領域知識是不同的,不是技術的廣度和深度問題。