我的自學經歷

我的自學經歷

這篇文章本來是回答一個朋友邀請寫的。 原文知乎用戶:自學計算機編程的人來說說自己的經歷?。 就作為我在知乎寫的第一個文章吧。

上個世紀80年代開始學編程,小學。英文單詞沒學過, 字母都按照拼音記的。用父親(大學教師,機械專業,不懂計算機。。。)書架上的《Basic語言教程》(大學教程,此書仍然健在。最後有照片)自學Basic語言。從Laser 310開始, 電視機當顯示器。最喜歡做的事情是花幾十分鐘以上的時間用鍵盤輸入一個遊戲,比如激光炮打飛碟,然後用剩下的時間打遊戲。。。 Laser 310默認是不帶外存, 輸入的程序關機就沒。。。。每次都要重新輸入,樂此不疲。

80年代末開始接觸IBM PC XT, 用DOS系統,可惜沒學多久就沒機會上機了。

90年代考上大學,由於高考志願填寫了服從分配,被分配到於計算機徹底無關的系(保密),為了學習計算機,父母買了第一台電腦,聯想486。 當年一萬多元的奢侈品。買電腦的錢是家裡攢來支付自費大學的學費的。 好在高考還湊合,考上公費了。這錢沒用就買電腦了。

從Foxbase學起,憑著小學Basic的基礎三天時間搞定Foxbase, 然後發現這已經過時,果斷換Foxpro 。 去書店看書學習(書太貴,買了電腦不好意思再買太多書)又學習幾天,然後把軟盤上的foxpro例子都看懂。也都運行了一遍。發現書店的書太老,開發方式過時,影響開發效率。 根據例子重新自己總結,用設計器來開發。 開發效率大幅提高。 當年寒假,用一個假期寫了《賬務管理》軟體給母親(會計)。支持現金賬銀行帳。 這軟體一直用到母親退休。。。。

Foxpro 用了一段時間,發現windows很好啊。 於是改windows 3.1+ foxprow。 可惜內存只有4MB 運行起來很卡頓。不捨得給父母增加負擔,所以一直沒升級。 就這麼對付用著。。。 後來將自己寫過的dos版本程序都改成了windows版本。

學校開輔修課,有同學學習pascal學不明白,問我。。。我也沒學過,於是上政治課借了他的書,學了一堂課,下課幫他解決問題。 感覺學習一種新的語言就這麼容易? 很是得意,於是感覺掌握多種語言很牛X,於是開始學習其他語言。ADA,cobol,LISP。。。。基本上把圖書館能借到的語言書都看了一遍。學了一大堆用不上的語言。 但一直沒敢學C,因為聽說這個很難學。

這期間還迷上了遊戲,F117, 這是飛行模擬遊戲,DOS下的。。打了一個學期遊戲。

然後決定痛改前非,學習。。。 決定選擇最難學的C, 於是用了一周的時間,認認真真的把譚浩強的大作《C語言》學了一遍。 指針部分倒是很容易搞定,於是更加驕傲。。。。 開始用TurboC2.0寫程序,很快就發現更好的編譯器,改用Borland C 3.1。 主要寫殺毒軟體(當年機房用軟盤拷貝自己的程序,並且病毒盛行)和加密軟體(給foxpro app程序加密) 仿照KV100等根據自己的推測,寫查毒程序。 期間中了一次「火炬病毒」,看到了傳說中的火炬,硬碟主引導扇區被毀。好在有軟盤,用了一天時間恢復。。。

為了能更低層,又學了點masm彙編, 寫了一個能從軟盤引導的簡單小程序,但沒找到資料去解決64K以上內存定址問題(沒有互聯網學習很痛苦), 沒有繼續完成計劃中的操作系統。但從此自我感覺良好,覺得無所不能了(其實還很菜)。。。後來又用C++ 寫的C語言解釋器,存粹為了裝X寫的。 支持頭文件,for,while,if, do while,子函數,但沒有main函數(作為入口的C文件中不包含在任何函數的部分就起到了主函數的作用)、沒有宏定義,沒有GC,因為沒有malloc函數。。字元串是內置類型、解釋器基於堆棧。。。 這個解釋器最大的特點是沒用yacc、flex,bison之類工具的,也沒用正則表達式,直接用字元串處理搞定的。 不用這些工具是因為當時沒讀《編譯原理》,根本不知道這些工具的存在,也沒有互聯網、沒有開源軟體可以參考、也不知道正則表達式這個事情。。。這個程序寫完後運行良好,當時沒啥用,完成裝X功能後就沒再管它,但成了幾年後我寫的IVR的流程解釋器。這個C語言解釋器最大的缺點就是性能很低。 從dos的C轉到windows下的C,選擇了Borland C++ Windows版本。 於是碰到了第一個釘子。 沒買書,在書店看書,然後回家寫。。。這個在dos下很好用的省錢高招,在windows下不那麼好用了, 這個windows GUI機制複雜很多, 而我選擇了BC,所以沒有好用簡單的MFC, 因此windws程序沒寫明白。。。。哦,還學完了我從計算機系哥們借的計算機相關幾乎所有專業課教材。那一年還獲得了學校獎學金。飄飄然……

然後到了畢業設計的時候,我的論文與分析化學相關(可以猜我的專業了)。。。空餘時間參加了zeos系統開發,主要負責寫知識庫一部分,這個項目讓我第一次接觸到搶先多任務系統和分散式系統。在寫論文期間還認識我的另一半。答辯的前一天勇敢表白,並一直幸福的在一起,直到今天。

大學畢業 ,我沒有服從分配(我是統分統招生,那年代大學生還是國家負責分配工作的,畢業後肯定有工作的。。。現在的年輕人可能都不知道這個事。。。)自主擇業找了一家網路公司,當時的主要工作是樓宇綜合布線。

工作後開始了更加瘋狂的自學歷程,白天工作,晚上回家學習,沒有互聯網的年代用空閑時間寫了一堆各種軟體。什麼新出來就學什麼比如98年學Java,99年web。後來一度迷上了C#。

工作後感覺自己動手能力湊合但學術能力有限,想搞科研,計劃讀博,順利讀研,但碩士畢業了我家寶寶也出生了,生活壓力已經無法繼續任性,只好放棄讀博繼續工作。

在工作的20多年裡面,主要是用C++,開發了十多年的各種中間件,各種網路伺服器。還穿插C/S管理系統,B/S管理系統,操作系統,後來迷上了單片機,開始學avr,pic,51,arm7,arm9,m3等等,也自己做PCB設計,焊接,調試,在此期間用ARM9+AVR組合做了基於TCP網路的醫院防漏費設備。後來工作需要開始搞FPGA演算法開發,高性能計算,BOSS系統,分散式計算,GPU演算法優化,計算機/機器視覺,機器人,網路工程,綜合布線, 大數據等等。只要有需要就去學,學的越多也就學的越快。

所有都是自學。 大學本科、研究生的計算機課教的也都是我自學過的課程。 雖然從事的工作看起來很雜,其實主要精力仍然在網路和計算機視覺演算法。前些年還發布了兩個開源項目,也參與了幾個開源項目,算是為開源貢獻了一點微薄之力吧。

早就是管理崗位,不需要實際寫程序,但是寫演算法,寫程序仍然是每周必備工作。 這是愛好,也是保持狀態。個人認為好的技術管理必須具有足夠的技術水平,有深度和廣度,缺一不可。必須跟得上時代,必須了解先進的技術。即便自己無法去做,也要有足夠的了解以便以後決策使用。

現在我的研究方向放在自主機器人的視覺感知部分,重點是雙目視覺。 在雙目演算法方向,我們的研究包括兩個主要方向,一個是高性能,低功耗的嵌入式方向。現在的產品功耗2W,30fps,640*480解析度。攝像頭本身可以直接輸出深度圖。已經完成大多數工作。 正在解決細節小問題。

另外一個方向是高解析度,注重深度圖效果的雙目演算法,現在可以在英偉達 GPU做到實時1080P 深度圖輸出。也能在TX2平台達到640*480 30fps輸出。 效果要遠遠好於ZED camera。

這是老圖片了,手機里只有這個,新版本要效果更好

最後,我認為自學是計算機行業必要的技能,而且是最重要的技能!


推薦閱讀:

國內目前最詳盡的ACSM CPT(美國運動醫學會私人健身教練)自考備考攻略
8提升自我能力的學習網站,全是精品高質量!
深度學習自學指南:6個月,從基礎知識到模型構建
新視野大學英語第三版視聽說教程2鄭樹棠外語教學與研究出版社 習題答案
【想學平面設計的都進來】自學能學會平面設計嗎?

TAG:自學編程 | 自學 | 軟體開發 |