代码改变世界

Android隐喻(一)我的android苦痛史

2012-06-14 16:48  CreateLight  阅读(441)  评论(0编辑  收藏  举报

  断断续续学android有三周了,期间做了一个宠物养成类的小游戏,有些学习的感悟,记录一下。

  一开始学android,走的是由点入面的老路子:下sdk,搭环境,写hello world。

  然后下了google的sdk文档和开发指南,买了本android书(《精通android3》),从头开始学。学四大件,然后xml布局,恍惚间似乎已然学会了,看了下书的目录,剩下的无非就是对特定功能api的学习,比如各种控件、http、多媒体、map、opengl-es、lbs等等,到用这些功能的时候再翻看这些内容似乎就OK了。

  但随着不断的看书,我的内心却感到莫名的恐慌,我感觉我什么都不会,感觉无法控制大局,就好像在深山密林里到处乱钻,试图寻找出路却永远不知道下一步怎样走一样;这种糟糕的感觉与日俱增。

  为什么?

  我是C程序员出身,在过往的编码经历中非常自信,感觉一切都在控制中,我写的每行代码我似乎都可以看到对应的汇编,可以感觉到编译器将如何优化它们,CPU将如何执行它们,它们所消耗的资源在某种意义上是如此一目了然 —— 虽然profiler永远第一。

  我了解OS,了解框架,我可以看到我的代码在整个系统中是如何运作的,模块与模块、组件与组件、子系统与子系统,它们的边界、接口、 依赖都是简单、清晰、可见的,我可以看见全局视图,可以把握整体架构,我知道在什么时候系统中会发生什么,知道我应该怎样做。

  但是在android中,一切都变了,这大概是我恐慌的根源。

  无论是sdk文档还是《精通android3》,介绍的都是局部片段,介绍的大都是how,而不是why。而我想要全局,想要why。

  如果你玩拼图游戏,把一堆打乱的图形碎片拼成一个完整的大图,你当然可以随意尝试,最终拼凑成一个有意义的图形;但如果你动手之前有一个完整的图形作为参照,你的进展会更加顺利,这种全局的参照就是隐喻的力量之一。

  是的,拼凑,我大概是在拼凑android代码,我只是简单拼凑出功能(很多时候要靠巧合编程),而无法得知这是否是逼近于“最佳”的做法,甚至我很难评价代码质量。

  也许“务实主义者”会觉得对于快速小型一次性产品,功能OK就OK,真金白银最重要。某种意义上我赞同这种看法,但面对一堆不“自然”的代码,我心里就是不爽。

   思想最牛逼,语言不重要,(貌似)历经沧桑的程序员如是说。对此有捧者,有抨者。而我的android苦痛史大概和这两者都有关:

一,语言方面:我不熟悉java,虽然看了一个月书,涉猎了语法、jvm、最佳实践、标准库等等,但对一条java语句执行的全过程依然模糊。之所以我这么纠结于黑盒内部,也许和我的从业经历有关,C、手机,稀缺资源的局限下你不得不搞懂下面在搞什么,当然,也有个人兴趣因素在内。所以在写android代码的时候我无法预估语句性能,我不清楚对象创建的代价有多大,不清楚引用局部变量和域变量的性能差别,不清楚垃圾回收何时发生、影响多大。。。虽然有traceview,虽然过早优化是万恶之源,但我真的不想写劣化的代码。

二,思想方面:我是C++出身,大学期间下了不少功夫钻研细节和语法糖,得了许多纸上谈兵的经验,自然也有一堆的OO理论在身;毕业后从事的都是C语言开发,一晃几年,思维几成(过程)定式,猛然间转到android,来搞OO,起初觉得小CASE,但后来发现思想转弯还真是不太容易。 在我看来,全局的本质就是抽象,就是why。所以我学东西一向先看全局,思考为什么会这样抽象,其设计意图是什么,然后再去看实现细节,对于C(或者说过程)系列的内容,我这样做得心应手;但对于android,我很痛苦,我发现我似乎无法把握其抽象实质。

  典型的比如Context -> ContextWraper -> ContextImpl -> ContextThemeWrapper -> Activity,我试图思考Context的抽象代表什么,为什么Activity要经过这么多层的包装,这样做的好处是什么,但进展维艰。无论sdk文档还是《精通Android3》对此都几乎未提,也许google内部的讨论记录是最好的文档。

  另外一个典型的困扰,也许大部分初学者都有,那就是setContentView,这个方法代表的抽象意义是什么,其到底做了什么,到底何时由谁怎样绘制出的view? view何时重绘、其代价如何?同样上述文档对此提及甚少。

  最后,对于C来说,设计的基本(启发性)原则很简单:KISS、DRY、一个函数只做一件事、尽可能的羞怯并隐藏、正交、表驱动、自解释等等。对于java(或oo),这些原则应该同样适用(对应的SOLID),但其实现手法却让我头痛,厚重的抽象层、各种设计模式,对我来说都是理论上知道但实际经验严重不足的东西,很难第一时间理解其设计意图。

三,最初,我是抱着快速上手,快速做东西的想法来学android的(和我一贯做法其实相抵触),但凑出几个作品后实在是心里不安,转而在网上挑了篇介绍框架的文章看了下,记得第一次看的是介绍Activity启动过程详解的文章,自然看得头昏眼花(当时手头尚没有源代码),但硬着头皮啃了两天之后却心中大定,颇有拨开乌云见天日之感。于是陆续在网上看相关文章,买了本框架源代码解析的书,暂时把sdk文档放到一边,直至今日,虽然尚无胸有成竹之感,但总体感觉已经好多了。