《如何自學編程,自學編程需要注意什么?》要點:
本文介紹了如何自學編程,自學編程需要注意什么?,希望對您有用。如果有疑問,可以聯系我們。
作為一個10年+技術人員,以及兼每周平均面試10人以上的面試官,我覺得我可以給大家一點點建議.
其實寫代碼很簡單,只要智商正常半年足夠.必定要把基礎打好,這是最重要的.一開始,你把常用的數據結構學全,足夠讓你在不錯的公司找到一份編程工作.
面試過太多的人,寫了7,8年上10 年代碼,連最基本的數據結構,設計思想都不知道,你再多的項目經驗又要什么用?現實一點講,你連給組員做代碼評審的能力都沒有,上十年工作經驗有毛用.還不如一個剛剛開始寫代碼的人,最少比擬好管.
還有,我個人是不相信基礎知識都欠好卻敢說會做設計的人.這樣的人做設計我不敢要.
有人帶你的話,每天只必要二個小時,半年下來,實力碾壓一半的人絕對沒有問題,不管工作年限多久的人.不是你多厲害,是大家伙太差了
我介紹一下配景,然后表明自己的幾個觀點,最后列出我經常問的面試題里面的基礎題并做說明為什么問這些.相信大家看完后都有自己的判斷.
先簡單說一下我本身的情況,我在一間大公司(挺大的,但不是BAT)里面做開發工作(SA,SE),負責系統的設計開發,帶團隊,不大,最多的時候也就20個開發人員左右.每個項目開始的時候需要招人,所以需要做大量的面試.這個有時多有時少,最近就比較多,平均每天3-4個,電話面試和現場面試都有.我是做j2ee開發的,前后臺都做,也都會面試前后臺開發,最近還會面試android開發.
在此先列出本身的幾個觀點,以免大家理解偏差:
1. 我說基本數據結構和設計思想是最重要的,這個觀點不變.但這個基礎并不是有些人理解的比擬無聊和很生僻的概念、無實際意義的筆試題,相反都是工作中遇到的問題.后面的題目大家可以看到.我并沒有讓大家重新發明輪子的想法,只是現實中很多人除了知道這是一個輪子之后其他都不知道,我是要大家了解每種輪子的特性,不同的路況用哪一種輪子,每一種輪子的優劣和注意事項.當然,如果你知道輪子的細節,我覺得是一個加分項.我們開發人員絕大部分部分是不會寫有什么創造性的代碼的,代碼都沒有什么難度,你把東西用好就夠了!能有機會寫算法引擎的,那真是大牛了.反正我工作這么久沒有寫過難的代碼需要高IQ才能理解的代碼.
2. 關于經驗,我從來沒有說把別人的經驗看的一文不值.作為多年開發人員,我比大部分人尊重和珍惜我們開發人員,也深知道做10多年開發的不容易,所以看到基礎很差的多年開發人員心里更多的是悲哀而不是藐視(上次晉級面試,大家工作年限都很多,最少8年,大部分10多年,雖然題目答得不抱負,我和另外一個面試官還是讓大部分人都過了).但是經驗要是建立在技術上的.在扎實的基礎前提上,你會少走很多彎路,經驗更加有價值.“我趕了20年的馬車,難道不上不剛剛開了半年汽車的小屁孩?”
3. 關于帶人,這個大家理解偏差是最大的.我說的帶人不是培訓,而是說有人給你正確的方向,和應該掌握的知識點,這里更加多是思維、設計層面的東西.首先肯定的是,個人的主動能力最少占90%以上.你得是一只馬,帶的人在你跑的時候不讓你跑偏,讓你避開一些坑,過不了的時候拉你一把.你如果是不是主動奔跑的馬而是被動牽著的一只豬,怎么拉都沒有用.人改變自己都很難,何況改變別人.其實“帶”更多是思想層面的,如有人告訴你原子結構為什么都有一個while?condition為什么存在?AOP為什么切不了靜態辦法?為什么本類里面調用切不了(這是上一個月的生產環境問題)?這些有人講的話,事半功倍.
4. 關于每天2個小時半年碾壓一半人,這個觀點不變.我說的是java語言,其他語言沒有面試過,但我猜測應該不會偏差太大.看起來很像很扯淡,但這個世界上有些事情你不相信但他實際上就是這樣.說碾壓大家可能覺得不舒服,恰當一點說是“超過”.我這樣說是從我面試的結論上得到的,我這2年內面試應該有200+人,年限從4年到10多年都有.我從不看學歷和之前工作公司,我只看你的技術.經常面試完的感覺就是,你寫這么多年代碼都寫了些啥啊,這么基礎不會,我把你一個10年+的人招過來,代碼評審還得我本身去做啊!所以少年你只要努力一點點,半年能超過一半的人很正常,當然再往上就不是線性了.還有,這里是自動過濾掉BAT等技術較牛公司,BAT技術或許能代表國內技術最高的水平,但絕對和國內平均水平沒有關系,平均水平離他們差實在太遠了.
5. 有人說基礎不好不代表技術不行.如果你看完我下面的標題,我們理解的基礎一致后你還這樣認為,我只能說“呵呵”.有人說:吾力足以舉百鈞,而不足以舉一羽;明足以察秋毫之末,而不見輿薪.你信么?技術上,我相信窺一斑而知全豹,一葉落知天下秋.
6. 看到有人說寫點牛逼代碼showshow的,我坦白,我是老手,不是高手,我做的也是it系統,我工作這么多年沒有寫過難度高的代碼,沒有機會也不必要.在座各位又有幾位必要寫牛逼的代碼呢?說實話,復雜代碼(不是智商理解的復雜)誰都會寫,簡單代碼可不是誰都寫得出來的.
----------------------------------------------------------
下面開始說題目了,個人面試題主要粗分為語言基礎,多線程,spring框架類,系統集成類,設計類.本日說語言基礎類,并說明為什么我會問這些.
1. 常用的Map有哪些,各自特點和使用場景.
毫無疑問Map是最重要的數據結構之一.HashMap,HashTable就不消說,如果工作經驗多一點的應該知道TreeMap,LinkedHashMap,ConcurrentHashMap,WeakHashMap.
其實我主要看LinkedHashMap,因為這個比較有用,之前我也經歷過寫出一邊用HashMap,一邊再用一個List存放Key順序這樣的代碼的年代.然后問一下TreeMap,LinkedHashMap區別,很多人不知道有序和排序是不同的.ConcurrentHashMap是JUC的包,很多工作8年以上的連JUC包都不知道,我不知道說什么好,你還停留在好多年前啊.如果知道會問問 ConcurrentHashMap和HashTable2個實現線程平安的方式有什么不同? 其實很多數據結構的實現思想是很有意思的,后面有機會寫寫.如你了解了HashMap的數據結構,hash一致性這個概念就很自然的理解了!
如果答得比擬好,還會問問哪些方面會影響HashMap的性能.如果知道大概的數據結構,就知道HashMap是一個list的數組,只要是數組就會擴容問題,HashMap擴容還得重排,這是最影響性能的.
再問有哪些線程平安的Map,是因為最少知道HashMap不是線程平安的,windchill軟件包HashMap死鎖問題現在還沒有解決,上一個月生產環境還報.(原因是并發的時候里面的list成閉環死循環了.)
WeakHashMap如果知道,那最少知道java引用有哪幾種,工作中可能遇到oom問題,虛擬機基本概念也有了.基本上不會深問下去了.
2. 如果HashMap答不上,只能問List了.
大部分人回答ArrayList,LinkedList,Vector.ArrayList是數組數據結構,也是要注意擴容的問題,這些帶數組結構的構造函數都有一個容量的參數.然后問問這幾種的使用場景.知道Vector線程平安.差不多了.上一個問題答不上,JUC包里面的List就不用指望了.
還會問List有哪幾種迭代器,不要覺得無用,這是上一次的代碼問題想到的.配景是服務器返回的List數據多了,我們要過濾掉一些.如返回的list有{"11", "22", "33"},把2開頭的去掉.程序猿你可以自己寫寫.不要覺得簡單,你能一次性寫正確嗎?我們當時開發人員寫的代碼,用{"11", "22", "23", "33"}測試就犯錯了,連續2個后面那個沒有刪除掉.但是如果你知道有list有一個專門的迭代器,可以邊遍歷邊修改,那肯定能一次寫對,不是皆大歡喜嗎?
3. transient/volatile這些修飾符的含義
如果你覺得無用和很偏,那只能證明你工作的內容比較單一,或者你看代碼太少了.我剛剛寫代碼的時候也是這樣覺得的.這2個都是經常用到的.transient系統之間集成序列化少不了打交道,如果不知道你要自己寫代碼過濾(實際上出現過有人專門自己寫了一個bean轉json辦法,就是為了過濾掉某些字段).volatile多線程會用到,這個其實有很多理論上的東西可以問.
基礎數據布局其實我就問這么一點點,不偏吧? 線程相關的其實更有意思.
4. 線程平安的數據結構有哪些?實現的大概原理是什么?
主要看最起碼JUC包要知道吧?有更加好的東西不用就浪費了.其實主要看知道不知道重入鎖的優劣,這是很有用的特性.很多人一說怎么樣才能線程平安就只知道加synchronize.很多時候是滿足不了要求的.有時候做性能優化就需要替換掉一些較差性能的數據結構.如果開發的時候就知道,就省事多了.如讀寫鎖,重入鎖的condition都是好東西,
5. 如果不知道重入鎖,那問寫數據要加鎖,讀數據要加鎖嗎?還有wait、notify的用法.
很多人覺得讀不消加鎖,如果真這樣寫代碼,bug就不遠了,很多人不知道加鎖有2個作用.wait、notify用戶很少有人能清晰說正確,大家都沒有鎖的概念.這個問題主要是考概念理解.
6. 原子對象的原理、用法?
這是其實很重要,也很簡單.很多時候我們放一個計數器,用原子對象就夠了,簡單明了.他的線程平安,是一種樂觀的思想,cpu指令保證.我一開始看為什么總有一個while,總覺得有點困惑,后面從思想上理解就很容易,悲觀鎖是一定要加鎖(用synchronize關鍵字或者重入鎖),覺得不加鎖就會出錯.樂觀鎖就是說假設你不會出錯,出錯了大不了重試嘛,所以有一個while,一般認為性能更加好.
7. 這樣一個場景,我們系統要調用3個系統接口,為了提供性能,我們起了三個線程一起調用,我必要等待這3個線程都執行完畢拿到結果再往下走,代碼怎么樣實現?
這是我們系統實際的場景,其實多種實現方案,最好最簡當然是jdk的線程池,或者閉鎖.能答得上不到1/10,很多人說用wait,notify,再問其實真的不懂...個人覺得,如果能用wait和notify寫一個阻塞的鏈表,一次就通過,wait和notify就算過關.
最后推薦下我的Android學習群:110359956,不管你是小白還是大牛,小編我都挺歡迎,不定期分享干貨,包含我自己整理的一份2017最新的Android學習資料和零基礎入門教程,送給大家,歡迎初學和進階中的小伙伴.還有最新opengl,opencv,VR,AR技術防止兩年至三年之后的一批大篩選.
還有MVP最新教程實訓班,歡迎大家參加
維易PHP學堂逐步分享更多《如何自學編程,自學編程需要注意什么?》相關教程。歡迎交流
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/9150.html