写给女儿的一封信

来源:互联网 发布:手机淘宝电影官网 编辑:程序博客网 时间:2024/04/28 18:49

前言

涉及到专业词汇,我用中文给你简单的说一下现在和未来技术的潮流,然后再看看现在你学的知识在其中的位置。
这篇文章主要的目的是让你了解软件的一些历史、一些关键技术和一个重要的概念。
文章的最后回答了你的问题,比较长,希望你能耐心的看完。

浅谈计算机技术

云(cloud)

云是依托于互联网的可以执行的程序,你看到的google的gmail就是这样,微软的在线office也是同样。这不是主流定义,我的理解是这样。云的应用适应性更强,可以在不同的设备上使用,易扩展。这是两个关键的特性,当然还有一些,但为了简单我去掉了,你现在能明白这两点就够了。

  • 支持多设备
    现在的设备主流的有pc端的windows,苹果的ios以及来自开源社区的linux,以前还有unix现在逐渐淡出视野. 移动端有google的android、苹果的iso、微软的windows phone、黑莓,还有主机端sony的ps4和微软的xbox,如果一个应用可以支持上面所有的平台,我称它是真正的云。你看到的一些可能仅仅支持几种,这些我认为不是完全的云应用。

  • 扩展性
    体现在两个方面:
    是在需求扩充后是否可以快速的跟进发布新的版本
    是在用户数增加后是否可以通过简单的增加服务器解决

数据科学与工程

主要是对数据进行处理
不多说,看一下课表吧
- 数学基础:组合数学、统计学习理论与应用
- 公共基础:工程英语、自然辩证法
- 数据存储:存储技术基础、数据安全
- 系统架构:大数据计算方法、大数据系统、大数据平台核心技术、内存计算
- 分析挖掘:大数据分析、大数据机器学习、数据挖掘理论与算法、数据可视化
- 应用素养:搜索产品设计实践、数据伦理、大数据管理与创新、大数据治理与政策、大数据产品经理实训

物联网(Internet of Things)

这里的物不是货物,而是更加广泛的物品。让物品联网是为了我们可以更好的利用物品。
在未来的规划里,大部分物品都能联网,你可以控制它们用你的手机。更高的应用是物品智能化,你告诉你的要求,他会自行采用最优的方案。比如,你说5点回家6点吃烤金枪鱼,你的空调会在4点半自动打开,5点半厨房开始自行工作,6点到家一切都完成了。这就是科技改变生活。科技让人从简单的重复的劳动中解放出来,有更多的时间去思考。估计3年后你就会看到自动驾驶的车辆满街开了。这就是一个物联网的应用

微服务 (Microservices)

微服务是一种以业务功能为主的服务设计概念,每一个服务都具有自主运行的业务功能,对外开放不受语言限制的 API (最常用的是 HTTP),应用程序则是由一个或多个微服务组成。
一个微服务架构的应用程序有下列特性:
- 每个服务都容易被取代。
- 服务是以能力来组织的,例如使用者界面、前端、推荐系统、账单或是物流等。
- 服务可由不同的编程语言、数据库、硬件与软件环境实作,只在乎是否适配。
- 架构是对称而非分层 (即生产者与消费者的关系)。
本来还有一些,但到微服务估计你就很难理解了,下面以后再写。

软件的演化史

  • 最早的软件基本都是单机软件,一个安装程序,安装到机器上可以独立运行。
  • 发现缺点了吗,对,就是一旦你的机器崩溃,你所有的东西都没有了,而且一旦你换了一台机器,你必须把前一台机器上的软件数据copy到新的机器。有了这种需求软件供应商就研发出2层系统也叫客户服务器,即把数据放到远端的服务器,(数据可以存储在文件中也可以保存到数据库中)。每种文件其实都一种标准,bmp、dll都是。数据库本质上也是文件,只是在文件上面增加了查询、插入、修改、删除的接口。简单的说使用数据库你的代码量会大幅度下降。
  • 再说回来,2层系统有什么缺点吗,不便于升级,一旦软件有了新的版本,需要重新在以前的机器上进行安装,这个解决办法就是把软件分开,显示部分安装到用户的机器上,逻辑部分保留在服务器端,如果只是逻辑部分的改变那么用户不需要升级软件,逻辑部分可以与数据部分放置在一台服务器上,也可以分开放置,这是标准的3层系统显示逻辑数据三个部分可以分开部署。

  • 看到这里你觉得完善了吗,还差一步,你的pc上还安装了显示部分的软件,这部分升级还是比较麻烦。随着硬件的进步、带宽的加强、标准的完善一个以前只承担简单显示的协议进入开发商的视野,就是以后在很长的一段时间都会是绝对主流的html协议。这里我们终于说到你的问题了,HTML(HyperText Markup Language) 超文本标记语言,记住这个词标记语言,简单的说这是一个排版格式,跟word并没有什么差别。为什么你觉得word很简单而html好像很难的样子,这其实是一个错觉,html与word其实是一样的,一个是用word软件打开一个使用浏览器打开。

Html+javascript+css组成的前端,nodejs或php或java组成的服务器端,nosql(MongoDB、Redis等)和关系型数据库(mysql、oracle等)组成的数据端构造了现在主流的开发模式。在前端还有android、apple和一些pc上运行的应用程序,这些因为不符合一次开发、多平台应用会被逐渐边缘化。

面向对象(Object Oriented,OO)

这里要说一点抽象的东西了,对象化。以前的程序是什么样,就是你学的c语言那样,你会看到大量的函数,你把参数传入,函数给你结果。有缺点吗,很明显你会看到大量的函数库,不便于使用。

从我的角度科学的进步就在于最简单的分类,从儿童能正确的区分人和动物到遗传学家能区分一个dna片段本质上并没有区别。顺便说一下你的东西都分类了吗,为什么我让你自己写物品清单,就是让你明白这个概念,一旦你明白这个概念你看问题的角度就会不一样,学会清晰的分类永远比学习一门具体的技术要有用的多。希望你从身边做起,把你能看到的都想想它是哪一类的,有什么此类的通用性和差异性。你喜欢听音乐就尝试给听过的音乐分类。

再说函数,函数是实现一个具体的功能,加法运算,你传入的参数经过函数的处理给你加后的结果。好用吗,“函数库太多了”,聪明的软件人员会这样说,我要简单、我要复用,软件做为新型的学科比起别的学科还是缺乏底蕴,满足了基本的需求后开始向更高的阶段迈进,而且新兴的学科会吸引大量的人才。在这些人才的加入后有了各种的理论,其中之一被通过了时间的检验,就是对象化

把目光投向你身边的世界,你会看到各种各样的人和物,对就是分类。看向摩卡,首先这是一条狗,是小型犬,是泰迪品种,鼻子是黑的、毛发是浅棕色。能干什么呢,会叫、会吃,与别的泰迪有差异吗,更加喜欢奔跑。好现在我们用软件的眼光来看摩卡,如果用c语言的角度来看,会先开发几种库,吃是一个函数、叫一个函数,数据嘛我来个结构体吧,有毛发颜色、有鼻头颜色、品种,这是c能做到的。想想有什么问题,不便于理解也不便于重用。人的认知水平是知识水平相关,可能在c的大师来看足够了,但你要想象还有茫茫多的普通程序员,你让他用这些库,学习时间太长。所以我们引进对象化。

这是出于人本身对事物的认知,一旦与原本的世界发生联系,你会发现学习的成本降低了很多。对象化首先是类(Class),很好理解就是分类,你是狗不是猫,那么我们就建立一个狗类写为

//这是类,有关键字class 和名称组成       class Dog {    }

在往下呢,狗有皮肤颜色和鼻头颜色,这些是数据,这些数据决定了狗还是有差别的,一条黑色的狗和一条白色的狗是不同的,在对象化的角度,这些数据我们称呼属性(Property),这样我们的类就改成这样

class Dog {        string color;//这就是属性,由类型和名称组成    }        

狗会叫,这是动作,叫声的大小取决于什么呢,很复杂的问题,我们假定取决于兴奋程度,兴奋程度是什么,是数据啊,数据是什么,是属性,好,我们加一个属性兴奋程度

class Dog {        string color;    int happyLevel;//增加兴奋程度属性,用整型表示,数值越大,兴奋越高}

有了这个我们就可以用软件描述叫了,动作不是属性,属性仅仅提供一个名字和一个类型(这里的类型可以是基本类型,也可以是类),而动作复杂多了,怎么才能描述叫声呢,我们简化处理,我就想知道叫声的大小,用c表示就是一个函数

int speak(int happyLevel),

对象化里函数就是方法(Method),就是行为就是动作,这个行为涉及到的参数和结果可以是自身的属性也可以是外部的参数。这里就是自身的参数,好我们改进我们的代码

class Dog {    string color;    int happyLevel;//增加兴奋程度属性,用整型表示,数值越大,兴奋越高    int speak();//这就是方法,**由方法名和传入参数、传出参数组成,参数与属性一样由名称和类型组成**),

想一想与c语言差别大吗,其实并不大,它只是重新分类,又看到分类了吧,我这些年的心得就是分类,对同样的场景进行分类,不同的人会分成不同的类,谁能科学的分类也就决定了软件人员水平的最重要的标杆。

对象化还有一些基本概念,我简单的罗列一下:

面向对象核心部分

  • 接口(interface)
    我们上面的类其实是个接口,描述了狗的属性和方法,但并没有实现
    所以我们改成
interface Dog{//修改了这里    string color;    int happyLevel;    int speak();}
  • 类(class)
    类是有具体实现的
class Dog {//修改了这里    string color;    int happyLevel;    int speak(){    return happyLevel*0.6;    };}
  • 对象(Object)
    对象是类的一个具体实例(Instance)。狗是接口,摩卡就是狗的实例,也就是对象,有具体的颜色
Dog moka=new Dog();//moka我们称为对象moka.color="red";
  • 方法(Method’)
    表示一个动作。我的理解是翻译数据(Data),这个世界由数据组成,这是根本,我们真正需要的是数据,而不是方法。数学、物理、化学所有的学科其实核心是数据。对于一辆火车我们真正需要的知道的从a站出发的时间和到达b站时间。到达b站收到很多因素的影响,有火车的动力(机械学)、铁轨的材料(材料学)、天气(气象学)、火车的形状(流体力学),这里由某位数学家结合现有认知写出了一个模糊计算公式,代入所有的参数,最后得到到达b站的时间。看看我们的最初,我们只关心的到达b站的时间,这个公式就是方法,时间就是输出。如果我们已知b站的时间,这个方法将不再有作用。所以我的理解是方法是转换数据的一个函数,把现有的数据计算后得出我们需要的未知数据。

  • 属性(Property)
    属性是对象本身的数据,这个属性可能是一个类,看你抽象的结果。比如上面颜色,也可能是一个类,有色阶、色调等属性组成。真实的世界没有基本类型,软件之所以有基本类型,是因为软件只是解决一个方面的问题,在这个问题的范围内对于一些对象没有必要再抽象下去,这些就成了基本类型。

面向对象3个特性

  • 继承性(Inheritance)
    狗还有很多品种
    按照大小来分有大型犬、小型犬,按品种来分有博美、拉布拉多等。这些你可以设计两个属性放到狗的类中
class Dog{    string color;    string type;//狗的类别    int weight;//这里增加重量属性    string getKind(){//我们用方法来表示大型、小型,由重量计算得知        if(weight <= 20)            return "small";        else             return "big"    };    int happyLevel;    int speak(){        return happyLevel*0.6;    };}

除了增加属性外,可以有新的方法表示大型还是小型就是子类(sub class)

class BigDog:Dog{//表示方法是在类的后面加上基类(base class)的名称}class SmallDog:Dog{}

子类具有基类所有的公开(Public)方法和属性,可以重写公开的和保护(protected)方法和属性
公开的是对象可以使用的,保护的只有子类可以使用,私有(private)的只有自己可以使用。为什么这么划分,有一个原因是让使用者快速找到重点,另一个更加重要的原因是减少未来的变更的影响范围。比如方法增加了一个参数,所有引用此方法的类都需要修改。如果我们改的是私有方法,很简单,我修改自己的类就可以了,如果修改的是保护的方法,检查子类,修改公有方法,请检查项目中所有的类。这里有一个名称就是范围(scope),简单的说每个属性或方法有三种范围可选。怎么选,You design it because you are queen in software world.当然这是玩笑,不展开谈这个问题,涉及很多,只说一句永远不会错的话,根据实际情况。
不知道你发现了没有,这里有个问题,面对扩充时,是增加属性还是建立子类,当然还有别的方法,比如Composition(组合),为了问题简化我们只讨论增加属性还是子类。首先你会发现真实的世界是由一个一个个体组成,每个个体都是独立的,我们人为的分类是为了我们能找到规律,探索这世界的规则,找出造物者的密码是科学原动力,所以又是分类。这是一个主观的行为,我只说各种的优缺点,你可以根据实际情况自己衡量。增加属性好处是没有子类,缺点是随着需求的不断扩大,每次都需要改动基类,基类的代码会越来越多,越来越难懂。增加子类的优点是基类不需要改动,缺点是子类增加,可以想象如果按品种来分,可能会有100多个子类。

  • 封装性(Encapsulation)
    参见上面的public、protected、private,这就是一种封装。类本身也是一种封装。把复杂的实现已简单的方式呈现就是封装。函数其实也是一种封装。
  • 多态(Polymorphism)
    在子类中一个方法表现不同的实现就是多态。用上面的狗叫来说,大狗叫声低沉,小狗叫声尖锐,我们来改写代码
class BigDog:Dog {    int override speak(){//增加关注值**override**表示重写基类的方法        return happyLevel*0.4//大狗叫声    };}class SmallDog:Dog {    int override speak(){        return happyLevel*0.7;//小狗叫声    };}

我们说speak这个方法就是实现了多态

HTML 协议

最后说正题,前面解释了对象化是为了更好的理解下面的内容。
HTML上面说过,现阶段你把它看成排版工具与word并没有差别。我们的目标是什么,当然是排的漂亮。怎么算漂亮,需要艺术家说明。最简单的动作是什么呢,就是找到你满意的网站,复制、粘贴,修改文字内容。
就像你知道的那样,Html本身规定了好多标签,这些都称为元素(Element)。每一个元素都可以看成是一个对象,有自己的属性对于排版来说。按照我一贯的做法,就是先分类,我把他们分成以下几个类别,可能有遗漏,也可能与别人的分类不同,但这是我的理解。

布局(Layout)

首先是布局(Layout),这个布局可以嵌套,传统的tableiframe和现在用的div都是布局,负责把网页按照功能和美观的要求分为不同的区域.

排版(Formatting)

负责把指定的部分排的更加美观,p,strong等都是这个作用,这部分其实不需要掌握太多,因为这些都是老的标准遗留,现在一般的设计者都用css替代了。但其实内容也不多。

内容(Content)

负责把内容展示给使用者。超文本意思就是我很强,不止是文本,我还是展示多媒体信息(图片、声音、视频、动画等)。所以对应videoaudio等标签,以后会在这部分进行扩展,因为总有新的媒体出来。

表单(Form)

内容是让人看,表单就是让人录入。input

样式表(css)

负责对内容和表单进行颜色、字体等渲染工作。

组件(compoent)

然后是组件(compoent),这个词可能会有歧义,在html里并没有这个术语,这时用到对象了,你把它看成一个封装好的类,有着基本的功能,比如菜单组件,你输入菜单项,组件负责生成漂亮的html部分代码。这个组件根据需求,包含上面列举的所有或部分的内容。

对于你的问题我的回答

现在回答你的问题,哪个编辑器好用,首先你要明白这些编辑器的差别是什么。看看上面,你猜到了什么,就是组件,不同的厂商封装了不同的组件。

  • 对于学习来说,最简单的是记事本,用浏览器打开,修改记事本内容,然后刷新网页看看效果。

  • 从开发的角度,我推荐你用visual studio,新建一个项目,然后新建一个html页,然后就可以使用了,顺便熟悉一下开发工具。还有eclipse这是世界上最大的开源的开发平台了,支持所有的主流开发,包括你们在学校的c语言。其实用visual studio也可以开发c语言。

  • 从快速的的角度有些在线工具
    https://jsfiddle.net/
    http://www.w3schools.com/html/tryit.asp?filename=tryhtml_basic
    https://thimble.mozilla.org/ 这个网站包含一些用例可以参考

  • 前端最流行的开发工具是webstorm。

  • dreamweaver
    你说的dreamweaver 是adobe公司的产品能配合其它产品一起工作。也是专业网站建立者的首选工具。
  • Hbuilder
    封装了一个库的产品,不建议你使用,这是一个小众产品,封装的库也不是主流库,你能知道他可能基于他的炒作吧。

每种语言都会有很多种的开发工具,其实只要是主流差别都不大。我们更关注的是语言本身。所以建议你以后选择只在visual studio 和eclipse中间。如果你们上网方便,可以选择对应的在线工具。

Html本身东西不多,跟photoshop有点类似,想要做好需要艺术知识,对于这两个我都建议你知道基本使用就可以了。对于html的组件库我不建议花费时间去看,这种库本身就发展的很快,现在你看的版本可能一年后会被市场淘汰。

推荐个网站给你
http://www.w3schools.com/html/default.asp 这个上面有解释、有例子、可以直接运行代码。

本文参考文档
https://zh.wikipedia.org/wiki/%E9%9B%B2%E7%AB%AF%E9%81%8B%E7%AE%97(云)
https://zh.wikipedia.org/wiki/%E7%89%A9%E8%81%94%E7%BD%91(物联网)

0 0
原创粉丝点击