06
3

.NET Core 3.0-preview3 发布

0
归档:2019年3月分类:C#和.NET

.NET Core 3.0 Preview 3已经发布,框架和ASP.NET Core有许多有趣的更新。这是最重要的更新列表。 下载地址 :https://aka.ms/netcore3download 。

.NET Core 3.0的更新:

C#中对索引和范围的更多支持

支持.NET Standard 2.1。以.NET Standard项目文件为目标,并将netstandard2.1指定为目标框架。完整的.NET Framework不支持.NET Standard 2.1。

F#4.6和dotnet fsi命令。可以使用F#4.6和dotnet fsi命令的预览。FSI代表F#互动。

AssemblyDependencyResolver和resolver事件。从给定路径加载依赖程序集(之前不可能),解析程序事件可帮助我们更好地处理动态加载的本机依赖项。

Windows Forms应用程序的高DPI。最后,微软将Windows Forms应用程序推向了当今时代。96DPI不再适用,并且可以构建高DP Windows窗体应用程序。

ASP.NET Core 3.0的更新:

Razor组件的改进。现在2个项目合并成单个项目模板,Razor组件支持端点路由和预渲染,Razor组件可以托管在Razor类库中。还改进了事件处理和表单和验证支持。

运行时编译。它在ASP.NET Core 3.0模板中被禁用,但现在可以通过向项目添加特殊的NuGet包来打开它。

Worker Service 模板。需要编写Windows服务还是Linux守护进程?现在我们有了Worker Service 模板。

gRPC模板。与谷歌一起构建的gRPC是一种流行的远程过程调用(RPC)框架。此版本的ASP.NET Core在ASP.NET Core上引入了第一等的gRPC支持。

Angular模板使用Angular 7. Angular SPA模板现在使用Angular 7,在第一次稳定释放之前,它将被Angular 8替换。

SPA-s的身份验证。Microsoft通过此预览为单页应用程序添加了现成的身份验证支持。

SignalR与端点路由集成。小变化 - 现在使用端点路由定义SingalR路由。

SignalR Java客户端支持长轮询。即使在不支持或不允许WebSocket的环境中,SignalR Java客户端现在也可以使用。

 

06
3

遇到问题开始

当人们要做一个软件系统时,一般总是因为遇到了什么问题,然后希望通过一个软件系统来解决。

比如,我是一家企业,然后我觉得我现在线下销售自己的产品还不够,我希望能够在线上也能销售自己的产品。所以,自然而然就想到要做一个普通电商系统,用于实现在线销售自己企业产品的目的。

再比如,我是一家互联网公司,公司有很多系统对外提供服务,面向很多客户端设备。但是最近由于各种原因,导致服务经常出故障。所以,我们希望通过各种措施提高服务的质量和稳定性。其中的一个措施就是希望能做一个灰度发布的平台,这个平台可以提供灰度发布的服务。然后,当某个业务系统做了一些修改并需要发布时,可以使用我们的灰度发布平台来非常方便的实现灰度发布的功能。比如在灰度发布平台上方便的定制允许哪些特定的客户端才会访问新服务,哪些客户端继续使用老服务。灰度发布平台可以提供各种灰度的策略。有了这样的灰度发布机制,那即便系统的新逻辑有什么问题,受影响的面也不会很大,在可控范围内。所以,如果公司里的所有对外提供服务的系统都接入了灰度平台,那这些系统的发布环节就可以更加有保障了。

总之,我们做任何一个软件系统,都是有原因的,否则就没必要做这个系统,而这个原因就是我们遇到的问题。所以,通过问题,我们就知道了我们需要一个什么样的系统,这个系统解决什么样的问题。最后,我们就很自然的得出了一个目标,即知道了自己要什么。比如我要做一个论坛、一个博客系统、一个电商平台、一个灰度发布系统、一个IDE、一个分布式消息队列、一个通信框架,等等。

DDD切入点1 - 理解概念

DDD的全称为Domain-driven Design,即领域驱动设计。下面我从领域、问题域、领域模型、设计、驱动这几个词语的含义和联系的角度去阐述DDD是如何融入到我们平时的软件开发初期阶段的。要理解什么是领域驱动设计,首先要理解什么是领域,什么是设计,还有驱动是什么意思,什么驱动什么。

一、什么是领域(Domain)?

前面我们已经清楚的知道我们现在要做一个什么样的系统,这个系统需要解决什么问题。我认为任何一个系统都会属于某个特定的领域,比如论坛是一个领域,只要你想做一个论坛,那这个论坛的核心业务是确定的,比如都有用户发帖、回帖等核心基本功能。比如电商平台、普通电商系统,这种都属于网上电商领域,只要是这个领域的系统,那都有商品浏览、购物车、下单、减库存、付款交易等核心环节。所以,同一个领域的系统都具有相同的核心业务,因为他们要解决的问题的本质是类似的。

因此,我们可以推断出,一个领域本质上可以理解为就是一个问题域,只要是同一个领域,那问题域就相同。所以,只要我们确定了系统所属的领域,那这个系统的核心业务,即要解决的关键问题、问题的范围边界就基本确定了。通常我们说,要成为一个领域的专家,必须要在这个领域深入研究很多年才行。因为只有你研究了很多年,你才会遇到非常多的该领域的问题,同时你解决这个领域中的问题的经验也非常丰富。很多时候,领域专家比技术专家更加吃香,比如金融领域的专家。

二、什么是设计(Design)?

DDD中的设计主要指领域模型的设计。为什么是领域模型的设计而不是架构设计或其他的什么设计呢?因为DDD是一种基于模型驱动开发的软件开发思想,强调领域模型是整个系统的核心,领域模型也是整个系统的核心价值所在。每一个领域,都有一个对应的领域模型,领域模型能够很好的帮我们解决复杂的业务问题。

从领域和代码实现的角度来理解,领域模型绑定了领域和代码实现,确保了最终的代码实现就一定是解决了领域中的核心问题的。因为:1)领域驱动领域模型设计;2)领域模型驱动代码实现。我们只要保证领域模型的设计是正确的,就能确定领域模型可以解决领域中的核心问题;同理,我们只要保证代码实现是严格按照领域模型的意图来落地的,那就能保证最后出来的代码能够解决领域的核心问题的。这个思路,和传统的分析、设计、编码这几个阶段被割裂(并且每个阶段的产物也不同)的软件开发方法学形成鲜明的对比。

三、什么是驱动(Driven)?

上面其实已经提到了,就是:1)领域驱动领域模型设计;2)领域模型驱动代码实现。这个就和我们传统的数据库驱动开发的思路形成对比了。DDD中,我们总是以领域为边界,分析领域中的核心问题(核心关注点),然后设计对应的领域模型,再通过领域模型驱动代码实现。而像数据库设计、持久化技术等这些都不是DDD的核心,而是外围的东西。

领域驱动设计(DDD)告诉我们的最大价值我觉得是:当我们要开发一个系统时,应该尽量先把领域模型想清楚,然后再开始动手编码,这样的系统后期才会很好维护。但是,很多项目(尤其是互联网项目,为了赶工)都是一开始模型没想清楚,一上来就开始建表写代码,代码写的非常冗余,完全是过程是的思考方式,最后导致系统非常难以维护。而且更糟糕的是,出来混总是要还的,前期的领域模型设计的不好,不够抽象,如果你的系统会长期需要维护和适应业务变化,那后面你一定会遇到各种问题维护上的困难,比如数据结构设计不合理,代码到处冗余,改BUG到处引入新的BUG,新人对这种代码上手困难,等。而那时如果你再想重构模型,那要付出的代价会比一开始重新开发还要大,因为你还要考虑兼容历史的数据,数据迁移,如何平滑发布等各种头疼的问题。所以,就导致我们最后天天加班。

虽然,我们都知道这个道理,但是我也明白,人的习惯很难改变的,大部分人都很难从面向过程式的想到哪里写到哪里的思想转变为基于系统化的模型驱动的思维。我想,这或许是DDD很难在中国或国外流行起来的原因吧。但是,我想这不应该成为我们放弃学习DDD的原因,对吧!

概念总结:

领域就是问题域,有边界,领域中有很多问题;

任何一个系统要解决的那个大问题都对应一个领域;

通过建立领域模型来解决领域中的核心问题,模型驱动的思想;

领域建模的目标针对我们在领域中所关心的问题,即只针对核心关注点,而不是整个领域中的所有问题;

领域模型在设计时应考虑一定的抽象性、通用性,以及复用价值;

通过领域模型驱动代码的实现,确保代码让领域模型落地,代码最终能解决问题;

领域模型是系统的核心,是领域内的业务的直接沉淀,具有非常大的业务价值;

技术架构设计或数据存储等是在领域模型的外围,帮助领域模型进行落地。

DDD切入点2 - 理解领域、拆分领域、细化领域

一、理解领域知识是基础

上面我们通过第一步,虽然我们明确了要做一个什么样的系统,该系统主要解决什么问题,但是就这样我们还无法开始进行实际的需求分析和模型设计,我们还必须将我们的问题进行拆分,需求进行细化。有些时候,需求方,即提出问题的人,很可能自己不清楚具体想要什么。他只知道一个概念,一个大的目标。比如他只知道要做一个股票交易系统,一个灰度发布系统,一个电商平台,一个开发工具,等。但是他不清楚这些系统应该具体做成什么样子。这个时候,我认为领域专家就非常重要了,DDD也非常强调领域专家的重要性。因为领域专家对这个领域非常了解,对领域内的各种业务场景和各种业务规则也非常清楚,总之,对这个领域内的一切业务相关的知识都非常了解。所以,他们自然就有能力表达出系统该做成什么样子。所以,要知道一个系统到底该做成什么样子,到底哪些是核心业务关注点,只能靠沉淀领域内的各种知识,别无他法。因此,假设你现在打算做一个电商平台,但是你对这个领域没什么了解,那你一定得先去了解下该领域内主流的电商平台,比如淘宝、天猫、京东、亚马逊等。这个了解的过程就是你沉淀领域知识的过程。如果你不了解,就算你领域建模的能力再强,各种技术架构能力再强也是使不上力。领域专家不是某个固定的角色,而是某一类人,这类人对这个领域非常了解。比如,一个开发人员也可以是一个领域专家。假设你在一个公司开发和维护一个系统已经好几年了,但是这个系统的产品经理(PD)可能已经换过好几任了,这种情况下,我相信这几任产品经理都没有比你更熟悉这个领域。

二、拆分领域

上面我们明白了,领域建模的基础是要先理解领域,让自己成为领域专家。如果做到了这点,我们就打好了坚实的基础了。但是,有时一个领域往往太复杂,涉及到的领域概念、业务规则、交互流程太多,导致我们没办法直接针对这个大的领域进行领域建模。所以,我们需要将领域进行拆分,本质上就是把大问题拆分为小问题,然后各个击破的思路。然后既然把一个大的领域划分为了多个小的领域(子域),那最关键的就是要理清每个子域的边界;然后要搞清楚哪些子域是核心子域,哪些是非核心子域,哪些是公共支撑子域;然后,还要思考子域之间的联系是什么。那么,我们该如何划分子域呢?我的个人看法是从业务相关性的角度去思考,也就是我们平时说的按业务功能为出发点进行划分。还是拿经典的电商系统来分析,通常一个电商系统都会包含好几个大块,比如:

  • 会员中心:负责用户账号登录、用户信息的管理;

  • 商品中心:负责商品的展示、导航、维护;

  • 订单中心:负责订单的生成和生命周期管理;

  • 交易中心:负责交易相关的业务;

  • 库存中心:负责维护商品的库存;

  • 促销中心:负责各种促销活动的支持;

上面这些中心看起来很自然,因为大家对电子商务的这个领域都已经非常熟悉了,所以都没什么疑问,好像很自然的样子。所以,领域划分是不是就是没什么挑战了呢?显然不是。之所以我们觉得子域划分很简单,是因为我们对整个大领域非常了解了。如果我们遇到一个冷门的领域,就没办法这么容易的去划分子域了。这就需要我们先去努力理解领域内的知识。所以,我个人从来不相信什么子域划分的技巧什么的东西,因为我觉得这个工作没有任何诀窍可以使用。当我们不了解一个东西的时候,如何去拆解它?当我们对整个领域有一定的熟悉了,了解了领域内的相关业务的本质和关系,我们就自然而然的能划分出合理的子域了。不过并不是所有的系统都需要划分子域的,有些系统只是解决一个小问题,这个问题不复杂,可能只有一两个核心概念。所以,这种系统完全不需要再划分子域。但不是绝对的,当一个领域,我们的关注点越来越多,每个关注点我们关注的信息越来越多的时候,我们会不由自主的去进一步的划分子域。比如,也许我们一开始将商品和商品的库存都放在商品中心里,但是后来由于库存的维护越来越复杂,导致揉在一起对我们的系统维护带来一定的困难时,我们就会考虑将两者进行拆分,这个就是所谓的业务垂直分割。

三、细化子域

通过上面的两步,我们了解了领域里的知识,也对领域进行了子域划分。但这样还不够,凭这些我们还无法进行后续的领域模型设计。我们还必须再进一步细化每个子域,进一步明确每个子域的核心关注点,即需求细化。我觉得我们需要细化的方面有以下几点:

  1. 梳理领域概念:梳理出领域内我们关注的概念、概念的关系,并统一交流词汇,形成统一语言;

  2. 梳理业务规则:梳理出领域内我们关注的各种业务规则,DDD中叫不变性(invariants),比如唯一性规则,余额不能小于零等;

  3. 梳理业务场景:梳理出领域内的核心业务场景,比如电商平台中的加入购物车、提交订单、发起付款等核心业务场景;

  4. 梳理业务流程:梳理出领域内的关键业务流程,比如订单处理流程,退款流程等;

从上面这4个方面,我们从领域概念、业务规则、交互场景、业务流程等维度梳理了我们到底要什么,整理了整个系统应该具备的功能。这个工作我觉得是一个非常具有创造性和有难度的工作。我们一方面会主观的定义我们想要什么;另一方面,我们还会思考我们要的东西的合理性。我认为这个就是产品经理的工作,产品经理必须要负起职责,把他的产品充分设计好,从各个方面去考虑,如何设计一个产品,才能更好的解决用户的核心诉求,即领域内的核心问题。如果对领域不够了解,如果想不清楚用户到底要什么,如果思考问题不够全面,谈何设计出一个合理的产品呢?

关于领域概念的梳理,我觉得可以采用四色原型分析法,这个分析法通过系统的方法,将概念划分为不同的种类,为不同种类的概念标注不同的颜色。然后将这些概念有机的组合起来,从而让我们可以清晰的分析出概念和概念之间的关系。有兴趣的同学可以在网上搜索下四色原型

注意:上面我说的这四点,重点是梳理出我们要什么功能,而不是思考如何实现这些功能,如何实现是软件设计人员的职责。

DDD切入点3 - 领域模型设计

这部分内容,我想学习DDD的人都很熟悉了。DDD原著中提出了很多实用的建模工具:聚合、实体、值对象、工厂、仓储、领域服务、领域事件。我们可以使用这些工具,来设计每一个子域的领域模型。最终通过领域模型图将设计沉淀下来。要使用这些工具,首先就要理解每个工具的含义和使用场景。不要以为很简单哦,比如聚合的划分就是一个非常具有艺术的活。同一个系统,不同的人设计出来的聚合是完全不同的。而且很有可能高手之间的最后设计出来的差别反而更大,实际上我认为是世界观的相互碰撞,呵呵。所以,要领域建模,我觉得每个人都应该去学学哲学知识,这有助于我们更好的认识世界,更好的理解事物的本质。

关于这些建模工具的概念和如何运用我就不多展开了,我博客里也有很多这方面的介绍。下面我再讲一下我认为比较重要的东西,比如到底该如何领域建模?步骤应该是怎么样的?

一、领域建模的方法

通过上面我介绍的细化子域的内容,现在再来谈该如何领域建模,我觉得就方便很多了。我的主要方法是:

  1. 划分好边界上下文,通常每个子域(sub domain)对应一个边界上下文(bounded context),同一个边界上下文中的概念是明确的,没有任何歧义;

  2. 在每个边界上下文中设计领域模型,具体的领域模型设计方法有很多种,如以场景为出发点的四色原型分析法,或者我早期写的这篇文章;这个步骤最核心的就是找出聚合根,并找出每个聚合根包含的信息;关于如何设计聚合,可以看一下我写的这篇文章

  3. 画出领域模型图,圈出每个模型中的聚合边界;

  4. 设计领域模型时,要考虑该领域模型是否满足业务规则,同时还要综合考虑技术实现等问题,比如并发问题;领域模型不是概念模型,概念模型不关注技术实现,领域模型关心;所以领域模型才能直接指导编码实现;

  5. 思考领域模型是如何在业务场景中发挥作用的,以及是如何参与到业务流程的每个环节的;

  6. 场景走查,确认领域模型是否能满足领域中的业务场景和业务流程;

  7. 模型持续重构、完善、精炼;

二、领域模型的核心作用:

  1. 抽象了领域内的核心概念,并建立概念之间的关系;

  2. 领域模型承担了领域内的状态的维护;

  3. 领域模型维护了领域内的数据之间的业务规则,数据一致性;

需要特别注意的是,领域模型设计只是整个软件设计中的很小一部分。除了领域模型设计之外,要落地一个系统,我们还有非常多的其他设计要做,比如:

  • 容量规划

  • 架构设计

  • 数据库设计

  • 缓存设计

  • 框架选型

  • 发布方案

  • 数据迁移、同步方案

  • 分库分表方案

  • 回滚方案

  • 高并发解决方案

  • 一致性选型

  • 性能压测方案

  • 监控报警方案

等等。上面这些都需要我们平时的大量学习和积累。作为一个合格的开发人员或架构师,我觉得除了要会DDD领域驱动设计,还要会上面这么多的技术能力,确实是非常不容易的。所以,千万不要以为会DDD了就以为自己很牛逼,实际上你会的只是软件设计中的冰山一角而已。

总结

本文的重点是基于我个人对DDD的一些理解,希望能整理出一些自己总结出来的一些感悟和经验,并分享给大家。我相信很多人已经看过太多DDD书上的东西,我总是感觉书上的东西看似都太”正规“,很多时候我们读了之后很难消化,就算理解了书里的内容,当我们想要运用到实践中时,总是感觉无从下手。本文希望通过通俗易懂的文字,介绍了一部分我对DDD的学习感悟和实践心得,希望能给大家一些启发和帮助。

20
9

讲给女儿的故事

0
归档:2018年9月分类:点滴生活

白雪公主和白马王子的故事

在很久很久以前,有一位美丽的白雪公主,她有一头乌黑的长发、圆圆的脸蛋、明亮的眼睛、弯弯的眉毛和苗条的身体。白雪公主住在城堡里面,过着幸福快乐的生活。白雪公主有七个好朋友,他们是七个小矮人,小矮人住在城堡附近的小森林里面,过着无忧无虑的生活。小森林里面有各种各样的动物和植物,有小松鼠、小考拉、小袋鼠、小熊猫、小鼹鼠、小河马、小企鹅等等等,还有松树、柳树、银杏树、橡树、枫树和果树。白雪公主经常和小矮人一起到小森林里面玩耍,他们在小森林里能看见美丽的草地、潺潺的小溪、美丽的彩虹,还可以看日出和日落,他们玩得非常开心。

有一天,城堡里面来了一个可怕的巫师,他把白雪公主的爸爸妈妈抓起来了,并且还给白雪公主施了一个魔咒:让白雪公主永远地睡着醒不过来,除非有一天白雪公主遇到一个真正爱着她的王子,她才能醒过来。七个小矮人把白雪公主偷偷带出了城堡,来到了小森林。那个巫师追赶着他们来到小森林,不过巫师不敢靠近小森林,因为小森林里也有小矮人的魔法,邪恶的巫师不能进入小森林。于是,这个巫师在小森林的周边也施了魔咒,让小森林看起来很可怕,这样就没有人敢靠近小森林,他要永远困住白雪公主。

小矮人们在小森林给白雪公主建了一个别墅,并且精心地照顾白雪公主,他们希望有一天白雪公主能够遇到爱着她的王子,这样她就可以醒过来了。终于有一天,有一位来着东方的英俊王子,他骑着白色的骏马来到了小森林,他叫白马王子。他很久以前就听说这里有一座美丽的小森林,所以他决定要冒一次险,去探索这个小森林。经过一番努力,白马王子进入了森林,他被小森林迷住了,这是他见过的最美丽的森林。他来到了小别墅,看见里面睡着以为美丽的姑娘,他说这是我遇到的最美丽的一位姑娘。

白马王子爱上了白雪公主,七个小矮人把白雪公主的遭遇告诉了白马王子,于是白马王子在白雪公主的额头轻轻地亲了一个吻,白雪公主醒过来了。白马王子带着白雪公主和七个小矮人回到了城堡,打败了巫师,救出了白雪公主的爸爸和妈妈。从此以后,白雪公主和白马王子过上了幸福快乐的生活。

25
8

终于考过了总分6.5

0
归档:2018年8月分类:点滴生活

去年给自己定了一个目标,一年时间考过4个7,但到现在分数只有:听7,说5.5,读6,写7,总分6.5。这个分数还不能达到澳洲最低要求,但幸运的是,过了新西兰的最低要求,而且我们的打分足够新西兰的分数了。

爱人不想考虑新西兰,但她也不完全反对,毕竟如果真的走移民这条路,新西兰是保底选择。而我会继续考,努力达到7,最少要达到4个6.5,总分7。

这段时间,爱人通过了职业评估,而我打算在努力到年底,争取过了这个考试再做职业评估,不过在这之前找了三家公司开了推荐信和工作证明,我们的移民之剑发出去了。

04
5

【转】关于父母和自己的思考

0
归档:2018年5月分类:点滴生活

转自水木社区的帖子。

PS:作为一个也是从大山里出来,定居北京的游子,这篇文章道出了我前几年的纠结和现在的心态。其实真的是,只要爸爸妈妈健康快乐就好。

年前我匆匆回了一趟西北老家,因为儿子年幼,不方便在严冬季节从南方带到北方去过年,所以我只能一个人回去。
踏进老屋,看到父亲正蹲在火炉前烤火,手里端着他那杆一尺来长的旱烟斗,一边吧嗒吧嗒地抽烟,一边往炉子里添柴火,有点儿“满面尘灰烟火色,两鬓苍苍十指黑”的感觉,身上的衣服也不干净,脚上还蹬着一双夏天的凉鞋,他把这鞋子当拖鞋穿,冬日里没事不用出门,穿简单的鞋子方便上下炕。母亲穿着臃肿的棉衣,圆得像个棉花球,外面罩着一件穿了很多年的罩衣,裤子比较窄小,上身的大衬托得下身看起来更小,总体看起来很不协调,裤子的两个膝盖处有两大块没有拍干净的黄土,显得邋遢。
这就是我的父亲母亲。十多年来,为了改变他们落后的形象,我费尽心力,衣服买了很多,但他们就独爱那几件旧衣服,新衣服大多压箱底了。他们每次拿到我买的新衣服,都碎碎念着:“浪费了,老了,不需要这么多了。”感觉接受一点儿好的东西就很有心理压力一样。不光穿衣服,生活的方方面面都如此。
他们的这种形象,搁几年前,我会有不悦,甚至会指责他们,但现在我不会了。不仅是因为他们已年近75岁,恐怕更因为我快40岁了。十多年来,我想让他们改变,结果他们没变,我却变了。比如现在看到父亲大冷天还穿着凉鞋,我就想他应该每天上上下下那个一米来高的炕头很多次,这说明身板还硬朗;看到母亲膝盖处两块没拍干净的黄土,我就想她还能跪着烧炕,说明身体还行。看到他们虽然衣着邋遢,但还能行动自如,甚至都还能下地干活,进门干家务,我无限欣慰,二老只要健康着,何必要求他们吃什么穿什么衣服多久洗一次?活到这个份上,外表已经不重要了,我所求的,唯有健康。
回想大学刚毕业那会儿,我内心的责任感何其沉重,我觉得就算我拼尽全力,也要让父母过上更好的生活,让他们早早地退休,不再干繁重的体力劳动,让他们穿着干净的衣服,悠闲地漫步在村里的小路上,就像我家旁边那位退休的小学教师一样。当时我还跟一个生意做得特别好的亲戚说过我的愿望,她说不可能实现。
果然,没有实现。因为没有人能改造得了别人的生活,更不可能改变别人的人生轨迹。每个人都在按照自己的生命历程行走着,他的能力,他的性格,他的情商,他的幸福感,他与伴侣的关系,他与这个世界的相处方式,等等等等,都决定着他的人生。外力,至多在经济层面做些改善,而幸福,却更多地取决于生活的点点滴滴,而这些点点滴滴是每时每刻的活法,只能当事人自己去面对,外人真的无能为力。
记得2010年我回家过年时,看到父母的生活状态,还《一声叹息》(点击阅读)来着,后来逐渐明白,每个人的命运都是自己把握的,正如那篇文章中所言:“你可以改变你能改变的,但是你必须接受你不能改变的,因为生活需要的是妥协,不是执拗。所以,尊重别人的生活,尊重别人生活中的权利,不要自以为是地去改变,也不要因为没有改变而懊悔自责,因为幸福有多种形式,你认为的幸福,未必就是他想要的。”
这不是推卸责任,这是一种成熟。心态上从年轻时候的奋力去改变到中年时期的坦然去适应,代表着你与这个世界的和解,也是个人境界的一种提升:由只从自己的的感受出发到尊重别人的感受。每年春节都会诞生无数乡愁题材的文章,这些文章诉说着游子们心中的无奈,吐露着游子们无法尽孝的愧疚,很多人更是不能承受这份生命之重,悲伤得不能自已。
其实,这又何必。用自己的双肩扛起父母的人生,父母未必幸福,用自己的双脚帮父母走完剩下的路也未必是父母所愿。无论何时,我们必须承认,父母与儿女,大部分时间里只能各自在自己的生活里遥望彼此,然后各自走着自己的路,谁都不能代替谁去生活,就像我在去年的一篇文章里说的:《父母与儿女,也是一段浅浅的缘分》。
常常,子女总自以为是地认为,给父母物质上最好的,让他们住洋楼,穿洋衣,吃洋餐,周游世界,才是幸福的,而完全忘记了父母内心的需求,忽视了父母内心被几十年的生活所锻造出来的幸福观,把自己认为的幸福生硬地套在父母的身上。做到了,沾沾自喜,做不到,耿耿于怀。
其实,不打断父母正常的生活恐怕才是最好的。这就犹如一颗大树,你觉得它长在贫瘠的地方受苦了,所以你想把它挪到自认为肥沃的土地上,为了成功挪走,你不惜砍掉它的枝枝蔓蔓,让他脱离曾经生长的环境,孤独地伫立在城市的钢筋水泥中间。你心安了,可树呢?
所以,过年回家,无需太多乡愁,不要有无力感,也不要悲伤,高高兴兴地回,然后开开心心地走,只要父母还能自由行动健康生活,就无需太牵挂,其实他们也很幸福。

10
12

成为深度学习专家的七个步骤

0
归档:2017年12月分类:深度学习

1、对机器学习有基本的理解,最好的材料是Andrew Ng在coursera上的公开课程,看过教程能让你对机器学习有基本的认识,完成课程中的任务会让你对机器学习有更深入的理解;

2、接下来需要培养对神经网络的感觉,实现一个神经网络,并利用它做点事情;

3、理解神经网络的原理很重要,但简单的神经网络并不足以解决最有趣的问题。神经网络的变体-卷积神经网络(CNN)非常适合于图像识别类的任务,斯坦福大学的有关资料如下:CS231n 用于图像识别的卷积神经网络(笔记)和课件。另外两个参考资料如下CNN 参考资料1和CNN 参考资料1。

4、接下来需要在自己的电脑上运行CNN;

step1:买一块GPU,安装CUDA开发工具包
step2:安装Caffe和GUI包Digit
step3:安装Boinc,这个工具对你理解深度学习并没有帮助,但能够让其他研究人员在闲暇时间利用你的GPU做科研

5、Digit提供了少量算法,比如用于字符识别的lenet算法和用于图像分类的Googlenet算法。要想运行这些算法,需要下载相应的数据集lenet数据集和Googlenet数据集。你也可以修改算法来执行其他的图像识别任务,比如我们的工作;

6、对于自然语言处理任务,递归神经网络RNN更适合。学习RNN最好的材料是斯坦福的讲座及笔记,也可以下载Tensorflow来构建RNN;

7、现在你可以尝试用深度学习来解决各种各样的难题了,比如面部识别、语音识别和自动驾驶等;

如果你认真完成以上步骤,那么祝贺你,可以去Google、Baidu、Microsoft, Facebook或Amazon申请职位。

31
8

我们萌生Migration的念头了

0
归档:2017年8月分类:点滴生活

女儿出生之后,我思考了很多关于未来的事情,这一年来读了不少政治哲学方面的图书,对自己的价值体系进行重构。今年起我陆陆续续有migration的念头,最大的驱动是三个:1、子女的教育和未来(我们不是京户,虽然这个问题可以取道天津,但总觉得心里不舒服;而如果走国际校,成本先不说,最终子女还是要往外走);2、这两年帝都的雾霾(准确的说是整个国内的雾霾)让人窒息;3、对每天地铁以及所从事的工作开始有些厌烦,当然也是中年危机之前想给自己找点事情做。

想migrate第一步肯定是先考英语,而我已经10年不学了。我选择PTE考试,因为估计雅思4个7我是绝对过不了。考试今天是我第一次参加PTE考试(相当于雅思),听5.5,说5,读6,写 6,总 6,这个成绩离4个7好遥远....但是既然决定了,真的考不过就当学英语吧,未来一年好好学习英语。

04
6

深度学习随感

0
归档:2017年6月分类:深度学习

"深度学习是一个激情澎湃却又相对单一的领域。有一些深刻的想法,一些主要的学术会议,其中若干会议之间也存在着很多重叠。然后,一篇篇的论文在不断地提升和完善同样的一些基本想法:使用SGD(或者类似的变体)来优化一个代价函数。这些想法非常成功。但是我们现在还没有看到这个领域的健康发展,每个人在研究自己的深刻想法,将深度学习推向很多的方向。所以,根据社会复杂性度量,忽略文字游戏,深度学习仍然是一个相当粗浅的领域。现在还是可以完全地掌握该领域大多数的深刻想法的。" via:Michael Nielsen

上世纪50、60年代神经网络曾经非常火爆,局限于计算能力和算法束缚,没有获得商用,迅速进入寒冬,但Hinton和Yann Lecun坚持做了二十多年,去年以来媒体对AI大肆渲染,而这两位深度学习的领袖却保持很理性的认识。下面是Yann Lecun在facebook的声明:AlphaGo战胜李世石后,Slashdot上有帖子帖子宣称:“我们现在知道,我们不需要任何大的新的突破,以获得真正的AI”。
这是完全,完全,可笑的错误。

正如我在前面的陈述中所说的:大多数人类和动物学习是无监督的学习。 如果智力是一个蛋糕,无监督学习将是蛋糕,监督学习将是蛋糕上的糖霜,强化学习将是蛋糕上的樱桃。 我们知道如何做结冰和樱桃,但我们不知道如何做蛋糕。在我们想获得真正的AI之前,需要先解决无监督的学习问题。 这只是我们知道的一个障碍。还有大量的我们不知道的障碍。

最近几年deep learning使得机器对图像,语音,人类语言的认知能力获得了质的飞跃,在图像识别方面甚至已经超越人类,出现了很多看起来是黑科技并且非常实用的技术,比如人脸识别,图片自动标注描述,机器翻译,无人车等等。但不应该去夸大AI,媒体的大肆宣传,会让大家都以为实现科幻电影里出现的强AI,这样只会换来失望,从而导致AI的下一个寒冬。当然,乐观的来讲,深度学习对于弱AI的发展起到了非常大的作用,而且也有理由相信未来(我觉得还需要近上百年的发展)肯定会诞生强AI。

公告栏

欢迎大家来到我的博客,我是dodoro,希望我的博客能给你带来帮助。