2010/10/26

机锋网
http://bbs.gfan.com/?fromuid=651827

2010/09/10

像小孩子那样去学习,获得最直接的体验!
像小孩子那样去学习,获得最直接的体验!
这是最原始,也是最直接,更是最好的学习方法。
很多人,很多情况下,学习都是坐而论道,这样学习方式,看起来很快,很便捷,但却很多时候丧失了知识的准确性,久而久之,便变得不自信。当然,你自己可以强加给自己以自信,但这种自信是那么的不稳固。
任何的知识体系,从宏观上来讲,都是金字塔形的,某一种知识是需要另一种更为底层的知识作为铺垫,才能发挥作用,也才能讲得通。当很多底层的知识在思维里没有得到确切的认证,或者说没有得到很具体直接的体验,那么上层的知识,只能靠单纯的逻辑推理得到。而这种逻辑推理是属于差之毫厘失之千里的问题。
所以,个人认为,实验的重要性是不言而喻的。
当然 ,并非任何问题都需要验证,最好的方式是从自己的内心出发去验证式的实验。如果你对某结论准确性不那么确信,那就需要实验了。从这个角度来说,实验很重要。
在这之后,我的意思是当你对很多问题都很确信,并且形成一个体系之后,那就可以进入第二个层次,却整理,升华,进而形成对一个领域知识的哲学。如果有了对这一领域的知识哲学,那么就可以做到举一反三了,系统跟系统之间很多时候是那么的相似,以至于可以举一反三,触类旁通。当然,这种东西,不太可以讲得清楚,我的意思是如何去整理和升华,这和各人的悟性有关系,或者可能是我的水平还不足以高到可以讲得清这个问题。

2009/03/12

为何匿名内部类访问外部类方法中的局部变量,这个变量必须是final型
public class Test {

    /**
     * @param args
     */
    public static void main(String[] args){
        Test t= new Test();
        System.out.println(t.getA().getO());
        System.gc();
        System.out.println(t.getA().getO());
    }
    public A getA(){
        final Object o = new Object();
        
        return new A(){

            @Override
            public Object getO() {
                
                return o;
            }
            
        };
    }
}
interface A{
    public Object getO();
}
看上面一段代码。
为何下划线的那段代码要用红色的final呢?
其实大家有没有想过,如果不用final会发生什么事情?首先,这个对象会随时被垃圾回收器收集掉(看起来是这样,呵呵,实际上不是这样),这就失去了稳定性.
其次,这段代码在编译的时候,外部类Test是作为一个指针送入匿名内部类中的,但这对于取得常引用o指向的对象没有意义,因为那个final型引用是方法体内部的局部引用,那这个匿名内部类的类体内部在编译时就无法获得一个局部.
实际上,从java汇编指令可以看出来,实际的操作是在匿名内部类中形成了一个类似私有的final型引用,而那个局部变量的引用将被复制一份存在于匿名内部类中,这个引用指向这个外部类方法中的常引用对象.实际上,java完全可以做到非final型的局部引用被内部类引用,这样就会使代码的可读性变差,或者说是可理解性变差.
假设下面代码能通过编译,
 public A[] getAArray(){
       /* final*/ Object o = new Object(){
                    public String toString(){return "Obj";}
            };//
        
        A a1= new A(){

            @Override
            public Object getO() {
                return o;
            }
        };
        A a2=new A(){
            @Override
            public Object getO() {
                o=null;
                return o;
            }
        }
        A[] as=new A[2]{a1,a2};
        return as;
    }


as[1].getO();//null
as[0].getO();//"Obj"
但是从字面上理解,as[1].getO();as[0].getO();操作的都是"/* final*/ Object o",但事实上,按照java的实现机制不是操作的同一个引用,这就引起了歧义.
我说的可能有点拗口,大家可以仔细去理解一下这里面的关系.



2009/03/01

灵音
人,真的需要在于自己的等级吗(等级意味着自己的学术或者技术水平)?
我是很不赞同对人技术水平的等级划分(最多来讲,这个等级的划分只是让企业降低风险,因为专业就是专业,企业之关注结果),至少不赞同自己承认这样的划分,并非我不愿意承认自己的水平,只是,人的水平并非这么简单能划分的清楚的.
每个人的思维都有特点,划分了明确的级别,就意味着只有一条路可以走,这就意味着苍白.
我个人认为,我们需要的是对自我的认识,简单的说就是自知之明,或者说不断的了解自己,提升自己,但提升自己并不意味着要给自己划分等级.
用你的感觉去感受你还欠缺什么,不断的完善.生活中有太多的机会让你去体验和学习,要的是真正的让心宁静下来,去倾听那种灵音,很清脆的那种声音.就像是宁静的湖面滴下一滴水发出的那种清脆声.
大道是相通的,哲学不需要熟练,倾听也不需要熟练.就像听音乐,没有人会说我需要经过怎么样的训练才能享受.


计算机到底需要多少能量
计算机的计算到底需要多少能量.
今天和朋友谈起计算机的计算到底需要多少能量,我说在某种程度上说,可以为0,至少趋向于0.
朋友不解,一直让我举出科学依据.呵呵,我当时不知道说什么好,说实在的,这个还需要依据吗?也许我是学计算机的,他不是,所以他有这个疑问.
计算机的运行,最核心的部分是cpu,是一个纯逻辑的部件.一个逻辑的运算,只是状态的改变,没有任何理由说这个逻辑状态比那个逻辑状态的能量值来的高,而且逻辑状态的改变,也没有任何理由可以说是需要消耗能量的.
现在的cpu99%以上的能量消耗是在发热上面,但某一种技术都有某一种技术的局限性,现在的计算机是以电作为能量来驱动的,而现在的电路都没有超导能力,电路消耗的能量,或者说是电路的发热才是cpu电能消耗的罪魁,而我们的计算结果,只是用电来保存了某种状态,就像我们小时候用一根火柴表示1,10根表示10一个道理,其实我们并不需要搬运火柴的能量,他只是一个表示,一个逻辑的表示,完全和电能的消耗没有关系.
有时候我很不喜欢证明,因为如果两个人没有共同的平台,很难把一件事情说清楚.
实际上,计算机不需要消耗能量这个论题一样,人的移动其实从很大的程度上讲,也是不需要的,但这个很难实现,因为你的移动必然要摩擦,你不可能造出无摩擦的公路,或者人的世界的现有事实太多了,要考虑的问题也太多,但计算机不一样,我们需要的仅仅是逻辑,从这点看我们不需要消耗能量是完全可能的.
我们需要的是找出某种方式,达到这三个目标,1,逻辑状态的承载体,2,在此承载体上改变状态的办法,3,这个改变必须可以规模进行.
我们可以找出任何达到这三个条件的办法,只是说可能现在电子的办法更经济实用,更加可以商业化.
我们所有的设备,其实无外乎输入和输出,其实使用的也就是一个有状态或者无状态的黑盒子,我们需要的是一个算法,这个黑盒子就是算法,这个黑盒子可以以任何一种方式来实现:光,电,声,或者人工(呵呵,只要你不觉得速度慢).
所以,其实计算机抽象到最后就是协作,节点和节点之间的协作,这个节点未必是实际的物理节点,也可能是某种抽象层次的节点,比如网络协议栈中层.