原文出处:  http://hanlei.name/archive/2006/03/29/8904.aspx

由于工作性质的关系,我常常需要为公司面试程序员。通常,我会首先要求应聘者做两件事:第一,口头说明虚方法、抽象方法、接口之间的异同和使用场景;第二,脱离IDE,手写一个简单的WinForm程序(例如包括布局整齐的两个文本框和三个按钮、点击按钮弹出消息框显示文本框内容),然后在命令行编译运行。第一题是考面向对象中的继承和多态概念,第二题则是考C# GUI类和关于委托等C#独有特性的基础知识,以及编译、调试技巧。很遗憾,有一大半的应聘者会在这两个简单考题面前败下阵来。尤其是第二个考题,甚至难倒了一些写代码有年头的程序员。为什么?因为这些程序员不具备基本的面向对象知识,更加不理解C#的面向对象实现手法。

这不能完全归咎于中国计算机教育。实际上,在美国或其他发达国家,真正懂得面向对象开发的程序员也并非随处可见。这也是Beginning C# Objects(及其Java原版本Beginning Java Objects)一书成为畅销书、并在Amazon上获得读者极高评价的原因。作者写道:“我们常常与一些软件开发者会面——在工作场所、在客户办公室、在专业会议上,或在大学校园里——这些开发者都尝试去掌握一门类似C#的OO编程语言,他们参加C#培训、阅读关于C#的书,或是安装和使用像Visual Studio .NET这样的C#集成开发环境(IDE)。然而,这是舍本逐末的做法:他们缺乏对什么是对象的基础认识,更为严重的是,缺乏利用对象从头开始构建软件应用程序的知识。”

翻开市面上任何一本你能找到的C#入门书,看看第一章讲什么,第一个范例是怎么实现的。闭上眼睛你都能告诉我,第一章多半是讲怎么安装VS.NET,第一个例子多半是拖一个按钮控件到窗体,双击后输入一段调用消息框的代码。我们的技术作者们,就是这样把读者引入歧途的。IDE(集成开发环境)能极大地提升生产力,但开发应用程序所需的高度专业的知识和技能,却非IDE所能代替。的确,任何一个菜鸟也许都能利用可视化组件拼凑出“看起来还不错”的应用程序,但这样的程序却将带来高昂的扩展和维护成本。

面向对象编程,绝非一些可视化组件那么简单,它涉及人类思维(抽象)模式、建模符号体系、面向对象方法学等诸多方面,对开发者有较高的要求。功夫过关的开发者,不止是技术高手,同时也一定会是有深度的思想者。把需求从自然语言翻译为对象模型,再把对象模型翻译为特定语言代码,殊非易事。最基础的,到底什么是对象?如果你曾经好好思考过这个问题,就会得到很多启发。例如,现实世界中的一张纸,如何抽象为计算世界中的对象?这个对象将具有那些特性(属性和行为),例如尺寸、颜色、质地、折叠、裁减,卷筒……?综合来看,面向对象的要素是什么?把事物抽象为对象的过程,是做思维体操的过程,也是极富挑战性和乐趣的过程。如果你还还不了解对象和面向对象的概念,或想与作者一起就该话题做更深入的思考,那本书第一部分就是最好的入门手册。

我认识一些优秀的程序员朋友,他们在大学时念的专业是建筑。这些朋友对应用程序架构和/或开发流程,有近乎严苛的要求,因为他们深刻地理解,蓝图、材料、工序……对于建造房屋是多么的重要。对象模型的静态方面(域类、数据结构等)在应用程序中开发相当于建材单元,而动态方面(行为、方法等)则是关于建材之间如何组合的指导书,它们合起来,构成一个应用程序的“蓝图”。越是复杂、大型的应用程序,对蓝图的要求就越高;即便是简单的应用,有蓝图也比较有利于维护、升级和扩展。给你一份需求说明书,你将如何分析它、并且组织出正确的对象模型(蓝图)?如果你对此信心不足,建议好好阅读本书第二部分。

第三部分涉及的范例,在有经验的开发者眼中看来,似乎过于简单。其实不然。整个开发过程当中,没有使用IDE拖放过任何一个控件,或在IDE中编译调试。这样做的目的有二:一、让读者可以掌握.NET Framework和C#本身的特性,而不会被IDE的花哨界面所迷惑、急于求成;二、帮助读者学会用正确的手法和模式(如公认的MVC模式)开发程序。例如委托(delegation),这是.NET Framework中一种特别的语言元素,也不易理解。如果你只懂得往窗体放一个按钮,双击该按钮,输入一行代码,那么你永远不会明白,这个过程体现了利用委托实现事件处理的巧妙手法。但是,如果让你脱离IDE编写事件处理方法,你就很快能明白这个道理,而且也知道怎么用于实践。IDE能提升生产力,不过它却不能凭空创造生产力,本源的生产力还是来自开发者的知识与技能。

面向对象编程已经流行多年,然而还是有无数的入门者在入门阶段就走错路子,抱着错误的观念、用错误的方式开发着意大利面般一团乱麻的程序。入门不简单,对于初学者如此,对于有经验的开发者,更该回头检讨自己在面向对象编程领域的经验是否根本就是错误或细枝末节的经验。本书作者开发和培训经验丰富(一位是NASA开发工程师,一位是大学教师和对象技术专家),理解面向对象程序员可能进入的误区和面对的挑战,他们知识与经验的总结,形成了这么一本用心良苦、循循善诱、深入浅出的C#面向对象开发指南。每一位C#开发者,无论有经验还是没经验,都该读读这本书。入门不简单,你真的入对门了吗?

入门不简单(《Beginning C# Objects中文版》书评)相关推荐

  1. 青少年Python游戏编程入门(Beginning Game Programming for Teens with Python译文)

    青少年Python游戏编程入门 Beginning Game Programming for Teens with Python   Julian Meyer on January 22, 2013 ...

  2. 分享基本书,Unity Shader入门精要、PBR_Guide_Vol1_中文版、PBR_Guide_Vol2_中文版、PBR守望先锋猎风, substance painter制作

    Unity Shader入门精要 PBR_Guide_Vol1_中文版 PBR_Guide_Vol2_中文版 PBR守望先锋猎风, substance painter制作 百度链接,自取 链接:htt ...

  3. Beginning C# Objects 读书笔记(一)

    总是在看完了一本书之后才会想起要记下些些东西,昨晚总算是把这本书看了个第二遍了,相比于第一遍,当然是学了不少的东西. 第一部分,对象入门 作者先给我们介绍了一些C#的优势. C#是整合应用开发框架的一 ...

  4. 好书推荐 Beginning C# Objects

    这本书推荐给学习了基本语法,会拖拖做程序的人员进阶使用,拨开迷雾见真容吧!! 有时间再写写笔记心得,分享给大家!! 豆瓣链接:http://book.douban.com/subject/184526 ...

  5. 99.9%的努力毁于0.1%的失误

    1.借用CSDN掌门一句话开头 "没有无敌的高手,也没有完美的作者,如果能从别人的文章中得到一点知识,有一点感悟,我们就应该给他鼓掌,心存感激."三人行,必有我师",多一 ...

  6. ajax自动加载blogjava和博客园的rss

    自动加载blogjava和博客园的rss <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"   "h ...

  7. asp.net2.0学习历程 菜鸟到中级程序员的飞跃【月儿原创】

    asp.net2.0学习历程 菜鸟到中级程序员的飞跃 --30本好书点评 作者:清清月儿 主页:http://blog.csdn.net/21aspnet/           时间:2007.5.1 ...

  8. asp.net2.0学习历程 菜鸟到中级程序员的飞跃

    如果你是一个菜鸟或者自认为初学者那么本文非常适合你: 不能说这30本书就是最佳组合,但是可以说这个组合不差: 本人曾博览群书,很多书重复,很多书讲的不适用,这些书都是目前书店可以买到的: 达到中级程序 ...

  9. asp.net2.0学习历程 菜鸟到中级程序员的飞跃[z转]

    asp.net2.0学习历程 菜鸟到中级程序员的飞跃 --30本好书点评 学历历程 如果你是一个菜鸟或者自认为初学者那么本文非常适合你: 不能说这30本书就是最佳组合,但是可以说这个组合不差: 本人曾 ...

  10. .NET经典图书推荐(上)

    欢迎阅读本文的下篇. 本文以<.NET图书咀华(上)>为题发表于2006年10月18日<中华读书报>我和朋友主持的<书•人•事专栏>. .NET是一个内涵非常广泛的 ...

最新文章

  1. 如何用leangoo快速搭建敏捷研发体系分享会
  2. 逆向工程破解苹果监控iPhone图片的算法:原来iOS14.3上就有了
  3. python【蓝桥杯vip练习题库】ADV-77统计平均成绩
  4. 访问有用户名和密码的网络共享,实现数据导入
  5. JavaEE PO VO BO DTO POJO DAO 整理总结(转)
  6. request Form request QueryString
  7. C和指针之实现strlen函数
  8. 【2019牛客暑期多校训练营(第二场) - H】Second Large Rectangle(单调栈,全1子矩阵变形)
  9. easyui input输入框的限制和校验条件
  10. Visual Studio 2017
  11. 光盘装系统和U盘装系统有什么区别吗?
  12. 图像处理-HSL彩色图像均衡化
  13. Win7+MATLAB2017a+虚拟光驱
  14. 深度相机原理及坐标系转换
  15. MySql (4)-储存引擎、索引、锁、集群
  16. [转] 一个女生写给男朋友的!!!~~有点现实、冷静的语言,却让人感觉很温暖!!!
  17. java中的反射和Class类
  18. HAUTOJ 1262 魔法宝石
  19. C++ undefined symbol的问题分析和解决办法
  20. 虾皮直播怎么开启店铺引流-扬帆际海

热门文章

  1. 【codevs1378】选课——树形动规
  2. ACM学习历程—HDU5396 Expression(递推 计数)
  3. 针对不同手机系统的LBS地图定位解决方案
  4. HTML5SVG 游戏开发 【起航】
  5. [HNOI2016]序列(莫队,RMQ)
  6. open jdk 证书 问题
  7. PAT:1013. 数素数 (20) AC
  8. asp.net 中http协议及相关知识(零碎知识记录)
  9. Hadoop1.2.1源码解析系列:JT与TT之间的心跳通信机制——命令篇
  10. winform根据字符串生成HTML静态页