我的技术心病(转贴)

2013-06-19 10:25 编辑: suiling 分类:程序人生 来源:CocoaChina

0 1594

上图为本文的作者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很复杂难用:我理解它的一些基本实现原理,比如数据绑定,风格,资源,以及数据模板,这些足够让我实现简单的桌面应用或简单的Windows8和Window Phone应用。是WPF的深度和广度让我困惑:我现在的做法是否是最好的做法?这些XAML表达式究竟是如何在这样的数据环境和属性依赖条件下工作的?是否我应该把这段代码放到一个单独的动作或控制里?…我不是没努力过:我至少读了3本关于WPF的书,总页数超过1500页,但它们并没有给我多大帮助。结果是,在潜意识里,我尽量避免基于XAML的框架,因为我不知道如何实现它。而可笑的是,我对一些“轻量级”的客户端技术,包括MFC,Windows Forms,Android,以及iOS,都非常有信心,而对于XAML,对于它的那些相对高级的东西,已经在我的心里留下了畏惧的条件反射。

说一些我感到非常有自信的东西,我对那些利用反射技术的东西,从序列化校验到代码生成,我都感觉很轻松。这些属性,这些反射,10年前当我做一个大.NET项目时就根深于我的脑子里,从那时起它们对于我就是一个非常强大的工具。我想这归功于我能理解它们这些对象如何存放在内存里,知道.NET的原信息是如何组织的。事实上,我差不多同时也就对其他语言和框架里的反射机制很清楚了:例如,当我在开发非官方的Adnroid SDK时,第一直觉就是想写自己的JSON序列化工具,而不是利用第三方类库。之后虽然证明这并不是最好的做法,但我能够在2小时内让我的程序支持所有类型的WAMS要求。

最后一个例子,我对新语言有很大的心理压力,尤其是当这种语言不只是从一种语言编译成另外一种语言。换言之,我对像TypeScript或CoffeeScript这类语言没压力,我可以清楚了理解这种原代码如何编译成JavaScript,如何一种新语法变成同种功能语法的一种简写。但是,对于一些“新物种”语言,例如Objective C,引起我脑海里一大堆问号。并不是它的括弧语义给我造成麻烦,而是这种语言的原理,“how”。Objective C语言的对象是如何分配内存的?方法是如何调度的?如果方法可以被过载,还能通过名称进行动态调度吗?编译器是如何动态管理内存的?(没错,引用数计数——但问题远比这几个字复杂)。同样的事情也发生在Python这样的语言上:我可以使用Python开发脚本,编写模块,甚至和C语法风格的DLL交互,但我对这种动态语言里如何存放一个属性,如何类型化,没有一个清晰的画面。

作为总结,我希望所有的教材都提供一个“工作原理”的章节,来告诉我我如何能实现这种语言、技术和框架——我自己。至此,我希望这篇文章解释清楚了我为什么喜欢对技术原理刨根问底、喜欢自己去实现它们。归根结底的原因是,我喜欢对系统、框架、语言做全面的理解;也许我只需要对某个系统修改一个bug或做性能调优,但最终结果是,我要去知道它是如何运行的,否则,它会变成我的一个心病,拖得越久我会越痛苦。

原文:http://architects.dzone.com/articles/using-something-you-cant

翻译:http://www.cocoachina.com/programmer/20130619/6435.html

时间: 2024-08-14 05:21:47

我的技术心病(转贴)的相关文章

【我的技术我做主】IT屌丝DIY打造6盘位家用NAS服务器

一.为什么需要NAS存储? 一直以来用的百度云,并自己配置了一个2TB的硬盘做日常数据备份,后来发现百度云限速!而且存在各种各样的不安全(苹果事件.米国事件的都懂的啦!),而且自己2TB的硬盘一直没有做数据备份一直感觉不安全(搞IT人的心病),没有RAID数据安全无法保证,加上现在给孩子照相越来越多.蓝光高清.各种测试需要存储空间,NAS的需求越来越严重了,所以建立一个自己的NAS存储势在必行!当然在成本.造价.功能考虑,性价比当然是越高越好了! 二.硬件选型 1.主板 u 支持双千兆网口的(端

静态网页开发技术-HTML

今天我重新复习了一下静态网页开发技术,概括如下. 一 .HTML文档结构与基本语法 :放置了标签的文本文档,可供浏览器解释执行的网页文件 1.注释标记 2.标记 3.属性 二.基本标记与使用 1.网页基本结构与标记 2.文本与段落标记 3.列表标签 4.超链接标签 5.图片标记 6.定时刷新或跳转 7.表格 三 HTML表单标签与表单设计 1.<FORM>标记及其属性 2  <INPUT>标记及其属性 3 <下拉列表框<SELECT>,<OPTION>

C#网络编程技术FastSocket实战项目演练

一.FastSocket课程介绍 .NET框架虽然微软提供了socket通信的类库,但是还有很多事情要自己处理,比如TCP协议需要处理分包.组包.粘包.维护连接列表等,UDP协议需要处理丢包.乱序,而且对于多连接并发,还要自己处理多线程等等.本期分享课程阿笨给大家带来的是来源于github开源Socket通信中间件:FastSocket,目的就是把大家从繁琐的网络编程技术中彻底地解放和释放出来. 阿笨只想安安静静的学习下网络编程技术Socket后,将学习的成果直接灵活的运用到自己的实际项目中去.

Java技术的特点

Java技术是一套完整的IT行业解决方案,其中包含了很多技术.最初是从解决家电设备联网通讯的方案发展起来的,其特点适用于Internet,于是在Internet广泛应用的环境下,迅速发展成为一种计算机语言.一个平台.一个网络计算的架构. 从整体上划分,Java技术可分成Java编程语言和Java平台.Java编程语言是一种高级编程语言,Java平台是指程序运行的硬件或软件环境. Java编程语言的特征: 1.简单易用 2.面向对象 3.跨平台,可移植 4.多线程 5.健壮性 6.安全性 7.动态

谈谈-Android中的接口回调技术

Android中的接口回调技术有很多应用的场景,最常见的:Activity(人机交互的端口)的UI界面中定义了Button,点击该Button时,执行某个逻辑. 下面参见上述执行的模型,讲述James对Android接口回调技术的理解(结合前人的知识和自己的实践). 使用一个比喻很形象地说明:客户端有个疑问打电话请教服务端,但服务端无法现场给出解答,相互之间约定:服务端一旦有答案,使用电话的方式反馈给客户端. 以上有三个主体:客户端.服务端和接口(方式). 接口回调的原理框图说明: Demo界面

一张图掌握移动Web前端所有技术(大前端、工程化、预编译、自动化)

你要的移动web前端都在这里! 大前端方向:移动Web前端.Native客户端.Node.js. 大前端框架:React.Vue.js.Koa 跨终端技术:HTML 5.CSS 3.JavaScript 跨平台框架:React Native.Cordova 前端工程化:Grunt.Gulp.Webpack 前端预编译:Babel.Sass.Less 自动化测试:Jasmine.Mocha.Karma 一图在手,应有尽有! 更多信息参考:https://item.jd.com/12170351.h

微软要做用云量挖掘机,以技术驱动数字化转型快公司

今年7月,首次更名为"Inspire"的微软WPC全球合作伙伴大会上,微软宣布将所有与合作伙伴相关的角色都重新整合为一个新的部门:统一商业合作伙伴部门(One Commercial Partner),并进行了一整套的组织和流程改组,以适应云计算时代的用户需求与"用云量"规律. 2017年9月12日,微软大中华区副总裁.全球渠道事业部总经理.商业客户事业部总经理包嘉峰与媒体分享了这两个月微软商业合作伙伴部转型以来,微软自身所发生的变化以及为客户所带来的价值.根据包嘉峰

游戏服务器开发需要学习的技术

一,游戏服务器编程语言的选择 所谓的游戏服务器编程语言其实有很多,基本上任何一种语言都可以作为游戏服务器的编程语言.这需要根据自己游戏的类型和要求加以选择.比如C++,Java ,Erlang,go等等.目前我用过的只有C++和Java.但是以Java为主.所以接下来就以自己的经验,谈谈以Java为核心的游戏服务器开发技术体系. Java目前作为游戏服务器开发语言已经很是普遍.但是大多数是作为页游或手游的服务器,而端游戏一般选择C++,因为端游对服务器的性能要求相对比较高一些.两种语言各有利弊.

技术与技术人员的价值

在我工作到第四年出头时,总是感觉自己的价值被低估了,换个说法就是感觉工资低了. 当时,总觉得技术不如管理,但又听闻有人一直做技术也有到年薪百万的,虽不在身边,但江湖总有这样的传说.再环顾周身环境,似乎除了去伊拉克做技术能让收入立刻飙升(补贴超过工资),让我不禁怀疑江湖的百万传说是不是被高估了.再加上工作几年后,技术提升感觉明显变慢,第一个天花板已近在眼前. 分类 又过了七.八年后,再回顾走过的技术道路.感觉技术的价值有时被高估,有时又被低估,但长期看,很少有人能一直享受到高估的溢价,同样也很少有