多年的.NET开发,也只学会了这么几招
折腾了这么多年的.NET开发,也只学会了这么几招 软件开发不是生活的全部,但是好的生活全靠它了
随着工作年龄逐渐增加,身边的重担也越来越多。以前可以在公司加班到晚上10点,现在不行了。以前可以通宵的找bug,翻阅资料,现在想这样也没有机会了。做软件逐渐成为工作的主要部分,而渐渐从生活的主角退化出来。自从生活中有了家庭,随时要为家人考虑,和他们度过有意义的时光。可是,家庭的责任重担全落在自己身上,工作不仅仅要完成,而且要有进步,这样才能维持现有的开支。在这样一个时代,你要静下心来安心专注工作,继续自己的研究,是非常不容易的。不断贬值的货币,永远不会跌的房价,令人担忧的医患关系,股市也终于跌破了2400点,每天都有刺激你的神经的事情在发生,每天都是奇迹般的一天,你能做的,就是坚持黎民的到来。因为马云说了,今天很残酷,明天很美好,很多人都会跌倒在迎接明天的路上。朋友,请坚持,再坚持。无论你是否可以得到一个笑到最后的光环,这不重要的,真的,重要的是你的家人因为有了你的努力,你的付出,他们可以高兴,可以快乐,可以无忧虑的生活着。
1 经过多年积累的通用类库Utility Class Library
.NET Framework已经是一套非常不错的类库,现在在互联网上搜索,.NET的API几乎就是标准的API。一说到打开文件,马上会找到很多StreamReader, File之类的例子供你学习参考,一提到反射,CreateInstance, BindingFlags这类的单词也会碰到很多,为了熟悉这一套类型库(FCL)的用法,至少花了二年的时间。大部分的时间还是在做项目,而不是拿着老板的工资,练习API的用法,所以我说的两年时间,还是很短的时间。把做过的项目中用到的公共模块抽取出来,命名为Common,Control,Component三个项目,然后把到统一的Utility解决方案中。经过反反复复的修改,维护,现在已经很方便,很好用。大部分的项目都会引用这三个项目,在使用过程中发现问题不段完善,而不是拷贝代码,这样积累起来,做项目越来越方便。
2 ORM 对象关系映射
在没有熟悉ORM之前,是用Enterprise Library+Code Smith的模板,搭建了一套快速应用开发的解决方案。熟练,稳定,快速生产代码和调试方便,这种状态维持了两年。接触到LLBL Gen的ORM框架后,照葫芦画瓢,学习它的查询语法,学习它如何对数据库进行操作,甚至到最后,干脆来分析一下它的源代码,于是有了几篇文章
LLBL Gen 3.x 源代码追踪与解析 Type Converter 类型转换器
LLBL Gen 3.x 源代码追踪与解析 验证Validation的原理和流程
依靠这股学习的冲劲,居然也完全接受和学会了ORM。反思过去,一直没有下定决心学习NHibernate,做项目一遇到问题就退缩了,改成原来的老套路,真有些后悔。引用老外的句子,Just Do it。不要为部分人的观念左右,比如NHibernate性能不好,或是难于维护映射关系,当使用NHibernate的经验达到一定程序时,你会找到办法来改善这些,可是,还没有学之前就怀疑这些,这不是治学的严谨态度。还好,还有一次机会,你可以应用到Entity Framework上面。想办法在你的项目中用上这些实用的技能吧,短暂的痛苦过后,换来的是长期不用加班,早回家和家人团聚,技术学习的付出,它的回报比率相当高。
3 Windows Forms开发框架, ASP.NETWeb开发框架
经过项目的积累,对于通用的数据输入窗体Entry Forms, 报表呈现窗体Report Form,查询窗体Query Form,大多都是相似的,只不过换了个数据库和表。于是,把这一块内容抽取出来,做成框架,独立维护,也逐形成了开发框架。比如,要对Northwinds数据库的Customer表进行读写,只需要继承于EntryForm,并设置它的TableName=”Customer”, 重写几个rountine般的代码,就完成了功能,速度的稳定性超级好。对于Web,一套Web Menu,Tab,TreeView构成基本的页面布局风格。对框架页面,Top显示Menu,Left显示Menu的明细项目,Right显示明细的操作页面,基本的页面框架就这些,再封装成JavaScript和.NET代码可以一句话调用的代码,配合集成权限判断,通讯等技术,Web开发的通用框架也初步形成。Web开发中麻烦的地方还是在页面布局,做到美观大方就可以了,不需要达到艺术的境界,还得考虑要脱离美工的依赖,这是迟早的事,你不可能回避。
4 代码生成 Code Generation
这项技术经过多年的锤炼,已经相当有积累。Visual Studio本身也是个代码生成器,帮助生成骨架代码,和MFC+Visual C++ 6一样,非常相似。再后来,自己写了个代码生成器,可以根据选择的数据库表,生成代码。再积累,又发现了Code Smith这个好东西,于是乎所有的代码生成都转换到Code Smith平台上来。有时候并不能总是有Code Smith可用,在小量的代码情况下,又有了运用Reflection+Code Dom生成代码的经验。Code Dom是一套程序代码,可同时生成VB和C#两套代码的好工具。再到后来,接触到ORM框架的代码生成,于是乎有了这几篇文章
Template Studio 模板开发入门 Lpt templates Development
ORM框架-工具-产品开发之四 开发代码生成器 Template Studio Development (一)
ORM框架-工具-产品开发之四 开发代码生成器 Template Studio Development (二)
微软技术实践 智能提示的模板编辑器Template Studio 和 查询追踪器 LLBL Gen Profiler
如今基于模板的生成器T4又出现于江湖,虽然出身名门微软,似乎也没有太多的passion和精力考虑移植到T4。
5 报表 Crystal Report和Reporting Services
曾经在一个公司的软件部门做报表,做了一年多,每天的工作就是负责SELECT数据,然后Sub Total/Grand Total。这一年多的锻炼使我明白了计算机科学技术的基本要求,计算要正确。把数据值加起来求和,或是求平均值,这么看似简单的问题,付诸于实践中才会明白要做对很不容易。比如Decimal.Round方法的将小数值舍入到最接近的整数问题,和数据库中的round函数,这些问题加起来,需要折腾一段时间才能弄懂。没有多少捷径,多练习一下分组,求和或是用代码生成数据,再传递到报表中。最近做出来的报表平台,也是吸取了这两者的通用之处,以达到不同类型的报表,都可以在报表平台中运行,因为有的用户熟悉Crystal Report,有的用户熟悉Reporting Services,兼顾两者。
6 通讯组件 .NET Remoting,WCF
在项目中多次使用两项技术,最后就考虑到把它提炼出来,做成通用的公共代码,应用到新的项目中去。一旦考虑到提炼,这个过程就开始发生变化了。我会设计一个基础的模型项目,它会实现所有的需要的通讯功能,在实践应用中,则根据需要,把部分代码应用到项目中去。比如数据打包这个环节,就是把一些基础的数据,打包加密发送到指定的socket接口中,再把它还原成原始的数据,这个过程本身复杂,但是接口调用代码却很简单。还有Remoting技术,一个简单的接口方法ClientProxyFactory.CreateInstance<>泛型方法,就可以达到在项目中应用.NET Remoting技术。虽然WCF技术比较新,做技术的人员都喜欢追求新的,抛弃旧的,但我以为,.NET Remoting技术还是相当有价值的,至少我见到很多项目还是用这项技术。
请参考这篇文章: .NET Remoting过时了吗?为什么公司的项目还是选择用.NET Remoting,而不是WCF?
7 工作流 Workflow
当实现了一套自定义工作流系统后,才明白工作流活动的本质就是固化的代码片段,工作流是驱动这些活动实现业务。从rehost工作流设计器,到自定义Activity,集成SQL Server的持久化服务,传递业务实体,并且激活睡眠的工作流,自定义业务规则并求值,工作流就像是个玩具拼盘,你需要把写好的代码片段(Activity)添加到流程中,通过条件启动执行。时不时的还要用Reflector反编译,参考.NET Framework是如何实现IF-ELSE活动的,如何实现CodeActivity活动。工作流不是万能的钥匙,当有些流程只有等项目实施之后才能确定,或是依据不同的条件或部门,流程不一样,这样的流程考虑用工作流。而标准的流程,比如销售流程,报表单-> 销售单-->销售送货,这个流程是标准化的,不同的企业可以考虑不需要这里面的部分流程,但是我以为这一块就不需要用工作流来实现。
在学习工作流的自定义表达式的过程中,又学习到了Script.NET脚本语言,请参考这几篇文章
.NET 动态脚本语言Script.NET 入门指南 Quick Start
.NET 动态脚本语言Script.NET系列文章汇总 非常精彩的应用举例
掌握了这几项技术,工作越来越有信心,最重要是的很少加班,按时下班回家。有了充分的时间休息调整,为以后的发展打下基础。以前天昏地暗般的加班,天天加班,项目还是死了,现在做产品了,每天按时下班,项目还进展顺利。生活质量也有了明显的提高,引用别人的话,跟对人,做对事,整个世界就对了。
多年的.NET开发,也只学会了这么几招的更多相关文章
- 适应c++ 新特性 - 与我 - 多年传统方式开发(新特性参考微软标准:https://msdn.microsoft.com/zh-cn/library/hh279654.aspx)
公司同事都在积极使用c++的新特性,并对其赞不绝口,而自己一直做着传统的c++开发方式,到底这些新特性如何,又是怎么提高开发效率的,我依然在疑问当中,从同事的说法和实际代码操练里,确实在减少代码量,集 ...
- 基于springboot微信公众号开发,几分钟学会微信自动回复
效果图 1.准备工作 申请微信订阅号(个人只能申请订阅号,而且没什么功能,也无法认证),申请完毕,点击 开发=>基本配置,如下图: 服务器配置需要有 域名 80端口,我猜你没有,这里推荐个实用工 ...
- iOS开发小技巧--学会包装控件(有些view的位置由于代码或系统原因,位置或者尺寸不容易修改或者容易受外界影响)
一.百思项目中遇到了两处这样的问题, 第一处 - 是评论界面的headerView,由于直接把自己搞的xib加载了放在了那里,xib中setFrame写了好多-= +=,每次滚动的时候,会频繁调用x ...
- (一)keil4 MDK 开发环境下编写裸机程序 (参考杨铸 北航) (开发板只需要连接JLNK 就行了)
首先用的是 keil4 位与 ( F:\ARM+LINUX\MDK-ARM_v4.10.exe ) 1. 新建工程名project 为 led circle ,放在 我的文档\ l ...
- 学会了这一招,距离Git大神不远了!
大家好,今天我们来介绍git当中一项非常重要的功能--交互式工具 有的时候如果我们要处理的文件很多,使用git add .等操作会非常有隐患,因为很有可能我们一不小心就疏忽了一些内容.如果我们使用一个 ...
- [转载].NET Web开发技术(补充)
大家在工作应该养成善于总结的习惯,总结你所学习.使用的技术,总结你所工作事项的比较好的地方,善于总结不断的沉淀优化自己.适时停下来总结下过去走过的路,才能让我们的未来走的更坚定.文章转自JamesLi ...
- 学会了 C 语言真的可以开发出很多东西吗?
马里奥碰到花朵就变身. 什么是马里奥?一个装着 16 × 32 个小色块的长方形,其中一些色块填着颜色,另一些没有.什么是花?一个 16 × 16 的正方形.什么是「变身」?把马里奥这个方块里面代表衣 ...
- 10天学会phpWeChat——第十天:phpWeChat的会员注册、登录以及微信网页开发
通过前面的系列教程,我们系统的讲解了phpWeChat从视图端.控制器端到模型端的操作流程:熟悉了phpWeChat的目录结构:掌握了视图端模板如何创建一个丰富的表单和模型端如何操作数据库.这一切都是 ...
- 一个WEB应用的开发流程
转载:http://www.51testing.com/html/56/n-3721856.html 先说项目开发过程中团队人员的分工协作. 一.人员安排 毕业至今的大部分项目都是独立完成,虽然也有和 ...
随机推荐
- 217. Contains Duplicate
题目: Given an array of integers, find if the array contains any duplicates. Your function should retu ...
- 怎么知道RTL Schematic中的instance与哪段代码对应呢
2013-06-23 20:15:47 ISE综合后可以看到RTL Schematic,但我们知道在RTL编码时,要经常问自己一个问题“我写的这段代码会综合成什么样的电路呢”.对于一个简单的设计,比如 ...
- (转)CAP理论十二年回顾:"规则"变了
编者按:由InfoQ主办的全球架构师峰会将于2012年8月10日-12日在深圳举行,为了更好地诠释架构的意义.方法和实践,InfoQ中文站近期会集中发布一批与架构相关的文章,本篇即为其中之一.Info ...
- C语言中的位拷贝与值拷贝浅谈(转载)
注:C语言实现的PHP变量的赋值过程中,就涉及到了 深拷贝和浅拷贝 位拷贝拷贝的是地址(也叫浅拷贝),而值拷贝则拷贝的是内容(深拷贝).深拷贝和浅拷贝可以简单理解为:如果一个类拥有资源,当这个类的对象 ...
- CPU占用率高分析方法步骤[转载]
由于涉及到私有代码,所有图片都隐去 1.执行TOP命令,确认CPU占用较高的进程PID 根据top命令,发现PID为8691的Java进程占用CPU高达3858%,出现故障 2.确认该进程中CPU占用 ...
- 漫长的补结题报告之路 poj3622
题意(引用):题意:有很多种草,有两个属性:价格和新鲜度:有很多牛,它们都会各自需求一种草,要求是其价格最低为ai,新鲜度最低为bi,且这些牛不希望自己的草和别人的一样.问要满足所有需求的最小花费是多 ...
- 【 D3.js 选择集与数据详解 — 5 】 处理模板的应用
在[选择集与数据 - 4]一文中,介绍了一个update.enter.exit的处理模板,这个模板很常用,本文将通过一个例子来讲解其使用方法. 1. 模板 复习一下上一章提到的模板. //绑定数据后, ...
- Java [Leetcode 41]First Missing Positive
题目描述: Given an unsorted integer array, find the first missing positive integer. For example,Given [1 ...
- DB2创建序列
一.创建序列 序列是按照一定的规则生产的数值,序列的作用非常的大,比如银行交易中的流水号,就是记录每笔交易的关键字段. 通过create sequence语句创建序列,具体语法如下: >> ...
- table点击一行显示下一行的特效
效果体验:http://sandbox.runjs.cn/show/rw4vq8zo <!doctype html> <html> <head> <meta ...