现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

IT新人必看:经验从何处来

2014-09-06 21:25 工业·编程 ⁄ 共 5552字 ⁄ 字号 暂无评论

关于经验的积累跟项目有一定的关系,但并不是全部。对于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 中找到,有时间的时候可以看看,在有些地方还有一些提高程序性能或者安全性的建议。

    最后,建议有时间提高一下英语,如果还有时间的话再学习一下UML 相关的知识,这些东西在短期内似乎对你没有什么帮助,但是对于你的长远发展是大有裨益的。如果你还有不明白的地方,请继续和我保持邮件联系。

作者:周金桥

给我留言

留言无头像?