技巧要高于技术
技巧要高于技术,这是我在软件开发和设计方面的一种观点,在我的个人介绍页面里我也讲了这点,现在我就继续围绕这个观点谈一下。
前不久在项目中需要开发投币器接口,交给A员工去做了,在我的一些帮助下他总算是把功能大概实现了,虽然最终效果并不是我想要的。然后我就开始给他做一些设计上的改进,首先我说了,要你设计这个接口的目的就是为了让其它业务层在不用很了解你(投币器)的原理的情况下就能轻松方便调用,这个就要求你把属于你分内的职责在内部解决,也就是我们在设计上说的封装。具体要封装到什么地步呢,那你就站在调用者的角度思考,如果我需要投币器接口,我都想要哪些功能以及如何调用或者获取这些数据呢?首先我需要实时监控设备状态,然后我还能控制它进行一些操作,比如开启关闭确认收款等。还有为了满足“懒人”的设计思想,我还希望这个接口能自己收到钱后通知我,而不是我主动向它要。于是这个接口最终设计成了这个样子:内部操作完全封装起来,开放了几个方法,如:开启、关闭、确认收款、取消收款等,又开放了几个事件:状态改变、准备就绪、收到钱币、钱币入箱等。这样一来,接口内外职责就划分的很清楚,而这些并不需要多高的技术,也就是说这些都是基础要求,再加上设计上的技巧来实现的。
【技术原创】探讨一下京东商城价格图片解析算法的优化,附演示程序下载
发现咱博客开启后技术性的文章写的并不多,这貌似违背当时的初衷啊。文章不多并不表示咱一直都闲着,尤其是在技术方面咱是因为太忙了才没时间写一写,总结总结的。今晚趁还有些精力赶紧将前段日子自己捣鼓的小东西(之一)给大家分享一下。
前不久我不是扬言说要做两款小软件么,这次我们说到的话题就跟这个有关。我说的那个软件之一就是京东商城的相关软件–我想抓取价格做分析(京东不会提供这个接口),我相信这个肯定是对大家有所帮助的。京东商城的价格展示方式,除了书籍外,基本上都是通过图片来展示的–这个好处是防止有人过于轻易地抓取到价格信息。于是咱想准确地获取到价格的话就只能老实地分析图片喽(其实有的页面里,比如列表页面商品价格是有字符串表示形式的,但那个只用于无目标采集时有用,要是关注某个商品价格变动情况的话,作用就不大了,所以咱无法避免图像分析这一步)。
图片分析一般有两种思路,一种是与样本库对比,这种方法简单有效,缺点是适应性较差,样本可能要跟着图片不停地变动;另一种就是形状分析,也就是判断图片中数字的形状来判断是哪个字,这种方法效率比前者低,但适应性强;以前我在看验证码识别相关文章时还找到过这种算法,但眼下要用的时候就再也找不着了,方便起见咱也只能用第一种,也就是样本库的方法识别了。
让人又爱又恨的搜索引擎【别名:搜索引擎,想说爱你不容易】
咱开博客也有一个多月了吧,日志也有20多篇了,基本上都是咱原创的,现对各搜索引擎的表现分析一下,该批评的批评,该奖励的继续奖励(无非是多给点原创文章给他收录哈)。
先说Google(一般情况下咱不用谷歌这名字,感觉还不如叫股沟来得性感,嘿嘿),自打我的博客建立起不久,人家就开始收录了,这里灰常值得表扬。尤其是收录速度很快,咱发表一篇日志,基本上在30分钟以内就会在Google那边查到。而且它是目前收录最全的,也主是它把我的文章目录,标签目录等都一并收录,而且目录的优先级比文章的高(大家搜索一下就清楚了),这也让我在前期纠结了久:文章到底是弄成目录的形式还是弄成.html的形式,最终咱不去计较搜索结果了,纯为了看着舒服,弄成了.html格式的,也就是你现在看到的所有文章都是以英文名.html结尾(或许咱编程人员都有点癖好吧,我就觉得一篇文章如果以/结尾,感觉就像突然就断了一样,不踏实)。在发表这篇文章之前,Google显示它已经收录了我119个页面,以左图为证,大家也可以猛击此处核实一下。
不小心亲自验证了奇虎360的流氓
是这样的,平台要升级到2.2版本,昨天下班前测试了一下有几个小问题就没有发布,因为晚上平台使用的人少,就在那时测试通过得了。于是昨晚我从9点开始折腾,一直到10点半的样子,终于搞定了(主要是因为这次要将客户端程序尽量压缩,用到了我前篇日志提到的程序压缩合并混淆软件)。心想今晚终于可以睡个安稳觉了,明天一早在测试一下就可以发布正式版了。
其实我主要是想追求完美,想把所有库都压缩进去,最终发现读卡模块和数据模块的不能压缩和合并。于是在网上找了不少方案,尤其是那个开源的数据库软件的,最终发现解决不了问题。那目前只能是有三个库不能合并,客户端程序也算是清静了不少吧(当时也测试了一下新版后台,发现错误太多,只能还原回来)。
今天一大早我就在同事机器上测试(因为我自己的是Win7系统,而我们的程序是需要跑在XP下面的,所以必须得在XP下测试通过),先把旧数据下载下来,然后将新程序替换上去,一切正常。然后在终端机上测试软件运行正常,一切准备好后就事先在平台通知客户先不要发布更新,我这边先测试一下。等我发布新程序版本后,发现在同事机器上更新异常,再仔细看看,下载是成功的,关键是Update程序启动后,本来正常情况下是会把主程序替换掉,可结果是主程序直接不见了!我又仔细研究我的Update程序代码,里面只有复制替换操作,根本没有删除操作,这真是奇怪了,程序运行异常也不至于把自己给删除了吧(要真想一个程序在运行时把自己删除,还真得费一番功夫才能做到)。程序理论上是没有问题的,但我找来找去也没找到问题出在哪里。后来我突然想到,会不会是因为环境原因呢(曾经出现过病毒导致我们的程序无法正常显示界面),于是我将同事的360安全卫士和360杀毒软件都退出,再运行一次更新,这次成功了!再转到终端上测试一遍,也是成功的!
软件系统架构心得
毕业这几年来,不敢说设计过多少大项目,小项目也有若干个了。再加上平时设计和开发控件(其实一个控件就是一个小型的系统,它也有自己的架构)也有相关设计,我对软件系统架构也有了一定的心得,现分享一下。
其实我在系统架构方面的真正提升,还是在设计DIM平台时。当时考虑的因素很多,包括接口和实现的低耦合,业务细分(分离),平台管理方式,权限及日志设计等。当时考虑到用户可能会用多种数据库,多种搭建方式(最简单的就是单机版使用,最复杂的就是自己架构一台服务器),及完全的动态数据表的建立及维护。那时对控件也进行了升级,功能块完全抽象出来,使后台调用更为简洁(用过我那个动态列表和动态表单控件的比较清楚,在1.0版本中业务处理起来还是比较复杂和混乱的,功能扩展比较繁琐)。这样在2.0版本里,动态列表和表单内部职责进行了细分,并把常用功能块抽象,使控件内部逻辑更加清晰,方便维护及扩展。目前比较可惜的就是这个平台最终还是因时间和精力问题被放弃了,不过当作系统架构来练笔的话,还算一个比较不错的例子吧。
总结一下这些年在事业上走过的路
从上大学实习,到广州正式就业,再到转站南京,咱算是基本上没有进过比较大的软件企业,当然也就没多少机会接受很正规的软件培训或者教育。有句话说得好,上帝在关上一扇门时,同时也会打开另一扇门。中小企业有中小企业的好处,就是咱能接触到软件开发的每个流程,大部分功能业务块开发。我也就是在这样的磨练中,慢慢成长起来的。
先是要感谢一下给我走入DotNet世界的张经理(私下里称张哥),没有他我估计也不会从事DotNet开发,估计也不会有今天的成就(咱最初就是跟张哥学Java,后来马上要入门了,却让我们转DotNet,当初是多么地不愿意啊,后来感觉DotNet也蛮好玩的)。后来张哥又经常安排部门内部培训,教我们设计模式等技术,还安排我去研究前沿技术(我也就是在研究前沿技术时感悟到了许多东西,也就是在那时对开发控件感兴趣,做了第一个控件:分页控件,这为我以后的控件专门开发和系统架构打下了基础)。
如此让人惊讶的上市企业
今天算是比较繁忙的一天,因为助理有事请假回家了。然后接待客户的任务就交给我了(为了不影响同事们集中精力开发)。这下倒不要紧,很多客户就找上来了,涉及到的事情也蛮多,而且我还得想着如何升级到2.2版本及3.0架构事宜。最烦的是有的客户总会问些帮助文档上面都有的问题,而且我都说了,如果是有新功能要做的可以跟我交流,但要问这块那块是怎么回事,如何做的问题,就不要问我了,我目前不负责平台基本功能答疑,我要做的事情需要集中精力才行,所以有问题请先参考一下帮助文档,再不清楚就与我们的业务人员联系,或者与我的助理沟通。
下午的时候准备给部门开个会议讨论一下当前产品进度的问题,这时某个上市企业跟我们反馈了一下他们在技术上遇到的问题,想让我们做(当时就没说清楚是让我们做还是协助他们完成),我特意打电话过去问了,结果对方说得也不大清楚,意思是这块是让我们做的,而整个产品当时说好了是他们自己做的,怎么这块就交给我们做了呢,都不清楚是不是使用的同一种语言,程序如何衔接呢。于是下午只能去他们那边跑一趟了,去之前我还特意把相关说明文档打印出来以便于跟对方讨论,记下相关的问题。而且我还担心对方会不会比较强大(毕竟人家是上市的),我去了会不会感到压力大或者自卑呢。