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

简介:
写这篇文章也源于我和新员工的一些谈话心得,一些基础比较薄弱的技术人员,看起来有点像没有思想和灵魂的程序员。你可能也会觉得国内有很多小企业出来的人或者刚毕业的人,会的最多也是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              {
10                  System.Web.Security.FormsAuthentication.RedirectFromLoginPage(UID.Text, false );
11              }
12               else
13                   this .lAlert.Text  =   " <script language='javascript'>alert('登录失败,请重新输入帐户信息!');</script> " ;
14          }
15      }
16  }
复制代码

 

另外,我还编写了一个工具来自动生成这样的配置文件,从此以后,关于数据库的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      ……    
37  }
复制代码

 

其次,调用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;
4  }

 

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);
7  }
复制代码

 

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

 

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

 

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


本文转自道法自然博客园博客,原文链接:http://www.cnblogs.com/baihmpgy/archive/2010/12/14/1905144.html,如需转载请自行联系原作者
目录
相关文章
|
9月前
|
架构师 算法
架构师培养计划-无限思维——变量
架构师培养计划-无限思维——变量
47 0
|
9月前
|
设计模式 算法 程序员
培养编程思维的关键——从最基础开始
在当今信息时代,编程已经成为一项不可或缺的技能。而要成为一名优秀的程序员,除了掌握具体的编程语言和工具,更重要的是培养良好的编程思维。本文将从最最基础的层面入手,探讨如何培养编程思维。
150 0
|
11月前
|
设计模式 消息中间件 Dubbo
设计模式 - 漫谈软件编程背后的系统化思维
设计模式 - 漫谈软件编程背后的系统化思维
80 0
|
缓存 算法 Java
运用跨界思想体悟软件设计
运用跨界思想体悟软件设计
运用跨界思想体悟软件设计
|
架构师 程序员
提高程序员思维的几本书
提高程序员思维的几本书
222 0
|
设计模式 网络协议 算法
自学编程的八大误区!克服它们,豁然开朗!
说在前面 小伙伴们大家好,又是全新的一天。 关于“自学编程的一些常见误区”这个话题其实很早之前就在视频里聊过了。时间过去了大半年,也还是有很多小伙伴会提及各种自学过程中的常见疑惑,所以还是用文字总结一下这几点想法,和大家共勉。 误区1:忽略基础,盲目莽进 基础知识和基础路线真的非常重要,就以Java领域举例,现在的应用框架实在是太多了,五花八门,层出不穷,迭代的速度太快了。但是假如Java SE的基础不牢、网络协议和操作系统不熟,基本的设计模式不了解,那一味地追求学习新框架反而会让自己陷入迷茫与困顿。 基础牢固,应用框架的学习自然就不用惧怕了,很快就能切入核心,掌握原理。而且越时髦的东西
115 0
|
设计模式 负载均衡 算法
从技术思维角度聊一聊,『程序员』摆地摊的正确姿势
有人说程序员这个职业,三年升高工,七年做架构,十年送外卖。对此虽然我也曾非常认可,但现在我可以前瞻性(马后炮)地说四个字,杞人忧天
|
设计模式 架构师 NoSQL
从技术思维角度聊一聊『程序员』摆地摊的正确姿势
有人说程序员这个职业,三年升高工,七年做架构,十年送外卖。对此虽然我也曾非常认可,但现在我可以前瞻性(马后炮)地说四个字,杞人忧天!目光肤浅!正所谓天生我材必有用,用完再把外卖送,现在,新的风口——万亿【烟火经济】来了,除了送外卖我们又多了个新选择:摆地摊!一个人一辈子只有那么几次机会可能实现财务自由,机遇稍纵即逝,一定要牢牢把握住。
1006 0
|
设计模式 算法 网络协议
自学编程的八大误区!克服它!
关于“自学编程的一些常见误区”这个话题其实很早之前就在视频里聊过了。时间过去了大半年,也还是有很多小伙伴会提及各种自学过程中的常见疑惑,所以还是用文字总结一下这几点想法,和大家共勉。
自学编程的八大误区!克服它!
|
程序员 Python
程序员的进化
不久前,在互联网上出现了一篇有趣的文章,讲的是对于同一个问题,不同层次的程序员编出的Phthon代码显示出了不同的风格,代码都很简单,有趣。这篇文章的原始出处在这里,我把它整理了一下,并修改了几处错误。
733 0