<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://www.jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://www.jackxiang.com/post//</link>
<title><![CDATA[[转]平衡的艺术——从菜鸟到架构师]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Tue, 12 May 2009 04:05:27 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	作为一个不是科班出身、没有正规学习过计算机知识的架构师，想在这里把我这几年学习的经历体验和大家分享一下，谈谈自己对架构师成长之路的一些感想。<br/><br/>奠定扎实的理论基础<br/><br/>千里之行，始于足下！技术不是一蹴而就的事情，而是长时间积累的成果。扎实的基本功是做好所有事情的开始。到现在我还记得对我影响非常大的几本书：<br/><br/>■《C++编程思想》<br/><br/>■《深入浅出MFC》<br/><br/>■《Windows 核心编程》<br/><br/>■《数据结构》《编译原理》<br/><br/>我学习计算机正是按照这几本书的顺序，之前学习C的经历就不必说了，而转折点正是《C++ 编程思想》——它让我感觉到程序和语言竟然这么有意思，至今仍对虚表的概念记忆犹新，尤其指针的用法，对我以后学习Java语言有很大的帮助，对多态和语言的特性也有了很高的认识。<br/><br/>《深入浅出MFC》这本书，记忆最深刻的还是其中强大无比的宏定义和对象层次设计。然而学习MFC的过程中，我遇到的最大问题就是：很多东西都是黑盒的，这引发了我刨根问底的欲望。所以后来我学习了《Windows核心编程》，这本书给我的最大收获，就是了解了很多操作系统底层的知识，操作系统是如何运行的。不过遗憾的是，如果当时从Linux 或者Unix 开始学习，应该会了解得更系统一些。<br/><br/>之后我深入学习了《数据结构》和《编译原理》。这是我经过了很多实践以后，又回过头来重新学习。拿《编译原理》来说，以前对这门学科的了解非常有限，后来为了实现一个东西，要用到脚本语言，找来找去找到了Velocity（后来想想使用Groovy 应该更好一点），用了以后觉得很好。以前修改程序逻辑，是需要重新编译或者修改配置重新发布才能OK，而现在只需要编辑然后保存一下，就能得到自己想要的结果。这令我着迷，于是想知道它是如何实现的，翻看源代码才晓得原来还有 JavaCC这个东西。就这样，我从解释语言入手，逐渐开始了疯狂学习编译原理的过程，越发觉得编程语言非常有意思。<br/><br/>回头想想以前和现在学习的语言，感觉程序语言就是在不断抽象：从汇编、C、C++， 再到Java、C#，再到更动态一点的语言如Perl、Python、Ruby 等等。不管它再怎么变、再怎么抽象，还是编译原理应用的产物。<br/><br/>讲了这么多，就是想强调理论基础知识的重要性！虽然我们现在使用的框架如此之多，但是如果你有了扎实的基础理论知识，这些东西就跟玩具一样。基础就是一个无招胜有招的杀手工具。<br/><br/>培养完善的抽象思维<br/><br/>抽象的能力也是作为一名好的程序员必须具备的能力。我们在考虑问题的时候可能会遇到错综复杂的场景，从这些迷雾中找到一条明路是我们做好程序员的关键。这些年来学习了很多框架，回过头来想想自己都有点后怕，这也令很多初学者望而生畏。但认真想想，真的有那么可怕吗？<br/><br/>让我们从语言层面逐渐剖析这个问题，应该很容易做出解释。程序语言就是我们在某种场景下交流的工具，汇编是机器语言；C和C++ 是编译型语言，它们是一种针对汇编的高级抽象；而Java 和 C# 就是更高级的抽象了，甚至于抽象了一层虚拟机出来（这个产生的影响就是，之后的很多高级语言评判标准，都是“是否支持虚拟机”），再到后面的许多动态语言，那就是更抽象了。说到这里你会问到，讲这么多语言类的东西和学习框架有什么联系？让我慢慢道来。<br/><br/>我们使用一种语言就是用它的语法进行编程，而学习一个框架实际也是为了用这个框架所提供的语言来写程序：Struts——我们使用很多配置还有 Action 和Form ；Spring——我们使用Bean 模型，这是它的最基本模型（现在 Spring 已经庞大得让很多人无法学习了）；iBatis——我是用它的XML-SQL 模型；JBPM——使用它所谓的GOP模型（面向图元的编程）；Web flow——是在使用它的页面流模型。这样的例子我可以举出很多（这也是DSL现在如此流行的原因）。<br/><br/>很多人会说：学习这么多我已经晕掉了！不妨想想，为什么会有这么多东西存在？ Struts 是为了解决Web编程的困扰；iBatis、Hibernate 是为了解决在数据库编程时的麻烦；原有的Web页面编程都是独立的具体单元，Web flow能够让这些页面形成流的形式，让开发更顺其自然；从JBPM的GOP可以看出，JBoss 的开发人员对抽象的理解度很深。我举这么多例子，实际是让大家不要害怕现有的这些框架，有了扎实的基础，抽象的概念是很容易理解的！缺乏抽象的能力，你就不能更快更好地解决问题。<br/><br/>实际抽象能力衍生出来的一点就是，需要我们对已学过的知识定期进行梳理。这样能让你巩固已有的知识，为以后的学习做好准备。知识就好比一棵生物进化树，最终目标都是一样的，关键是看如何选择进化的路线，让自己的知识结构能够有机的结合在一起。做到学以致用。过一段时间就梳理一下，你会有更多的发现。<br/><br/>扩充现有的知识层面<br/><br/>在巩固原有知识结构的前提下，我们更需要扩充现有的知识面。井底之蛙，看到的永远是井口大的那片天，只有跳出来，才能看见无限美好的蓝天白云。我曾经也常常局限在自己已熟悉的那块领域沾沾自喜，但是走出来以后才发现，自己原本是多么肤浅！学习的知识越多，对新事物的洞察力将会越准确！这样有助于你巩固已有的知识，系统地学习新的知识。<br/><br/>那我们是否需要无限平行式的学习知识呢？我的答案是“No”。人的知识面是有限的，我们需要一个T型的知识结构。你的知识面要广，但是对于某些技术点要专，这才是做好一个架构师的关键。有时 “专”可以让你对很多“广”的知识产生触类旁通的感觉。<br/><br/>实践也是非常重要的一环，不要有畏难心理，觉得这个东西太难，我无法完成！有时候事情的结果可能是糟糕的，但是过程是非常宝贵的，其中可以学习到很多东西，同时也可以让自己避免轻浮的心理。<br/><br/>还要着重培养自己良好的沟通与解说能力。架构师面对客户群具有多样性，有技术工程师、业务人员、公司管理层，甚至直接面对客户等。要把一个高度抽象又复杂的系统说清楚，这对于架构师来说也是一种挑战。所以架构师必须掌握技巧，应用多种表达方式来阐述架构与产品设计、与具体业务、与公司战略之间的关系等。培养良好的沟通能力，多和周围的人进行沟通，你能够学到更多的知识！<br/><br/>“ 平衡”是架构设计的艺术，我们设计一个东西，就是在平衡各方面的利益。平衡有可能是时间上的，比如需要支持多少年的系统可用性；平衡有可能是纵向的，比如要支持系统的向下兼容性，要保证程序员编程模型上的简单性等等。这种平衡就是因人因时因地而异了。平衡的把握很可能就是评判一个架构师架构水平的标准！架构师在设计的时候应该权衡维度、整体性和扩展性，考虑问题时不要局限于自己的一亩三分地。多种点田，会长出很多庄稼的！<br/><br/>拥有一个扎实的基础，不断扩充自己的知识面、完善知识体系，在对现有知识抽象的基础上，不断去沟通实践，你将获得更强的架构平衡能力。最后我还要说，业务知识非常重要，这个是你实践的关键！ <br/><br/>作者简介：<br/><br/>胡喜，就职于阿里巴巴集团旗下支付宝（中国）网络技术有限公司。担任技术架构师，负责支付宝技术架构规划，解决方案等相关工作。平常喜欢研究 OSGi、SOA、动态语言等技术。
]]>
</description>
</item><item>
<link>http://www.jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] [转]平衡的艺术——从菜鸟到架构师]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>