Mar 8
zz from http://bbs.sysu.edu.cn/bbstcon?board=CS&file=M.1267951351.A

发信人: kyhpudding (只要衫除实得~), 信区: CS
标  题: IT 民工男的 CS 课程记忆
发信站: 逸仙时空 Yat-Sen Channel (Sun Mar  7 16:42:31 2010), 转信

先介绍下自己, 03CS 本科
在某更懂中文的地方混了两年多, 做社区产品, 后来做基础平台
带项目带新人前端到后端应用到底层跟各部门死磕无处不折腾
每年都为可以公费回广东回来校招, 据说是杀手, 不过我不觉得
最近在一以企鹅为吉祥物的公司继续折腾
此文仅代表个人观点, 也只包含个人经验

聊聊 CS 本科各种课程对实际工程工作,
更准确点, 对典型互联网行业的工程工作的影响
试图回答: 这些课程有啥用? 以及, 为啥面试会问这种 BT 问题?
不过如果你不希望走技术方向, 或者希望折腾一下技术就"转管理"
请忽略这篇文章

首先是数学, 我本科四年最后悔的事就是没把数学学好. 掩面, 这个问题先不谈.

程序设计, 首先是语言问题. 可能大家会抱怨出来工作基本都是 java C# 了, 为毛
大学还在教 C++, 落后! 好吧, 我最熟悉的语言其实是 C 语言......

我们看程序设计担负的任务. 一方面, 你必须掌握一门跟计算机沟通的语言, 否则后面
的课根本没法学. 另一方面, 通过学习程序设计 --- 而不是某一门特定语言, 掌握一些
基础的设计方法和一些思路, 为进行真正的工程开发做准备.

从掌握计算机原理, 以有效利用计算机的角度考虑, 应该选一门相对低级的高级语言,
这自然是 C, 它对于一些底层问题: 硬件, 数据结构, 底层操作系统机制等
提供了合适程度的抽象, 把我们对计算机的认识从底至上衔接起来: 写汇编时, 你得知道
指令对底层硬件的意义; 同样的, 你需要能把 C 的循环, 数组寻址, 指针在汇编上
到底是什么解释清楚, 你需要知道函数调用压栈的到底是什么数据, memcpy 到底怎么
拷的数据 (经典问题). 到学 OS 时, 如果用 linux (或任何 UNIX-like) 做教材样本,
你得有很扎实的 C 语言功底, 才做得来操作系统实验, 或者至少理解系统调用用怎么
完成. C 是系统底层的标准语言, 扎实的 C 语言基础是了解系统底层原理的
敲门砖, 至于为什么要对这些计算机系统底层如此了解的原因, 我们下面再谈.

另一方面的任务, 涉及到许多人每天的工作 --- 程序设计. 两个分支: 数据结构和算法,
软件设计范式, 抽象, 建模现实世界问题, 提供计算机解决. 这要求有一个能让底层细节
不会阻碍思考, 而且相对实用的语言. 越来越多的大学使用 Java, 当然也有不少人讨厌
这个, MIT 使用 scheme 和 python. 从达到教学要求角度看, 我觉得都没什么问题.
前提就是: 你依然得有很好的 C 语言和其他底层知识基础. 数据结构和算法下面我们
还会说到. 设计范式, 抽象, 建模等问题, 相当地困难 (数据结构也是一种抽象方法).
我那时的程序设计书好像就是讲了一堆 C 的知识, 然后后面附加讲了点 "面向对象设计",
其实是在讲 C++ 的语言特性, 非常生硬难懂. 我觉得首先得解决的是一个关于 "如何
抽象问题, 建立模型" 的问题, 而"面向对象" *仅仅是其中一种可选方法*! 而如何使
用语言特性去实现这些抽象方法, 那更是细枝末节. 在这方面, 我还是觉得 MIT 原
6.001 课程 SICP 做得最好, 逐步引导越来越高层的抽象, 一步步教导经典设计思路,
而不是一次过塞给你一坨似是而非的理论以及非常恐怖的语言特性. 至于 design
pattern --- 专指 GoF, 我认为是应该在有相当的开发经验后自行修炼的, 不适宜在
课堂上讲授.

说回来, 我认为程序设计课应该分成两部分: 为了解计算机系统底层原理准备的 C 课程.
以及为学习计算机的高层理论知识提供趁手的高级语言工具. MIT 以前用 scheme,
现在用 python, 两个课程链接:
6.001 SICP
http://ocw.mit.edu/OcwWeb/Electrical-Engineering-and-Computer-Science/6-001Spring-2005/CourseHome/in
dex.htm
6.189, 这门课的教材就叫 How to Think Like a Computer Scientist
http://ocw.mit.edu/OcwWeb/Electrical-Engineering-and-Computer-Science/6-189January--IAP--2008/Course
Home/index.htm

程序设计是一个 *准备* 课程, 好戏在后头. 在实际开发中, 底层我们用 C/C++
应用层我们用 Java PHP Python 等等等等, 还有各种脚本, 甚至自己设计语言. 从语言
角度, 我不认为深入掌握 C 和 Scheme 的人学习任何还算正常的语言会有多难.
至于应用框架/系统, 那是另一个问题, 有兴趣的自行学习, 许多大公司对此自有一套,
大学不是什么培训机构, 要在课堂上讲这些, 会让人笑掉大牙.

数据结构与算法, 这咚咚每天都要跟它打交道. 基础数据结构, 是这行的通用语言. 面试时
要考察 candidate 是否对此熟练掌握, 其重要考虑就是: 不掌握无以沟通. 没人有功夫
跟你解释 B+ 树是怎么回事, 如果我说这个模块维护了个 B+ 树你看着我一面惘然, 那
大家都会很痛苦, That's it. 当然, 有的数据结构, 比如倒排表, 你没听说过我觉得很
正常, 但我可以三言两语就让你明白这是怎么回事, 你可以马上运用它来解决问题, 那就
行了.

算法 --- 参加 ACM 对此有帮助, 但专门钻研算法的奇怪技巧却没太大帮助. 同理, 一些
基础算法, 例如排序, 是行业通用语言, 不掌握无以沟通. 而每个专业分支都会有其专门
的一些算法, 这些也不是本科计算机课程可以和需要教授的, 本来就应该在工作之后再
学习.

但另一方面, 我们往往需要设计算法 --- 往往是某些算法的变体和结合, 我们更往往要
分析算法复杂度 --- 这是个要命问题. 这是可以在课堂上学习到一些基本方法的, 虽然
会令这门课看起来更难, 而且需要更好的数学知识 (知道我为啥后悔了吧, 顺便说一下,
某大牛的观点, CS 数学是应该学数学分析的, 深以为然). 但我认为, 有基础的人就算
不知道某算法, 也会一听就明白, 并能利用. 但算法分析, 这个不抓紧时间在课堂上学
好, 以后就难了.

算法方面还是建议看 Introduction to Algorithms 吧, MIT 课程
http://ocw.mit.edu/OcwWeb/Electrical-Engineering-and-Computer-Science/6-046JFall-2005/CourseHome/ind
ex.htm

微机原理/计组/体系结构. 对我来说, 这些课程的作用就是让我知道, 我折腾的拿个铁
盒子到底是怎么一回事. 考虑一些系统性能问题, 做设计权衡时, 我必须考虑实际的计算
机体系, 各部分的性能状况 --- 有了基础, 还要时刻紧跟随摩尔定律发展的潮流. 我们
必须时常考虑, 硬盘的读写特性是怎样的? Cache 能多有效, 怎么利用多核 etc

操作系统原理, 这是一门核心课程. 在我的工作中, 它有两方面用途. 一方面, 为了实现
高效的低层应用, 我需要清楚操作系统的行为, 需要了解我的 API --- 系统调用的实现
原理, 效率情况. 我这行在服务端通常使用 linux 系统, 而 OS 教学在传统上以 UNIX
为范本, 有的甚至直接采用分析 linux 内核的方法, 这就很好地结合起来了. 基本上,
扎实的 OS 知识, 再加上 APUE, linux 系统编程就问题不大了.

OS 也提供了一些常用的概念和抽象方法: 例如锁, 线程和进程. 你会在各种地方碰到他们
你需要利用它, 你有时候需要自己实现它, 你有时候还会发现一个自旋锁耗掉多少 CPU
指令是影响你的程序性能的关键......

另一方面, 可能是大家容易忽视的, 是 OS 乃一门非常重要的工程入门课 --- 我认为这
才是 OS 最大的意义: 开始学习设计实际系统.
   - 学习一个真正的大型系统. 真实的操作系统都非常复杂, 你可以看到现实世界的
模块划分和抽象方法, 你可以看到闪光的设计思想 --- 以及一些丑陋的既成事实, 这
比任何一本所谓 "设计方法" 的书都来得精彩. ps. 看看 APUE 吧.
   - 分析瓶颈, 考虑权衡: 当你面对的是一个系统而不是一个单一问题点的时候,
分析瓶颈成了一种重要能力. 没有最优算法的说法, 调度方案等等有得必有失, 方案取舍
必须在充分的分析基础上进行. linux 的调度算法, cache 设计是怎么样并不重要.
重要的是: 它为什么要这么设计? 解决什么问题? 这个方案基于什么假设? 对什么有利
而什么不利? 是否与应用模式相吻合? 我们用什么方法来精确测量, 验证这些问题?

这些都是非常重要的工程能力. 我遇到过一位同学, 解决一个模块的性能问题, 上来
看了一通代码, 然后跟我说: 那个函数复杂度是 O(N^2) 可以优化成 O(NLogN) 的,
但实际上那个函数的数据规模只是几十, 更重要的是, 此时模块的瓶颈在 IO. OS 的课程
教会我们这些重要的分析方法, 还有一些非常精妙的设计思路 --- 这会在应用其他地方
用得着.

网络, 这门课同样有两方面意义. 一方面是掌握常识: 我们总得知道什么叫 "四层设备",
总得能分清楚交换机和路由. 当然, 一些网络编程知识也包含其中. 另一方面, 我认为对
协议设计的理解, 尤其是 TCP 设计的理解, 提供了设计分布式系统的基本思路和基本知
识, TCP 的许多设计方法, 在高层次通讯协议的设计中照样适用. 我在文后会给两个例子.

数据库, 我觉得这门课非常难教. 讲理论吧, 讲成数学了. 讲实现吧, 不现实, 讲 SQL?
这不搞笑么? 实际上我们每样都得学点. 数据库跟 OS 课程很相似的一点是: 它是许多
学科重点知识和问题的集中体现, 要看看那些稀奇古怪的知识是怎么用到现实中的?
看看 OS 和数据库吧.

数据库一方面得讲经典的关系理论 --- 基本上只要还是在设计存储系统, 就很难撇得
开它, 这还得有很好的数学基础. 同时也掌握了基本的范式, 基本的设计方法. 在思考
一个实际问题的存储方案时, 这是你的思考起点. 业界这两年流行讲反范式, 或者干脆
讲 NoSQL, No-RDBMS, 不过相信我, 经典的关系理论往往还是你思考的起点.

数据库总会有个地方讲并发, 讲 ACID, 讲事务. 嘿嘿, 欢迎来到业界第一大坑, OS 的
锁知识学好没? 准备了点分布式系统常识没? 准备好了就跳吧. 业界流行对 ACID 进行
取舍, 以达到可扩展性等目的, 我们不是要盲目去接受这些 "流行" 的东西, 我们有
时间在课堂上好好搞清楚 ACID 各为的是什么? 怎么实现? 会有什么问题? 怎么个死锁法?

最好再来点实现内容, 数据库的 index 是个什么原理? 存储具体该怎么实现? 一个查询
语句, 结合 index, 你可以怎么做?

当然我们还是得知道的 SQL 的, 这东西实在太好懂, 表达工具而已, 抠细节则不必.
我想课堂上自然也不会详细讲 MySQL 怎么配置啊, Oracle 有什么 BT 特性啊之类的
东西.

编译原理, 这门课放在本科承载的内容有点杂了. 首先得讲一下基础中的基础, 自动机.
又得讲经典的词法分析语法分析内容. 还得讲怎么编译到机器语言.

从实用角度来讲. 一方面自动机的知识词法语法分析的知识给我们提供解决相关问题
的基本思路 --- 这些都是 CS 最基础的问题. 另一方面就如一开头所说, 我们有时候
不得不设计语言, 在设计语法, 设计解析器的时候, 了解基本的编译原理知识, 并熟练
运用 lex&yacc 成了必须.

至于代码生成的部分, 我不敢说重要性有多高, 但至少我用到过相关的知识.

软件工程, 恕我直言, 这不是应该在 CS 上讲的课程, 至少不应该看得很重. 这有很多
是管理问题, 又有不断更新的新概念, 新理论. 更重要的, 我认为它更多的是 Art,
而不是 Science, 更应该在实际工作中学习积累, 做成选修课不好?
反正放心吧, 无论讲不讲, 你铁定不会一出来就是项目经理的.

我还要推荐 joelonsoftware 的一篇著名文章
Advice for Computer Science College Students
http://joelonsoftware.com/articles/CollegeAdvice.html

最后, 这里提供几个问题, 帮助大家检查一下, 自己的本科学习是否牢固,
以支撑工程需要. 这全部是基本问题, 算法问题就不列了
这不是面试经验, 每个公司的面试都有不同风格,
但解决以下这些问题的能力在我的工作中是必要的.

1. 请实现 memcpy

2. 用 PV 信号量或 mutex, 实现一个读写锁

3. 说说 fread 从一开始到读到磁盘的整个调用过程?

4. malloc 是操作系统内核实现的吗? 实现一对 malloc/free

5. 说说 TCP 三次握手? 为什么是三次? 为什么关闭连接要来四次? SYN Flodd 怎么弄,
怎么预防?

6. 说说 TCP 的滑动窗口机制, 自己实现一下.

7. 设计一个内存垃圾回收方法, 说说它的优势和局限.

8. 假设我已经有一个 B+ 树的存储实现. 请利用它实现一个基本的数据库系统: 针对
某类查询, 如何建 index, 如何执行查询, 如何完成一条更新操作?

补一门 MIT 的工程课, 建议所有希望投入到工程的同学学习
Computer System Engineering
http://ocw.mit.edu/OcwWeb/Electrical-Engineering-and-Computer-Science/6-033Spring-2009/CourseHome/in
dex.htm

本科的时间, 不花在学习课程上, 去学习某样流行的技术, 也许能令你找到一份令人
羡慕的工作, 但是别怪我乌鸦嘴, 你很快会是那个抱怨知识更新太快, 跟不上,
年纪大了失去竞争力的人.
--
Just for fun


※ 来源:.逸仙时空 Yat-Sen Channel argo.sysu.edu.cn.[FROM: 112.94.249.26]
※ 修改:.kyhpudding 于 Mar  7 18:40:18 修改本文.[FROM: 112.94.249.26]
Feb 10

WOJ-Land 不指定

felix021 @ 2010-2-10 01:08 [IT » 其他] 评论(1) , 引用(0) , 阅读(6990) | Via 本站原创
决定了毕设做这个东西。WOJ3.0。
起名Land,不是我自己想出来的,忘了是谁贡献的了。之所以叫做Land,看如下的woj名字的演化就知道原因了:D
noah(v1.0) -> oak(ark?)(v1.1) -> flood(v2.0) -> land(v3.0)

去年暑假还写了个不成器的judge然后就荒了,不过也算是打个基础。

这次要更详细地考虑具体的OJ系统架构了。

前端就apache+php吧。如果有空可以试试加一层lighttpd。需要完成的基本功能就是题目相关(包括统计数据),比赛(虚拟比赛?),站内信,题目讨论,后台管理。模板尽量参考Noah的,保持风格统一。这个是代码量最大的,但是应该不难。主要是要实现容易扩展的架构,使得将来增加新功能比较方便,不再需要重写OJ了。

数据库还是MySQL,比较熟。得有个数据转换工具,把noah的数据转过来。

Daemon可以用java,我给oak重写的那个版本拿来改改就能用。

希望有一个judge wrapper负责数据库相关的处理,让judge只负责judge。看起来用php挺好的。

Judge可以在hustoj和之前那个oj的基础上写一个,不过还得有进一步的拆分。每个语言一个judge,因为编译、执行、监控可能都有较大区别。把判断AC/PE/WA的功能和SPJ的功能也独立出来,由wrapper来组装使用。

可能还需要一个补单的,有可能数据库中存在一些还没有judge并且不会再被自动judge的item。

此外有点想搞一个memcached,减轻在比赛时mysql的负担。

目前想到这些,这两天再仔细考虑考虑,就要动手做了。希望有人多提意见和建议。

p.s. 祈祷这个项目不会烂尾...
Nov 24

硬盘和内存的故事 不指定

felix021 @ 2009-11-24 19:49 [IT » 其他] 评论(4) , 引用(0) , 阅读(5755) | Via 本站原创
zz from http://hi.baidu.com/whuisland/blog/item/17ba47ce6920340993457e4b.html

我是一个硬盘。
     在一个普普通通的台式机里工作。别人总认为我们是高科技白领,工作又干净又体面,似乎风光得很。也许他们是因为看到洁白漂亮的机箱才有这样的错觉吧。其实象我们这样的小台式机,工作环境狭迫,里面的灰尘吓得死人。每天生活死水一潭,工作机械重复。跑跑文字处理看看电影还凑活,真要遇到什么大软件和游戏上上下下就要忙的团团转,最后还常常要死机。
Nov 22

今天meyu服务器故障 不指定

felix021 @ 2009-11-22 18:49 [IT » 其他] 评论(2) , 引用(0) , 阅读(5785) | Via 本站原创
丢失了3篇日志和5篇评论。

不过幸好,Google Reader非常称职地保存了我那两篇日志,所以还是恢复过来了,差一个成员函数指针的,现在补一下吧。

看来备份工作还是要多多注意啊!
Nov 19
博客出现这个问题很久了,一直懒得去整。
今天实在觉得不爽了,于是去看了一下blog的attachment.php
发现问题出在这一句:@header("Content-Type: {$contenttype}");
boblog是把附件的扩展名保留,然后用timestamp什么的作为文件名。
然后提供下载的时候自己把扩展名截出来,在自己的$MIMEType数组里找到对应的字符串放到$contenttype这里
我看了一下,也没啥问题,但是只要下载二进制文件就会发现下载下来的文件其实是原始数据被gzip压缩了的。
觉得很奇怪,就算把博客的gzip加速给关了还是有这个问题。
我想这应该是服务器做了手脚吧,强制开启gzip。

总之,注释了那句以后就OK了,原因暂时想不清楚,撂着。
如果有哪位大牛晓得原因,还望告知,多谢。
Sep 16
zz from 康神的Blog @ http://blog.kangkang.net/index.php/archives/229

1、首先记住这句话:永远不要承认自己是高手,因为这个称号是要付出代价的。
2、接到陌生电话后,一定要问清楚对方有什么事情,然后再告诉他(她)当前你目前所在的位置。
3、永远不要试图通过电话或者QQ解决某个问题,对方很有可能不知道菜单是什么东西,这不能怨他们,只能怨你自己,因为你永远懒于解释给他们听。
4、不要想着立马可以解决遇到的问题,因为你所遇到的总是崩溃的系统或者处于崩溃边缘的系统。
5、如果对方允许你重新安装系统,那就不要试着去做任何修复工作,因为重装系统是最快解决问题的办法。
6、除了询问哪些资料需要备份,你不要提问对方任何问题,除非你的心理承受能力特别强。
7、学会保守做人,每次开工前,都记得告诉对方:“我可能无法最终解决问题,还要继续吗?”。
8、对电脑的外观检查永远是第一位的,看看线路是否连接正常,看看USB接口是否连接了其他设备等等。
9、相信硬件的抗噪能力,尽可能的情况下,不要打开对方的机箱。没有做成医生,反倒被当作破坏者,那是很悲哀的事情。
10、做好被别人数落的心理准备,因为不懂电脑知识的人,往往懂得如何评价别人。
11、如果人家说他的内存有200G,你千万不要纠正说是硬盘,否则,你的噩运即将来临。
12、不知道菜单是什么东西的人,一般也会知道虚拟内存是怎么回事的,按照他的要求去调整就可以了,反正这个不会影响到你完成修理工作。
13、告诉对方,你没有任何杀毒软件,否则,您所安装的杀毒软件都是最差的,也是问题最多的。
14、别让自己成为处理打印机故障的高手,告诉你,打印机的麻烦事情可比电脑多多了。
15、坚决不要帮别人购买电脑,尤其是组装机,除非你想背上吃回扣的骂名,然后每天屁颠屁颠的去帮他们处理故障。
16、不要反感以下两句话,它会伴随你很久时间:
第一句:“我的电脑又出大问题了。”
第二句:“你还是过来帮我看看吧。”

另外忠告在办公室工作的朋友,要记住以下几点原则:
1、尽量不要去动别人的电脑,否则,若干天以后,你的这一行动会导致他的系统崩溃并带来埋怨。
2、不要去纠正别人的任何错误,除非你有说服别人的超强能力。
3、尽可能的前提下不要互相传递任何电子文档,因为你的文件很有可能被指责为病毒。
4、不要害怕指责,因为你无法逃避。
Jun 29
一直觉得C++做到了一件看似不可能的任务:
实现了完整的OO(甚至还有多继承),同时提供了对泛型几近完美的支持,还保证了足够的效率。

相比之下,

Java对OO的支持的确很好,但是它对泛型的支持,我觉得只能用丑陋来形容;同时它还提供了让我难以接受的效率。
Sandy在用Java开发他的手机游戏时就遇到了种种问题,
我也无法接受它"把一切都封装好只为让开发更简单"这样的Bullshit。
事实上一切都变复杂了。

C没有提供对OO的支持,也没有提供对泛型的直接支持;效率的确可观,但是用于开发,似乎很费劲。
对于开发人员,为一个安全数组写一大段基于malloc/realloc和需要强制类型的转换的代码似乎很累,而且可读性也差。
而C++的vector使用起来就相当省事,代码也更加清晰易读。

所以曾经有一段时间感到有点纳闷,为什么那么多大项目是用C开发的,而不是C++?
"历史遗留问题"似乎解释不通,比如Linux源代码是经过了几次完全的重写,其间C++已经发展得比较完善了。

回过头来想想另一件事情:
如果你经常逛一些偏开发类的论坛(比如CSDN?),并看到过那些有"纯正血统"的Java程序员的言论
你就会知道那些人如同不学无术的八旗子弟一般不堪;
尤其是他们对指针的理解,那根本就是P话,而且一点都不好笑。

这里不是想嘲笑他们有多么粗俗浅陋,毕竟没有学C不一定是他们的错。
这只是个类比,C和C++的对比,在一些方面与C/C++和Java的对比还是很相似的。

Linux之父Linus对C++嗤之以鼻,甚至因此和某人大吵一架,并毫不保留地表达了他对C++以及C++程序员的蔑视。
引用
...(Git)项目限制只用C,意味着参与的人不会捣乱,也意味着会得到许多真正懂得底层问题,而不会折腾那些白痴‘对象模型’垃圾的程序员。...所以,我很抱歉,但是对于Git这样效率是主要目标的软件,C++的所谓优点只是巨大的错误。而我们将看不到这一点的人排除在外却成了一个巨大的附加优势。...
从普通开发者的角度看来,一个提供完整OOP支持的语言不仅提高了开发效率、增加代码可读性,还为代码重用带来了极大的便利。这的确是现代大型系统开发需要的,但是它真的做到了吗?

你在学习C++的过程中可以很容易的学到如何继承一个类,可是你知道如果这个类的析构函数不是虚函数可能带来怎样的后果?你可以很容易地学到如何使用set/map,如何为它写一个简单的functor,可是你知道严格弱序化这个原则吗(Strict Weak Ordering)?

如果你不知道,没关系,这不是你的错,因为C++已经复杂到让人吃惊的地步了:STL中出现的traits和可以重载的逗号运算符都不算什么了,可是居然还能有boost这么变态的东西!甚至有人说,C++是唯一一门连语言之父都要别人教他怎么使用的语言了。

从某些角度来说,Java似乎做得更好:提供了丰富的类库以及完善的GC,你忘记了的东西通通交给它吧----可是你真的放心么?如果你知道Sandy仅仅因为String的问题就纠结了那么久,你就不会给出肯定答案了。我的看法是,Java只是把一切都变得复杂了(的确,我对Java有偏见,Sandy也是)。

最后回到C。不可否认,C标准库里的东西太少了,和现实不够接轨,不是类型安全的,只有指针没有引用也让代码看起来更ooxx... 但是仔细想想,其实C提供了一个足够简洁而完善的对底层的合理抽象,将控制一切的操作能力都交给你,让你能够不纠结于语言层面的复杂性,而将精力投入到功能的实现中去。

不要认为C不支持面向对象,不要认为这一点就限制了设计模式的使用----事实上,完全用C写就的Linux源代码是高度面向对象的,使用了令人惊叹的设计模式,达到了不可思议的效率和可扩展性。

做了这样的对比,不是想说C++和Java有多么不堪,至少从进化论的角度来说,他们都是成功的、优秀的。仔细思索,之所以Linus如此鄙视C++,并不是因为C++真的很差,而是因为C++的复杂性使得系统的设计变得更加复杂(特别是在要求高效率的地方,你用C++可能根本找不到效率损失于何处!),更为可怕的是,有那么多自以为是的程序员,以为学会了class a: public b就是学会了面向对象,以为学会了Observer模式的含义就真正掌握了设计模式,甚至以为学会了MFC就是学会了C++。如果这些人加入Linux内核的开发,那的的确确是一场灾难,而且极其可怕。

"的确有不少C++程序员贡献代码,但是反而需要核心的C程序员花费更多时间去修改和删除。"

最后,援引Linus的一句话作为结束:
引用
C最大的优点之一,就是它不会使你认为程序是什么高层的东西。

Jun 7

今天很有收获 不指定

felix021 @ 2009-6-7 00:45 [IT » 其他] 评论(2) , 引用(0) , 阅读(6641) | Via 本站原创
写了一点代码来判断astar公开的代码中任意两段代码的相似性。
最关键的是求字符串的编辑距离,O(N^2),很慢。
于是跑了6个小时,还是2台机器、多个进程同时运行。
但是那个囧到我的astarAnticheat则很快就cha到了我的代码。
问了他怎么回事,然后发现自己做了很挫很挫的事情(详见聊天记录,后附)。

附上用来判相似的代码:
下载文件 (已下载 次)


聊天记录如下:
分页: 5/8 第一页 上页 1 2 3 4 5 6 7 8 下页 最后页 [ 显示模式: 摘要 | 列表 ]