如何寫(xiě)好程序(下)

開(kāi)發(fā)出好程序要做的功課

接著前一篇踢步,原則設(shè)定好了,接下來(lái)還需要能夠?qū)嵺`丑掺,否則就只是空談获印,而實(shí)踐就得依賴開(kāi)發(fā)人員的素質(zhì)。要提升開(kāi)發(fā)人員的素質(zhì)街州,有三個(gè)重點(diǎn)兼丰, “基礎(chǔ)、基礎(chǔ)唆缴、基礎(chǔ)” 鳍征。沒(méi)錯(cuò)!想要提升素質(zhì)其實(shí)沒(méi)有速成的方法面徽,就像功夫電影都會(huì)有強(qiáng)調(diào)扎馬的橋段艳丛,腳力是提供一切招式力道的根源匣掸,而再凌厲的招式也可能因?yàn)橹匦牟环€(wěn)而失去了威力。開(kāi)發(fā)的領(lǐng)域中氮双,愈充實(shí)的基礎(chǔ)知識(shí)在遇到狀況時(shí)愈能有效的解決問(wèn)題碰酝,甚至是提早預(yù)防。因?yàn)樵谥烙心男┈F(xiàn)成選項(xiàng)可以運(yùn)用戴差,也就不需要重新打造一個(gè)輪子送爸,而是站在巨人的肩膀上。

心酸的業(yè)界生態(tài)

身為開(kāi)發(fā)者必須要很清楚自己設(shè)計(jì)的每一個(gè)環(huán)節(jié)會(huì)產(chǎn)生的效果或可能的問(wèn)題造挽、限制碱璃,才能夠貼切地符合需求的內(nèi)容弄痹。這是需要具備一定的經(jīng)驗(yàn)和知識(shí)饭入,尤其是隨著時(shí)間的累進(jìn)、程序愈來(lái)愈精致化肛真,開(kāi)發(fā)程序時(shí)不論是編程語(yǔ)言或是作業(yè)平臺(tái)都伴隨著龐大的內(nèi)容谐丢、大量的資訊,需要時(shí)間來(lái)消化蚓让、理解乾忱。

入行的條件不再高不可攀

也許是現(xiàn)代開(kāi)發(fā)工具的強(qiáng)大與坊間的教育機(jī)構(gòu)的普及,很多人經(jīng)過(guò)簡(jiǎn)單的訓(xùn)練就以 “會(huì)把網(wǎng)絡(luò)上搜尋來(lái)的程序片斷兜起來(lái)历极、可以正常運(yùn)行” 當(dāng)成是寫(xiě)程序的全部窄瘟。但是科班出身的就充滿著光芒嗎练对?我也看過(guò)不少人隘擎,不是在課堂上虛擲光陰,就是沒(méi)有將所學(xué)融會(huì)貫通究西,展現(xiàn)出來(lái)的工作水準(zhǔn)也只是一般般锄列。

現(xiàn)在寫(xiě)程序的模式除了有現(xiàn)成的框架图云、庫(kù)可以選用,網(wǎng)絡(luò)資訊的發(fā)達(dá)讓形形色色的源代碼片段都可以搜尋得到邻邮,很多時(shí)候只要選好框架竣况、把網(wǎng)絡(luò)上的源代碼片段組合起來(lái),就可以有一個(gè)能夠運(yùn)行的程序筒严。當(dāng)然沒(méi)事就沒(méi)事丹泉,但不幸出事了要算是誰(shuí)的責(zé)任?

在過(guò)去的工作經(jīng)驗(yàn)里就曾經(jīng)遇過(guò)當(dāng)程序發(fā)生問(wèn)題鸭蛙,我問(wèn)負(fù)責(zé)的人出問(wèn)題的源代碼在做什么事摹恨,他回答我: “不知道,從網(wǎng)絡(luò)上貼來(lái)的规惰!” 如果你是老板睬塌,遇到這種情況會(huì)不會(huì)想:“那我應(yīng)該付錢(qián)給原作者?還是負(fù)責(zé)貼上的人?”

當(dāng)你不了解程序運(yùn)行的內(nèi)容揩晴,怎么能保證你的程序能夠穩(wěn)定地運(yùn)行勋陪、沒(méi)有安全上的疑慮?的確硫兰,在實(shí)作上有很多時(shí)候需要進(jìn)階一點(diǎn)的演算法诅愚,像是壓縮、圖形運(yùn)算劫映,非科班出身违孝、沒(méi)有數(shù)學(xué)基礎(chǔ)的還真沒(méi)有辦法理解。有點(diǎn)職業(yè)道德的人會(huì)盡可能地做好測(cè)試泳赋,就算不知道內(nèi)容雌桑,但最少確認(rèn)運(yùn)行的結(jié)果是自己要的。而不是交差后就當(dāng)沒(méi)事祖今,默默祈求程序不要出問(wèn)題校坑!

這個(gè)情況,讓人聯(lián)想到食安事件千诬。有一部份餐飲業(yè)者沒(méi)有具備烹飪的基本功夫耍目,所以很多材料必須要靠外購(gòu),對(duì)食材的特性也沒(méi)有足夠的掌握能力徐绑。但在成本的考量下邪驮,黑心一點(diǎn)就選擇明知有問(wèn)題、來(lái)路不明但成本低廉的食材傲茄。像是用的油出了事毅访、用到了地溝油,就只能推說(shuō): “我也是受害者烫幕,是那些做地溝油的廠商該死俺抽,應(yīng)該要向地溝油的廠商求償,與我無(wú)關(guān)较曼×赘”

當(dāng)然,也有負(fù)責(zé)任的店家并不是用成本低廉的食材但也遭到波及捷犹。第一時(shí)間會(huì)覺(jué)得這些人真的很無(wú)辜弛饭,但進(jìn)一步想想,要從事餐飲業(yè)是你的選擇萍歉,你的客人是信任你的烹飪技巧侣颂、口味的掌控、食材挑選能力等等的質(zhì)量要素枪孩,而不是信任你的進(jìn)貨廠商憔晒。出了問(wèn)題藻肄,要說(shuō)你完全沒(méi)有責(zé)任并不合理!對(duì)消費(fèi)者來(lái)說(shuō)拒担,合理方式應(yīng)該是先賠償給消費(fèi)者嘹屯,至于和進(jìn)貨廠商的賠償問(wèn)題是店家內(nèi)部的事,這樣對(duì)我們這些末端的消費(fèi)者才公平不是嗎从撼?而且州弟,規(guī)模大的商家更應(yīng)該要有資源、能力與責(zé)任承擔(dān)起這樣的標(biāo)準(zhǔn)低零。

寫(xiě)程序不再是閉門(mén)造車

反觀我們自己理所當(dāng)然地把別人寫(xiě)好的東西拿來(lái)用婆翔,卻鮮少深究?jī)?nèi)部運(yùn)作的邏輯,是不是也是一樣的缺乏商業(yè)道德掏婶?說(shuō)起來(lái)還挺心虛的啃奴,批評(píng)地義正嚴(yán)詞、擲地有聲气堕,原來(lái)比起食品產(chǎn)業(yè)我們高尚不到哪去纺腊!用 “我們” 似乎太過(guò)一竿子打翻船人,所以我招認(rèn)最少我自己是茎芭。

在社會(huì)分工細(xì)致化、講求效率的年代誓沸,工作當(dāng)中使用自己不了解的產(chǎn)品成了必要之惡梅桩,就像是要求店家所有的食材全部自制一樣,是一種奢求拜隧。再加上訊息科技雖然發(fā)展沒(méi)幾年宿百,但是已經(jīng)形成了一個(gè)很龐大的知識(shí)體系。不一而足的操作系統(tǒng)平臺(tái)洪添、程序語(yǔ)言垦页,多如繁星的框架、SDK干奢、庫(kù)痊焊,各行各業(yè)的領(lǐng)域知識(shí)、商業(yè)邏輯忿峻,每一個(gè)區(qū)塊都形成了一個(gè)有高度的門(mén)檻和學(xué)習(xí)障礙薄啥。在開(kāi)發(fā)程序時(shí),如果要完全以自制的模式來(lái)進(jìn)行逛尚,不是成本高得嚇人垄惧,就是時(shí)間長(zhǎng)得不能接受,以致于難以實(shí)行绰寞。

知名廠商的庫(kù)到逊、開(kāi)源的框架比較不可能會(huì)是問(wèn)題的來(lái)源铣口,畢竟這些程序都是以一般化的用途為出發(fā)點(diǎn)、能夠適用于大多數(shù)的情況之下觉壶,并且經(jīng)過(guò)重重的檢驗(yàn)枷踏、測(cè)試。知名的公司也不可能自毀招牌掰曾,放任產(chǎn)品中有明顯的瑕疪或安全問(wèn)題旭蠕。但由網(wǎng)絡(luò)上搜尋到的源代碼往往是示范性質(zhì)或?qū)榻鉀Q特定問(wèn)題,不見(jiàn)得與程序的需求百分之百的契合旷坦,如果一字不改或是對(duì)運(yùn)行的內(nèi)容一知半解的情況下編入程序內(nèi)掏熬,這樣的做法和之前舉的食安例子中使用來(lái)路不明食材的店家有何差別?

那有些小公司或不明來(lái)源編譯好的庫(kù)豈不是問(wèn)題潛在的制造者秒梅?會(huì)不會(huì)內(nèi)藏惡意的源代碼旗芬?這個(gè)問(wèn)題對(duì)于管理者來(lái)說(shuō)會(huì)是一個(gè)取決于風(fēng)險(xiǎn)與成本的困難抉擇。端看你的程序?qū)τ诎踩囊蟪潭壤κ瘢瞧髽I(yè)內(nèi)部敏感數(shù)據(jù)的系統(tǒng)疮丛?還是給一般人使用的系統(tǒng)?打算付出多少的成本辆它?沒(méi)有打算付出太多的成本誊薄,只能承受較高的風(fēng)險(xiǎn);不能承受風(fēng)險(xiǎn)的锰茉,就得要付出較多的成本呢蔫,像是有制度一點(diǎn)的應(yīng)該要成立專職的安全小組對(duì)程序做必要的檢測(cè)。

如果要問(wèn)我飒筑,所開(kāi)發(fā)的軟件遇到像食安風(fēng)暴的情況片吊,會(huì)不會(huì)采用和那些店家一樣的態(tài)度?我會(huì)协屡,同時(shí)還會(huì)用投名狀中龐青云的語(yǔ)氣說(shuō) “裝死無(wú)敵俏脊!這是規(guī)矩!” 肤晓。但這是問(wèn)題發(fā)生了的假設(shè)爷贫,在發(fā)生問(wèn)題之前我會(huì)想要盡可能地避免,畢竟程序是自己寫(xiě)的材原,光嘴巴上喊沒(méi)責(zé)任就可以置身事外也不太可能沸久。

追求質(zhì)量的價(jià)值在哪里?

要把這個(gè)想法做好余蟹,首先會(huì)遇到的就是被海量信息淹沒(méi)的無(wú)助卷胯。這是這行從業(yè)人員普遍會(huì)有的心酸,要學(xué)習(xí)的東西愈出愈快威酒、愈來(lái)愈多窑睁。先不看是不是有足夠的時(shí)間吸收挺峡,光信息量就已經(jīng)超出一般人大腦能夠承載的極限。餐飲界里隨處可見(jiàn)幾十年的老味道担钮,能夠傳承好幾代的手藝橱赠。反觀軟件界,當(dāng)年縱橫 COBOL 和 Fortran 語(yǔ)言的系統(tǒng)箫津,試問(wèn)如今安在狭姨?姑且不看這種由時(shí)代浪潮所帶來(lái)的興衰,同一家公司的技術(shù)總會(huì)一脈相傳苏遥、延續(xù)演進(jìn)吧饼拍?過(guò)去靠微軟的技術(shù)混過(guò)飯吃的那段日子,有過(guò)不少次被微軟打臉的經(jīng)驗(yàn)田炭,那頭才在研討會(huì)上大張旗鼓地?zé)崃彝其N师抄,回頭卻是悄悄收攤,不再發(fā)展教硫、更新叨吮。收兵尚且要鳴金,有的時(shí)候是連鳴金都省了瞬矩!我的青春茶鉴、我的人生,就在不斷地用新技術(shù)翻修舊系統(tǒng)的循環(huán)中渡過(guò)丧鸯。

信息技術(shù)的更替如過(guò)江之鯽的現(xiàn)象蛤铜,再加上公司高層多以利字為先,造就了不少開(kāi)發(fā)人員速成的心態(tài)丛肢。對(duì)使用的技術(shù)一知半解、得過(guò)且過(guò)剿干,源代碼能用就好蜂怎、不求甚解,反正用沒(méi)多久又要換一種寫(xiě)法置尔,復(fù)制貼上的時(shí)間已經(jīng)比自己打字的時(shí)間還多杠步。而衍生出來(lái)的問(wèn)題是遇到了技術(shù)上的狀況,常常磨了很久得到的答案是不可能解決榜轿、沒(méi)辦法處理幽歼。但等到換一個(gè)對(duì)技術(shù)比較自我要求的人去試時(shí)卻又不是這么回事,有時(shí)解決的方案還直接到不行谬盐,可是原本負(fù)責(zé)的人找答案時(shí)又認(rèn)真到你分不清楚是否是該歸類成偷懶的借口甸私!這樣的情況我遇到的并不是個(gè)案,也不是單一個(gè)人才有飞傀,甚至習(xí)以為常到不忍去苛責(zé)這個(gè)大環(huán)境所形成的共業(yè)皇型。就管理者的角度诬烹,迫于專業(yè)分工下的現(xiàn)實(shí),只能盡可能讓開(kāi)發(fā)人員針對(duì)自己擅長(zhǎng)的領(lǐng)域做專精弃鸦,用團(tuán)隊(duì)的力量來(lái)截長(zhǎng)補(bǔ)短绞吁。

既然業(yè)界風(fēng)氣如此,那一昧的追求開(kāi)發(fā)人員的素質(zhì)是否太過(guò)矯情唬格?還是個(gè)人完美主義在作崇家破?組合網(wǎng)絡(luò)上的源代碼所產(chǎn)出的程序真得有這么不堪、有這么嚴(yán)重嗎购岗?就如同做吃的這件事汰聋,沒(méi)有高超的烹飪技巧、專業(yè)級(jí)的食材挑選眼光藕畔,就不能煮東西給別人吃了嗎马僻?那這樣豈不是所有家庭的爸爸、媽媽都不能下廚注服,都只能外食韭邓?如果我有一道拿手的菜就不能分享給親戚好友、街坊鄰居溶弟?

我個(gè)人認(rèn)為女淑,程序本來(lái)就是解決問(wèn)題的工具,如果寫(xiě)的人快樂(lè)辜御、用的人也快樂(lè)鸭你,是否得這么吹毛求疪地一定要設(shè)定什么門(mén)檻或標(biāo)準(zhǔn)?我想并不是這樣的擒权,業(yè)界常常有一句話:“沒(méi)有最佳的解決方案袱巨,只有最適合的解決方案”。所以在這里完全沒(méi)有要貶低不是接受傳統(tǒng)制式訓(xùn)練的從業(yè)人員碳抄,或是對(duì)于愿意投入熱情從事程序開(kāi)發(fā)工作的人有任何不敬的意思愉老。相反地,能夠用程序解決生活中或是專業(yè)領(lǐng)域上遇到的問(wèn)題剖效,是很值得敬佩的一件事嫉入。最少人家有第二專長(zhǎng),而我只能靠人家的第二專長(zhǎng)糊口璧尸,光這一點(diǎn)就沒(méi)什么資格對(duì)人說(shuō)三道四的咒林。

不過(guò),這文章怎么好像愈寫(xiě)愈沒(méi)立場(chǎng)爷光,那還談什么素質(zhì)的提升垫竞?先來(lái)看看 Uber 和 Airbnb 的所帶來(lái)的爭(zhēng)議,這二個(gè)平臺(tái)所使用的模式很類似瞎颗,都是共享經(jīng)濟(jì)的實(shí)踐者件甥,分享私人閑置的資產(chǎn)來(lái)對(duì)大眾提供服務(wù)捌议。像是如果我有閑置的車子我可以開(kāi)著它去載客;如果我有閑置的房間我可以提供給短期需求的人來(lái)住宿引有。聽(tīng)起來(lái)很美好瓣颅,不但是各取所需,還可以有效利用資源譬正、落實(shí)環(huán)保的概念宫补。

但為什么有人要出來(lái)反對(duì)、抗議曾我,而政府也介入干預(yù)粉怕?是政府狗拿耗子?那些既得利益者眼紅抒巢?如果是眼紅贫贝,那出租車司機(jī)為什么不叫車隊(duì)也搞一個(gè)類似的平臺(tái)來(lái)競(jìng)爭(zhēng)就好?我用自己的車載朋友也要證照蛉谜?加入 Uber 載人違法稚晚,自己載朋友不違法,差別在哪型诚?是因?yàn)闆](méi)有從中獲利客燕?朋友請(qǐng)吃飯當(dāng)謝禮算不算從中得利?我使用的是全新車狰贯,車款高級(jí)也搓、內(nèi)裝豪華,載客時(shí)也是西裝革履涵紊,開(kāi)車時(shí)戰(zhàn)戰(zhàn)競(jìng)競(jìng)傍妒,車上還有額外的飲水服務(wù),哪一點(diǎn)比出租車差摸柄?明明雙方都是你情我愿拍顷,又沒(méi)礙著別人,這樣也要抗議塘幅?那有廚師證的為什么不出來(lái)抗議滿街沒(méi)證照的街邊小吃?開(kāi)店做生意的店家為什么不出來(lái)抗議擺在路旁的地?cái)偅?/p>

上面是延伸前一段的立場(chǎng)只呈現(xiàn)單一面的意見(jiàn)尿贫,而實(shí)際上兩造的論點(diǎn)各據(jù)一詞电媳、沒(méi)有太大的交集。但可以看到一個(gè)現(xiàn)象庆亡,都是提供服務(wù)的二方在爭(zhēng)議匾乓,購(gòu)買(mǎi)服務(wù)的第三方卻沒(méi)聽(tīng)到很大的負(fù)面評(píng)價(jià)。我想那是因?yàn)檫€沒(méi)有遇到危害切身利益的情況又谋,以服務(wù)提供者的角度來(lái)看拼缝,重點(diǎn)還是那句話:沒(méi)事就沒(méi)事娱局,但不幸出事了要算是誰(shuí)的責(zé)任?一但牽扯到利益咧七,問(wèn)題就會(huì)變得異常的復(fù)雜衰齐,不管你是爭(zhēng)議的哪一方、有沒(méi)有政府背書(shū)的證書(shū)继阻、或是你從哪個(gè)名校畢業(yè)的耻涛。面對(duì)的若是親朋好友,可能會(huì)看你的情面瘟檩,不用你開(kāi)口抹缕,就主動(dòng)放棄權(quán)利,也許幫忙出個(gè)必要的費(fèi)用就當(dāng)沒(méi)事墨辛。但如果是你不認(rèn)識(shí)的人卓研,你有把握可以說(shuō)服苦主讓你輕松過(guò)關(guān)嗎?爛客人事件在新聞中屢見(jiàn)不鮮睹簇,當(dāng)你碰上了一個(gè)要跟你走法律程序的對(duì)象奏赘,你真的有時(shí)間、心神應(yīng)付带膀?

所以志珍,如果你對(duì)于寫(xiě)出好程序還有一點(diǎn)期待,不管你是完美心態(tài)作崇垛叨、還是想要明哲保身伦糯,提升質(zhì)量是一項(xiàng)看得見(jiàn)回報(bào)的投資,所謂一分耕耘一分收獲嗽元,端看你想要先甘后苦還是先苦后甘敛纲。也就是說(shuō),看你想要先花時(shí)間避免未來(lái)的損害剂癌?還是你想要把時(shí)間用在出問(wèn)題后擦屁股這件事情上淤翔?

基礎(chǔ)、基礎(chǔ)佩谷、基礎(chǔ)

能做的努力大概就是一開(kāi)始提到的:基礎(chǔ)旁壮,多一分了解才多一分的機(jī)會(huì)知道怎么逃避責(zé)任... 我是說(shuō)保護(hù)自己,就像法律通常都是保護(hù)懂法律的人谐檀。當(dāng)然在軟件的工作領(lǐng)域中抡谐,很多是商業(yè)機(jī)密、只能用不能看桐猬,在沒(méi)有授權(quán)的情況下太 “深入” 是會(huì)有觸犯法律的風(fēng)險(xiǎn)麦撵。所以這里指的努力,當(dāng)然就是針對(duì)公開(kāi)的部份,像是文件免胃、開(kāi)源碼音五,至少讓自己不是在一知半解的情況下做出錯(cuò)誤的抉擇。

具備關(guān)鍵的知識(shí)

基礎(chǔ)中的基礎(chǔ)不外就是在學(xué)校中教授的那些課程羔沙,像是計(jì)算機(jī)概論躺涝、操作系統(tǒng)、數(shù)據(jù)結(jié)構(gòu)撬碟、工程數(shù)學(xué)等等诞挨。不過(guò),這些內(nèi)容卻也是在實(shí)際從事程序開(kāi)發(fā)時(shí)最不具存在感的內(nèi)容∧馗颍現(xiàn)在的程序設(shè)計(jì)都架構(gòu)在層層的堆疊與包裝之上惶傻,很多底層的問(wèn)題都被隱藏、處理掉了其障。像是很多的語(yǔ)言都有提供垃圾回收(GC)的機(jī)制银室,所以 Memory Leak 問(wèn)題變得不需要花時(shí)間處理,原本課堂上學(xué)的 Memory Leak 注意事項(xiàng)也無(wú)用武之地励翼。

但這些設(shè)計(jì)上的問(wèn)題仍然實(shí)際存在著蜈敢,有一些仍然是要靠開(kāi)發(fā)人員素養(yǎng)來(lái)做出適當(dāng)?shù)木駬瘛T谶x擇變量類型來(lái)儲(chǔ)存數(shù)字?jǐn)?shù)據(jù)時(shí)汽抚,有些人會(huì)想容量應(yīng)該是愈大愈好抓狭,以免數(shù)字不小心超過(guò)上限而讓程序出現(xiàn)問(wèn)題。在沒(méi)有接觸過(guò)相關(guān)的知識(shí)會(huì)根本沒(méi)想到造烁,變量的型別會(huì)對(duì)運(yùn)作的效能上產(chǎn)生影響否过。而造成效能影響的原因,來(lái)自變量型別與記憶體長(zhǎng)度的關(guān)系惭蟋,是底層一個(gè)意想不到的運(yùn)作規(guī)則苗桂。

還有像是之前提到的多線程在設(shè)計(jì)時(shí)會(huì)遇到諸多的問(wèn)題,如果具有相關(guān)的知識(shí)就會(huì)了解系統(tǒng)底層的工作原理告组、多線程的管理方式煤伟、對(duì)應(yīng)處理的機(jī)制。數(shù)據(jù)結(jié)構(gòu)可以協(xié)助設(shè)計(jì)有效率的數(shù)據(jù)處理模式木缝,像是如果要進(jìn)行排序會(huì)有許多的排序演算法可用運(yùn)用便锨,每一種都有其特性和適用的時(shí)機(jī),并且有一套學(xué)術(shù)上的方法可以預(yù)估處理模式在效率上是否符合需求我碟。同時(shí)也會(huì)知道遞歸很好用鸿秆,但呼叫階層數(shù)太多程序是會(huì)當(dāng)?shù)舻摹H绻?jì)算 1 加到 N 的總合怎囚,第一直覺(jué)是使用遞歸來(lái)寫(xiě),寫(xiě)出來(lái)的程序卻有個(gè)致命的缺點(diǎn),N 有上限恳守、超過(guò)程序會(huì)當(dāng)?shù)艨加ぁ?墒歉挠锰菪蚊娣e公式催烘,程序只要一行沥阱、運(yùn)行時(shí)間天差地別,N 也可以理論上達(dá)到無(wú)限大伊群,最少可以達(dá)到變量能儲(chǔ)存總合的最大值考杉。

這些相關(guān)的機(jī)制大多會(huì)被實(shí)作在編程語(yǔ)言所搭配的 SDK 上,技術(shù)文件中也許只會(huì)提到使用的規(guī)格舰始,而不會(huì)有詳細(xì)的說(shuō)明來(lái)解釋背后的原理崇棠。當(dāng)你擁有相關(guān)的背景知識(shí)就可以適切的運(yùn)用這些功能,而不是靠著猜測(cè)與試驗(yàn)來(lái)決定要選擇哪一種方案丸卷。這些選擇對(duì)程序的穩(wěn)定性與運(yùn)行效率都會(huì)有舉足輕重的影響枕稀,也決定著程序一但出現(xiàn)問(wèn)題時(shí)初步處理的策略,發(fā)現(xiàn)及解決問(wèn)題所要耗去的時(shí)間谜嫉。

數(shù)學(xué)更是這一些基礎(chǔ)知識(shí)最不起眼的萎坷,就像我過(guò)去在企業(yè) IT 部門(mén)服務(wù)的經(jīng)驗(yàn)里,高階的數(shù)學(xué)知識(shí)完全束之高閤沐兰,大多數(shù)的程序只是單純地要求數(shù)據(jù)庫(kù)的 CRUD哆档,數(shù)據(jù)處理的運(yùn)算需求也頂多是加減乘除。不過(guò)住闯,數(shù)學(xué)基本上可以訓(xùn)練邏輯推演瓜浸、協(xié)助思考,如果能夠融會(huì)貫通是有機(jī)會(huì)可以讓自己增加薪資條件寞秃、進(jìn)入特定的專精領(lǐng)域斟叼,像是圖學(xué)里的演算多是靠矩陣、向量等運(yùn)算來(lái)進(jìn)行春寿,這是在影像處理朗涩、游戲、3D 應(yīng)用中必須的绑改。

同時(shí)谢床,沒(méi)有明顯的助益并不代表就是多余的。這些知識(shí)會(huì)成為基礎(chǔ)是有其道理厘线,所有的人造物都不會(huì)是跳躍式地一下就以復(fù)雜的結(jié)構(gòu)出現(xiàn)识腿,都會(huì)是由簡(jiǎn)單的規(guī)則組合并堆砌所演化出來(lái)的。這個(gè)理論套用在軟件產(chǎn)業(yè)中一樣適用造壮,基于相同底層所發(fā)展出來(lái)的系統(tǒng)都會(huì)具有一定的相似度渡讼。所以吸收的這些知識(shí)會(huì)內(nèi)化成為你的工作能力骂束,例如增加技術(shù)的敏銳度,提升學(xué)習(xí)的效率成箫,更容易接納新的技術(shù)展箱、縮短上手時(shí)間。這就好像如果你有富爸爸蹬昌,做起事來(lái)一定是事半功倍混驰;但反過(guò)來(lái)如果是白手起家,遇到困難就是只能一步一腳印地走出來(lái)了皂贩。

掌握編程語(yǔ)言

再接下來(lái)的這項(xiàng)基礎(chǔ)效果就會(huì)比較明顯一點(diǎn)栖榨,那就是編程語(yǔ)言編程語(yǔ)言是程序開(kāi)發(fā)的核心明刷,用來(lái)編譯成 CPU 可運(yùn)行機(jī)械語(yǔ)言的依據(jù)婴栽。而編程語(yǔ)言靠的是保留字來(lái)跟編譯器溝通,透過(guò)保留字設(shè)定好的意義來(lái)轉(zhuǎn)換成機(jī)械語(yǔ)言字節(jié)碼遮精。

編程語(yǔ)言是所有人接觸程序的切入點(diǎn)居夹,學(xué)習(xí)編程語(yǔ)言的脈絡(luò)不外是變量宣告運(yùn)算符本冲、陳述准脂、流程控制,進(jìn)階的還有面向?qū)ο蟪绦蛟O(shè)計(jì)檬洞,但有不少人對(duì)于編程語(yǔ)言的學(xué)習(xí)也就僅此而已狸膏。隨著時(shí)間的推演,不少的新概念被導(dǎo)入既有的編程語(yǔ)言之中添怔,像是現(xiàn)在最新的是大家都流行要 Lambda 一下湾戳,再早一點(diǎn)是使用 Attribute 來(lái)提供源代碼在運(yùn)行時(shí)期的附屬資訊,或是利用保留字來(lái)簡(jiǎn)化多線程環(huán)境的數(shù)據(jù)同步問(wèn)題广料。

這些編程語(yǔ)言的新語(yǔ)法如果不會(huì)對(duì)寫(xiě)程序造成改變砾脑,通常也都不會(huì)、畢竟還是要考慮到相容性艾杏,很多人的選擇都是視而不見(jiàn)韧衣。就算是以喜新厭舊聞名的信息產(chǎn)業(yè),仍存在著為數(shù)不少的堅(jiān)持不輕易改變的從業(yè)人員购桑。姑且不看新的語(yǔ)法所帶來(lái)的撰寫(xiě)上的彈性畅铭、工作效率的增加、運(yùn)行效能的提升等優(yōu)勢(shì)勃蜘,就算是只安于剪下貼上的工作模式硕噩,當(dāng)網(wǎng)絡(luò)上搜到的示范源代碼愈來(lái)愈多是以新語(yǔ)法撰寫(xiě)時(shí),打算如何銜接到所負(fù)責(zé)的源代碼內(nèi)缭贡?或是有一個(gè)對(duì)新技術(shù)高度狂熱的同事寫(xiě)的源代碼要讓你接手炉擅,這時(shí)還能夠以不變應(yīng)萬(wàn)變嗎辉懒?

只有新玩意才不被人重視?泛型就不是個(gè)新玩意坑资,但沒(méi)聽(tīng)過(guò)耗帕、不知道如何使用還大有人在,不然就是只會(huì)依樣畫(huà)葫蘆地呼叫以泛型寫(xiě)的功能袱贮,自己要設(shè)計(jì)卻無(wú)從下手、也不了解別人含有泛型設(shè)計(jì)的源代碼体啰。所以對(duì)編程語(yǔ)言不夠了解會(huì)導(dǎo)致的下埸就是看不懂別人寫(xiě)的源代碼攒巍,能被分配的工作就只能是只寫(xiě)不改,可能嗎荒勇?

雖說(shuō)看得懂別人寫(xiě)的源代碼柒莉,是發(fā)現(xiàn)邏輯錯(cuò)誤或語(yǔ)法問(wèn)題的第一步,看懂了卻忽略細(xì)節(jié)一樣也可能對(duì)錯(cuò)誤視而不見(jiàn)沽翔。有一個(gè)很古老的案例兢孝,以下有一個(gè)在 VB 還沒(méi)有進(jìn)入 .NET 的時(shí)代的源代碼范例:

Dim A, B, C As Integer

我遇到很多人都以為三個(gè)變量全部是以整數(shù)類型儲(chǔ)存在記憶體中,但實(shí)際上卻是只有 C 是整數(shù)類型仅偎,另外二個(gè)是以 Variant 的型別來(lái)運(yùn)作跨蟹。這個(gè)問(wèn)題嚴(yán)重嗎?就 VB 的語(yǔ)言特性來(lái)說(shuō)橘沥,平常不會(huì)出現(xiàn)什么異樣窗轩。只是當(dāng)問(wèn)題出在 Variant 上,源代碼的差異一下沒(méi)看出來(lái)座咆,要確認(rèn)問(wèn)題發(fā)生的原因還是挺累人的痢艺。

還有一個(gè)很基本卻是不少人忽略的細(xì)節(jié),那就是變量的生存周期介陶、作用域的議題堤舒。看似不經(jīng)意的變量聲明動(dòng)作哺呜,影響所及是程序會(huì)不會(huì)虛耗寶貴的記憶體空間舌缤、占著毛坑不拉屎;也有可能變量的內(nèi)容在沒(méi)有料想到的惰況下被更改弦牡,讓程序時(shí)不時(shí)地出現(xiàn)莫名其妙的反應(yīng)友驮,卻又遍尋不著發(fā)生問(wèn)題的原因。

善用開(kāi)發(fā)的工具

要開(kāi)發(fā)程序驾锰,絕大多數(shù)的人大概已經(jīng)脫離不了對(duì) IDE 的依賴卸留,一個(gè)整合好開(kāi)發(fā)所需環(huán)境的工具。從單純的打字椭豫、編譯耻瑟、調(diào)試等基本的開(kāi)發(fā)功能旨指,到源代碼提示、即時(shí)語(yǔ)法檢查喳整、源代碼重構(gòu)谆构、版本控管、源代碼復(fù)雜度檢查框都、效能檢測(cè)搬素、測(cè)試報(bào)告等跟團(tuán)隊(duì)與質(zhì)量相關(guān)的功能。能做的事愈來(lái)愈多魏保,但我們?cè)谶M(jìn)行開(kāi)發(fā)工作時(shí)對(duì) IDE 提供的功能中能夠掌握運(yùn)用的比例有多少熬尺?

很多跟 Application Lifecycle Management 相關(guān)的功能也許不是負(fù)責(zé)開(kāi)發(fā)工作的人說(shuō)要用就用得上,但還有不少是和工作效率習(xí)習(xí)相關(guān)的可以快速發(fā)現(xiàn)問(wèn)題谓罗、縮減開(kāi)發(fā)工作負(fù)擔(dān)的功能粱哼。曾經(jīng)就有遇過(guò)有人在調(diào)試時(shí),仍在使用最基本的左右逼近法檩咱,完全不知道有條件斷點(diǎn)可以用揭措。很難想像在遇到大型循環(huán)時(shí),怎么有辦法耐得住性子刻蚯,一次又一次地按著單步運(yùn)行的按鈕绊含,直到期望的條件出現(xiàn);又或者是在很多階層的遞歸之間芦倒,是如何保持清醒艺挪、很明確地知道現(xiàn)在程序走到了第幾層的呼叫?

“工欲善其事兵扬,必先利其器” 大家都知道麻裳,很多人也羨慕 MacGyver 可以用一把瑞士軍刀就可以解決很多問(wèn)題,但卻在自己拿到瑞士軍刀時(shí)器钟,只知道使用其中一項(xiàng)工具來(lái)解決所有問(wèn)題津坑。有的時(shí)候,功能的使用是需要有一點(diǎn)創(chuàng)意才能找到符合自己習(xí)慣的模式傲霸,但最少應(yīng)該要先點(diǎn)開(kāi)來(lái)把玩看看疆瑰,才能借由熟悉找到最合適的使用情境。

熟悉程序運(yùn)作的環(huán)境

這里的環(huán)境指的是由操作系統(tǒng)內(nèi)建函式昙啄、官方 SDK穆役、各式框架、第三方庫(kù)所組成梳凛,用來(lái)提供程序運(yùn)行時(shí)期一切運(yùn)作的基礎(chǔ)耿币。既然是基礎(chǔ),就是在提升開(kāi)發(fā)人員素質(zhì)里所要討論的范圍內(nèi)韧拒。

這個(gè)部份還真的是知易行難的典范淹接,跟學(xué)校教授的課程相比變遷劇烈十性、跟編程語(yǔ)言的內(nèi)容相比更加龐雜無(wú)邊、跟開(kāi)發(fā)工具的功能組合相比更是繁復(fù)多變塑悼。隨便挑一小區(qū)塊的資訊都可能看到成了過(guò)去式還看不完劲适,是很心酸,但無(wú)奈之余最少應(yīng)該要對(duì)工作所需要的領(lǐng)域有 “基本的認(rèn)識(shí)” 厢蒜。

過(guò)去有接觸過(guò)不少有所謂的 “開(kāi)發(fā) Android 程序” 經(jīng)驗(yàn)的人霞势,對(duì)談之后發(fā)現(xiàn)這些人對(duì) Intent, Service, Content Provider, Broadcast Receiver 等等基礎(chǔ)的控件完全沒(méi)有概念,不要說(shuō)沒(méi)有使用的經(jīng)驗(yàn)斑鸦,甚至連這些名詞都一無(wú)所悉支示。還有的根本不知道自己寫(xiě)程序用來(lái)控制畫(huà)面的控件叫 Activity,當(dāng)然也不用提進(jìn)階一點(diǎn)的 PendingIntentIntentService鄙才。這應(yīng)該已經(jīng)不是專不專業(yè),而是合不合格的問(wèn)題了促绵!

再來(lái)看一個(gè)架構(gòu)大一點(diǎn)的例子攒庵,在因應(yīng) RESTFul 輕量化需求而誕生的 ASP.NET Web API 之前,WCF 一直占據(jù)著微軟遠(yuǎn)程過(guò)程調(diào)用的主要舞臺(tái)败晴。WCF 借著簡(jiǎn)化的開(kāi)發(fā)過(guò)程浓冒、彈性的設(shè)定檔調(diào)整,讓不具底層知識(shí)的開(kāi)發(fā)人員也可以輕易的建立跨電腦傳遞的功能尖坤,成為了企業(yè)內(nèi)架構(gòu)分散式系統(tǒng)的好選擇稳懒。但隨著移動(dòng)平臺(tái)的堀起,移動(dòng)裝置要被納入分散式系統(tǒng)成了熱門(mén)的需求慢味。這時(shí)场梆,不知 HTTP 規(guī)格是何物的開(kāi)發(fā)人員就踢到了鐵板!要讓沒(méi)有 WCF 的移動(dòng)平臺(tái)可以呼叫的情況下纯路,限制服務(wù)端只能用 HTTP 通訊是必然的或油。然而安全性WCF 主打的特色之一,服務(wù)端一定設(shè)計(jì)了相當(dāng)程度的安全驗(yàn)證驰唬,沒(méi)有 WCF 怎么通過(guò)驗(yàn)證顶岸?

該想到的情況 WCF 都想到了,沒(méi)想到的也保留了接口可以擴(kuò)充叫编,調(diào)整設(shè)定參數(shù)就可以完成準(zhǔn)備辖佣。移動(dòng)裝置要如何送出驗(yàn)證信息卻是尚待解決的問(wèn)題,如果送不了搓逾,是不是把服務(wù)端的安全機(jī)制撤下來(lái)卷谈?有資安這種單位在,這個(gè)想法是不可能的恃逻!為了移動(dòng)平臺(tái)再重新打造一組服務(wù)雏搂?如果有閃電俠在可以考慮一下藕施!這時(shí)如果對(duì) HTTP 的規(guī)格有一定的了解、研究過(guò) WCF 設(shè)定細(xì)節(jié)凸郑,就可以知道 WCF 要進(jìn)行何種設(shè)定裳食,并且在移動(dòng)平臺(tái)送出要求時(shí)要附上什么樣的驗(yàn)證資訊,以最低的成本來(lái)達(dá)成任務(wù)芙沥。

對(duì)于所謂 “基本認(rèn)識(shí)” 的作法诲祸,每個(gè)人天賦不同、做法也因人而異而昨,也許有神人能夠把所有的資訊記憶在腦海之中救氯。我的習(xí)慣是最少先瀏覽一遍文件的目錄或大綱讓腦海中有一個(gè)印象,然后期望體內(nèi)的小宇宙能在遇到障礙時(shí)歌憨,提醒我排除的方法可能存在于文件的某一處着憨。有的時(shí)候的確會(huì)很神奇的靈光一閃、小有幫助务嫡,多數(shù)的時(shí)候還是得靠 Google 大神甲抖,有道是團(tuán)結(jié)才是力量嘛!只是就算 Google 再神心铃,也得要知道怎么問(wèn)准谚、下什么關(guān)鍵字,這就要看平常閱讀的功夫下得有多深了去扣,也就是一開(kāi)頭提到的 “基礎(chǔ)柱衔、基礎(chǔ)、基礎(chǔ)”愉棱。

最后

總算唆铐,文章的篇幅很長(zhǎng),大多是過(guò)去工作遇到狀況的縮影羽氮。叨叨絮絮地打了很多或链,是希望能讓剛接觸這個(gè)行業(yè)的人多些參考。感謝能夠這么耐心地看到最后的各位档押!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末澳盐,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子令宿,更是在濱河造成了極大的恐慌叼耙,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件粒没,死亡現(xiàn)場(chǎng)離奇詭異筛婉,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)爽撒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)入蛆,“玉大人,你說(shuō)我怎么就攤上這事硕勿∩诨伲” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵源武,是天一觀的道長(zhǎng)扼褪。 經(jīng)常有香客問(wèn)我,道長(zhǎng)粱栖,這世上最難降的妖魔是什么话浇? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮闹究,結(jié)果婚禮上幔崖,老公的妹妹穿的比我還像新娘。我一直安慰自己渣淤,他們只是感情好岖瑰,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著砂代,像睡著了一般。 火紅的嫁衣襯著肌膚如雪率挣。 梳的紋絲不亂的頭發(fā)上刻伊,一...
    開(kāi)封第一講書(shū)人閱讀 51,688評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音椒功,去河邊找鬼捶箱。 笑死,一個(gè)胖子當(dāng)著我的面吹牛动漾,可吹牛的內(nèi)容都是我干的丁屎。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼旱眯,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼晨川!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起删豺,我...
    開(kāi)封第一講書(shū)人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤姓惑,失蹤者是張志新(化名)和其女友劉穎已骇,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡萌庆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡猜惋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出培愁,到底是詐尸還是另有隱情著摔,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布竭钝,位于F島的核電站梨撞,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏香罐。R本人自食惡果不足惜卧波,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望庇茫。 院中可真熱鬧港粱,春花似錦、人聲如沸旦签。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)宁炫。三九已至偿曙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間羔巢,已是汗流浹背望忆。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留竿秆,地道東北人启摄。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像幽钢,于是被迫代替她去往敵國(guó)和親歉备。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,167評(píng)論 25 707
  • 本文把程序員所需掌握的關(guān)鍵知識(shí)總結(jié)為三大類19個(gè)關(guān)鍵概念匪燕,然后給出了掌握每個(gè)關(guān)鍵概念所需的入門(mén)書(shū)籍蕾羊,必讀書(shū)籍,以及...
    dle_oxio閱讀 11,123評(píng)論 6 244
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理帽驯,服務(wù)發(fā)現(xiàn)肚豺,斷路器,智...
    卡卡羅2017閱讀 134,660評(píng)論 18 139
  • 文/子胡 2015-7-3
    一葉扁舟濟(jì)滄海閱讀 489評(píng)論 0 0
  • 面對(duì)未知截碴,從來(lái)沒(méi)有完美的選擇梳侨。 可你并不用焦慮, 因?yàn)榇驍〗箲]的最好辦法日丹, 就是做那些讓你焦慮的事情走哺。 Lucy,...
    小薇的微觀閱讀 1,472評(píng)論 0 3