解惑

解己之惑,解人之惑

标签:软件

智能化和极简化

曾几何时,企业级软件是一个非常高大上的名词,而难用是后面的潜台词,从部署到配置到使用,非常的受诟病,但是没办法,在软件开发不那么成熟的时代,能够有能力组织开发出如此复杂的软件的就那么几个公司,能够做出来已经很不错了,加上采购者和使用者完全是两拨人,使用者的话语权太低了,所以以用户为导向的重要性虽然在产品开发的过程中被重视,但是视角完全是错误的,重点完全在功能的完整性、多样性和灵活性上。当互联网真正崛起,SaaS被广为接受,服务化被广泛采用后,我们才发现他们的玩法不一样了,因为直接面对的是最终使用者,最终使用者的口碑传播效应得到了极大提升,以使用者作为真正用户的视角才被纠正,所以各种讨好最终使用者的特性才被重视起来了,早期一个很重要的概念就是傻瓜化,这个,乔布斯的iPhone也是居功至伟的,但是我更愿意叫这个为智能化,伴随而来的还有极简化,核心思想就是尽最大可能减少用户的思考和使用门槛,上手就能够用而且用的比较顺畅。由于我以前也搞过自己的社区,深深知道这个有多么的重要,而很不幸的是这么多年都在大公司,很多思想并不被接受,终于,从前几年开始,这些风终于刮到了企业级这个漆黑的领域。从3年前做的一键升级整个集群,使得原来一个40台节点集群的升级时间从7天缩短到8个小时(大部分其实是升级准备及数据库,服务器升级半个小时内就可以搞定,并行的),而且基本不需要人工干预(除非客户有自己的定制化配置),为此Support的头头还专门写信表扬过,到现在,新的产品的一个极大的重心也是在智能化和极简化上,包括安装和升级,总算开始和自己一贯的思想理念一致了,特此纪念下。。。

我的mac常用软件

呵呵,拿到mac后花了不少时间配齐各种软件,当然,以免费的为主。

IM:Adium,Messanger(主要),QQ(玩网游的时候应付国内的玩家)

FTP:FileZilla(习惯了,windows下也用这个)

远程桌面:CoRD(比RDC好),RDC

BT:easyMule(没有windows版的好,但是还是可以用的,也不错),Vuze

浏览器:Safari(主要浏览器,淘宝支付宝都没有问题),FF,Chrome

看图:Xee

Txt编辑器:Bean,TextEdit

解压:Stuffit Expander

看电影:VLC,Miro,QT and Pidgin,MPlayer OS X 2 and Extended,这个是mac的一大问题,没有真正全能的播放器,都有这样那样的问题,经常是这个不行试试那个,主要用VLC

设计也不是个简单的事情

理论上,一个系统的设计如果有多种方案,应该是很容易决定出优劣的,但是现实往往不是这样,需要考虑很多种因素。

  • 参与决策的人的设计风格不同,有的喜欢Properties式的无约定扩展风格,有的喜欢超级父类式的运行时多态风格,还有的喜欢根据功能不断增加的API不断对应增加的风格,当然还有其他的一些根据三种风格的变种的风格。
  • 实现系统的人的能力和背景不同,某些很好的设计对于他们来说难度较大,因为实现的人不能充分的理解设计者的意图,最终好的设计变成糟糕的实现。
  • 时间约束,项目的时间很紧,某些设计方案需要做比较多的架构和框架方面的东西才能做业务方面的东西,导致前期更高级别的人看不到项目的直接而且直观的结果。
  • 需求的不确定,很多设计都是根据当前和可预见的需求来设计的,但是如果需求非常的不确定,很难决定那种设计更好,不同的关键需求的变更可能导致某些关键设计的失败。
  • 技术风险,某些设计存在一些技术风险,设计还没有成熟的先例,在大规模系统情况下存在不可预见的技术瓶颈。

装机基础软件

拿到新的电脑了,重新装了系统,发现现在需要的基础软件还是比较少的,目前为止装的软件:

  • 瑞星杀毒和防火墙
  • 360安全卫士
  • 迅雷
  • FireFox浏览器
  • Chrome浏览器
  • QQ
  • MSN
  • 7-ZIP
  • FileZilla
  • 招商证券全能版
  • 招行网银专业版
  • KMPlayer
  • Adobe Reader
  • MS Office2000
  • NotePad++

第一次用上了正版杀毒软件

呵呵,当然是不花钱的了,在京东上买的benq的电脑送的,瑞星。
以前一直用诺顿的企业版的客户端,感觉很好用,没有中过毒和木马。
比较讨厌瑞星的做法,在启动的时候在windows的启动画面上加上自己的杀毒软件和防火墙的Logo。
还不知道这套软件可以用多长时间,到期以后换诺顿客户端。

PS:深深的鄙视下自己,没有为软件产业做出贡献,因为我花钱买的唯一的正版软件是若干年前国内出的BluePoint的Linux操作系统,那个时候还没有什么好的中文版的Linux发行版。

不能浮躁

拿到一个新的任务的时候我们往往马上就开始干,特别是曾经接触过的内容,只要是自己感觉可以做,往往就不管三七二十一开始写代码,现在想想很不应该,拿到新的任务,先要研究一下难度,有没有难点和可能的潜在问题,什么样的方案比较好,灵活性、通用性以及可扩展性方面,另外就是看看系统中是否已经有其它的现成的代码。
每个项目我感觉应该有一个公共的功能库,不光是减轻开发的工作量,对于程序的稳定性,可维护性也是莫大的提高,但是往往有两个问题:
 一、不愿意用别人写的代码,自己总觉得自己的代码比别人好。
 二、不知道怎么用,因为没有文档,这个确实是开发人员的一个通病,喜欢写代码不喜欢写使用文档或者说明文档。

CVS开发方式是软件维护性的杀手

呵呵,不要误会,这里的CVS不是指版本管理的CVS,而是指程序员们最熟悉的三个快捷键:CTRL+C(复制)CTRL+V(转贴)CTRL+S(保存),一个软件产品中的很多代码都是这么得来的,以我们公司产品为例,最典型的莫过于Action的execute方法的前面对session是否过期的判断,以及调用后台的Session Bean的时候的异常处理,以及JSP中的大段类似代码。一旦需求发生变化,这些相关的代码可能都需要修改,我到这个公司的时候就发生过一次这样的事情:一个简单的修改要在百十几个Action中重复进行。
以我这些年的开发经验,我更加倾向于给开发人员提供一个受限的开发环境,可以供选择的接口很少,只有在必要的情况下才增加接口供开发人员使用,共通的功能只能通过共通的接口进行,否则你的工作量可能是使用正确的接口的十几倍。当然,这个开发方式比较适用于产品开发,因为项目的情况差异太大,而且开发周期相对比较短,这样做反倒延缓开发进度,增加成本。
至于如何提供那些接口,就是一个渐进的过程,开始的框架是一个宽泛的接口集,如果一段代码被重复三次,并且以后可能还会重复或者有类似的片断,那么就要马上对原来的代码进行重构,这样在第一个版本出来之前,我们就会得到一个比较好产品。在每个版本的开发前期、中期和后期都做一次代码检查,发现类似这样的代码重复问题并及时修改。

软件开发必备的因素

现在的软件开发流程(或者是开发方法,例如CMM,RUP,XP等)有很多,但是对于很多小公司而言,不会完全去照搬一套流程,但是大公司肯定会选择一套标准的流程或者根据自己的情况定制一个合适的流程。我也在各种类型的公司都做过,因此也接触了很多种开发方式,对于一些小公司,揉合这些开发方法,提取切实可行又灵活的开发方法是一个不错的选择,就我而言,下面这些是一些容易做到也对公司对开发团队都很有利的一些内容:

  • 必须有源代码管理机制,推荐使用CVS或者Subversion
  • 一个项目或者产品的开发团队必须至少是三层的,最上面的就是PM,PSM,架构师或者总技术负责人之类的,负责总体的协调和管理,第二层就是小组长,必须对产品或者项目比较熟悉,可以解决小组成员60%以上的问题,然后就是开发人员,小组的结构应该是很小的,四个人为宜,一个组长加3个组员
  • 必须有内部的知识共享机制,可以选择论坛或者WIKI,搜索功能必须强大好用
  • 有IM可以及时的沟通,无论是否是分布式开发,即使在一个办公室里面也要有,如果为了防止外部的干扰,可以搭建内部的IM 服务器
  • 重要的讨论一定要通过邮件或者及时记录下来,把QA小组相关的人员也包含在内
  • 必须有单元测试,最好是全面的自动测试,但是QA小组的验收性测试依然是必不可少的
  • 要培养开发人员高质量的源代码意识,鼓励他们学习设计模式、重构,要求他们的源代码要便于维护、易读、格式统一、消除重复代码等(这个很多小公司最容易忽视,然后就是后面接手的人骂前面写那些代码的人)

需要掌握的软件开发技术

虽然现在有很多的软件开发技术需要我们掌握,但是就我而言,有如下几个需要掌握的技术,因为只有掌握这些,你才能得到一个比较好的系统设计,系统的灵活性、协调性、可扩展性、稳定性才能得到比较好的保证。
 

  • 设计模式:这个是这几年一直在被热炒的技术,虽然今年似乎热度有所下降,但是这个实在是非常重要的技术,你不一定精通所有的经典模式,但是对于常见的几种一定需要掌握。 
  • 重构:这个在XP中可能强调得比较多,在其它的场合提出得比较少,但是它实在是防止过度设计和优化系统设计的一个利器,需要强调的是重构必须建立在单元测试的基础上,否则系统的稳定性将得不到保证。 
  • 单元测试:这个是保证系统质量的最关键的一个因素,也是保证有效的重构的基础。 
  • IoC:就我的理解,就是要加大对配置的依赖而非代码间的直接依赖,虽然这样做以后系统的总体结构和代码间的关系变得不像以前那么清晰,但是这个确实是使得系统更加灵活和可扩展的不二法宝。 
  • AOP:虽然我还没有真正使用过,但是实在是喜欢它,因为这个可以很好的实现动态的Plugin结构,也是提高系统的灵活性和可扩展性的法宝,而且可以将一些共通的杂项延迟到以后考虑。 
  • 重用:虽然这个不应该算一种技术,但是我想强调项目组内的代码重用,这个是保证系统的行为一致和协调的关键因素,就像我在另外一篇文章提升项目组的开发效率中所强调的那样。

从硬件转向软件

我大学的专业是电子工程,但是大三发生的一件事情可能永远的改变了我的人生轨迹:让我从硬件设计转向了软件设计。
\ \ 大三的时候我报名参加了大学生电子设计大赛,在暑假的封闭提高中,我们所做的一个练习项目出了问题,问题出在我们的电源工作不稳定,使用示波器测试发现有太大的纹波,老师说可能是因为电源和其它组件在同一个电板上导致干扰,将电源独立出来试试,我们照着老师的建议将电源独立了出来,但是问题依旧,老师让再附加电容电路进行稳压,问题依旧。。。这次的经历让我很疲惫,而最后,我放弃了,因为我担心以后还会遇到这样莫明其妙的问题,现实中已经有太多我无法把握的事情了,我不想以后的职业道路也是一样充满不确定因素,好在我还有其它的路可以选择。因为我们是电子系,要修很多计算机系的课程,而且我的第二专业就是计算机(学校要求每个人都要修第二专业,但是没有学位),最重要的是我对计算机情有独钟,高考以后就买了书自学DOS,到了大学后自学所有的计算机课程,因此我的选择很明显就是走软件设计这条路了。
\ 现在经常听到做软件的不如什么什么,但是我热爱编程,因为只要我的设计是正确的,那么结果就是正确的,否则肯定是我的设计有漏洞。这个让我这个非常理想化的人找到了理想的职业。到现在为止,我从来都没有后悔我的选择,只有很少数的情况下我会担心一下被同行所热炒的35岁问题。

© 2019 解惑

本主题由Anders Noren提供向上 ↑