面试官,你考我那么多基础知识干什么?
本文轉(zhuǎn)載自公眾號? 大飛碼字
經(jīng)常有同學(xué)跟我說,很多的基礎(chǔ)知識學(xué)過就忘,?比如操作系統(tǒng)、數(shù)據(jù)庫、網(wǎng)絡(luò)協(xié)議等方面的底層原理。而這些往往都是技術(shù)面試必考的內(nèi)容。
每次被問到這個,我都不知怎么回答,跟他說多看幾次,就記起來了??--- 這似乎是一句廢話,但好像又對,細(xì)細(xì)想來,這后面還是有不少思考的。
我覺得很多同學(xué)在基礎(chǔ)知識上的問題,不是技巧的問題,而是對基礎(chǔ)知識的態(tài)度和理解的問題。
所以,這不是一篇教你怎么學(xué)基礎(chǔ)知識的文章,而是告訴你基礎(chǔ)知識的價值和基礎(chǔ)知識在程序員腦海中的演進(jìn)過程。
對于操作系統(tǒng),數(shù)據(jù)庫,網(wǎng)絡(luò)等基礎(chǔ)知識的學(xué)習(xí),看書,做筆記是必要的。不過我在這里不教大家怎么看書,怎么做筆記,我估計讀過大學(xué)的同學(xué),這應(yīng)該不是大問題。
很多人糾結(jié)的問題在于基礎(chǔ)知識老是看了又忘,然后發(fā)現(xiàn)工作上好像也用不到,就開始質(zhì)疑基礎(chǔ)知識的價值,質(zhì)疑到底該不該花時間去學(xué)。
所以先要認(rèn)可基礎(chǔ)知識的價值,意識到了基礎(chǔ)知識的價值后,你才會愿意花時間去學(xué)習(xí)。
基礎(chǔ)知識的價值
基礎(chǔ)知識的價值,我覺得有兩個部分。
一個是技巧層面的價值。
拿操作系統(tǒng)里面的線程和進(jìn)程來說,線程和進(jìn)程是cpu調(diào)度的基本單位,是代碼的一種動態(tài)呈現(xiàn),只要你寫代碼,就一定會涉及到線程或者進(jìn)程。當(dāng)然在實際使用中可能被框架包裝了起來,給人的感知很弱,但一旦你的程序有問題,你總是要用些工具來查看的:查看是那個進(jìn)程出了問題,要從內(nèi)存占用,cpu 占用,磁盤讀寫等來初步分析問題。
以上這個過程,是稍微有點(diǎn)技術(shù)含量的工程工作都會涉及的。上面例舉的例子,你可以擴(kuò)展到 操作系統(tǒng)鎖,數(shù)據(jù)庫表,數(shù)據(jù)庫索引,數(shù)據(jù)庫鎖,數(shù)據(jù)庫事務(wù),TCP/IP , HTTP,websocket 等等。
就工程方向來說,幾乎每個方向都要掌握相應(yīng)的基礎(chǔ)知識,只是每個具體方向?qū)γ糠N具體基礎(chǔ)知識掌握的深入程度不一樣。
像做分布式存儲的同學(xué),對數(shù)據(jù)庫表,數(shù)據(jù)庫鎖,數(shù)據(jù)庫事務(wù)這些的理解肯定是要很深入的;前端的同學(xué)對數(shù)據(jù)庫相關(guān)概念的理解可以要求低些,但對網(wǎng)絡(luò),TCP/IP, ?HTTP , HTTPS 這些的要求就要高很多。
一個是思維層面的價值。
除了技巧層面的價值,還有思維層面的價值。
怎么來理解這個事情呢?軟件設(shè)計,有很多核心的設(shè)計思想,其實是相同的,這些基礎(chǔ)概念,其實也是前人設(shè)計和總結(jié)出來的。
比如說線程和進(jìn)程,這些概念不是自然原理,而是一種工程實踐后的軟件抽象,是前人抽象出來的一個結(jié)果。它的設(shè)計背后,蘊(yùn)含很多優(yōu)秀的設(shè)計思想和設(shè)計原則。
一開始的時候,你只知道這個概念,可能理解起來都覺得很困難,只能死記硬背,但就像我們小時候?qū)W習(xí)古詩詞,它會給你帶來潛移默化的影響。你腦子里一直裝著這些概念,實際工作和學(xué)習(xí)的時候,遇到相關(guān)的問題,你可能就會有點(diǎn)小思考,日積月累,你對它的理解會越來越深。這種理解,我覺得就在不斷塑造著你的技術(shù)思維。
基礎(chǔ)知識的演進(jìn)
說完了價值,我來分享下,基礎(chǔ)知識在程序員腦海中的演進(jìn)過程。
我覺得對于操作系統(tǒng)和數(shù)據(jù)庫,光看書幾乎是學(xué)不好的,因為能做的就是背概念,但背完很快就忘記了。
我上操作系統(tǒng)課程之前,看過 linux 的源代碼。對于操作系統(tǒng),因為我花了很多時間在 linux 內(nèi)核上,所以上操作系統(tǒng)課的時候,很多概念對我來說反而是一個匯總,把我很多離散的知識給匯總起來了。
所以我看進(jìn)程,線程這些概念的時候,不是抽象的而且具象的,腦子里甚至可以具體到代碼層面。
但很多人沒有我這么一個經(jīng)歷,所以看起來一臉懵逼也正常。就像我在大學(xué)看數(shù)據(jù)庫的時候,我也覺得很抽象,看了就忘,直到我后面自己去做存儲,對很多的概念才慢慢地理解深入,開始有感覺。
但這里不是說就不去看了,不看,你就一直都不會知道,甚至連基本的思考都沒有。
對于基礎(chǔ)知識的學(xué)習(xí),其實是循環(huán)往復(fù)的過程,不是一次性就能掌握的。對于這類知識的掌握會經(jīng)歷這么一個過程:
概念 -> 理解 -> 實踐中的思考 -> 概念 -> 理解 -> 實踐中的思考 ...
這是一個循環(huán)往復(fù)的過程,但不是重復(fù),而是螺旋式地深入,每一次循環(huán)都能夠帶來更深入的理解。
我們說一個人技術(shù)很牛,有很大部分是因為他對很多的知識點(diǎn)經(jīng)過了很多次這種循環(huán),他對基礎(chǔ)知識理解的深度要高過很多人。
軟件技術(shù)有兩個關(guān)鍵,一個是抽象,一個是分層。
其實你會發(fā)現(xiàn)很多的概念,知識點(diǎn),都是一個具體軟件實現(xiàn)的抽象,里面也有分層。
舉個例子,我們說進(jìn)程,你看書上就給了一個概念,你覺得很抽象,覺得這是操作系統(tǒng)里面的一個概念,有點(diǎn)像是原理性的東西。
但你往下一個層次看,到操作系統(tǒng)設(shè)計這個層面來看,進(jìn)程是一個很具象的東西,有具體的代碼,具體的設(shè)計,具體的細(xì)節(jié),甚至有時候你會覺得有些代碼寫得也不咋地,就像是一個業(yè)務(wù)邏輯。
從這個層面,這個角度來理解,來看待進(jìn)程的時候,怎么可能會懵逼,簡直具象到不行了,甚至還會覺得這不就是一個業(yè)務(wù)邏輯嘛。
但深度是不是到這里就停止了,也不是。
你會開始去思考,為什么要有這個設(shè)計,為什么要有這種抽象,你可能會去找相關(guān)的論文來看。計算機(jī)技術(shù)不是自然科學(xué),進(jìn)程也不是定理性的東西,不是 1+1 等于 2 這種自然存在的,所有一切都是設(shè)計出來的。
有設(shè)計就會有討論的過程,這些討論的過程或結(jié)果很多都還保留在互聯(lián)網(wǎng)上。
比如,有一次我們想為自己做的分布式存儲,設(shè)計事物系統(tǒng),后來就順藤摸瓜地找到了數(shù)據(jù)庫大師 Jim Gray 關(guān)于事務(wù)設(shè)計的經(jīng)典文獻(xiàn)和資料,里面有他的很多思考和權(quán)衡。
到這個時候,事務(wù)在你腦海里已經(jīng)不是概念,而且一個龐大的東西,很多細(xì)節(jié),設(shè)計的權(quán)衡,你想忘都忘不了了。
甚至你還會思考這種設(shè)計是不是最好的,時間過了這么久,會不會不適應(yīng)現(xiàn)有的場景了,反正你會思考很多。
我們說有人很牛,我覺得這個就是很關(guān)鍵的區(qū)別了。
這個過程很艱難,也很緩慢的,要十年甚至二十年的時間,有人可以不斷地深入;也有人只停留在很淺的層面。如果你能不斷深入,你就能不斷地超越很多人,朝著技術(shù)大牛的目標(biāo)邁進(jìn)。
結(jié)語
基礎(chǔ)知識的學(xué)習(xí)和理解是緩慢且不斷深入的過程,甚至是貫穿整個程序生涯的,不斷深入理解的過程,也是不斷塑造自身技術(shù)思維的過程。
當(dāng)然,首先你得知道并認(rèn)可基礎(chǔ)知識的價值,你才會愿意花費(fèi)時間和精力去不斷去學(xué)習(xí)和深入理解它們。
這篇文章給大家分享了,基礎(chǔ)知識的價值和基礎(chǔ)知識在程序員腦海中的演進(jìn)過程,這個視角可能比較獨(dú)特,不過卻也是我這么多年來的心得和感悟,希望對大家有所幫助!
總結(jié)
以上是生活随笔為你收集整理的面试官,你考我那么多基础知识干什么?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SELECT COUNT(*) 底层究竟
- 下一篇: 一次给女朋友转账引发我对分布式事务的思考