posted in OJ题解 

/*
2013年3月23日16:54:09
HDU OJ 4509
也是 腾讯马拉松 2月21日 第5题
*/
#include <stdio.h>

bool is_later(int h1, int m1, int h, int m)	//判断某时间点是否在开始时间点后
{
	if ((h>h1) || ((h==h1)&&(m>=m1)))
		return true;
	else
		return false;
}

bool is_former(int h2, int m2, int h, int m)	//判断某时间点是否在结束时间点前
{
	if ((h<h2) || ((h==h2)&&(m<m2)))
		return true;
	else 
		return false;
}

bool is_invade(int h1, int m1, int h2, int m2, int h, int m) //判断改时间点是否被这件事占用
{
	if (is_later(h1, m1, h, m) && is_former(h2, m2, h, m))
		return true;
	else
		return false;
}

int main()
{
	int n, i, j;
	int h1, m1, h2, m2, h, m;
	int time[24][60];
	int free_time;

	while (scanf("%d", &n) != EOF)
	{
		for (i = 0; i < 24; i++)	//标志量初始化,表示每个时间点未被占用
		{
			for (j = 0; j < 60; j++)
			{
				time[i][j] = 0;
			}
		}

		for (i = 0; i < n; i++)		//对每件事进行分析,看它占用了哪些时间点
		{
			scanf("%d:%d %d:%d", &h1, &m1, &h2, &m2);
			for (h = 0; h < 24; h++)
			{
				for (m = 0; m < 60; m++)
				{
					if (time[h][m] == 0)
					{
						if (is_invade(h1, m1, h2, m2, h, m))
							time[h][m] = 1;
					}
				}
			}
		}

		free_time = 0; 
		for (h = 0; h < 24; h++)	//统计空余时间
		{
			for (m = 0; m < 60; m++)
			{
				if (!time[h][m])
					free_time++;
			}
		}

		printf("%d\n", free_time);
	}


	return 0;
}

/*
思路:
	该题采用了 标记量 的方式,来标记哪些时间被占用,哪些未被占用。

总结:
	1. 确定了 内联函数 确实能用,但是发现 是否是内联函数 运行时间一样长!
	2. 确定了 bool类型 确实能用。
	3. 当初没有做出来的原因:
		① 审题错误,导致第一回思路错误
		② 想采用更好算法,导致 逻辑过于复杂,程序出现了错误。
	4. 这回 花了一个小时 才做出来, 原因:
		程序出了错误,调试了半天。
	错误原因:
		① 把 == 写成了 =
		② bool 变量 默认返回 true,因此需要考虑返回 false情况。
*/

本文章迁移自http://blog.csdn.net/timberwolf_2012/article/details/8738478

posted in 程序员之路 

这段时间受到很多人的来信。他们看了我很早以前写的推崇 Linux 的文章,想知道如何“抛弃 Windows,学习 Linux”。天知道他们在哪里找到那么老的文章,真是好事不出门…… 我觉得我有责任消除我以前的文章对人的误导,洗清我这个“Linux 狂热分子”的恶名。我觉得我已经写过一些澄清的文章了,可是怎么还是有人来信问 Linux 的问题。也许因为感觉到“舆论压力”,我把文章都删了。

简言之,我想对那些觉得 Linux 永远也学不会的“菜鸟”们说:

  1. Linux 和 Unix 里面包含了一些非常糟糕的设计。不要被 Unix 的教条主义者吓倒。学不会有些东西很多时候不是你的错,而是 Linux 的错,是“Unix 思想” 的错。不要浪费时间去学习太多工具的用法,钻研稀奇古怪的命令行。那些貌似难的,复杂的东西,特别要小心分析。

  2. Windows 避免了 Unix,Linux 和 Mac OS X 的很多问题。微软是值得尊敬的公司,是真正在乎程序开发工具的公司。我收回曾经对微软的鄙视态度。请菜鸟们吸收 Windows 设计里面好的东西。另外 Visual Studio 是非常好的工具,会带来编程效率的大幅度提升。请不要歧视 IDE。要正视 Emacs,VIM 等文本编辑器的局限性。当然,这些正面评价不等于说你应该为微软工作。就像我喜欢 iPhone,但是却不一定想给 Apple 工作一样。

  3. 学习操作系统最好的办法是学会(真正的)程序设计思想,而不是去“学习”各种古怪的工具。所有操作系统,数据库,Internet,以至于 WEB 的设计思想(和缺陷),几乎都能用程序语言的思想简单的解释。

先说说我现在对 Linux 和相关工具(比如 TeX)的看法吧。我每天上班都用 Linux,可是回家才不想用它呢。上班的时候,我基本上只是尽我所能的改善它,让它不要给我惹麻烦。Unix 有许许多多的设计错误,却被当成了教条,传给了一代又一代的程序员,恶性循环。Unix 的 shell,命令,配置方式,图形界面,都是相当糟糕的。每一个新版本的 Ubuntu 都会在图形界面的设计上出现新的错误,让你感觉历史怎么会倒退。其实这只是表面现象。Linux 所用的图形界面(X Window)在本质上几乎是没救的。我不想在这里细说 Unix 的缺点,在它出现的早期,已经有人写了一本书,名叫 Unix Hater's Handbook,里面专门有一章叫做 The X-Windows Disaster。它分析后指出,X Window 貌似高明的 client-server 设计,其实并不像说的那么好。

这本书汇集了 Unix 出现的年代,很多人对它的咒骂。有趣的是,这本书有一个“反序言”,是 Unix 的创造者之一 Dennis Ritchie 写的。我曾经以为这些骂 Unix 的人都是一些菜鸟。他们肯定是智商太低,或者被 Windows 洗脑了,不能理解 Unix 的高明设计才在那里骂街。现在理解了程序语言的设计原理之后,才发现他们说的那些话里面居然大部分是实话!其实他们里面有些人在当年就是世界顶尖的编程高手,自己写过操作系统和编译器,功底不亚于 Unix 的创造者。在当年他们就已经使用过设计更加合理的系统,比如 Multics,Lisp Machine 等。

可惜的是,在现在的操作系统书籍里面,Multics 往往只是被用来衬托 Unix 的“简单”和伟大。 Unix 的书籍喜欢在第一章讲述这样的历史:“Multics 由于设计过于复杂,试图包罗万象,而且价格昂贵,最后失败了。” 可是 Multics 失败了吗?Multics,Oberon,IBM System/38, Lisp Machine,…… 在几十年前就拥有了 Linux 现在都还没有的好东西。Unix 里面的东西,什么虚拟内存,文件系统,…… 基本上都是从 Multics 学来的。Multics 的机器,一直到 2000 年都还在运行。Unix 不但“窜改”了历史教科书,而且似乎永远不吸取教训,到现在还没有实现那些早期系统早就有的好东西。Unix 的设计几乎完全没有一致性和原则。各种工具程序功能重复,冗余,没法有效地交换数据。可是最后 Unix 靠着自己的“廉价”,“宗教”和“哲学”,战胜了别的系统在设计上的先进,统治了程序员的世界。

如果你想知道这些“失败的”操作系统里面有哪些我们现在都还没有的先进技术,可以参考这篇文章:Oberon - The Overlooked Jewel。它介绍的是 Niklaus Wirth(也就是 Pascal 语言的设计者)的 Oberon 操作系统。

胜者为王,可是 Unix 其实是一个暴君,它不允许你批评它的错误。它利用其它程序员的舆论压力,让每一个系统设计上的错误,都被说成是用户自己的失误。你不敢说一个工具设计有毛病,因为如果别人听到了,就会以为你自己不够聪明,说你“人笨怪刀钝”。这就像是“皇帝的新装”里的人们,明明知道皇帝没穿衣服,还要说“这衣服这漂亮”! 总而言之,“对用户友好”这个概念,在 Unix 的世界里是被歧视,被曲解的。Unix 的狂热分子很多都带有一种变态的“精英主义”。他们以用难用的工具为豪,鄙视那些使用“对用户友好”的工具的人。

我曾经强烈的推崇 FVWM,TeX 等工具,可是现在擦亮眼睛看来,它们给用户的界面,其实也是非常糟糕的设计,跟 Unix 一脉相承。他们把程序设计的许多没必要的细节和自己的设计失误,无情的暴露给用户。让用户感觉有那么多东西要记,仿佛永远也没法掌握它。实话说吧,当年我把 TeXbook 看了两遍,做完了所有的习题(包括最难的“double bend”习题)。几个月之后,几乎全部忘记干净。为什么呢?因为 TeX 的语言是非常糟糕的设计,它没有遵循程序语言设计的基本原则。

这里有一个鲜为人知的小故事。TeX 之所以有一个“扩展语言”,是 Scheme 的发明者 Guy Steele 的建议。那年夏天,Steele 在 Stanford 实习。他听说 Knuth 在设计一个排版系统,就强烈建议他使用一种扩展语言。后来 Knuth 采纳了他的建议。不幸的是 Steele 几个月后就离开了,没能帮助 Knuth 完成语言的设计。Knuth 老爹显然有我所说的那种“精英主义”,他咋总是设计一些难用的东西,写一些难懂的书?  谈 <wbr>Linux,Windows <wbr>和 <wbr>Mac

一个好的工具,应该只有少数几条需要记忆的规则,就像象棋一样。而这些源于 Unix 的工具却像是“魔鬼棋”或者“三国杀”,有太多的,无聊的,人造的规则。有些人鄙视图形界面,鄙视 IDE,鄙视含有垃圾回收的语言(比如 Java),鄙视一切“容易”的东西。他们却不知道,把自己沉浸在别人设计的繁复的规则中,是始终无法成为大师的。就像一个人,他有能力学会各种“魔鬼棋”的规则,却始终无法达到象棋大师的高度。所以,容易的东西不一定是坏的,而困难的东西也不一定是好的。学习计算机(或者任何其它工具),应该“只选对的,不选难的”。记忆一堆的命令,乌七八糟的工具用法,最后脑子里什么也不会留下。学习“原理性”的东西,才是永远不会过时的。 

Windows 技术设计上的很多细节,也许在早期是同样糟糕的。但是它却向着更加结构化,更加简单的方向发展。Windows 的技术从 OLE,COM,发展到 .NET,再加上 Visual Studio 这样高效的编程工具,这些带来了程序员和用户效率的大幅度提高,避免了 Unix 和 C 语言的很多不必存在的问题。Windows 程序从很早的时候就能比较方便的交换数据。比如,OLE 让你可以把 Excel 表格嵌入到 Word 文档里面。不得不指出,这些是非常好的想法,是超越“Unix 哲学”的。相反,由于受到“Unix 哲学”的误导,Unix 的程序间交换数据一直以来都是用字符串,而且格式得不到统一,以至于很多程序连拷贝粘贴都没法正确进行。Windows 的“配置”,全都记录在一个中央数据库(注册表)里面,这样程序的配置得到大大的简化。虽然在 Win95 的年代,注册表貌似老是惹麻烦,但现在基本上没有什么问题了。相反,Unix 的配置,全都记录在各种稀奇古怪的配置文件里面,分布在系统的各个地方。你搞不清楚哪个配置文件记录了你想要的信息。每个配置文件连语法都不一样!这就是为什么用 Unix 的公司总是需要一个“系统管理员”,因为软件工程师们才懒得记这些麻烦的东西。

再来比较一下 Windows 和 Mac 吧。 我认识一个 Adobe 的高级设计师。他告诉我说,当年他们把 Photoshop 移植到 Intel 构架的 Mac,花了两年时间。只不过换了个处理器,移植个应用程序就花了两年时间,为什么呢?因为 Xcode 比起 Visual Studio 真是差太多了。而 Mac OS X 的一些设计原因,让他们的移植很痛苦。不过他很自豪的说,当年很多人等了两年也没有买 Intel 构架的 Mac,就是因为他们在等待 Photoshop。最后他直言不讳的说,微软其实才是真正在乎程序员工具的公司。相比之下,Apple 虽然对用户显得友好,但是对程序员的界面却差很多。Apple 尚且如此,Linux 对程序员就更差了。可是有啥办法呢,有些人就是受虐狂。自己痛过之后,还想让别人也痛苦。就像当年的我。

我当然不是人云亦云。微软在程序语言上的造诣和投入,我看得很清楚。我只是通过别人的经历,来验证我已经早已存在的看法。所以一再宣扬别的系统都是向自己学习的 Apple 受到这样的评价,我也一点不惊讶。Mac OS X 毕竟是从 Unix 改造而来的,还没有到脱胎换骨的地步。我有一个 Macbook Air,一个 iPhone 5,和一个退役的,装着 Windows 7 的 T60。我不得不承认,虽然我很喜欢 Macbook 和 iPhone 的硬件,但我发现 Windows 在软件上的很多设计其实更加合理。

我为什么当年会鄙视微软?这很简单。我就是跟着一群人瞎起哄而已!他们说 Linux 能拯救我们,给我们自由。他们说微软是邪恶的公司…… 到现在我身边还有人无缘无故的鄙视微软,却不知道理由。可是 Unix 是谁制造的呢?是 AT&T。微软和 AT&T 哪个更邪恶呢?我不知道。但是你应该了解一下 Unix 的历史。AT&T 当年发现 Unix 有利可图,找多少人打了多少年官司?说微软搞垄断,其实 AT&T 早就搞过垄断了,还被拆散成了好几个公司。想想世界上还有哪一家公司,独立自主的设计出这从底至上全套家什:程序语言,编译器,IDE,操作系统,数据库,办公软件,游戏机,手机…… 我不得不承认,微软是值得尊敬的公司。

公司还不都一样,都是以利益为本的。我们程序员就不要被他们利用,作为利益斗争的炮眼啦。见到什么好就用什么,就学什么。自己学到的东西,又不属于那些垄断企业。我们都有自由的头脑。

当然我不是在这里打击 Linux 和 Mac 而鼓吹 Windows。这些系统的纷争基本上已经不关我什么事。我只是想告诉新人们,去除头脑里的宗教,偏激,仇恨和鄙视。每次仇恨一个东西,你就失去了向它学习的机会。

后记:“对用户友好”是一个值得研究,却又研究得非常不够的东西。很多 UI 的设计者,把东西设计的很漂亮,但是却不方便,不顺手。如果你想了解我认为怎样的设计才是“对用户友好的”,可以参考这篇博客

 

转自:

王垠博客

http://blog.sina.com.cn/yinwang0

 

 

本文章迁移自http://blog.csdn.net/timberwolf_2012/article/details/8699391

1.通用数据传送指令. 

MOV----> move 

MOVSX---->extended move with sign data 

MOVZX---->extended move with zero data 

PUSH---->push 

POP---->pop 

PUSHA---->push all 

POPA---->pop all 

PUSHAD---->push all data 

POPAD---->pop all data 

BSWAP---->byte swap 

XCHG---->exchange 

CMPXCHG---->compare and change 

XADD---->exchange and add 

XLAT---->translate 

2.输入输出端口传送指令. 

IN---->input 

OUT---->output 

3.目的地址传送指令. 

LEA---->load effective address 

LDS---->load DS 

LES---->load ES 

LFS---->load FS 

LGS---->load GS 

LSS---->load SS 

4.标志传送指令. 

LAHF---->load AH from flag 

SAHF---->save AH to flag 

PUSHF---->push flag 

POPF---->pop flag 

PUSHD---->push dflag 

POPD---->pop dflag 

二、算术运算指令 

ADD---->add 

ADC---->add with carry 

INC---->increase 1 

AAA---->ascii add with adjust 

DAA---->decimal add with adjust 

SUB---->substract 

SBB---->substract with borrow 

DEC---->decrease 1 

NEC---->negative 

CMP---->compare 

AAS---->ascii adjust on substract 

DAS---->decimal adjust on substract 

MUL---->multiplication 

IMUL---->integer multiplication 

AAM---->ascii adjust on multiplication 

DIV---->divide 

IDIV---->integer divide 

AAD---->ascii adjust on divide 

CBW---->change byte to word 

CWD---->change word to double word 

CWDE---->change word to double word with sign to EAX 

CDQ---->change double word to quadrate word 

三、逻辑运算指令 

─────────────────────────────────────── 

AND---->and 

OR---->or 

XOR---->xor 

NOT---->not 

TEST---->test 

SHL---->shift left 

SAL---->arithmatic shift left 

SHR---->shift right 

SAR---->arithmatic shift right 

ROL---->rotate left 

ROR---->rotate right 

RCL---->rotate left with carry 

RCR---->rotate right with carry 

四、串指令 

─────────────────────────────────────── 

MOVS---->move string 

CMPS---->compare string 

SCAS---->scan string 

LODS---->load string 

STOS---->store string 

REP---->repeat 

REPE---->repeat when equal 

REPZ---->repeat when zero flag 

REPNE---->repeat when not equal 

REPNZ---->repeat when zero flag 

REPC---->repeat when carry flag 

REPNC---->repeat when not carry flag 

五、程序转移指令 

─────────────────────────────────────── 

1>无条件转移指令(长转移) 

JMP---->jump 

CALL---->call 

RET---->return 

RETF---->return far 

2>条件转移指令(短转移,-128到+127的距离内) 

JAE---->jump when above or equal 

JNB---->jump when not below 

JB---->jump when below 

JNAE---->jump when not above or equal 

JBE---->jump when below or equal 

JNA---->jump when not above 

JG---->jump when greater 

JNLE---->jump when not less or equal 

JGE---->jump when greater or equal 

JNL---->jump when not less 

JL---->jump when less 

JNGE---->jump when not greater or equal 

JLE---->jump when less or equal 

JNG---->jump when not greater 

JE---->jump when equal 

JZ---->jump when has zero flag 

JNE---->jump when not equal 

JNZ---->jump when not has zero flag 

JC---->jump when has carry flag 

JNC---->jump when not has carry flag 

JNO---->jump when not has overflow flag 

JNP---->jump when not has parity flag 

JPO---->jump when parity flag is odd 

JNS---->jump when not has sign flag 

JO---->jump when has overflow flag 

JP---->jump when has parity flag 

JPE---->jump when parity flag is even 

JS---->jump when has sign flag 

3>循环控制指令(短转移) 

LOOP---->loop 

LOOPE---->loop equal 

LOOPZ---->loop zero 

LOOPNE---->loop not equal 

LOOPNZ---->loop not zero 

JCXZ---->jump when CX is zero 

JECXZ---->jump when ECX is zero 

4>中断指令 

INT---->interrupt 

INTO---->overflow interrupt 

IRET---->interrupt return 

5>处理器控制指令 

HLT---->halt 

WAIT---->wait 

ESC---->escape 

LOCK---->lock 

NOP---->no operation 

STC---->set carry 

CLC---->clear carry 

CMC---->carry make change 

STD---->set direction 

CLD---->clear direction 

STI---->set interrupt 

CLI---->clear interrupt 

六、伪指令 

───────────────────────────────────── 

DW---->definw word 

PROC---->procedure 

ENDP---->end of procedure 

SEGMENT---->segment 

ASSUME---->assume 

ENDS---->end segment 

END---->end 

 

转自:

reddragon1314的空间

http://hi.baidu.com/reddragon1314/item/2b93199dc0b12e15934f4145

本文章迁移自http://blog.csdn.net/timberwolf_2012/article/details/8681391

posted in 程序员之路 

2006年5月

算法是计算机科学领域最重要的基石之一,但却受到了国内一些程序员的冷落。许多学生看到一些公司在招聘时要求的编程语言五花八门,就产生了一种误解,认为学计算机就是学各种编程语言,或者认为,学习最新的语言、技术、标准就是最好的铺路方法。其实,大家被这些公司误导了。编程语言虽然该学,但是学习计算机算法和理论更重要,因为计算机语言和开发平台日新月异,但万变不离其宗的是那些算法和理论,例如数据结构、算法、编译原理、计算机体系结构、关系型数据库原理等等。在“开复学生网”上,有位同学生动地把这些基础课程比拟为“内功”,把新的语言、技术、标准比拟为“外功”。整天赶时髦的人最后只懂得招式,没有功力,是不可能成为高手的。

算法与我

当我在1980年转入计算机科学系时,还没有多少人的专业方向是计算机科学。有许多其他系的人嘲笑我们说:“知道为什么只有你们系要加一个‘科学’,而没有‘物理科学系’或‘化学科学系’吗?因为人家是真的科学,不需要画蛇添足,而你们自己心虚,生怕不‘科学’,才这样欲盖弥彰。” 其实,这点他们彻底弄错了。真正学懂计算机的人(不只是“编程匠”)都对数学有相当的造诣,既能用科学家的严谨思维来求证,也能用工程师的务实手段来解决问题——而这种思维和手段的最佳演绎就是“算法”。
记得我读博时写的Othello对弈软件获得了世界冠军。当时,得第二名的人认为我是靠侥幸才打赢他,不服气地问我的程序平均每秒能搜索多少步棋,当他发现我的软件在搜索效率上比他快60多倍时,才彻底服输。为什么在同样的机器上,我可以多做60倍的工作呢?这是因为我用了一个最新的算法,能够把一个指数函数转换成四个近似的表,只要用常数时间就可得到近似的答案。在这个例子中,是否用对算法才是能否赢得世界冠军的关键。
还记得1988年贝尔实验室副总裁亲自来访问我的学校,目的就是为了想了解为什么他们的语音识别系统比我开发的慢几十倍,而且,在扩大至大词汇系统后,速度差异更有几百倍之多。他们虽然买了几台超级计算机,勉强让系统跑了起来,但这么贵的计算资源让他们的产品部门很反感,因为“昂贵”的技术是没有应用前景的。在与他们探讨的过程中,我惊讶地发现一个O(n*m)的动态规划(dynamic programming)居然被他们做成了O(n*n*m)。更惊讶的是,他们还为此发表了不少文章,甚至为自己的算法起了一个很特别的名字,并将算法提名到一个科学会议里,希望能得到大奖。当时,贝尔实验室的研究员当然绝顶聪明,但他们全都是学数学、物理或电机出身,从未学过计算机科学或算法,才犯了这么基本的错误。我想那些人以后再也不会嘲笑学计算机科学的人了吧!

网络时代的算法

有人也许会说:“今天计算机这么快,算法还重要吗?”其实永远不会有太快的计算机,因为我们总会想出新的应用。虽然在摩尔定律的作用下,计算机的计算能力每年都在飞快增长,价格也在不断下降。可我们不要忘记,需要处理的信息量更是呈指数级的增长。现在每人每天都会创造出大量数据(照片,视频,语音,文本等等)。日益先进的记录和存储手段使我们每个人的信息量都在爆炸式的增长。互联网的信息流量和日志容量也在飞快增长。在科学研究方面,随着研究手段的进步,数据量更是达到了前所未有的程度。无论是三维图形、海量数据处理、机器学习、语音识别,都需要极大的计算量。在网络时代,越来越多的挑战需要靠卓越的算法来解决。
再举另一个网络时代的例子。在互联网和手机搜索上,如果要找附近的咖啡店,那么搜索引擎该怎么处理这个请求呢?
最简单的办法就是把整个城市的咖啡馆都找出来,然后计算出它们的所在位置与你之间的距离,再进行排序,然后返回最近的结果。但该如何计算距离呢?图论里有不少算法可以解决这个问题。
这么做也许是最直观的,但绝对不是最迅速的。如果一个城市只有为数不多的咖啡馆,那这么做应该没什么问题,反正计算量不大。但如果一个城市里有很多咖啡馆,又有很多用户都需要类似的搜索,那么服务器所承受的压力就大多了。在这种情况下,我们该怎样优化算法呢?
首先,我们可以把整个城市的咖啡馆做一次“预处理”。比如,把一个城市分成若干个“格子(grid)”,然后根据用户所在的位置把他放到某一个格子里,只对格子里的咖啡馆进行距离排序。
问题又来了,如果格子大小一样,那么绝大多数结果都可能出现在市中心的一个格子里,而郊区的格子里只有极少的结果。在这种情况下,我们应该把市中心多分出几个格子。更进一步,格子应该是一个“树结构”,最顶层是一个大格——整个城市,然后逐层下降,格子越来越小,这样有利于用户进行精确搜索——如果在最底层的格子里搜索结果不多,用户可以逐级上升,放大搜索范围。
上述算法对咖啡馆的例子很实用,但是它具有通用性吗?答案是否定的。把咖啡馆抽象一下,它是一个“点”,如果要搜索一个“面”该怎么办呢?比如,用户想去一个水库玩,而一个水库有好几个入口,那么哪一个离用户最近呢?这个时候,上述“树结构”就要改成“r-tree”,因为树中间的每一个节点都是一个范围,一个有边界的范围(参考:http://www.cs.umd.edu/~hjs/rtrees/index.html)。
通过这个小例子,我们看到,应用程序的要求千变万化,很多时候需要把一个复杂的问题分解成若干简单的小问题,然后再选用合适的算法和数据结构。
并行算法:Google的核心优势
上面的例子在Google里就要算是小case了!每天Google的网站要处理十亿个以上的搜索,GMail要储存几千万用户的2G邮箱,Google Earth要让数十万用户同时在整个地球上遨游,并将合适的图片经过互联网提交给每个用户。如果没有好的算法,这些应用都无法成为现实。
在这些的应用中,哪怕是最基本的问题都会给传统的计算带来很大的挑战。例如,每天都有十亿以上的用户访问Google的网站,使用Google的服务,也产生很多很多的日志(Log)。因为Log每分每秒都在飞速增加,我们必须有聪明的办法来进行处理。我曾经在面试中问过关于如何对log进行一些分析处理的问题,有很多面试者的回答虽然在逻辑上正确,但在实际应用中是几乎不可行的。按照他们的算法,即便用上几万台机器,我们的处理速度都跟不上数据产生的速度。
那么Google是如何解决这些问题的呢?
首先,在网络时代,就算有最好的算法,也要能在并行计算的环境下执行。在Google的数据中心,我们使用的是超大的并行计算机。但传统的并行算法运行时,效率会在增加机器数量后迅速降低,也就是说,十台机器如果有五倍的效果,增加到一千台时也许就只有几十倍的效果。这种事倍功半的代价是没有哪家公司可以负担得起的。而且,在许多并行算法中,只要一个结点犯错误,所有计算都会前功尽弃。
那么Google是如何开发出既有效率又能容错的并行计算的呢?
Google最资深的计算机科学家Jeff Dean认识到, Google 所需的绝大部分数据处理都可以归结为一个简单的并行算法:Map and Reduce(http://labs.google.com/papers/mapreduce.html)。 这个算法能够在很多种计算中达到相当高的效率,而且是可扩展的(也就是说,一千台机器就算不能达到一千倍的效果,至少也可以达到几百倍的效果)。Map and Reduce的另外一大特色是它可以利用大批廉价的机器组成功能强大的server farm。最后,它的容错性能异常出色,就算一个server farm里面的机器down掉一半,整个farm依然能够运行。正是因为这个天才的认识,才有了Map and Reduce算法。借助该算法,Google几乎能无限地增加计算量,与日新月异的互联网应用一同成长。

算法并不局限于计算机和网络

举一个计算机领域外的例子:在高能物理研究方面,很多实验每秒钟都产生几个TB的数据量。但因为处理能力和存储能力的不足,科学家不得不把绝大部分未经处理的数据丢弃掉。可大家要知道,新元素的信息很有可能就藏在我们来不及处理的数据里面。同样的,在其他任何领域里,算法都可以改变人类的生活。例如人类基因的研究,就可能因为算法而发明新的医疗方式。在国家安全领域,有效的算法可能避免下一个911的发生。在气象方面,算法可以更好地预测未来天灾的发生,以拯救生命。
所以,如果你把计算机的发展放到应用和数据飞速增长的大环境下,你一定会发现,算法的重要性不是在日益减小,而是在日益加强。

给程序员的七个建议

(1)练内功。不要只花功夫学习各种流行的编程语言和工具,以及某些公司招聘广告上要求的科目。要把数据结构、算法、数据库、操作系统原理、计算机体系结构、计算机网络,离散数学等基础课程学好。大家不妨试试高德纳所著The Art of Computer Programming里的题目,如果你能够解决其中的大部分题目,就说明你在算法方面有一定的功力了。
(2)多实战。通过编程的实战积累经验、巩固知识。很多中国大学毕业生缺乏编程和调试经验;学习C语言,考试过关就算学会了;课题项目中,只要程序能够编译,运行,并且输入输出满足要求就算了事。这些做法是不行的。写程序的时候,大家必须多想想如何把程序写得更加精炼、高效、高质量。建议大家争取在大学四年中积累编写十万行代码的经验。我们必须明白的是:好程序员是写出来的,不是学出来的。
(3)求实干。不要轻视任何实际工作,比如一些看似简单的编码或测试。要不懈追求对细节一丝不苟的实干作风与敬业精神。我发现不少程序员对于知识的掌握很肤浅,不求甚解,没有好奇心,不会刨根问底。比如,学会了C++,是否了解一个对象在编译后,在汇编代码中是如何被初始化的?这个对象的各个成员在内存中是如何存放的?当一个成员函数被调用时,编译器在汇编代码中加入了哪些额外的动作?虚函数的调用是如何实现的? 这些东西恐怕在编程语言或编译原理中都没有详细提到,只有通过踏实的实干才能真正掌握。
(4)重视数学学习。数学是思维的体操,数学无处不在。学计算机至少要学习离散数学、概率论、布尔代数、集合论和数理逻辑。这些知识并不难,但是对你未来的工作帮助会很大。 尤其当你对一些“数学密集型”的领域如视频、图像处理等有兴趣时,这些知识将成为你手中的利器。
(5)培养团队精神,学会与人合作。今天的软件工程早已经不是一个人可以单独操作的,而必须靠团队合作才能成功。不懂得合作的人是不能成大器的。大家要多去寻找可以与人一起做项目的机会。
(6)激励创新意识,培养好奇心,不要死记硬背。没有掌握某种算法技术的根本原理,就不会有应变和创新的能力。想成为一位好程序员(其实从事任何一个行业都是如此),重要的是要养成钻研,好奇,创新,动手,合作的优秀习惯,不满足于填鸭,不满足于考试交差,不满足于表象。这不是学几门课能够一蹴而就的。
(7)有策略地“打工”。在不影响学业的前提下,寻找真正有意义的暑期工作或兼职。去找一个重视技术的公司,在一个好的“老板”指导下完成真正会被用户使用的程序。不要急于去一个要你做“头”而独挡一面的地方,因为向别人学习才是你的目的。找工作也是一样,不要只看待遇和职衔,要挑一个你能够学习的环境,一个愿意培养员工的企业,一个重视你的专业的公司。最后,还要挑一个好老板。

希望大家都能把握机会,养成好的学习习惯,把算法学精学透;希望大家都能有一个美好的未来!

 

转自:

开复学生网

http://www.5xue.com/modules/kaifulee/view.article.php/21/c0

本文章迁移自http://blog.csdn.net/timberwolf_2012/article/details/8662854

posted in 程序员之路 

摘要:数学修养对软件开发之路起着什么作用?码农如何修炼自己的内功并成长为优秀的软件开发员?带着相关思考,社区之星第10期采访了中南大学副教授——刘伟。他对数学修养、设计模式、软件架构和重构方面的独特见解,相信会给众多码农和技术大牛带来新的收获。

导语:他虽然是一名大学老师,但却有着十多年软件开发和项目管理经验,他曾任职于湖南移动、创智软件园、NIIT(印度国家信息技术学院)和长沙创智新程教育技术有限公司等机构,也曾为多所高校、软件培训机构担任讲师和多家公司提供企业内训服务。另外他还主持和参与了30多个软件项目的开发工作,涉及教育、电子商务(政务)、企业EAI、移动通信等领域,此外他还致力于科研研究。正是这种复杂的多重经历,让他对软件开发有着独到的见解和心得,为此CSDN记者对这位学者兼技术人进行了专访,希望大家看完后能够对软件开发之路有全新的认识,尤其是对软件开发人员至关重要的设计模式、数学修养、软件架构和重构方面。

119_130116105437_1.jpg

刘伟,中南大学软件学院副教授,博士。中国计算机学会会员,美国计算机学会(ACM)会员,希赛教育集团企业内训讲师,新程教育集团顾问兼高级讲师,CSAI顾问团专业顾问及内训讲师。具有十多年软件开发、项目管理及IT教育培训经验,曾担任项目经理、系统架构师、软件工程师、IT培训讲师和高级讲师等职位。研究方向为软件工程与数据挖掘,目前正从事相关算法的研究与CASE工具的开发工作。著有:《设计模式》、《设计模式实训教程》、《设计模式的艺术——软件开发人员内功修炼之道》等书。同时也在编著新书《UML实用教程》和《C#设计模式》。

我与计算机的故事

CSDN:请和大家介绍下你及所从事的工作

刘伟:我现在主要从事软件工程和数据挖掘等领域的科研、教学和研发工作。具体工作包括:

  • 软件工程专业课程的教学工作:主要讲授《软件工程》、《设计模式》、《软件体系结构》和《电子商务与数据挖掘》等课程。
  • 软件工程和数据挖掘等领域的科研工作:注重理论研究与实际应用的结合,目前主要研究课题包括源代码自动重构、CASE工具研发、源代码中设计模式挖掘、软件度量等,目前承担的几项科研项目的研究工作,已得到包括华为在内的多家企业的关注并愿意参与其中。
  • 企业培训与支持工作:在周末和寒暑假,我会给一些企业提供需求分析、UML、设计模式和重构等技术培训,密切与企业联系,为企业项目开发提供一些指导,同时也为高校教学工作添加更多真实的企业案例,已经给多家公司提供过企业内训,反响都还不错。
  • 软件研发工作:时间允许的话我会承担一些软件项目的研发工作,目前正在从事一些CASE工具的研发工作。

CSDN:你并非计算机出身,是什么缘故促使你自学计算机课程?在学习上有什么心得可分享?

刘伟:严格来讲大学期间我并不是一名好学生,因为我没把时间和精力放在专业学习上,现在从事的工作也与大学所学专业没有关系,但我并不后悔,反而觉得大学四年让我更加清楚地知道自己想要什么,树立了更长远的目标,那几年也过得很充实,为之后的学习和工作奠定了很好的基础。

我大学本科学的是化学专业,不过从大一(1999年)开始就对计算机产生了极大兴趣,然后自学了所有计算机课程,大二开始在一些校办网站和软件公司兼职。在本科和研究生学习期间,我利用课余时间在多家软件公司兼职,也组织过团队在外面接一些项目。软件开发是极富挑战的创造性工作,我很享受那个集体力和脑力劳动于一体的过程,我想最根本的原因应该还是兴趣所在吧。

在大学期间,我对软件教育和技术推广也具有极大热情,2001年(19岁)开始在一些IT培训机构担任网页制作、SQL Server数据库等课程的兼职讲师,同时考取了高级程序员等证书,还获得了微软认证系统工程师和微软认证数据库管理员。

对于软件知识和技术的学习,我有以下几点建议,供参考:

  • 最重要的是兴趣:兴趣是可以慢慢培养,作为一名软件专业老师,我也有意识发掘并培养学生的兴趣,让学生喜欢上这个专业,然后再努力去学习研究,进而全面学习和掌握相关专业知识;
  • 其次是学习能力:IT知识更新速度非常快,一定要培养自学能力,我经常跟学生说:真正成功的大学教育并不在于教会学生多少东西,而是教会学习的能力,这种能力让大家终身受用。俗话说:授人鱼,不如授人以渔!只有不断学习,才能真正成为行业领袖和专家。在学习过程中,要善于利用互联网资源,不要把电脑和网络当做娱乐工具,而应该作为学习工具,经常访问一些IT网站,看一些行业新闻、博客和论坛等,多交流、多讨论和多虚心学习。
  • 多思考,多实践:软件工程是工程应用类专业,一定要多实践,有条件可以参与一些老师牵头的横向项目(企业项目),或者在不影响学习的情况下接点企业小项目做做(例如小网站或者小型的MIS系统之类),这样能力提升会更快,而且能够学到很多在课堂上学不到的知识和经验。

2010年我在CSDN博客上发表了一篇文章,《写给明天的软件工程师——感悟篇》,大家如果感兴趣的话可以看看。

CSDN:你微博中用“软件兴邦,教育利民!致力于中国软件教育“作为座右铭,想传达什么?

刘伟:这包含了我的人生理想,我现在的目标是成为一名一流的IT教育工作者,这里的IT教育是广义的,除了高校教育、企业培训外,还包括职业教育等,我觉得一个行业要能得到更好的发展,应该有一套成熟、科学、合理的人才培养体系。现在软件行业的地位和重要性毋庸置疑,前段时间我在博客中转载了一篇文章《软件应用无所不在 正吞噬整个世界》,现在软件已渗入到各行各业,而且很多传统行业已经离不开软件的支持,例如:零售、交通、出版、医疗、招聘、娱乐、电信、教育等等,还有很多行业本身就是依托于软件的,例如电子商务、在线游戏等。网景公司创始人、硅谷著名投资人马克·安德森的这篇文章中,他列举我们所面临的三大挑战第二条就是人才问题,软件行业缺乏大量能够胜任的软件工程师、经理、营销人员和销售人员,他指出只有教育才能解决这个问题。正因为如此,我觉得自己的选择是非常正确的,我也希望自己能够通过努力,成为一名优秀的软件教育工作者。“软件兴邦,教育利民!致力于中国软件教育”这句话也是用来勉励自己,希望自己能够不断研究和探索软件人才培养的规律和模式,以便更好地从事软件教育工作。

数学之美:程序员应有的数学修养

CSDN:一名优秀的程序员和他的数学修养有没有什么联系?它给程序员带来的最大帮助是什么?

刘伟:我个人觉得是有联系,而且关系很密切。数学作为自然科学之母,更多的是培养人的逻辑思维能力,是思维的体操。

我们要区别一下合格程序员和优秀程序员,合格程序员可以完成一些常规的代码编写工作,例如CRUD,这里确实用不到太多的数学知识,但是如果希望能写出高质量的代码(例如具有良好的时间复杂度和空间复杂度),或者参与一些技术难度较大的软件开发工作(例如涉及到构建数学模型的软件,如交通调度系统、与电子商务有关的数据挖掘系统、计算机模拟药物设计软件等),良好的逻辑思维能力是必须的,而数学正可以培养这种能力。

良好的数学修养将让程序员在设计和实现软件时思维更严谨、思路更开阔、考虑也会更缜密,有助于写出高质量的软件,还有利于参与一些技术复杂度较高的软件,这对于个人综合素质的提高和职业发展都很有帮助。我建议大家有时间看看数学书,做做数学题,你能够从中找到快乐!

CSDN:那程序员如何培养自己的数学修养?应该培养哪些数学修养?

刘伟:2012年有三本书卖得很火,它们是:腾讯副总裁吴军先生的《数学之美》、日本资深技术作家结城浩的《程序员的数学》和北大高材生顾森的《思考的乐趣:Matrix67数学笔记》。而购买者绝大部分都是IT相关人士,当然最多的还是程序员。由此可见,很多一线程序员都意识到有时间应该学学数学,看看数学书,培养自己的数学修养。这是好事,说明大家都在努力求进步,都在努力提升自己的综合水平。我也读完这三本书,收益颇丰。

2006年我在CSDN博客上发表了一篇题为《浅谈程序员的数学修养》文章,很多人发表了一些不同的看法和意见,当然我在这篇文章中所写的很多都是个人观点,难免会存在一些考虑欠周全的地方,但对于一名优秀程序员是否应该具备一定的数学修养这个观点我还是坚持自己意见,我认为是肯定的。那么如何培养自己的数学修养,我在《浅谈程序员的数学修养》一文中有提到,大家感兴趣的话可以看看这篇文章,另外我还转载了几篇与之相关的文章:《数学是成就卓越开发人员的必备技能》和《编程需要知道多少数学知识》,有一些不同的声音,大家都可以看看。

需要指出的是这里所说的数学修养并不是指数学知识,不是指你各种解题能力,这里所指的数学修养更多的是平时对数学知识的积累。比如适当做数学题来训练自己的思维、看有关数学书来丰富自己的知识体系,当你需要在工作中具体用到一些数学知识时,你可以很快地学习。数学修养的培养更多的是培养自己的逻辑思维能力,这对于一个优秀程序员是非常重要的能力,数学修养不等于数学知识,并不是看几本高深的数学书就能有好的数学修养,真正的数学修养的培养并不需要我们一定要掌握多少高深的数学知识,而是在平常的学习和工作中能够将数学知识和正在解决的问题联系起来。例如当你在设计一个电子商务系统时,除了传统的CRUD,你还应该考虑一下顾客行为分析、商品推荐、网站链接结构优化、广告投入策略、信息检索模型构建等,这里面也许就需要用到贝叶斯网络、粒子群优化、图论、 聚类和分类等与数学相关的知识,如果你具备很好的数学修养,平时也注意数学知识的积累,那么即使从头开始学这里的某些知识也不是难事。由此可见,对于一名优秀程序员而言,数学修养是必备的。

具体来说,数学修养的培养可以从算法分析和设计开始,深入理解一些经典算法的设计原理和实现机制,我认为算法是数学的一部分,是数学在计算机领域的应用,就像数学应用在材料、力学、经济学一样。另外,有空的话可以多做数学题和逻辑题,把这些习题当做一种逻辑思维练习,让自己思维更加活跃一点,Bob大叔(Robert C. Martin)称这种练习为卡塔(Kata),我建议大家有时间每天也做一两个卡塔,有些数学题可以不在纸上写,直接用程序实现也可以。另外,前面提到的那三本书也挺不错,建议大家有时间可以看看,权当一个入门,总之一定要认识到数学修养的重要性。对于那些正在或有志于数据挖掘、信号处理、图像处理和搜索引擎等工作的朋友,那数学的重要性就不多言了,大家都懂的。

IT人才培养

CSDN:在大学计算机专业课中哪些课程最难?你又是通过什么方式简单地讲解难点?

刘伟:大学计算机专业课中比较难的课包括离散数学、数据结构、编译原理、算法分析与设计等(来自同学反映),当然有的学校还开设了信息论与编码、数字图像处理、计算机图形学、计算机密码学、数据挖掘等,这些课跟数学以及逻辑思维能力或多或少有点关系,当然也因人而异。上述这些课程对于有些同学而言也并不难,但是跟软件工程、操作系统、计算机网络、计算机组成原理等课程相比,很多同学在学习这些课程时相对更加吃力。

这些课有些我也没有教过,在以前讲授数据结构、算法分析与设计等课时,如果遇到比较难的地方,我会首先利用一些图形和动画来分析其原理,先形成一个感性的认识,然后引入一些比较容易理解和通俗的实例来讲解,通过对具体问题的分析来逐步深入。特别是算法,不能为讲算法而讲算法,最好能够结合一些具体问题来分析,对于算法的本质需要讲透彻一点,但通常数学基础较好的学生可以快速消化这些知识,而数学基础相对较差的在学习过程中遇到的困难更大。因此,我有时候也会要求学生在课后做逻辑思维题,例如数字找规律、图形找规律、逻辑推理、简单的数学证明题等来训练一下思维能力,这其实也是在无形中培养自己的数学修养,通过一段时间的训练,有些同学确实有所进步,在思考问题时思路更开阔、更严谨,对算法的理解也更深入。

CSDN:你曾做过几年开发,后来为什么从技术人转为IT教育工作者?之前的工作对你现在有何帮助?在给高校学生上课之外,你还喜欢与企业交流,为什么?

刘伟:我个人对教育事业可以说是情有独钟,我出生于一个教师家庭,祖父、父亲、母亲都是教师,祖父和父亲是一所中学教师(祖父是老校长,父亲是现任校长),母亲是小学教师。从小就在学校长大,一直很喜欢把自己学到的东西传授给别人,这很快乐。在大三(19岁)时我就在IT培训机构担任网页制作、SQL Server数据库等课程的讲师,那时学生基本上比我大,但学习完之后,大家反应都还挺好,说我讲课思路清晰、内容很丰富、信息量大,能够学到很多东西,我想这方面还有点遗传基因吧。研究生阶段也在职业培训机构担任兼职讲师,硕士毕业(2006年)后在湖南移动、创智软件园上班,主要从事软件研发工作,还在NIIT(印度国家信息技术学院)、创智新程教育技术有限公司(原创智集团教育事业部)担任高级讲师,同时也担任几所高校的企业兼职教师,之后读博并在中南大学软件学院任教。从2001年开始都从事与IT教育相关的工作,之前是兼职,现在是全职。对于软件研发、软件职业教育、软件高校教育我都有涉足,正是这种特殊的工作经历,让我对IT人才的培养有更深刻的理解和认识。

在有过几年一线开发经验后,我发现自己最大的长处还是在于将一些知识用较为通俗的语言和实例传递给他人,这也是一名好教师,特别是IT相关教师应该具备的能力,因此,我陆续拒绝了很多国内外知名企业的Offer和多家猎头公司的邀约,在经过慎重思考后我已逐步将工作重心转移到软件教育上。另外我觉得中国的软件教育需要一批有过企业背景,也具有较好表达能力和感染力的老师,我自认为还是具备这些条件的。看到我的学生们能够进入一些一流的软件公司、做出一些优秀的软件,所带给我的成就和愉悦感,远比自己收获这些要大。

企业工作背景对我的教学工作非常有帮助,在教学过程中,我会结合一些企业真实项目实例来进行知识讲解,会结合我之前的一些工作经历讲授一些书本之外的知识,例如在讲解软件需求工程时,我会告诉学生我曾参与开发的一些项目是如何来获取需求的、对于不同的需求源我们做了哪些分析和考虑、采用了哪些需求获取手段、如何记录需求以及如何确认需求,跟学生讲我们当时遇到了哪些问题以及最后怎么解决的,还会穿插一些真实的小故事,让大家的学习过程不那么枯燥无味,而是充满好奇感和趣味性。正因为之前参与过那么多实际的项目,亲身经历过很多软件的成功与失败,也充分体会到过程的快乐与艰辛,才让我现在能够自信满满地站在讲台上,与学生们分享我的知识与经验。

为了不脱离企业,我现在仍然会经常与企业进行交流,我一直认为,一旦脱离企业实际需求,IT教育不可能培养出真正优秀实用的人才。一方面,我会在工作之余参与一些企业项目的开发工作,主要以顾问的形式参与需求分析、系统架构设计、技术评审等,尽自己的能力给一些企业提供指导,例如教企业如何实施Scrum、如何使用UML构建软件模型、如何对源代码进行优化和重构等。在提供指导的同时,我又可以将这些知识和经验传递给在校学生,让学生知道现在企业正在做什么、他们是怎么做的、遇到了什么困难、应该具备哪些知识才能胜任这些工作,我觉得这是一个良性循环,学生们学习了这些知识和技能之后在实际开发中就能够用上,而且学习过程本身也很好地切合了企业的需求,在一定程度上解决高校人才培养和企业实际需求脱节的问题。当然,我现在所做的还是一个探索性的工作,也希望这项工作对于我国高校软件人才的培养有一定的参考价值。另一方面,我也在分析企业的一些需求,例如,有些企业员工因为工作压力大、项目进度紧等原因,无法静下心来学习一些新知识,于是我会将这些知识整理好,用较短的时间和较为通俗生动的方式传授给他们,我觉得这也是IT教育很重要的一个组成部分,教育是贯穿一生的,活到老,学到老。

与企业交流让我了解到企业对人才的需求,能够为我的教学工作提供更多真实案例,同时我也能够为企业开发人员提供一些指导和培训,此外,我个人的知识和经验也在不断累积,有助于我更好地从事软件教育工作。

CSDN:现行的软件人才培养体制有哪些缺陷?你认为该如何改进?

刘伟:关于现行软件人才培养体制,我个人也有一些自己的意见和建议,下面我谈几点自己的看法吧。

  • 培养目标问题。做科学家好还是工程师好?研究型大学是不是不应该培养工程师?研究型大学如何培养工程师?现在很多985和211高校的口号都是建设国内一流的研究型大学,老师们都全力去做科研,而工程类专业,特别是软件工程又是以培养工程应用型人才为主,如果老师们都将精力用于做科研了,谁来培养工程师?怎么培养工程师?而且没有实际的项目开发经验,只是照本宣科,停留在纯理论的教学中,如何能够培养出合格的工程师?我个人觉得工科大学本科教育(工程类专业)应该还是以面向应用工程型为主,如果希望当科学家,应该是在硕士,特别是博士教育中。随着工程硕士规模的扩大,很多人硕士毕业之后还是当工程师。如果有志于当科学家的同学,应该从本科就做好准备,打下良好研究基础,学好数学、英语和一些基础理论课程,最好能够把算法、计算理论、编译原理、形式化方法、数据挖掘、计算机图形学等知识学好,为做科学研究打下基础,如果有机会的话,可以提前和老师们一起参与一下科研项目的研究,了解一下科研的流程,说不定还能够做出点啥科研成果。而对于大部分想做工程师的同学而言,软件开发类课程就非常重要了,无论是编程、分析设计、架构还是测试,以及数据库、操作系统、数据结构等基础课都是成为一名优秀工程师的基础,如果有机会,做做实际的应用型项目(不是停留在课程设计或者项目实训等模拟项目上),那帮助就更大了。在大学阶段有一个比较明确的职业规划,对于同学们的成长确实有很有帮助,虽然这个做起来有点难度。
  • 课程体系的建设问题。这也是软件工程教育的一个核心问题,它对应于一个怎么做的问题,软件工程专业的课程体系要兼顾多方面,因此一套完善合理的课程体系需要不断调整和优化,这样难免会有一些同学会成小白鼠,但是这是人才培养道路上必经的一个过程,还望做过小白鼠、正在做小白鼠和即将成为小白鼠的同学们理解。一套科学合理的软件工程课程体系,我认为至少要考虑如下两个方面:用人企业的需求(分析用人企业所需的技能和技术,结合企业的招聘启事,请企业专家参与评审课程体系,包括课程的培养目标、先后顺序、教学大纲和实验安排等)、人才的长远发展(我们不能只是培养码农,需要培养出能够具有更好发展前景的软件人才,因此除了编码类课程,还需要开设需求、分析、设计、架构、测试和项目管理等课程)。对于教育工作者,人才是产品,用人单位是客户。我们都希望能够培养出高质量的产品,满足客户的需求,做到三方共赢!
  •  教学与实践课时分配的问题。软件工程是一个重实践的专业,必须要多实践,重点培养实践能力,许多高校都在压缩教学课时,大量增加实践课时。但是现在有一个很重要的问题是很多学校的教学资源不足,不可能所有的课都在机房上。大家经常会提到一个“做中学”的问题,对于软件人才的培养,确实需要增加实践课时,我个人觉得如果网速足够快并提供合适的在线项目开发和管理平台,有些练习和项目完全可以在宿舍完成。教学课时没有必要开设那么多,我始终还是坚信那句话:大学教育更多是培养大家学习能力,而不是学习知识本身。
  • 师资问题。作为软件工程专业的教师,必须不断更新自己的知识体系,需要至少在某一个或几个领域与最新技术接轨,每年应该也要实时充电,让学生们能够在学校就学到一些前沿知识。对于有些知识的学习,老师的理解能力和消化能力还是要强于学生,毕竟对行业和专业的了解更为全面和系统。我个人的观点是,作为从事软件工程一线教学的教师,应该有目的地提升自己的实际项目开发能力,不断学习新知识,“一门课上到退休”对我们来说并不适用,也不应该是这样。作为一名软件教育从业者,我要求学生要努力学习,学会自学新知识与技能,同时我也需要不断学习,只有这样,我自己也才能实现成为一流IT教育工作者的梦想。
  • 高校与企业联合办学的问题。与企业联合办学是目前很多高校在培养软件人才时采用的一个重要的手段,这样一方面可以让学生学到一些企业实用技术,另一方面可以缓解师资不足的问题。学生也特别希望能够有一些企业老师来讲课,学习到更多实用的技术和经验。我想我的课之所有学生们喜欢,跟我之前有过几年项目开发经验有很大关系。但是在校企联合办学过程中,地域因素也不得不考虑,例如在北京,如果要找一流的测试专家给某个高校上软件测试的一些课程,可以找中国软件评测中心或国家信息中心软件评测中心,但是有很多二线、三线城市的高校就没有这么便利的企业教学资源,应该建立一个校企合作的平台。我觉得校企合作是一个对三方有利的方式,对于学生和学校的好处不用多说,对于企业而言,可以从中选拔优秀的潜在员工,还可以宣传自己的企业和产品,同时带来新的赢利点。很多国内外知名软件公司就成立了专门的校企合作部门,已经嵌入到师资培训、学生培养、实习生安排和社团活动等多个环节,并取得了不错的效果。

当然,还包括不同层次的学校人才培养的差异性问题、软件工程硕士培养问题、不同方向(开发、测试、互联网营销等)的软件人才培养问题等。每一个问题都可以作为一个专题讨论,恕本人才疏学浅,也不妄加评论了,以后有机会再跟大家进一步交流。以上很多观点都来自我2012年12月份写的一篇博文《如何培养软件工程人才——参加“第一届高等学校软件工程人才培养高峰论坛”有感》,欢迎大家一起交流和讨论。

转自 http://www.csdn.net/article/2013-01-15/2813690

本文章迁移自http://blog.csdn.net/timberwolf_2012/article/details/8621030

posted in 程序员之路 

我曾在2006年冬天接触到王垠的三篇文章:《完全用linux工作》、《写给支持和反对<完全用Linux工作>的人们》、《清华梦的粉碎--写给清华大学的退学申请》,今天巧合又再次读遍,于是决定把我找到的关于王垠的信息总结一下。

1. 以前——清华退学前

7BAD496B2472C79D38CC9D5BF0615C32_400_300.JPEG

王垠是高考发挥失常进入四川大学计算机系,为97级(据此推测他是79、80生人);01年直接报送到清华大学计算机系软件所硕博连读,主要进行集成电路布线算法的研究。

2004年8月左右[1],王垠完成了《完全用linux工作》、《写给支持和反对<完全用Linux工作>的人们》,痛陈windows弊端、宣扬linux,但自己后来也承认是“义愤填膺”之作,“自己都感觉到偏激”[2],文章在中国的计算机和linux阵营引起极大轰动效应,成为水木清华liunxapp版和中国多个linux社区的偶像级人物。

2005年,王垠为第一作者的论文参加IEEE/ACM Asia andSouth acific Design Automation Conference (ASP-DAC 2005)国际学术会议获得Best Paper Award [3]。但紧接着,9月22日,还差一年博士毕业的王垠在水木社区BLOG上发表了《清华梦的粉碎--写给清华大学的退学申请》明确要求退学 [4]。

对于此次退学举动,川大的老师表示...父母...。[5]。

2. 清华退学后——今

06年8月,从清华退学后王垠考GRE出国到了康奈尔大学计算机系 [6];然而,王垠仍有一篇博文抱怨他在Cornell的遭遇 [7]。而后从Cornell退学[8],又到印第安纳大学伯明顿分校(IUB [9])计算机继续博士学位的至今在读 [10]。根据其在IUB的主页,王垠现在的研究方向和兴趣是程序语言方面,另外也对数据库和操作系统感兴趣。王垠在08秋、09秋和10春任教《软件系统导论》,11年秋任教《数据库概念》,应该没有公开的论文发表。

以下是分不同段落引用一些不同的评价:

(对于王垠在Cornell的遭遇)“这人理想中的科研是十八十九世纪贵族的科研,与当今科研民工的现实完全脱节。所以出国前国外留学生界也普遍不看好他,结果真的如此。”[11]

”偶然得知原来与王垠有过一面之缘,在清华的时候看过他玩滑板,记得他还买了瓶水给我喝,更加关注关于他的评论。他是那么谦和、阳光,不是别人想象中的偏激、清高。他只是很清楚自己需要什么,自己该怎样才能过自己想要的生活,才能最大限度地实现自己的价值。或许他该隐藏一些事实,让清华依然成为芊芊学子朝圣的地方。就象我们的高考作文,必须要有个积极的结尾,才有高分。“ [12]

”我隐约感到王师兄很难去一个他理想中的研究环境。不是美国的教育体制没有以前优秀了,而是这么多年来,自费申请国外奖学金的学校,还有老师,都不是最优秀的。就算是是最好的学校如,mit ,还有最好的导师,他也不可能把最好的资源给从中国来的留学生的。说白了,这些年,通过GRE出国的,基本上是给导师当助教的,帮老师打工的,比国内的顶尖学校的优秀老师好不了多少。“ 

”很多人都等着你失败呢。“  [13]

3. 一个王垠的同学的想法

此章节全文来自http://bbs.tsinghua.edu.cn/bbstcon.php?board=MS&gid=58706,来自王垠提到的计算几何合作满分合作者王益,我觉得这篇应该全文转载。

王垠的退学申请引起了很多人的讨论,其中不乏生活在王垠身边的同学。看了王垠的长文中对他自己心灵历程的回忆,看了大家从各个角度发表的意见,作为王垠的同学和朋友,这些天我也一直百感交集,现在总结了三点,想跟大家说说。

首先,水母上对这件事情的主流反映是让人觉得充满关心和理解的,有些甚至温暖得让人感动的。也有不理解的意见,我觉得正常,毕竟这确实是件很突兀的事情。不管怎样,我期待我们的社会和教育体制对王垠和他的老师们能体现出更多的理解和关怀。

(一) 从王垠的角度说

看过王垠的退学申请的人会知道,王垠是个理想主义者;而我们大多数人其实是机会主义者,寻求survival。我以为两类人都值得敬佩:机会主义者是社会主流,实际上起勤恳的工蚁的作用,是社会进步的主力;理想主义者是少数,像指方向的灯塔。有的灯塔方位不对,有的灯光暗淡,不能给人信任感,但无论如何,这世界不能少了灯塔 ── 总要有人说说他们的梦想,也许就是这世界应该发展的方向吧。理想主义者要说什么就让他说呗 ── 如果说对了,是对大家都有价值的;如果说错了,自有时间来证明。有什么好反驳和压制的呢?对吧?

王垠不仅是理想主义者,他是个天才,天才不是全才,天才在他不天才的方面比常人更柔弱,更需要关心。 我以为天才不一定是指天生的才,仅仅是指在某方面比较出众的人。作为王垠的 朋友,我们经常在一起讨论问题(那个计算几何大作业算其中之一吧),也作为一个在清华计算机系学习了4年多的直播生,我想我可以负责任的说,王垠的思维速度、深度、和广度;探索的欲望、求知热情、持之以恒的精神;动手能力;以及在数学和计算机科学上的潜力都比咱们清华计算机系很大一部分同学强。(我感觉王垠那篇获奖论文远不足以说明其才能。也请大家相信我不是只以paper 论英雄的人) ── 你说你在某个方面比王垠更强?那好阿。你也是天才!── 我想这也是王垠的老师们在学术方向选择上一再放任他的原因(这点我了解,是事实)。 但是天才不是全才 ── 当他们在一方面投入绝大部分精力的时候,在其他方面必然的技不如人的。图灵处理不好同性恋男友的关系,霍金会对朝夕照顾他的妻子无端发脾气,爱因斯坦管不好生活费,诸葛亮不能收拢人才造成蜀中无大将的局面。。。 难道因为这些缺点就应该骂他们一顿,让他们辞职下岗,羞愤隐居吗?如果当年他们身边的人这么作,历史恐怕会变得更悲哀一些;如果我们今天这样作,中国恐怕永远也不会有诺贝尔奖得主,不会有开明的政治家了。

我、和我们2001级直播生中很多同学都知道,王垠在处理人际关系方面很单纯、不上路,有时不能理解别人。在我们生日节日的宴席上、一起出去喝酒唱歌的时候、确实有过尴尬出现。我们都会跟王垠说,希望他能改。但是就象王垠不强迫我们跟他一样理想化一样,我们也从不觉得必须让他按照我们的处事标准生活。

我个人以为,如果觉得一个朋友值得我关心,那我就关心他帮他。不能也不必求回报。更不能因此要求他改变什么。批评应该是建议的形式、是尽我的责任。听与不听是他的事。毕竟谁也不可能改变别人的原则、也没有资格、没有必要这么作。我想王垠身边朋友不少,大家应该和我的想法差不多。如果更多的人能这样理解和包容王垠、理解和包容我们身边所有有才干的“不完美者” ── 我们的社会就更和谐、更完美了。

(二)对王垠的老师们

王垠的老师们更需要大家的理解。王垠的文章容易让人误以为他对他的老师们有很大意见。但是我想强调的是:我对这件事的了解比大多数同学多一些,从王垠这两年来跟我聊的情况看,我从来不觉的王垠是对老师个人的意见(即使在他的这篇文章中有冲动的话)。像前面有id是university的兄弟总结的,王垠的意见是一个完美主义者,理想主义者,对体制中瑕疵的不满的表达 ── 对事不对人。 

我跟大家说说从我的角度了解的一些情况:

王垠的导师是计算机系一位很有爱才盛名的老教授。在和王垠商量的情况下,数次容许王垠改变研究方向,去作不是他们实验室的研究方向。前天(王垠的文章被转载后的第二天)我的一个博士后师兄就专门写信说到老师爱才的事实例子,希望我传劝王垠。 王垠的副导师和实验室内外的很多同学关系都不错。 今年春天他专门将自己的交流机会分出一部分,帮王垠联系了去香港交流,希望王垠能看到他们实验室的研究方向中的一些引人之处。 今年夏天,计算机系博士生论坛时,王垠跟一位系领导谈起一些他看到的教育行政管理方面的不足。这位老师很坦诚很认真的和王垠讨论,几乎到交头接耳,还爽朗的笑道:“这个你怎么才发现阿?”。王垠得到开导后很高兴很兴奋,说老师真是实在人。半年前,当另一位系领导得知王垠数次改变研究方向后,专门请负责研究生工作的一位年轻老师向王垠身边的同学了解情况,帮王垠想办法。这位年轻老师向我了解情况的时候非常诚恳,让我都觉得很感动。还有,当时给我们上课的一位老师,在王垠寻找研究方向的过程中一直寄予帮助和指导、在王垠不开心的时候一贯坚持理解和鼓励。当王垠告诉我这些情况时。。。还是感动。 当这些老师们作这些很实际的工作的时候,都是默默无闻的,他们没有把这些放上网去让人转载。 我觉得不公平。 我说出来,希望大家知道,这样对问题的了解更全面。

但是不管怎样,今天中国的总体学术环境和学术氛围达不到王垠的理想要求。在某些方面不如国外合理。我对此也有过很多想法。我想这些情况,老师们比我们学生了解的更深刻。这样的问题不是一个老师就能改变的。但是让我感到很开心的是,我看到的这些最能干最值得钦佩的老师们,在王垠的理想化意见面前表现出的充分的理解、包容、耐心、实事求是、不避讳问题的态度,让我对清华、对中国的教育制度的完善变得很信心。

(三)我对此事的态度

1、学生退学是很正常的事情。人各有志。可以理解。

2、客观的说,王垠写这篇文章时是处于冲动的状态下的。其语言不客观、不能做到对老师们基本的理解. 对帮助过他的老师们是有伤害的。我希望大家能给王垠一个平静心情的时间,一个反思的缓冲.  希望王垠能有机会向老师们说一声"对不起".

3、清华的校训是崇尚“行胜于言”的。既然有个理想主义者在说问题,那我们倒是可以看看是否真有这些问题。主动去找问题,不回避问题,有则改之,无则加勉,寻求改革之道 ── 是以谓之“自强不息”;实事求是,不全盘否定,不因噎废食,寻求最佳的改革方案 ── 是以谓之“厚德载物”。

4、从王垠的角度来说,完善自己不完善的一面是很重要的。即使是天才,他的生存也主要靠自己。不能体谅他人、不能理解他人、是不可以的。

5、人非圣贤,孰能无过。希望王垠能在完善自己的同时,继续坚持人生的目标。才真能不辜负老师们默默的培养努力和承受的不公。 

4. 王垠的相关链接

王垠在IUB的个人主页:https://www.cs.indiana.edu/~yw21/

王垠的open source:https://github.com/yinwang0

王垠的flickr:http://www.flickr.com/photos/wangyin/

王垠03年前的个人主页(清华不保存毕业生的主页,所以原版已经查不到,这是其复制版本):http://docs.huihoo.com/homepage/shredderyin/index.html

王垠04年、05年的live空间(由于live空间停止服务,已经失效):http://spaces.msn.com/members/shredderyin

有意思的是:从huihoo的备份里面我们能找到王垠收集的几条有趣言论,包括这一条:

There are three kinds of mathematicians: those who can count, and those who can't.
--- folklore

以及归类到MyDreams的Computer Science Common Room的简单设想。

5. 其他相关话题

贺卫方停招研究生

陈丹青出走清华

6. 参考资源

[1] 据下面的链接,《写给支持和反对<完全用Linux工作>的人们》写于2004.8.26,《完全》一文则不详:http://hi.baidu.com/southhill/blog/item/6227f063f82627d5e6113a66.html
[2] 见《写给支持和反对<完全用Linux工作>的人们》
[3] http://www.beelink.com.cn/20051018/1954753.shtml
[4] http://forum.ubuntu.org.cn/viewtopic.php?f=112&t=330553&p=2447194 
[5] ...
[6] 康奈尔大学(英文:Cornell University)是一所位于美国纽约州伊萨卡的私立研究型大学,另有两所分校位于纽约市和卡塔尔教育城,是著名的常春藤盟校成员。来自百度百科:http://baike.baidu.com/view/30250.htm
[7] 详见后附原文。
[8] 博文《MS or PHD?》 http://phillips.blogbus.com/logs/54228967.html
[9] 印第安纳大学创建于1820年,是美国阿巴拉挈亚山脉西部最古老的大学之一,在全国共有八个分校,分别是:Bloomington, Fort Wayne, Gary , Indianapolis, Kokomo, New Albany, Richmond和South Bend。赖在百度百科:http://baike.baidu.com/view/1628363.htm
[10] 其个人在IUB的主页INTRODUCTION对自己的介绍是PhD student。

[11] 百度知道:清华退学博士王垠后来干什么去了?http://zhidao.baidu.com/question/158174440.html
[12] 百度贴吧:读<清华梦的粉碎-写给清华大学的退学申请书>有感的回复:http://tieba.baidu.com/p/47435139
[13] 百度贴吧:王垠又开始骂康奈尔大学了的回复:http://tieba.baidu.com/p/346587208

 

附:王垠《Cornell 感受》原文

来自:http://bbs.sciencenet.cn/forum.php?mod=viewthread&tid=6505,这不是作者主页,但是能找到为数不多的原文拷贝。

=======================================================

http://shredderyin.spaces.live.com/blog/cns!73FF08D72187CE2E!5259.entry

Cornell 感受(1)

早就有人问起我的学习情况,问我有没有找到理想的研究环境。我却总是弄一些小动物,要不就是好玩的内容在这上面。真是惭愧,因为一直觉得自己还没有什么发言权,一直觉得是不是自己搞错了。不过来了 Cornell 已经一年半,也可以说一下对美国教育的感想了。我的感觉可能是错的,或者局限于我的专业或者学院。不过总的感觉就是,美国教育其实很大部分是商业性的应试教育,而外国研究生基本上是用来骗本科生钱的廉价劳动力。本科生能学到的真东西,相对于他们交的学费,也是少而又少的。巨大的作业和应试压力,已经剥夺了学生思考的自由,真正潜心研究的环境是很难求的。

还是让我慢慢的回忆一下这一年半的经历吧……

2006 年的8月3号,我们经过20多小时的飞行,来到了 Ithaca。面对这个小山村,我们是非常新奇的。这里的夏天是如此的美,到处是绿草,到处是瀑布,自来水都是可以直接喝的,房间里全都有地毯。貌似一切都是那么的美好,人都是那么的有礼貌。刚走到人行道边上,路上的汽车就缓缓停下来,让行人过马路。路上遇到一个不认识的人,他会莫名其妙跟你打招呼,说: “Isn't it beautiful?” 总之 Ithaca 的美是不用多说了的,居民的总体素质还是比较高的。不过很快,这种新鲜感就随着在 Cornell 遇到的各种事情消失了。Cornell 给我的第一印象就是非常差的。

其实正式开学是在20多号,我们之所以这么早的来,原因是需要参加一个所谓 ITADP Summer Program。ITADP 也就是 International Teaching Assistant Development Program,也就是对 TA 的培训。这个培训是强制性的,不参加就不能做 TA,也就得不到经济支持了。我们连时差都还没倒过来就参加这么一个课程,每天从上午9点到下午3点。我也不记得申请 Cornell 的时候他们提到过这个东西,而是在接受了 offer 之后才收到一封信,说要所有外国TA参加这个培训。没想到 Cornell 的印象就从此在我心中一落千丈。

首先,经过培训的,或者仍然在接受培训课程煎熬的中国同学,我们都痛恨这个东西。我们得出的一致结论就是,这个培训对提高英语水平的效果是微乎其微的,纯粹就是浪费时间和精力。夏天的培训只有一个星期,分小班进行,在培训的末尾老师会进行评定。如果不通过,就需要强制性的修一期的课,叫做 EDUC 578。EDUC 578 期末会有一个评定,如果不通过,就需要修 EDUC 579。接着是 EDUC 580, ... 课号换了,但是课程的内容基本没有换,不断反复,无聊之极。总之,这个课耗费大量精力,影响学业。中国学生大多都对这个课程叫苦不迭。很多人都把牢底坐穿了,上了两年还没有通过。如果真能留下来,那还算不错的,各个系情况不一样。我认识有一个电子系的博士生在第一期评定没有通过就被取消了经济支持,他只好自己掏钱转成了计算机系的硕士。

再来看看这个课程的性质呢?我还深刻的记得在 Summer Program 的时候,ITADP 的主要负责人给我们讲的话:“You know why you are here? ... You know how important the undergraduate students are to us? You might even find a prince or princess in your class one day, from another country! ” 那个语气呀,就跟大老板差不多。我们是Ivy!是贵族学校!这不是很清楚的暴露了我们的用途吗,是为本科的“公主”和“王子”们服务的。后来我听说,的确是这样的,这个 ITADP 就是在本科生家长的强烈要求下成立的。而王子和公主们,可能还是没有得到他们想要的。

这个课是不可以旷的,旷课两节就会 fail 掉,从而取消 TA 的资格。这个课也是不可以迟到的,否则老师在下课的时候会警告你,要是再迟到就会给你 fail。这个课的规则是如此的严格,真是非常特殊。没有任何专业和非专业的课程有如此的军事化管理。再来看这个课程是什么内容。其实主要的内容就是告诉大家什么是好的 teaching,什么是坏的,大多都是废话。我记得在讨论教育的时候我提到,一个好的老师应该引导学生去思考,告诉他们知识是怎么获得的,而不是把知识灌输给学生;应该减轻学生的压力,鼓励他们创新。结果老师对我的这些说法很木然。很显然我的说法,她丝毫没有预料到过。她所期望的只是写黑板时字不要写得太小之类的。

然后我们做很多所谓的 microteaching 练习。microteaching 就是在课堂上对其他参加课程的同学讲授一些自己专业上最基本的常识。拿我来说吧,我第一次讲的内容就是二叉树。这个练习有一定的好处,就是让我明白了其实很多时候老师认为学生明白了,其实老师只知道自己明白了,而不知道学生其实是不明白的。但是我后来发现,对于 Cornell 的本科生,基本是没法知道他们是否明白。不论是我讲课,或者我和本科生一起听课,很普通的情况是这样:老师经过一段精彩的讲述之后,问:“你们明白了吗?”没有人吭声。再问:“有人没有明白的请举手。”也没有人举手,一片寂静。老师无可奈何,只好继续讲下去。总之,大家都以为别人都听懂了,都很害怕别人笑话自己不懂,感觉非常像国内的高中。不过总的说来,microteaching是很费精力的。讲一两次还行,反复的做就很烦了。课程的另一个内容是对自己的话进行录音,每次10分钟以上,一个星期三次,必须及时提交给老师评语。这个对于英语有一些帮助,不过费时间太多了,为了那10分钟,经常需要准备一两个小时。而且经常找不到有趣的话题,所以觉得很无聊。

因为第一期的时候,系里有一个教授碰巧给我一个 RA ,所以我没有参加 EDUC 578 (当然,像所有中国学生一样,我夏天的评定是没有通过的),所以第二期的时候我才被迫参加了这个课程。每个星期这个课程都耗费我太多的精力,以至于我在第二期的时候选的唯一的一门理论课后来没有精力完成。一方面这也是由于教课老师的问题,他只会在黑板上写定理……证明…… 所以后来我drop掉了那门传说中的牛人讲的课程,导致第二期就只修了 ITADP 的课程。一个系里都不认为是课程的课程,就这样占用了我一学期。

幸亏我表现还好,每次都貌似很积极的样子,很配合老师,其实心里在骂这个 program。同时我也比较同情老师,因为她也是打工的,讲了这么久这个课也觉得有点无聊了,虽然她没有直说 ;-) 所以很幸运的在期末勉强通过了评定,以后就再也不用上那个可怕的课了。不过还有不知道多少中国学生仍然在经受 ITADP 的煎熬……

http://shredderyin.spaces.live.com/blog/cns!73FF08D72187CE2E!5261.entry

Cornell 感受 (2)

再谈一下本科教育吧,因为我感觉“王子”和“公主”其实挺苦的,跟在中国上高中差不多。因为Cornell本科生太多,有两万多人,而每个人都可以选修任何一门基础课,所以经常人满为患。我第一学期做 CS 100m 的 TA。100m是一门最基础的编程课,前一半讲授 Matlab,后一半讲授 Java。天知道 Matlab 怎么被当成“编程语言”来教了,以至于在后一半的时候学生还经常继续被 Matlab 误导,用那种思维方法来写 Java。不过现在100m已经去掉了Java的内容,变成了纯 Matlab 的课程。要学 Java 就去上 100j.

那一期总共登记的学生有280多个,课堂我第一堂课去过一次,教授让我们去跟学生们见个面。结果只去了两个TA,一个大礼堂坐满的人,教授差点都不知道我在那里。学生们都很懵懂,所以老师讲什么基本上没有什么关系。因为基本没有什么互动,所以感觉还不如用个摄像机拍下来,这样学生一遍看不懂还可以倒回去再看。不过我知道他们不会那么做的,要不然大家都不来上课了。

我们总共有9个TA和十来个本科 consultant,负责批改作业,试卷和答疑。编程作业是两星期一次,期中考有两次,期末考一次。每次作业提交之后,大家都会马不停蹄开始组织批改。那三次考试就更加军事化了,每次都是当堂闭卷考试,一个大礼堂楼上楼下全都坐满。考考考啊…… 监考完之后,大伙就按姓名字母把试卷分批收上来,然后“押送”到一个房间开始流水作业。在黑板上画一个流程表,改完一个字母就在上面画一个X。一般会从晚上9点半一直弄到半夜一两点钟,才能完成任务。

我改作业都很慈悲,不忍心为了一点小错就扣分。如果思路是对的,我就不会扣很多分。但是不是所有 TA 都这么好,有些特别刁钻,会想方设法把分扣下来,以显示自己比别人懂得多。如果要求重判分数,还需要提交书面申请。很多高年级课程居然还会课堂点名,有些每星期都有一次作业,需要在课堂当堂交作业,如果迟交就会被拒绝接受,没有商量。有些交作业需要把每道题分开放在不同的信封里,这样他们方便分给TA,每个人只改一道题。一切都机械化了。所以本科生基本上生活在作业,考试与分数的恐惧之中。这样的环境下,所谓的西方 critical thinking,只不过是一个笑话。这种待遇是我在川大都没有遇到过的,现在比较一下,川大才算是真正的大学呀 ;-)

每学期中和学期末都有学生对 TA 的评定。会对各方面进行打分。不过从来没见过这个分数起了什么作用就是。另外据说 Cornell 对本科生有各种奇怪的隐性收费的做法以增加收入,因为学校有很大的财政赤字。

转载网址:http://kurttlin.diandian.com/post/2011-10-03/5502426

本文章迁移自http://blog.csdn.net/timberwolf_2012/article/details/8620978

posted in 程序员之路 

最近在网上看到有人写了一篇关于《写给4年前没有开始做设计的自己》,突然也想写这样一篇文章。具体那篇文章的内容我并没有细读,防止自己的思路照着他的来。

首先,我先简单介绍下自己,好为后面的内容做一个铺垫。我今年23岁,内蒙古人,今年6月将于粤东地区韩山师范学院毕业,软件工程专业。

一、如果可以,你应该去学文学或者经济学、或者其他你喜欢的专业

这样的建议并不是因为计算机专业不好,或者不适合。行业内普遍认为IT人士在同年龄的白领中是比较辛苦的,加班现象是大多数互联网公司中常见的。且长时间从事计算机相关工作,对健康也是有一定害处。如果你不信可以看看你现在的自己和四年后的我的这两张脸。明显苍老了不止4岁。长时间坐在电脑前也会引发颈椎病,当然如果你坐姿可以调整好的话,也可以避免这个问题。如果你想要一个好的身体和白白净净的脸,还是换行吧,别那么倔强。

二、你该如何去学计算机

四年前开始学计算机的你,充满了自信,做事情分得清轻重缓急,抓得住方向。但是你的过于自信造成了我今天的知识面狭窄,只会做网页的状况,且你没有给予一些重点学科予以重视。

你觉得数学没什么,编程时很少会涉及到复杂的算法,就算涉及到,你也能够解决,只是付出的时间多一些。简单的递归和排序对你不是问题。我要告诉你,你错了。计算机之所以可以发展到今天,就是因为数学,其根本原理就是基于数学。是的,编程时你很少会涉及到使用书中的数学知识,但当你想涉及底层或高效率编程时,你的数学会让你寸步难行。

你觉得英语没什么,编程时很少会涉及到复杂的单词,就算涉及到,你也可以金山词霸,只是动几下手指就好了。简单的变量命名规则对你不是问题。我要告诉你,你错了。大多先进新的技术资料均是源于美国等发达国家,且相匹配的文档书籍也是英文的。是的,你可以去看中文翻译版。但是我要告诉你,不是所有的书你都可以找到翻译版,不是所有的英文网站你都以用谷歌翻译;在你研究一项新技术的时候,苦无资料的你只能去一个次一个词的翻译国外文档或书籍。

三、别去听老师讲课,你可以大胆的逃课

当然,前提是你要保证不要挂科。国内的觉得多数学府,其主要任务在我看来不过是所谓的“科研”。这里我加上引号的意义很明显,大学根本就没有交出它本应交出的科研成果,所以一切都是走形式。是的,是走形式。老师的工作重点是考职称,系辅导员的工作重点是不要出什么乱子,执行书记的指示,然后把你当做是一个高中生一样圈养。大学里的老师,也很少有真正有学识的。打个比方,可能教你数据挖掘的老师自己都没有去挖掘过,可能只是在家里拿个小铲子挖挖花盆罢了。当然,不能排除有真正好的老师,但真的是可遇而不可求。即使你遇到了一个很有学识的老师,大多数情况下,他也是个不会讲课的老师,或者是个精力不在教学的老师。

所以,你要大胆的逃课。图书馆是你的将要泡的地方,你可以把他当做是你的女朋友。她能提供给你大多数你想要的,只要你能静心研读。其实,你完全可以利用两节课的时间去看老师用四节课讲的内容。

四、别总是做一样东西,去广泛涉猎吧

大一时你给自己定向PHP,这是一个不错的决定,并且也因为这个觉得,即将毕业的你也找到了一份不错的工作。但是我要告诉你,不要总是PHP。我承认PHP让你学到了很多,甚至通过PHP使我学到了脱离语言本身的东西。我也并不是说长时间的编写一门语言会怎样怎样,很多大牛都说语言无关(关于这个观点,后面我也说说自己的观点)。真正的弊端是,长时间的网页开发会造成你的目光短浅,无视其他平台的优越性,知识面狭窄。如果你能做到更多的平台,我相信你会对编程本身有一个质变的理解。

五、你要坚决抵制微软平台

其实你已经这样做了,但是还是要说一下。微软是一个垄断性的企业,其WINDOWS流行程度虽然降低,但他仍然是PC操作系统的龙头老大。微软为实现其垄断梦,采用傻瓜编程的方式,蒙骗了大多数微软平台程序员。你用.net去开发一个网页,甚至不需要自己去写HTML,只需要用VS去画就可以了。是的,这样很方便。你用.net实现MVC只需要按照它的框架即可。是的,这样很方便。

但是我要问你,你知道你所画出来的网页本质是什么?如果我要你实现一个复杂的JS效果,你在它复杂的类库中找不到对应的类的时候,你该怎么办?

我还要问你,你知道MVC的本质是什么吗?M、V、C分别是什么?有什么优点缺点?意义何在?

如果你走上了这条路,毫无疑问的,4年后的我只能呜呜呀呀的说的大概吧。呵呵,幸好你没有走上这条路。

六、大学学的是什么

这段应该不是写给四年前的我,只是比较有意义,所以决定写出来。因为大一的时候我已经明白了这个道理。

大学并不是高中,没有老师会整天抓着你学习,管你吃喝拉撒。一切都是靠你自己。学习也是一样。大多数老师是不负责任的,上完课布置个神马作业然后走人。如果你不想白读这个大学,那么你要开始自学,并且学会自学。

有些人会说,我很笨怎么办?我不会自学怎么办?

首先,我觉得没有人是笨的,除非你是弱智。即使是弱智,我依然认为你不是笨的。为什么这么说呢,我是一个极端的人,我相信主观因素可以克服,只要你有足够的自信,并且付出足够的努力。当你决定要做一件事,并且客观上是有可能成功,而你却失败了的时候,我只能说是你自己付出不够努力,不是天不下雨天不刮风的原因。

其次,自学其实没有你想的那么难。只要你有书,只要你有电脑,神马都是浮云。我的意思是没有什么问题是解决不了的。即使是在你一窍不通的情况下让你去搭建一个邮件服务器,给你书和电脑,只要你肯努力,肯定是可以做到的。谷歌百度是你自学的莫大助理。想想互联网搜索还没有星期的90年代,如果你碰到一个问题,除了翻查书海和问人几乎没有更加便捷的办法。所以,你要庆幸你活在这样一个时代,感谢互联网用户。并且一直秉承着:form the Internet,to the Internet的精神。

最后,关于语言无关性,我想说说自己的观点。

很多老师和大牛会提及语言无关性。但是我想说下自己的反对观点。我并不认为这句话是错的,只是觉得不是所有人都有资格说这句话。如果是一个菜鸟,大言不惭的说语言无关性,那可真是笑话了。一门语言都无法精通的人,何谈语言无关性。是的,相同的问题可以同步多种编程语言解决。对于大牛来说,无论使用哪种语言可能都是得心应手,并不是他对所有的语言都精通,而是他已经掌握了编程语言的本质以及编程思想,学习一门新的语言可能只是十天半月的问题。但是对于初学者来说,编程本质与思想,以及对于细节问题的纠结,使他们无法脱离问题本身,而将大部分精力花在语言上,这没什么不值得的。

所以我认为,你可以说语言无关性,但你首先要扛得起“大牛”这两个。

再者,大牛也不要对初学者强调语言无关性,你是在误导他们。等他们真正达到那个境界,这个思想自然就领悟了。

这篇文章被推荐到首页是我没有想到的,文中确实存在过激的观点和个人情绪的发泄,发表当初并没有考虑到这些。如果对于某些读者造成了困惑和不满,在这里我向大家真诚的道歉。

关于文中我补充几点大家争议较大的内容:

1、这篇文章是以现在的我写给4年前的我为出发点,且写文章的时候也一直把我这对自己说话的口吻去说的。语言过于偏激也大多是针对自己,并无恶意。

2、是否应该翘课的问题。我说的太过偏激了,可能是因为在我们学校我没有接触到真正认真负责搞教学的老师,并且即使是上课我也是在下面自习的。其他人的情况可能和我不同,可能真的又值得去听认真去听的老师。如果有这样的老师,当然应该去认真听课。同时也应该通过老师去了解课程和行业,毕竟老师的视野要比我们宽泛的多。大学中我就遇到一个恩师,虽然他和其他老师一样不注重教学不会上课,但他给我提供的机会以及私下里聊天教我的东西足够我受用终生。

3、关于自动化我依然坚持我的观点。我并不是一口否定不应该去使用开源类库、框架等工具,我个人也经常用这些东西,比如THINKPHP,或者其他常用类。但使用这些的过程中,我会尽可能多的去了解其原理。我只是不想做一个局限于某个平台的程序员,希望自己能够接触更多的底层的东西,提高自己。同时我也认为,这是能够区分一个程序员能力的标准。有人有不同观点,我不想争论。正如我所说的,并不是不去使用自动化工具,而是应该在使用过程中明白其原理。

4、学校好坏以及是否有参加工作并不是衡量一个人能力的标准。我承认我的学校说出去没几个人知道,但这决定不了什么。别人高中玩了三年考到我们学校,我用半条命出来拼出个第一,才勉强考上本科,教育水平不同而已。可能你的优越性只是在于你出生在一个比较发达的城市,而我却是生在一个只有200多户人家的山村。但我相信时间会改变一切,我相信。

转自 始终不够 http://blog.csdn.net/huyanping/article/details/8581623

本文章迁移自http://blog.csdn.net/timberwolf_2012/article/details/8620865

/** * RECOMMENDED CONFIGURATION VARIABLES: EDIT AND UNCOMMENT THE SECTION BELOW TO INSERT DYNAMIC VALUES FROM YOUR PLATFORM OR CMS. * LEARN WHY DEFINING THESE VARIABLES IS IMPORTANT: https://disqus.com/admin/universalcode/#configuration-variables*/ /* var disqus_config = function () { this.page.url = PAGE_URL; // Replace PAGE_URL with your page's canonical URL variable this.page.identifier = PAGE_IDENTIFIER; // Replace PAGE_IDENTIFIER with your page's unique identifier variable }; */ (function() { // DON'T EDIT BELOW THIS LINE var d = document, s = d.createElement('script'); s.src = 'https://chenzz.disqus.com/embed.js'; s.setAttribute('data-timestamp', +new Date()); (d.head || d.body).appendChild(s); })();