本人最近和不少小公司的程序員打交道。經過和他們的深入交流,我感受到了不少小公司程序員的現狀,由此深深地感嘆,可能真有不少小公司的程序員未必能干到30歲,甚至,一些技術一般態度又不好的程序員,可能還未必能干到28歲。
我去我朋友開的一家軟件坐了坐,順帶近距離觀察了他們java程序員的開發日常,首先說明,我接觸到的程序員不是才入職,而是普遍有2到3年工作經驗。他們的開發團隊是一個項目組長外帶10多號人做個java方面的維護項目,用到了spring boot。
其中所謂技術好的程序員,是能根據現有的業務照抄代碼,編寫新業務功能。編寫過程中,如果遇到不熟悉的api,還能上網根據功能查,比如要輸出指定的格式,那就會查下然后用Calander等類實現。如果寫代碼時遇到一些數據庫問題或基本的問題,還能把問題關鍵字放到網上查,并找到對應的解決方法。
在此基礎上,如果遇到有bug,還能主動解決,遇到活還不退縮,也就是說所謂的技術好外加態度好,這種人已經算是不可多得了,至于熟悉maven或git等基本管理工具,那更是能算技術頂梁柱了。在這個團隊里,不少做java后端的,而且有2年開發經驗,是屬于無法解決實際問題的。比如無法通過debug排查問題,遇到一些JPA方面的問題,或數據源配置問題,根本不知道如何查。
而他們的項目組長,更多的職責是管進度,同時用最簡單的方法把系統發布到網上,并做簡單的數據庫等方面的配置管理。比如就直接用mvn命令打包,用復制粘貼的方式把jar包放到linux上,遇到數據庫性能問題,還能連到linux上用命令建mysql的索引。不過,就是這樣的技術,用來管理他們公司的項目,也綽綽有余了。
我朋友所在公司里的程序員天天都在創造價值,所開發和維護的項目還真值不少錢,他們每天也不能算閑。但除卻哪些摸魚的程序員,那些態度積極的程序員技術上掌握了哪些技能?
1 業務知識點,比如某個業務流程該怎么做,中間該從哪里獲取數據,該返回什么。這些業務可能是這批程序員平時接觸最多的所謂技能,而公司也是憑借“能正確開發業務”來考核程序員,但這些只能算業務知識,不算技術。
2 用Spring boot開發業務的技能,這倒算,不過用Spring boot外帶相關組件開發業務的技能太廉價,哪怕是零基礎的用1個月就能會,而且這種零基礎的程序員進入公司3個月后就能熟悉各種業務,也能用Spring boot開發各種功能,所以只掌握這些技能的程序員太多了。
3 能分析和排查問題,比如出現了空指針,能通過debug找到問題,或者出了jpa的錯誤提示,能把這句提示放網上找,然后再根據提示修改若干代碼和配置,從而解決問題,不過這種技能太雜,以后通過面試跳槽時,無法通過這類技能來展示自己的能力。
4 所謂的項目管理能力,比如會用Maven和Git等,但這些技能可能也就停留在“會用”的層面。
更值得感嘆的是,我觀察下來,這家公司的程序員,有不少是摸魚的,干活僅限于完成功能不出錯,未必還會再去關心其他還談不上值錢的技術和項目開發的技能。
程序員如果干到28或30歲,不能僅停留在只會做增刪改查業務的初級階段,因為如果單憑這些能力,會很輕易地被應屆生,甚至是培訓班學員替換。
如果站在老板的角度,年輕人肯加班,而且更容易被所謂的情懷等洗腦,工資還給得低,相比之下,28歲或30歲的程序員談不上是老油子,但如果干的還是和年輕人一樣的活,那老板很有可能要年輕人。
這里姑且不說大廠java架構師的技術要求,也不說大廠高級開發所需要的能力,就僅僅說下一般公司對高級程序員的需求。
1 能熟悉Spring Boot的相關技能,比如jpa,aop,ioc,restful,junit等,哪怕不熟悉,也應當能在短時間(3天內)內熟悉。
2 熟悉基本的數據庫方面的性能調優,能解決單機版數據庫方面的問題,比如復雜sql,索引等方面的問題。
3 能在linux上看日志,并能通過日志,解決大多數的單機版(非分布式組件方面)問題。
4 能熟悉Redis,Dubbo等分布式組件的用法,至少會api,如果可以,還應當能用這些api開發基本的高并發應用。
5 其他單機版的問題,比如api的調用或問題的排查,哪怕之前沒做過,也應當能通過查網上的資料很快解決。
順帶再說下大廠對高級開發乃至架構師的要求。
1 熟悉各種分布式組件的配置方法和用法,能熟練使用分布式組件開發各種高并發需求,并能熟悉限流熔斷等技術。
2 熟悉軟件發布部署上線的流程,比如搭建mysql環境,搭建redis組件,甚至會docker和k8s。
3 能通過日志,排查并解決OOM,數據庫性能等高級問題,凡是高級開發無法解決的問題,架構師都應該能解決。
如果只會初級的增刪改查技能,在27,8歲之前找工作應該沒問題,畢竟當下有太多的軟件公司,初級開發的崗位也應該有不少。
但有3到5年開發經驗的java程序員應當需要升級到高級,也就是說,如果在27或28歲,依然只會初級開發技能的話,高級開發的面試應該過不了,甚至面試中提到的一些技術連聽都沒聽過。如下給出些問高級開發問題。
1 你們項目用哪些組件應對高并發?怎么解決限流熔斷等問題?
2 Redis集群,或Dubbo集群你用過沒?如果沒用過,你是怎么解決redis穿透,或dubbo優雅停機等方面的問題?
3 你是怎么排查項目中的OOM和數據庫性能問題的?在項目中怎么監控性能的?
要知道,對于我初級開發來說,面試前背java八股文還有些用,但對于Java高級開發來說,只會背八股文,面試一定過不了。
所以對這些在28歲甚至30歲還在做java初級開發的程序員來說,有可能還能通過跳槽漲工資,但由于無法升級到高級開發,在公司里的處境可能就很尷尬了,因為能干的活年輕人都能干,而且人家還能加班。這樣的話,遇到公司運營有問題,還真可能被優化。而且被優化后,甚至有可能連面試機會都沒。
我只憑推測,但這部分的程序員數量應該不少。
1 不少公司可能更多注重業務,在項目開發環境中無法提供分布式等值錢技術的實踐機會,這就導致不少程序員就認為,開發項目只需要用到一些比較初級的技術。沒有機會實踐高級技術,提升也就無從談起了。
2 不少程序員跳槽時可能更多關心薪資,未必會關心公司所用的技術,所以很有可能進入新公司后,薪資有漲,管的人也變多,但用的還是老一套技術。
3 更重要的是,為了能找到能提供值錢技術實踐機會的公司,先得在面試中證明相關技術的項目經驗,要做到這點不容易。
4 況且,不少程序員雖然身處小公司,但加班程度未必比大廠少,往往是忙了一天后,看似很充實,也確實掙到了錢,但哪怕是日積月累,每天干的活都是重復勞動,提升也就無從談起了。
所以,我在我朋友公司看到的一些程序員的狀況,可能就未必是孤例了。不能說大多數小公司的程序員都這樣,但像這樣的程序員還真未必在少數。
這塊,本人還專門寫過文章,講述大齡初級開發該怎么提升。
比起其他行當,程序員確實能有用加班換取高薪的機會,但可以這樣說,程序員確實是一個吃青春飯的行當。
不說其他,就看看每年畢業的應屆計算機專業的畢業生,再看一些大廠的培訓班輸出程序員的數量,就足以讓大多數程序員警惕。
不過天無絕人之路,我本身最近,也幫了不少零基礎程序員入行,也幫了java不少初級開發成功升級,再看看一些大廠也在天天招人,這足以說明,哪怕當前身處小公司,哪怕當前技術能力一般,程序員應當也有機會不斷升級,或者能通過努力進大廠。