Profil de 克莱克莱沃曼PhotosBlogListesPlus ![]() | Aide |
|
|
24 mai 《Windows Internals》学习心得(2)- Windows ArchitectureWindows
Ntoskrnl.exe and drivers
Executive
Executive components and relevant services
Drivers
xikug谈黑盒,灰盒,白盒,逆向序 23 mai 《Windows Internals》学习心得(1)以前做开发的时候用VC, MFC, 对于Win32和Driver是一点也不感兴趣。后来乱七八糟混了好几年,IT业大变,自己碰巧就做上了测试。测试又做了快5年了,大部分时间是自我摸索,到了现在这情况变成了一定要学习Windows internals了。 这本书从开始看也两年多了,我很难说我看懂了多少,只是最近才开始有点立体的感觉,当然这跟工作上接触到一些相关内容还是有关系的,否则只是硬看应该是看不懂才对。我想目前由于不精通Windows internals对于我的测试工作有以下几个障碍:
《Windows Internals》 《Programming the Microsoft Windows driver model》 最后,HAL不想学,也不知道有没有用,Hardware不想学,WDF暂时不想学。现在是新手,能想到的也就这么多了。 Debugging Tools for Windows 学习使用心得其实我的主要工作一直是UI test, UI automation, manual test 等等。曾经跟领导提过想做些深入点的测试,领导则反问 “你Kernel debugging 怎样?”。这是一个非常有趣的问题,你因为不具备良好的kernel debugging的能力,所以不给你做深入的测试工作,而因为你没有做深入的测试使你也不可能具备kernel debugging的能力。很多时候事情就是如此矛盾的,而我也曾经说过,一切最终还得靠自己。 前几天发现一个奇怪的bug,分给这里的一个seniro dev他也没太多的办法。我在一个高手的指导下自己debug and figure out了root cause。在和这个高手的交流中,也基本明确了一下步的学习目标。以前的我主要是靠自己摸索,我想多跟高手接触,交流还是非常非常有帮助的,当然机会也不是很多。那么我的下一步的目标就是“code review, debugging, windows internal and WDM”。Debugging可以说贯穿了其他的三个,因此我今天先谈谈我对debugging tools的感受。 我们基本都是用微软提供的几个debuggers,ntsd, cdb, kd, windbg。ntsd和cbd是user mode debugger, kd是kernel mode debugger, 他们都是command line的,而windbg是UI的debugger, 可以调试both user and kernel mode。大多数情况,我都是用windbg,但是在一些特殊的情况下,我还是需要其他的tools。今天我主要是谈windbg,我想学习windbg大概分这么几个阶段:
最后引用高手的两句话,“debug一两年,你就没什么问题debug不了了”,“只要能repro,你总能找到办法去debug”。 15 octobre Kernel stack not resident (Using .pagein)You might find yourself debugging an issue and a thread you are interested in is paged out. Here's the steps to use to page in the stack for the kernel side and user side... Be careful when doing this on a live machine that you want to release after debugging as paging in certain section of memory can cause it to bugcheck... 2: kd> !thread fffffa8004415460 2: kd> .pagein fffffa600440d6e0 //Grab Current from above... This will get us the kernel side... 1: kd> .pagein /p fffffa80046e5610 00000000`016aebc8 //We take the process ID of the thread and the usermode address at the bottom of the stack. 1: kd> 8 août 驳斥《C++/CLI 的十宗罪》由于公司有大批程序员死在 C/C++ 的内存管理上(泄露,越界),作为有先见之明的,伪程序员的老板征集了各方意见后,决定将现有的所有框架代码移植到 C++/CLI 下面来。由于本人在 C/C++ 上多花了几年功夫,自然,这个“简单”的问题就落在了我的肩膀上。用了一端时间 C++/CLI 后,发觉 C++/CLI 不是鼓吹中的那么好,特别是对于 C++ 程序员来说,简直是噩梦。依据 MS 的历史,我认为 MS 在 VC9.0 以后的版本中才能将 C++/CLI 实现的比较完美。(MS 的历史:要在第三个版本才会比较好用,例如:VC4、VC5 都不是很好,VC6 我用了 7 年;.NET 2002、2003 也一堆问题,.NET 2005 终于好用了)。 特在此总结了 C++/CLI 的十宗罪,罪状如下: 第一、没有全局变量 好吧,我承认“现代”的高级语言都没有全局变量,不过,实现这些高级语言的运行库都有无数的全局变量(反汇编跟踪下就知道了)——哦,只许州官放火,不许百姓点灯。好吧,我承认没有全局变量,我还能生存,大不了晚上我不点灯不做事了。
[Comments] 既然你知道现代的高级语言都没有全局变量,怎么能把它作为C++/CLI的罪过呢?为什么现代的高级语言都没有全局变量呢?为什么面向对象的一大特点就是封装性呢?既然你研究了几年了C/C++,应该清楚和明白吧?简单的来说,在C语言时代是没有封装性的概念的,因此全局变量满天飞,使得大型程序维护起来十分的不方便。这也是为什么面向对象概念兴起的一个很重要的原因。作为一个程序员如果从整体的设计来考虑的话,是应该尽量少用或者不用全局变量的。这也是为什么现代的高级语言都取消了全局变量了,而且如果面向对象的设计能力比较强的话,是可以完全的抛弃全局变量的使用的。当然了,对于很多C程序员来说,不能使用全局变量有点要命的感觉。不过这不能怨语言,应该看看自己是否真正理解了面向对象的概念。 还有就是,为什么他们的运行库有无数全局变量?因为他们是用C来实现的,在C语言里是必须要用全局变量的。
第二、类的静态成员变量的初始化时机问题 没有全局变量是吧,那么我用静态成员变量来模拟总可以了吧。很好,顺利编译通过!但是,但是,这个静态成员变量是什么时候初始化的呢?哦,用到这个类的任何变量/函数/实例的时候初始化的!这个到是很好,解决了全局变量的初始化顺序问题。问题是,我只不过希望静态成员变量将本类注册到类工厂去。我从来不会直接访问这个类的任何变量/函数/实例——我只访问他的基类。这样一来,我的类工厂里空空如野,我的系统再也工作不起来了。
[Comments]这个问题跟第一个问题是类似的。还是你要想方设法的去用全局变量,而没有想过为什么不让你用全局变量。静态成员变量本来就不是做这个用途的,它是类的实例的一个全局变量,注意只是这个类的实例,而不是整个应用程序。这只能说明你错用了静态成员,而不能归于C++/CLI的罪过。 还有就是静态成员完全可以初始化,只是你自己不会罢了。建议你好好的去学习一下.NET。
第三、弱智的、缺乏实际应用经验的人设计的的静态成员变量初始化地方的问题 你能判断下面这句话是变量声明还是函数申明吗?
[Comments]没看出这个有什么问题呀?你难道读程序是一句一句的读吗?我们怎么能够把程序分割理解呢?如果上下文一起来看,能有什么歧义呢?
第三、静态局部变量的问题 你知道,仅仅一个“单件”,就多么的需要这个玩意!
[Comments]这个不太明白想表达什么。
第四、功能弱到极点的 array 其实已经很强大了,比 C++ 的数组多了一个 Resize() 功能了。但是,跟 std::vector 比较起来,一个天上,一个地狱!好吧,我承认我对 CLI 不熟悉,那么,谁告诉我,C++/CLI 提供了什么样的东西,具备 std::vector 的功能?不要告诉我基于 CLI 的模板库,我严重怀疑其可工作否。
[Comments]看来你真的没好好学过C++/CLI,你不知道C++/CLI最大的优点在于通吃一切吗?你现在抱怨的是CLI,就算CLI没有你想要的功能。可是C++/CLI是C++和CLI的混合体,你没有必要一定用CLI,你当然还可以用回你所有的C++功能。std::vector算个什么呢?
第五、value struct 和 cpp struct 在模板函数上,对“引用”的符号匹配问题 对于 cpp struct 应该匹配那个符号?'&' 还是 '%'?答案是 '%'。哦,我的天哪,居然还可以使用 pin_ptr<cpp struct> 来取地址!实在是太伟大了!那么,我的 cpp struct 变量究竟位于哪里?堆上?栈上?还是托管堆上?我迷糊了,编译器跟我一起迷糊了。
[Comments] 看来你还没分清楚cpp struct和CLI struct的区别呀。建议你还是好好学习一下再来讨论吧。
第六、模板函数的特例化问题 对于下面这样的函数: myclass c; 你认为“式一”会调用那个函数?我知道你的答案,不过你的答案是错误的,因为你是一个资深的 C++ 程序员。当我意识到我的系统不能正常工作是源于此的时候,我很想联系恐怖份子,购置一枚或者更多的原子弹,然后在 google 上找到 MS 总部甚至分部的坐标,然后把原子弹的目标设置好……
[Comments] 建议你先学学template和generic的区别吧。
第七、C++ 和 C++/CLI 的代沟问题 ref class,value class 里不能放置 cpp class 的实例,这个我还能接受。但是,cpp class 里不能放置 ref class,value class 的任何玩意——实例、引用、指针、interior_ptr,pin_ptr。我怎么实现回调式的功能?不是我非要设计出回调式的功能,而是,有那么多,那么多的Win32 API 是回调式的!好在我在知识的海洋中找到了 System::Runtime::InteropServices::GCHandle,不然,我定制的原子弹就会上升成为氢弹!
[Comments] 这不是C++和C++/CLI的代沟问题,是C++和CLI的代沟问题,C++/CLI提供了你一个桥梁把他们联系在一起,你应该感激才对。没有C++/CLI你更没法搞。这是C++/CLI一大优点,而不是罪过。
第八、.NET提供的类库太过于臃肿 大家知道,C/C++ 的 CRT 也就几百K,C/C++ 仍然实现了你所能看到的软件的绝大部分——但是,你看到的,用 .NET 实现的软件有几个?好吧,我承认我偷梁换柱,不过,由于.NET库的臃肿,以致于稍微一个好听,合义的单词都被.NET用掉了。这让我不能放心用 Object,String,IStream...等等作为我自己的类型的命名,我只好绞尽脑汁想别的名字——正如您所猜测的一样,我的英文很差,必须要借助翻译工具才能看懂 C++/CLI 的白皮书。这让我想出新鲜的,上口的,其他跟我英文一样差的人能看明白的单词,其难度真不啻于用随机数拼出一个Windows啊! 随机数拼出一个Windows:这个是我一个哥们的研究课题,把 N 台电脑关在一个小黑屋里,让他们随机生成二进制数据,并当作程序来运行。当速度足够快或者运气足够好的时候,生成的二进制数据刚好跟你从 DB 商手里买到的 Window XP 一样。(UMU:U墨的手法,说明几率极小极小!)
[Comments]首先.NEt是否臃肿,是否应该臃肿本身就是一个问题。就算.NET是臃肿的,也不是C++/CLI的罪过。那是.NET的问题。
第九、四饼! 这个问题是由第八个问题引起的,因为有这么多,这么深的名字空间,各个名字空间下有这么多相同名字的类型名,让我不得不整天::...::...::...::...::...::...::...::...::...::...::...::...::......
[Comments]如果你用了using spacename, 是不用那么多::的,这个是.NET的常识问题,也是.NET的一大预言特点。优于C++的。
第十、GC不能解决内存泄露问题 首先,我们要承认 GC 的一个伟大壮举:GC 能够在程序退出去的时候,释放所有的内存。但是,在 8 年前,我用 C 在 DOS 也能够办到这个功能。问题是,运行十天后,我 C/C++ 占用的不会释放的内存,GC 也不能释放,甚至 GC 占用的内存还更多。因为 GC 分不清楚没有置空的句柄是否还有机会被再次使用。
[Comments] 看来你一点都不懂GC呀。建议你先去好好学学。 综上所述,作者是一个对.NET没有太多概念的C/C++的程序员。因此,对C++/CLI的理解,就显得非常肤浅了。不知道作者搞了几年的C/C++为什么就这么轻率的发表这样不负责任,有很大误导作用的文章出来。从作者这样热衷全局变量的使用来看,好像面向对象的设计水平也很普通。希望大家不要被误导,看到作者的文章,使我对C++/CLI更加有信心了。 7 août 发现C++/CLI是发现新大陆了吗?最近事情不多,想学点什么新东西了。最近几个月Facebook的F8炒得很火,吸引我看了看他们的Application是什么样子的,应该怎么开发。看完之后,自己不太感兴趣,因为自己要建Server,比较麻烦。然后,随便找找发现了C++/CLI。原来微软在2005年就推出了这门算是新的语言吧,以前只是知道有managed C++,评价不高,C++/CLI是它的改进版本。随便了解了一下,感觉这门语言还是很吸引我的。原因很简单,就是它的强大混合编程的能力。它可以调用.NET, MFC, Windows API。目前的测试开发语言主要是C#。一直以来自己都认为C#是最适合自己的测试开发工具了,因为用C++开发测试程序不太现实,至少不能作为主要的开发语言。VB,Java什么的是我一直都讨厌的,其他script的什么的,功能都太弱了。唯有C#是除了C++以外最强大的快速开发工具。可是,用C#开发里边就存在了一个不可逃避的问题,就是调API的艰难。很多时候,我们都会碰到.NET不能完成的功能,尤其是偏系统一类的测试。那么我们就需要用Windows API来实现,可是C#调API的方式使我选择了逃避,或者说放弃。心里想,必要的时候就用C++吧,可是还真没用过。(这也就是测试人员的灵活性了,呵呵) 大概一天的时间都是看别人对C++/CLI的评论,使用心得什么的。感觉大部分人都是批评的态度,少数人喜欢和支持。说真的,自己也能理解C++程序员对它的看法。首先,它新增加的关键字确实让人不习惯,看起来,用起来都觉得怪怪的。其次,大部分C++程序员开发的项目都不需要用到.NET吧?至少目前应该是这样,很多人还在VC6下边编程。既然用不到它,就不会体会它的好处,那么就真的只有不好了。少数人喜欢它就是因为它强大的能力。目前来看,还真的没有其他语言从功能上说能与它相提并论。另外一点就是,从资料上来看,目前使用这门语言的人很少。因此我也很犹豫到底应不应该学习和使用它。 在疑惑中对它进行了学习,感想如下。 1。想真正的掌握好这门语言既需要C++的知识,又需要.NET的知识。正如一些人所说,学习它的难度要高于C++和C#。当然我是说真正的掌握,你可以用它只做C++程序,或者只做.NET程序,那就跟单独学C++或者C#的难度一样了。因为,大部分C++程序员侧重于底层,C#程序员侧重于上层,使得纯C++/C#程序员转向C++/CLI都需要一定的时间,不会轻易上手。当然对C++程序员来说会更简单一些,毕竟.NET还是比较容易掌握的(前提是他们能有心,耐心学习)。另外,如果同时具备了C++和C#的知识和经验,上手C++/CLI还是会很快的。比如我学了一天就可以上手了。 2。功能的确强大,.NET, MFC, API通吃。我装的VS2008 express 版本不支持MFC, 不过.NET+API真的就足够对付任何工作了。 3。语法没有想象中的那么不可接受。首先,它增加的关键字其实并不多,大概10几个吧,很容易学习和掌握。其次,很多关键字你也可以完全不用的,比如ref struct, value struct可以完全不用。value class 我觉得也没什么太大用。ref class就足够了。这样的话,虽然是4个关键字,可是对你来说就只是一个。再次,这里边真的有一个习惯问题, */^, using/using spacename, ./->, new/gcnew 这些东西你很快就应该能够适应。 4。和C#的比较。C#的语法还是简洁许多,也更自然。如果纯做.NET程序,目前来看没有必要非用C++/CLI。可是如果需要调用API的话,C++/CLI给你带来的方便性还是要大于语法的繁琐。因为语法可以去适应,习惯。功能的强大可是可遇而不可求的东西呀。所以,个人认为做测试程序,C++/CLI还是一个不错的选择,能够更广阔的设计我们的test case。 5。关于C++/CLI的未来。未来真的很难说,一看市场的需求,二要看微软的支持。目前来看,C++多用于系统,驱动方面。C#用于应用方面。相信未来的一段时间都会维持在这种状态中。C++/CLI给我们带来的是C++,C#混合编程。可是市场上有多少产品的开发需要这种混合编程呢?目前来看很少,就算有,有些公司就单独用C++,C#来做,再集成起来也是解决的一种方法。另一方面,C++程序员和C#程序员分的很开,没有适合用这种语言的中间状态的程序员。如果没有产品,没有程序员的支持,很难说能有什么太好的前途。不过我想C#加上C++/CLI的解决方案还是要比C#加上纯C++的解决方案更合适,合理一些。如果不嫌弃C++/CLI的语法,单独用它也可以完全的解决。现在来看,C++/CLI的阻力最大来自于它的语法了,如果语法简洁了,在.NET领域会有不少人用,从而引起它的流行,而在系统领域也得到一定的应用。个人认为,using space可以就改为using, *,^合并为*,由编译器智能判断是传统指针还是引用指针,new和gcnew也合并,编译器智能判断是应该在普通堆还是在托管堆上建立。如果这样的话,我想就没什么人会拒绝接受它了。 个人来说, C++/CLI还是极大的提高了我写测试程序的能力,我还是抱着积极的态度去采用它。这也避免我长期用C#而疏远了C++。用好C++/CLI就等于用好了三门语言。 2 août 如何debug lsass.exe这两天需要调试lsass.exe, 昨天baidu竟然都查不到什么信息。lsass有它的一些特点。首先它是运行在user mode, 因此一般来讲应该用user mode的调试工具来调试。可是,如果用debuuger直接跟它相连,计算机就会自动重启,使得调试无法进行下去。其次,如果我们想在机器启动的时候调试lsass也比较麻烦,因为user mode debugger那个时候还不能工作。再次,调试lsass的时候,网络的访问不能进行,因此从网络上访问symbols and source code 也成为了不可能。经过认真研究,发现有三种方法可以用来调试lsass,并且各有优缺点。下面就一一讲解一下。 1. ntsd piped through KD a. 修改注册表 HKLM\Software\Microsoft\Windows NT\CurrenVersion\Image File Execution Options\lsass.exe debugger = REG_SZ c:\debuggers\ntsd.exe -d -g -G b. 用另一台机器通过kernal debugger和测试机相连 c.重起测试机 这样的话,在启动阶段,当系统调起lsass的时候,测试机的ntsd就开始工作,并且将输入,输出传送到kernal debugger上。这个属于在kernal debugger里进行user mode的调试。 优点:可以在启动的时候调试lsass。 缺点:symbols and source files 必须要copy在测试机上。(不太方便)
2.Debugging LSA via dbgsrv.exe a.Find the PID for LSA via tlist.exe b. C:\Program Files\Debugging Tools for Windows>dbgsrv.exe -t tcp:port=1234,password=spat c.Run this command to attach to LSA on the remote machine. I:\debugger>windbg.exe -premote tcp:server=192.168.1.102,port=1234,password=spat -p 596 -- where 596 = PID of LSASS 优点:symbols and source files 可以在调试机上 缺点:不能在启动的时候进行调试
3.Debugging LSA from Kernel a. Get the process address for LSASS 0: kd> !process 0 0 lsass.exe PROCESS 815196c0 SessionId: 0 Cid: 010c Peb: 7ffdf000 ParentCid: 00e4 DirBase: 042d2000 ObjectTable: 81519aa8 TableSize: 859. Image: LSASS.EXE b. Switch to the process context: Either .process /p /r 815196c0 Or .process –i 815196c0 ;g;.reload /user 优点:symbols and source files 可以在调试机上,可以进行log out/ log on 过程的调试 缺点:不能在启动的时候进行调试 因此,如果想在启动的时候调试,就必然要选方法1。如果想在log on的时候调试,选择方法3。其他情况,可以选择方法2,或者方法3。 30 mars 我大学是如何学习coding的记得大一学PASCAL的时候,觉得特别的难。刚开始接触,很难理解计算机的语言。虽然最后考了95分,可是根本没有真正的学会。后来又学了C语言,也没有什么coding的感觉。一直到了大三的第一学期,还是对计算机一窍不通,甚至不知道应该如何开,关计算机。看到非计算机专业的朋友熟练的操作着计算机,心里真不是一个滋味。也有大专的朋友show给我他的C,C++的程序,给我海阔天空的讲解了一番,心里真是佩服。大三第一学期过后的春节,说通父母给买了第一台计算机,从这个时候就真正开始了我的coding学习。 首先是要把C语言补回来,把C语言教程看了一遍,把语法理解,练习了几个小程序,找了找感觉。这个阶段是很快的,可能就是几天的时间吧,毕竟以前还是学过C的,然后开始学C++。当初问过老师,学C++需要多长时间。老师的回答是三个月。买了本C++教程,一天看完。心里很不以然老师说的三个月,感觉跟C差不多,就是多个class。后来就买了两本编游戏的书,开始模仿和练习编游戏,这样在当时我们的机房DOS系统下,我是专业里唯一一个能用GUI编程序的人。所有的assignment,我都编两个版本Text mode and UI mode, Text mode送给好朋友,UI mode自己用。这样半年之后,我才突然发觉,原来这才是C++。自己用了半年的时间才真正的学会C++。(C与C++的最大区别在于设计的思维:面向过程和面向对象,C到C++的转变是需要一个过程的)。这个时候再看当时show给我程序的朋友的C++的程序时,才发现他根本没有学会C++,他只是用C++在做C程序而已。 C,C++学会了,下一步怎么办?我的性格是愿意学习最难的东西,因此就选择了VC。当初去北京书店门口看到了广告“VC程序员试用期月薪4000”,觉得是天文数字了,也更坚定了要学习VC的决心。当初的学习条件还是非常艰苦的,市面上就两本书,我还很清楚的记得,一本是四川大学出版的,一本是龙门书局出版的。四川大学那本是入门的傻瓜教程,主要是教你怎样使用Visual Studio而已,没有深入的学习指导。龙门书局是翻译的微软的,讲的对我来说太深了,没法理解。因此主要学习川大那本,可是那本书还有问题,我按照书上所讲的去做,行不通。VC学习陷入困境,没有书可以查询,没有人可以问,自己也没有理解VC的精神。只能放弃VC,转而VB。VB当然很容易了,基本上不用怎么学就上手了。半年之后,有朋友想让我帮助编一个截取VCD片断的小程序。我用VB实现之后,准备给他用。然而,我却发现缺少dll, 这样我就把这个dll铐过去,又发现缺少其他的dll。搞了几次还不行,我也恼火了,就想能不能用VC试试。这次又拿起VC感觉就好多了,不但实现了这个小程序,并且第一次感觉VC入门了。从此之后,就走向了VC这条路。基本上来说,我是学校唯一一个会VC的人,而且几年以后也不过只有两个人会VC,另一个是跟了我一年,我带起来的。后来龙门书局的书也能理解了,再后来VC的书就慢慢多了,学习起来就越来越方便了。以我从小到大的学习经历来说,学习托福那段时间是最苦的,学习VC的这段时间是最难的。后来也没有再碰到这么大的困难学一个东西了。 Basically, 大学学习coding的时间是一年,半年从C到C++,半年从VB到VC。一年之后去单位做实习了。这一年发生了三件时间,比较值得回忆。 1。女朋友是通信系的,我帮助做了一次C语言的作业,没想到老师拿做范例在全系进行讲解。 2。MIS课程,我设计了一套足球俱乐部的管理系统,包括球员状态的纪录以及出场阵容的预测。老师对我的设计打分很一般,第一次上机我去找老师。因为家里有电脑,而且也喜欢编程序,因此我所有的课程都是第一次交作业,让老师验收。这个做法遭到了不少老师的抵抗,一直到我在国外读研究生的时候,才有老师欣赏。去找老师验收作业,他以为我是要讨论给我设计的分低的问题,就说“你设计的很好,可是不可能实现,因此我没有给你高分”。我说“我已经做完了,是来找你验收的”。他的脸色很不好,说“我一会儿去”。我走了,可是左等也不来,右等也不来,又看到别的同学叫他,他都出来,我也急了,硬把他给揪过来了。他看完之后没有说什么,问我是一个人做的,两个人做的。因为,我要帮一个哥们,就说是我们两个一起做的。他就说,“如果是你自己做的,我给你10分都嫌少(10分满分),如果是你们两个做的,我顶多给你8分”。后来的分数是7分。最后这门课程是我大学以来分数最低的(除了编译),不到70分。后来我读研的那个老师,也是说我的设计实现起来很困难,让我修改,我后来让他surprised的了,他却给了我全班最高分,唯一的90分。不过大学这个老师,后来对我还是很好的,在我困难的时候,帮了我很多,后来也含蓄的跟我表示过,不喜欢别人什么都没做,我帮他们。 3。编译原理的课程,因为不喜欢老师的教学风格,因此上课从来不带课本,都是自己拿本C++的书座在最后一排,自学。被老师看到过一次,问我为什么不看课本,我说没带,他再问我,我就一话不说了。应该是记住我了,而且很生气。这门课程上课没有听,下课也没有学。最后到了期末的上机实习,作业是Basic的解释程序。听说上一届的没有一个人能做出来的,我就回家了3天,一边自学编译原理,一边设计,编程。3天之后回到学校,大家都用怀疑的口气问我怎么样,没想到我的回答是“做出来了”。我们这届最后还有另外一个人做出来了,因为我是用C++,他是用PASCAL,而要求也是PASCAL,因此其他的人基本都是抄的他的了。第一次上机,我跟那个老师说,可不可以用C++,他说可以。我就说我做完了,你验收吧。他看了之后说了一句“挺好”。后来这门课,我不及格,上机10分给了我5分,理由是我上机时间太少。这事情在我们学校闹得很大,因为我平时的成绩基本都是80多分,90多分的也不少。后来进行试卷的review,其他学校的老师都不敢过来,只能自己学校review,最后的评语是“***同学不是无稽之谈,老师也有犯错误的时候”。可是,为了系里在学校的面子,还是牺牲了我。他们保证我补考肯定没有问题,可是我已经不敢相信他们了,因为补考不过,我毕业都有问题了。因此就在大四的时候多选了两门课来代替这门课的学分,也造成了自己断绝考验的准备,毕业就工作的现实。 学校是挺打压人才的,当然自己那个时候也很不懂事,在注重技术的时候,忽略了做人的一些要素。这里我想说的是,编程序一定要靠实践的积累,只有多动手,才能更深的理解问题,另外技术牛了之后也要更注意做人的方式,在中国很多时候会做人比会工作可能更重要。两个方面一起抓,以后才更容易有更好的发展。希望我的经历能给大家一点借鉴作用。 |
|
|