2012年度总结

        今天是2012.12.31日。 当写下这些文字的时候才猛然的意识到这一年真的要结束了,2012即将离我们远去。但是心里感觉还有很多的事情没有做完。内心的潜意识还想停留在2012。

       总的来说,今年是一个有收获的年份,没有虚度光阴。我清楚的记得今年春节过年的时候,我就在家写代码了。平时周六日也基本上不休息。我想从读书、Coding、逆向这几个方面来说说今年的收获吧!

      书是永远的朋友,让我印象最深的是《Unix编程艺术》,这本书不是今年才读的,但是今年在反复读这本书的时候,深深的认同读中的观点,并且在工作中加以实践。特别是KISS原则、DO ONE THING, DO IT WELL等。这些经验是前辈们用几十年时间验证过的。可以称之为历史教训。

     Brian Kernighan曾经说过的:“计算机编程的本质是控制复杂度”。这句话,我认为太对了。无论将来技术发展到什么承度,这句话都不会过时,因为它道出最根本的东西。人的大脑理解事物的能力是有限的,太复杂的东西,大脑是不能一下子接受的。甚至可以这么说,人类目前能够建造的最复杂的东西,都可以分解成最简单的零件。这些零件简单到可以让一个成年人毫不费力的理解。如航天飞机,航母,汽车等。因此再复杂软件总是有非常简单的函数构成,如果其中有特别复杂的函数,那就不对了。为了控制复杂度,人们想出了模块化的方法。

        要编写复杂软件而又不至于一败涂地的唯一方法就是降低整体复杂度--用清晰的接口把若干简单的模块组合成一个复杂的软件。如此一来,多数问题只会局限于某个局部,那么就还有希望对局部进行改进不而至牵到全身(Unix 编程艺术(1.6.1))。这就是模块原则:使用简洁的接口拼合简单的部件。

       再谈谈,协议的文本化。我以前写程序也喜欢用二进制协议,特点是使用简单,但是缺点好像多的说不完。其实不仅仅是协议还包括文件的格式等。现在在我看来都只能用文本化的协议或格式。因为,它俱有透明性和无限的可扩展性,最重要的是阅读性。但是文本化协议的解析要比二进制协议麻烦一点。

      Coding的能力,不是看几本书就有的。是需要大量的实践才能提高。实践源于两方面:首先是阅读开源优秀的代码,其次是自已多动手,多写。以前有一个同事喜欢吹嘘他们以前的CTO写东西是一把成型,即一次设计就达到最优的结构。我认为这不太可能,不符合认知过程。举止个简单的例子,Linux 0.11版与3.0版之间有多大差距。认知过程是由浅入深的,伴随这个过程的是结构与代码的不断调整。所以软件开发过程是一个迭代的过程,设计->Coding->设计->Coding…….,类似这样的过程。不要过份追求一次性的完美(这是不可能的)。今年我就经历了这样的过程,回顾目前的结构与年初设计的结构已经有了很大的差异。

逆向工程或反汇编,是探索软件机制的方法之一。不过随着深入的研究,却发现其实是在跟编译器玩,逆向就是编译的反过程。不同的编译器之间也有不同的实现方法。今年我的重点是研究编译器和虚拟机保护,有什么成果吗?VMP的机制已经基本上被大家研究透了,在自动还原这个问题上,目前是八仙过海,各有各的方法。我认识的人当中,每个人的方法都有些区别。以后我再详细写这方面的内容吧!我在研究编译器的过程中,才真正发现C++的编译器是多么的复杂。复杂到早期的C++编译器是把C++转成C之后再编译的。目前我在研究clang的代码,clang是苹果开发的编译器,是我目前学习的对象。

        总之,今年是有进步的一年,明年是希望之年。

 

最后以Unix哲学结束:

Untitled

posted @ 2012-12-31 14:50  Russinovich`s Blog  阅读(1611)  评论(0编辑  收藏  举报