24歲了,該怎樣選擇接下來的編程之路?

24歲了,該怎樣選擇接下來的編程之路。

以前走了不少彎路,直至去年中旬才算進入了編程的行業,到目前為止幹了將近一年。

卻對以後怎麼走,越來越糾結,我的編程基礎基本上是斷斷續續自學起來的,現在也只是掌握了C語言而已,自學到數據結構的隊列和鏈表後就沒再使勁了,而且進入了目前的這家公司後,估計還退步了不少。

現任職的公司做的是DSP方面的產品,這個產品國內基本上是沒人做的,另外,也是自己運氣不好,偏偏進入了只有一個老員工做軟體的部門,我是第二個,並且我後面進來的比我還菜,並且這唯一的老員工還不指點一下,什麼東西都要自己去看,就這樣,896的幹了近一年,自己也沒有什麼大的提高。

沒多少進步的原因我分析有以下幾點:

1.我的硬體基礎很差,怎麼控制GPIO口,怎麼設置寄存器的位這些我現在都搞不清楚,水平只是停留在以前自學51單片機的程度;

2.我看datasheet的速度很慢,並且如果裡面的內容牽扯到了硬體的什麼多路復用等概念,我又會理解不了;

3.做的產品實在是太冷門,用的晶元,控制器網上都找不到可以參考的;

4.每天的工作時間都很長,長到天天都是晚上9點到家,早上又以疲倦的身體來上班,我已經很克制自己的私人時間,保證11點熄燈睡覺,但是工作遇到解決不了的難題後或者自己對現狀的憂慮又會讓我失眠,造成的結果是睡眠質量又不行。我本身也不是頭腦特別好用的人,如果精神狀態好,還可以思路清晰的分析問題,一旦犯困或疲倦就會出現思路模糊,難以集中注意力的表現,這就從根本上發揮不了該有的效率。

到目前,我腦海里有兩個不成熟的想法,請前輩高人幫我分析權衡一下,接下來的編程之路該怎麼走

1是做純軟體,我現在對於反反覆復都沒找到方法提高的硬體知識真的無可奈何,所以想做安卓這種不需要什麼硬體基礎的,並且安卓開發的產品也更貼近大眾消費品,另外,如果用安卓開發貼近互聯網介面的APP,編程時就更有所見即所得,所得即能用的快感。

再另外,我時常憂慮我這種學歷一般,家庭沒什麼社會資源關係的人做技術,做到最後,會落下什麼結果,在那些特定硬體平台開發的公司待下去,最後,等我精力下降了,我會不會被這些特定的硬體所限制,會不會只能做這些東西,會不會淪為被社會淘汰的技術人群。

2是專做底層,例如驅動,這種想法是認為做底層的人遠遠比做開發的人少,做別人不做的,就能填補稀缺的位置,從而技術長青。但是這條路和硬體的聯繫更緊密,前期做會不會又完全是自己摸索我心裡也沒譜。現在有個限制我的想法就是,做軟體可以自己自學,而硬體就是需要有人指點。

以上的想法都不是很成熟,請前輩高人指點一番,究竟怎麼走,才能避免浪費時間,避免做冷門的領域。

最後再補充一點,我已經工作快4年了,畢業快三年,之前與編程無關的經歷就不說了,實實在在進入這個編程行業也就一年,現在水平不高不低,只是會用C語言寫代碼,C++也看過幾個禮拜的書,估計不做項目也不足以拿出手,以後的選擇專做軟體和專做底層到底怎麼分析孰優孰劣,或者說哪個更適合我這種情況?


我剛剛被一個同寫6.828的學弟教育了。。。一個月就寫完,太不划算了,很多細節都沒深入了解。

學弟的blog有對6.828的各種分析: Jason Leaster

我太naive了。。。。。。

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

update: 6.828 我的github地址: runshenzhu/6.828-MIT-OS · GitHub

各位可以參考 (以及 star)

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

寫操作系統練手吧

6.828 / Fall 2014

這個課設計的非常好,資料也很全。

  1. OS框架都搭好了,不用關心瑣碎的細節。
  2. 99%的C,1%的彙編。剛好你只會C
  3. 涉及到大量對內存的了解。少量對寄存器的操作。剛好彌補你的不足
  4. 處在硬體軟體交匯的層面,對硬體了解,軟體了解都有一定幫助。剛好你猶豫不決
    1. 軟體方面: 除去鍛煉語言以及 debug 技能。這門課對軟體工程也有一定幫助,模塊化,介面,test case,版本控制都涉及到了。
    2. 硬體方面: 最後一個 lab 是給網卡寫個驅動。別的lab也會涉及到寄存器映射之類的
  5. 代碼量適中。我實習的時候,熬熬夜,一個月左右刷掉。大概 push 了2500行代碼


有個雞湯格言說的特別好:人的差別在於業餘時間,而一個人的命運決定於晚上8點到10點之間。

單純工作能給人的提升很有限,工作更多的是應用你已經學會的東西。工作更大的意義在於幫助發現你自己的不足,然後利用空餘的時間來提高自己。所以首先要停止加班,按時回家,保證自己的空閑時間,看一些自己感興趣的東西。


就事論事,這個工作對於有前途追求的年輕人,實在太辛苦了,你這樣不會有時間資源做發展規劃的。當然你的崗位和就職公司本身的合理性我們不討論,我相信你當初會選擇它,說明你們還是有你們的緣分。

只是你可能到了要換個環境的時候了,在當前的工作壓力下,很難有條件作出好的規劃的。


最近剛從底層轉到上層做應用,說下我的情況給你參考下吧,或許有幫助。

我今年也24,周歲,剛出來工作1年不到,我是專升本,專科念的是電氣自動化,學了點plc,單片機,電路基礎,後來跨專業學的軟體工程

起初會去做底層的原因講出來估計都會笑趴自己,那是2013年,應該是18大召開,有個政策我記得是建設綠色中國,其中有項就是要加大智慧城市的建設,剛好那時候學炒股,然後那段時間什麼智能家居,智能交通類股集體大漲,漲的很厲害的有隻叫遠望谷,好了回歸原題,後來我就認為這個嵌入式絕對大有前途,需求肯定旺盛,成長肯定會是爆發性的,然後我就入了這個坑。一入底層深似海啊,真的很深,看著公司那些接近40歲的老技術,我在想估計我以後有可能就這樣子,沒有歧視,只不過覺得自己耐不住這麼長時間的性子去做底層,打心裡還是更喜歡見效快一點的行業,對,我就是這麼的高(xin)瞻(fu)遠(qi)矚(zao),基於對自己性格的分析,最終一「拍腦門」愉快的決定轉轉轉,於是就從底層轉到上層了,現在在做手游,感覺沒有以前做底層那麼痛苦了。

弱智分析篇(看看就好):之前做底層做到什麼程度呢,最基本的以前在讀書的時候自己學過arm這塊,簡單的驅動會寫,通信介面也都知道,時序都記得很清楚,那時候知道自己喜歡做應用,但是打心裡看不起做應用的,感覺上層沒有底層難,所以找工作找了份做驅動的,對,沒錯,就是在小公司里做無線驅動的調試,基本上也沒人教,底層的知識比較封閉,沒碰上好師傅確實很痛苦,基本上那時候資料網上我也找不著,問年長的也是擺架子的,有點像傳統行業作風,沒辦法,那時候求助群友,群友的回復是,你看datasheet啊,其實他們說的對,大部分答案都能在規格書上找到,所以那時候就自己一邊看規格書一邊翻譯好自己第二次查閱,最後年底的時候把無線驅動給調試成功了,差不多有5個月左右,其中我們技術老大幫了我很大忙,真的很感謝他,人很好,後來覺得自己真的不喜歡底層,太枯燥了,看的規格書,寄存器配置表都是一大串一大串數字,稍微眼花一下弄錯了一個數字,完了,基本上找錯都要找好久,還有就是底層組建團隊難,要想做一個東西出來所需要的成本太高了,遠遠沒有上層學個兩三年大家有個想法就可以湊一起弄一弄,其實歸根結底還是自己沉不下心來,後來感覺熬不住做完那部分工作我就轉上層了,因為以前在學校學過c++,學過java,所以轉起來比較快,現在在做手游開發,感覺還是比較喜歡,所以你喜歡做底層還是上層還是要看自己喜歡不喜歡,這是最根本的原因。

手機碼字無法加亮,望諒解


我不是來灌雞湯的,請聽我詳細的解說下去。

我覺得吧,你這問題唯一的解決方案就是繼續學習

真的,電腦技術這種東西唯一需要投入的就是時間成本,他是最實惠的,性價比最高的技術了。

有一點需要提醒題主,不要被眼前的困難所迷惑住了。

無論選擇那條路,都不能喪失一顆進取的心。

題主,你現在的情況就是被眼前的困難所嚇住了,完全不知所措!!

我一點我需要提醒你一下,你在某個領域工作幾年之後,你的能力和你剛從事這個行業的時候相比較,能是一樣的么?

人是可以進步的!!

當你在某個領域專精了之後,你就是這個領域的專家了。

白岩松曾經說過,一個人的收入和他的可被替代性成反比,當你越容易被替代的時候,你的收入就不會很高,當你的不可替代性非常高的時候,那你的收入就會很高。

這個過程也就是買方市場轉化到買方市場的變化。

比如考古這個領域來說,冷僻吧。但是真正的考古專家少掙錢么?稍稍兼顧點其他的東西,就轉老鼻子了,比如收藏什麼的。

考古專家擁有強大的文化底蘊,干起收藏行業來也比普通的玩家順手多了。

如果你在某個領域的技術能力非常強,那麼你就是搶手人才,那個廠家都需要你。

至於你說的兩條道路。我覺得都不是問題。

現在所說的硬體工程師,那有幾個是被固定到專一晶元上的??

現在的開發出了某些個別領域之外,都是利用的C語言,C語言通用啊,遷移到那個平台都容易,所以轉換平台的事兒,easy!!

況且現在真正的從零開始設計的項目有一個????都是互相借鑒,修吧改吧的就用了。

你從一個項目上學到的知識,遷移到另一個項目上很容易的。大家用的東西都大差不差,原理都是相同的。

如果還是心存疑慮,那麼就選一個通用性非常廣泛的平台吧!!!

ARM,X86,FPGA

這三個都是使用非常廣泛的平台,幹啥都可以的。

可以這麼說,未來一百年,這三個平台地位只高不低,八成不會被淘汰。

至於純軟體,這個東西,更是非常容易的事情。學一門語言,不只需要學習語言的應用,同時還需要學習這門語言的原理啊,編譯器啊,優化啊。這些東西更是一同百通的。

當你將這些東西都掌握的時候,你就是大神!!!!!!!!!!

別懷疑,這是絕對的。

你看我想在正在學JavaSE,早期接觸過C語言,自學的HTML,XML,Javascript,CSS。學校里教的是彙編、VHDL、PLC、C51。

現在更是兼學C#。

你覺得我學的多麼?其實一點都不多,很多語言都是相互借鑒的。

比如C語言和C51就是一個東西,只不過C51涉及到了操作硬體介面罷了。

比如Java和C#,差的都不多,JavaSE掌握的情況下,付出點勞動,基本的C#就掌握了,可以用於實際開發了。

比如彙編和VHDL,他們差的並不多。很多人一聽到彙編和VHDL就被嚇住了,其實我告訴你。VHDL就是一個雜種,他是C51和彙編的混血。

PLC編程就是梯形圖編程,擺弄的是各種個邏輯,這個更簡單,只需要邏輯清晰就可以了。

HTML和XML相同的東西就更多了,都是標記語言,就是寫幾個代碼,網頁排版繪製之類的東西都是瀏覽器給弄好的東西,你就不用操心了。

Javascript這個可以好好弄一弄,不過也不複雜,有過JavaSE開發經驗(任何一種桌面應用開發經驗)的人都可以輕鬆理解。

CSS更是沒難度,只要記住基本的語法,之後怎樣使用就是美學上的問題了。

你看我說了這麼多的東西,真正從頭學起的有幾個?????

這就像是學外語一樣,第一門語言是非常難的,但是之後你多接觸了幾種外語之後,他們之間的相互借鑒就增強了,理解就更深刻了,用起來也就得心應手了。

SO,GO AHEAD!!!!!

無論哪一條路,只要繼續鑽研下去就好了。只要你能力打到了,收入一定會上升的。

那個更適合你這種情況?

我看不出來,你這種情況根本就是沒入門么!!!

幹啥都是白紙一張,那條路對你來說都一樣的好嗎??????

關鍵就看你怎麼想了,喜歡做軟體還是做硬體?

我就不說你的情況了,就說說整個市場的情況吧。

硬體什麼的,國內做的人少,競爭少一些,如果你有能力,更容易出頭吧。

現在都是軟體時代,利用的晶元多是通用晶元,說實在的專門設計一款晶元的時候不多,所以遇到冷僻晶元的機會不多,小的硬體初創公司也不少————————極路由、小米路由、小米插線板……………………~┑( ̄Д  ̄)┍

目標公司:華為、思科、Google、蘋果。

(別笑,目標定遠大一點么!)

軟體行業,只要你有毅力鑽研下去,那就是無極限的!!!!!!!!!!

軟體優化是無極限的,同樣的這個時代對於軟體的需求也是無極限的。技術牛了,你可以初級軟體工程師,中級工程師,高級工程師,軟體架構師,首席架構師,首席技術官。

可惜選擇的公司也多,小米、華為、阿里、騰訊、百度、google、微軟…………

O(∩_∩)O好的

SO , 你想說啥來著?看到這裡,你還有疑問么???????


人走著走著,不免會有些對未來迷茫,對現狀麻木。

對於自己未來編程的路能走多遠,我不敢說。

但是,目前既然選擇了Android開發,那就先把這一件事做好,做透,做的足夠優秀。

我相信所有的事情,一通則百通,前提是真正理解了其中的精華所在。我個人覺得從單純的技術角度出發,編程的精華在於編程的設計思想。

就拿Android開發這個事來說:

1.編程語言:我使用了Java語言,就可以深刻理解JVM的設計原理,面向對象設計思想。

2.程序設計:基於Android的SDK開發,Android源碼就是一個知識寶庫,加上許多優秀的開源框架。以及自己所開發的項目,是非常好的實踐機會。

3.開發工具:AS,git,jenkins等等。

4.軟體工程:迭代計劃,敏捷,版本發布等等。

當把這些吃透後,相信在軟體開發領域是OK了的,當然還需要外在的能力,比如溝通,管理等等。

等在一個領域內做的足夠牛逼,那麼自身的層次就變高了,不管是進入相關領域還是非相關領域,都能夠站在一個相對高的起點開始。

有時候感覺長路漫漫,寫不完的迭代,改不完的bug,學不完的技術。需要不斷的調整自己。


先把題目中的了字去掉


我來說乾貨吧。

如果你希望繼續從事嵌入式方面的工作,我認為以下內容應該會有所幫助。

準備工作:

1.把一切的娛樂活動切換成英文的——玩英文遊戲,看英文字幕,讀英文小說。不要在意自己的英文水平提高了多少,目標只有一個——習慣英文環境。

2.準備好一個穩定的翻牆工具。一切搜索優先使用Google,並且一律用英文單詞作為關鍵字來搜索。

3.要善於尋找工具,善於尋找資料。因為你沒有明確的寫出工作中使用的晶元,我這裡沒法給出進一步的幫助。如果需要的話,你可以把晶元的型號放上來。

軟體方面不要局限在C語言和演算法上,你需要關注以下內容:

1.熟悉你所使用的編譯器的特性,關注一些被普遍使用的擴展功能,例如為函數添加alias。

2.學習編譯的下一步——鏈接的知識。對於嵌入式開發這一點很重要。單片機的文檔里給出了內部Flash的地址與大小,以及內部RAM的地址與大小。這些參數就是在鏈接時進行配置的。

3.了解中斷的實現。當了解了鏈接的知識後,你也就知道了中斷向量表是如何被放在指定的地址當中里的。之後,你就可以根據文檔自行實現中斷向量表。

4.你可以繼續深入探索一下C標準庫調用方面的知識。這樣做的好處是,你可以自行修改替換一些標準庫當中函數。舉例來說,你可以把printf的輸出定位到串口上。Linux下的C庫通常是glibc或是eglibc,單片機上則廣泛使用newlib。

5.學習混合使用C和彙編。為此,你需要關注ABI規範以及內聯彙編,符號導出的知識。

6.學習使用RTOS,或是類似的框架,例如QP——一個基於狀態機的任務管理系統。

硬體方面:

1.學習計算機體系機構的相關知識。——最佳的實踐方式是學習FPGA,通過使用FPGA,你能夠真正的理解匯流排,寄存器地址,時序,時鐘樹等嵌入式開發繞不開的問題。

2.仔細看文檔。

3.仔細看文檔。

4.仔細看文檔。

文檔是極其重要的東西。當你對你所使用的晶元不熟悉時,威力根本發揮不出來。

5.當你對晶元有了一定了解之後,可以開始有針對性的設計一些相對高級的使用模式,例如——

用DMA驅動GPIO輸出。

用DMA+TIMER的方式進行GPIO輸入。

實際上DMA和TIMER都可以玩出相當多的花樣。

當你有了一些想法之後,上Google去搜索,通常都會有意外的驚喜。

6.不要被商業上的分類所迷惑。既然你提到了是在做DSP相關的工作。那麼請仔細去研究一下DSP與MCU的區別究竟是什麼?DSP這個概念究竟是表示什麼?實際上這些問題在你研究FPGA時都可以得到解答。

個人方面:

1.一定要用興趣來驅動。否則稍微深奧一點的東西,又沒有人來拚命灌輸給你,你是絕對無法完成學習的。

2.在任何情況下都不要依據學歷、資歷以及經歷來評估自己,那些東西是評估不熟悉的人時用的。要根據自己的技術水平進行分項評估。

3.不要依賴老員工的指點。因為你沒有判斷是否正確的能力。而且多數情況下,網路上可以找到水平最高也是最可信的資源。(你說你們的產品很冷門,我不確定是否確實極度缺乏資料,但既然你們公司拿來做開發,應該還是從廠家拿到了資料)

現在,如果我的答案里有你不明白的東西,開始去Google。


我覺得樓主自學自學換到互聯網行業吧

反正都加班 工資還高點 機會也多

我以前也學過那些嵌入式的東西 gpio 寄存器 真心覺得無聊啊 datasheet 看到死 最後也是狠下心來從晶元行業跳出來

編程的那些東西資源太多了 coursera udacity 還有一樓推薦的那個 mit csail里的課都非常好啊 做做leetcode

24歲一點都不晚 學半年應該就夠了吧

加油~


樓主自己都說自己硬體水平很差了就不要啃硬體了。連寄存器都搞不明白還是別搞硬體和底層了 浪費時間!現在的年齡是學習的寶貴時間,不要耗費在不擅長的領域。這樣你會走很多彎路,浪費很多時間。

建議你學學C#,或者JAVA。C#上手快,看看書幾個星期的事 。JAVA只會語言沒用還需要學框架和設計模式和MVC,要不然都找不到工作,比C#稍微費電時間。這些都是做企業軟體的,所以看看一點資料庫,學一點SQL語句,找工作能有很多幫助。

如果你C++水平比較好,並且熟悉常用演算法並且會網路編程(soket)或者對操作系統(線程、進程)比較了解 也可以做c++開發 這個一般企業會問你熟不熟悉C++ 的STL 或者用沒用過QT。

我已經把面試有可能問到的相關東西告訴你了,很多其實你只要知道和面試官能聊上幾句其實就有可能得到offer。

為什麼不讓你搞驅動,是因為如果你不了解操作系統(看看《windows系統編程》和內核編程吧)和了解通訊協議(IIC、CAN、PCI 或者 看懂時序圖)基本沒法搞系統編程。

不管幹什麼工作至少先要了解這個工作是幹什麼的、需要什麼相關的知識才可以。沒事多上智聯招聘,看看對應工作要求的信息。這些寫出來的要求,如果連2/3都不了解的話,工作基本沒戲。

下面是一個C++工程師的招聘要求:

崗位職責:1. 在Linux環境下開發,使用C++等高級編程語言編寫後台服務程序,讀取並操作資料庫數據; 2. 編寫涉及數據統計挖掘、信息網路傳輸、證券外匯期貨行情處理等方面的應用程序; 3. 了解業界最新動向,不斷學習最新開發技術並應用於公司各項目的實施與升級; 4. 完成上級交辦的其他工作。任職要求:1. 計算機或相關專業全日制本科及以上學歷; 2. 熟練使用C++編程,有具體項目開發經驗,能夠獨立完成項目需求分析、設計及實現各階段工作; 3. 熟悉資料庫開發,能夠熟練操作、維護MS SQL Server; 4. 了解多線程技術、TCP/IP網路技術; 5. 良好的代碼編寫習慣,做事細緻認真。

通過上面我至少了解到,這個工作需要你會C++,SQL,多線程,網路編程,linux,可能需要會QT(linux常用的編程工具、windows也有 他是跨平台的)

網路編程一般都需要多線程相關的知識,這個基本是想做一個伺服器,每來一個訪問都開一個線程。後續可能用到線程池相關。

你可以看一下想想你需要學習那些知識~~~


少抱怨 多讀書


給樓主打打氣,我是網路安全行業的,屬於傳統軟體行業,去年我組有個寫了三年c代碼的員工覺得行業沒前途,自學三月ios開發,拿到了三個offer,稅後10k,比在公司幹了三年要多。我覺得it技術和潮流變化很快的,現在想某一塊能否干一輩子沒太大意義,我做網安七年了,也曾想過做一輩子安全行業,但行業巨大的差距讓很多傳統網路安全開發人員都轉向了互聯網,多update技能才是王道,緊跟潮流吧,這個潮流過去,就繼續update.你才24.年輕,我們都30左右的還都轉方向呢,呵呵ps:就目前來說,嵌入式還不是很看好,驅動啥的我也做過,工作崗位少,現在大廠一般都提供解決方案,不需要太多的驅動人員了


寄存器如果都不熟悉,一味的用庫,很多問題是解決不了的。是不是可以考慮下轉行,不然就得多花點時間練習,建議樓主嘗試脫離庫,純粹操作寄存器,一個模塊一個模塊練習。


現在二本學校,大三。專業信管。或許是環境因素,這學期以前沒想過自己會去走程序這條路,也不知道自己到底適合不,也沒認認真真的自己敲過代碼。但現在馬上馬上大四,伴隨著就業壓力,所以毅然加入了編程的行列。現在正在從零開始學習Java,準備7月去深圳培訓。現在學得磕磕絆絆,真是從零開始,很多次想放棄,因為我不知道自己到底適合編程不。但迫於壓力還是選擇了堅持,現在時常猶豫。。。。。。。

額,發現有點不對題,嘿嘿,看到了樓主的問題,有點感慨,就答了,與樓主共勉。。。


強烈建議樓主不要搞硬體嵌入式方面了,真的是男怕入錯行。去搞個目前熱門的ios或者遊戲開發什麼的吧,容易學,需求大,工資高,有發展。


以下僅代表個人觀點,我覺得樓主適合軟體,java編程,android開發,對硬體要求不高。而且可以跟c語言接軌,上手不難,至於長遠來看的話,就不清楚了,得問前輩了。

我是應屆畢業生,前幾天剛剛成為二本生,曾經參加過4個月的嵌入式培訓。現在正在找工作,也很迷茫,不過個人覺得樓主可以參加安卓方面的培訓,有人引你入門,還是比較快的。而且安卓方面比嵌入式更有優勢。


應屆生,剛開始刷蕭大大的編程入門指南 v1.3 - 蕭井陌的專欄 - 知乎專欄


這樣啊,你都24歲啦呢,是該好好找個工作了,要體面一點的職位,

啊,我忘了,你可以來做項目經理呢!


看了你的問題和描述,我理解的是你的硬體基礎知識不夠。先把基本的數字電路搞明白,DSP的寄存器中斷等基本概念搞清楚,還有其他的信號系統和數字信號處理的基礎知識也是必須的。


你好很年輕,路還很長,但要有一個好的職業規劃,公司的選擇很重要,項目經歷的不同會讓你的價值也不同,要有自己的一個長遠規劃,然後就是腳踏實地的一步一步走,要想成為高手至少要10年的時間,到你34歲的時候,如果你還一直堅持編程的話,你會有很大收穫。看問題的高度與深度也會不同。


推薦閱讀:

你為什麼想打產品經理?
三年經驗的軟體工程師和十年經驗的軟體工程師有什麼本質的差別?
office安裝報錯,已用官方清理工具清理,但是仍然報錯是怎麼回事?
Developer思維和Engineer思維有什麼區別?

TAG:互聯網 | 程序員 | 軟體開發 | Android開發 | 信息技術IT |