上图为本文的做者 Sasha Goldshtein,他是 SELA Group 公司的首席技术官,他是 Microsoft C# MVP(最有价值技术人员),是《Introducing Windows 7 for Developers》 (Microsoft Press 出版, 2009) 和 《Pro .NET Performance》 (Apress 出版, 2012) 两书的做者。他是一位多产的博客做家,是大量的培训教程的做者,内容包括并行编程、Windows Internals, .NET Debugging, 和 .NET 性能等。他的顾问工做主要围绕分布式架构和高性能系统。编程
我发现,对我来讲,使用一种新语言,新技术,新框架,最让我有压力的事情是,我在使用它们时不能彻底明白它们的实现原理。我每周都要阅读数百篇关于讨论 诸如各类 JavaScript 扩展、新的 iOS 应用框架,新的基于 Windows Azure 的 SaaS 等的博客文章。很显然,若是只是使用一些技术或采用一种框架来知足需求,这对于我一般不是很难的事情。问题是,若是我并不理解一个东西的工做原理或实现方 法,我不能把它纳入我已经掌握的知识。这也是“Not Invented Here (非我造不用)”毛病的一种表现吧,不一样的是我并非想真正的写出我本身的框架;我只是想作到我有能力写出它们。下面是我最近的一些例子。架构
2011 年底,我开始学习 Node.js,2012 年间,我基于 Node、Express 以及其它不少 Node 模块,实现了数个私人或商业产品。我开始使用 Node 时很是犹豫,直到我彻底掌握了它的基本原理——事件循环,异步无处不在的属性——这使我掌握了如何实现“相似 Node”之类东西的知识。有一段时间我甚至想写利用新的 C# 提供的 async/await 实现一个 Node 相似的 HTTP 框架,但最后放弃了,由于网上像这样的东西不少,好比 ASP.NET MVC 控制器等,只是不通用。框架
还有一个事情就是,某种程度是,我仍然有点“恐惧”WPF (Windows 用户界面框架)。我谈不上是特别喜欢客户端开发,但从感觉层面上,从各类表现上,WPF 是一种比 XAML 更有吸引力的框架。并非说 WPF 很复杂难用:我理解它的一些基本实现原理,好比数据绑定,风格,资源,以及数据模板,这些足够让我实现简单的桌面应用或简单的 Windows 8 和 Window Phone 应用。是 WPF 的深度和广度让我困惑:我如今的作法是不是最好的作法?这些 XAML 表达式到底是如何在这样的数据环境和属性依赖条件下工做的?是否我应该把这段代码放到一个单独的动做或控制里?…我不是没努力过:我至少读了 3 本关于 WPF 的书,总页数超过 1500 页,但它们并无给我多大帮助。结果是,在潜意识里,我尽可能避免基于 XAML 的框架,由于我不知道如何实现它。而好笑的是,我对一些“轻量级”的客户端技术,包括 MFC,Windows Forms,Android,以及 iOS,都很是有信心,而对于 XAML,对于它的那些相对高级的东西,已经在个人内心留下了畏惧的条件反射。异步
说一些我感到很是有自信的东西,我对那些利用反射技术的东西,从序列化校验到代码生成,我都感受很轻松。这些属性,这些反射,10 年前当我作一个大 .NET 项目时就根深于个人脑子里,从那时起它们对于我就是一个很是强大的工具。我想这归功于我能理解它们这些对象如何存放在内存里,知道 .NET 的原信息是如何组织的。事实上,我差很少同时也就对其余语言和框架里的反射机制很清楚了:例如,当我在开发非官方的 Adnroid SDK 时,第一直觉就是想写本身的 JSON 序列化工具,而不是利用第三方类库。以后虽然证实这并非最好的作法,但我可以在 2 小时内让个人程序支持全部类型的 WAMS 要求。async
最后一个例子,我对新语言有很大的心理压力,尤为是当这种语言不仅是从一种语言编译成另一种语言。换言之,我对像 TypeScript 或 CoffeeScript 这类语言没压力,我能够清楚了理解这种原代码如何编译成 JavaScript,如何一种新语法变成同种功能语法的一种简写。可是,对于一些“新物种”语言,例如 Objective C,引发我脑海里一大堆问号。并非它的括弧语义给我形成麻烦,而是这种语言的原理,“how”。Objective C 语言的对象是如何分配内存的?方法是如何调度的?若是方法能够被过载,还能经过名称进行动态调度吗?编译器是如何动态管理内存的?(没错,引用数计数—— 但问题远比这几个字复杂)。一样的事情也发生在 Python 这样的语言上:我可使用 Python 开发脚本,编写模块,甚至和C语法风格的 DLL 交互,但我对这种动态语言里如何存放一个属性,如何类型化,没有一个清晰的画面。分布式
做为总结,我但愿全部的教材都提供一个“工做原理”的章节,来告诉我我如何能实现这种语言、技术和框架——我本身。至此,我但愿这篇文章解释清楚了我为 什么喜欢对技术原理刨根问底、喜欢本身去实现它们。归根结底的缘由是,我喜欢对系统、框架、语言作全面的理解;也许我只须要对某个系统修改一个 bug 或作性能调优,但最终结果是,我要去知道它是如何运行的,不然,它会变成个人一个心病,拖得越久我会越痛苦。wordpress