本来今天没有写文章的想法的,但是看到个android的提问,引发了我很多思考,并有了很多感悟,我决定写下来。
这是这个问题的url:http://ask.csdn.net/questions/214889,问的是一个鉴定图片点击区域的问题,令我意外的是,经过几次互动,我想到了很多经验之外的东西。
我们程序员往往顶着很大的业务压力,经过一段时间的磨练之后,也会有很多成型的技术方案,统称经验吧,这时候我们往往用经验来指导,而不是思考。(说来惭愧,我才工作了不到半年,这样的确有些大言不惭)。
就拿这个问题来说事吧,有童鞋说在指定的位置放透明的button之类的组件,才学习的时候我们往往这样去解决问题(O(∩_∩)O哈哈~);
随着对android的原理和事件机制了解的越多,我们会在activity中定义一系列的区域,利用屏幕事件监听来实现需求;
然后我们会把数据和控制分离做持久化;
然后我们会想着写上几个还不错的类来提供统一化的解决方案。更多的细节我就不在这里扯了。
这样的进步一定是极好的。但也只是我们的编程能力、设计思想提升了。并没有真正去思考核心。
后来题主问了我一句,这样的处理(矩形来表示区域)在准确度上会有问题,不是很好的解决方案。
到这里我还是在按照经验来指引思维,我说使用圆角矩形会比矩形准确,使用椭圆会更准确……此刻开始思考了:
数学上建立坐标系,任意的曲线都是能够表示的。或者利用“微积分”的思想,使用一系列的小区域去构成一个更加准确的区域来描述。那么需要注意有高效的算法来支持。
我开始意识到,这就是一个建立模型的问题,然后才是算法。
无论是矩形还是什么,都是试图在为图片“解析”建立模型,再想到“微积分”,我可以将每一个微元细化到像素点!
那么怎么为高效算法做准备呢,之前提到的矩形,曲线都是利用坐标系和解析几何来构造高效的算法,那么从像素点,应当会有更合适的方法;
瞬间我就想到了颜色,为了区分区域,我一定需要一些信息(也就是数据),从逼近,到像素,到图像,到颜色,思考会给人很多惊喜。
再回到问题,我提供一张图片和一张模型,这张图片需要区分的区域,在模型图上使用不同的颜色进行填充,我只需要按照点击位置来获取模型上的颜色就能很快的出区域。
假设是256阶的灰阶图像,我可以区分255个不同的区域(要去掉一个不起实质作用的背景),如果是伪彩色,真彩色。。。。需求上绝对够了,而且我们很容易就能得到高效的处理方法,随着业务逻辑的复杂,我们也能利用相适的函数做出合适的算法。
这是一次很美妙的经历,我一直在构思自己的人生、职业规划,也在反思公司的技术总监到底看中我的哪一点。我想我又得到了一些答案。
我们程序员往往“很忙”,但我个人觉得那种高压(严苛的压榨行为)是不利于个人发展的,所幸我所在的公司也挺注重自我提高的。
那么我们再自我提高的时候应该干点什么,除了向“大牛”学习新技术,和技术水平类似的交流探讨,可能我们还需要向新人多交流,并不是去炫耀,而是将相对高手指导相对低手的良好循环维持下去,更重要的是寻找引发思考的机会,“大牛”那里往往会被带着思路走,鲜有机会引发头脑风暴,水平类似的往往交流经验了,而新人因为懂得东西少,会问这问那,也许自己都会有惊喜,把自己都机智哭了,O(∩_∩)O哈哈~。
甚至于,程序需要优化的时候,我们需要跳出当前的程序去反思,人是会思考的芦苇,千万不要用经验取代思考。