對IT技術的初學者來說,除了編程之外,還應該掌握哪些技能,才能找到並勝任工作?

很多人都在說自己學Java,學CSS,學JS,學了半天發現自己其實還是沒辦法達到一個公司的要求。那麼公司期望一個人應該具備什麼樣的技能呢?有沒有一些隱含的技能,並沒有寫在JD之上,但是又對於初學者來說,非常重要的?


做過4年項目經理,招過不少開發人員(主要是JAVA WEB方向),既然題主問的是初學者,那麼就聊聊站在項目經理的角度招初級開發人員的體會,希望能給你有所啟發。

招人有個背景,不同的項目,系統,對開發人員的要求是不一樣的。 我帶的團隊當時做的是上海大眾商品車運輸管理系統(TMS)和倉儲管理系統(WMS)。 這是一個業務系統,所以對於初級程序員的要求沒那麼複雜,就是來了之後,可以較短的時間內上手,幹活。 業務系統嘛,主要還是圍繞CRUD進行。

建立在這樣的技能需求的基礎之上,我進行面試的時候,就分幾個層次進行了

1. 根據求職者簡歷上的項目描述,我會選一個典型功能讓他說是怎麼做的,比如登陸/註冊/購買/分頁

從求職者的表達里,我會觀察他是否把基本的業務邏輯搞明白,技術調用思路理清楚沒有,當然還有表達是否通順。 這個功能說不清楚,我會再換個功能讓他說。 既然是寫在他簡歷上的,自然默認這些都是他做的,如果連自己做的都說不清楚,會懷疑其真實性,就Pass了。只要是自己做的,那麼就像講述自己的故事一般自然而然就可以這部分內容闡述出來了。

2. 然後是理解程度的問題

還是以一個簡單的登陸為例子,如果把流程都說明白了,我就會問關於http協議的理解,不同提交方式的區別,中文的處理,SQL注入,頁面跳轉背後的區別等等,也就是按照調用過程裡面涉及的到的各種技術,深淺不一地挖掘一下他都掌握到什麼程度。 這樣我問起來也輕鬆,按照思路走就是了,反正一路上都是各種技術,都會有各種坑,看看他碰到過些什麼,自己都是這麼解決的。 在這個過程中,我就會觀察到他對技術的理解程度,也能反映第一個問題是背書答出來的,還是確實是自己做的。 業務系統嘛,對初級程序員要求真不高,只要走過一遍了,其他的相仿功能都能觸類旁通。當然,前提是,你得把走過的這一遍里的坑,七七八八都踩過,並且自己解決過,光是抄別人的項目,在這裡是很容易露餡的。

3. 第二步答上了,那麼七七八八差不多就是候選人了,和其他幾個候選人比較一下是否有親切感,薪資要求的差別,感覺會不會好相處什麼的就定了。 如果第二步答得比較理想,我還會問一些對初級程序員來說比較難的問題,實際工作也不怎麼用的,比如反射,JVM是如何進行synchronized處理的,ClassLoader,垃圾回收的幾種演算法以及優缺點等等。 看看求職者的技術積累如何,學習意願如何什麼的。 這裡也有一個心理,如果你問的求職者都答上了,他來了,會不太好管,他會覺得什麼鳥公司,要求這麼低,老子全都會。 如果你有幾個問題難住他,都是搞技術的,你在他心中地位會不太一樣,帶起來也聽話一點。 當然了,這些問題,我也不期待他全部都答上,都答上,你就奔中高級開發人員去了,初級程序員這點錢,你也呆不久。 換句話說,去求職初級崗位的同學們,就算碰上特別難的面試,也不用太慌張,初級崗位嘛,又給不了多少錢的,哪能什麼都要會,心放寬一點,哈哈

總體來說:

我希望你給我的簡歷是真實的,假的很容易被識破,直接就pass了。

我希望你做過的一些典型的應用場景,來了能夠舉一反三很短的時間就上手幹活。

我希望你比較好相處,大家可以比較愉快地共事。


至於說編程之外其他的,說實在的,我並沒有經歷過任何一家公司真正在乎一個初級程序員的職業發展。 所以心態放好,拿錢幹活,工作任務完成之餘,再根據自己對業務的體會,對技術的感知,對未來的規劃,對自己性格的了解,該學什麼就學什麼吧,所有的積累,在最後都會以某種形式回報給你。


我來答個.net的吧。
我去年2月份開始學的.net,因為原公司需求.net,所以我轉崗去的.net。對於.net來說,最基礎的就是需要你幹活的能力。我是做B/S方向,那麼http://ASP.NET MVC框架要學會,然後webapi,wcf,這些都是用的非常廣泛的框架也都要學會,其實有這幾個就已經能夠幹活了,BUT!不能就這樣止步於業務邏輯代碼之前啊。
你還要考慮用什麼架構合適,構造一個合適的AOP來方便自己調試啊,還有構造緩存模塊提升系統效率啊,再來個多線程讓系統跑的飛起啊。這些都是進階要求。
然後還有一點,是JD里體現不出來的。團隊合作能力。
這一點要好好說,在進入公司之後,你不再是一個人孤軍奮鬥,各個系統相互協作,各個工種各司其職,一個人的溝通能力就在這裡體現出來了,這個溝通能力到底有多重要呢?
我也說不出來,反正最直接的表現就是,一個項目的開發周期,還有項目的易用性都是和項目組裡各個成員的溝通能力掛鉤的。
還有DEBUG能力,這個也是JD里體現不出來的。
我見過很多「copy忍者」,寫代碼就是複製粘貼,認為某某系統這麼用,複製粘貼過來應該可以用,然後就出bug了,而且由於代碼自己不熟悉,根本沒辦法進行debug,最後拖到背鍋走人。
除了上述,還有畫圖能力、寫文檔的能力這都是能大大提升工作效率的。


前言

IT修真院自問自答系列第十八篇,同樣是乾貨和硬廣混雜。

回答之前,先明確說出來。這些東西全憑記憶,我不查證 ,不考證,不客觀,純粹是個人的偏見,也不會對任何一個有錯誤的地方負責。

正文

一個工程師的核心技能樹應該是這樣的。

基礎

1。基礎理論體系
2。基本語法知識
3。使用基礎框架

需求

4。項目開發流程

5。業務需求理解能力

6。業務知識體系

功能

7。第三方服務體系

8。介面調試能力

9。單元測試能力


質量

10。性能優化能力

11。代碼重構能力
12。Bug修複流程
13。在線調試能力
14。項目風險評估能力

15。團隊協作能力


這些東西就是我一直說的,初級工程師的必備技能。

為什麼是初級工程師,請自行翻閱IT修真院里的關於工程師的分級標準。


所以我常說,語法不是最重要的,學Java的花那麼點時間研究Think in java.真心不是初入門的時候最應該關心的。


有了這個知識體系,至少你在決定自己要不要學Java的時候,就明白自己該怎麼走了。


所有的這些技能點,應該也必須有一個技術學習路線。

第一章 基礎理論體系

這部分是科班生和非班生最大的差別。

通常而言,包括計算機組成原理,操作系統,計算機網路,數據結構,演算法,資料庫這六大基礎理論。


其他的可以忽略不計,這六門課是一個科班生對於非科班生來講的先發優勢。

所以你也應該能看到,為什麼很多非科班的人表現的可能會比科班出身的人更好一些?


很多數是因為在基礎知識上他比較薄弱,可是在其他的方面上更勝一籌,而後又會在漫長的學習過程中,把基礎知識補了上來。


先介紹一下這幾門基礎理論課。

1。計算機組成原理

計算機是怎麼構成的,CPU,硬碟,內存,主板,顯卡這些基本上的概念,拆開機箱之後看到的東西是什麼,這個是一個消除對計算機的神秘感最有效的課程。

指令,地址,磁碟讀寫這些都是一個從硬體到軟體的飛升。往深了講,計算機組成原因對於後端程序員和運維工程師來講格式重要。很多時候你就是要了解特別多的底層的知識 點,才有可能對項目做出一些優化。而當我們談到性能優化的時候,往往並不是說你是在演算法層面上做了最大的改進,你能換成SSD硬碟就解決問題的話,根本就沒會考慮寫3天的代碼。


這是這門課里很多有意思的地方,也是後端工程師升往中級工程師幾乎必須要懂的課。

難度我忘記了,要了解到什麼程度,我現在也說不好。其實在某種程度上應該是這樣的,初學者只需要了解基本概念,做好知識儲備,等以後用到的那一天。已經工作了3~5年的工程師,應該仔細了解深度,並且驗證和優化。


坦白的說,我現在在這方面很弱,也是我經常佩服身邊那些大牛們的原因。畢竟我也不是科班出身,最近幾年也是興趣廣泛,橫向發展遠遠超出去縱向發展。

說不上來對我自己是好是壞,畢竟我的興趣並不僅僅是止步於技術,但是對於在能力上或者是興趣上都更喜歡工程師的人來講,這確實是應該仔細閱讀的基礎課程。


必讀指數:

Java/OP 5星

Android/IOS 3星

WEB 1星

QA/PM/UI 0星


2。操作系統

操作系統和計算機組成原理比較接近,確切的說,「操作系統+計算機組成原理」構成了程序運行的基礎。操作系統里比較核心的概念就是進程,線程,切換,信號量等等。這對於多線程來講是比較重要的概念。Java里在高並發的時候是必懂,Android和IOS主要是主線程和子線程,以及斷占續傳等有可能會產生並發讀寫問題的基礎課程。OP也不用想,如果想要做的比較深入,同樣需要對這些概念了解的比較清楚。惟一比較清閑的就是WEB,WEB可以幾乎完全忽視操作系統,因為WEB是運行在瀏覽器內核之上的,也很少會有並發的現象產生。

另一個重點就是存儲管理,分頁和分段。這對於做搜索底層代碼的人來說,是比較重要的。搜索本身就是讀取文件和節省內存,所以對這些知識點要求的比較高。而有興趣做大數據,分散式文件相關的人,也是需要了解這些內容的。

不過相對而言,大部分的Java工程師,IOS工程師和Android工程師是不需要知道太多存儲相關的知識的。


必讀指數:

Java/OP 5星

Android/IOS 3星

WEB 1星

QA/PM/UI 0星


3。計算機網路

計算機組成原理講的是硬體怎麼執行來自軟體的指令,操作系統講的是Windows,Linux怎麼管理軟體的執行,那麼計算機網路講的就是兩台主機之間的通信。

所以這裡必須要會的概念就是兩個。一個是TCP的四層協議,一個是OSI的七層協議。很多做的偏硬體的,大型路由和交換機的,是必須要懂的,不過現在這個工種應該不多了。運維也是必備的技能。

其他的就是要了解DNS,IP地址,UDP,TCP和IP的原理,如果有講到Http的話,必懂的,如果有Socket,也是Java工程師提升技能必用的。在此之上的WEBSocket,是現在做即時通信的很好的選擇。

OP還需要對區域網,廣域網的概念了解一遍,可能會有域的概念,記不清楚了。

Android,IOS和WEB都是要必讀Http協議的,不過似乎Http協議里的東西好像是教材里沒有講到的,特別是Content-type這種必會的。

如果你想要了解的更深入一些,那就是要深入了解TCP協議的細節了。想清楚為什麼要這麼設計,這裡面有非常多的細節,如果是Java工程師,做的東西偏底層,也是必看。但是一般而言,3年以內的Java工程師不用懂。但是架構師幾乎是要必懂的,至少在需要你懂的時候,你就必須懂,像我一樣。


必讀指數:

Java/OP 5星

Android/IOS 5星

WEB 5星

QA/PM/UI 0星

4。數據結構

數據結構是一個所有的程序員都必須要懂的基礎課。這是最基礎最基礎的東西,跟語言無關。計算機組成原理和操作系統和計算機網路都是讓你了解計算機的內部的構造和通信的協議,數據結構是真正意義上跟計算機相關的科班課程。

為什麼這麼說?

數據結構就相當於是你在IT神界里的基本單元。數組,堆,棧可能就是金木水火土這些基本元素。你要寫代碼就是相當於用咒語把這些元素都調用和組合起來。不同的元素可以存儲不同的元力。大概這個意思,聽不懂沒關係,因為我是瞎扯的。


線性表,鏈表,隊列這些東西都是在編程中比較常用的。其實最常用就是Map和List還有Set。語言的不同略有差異,但是少不了就是循環遍歷以及按Index取還有判重這些基本的操作。

對於數據結構的學習,第一個重點就是在於了解不同的數據結構能幹嘛。比如說隊列能幹嘛?數組能幹嘛?這個是結合實際中最重要的東西。第二個重點就是這些數據結構能有哪些操作。查詢,刪除,首,尾等。

樹和圖也要了解一下,特別是樹和圖的遍歷。

二叉樹還是索引里的關鍵概念,如果對於Mysql或者是搜索感興趣,是必須要學的。索引本身就是一種非常有意思的想法。


很多時候你要想辦法去理解所謂的空間換時間,時間換空間這些概念。另外要注意一下數據結構中佔用的位元組大小,這對於估算佔用內存有幫助。


數據結構是你認識IT神界的基礎,不過課本上比較麻煩的就是講的特別細。真正在項目中使用的不需要那麼多。

所以基礎的是必須要會的,其他深入的是你在需要的時候能夠看的太深的。比如說TrieTree,在沒有真實場景的時候,你是想不到用這種數據結構去做什麼事情的。可是當你要按字典序查詢的時候,你會發現這就是一個最好用的結構,沒有之一。

然而 你不太可能 一開始就知道這個,只 能是去百度搜索 的時候了解到他,然後再看看什麼原理,如果沒有Tree的知識,想直接理解TrieTree還是有點難的。


必讀指數:

Java/OP 5星

Android/IOS 5星

WEB 5星

QA/PM/UI 0星


5.演算法


這裡就是經常被嘲笑搬磚碼農,嘲笑轉行而來的初學者最狠的地方,也是最讓我看不慣的這群人最喜歡拿來顯擺的,真心想不明白會把一個演算法實現,壓根就沒做過優化,又不是你自己想出來的演算法也能拿出來得瑟么?


50步笑100步而已,但是在某種程度上也確實證明了會一點演算法多少有一種成就感。可是,如果你聽從了我的建議,學了一點演算法,那麼我希望你能明白,永遠不要嘲笑那些不懂演算法的人,不要做那個踏上公交車的腳踏板就再也不希望後面的人擠上來的一個。


如果你是這種人,我會罵你到天涯海角。


言歸正傳,演算法其實不算特別重要,相對而言,時間複雜度和空間複雜度是所有演算法誕生的根本。

要麼是為了節省時間,要麼是為了節省空間。這才是演算法在某種程度上的本質。不同的人有不同的方法來解決這些問題。靠,其實我應該先說數據結構,再談演算法。所謂的演算法,就是在某種數據結構基礎上解決問題的思路,他是和任何的編程語言都沒有關係的。數據結構就是約束你的條件,本質上來說,人人都可以成為一個演算法設計師,只是對於遊戲規則和經典案例的熟悉程度而已。

這跟你玩遊戲,找零錢,帶著一堆小動物過河沒有任何區別。很多國外公司比較看重這個,他們認為這樣才是程序員,才足夠聰明,某種意義上他們說的不錯。這種程序員確實會思維敏捷,想的比較精細,但是,要注意兩點。

第一,大部分的工作都不需要演算法的。

第二,大部分的演算法都是普通人都可以理解和學會的。

第三,大部分的時間,演算法只是你個人能力中的一小部分,也就是我在文中開頭列出來的。

第四,演算法不好,並不代表著你做其他的事情做不好。

所以,很多人說我要去做這個演算法練習題,做那個演算法練習題,我是百分百的嘲笑的。還有之前以刷演算法面試題起家想進BAT這些公司的某某機構,我一直都覺得這才是真正的誤人子弟,所以很反感刷面試題這種概念。


說到演算法,最經典的也就是排序。然而我覺得也是因為大部分對演算法的了解就是到了排序而已。遞歸是排序更重要的概念。我在項目中從沒直接寫過排序演算法,但是遞歸用的很多很多,而且如果對於操作系統中的切換理解的比較好的話,理解遞歸不能,記著遞歸最重要的就是要考慮什麼時候退出遞歸。

然後散列也是一個比較重要的概念,畢竟HashMap這種東西是跟項目很相關的。樹對於索引來講很重要,這也是做搜索和做DBA必會的。圖是很少用到的,了解一點點有向和無向這種概念就好了。


字元串匹配是比較重要的,Replace這種東西還是很常用的東西。

其他的動態規劃什麼的,一般而言用的比較少。簡單來說,演算法是一個衡量你的智商的題目,這是真的。有很多人嘲笑你不懂,智商是不是真的比你高我不知道,但是情商一定是比你低的。


其實演算法的概念比這個概念要大的多。如果是說到了中級工程師,講到了分類聚類模式識別,你才會明白,我靠,原來這才是演算法啊。

這其實是一個計算機里很好玩的事情, 一種問題多個解決方案,跟解數學題差不多的同樣的玩具。所以看你自己是否喜歡,如果你是數學系出身,轉計算機沒問題的。


總結一下。演算法這種東西,基本的演算法是Android,IOS,Java,WEB,OP都需要了解一下的。

了解的越深,就證明你越聰明,也證明你有做的越好的潛力。相比於其他幾門基礎課程來說,這個確實是能區分智商的。但是,你必須得知道,智商往往並不是決定你是否成為工程師的最關鍵的點。這也是我很反感各種面試的時候拿面試題來面試人的原因之一,如果有人拿面試題給你做,調頭就走,不要猶豫。

必讀指數:

Java/OP 5星

Android/IOS 5星

WEB 5星

QA/PM/UI 0星


6。資料庫

資料庫是Java,OP。其中Java和Op不相上下,都是毫無疑問的東西。Android和IOS要求不高,一般而言,也比較少用SqlLite來去做東西。WEB也是一樣。所以對於前端來說,完全可以暫時不考慮Sql。不影響,真的。

單純從DB而言,很重要的就是要理解,現在常用的叫做關係資料庫,還有一種叫做對象資料庫,以及空間資料庫。這三個庫理解下,有一個大的概念。另外就是關係資料庫里最覺見的一對多,一對多,多對多。分清什麼是關係。

一般而言,我會強制性要求資料庫中實體表和關係表的命名規範。而大部分的DB設計,都是第一要區分什麼是實體表,什麼是關係表。以及實體和實體之間的關係是什麼樣的。

跟著就是去了解所謂的範式。第一第二第三,實際使用中,這幾個範式全部是用來違反的。還有。忘記外鍵的概念,外鍵在互聯網項目壓根就無法正常使用。


但是索引很關鍵,這個是我說了無數次的東西。一定要弄明白幾種索引的區別,PS,要學就學Mysql。

跟著就是Sql語句。SQL語句其實很簡單,查詢,條件,排序。其他的都不用管,什麼函數,用到的時候就查。

視圖和存儲過程不要花時間去看。了解一下概念就好了。視圖,外鍵,存儲過程都是DB里中看不中用的功能。

其他的不用關注了。資料庫對於3年以前的工程師而言,了解到這個程度的基礎知識就多了。但是,對於項目而言,對DB的了解和對Mysql的了解要多很多。特別是許可權,導入,導出等。


這不是在基礎理論體系的範圍之內。

必讀指數:

Java/OP 5星

Android/IOS 1星

WEB 1星

QA/PM/UI 0星

綜上所述:

計算機組成原理是講計算機的硬體體系怎麼在接受到軟體指令後運轉的,操作系統是講怎麼控制硬體和軟體的,計算機網路是講怎麼通信的,數據結構是描述程序世界的基本結構的,演算法是控制數據的操作來解決特定的問題的,資料庫是用來持久化數據,以保存和提供查詢的。


這些基本理論體系,Java是必須要全部都懂的,Android,IOS和WEB是只需要懂其中一部分的。OP幾乎是需要都懂的。但是相對而言,WEB是需要了解的最少的,僅僅是懂一點點數據結構和演算法而已。

這也是為什麼WEB這麼簡單容易入門的原因之一,也正是這個原因,導致WEB在後續的發展會有一些瓶頸,而想突破這些瓶頸,這些基礎課程是必不可少。

Java呢,在你經驗比較少的時候,這些知識點對你的影響不大。但是當你需要認真的優化一些東西,或者是看一些偏底層的內容的時候,這些知識點就決定了你能達到的高度。

這就是為什麼Java入門比較難的原因之一,也是Java之所以能夠成為大後期的原因之一。

而OP呢,簡單的OP這些東西都可以了解的很淺,深入的OP了解的越多,越專業。


而再看看PM,UI和QA,這些知識幾乎都是完全不用了解的,我會針對這幾個職業再簡單的說一下需要了解什麼概念。

同樣的,我並不建議在入門的時候就學會這些。太慢。java是有一些東西要學的。但是整體上學習這些內容,不要超過2周。剩下的要花兩年左右的時間去認真的消化,閱讀。

所以,什麼時間適合學這些內容?你學會了其他幾點,找到了一份工作,混到了這個行業裡面,你需要提升自己的薪水的時候,你來認真的學習。


總之,如果你花了時間在這幾門基礎課程上,很划算。就看你給自己留下的時間有多少,這些都是對你前期幫助不是特別大,中期發展很關鍵的知識點。如果你沒有太多時間,只能把他們跳過去,別管3721,先混到一份工作再說,然後你看你自己倒底是否需要提升,我相信所有的人都需要提升的。

這個學習順序可能不會受人喜歡,特別 是那些站著說話不腰疼的人。但是一定是最實用的。對於零基礎轉行而來的人說,在3個月到6個月要跟這些在學校里學了4年的人相比,也只能採用這種方式了,不然還能跟他們一樣比校招成績?


再講一下。WEB好入門,但是入了門之後,如果你沒有花時間在這些基礎課程上,想要轉Java,很難。而且,你學的這些基礎課程,跟你的WEB並沒有太大關係。所以,大部分人做了WEB之後,能轉到後端的人,少之又少。


而Java的呢。本身底子在學了這些基礎知識以後,就會好很多,所以Java轉WEB問題不大。


我講清楚了嗎?

第二篇 基本語法知識

基本的語法知識通常包括兩部分,基礎語法和自帶工具類。所有語言的基本語法都大同小異,除了神經病一樣的Erlang,和Scala。很多語言的差別不大,簡單說就是:


1.數據類型

2.賦值語句

3.定義函數

4.循環/判斷

應該就夠了吧?

數據類型就是整形,長整型,浮點,字元串,字元,以及數組,List,Map等這些數據結構。賦值語句就是各種的給變數,給數據結構體賦值。函數是所有的編程語言中都會用的吧?通常就是許可權,返回值,方法名,參數,以及如何返回等。循環,判斷,是簡單的控制,包括跳出和返回。

大部分的語法都不用學,第一次的時候看到這些就夠了。不同的去百度,不同的語言有自己不同的語法規則,所謂的語言靈活與否,接觸的時間長了就有了感覺。


而自帶的工具類呢,多半都包括:字元串,數組,排序,文件,流,網路,圖片,視頻等一些封裝好的操作。Android和IOS還有很多自己的控制項和事件處理,JS有很多自己的事件和Dom操作。對了還有多線程,DB等這些Util,這些東西,也並不是當前就必須現在馬上就全部要學會的,學了你不用也記不住 ,所以,通常我也推薦就是學什麼用什麼,先快速瀏覽一遍目錄,半個小時,知道有哪些東西,然後在項目中遇到了,再詳細的去查找。


所以抱著頭想了想,好像並沒有太多關於基礎語法的內容要說的。你們如果有什麼想知道的,在貼子里留言。


基礎語法在某種程度上,並不是計算機科班的優勢,但是大部分人還是學過C或者是Java的。只是學的好壞而已,這點的先發優勢不是特別明顯,所以你也不必太著急,也就是兩周左右的差距而已。同樣的,如果你對一個語言了解的很深,那就不是兩周,甚至兩年能搞的定的了。

像Think in java,真心很贊,可是我一直沒有讀完過。

結論就是,對於一般的工程應用來說,普通的語法知識就可以了。IDE能幫你檢查很多錯誤,我倒現在還分不清JQuery和原生JS寫For循環的差別,每次用的時候都是百度去找。Java的For循環好幾種寫法,我也是只喜歡用最簡單的。能用IDE自動生成就自動來。IOS到現在我還不會,去年寫斷點上傳的時候,都是一邊寫一邊問,陽陽,怎麼給這個String賦值來著?怎麼把取這個Object的屬性值?

不過Android是有點特殊的,畢竟四大組件某種意義上就是一種框架了。

第三篇 使用基礎框架

和C不同,現在的語言體系早就被各種輪子填滿了。大學裡教的多數是前兩部分內容,而項目里用的,往往是學校里的老師都不熟悉的新的框架體系。

這也是導致現在就業和就職脫節的很大一部分原因,如果你是一個科班出身,有幸在學校就做了幾個項目,別激動,很可能你已經走歪掉了。實驗室,外包項目和真正線上運營在跑的項目,是截然不同的,這體現在很多細節上。大部分初學者都認為我把功能做出來了,他可以用了,很自己運營的項目,很多時候談的是好不好用,而且一定是在一個有效的時間內完成的一個項目,還要考慮到代碼的交接,下一個版本的維護。

也就是說,你花了幾個月的時間隨便折騰一堆代碼,把現有的功能實現了沒問題。可是如果要增加新的功能,或者是對原有的功能做優化,你的代碼結構還有多大調整?

先繞回基礎框架上,什麼叫做基礎框架呢?最簡單的就是復用。復用的意思就是將重複發生的代碼,一遍又一遍的在寫的東西,抽象出來,減少複製和粘貼。


這個是寫代碼最核心的理念,一般而言,復用分成兩個層次。一種是適合本項目適用的,一種是適合公司里所有項目適用的,一種是適合所有項目通用的。

大部分的開源框架,都是先在本項目中適用,然後在公司其他部門推廣,最後開放給所有的人免費使用,並且把源碼放開,可以依據自己的需要來擴展。

各種語言本身都已經提供了很多Util來使用了,上一篇剛剛講過,這幾乎是通用的,不分業務,不分行業,都能使用到的。每一個Util其實都是抽象設計的典範,而其他被抽象出來的公共框架更是深入學習的好資料,也正是因為這個原因,我不是推薦在前期就去讀源碼的。

從util出發,很多Util做的再重一點,就演變成框架了。而在語言領域中,框架最多的就是Java,幾乎所有的功能都有一套事實上的行業標準和其他幾套骨骼驚奇的備用方案。而WEB也絕對是眼花繚亂,百花齊放的大雜燴,框架更新速度之快,起起落落根本就來不及出書。


相對而言,還是Android和IOS更好一點,本身語言就做了很好的改進,對框架的要求也沒那麼高,這也導致Android和IOS的技術棧更新緩慢,大概也只能超過OP了,可是OP最近幾年的DevOPS也漸入佳境,現在Android和IOS的就業慘淡,別說漲薪,連保留現有的崗位都困難,新進的程序員發現自己完全是在跟已經從業三到五年的人競爭,而從業三到五年的人會發現自己做的事兒,似乎一個半年到一年經驗的人也可以磕磕碰碰的做出來,就算是有坑,老闆也看不出來啊。真到看出來的時候,可能 他已經跳槽走掉了。


所以一個職業里的薪資和發展前景,跟開源框架體系的多少總是有點兒關係的。拋開這些東西不談,一個正式的程序員,也是大多數公司比較看重的項目經驗,使用的技術棧,多數就在這裡。而有工作經驗的人, 相對於沒工作經驗的人,最大的優勢往往也在這裡。

其實從實際上來說,後面幾條同樣重要,我會慢慢的一點點的說到。

Android和IOS的框架體系,文件的讀寫,網路請求,下拉刷新,ListView,MVP的理念,多媒體播放器,支付,IM,第三方登錄,地圖,手勢密碼,通知,統計等等。我沒仔細的區分Util和框架,或者是概念性的東西,一鼓腦全列出來了。有些東西跟後面談到的第三方服務還有點重複,但是不重要,重要的是你需要明白就是這些別人寫好的東西,你要學會使用。比如說Gson,這種解析Json的神器,基本上都不太可能是在學校里可以學到的,除非是職業培訓,這也是職業培訓的價值之一,只是多數的職業培訓已經把名聲做臭了。


WEB的框架體系包括JQuery,AngularJS,Bootstrap,Less,Vue,React或者是ReactNative等,小的包括Bootbox,Echarts這種彈框,圖表插件。這裡沒怎麼提到ES6和NodeJS這套東西,整體來看,前端現在屬於多方混戰,先讓他們戰個痛快,你們做為初學者,不要一開始就扎入這些混戰的陣營,學好已經確定了有用的,其他的略為了解,公司讓用什麼你就用什麼,等有了結果再談。


Java的框架體系比較穩定,Spring,Mybatis,Hibernate,JDBC,Memcache,Redis,ElasticSearch等等偏後端,存儲,緩存的東西是已經分出來勝負的。但是Java也是框架體系最多的,甚至在某種程度上,框架就是架構師手裡的武器,當然要成為架構師,並不是只懂框架就可以。只是說,Java里學習的很大一部分,就是框架,特別是對初學者來說,百分之四十的學習都在框架之上。

OP的框架或者是工具目前來講也比較穩定。OpenStack,ansible,還包括一些工具,Git,Jenkins,Zabbix,和Linux常用的套件,AWK,SCP這些說了很多遍很多遍的東西。剩下的就是Python語言了。把Python當成一個框架或者是Util明顯不合適,但是從實際意義上來說,Python對於運維而言也就是Util。還有現在在倡導的離線運維,開發出無數的工具來在圖形 化的界面上做操作,範圍太小,大公司可以,小公司沒有推廣價值,至於運維去做開發,我覺得很扯淡。職責都不一樣,找一個2年的Java工程師做就可以了。運維就該做運維關注的安全,策略,備份,監控,許可權,流程。瞎折騰開發幹嘛,所以初學者還是要穩一點,多做點實際的工作。


我不知道是否把框架的意義講清楚了。本來是想詳細介紹每一個框架要學到什麼程度,但是對我而言準備的工作太多了,有些地方也超出了我的能力範圍之外。


重新總結 一下,從框架開始,科班生和非科班生的起點就開始拉平了。從第三篇起步,到最後一篇十幾個關鍵的技能點,都是無視科班生和非科班生的,這也是為什麼從培訓機構里出來的學員還是有能混的下去的原因之一。也是科班生嘲笑非科班生的理由之一,因為下面兩層是基礎,基礎不紮實,學的再高有什麼用呢?

支撐不起來。所以對於非科班生,轉行到計算機領域的人來說,要明白,第一,並不是說沒有基礎,你就一定爭不過科班生,畢竟你只要努力 認真學,你在學習其他十幾個技能點的時候不會輸給他們。第二,你的基礎越紮實,越能夠支持你走的更遠。你要做的,就是在沒辦法留出大段的時間補基礎的時候,先入行,再填基。


我想這樣就能說的很清楚了。對轉行而來的人說,學會一門語言,僅僅是起步而已。對於培訓機構來說,花了3~4個月的時間,也僅僅是能帶你入門而已。所以修真院一直在堅持,好的學習方式比填鴨式的塞概念更有用。

第四篇 項目開發流程

80%的公司都是沒有項目開發流程的,這表示著混亂和無序。

即便有公司會按流程開發,但是能理解敏捷開發,而且做的很好的,不多。


講流程之前,先問一下,流程是什麼,從哪裡來,為什麼要有流程,解決了什麼問題。

請在評論里回復~~明天心情好了,再更新一波。

===================未完待續==========================

技能樹.IT修真院 http://www.jnshu.com

「我們相信人人都可以成為一個工程師,現在開始,找個師兄,帶你入門,學習的路上不再迷茫。這裡是技能樹.IT修真院,初學者轉行到互聯網行業的聚集地。"


加QQ群:

1群 2000人 185***188(已滿)

2群 1000人 424***650 (已滿)

3群 500人 493***6441(已滿)

4群 500人 580***6624 (已滿)

5群 500人 604****59 (已滿)

6群 1000人 254078081(已滿)

7群 200人 562814359(招募中)


加群請第一時間查看入群須知,修改群名片。另外,不要調戲老大,老大脾氣很暴,會罵人。


微信公眾號:葡萄藤IT技能樹

IT修真院系列 :IT修真院 - 收藏夾 - 知乎 - 收藏夾 純乾貨+硬廣

專欄:IT修真院 知乎專欄 - 知乎專欄 各種IT行業的真實小故事


帶過很多程序員,

我從管理者的角度來說說,什麼樣的技能才是管理者希望看到的程序員技能。

1.理解能力。這個要排第一。遇到一個你說話他聽不懂或者不懂裝懂的簡直是災難。理解能力高低由幾個因素決定:天賦高低,專業知識是否紮實,心理素質

2.溝通能力。理解能力不夠溝通能力來湊。聽不懂就問雖然很煩,但這種人完成任務一般不會出大毛病

3.解決問題能力。這個涵蓋範圍就廣了。解決問題方法不一而足,有些人是天生聰明,有些人是見多識廣,有些人是善於求助,不一而足。但是能解決問題就行。

迄今為止,所有回答都是用手機發的。實在沒法長篇大論,有什麼問題歡迎到評論區提問,我會盡量回復


我不建議你一開始全面開花,拚命學習各類技術,特別是沒有相互強關聯的技術。到最後,很可能是什麼都會,什麼都不精。走技術路線的話一般有兩條路

  • 把某一些技術學到極致,成為大牛

這個很好理解,比如你學PHP,你就把PHP吃透,而且積累豐富的PHP開發經驗。或許你不會整個網站的管理和開發,但是當遇到一些PHP技術難題時,在你的圈子裡大家都知道只有你能搞定。

  • 掌握一套相關聯的技術,成為這些技術的整合者

這個和前面一種相反,不是每一種技術都是大牛,而是做到為了實現某一個目標,你了解所有相關的技術。還是舉網站開發的例子。你不需要成為PHP的大牛,但是你得知道PHP是如何開發網站的,自己也能寫出合格的PHP代碼。同時你也懂資料庫,你雖然不如資深的DBM那樣能把資料庫玩的很溜,但是你能做到能搭建一個最基本的能支撐網站運作的後台資料庫系統。然後還得知道如何讓PHP程序和資料庫系統進行穩定的交互和鏈接。當然,你還得懂CSS,Javascript,HTML等等等等。當你能做到這點的時候,一旦你接到一個任務,你腦子裡就能搭建出一個網站的技術結構圖。然後把各個細節上的實現分配給下面各個領域的大牛去做。

-----------------------------------------------------------------------------------

所以你一開始要確定你的發展方向,然後在確定為了實現這個發展方向需要學習的技術及學習的深度。且不可以見什麼都學什麼。你說一個搞軟體開發的學硬體有什麼意義?一個搞通訊的學SEO也沒用是吧?

很多人學各種各樣的技術,由於自己精力有限,都沒學到根上。再加上沒有規劃,這些技術往往很難組合配套使用,結果就是迷茫。老闆公司讓你學技術的目的是要能解決問題。所以從解決問題出發。當然最重要的是要訂好自己的發展方向。

----------------------------------------------------------------------------------------

從公司對員工的要求方面來看,一般也分兩種。大公司的要求,小公司的要求

  • 大公司對員工的要求是單一領域的專精

大公司往往崗位劃分的相當細,一個人不會也不可能讓你負責多個領域哦工作,你是寫代碼的你就專職寫代碼,別的事情你別插手,也不會讓你染指。你是搞資料庫的,你就一心一意搞資料庫,代碼的事情你別管。所以大公司不會要求員工的能力全面開花。

而且大公司往往較為規範,一旦讓你做一個領域的工作的話,基本會有人帶或者培訓的。至少會告訴你,你需要往哪個方向發展,及至少你的能力要達到哪個層級。從題主的問題可以看出,題主你應該是在小公司工作。因為你現在還很迷茫。

  • 小公司對員工的要求是獨當一面

小公司沒有大公司那麼強大的資源支持,對成本敏感,生存壓力大,而且組織管理更不規範。所以小公司的老闆往往要求下面的IT最好什麼都會。你不需要是某一領域的專家,只要你的能力夠解決問題就可以了。但是你需要解決所有的問題。

別說你是程序員,只管程序的事情,如果要處理資料庫請老闆再招個資料庫管理員。你分分鐘被老闆罵死。你是IT,IT的事情你都得負責,你怎麼處理我不管,總之別掉鏈子。這就是小公司老闆的心聲。

所有小公司的IT你在學技術的時候特別要注意,別上來就是高大上的理論和流行的技術和名詞。解決問題是王道。小老闆們不會在意程序的效率問題,不會在乎用戶體驗。他們要的是:省錢,管用,快速上線。所以你遇到什麼問題就學什麼,千萬別為了花狸狐哨的東西花太多的時間。


==================================================

先寫道這兒吧。想到再補充。


其實就兩個技能

  • 技術技能
  • 非技術技能

其實公司更專註的是你能不能做事,能不能為公司創造價值。所以我們只要看下哪些技能可以促進我們為公司做事就行了。

首先說說技術技能:作為一個技術類的職業,技術上必須要達標,如果有獨立完成項目的能力,公司可能更加傾向於招;為了達到這一點,就要求我們要有很強的自學能力搜索能力(藉助百度,google解決技術上的問題)。另外,如果是初學者,可能比較欠缺計算機體系類的知識,如果想在IT業走的更遠,一定要補補這類知識:

  • c/c++
  • 數據結構
  • 演算法
  • 資料庫
  • 操作系統
  • 編譯原理

非技術技能就比較多和雜了,比較偏向於綜合技能。以下技能其實要求並不過分,只要你及格了就可以。技術類的崗位可能你得90分和得60分並沒有區別。

  • 理解能力:理解上司和同事的意思,減少沒有必要的交流時間也是公司很看重的
  • 執行力:不拖延,第一時間完成需要做的事也是公司很看重的
  • 忠誠度:至少讓公司覺得,你不會隨便跳槽,公司才敢把項目給你做

還有一些其他的,其實和做人很像,這裡就不再展開說了。

題主是初學者,後面的路還很長,萬事一定要保持謙虛

點贊加關注,乾貨持續分享中。


懂語法和常用演算法可以當實習生。

做過一些小的系統模塊後可以做模塊程序員。

做過幾個項目,踩了不少坑後,懂得了架構的價值所在,可以當主程。

主程安排慣了任務,懂得了如何調配人力,如何安排資源、如何管理進度後,可以當主管了。

跟其它部門的人合作多次後,熟悉了整個研發流程,了解期間會出現問題的點,基本就可以嘗試項目經理了。

這是往管理走的路。

當然,技術也可以往下層走,死命的往底層研究,雖然大多數人覺得很枯燥,痛苦,但是前面就是技術總監的職位在等著你。

總之技術都是一個坑一個坑走過來的,踩過的坑越多,經驗越豐富,高級人才的價值在於一件事還沒做的時候他就知道不能怎麼做,應該怎麼做,即使面對新的難題,不知道該怎麼做,但至少也該知道不能怎麼做,這樣才能為公司節省大量人力財力。

說白了就是風險把控和經驗和意識,這是通過無數次在實戰中踩坑換來的。書本上學不到。


如果真願意,或許你可以到這裡找答案。

大概是一年前,我發布《野生程序員:優先招聘》之後,一個同學聯繫上我,希望能給他一個工作,不要錢都行。我確實想幫他,但我沒這個能力,所以只好殘忍的拒絕了。
他非常難過,「為什麼呢?」
「你沒有工作經驗……」

「工作經驗,工作經驗,誰TM一生下來就有工作經驗的?」他終於爆發了。
隔著電腦屏幕,我都能感覺到他千里之外的憋屈和憤怒,我甚至能想像他眼裡的淚光。但我無能為力。那種拒絕別人之後的鬱悶,和無能為力的難受,讓我——不要幻想我立大志願發大發慈悲普度眾生啥的,沒有這回事,我泥菩薩過河呢。這只是讓我開始思考一個問題:
工作經驗究竟是什麼東西?有什麼價值?或者,沒有工作經驗,我們沒有的究竟是什麼?

為了徹底的搞明白這個問題。我們首先排除那些逃課打遊戲的同學,他們找不到工作,不是因為沒有工作經驗,他們是啥都沒有。我們假定一個踏踏實實的大學生,課前認真預習,上課認真聽講,下課認真複習,自然考試成績也不錯——但他就好找工作了嗎?他還是要面臨「沒有工作經驗」這個坎。(找到工作的,只不過有些用人單位願意培養新人罷了——致敬!)
我做過律師。我覺得用實習律師來做例子是最能說明問題的。能做實習律師,首先要通過司法資格考試。《司法資格證》拿在手裡呀!這含金量,這沉甸甸的手感……但有用么?給你個案子,你能啃得動么?為什麼啃不動?你猜……

媽逼的連法院的門怎麼進都不知道!
書上就寫一句「向人民法院起訴」,是的,法院就杵在那裡,但你怎麼去「起訴」呢?走哪一個門呢?找誰呢?先繳費,還是先遞起訴書呢?除了起訴書,還要不要其他材料呢……自己一個人去辦還好點,大不了我到處問受點白眼;要是當事人和你一起,你完都完了:豆大的汗珠止不住的淌,那畫面不要太美!

轉行做程序員,我參加了培訓,考過了軟考,自己也能東拼西湊的搞出個小網站出來,但我還是鐵了心的來到上海,那時候我女兒才三個月大,真的是拋妻棄子啊!為什麼?我知道,我還缺一樣東西,這東西,不是我自己看書看視頻就能倒騰出來的:工作經驗

來源:沒有工作經驗,沒有的究竟是什麼? - 自由飛 - 博客園

話說我真沒想到這篇博客(原文)才2個贊,呵呵……


* 吃苦耐勞

* 快速學習

* 快速適應

* 懂得變化

* 學會扯淡

* 學會寫作

* 學會演講

* 。。。


你先要進公司,進公司就要有項目經歷,項目經歷可以是你自己用所學實現的東西,未必是工作經歷。90%+的實際知識都是在有了一份具體的技術工作後才學到的,不然大家都看看書學學語法就成專家了。

進了公司,這問題你就有答案了。


作為經歷過招人這件事的我來快速答一下:你的交流和親善能力。

招新人,我們不在乎你的能力,你有文憑,你來投簡歷,說明你有基礎it知識,當我覺得你有邏輯思維能力,你基本it不差。但招人不怕招不到想找的,怕找到沒人願意和你做事或者客戶不願和你合作的。有了上述我說的兩點,你的團隊能力,學習能力,甚至被人罩的能力都不差。

我也希望招全是牛逼的,但二八理論永遠有他的市場,所以團隊對我比個人更重要,當然,你有別的技能對我肯定是asset。


1.便宜2.聽話3.完成任何老闆給你的任務,請在簡歷上體現這三點,公司不會管你懂幾種設計模式看過幾本演算法書。


1、對計算機硬體有一定了解,例如,CPU、內存、硬碟、輸入輸出、匯流排等。
2、對操作系統有所了解,例如,內核、系統函數、如何管理各種硬體等。
3、對網路有所了解,tcp、udp、http等協議要比較熟悉。
以上為基礎,要有一個整體的認識和正確的理解。

4、計算機語言
5、資料庫
6、需求的理解能力
7、邏輯抽象能力,如何把要解決的問題轉換成編程的思維,也就是如何用程序來表達自己的思想。到這一步才算入門,可以算是初級程序員了,可以真正開始做一些東西了。


以下算是進階階段。
8、溝通、協作
9、文檔能力
10、面向對象的原則、設計模式等
11、計算機之間的通信方式等

學海無涯,再進階大體上分:
技術方向(架構師),需要一定天賦;
管理方向


工作了幾年,發現作為一個程序員,尤其是一個女程序員,光有編程技術是完全不行的!
首先,需要提高體質,身心保持健康狀態,才能勝任繁重的工作。
其次,要學會與人交往,一定要建立好同事間的關係,很多同事都會樂於幫助你的。
再次,要不斷學習,不要覺得有了工作就萬事大吉了,it"s impossible!你要繼續學習,提高學習能力!
再次,要有創造力,不能墨守成規,拘泥現實
最後,要有自信,不止一次受到別人的懷疑,我依舊相信自己,一直支撐我走下去!


英語很重要。少壯不努力,老大背單詞。


修電腦,免得老有人問:「你不是學計算機的嘛?電腦都不會修……」


你說是IT技術的初學者,我是不是可以理解為你是個IT小白呢?你發現很多人學Python,學CSS,學JS,學了半天發現自己其實還是無法達到一個公司的要求。是啊,因為他們不知道公司需要的是什麼類型的員工。

那麼公司期望一個人應該具備什麼樣的技能呢?有沒有一些隱含的技能,並沒有寫在JD之上,但是又對於初學者來說,非常重要的?那麼,我們看看企業需要什麼樣的IT人才吧!

現在的IT技術已經作為一種工具和技能深入到社會生活的各個層面,不但是專業IT單位,同時凡是需要計算機的地方都需要IT人才和技術。

IT人才的擇業道路是非常寬廣的。那麼,由於各行各業並不都如同IT行業一樣專業,必然導致對人才能力的綜合需求,也就是,不但是IT技術,同時也包括了對自身企業業務工作的熟悉程度。

舉個例子來說吧,比如說進出口公司的計算中心,往往工作人員即是IT專家,也是熟悉進出口業務的內行,這樣開發的系統才符合行業工作信息化需要。否則,成了閉門造車了。

所以我們知道,企業需要IT人才一般包括以下幾個方面:

A. 能夠宏觀規劃信息系統的IT規劃專家,通常是CIO和CTO;

B. 具備項目開發經驗和豐富的團隊管理經驗的項目管理人員;

C. 能夠進行系統需求分析和系統設計的系統分析專家,也就是軟體工程和CMM質量體系技術和能力的高手;

D. 技術專家,熟練掌握一種以上技術,如網路、軟體工具和資料庫,操作系統等,能夠實施網路或者能夠開發大型的軟體系統。通常在IT行業稱為「高級工程師」、「軟體工程師」等;

E. 技術人員,主要是熟練掌握一種技術,如網路技術,軟體開發工具等,並能否解決日常工作中的問題,如維護網路,開發企業自身需要的軟體系統等。通常在IT行業稱為「工程師」、「程序員」等;

不過,這個行業是終生學習的行業,所以你還要善於自學。另外,專業英語要好,很多知識是國外的,你不能等著有人翻譯再看!

無論什麼崗位,企業最希望的是人才一專多能,萬金油一樣,那麼可以減少人員,並指望全才搞定問題。希望能幫到你。


首先你得問問自己是不是真的喜歡你要學的那個方向。
其次,在學習之外,你應該擁有的技能:
從公司來說,能創造有利於公司的價值,那麼至少it水平應該要達到行業需求。
重點是從自己來說,對初學者嘛,有用的隱含技能點:求知慾,毅力,心態(浮躁與否)。 還有兩個軟技能,英語和搜索能力。


自學能力。


重點提一下,需求,進去公司之後做事情要理解項目需求是什麼,我頭一年碼代碼,技術學到的是其次,重點是如何搞清楚項目的需求,客戶的需求,這是要理解能力和溝通能力,也要理解軟體到底是個怎麼回事,也只有在這個基礎上,慢慢的在上面疊加比如重構和設計模式等高級點的技術,不然連需求都搞不清楚都是做白工,公司自然不會要的。
對此我的學習經驗是設計資料庫,並且拿給前輩看,然後接著修改設計,這個是一個客戶需求變成數據模型的過程,別看設計個資料庫欄位很簡單的樣子,一旦業務複雜點什麼亂七八糟的設計都出來了


推薦閱讀:

如果沒有文憑,碼農用什麼方法找到好工作?
IT 行業的工資是否虛高?
怎麼擁有幸福?
為什麼人不能像「畫圖」一樣創造音頻文件?

TAG:互聯網 | CSS | JavaScript | 信息技術IT | Java |