什麼是好的程序?
在信息時代,我們已經離不開手機和電腦來處理各種各樣的東西了。同時,我們時常會接觸到形形色色的程序。當我某天在試圖學習Mathematica的時候,我看了幾分鐘視頻就關掉了,我不禁產生了這樣的疑問,我到底是在學習什麼呢?我學到的只是一些零散的知識,誠然,記得這些東西是容易的,但是,我憑什麼要記住這些東西?我可不可以不記住這些東西?我記住的到底是什麼?一個程序固然強大,但我需要的只是一部分內容罷了,我沒必要去學習太多東西,一個人的時間是有限的,我們必須集中精力在重要的內容上。為了解決這個問題,我嘗試從創造者的角度去思考,什麼是好的程序?進一步地,我把思考範圍從Mathematica擴大到所有的程序,試圖尋找一個好的程序應該具有的特點,這樣,我們就可以在學習的時候,把學習的內容按照我們的發現來分類。而且,我認為,這樣的分類可以幫我們更好地記憶與理解知識,更加清楚自己應該重點學習這其中的什麼東西,更有助於我們選擇不同的學習策略,與此同時,也可以作為我們創造與改進程序的一個指導。同時,我也發現了一個重要的事情,在做一件事之前先進行一下宏觀理解非常有利於我們的學習。不過,那又是另一篇文章了。那麼,我們就先來探討一下,什麼是好的程序吧。
一、 調用性
這裡的調用是我自己隨便起的名字,具體就是,一個程序可以調用其他程序或本地文件,就屬於調用性。實在想不到什麼好點的名詞來形容了,各位有想到什麼好的名詞的,可以告訴我一下。
我們在使用一個程序的時候,都有這樣的想法,這個程序雖然也能做到這個功能,但是這個程序的這個功能實在是太弱了,我能不能先在其他有同等功能但明顯更強大的程序中先編輯好,然後再把這個東西導入到這個程序里呢?
舉個例子,Word雖然自身能新建表格,但是明顯功能不及Excel強大,這個時候就需要調用Excel中的的表格了。至於本地文件是怎麼回事呢?本地文件就是那些我們需要插入的一些東西了,比如圖片,文字,音頻了。在某種意義下,我們希望能添加的文件類型越多越好。
二、 擴展性
可以擴展是一個非常強大的功能,我們知道一句話,人民的智慧是無窮無盡的。當你可以用各種各樣的插件的時候,基本就立於了不敗之地了。這就相當於陷入人民戰爭的汪洋大海。舉個簡單的例子,谷歌瀏覽器最強大的地方在哪裡?不就是它的插件嗎?裡面有海量的插件等你下載,各種各樣的都有。勤勞的碼農不求回報地寫插件,無私分享,難道還有比這更棒的事情嗎?再舉個遊戲的例子,大家聽說過上古捲軸5嗎?遊戲人士稱為老滾5,其中就有無限多的mod。打上了mod,就如同換了一個遊戲,有些mod甚至比遊戲本體還要大,當然,我當初也試著打了打mod,沒成功。而且我玩了玩,發現我有3d眩暈症,於是我就卸載了。
三、 可讀性
這裡的可讀性其實是我從編程語言中發現的。一個程序,如果只提供結果,而不提供一定的說明和注釋的話,是難以看懂的。所以,編程語言大都具有注釋的功能。例如c語言,Mathematica,Python等。這裡的注釋增加了其他人員的可讀性。當然,一般只有難點的程序才需要注釋。
四、 通用性
我們當然希望我們的程序所擁有的功能越多越好,這樣,我們就只需要簡單地掌握一個程序,就能實現許多強大的功能了。而不是下許許多多的軟體,要用到這個功能的時候,打開這個軟體,要用到那個功能的時候,打開那個軟體,不勝其煩。而且這樣,效率也會很低。我們的Mathematica就是基於這樣的考慮而誕生的。其原作者就是希望能編寫出一個功能強大的軟體。至於Mathematica有多強大,這些都是題外話了。
五、 規範性
我們的程序在使用的過程中需要有一個確定的規範,倘若你用一套規則,我用一套規則,那這豈不是亂套了?說到底,我們必須有一個確定的規範,如此,才能方便大家的學習與使用。有些時候,我們會發現一些規則比較彆扭,難受,但沒有辦法。規則誰說了算?當然是作者大人了。作者大人規定這裡就是這些,就是這樣規定的。Mathematica規定函數的首字母必須大寫,c語言則沒有這個規定,對此只能說,作者開心就好嘍。沒辦法,用人家的程序,就得遵守別人的規定,不然有本事自己開發一個啊。這提示我們,當我們在學習一個程序的時候,遇到這種東西,我們就可以採取這樣的學習策略,把它當作一個規定,把自己想像成它的作者,然後隨便找一個理由說服自己為什麼要作這樣的規定。
六、 便捷性
當我們正式工作的時候,我們就不得不面對一個問題,效率。此時,更快地完成操作,和更方便地達成目的,就成為了我們的訴求之一。那麼便捷性是從哪些方面體現的呢?我們先有這樣一個認知,滑鼠其實是個非常低效的工具。雖然只靠簡單的點點點和左鍵右鍵就可以了,但在實際操作過程中,操作難度的降低會導致精度的降低。而且利用滑鼠時,眼睛需要跟著游標走,每次都要用眼睛看,這實在是一件非常浪費時間的事情。與此相對的,鍵盤流就出現了,凡事都用鍵盤,可以極大地提高工作效率。這點我下來仔細研究一下,有空寫一篇鍵盤流入門的文章。
說回正題,既然如此重要,那麼具體到一個程序中,是如何把滑鼠能進行的操作盡量轉移到鍵盤上來做的呢?那就是我們程序中的內置快捷鍵了。每個好程序都有一定的快捷鍵設置,我們熟悉的Ctrl+C和Ctrl+V就是Word的內置快捷鍵,當然,我們可以發現其他程序里也可以,其實這是程序開發者沿襲了以前的習慣,把快捷鍵也設置成了這樣,他其實完全可以把快捷鍵設置成其他的鍵,當然,這樣做大部分情況下沒什麼必要。
便捷性的其他方面的體現,就是模板。大學裡給我們上課的老師,所使用的PPT一看就知道是在哪個地方下的模板,然後自己稍微添加了一些上課內容的。不過雖然美觀程度無力吐槽,不過確實幫老師們節約了很多的時間。還有一方面就是搜索了,當我們需要在大量的材料中找到自己所需的東西的時候,我們總不能一個一個挨著找吧?這時候,搜索就顯得猶為重要了。最後,就是雲存儲這個東西了,倘若一個程序可以登錄賬號,我可以把重要的東西都上傳到那上面的話,當我在另外的設備上登錄的時候,我就可以隨時再把我上傳的東西下載下來,進行編輯。
七、 修正性
這裡的修正性也是通過編程語言來發現的。當我們寫錯了的時候,我們需要有一個提示,我們到底哪裡寫錯了?C語言,Mathematica,都是這樣子的。當然,這樣的提示只能給你一些最基本的提示,倘若你寫的東西比較複雜,那麼這樣的提示一般是不管用的。不過換句話說,倘若你真的到了寫極為複雜代碼的地步的話。那麼你就可以自信寫簡單代碼,不用做調試了。
八、 上手率
一個複雜的軟體,其對新手友不友好,就表現在它的上手率上了。一個軟體越容易上手,就越好。那麼什麼因素會增加上手率呢?首先,倘若其相關的名詞越通俗易懂,其就越容易上手。舉個例子,在Word中,你看到下劃線,你是不是秒懂是什麼意思了,而你看見審閱,你能想到什麼?你會想說,這是什麼鬼?我想到了一個恰當處理這種情況的方法,到時在我已經構思好的一篇文章《至高之神器——語言》中再詳細談談吧。其他的增加上手率的情況嘛,無非就是官網上的教程,程序自帶幫助,網上教學視頻,相關出版書籍了。
九、 分享性
有句話說得好,快樂和別人分享,就成了雙倍的快樂,痛苦和別人分享,痛苦就會減半。這裡我想重點說明的是前一句。與我們看到段子感到快樂想要和別人分享一樣,我們也想分享一些資源或文章,來幫助其他人。在幫助其他人的時候,哪怕只得到一些感謝,我們自身也會獲得快樂。現在基本上很多的程序,都有分享的選項,我們可以選擇分享到QQ,微信,微博,這正是分享性的體現。而分享性中,我就提兩個程序好了。其一,是百度雲,百度雲的大名就不用詳細說了吧,有很多資源都是通過百度雲來分享的。其中,有很多破解程序啊,文檔啊,遊戲啊,等等。不過度盤又被稱為毒盤,大家自行體會。其二,是Anki,Anki在前面我已經說過了,不懂的同學可以自行百度。在Anki的相應網站上,有許多熱心網友提供了許多的牌組。雖然大部分是外國人提供的,不過還是有中文的,其中最熱門的就是考研英語紅寶書?笑哭。其他小眾的基本就沒有了,還不如自己做牌組靠譜。
十、 豐富性
豐富性即是指相關材料或操作的多少。可以進行操作的材料越多越好,對材料可以進行的操作越多越好。這顯然是可以預見的。豐富的材料無非就那些,大量的字體,大量的圖片,大量的函數。倘若要達到某一效果,可以用各種各樣不同的方法,這,也應該屬於豐富性的一種。
十一、社交性
不管你承認不承認,社交性強大的程序,其就具有了無限的可能性。網友的力量是強大的。不過網友也是危險的,這就要求我們接觸那些相對來說比較善良的人。什麼是善良的人呢?個人認為,碼農是比較友好的,一言不合默默發破解版程序,或者自己寫一個程序。除此之外,發資源發教程的網友也是十分熱心的。在手機興起的浪潮中,或許我們的社交就止於手機了,這是不對的,我可以明確地告訴你,電腦端還有很多網站或論壇,上面有很多人在討論,分享,且有些論壇是非常專業的。倘若一個程序自帶支持社交功能,那它就具有了很多優勢。有很多問題都可以網友來解決。
十二、私密性
我們確實需要一些東西,是不想讓別人知道的。先不說什麼秘密,如果你有一個文檔非常重要,倘若被刪除了會很麻煩,那麼你一定不想別人隨便打開,這時候就需要密碼了。這裡我本來想用安全性這個詞,但是想到,很多時候,我們都不止要求安全性,而是對於一部分內容保持私密,一部分人保持公開,所以我用了私密性這個詞,大家理解下,其實這也是說文檔的安全性。
十三、自定義
能夠支持自定義的一般都比較強大,你永遠也不會想像到人類的腦洞有多麼地強大,即使是在既定的規則下,也有人玩的根本不是同一款遊戲。可以想像,人類的創造性有多麼足了。支持自定義的,最適合那種喜歡創造的玩家。當然,自定義更多時候,只是為那些極其聰明,美術能力高的人而定做的,普通玩家真的只能瑟瑟發抖。
十四、美觀度
我們看到這可能會有個疑問,美觀度重要嗎?而我想反過來問問,美觀度不重要嗎?誠然,美觀度在大部分程序中顯得不是那麼重要。那是你沒見過設計渣到爆的程序。簡陋的圖標,反人類的排版,令人彆扭的顏色,都會讓人不想用下去。不過一般情況下,美觀度保持在一定水平就好了,不需要太高。當然,在同等情況下,美觀度越高當然是越好的了。
當然,上面所說的這些點,並不一定要全部具備,我們只需要挑選其中一些來設計程序就好了。一個社交軟體,當然,最重要的是社交性了,在此基礎上還要考慮美觀度,分享性,私密性,上手率和便捷性了,其他的方面選擇性添加。而一個編程用的程序,則不怎麼需要社交性。不過,可以由其他東西來彌補,比如相關QQ群啊,相關網站啊。
我知道光說不練假把式。講到這裡你還是會一臉懵逼,道理我都懂,可是這和幫助我們學習一個程序有什麼關係?這裡我就簡單分析一下我們經常使用的QQ好了。從這些角度來全面分析一下。關於Mathematica的話,我還沒入門,等我入門後再寫一個入門分析好了。下文都是分析,不想看的就跳過吧。
首先,調用性。QQ支持發送本地的文件,支持複製粘貼文字,支持發送音頻,甚至於很多軟體其實都附有分享到QQ的選項,這一點來說,完美。其次,擴展性,一個社交軟體,並不需要廣大碼農弄太多的補丁之類的,QQ雖然不能打補丁之類的,但它並不是很需要這些功能。可讀性,不是編程語言,可讀性方面不用考慮。通用性,這個就比較強大了,面對面傳文件用什麼?QQ啊,聯網傳文件用什麼?QQ啊,想查一查自己在哪裡用什麼?QQ啊,想打電話用什麼?QQ啊,文字識別用什麼?QQ啊,想要一個雲存儲怎麼辦,當然是把文件上傳到QQ群了啊,比沒開會員的百度雲要快多了,只要不被舉報,還可以防止文件被和諧,QQ上那麼多群,哪裡管得了你那麼多?規範性不提了,又不是編程語言。便捷性和上手性沒啥可說的,基本你只要會點點點,左滑,右滑,長按,你就可以方便地使用了。修正性,這樣說吧?哎呀,QQ上發的說說有個別字有錯誤,沒關係,可以使用說說的修改功能。哎呀,以前的個性簽名好羞恥好中二,沒關係,刪除就好了。分享性,QQ我還需要說嘛,轉發功能不就是分享性的體現嘛?豐富性,在QQ的興趣部落里,你可以了解到各方面的資訊,難道還不滿足嘛?私密性,你以為部分好友可見與訪問許可權是幹什麼用的?自定義,自定義名片,自定義照片牆,自定義相冊,實在是太多了。最後,美觀度,萬惡之源,有多少人是因為這個而開的會員?但不得不說,QQ的一些裝扮,時髦值蠻高的。看看如今的厘米秀搶膠囊的,你就知道了。
當然,限於篇幅關係,我並沒有寫地很詳細,倘若你還想挖掘一下,你可以再從這些方面來考慮一下,當你把這些功能歸類的時候,其實你就知道應該怎麼使用了。
推薦閱讀:
※知運營大學 | 我為什麼創辦「知運營大學」?
※大學老師每周課那麼少,他們大部分時間在幹什麼?
※父親的三字經 從皖酒麴房到巴黎左岸-(4)蘇老泉 二十七 始發奮 讀書籍
※讀書心悟
※python 定時器