我對程序的一點理解

從直觀的提及

這一段和後面聯繫不大,但寫這個東西的第一目的是做爲本身的想法和筆記,首先要跟隨本身的思路走,因此隨意吧。我小學的時候第一次見到微機時,覺得那個大電視纔是本體——由於畫面都在上面。之前的遊戲,受限於性能,畫面是像素風格的:
像素馬里奧javascript

一個「採蘑菇」裏的小人,分辨率只有20×10,而如今出的筆記本電腦,分辨率最低也是1366×768,因此即便是一個對話框,也有100×50以上的像素。放大以後,纔會發現顆粒感。從電影到電視機再到電腦,原始的像素遊戲到視網膜屏幕,原理其實一直都沒變,只是量變給觀感帶來了質變。
像素對話框html

順便提一下,3D畫面是這樣實現的:前端

在 320x200 的解析度下,從攝像機中心射出 320x200條光線,屏幕上每一個點對應一條光線,首先碰撞到的物體的位置顏色,就是屏幕上這個點的顏色:java

3D渲染

代碼以下:python

for (int y = 0; y < 200; y++) {
   for (int x = 0; x < 320; x++) {
       DWORD color = RayCasting(x, y); 
       DrawPixel(x, y, color);
   }
}

來源:256字節3D程序是如何實現3D引擎的呢?程序員

一樣的一個馬里奧,在玩家眼裏和在計算機的存儲裏,是不一樣的格式。這是由於,在計算機內部,圖像是以數據的形式表示的。其實不止圖像,全部的信息都以數據的形式在計算機內部表示。玩家不用關心馬里奧在計算機裏是怎麼表示的,但開發者須要瞭解。
不一樣的馬里奧ajax

抽象

抽象是程序開發裏很是重要的概念,咱們用Mario來指代剛纔的那個像素小人,而後直接讓Mario作動做。而矩陣的每一個點(x,y),左移一步座標從(x,y)變成(x-1,y)...交給計算機就好:算法

#這裏是僞代碼
Mario = 矩陣[[x1,y1,red],[x2,y2,green]...] #初始化每一個點的座標和顏色
Mario.MoveRight() #任一x+1
Mario.MoveLeft() #任一x-1
Mario.Jump() #任一y+1
Mario.Down() #矩陣變化爲蹲的狀態
...

之因此提到抽象,是爲了引出:sql

流水線與程序

這裏是完整的薯片生產流水線,若是有興趣能夠點進連接,下面只貼一下必要的工序數據庫

清洗 去皮
清洗 去皮
切片 去澱粉
切片 去澱粉
油炸 調味
油炸 調味

把這條生產線用程序員經常使用的時序圖(sequence)抽象一下,就像這樣(sf太坑了,不支持時序圖):
薯片生產線

那這個和程序有什麼關係呢?舉個例子,雖然淘寶百度的首頁風格不一樣,但在程序員看來都是類似的:

  1. 搜索框中輸入,傳入到服務器
  2. 服務器接收到信息,查詢數據庫
  3. 數據庫返回結果到服務器
  4. 返回查詢結果

搜索流程

固然,實際過程當中會根據需求有所不一樣,好比服務器會有負載均衡、用戶驗證、信息驗證等中間過程。

這個過程的實際代碼是這樣的:

前端:

$.ajax({
    url: "www.innate.com/search", //服務器地址
    data: "keyWord", //搜索關鍵字
    successful: function a(){}, //成功的處理方式
    error: function b(){}, //失敗的處理方式
});

服務器端:

@RestfulController
@RequestMapping("/search") //接收傳給www.innate.com/search的請求
public String search(String keyWord){
  String result = sql.Search(keyWord); //在數據庫中查詢
  return result; //返回查詢結果
}

數據庫:

select table.col1, table.col2, table.col3
  from table
 where table.col1 = keyWord -- 查詢table中col1爲keyWord的記錄

這些代碼也能夠看做各個API的流水線處理

ajax() -> @RequestMaping -> (select語句) -> 返回到ajax()處理

在程序員的眼睛裏,這些API就和薯片流水線上的各項機器同樣,並且能夠自訂規則,比現實裏的設備更靈活。

clipboard.png

程序員的將來

知乎上有個問題頗有意思:程序員作到什麼程度纔不會被算做 API caller?

拿WEB開發來講,大部分的功能都已經肯定了:首頁、導航、文章、帖子、搜索、圖表報表、上傳、下載、發送郵件...有一些框架(好比說SpringMVC)把這些功能已經整合封裝成ajax這樣的API了,開發的時候根據須要調用就能夠了——大部分IT培訓機構就是教你怎麼用某套框架作一個項目出來——也是我如今的狀態。

但是爲了提高效率、安全、穩定,每隔幾年就會有新的框架或者版本出現,好比最近幾年出現的Vue/Angular/React,雖然都是JS,寫法和背後的原理卻有很大的區別。爲了使用這些新技術,大多數程序員都要不斷的學習。

三種不一樣JS框架輸出HelloWorld :

//Vue.js
<body>
    <div id="app">
        <p>{{message}}</p>
        <input v-model="message">
    </div>
    <script>
    var exampleData = {
        message: "hello world"
    }
    new Vue({
        el: "#app",
        data: exampleData
    })
    </script>
</body>

//Angular.js
<body>
    <div ng-controller="helloworld">
        <p>{{1+1}}</p>
        <p>{{helloworld}}</p>
    </div>
</body>

//React.jS
<body>
  <script>
    ReactDOM.render(
      <h1>Hello, world!</h1>,
      document.getElementById('root')
    );  
  </script>
</body>

此外,既然程序工業流水線能夠類比,那麼如今的程序員產業工人也能夠類比。未來程序員這個職業,必定會發生分化:

  1. 隨着智能手機的普及,必然使更多的人接觸編程,能本身寫一些小程序、小工具的人會愈來愈多。那麼像我這種,只會調用API寫一個小模塊的人,確定會泯然衆人
  2. 程序工人與工程師之間的區分在於產品的穩定性能健壯等。好比我有一次須要清除某張1500萬表裏的1000萬條數據:

    • 最初我直接用SQL語句執行,2個小時沒有執行完
    • 以後使用存儲過程,1個小時也沒有執行完
    • 最後使用存儲過程,將其他500萬條取出到一張臨時表裏,只花了不到20分鐘,而後truncate該表,大概20秒完成
    • 接着將臨時表裏的數據放回到該表裏,花了不到10分鐘
  3. 除去上面提到的性能,工程師在設計系統的時候也會考慮系統承載能力、故障隔離、冗餘備份等等。這會是工程師和程序工人的一個區分
  4. 有個段子說:三流的程序員寫模塊,二流的程序員寫架構,一流的程序員寫算法,頂級的程序員種頭髮。算法是什麼呢?不聊OI/NOI/ACM這些算法競賽,說一個生活中簡單問題的建模:

    編程到底難在哪裏
    程序員:我今天要買一斤蘋果。由於我只喜歡紅富士蘋果,因此我只買紅富士蘋果。我能接受的最高價格是10元/斤。正常狀況下一斤蘋果用一個袋子能裝下,可是爲防萬一,我會帶兩個袋子。我知道附近的3家水果店,因此我會依次訪問這3家水果店。

    連接裏的答案很長,可是頗有意思,上面提到不少系統的功能早已模塊化,多少人在工做裏也只是把分配下來的任務完成就好,下班以後從不研究技術,或是去寫一點本身想作的東西呢?

  5. 程序員的工資高不只是由於寫出一套軟件以後,複製第二套的成本很低,還在於這幾年資本的涌入。不少虛高的工資都是就像滴滴和Uber爲了佔領市場發起的補貼大戰,若是這一階段結束了,還會有公司開這麼高的工資嗎?
    並且開工資的畢竟是資本,隨着能夠講故事的地方愈來愈少,資本開始撤離或是要求回報,又會是什麼樣呢?我只據說2001年有過一次互聯網的冬天,但以後,程序員們就沒怎麼過過苦日子吧,我想仍是能夠提早準備一下。

程序能作什麼

提及來,也寫了幾年的程序,但對程序的意義思考還不多,只能勉強說一說

  1. 把信息數據化
    圖片描述

    程序很大一部分和IT(Information Technology)有關,計算機用數據來存儲信息,上圖裏的雜誌、字典、照片、打印、電話、地圖...無一不是信息的載體,30年間這些東西都已經變成了計算機裏的數據。這是不少程序設計的基礎:CAD軟件、MIDI音頻製做、Office套件、寫做、繪畫等等,轉化成數據以後記錄更容易,而且產生了新的形式,好比網絡小說。
    信息沒有實體,但能夠做爲現實行爲的抽象,好比把流水線抽象成模塊;遊戲把現實裏的動做抽象爲技能/CD,並無讓人感到違和。

    先主曰:「朕令吳班引萬餘弱兵,近吳寨平地屯住;朕親選八千精兵,伏于山谷之中。若陸遜知朕移營,必乘勢來擊,卻令吳班詐敗;遜若追來,朕引兵突出,斷其歸路,小子可擒矣。」

    這一段能夠用「亞瑟在草裏蹲着,殘血后羿去線上浪一波,對面韓信來抓就反殺他」比喻。
    看過馬親王的這篇怎樣讓大明變得透明,能夠詳細的瞭解歷代王朝是怎麼根據文書裏的數據進行管理的——就像今天的大數據同樣。數據,或者說把數據信息化,能夠發揮計算機的長處。
    插入計算是什麼?加減乘除/移動數據/轉換/輸出信息

  2. 提高效率

    在計算機內部,一次操做就是一次運算。不限於加減乘除,讀取鍵盤的輸入、把數據從存儲裏讀取出來或是把信號輸出到顯示器都是運算。現代CPU的運行頻率廣泛在1GHz以上,也就是說一支筆從桌子上滾落,到接觸地面的時間裏,CPU已經進行了5億次以上的運算——即便人腦運算2+3只須要1次運算,計算機運行2+3須要1萬次運算,也比人腦快5萬倍。
    因此在網頁或者記事本里,用Ctrl+F進行關鍵詞查找,必定比人肉搜索更高效。
    再舉一個例子,不少同窗爲了考四六級、考研、雅思/託福都會背單詞,但只會從abandon,abortion...背下去,既不得要領,也堅持不下去。若是會寫一點小程序,統計歷年真題裏出現的高頻詞彙,重點理解,既提高了效率,也能隨時看到效果,事半功倍。
    《魏略》說,孔明在荊州,與石廣元、徐元直、孟公威俱遊學,三人務於精熟,而亮獨觀其大略。有的時候,咱們應該把網絡、硬盤、搜索看成本身的記憶,而在大腦裏保存一份知識框架就好。即便最強大腦裏選手練習得再快,也比不上魔方機器人0.38秒還原,更別說思考還原步驟的時間了。

  3. 解決可重複的工做
    前段時間很火的隨心所欲表情,已經有了生成模板——隨心所欲生成器。此外還有比價軟件、網頁爬蟲、鬧鐘、QQ羣特別關注等。這些都是把人從重複的動做裏解脫出來。
    人的注意力和精力都是有限的,通常來講,最多能同時關注7件事情。但程序開啓多線程以後,只要資源容許,能夠無上限的同時處理多個任務。
  4. 控制注意力
    赫胥黎在《美麗新世界》裏說:咱們終將毀於咱們所喜歡的東西上。想一想不少人刷了一天的短視頻,有多少深入的印象?豐富的信息是水,水能載舟,亦能覆舟。

見識淺薄,難以歸納程序的意義,可是涉及到信息、重複的工做,就徹底能夠用程序來替代或者提升效率。並且IT行業一直在加速發展,20年前多少人有手機?10年前多少人有電腦?5年前多少人用手機購物?總之,做爲一個朝陽行業,雖然現下也存在泡沫,但長遠看來,至少還有20年上升期,這一代的程序員們,真的是處在了「黃金時代」。

相關文章
相關標籤/搜索