首頁>科技>

1、第一次程式設計能力突飛猛進,是在記住300多個函式之後。

我是2005年初自學C語言,然後找到的第一份軟體開發工作,開發Windows 98上的寬頻接入客戶端。

C語言裡沒有圖形介面的東西,要做GUI應用,得呼叫Win32 API或者使用MFC,我是一概不懂,所以一開始就比較懵逼,不知道從何入手。後來在老司機指點下,買了Windows GUI程式設計的三大神作——《Windows程式設計》、《Windows核心程式設計》和《深入淺出MFC》。然後,白天在單位老司機指點下寫程式碼,晚上回到租住的地方啃書,寫測試程式。週末沒事兒也都在啃書,寫程式。

很快把這些書裡與工作相關的內容都啃了兩遍,但工作起來,還是有一個障礙——面對某個功能,想不到用什麼模組什麼函式去實現。

嘿嘿,這個是很多初學者都會碰到的鴻溝,浮光掠影學了不少東西,真動手時,想不到該用哪個。

怎麼辦呢,問同事。比如問“怎麼建立一個視窗”,他會告訴我,“用CreateWindow”。再問,“這個函式怎麼用?”他會告訴我,“去查MSDN”。

於是我就知道了還有MSDN這個玩意兒,下載下來,沒事兒就找函式,看它的用途,記它的引數。

大概兩個月後,我記住了幾百個函式,什麼CreateWindow,CreateWindowEx,BeginPaint,DispatchMessage、SetWindowLongPtr、RasDial、CoCreateInstance、timeSetEvent、DirectDrawCreate、CreateSurface……都深深地印在了腦海裡。

於是,奇蹟出現了:每當要實現一個什麼功能,我就能直接想到用什麼方法,然後一查MSDN,很快就搞定了。

再接下來,身邊的老司機想不起來哪個功能對應哪個函式,也會問我,我可以迅速說出函式名字和引數以及返回值。

那段時間的感覺,特別棒,好像跨過了一道坎,一下子能輕鬆搞定工作了,一下子在團隊裡有了價值。

這也是這段經歷,過去了十幾年,我還印象這麼深刻的原因。

這段經歷也讓我意識到:記憶API,理解API,建立API和應用場景之間關聯詞典,是學習一種新的開發技術的基本功。

所以後來再學到Qt、DirectShow、D3D、ffmpeg、WebRTC、Skia等技術時,我如法炮製,下一番笨功夫,然後很快就可以用起來。

◇◇◇

2、第二次程式設計能力突飛猛進,是在讀完Qt原始碼之後。

有一段時間用Qt寫網路程式,用QTcpSocket從伺服器接收資料,遇到一個問題——程式執行時經常出現記憶體溢位導致的崩潰。

查來查去,不知道怎麼回事兒,分配記憶體和釋放記憶體都是結對的,沒有明顯的記憶體洩漏,後來用valgrind啟動程式檢測,在一堆記憶體問題中,也沒找到自己程式碼有記憶體洩漏。

沒辦法,就去讀QTcpSocket和QAbstractSocket的原始碼,還讀了封裝起來的平臺相關的網路實現,後來發現,socket裡面有一個buffer,是會動態增長的,你不停的塞資料,它就不停的分配記憶體,永不停歇,直到溢位崩潰。

然後就順著這個線索往應用層面回溯,發現Qt實際上提供了一個設定快取大小的方法,呼叫了一下,問題果然就好了。

後來這個程式又遇到了效能問題(當時在128M記憶體的電視盒子上開發),還是讀原始碼,找到了怎麼減少記憶體複製次數的解決方案。

這次經歷後,我就開始系統閱讀Qt原始碼,把幾個核心模組,Qt Core、Qt Network、Qt GUI、Qt多執行緒等,都通讀了一遍。

讀完之後就發現,哎喲,之前開發中遇到的各種疑難技術問題,都能手到擒來解決掉了。甚至我還基於那個128記憶體盒子廠家提供的圖形API,寫了一個橋接Qt和盒子顯示卡的驅動模組,讓整個盒子的圖形效能獲得了大幅提升。

再後來,因為對Qt的系統理解,我就寫了兩本Qt開發的圖書,《Qt on Android核心程式設計》和《Qt Quick核心程式設計》。

這段經歷讓我意識到,閱讀開源框架的原始碼,理解開源框架的設計原理和實現細節,根據自己的應用場景定製、擴充套件框架,是從一個API Caller變身特定方向精通者的必經之路。

再後來,我在專案中引入開源類庫,都會找時間去讀它的原始碼,像ffmpeg、mplayer、vlc、WebRTC的原始碼,我都讀過。

◇◇◇

這些都是陳年往事了,現在我已經轉型,主要圍繞職業規劃做三件事——諮詢、寫作和課程。如果你在職業發展、職業轉型或者Offer選擇方面有困惑,可以來約我的一對一諮詢。

17
  • 整治雙十一購物亂象,國家再次出手!該跟這些套路說再見了
  • 協同管理軟體及雲服務的領先廠商致遠互聯