本文來自網(wǎng)上,本人只是整理一下,放到這里以備查用。
1. 特殊變量與常數(shù)
主題詞 | 意義 | 主題詞 | 意義 |
---|---|---|---|
ans | 計(jì)算結(jié)果的變量名 | computer | 確定運(yùn)行的計(jì)算機(jī) |
eps | 浮點(diǎn)相對(duì)精度 | Inf | 無窮大 |
I | 虛數(shù)單位 | inputname | 輸入?yún)?shù)名 |
NaN | 非數(shù) | nargin | 輸入?yún)?shù)個(gè)數(shù) |
nargout | 輸出參數(shù)的數(shù)目 | pi | 圓周率 |
nargoutchk | 有效的輸出參數(shù)數(shù)目 | realmax | 最大正浮點(diǎn)數(shù) |
realmin | 最小正浮點(diǎn)數(shù) | varargin | 實(shí)際輸入的參量 |
varargout | 實(shí)際返回的參量 |
2. 操作符與特殊字符
主題詞 | 意義 | 主題詞 | 意義 |
---|---|---|---|
+ | 加 | - | 減 |
* | 矩陣乘法 | .* | 數(shù)組乘(對(duì)應(yīng)元素相乘) |
^ | 矩陣冪 | .^ | 數(shù)組冪(各個(gè)元素求冪) |
\ | 左除或反斜杠 | / | 右除或斜面杠 |
./ | 數(shù)組除(對(duì)應(yīng)元素除) | kron | Kronecker張量積 |
: | 冒號(hào) | () | 圓括號(hào) |
[] | 方括 | . | 小數(shù)點(diǎn) |
.. | 父目錄 | ... | 繼續(xù),下一行接著上一行 |
, | 逗號(hào)(分割多條命令) | ; | 分號(hào)(禁止結(jié)果顯示),矩陣行分割 |
% | 注釋 | ! | 感嘆號(hào) |
' | 轉(zhuǎn)置或引用 | = | 賦值 |
== | 相等 | <>或~= | 不等于 |
& | 邏輯與 | | | 邏輯或 |
~ | 邏輯非 | xor | 邏輯異或 |
3、基本數(shù)學(xué)函數(shù)
主題詞 | 意義 | 主題詞 | 意義 |
---|---|---|---|
abs | 絕對(duì)值和復(fù)數(shù)模長(zhǎng) | acos,acosh | 反余弦,反雙曲余弦 |
acot,acoth | 反余切,反雙曲余切 | acsc,acsch | 反余割,反雙曲余割 |
angle | 復(fù)數(shù)z的相角(Phase angle) | asec,asech | 反正割,反雙曲正割 |
secant | 正切 | asin,asinh | 反正弦,反雙曲正弦 |
atan,atanh | 反正切,雙曲正切 | tangent | 正切 |
atan2 | 四象限反正切 | ceil | 向著無窮大舍入 |
complex | 建立一個(gè)復(fù)數(shù) | conj | 復(fù)數(shù)z的共軛復(fù)數(shù) |
cos,cosh |
余弦,雙曲余弦 |
csc,csch | 余切,雙曲余切 |
cot,coth |
余切,雙曲余切 |
exp | 指數(shù) |
fix | 朝0方向取整 | gcd | 最大公因數(shù) |
lcm | 最小公倍數(shù) | log | 自然對(duì)數(shù) |
log2 | 以2為底的對(duì)數(shù) | log10 | 常用對(duì)數(shù) |
mod | 有符號(hào)的求余 | nchoosek |
二項(xiàng)式系數(shù)和全部組合數(shù) |
real | 復(fù)數(shù)的實(shí)部 | imag | 復(fù)數(shù)值的虛部 |
rem | 相除后求余 | round | 取整為最近的整數(shù) |
sec,sech | 正割,雙曲正割 | sign | 符號(hào)數(shù) |
sin,sinh | 正弦,雙曲正弦 | sqrt | 平方根 |
tan,tanh | 正切,雙曲正切 | floor | 朝負(fù)無窮取整 |
4、基本矩陣和矩陣操作
主題詞 | 意義 | 主題詞 | 意義 |
---|---|---|---|
blkding | 從輸入?yún)⒘拷K對(duì)角矩陣 | eye | 單位矩陣 |
linespace | 產(chǎn)生線性間隔的向量 | logspace |
產(chǎn)生對(duì)數(shù)間隔的向量 |
numel | 元素個(gè)數(shù) | cat | 連接數(shù)組 |
zeros | 建立一個(gè)全0矩陣 | colon | 等間隔向量 |
ones | 產(chǎn)生全為1的數(shù)組 | rand | 均勻頒隨機(jī)數(shù)和數(shù)組 |
randn | 正態(tài)分布隨機(jī)數(shù)和數(shù)組 | diag | 對(duì)角矩陣和矩陣對(duì)角線 |
fliplr | 從左自右翻轉(zhuǎn)矩陣 | flipud | 從上到下翻轉(zhuǎn)矩陣 |
repmat | 復(fù)制一個(gè)數(shù)組 | reshape | 改造矩陣 |
roy90 | 矩陣翻轉(zhuǎn)90度 | tril | 矩陣的下三角 |
triu |
矩陣的上三角 |
dot | 向量點(diǎn)集 |
cross | 向量叉集 | ismember | 檢測(cè)一個(gè)集合的元素 |
intersect | 向量的交集 | setxor | 向量異或集 |
setdiff | 向是的差集 | union | 向量的并集 |
5.數(shù)值分析和傅立葉變換
主題詞 | 意義 | 主題詞 | 意義 |
---|---|---|---|
cumprod | 累積 | cumsum | 累加 |
cumtrapz | 累計(jì)梯形法計(jì)算數(shù)值微分 | factor | 質(zhì)因子 |
inpolygon | 刪除多邊形區(qū)域內(nèi)的點(diǎn) | max | 最大值 |
mean | 數(shù)組的均值 | mediam | 中值 |
min | 最小值 | perms | 所有可能的轉(zhuǎn)換 |
polyarea | 多邊形區(qū)域 | primes | 生成質(zhì)數(shù)列表 |
prod | 數(shù)組元素的乘積 | rectint | 矩形交集區(qū)域 |
sort | 按升序排列矩陣元素 | sortrows | 按升序排列行 |
std | 標(biāo)準(zhǔn)偏差 | var |
方差 |
sum | 求和 | trapz | 梯形數(shù)值積分 |
del2 | 離散拉普拉斯 | diff | 差值和微分估計(jì) |
gradient | 數(shù)值梯度 | cov | 協(xié)方差矩陣 |
corrcoef | 相關(guān)系數(shù) | conv2 | 二維卷積 |
conv | 卷積和多項(xiàng)式乘法 | deconv | 反卷積和多項(xiàng)式除法 |
filter | IIR或FIR濾波器 | filter2 | 二維數(shù)字濾波器 |
cplxpair | 將復(fù)數(shù)值分類為共軛對(duì) | fft | 一維的快速傅立葉變換 |
fft2 | 二維快速傅立葉變換 | fftshift | 將FFT的DC分量移到頻譜中心 |
ifft | 一維快速反傅立葉變換 |
ifft2 | 二維傅立葉反變換 |
ifftn | 多維快速傅立葉變換 | ifftshift |
反FFT偏移 |
nextpow2 | 最靠近的2的冪次 | unwrap | 校正相位角 |
6.多項(xiàng)式與插值
主題詞 | 意義 | 主題詞 | 意義 |
---|---|---|---|
conv |
卷積和多項(xiàng)式乘法 |
roots | 多項(xiàng)式的根 |
poly | 具有設(shè)定根的多項(xiàng)式 | polyder | 多項(xiàng)式微分 |
polyeig | 多項(xiàng)式的特征根 | polyfit | 多項(xiàng)式擬合 |
polyint | 解析多項(xiàng)式積分 | polyval | 多項(xiàng)式求值 |
polyvalm | 矩陣變量多項(xiàng)式求值 | residue | 部分分式展開 |
interp1 | 一維插值 | interp2 | 二維插值 |
interp3 | 三維插值 | interpft | 使用FFT的一維插值 |
interpn | 多維插值 | meshgrid | 為3維點(diǎn)生成x和y的網(wǎng)格 |
ndgrid | 生成多維函數(shù)和插值的數(shù)組 |
pchip | 分段3次Hermite插值多項(xiàng)式 |
ppval | 分段多項(xiàng)式的值 | spline | 3次樣條數(shù)據(jù)插值 |
7.繪圖函數(shù)
主題詞 | 意義 | 主題詞 | 意義 |
---|---|---|---|
bar | 豎直條圖 | barh | 水平條圖 |
hist | 直方圖 | histc | 直方圖計(jì)數(shù) |
hold | 保持當(dāng)前圖形 | loglog x,y | 對(duì)數(shù)坐標(biāo)圖 |
pie | 餅狀圖 | plot | 繪二維圖 |
polar |
極坐標(biāo)圖 |
semilogy | y軸對(duì)數(shù)坐標(biāo)圖 |
semilogx | x軸對(duì)數(shù)坐標(biāo) | subplot | 繪制子圖 |
bar3 | 數(shù)值3D豎條圖 | bar3h | 水平3D條形圖 |
comet3 | 3D慧星圖 | cylinder | 圓柱體 |
fill3 | 填充的3D多邊形 | plot3 | 3維空間繪圖 |
quiver3 | 3D震動(dòng)(速度)圖 | slice | 體積薄片圖 |
sphere | 球 | stem3 | 繪制離散表面數(shù)據(jù) |
waterfall | 繪制瀑布 | trisurf | 三角表面 |
clabel | 增加輪廓標(biāo)簽到等高線圖中 | datetick | 數(shù)據(jù)格式標(biāo)記 |
grid | 加網(wǎng)格線 | gtext | 用鼠標(biāo)將文本放在2D圖中 |
legend | 圖注 | plotyy | 左右邊都繪Y軸 |
title | 標(biāo)題 | xlabel | X軸標(biāo)簽 |
ylabel | Y軸標(biāo)簽 | zlabel | Z軸標(biāo)簽 |
contour | 等高線圖 | contourc | 等高線計(jì)算 |
contourf | 填充的等高線圖 | hidden | 網(wǎng)格線消影 |
meshc | 連接網(wǎng)格/等高線 | mesh | 具有參考軸的3D網(wǎng)格 |
peaks | 具有兩個(gè)變量的采樣函數(shù) | surf | 3D陰影表面圖 |
surface | 建立表面低層對(duì)象 | surfc | 海浪和等高線的結(jié)合 |
surfl | 具有光照的3D陰影表面 | trimesh | 三角網(wǎng)格圖 |
辛辛苦苦編譯安裝完Ngnix,mysql ,PHP,后發(fā)現(xiàn)不能訪問,后來發(fā)現(xiàn)是防火墻把80端口給禁用了。開啟之:(以下參考自:http://llhdf.javaeye.com/blog/526176)
yum remove php php-bcmath php-cli php-common php-devel php-fpm php-gd php-imap php-ldap php-mbstring php-mcrypt php-mysql php-odbc php-pdo php-pear php-pecl-igbinary php-xml php-xmlrpc
rpm -Uvh http://mirror.webtatic.com/yum/el6/latest.rpm
yum install php54w php54w-bcmath php54w-cli php54w-common php54w-devel php54w-fpm php54w-gd php54w-imap php54w-ldap php54w-mbstring php54w-mcrypt php54w-mysql php54w-odbc php54w-pdo php54w-pear php54w-pecl-igbinary php54w-xml php54w-xmlrpc php54w-opcache php54w-intl php54w-pecl-memcache
遇到頁面顯示空白很有可能的一種原因就是編碼不正確 var main_frame:damain=Application.application as damain;var main_frame:damain=Application.application as damain;
yum remove php php-bcmath php-cli php-common php-devel php-fpm php-gd php-imap php-ldap php-mbstring php-mcrypt php-mysql php-odbc php-pdo php-pear php-pecl-igbinary php-xml php-xmlrpc
rpm -Uvh http://mirror.webtatic.com/yum/el6/latest.rpm
yum install php55w php55w-bcmath php55w-cli php55w-common php55w-devel php55w-fpm php55w-gd php55w-imap php55w-ldap php55w-mbstring php55w-mcrypt php55w-mysql php55w-odbc php55w-pdo php55w-pear php55w-pecl-igbinary php55w-xml php55w-xmlrpc php55w-opcache php55w-intl php55w-pecl-memcache
1、越界
越界是最難查的,注意memcpy strcpy,strncpy這些函數(shù)使用前一定要檢查邊界
特別是你提供函數(shù)給別人用時(shí),你的函數(shù)中用到了這些東西,一定要檢查別人傳給你的指針的
邊界
2、變量初始化
這種問題要養(yǎng)成好習(xí)慣,否則出來偶然性問題,非常難查
3、多線程指針管理
在多線程環(huán)境下使用指針時(shí),最好采用引用計(jì)數(shù),讓最后一個(gè)放充引用計(jì)數(shù)時(shí),指針刪除,避免一個(gè)線程在使用指針,另外線程刪除掉
4、多線程鎖的管理
多線程鎖要粒度要適中,盡量減少 一個(gè)函數(shù) 進(jìn)入多個(gè)鎖,避免一個(gè)大函數(shù)一個(gè)大鎖影響性能,可學(xué)習(xí)數(shù)據(jù)庫的表級(jí),行級(jí)鎖
盡量不要在回調(diào)函數(shù)中放鎖,易 引起死鎖
做到線程安全函數(shù)單向調(diào)用,上層往下層調(diào)用,下屋向上層采用事件驅(qū)動(dòng)反饋,避免調(diào)用棧
過深,易引起死鎖
,
5、多線程對(duì)象生存期管理
盡量當(dāng)多線程共享對(duì)象 盡量不要直接刪除,建議采用狀態(tài)機(jī)形式來管理,其它線程設(shè)置狀態(tài)
由一個(gè)線程統(tǒng)一按狀態(tài)管理生存期
6、構(gòu)造函數(shù)
函造函數(shù)中不要放虛函數(shù),絕對(duì)不要在構(gòu)造函數(shù)中開線程,并且線程調(diào)用自己的成員
7、內(nèi)聯(lián)
虛函數(shù)不要內(nèi)聯(lián)
8、多線程創(chuàng)建辦法
如果用C運(yùn)行庫函數(shù),要注意用C運(yùn)行庫的方法
9,內(nèi)存管理
建議采用內(nèi)存池管理
10、線程生存期管理
線程中盡量不要調(diào)用同步函數(shù),不要強(qiáng)行殺線程,要讓線程不斷循環(huán),等待死亡信號(hào)自己退出
架構(gòu)設(shè)計(jì)是一個(gè)非常大的話題,不管寫幾篇文章,接觸到的始終只是冰山一角,更多的是實(shí)踐中去體會(huì)。這篇文章主要介紹面向?qū)ο驩O、面向方面AOP和面向服務(wù)SOA這三個(gè)要素在架構(gòu)設(shè)計(jì)中的位置與作用。
架構(gòu)設(shè)計(jì)有三個(gè)維度,或者說是我們?cè)诳紤]架構(gòu)時(shí)需要思考三個(gè)方向。
這三個(gè)維度分別為面向?qū)ο蟆⒚嫦蚍矫妗⒚嫦蚍?wù)。
這三個(gè)維度可以看作是正交的,但不同維度會(huì)互相印證,互相支撐,整個(gè)架構(gòu)的示意圖如圖所示。
![]() |
圖:架構(gòu)三維度結(jié)構(gòu)圖 |
面向?qū)ο?/strong>
面向?qū)ο蠹夹g(shù)最初是從面向?qū)ο蟮某绦蛟O(shè)計(jì)開始的,它的出現(xiàn)以上世紀(jì)60年代Simula語言為標(biāo)志,并在Smalltalk語言的完善和標(biāo)準(zhǔn)化過程中得到更多的擴(kuò)展和對(duì)以前思想的重新注解。
上世紀(jì)80年代中后期,面向?qū)ο蟪绦蛟O(shè)計(jì)逐漸成熟,被計(jì)算機(jī)界理解和接受,人們又開始進(jìn)一步考慮面向?qū)ο蟮拈_發(fā)問題。直到現(xiàn)在,面向?qū)ο笠呀?jīng)成為一種非常流行的編程方式,以及軟件設(shè)計(jì)的架構(gòu)。
面向?qū)ο筇岢鲇腥齻€(gè)主要目標(biāo):重用性、靈活性和擴(kuò)展性,強(qiáng)調(diào)對(duì)象的“抽象”、“封裝”、“繼承”和“多態(tài)”。它能讓人們以更加接近于現(xiàn)實(shí)世界的方式來思考程序,這點(diǎn)可以說是面向?qū)ο笞畲蟮倪M(jìn)步。
在OO思想的運(yùn)用上,業(yè)界出現(xiàn)了很多好的經(jīng)驗(yàn)與技巧,從而涌現(xiàn)出大量的設(shè)計(jì)模式,可以說面向?qū)ο笫窍到y(tǒng)分析與設(shè)計(jì)時(shí)的一個(gè)很重要的方面。
面向方面
面向方面最初來源于hook技術(shù),本質(zhì)上就是滿足擴(kuò)展的需求,可以在程序中自由擴(kuò)展功能。
面向方面不僅僅是一門編程技術(shù),同樣也是一種架構(gòu)設(shè)計(jì)的思路。如果說OO是縱向地分析、切割整個(gè)系統(tǒng),那么可以認(rèn)為AOP是橫向地對(duì)系統(tǒng)作切片。
簡(jiǎn)單地理解,OO與AOP分別從兩個(gè)不同的角度給我們提供了分析系統(tǒng)的思路。面向方面可以彌補(bǔ)面向?qū)ο蟮娜毕荩瑑煞N方式有機(jī)的結(jié)合在一起,可以更加有效地對(duì)系統(tǒng)進(jìn)行分析。
我們認(rèn)為OO是接近于人類認(rèn)識(shí)自然的思維方式,但對(duì)于東方而言卻并不一定是這樣的。
當(dāng)西方人看到一個(gè)復(fù)雜系統(tǒng)的時(shí)候,只會(huì)有一種思路,就是“分解”,將系統(tǒng)分解成一塊一塊,然后每個(gè)部分進(jìn)行研究。
當(dāng)東方人看到一個(gè)復(fù)雜系統(tǒng)的時(shí)候,更多地會(huì)關(guān)注系統(tǒng)中存在的關(guān)系,將系統(tǒng)作為一個(gè)有機(jī)的整體進(jìn)行研究,這也是東方和西方在事物看法上存在的差異。
這兩種思維方式都沒有問題,如果結(jié)合起來分析問題,解決問題會(huì)更好。面向?qū)ο笈c面向方面也同樣如此,都能對(duì)應(yīng)到人類認(rèn)識(shí)自然的思維方式上。
面向服務(wù)
面向服務(wù)可以說是最近炒得比較火熱的概念。包括現(xiàn)在提到的SaaS(Software as a service),軟件即服務(wù)。準(zhǔn)確而言,面向服務(wù)不僅僅是軟件行業(yè)的概念,這個(gè)要從社會(huì)的產(chǎn)業(yè)結(jié)構(gòu)說起。
社會(huì)產(chǎn)業(yè)總共分為三個(gè),第一產(chǎn)業(yè)農(nóng)業(yè),第二產(chǎn)業(yè)工業(yè),第三產(chǎn)業(yè)服務(wù)業(yè)。最早社會(huì)的主要產(chǎn)業(yè)是第一產(chǎn)業(yè)農(nóng)業(yè),將近有幾萬年的歷史。
十八世紀(jì)下半葉在英國開始的工業(yè)革命,對(duì)人們的生活產(chǎn)生了根本性的影響,社會(huì)的主要產(chǎn)業(yè)成了第二產(chǎn)業(yè)工業(yè)。
現(xiàn)在仍然屬于工業(yè)時(shí)代,或者有人說的“后工業(yè)時(shí)代”。而在后工業(yè)時(shí)代,社會(huì)的經(jīng)濟(jì)體制必定要向第三產(chǎn)業(yè)服務(wù)業(yè)逐漸轉(zhuǎn)型。面向服務(wù)其實(shí)是社會(huì)經(jīng)濟(jì)體制重心的一種遷移。
還是說回到軟件行業(yè),社會(huì)的主要產(chǎn)業(yè)將轉(zhuǎn)變成服務(wù)業(yè),自然軟件行業(yè)也會(huì)出現(xiàn)對(duì)應(yīng)的變化,那就是這里提到的面向服務(wù)。面向服務(wù)今后會(huì)影響到軟件的交付模式,會(huì)對(duì)整個(gè)軟件行業(yè)的體制產(chǎn)生影響。
而說到架構(gòu)層面,面向服務(wù)是系統(tǒng)發(fā)布功能的一種方式。并且基于這種方式下不同的系統(tǒng)之間能有效地通信、協(xié)作。常見的實(shí)現(xiàn)技術(shù)就是Web Service。
軟件全局觀
軟件架構(gòu)設(shè)計(jì)的三個(gè)維度:面向?qū)ο蟆⒚嫦蚍矫妗⒚嫦蚍?wù)。
最年長(zhǎng)的一個(gè)維度就是面向?qū)ο螅l(fā)展了好幾十年,也是相對(duì)而言比較成熟的一個(gè)維度。它解決的問題是系統(tǒng)內(nèi)部結(jié)構(gòu)的設(shè)計(jì)。
面向方面思想的提出能夠彌補(bǔ)面向?qū)ο蟮娜毕荨C嫦驅(qū)ο蟮姆绞讲荒軐?shí)現(xiàn)橫切關(guān)注點(diǎn)的分離,而面向方面正是為了解決這個(gè)問題。面向方面與面向?qū)ο笠粯佣际墙鉀Q系統(tǒng)內(nèi)部結(jié)構(gòu)的設(shè)計(jì)。
面向服務(wù)更多的是涉及到系統(tǒng)的外部,簡(jiǎn)單地說就是發(fā)布功能。它并不關(guān)注系統(tǒng)內(nèi)部結(jié)構(gòu)的實(shí)現(xiàn),所以說面向服務(wù)與面向?qū)ο蠡蛘呙嫦蚍矫娌⒉粵_突。
這三個(gè)維度并不是絕對(duì)孤立的,它們之間會(huì)互相影響、制約,相互發(fā)展的。我們?cè)诜治黾軜?gòu)的時(shí)候需要同時(shí)考慮到這三個(gè)維度的問題,這樣有助于我們?cè)O(shè)計(jì)出更加優(yōu)秀的架構(gòu)。
if(!/^[a-zA-Z0-9]{6,15}$/.test($('oldpwd').value)){ 正則,6-15 位的字母或者數(shù)字十幾年軟件研發(fā)的滄桑歲月,和一度險(xiǎn)瀕于破產(chǎn)的痛苦經(jīng)歷,讓俺對(duì)軟件產(chǎn)品開發(fā)有了更深層的體會(huì)。新年到來之際,寫出來和大家作個(gè)交流。
一、農(nóng)業(yè)境界
剛參加工作,朋友問我,你能用電腦干啥?我口出狂言,只要你想得出來的,我都能做得到。其實(shí),我說這話相當(dāng)無知。
柏拉圖曾經(jīng)說過,人的知識(shí)猶如一個(gè)圓,圓內(nèi)是你已經(jīng)知道的,圓外是你還不知道的,圓周就是你已經(jīng)知道的還沒解決的問題。你的知識(shí)越豐富,這個(gè)圓就越大,圓的周長(zhǎng)也越長(zhǎng),也就是你知道的沒解決的問題也越多。
如果你覺得自己沒有啥問題,就說明你很無知。
無數(shù)年輕人就是憑自己的熱情,初生牛犢不怕虎的沖勁,在完全沒有經(jīng)驗(yàn)和章法的情況下,投入了不會(huì)取得勝利的第一場(chǎng)戰(zhàn)斗。通俗一點(diǎn)講,就是試圖用壘狗窩的技術(shù)建高樓大廈。
企業(yè)在這個(gè)階段,充其量就是個(gè)手工作坊。有人說,我的研發(fā)團(tuán)隊(duì)上百號(hào)人呢。對(duì)不起,您是否出于這個(gè)階段和企業(yè)人數(shù)沒多大關(guān)系。
二、工業(yè)境界
了解到軟件產(chǎn)品設(shè)計(jì)研發(fā)是一個(gè)復(fù)雜的系統(tǒng)工程,很多人會(huì)嘗試運(yùn)用一些必要的技術(shù)把復(fù)雜系統(tǒng)分解成簡(jiǎn)單子系統(tǒng)。在這個(gè)階段,一些軟件工程理論開始逐步被吸收。這包括:
面向?qū)ο蟮脑O(shè)計(jì)思想
UML、RUP、XP編程、設(shè)計(jì)模式等軟件工程理論和工具
組件化系統(tǒng)設(shè)計(jì)——COM、DCOM、ActiveX、Corba、WebServices等技術(shù)開始進(jìn)入產(chǎn)品設(shè)計(jì)
簡(jiǎn)單地講,已經(jīng)知道如何把高樓大廈拆解成多個(gè)狗窩,化繁為簡(jiǎn);已經(jīng)懂得遵循軟件工業(yè)標(biāo)準(zhǔn)開發(fā)能重用的系統(tǒng)組件。
很多人以為已經(jīng)到達(dá)軟件研發(fā)的終點(diǎn),掌握了終極的技術(shù)手段。然而,這只是軟件產(chǎn)品研發(fā)的啟蒙階段,隨著發(fā)現(xiàn)更多并解決深層次的問題,你需要更有效的理論提升你對(duì)軟件產(chǎn)品開發(fā)的駕馭能力。
三、數(shù)學(xué)境界
工業(yè)化境界提供了化繁為簡(jiǎn)的技術(shù)支撐和思路,但是,好的工具并不能保證出現(xiàn)正確的設(shè)計(jì)。
我們學(xué)習(xí)解一元二次方程的時(shí)候,什么十字相乘法、配方法等等,開始會(huì)學(xué)習(xí)很多技巧性的解法。這類似工業(yè)化境界——讓你把復(fù)雜問題分解轉(zhuǎn)化成更簡(jiǎn)單的問題。但是,這些技巧不總是有效,最終的解決方案還是推導(dǎo)出求解公式,徹底解決此類問題。
軟件產(chǎn)品設(shè)計(jì)是否存在從需求到代碼的求解公式呢?這是一個(gè)已經(jīng)被研究半個(gè)世紀(jì)的課題了,可惜國內(nèi)99%的軟件研發(fā)人員并不了解這方面的進(jìn)展。等到洋人的堅(jiān)船利炮打到你家門口的時(shí)候,你才發(fā)現(xiàn)人家用這么好的技術(shù)武裝自己,那就為時(shí)太晚了。
在這個(gè)階段,你會(huì)用數(shù)學(xué)方法保障軟件系統(tǒng)設(shè)計(jì)的正確性。你可能會(huì)把下面這些理論引入你的設(shè)計(jì)過程:
在系統(tǒng)設(shè)計(jì)中自覺運(yùn)行有限狀態(tài)機(jī)、Petri網(wǎng)等數(shù)學(xué)模型去設(shè)計(jì)、分析系統(tǒng)結(jié)構(gòu)。
引進(jìn)諸如凈室技術(shù)、B方法、Z語言等形式化軟件工程技術(shù),確保系統(tǒng)設(shè)計(jì)的正確性。
最后你會(huì)發(fā)現(xiàn),軟件產(chǎn)品設(shè)計(jì)真正是一件嚴(yán)格科學(xué)過程,如果以山野村夫的心態(tài)做這件事情,最終必然一塌糊涂。
四、藝術(shù)境界
人本質(zhì)上是非理性的動(dòng)物,我們?yōu)槿祟愒O(shè)計(jì)產(chǎn)品的最終目標(biāo)不是為了正確,因此,數(shù)學(xué)境界并未把你帶到最終目的地。
人類還沒解決溫飽問題的時(shí)候,就學(xué)會(huì)了在巖石上涂鴉,在脖子上掛項(xiàng)鏈,為人類設(shè)計(jì)產(chǎn)品,得滿足他們這些貌似毫無價(jià)值的癖好。
因此,在能熟練駕馭正確設(shè)計(jì)產(chǎn)品的技能之后,軟件產(chǎn)品設(shè)計(jì)將為藝術(shù)而戰(zhàn)——我們不是在替客戶設(shè)計(jì)干活的工具,相反,我們是在為他們?cè)O(shè)計(jì)一個(gè)吸引眼球的超級(jí)玩具,一件藝術(shù)品。
軟件產(chǎn)品設(shè)計(jì)師——你不僅僅是工程師,更進(jìn)一步,你應(yīng)該是一名駕馭高科技技術(shù)的藝術(shù)家!
五、宗教境界
阿克毛被槍斃了,他不是為科學(xué)而來,亦不是為藝術(shù)而來,而是為奪取我們的心靈而來!
之所以被槍斃,是因?yàn)樗扇×宋拿魃鐣?huì)不認(rèn)可的手段和產(chǎn)品——海洛因。
異曲同工,軟件產(chǎn)品設(shè)計(jì)的最高境界亦是征服客戶的心靈,讓客戶像崇拜上帝一樣被您的軟件所征服。似乎除了海洛因,能做到這一點(diǎn)的就是宗教了。
看看IBM、看看微軟、看看Intel、看看蘋果,這些超級(jí)商業(yè)巨人,為了讓你把口袋的錢老老實(shí)實(shí)地掏出來,是不是一個(gè)個(gè)儼然一副布道者的模樣?
本文來自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/quicmous/archive/2010/01/03/5125373.aspx
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.URLDecoder;
import java.util.StringTokenizer;
/*
用Java語言實(shí)現(xiàn)HTTP服務(wù)器,首先啟動(dòng)一個(gè)java.net.ServerSocket在提供服務(wù)的端口上監(jiān)聽連接.向客戶返回文本時(shí),可以用
PrintWriter,但是如果返回二進(jìn)制數(shù)據(jù),則必須使用OutputStream.write(byte[])方法,返回的應(yīng)答消息字符串可以使用
String.getBytes()方法轉(zhuǎn)換為字節(jié)數(shù)組返回,或者使用PrintStream的print()方法寫入文本,用
write(byte[])方法寫入二進(jìn)制數(shù)據(jù).
以工程所在目錄為web的根目錄。 在工程的根目錄下放一個(gè)大概如下的index.html
<!DOCTYPE html PUBLIC "-//WDTD HTML Transitional//EN"
* "http://www.wg/TR/htmlose.dtd"> <html> <head> <meta
* http-equiv="Content-Type" content="text/html; charset=gbk">
* <title>簡(jiǎn)單的測(cè)試</title> </head> <body> 你好!這是一個(gè) 簡(jiǎn)單的web服務(wù)器。<br>
* 這是一個(gè)圖片!br>
*
* <form action="/index.html"> <img alt="" src="images/test.gif"><br>
* 姓名:<input type="text" name="name" /><br>
* 密碼:<input type="password" name="pass"></input><br>
* <input type="submit"/> </form> </body> </html>
*
* 放入圖片位置: 工程根目錄/images/test.gif <br>
* 打開瀏覽器輸入http://localhost/index.html 可以展示index.html
*
* @author guazi
*/
public class SimpleHttpServer implements Runnable {
ServerSocket serverSocket;// 服務(wù)器Socket
/**
* 服務(wù)器監(jiān)聽端口, 默認(rèn)為
*/
public static int PORT = 81; // 標(biāo)準(zhǔn)HTTP端口
/**
* 開始服務(wù)器 Socket 線程.
*/
public SimpleHttpServer() {
try {
serverSocket = new ServerSocket(PORT);
} catch (Exception e) {
System.out.println("無法啟動(dòng)HTTP服務(wù)器:" + e.getMessage());
}
if (serverSocket == null) {
System.exit(0);
}
new Thread(this).start();
System.out.println("HTTP服務(wù)器正在運(yùn)行,端口:" + PORT);
}
/**
* 運(yùn)行服務(wù)器主線程, 監(jiān)聽客戶端請(qǐng)求并返回響應(yīng).
*/
public void run() {
while (true) {
try {
Socket client = null;// 客戶Socket
client = serverSocket.accept();// 客戶機(jī)(這里是 IE 等瀏覽器)已經(jīng)連接到當(dāng)前服務(wù)器
if (client != null) {
System.out.println("連接到服務(wù)器的用戶:" + client);
try {
// 第一階段: 打開輸入流
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
System.out.println("客戶端發(fā)送的請(qǐng)求信息: ***************");
// 讀取第一行, 請(qǐng)求地址
System.out.println("http協(xié)議頭部信息:");
String line = in.readLine();
System.out.println("開始:"+line+"結(jié)束");
String resource = line.substring(line.indexOf('/'), line.lastIndexOf('/') - 5);
// 獲得請(qǐng)求的資源的地址
resource = URLDecoder.decode(resource, "gbk");// 反編碼
String method = new StringTokenizer(line).nextElement().toString();// 獲取請(qǐng)求方法, GET 或者 POST
// 讀取瀏覽器發(fā)送過來的請(qǐng)求參數(shù)頭部信息
while ((line = in.readLine()) != null) {
System.out.println(line);
if (line.equals("")) {
break;
}
}
System.out.println("http協(xié)議頭部結(jié)束 ***************");
System.out.println("用戶請(qǐng)求的資源是:" + resource);
System.out.println("請(qǐng)求的類型是: " + method);
String params = null;
if (resource.indexOf("?") > -1) {
params = resource.substring(resource.indexOf("?") + 1);
resource = resource.substring(0, resource.indexOf("?"));
}
// 顯示 POST 表單提交的內(nèi)容, 這個(gè)內(nèi)容位于請(qǐng)求的主體部分
if ("POST".equalsIgnoreCase(method)) {
if (params != null) {
params += "&" + in.readLine();
} else {
params = in.readLine();
}
}
System.out.println("打印提交的數(shù)據(jù):");
printParams(params);
// 讀取資源并返回給客戶端
fileReaderAndReturn(resource, client);
// 關(guān)閉客戶端鏈接
client.close();
System.out.println("客戶端返回完成!");
} catch (Exception e) {
System.out.println("HTTP服務(wù)器錯(cuò)誤:" + e.getMessage());
}
}
} catch (Exception e) {
System.out.println("HTTP服務(wù)器錯(cuò)誤:" + e.getMessage());
}
}
}
/**
* 讀取一個(gè)文件的內(nèi)容并返回給瀏覽器端.
*
* @param fileName
* 文件名
* @param socket
* 客戶端 socket.
* @throws IOException
*/
void fileReaderAndReturn(String fileName, Socket socket) throws IOException {
if ("/".equals(fileName)) {// 設(shè)置歡迎頁面,呵呵!
fileName = "/index.html";
}
fileName = fileName.substring(1);
PrintStream out = new PrintStream(socket.getOutputStream(), true);
File fileToSend = new File(fileName);
String fileEx = fileName.substring(fileName.indexOf(".") + 1);
String contentType = null;
// 設(shè)置返回的內(nèi)容類型
// 此處的類型與tomcat/conf/web.xml中配置的mime-mapping類型是一致的。測(cè)試之用,就寫這么幾個(gè)。
if ("htmlhtmxml".indexOf(fileEx) > -1) {
contentType = "text/html;charset=GBK";
} else if ("jpegjpggifbpmpng".indexOf(fileEx) > -1) {
contentType = "application/binary";
}
if (fileToSend.exists() && !fileToSend.isDirectory()) {
// http 協(xié)議返回頭
out.println("HTTP/1.0 200 OK");// 返回應(yīng)答消息,并結(jié)束應(yīng)答
out.println("Content-Type:" + contentType);
out.println("Content-Length:" + fileToSend.length());// 返回內(nèi)容字節(jié)數(shù)
out.println();// 根據(jù) HTTP 協(xié)議, 空行將結(jié)束頭信息
FileInputStream fis = null;
try {
fis = new FileInputStream(fileToSend);
} catch (FileNotFoundException e) {
out.println("<h1>404錯(cuò)誤!</h1>" + e.getMessage());
}
byte data[];
try {
data = new byte[fis.available()];
fis.read(data);
out.write(data);
} catch (IOException e) {
out.println("<h1>500錯(cuò)誤!</h1>" + e.getMessage());
e.printStackTrace();
} finally {
out.close();
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} else {
out.println("<h1>404錯(cuò)誤!</h1>" + "文件沒有找到");
out.close();
}
}
void printParams(String params) throws IOException {
if (params == null) {
return;
}
String[] maps = params.split("&");
for (String temp : maps) {
String[] map = temp.split("=");
System.out.println(map[0] + "==" + map[1]);
}
}
/**
* 啟動(dòng) HTTP 服務(wù)器
*
* @param args
*/
public static void main(String[] args) {
try {
if (args.length != 1) {
System.out.println("這是一個(gè)簡(jiǎn)單的web服務(wù)器 ,端口是: 80.");
} else if (args.length == 1) {
PORT = Integer.parseInt(args[0]);
}
} catch (Exception ex) {
System.err.println("服務(wù)器初始化錯(cuò)誤" + ex.getMessage());
}
new SimpleHttpServer();
}
}
在python中import this就會(huì)展示出The Zen of Python如下:
優(yōu)美勝于丑陋(Python 以編寫優(yōu)美的代碼為目標(biāo))
The Zen of Python,
這段晦澀、復(fù)雜、凌亂的代碼,莫非是 Tim Peters 提供的反例? |
再談如何成為技術(shù)領(lǐng)袖
——技術(shù)不是充分條件
被訪者:IBM軟件集團(tuán)兩岸三地大中華區(qū)
總工程師 寇衛(wèi)東
文/盧鶇翔
要想成為一名優(yōu)秀的技術(shù)領(lǐng)袖,需要具備哪些方面的素質(zhì)?我在IBM輔導(dǎo)很多年輕同事,如何才能幫助他們?cè)诼殬I(yè)生涯中成長(zhǎng)為技術(shù)領(lǐng)軍人物?是否只要擁有了過硬的技術(shù)本領(lǐng),就能成為技術(shù)領(lǐng)袖?許多年輕的朋友技術(shù)拔尖,然而卻覺得沒有得到領(lǐng)導(dǎo)的賞識(shí), 這又是什么原因呢?我常常都在思考這些問題。去年這個(gè)時(shí)候,我同讀者朋友們分享了一些心得,我想結(jié)合自己多年的高校教育和IT從業(yè)經(jīng)驗(yàn),再同大家談?wù)勥@一話題。
1.我很清楚地告訴大家,要成為技術(shù)領(lǐng)袖,技術(shù)是必要條件,但不是充分條件。如果一個(gè)人技術(shù)基礎(chǔ)不夠扎實(shí),他幾乎等同外行,領(lǐng)導(dǎo)其他技術(shù)人員不說沒有可能,但至少會(huì)相當(dāng)困難。另一方面我們?cè)趪鴥?nèi)外都能看到不少拔尖的技術(shù)人員,有的是一流的科學(xué)家,有的是一流的技術(shù)專才,可一旦把他們放在領(lǐng)導(dǎo)崗位上,卻都以失敗告終。他們雖然技術(shù)出色,但是沒有當(dāng)領(lǐng)袖的能力,工作中四處碰壁,缺乏凝聚力,不得人心。
2.要成為技術(shù)領(lǐng)袖就要清楚公司的業(yè)務(wù),知道技術(shù)應(yīng)當(dāng)如何配合業(yè)務(wù)需求。作為技術(shù)領(lǐng)袖,只有做到這點(diǎn),才能使公司業(yè)務(wù)有大的發(fā)展,才會(huì)得到高層領(lǐng)導(dǎo)的認(rèn)同。如果你只懂技術(shù)而不懂公司業(yè)務(wù),或者你在大學(xué)工作而不懂領(lǐng)導(dǎo)教學(xué)科研,是沒有辦法勝任技術(shù)領(lǐng)袖的。我們鉆研技術(shù)的朋友往往忽略了這一點(diǎn),對(duì)某項(xiàng)技術(shù)非常專注,但是兩耳不聞窗外事,沒有把注意力放到公司的發(fā)展需求上來。
為了更好地協(xié)調(diào)個(gè)人職業(yè)發(fā)展與企業(yè)業(yè)務(wù)發(fā)展,需要處理好工作的優(yōu)先級(jí),分清主次。在日常工作當(dāng)中,我常常為同事畫下面這幅圖,幫助他們進(jìn)行分析。
如果有一項(xiàng)工作擺在面前,我們?nèi)绾味x它的重要性,應(yīng)該花多少力氣去做?我們可以通過象限分析找出答案。第I象限表示此項(xiàng)工作對(duì)企業(yè)業(yè)務(wù)發(fā)展和個(gè)人職業(yè)發(fā)展都很重要,這是最完美的結(jié)合,優(yōu)先級(jí)應(yīng)該放在最高級(jí)。我們?cè)谄髽I(yè)中應(yīng)該多做此類工作。第II象限表示此項(xiàng)工作對(duì)企業(yè)業(yè)務(wù)非常重要,但是對(duì)個(gè)人目前的職業(yè)發(fā)展看似并不特別重要。我們要以企業(yè)的利益為重,所以優(yōu)先級(jí)應(yīng)該放在第二位。第III象限表示此項(xiàng)工作對(duì)個(gè)人職業(yè)發(fā)展很重要,但是對(duì)企業(yè)業(yè)務(wù)發(fā)展不那么重要,我們應(yīng)該把它放在第三位。第IV象限表示此項(xiàng)工作對(duì)企業(yè)業(yè)務(wù)發(fā)展和個(gè)人職業(yè)發(fā)展都不重要,優(yōu)先級(jí)應(yīng)該是最低的。對(duì)這類工作,自己最好不做或者少做;就是做,也應(yīng)該盡可能少花時(shí)間去做;或是請(qǐng)其他同事去做,因?yàn)閷?duì)你的個(gè)人職業(yè)發(fā)展不重要的工作不等于對(duì)其他同事的個(gè)人職業(yè)發(fā)展也不重要,換言之,此項(xiàng)工作可能對(duì)其他同事的個(gè)人職業(yè)發(fā)展很重要呢。
許多企業(yè)都在創(chuàng)造一種文化,希望能將企業(yè)業(yè)務(wù)發(fā)展和員工的個(gè)人職業(yè)發(fā)展緊密結(jié)合起來,盡管有時(shí)候很難兼顧。作為一名領(lǐng)袖人物,他一定更多地在關(guān)注大局,而不是僅僅看到自己。關(guān)注大局的人會(huì)處處從公司的業(yè)務(wù)、公司的需求出發(fā)。在實(shí)際工作中我們常常可以看到,一個(gè)真正把大局放在第一位的人,即便今天不是領(lǐng)袖,明天也一定非他莫屬。現(xiàn)在的領(lǐng)導(dǎo)不欣賞,將來必會(huì)為其他領(lǐng)導(dǎo)所賞識(shí)。
3.一個(gè)能把握大局的人需要具備很多能力,其中非常重要的一項(xiàng)就是我下面要談到的第三點(diǎn)——決策力。作為技術(shù)領(lǐng)袖,要有堅(jiān)強(qiáng)的領(lǐng)導(dǎo)能力,敢于面對(duì)各種困難的挑戰(zhàn),敢于決斷。有些人天生就有準(zhǔn)確的決策能力,而更多人需要靠后天來培養(yǎng)。
在我的孩子還小的時(shí)候,我就給他灌輸這種思想,培養(yǎng)鍛煉他。如果他要問我,我就讓他自己做決定,不論決定是對(duì)是錯(cuò)、是好是壞,在我看來都是正確的。因?yàn)樽畲蟮腻e(cuò)誤是該做決定時(shí)你舉棋不定。再舉一個(gè)例子,美國前總統(tǒng)布什剛剛上任的時(shí)候,很多人批評(píng)他沒有總統(tǒng)的風(fēng)范,但是經(jīng)過幾年的洗禮他的確擁有了總統(tǒng)的氣質(zhì)。原因又是什么呢?因?yàn)槟莻€(gè)職位訓(xùn)練了他,很多情況他必須要做出決策。
對(duì)于程序員來說,雖然無法像領(lǐng)導(dǎo)那樣做重大的決定,但仍然可以在自己的范圍內(nèi)做出決策。例如使用什么樣的技術(shù)手段, 采用何種算法實(shí)現(xiàn), 選擇哪種數(shù)據(jù)結(jié)構(gòu),如何撰寫文檔,同誰一起合作,這些并不一定非要等老板或者構(gòu)架師來判斷。大家應(yīng)該有意識(shí)地鍛煉自己,慢慢成長(zhǎng),直到將來能夠領(lǐng)導(dǎo)大的項(xiàng)目。每個(gè)人不可能一開始就能對(duì)一個(gè)完整的系統(tǒng)做出決策,可是如果不從當(dāng)程序員的時(shí)候就開始鍛煉自己,將來也做不了。
面對(duì)決策失敗可能帶來的后果,我們應(yīng)該學(xué)會(huì)坦然面對(duì),學(xué)會(huì)承擔(dān)。如果不去做決策,不愿承擔(dān)責(zé)任,就永遠(yuǎn)無法取得進(jìn)步,無法獲得做技術(shù)領(lǐng)袖的能力。
4.要想成為技術(shù)領(lǐng)袖必須有遠(yuǎn)見,有智慧。有遠(yuǎn)見有智慧的人才能有承擔(dān)。我有一個(gè)在加拿大的同事,開始的時(shí)候只是一般的技術(shù)人員,很短的時(shí)間內(nèi)就變成經(jīng)理,再后來沒有經(jīng)過多長(zhǎng)時(shí)間又被提升為主管。原因很簡(jiǎn)單:他有遠(yuǎn)見,并且有足夠的智慧知道應(yīng)該如何去做。像他這樣的員工雖然剛開始的職位很低,但是公司領(lǐng)導(dǎo)覺得這樣的人才對(duì)公司將來的發(fā)展大有幫助,另外,如果這樣的員工離職,不但是公司的損失,還會(huì)助長(zhǎng)競(jìng)爭(zhēng)對(duì)手的實(shí)力。所以公司一旦有職位就會(huì)提升這樣的員工。我們作為技術(shù)人員也是一樣的道理,面對(duì)一套大的系統(tǒng)方案,只有穿透障礙看到未來,才有機(jī)會(huì)獲得提升,成為技術(shù)領(lǐng)袖。
5.成為技術(shù)領(lǐng)袖需要自信、自覺和自律。自信,這和領(lǐng)導(dǎo)能力有關(guān),沒自信怎么來領(lǐng)導(dǎo)別人呢?自覺包含兩個(gè)方面的內(nèi)容:自我感知和自我解嘲。自我感知是要對(duì)自己有一個(gè)正確的評(píng)價(jià),“人貴有自知之明”——我們老祖宗都這樣講。有些人不知道自己的情況,要么估計(jì)過低,要么估計(jì)過高,對(duì)自己沒有一個(gè)公正的評(píng)價(jià)。很多事情要靠下意識(shí)的感覺,你可能并不知道具體發(fā)生了什么事情,但是憑感覺就能判斷出對(duì)錯(cuò)。自嘲是能給自己臺(tái)階下,這很重要,往往很多人都做不到,一不小心就陷入騎虎難下的境地。另外對(duì)自己有一個(gè)正確的評(píng)價(jià),才不會(huì)弄得自己下不來臺(tái)。
自律就是要約束自己,保持良好的品行。自律不是做給別人看,也不是做給領(lǐng)導(dǎo)看,而是為自己而做。每個(gè)人心中都應(yīng)該有把標(biāo)尺,衡量什么事情該做,什么事情不該做。自律很關(guān)鍵,年輕人尤其應(yīng)該加以重視。有好的人品才會(huì)得到大家信任,如果不自律,沒有良好的品行,有誰會(huì)對(duì)他心悅誠服,又怎樣來做大家的榜樣呢?
6.勇于承擔(dān),敢于付出。也就是說一個(gè)人的工作既不是為了金錢,也不是為了名譽(yù),單單只是為了實(shí)現(xiàn)自己人生的價(jià)值,獲得成功。自己驅(qū)動(dòng)自己,不畏艱難險(xiǎn)阻,不達(dá)目的誓不罷休。不愿意承擔(dān),不愿意付出,處處計(jì)較得失的人是沒有辦法成為領(lǐng)袖的。
這里所說的成功,并非單純的職位上的成功,還包括技術(shù)上的成功,做人的成功等。其中做人的成功最重要,往往卻被最多的人所忽視。職位只不過是領(lǐng)導(dǎo)給的一個(gè)頭銜,技術(shù)領(lǐng)袖所具有的影響力并不是單單靠領(lǐng)導(dǎo)所給的頭銜就能獲得的。不管大公司小公司,很重要的一點(diǎn)就是先做人。我認(rèn)為衡量一個(gè)人是否成功,首先看做人,然后看技術(shù),最后才是職位、名譽(yù)、金錢。而且往往人和技術(shù)做好了,金錢名譽(yù)就會(huì)隨之而來。正如諾貝爾獎(jiǎng)得主們無一人不是勤勤懇懇做事,假使一開始就想著名譽(yù)、獎(jiǎng)金,或許他們永遠(yuǎn)都無法取得舉世矚目的成就。
成功是一個(gè)很寬泛的概念,如何衡量成功是因人而異的。一般來說,成功是一個(gè)正態(tài)分布的頻譜,不是一個(gè)單脈沖。有些人擁有很高的職位、很豐厚的收入,但卻沒有家庭、沒有生活,因?yàn)樗麄儼阉行乃级挤旁诹斯ぷ魃希罱K獲得了事業(yè)上的成功,一個(gè)脈沖式的成功。相對(duì)他們的度量標(biāo)準(zhǔn)來說是成功了,然而對(duì)另一些人來說,他們并不成功、或者不值得效仿。因?yàn)槭聵I(yè)成功只是一方面,除了工作,我們還有生活,還有家庭的維系、子女的教育、八小時(shí)后的個(gè)人愛好。一個(gè)和諧的成功是一個(gè)頻譜式的成功:也許沒有哪一方面是特別突出的,但是有幾個(gè)方面是相當(dāng)好的,其他方面也還可以,這樣綜合來看是最好的。
7.能領(lǐng)會(huì)別人的感覺和想法,會(huì)與他人相處。一個(gè)擁有領(lǐng)袖潛質(zhì)的人,往往能夠很快感知周圍的氛圍,別人的感受,他能夠通過簡(jiǎn)單的語言、位置調(diào)整,使大家輕松舒服地投入工作。
8.能把大家團(tuán)結(jié)起來,人氣旺。很多時(shí)候,某個(gè)人并不是領(lǐng)導(dǎo),但是大家都愿意聽他的話,成了無冕之王,這樣的人即便現(xiàn)在不是,將來也必然會(huì)成為領(lǐng)袖,這只是時(shí)間的問題。
讀者朋友們大多都是技術(shù)人員,但是大家不要被技術(shù)所束縛。我年輕的時(shí)候也走過彎路,希望這些心得體會(huì)能對(duì)年輕的朋友們有所幫助。成為技術(shù)領(lǐng)袖并非遙不可及,只需要比別人多付出一點(diǎn)堅(jiān)定和執(zhí)著,多注重先做人后做事。
觀察者模式可以參考郵件訂閱的例子 郵件訂閱設(shè)計(jì)到2個(gè)主要角色,一個(gè)是訂閱者(觀察者),一個(gè)是發(fā)布者 發(fā)布者可以擁有一個(gè)觀察者的集合,可以添加,刪除觀察者,當(dāng)發(fā)布者發(fā)布一個(gè)新的消息時(shí),要郵件通知觀察者集合中的每一個(gè)。 所以,發(fā)布者實(shí)現(xiàn)的接口至少應(yīng)具備三個(gè)方法,即注冊(cè)觀察者,注銷觀察者,通知觀察者。 通知有兩種方式,一種是推(push),一種是拉(pull). 推,即發(fā)布者通過調(diào)用觀察者提供的接口,來告之所有的變動(dòng)(比如新增一個(gè)消息),主動(dòng)推送給觀察者。 拉,及觀察者可以按需提取所要接受的數(shù)據(jù),而不是全盤接受,主要體現(xiàn)在程序自己主動(dòng)調(diào)用觀察者的傳值接口,而區(qū)別于推由發(fā)布者來調(diào)用,此時(shí),需要這個(gè)借口中的參數(shù)包含發(fā)布者對(duì)象,讓程序知道掃描變動(dòng)來自于哪個(gè)發(fā)布者。 JDK中內(nèi)置了觀察者模式,位于java.util包中,一個(gè)接口Observer,一個(gè)類Observable,將這兩個(gè)類組合起來使用,既可以推,又可以拉。 一個(gè)普通的類,如果繼承了Observable,就成了一個(gè)發(fā)布者,實(shí)現(xiàn)了Observer接口,就成了觀察者。 JDK中的觀察者模式有一個(gè)弊端,就是發(fā)布者需要繼承一個(gè)類,而不是實(shí)現(xiàn)一個(gè)接口,如果需要成為發(fā)布者的類已經(jīng)集成了一個(gè)類,就不能再繼承Observable了。這時(shí)候,就需要自己來設(shè)計(jì)一種觀察者模式了。 JDK 中Swing包中,大量運(yùn)用了觀察者模式,所有的組件都繼承了JComponent,這就是一個(gè)發(fā)布者,它里面包含一個(gè)監(jiān)聽器的集合:EventListenerList,用戶可以自定義一個(gè)監(jiān)聽器,然后添加到一個(gè)組件中的時(shí)候,該組件就會(huì)把這個(gè)監(jiān)聽器注冊(cè)到 EventListenerList中,相當(dāng)于添加了一個(gè)發(fā)布者,當(dāng)用戶對(duì)組件做出反映時(shí),所有的監(jiān)聽器(發(fā)布者)都會(huì)收到信息并作出反應(yīng)。 網(wǎng)上商店中的商品在名稱、價(jià)格發(fā)生變化時(shí),必須自動(dòng)通知會(huì)員,Java的API為我們提供了Observer接口和Observable類來實(shí)現(xiàn)所謂觀察者模式。Observable(可觀察者)類允許在自身發(fā)生改變時(shí),通知其它對(duì)象(實(shí)現(xiàn)接口Observer,觀察者)。
|