數(shù)學(xué)能力,對(duì)于一個(gè)程序員來說意味著什么?
數(shù)學(xué)離程序員有多近?
ifelse也好、for循環(huán)也罷,代碼可以說就是對(duì)數(shù)學(xué)邏輯的具體實(shí)現(xiàn)。所以敲代碼的程序員幾乎就離不開數(shù)學(xué),難易不同而已。
那數(shù)學(xué)不好就寫不了代碼嗎???不,一樣可以寫代碼,可以寫出更多的CRUD出來。那你不要總覺得是產(chǎn)品需求簡(jiǎn)單所以你的實(shí)現(xiàn)過程才變成了增刪改查,往往也是因?yàn)槟氵€不具備可擴(kuò)展、易維護(hù)、高性能的代碼實(shí)現(xiàn)方案落地能力,才使得你小小年紀(jì)寫出了更多的CRUD!
與一錐子買賣的小作坊相比,大廠和超級(jí)大廠更會(huì)注重?cái)?shù)學(xué)能力。

2004年,在硅谷的交通動(dòng)脈 101 公路上突然出現(xiàn)一塊巨大的廣告牌,上面是一道數(shù)學(xué)題:?{e 的連續(xù)數(shù)字中最先出現(xiàn)的 10 位質(zhì)數(shù)}.com。
廣告:這里的 e 是數(shù)學(xué)常數(shù),自然對(duì)數(shù)的底數(shù),無限不循環(huán)小數(shù)。這道題的意思就是,找出 e 中最先出現(xiàn)的 10 位質(zhì)數(shù),然后可以得出一個(gè)網(wǎng)址。進(jìn)入這個(gè)網(wǎng)址會(huì)看到 Google 為你出的第二道數(shù)學(xué)題,成功解鎖這步 Google 會(huì)告訴你,我們或許是”志同道合“的人,你可以將簡(jiǎn)歷發(fā)到這個(gè)郵箱,我們一起做點(diǎn)改變世界的事情。
計(jì)算 e 值可以通過泰勒公式推導(dǎo)出來:e^x≈1 + x + x^2/2! + x^3/3! +……+ x^n/n! (1) 推導(dǎo)計(jì)算過程還包括埃拉托色尼篩選法(the Sieve of Eratosthenes)、線性篩選法的使用。感興趣的小伙伴可以用代碼實(shí)現(xiàn)下。
一、把代碼寫好的四步
業(yè)務(wù)提需求、產(chǎn)品定方案、研發(fā)做實(shí)現(xiàn)。最終這個(gè)系統(tǒng)開發(fā)的怎么樣是由三方共同決定的!
地基挖的不好,樓就蓋不高
磚頭擺放不巧,樓就容易倒
水電走線不妙,樓就危險(xiǎn)了
格局設(shè)計(jì)不行,樓就賣不掉
這里的地基、磚頭、水電、格局,對(duì)應(yīng)的就是,數(shù)據(jù)結(jié)構(gòu)、算法邏輯、設(shè)計(jì)模式、系統(tǒng)架構(gòu)。從下到上相互依賴、相互配合,只有這一層做好,下一層才好做!

數(shù)據(jù)結(jié)構(gòu):高矮胖瘦、長(zhǎng)寬扁細(xì),數(shù)據(jù)的存放方式,是一套程序開發(fā)的核心基礎(chǔ)。不合理的設(shè)計(jì)往往是從數(shù)據(jù)結(jié)構(gòu)開始,哪怕你僅僅是使用數(shù)據(jù)庫存放業(yè)務(wù)信息,也一樣會(huì)影響到將來各類數(shù)據(jù)的查詢、匯總等實(shí)現(xiàn)邏輯的難易。
算法邏輯:是對(duì)數(shù)據(jù)結(jié)構(gòu)的使用,合適的數(shù)據(jù)結(jié)構(gòu)會(huì)讓算法實(shí)現(xiàn)過程降低時(shí)間復(fù)雜度??赡苣悻F(xiàn)在的多層for循環(huán)在合適的算法過程下,能被優(yōu)化為更簡(jiǎn)單的方式獲取數(shù)據(jù)。注意:算法邏輯實(shí)現(xiàn),并不一定就是排序、歸并,還有你實(shí)際業(yè)務(wù)的處理流程。
設(shè)計(jì)模式:可以這么說,不使用設(shè)計(jì)模式你一樣能寫代碼。但你愿意看到滿屏幕的ifelse判斷調(diào)用,還是喜歡像膏藥一樣的代碼,粘貼來復(fù)制去?那么設(shè)計(jì)模式這套通用場(chǎng)景的解決方案,就是為你剔除掉代碼實(shí)現(xiàn)過程中的惡心部分,讓整套程序更加易維護(hù)、易擴(kuò)展。就是開發(fā)完一個(gè)月,你看它你還認(rèn)識(shí)!
系統(tǒng)架構(gòu):描述的是三層MVC,還是四層DDD。我對(duì)這個(gè)的理解就是家里的三居還是四局格局,MVC是我們經(jīng)常用的大家都熟悉,DDD無非就是家里多了個(gè)書房,把各自屬于哪一個(gè)屋子的擺件規(guī)整到各自屋子里。那么亂放是什么效果呢,就是自動(dòng)洗屁屁馬桶??給按到廚房了,再貴也格楞子!?好,那么我們?cè)谘诱瓜?,如果你的衛(wèi)生間沒有流出下水道咋辦?是不這個(gè)地方的數(shù)據(jù)結(jié)構(gòu)就是設(shè)計(jì)缺失的,而到后面再想擴(kuò)展就難了吧!
所以,研發(fā)在承接業(yè)務(wù)需求、實(shí)現(xiàn)產(chǎn)品方案的時(shí)候。壓根就不只是在一個(gè)房子的三居或者四居格局里,開始隨意碼磚。
沒有合理的數(shù)據(jù)結(jié)構(gòu)、沒有優(yōu)化的算法邏輯、沒有運(yùn)用的設(shè)計(jì)模式,最終都會(huì)影響到整個(gè)系統(tǒng)架構(gòu)變得臃腫不堪,調(diào)用混亂。在以后附加、迭代、新增的需求下,會(huì)讓整個(gè)系統(tǒng)問題不斷的放大,當(dāng)你想用重構(gòu)時(shí),就有著千絲萬縷般調(diào)用關(guān)系。?重構(gòu)就不如重寫了!
二、for循環(huán)沒算法快
在《編程之美》一書中,有這樣一道題。求:1~n中,1出現(xiàn)的次數(shù)。比如:1~10,1出現(xiàn)了兩次。
1. for 循環(huán)實(shí)現(xiàn)

使用 for 循環(huán)的實(shí)現(xiàn)過程很好理解,就是往死了循環(huán)。之后把循環(huán)到的數(shù)字按照字符串拆解,判斷每一位是不是數(shù)字,是就+1。這個(gè)過程很簡(jiǎn)單,但是時(shí)間復(fù)雜很高。
2. 算法邏輯實(shí)現(xiàn)

如圖 20-3 所示,其實(shí)我們能發(fā)現(xiàn)這個(gè)1的個(gè)數(shù)在100、1000、10000中是有規(guī)則的循環(huán)出現(xiàn)的。11、12、13、14或者21、31、41、51,以及單個(gè)的1出現(xiàn)。最終可以得出通用公式:abcd...=(abc+1)*1+(ab+1)*10+(a+1)*100+(1)*1000...,abcd代表位數(shù)。另外在實(shí)現(xiàn)的過程還需要考慮比如不足100等情況,例如98、1232等。
實(shí)現(xiàn)過程

在《編程之美》一書中還不只這一種算法,感興趣的小伙伴可以查閱。但自己折騰實(shí)現(xiàn)后的興奮感更強(qiáng)哦!
3. 耗時(shí)曲線對(duì)比
按照兩種不同方式的實(shí)現(xiàn)邏輯,我們來計(jì)算1000、10000、10000到一個(gè)億,求1出現(xiàn)的次數(shù),看看兩種方式的耗時(shí)曲線。

for循環(huán)隨著數(shù)量的不斷增大后,已經(jīng)趨近于無法使用了。
算法邏輯依靠的計(jì)算公式,所以無論增加多少基本都會(huì)在1~2毫秒內(nèi)計(jì)算完成。
那么,你的代碼中是否也有類似的地方。如果使用算法邏輯配合適合的數(shù)據(jù)結(jié)構(gòu),是否可以替代一些for循環(huán)的計(jì)算方式,來使整個(gè)實(shí)現(xiàn)過程的時(shí)間復(fù)雜度降低。
總結(jié)
單純的只會(huì)數(shù)學(xué)寫不了代碼,能寫代碼的不懂?dāng)?shù)學(xué)只能是CRUD碼農(nóng)。數(shù)學(xué)知識(shí)幫助你設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)和實(shí)現(xiàn)算法邏輯,代碼能力幫你駕馭設(shè)計(jì)模式和架構(gòu)模型。多方面的知識(shí)結(jié)合和使用才是碼農(nóng)和工程師的主要區(qū)別,也是是否擁有核心競(jìng)爭(zhēng)力的關(guān)鍵點(diǎn)。
學(xué)習(xí)知識(shí)有時(shí)候看不到前面的路有多遠(yuǎn),但哪怕是個(gè)泥坑,只要你不停的蠕動(dòng)、折騰、翻滾,也能抓出一條泥鰍。知識(shí)的路上是發(fā)現(xiàn)知識(shí)的快樂,還學(xué)會(huì)知識(shí)的成就感,不斷的促使你前行。
如果你想更好的提升你的編程能力,進(jìn)入到百度騰訊等大廠工作,好好學(xué)習(xí)C/C++編程知識(shí)成為高薪軟件開發(fā)工程師的話!那么你很幸運(yùn)~

UP在主頁上傳了一些學(xué)習(xí)C/C++編程的視頻教程,有興趣或者正在學(xué)習(xí)的小伙伴一定要去看一看哦!會(huì)對(duì)你有幫助的~
分享(源碼、項(xiàng)目實(shí)戰(zhàn)視頻、項(xiàng)目筆記,基礎(chǔ)入門教程)
歡迎轉(zhuǎn)行和學(xué)習(xí)編程的伙伴,利用更多的資料學(xué)習(xí)成長(zhǎng)比自己琢磨更快哦!
編程學(xué)習(xí)書籍:

編程學(xué)習(xí)視頻:
