登录
  • #申请总结
  • #eecs

CS‌‌‍‍‌‍‌‌‌‌‍‍‌‍‌‍‍‌‌‍‍‌‌‌‍‍‍‍‍‌‍‍ != 编程, SE != CS

substring
6040
20
第一次在这里发帖。觉得这个论坛不错,早上醒来睡不着,胡乱写点个人经验。

其实我没啥资格在这里指点江山什么的。我本科学的数学,跟着别人搞过创业(跟在牛人后面做小弟),也在大公司干过,做过一些说起来很牛其实就那么回事的项目。现在在读软件工程。像清华啊科大啊之类的bbs,都是立志当科学家的牛人,俺说不上话。太傻之类都是集中在申请上。这里很多人都是准备读完出去工作的。带着明确的目的去做事,这很好。

废话少说,讲一点个人经验,抛砖引玉。

CS不是编程,或者准确来说,我的想法是如果你去搞cs,不要想着编程,不要从编程序的角度思考问题。计算机科学是一种科学,而编程只是一个工具。站在工具的角度而非问题的角度去思考问题,这看起来很可笑。但很多人都无意识的偏向那么做,这也容易理解,因为编程比cs简单。如果我去面试一个CS的应届本科生,我绝对不会问他某种语言的细节,除非他在简历上写精通。我的第一个问题肯定是关于计算理论的。如果计算理论都不懂,computer science里的computer就失去了意义。 反过来说,学cs却一定要有编程的能力,因为程序运行的结果证明了理论在解决实际问题上的效果。

SE不是CS。虽然大多美国学校,SE都在CS系里,但是这两者完全不是一回事。光从名字来看,一个是science,研究理论问题;一个是engineering,研究如何搞定实际的东西。SE里有一大块是搞PL和V(erification)&V(alication)的。在我看来,他们也不能算严格意义上的SE。比方说,搞V&V的,发多是研究formal verification或者各种测试的方法,就像数据结构,算法一样,只是一些可以用在实际中的理论,而不是去研究如何去组织测试,测试流程,根据不同项目的特点用不同的测试方法等等这些客观实际的东西。

如何才是一个好的software engineer?很多人自称software engineer,其实他们只是programmer。software engineer的要求比programmer高得多。不是我不鼓励学习技术,但是某个技术研究的再深,也不是software engineer,当然,有的人喜欢做技术专家。software engineer干什么? 比如去和客户沟通,写出一份完善的需求文档;给一份需求文档,做出合理的架构设计。不过,需求分析和架构,一个需要大量业务经验,一个需要大量技术经验。那我们谈谈design。熟读GoF的设计模式,可以把里面26种设计模式用java或者c++一一写出来,然后再娓娓道来他们的优缺点,就可以称精通面向对象设计了?当然不是。在实际的项目中,根据实际情况,合理运用设计模式,或者是设计模式背后的思想,那才是精通设计模式。设计模式等于是招式,照着招式来的都是菜鸟,武林高手,很多时候只用半招就足以杀人,或者连贯使用不同招式里的分解动作。software engineer还要懂测试。你问我编程在哪里?coding是软件工程里最不重要的一步。用一句话来说,may be challenging but not difficult。大多数工业界的项目,在技术上都没啥难点。或者相对其它方面的难点,技术难点不值一提。比方说,我做过的NYPD的911 Dispatch System,用了很多当时看来很高级的技术,有些合作方拿出的技术,连beta版都没出,我们拿着开发文档就开始用了。但项目中的难点却一点不是技术,而在于项目管理,流程和质量控制,需求分析,架构设计。

立足工业界,还有一个最重要的就是学习能力,很多人说it是年轻人干的活,其实真正的software engineer,越老越吃香。我一老美朋友,在Raytheon(搞军火的,爱国者导弹,战斧导弹都是他家的)工作了十几年。一个很难用的测试工具,我们都没有这类软件的经验,我研究了2个多小时才写出几个简单的可以正确运行的脚步,很多复杂的机制还搞不懂。他都写了十几个,而且不少复杂的命令都用到了。这就是十几年积累而来的学习能力。你说要是同样的职位,人家招谁?估计我愿意每天工作25个小时人家都不要我。
20条回复
热度排序

发表回复