ASP.NET Core Kestrel 中使用 HTTPS (SSL)

在ASP.NET Core中,如果在Kestrel中想使用HTTPS对站点进行加密传输,可以按照如下方式 申请证书 这一步就不详细说了,有免费的和收费的,申请完成之后会给你一个*.pfx结尾的文件。 添加NuGet包 nuget中查找然后再程序中添加引用Microsoft.AspNetCore.Server.Kestrel.Https 配置 把*.pfx结尾的文件拷贝的程序的Web根目录,然后修改Programs.cs文件:

  然后命令行窗口运行dotnet xxx.dll --server.urls https://www.example.com:port即可。 本文地址:http://www.cnblogs.com/savorboard/p/aspnetcore-kestrel-https.html 作者博客:Savorboard 欢迎转载,请在明显位置给出出处及链接

龙生   16 Sep 2017
View Details

ASP.NET Core 缓存技术 及 Nginx 缓存配置

前言 在Asp.Net Core Nginx部署一文中,主要是讲述的如何利用Nginx来实现应用程序的部署,使用Nginx来部署主要有两大好处,第一是利用Nginx的负载均衡功能,第二是使用Nginx的反向代理来降低我们后端应用程序的压力。那除了以上两点之外,其实我们还可以利用代理服务器的缓存功能来进一步的降低后端应用程序的压力,提升系统的吞吐量(tps)。这一篇就来看一下具体应该如何去做吧。 目录 WEB 缓存 ASP.NET Core 缓存 内存缓存 分布式缓存 Response 缓存 Nginx 缓存 总结 WEB 缓存 之所以加这个目录是因为有一部分初学者对缓存的认知不够,特别是WEB中的缓存。 缓存它是一种空间换取时间的一种技术。 Web缓存(或HTTP缓存)是用于Web文档,如HTML页面和图像,减少带宽的使用,服务器的负载的一种信息技术。一个Web缓存系统存储通过Cache来传递的文件的副本;如果满足某些条件,则可以从缓存中得到后续的请求。 WEb缓存有几种方式: 1、服务端缓存 利用 Memcached,Redis,In-Memery 等缓存技术实现对数据的缓存。 2、代理服务器缓存 利用类似nginx的反向代理服务器,对请求的url对应的输出的进行缓存。这个缓存和应用程序实现的动态页面缓存类似,只不过用反向代理充当了应用程序的缓存实现。 3、客户端缓存 浏览器缓存,其实主要就是HTTP协议定义的缓存机制(如: Last-Modified,If-Modified-Since,Expires; Cache-control等)。 ASP.NET Core 缓存 内存缓存 最简单的一种缓存,ASP.NET Core 提供了 IMemoryCache 接口来供我们使用。它存储在本地的 WEB 服务器内容中,注意是单机的 WEB 服务器,如果你需要部署的是一个服务器集群的话,那么你应该用分布式缓存,而不是选择这个。 就不详细介绍了,想了解的可以直接看官方文档。 分布式缓存 随着云应用和服务器集群以及 docker 等技术的成熟,越来越多的应用程序开始考虑集群部署,因为它具有更好的性能和可伸缩可扩展性。那么这个时候就需要用到分布式缓存了。 在 ASP.NET Core应用中,已经对分布式缓存做了抽象,提供了 IDistributedCache 接口,该接口提供了添加,检索,删除等的同步和异步的方法。并且还默认提供了 Redis 和 SQLServer 的分布式缓存实现,我们也可以实现 IDistributedCache 接口来扩展自己的缓存系统。 需要说明的是Get,GetAsync和Set,SetAsync。 这两个接口方法默认是使用的byte[],之所以没有提供直接存储对象的方法是因为微软想把这个默认序列化的选择交给用户,因为每一个团队的偏好是不一样的,有些团队喜欢使用 XML,有些喜欢使用 JSON,有些喜欢使用 Protobuf 等,所以在 项目中,你可以根据自己的偏好来扩展想要的方法。 具体使用方法还是直接看官方文档好了。 关于使用也可以查看我的另外一篇博客: ASP.NET Core 使用 Redis 和 Protobuf 进行 Session 缓存。 Response 缓存 在 ASP.NET Core中,有一种缓存叫做Response缓存,这个缓存主要是用来做代理服务器的缓存。它主要原理是在输出的HTTP Response的header里面添加指定的缓存标记。这些缓存标记用来让客户端或者代理服务器来识别需要缓存的内容。然后当客户端有请求到代理服务器的时候,代理服务器可以识别出一部分请求,然后直接把结果返回给浏览器,从而提高后端应用程序的性能和吞吐。 从这个图中看出来,在第一次的时候,一个客户端请求经过代理服务器请求的我们后端的WEB服务器上,然后WEB服务器在返回结果的META上添加了cache-control标签,它的值为public。 下面是cache-control标签一些值的说明: public 指示响应可被任何缓存区缓存。 […]

龙生   16 Sep 2017
View Details

ASP.NET Core 十种方式扩展你的 Views

原文地址:http://asp.net-hacker.rocks/2016/02/18/extending-razor-views.html 作者:Jürgen Gutsch 翻译:杨晓东(Savorboard) 现在,已经有很多种方式来扩展Razor视图了,我们循循渐进,先从最简单的开始。 如果你之前熟悉MVC5(以及之前的MVC)中的视图的话,有一部分你应该已经很熟悉了。在新的ASP.NET Core 中,那些你熟悉的方式有一部分仍然能用,只是Core版本针对视图又添加了一些东西。这篇文章,我们就来一起看看吧。 #1:数据视图(Typed Views) 这是一个不具有动态内容的最基本的一个视图,就是你定义一个ViewModel , 然后ViewModel具有一些默认值,在视图上直接呈现而已。定死的ViewModel,好像不是很常见,以至于你使用Visual Studio新建一个默认的Web应用程序的话,都看不到它。它就看起来像一个*.cshtml结尾的HTML文件,但是,cshtml文件却是服务端可以解析的一种文件,所以你可以在里面使用一些Razor语法,比如HtmlHelpers,UrlHelpers等。同样,你可以使用ViewBag或者ViewData来从Controller的Action传输数据到View里面,来让它具有动态的内容。但是ViewBag和ViewData都是弱类型的,所以没有智能提示,用起来略不爽。 要在你的视图中使用强类型数据对象,你需要定义一个Model来在视图中使用。

这种方式是不是很常见的? 下一种方式是一个更好的方式来布局我们的视图: #2:布局(Layouts): 相当于ASP.NET的WebForms的母版页,不过它是定义Razor视图的基本布局的一种方式。它就是_Layout.cshtml, 位于 Views\Shared 文件夹里 。通常情况下这个文件通常包含HTML的header,body和公用的一些东西。你可以多建几个互相进行组合,来完成整个站点的布局。其他页面引用布局视图页的时候,是这样子写的(注意不需要扩展名):

此调用需要在您的视图的第一行中。但你不需要在每一个视图中定义布局,如果你使用Visual Studio新建一个ASP.NET Core项目,Views文件夹有一个_ViewStart.cshtml,在运行的时候它会自动的导入到每个视图中去。 在_Layout.cshtml有一个方法法叫 RenderBody(),它就是用来渲染详细的视图页到模板布局视图中:

在此方法的位置,详情视图就会被渲染到这里。 #3: 区域(Sections) 有时候子视图中想在主视图中显示一部分html代码,比如javascript代码或者是css,这个时候就可以使用Sections,通常情况下在页面的结尾部分。 在主视图中(_Layout.cshtml)定义一个Javascripts Section:

有一个required参数来声明这个Section是否必须的。然后你就可以在子视图中这样使用:

如果你使用嵌套的布局,你可能需要嵌套这个区域。意思就是你在Section里面嵌套调用RenderSection():

#4: 分部视图( PartialViews) 你可以提取html页面中重用的部分,把它放到一个新的Razor视图中,这个视图没有自己的Action,这种视图就叫做分部视图。 分部视图通常也在Views\Shard\文件夹。 分部视图同样也可以是一个数据视图,它可以从父视图中获取数据(但不是必须的):

这个分部视图需要从父视图中获取用户列表的数据

如果你的分部视图没有定义用户模型,你就不需要传第二个参数。 #5:视图组件(ViewComponents) 这个 ASP.NET Core特有的。 译者注:类似于以前的用户控件 有时候你需要做一些分部视图的事情,但是又包含一些业务逻辑在里面。在过去,你可以使用ChildAction渲染结果到一个视图中,但是,在 ASP.NET Core中,有一种新的方式来做这件事情,它就是ViewComponents(我已经写了一篇关于ViewComponents的博文)。它类似于在MVC中的一种迷你的MVC,也就是说他们可以有自己的Controller,和单个的action以及view。ViewComponents是完全独立于你的当前视图的,但是可以通过你当前的视图传输数据。 想这样调用它,来渲染一个ViewComponents:

可以看我的博客来学习怎么创建自己的ViewComponent。 #6: HTML助手(HtmlHelpers) 在HTMLHelper类中,你可以创建你自己的扩展方法来扩展Razor语法:

在你的视图中,创建一个可重用的部分是非常有用的,它比分部视图多包含了一些业务逻辑。比HTMLHelpers扩展更好的是新的TagHelpers,但是在扩展你视图的时候,HTMLHelpers仍然有它自己的一些适用的地方。 #7: 标签助手(TagHelper) 这是 ASP.NET Core 非常好的一个新特性。 一个扩展你视图的小助手,它看起来像一个原生的HTML标签一样。 在ASP.NET Core MVC中你应该使用 TagHelpers 来替换 HtmlHelpers,因为它们更加的简洁和容易使用。另一个巨大的好处就是依赖注入,在HtmlHelpers中是使用不了的,因为HtmlHelpers 扩展的都是静态内容。 但TagHelpers是一个公共类,我们可以很容易的在它的构造函数中注入服务。 下面是一个很简单的小示例,来展示怎么样定义一个TagHelper:

这里定义了一个叫做hi的标签,它以HTML标记来呈现,p标签的内容是当前时间。 使用:

结果:

[…]

龙生   16 Sep 2017
View Details

ASP.NET Core Linux下为 dotnet 创建守护进程(必备知识)

前言 在上篇文章中介绍了如何在 Docker 容器中部署我们的 asp.net core 应用程序,本篇主要是怎么样为我们在 Linux 或者 macOs 中部署的 dotnet 程序创建一个守护进程,来保证我们的程序在异常或者是电脑重启的时候仍然能够正常访问。 如果你以后用准备使用 asp.net core来开发项目的话,程序并且部署到 Linux 上的话,那么此篇文章你值得收藏。 如果你觉得对你有帮助的话,不妨点个【推荐】。 目录 什么是守护进程 Supervisor 介绍 Supervisor 安装 Supervisor 配置,常用命令 Supervisor UI管理台 什么是守护进程 在linux或者unix操作系统中,守护进程(Daemon)是一种运行在后台的特殊进程,它独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。由于在linux中,每个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端被称为这些进程的控制终端,当控制终端被关闭的时候,相应的进程都会自动关闭。但是守护进程却能突破这种限制,它脱离于终端并且在后台运行,并且它脱离终端的目的是为了避免进程在运行的过程中的信息在任何终端中显示并且进程也不会被任何终端所产生的终端信息所打断。它从被执行的时候开始运转,直到整个系统关闭才退出。 此处的创建守护进程,是指发布在Linux上 asp.net core 程序的dotnet xxx.dll命令的宿主进程创建一个守护进程。 在 Linux 上有很多可以管理进程的工具,我们使用 Supervisor 来做这个事情。 原因有两点: 1、它是微软官方文档推荐的,降低学习成本。 2、它并不一定是最好的,但一定是文档最全的。 Supervisor 介绍 Supervisor是采用 Python(2.4+) 开发的,它是一个允许用户管理 基于 Unix 系统进程的 Client/Server 系统,提供了大量功能来实现对进程的管理。 官方文档:http://supervisord.org/ Supervisor 安装 在 masOS 中直接使用brew工具进行安装即可: brew install supervisor 在 linux 中使用以下命令进行安装: ubuntu sudo apt-get install supervisor centos yum install supervisor python pip install supervosor easy_install supervisor 安装完成之后:

  Supervisor 配置,常用命令 安装完成之后,在 /ect/supervisor/conf.d/ 目录下新建一个配置文件(touch HelloWebApp.conf),取名为 HelloWebApp.conf […]

龙生   16 Sep 2017
View Details

《领域驱动设计的原则与实践》读书笔记(一)

  Chapter 1 什么是DDD: 1、介绍领域驱动设计思想体系     和传统开发方式比起来,领域驱动是一种新的软件架构设计,它主要用来解决传统开发中代码杂乱无章,任意拼贴等最终导致程序难以维护而诞生的。     它提出软件变得复杂和难以管理的主要原因是,领域复杂性和技术复杂性混合在了一起。 2、DDD如何管理复杂性     提炼问题重点、创建模型解决问题、使用公共语言建模协作、理解上下文关系。     DDD的侧重点:核心领域、协作、与领域专家探讨、复杂域模型的上下文理解。 3、DDD常见误区     DDD是框架、DDD是灵丹妙药    Chapter 2 提炼问题域: 1、知识提炼,领域知识的重要性 2、业务分析员,提炼知识是一个持续过程,每一次迭代,模型都会有所变化。 3、与领域专家一起获得见解 4、使用BDD专注于应用程序的行为    Chapter 3 专注于核心领域: 1、找出核心,支撑和通用域 2、提炼有助于降低问题空间的复杂性 3、并非一个系统的所有部分都被精心设计    Chapter 4 模型驱动设计: 1、Code First模型驱动设计 2、使用该领域的通用语言来在代码中描述,代码是表述模型的主要形式,需要使用通用语言来约束它。 3、要让团队里面领域中隐含的观念变得明确并赋予会组成共享通用语言的名称。 4、通用语言应该用于测试,类名称,和方法。 5、仅为核心领域应用模型驱动设计并创建UL才能带来变化,不要将这些实践应用到整个应用程序。    Chapter 5 领域模型实现模式: 1、领域层:是包含领域模型的代码区域,他将领域模型的复杂性和应用程序偶发的技术复杂性隔离开来,负责确保基础架构关注的是想管理事务和持久化这样的问题,而不会掺入业务问题并却不会让领域中已经有的规则变模糊。                               图1、表示领域模型代码仅构成整体代码库的一小部分 2、领域模型模式是基于没有数据库前提的,因此它可以演化并且以完全忽略持久化的方式来创建。       在设计领域模型时,不要从数据模型开始。相反要从代码模型开始(Code First),与数据驱动设计相反的模型驱动。仅当必须考虑模型持久化时,才能在设计上做出让步。模型内的领域对象成为普通老方C#对象(POCO)。这些类不再与基础架构问题有关并却完全忽略持久性。      3、事务脚本:事务脚本整个用例都是封装在单个方法中,如数据检索,持久化,事务管理,和业务逻辑。      事务脚本缺点:对于不知道面向对象的程序员来说是一种有帮助的模式,但是如果逻辑变得复杂,事务脚本会变得很难管理,事务脚本就会出现问题。      表模式:单个对象代表数据库中的一个表或视图,适合于数据库驱动设计(DB First),不适合DDD。这个模式适合于领域中由有界上下文隔离的更简单 部分以及简单数据形式来说,非常合适并且比领域模型模式更易于掌握。但是如果对象模型和数据库模型出现分歧,那么就需要朝着DDD模式的方向进行重构。 4、活动记录:类似于表模式,是一种流行的模式,每个业务对象都负责其自身的持久化一起相关的业务逻辑,类似于Repository<T>。 5、贫血领域模型:又称为反模式。违背了“只问不说”的原则,这个模式下领域服务会承担代码更具程序性风格的角色。贫血模型是DDD中一个良好开局。    Chapter 6 使用有界上下文维护领域模型的完整性: 1、大模型容易出错,系统扩展越多,模型越复杂 2、使用有界上下文和破除大模型 3、有界上下文拥有从展现层到领域逻辑层,再到持久化,甚至到数据存储功能的垂直切片。 […]

龙生   16 Sep 2017
View Details

SQL语句优化(转载)

一、操作符优化 1、IN 操作符 用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格。但是用IN的SQL性能总是比较低的,从Oracle执行的步骤来分析用IN的SQL与不用IN的SQL有以下区别: ORACLE试图将其转换成多个表的连接,如果转换不成功则先执行IN里面的子查询,再查询外层的表记录,如果转换成功则直接采用多个表的连接方式查询。由此可见用IN的SQL至少多了一个转换的过程。一般的SQL都可以转换成功,但对于含有分组统计等方面的SQL就不能转换了。 推荐方案:在业务密集的SQL当中尽量不采用IN操作符,用EXISTS 方案代替。 2、NOT IN操作符 此操作是强列不推荐使用的,因为它不能应用表的索引。 推荐方案:用NOT EXISTS 方案代替 3、IS NULL 或IS NOT NULL操作(判断字段是否为空) 判断字段是否为空一般是不会应用索引的,因为索引是不索引空值的。 推荐方案:用其它相同功能的操作运算代替,如:a is not null 改为 a>0 或a>’’等。不允许字段为空,而用一个缺省值代替空值,如申请中状态字段不允许为空,缺省为申请。 4、> 及 < 操作符(大于或小于操作符) 大于或小于操作符一般情况下是不用调整的,因为它有索引就会采用索引查找,但有的情况下可以对它进行优化,如一个表有100万记录,一个数值型字段A,30万记录的A=0,30万记录的A=1,39万记录的A=2,1万记录的A=3。那么执行A>2与A>=3的效果就有很大的区别了,因为A>2时ORACLE会先找出为2的记录索引再进行比较,而A>=3时ORACLE则直接找到=3的记录索引。 5、LIKE操作符 LIKE操作符可以应用通配符查询,里面的通配符组合可能达到几乎是任意的查询,但是如果用得不好则会产生性能上的问题,如LIKE ‘%5400%’ 这种查询不会引用索引,而LIKE ‘X5400%’则会引用范围索引。 一个实际例子:用YW_YHJBQK表中营业编号后面的户标识号可来查询营业编号 YY_BH LIKE ‘%5400%’ 这个条件会产生全表扫描,如果改成YY_BH LIKE ’X5400%’ OR YY_BH LIKE ’B5400%’ 则会利用YY_BH的索引进行两个范围的查询,性能肯定大大提高。 6、UNION操作符 UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION。如: select * from gc_dfys union select * from ls_jg_dfys 这个SQL在运行时先取出两个表的结果,再用排序空间进行排序删除重复的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序。 推荐方案:采用UNION ALL操作符替代UNION,因为UNION ALL操作只是简单的将两个结果合并后就返回。 select * from gc_dfys union all select * from ls_jg_dfys 二、SQL书写的影响 1、同一功能同一性能不同写法SQL的影响。 如一个SQL在A程序员写的为  Select * from zl_yhjbqk B程序员写的为 Select * from dlyx.zl_yhjbqk(带表所有者的前缀) C程序员写的为 Select * from DLYX.ZLYHJBQK(大写表名) D程序员写的为 Select *  […]

龙生   16 Sep 2017
View Details

Python入门指南

一.Windows7下的Python环境搭建 1.Google下载python-2.6.msi安装包,以管理员身份运行,安装时候注意不要在有中文目录的程序下安装。安装完成之后可以在开始菜单中看到。 2.配置环境变量。不用配置也可以,不过配置之后后面会方便很多。 配置方法:右键“我的电脑”选择“属性”,切换到“高级”选项卡,选择环境变量,在“系统变量”下选择“Path”变量,然后点击“编辑”按钮,添加Python安装目录。配置完成之后可以打开cmd输入”python”进行测试。如果出现下图所示,则表示配置成功。此步骤熟悉Java的同学应该比较熟悉。        二.Python基础语法   关于Python 的基础教程网上有很多,我的看的电子书。 推荐《Python核心编程(第二版)》,大家可以去电驴下载电子版。Python是弱类型语言,对Javascript比较熟悉同学学起来应该会快一点。有人说Python不需要学习,不过我认为一些基本的API的使用还是要记得的。 这里给出一个地址:http://www.verycd.com/topics/2765155/   三.Python 开发环境   如果觉得Python自带的IDE用着很不爽的下,有下面3个自认为比较好的第三方开发环境。 如果你是.NET开发人员用的是Visual Studio 2010或者更高版本的话,那么你可以http://pytools.codeplex.com/ 下载Python Tools for Visual Studio,然后进行安装即          可。 如果你是Java开发人员用的是Eclipse的话,那么你可以参考http://www.rose-hulman.edu/class/csse/resources/Eclipse/eclipse-python-configuration.htm这里进行Eclipse环境的搭建。 如果你想开发GUI程序的话,那么你可以Google下载boa-constructor-0.6.1.src.win32.exe 和 wxPython2.8-win32-unicode-2.8.12.1-py26.exe 这两个拓展包,前者为GUI拓展包,后者对前者提供了界面操作的支持。 如果你想开发能在没有Python环境上运行Windows GUI程序,那么你需要以下工具。 Python打包工具。Python打包工具有很多种,常用的有Pyinstaller,py2exe等,具体可以Google。后面具体介绍Py2exe的使用。 Python扩展包。Python有非常多的开源扩展包以及强大的扩展能力,一般网络编程,WEB编程,客户端编程 等 你都可以在网上找到非常丰富的资源。下面给出了一些: http://www.itlong.com/thread-1685-1-1.html   from:http://www.cnblogs.com/savorboard/archive/2012/12/30/2839981.html

龙生   16 Sep 2017
View Details

ASP.NET Core Docker jexus nginx部署-CentOS实践版

本文用图文的方式记录了我自己搭建centos+asp.net core + docker + jexus + nginx的整个过程,希望对有同样需求的朋友有一定的参考作用。 本文主要内容如下: centos7安装 yum镜像 docker镜像 docker安装 dotnetcore安装 Docker安装dotnetcore镜像 asp.net core 创建与发布 docker中部署asp.net core jexus转发 nginx转发   1.centos7安装 a.下载centos的iso文件,比如:CentOS-7-x86_64-Everything-1611.iso b.虚拟机安装,比如:hyper-v c.手动分区: /boot  至少1G,建议2G(很多东西会装在里面,别信网上说的100M足够的话了,设置大点) /swap 2倍内存大小 /        10G吧 /home 10G以上吧 /var 至少1G,建议5G(docker很容易装满) d.软件预装,选择:带UI的Server 2.yum镜像 a.访问阿里云http://mirrors.aliyun.com b.找到你要装的OS,点右边“help”进入安装指南 c.根据指南,安装镜像(执行命令的时候请加上sudo,如果你不是root) 1 2 3 sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup sudo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo   3.docker镜像 a. 打开开发者中心https://dev.aliyun.com/search.html b.右上角“注册/登陆” c.登陆后,右上角有一个“管理中心” d.进入管理中心,点击“加速器” 开始前先参照这个帖子《CentOS禁止packagekit离线更新服务的办法》http://www.cnblogs.com/zjoch/p/6500480.html处理,否则出现如下错误 按提示完成镜像设置 1 2 3 4 5 6 7 8 9 10 11 12 sudo curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh – 以下命令一行一行输入 sudo mkdir […]

龙生   16 Sep 2017
View Details

学会思考,而不只是编程

  英文原文:Don’t learn to code. Learn to think   中国人常说“授之以鱼不如授之以渔”。如果说教授编程是授之以鱼,那么教授计算机科学就是授之以渔。为什么说学习计算机科学比学会编程要重要得多?来听听Yevgeniy Brikman的解释。   现如今,似乎每个人都在学习编程:Bill Gates、Mark Zuckerberg和Chris Bosh这些名人在Code.org网站上告诉人们每个人都拥有编程的能力;CoderDojo项目在世界各地大张旗鼓;英国已经把编程作为小学官方课程。   不过,我认为这样有点误入歧途了。但请不要误会——我也确实认为代码能够让世界变得更美好——但编程本身并不是我们的目的。计算机和程序只是工具,它们是我们通向终点的桥梁。   我们真正的目标应该是教会人们如何思考。换句话说,我们应该教人们计算机科学,而不只是编程。在这篇文章里,我将会解释这两者之间的区别,以及为什么在这两者当中选择正确的一方对于迈向成功来说如此重要。   我们不妨先问自己一个问题:为什么我们要关心编程或计算机科学?   欢迎来到真实的世界   或许你正在使用Chrome或Firefox阅读这篇文章,这些浏览器可能运行在Windows或macOS上,而你可能正在使用笔记本或台式机。你今天可能花了一些时间阅读电子邮件、查看朋友圈的状态,或者在视频网站上看了一些视频。我们的生活在很大程度上依赖了计算机:我们的医疗记录保存在数据库里;我们的简历可能放在了LinkedIn上;我们使用Google或Facebook为产品做宣传;我们在Amazon上购买这些产品;我们直接在网络上进行报税;我们使用网上电子银行;我们甚至开始涉足电子货币。   现在将你的视线从电脑上移开:在你的口袋里或者桌角的某个地方可能放着你的手机,它装有GPS、摄像头、触摸屏和大量的应用程序。在你的客厅,可能有LCD电视机、DVR、DVD播放机、Apple TV、Xbox或PlayStation。这些设备上的视频、音乐和游戏都是由计算机图形和数字音频组成的。   当你经过你的汽车时,你是否想过,现代汽车是使用软件设计并在满布机器人和计算机的工厂里生产出来的?你开着车,使用Google地图导航,在Yelp上查找吃饭的地方或在TripAdvisor上查找休息的地方。在你的头顶上方有自动驾驶的飞机飞过,飞机里有Wifi和娱乐系统,可以与其他飞机、交通指挥中心和飞机厂商联系。再往上,卫星和太空站正围绕着地球绕圈,它们拍照、预报天气、转发电话信号。   软件正在吞噬着这个世界,但这只不过是个开始。在你意识到这一点之前,你可能已经穿上了智能可穿戴设备、使用电脑来锁门、使用机器人来送货或清理房间、开发自己的电子设备、有自己的制造车间、生活在虚拟现实里、乘坐自动驾驶的汽车,甚至飞向太空。   矩阵无处不在   上述的这些科技都是由软件驱动的,我们的生活被代码所包围,而代码的数量在未来只会不断增加。   不过,虽说科技无处不在,但这并不意味着你在学校里就一定要学习这些技术。比方说,我们都需要乘坐飞机,但即使是K12也并没有把获得飞行员驾照当作课程的一部分。   相反,学会使用那些能够帮助你理解飞行原理的工具却是课程的一部分: 通过学习物理和数学,你了解了重力、作用力、压力、速度、摩擦力和浮力。 通过学习生物,你明白了人体在缺氧和寒冷的高空中会发生什么。 通过学习历史,你知道了飞机是怎样被发明和制造出来的,以及飞机在旅行、商务和战争中所扮演的角色。   中学毕业之后,你就知道飞机是什么东西,知道飞机是如何飞行的,以及如何安全地搭乘飞机。一般性的课程,如物理、数学、生物和历史,它们教会你如何思考各个领域的问题,包括飞机在内。相反,有些课程只是教会你如何使用一种工具,比如如何驾驶某种型号的飞机。   类似的,我们应该专注于教授计算机科学,而不仅仅是编程:前者能够教会我们一般性的思考方式,而后者只是一种特定的工具。   什么是计算机科学?   计算机科学就是研究计算:如何表示和处理信息。 解决问题:你将学会各种算法策略,比如分而治之法、递归、探索法、贪婪搜索和随机算法,它们可以帮你分解和解决任何一种问题。 逻辑:你开始使用更准确和正式的方式进行思考,比如抽象、布尔逻辑、数字理论和集合理论,你因此能够以一种严谨的方式来解决问题。 数据:你接触到信息理论,想要了解信息是什么东西,你该如何表示它们,以及如何对这个真实的世界进行建模。 系统:你该如何设计和实现复杂的系统来满足一系列的需求?系统工程几乎已经成为各个业务领域的核心议题。 思考:了解人类思维的最好途径就是尝试复制它。人工智能、机器学习、计算机视觉和自然语言处理不仅仅是计算机科学的前沿技术,它们也涉及到了生物学、物理学、心理学和数学。   上述的清单并没有提及编程或者程序,因为它们只是计算工具:它们都不是计算机科学。   在计算方面,我们更多地依赖另一个工具:我们的大脑!计算机科学的目的是教会我们的大脑进行创新性、一般性和广泛性的思考。随着科技的日益渗透,新的思考方式变得和物理、数学、生物和历史一样重要。   也就是说,只进行单独的思考是不够的:我们需要知道如何应用我们的思考。在物理学里,我们使用天平、棱镜和磁铁做实验;在生物学里,我们使用试管、植物和有盖培养皿;在计算机科学里,我们学习编程。   什么是编程?   编程,或者说写代码,是指你发出指令让计算机执行一些操作。如果你之前从来没有写过代码,那么你可能习惯了使用已有的应用程序来与计算机发生交互。实际上,这些应用程序是由代码组成的,这些代码告诉计算机如何显示应用、在哪里存储数据、从哪里获取数据,以及如何对用户的鼠标点击做出响应。   编程是基于上述的计算机科学原则进行的。计算机科学的概念——逻辑、算法、数据和系统工程——可以用于构建所有的事物,从Web浏览器到飞机的自动驾驶软件。编程涉及到数学和数据结构,同时也是一项具有创造性的活动:每敲出一行代码,你的想法就又向现实迈近了一步。   将编程作为计算机科学的一部分带来了很多好处。 DIY:如果你会编程,你就可以自己开发软件。你可以从简单的开始:写一个脚本来重命名照片或写一个Excel公式来计算税金。然后更进一步:搭建一个网站;为你的公司开发一个移动应用;开发一款可以与你的朋友们一起玩的游戏。 问题诊断:在开发了几款应用之后,就可以轻松地理解其他的应用。在战胜了对计算机的恐惧之后,你将成为技术大神。技术遍布我们的生活,知道如何操纵它们变得与知道如何使用它们一样重要。 职业生涯:学习计算机科学的目的并不是为了成为专业的程序员。我们每个人在学校里都学习数学、物理和化学,但并不是每个人都成为专业的数学家、物理学家或化学家。不过,如果你有这方面的热情,你会发现软件工程是一份高评价、高收入、增长快速的工作。   总结   让我们回顾一下: 计算机科学代表了一种新的思考方式。在一个被技术渗透的世界里,计算机科学的概念对于每一个人来说都是非常有用的。 编程是学习计算机科学的一种途径,但它本身并不具备一般性目的。   混淆了这两者就会让学习编程偏离正确的方向。Slate写过“或许不是每个人都要学习编程”的文章,Atlantic也写过“新闻学院没必要要求学生记者学会编程”的文章,而Jeff Atwood在他的文章“请不要学习编程”中问了一个问题,这个问题就是混淆概念的例子: 如果有一天,Michael Bloomberg在早上醒来时发现自己变成了一个Java编程高手,对于这个领导着美国最大城市的大人物来说,他的日常工作是否会如虎添翼?   当然,这个问题本身就是有问题的。这要归因于人们将学习编程作为终极目标,而不是学习如何思考。即使是Jeff Atwood这位经验丰富且倍受尊敬的程序员尚且分不清楚其中的区别,就别指望一般人能够搞清楚问题的实质了。我们应该这么问: 如果Bloomberg通过学习新的解决问题策略和掌握更好的逻辑领悟技能来改进他的思考方式,那么他在日常工作中是否会变得更好?   我想答案是显而易见的。随着技术越来越广泛地渗透到我们生活的各个方面,答案会越来越明显。这就是为什么我们要专注于教授计算机科学而不只是教授如何编程的原因。 from:http://kb.cnblogs.com/page/572854/

龙生   16 Sep 2017
View Details
1 224 225 226 432