比如,借助算法庫里的 MD5 算法和 OS 提供的目錄遍歷API,把系統(tǒng)所有要害文件(應用程序、DLL、注冊表等)的大小、修改時間、數(shù)字摘要都算出來、儲存到一個文件里。以后每隔幾天遍歷一次,檢查它們的大小、修改時間,如果有變化就計算數(shù)字摘要——也可以強制計算所有的數(shù)字摘要——從而找出哪些要害文件被修改了、這些修改是系統(tǒng)自己打的補丁呢,還是不法程序(病毒木馬流氓軟件等)的非法修改。這就是一個極為簡陋、但效果還行的反病毒工具。它的缺點是,這是個白名單工具,只能檢查到通過修改要害文件獲得執(zhí)行權的病毒/木馬,同時會對系統(tǒng)更新產生誤報。但仍然不失為一個效果不錯的系統(tǒng)問題排查工具——因為 OS 要害文件經常是好些年不變的(現(xiàn)在你知道為何有時候有的殺毒軟件會殺系統(tǒng)文件甚至殺自己了吧?)。再比如,利用現(xiàn)成的深度學習庫/語音識別庫搞一些貌似高大上實則沒什么技術含量的人臉識別/語音識別/聲線識別程序——別緊張,你能行。能折騰這些,你到公司基本上就可以算是個“能人”,可以跟風做一些聽起來很帥但其實仍然沒什么技術含量的工作了。
比如圖形圖像壓縮,比如加解密算法,比如網絡協(xié)議棧等,每一個子領域都夠很多專家投入一輩子的。不過這些領域經常返璞歸真,C 反倒會成為更常用的語言;而且往往需要高等數(shù)學作為發(fā)動機。比如著名的卡馬克牛頓迭代法求平方根的倒數(shù)算法,其中用的魔幻數(shù)字就引出了好幾篇論文。專家們用卷積找出了一個魔幻數(shù)字,但是效果不如卡馬克數(shù)字。再后來有人暴力窮舉,這才找出一個優(yōu)于卡馬克魔幻數(shù)的新數(shù)字來。再比如,現(xiàn)在的 CNN 神經網絡,有次我提到要理解它你得懂卷積;于是跳出來幾個自以為很懂的出來杠我“我敢打賭,你是聽到這個東西的名字里有個卷積于是胡亂腦補。其實這東西和卷積沒半毛錢關系”……他們不知道,CNN 里面的確沒有卷積符號、也沒有使用卷積計算公式;但它的實現(xiàn)思路就是卷積運算。只不過它的設計者把卷積算法化用進簡單的連續(xù)矩陣計算中,在深度神經網絡中實現(xiàn)了“特征抽象和特征空間變換”——這是矩陣和卷積全都學到出神入化、用出來讓普通人看不懂、但內行一看就知道還是新瓶裝舊酒的結果。其實前面提到的數(shù)據(jù)結構與算法等基礎知識,會玩的同樣能玩到返璞歸真。比如有人隨隨便便三兩行代碼就把一個數(shù)組變成了環(huán)形緩沖區(qū),或者簡簡單單兩行聲明就搞定了一個遞歸算法。如果你積累不夠深厚、頭腦不夠靈活,這個東西就很難看懂。總之,這個領域是屬于創(chuàng)造者的。能踏入這個領域,那就不是你找工作,而是工作找你了。綜上,如果僅僅是學 C 這門語言的話,學到什么程度你都不好找工作。你需要學的,是用 C 這門語言去解決問題。能解決課后練習題是一個水平,能刷網上的算法題又是一個水平;能自己搞定簡單的實用項目是一個水平,能充分利用操作系統(tǒng)以及第三方軟件/庫給你提供的抽象(意味著你能理解他們的設計思路)實現(xiàn)幾乎所有東西又是一個水平;理解各種東西背后的原理是一個水平,把這些原理玩的出神入化又是一個水平;學會用數(shù)字認識這個世界是一個水平,能夠化用高深的數(shù)學知識、信手解決沒人說得清的難題又是一個水平……一般來說,只要你能達到“用 C 解決簡單問題”的水平,找工作就不成問題了;只是受限較多,只能從事一些較為初級的工作,極易陷入沒日沒夜機械的寫代碼的窘境,然后看著層出不窮的新技術欲哭無淚。你往前趕的越多,你代碼里的智慧和靈氣就越多;此時你才可以嘗試那些必須用巧力的工作,或者用巧力把繁重的工作變得簡單、甚至促進你所在公司乃至全人類的開發(fā)效率。玩到這個程度,你才算真正踏入程序員的行列。