这一段和后面联系不大,但写这个东西的第一目的是做为本身的想法和笔记,首先要跟随本身的思路走,因此随意吧。我小学的时候第一次见到微机时,觉得那个大电视才是本体——由于画面都在上面。之前的游戏,受限于性能,画面是像素风格的:javascript
一个“采蘑菇”里的小人,分辨率只有20×10,而如今出的笔记本电脑,分辨率最低也是1366×768,因此即便是一个对话框,也有100×50以上的像素。放大以后,才会发现颗粒感。从电影到电视机再到电脑,原始的像素游戏到视网膜屏幕,原理其实一直都没变,只是量变给观感带来了质变。html
顺便提一下,3D画面是这样实现的:前端
在 320x200 的解析度下,从摄像机中心射出 320x200条光线,屏幕上每一个点对应一条光线,首先碰撞到的物体的位置颜色,就是屏幕上这个点的颜色:java
代码以下: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太坑了,不支持时序图):
那这个和程序有什么关系呢?举个例子,虽然淘宝
和百度
的首页风格不一样,但在程序员看来都是类似的:
固然,实际过程当中会根据需求有所不一样,好比服务器会有负载均衡、用户验证、信息验证等中间过程。
这个过程的实际代码是这样的:
前端:
$.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
就和薯片流水线上的各项机器同样,并且能够自订规则,比现实里的设备更灵活。
知乎上有个问题颇有意思:程序员作到什么程度才不会被算做 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>
此外,既然程序
和工业流水线
能够类比,那么如今的程序员
和产业工人
也能够类比。未来程序员这个职业,必定会发生分化:
API
写一个小模块的人,确定会泯然众人程序工人与工程师之间的区分在于产品的稳定、性能、健壮等。好比我有一次须要清除某张1500万表里的1000万条数据:
有个段子说:三流的程序员写模块,二流的程序员写架构,一流的程序员写算法,顶级的程序员种头发。算法是什么呢?不聊OI/NOI/ACM这些算法竞赛,说一个生活中简单问题的建模:
编程到底难在哪里
程序员:我今天要买一斤苹果。由于我只喜欢红富士苹果,因此我只买红富士苹果。我能接受的最高价格是10元/斤。正常状况下一斤苹果用一个袋子能装下,可是为防万一,我会带两个袋子。我知道附近的3家水果店,因此我会依次访问这3家水果店。
连接里的答案很长,可是颇有意思,上面提到不少系统的功能早已模块化,多少人在工做里也只是把分配下来的任务完成就好,下班以后从不研究技术,或是去写一点本身想作的东西呢?
互联网的冬天
,但以后,程序员们就没怎么过过苦日子吧,我想仍是能够提早准备一下。提及来,也写了几年的程序,但对程序的意义思考还不多,只能勉强说一说
把信息数据化
程序很大一部分和IT(Information Technology)有关,计算机用数据来存储信息,上图里的杂志、字典、照片、打印、电话、地图...无一不是信息的载体,30年间这些东西都已经变成了计算机里的数据。这是不少程序设计的基础:CAD软件、MIDI音频制做、Office套件、写做、绘画等等,转化成数据以后记录更容易,而且产生了新的形式,好比网络小说。
信息没有实体,但能够做为现实行为的抽象,好比把流水线抽象成模块;游戏把现实里的动做抽象为技能/CD,并无让人感到违和。
先主曰:“朕令吴班引万余弱兵,近吴寨平地屯住;朕亲选八千精兵,伏于山谷之中。若陆逊知朕移营,必乘势来击,却令吴班诈败;逊若追来,朕引兵突出,断其归路,小子可擒矣。”
这一段能够用“亚瑟在草里蹲着,残血后羿去线上浪一波,对面韩信来抓就反杀他”比喻。
看过马亲王的这篇怎样让大明变得透明,能够详细的了解历代王朝是怎么根据文书里的数据进行管理的——就像今天的大数据同样。数据,或者说把数据信息化,能够发挥计算机的长处。
插入计算是什么?加减乘除/移动数据/转换/输出信息
在计算机内部,一次操做就是一次运算。不限于加减乘除,读取键盘的输入、把数据从存储里读取出来或是把信号输出到显示器都是运算。现代CPU的运行频率广泛在1GHz以上,也就是说一支笔从桌子上滚落,到接触地面的时间里,CPU已经进行了5亿次以上的运算——即便人脑运算2+3只须要1次运算,计算机运行2+3须要1万次运算,也比人脑快5万倍。
因此在网页或者记事本里,用Ctrl+F进行关键词查找,必定比人肉搜索更高效。
再举一个例子,不少同窗为了考四六级、考研、雅思/托福都会背单词,但只会从abandon,abortion...背下去,既不得要领,也坚持不下去。若是会写一点小程序,统计历年真题里出现的高频词汇,重点理解,既提高了效率,也能随时看到效果,事半功倍。
《魏略》说,孔明在荆州,与石广元、徐元直、孟公威俱游学,三人务于精熟,而亮独观其大略。有的时候,咱们应该把网络、硬盘、搜索看成本身的记忆,而在大脑里保存一份知识框架就好。即便最强大脑里选手练习得再快,也比不上魔方机器人0.38秒还原,更别说思考还原步骤的时间了。
见识浅薄,难以归纳程序的意义,可是涉及到信息、重复的工做,就彻底能够用程序来替代或者提升效率。并且IT行业一直在加速发展,20年前多少人有手机?10年前多少人有电脑?5年前多少人用手机购物?总之,做为一个朝阳行业,虽然现下也存在泡沫,但长远看来,至少还有20年上升期,这一代的程序员们,真的是处在了“黄金时代”。