全面理解操作系統(tǒng)、網(wǎng)絡(luò)、數(shù)據(jù)結(jié)構(gòu)、算法、C語言(摻雜一些硬件知識)、數(shù)學(xué)在計算機(jī)中的應(yīng)用、軟件本質(zhì)、軟件工程本質(zhì)。
但方面會上面知識,比較單一。就如某一段時期,我只會java,眼睛看到的也只是java。就如java網(wǎng)絡(luò)編程,涉及底層網(wǎng)絡(luò)編程。我自修過一本java網(wǎng)絡(luò)編程方面的書。有一次用用底層網(wǎng)絡(luò)組件調(diào)SGIP(聯(lián)通短信網(wǎng)關(guān)協(xié)議),出現(xiàn)一個問題connection Reset,很長時間沒想明白為什么?看過的java網(wǎng)絡(luò)編程也找不到答案。如TCP消息流這概念該怎么理解,流無邊界,無邊界會怎樣?所有種種引發(fā)的一序列問題,如果多TCP/IP理解不到位,不遵循一些規(guī)律,的確很難處理。再如java網(wǎng)絡(luò)底層編程有一個選項,可以控制TCP層往應(yīng)用層投遞的數(shù)據(jù)閥值,好多小伙伴應(yīng)該都不知道。網(wǎng)絡(luò)理解清楚,對高并發(fā)系統(tǒng)的一些設(shè)計理念順理成章能理解。當(dāng)然,好處還有很多。很多TCP/IP僅僅是基礎(chǔ),了解一些就行。我對TCP/IP了解,包括它通訊的細(xì)節(jié),各層協(xié)議,各層數(shù)據(jù)封裝,都完整理解。寫過底層網(wǎng)絡(luò)編程方法技巧。TCP/IP來龍去脈絡(luò)了解得相對清楚。
至于操作系統(tǒng),很多小伙伴以為,會點會用,會敲幾個命令,就了解操作系統(tǒng)?我了解更多的是UNIX/LINIX,不限于命令使用。了解理念,了解概念,了解使用方法。到這層僅僅是基礎(chǔ)過關(guān),有系統(tǒng)理念很了不起的事。自學(xué)的,很多概念搞不清,比如進(jìn)程程序的論述。就找了一本UNIX環(huán)境高級編程。第一遍看的思路理解概念??瓷钊氩胖繮OSIX,SUS這些規(guī)范。第二遍認(rèn)真看,搞清楚GCC的用法,POSIX規(guī)范,SUS規(guī)范,C語言規(guī)范的異同與聯(lián)系。我對C語言理解更進(jìn)了一層。這里不得不提一下,系統(tǒng)編程中要理解的概念遠(yuǎn)比使用得概念要多。系統(tǒng)功能遠(yuǎn)比我們想的要強(qiáng)。實例多路復(fù)用(multi-plux),搞java的好多小伙伴理解不清楚,我能很好的理解。IO模型,操作系統(tǒng)中說了一部分,另外一部分在網(wǎng)絡(luò)編程中。如阿里的某個工程師說過異步IO,同步IO模型那些圖來源UNIX網(wǎng)絡(luò)編程(美,Steven,寫的書中),我的理解不差。
數(shù)據(jù)結(jié)構(gòu)與算法,任何程序語言,都已經(jīng)實現(xiàn)了大部分常用數(shù)據(jù)結(jié)構(gòu)與算法。java普通容器類、并發(fā)容器類,Collections與Arrays工具類;js數(shù)組對象,對象;C 的STL模板等等,無不與數(shù)據(jù)結(jié)構(gòu)與算法相關(guān)。不說去寫算法,了解該只是塊最低限度可以正確選擇要使用容器??慈萜髟创a至少也少一些障礙。當(dāng)然精進(jìn),可以看看算法導(dǎo)論,程序設(shè)計藝術(shù)。如大數(shù)據(jù)分析,就需要自行設(shè)計算法。算法導(dǎo)論中講的一個例子,最大子數(shù)組問題,刷新我對算法設(shè)計的認(rèn)知(至少兩個有效算法可以解決)。計算機(jī)程序設(shè)計藝術(shù),難度稍高,有能力可以看。看完怎么設(shè)計一個操作系統(tǒng)可能都會有思路的一本書。
C語言,為什么重要?與硬件靠得更近,操作系統(tǒng)API,網(wǎng)絡(luò)設(shè)備API均是C語言做的。更深入理解操作系統(tǒng),TCP/IP離不開它。操作系統(tǒng)、TCP/IP理念搞清楚的時候,留了很多疑問,老師也沒講清楚過(聽自學(xué)視屏,講課的老師)。如程序究竟怎么跑起來的?TCP/IP究竟怎么封裝數(shù)據(jù)并發(fā)送的?答案在UNIX系統(tǒng)高級編程與UNIX網(wǎng)絡(luò)編程中,部分涉及通信原理(我學(xué)通信的,自學(xué),老師講課有講過物理層,能聽懂)。程序運行起來,尤其線程運行與編譯器有關(guān),再深也不理解,我類比main函數(shù)的運行機(jī)制(懂C應(yīng)該知道C語言的main究竟是怎么被執(zhí)行的)。
C語言涉及到對硬件理解(其實要結(jié)合操作系統(tǒng)理解較好)。對IO,多線程編程,并發(fā)編程的理解會上一個臺階。如java中說的并發(fā)理念,很多我覺得莫名其妙就出來了。如監(jiān)視器鎖那來的?java IO模型,不理解底層概念莫名其妙出來。事件通知模型,了解操作系統(tǒng)的同學(xué),應(yīng)該悟性得出事件/通知模型,借鑒了操作系統(tǒng)理念。還有java Exception實際上是通知模型。扯遠(yuǎn)了,這里硬件主要設(shè)計CPU,內(nèi)存,外部存儲的理解。其中CPU與內(nèi)存與并發(fā)并發(fā)編程息息相關(guān)。
數(shù)學(xué)與算法息息相關(guān),算法導(dǎo)論中提到的算法分析用到不少數(shù)學(xué)知識。我最震撼的是,傅立葉變化,積分等高數(shù)知識在計算機(jī)科學(xué)中有應(yīng)用。以前傻傻認(rèn)為計算機(jī)編程不會超過高中數(shù)學(xué)知識(淺?。?。數(shù)學(xué)與整個計算機(jī)體系設(shè)計也息息相關(guān),見計算機(jī)程序設(shè)計藝術(shù)。更何況現(xiàn)在的人工智能,工業(yè)互聯(lián)網(wǎng),大數(shù)據(jù)數(shù)學(xué)應(yīng)用會更廣泛。我最大體會,算法分析與算法設(shè)計數(shù)學(xué)是真真切切有用。
軟件本質(zhì)是開發(fā)出來解決某些問題,重在使用,有些時候必要太在于怎么組織代碼,實現(xiàn)功能優(yōu)先。大道至簡,同時也中和一下我們團(tuán)隊就是有人把代碼組織不好,我想跟他們激辯的沖動。
軟件工程,大多是方法論,主要目的解決軟件快速開發(fā),快速部署,快速交互,迭代交互提高軟件質(zhì)量,等一些問題。如設(shè)計模式、開發(fā)工具(比如maven)、部署工具(如docker)、代碼質(zhì)量掃描器、程序類、方法、變量命名規(guī)范,敏捷開發(fā)方法等等。我們團(tuán)隊沒好的規(guī)范,也規(guī)范不我來,有時候沒話說。
以上我說的僅僅是點,稍微帶了點線。如果把以上知識穿成面,當(dāng)然需要充分理解。會產(chǎn)生1 1>2的效果。
因為以前規(guī)劃架構(gòu)路線,舉一些相關(guān)例子。
java虛擬機(jī)不好理解吧?用前面知識很泳衣理解。
微服務(wù)的協(xié)議,理念不好理解吧,用上面內(nèi)容來理解也沒那么難,尤其是分布式鎖。
瀏覽器的實現(xiàn)原理,不好理解吧,基礎(chǔ)好可以猜8/9不離10。
nginx高并發(fā)配置,上面的知識也可以很好解釋。
站內(nèi)很多架構(gòu)師,我問單機(jī)單進(jìn)程如何實現(xiàn)高并發(fā),號稱阿里PX、騰訊TX不理我。
我平時寫程序從上面獲益更多,都是小技巧不好說。
最牛的是,上面基礎(chǔ)搞好,比能連城面(融匯貫通),學(xué)新技能速度超快。因為有本質(zhì)的理解,能不快嗎?看別人寫的組件源碼也有很大幫助。
我對比過清華計算機(jī)本科、碩士、博士教學(xué)計劃中專業(yè)課程設(shè)置,后續(xù)提升離不開上面本質(zhì),清華作為我國最牛計算機(jī)教學(xué)機(jī)構(gòu),他的教學(xué)計劃參考價值很高。
最后,我的工作以java,java script,html,css,Lotus這些東西為主。計算機(jī)知識幾乎全是自學(xué)的,有不當(dāng)或不足之處大家辯證看。
聯(lián)系客服