我对程序的一点理解

从直观的提及

这一段和后面联系不大,但写这个东西的第一目的是做为本身的想法和笔记,首先要跟随本身的思路走,因此随意吧。我小学的时候第一次见到微机时,觉得那个大电视才是本体——由于画面都在上面。之前的游戏,受限于性能,画面是像素风格的:
像素马里奥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年上升期,这一代的程序员们,真的是处在了“黄金时代”。

相关文章
相关标签/搜索