最近两三个月做的个项目,总结一下,大致用到了这么一些东西
- 8042芯片(芯片是如何与键盘鼠标交互)
- PS2协议(鼠标键盘数据是如何传输的)
- WDM驱动开发(如何在驱动层模拟键盘鼠标)
- Windows GDI API.(C#不支持非true type字体,非true type字体生成需要用GDI函数)
- C#与.NET编程。
- 图像处理与文本识别(识别屏幕文本并优化算法)。
- 数据结构,算法设计与优化(优化文本识别算法)。
- 面向对象设计和设计模式(factory method, multiton, object pool, adapter, bridge, façade, observer, strategy, template method。其实在写代码的时候压根没想啥模式,就觉得这么写比较好,写完了去比对一下设计模式定义,才发现用了这些东东)
- 函数式编程(如何用and, or, not等把一些已有的函数组装起来)
- 测试驱动开发和测试用例设计。
这些年,捣腾过MFC,界面设计,研究过Windows核心编程,写过telnet客户端,做过crack和disassemble,学过图形图像和计算机视觉,也看过C#与.NET,玩过Python,读过CV,AI方向的paper,鼓捣过黑白棋和人工智能,做过移动搜索,还做过QA,写过性能测试工具。因为知道自己不专,无论哪个方面的积累都不够,所以一直觉得心里很虚。总觉得自己啥都不会,要下岗了再就业都没人要。
最近的工作让偶意识到杂有杂的好处,大致归纳如下:
1 开拓思路。
碰到一个问题的时候,因为接触过的东西多,需要用什么的时候能从已经见过的东西中得到启发。譬如图像处理,如果没有C/C++的图像处理背景,纯粹只有C#背景的程序员去优化算法,很少会想到GetPixel这个函数和直接内存访问有多大差别,以及如何用位运算去同时处理多个像素点。没捣腾过微机原理的人看8042,端口IO会是一头雾水。
有人会说,我没必要什么都用过,需要时再查就可以。但一样东西在你见过之前怎么知道自己需要。在汽车发明以前,没有人需要汽车,大家都需要更快的马。一个天天用notepad或者IDE的人,不会想到vim能大幅提高文本编程效率。你没用过Windows API,知道这个问题API里可以这么做么?没用过某个dos命令,会知道某个问题用这个dos命令很容易解决么?
2 丰富工具箱。
如果你只有一把锤子,所有的东西看上去都是钉子。最好是工具箱里锤子、改锥、扳手、钳子啥都有,并且每样不只一种型号。解决问题时啥称手就用啥。更高一些的境界是你解决了一个问题,都没有意识到用的是锤子还是改锥,这时心中已经没有了工具,所有的工具运用起来就和用手端杯子喝水一样自然。
杂也有杂的坏处。
太杂了必然不够专,因为在任何一个专门的方向积累都不够。因此和某方面专业人士比起来总觉得心虚。就像树一样,没有主干的小灌木永远不可能高过大乔木。为了解决这个问题,要从两个方面下功夫:
1 根基打牢。
再高的树也离不开大地的养分。根基扎的越牢,才能长的越高。对于计算机科学来说,计算机原理、数据结构与算法、编译原理、操作系统、数据库原理,计算机网络等就是根基。此外还需要熟练掌握汇编原理,知道cpu是做啥的。掌握C语言,因为在C里面你能指令和内存,很明白你的代码都做了什么,而不是只见一堆类库。掌握一门高级语言如C#/Java.掌握一门动态语言,如Python/Perl/Ruby。再掌握一门函数式语言,如Lisp/Haskell.
2 抓住趋势,建立技术储备。
如果在Java/.NET刚出来的时候你就开始深入研究,那么到现在至少也小有成就了,在这方面算是大牛了,可以过得很滋润。而如果你把精力投入到vxd的研究上,可能过了几年,发现这玩意已经没人用了。这就是一个方向选择问题。
碰到过拿汇编写下载工具的人,问它为什么拿汇编写,说因为下载追求速度,而汇编恰恰能发挥速度优势。很无语。只能祝他好运。
方向选择不能只仅凭自己喜好,还要看应用的大趋势,找到与自己爱好的契合点。3G,云计算的时代即将到来,相关的技术人才也会成为香饽饽。基于web的应用,瘦客户端也是一个大方向。程序员不能闭门造车。看到未来才能赢得未来。