作者:paladin
博客:http://blog.sina.com.cn/auroratony

  最近发的几篇博客都与技术和编码没有直接的关系。不是我不关心技术也不是最近没什么技术方面的长进,而是我觉得很多技术上的问题在弄懂前写不出什么东西,弄懂后感觉不外如是没什么神秘性可言了也就不写了。这样不好,至少相对我最初对此技术博客的定位跑题了。我会适当的多加点与技术、编码直接相关的内容进来。尽可能把我认为有价值的好东西或别人也可能栽跟头的陷阱开放、分享出来。

  这几天在看《UNIX编程艺术》这本书。是本好书,恨没早点读到,不过过早的读也未必能充分领会到妙处,建议有经验而觉得个人技术发展遇到瓶颈的同学读一下。

  “真实世界里的编程其实就是管理复杂度的问题。能够管理复杂度的工具都是好东西,但当这些工具的作用不是控制而是增加复杂度的时候,最好扔掉,从零开始。”

  以前写的代码不能复用,整个项目难成体系的原因都是没有对问题做良好抽象。起初创建的程序模块如果设计的不好会让程序员调用不顺手,维护不顺手,扩展不顺手,此时如果还意识不到问题对它进行重构恐怕会让代码从一开始就臭下去。而设计未必在开发初期就显得蹩脚,很多问题是在形成一定体系后的后期开发中暴露出来的,最常见的表现就是团队里没人能完全掌控代码全貌,一些已知bug不知如何浮现,更不用谈查找根源,只能依赖向神祈祷来指望程序正常运行不宕机。此时积极的方案有两种,重构或者弃用重写。

  在我看来良好的设计应该是模块自成一体,模块间无冗余。设计最重要的两点目的和原则就是复杂度隔离和代码复用。好的设计不是不可复加,而是不可删减。

  “软件设计有两种方式:一种是设计得极为简洁,没有看得到的缺陷;另一种是设计得极为复杂,有缺陷也看不出来。第一种方式的难度要大得多。”

  前几周因为个人需要做了个FSM(有限状态机)的实现。我认为在掌握计算机体系结构、形式语言和编译原理这三样之前要打好自动机相关的理论基础,因此FSM的原理对于职业程序员来讲应该是基础中的基础。很多问题都可以抽象为FSM模型,比如编译器的词法分析、游戏AI状态、顺序性操作等。我把自己的实现命名为bitfsm。项目主页是http://code.google.com/p/bitfsm/,codeproject有一篇简单的文档,地址是http://www.codeproject.com/KB/recipes/bitfsm.aspx,项目协议是MIT。核心类为C++模板类,内部使用bitset表示状态转移条件,库核心只有一个.h文件。想使用的话直接包含进你的工程里就能用。库提供了一个CLI C++写的DotNET封装,主要目的是为了给C#编写的可视化状态机编辑器做粘合层。因为库核心很小而粘合层和编辑器的代码又远多于核心库,所以从代码量上看起来整个库的形状是倒三角形的。但不管核心多么小巧,良好的分层架构都是降低复杂性所必要的。当然这个库不用CLI C++和C#而用动态语言如Python之类的来做上层(编辑器)的组织也是没问题的,用DotNET相关的东西只是我个人习惯。

  整个库的实现并不复杂,核心代码只有三四百行,使用方法参考codeproject那篇文章即可,直接看代码也可快速上手。

  本来使用状态机或其他模型做为抽象的目的是降低复杂性、简化模型,如果越搞越复杂就是本末倒置了。可事实上我却曾看到不少人在用手走路。任何工程领域都没有万金油式的普适抽象模型,工程人员所要做的就是尽量把抽离出的共性用少量的原理描述出来,再把这个原理实现出来,这就是做可复用抽象的途径吧。代码库越能多的复用对于雇主来说就是越多的节省成本。

  “选择XML(注:原文如此,可推至库)可以简化问题,也可能使问题复杂化。对它的大肆吹捧很多,但不要不加批判地采用或拒绝,否则就可能会成为时尚的牺牲品。”

  “每个新项目都从刀耕火种开始干起简直就是极端的浪费。应该把时间耗费在解决新问题上,而不是对那些已存在确切解决方案的问题老调重弹。”

  bitfsm用了多语言开发。很多人说编程语言不重要,算法、设计模式、bala-bala的思想才重要,但说这话的立足点不应是程序员仅使用一门语言就够了;我所想在一个程序员谈思想谈设计前,首先要有多语言的项目开发经验,语言只是工具是比不上思想难掌握,但更应是对于一个刚拿到手的项目,有经验的程序员应当能直觉似的反应过来整个项目的哪一块用哪一种语言,模块间怎么衔接粘合,然后在实际编码中能没有障碍的用适合的语言写出地道的实现。

  “混合语言是一种知识密集型(而不是编码密集型)的编程。要让它能够工作,我们不仅应该具备相当数量的多种语言应用知识,并且还必须具备能够判断这些语言在什么地方最适合、以及怎样把它们组合在一起的潜经验。”

  “知识和专能差异巨大,凭借知识可以推断出该做什么,而专能让你甚至在无意之间,条件反射似地把事情做好。”

  这篇文章也没有写太多技术,甚至没有代码。我觉得bitfsm寥寥几百行核心也无甚可言,看代码更直接。bitfsm暂时只是满足我个人的应用需求,对于别人要想应用到各自的工程中可能需要优化、丰富一下。最后附上bitfsm可视化编辑器的截图一张:



注:文中斜体字为《UNIX编程艺术》段落选摘。锐亚教育

锐亚教育,游戏开发论坛|游戏制作人|游戏策划|游戏开发|独立游戏|游戏产业|游戏研发|游戏运营| unity|unity3d|unity3d官网|unity3d 教程|金融帝国3|8k8k8k|mcafee8.5i|游戏蛮牛|蛮牛 unity|蛮牛