Chinaunix首页 | 论坛 | 博客
  • 博客访问: 8018181
  • 博文数量: 159
  • 博客积分: 10424
  • 博客等级: 少将
  • 技术积分: 14615
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-14 12:45
个人简介

啦啦啦~~~

文章分类
文章存档

2015年(5)

2014年(1)

2013年(5)

2012年(10)

2011年(116)

2010年(22)

分类: LINUX

2012-01-15 23:19:25

作者:gfree.wind@gmail.com
博客:blog.focus-linux.net   linuxfocus.blog.chinaunix.net
 
 
本文的copyleft归gfree.wind@gmail.com所有,使用GPL发布,可以自由拷贝,转载。但转载请保持文档的完整性,注明原作者及原链接,严禁用于任何商业用途。
======================================================================================================

首先,先汗一下自己的这个主题。作为一个毕业不过5年的软件工程师,写这个题目,似乎有点自不量力,因为一般都是大师才写这样的经验之谈。没关系,我已经准备挨砖了,就当抛砖引玉。

对于这个主题,我正在公司做一个简单的training,从基础一点点的讲起。也是自己的一点经验总结吧。说的不好之处,大家敬请批评指教。有机会的话,我也会把一些training的东西,分享给大家——是我自己的东西,不涉及公司机密呵。其中就有我博客中“编写安全代码”下面的内容。

1. 我认为最重要的因素是自己的主观思想,作为开发人员,他必须真正的热爱程序员这一行业,热爱coding,热爱自己的工作,热爱技术,对于写出优质健壮的代码有着强烈的愿望。只有这样,他才会自觉地提高自己,把代码写好,写漂亮。当兴趣与工作结合之后,才能做到事半功倍,享受coding的快乐。

2. 要注重细节,注重基本概念。这个观点看似简单,但是很多人却不重视。对于最基本的概念,只是知其然不知其所以然,甚至根本糊里糊涂。我面过一些工作5年的人,连对指针的理解还不透彻,仍然不明白“指针亦变量”这一简单的概念。当然,也许他们了解或者熟悉其它更高深的技术,但是以我看来,如果连最基本的东西都搞不明白,盲目的去追求热门或者新潮的技术,反而不够踏实。没有良好的基础,就去拔高,岂不在是建空中楼阁?

3. 在写每一行代码的时候,要明白这一行代码的真正意思和真正作用,要清楚对于这行代码背后,CPU到底会做什么操作或者什么运算。不记得是哪位大师说过,“如果你能理解程序每一个字节,那么该程序才会真正的无错”——大概意思是这样,我记不得原文了。做到这点太难了,我们只能尽力而为。

上面三点都比较泛泛,下面的几条就比较具体,不过也是相对具体呵:)

4. 要有良好的代码风格。记住真正的代码不是给计算机读的,而是给人读的,既包括你的同事,也包括你自己。当过段时间,你重读自己的代码时,都要感到费劲,更何况别人呢。这样的代码,谁来维护?当每个人的代码都有很好的可读性和可维护性,那么就容易理解整个儿系统了。系统的可靠性也就随之提高。

5. 要有良好的软件设计。我最喜欢的一个设计原则就是“Keep it simple”。这句话真是看似简单,做起来却很难。可以想想Unix的设计文化,我觉得就体现了这一观点。每一个命令功能都比较简单,但是将几个命令组合起来,就形成了强大和复杂的功能。当然,除了这一设计原则外,还有很多重要的原则,如减少耦合等。

6. 良好的软件开发流程。我是一名开发人员,对于整个儿的软件开发流程只是泛泛的了解,我更关心coding阶段的流程。Code Review是我认为可以减少bug的一个重要流程。当开发人员知道自己的代码需要别人review时,不自然的就会将代码写好,以避免别人对自己的不良评价和印象。另外,每个人思考的方式和角度都不同,换一个人或许就可以看出代码编写者忽视的问题。而且在代码的review过程中,参加review的人可以了解到不同模块的代码,对于熟悉整个儿产品都有所帮助,并且每一个人都可以在review发现的问题中,学到新的东西。

7. 提高自己的开发能力。扩大自己的知识面,熟悉自己的开发平台,系统,以及开发工具。以我个人而言,尽管我是一个Linux的程序员,但是对于windows的开发也有一些了解;尽管做上层应用居多,但是对于Linux内核也有一些了解;尽管是工作语言为C,但是对于C++也比较熟悉,至于linux上的各种脚本也是都有涉猎。尽管是软件工程师,但是对于硬件底层如CPU等也有一些了解。等等。至于有了比较宽广的知识面以后,才能在大脑中将各个知识点连接起来,真正形成一个体系。这样写出的代码,才有保证。

今天一共从七个方面说了说如何写出健壮的代码。其实这个主题太庞大了,可以找出更多的方面。另外就上面的七个方面来说,无论是哪一点,都可以继续展开。每个都是一个庞大的话题。这里只是泛泛而谈。

其实,最最重要的就是第一条:“热爱coding”。只要有了这一点,那么你就会很自觉地去努力,找到自己最适合的方法,写出优质无错的代码。

最后,用以前说过的一句话“我编程,我快乐”。然后一句话与大家共勉,成为一名top的程序员,天赋,机遇和努力,三者必不可少。但是成为一个good的程序员,我相信只要我们能力,都能做到。


阅读(11498) | 评论(9) | 转发(6) |
给主人留下些什么吧!~~

wzb562012-03-23 14:34:04

指针是一个具有机器字长类型的整型变量,其值是另一个变量的地址^.
学习了!

Bean_lee2012-02-10 22:12:12

asuka2001: 测试先行的好处在于首先,你需要明白你的需求,你的模块边界,你希望设计出的正交性的接口,这其实不叫没有设计,如果完全的一团糟,那么思路都还没有理清,你怎.....
TDD对我这种能力一般的初级程序员还是很有用的,测试用例织起一道安全网,让你对自己的代码有一定的信心。我2010年培训过TDD,觉得不错,后来自己写一些小功能,自己都会测试下。当然,自己不是很严格,测试用例没那么周全。

著名程序员陈皓对 TDD有一些有意思的看法,当然,他对TDD颇有微词,但是也说的也挺有道理,只是我目前层次比较低,还理解不到陈皓的那种层面。

asuka20012012-02-03 12:43:34

GFree_Wind: 挨个回复吧。
1. 互相审查确实非常好。因为即使是大师,其仍然是人类哈,难免会有考虑不周和思维死角或盲点。通过审查,可以在代码编写阶段就消除一定的bug。另.....
测试先行的好处在于首先,你需要明白你的需求,你的模块边界,你希望设计出的正交性的接口,这其实不叫没有设计,如果完全的一团糟,那么思路都还没有理清,你怎么可能知道测试些什么?

当理清思路,有了比较清晰的想法,知道模块边界和接口所在了,针对模块功能,写出测试代码,这个就限定了你的模块和功能,以及你的预期结果。你看,实际还未编写功能模块,你已经非常清晰的把握了整个模块的大体脉络。

最后编写实现代码,让所有的测试都通过。这个时候你的预期功能已经实现,当你的实现自己觉得不满意的时候,你改动代码,有测试代码为你提供自信,不用担心引入bug。

我说的都比较浅显,毕竟自己也才刚使用TDD方法不久,但是感觉

GFree_Wind2012-02-03 12:13:44

asuka2001: 首先人的思维有盲点,健壮需要共同的努力:与同事协作,互相审查。很可惜我的公司没有这种氛围,很无奈!

代码可读性高:首先意味着你思路清晰,我相信思路越清.....
挨个回复吧。
1. 互相审查确实非常好。因为即使是大师,其仍然是人类哈,难免会有考虑不周和思维死角或盲点。通过审查,可以在代码编写阶段就消除一定的bug。另外审查的过程中,大家还能互相学习。关于公司没有氛围一说,不知道是否没有审查的流程。

2. 很赞同你的观点。这也是为啥要看重设计的原因。

3.我还没试过测试驱动开发的方法。感觉其不适合我的工作。另外,如果连设计都做好,代码也没有写好,写出的测试用例究竟有多大作用呢?我对测试驱动不熟悉,望指教。

asuka20012012-02-03 11:18:06

首先人的思维有盲点,健壮需要共同的努力:与同事协作,互相审查。很可惜我的公司没有这种氛围,很无奈!

代码可读性高:首先意味着你思路清晰,我相信思路越清晰,才越不容易留下阴暗面;其次意味着你精雕细琢,追求完美,意味着多次审视,反思自己的代码,找出隐患的几率自然提高;最后,别人帮你审查代码也能更容易读懂你的思想,帮你找出问题

不盲目自信,请让测试说话:人的思维是有盲点的,同样我们的认知也有盲点,我欣赏测试驱动开发的方法,无论如何,请让测试先行,重视测试!

看了博主的精彩博文,有感而发,随意的写了写,呵呵比较粗浅,还请见谅!