#軟體工程師面試 #文長慎入
面試問題好像一直以來都是一個很多人關切的環節,在各大版上也一直有人會詢問。因為之前有幫公司面試一些人,還有加上從朋友那邊搜刮來的經驗,概括分享一下。
這邊感覺可以分成幾個部分:
1. 面試的題目是否都是演算法相關題目?
2. 是為什麼實際工作內容通常都和面試考的沒有相關?
3. 我現在學的東西對找工作是否有幫助?
4. 公司招募看的到底是這個人的學經歷,能力,個性,還是什麼,為什麼有些人很感覺很厲害卻一直無法拿到offer?
其實用FB排版不太容易,但因為懶得登入部落格,想說快速地打一打,所以也請各位見諒。
#面試的題目是否都是演算法相關題目
如果是投FANG之類的,Facebook Amazon, Neflix, Google (沒記錯應該是這幾間),反正就是這些有名的大廠,除了Netflix目前沒有遇到認識的聊過,其他都是考演算法沒錯。
當然也不只有會考演算法,根據你申請的職缺,可能也會加考一些其他的東西。
那其公司是怎樣呢?其實還是有很多公司會考演算法相關的,尤其是線上面試。
雖然在疫情下全都是線上,但一般來說,還是會有分兩種,一種是沒有真人的狀況下,就是給你像是HackRank這種網站,你點開可能有六十分鐘讓你做兩題。
做完以後你提交,你也不會知道你的分數跟分析結果之類的,看公司怎麼做設定,而且除了演算法相關題目,也可以設定選擇題之類的。
另一種就是真人面試,通常電腦自動面完以後,你可能會跟真人線上面試,真人也是會給你類似所謂的白板題,就是出一個題目讓你現場解題,然後中間可能有的會要你跟他討論,當然看面試官拉!
比較加分的還是,你編寫的時候可以邊闡述自己的想法,而不是低頭默默寫完,這樣也是有點尷尬。如果你編寫邊闡述的話,或者是少有點互動,也是展現你的溝通能力以及你對於題目的掌握能力,就像是你看到一個很簡單的題目 (2+3)*5 之類的,你可以很有自信的說,喔因為2+3在括弧裡面,所以要先算,然後再乘以5,展現底是真的有理解,而不是就是背題目之類的。
有些公司也可能是給你回家作業,叫你做一個小專案之類的,看你應徵的職缺,可能是叫你做一個UI 或者叫你建一個API 也可能叫你做一整個比較完整的東西出來。如果你是面試架構師的話,可能會叫你建一個架構,或設計一個架構出來。
然後也有的公司(像我們公司)就是需要pair programming 所以在線上面試的階段就是會有,真人跟你一起寫程式這樣。
#為什麼實際工作內容通常都和面試考的沒有相關
這個部分一直以來都是一個難解的謎題。像是Google Facebook這種大公司其實不難理解,畢竟他們是比較類似General 的招募,不是一開始就決定好你就是要去某個Team然後永遠讓你待在那個Team。就他們招募的是他們覺得,有潛力的人才,這樣不管需要做什麼都可以自由移動他們,給他們training就可以變得很好用。加上他們一次招募的數量也是相當龐大,考演算法相關的話,可以快速篩選,也更有機會找到他們需要的人才。
因為像是Facebook或Google這種有自己開發框架,開發技術的公司,他們的確有很多時候需要寫演算法或者系統優化的工作。
那像是普通的中小企業或新創,說真的,其實就是跟風。因為覺得人家Google Facebook都是這樣找到優秀人才,那我們也要依樣畫葫蘆,這樣鐵定也能找到厲害的人。
可是這樣找到的人進去以後,發現公司好像也是不知道在幹嘛,最後可能也會待不下去。所以這個部分,近年來也越來越多公司開始改進,開始思考什麼樣的招募流程最適合自己公司。
像是pair programming也開始成為近年來的一個流行的面試,有的公司並不是真的pair 但就是你要跟他們一起工作,了解他們公司的文化,或者跟他們的工程師進行一些深度討論。或者會問你說,假設給你設計一個系統,你要怎麼做之類的。
當然,面試問題跟流程都是每間公司各有不同,不是說你現在準備一種就萬無一失。所以說最好還是盡可能的,提升自己的基礎能力。
如果真的就是打算以FANG為目標的話,就可以從刷題開始,像是Leetcode, Hackrank, codewars之類的都不錯。之前有看到一篇文章,他刷了幾百題,而且每題刷了三次以上,真的很有毅力。刷題的重點就是在於熟練那些題目,可是也不要硬背,你練習是要練那個速度感。可是該理解的還是要理解。
因為你進公司以後,你還是需要使用那些東西來工作,不是只是為了刷題而刷題,而且面試官可能也會考你變形題之類的,或者問你一些記憶體相關的問題,或者是系統設計的問題,或者單純想知道,你是怎麼想出解法的,所以硬背題目跟答案其實也是不太行。
目前我的了解是,大部分中小型企業或者新創,很多時候你學習新東西的能力是比演算法更重要的,尤其是新創你什麼都要會,假設公司是剛起步的新創,你就要變成公司主要的技術專家,什麼東西不太會也要馬上現學現賣,也不要期望公司可能會給你什麼Training 或者有人給你依靠,可能同事還要依靠你。
中型或者普通大型企業,假設公司已經有產品的話,大部分的時候可能是既有產品維護,除非你剛好很幸運地在新產品開發的Team,這樣就有機會學到很多東西,不然維護的話,很多時候只是在了解產品本身是否有Bug,改善code品質之類,也要看公司是否有想花成本在維護上面。如果公司就是打算一個產品,改一點東西就繼續賣錢,那樣好像也不太需要一直去migrate 或者搞新東西上去。
如果你剛好很幸運在獨角獸新創,那你不但可以學到很多東西,還可以用最新科技,可能還有機會遇到大神帶你。
所以說選公司其實也是有點重要,面試的時候,可以問問他們說,那你平常的daily work是怎麼樣的,公司有沒有走敏捷開發,公司有沒有用雲端,公司一個Team的規模之類,以及公司會不會提供訓練。
#我現在學的東西對找工作是否有幫助
其實這個就要看你的未來三年五年十年規劃。
假設你就是都在寫前端,你也覺得我要寫前端寫一輩子,那好像就可以繼續一直focus在前端。如果你擔心自己會丟飯碗,是不是要學點後端,其實也是可以學,可是學了以後,你打算學得多專精?後端的東西也是會一直更新,一直進步。可能Restful API 也可能不是,DB也有好多種DB, 後端語言也很多種,所以你是想要學個大概,還是是希望,後端也問題的時候,自己可以去看code也看得懂?
前一個專案,公司有一個前端,他就是因為自己做的ticket幾乎都會碰到後端,就乾脆把整個後端也寫一寫,就變成fullstack,雖然他主要還是算前端。但也因為是.NET 所以前端跟後端可能沒有太明顯的分界,至少我相信他本來就會寫.NET了,因為幾乎有一半以上的controller都是他寫的。
如果你是寫react SPA,就是跟後端完全分開,你就只要寫到send http request 那邊的話,那好像也不太需要去了解到後端的架構,就是大概知道後端的endpoint 長什麼樣子就好,他們需要提供的文件就是需要提供。
如果說你是怕以後失業,怕公司可能覺得請全端比較划算,那的確還是多學一點好,反正多學也是投資自己。還能順便展現自己的上進心以及學習能力。
以consultancy來說好了,感覺是什麼都要學,像是公司可能就會說,啊最近我們的客人都要求要會什麼什麼,那你就趕快學一下。當然公司也不是很壞心的就叫你要馬上學會,公司最近也是有開始提供一大堆Training 之類的,還給你錢讓你去考一些證照。
目前我使用的語言主要還是Javascript 和 C#這樣,然後公司有希望我可以好好學學Java。其實也不是不會寫Java,如果有發漏我其他文章的話就知道,其實我最一開始學的時候,第一個語言就是Java。
在台大資訊系統訓練班的時候,我就上了Java和PHP的課程,為自己來英國念研究所做準備,一年的master course也都是Java 跟PHP為主,然後有用了一點Python這樣。可是工作以後就只有使用C#和Javascript 而已,所以說,學校學了也不一定會用到。
很多東西都是工作以後才學的,然後Python是平常自己刷題的時候會用,因為覺得不錯用。
其他的話,我覺得雲端相關的東西滿實用的,像是AWS或Azure 或GCP 有機會的話是可以自己摸摸。我自己是滿幸運的在工作上一直都有用到雲端產品,主要是AWS,前一個專案有用Azure 這樣。
DB的話,就是SQL和NoSQL可以個學一個,應該就滿好用的了,目前最流行的應該就是PostgreSQL和MongoDB 。如果對於Graphic Database有興趣也可以稍微看一下像是Neo4J之類的吧!
前端框架的話,就是React, Angular, Vue.js選一個吧!學會一個以後再去學其他的也不難,這三個我是剛好工作上都有用到,我自己是覺得Vue和React應該是比較好上手的,入門門檻比較低,Angular就一定要寫Typescript.
後端框架的話,看你用什麼語言,Java就學spring boot,
C#就是.NET,JS的話應該是Express,Python就Django,PHP就Laravel 。
Mobile的話我沒有寫過也不知道。
如果是平常想要補充知識的話,可以多念一些像是security 相關的東西,或者是Oauth那類的,也可以看一下架構之類的。像是Microservices, microfrontend, Domain Driven Development 這些概念性的東西。
也可以看一些像是Clean Code相關的書,怎樣重構原本的爛Code或者TDD相關的書。
反正前一篇文章就說了,這個職業就是要一直學,活到老學到老,如果打算做到老的話。
#公司招募看的到底是這個人的什麼
其實每個公司應該都不太相同。有的公司就是要招募他們覺得最聰明的人,所以就是一直問你一些很難的東西。或者就是只要找那種名校出來的人,最好有什麼數學物理奧林匹亞的。
有些公司看的是你的個性,符不符合公司文化,或者同事喜不喜歡你之類的。
有些公司就是很缺人,看你能不能馬上上工之類的。能的話就馬上錄取你之類。但通常那個可能是很雷的缺,例如公司找人找很久都找不到,終於看到一線希望。然後為什麼找不到人,可能是薪水開的偏低,或者公司名聲不好,上Glassdoor就可以查看公司的評價。也可能是職缺本身很雷,例如看起來就是個打雜缺。或者是前人都做不久就離開,所以需要一直找人。
有些公司是看你寫的code 例如看你的code乾不乾淨,可能你寫出來的code都很乾淨,設計也很好,思路也很清晰,他們就會錄取你。
有些公司看的是你有沒有某些特定的經驗,例如公司開那個缺剛好就是要找有AWS經驗的人,所以可能就是會錄取他們覺得AWS經驗比較多的人。或者是剛好想找之前有做過Serverless架構的人,或者是有碰過Kubernetes的人,這個時候真的就是靠經驗了。
也有的公司就是,他們也懶得找人,HR給他們面試的第一個人就會錄取,這個完全靠運氣。這件事情真的發生在我第一間公司的另外一個Team,主管非常不喜歡面試人,也覺得我工作都沒時間還要面試。所以就是隨便問問之類的,然後就跟HR說好。
--------------------------------------
以上就是我目前經歷過以及別人分享給我的經驗。我覺得面試的話,運氣真的也是佔滿大的比例,尤其是遇到像第一間公司那種狀況的。
當然年輕的時候可能會比較急躁,也很擔心自己找不到工作,考量到的還有金錢跟公司名聲,所以學不學得到東西也可能是其次。
選offer的時候,也可能就是可以分析一下,自己想要的到底是什麼,是金錢,是做得開心,還是想要可以做的久(這個也要看公司可以活多久),除了看Glassdoor也可以上網看一下公司財報。
最近的疫情衝擊下,有很多新創或中小企業也開始裁員跟減薪,所以公司平常的財務狀況和經營方針也是很重要的。即使公司可能一直都有收入,也可能因為現金管理問題,導致沒有足夠現金需要裁員。
同時也有10000部Youtube影片,追蹤數超過2,910的網紅コバにゃんチャンネル,也在其Youtube影片中提到,...
「java後端框架」的推薦目錄:
- 關於java後端框架 在 小吃貨的英國生活日記 Facebook 的最佳貼文
- 關於java後端框架 在 コバにゃんチャンネル Youtube 的精選貼文
- 關於java後端框架 在 大象中醫 Youtube 的最讚貼文
- 關於java後端框架 在 大象中醫 Youtube 的精選貼文
- 關於java後端框架 在 Re: [請益] Java後端薪水更高的方向- 看板Soft_Job 的評價
- 關於java後端框架 在 【台北中正】【40K以上/月】JAVA 後端工程師(初階/資深) #83 的評價
- 關於java後端框架 在 後端開發為什麼選擇Kotlin 的評價
- 關於java後端框架 在 Java后端开发学习路线和必学技术点大梳理 - YouTube 的評價
- 關於java後端框架 在 [請益] 後端精進的方向? PTT推薦- Soft_Job 的評價
java後端框架 在 コバにゃんチャンネル Youtube 的精選貼文
java後端框架 在 大象中醫 Youtube 的最讚貼文
java後端框架 在 大象中醫 Youtube 的精選貼文
java後端框架 在 【台北中正】【40K以上/月】JAVA 後端工程師(初階/資深) #83 的推薦與評價
... 框架:Spring Boot/Spring Cloud/Spring Framework/Spring Data 等熟悉SSH (Struts2 Spring Hibernete)、 Struts MVC框架熟練Sqlserver 等關聯式資料 ... ... <看更多>
java後端框架 在 後端開發為什麼選擇Kotlin 的推薦與評價
JVM 生態系. Kotlin 可以編譯成Java ByteCode,直接使用原本Java 的library. Spring Boot. Spring 框架可謂JVM 生態系裡最舉足輕重的 ... ... <看更多>
java後端框架 在 Re: [請益] Java後端薪水更高的方向- 看板Soft_Job 的推薦與評價
※ 引述《empireisme (empireisme)》之銘言:
: 文章可能很長,先說一下
: 一 個人背景和工作內容
: 我個人的背景是年資一年的Java後端工程師,目前在電信業服務(非中華電信),學歷為清
: 交商管碩士(非資管)
: 年薪大概65-75萬(因為是年終占比太高所以不確定,月薪不到45K)
: 我的工作內容主要是Spring Boot開發,使用的技術框架主要是
: swagger,hibernate,jdbc template,spring security等等
: 部署方面就是打包成war檔案,然後丟到linux主機的tomcat資料夾裡面而已....
: 後來公司導入jenkins之後,大概也不需要管部署
: 我的工作內容真的主要就是CRUD,而且還是給內部業務的的CRUD
: 我自己有感受到,我是那種要工作中有用到,才會體會比較深的類型
: 比如說我學生時代一直不太會用left join 現在終於比較熟
: 不知道sql指令要命中index,要下explain去檢查
: 以前不知道學生時代那些繼承的動物例子有甚麼用,後來工作後看到前輩去用basedao
: 裡面包了很多常見的功能像是paging之類的,才發現繼承的好用
: 我清楚意識到,因為我做的只有CRUD而且還不是給很多使用者的CRUD所以
: 非常害怕落入所謂的工作十年可是可能技能跟工作兩年的人一樣的狀況
: 版上的大大才多次提到類似的概念
: 原文問錯問題了,不管你學什麼,學多少技術種類,都不會影響你的薪水。學到什麼程度
: ,找什麼工作,才會影響薪水。
: 之前看了Drtech大的文章
: https://reurl.cc/Yvx344
: 所以我的問題如下:
: 1. Java Backend要學多深 ?
: 之前看了本版的系列文章,
: https://www.ptt.cc/bbs/Soft_Job/M.1527864627.A.626.html
: 還有幾篇 java 後端的面試心得
: 都會問到 jvm 調優,或是redis kafka相關的問題
: 但是我目前的公司應該是不會用到
: 2. 要找甚麼產業,哪些公司 ?
: 為了避免這篇文章太像伸手牌,所以下面會放入我覺得可能可以的產業和我自己的網路上
: 發現的觀察
: # 二 做過的努力
: 1.
: 想說即使公司沒有大流量場景來訓練,然後大流量場景可能又和多執行緒有關
: 所以就想說去udemy上買相關課程
: ![](
: 目前大概看了三分之一,但還是有點霧煞煞@@
: 做過的事情是找了幾個網路上的範例,比較有開多執行緒跟沒開多執行緒
: 統計資料夾大小的速度差別
: 2. 基本的資料結構
: 去geekforgeek還有買書練習java資料結構,主要以leetcode explore為主
: 書我目前是看 數據結構與算法之美 是簡體書,好處是書中的code都是用java還不錯
: 目前大概是排序算法 練過快速排序,合併排序
: linkedlist知道基本的時間複雜度,還有刪改操作
: 還有一些經典題目,例如反轉Linkedlist 合併兩個linkedlist,環的檢測等等
: 目前是感覺對於code的掌握度有變高,腦袋也有變靈活點,但可能因為我的工作性質,所
: 以還沒感受到資料結構的威力,我目前的工作性質大概只會用到兩種資料結構ArrayList
: 還有HashMap
: 3. 看對岸的面試題
: 對岸有很多JAVA面試題的影片,就是諸葛老師他們,睡前會看個一兩集,
: 蠻喜歡看一些像是mysql優化的
: ![](
: 或是對岸的圖零學院,他有一系列的刷題套路可以看
: # 三 覺得還不錯的產業 電商產業和租車產業
: 看了電商產業的職位,有的會和金流有關
: 有的和物流有關
: 有的則是訂單相關
: 訂單部分好像又可以很複雜
: 之前看到有版友提過
: - 訂單快照功能,保留當時的商品資訊 e.g. 價錢,規格等
: - 是否需要跨商店結帳?
: - 出貨時需不需要做到分批出貨?
: - 退款時需不需要做到只退款部分商品?
: - 出報表支援商業決策,譬如說過去一個月,哪間商店營業額最高? 哪些商品最熱賣?
: 像我就對這些問題的資料庫設計沒甚麼想法,我可能就停留在有一對多,多對多,然後要
: 做正規化而已
: ,比如說要知道過去一個月哪間商店營業額最高,應該就是直接下sql指令就好了吧?
: 當然這是我最初淺的想法
: 然後電商產業好像會有一些雙十一的的高流量場景?
: 國內JAVA為主的電商,我知道的有
: momo 跟遠傳friday,但後者好像有大裁員,而且cakeresume上面顯示的薪水,好像也是
: 45K到70K的樣子,另外momo雖然非常賺錢,但是網路上查到的java工程師薪水好像也普普
: 另外我最近看到格上租車的職缺描述,裡面提到會設計高流量後端服務,還有微服務設計
: ![](
: 但是其實我沒有接觸過租車產業,不確定是不是如同cakeresume上面說的那樣
: # 四 台灣系統廠
: 之前看台灣系統廠的中位數薪資,其實也不低,當然是比半導體低,但是也有一定水準
: 但是我實際去找 asus 或是 acer的JAVA工程師薪水,好像也是普普
: ![](
: # 五 外商
: ![](
: 之前看到太陽鳥在徵才,也不太確定是要學到甚麼程度才能拿到比較高的薪水
: # 六 我的學習困境
: 透過專案的訓練,開始學會用swag方便測試API,開始學會Spring Security懂得如何基於
: 腳色給予適當的URL保護,原本沒學過jdbc template,也慢慢學會了
: 但是外界常用的redis kafka 或是多執行緒技術我們公司目前應該是不會用到
: # 七 結論
: 上面好像寫得有點太發散,所以我應該找甚麼產業的甚麼部門?
: 電商嗎,還是一些乙方,因為乙方我看過有些公司好像也有月薪七八萬
: Java 後端應該要能學到甚麼程度,能解決甚麼樣的問題? 才能有一百萬左右的薪水?
: 我自己的想法可能是leetcode要能夠解掉easy
: mysql 優化要能夠說出除了index命中以外
: 然後是不是要自己想辦法學會Spring cloud 這種微服務框架?
: 甚至還要會負載均衡 ?
springboot自帶tomcat,
build成jar自己可以直接啟動成一個微服務,
打包成war再放進tomcat裡這是以前jsp servlet那個石器時代的作法,
你們用springboot卻這樣部署,
很大機率你們可能沒有真正了解springboot究竟要解決怎樣的問題
你現在看了前輩的code覺得繼承好用
但是你不明白繼承不是一個好的pattern
很容易讓專案過度複雜
用compose的方式往往會更好
golang就沒有Class沒有繼承只保留interface
你有探討過這中間的原因嗎
jdbc template只是spring提供的一種template
jpaRepository也可以做一樣的事
假設只學會使用這些而沒有真正明白和資料庫溝通時需要注意的細節
(比如在迴圈中去query或insert/update是一種糟糕的作法)
那麼你的實力並沒有變強
碰到資料庫瓶頸你很可能也找不到問題點
你沒有multithreading的實戰經驗
很多高薪的公司的業務場景你無法handle
你也無法理解golang為何能夠更好的解決高並發問題
我相信你也不了解jvm的細節
或是spring底層的實作
這些都是成為厲害java工程師必經的路
高薪要看產業看公司沒錯
但那不代表你在高薪產業就不需要紮實的能力
我的觀察是
你的能力還很淺
眼睛卻一直盯著錢
這樣你永遠無法成為真正厲害的工程師
我共事過的一些很強的工程師
光看multithreading code就可以看出可能的問題
碰到沒有清楚的error message的瓶頸時
也能夠短時間找到問題點
pm給出大的需求
能夠清楚拆分成小的ticket分給下面工程師去做
時程估計合理
架構設計可靠
程式碼優雅高效
你需要做的是看看好公司都開出怎樣的需求
自學後去面試
被打槍再學再面試
想辦法進到這些公司去實戰這些技術
是金子到哪都會發光
你是大神別人只會捧著鈔票來求你
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 58.182.198.67 (新加坡)
※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1657966457.A.9AD.html
你要先大致上了解jvm的架構,你才會知道你的code在那些地方
是threadsafe那些地方不是
學習路徑大概會是這樣:
從原始方法new一個Thread開始
-> 發現沒有效率
-> 學習thread pool
-> 發現java提供你很多工具例如Executor大家族
-> 學threadsafe相關的Collection例如ConcurrentHashMap
-> 學到CPU從記憶體讀資料的知識
-> 明白Volatile關鍵字
-> atomic相關類別
-> 等等等
沒有先後順序,反正都要學
想學啥就學啥
你沒事就google thread 相關的東西
就會發現很多東西學
threading的重點除了速度,另一個就是計算的正確性
所以才需要鎖
怎樣鎖 哪時鎖 用甚麼東西鎖 怎樣會死鎖 怎樣避免死鎖
怎樣可以不要使用鎖又可以正確
這裡又一堆知識 你可以自己研究
驗證就是自己寫點簡單東西跑看看結果
畢竟自己一個人寫不出大東西
還是要工作中實戰
面試需要經驗 你就拿你自己實驗的東西出來講
你的知識夠 對方沒理由打你槍
springboot的dependency就有timcat
springboot本身就有一隻Class有一個annotation
叫做@SpringBootApplication
直接啟動這支程式 整個springboot就跑起來了
如果不明白為何spring要推出springboot
為何要改成這樣
google一下springboot設計的初衷和時空背景
就會明白了
... <看更多>