曲目四:程序员胡子的N项修炼

程序员胡子,零零碎碎学了不少,不过简历里的Skill Set一向只写C/C++/Java。其他的只能说是应急而拿来“用”罢了。不谈。
此处谈的是“能力”,而不是具体的“语言”使用,算是胡子的程序员“理论”吧。

人人对话,人学机话!

语言学习能力。学语言实际是换位思考,真正了解自然语言的词法,语法。那么对于严密的自适应逻辑语言的学习是差不多的。胡子总结了三点。
语言语法、句法规约。胡子学Basic用了三年,到Java只用两天看完Thinking in Java就拿来用了;
语言所体现的概念、思想。POP/OOP/...语言的思想才是最重要的,需要深刻的学习和理解。不然,只能算是“拿来用用”罢了;
图灵语法归纳进而编译原理。追本溯源,可在学会用一种语言之后再进行。真正了解语言是如何练成的!
听说读写,此谓之“听”!

语言表达能力。实际是换位思考的一个锻炼途径,作为学习计算机逻辑语言的一个中间步骤。学说话,多说就可以了。称为“伪代码”过程,不求编译通过,甚至不必经过电脑,只需要逻辑说得通。用纯逻辑(计算机)的脑袋“说”!


人机对话!

编译运行环境学习。
编译规则/步骤。由C/C++而言。入口,命令行参数,make(如何make),link(如何link)。而后的java作为高端的二维机器语言主要编译环境在虚拟机的配置上,在了解虚拟机工作机制之外就没有进一步研究了,不细谈。
运行规则。主要是编译器编译运行的规约。如C++ / Java子类父类实例化过程。
准备工作,找到“桌子”、“纸”和“笔”了!

编码阅读能力。慢慢道来。“读”!
静态编码阅读能力。主要是语法规约、句法阅读、理清逻辑、从逻辑语言映射到自然语言中。当然,有高人是直接用逻辑语言思考的,需要大量的实践和锻炼。一个几年前看到程序分享一下(似乎是那个,今天刚从网上搜的),当时好像折腾了胡子一个多小时。权且作为一个简单的C测试吧。

#include <stdio.h>
char *a;main(int t,int _,char* a){return!0<t?t<3?main(-79,-13,a+main(-87,1-_,
main(-86,0,a+1)+a)):1,t<_?main(t+1,_,a):3,main(-94,-27+t,a)&&t==2?_<13?
main(2,_+1,"%s %d %d\n"):9:16:t<0?t<-72?main(_,t,
"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/")
:t<-50?_==*a?putchar(31[a]):main(-65,_,a+1):main((*a=='/')+t,_,a+1)
:0<t?main(2,2,"%s"):*a=='/'||main(0,main(-61,*a,
"!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"),a+1);}

调试能力、动态跟踪能力。把这归到代码阅读里面来,因为是基础的基础,后面测试debug就是这项能力的最大用途。当然,此道终极就是可执行程序反汇编分析。很多私有协议分析家,程序机制分析家甚至一些黑客都是此道高手!需要经验,需要耐性,需要数学功底和严密的逻辑。最后一点,需要兴趣。胡子一个朋友Shrek就是一牛!胡子自己?仍然只是高级语言(C/C++)级的应用者而已。
编码阅读能力的一个培养方法就是学习《深入浅出MFC》;把MFC动态跟一遍,再读一遍。然后再自己跟一遍ATL,潘爱民《深入解析ATL》。(基础,java什么的就不清楚了,找些开源的代码吧,struts不错;.NET不知道,MONO?!循序渐进,慢慢来吧)

编码能力。“写”!
编码规范能力。养好习惯,编码规范,不细说了。合格的程序员必经的一关;
精简编码能力。实际是对自己逻辑思维和分析能力的抽象提纯过程。能用一句完成的不用两句;
编码优化能力。对编码性能的要求。需要对编译器和软件底层了解,对编译环境的辅助能力有了解。如,*2和<<1、t=a;a=b;b=t;和a^=b;b^=a;a^=b;、循环中的idx--;、C的一些lib中那些函数可以复用等。进一步的,需要“理解”,“为什么”,看看组成原理和一些虚拟机的代码吧;
再进一步的,称为“重构”能力,稍后谈;
Debug能力。自己开发的程序很多知识、思维盲点,操作失误而造成bug。为达到满足需求的自适应能力,debug必不可少,不过重点只是基本功的运用而已,注意自身盲点(当年跟过两天一夜的DDK代码注入在MFC一个静态变量前被block掉的bug案例。窃以为豪!);
寻求帮助的能力。学会自己解决问题,很多问题你不是第一个发现的!学会查msdn、学会google……这是一项能力,需要修炼的。最后才是询问高手,也希望高手不吝赐教。

测试设计能力。这个不精通,简写。“检查”!
功能测试。仍然是换位思考,重新根据需求设计测试案例。避免实现盲点,需要严谨的思维和丰富的经验;
压力测试。实际是另一类型的编码,专门测试软件的应用。不会,不多说;
以测试的思维进行编码。已经不算是一种新的理论了,测试驱动。
 
新理论和新技术学习能力。学会分清是真正的新理论还是“新瓶旧酒”。新技术往往是新理论的实现。因为人的立场,新理论往往是现实世界到软件世界中的映射。一维的POX,二维的OOX,三维的AOX,整合业务理念后现在大热的SOX……学会转换角色思考,理论理解才是技术理解的保障。也许,下一个理论就是你发现的。
 

站在二维的高度设计,站在三维的高度架构。展示人类生存的世界给可爱的计算机们……

根据业务(需求规约)抽象、映射能力。基础,模块源起。闭上眼睛,慢慢体验……
模块设计能力。《设计模式》,二十四式也罢,四十八式也罢。可惜用得多了之后,胡子已经忘了那些个名称、分类了,只知道根据要求排列组合了;
系统设计能力、公共模块抽象能力、系统阅读能力……


天地四方曰宇,往古来今曰宙。四维的软件工程思想!
软件工程能力。不说了,看书、自己印证……


人与自然,算是自我充电吧!
业务阅读能力。
学会调节,学会放下,学会玩,放开纯理的思维。人即是人,机即是机。人可役机,机不可役人。


打住,写不动了,就虎头蛇尾吧。一笑,呵呵。

千头万绪,如何取舍,听君自便。
如果不能成为创造理论的大师,那就老老实实成为“专家”。无他,唯手熟尔!
“勿在浮沙筑高台!”

posted on 2007-01-19 21:32  DCH  阅读(665)  评论(0编辑  收藏  举报

导航