http://www.blogjava.net/dunkbird/articles/307583.html
一个优秀的软件架构师,首先一定是一个出色的程序员,这是本篇文章的议题。从本文我们可以了解到一个架构师的工作是什么,他容易遇到的问题是什么,因此他为什么必须是一个出色的程序员。
【51CTO独家特稿】架构师,听起来是如此神秘的一个称号。尤其是在开发领域刚入门不久的菜鸟级程序员眼中,架构师都是高手,都是牛人,都是如此高高在上的存在。
51CTO开发频道年终巨献:架构师最怕程序员知道的十件事
不过,在搞了四、五年编程之后,程序员们往往早已失去了当年对这些“高级”职位的神秘感,甚至会对自己所在项目的架构师抱怨不已,背后里称他们是一群水王。所以有江南白衣曾撰文述说:“国内的架构师到了三十岁以后很多就往理论上跑,而国外的架构师在往上发展的同时保持下面的编程体验,所以国内多水王,而国外则多大师。”
这就是我们今天这篇文章的论题:一个优秀的软件架构师,首先一定是一个出色的程序员。
这句话按照Fred George先生的话来说,那就是“不编程的架构师的职业生涯是短暂的”。他说这句话的背景主要是针对有些架构师的设计与实现有断层的问题而言的,因为如果架构师不去实践,只是想当然的认为“没问题,这个想法能实现”,那么对于项目的落实而言是个很大的隐患。支付宝架构师冯大辉也表示过,架构师是一个比较“虚”的岗位,主要的问题都在“落地”的过程中。
而一个架构师确认一个想法究竟能不能落地的最直接的方法,就是自己编写代码,尝试“实现一个系统最难实现的一部分”(Fred George)。看看Fred,他自己就是最好的示范:年纪一大把了,仍然每天都在编写代码。事实上,我们可以列举出一个长长的顶级架构师的列表,你会发现他们没有一个不是顶级的程序员。
我们可以列举出一个长长的顶级架构师的列表,你会发现他们没有一个不是顶级的程序员
不过这在逻辑上或许没有多少说服力,因为似乎这并不能证明一位资深架构师凭自己的经验感觉不能够知道一个想法能不能落实。如果你觉得上面这些只是某些西方老头儿对编程的古怪癖好,那么不妨看看eBay的架构师Randy Shoup先生是如何总结架构师在项目中的职责的:
1. 产品团队要做一个新产品,架构师开工了。架构师要帮助产品团队把可行性、技术需求以及权衡取舍等因素一一剖析清楚。
2. 技术需求出来了,架构师的主要工作开始了:设计整体的技术实现步骤。Randy在后面补充说“大多数成功的架构师都喜欢与其他团队成员一同完成架构和设计这一块的工作”,而认为自己应独自完成这个步骤则是新手架构师常见的误区。
3. 与开发团队一起,完成设计与实施的细节
4. 与开发团队和运维团队一起,完成部署的过程
5. 与运维团队一起,进行部署之后的维护和故障排除
- 充满荆棘的专家程序员之道
- 独家专访王翔:坚持不懈是架构师人生第..
- 浅析架构师工作流程及成功关键
- 独家专访梁远华:架构师需要广泛的知识面
- Adobe架构师谈Scala:功能强大但令人困惑
在这个过程中,一个架构师至少有一半以上的工作是需要与开发团队一起进行的。按照Randy的描述,这是“一个架构师不能将实施细节抛之脑后”的体现。而且与开发团队一起工作,命令式的领导方式并不被推崇,一个架构师必须通过自己的个人影响力来对开发团队进行指导工作。而什么是影响力?说的直白一些,就是通过自己写代码以及和其他成员一起写代码,来指导团队成员实现每个架构细节的思路。
只要稍微思考一下,就会明白此举的重要性。如果一个架构师靠命令管理开发团队,告诉他们“要实现这个模块”,“要实现那个功能”,而团队也尝试照办。可是或许是架构师的要求太高了,或许是团队的开发实力不够,团队成员便会向架构师求助:您看这个我们不知道如何实现,您能否指导一下?架构师可能知道怎么处理,也可能没有仔细思考过这个问题,但又觉得自己做大事者不拘泥于小节也,于是一皱眉头扔下一句:这是你们的事,你们自己解决!
然后就是矛盾的开始了。架构师只觉得团队技术不够,而团队则对架构师愈发不满。项目黄了不说,开发团队中也会传出各种说法,比如说“此君其实是个一行代码也不会写的大忽悠!”
综上所述,便映证了Fred的那句断言:“不编程的架构师的职业生涯是短暂的”。一个架构师不仅要会写代码,还必须要能够写出自己设计的系统中最难实现的那段代码。这样他才能够放心的把“落地”的这个重担交给开发团队来做。
让我用Fred的这句话做为本篇的总结:“一个架构师的价值在于,他不仅能看到系统的美,而且能够在建造系统的时候能够把这些美创造出来。”
是的,每个好架构师都是一位出色的程序员。
本文为《架构师害怕程序员知道的十项技能》中的优秀程序员篇。
选中iOS 6.0 Library 然后点列表左下角的向上箭头
把下载地址复制到safari里可以找到相应的library包
把它下下来(xar文件) 然后在terminal里用"xar -xf 文件名"解压缩得到docset文件
把这个文件复制到"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/
Documentation/DocSets/com.apple.adc.documentation.AppleiOS6.0.iOSLibrary.docset "
替换掉原文件
重启xcode
附上下载地址:
https://devimages.apple.com.edgekey.net/docsets/20120919/
com.apple.adc.documentation.AppleiOS6.0.iOSLibrary.xar
一个Activity里如果直接用findViewById(),对应的是setConentView()的那个layout里的组件,因此如果你的
Activity里如果用到别的layout,你就必须用inflate()先将对话框上的layout找出来,然后再用这个layout对
象去找到它上面的组件,
public View inflate(Context context, int Resourece,ViewGroup root) 作用:填充一个新的视图层次结构从指定的XML资源文件中 context : The Context object for your activity or application reSource:View的layout的ID root: 生成的层次结构的根视图 return 填充的层次结构的根视图。如果参数root提供了,那么root就是根视图;否则填充的XML文件的根就是根视图。
View view = View.inflate(this, R.layout.dialog_layout, null);
TextView dialogTV = (TextView) view.findViewById(R.id.dialog_tv);
dialogTV.setText("abcd");
setContentView()一旦调用, layout就会立刻显示UI;而inflate只会把Layout形成一个以view类实现成的对象,
有需要时再用setContentView(view)显示出来。一般在activity中通过setContentView()将界面显示出来,
然后才能使用findViewById()是找xml布局文件下的具体widget控件(如Button、TextView等)
但是如果在非activity中如何对控件布局设置操作了,这就需要LayoutInflater动态加载。
LayoutInflater是用来找res/layout/下的xml布局文件,并且实例化。
LayoutInflater inflater = LayoutInflater.from(this); View view=inflater.inflate(R.layout.ID, null); //或者干脆并成一句: View view=LayoutInflater.from(this).inflate(R.layout.ID, null);
或者:
LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE); View view=inflater.inflate(R.layout.ID, null);
android.view.View类中也有一个inflater方法:
public static View inflate (Context context, int resource, ViewGroup root) Inflate a view from an XML resource. This convenience method wraps the LayoutInflater class, which provides a full range of options for view inflation. Parameters context The Context object for your activity or application. resource The resource ID to inflate root A view group that will be the parent. Used to properly inflate the layout_* parameters.
该方法和LayoutInflater中的inflater方法区别不明,查api也没看明白:
public View inflate (int resource, ViewGroup root) Inflate a new view hierarchy from the specified xml resource. Throws InflateException if there is an error. Parameters resource ID for an XML layout resource to load (e.g., R.layout.main_page) root Optional view to be the parent of the generated hierarchy. Returns The root View of the inflated hierarchy. If root was supplied, this is the root View; otherwise it is the root of the inflated XML file.
一般在adapter的getview方法中使用View.inflate的比较多,最近在研究自定义下拉刷新listview的时候,使用了View.inflate一直报如下错误:
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); mRefreshView = (RelativeLayout) mInflater.inflate(R.layout.pull_to_refresh_header, this, false); //mRefreshView = (RelativeLayout)View.inflate(context, R.layout.pull_to_refresh_header, null);
android.view.InflateException: Binary XML file line #10: Error inflating class com.markupartist.android.widget.PullToRefreshListView
而使用 LayoutInflater 就没事,原因翻阅很多资料都没弄明白,看样子定义控件的inflate还是使用
LayoutInflater 吧!