自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

你是七段程序員么?

移動開發(fā)
C語言盡管在語言層面上并不支持面向?qū)ο缶幊谭妒剑F(xiàn)代的C語言開發(fā)都會應(yīng)用面向?qū)ο蟮哪K化思想,把同一類的數(shù)據(jù)結(jié)構(gòu)和函數(shù)放在一個文件中,采用類似的命名方式。

[[130300]]

前言

程序員的編程技能隨著經(jīng)驗的積累,會逐步提高。我認(rèn)為編程能力可以分為一些層次。

下面通過兩個維度展開編程能力層次模型的討論。

一個維度是編程技能層次,另一個維度是領(lǐng)域知識層次。

編程技能層次

編程技能層次,指的程序員設(shè)計和編寫程序的能力。這是程序員的根本。

0段—非程序員:

初學(xué)編程者,遇到問題,完全是懵懵懂懂,不知道該怎么編程解決問題。也就是說,還是門外漢,還不能稱之為“程序員”。計算機(jī)在他面前還是一個神秘的黑匣子。

1段—基礎(chǔ)程序員:

學(xué)習(xí)過一段時間編程后,接到任務(wù),可以編寫程序完成任務(wù)。

編寫出來的代碼,正常情況下是能夠工作的,但在實際運(yùn)行中,碰到一些特殊條件就會出現(xiàn)各類BUG。也就是說,具備了開發(fā)Demo軟件的能力,但開發(fā)的軟件真正交付給客戶使用,恐怕會被客戶罵死。

程序員程序是寫好了,但到底為什么它有時能正常工作,有時又不行,程序員自己也不知道。

運(yùn)行中遇到了bug,或者需求改變,需要修改代碼或者添加代碼,很快程序就變得結(jié)構(gòu)混亂,代碼膨脹,bug叢生。很快,就連最初的開發(fā)者自己也不愿意接手維護(hù)這個程序了。

2段—數(shù)據(jù)結(jié)構(gòu):

經(jīng)過一段時間的編程實踐后,程序員會認(rèn)識到“數(shù)據(jù)結(jié)構(gòu)+算法=程序”這一古訓(xùn)的含義。他們會使用算法來解決問題。進(jìn)而,他們會認(rèn)識到,算法本質(zhì)上是依附于數(shù)據(jù)結(jié)構(gòu)的,好的數(shù)據(jù)結(jié)構(gòu)一旦設(shè)計出來,那么好的算法也會應(yīng)運(yùn)而生。

設(shè)計錯誤的數(shù)據(jù)結(jié)構(gòu),不可能生長出好的算法。

記得某一位外國先賢曾經(jīng)說過:“給我看你的數(shù)據(jù)結(jié)構(gòu)!”

3段—面向?qū)ο螅?/strong>

再之后,程序員就會領(lǐng)略面向?qū)ο蟪绦蛟O(shè)計的強(qiáng)大威力。大多數(shù)現(xiàn)代編程語言都是支持面向?qū)ο蟮?。但并不是說,你使用面向?qū)ο缶幊陶Z言編程,你用上了類,甚至繼承了類,你就是在寫面向?qū)ο蟮拇a了。

我曾經(jīng)見過很多用Java,Python,Ruby寫的面向過程的代碼。

只有你掌握了接口,掌握了多態(tài),掌握了類和類,對象和對象之間的關(guān)系,你才真正掌握了面向?qū)ο缶幊碳夹g(shù)。

就算你用的是傳統(tǒng)的不支持面向?qū)ο蟮木幊陶Z言,只要你心中有“對象”,你依然可以開發(fā)出面向?qū)ο蟮某绦颉?/p>

如,我用C語言編程的時候,會有意識的使用面向?qū)ο蟮募记蓙砭帉懞驮O(shè)計程序。用struct來模擬類,把同一類概念的函數(shù)放在一起模擬類。如果你懷疑用C語言是否能編寫出面向?qū)ο蟮拇a,你可以看一下Linux內(nèi)核,它是用C語言編寫的,但你也可以看到它的源代碼字里行間散發(fā)出的濃濃的“對象”的味道。

真正掌握面向?qū)ο缶幊碳夹g(shù)并不容易。

在我的技術(shù)生涯中,有兩個坎讓我最感頭疼。

一個坎是Dos向Windows開發(fā)的變遷過程中,框架的概念,很長一段時間我都理解不了。Dos時代,都是對函數(shù)庫的調(diào)用,你的程序主動調(diào)用函數(shù)。Windows時代,則換成了框架。就算是你的main程序,其實也是被框架調(diào)用的。UI線程會從操作系統(tǒng)獲取消息,然后發(fā)送給你的程序來處理。Java程序員熟悉的Spring框架,也是這樣一個反向調(diào)用的框架。

現(xiàn)在因為“框架”這個術(shù)語顯得很高大上,因此很多“類庫”/“函數(shù)庫”都自稱為“框架”。在我看來這都是名稱的濫用。

“類庫”/“函數(shù)庫”就是我寫的代碼調(diào)用它們。

“框架”就是我注冊回調(diào)函數(shù)到框架,框架來調(diào)用我寫的函數(shù)。

另一個坎就是面向?qū)ο?。很長一段時間我都不知道應(yīng)該怎么設(shè)計類和類之間的關(guān)系,不能很好的設(shè)計出類層次結(jié)構(gòu)來。

我記得當(dāng)時看到一本外國大牛的書,他講了一個很簡單、很實用的面向?qū)ο笤O(shè)計技巧:“敘述問題。然后把其中的名詞找出來,用來構(gòu)建類。把其中的動詞找出來,用來構(gòu)建類的方法”。雖然這個技巧挺管用的,但也太草根了點,沒有理論依據(jù),也不嚴(yán)謹(jǐn)。如果問題敘述的不好,那么獲得的類系統(tǒng)就會是有問題的。

掌握面向?qū)ο笏枷氲耐緩綉?yīng)該有很多種,我是從關(guān)系數(shù)據(jù)庫中獲得了靈感來理解和掌握面向?qū)ο笤O(shè)計思想的。

在我看來,關(guān)系數(shù)據(jù)庫的表,其實就是一個類,每一行記錄就是一個類的實例,也就是對象。表之間的關(guān)系,就是類之間的關(guān)系。O-Rmapping技術(shù)(如Hibernate),用于從面向?qū)ο蟠a到數(shù)據(jù)庫表之間的映射,這也說明了類和表確實是邏輯上等價的。

既然數(shù)據(jù)庫設(shè)計和類設(shè)計是等價的,那么要設(shè)計面向?qū)ο笙到y(tǒng),只需要使用關(guān)系數(shù)據(jù)庫的設(shè)計技巧即可。

關(guān)系數(shù)據(jù)庫表結(jié)構(gòu)設(shè)計是很簡單的:

1、識別表和表之間的關(guān)系,也就是類和類之間的關(guān)系。是一對一,一對多,多對一,還是多對多。這就是類之間的關(guān)系。

2、識別表的字段。一個對象當(dāng)然有無數(shù)多的屬性(如,人:身高,體重,性別,年齡,姓名,身份證號,駕駛證號,銀行卡號,護(hù)照號,港澳通行證號,工號,病史,婚史etc),我們寫程序需要記錄的只是我們關(guān)心的屬性。這些關(guān)心的屬性,就是表的字段,也就是類的屬性。“弱水三千,我取一瓢飲”!

4段—設(shè)計模式:

曾經(jīng)在網(wǎng)上看到這樣一句話:“沒有十萬行代碼量,就不要跟我談什么設(shè)計模式”。深以為然。

記得第一次看Gof的設(shè)計模式那本書的時候,發(fā)現(xiàn)雖然以前并不知道設(shè)計模式,但在實際編程過程中,其實還是自覺使用了一些設(shè)計模式。設(shè)計模式是編程的客觀規(guī)律,不是誰發(fā)明的,而是一些早期的資深程序員首先發(fā)現(xiàn)的。

不用設(shè)計模式,你也可以寫出滿足需求的程序來。但是,一旦后續(xù)需求變化,那么你的程序沒有足夠的柔韌性,將難以為繼。而真實的程序,交付客戶后,一定會有進(jìn)一步的需求反饋。而后續(xù)版本的開發(fā),也一定會增加需求。這是程序員無法回避的現(xiàn)實。

寫UI程序,不論是Web,Desktop,Mobile,Game,一定要使用MVC設(shè)計模式。否則你的程序面對后續(xù)變化的UI需求,將無以為繼。

設(shè)計模式,最重要的思想就是解耦,通過接口來解耦。這樣,如果將來需求變化,那么只需要提供一個新的實現(xiàn)類即可。

主要的設(shè)計模式,其實都是面向?qū)ο蟮?。因此,可以認(rèn)為設(shè)計模式是面向?qū)ο蟮母呒夒A段。只有掌握了設(shè)計模式,才能認(rèn)為是真正徹底掌握了面向?qū)ο笤O(shè)計技巧。

我學(xué)習(xí)一門新語言時(包括非面向?qū)ο笳Z言,如函數(shù)式編程語言),總是會在了解了其語法后,看一下各類設(shè)計模式在這門語言中是如何實現(xiàn)的。這也是學(xué)習(xí)編程語言的一個竅門。

5段–語言專家:

經(jīng)過一段時間的編程實踐,程序員對某一種常用的編程語言已經(jīng)相當(dāng)精通了。有些人還成了“語言律師”,擅長向其他程序員講解語言的用法和各種坑。

這一階段的程序員,常常是自己所用語言的忠實信徒,常在社區(qū)和論壇上和其他語言的使用者爭論哪一種語言是最好的編程語言。他們認(rèn)為自己所用的語言是世界上最好的編程語言,沒有之一。他們認(rèn)為,自己所用的編程語言適用于所有場景。他們眼中,只有錘子,因此會把所有任務(wù)都當(dāng)成是釘子。

6段–多語言專家:

這一個階段的程序員,因為工作關(guān)系,或者純粹是因為對技術(shù)的興趣,已經(jīng)學(xué)習(xí)和掌握了好幾種編程語言。已經(jīng)領(lǐng)略了不同編程語言不同的設(shè)計思路,對每種語言的長處和短處有了更多的了解。

他們現(xiàn)在認(rèn)為,編程語言并不是最重要的,編程語言不過是基本功而已。

他們現(xiàn)在會根據(jù)不同的任務(wù)需求,或者不同的資源來選擇不同的編程語言來解決問題,不再會因為沒有使用某一種喜愛的編程語言開發(fā)而埋怨。

編程語言有很多種流派和思想,有一些編程語言同時支持多種編程范式。

靜態(tài)類型編程范式

采用靜態(tài)類型編程范式的編程語言,其變量需要明確指定類型。代表語言:C,C++,Pascal,Objective-C,Java,C#,VB.NET,Swif,Golang。

這樣做的好處是:

1、編譯器可以在編譯時就能找出類型錯誤。

2、編譯器編譯時知道類型信息,就可以提高性能。

這種范式認(rèn)為,程序員肯定知道變量的類型,你丫要是不知道變量的類型,那你就別混了!編譯時,程序會報錯。

Swift和Go語言都是靜態(tài)類型編程語言,但它們都不需要明確指定類型,而是可以通過推斷由編譯器自動確定其類型。

動態(tài)類型編程范式

采用靜態(tài)類型編程范式的編程語言,其變量不需要明確指定類型。任意變量,可以指向任意類型的對象。代表語言:Python,Ruby,JavaScript。

動態(tài)類型的哲學(xué)可以用鴨子類型(英語:ducktyping)這個概念來概括。JamesWhitcombRiley提出的鴨子測試可以這樣表述:“當(dāng)看到一只鳥走起來像鴨子、游泳起來像鴨子、叫起來也像鴨子,那么這只鳥就可以被稱為鴨子。”

這種范式認(rèn)為,程序員肯定知道變量的類型和它支持的方法和屬性,你丫要是不知道變量的類型,那你就別混了!運(yùn)行時程序會崩潰!程序崩潰怨誰?怨你自己唄,你不是合格的程序員!

動態(tài)類型的好處是:

不需要明確定義接口和抽象類型。只要一個類型支持需要的方法和屬性,那么就OK。程序會相當(dāng)靈活和簡單。C++,Java,C#視之為命脈的接口/基類,在動態(tài)語言這里都視如無物!

缺點是:

1、如果類型不對,編譯器也無法找到錯誤,而是運(yùn)行時程序崩潰。

2、因為編譯器不知道變量的類型,因此無法優(yōu)化性能。

面向?qū)ο缶幊谭妒?/strong>

面向?qū)ο缶幊谭妒?,從上世紀(jì)70年代末開始興起。它支持類和類的實例作為封裝代碼的模塊。代表語言:Smalltalk,C++,Objective-C,Java,C#,VB.NET,Swift,Go,Python,Ruby,ActionScritp,OCaml.

早期編程語言都是面向過程的。就是順序,條件,循環(huán),構(gòu)成一個個函數(shù)。隨著代碼規(guī)模的增大,人們發(fā)現(xiàn)有必要對代碼進(jìn)行模塊化。一個概念對應(yīng)的代碼放在一個文件中,這樣便于并發(fā)開發(fā)和進(jìn)行代碼管理。

人們還發(fā)現(xiàn)了“程序=數(shù)據(jù)結(jié)構(gòu)+算法”的規(guī)律。因此,一個概念對應(yīng)的數(shù)據(jù)結(jié)構(gòu)和函數(shù)應(yīng)該放在一個文件中。這就是類的概念。

面向?qū)ο缶幊谭妒?,確實極大地提高了生產(chǎn)效率,因此得到了廣泛的應(yīng)用,因此在語言層面支持面向?qū)ο缶幊谭妒降恼Z言是極多的。

C語言盡管在語言層面上并不支持面向?qū)ο缶幊谭妒?,但現(xiàn)代的C語言開發(fā)都會應(yīng)用面向?qū)ο蟮哪K化思想,把同一類的數(shù)據(jù)結(jié)構(gòu)和函數(shù)放在一個文件中,采用類似的命名方式。

畢竟C語言沒有在語言層面上支持面向?qū)ο?,因此就有很多程序員想給C語言添加面向?qū)ο笾С?。其中的代表是C++和Objective-C。

C++是一種新的語言,但大部分語言元素是和C兼容的。

Objective-C是完全兼容的C的。Objective-C是給C添加了薄薄的一層語法糖以支持接口(就是其他語言的類)和協(xié)議(就是其他語言的接口)。甚至,Objective-C一開始的實現(xiàn),就是一個C語言的預(yù)編譯器。Objective-C坦白講,除了添加的語法不太符合C流外,實際上其面向?qū)ο笙到y(tǒng)設(shè)計是相當(dāng)精妙的。喬布斯早年慧眼識珠,把Objective-C收人囊中,因為封閉于Apple/NextStep系統(tǒng)內(nèi),因此少有人知。隨著iOs系統(tǒng)的普及,Objective-C近幾年才名滿天下。

函數(shù)式編程范式

函數(shù)式編程范式,是一些數(shù)學(xué)家發(fā)明的編程語言,他們認(rèn)為程序就是數(shù)學(xué)函數(shù)嘛。代表語言:Lisp,Erlang,JavaScript,OCaml,Prog。

有很多大牛極力鼓吹過函數(shù)式編程語言,認(rèn)為其極具革命性。但我認(rèn)為他們過高估計了函數(shù)式編程范式的威力,我并不認(rèn)為函數(shù)式編程范式相對于面向?qū)ο缶幊谭妒接泻胃呙髦帯?/p>

函數(shù)式編程語言,核心就是函數(shù),它們沒有Class類的概念。但它的函數(shù)又不是傳統(tǒng)面向過程語言的函數(shù),它的函數(shù)支持“閉包”的概念。

在我看來,函數(shù)式編程語言的函數(shù),也就是“閉包”,說白了,其實就是“類”。編程語言發(fā)展到今天,就是需要模塊化,就是需要把“數(shù)據(jù)結(jié)構(gòu)”和“算法”結(jié)合起來。不論何種語言,不把它們結(jié)合起來的編程方式,都是沒有出路的。

面向?qū)ο缶幊陶Z言,用類把“數(shù)據(jù)結(jié)構(gòu)”和“算法”結(jié)合起來。類的核心是“數(shù)據(jù)結(jié)構(gòu)”,也就是其“屬性”,而不是“算法”,其“函數(shù)”。在類中,是函數(shù)依附于屬性。

而函數(shù)式編程語言,用閉包把“數(shù)據(jù)結(jié)構(gòu)”和“算法”結(jié)合起來。是函數(shù)能夠抓取外部的字段。是“屬性”依附于“函數(shù)”。

“類”本質(zhì)上和“閉包”是等價的?,F(xiàn)在很多面向?qū)ο缶幊陶Z言都加上了對閉包的支持。觀察其代碼,我們可以發(fā)現(xiàn),它們實際上都是用“類”來實現(xiàn)“閉包”的。

“類”和“閉包”誰更易用?明顯是“類”。

而“閉包”更簡潔一些,因此“閉包”在面向?qū)ο缶幊陶Z言中常用來替換匿名類。只有一個函數(shù)的類,寫成一個類太麻煩,不如寫成閉包,更加簡潔。

吐槽一下OCaml語言,其前身Caml語言本身是一種挺好的函數(shù)式語言,硬生生添加了一套完整的面向?qū)ο髾C(jī)制,同時支持面向?qū)ο蠛秃瘮?shù)式編程范式,很容易像C++一樣腦裂的。

也有很多面向?qū)ο笳Z言控看著JavaScript嫌煩,總是想把面向?qū)ο笾С痔砑拥絁avaScript上。ActionScript就是其中一種嘗試。我用過,真的是和Java沒多少區(qū)別了。

再吐槽一下ExtJS。當(dāng)初選型Web前端開發(fā)框架時比較了ExtJS和JQuery。

ExtJS明顯是Java高手開發(fā)的,硬生生用JavaScript模擬Swing的設(shè)計思想,搞了一套UI庫。

JQuery開發(fā)者明顯是領(lǐng)悟了JavaScript的函數(shù)式編程范式,依據(jù)JavaScript的動態(tài)函數(shù)式編程語言的特點打造了一套UI庫,立刻秒殺ExtJS。

由ExtJS和JQuery的故事,我們可以看到多語言編程能力是多么的重要。ExtJS的作者精通并喜愛Java,因此他把手術(shù)刀JavaScript當(dāng)做錘子Java使,一通亂敲,費(fèi)力不討好。

函數(shù)式編程語言,還有尾遞歸等一些小技巧。尾遞歸可以不用棧,防止遞歸調(diào)用時棧溢出。

模板編程范式

模板編程,就是把類型作為參數(shù),一套函數(shù)可以支持任意多種類型。代表語言:C++。

模板編程的需求,是在C++開發(fā)容器庫的時候發(fā)明的。因為容器需要保存任意類型的對象,因此就有了泛型的需求。

C++的模板編程,是在編譯時,根據(jù)源碼中的使用情況,創(chuàng)建對應(yīng)類型的代碼。除了C++這種方式,Java,C#也有類似的機(jī)制,叫做“泛型”,但它們的實現(xiàn)方式和C++的模板很不同。它們的編譯器不會生成新的代碼,而是使用強(qiáng)制類型轉(zhuǎn)換的方式實現(xiàn)。

在沒有模板/泛型的編程語言中,怎樣在容器中存放對象呢?存取公共基類類型(Java,C#)的對象,或者void*指針(C)即可,取出時自己強(qiáng)制類型轉(zhuǎn)換為實際類型。動態(tài)類型語言,不關(guān)心類型,更是無所謂了,隨便什么對象直接往容器里扔進(jìn)去,取出來直接用即可。

一些C++高手又在模板的基礎(chǔ)上搞出了“模板元編程”。因為模板編程,就是C++的編譯器搞定的嘛,模板元編程就是讓編譯器運(yùn)算,編譯完結(jié)果也就算出來了。我不知道除了研究和炫技,這玩意有啥用?

小結(jié)

一門語言是否值得學(xué)習(xí),我認(rèn)為有幾個標(biāo)準(zhǔn):

1、是否要用,要用就得學(xué),這么沒有疑問的。畢竟我們都要吃飯的嘛。

2、其語言特性是否給你耳目一新的感覺。如果是,那就值回票價了。如Go語言廢掉了異常,改用返回多值。我深以為然。我其實已經(jīng)主動不用異常好多年了。因為,我覺得既然C不支持異常也活得很好,為什么需要異常呢?出錯了,返回錯誤碼。無法挽回的錯誤,直接Abort程序就可以嘛!而且,異常實際上是違反面向過程編程原則的。一個函數(shù)應(yīng)該只有一個入口一個出口。拋出異常就多了出口了。

3、是否擅長某一個領(lǐng)域。如果你手里只有一把錘子,那么你就只能把所有任務(wù)都當(dāng)做釘子猛錘一通。但如果工具箱里有多種工具,那面對不同的任務(wù)就得心應(yīng)手多了。

7段—架構(gòu)設(shè)計

還需要掌握架構(gòu)設(shè)計的能力,才能設(shè)計出優(yōu)秀的軟件。架構(gòu)設(shè)計有一些技巧:

1、分層

一個軟件通常分為:

表現(xiàn)層–UI部分

接口層–后臺服務(wù)的通訊接口部分

服務(wù)層–實際服務(wù)部分

存儲層—持久化存儲部分,存儲到文件或者數(shù)據(jù)庫。

分層的軟件,可以解耦各個模塊,支持并行開發(fā),易于修改,易于提升性能。

2、SOA

模塊之間通過網(wǎng)絡(luò)通訊互相連接,松耦合。每一個模塊可以獨立部署,可以增加部署實例從而提高性能。每一個模塊可以使用不同的語言和平臺開發(fā),可以重用之前開發(fā)的服務(wù)。SOA,常用協(xié)議有WebService,REST,JSON-RPC等。

3、性能瓶頸

1)化同步為異步。

用內(nèi)存隊列(Redis),工作流引擎(JBpm)等實現(xiàn)。內(nèi)存隊列容易丟失數(shù)據(jù),但是速度快。工作流引擎會把請求保存到數(shù)據(jù)庫中。

通過化同步請求為異步請求,基本上99.99%的性能問題都可以解決。

2)用單機(jī)并行硬件處理。

如,使用GPU,F(xiàn)PGA等硬件來處理,提高性能。

3)用集群計算機(jī)來處理。

如,Hadoop集群,用多臺計算機(jī)來并行處理數(shù)據(jù)。

自己的軟件棧中,也可以把一個模塊部署多份,并行處理。

4)用cache來滿足請求。常用的內(nèi)容加熱cache后,大量的用戶請求都只是內(nèi)存讀取數(shù)據(jù)而已,性能會得到很大的提升。

cache是上帝算法,記得好像它的性能只比最佳性能低一些,就好像你是上帝,能夠預(yù)見未來一樣?,F(xiàn)在X86CPU遇到了主頻限制,CPU提升性能的主要途徑就是增加高速Cache了。

4、大系統(tǒng)小做

遇到大型系統(tǒng)不要慌,把它切分成多個模塊,用多個小程序,通過SOA協(xié)作來解決。這秉承了Unix的設(shè)計思想。Unix上開發(fā)了大量單一目的的小程序,它主張用戶通過管道來讓多個小程序協(xié)作,解決用戶的需求。當(dāng)然,管道方式通訊限制太多,不夠靈活。因此,現(xiàn)在我們可以通過URI,通過SOA的方式來讓多個程序協(xié)作。Andorid和iOS上的應(yīng)用程序,現(xiàn)在都是通過URI實現(xiàn)協(xié)作的。這也算是Unix設(shè)計思想的現(xiàn)代發(fā)展吧?!

5、Sharding切片

現(xiàn)在有一個潮流,就是去IOE。I-IBM大型機(jī),O-Oracle數(shù)據(jù)庫,E-EMC存儲。之前,大型系統(tǒng)常用IOE去架構(gòu),在大型機(jī)上部署一個Oracle數(shù)據(jù)庫,Oracle數(shù)據(jù)庫用EMC存儲保存數(shù)據(jù)。IOE是當(dāng)今最強(qiáng)的計算機(jī),數(shù)據(jù)庫和存儲。但他們面對海量系統(tǒng)也有抗不住的一天。

Oracle數(shù)據(jù)庫是Shareeverything的,它可以在一個計算機(jī)集群(服務(wù)器節(jié)點不能超過16個)上運(yùn)行。計算機(jī)集群都共用一個存儲。

去IOE運(yùn)動,標(biāo)志著ShareEverything模式的破產(chǎn)。必須使用ShareNothing,系統(tǒng)才能無限擴(kuò)展。

用MySQL數(shù)據(jù)庫就可以應(yīng)付任意規(guī)模的數(shù)據(jù)了。前提是,你會Sharding分片。把大系統(tǒng)切分成若干個小系統(tǒng),切分到若干臺廉價服務(wù)器和存儲上。更Modern一些,就是切分到大量虛擬機(jī)上。

如,鐵道部的12306網(wǎng)站。我們知道火車票都是從屬于某一列列車的。那么我們把每一個列車作為一個單元來切分,就可以把12306網(wǎng)站切分成幾千個模塊。一臺虛擬機(jī)可以承載若干個模塊。當(dāng)某些列車成為性能瓶頸之后,就可以把它們遷移到獨立的虛擬機(jī)上。即使最終有部分列出服務(wù)不可用,系統(tǒng)也不會完全不可用。

12306網(wǎng)站,只有一個全局的部分,就是用戶登錄。這個可以交給第三方負(fù)責(zé)。如可以讓用戶用微信,微博,qq等賬戶登錄。

也可以自己實現(xiàn)用戶登錄服務(wù)。還是用切片的方式用多臺Redis服務(wù)器提供服務(wù)。Redis服務(wù)器存儲每一個登錄用戶的sessionId和userId,角色,權(quán)限等信息。sessionId是隨機(jī)生成的,可選擇其部分bit用于標(biāo)識它在哪一個Redis服務(wù)器上。用戶登錄后,把sessionId發(fā)給客戶。用戶每次請求時把sessionId發(fā)回給服務(wù)器。服務(wù)器把sessionId發(fā)給Redis服務(wù)器查詢得到其用戶信息,對用戶請求進(jìn)行處理。如果在redis服務(wù)器上找不到sessionId,則讓用戶去登錄。即使所有注冊用戶同時登陸,也不需要太多的內(nèi)存。而且,可以在session內(nèi)存過多時,刪除最早登陸的用戶的session,強(qiáng)制他再次登陸。同時活躍的用戶數(shù)不會太多。

領(lǐng)域知識層次

前面的所有層次,都是關(guān)注編程本身的技能,說白了,就是基本功,本身并不能產(chǎn)生太大的價值。但有太多的程序員浪費(fèi)太多的時間在那些筑基的層次上。

有些程序員特別喜歡鉆研編程語言,每有一種新的編程語言出來或者舊語言被熱炒,就會投入精力進(jìn)去研究。我就是其中之一,浪費(fèi)了很多精力在編程語言上,在奇技淫巧上。

我覺得C++語言是一個特別大的坑。剛開始是作為面向?qū)ο蟮腃被開發(fā)的。后來發(fā)現(xiàn)了模板編程,就大力鼓吹模板編程和進(jìn)一步的模板元編程。最近又推出了C++11,C++14等新標(biāo)準(zhǔn),進(jìn)一步添加了很多新東西,函數(shù)式編程,類型推斷等。C++過分復(fù)雜,太多的坑消耗了大量程序員的大量精力。我使用C++時,只使用面向?qū)ο蟛糠趾湍0宀糠?,其他過于精深的特性都不使用。

計算機(jī)科學(xué)是一個面相當(dāng)廣泛的學(xué)科,有很多領(lǐng)域知識需要和值得我們深入研究,我們才能寫出有價值的程序來。軟件必須要和行業(yè)結(jié)合起來,要落地才有價值。僅僅研究編程技巧,不懂領(lǐng)域知識是寫不出有價值的程序的。

責(zé)任編輯:chenqingxiang 來源: 程序師
相關(guān)推薦

2015-04-10 19:37:34

程序員

2022-04-26 06:56:08

Java應(yīng)用程序代碼

2019-03-04 15:09:49

程序員互聯(lián)網(wǎng)思維模式

2014-08-20 10:14:14

程序員

2009-05-21 15:58:12

程序員工作經(jīng)驗職場

2009-11-19 10:21:02

2014-12-04 10:02:55

2009-01-08 09:04:18

2019-12-04 12:33:48

程序員技術(shù)設(shè)計

2009-11-17 09:41:49

程序員的學(xué)歷

2020-09-04 09:55:25

TikTok程序禁令

2014-11-07 16:57:21

程序員

2013-01-17 10:10:44

程序員

2013-12-24 09:59:48

程序員管理

2021-02-20 13:55:35

程序員計算機(jī)技術(shù)

2019-11-05 09:21:10

程序員技能開發(fā)者

2013-10-17 11:15:19

2015-06-30 09:20:09

2015-08-07 16:59:16

程序員習(xí)慣

2014-10-30 10:09:44

程序員程序設(shè)計師
點贊
收藏

51CTO技術(shù)棧公眾號