写给即将加入IT人行列的同学们

一切仿佛昨日,不知不觉中俺离开校园却已经很久了,但很高兴看到新一代的软件人正在茁壮成长,期待你们走出校门成为软件人的新生力量!更期待看到你们不仅仅是优秀,而是能够超越自我的卓越!

软件开发既是俺的职业也是业余爱好之一,从DOS时代到一直走到今天,俺见证了中国软件业发展的重要阶段,同时也很自豪自己是其中的一名战士,其间苦乐尽在程序人生 --- 我用人生写程序,我用程序写人生。

俺是谁呢?其实这不重要。不过我能肯定的是我的代码或设计为大部分看到这段文字的人工作过,或者就在你现在的机器上,或者在你去办理什么日常业务的时候,或者在你看报纸杂志的时候,相信我的代码或者设计曾经为你工作过。呵呵。

我觉得你们已经很优秀,但是如果想听听一个前人的意见,想少走弯路,就简单说几点:

1. 看书只看经典书。这世界上能够帮助你的也能毁你的就三个东西:老师(广义的老师含所谓的专家学者)、书(广义的书含一切文字)、你自己。其中老师和你自己,你都很难改变现状,能够自我掌控的那就是书了。现在的书很多,但好书仍然不多,如果凭着自己的水平去选择书籍,不客气地说选到烂书的概率要大的多。烂书会误导你,会让你丧失学习的兴趣,会让你不知道自己到底在干什么,而且会耽误你看好书的时间。好在专业人员公认的经典书籍和网站并不多,相信你用点心就能得到一张列表。

2. 对本科生而言,最重要的科目是《数据结构与算法》,一定要学好。相信你们看到无数人提到这点,但俺想告诉大家学好的意思不是指考试分数,而是指你能领会算法的本质含义,可以根据需要灵活变形,可以组合多种算法和数据结构解决问题,更重要的是给出实际问题(而非考试题)能够选择合理、合适的算法和数据结构 ---- 这个选择需要综合考虑多种因素,如时间效率、空间效率、代价、维护性、扩展性等等。如果你还没体会到写程序最困难的部分是抉择,那可知你还处于非常初级的阶段,继续努力!

3. 除了上面这门课,还有就是《微机原理》、《操作系统原理》、《编译原理》。这几门课之所以重要是因为他们涵盖了你面前机器的一切基本原理,它们能告诉你从底层硬件开始到操作系统再到操作系统之上的应用程序,都是基于什么原理而工作的。因为这一切就是你们未来所开发软件的生存环境,如果对环境都不了解,那就如同不带地图就把你扔到一个大城市的某个角落,你终将迷失。这些课程不需要去记忆什么,只需要你理解其架构原理,体会到一种简洁之美,体会到一种系统化解决问题的方法。(其实,还应该加一本网络原理)

4. 在实际工作中,包括从毕业应聘面试开始,相信很多人首先开始后悔的就是没把上面2、3提到的课程学好,但紧接着会看到自己数学知识的贫乏。看到这里有很多同学喜欢人工智能相关的课题,那么最先遇到的数学需求就是《概率》以及《线性代数》。如果是从事研究工作的话,最后在巅峰挑战你知识缺陷的将是高等数学。当然,如果你这辈子只打算给小公司写点东西搭个网站什么的混口饭吃,那对数学的要求倒也不高,会加减乘除就够了。(不过如果是这么想的人,相信也没有耐心看到这里)。

5. 语言是最不重要的,但必须熟练掌握1~2种。说他不重要是希望大家不要花很多时间学习新的语言或者某个语言里某个罕见的用法,但因为语言是你的基本表达工具,所以你需要熟练掌握2种左右不同种类的语言。如果只选1种,个人认为应该是C++,再选一种的话建议是适合网络环境的script类解释语言或半解释语言。如java、C#等都是很好的选择。但同类语言没必要学好几个,所谓触类旁通,只要了解一类语言,其它只是语法问题,需要的时候3天就可以上手。但是即便学习语言也需要结合思考、反思和实践来学习,如果就是上课、完成作业,那跟没学是一样的。举个真实的例子帮助大家理解:在面试一个学生的时候,我看到他的简历里写着“精通C/C++”(提示:简历里切勿乱用“精通”、“熟练”),我问的第一个问题就是“既然你用过C,为什么又学C++?”,答曰“用C++开发容易”。“为什么更容易?”,答曰“需要的代码少”。“用C++写的软件代码量就比用C写一定少吗?另外一个问题是如果用汇编写代码量会更少,或者我们直接写机器码,代码量一定最少,因为你写的几百K的C++代码编译成机器码后只有几K而已?”,答曰“你写的机器码不能在不同硬件上运行”。呵呵,这个回答纯属扯淡,实际上所有用C++能做到的事情,理论上直接写机器码一定可以做到,他没有明白问题的目的在哪里,经过一番开导,他终于开始说有关C++等封装、继承、多态等。但是依然有问题等着他,一个是具有同样功能的语言还有很多,为什么选择C++呢?我希望他的选择是有逻辑思考的支持。另一个问题是“对机器而言,它根本不在意你是否封装,是否使用多态或者继承,只要编写正确它一样执行,那么回到问题的开始,我们为什么需要C++?”。问到这里,他已经无法回答了。实际上,我希望他能理解到写程序读程序的是人而不是机器,是人就会犯错误,犯错误的根源来自于大脑的限制,例如我们的大脑不能够同时思考超过10个单元以上的因素,我们每个时刻只能有一个思考的线索......因为人脑的限制,才有了技术的发展来弥补我们自身的缺陷。

6. 写好程序不容易,哪怕是最简单的一段代码也不容易。在研究各种超难的算法之前,先把程序写好,养成良好的习惯。对于算法和数据结构,俺觉得需要掌握的就是最常用的并且领会其基本精神。例如栈、链表、树、排序、搜索、索引、递归、分而治之、线性规划等,再看看像《编程珠玑》这样的书就可以了。有些算法如果只有Knuth才能想到的话,你学了也就是背下来而已,这跟我知道哪本书里有这个算法本质上没有区别,实际工作没有人会阻止你查资料的。所以,与其花时间去干这些没有太大价值的事情(除非觉得自己有Knuth的数学天赋),不如把一段代码写好。为什么说简单的代码也不容易写好?那不妨问自己几个问题:1. 函数名、变量名命名合适吗?能否让读者根据名称就能猜测到它的用途、含义、类型? 2. 有没有做安全检查?有没有安全漏洞?3. 是否容易看懂并符合多数专业人员的习惯?4. 还有没有可改进的地方,比如速度更快?更节约空间?更容易维护?5. 有没有缺少必要的注释或者有多余的注释? 6. 格式是否美观?在不同编辑器上看是否不同?

// 不妨测试一下,看看下面这个函数有哪些问题(隐含有好几个不可接受的错误)?有哪些可改进之处?
// 该函数用于将buffer1和buffer2的字符串合并到buffer3中
void Combine(char* buffer1, int len1, char* buffer2, int len2, char* buffer3, int len3)
{
 if ((len1+len2)>len3)
        {
        return;
        }
       
        memcpy(buffer3,buffer1,len1);
        memcpy(buffer3+len1,buffer2,len2);
        return;
}

7. 写程序不是软件开发的全部,可是说只是一小部分。如果说写程序相当于贴瓷砖或者铺管道的民工,那么对开发人员的要求就是你既可以把瓷砖贴好管道铺好,更需要你能够设计出坚实、可靠、实用、好用的建筑。你的真正价值取决于你能盖个厕所还是能设计建造摩天大厦,更高的要求是你能够设计出经典的堪称艺术的作品如赵州桥、悉尼歌剧院等。如果以大家能见到的建筑业作类比,相信更容易明白简易厕所和悉尼歌剧院之间的差别有多大。实际上,差别比这还要大,因为企业期待你可以创造出用户还没有想到的需求,期待你的思考定位在若干年之后。所以,这么说相信大家可以明白从事软件开发需要各方面综合能力,不仅仅是写好程序熟悉算法就可以的,甚至也不是仅仅技术造诣就可以的。你设计的楼房多好,如果没人投资没用、成本太高没人买没用、施工队不能顺利施工没用、没有公共水电煤气部门的配合没用、没有其他设计师支持没用、盖好了就过时了没用、维护成本太高没用、妨碍城市整体规划会被拆掉、地基不合适会没建成就倒塌、不符合多数人口味没用、一阵台风或者一次小震就开裂的没用、假冒伪劣材料被使用了没用......

............哈哈,有机会再聊

(本文从前本人Blogs搬家过来的)

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值