论:如何成为有思想、能创新的程序员

开发
作为一家公司的首席架构师,该如何思考业务的具体实现?你应该做一名有思想、能创新的程序员。那具体该怎么做呢?

写这篇文章也源于我和新员工的一些谈话心得,一些基础比较薄弱的技术人员,看起来有点像没有思想和灵魂的程序员。你可能也会觉得国内有很多小企业出来的人或者刚毕业的人,会的最多也是CRUD和拖拉控件。我也接触过一些技术人员,他们告诉我他们再也不想搞技术了,因为技术是在太无聊了,特别年纪稍大一点的,想的最多的就是转行。曾经我非常惊讶于这样的状况,事实上,写程序是一件很有创造力的事情,但为何很多人都会觉得无聊呢。

随着年纪的增长,这些问题的答案慢慢变得清晰一些。在这里,我不敢说,我说的都是正确的,我只是在一直不停的探索。在探索之后,我对我的新员工说了以下的话:“进入我们公司,虽然我们也是很不起眼的刚创业的小公司,但是,你在这里需要做一些改变了。我知道你们以前的工作性质可能是上司给你交代任务,告诉你怎么做,然后你管也不管就照章办事,拉拉控件,以完成项目功能为首要任务。在我们这里,你需要成为一个有思想的程序员。有思想的程序员需要懂得如何使用聪明的脑袋瓜。事实上,很多人都不知道我们的脑袋瓜到底能做多少事情,不过,一旦你尝试了,你就会体会到‘不是做不到,而是想不到’。需要记住这些话,从思想上改变,从今天开始。首先,我们是做软件产品的公司,质量是产品生存的首要标准,产品质量的最低要求就是易用性;其次,我们要保证产品的质量,代码的质量首先要过关,标准编码方式、异常处理方式、代码的生命周期管理、编码的完整性都需要兼顾;第三,避免写一些垃圾代码和重复的代码,这需要动用你聪明的脑袋,我曾经写了10几个的CRUD产品,从而自主创新了控件关系映射、对象-对象映射、通用窗体框架,乃至我们现在的OSGi.NET产品和云计算SaaS商店平台,都是从这些重复的劳作中不断思索发明的。我看到设计模式的书时,可以骄傲的向同学们吹牛,我也设计过几个‘模式’;第四,学会发现问题,探索问题,积极询问,避免把问题遗留下来或者拖机取巧。浪费一个发现问题和解决问题的机会,相当于浪费提高自己的机会。最后,你要有信心成为一流有思想和灵魂的技术人员,别哪一天你离开尤埃时,丢我们的脸,:)。”

我不敢说,我现在多有思想,但是,我隐隐约约感觉到一些这样的有意思的东西。我崇拜“道法自然”,它告诉我违反规律就会受到惩罚,因此,我会时刻反省我是否有做错的事情,包括在平时编码、设计和架构的时候,以及平时生活上的为人处事。接下来,我介绍一下,我如何来发明我曾经的产品,希望能够给人一些启发。

1 我是如何发明了控件关系映射组件

控件关系映射的发明源自于我在参与一款MIS系统的设计,该系统是一个钢管管理系统,每一个钢管的信息有很多很多的属性,我记得钢管厂给我们的数据说明书里面,一个管子的信息有惊人的380多列。因此,我们在查询、修改、添加记录的时候,总是会有类似以下成片成片的代码。

  1. var add***Sql = "insert into Test(a1,a2,....aN) values(@a1,@a2,....@aN)";  
  2.  ......  
  3. var para1 = new SqlParameter("@a1", SqlDbType.String, a1.Text.Trim();  
  4.  var para2 = new SqlParameter("@a2", SqlDbType.String, a1.Text.Trim();  
  5.  ......  
  6.  var paraN = new SqlParameter("@aN", SqlDbType.String, a1.Text.Trim(); 

(忽略中间的N-3行代码,以及查询、修改和删除的代码)

我记得,我们一起做的另一个小伙拿了一个CRUD一千多个字段的表来向我们显耀说:“我他妈的把这功能实现了!”。我不知道大家是否反感这样的代码,反正我是厌倦了。当我想到这是一件很痛苦的事情的时候,我考虑了如何来解决它。经过一些思考,我惊讶的发现,所有的CRUD以及界面的流程都可以抽象为“输入-处理-输出-输入-处理-输出......”的过程,处理的过程实际上是获取输入,然后组装成SQL语句,最后在响应到界面。这个过程是以SQL语句为中心,SQL语句的参数来源于界面的控件或者界面类的其它成员,SQL语句执行的结果可能是跑到另一个页面、执行DataGrid绑定、执行下拉列表绑定、给控件赋值。因此,我想到一个方法,可以设计一个SQL映射的配置,即利用这个配置,直接将界面控件映射到数据库,并且也可以执行反向映射。以下是映射SQL的配置:

  1.  <?xml version="1.0" encoding="utf-8"?> 
  2.  <CrmMappings Class="HumanDispSolution.login" > 
  3.      <MappingSQL GenType="None" Name="Login" Value="select UID,Name,Sys_User.RID,Role from Sys_User,Sys_Role where Sys_User.RID=Sys_Role.RID AND UID=@UID AND Password = @PWD" SqlOpType="SELECT" CmdType="Text" > 
  4.          <SqlParams > 
  5.              <SqlParam Name="@UID" ControlID="UID" ParamType="String" IsFile="False" > 
  6.              </SqlParam> 
  7.              <SqlParam Name="@PWD" ControlID="PWD" ParamType="String" IsFile="False" > 
  8.              </SqlParam> 
  9.          </SqlParams> 
  10.         <SqlResults > 
  11. <SqlResult Field="Name" MemberID="UserName" IsStatic="True" AssemblyName="HumanDispSolution" StaticTypeName="HumanDispSolution.UserConfig" > 
  12.             </SqlResult> 
  13. <SqlResult Field="UID" MemberID="UserID" IsStatic="True" AssemblyName="HumanDispSolution" StaticTypeName="HumanDispSolution.UserConfig" > 
  14.             </SqlResult> 
  15. <SqlResult Field="RID" MemberID="RID" IsStatic="True" AssemblyName="HumanDispSolution" StaticTypeName="HumanDispSolution.UserConfig" > 
  16.             </SqlResult> 
  17. <SqlResult Field="Role" MemberID="Role" IsStatic="True" AssemblyName="HumanDispSolution" StaticTypeName="HumanDispSolution.UserConfig" > 
  18.            </SqlResult> 
  19. <SqlResult InvokeMethod="Log" IsStatic="True" AssemblyName="HumanDispSolution" StaticTypeName="HumanDispSolution.Logger" > 
  20.                <InvokeParam Value="登入系统" > 
  21.                 </InvokeParam> 
  22.             </SqlResult> 
  23.        </SqlResults> 
  24.     </MappingSQL> 
  25. </CrmMappings> 

以下是调用映射SQL语句实现CRUD中的一个操作。

  1.   namespace HumanDispSolution  
  2.   {  
  3.       public class login : CrmPage  
  4.       {  
  5.           private void btnLogin_Click(object sender, System.EventArgs e)  
  6.           {  
  7.               DataSet ds = this.ExecuteMapping("Login"as DataSet;  
  8.               if(ds.Tables[0].Rows.Count > 0) //登入  
  9.            {System.Web.Security.FormsAuthentication.RedirectFromLoginPage(UID.Text,false);  
  10.              }  
  11.              else 
  12. this.lAlert.Text = "<script language='javascript'>alert('登录失败,请重新输入帐户信息!');</script>";  
  13.          }  
  14.      }  

另外,我还编写了一个工具来自动生成这样的配置文件,从此以后,关于数据库的CRUD,我爽了!!

2 我是如何发明了通用窗体框架

控件关系映射的发明也是源于上面提到的钢管系统。当超过2个人一起参与一个复杂项目时,可能他们都需要操作主界面,在主界面加上各自模块需要的菜单、需要的界面元素,此外两个人设计的东西也完全不一致。这就造成一些问题了,因为如何实现两个人的集成就有一些麻烦,而且经常出现意外。于是我就发明了一个通用窗体框架,这个框架提供了以下功能:

(1)集成用户权限;

(2)集成数据访问;

(3)插件式支持,每一个人都可以并行开发,集成时仅需要将配置文件集成一起就形成一个组装起来的软件了。

每一个开发人员只需要编写类似以下的配置文件就可以集成了:

  1. <?xml version="1.0" encoding="utf-8" ?> 
  2.  <MainForm> 
  3.      <Menus Name="菜单"> 
  4.          <Menu Name="系统(S)" LeftIndex="3" TopIndex="1" Command="" Class=""> 
  5.              <Menu Name="登录管理" LeftIndex="1" TopIndex="1" Command="" Class=""/> 
  6.              <Menu Name="欢迎" LeftIndex="2" TopIndex="2" Command="" Class="CZB.Framework.WelcomeForm"/> 
  7.              <Menu Name="退出" LeftIndex="3" TopIndex="3" Command="Close" Class=""/> 
  8.          </Menu> 
  9.            
  10.         <Menu Name="数据导出(B)" LeftIndex="2" TopIndex="3" Command="" Class=""> 
  11.             <Menu Name="导出Excel" LeftIndex="2" TopIndex="2" Command="" Class="SalaryManagement.UI.frmExport"/> 
  12.         </Menu>          
  13.     </Menus> 
  14.       
  15.     <ToolButtons Name="工具栏"> 
  16. <ToolButton Name="工具栏名称" Index="1" ImageIndex="1" Visible="true" Roles="" Command="HideOrShow" Class="工具栏名称" /> 
  17.      <ToolButton Name="工具栏名称1" Index="2" ImageIndex="2" Visible="false" Roles="" Command="" Class="工具栏名称1" /> 
  18.     </ToolButtons> 
  19. </MainForm> 

3 我是如何设计了对象-对象关系映射

ORM对于一些小型应用感觉有点庞大,但是对于大型应用,我想是一个比较总要的组件了。在我们使用ORM组件时,也经常会写以下代码。

  1. var user = new User();  
  2. user.Name = NameTextBox.Text.Trim();  
  3. user.Password = PasswordTextBox.Text.Trim();  
  4. ......  
  5. OrmFactory.Save(user);  
  6. ----------------------------------------------  
  7. var user = OrmFactory.QueryScalar(...);  
  8. NameTextBox.Text = user.Name;  
  9. ...... 

如果一个MIS系统充斥了大量这样的代码,估计你也会腻味,从而丧失对编程的兴趣了。记得我刚才说什么来了,“有问题,意味着升华”,“做一个有思想的程序员”。因此,接下来的问题就是,我们如何来解决类似这样重复的劳动。我在2006年时想到的办法就是实现一个对象-对象的映射。首先,设计如下实体类:

  1. public class UserEntity  
  2.  {  
  3.      ……  
  4.      [Member]  
  5.      public int Age;  
  6.      [Control]  
  7.      public string Name   
  8.      {  
  9.          get { return this._Name; }  
  10.         set { this._Name = value; }  
  11.     }  
  12.    [Control("CardNo.Text")]  
  13.     public string CardNo   
  14.     {  
  15.         get { return this._CardNo; }  
  16.         set { this._CardNo = value;    }  
  17.     }  
  18.     ……  
  19. }  
  20.  
  21. public class EmployeeEntity  
  22. {  
  23.     ……  
  24.     [Reference(typeof(UserEntity))]  
  25.     public UserEntity User  
  26.     {  
  27.         get { return this._User; }  
  28.         set { this._User = value; }  
  29.     }  
  30.     [Control]  
  31.     public float PostSalary   
  32.     {  
  33.         get { return this._PostSalary; }  
  34.         set { this._PostSalary = value; }  
  35.     }  
  36.     ……      

其次,调用ObjectEngine实现OO映射。

A 实现表单类与实体类映射

  1. private void Map_Click(object sender, System.EventArgs e)  
  2. {  
  3. this.o = CZB.ObjectMapper.ObjectEngine.Map(this,typeof(EmployeeEntity)) as EmployeeEntity;  

B 实现实体类与表单类的映射

  1. private void InverseMap_Click(object sender, System.EventArgs e)  
  2. {  
  3.     this.o.User.Name = "c.z.b in";  
  4.     this.o.User.Age = 19;  
  5.     this.o.CompoInsurance = 0;  
  6.     CZB.ObjectMapper.ObjectEngine.InverseMap(this,o);  

4 我是如何设计OSGi.NET和SaaS商店产品

至于OSGi.NET和SaaS商店是我在不断思索通用窗体框架以及对现有科技的趋势的把握下,由几个很有创造力的编程人员,在建立了完善的产品保障体系下,构建起来的。这两个产品我会在后面介绍如何设计的。他们的设计我用了很长的时间。

我不是什么老鸟,希望我们在如此多的技术的世界中能够多多交流,共同进步。解决这些问题,不仅增加了编程的乐趣,更是增加了自己的见识,从而避免自己成为一个没有思想的程序员!我也知道,我们可以找到很多理由来反驳文中提到的做法和观点,但是,提高自己才是最重要的,不要去着急的否定一些什么,并给自己找借口。

原文链接:http://www.cnblogs.com/baihmpgy/archive/2010/12/14/1905144.html

【编辑推荐】

  1. 程序员的十大技术烦恼
  2. 架构师最怕程序员知道的10件事
  3. 每个好架构师都是一位出色的程序员
  4. 程序员必须养成良好的代码习惯
  5. PHP程序员如何突破成长瓶颈
责任编辑:彭凡 来源: 博客园
相关推荐

2023-11-06 07:19:11

程序员GitHub社交媒体

2015-11-12 10:32:13

程序员FaceBook

2011-11-09 13:52:04

程序员

2015-05-13 14:06:03

程序员糟糕的程序员

2009-07-24 13:09:57

ASP.NET程序员

2009-07-01 16:48:43

JAVA程序员

2012-12-12 09:52:18

程序员

2017-09-21 09:44:00

编程程序员软件开发

2021-02-21 13:49:48

Java程序员开发

2011-05-03 08:54:36

2015-06-25 09:32:55

JavaScript程序员

2010-12-27 09:24:45

JSP程序员

2015-06-25 09:53:13

JavaScript程序员

2015-06-25 19:23:03

JavaScript程序员

2009-07-02 09:42:34

JSP程序员

2015-07-13 11:32:09

PHP程序员正确姿势

2017-10-09 15:04:55

程序猿新人

2013-07-25 09:40:01

程序员

2015-10-30 09:49:30

2015-05-15 10:39:44

Java 冠军程序员?
点赞
收藏

51CTO技术栈公众号