您的位置:首页 > 其它

【转】工作经验到底是什么东东

2010-06-08 12:55 169 查看
关于经验

关于经验的
积累跟项目有一定的关系,但并不是全部。对于ASP.NET
开发大部分可能会有这么一个过程:

首先是觉得
服务器控件挺好用的,在开发中大量使用服务器控件;

经过一段时
间的开发之后(也可能是听别人说),会发现服务器控件并不是想象中完美无缺,在VS2010
之前很多
ASP.NET
控件默认会启用
ViewState
来保存控件状态,这样在最终生成的
HTML
页面的源代码中生成了大段的隐藏域字段,影响了网页的传输速度,慢慢地我们会发现其实
ASP.NET
服务器控件最终到客户端时会被转换
HTML
代码,那么使用
HTML
服务器控件也是可以的,并且还省去了转换这个过程,所以在开发时尽量不处处使用服务器控
件;

再经过一段
时间之后,我们会发现有些复杂的效果与其去层层嵌套服务器控件,还不如直接将这部分特殊效果的HTML
代码输出,这样更方便快捷,然后我们也会想到有些操作其实用
JavaScript
也可以在客户端实现而不是必须要提交到服务器端才能处理,这样又提高了效率;

再过一阵子
之后,我们会觉得SELECT * FROM Table
尽管什么时候都不会出错,但是并不是最高效的,在某些时候我们只
SELECT
要显示的字段,除此之外当数据库中的记录一多时每次都将数据库中的记录全部查出来再取出
需要显示的部分不显示的数据被弃之不用很浪费资源,所以会想到使用分页查询每次只查询当前页所需要的数据;

再过一阵子
之后我们又会觉得原来那种对数据库执行增删改查的操作的代码每页都有,非常不好维护,第一步分析之后会想到使用数据库通用类,再仔细分析之后可能就会发现
三层架构的好处进而接受了三层架构这种思想;

再继续思考
总结,我们又会发现其实在SQL
方面有很多名堂,比如存储过程、触发器、函数、分组函数、联合查询、
UNION
等,也就是有些结果可以直接在数据库里进行处理而不是将多次结果分别取出来在
C#
中处理,尽管可以实现同样的功能,但是在数据库中处理可能更加方便和直接。

当然这些都
还是初级程序员所面临到的一些问题,如果真想提高自己,可能会注意到更多问题。比如到了一定程度之后我们会接触到不同的数据库,我们要对比分析一下这些数
据库之间的异同点;我们还会注意到实现同一种效果会有不同的做法,我们要注意不同的做法之间差别——哪种做法效率高?哪种做法占用内存小?哪种做法安全性
高等等。比如做ASP.NET
开发,可以使用服务器控件、可以使用
HTML
客户端控件、可以采用
Response.Write()
的方法直接输出及模板替换法,你觉得它们之间有什么区别?同样存储数据,
Cookie

Session

Application

Cache
都可以保存,它们之间又有什么差别(提示:可以从保存数据类型、范围、保存周期、安全性
等方面考虑)?再比如非
ASP.NET
应用和
ASP.NET MVC
应用之间应用有什么区别?再比如
Convert.ToInt32()

int.Parse()

Int32.TryParse()
都是可以实现将字符串转换成
int
类型数值,它们之间在用法上有什么区别?有没有想过它们内部的实现呢?如果让你写一个类
似于
Int32.TryParse()
的方法,你想过会怎么写吗?
XML WebService

WCF

.Net Remoting
之间有可比性吗?在使用它们时该考虑哪些因素?参数化
SQL
语句和非参数化
SQL
有什么区别?在存储过程中执行的一定就是参数化
SQL
语句吗?
string

String
之间是什么关系?什么叫字符串驻留池?什么叫数据库连接池,数据库连接池有什么用途?和
诸如此类的问题有很多,实在是举不胜举了。

以上的问题
有多少使你感到难以回答?如果你能比较自信地回答上面的大部分问题,恭喜你已经具有中级程序员的开发经验了。我不知道辞海里有没有对“工作经验”这个词下
定义,根据我的理解我觉得程序员的工作经验包含了两个方面的经验:社会方面的经验和技术方面的经验。社会方面的经验包括了比如生活与工作产生了冲突该怎么
处理及与领导在某些问题上意见不一致该怎么处理等,这个如果不是应聘技术管理方面的岗位面试单位关注得比较少。技术方面的经验招聘单位会更看重一些,通常
所说的程序员的工作经验也主要是指技术经验。它至少包含了以下几个方面:

对于一些常
见的编译错误和异常描述我们能迅速知道问题出在那里并及时解决;

对于一些可
能会有多种方法实现的功能,我们应该如何根据当前项目的实际情况选择比较合适的方法;

对于一些容
易影响性能的地方我们应该知道一些如何提高,如果存在多种解决办法,如何去评估那种办法的效率高;

对于一些容
易发生安全性问题的地方我们应该知道如何去防范;

对于具体的
应用如何去设计数据库或者去评估已经存在的数据库的设计好坏,如何在第三范式和字段冗余之间取舍;

如何在时间
复杂度和空间复杂度之间取舍,知道如何用空间换时间(比如使用缓存就占用了内存但是换来了效率的提高,但是缓存并不是使用越多越好,此外对于数据库中索引
字段也存在这样的问题);

对于常见的
问题我们应该知道如何去处理;

对于从来没
有遇见过的问题我们又该如何借鉴已有的经验来处理而不是束手无策。

要解答以上
问题,可能要求我们的知识面要相对广,在某些问题上要有一定的深度。实际上上面的这些问题已经脱离了语言本身了。在武侠小说中经常听到高手会说所有的武功
最终都是百川归海,在编程开发中我们经常会听到编程高手会说“语言只是一种实现手段,重要的是思想”,那么思想到底是什么呢?为什么有人要求在项目中某个
类只允许一个实例存在你就会想到单例模式?这就是经验,但是经验是什么呢?真的不好定义,尽管在上面我列出了经验的一些体现,但是那并不是全部,我只能说
“经验是一种很玄很玄的东西”。

如何积累经验

不要晕,也
不要倒,其实我们有很多办法增加自己的经验。围绕磨盘转了一辈子的骡子并不是一头有经验的骡子,将木棍捅到蚁窝中来捕食蚂蚁的熊也没有太多经验,因为它们
做那些事情不是出于被指使就是出于一种本能,很少去想是不是可以做得更好,而我们的祖先就做到了,所以今天我们成了世界的主宰。

说到这里,
也就说出了我的第一个答案:

术的深度来自于总结

不管是学习还是做项目,不管是自己编写的代码还是别人的代码,我们都尽量学会分析总结,首先分析一下那些地方做得好,那些地方做得不好,做得好是因为什么
方面的原因?安全、高效亦或者是其它?这种好的做法今后可以用在某些场景下?有没有可能存在比这些你认为做得好的方法还要好的方法?对于那些做得不好地
方,又该如何去改进?特别是以前自己所做的项目一定不要做完了就算完了,有时间一定要拿出来经常看,看看最近所学的知识有没有可以用于改进这些项目的。

也许有些朋
友特别是初学编程的朋友会说自己以前根本就没有做过真实的项目,缺乏实战机会。光凭自己所做的工作上所做的一些项目可能对于个人提高不是很快,会受到公司
业务的限制,项目类型不是太多,所需要用到的知识自然也不会是太多;或者在一些大公司里面,由于在这里一个人一个坑,每个人的职责单一,一个项目做上一年
你可能仅对自己所负责的模块比较熟悉,对于项目组其他成员的模块不熟悉,时间长了之后就会感觉自己进步很慢,这种感觉我以前也有过。

在当时我做
了几件事情,我现在总结起来觉得比较有用:

一是通过论
坛、博客了解别人在做项目中使用了哪些技术。多次被提及的多半就是目前大家比较关心的或者流行的,如果自己的项目中没有涉及到这些的话,多了解一下这方面
的讨论或者文章看是否满足在自己项目中使用,如果不能的话(比如自己目前是在VS2005
下做开发,而别人经常谈论的是
VS2008
下的开发)那么就尝试在下班后或者工作之余动手实践一下。

二是总结自
己以前所做的项目。很多人在做项目时键盘上最光亮的键就是Ctrl

C

V
(因为最经常的操作是
Ctrl+C

Ctrl+V
),可能在当时我们这么做有一定的客观原因,比如当时时间紧为了完成任务不得不那么做,
这个可以理解,但是不应该在做完之后就将它丢到一边了,等到下次再用的时候依然又是
Ctrl+C

Ctrl+V
——这么下去,做多少年都不会提高的(除了提高了使用
Ctrl+C

Ctrl+V
的熟练度之外),我就有这么一个习惯,保持着几年前甚至刚参加工作时所做项目及学习用的
代码,有时间我还会拿出来看,看看对于以前那个时候做的东西现在可不可以改动得更好,直到经过几次之后确实不能再改了才放弃。

三是总结别
人的项目。现在的网络这么发达,可以很方便地从网上找到一些项目的需求文档、设计文档、源代码等,对于一些比较有名的开源项目甚至你还可以找到有高人对这
些项目的源代码的分析。接触过的项目多了,你就会发现有很多功能和你以前所做的项目中要实现的功能相似,那么就把你的代码和别人的比较一下吧,有比较就有
鉴别,有比较就有高下之分,你就会看到完成同样或类似的功能,别人的做法就比自己好,自己好好想想好在哪里,以后是不是可以借鉴别人的思路。

四是多关注
一些基础的东西。武侠小说里正派武功高手在成为高手之前总会被要求长时间练基本功,基本功打好了就很容易打通任督二脉,然后很快就可以练就一身过人本领,
这样对自身是没有伤害的,而邪门武功大多不要求武术根基很快也能练成,这样即使练成了绝世武功也会容易对身体造成伤害,还可能走火入魔,著名的《避邪剑
谱》及《葵花宝典》都是这方面的例子。很多半路出家的以及一些从培训学校出来的学生大多就是基本功不好,我自己就是半路出家的,在大学里学过一学期的C
语言之后就靠自己自学走上程序员的道路,很长一段时间对数据库的使用仅限于使用
SELECT

UPDATE

DELETE

INSERT

ORDER BY

COUNT
,在看别人项目源代码时经常看到别人项目中复杂的
SQL
语句,感觉自己有必要加强基础,于是花了很多时间去系统学习了数据库的基础知识。

五是多动手
实践。“纸上得来终觉浅,须知此事要躬行”,如果仅仅是看别人的代码,看书可能就在看书的时候有感觉,合上书之后就什么也不记得了。所以还需要大量实践,
有一定基础之后系统的实践比单独联系一个知识点要强得多,比如找一个自己觉得不错的BBS
或者
CMS
之类的系统,为防止自己忍不住看它的源代码所以这些项目的语言尽量不要选用
ASP.NET
的,然后要求自己实现一套和它相似度很高系统出来。在这里注意几点,一是在选项目时尽量
量力而行,不要一上来就想模仿一个庞大的系统,庞大的系统涉及到知识面很广,知识点要求也比较深,工作量也比较大,一个人可能费时较长还没有看到结果就会
产生挫折感,就会放弃,所以可以先模仿小系统然后再模仿大系统;在编程语言方面可以先选择比较容易部署的编程语言开发的,比如
ASP

ASP
的运行环境在
Windows
平台上的
IIS
中部署起来相对较为简单(在
IIS7
之后稍微麻烦一点),等熟练之后可以模仿
JSP
或者
PHP
开发的系统,这些系统的部署相对较为复杂一些,可能数据库会采用
MySQL
,而
Web
服务器可能会是
Tomcat
或者
Apache
(它们也可以采用
ISAPI
的方式集成到
IIS
中)。在模仿的过程中会用到
HTML

CSS

JavaScript

SQL
等方面的知识,有的时候还需要了解别人的设计思路,对于自己的提高是想到有效的。除此之
外,在提高
ASP.NET
编程能力的同时也顺便了解了其它编程平台和数据库,扩大了视野。

好了,在最
后我回答一下你在邮件中提高的几个想法,关于你在邮件中提高没有环境和没有高手带的情况,我想在上面提高的五点中的第五点可以回答你的这个想法,有环境有
高手带固然是好,但是没有环境没有高手带我们也是可以通过其它办法来解决的,比如看高手所做的项目并且模仿它,这样也可以达到目的。和高手合作对自身的能
力要求很大,大家知道微软、Google

IBM
中高手多,在这样的公司里进步会很快,但是没有一定的能力是进不去的,所以在没有机会进
去之前我们不妨采取上面的办法——实际上也有很多在民间的高手,他们并不在知名大公司,但是他们一样可以做到很好。

除了上面的
做法之外,其实还有一些手头可用的比较方面的资源,比如MSDN WebCast
上面就有微软推出的大量免费视频,我们可以挑选一些下载下来看,在早年的时候我就从上面
学到了不少东西,你在邮件中提高的
ASP.NET MVC
在上面就有系列讲座,还有比较热门的
Silverlight

Linq
等,只不过不要贪多贪全,千辛万苦全部下载到硬盘里然后一个不看,只看看自己关注的部
分,实际上里面的视频大部分是
Level200
的,也就是针对普通开发人员的,比较容易理解。等你有一定能力之后就可以选择不看或者有
选择地看了。

除此之外,
我不知道你安装Visual Studio
的时候有没有安装随光盘自带的
MSDN
,安装完
Visual Studio
开发工具之后就会提示是否安装它,我建议将开发中会使用到的部分安装了(因为涉及到的知
识很多,没有必要全部安装,有些可以不必安装),这样遇到问题之后即使不能上网也能有有地方查资料。在
MSDN
帮助中有
.NET Framework
种每一个类的介绍,包括类的说明、构造函数、方法、字段、属性、显示接口实现、请参见
等。对于
VS
开发人员来说它的作用相当于机器猫的口袋,需要的大部分都能从这个里面找到。像你提到的
序列化以及一些经常被提到的正则表达式、
Web Service
等也可以在
MSDN
中找到,有时间的时候可以看看,在有些地方还有一些提高程序性能或者安全性的建议。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: