在08年的时候,我还没有大学毕业,当时在一家公司实习。那时候老板接了一个项目,是一个给中石油某下属公司做的一个web版本的管理系统,我和一个同学硬着头皮接下来做完了。这个系统后端用的是c#的web form,前端普通的html+css+javascript,数据库使用的是sql server2005,部署服务器使用的是Microsoft Server 2008。现在回顾这个系统,虽然代码写的烂,架构写的烂,但是能够正常运行,这是偶尔有一些莫名其妙难以解决的小bug。毕竟是自己5年前的代码嘛,那时候自己太嫩了,好多东西都不知道,没有多少经验。

那如果现在要我给这个系统做功能升级,甚至重做这个系统,我会进行哪些改进那?这是个有意思的话题,如果你能真的找出很多可供改进的店出来,那么说明这几年来你真的在进步。

现在还真有可能会对这个系统做功能升级。我想了一下,会在一下几个方面做出改进和调整。

  1. 使用最新的Visual Studio IDE,并且装上ReShaper插件。现在自己已经成了一个快捷键控、重构控。俗话说,工欲成其事,必先利其器。好的程序员当然要用最好的工具了。新的Visual Studio在效率方面、智能提示方面都有改善。ReShaper作为.net下的重构利器当然必不可少。

  2. 将代码托管到github的私有代码库中,使用git作为源代码管理工具。以前项目中使用的是svn,使用的公司服务器作代码托管,而公司服务器不是那么的稳定。git作为一款分布式源代码管理工具,脱离了中央服务器的束缚,并且拥有快速创建、切换分支,本地提交等特性,完爆svn。github作为全球最大的代码托管中心,方便实用,最便宜的会员7$每月,经济实惠。

  3. 给系统中的重要功能打好LOG。想当年我们想要记录一些程序log,还要自己写一个简易的log类库。现在有很多成熟的log框架可以被c#使用。试想当你的程序部署到服务器上以后,如果没有充足的log,那么排查bug是多么的困难。服务器上又不能让你还原现场,不能调试,唯一能帮上忙的就是那些log了。当然打log也有很多学问,比如log等级设置,输出设置等,这里就不细说了。

  4. 使用事务机制处理复杂逻辑。在这个系统中有很多并发操作,当时自己并不是很懂事务,使用了一些很蹩脚的方法来处理可能的数据异常。现在我会采用成熟的分布式事务机制来处理这些并发逻辑,使程序更加健壮。

  5. 使用TDD,提高单元测试覆盖率。以前的系统中没有任何单元测试,一段简单的代码都需要启动程序手工验证。这样的反馈太耗时,并且不具备重复性。测试驱动开发能够保证代码简洁、正确,并且能快速得到反馈,保证测试覆盖率。遇到遗留代码时,也可以先添加单元测试,建立保护网,使重构更有信心。

  6. 使用webdriver进行自动化功能性测试。曾经在给客户演示前,我改了一段代码,没想到这段代码恰好破坏了给客户演示的一个重要功能。如果有自动化的功能性测试那么就可以避免这一切。自动化功能测试能增强对产品的信心,每次改动都在可控范围之内。

  7. 编写构建脚本,实现持续集成。即使只有一个人工作在这个项目中,也应当编写构建脚本,应用持续集成。这样才能保证你的每一次提交都是安全的;并且将一些重复的工作自动化起来,可以解放你的大脑关注到更重要的地方去。

  8. 自动化部署。每次部署项目到服务器上是一个痛苦的经历,需要手动的替换项目中的某些文件,将文件复制到服务器上,终止当前服务器服务…..哪一个环节出错都是一个致命的打击。手动不仅效率低,而且极易出错。通过编写脚本实现自动化部署可以一劳永逸,和繁琐的手动操作说拜拜吧。

  9. 使用Nuget作为依赖项管理工具。如果你想要引用一个第三方依赖项,还需要手动从网上下载并添加到项目中的话,那你就out了。作为一个Java程序员,maven,gradle等构建工具已是标配,它们都提供了对依赖项的自动化管理。你只需要添加一行字符串来说明你想要使用那个类库,下载、引用就全交给管理工具来实现了。在c#世界中当然也有相应的产品,那就是Nuget,从此依赖项管理再也不是一件头痛的事情了。

  10. 多使用c#自身的特性,如LINQ,委托,函数式编程等。比起不思进取的java语言,c#不知道强多少倍。java在java 8版本才正式引入Lambda,而c#的LINQ早都出来多少年了。如果在进行列表操作时,你还只使用foreach,那么你太老土了。列表操作无非是filter,map,sort…而c#早为我们提供了一系列扩展方法,如Where,Select,Sort….可怜Java中只能使用Guava这种不伦不类的第三方类库来实现相应的效果,而且远没有c#的原生功能漂亮。c#既然每年都会引用那么多的特性,那么就要学习、掌握和使用。很多人一边使用着c#的老土语法,一边说自己精通c#,真让人无语。放着那么多好特性不用,让我们这些java程序员真是羡慕嫉妒恨。

  11. 使用一些前端框架和JavaScript框架。对于我这种前端小白,想让我设计出漂亮的页面还真是力不从心。不用怕,设计者已经考虑到了前端无能者的感受,譬如bootstrap之类的前端UI框架简直为我们而生。这些不但使用简单,效果明显,还自带响应式设计,实在是前端小白的利器,实现自己精美的web站点不再是梦。JavaScript就不多说了,什么jQuery,AngularJs,ExtJs…..各种框架类库层出不穷,涵盖了前端开发的方方面面。无论你是想画图,操作DOM元素,创建单页应用,使用MVC架构…..在JavaScript的世界里你总有多种选择。想当年我为了在web页面中展现一张统计图,采用了使用.net在后台实时绘制成图片加载到前台显示,都是泪啊。现在好了,只需要将数据模型绑定给图表控件,分分钟搞定。

好了,就写这么多了。如何判断一个程序员真的具有N年工作经验,而不是1年工作经验重复使用了N年?一个好的办法就是和拿出一个以前的项目出来,看他都会做哪些改进。

对于工作多年的程序员来说,知识面、视野一定要广,这样才有竞争力。这靠的是平时的学习和积累,还要善于思考,如何能把手头的事情做得更好。

转载自:http://www.cnblogs.com/huang0925/p/3552004.html

转载——如果让我完善几年前的一个项目,我会做哪些改进?相关推荐

  1. 转载:林锐:大学十年(一个程序员的路程)(全)

    大学十年(一个程序员的路程)(一) 林锐,1999年岁末 写此文使我很为难,一是担心读者误以为我轻浮得现在就开始写自传,二是担心朋友们误以为我得了绝症而早早留下遗作. 不论是落俗套还是不落俗套地评价, ...

  2. 雷军20年前作文曝光:我会当一辈子程序员

    提到小米雷军,巨匠对其印象之一就是很会营销,特别是很早就打出了"为发烧而生"的口号,吸收了一多量米粉. 其实扒扒雷军的年老期间,其实他是一位法度圭表标准员身世,大学读的是合计机专业 ...

  3. [转载]从春招到秋招,一个本科生的求职之路。

    原文:从春招到秋招,一个本科生的求职之路. 自报家门,北理工软件学院本科生. 主要部分: 1.毕业去向选择 2.春招过程 3.暑期实习 4.秋招辛酸路程 5.一点感悟 1.毕业去向选择问题 从大一开始 ...

  4. 三年前的一个小项目经验,分享给菜鸟兄弟们

    原文地址 (公文收发小软件:前期需求调查部分) 日期:2009年1月1日  晚上 分类:项目开发经验 两年前还在宁波时,我做过宁波教育局的一个小项目,一个部门内部使用的公文收发记录软件.这个项目当时是 ...

  5. Android之通过配置Flavor实现一个项目打包成多个apk(转载)

    转载自https://www.cnblogs.com/zhujiabin/p/7650924.html 最近我老大问我一个问题,说Android可不可以像iOS那样,通过target对项目进行管理啊. ...

  6. 3年前的一个小项目经验,分享给菜鸟兄弟们(公文收发小软件:前期需求调查部分)...

    两年前还在宁波时,我做过宁波教育局的一个小项目,一个部门内部使用的公文收发记录软件,这个项目当时是跟 他们的网络中心的老师洽谈的,网络中心负责此项目的老师,跟我们年龄差不多,30不到,可能要比我小上2 ...

  7. 【转载国外好文】代工开发一个iOS应用没有那么容易

    导读:这是来自新加坡的 iOS 开发者 Kent Nguyen 发表在1月底的一篇博文.这篇吐槽文在 iOS 开发圈子里流传甚广,从原文150多个评论就可见一斑,现翻译如下. 让我们开门见山吧:做一个 ...

  8. [转载]教练,我也想再要一个同桌

    原文 from 爱湿衣 ==== 说说你和异性同桌干过的最浪漫的事看到后面我眼眶湿了-     59楼 在停电全班用蜡烛时,一起用蜡滴了个笑脸,眼睛是用我两大指拇恩的.     62楼 帮她剪右手手指 ...

  9. 转载自 BotVS 「 珍藏版 」如何搭建一个完整的交易框架

    NO:01 交易策略 ≠ 交易系统. 一个完整交易系统,其实是交易者给自己定的各种规则,它包括了交易的各个方面,其中并没有给交易者留下一点主观想象的余地.大多数成功的交易者都是使用机械交易系统,这并非 ...

  10. WebMessenger完善后将作为一个开源项目

    先说说版权问题,现在WebMessenger客户端用的是微软的Web Msn Messenger的客户端,服务器端是我根据她的客户端模拟的一个,仅作学习用,不会传播和提供下载.因此目前的版本不方便开源 ...

最新文章

  1. Linux的epoll
  2. 缩进动画Scaleanimation的一个小示例
  3. 时间序列分析之:函数分解decompose
  4. spring-boot注解详解(六)
  5. leedcode344. 反转字符串
  6. 搭建gitlab及部署gitlab-runner
  7. linux防火墙服务关闭,Linux防火墙(firewall)的开启与关闭
  8. 如何将php文件通过后台导入,如何将通过url传到php后台的json在后台再次转换为json格式?...
  9. 23篇大数据系列(三)sql基础知识(史上最全,建议收藏)
  10. Linux系统管理---linux计划任务和日志的管理
  11. 什么是本地化部署、IaaS、PaaS、SaaS、DaaS?
  12. frame和bounds的区别
  13. [Keras深度学习浅尝]实战四· Embedding实现 IMDB数据集影评文本分类
  14. 瑜伽断食法——From《瑜伽祖本》(手敲版)
  15. laravel配置语言包,实现网站中英文切换
  16. MATLAB:零状态响应(lsim(连续);filter(离散))、冲激响应(impulse或impz)和阶跃响应(step)、卷积(conv)
  17. 英语学习也可以“做中学”
  18. 百度地图4 从0开始
  19. ftp登录shell为nologin无法登录
  20. 西工大电子实习单片机流水灯c程序

热门文章

  1. 限制文本框只能输入数字
  2. iZotope Trash 2 for Mac(失真效果音频插件)
  3. PDF Expert使用教程:如何在Mac中删除PDF文件中的指定页面?
  4. Vue指令v-show和v-if的区别
  5. 会议录音被误删了用EasyRecovery怎么恢复
  6. VIM问题合集(持续更新)
  7. Netty NioEventLoop 启动过程源码分析
  8. 聊聊springcloud的GatewayControllerEndpoint
  9. 在ASP.NET的母版页中使用图片和超链接,HTML标记和ASP.NET标记的不同
  10. 「leetcode」37. 解数独【回溯算法】详细图解!