往期回顧
TALK 6:編程的技術(shù)|藝術(shù)|術(shù)術(shù)(上篇)骨灰級程序員的心路歷程
前期回顧上篇里,骨灰級程序員梁峻墅給大家介紹了他的心路歷程,以及他對程序員文化和武林文化的理解。本篇將繼續(xù)請大神和我們一起聊一聊編程的藝術(shù)和哲學(xué)。
編程的思想境界和層次
上篇的段子講完了,現(xiàn)在進(jìn)入正題:編程的終極奧義到底是什么?
我理解只有思想恒久遠(yuǎn),代碼才能永流傳。因?yàn)榫幊叹褪前讶祟惖恼Z言給轉(zhuǎn)換成計(jì)算機(jī)能執(zhí)行的機(jī)器語言,本質(zhì)就是一種翻譯工作,但翻譯的水平也是有高有低的。
像電影《Sucker Punch》是一部非常有創(chuàng)意的內(nèi)涵思想片,還能融合夢幻、魔幻、科幻、暗黑、倫理、動作、微色情、小蘿莉、暴力美學(xué)等多種元素做到雅俗共賞,不同層次的人都能從這部影片中獲得不同的樂趣。
但這部電影在華語區(qū)的票房慘淡,就是由于譯名問題,該片的價(jià)值被嚴(yán)重低估。臺灣翻譯為《殺客同萌》,基本做到了意音具備,就是神還差點(diǎn)。但看看大陸翻譯為《美少女特攻隊(duì)》是幾個(gè)意思,讓人以為是二次元動畫片。再看看香港的翻譯《專扁衰仔》,你就知道沒文化有多可怕,扎克·施奈德估計(jì)直接哭暈在廁所里。翻譯的思想高度不同,對作品的理解深度不同,翻譯的質(zhì)量是天壤之別。而對于像編程如此縝密的翻譯工作,那更是需要蘊(yùn)含深刻的思想才能做得更好。
既然談到思想,就要談到思想的境界。
我理解編程的境界有四層,借用孫子兵法,分別是:下兵伐城、中兵伐謀、上兵伐心和不戰(zhàn)而屈人之兵為超然。
第一層:下兵伐城
很多程序員,一接到編程需求,就立刻啟動開發(fā)環(huán)境,開始編程敲代碼了。這就是沒什么想法,先干起來再說,編到哪兒算哪兒。面向交付編程,只為完成功能,頭痛醫(yī)頭,腳痛醫(yī)腳。一路攻城略地,好不威風(fēng),但這只能算初級水平。
第二層:中兵伐謀
拿到需求之后,不著急動手,先開始思考,開始謀劃,應(yīng)該走什么技術(shù)路線,結(jié)合哪些已經(jīng)做過的代碼,還應(yīng)使用哪些技術(shù)手段來快速、輕松地完成這個(gè)需求。這個(gè)層面的程序員已經(jīng)開始不靠純技術(shù)硬扛需求,而是開始藝術(shù)性地解決問題。大家拼的不是能不能解決問題,而是看誰解決問題的成本最低。像中醫(yī)那樣,并不直接治病,而是陰陽調(diào)和,打通經(jīng)脈,調(diào)動自身免疫系統(tǒng),四兩撥千斤,這已經(jīng)開始有中國式智慧的味道了。這種人經(jīng)常在計(jì)算機(jī)旁邊呆坐半天,即使表面上在和你說話,但其實(shí)腦子里在伐謀呢,所以經(jīng)常表達(dá)古怪,被認(rèn)為是書呆子。
第三層:上兵伐心
這種人已經(jīng)能看到文人的清風(fēng)傲骨,在更高的戰(zhàn)略層面思考解決問題的時(shí)空成本,包括但不限于時(shí)間成本、分析成本、設(shè)計(jì)成本、編碼成本、調(diào)試成本、部署成本、維護(hù)成本、用戶的使用成本、資源的調(diào)配成本、社會的綜合人文成本等等,得到結(jié)果后會產(chǎn)生一個(gè)靈魂拷問:“為什么要解決這個(gè)問題?能不能不解決?”帶有原罪的需求都挺不過這個(gè)終極審判。比如很多需求,只是貌似合理,但實(shí)際上是偽需求,頂尖的高手能夠抽絲剝繭,發(fā)現(xiàn)需求的邏輯矛盾和漏洞,并能綜合運(yùn)用各種手段,甚至包括非技術(shù)手段來及時(shí)糾偏。比如做MIS系統(tǒng)的時(shí)候,客戶方的辦公自動化系統(tǒng)需求很簡單,就是把現(xiàn)有的管理規(guī)章制度全部用計(jì)算機(jī)程序?qū)崿F(xiàn)一遍。這個(gè)需求貌似天真無邪,但實(shí)際上它忽視了人機(jī)之間的差異和特點(diǎn)。比如對人工作業(yè),為達(dá)到作業(yè)合規(guī)的要求,管理規(guī)章制度中就要有反作弊措施,各個(gè)相關(guān)部門還都要有作業(yè)數(shù)據(jù)備份,以便將來發(fā)現(xiàn)問題倒查時(shí)可以對口供。但對IT系統(tǒng),用戶都有登錄ID,作業(yè)都有事務(wù)ID,交互都有會話ID,存儲都是一體化的,根本不需要那些畫蛇添足的步驟。頂級的程序員就會庖丁解牛般地優(yōu)化管理流程,引導(dǎo)需求合理化,節(jié)省了大量的研發(fā)資源、應(yīng)用資源和社會資源。可能只需要修改管理規(guī)章制度的幾十個(gè)字,就能少寫幾萬行代碼,bug能少幾百個(gè),部署維護(hù)能少幾個(gè)月,用戶每天能少點(diǎn)擊數(shù)千次鼠標(biāo)。通過少編程,甚至不編程就能解決問題,才是最牛逼的境界。
第四層:不戰(zhàn)而屈人之兵
終于來到最最牛逼的境界——不戰(zhàn)而屈人之兵。前面三層境界,也就是在滿足需求、預(yù)測需求、引領(lǐng)需求上做文章,畢竟都是咱們這個(gè)世界可以理解的事。而最高境界已經(jīng)跳出三界之外,不在五行之中,已經(jīng)無法理解了。
看個(gè)場景先:小白最近代碼輸出太少,說機(jī)器頻繁死機(jī),耽誤了工作。大牛對著機(jī)器,上去就是一腳,從此再不死機(jī)了…天理何在?小白不服啊,碰上死機(jī)的機(jī)器也來一腳,結(jié)果當(dāng)天就去財(cái)務(wù)領(lǐng)工資了…天理難容!雖然都是人,但差別就這么大,找誰說理去。
再看段對話:
-
小白:“哥,我做的那個(gè)模塊總是有bug,調(diào)試兩三天了,一直找不到原因,您有空幫我看看唄?!?/p>
-
大牛:“走”
-
來到現(xiàn)場。
-
小白:“您看這…”
-
大牛:“別急,從頭開始把錯(cuò)誤給我演示一遍”
-
小白:“好嘞”
-
一個(gè)小時(shí)過去了…
-
小白:“我call,怎么不出來了呢?大哥,我發(fā)誓我找你之前還復(fù)現(xiàn)過一次錯(cuò)誤”
-
大牛:“沒事,我已經(jīng)習(xí)慣了,等再出錯(cuò),保留現(xiàn)場,call我”
然后就沒有然后了,因?yàn)樵贈]出過錯(cuò)!
大牛只要頭皮更出眾,那就bug去無蹤,所有的大牛都有這樣的體驗(yàn)。我理解大牛都是有超自然的氣場,常年抓bug,戾氣太重,bug都嚇跑了!不管你們信不信,我反正是信了。這就是最高境界,什么都不用干,坐在那兒喘氣就能解決問題……
編程的技術(shù)說完前面那些思想和層次,現(xiàn)在咱們來談點(diǎn)真正有用的編程技術(shù)。
編程有著悠久的歷史,大約在137億年前,奇點(diǎn)大爆炸,咱們?nèi)祟惒恍姨幵谶@個(gè)由時(shí)間和空間組成的萬惡世界,空間可以理解為除時(shí)間之外的一切,時(shí)空之間不斷相互轉(zhuǎn)換,對稱規(guī)則讓整個(gè)世界動態(tài)守恒。閑的蛋疼的意識們企圖把這個(gè)混沌的世界按自己的想法有序化,世界則按規(guī)則自動產(chǎn)生了無序與之平衡。
說這么累的意思就是,程序員編程的一生都要與bug為伍,不要害怕它,也不要想著完全消滅它,而是想辦法與它和諧共處,人bug合一。
第一就是盡量減少bug產(chǎn)生的機(jī)率。畢竟人少了才好相處,人太多了則很難伺候。談過女朋友的,應(yīng)該都有體會。你每敲一次鍵盤,都有可能產(chǎn)生bug。所以,每次敲代碼時(shí),應(yīng)該多想想自己的祖國、各族人民的福祉,董存瑞、劉胡蘭等民族英雄的期許,還有自己父母的厚望,這次鍵擊是不是真的對的起他們!都說頭上三尺有神靈,但咱們程序員頭上三座大山全是虎視眈眈的bug,你稍不留神,它們就會順著鍵盤潛入到你的代碼里,且按且珍惜。
第二,讓bug舉步維艱,無處遁形。敗兵先戰(zhàn)而后求勝,勝兵先勝而后求戰(zhàn)。經(jīng)常打敗仗的人總是先打再說,然后企圖僥幸取勝;而常勝將軍都是先不斷創(chuàng)造勝利的條件,已經(jīng)勝券在握了才開戰(zhàn)!編程的基本技術(shù)就是要編寫低bug代碼,一切為了debug,所有的代碼都要為調(diào)試做好準(zhǔn)備。說這些戰(zhàn)術(shù)級技巧的理論只會隔靴搔癢,后面會結(jié)合具體的代碼講解,大家才會更有感覺,點(diǎn)到為止先。
編程的藝術(shù)
其實(shí)任何一門技術(shù),上升到一定層次后,都會變成一門藝術(shù)。編程也是如此。
我們在這個(gè)時(shí)空世界里,都有自己的當(dāng)前態(tài)和目標(biāo)態(tài),但無論哪種態(tài)都有自己的時(shí)空坐標(biāo),代碼就是企圖讓這兩個(gè)態(tài)的坐標(biāo)重疊,而實(shí)現(xiàn)重疊的路徑是無窮無盡的,但一定至少有一個(gè)最佳實(shí)現(xiàn)路徑。代碼的藝術(shù),就是實(shí)現(xiàn)這個(gè)路徑的策略,在空間與時(shí)間之間做權(quán)衡,要么時(shí)間換空間,要么空間換時(shí)間,變換到下一個(gè)態(tài),不斷重復(fù)這個(gè)過程,直到到達(dá)目標(biāo)態(tài)。換成人話就是:所有的代碼客觀上只有特點(diǎn),主觀上的優(yōu)點(diǎn)和缺點(diǎn)其實(shí)都是程序員意淫出來的,優(yōu)點(diǎn)都是用缺點(diǎn)換來的,缺點(diǎn)都是優(yōu)點(diǎn)導(dǎo)致的,優(yōu)點(diǎn)和缺點(diǎn)實(shí)際上是一回事,只是意淫角度不同而已。
比如,總有人說UNIX/Linux比Windows更安全,而這根本不是技術(shù)的問題,而是藝術(shù)的問題。UNIX/Linux是個(gè)悲觀型操作系統(tǒng),假設(shè)用戶都是壞人,系統(tǒng)默認(rèn)什么都不能干,除非明確指出這個(gè)用戶能干什么;而Windows是個(gè)樂觀型操作系統(tǒng),假設(shè)用戶都是好人,系統(tǒng)默認(rèn)什么都能干,除非明確指出這個(gè)用戶不能干什么。所以在默認(rèn)情況下,UNIX/Linux適合做機(jī)機(jī)交互,典型應(yīng)用于服務(wù)器,而Windows適合做人機(jī)交互,典型應(yīng)用于個(gè)人計(jì)算機(jī)。但這些特性都可以通過配置安全選項(xiàng),把Windows操作系統(tǒng)變的比Linux/Unix操作系統(tǒng)還安全,也可以把Linux/Unix操作系統(tǒng)變的比Windows操作系統(tǒng)還不安全。這都是藝術(shù)的事,與技術(shù)無關(guān),但比技術(shù)還重要。
代碼的藝術(shù)性范圍很廣,包括但不限于默認(rèn)值、參數(shù)、接口等具體設(shè)計(jì),這些都可以在后面的代碼講解中讓大家好好爽一把。
編程的術(shù)術(shù)藝術(shù)是技術(shù)的抽象,術(shù)術(shù)則是藝術(shù)的再抽象,這部分內(nèi)容我將盡量說人話。
我理解程序員在編程的時(shí)候,要意識到這些代碼是面向開發(fā)者的,面向你的同行,是給他們看的。代碼在舉手投足之間,要透露出一種優(yōu)雅的美,人見人愛,花見花開,車見車爆胎的那種。
舉個(gè)例子:在做一個(gè)功能時(shí),發(fā)現(xiàn)微軟提供的系統(tǒng)API在某些特定條件下,返回值錯(cuò)誤。怎么辦?
基層小鬼:匹夫之勇,自己重新實(shí)現(xiàn)一遍該API的功能,結(jié)果是除了測試路徑能覆蓋的條件外,其他條件下全是bug。
中層干部:騷人墨客,給微軟報(bào)告這個(gè)bug,等待官方臨時(shí)解決方案,合規(guī)但官僚。
高級貨:清風(fēng)仙骨,給微軟報(bào)告這個(gè)bug,但順手寫下解決方案。前置偵測代碼,檢測此API是否已修復(fù)這個(gè)問題,如果已修復(fù)則正常執(zhí)行,否則執(zhí)行糾偏代碼。這樣無論是現(xiàn)在還是以后,這段代碼都可以穩(wěn)定正確地運(yùn)行!萬花叢中過,片葉不沾身,這就是優(yōu)雅。
終極殺手:不講武德。還記得前面說的那個(gè)靠喘氣就能解決問題的主嗎?他會怎么解決?他就不解決!對,你沒看錯(cuò)。他選的技術(shù)路線都是用5到10年前的API,坑都已經(jīng)被小白鼠們填平了,他壓根兒就碰不上這種破事。最優(yōu)雅的美就是你看不出他哪兒美,但他就在那兒閑看庭前花開花落,漫看天外云卷云舒。
未完待續(xù)……
原文標(biāo)題:河套IT TALK——TALK 10:編程的技術(shù)|藝術(shù)|術(shù)術(shù) 中篇:編程的思想、藝術(shù)和哲學(xué)
文章出處:【微信公眾號:開源技術(shù)服務(wù)中心】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
-
開源技術(shù)
+關(guān)注
關(guān)注
0文章
389瀏覽量
7956 -
OpenHarmony
+關(guān)注
關(guān)注
25文章
3727瀏覽量
16380
原文標(biāo)題:河套IT TALK——TALK 10:編程的技術(shù)|藝術(shù)|術(shù)術(shù) 中篇:編程的思想、藝術(shù)和哲學(xué)
文章出處:【微信號:開源技術(shù)服務(wù)中心,微信公眾號:共熵服務(wù)中心】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論