《构建之法》第4章、第17章读后有感
一、第4章 两人合作
1.文章内容:
程序中的实体、变量是程序员昼思夜想的对象,要起一个好的名字才行。大家都知道用单个字母给有复杂语义的实体命名是不好的,在C语言家族中,比较通用的,也是经过了很多实践检验的方法叫“匈牙利命名法”。
我的疑惑:
什么是“匈牙利命名法”?适用于什么地方?不适用于什么地方?
我的思考:
“匈牙利命名法”是一种编程时的命名规范。基本原则是:变量名=属性+类型+对象描述,其中每一对象的名称都要求有明确含义,可以取对象名字全称或名字的一部分。命名要基于容易记忆容易理解的原则。保证名字的连贯性是非常重要的。“匈牙利命名法”是在变量前面加上有意义的前缀,程序员就能一眼看出变量的类型及相应的语义,非常便于记忆,而且使变量名非常清晰易懂,增强了代码的可读性,方便各程序员之间相互交流代码。例如:
fFileExist,表明是一个bool值,表示文件是否存在;
szPath,表明是一个以0结束的字符串,表示一个路径。
但是,“匈牙利命名法”不适用于微软的.NET框架和一些强类型的语言(如C#)中,因为这些语言对类型有严格的要求,不同类型的值是不能做运算的,比如说,C#中,if()语句只能接受bool值的表达式。
除此之外,我经过上网查阅资料之后,我具体了解到:“匈牙利命名法”在C语言是难以实施的,在C++语言中是无法实施的。“匈牙利命名法”是类型系统的冗余,所以实施“匈牙利命名法”的关键是我们是否能够精确地对类型系统进行复制,这取决于类型系统的复杂性。
C语言:
1.内置类型:int,char,float,double 复制为 n,ch,f,d?好像没有什么问题。但是void应该怎么表示,“匈牙利命名法”做不到。
2.组合类型:array,union,enum,struct 复制为 a,u,e,s?并不方便。
这里的难点不是为主类型取名,而是为副类型取名。an表示整型数组?sfoo,sbar表示结构foo,结构bar?ausfoo表示联合结构foo数组?非常冗繁。
3.特殊类型:pointer。pointer在理论上应该是组合类型,但是在C语言中可以认为是内置类型,因为C语言并没有非常严格地区分不同的指针类型。
C++语言:
1.class:如果说C语言中的struct还可以用stru搪塞过去的话,不要梦想用cls来搪塞C++中的class。严格地讲,class根本就并不是一个类型,而是创造类型的工具,在C++中,语言内置类型的数量和class创造的用户自定义类型的数量相比完全可以忽略不计。stdvectorFoo表示标准库向量类型变量Foo,是不合乎逻辑的。
2.命名空间:boostfilesystemiteratorFoo,表示boost空间filesystem子空间遍历目录类型变量Foo,依旧不可行。
3.模板:std::map类型的确切名字是什么,已经超过了255个字符。
4.模板参数:template const T& max(const T& a, const T& b, BinaryPredicate comp) 这一条来用“匈牙利命名法”命名,难度极大。
5.类型修饰:static,extern,mutable,register,volatile,const,short,long,unsigned 加上类型修饰,更是难上加难。
总之,“匈牙利命名法”有其优点但也有缺点,这就需要在使用中扬长避短,合理应用它。
2.文章内容:
注释(包括所有源代码)应该只用ASCII字符,不要用中文或其他字符,否则会极大地影响程序的可移植性。
我的疑惑:
程序运行时注释是不被执行的为什么又会影响到程序的可移植性?
我的思考:
注释就是对代码的解释和说明,其目的是让人们能够更加轻松地了解代码。注释是编写程序时,写程序的人给一个语句、程序段、函数等的解释或提示,能提高程序代码的可读性。正确的程序注释一般包括序言性注释和功能性注释。序言性注释的主要内容包括模块的接口、数据的描述和模块的功能。模块的功能性注释的主要内容包括程序段的功能、语句的功能和数据的状态。
可移植性是软件质量之一,良好的可移植性可以提高软件的生命周期。代码的可移植性主题是软件;可移植性是软件产品的一种能力属性,其行为表现为一种程度,而表现出来的程度与环境密切相关。软件可移植性指与软件从某一环境转移到另一环境下的难易程度。为获得较高的可移植性,在设计过程中常采用通用的程序设计语言和运行支撑环境,尽量不用与系统的底层相关性强的语言。当然,可移植性并不是指所写的程序不作修改就可以在任何计算机上运行,而是指当条件有变化时,程序无需作很多修改就可运行。
使程序可移植的第一步就是使用标准库函数,并且把它们和ANSI/ISO C标准中定义的头文件放在一起使用;第二步是尽可能使所写的程序适用于所有的编译程序,而不是仅仅适用于你现在所使用的编译程序;第三步是把不可移植的代码分离出来,假如你无法确定某段程序是否可移植,你就应该尽快注释出这一点。所以,注释对于程序的可移植性具有至关重要的作用,如果使用不当,势必会影响到程序的可移植性。
但是,目前为止,我只知道了注释确实会影响到程序的可移植性,但是,对于它是如何影响的,我任存有疑虑。
二、第17章 人,绩效和职业道德
1.文章内容:
在口语中,大家通常认为领导就是管人的,名称大概是经理。很多技术人员在展望将来的职业发展时,会说“我以后想做管人的”。其实,领导(Leader)和经理(Manager)是有区别的。
我的疑惑:
领导和经理有什么区别?
我的思考:
“经理把事情做正确。领导做正确的事情。” 传统智慧用这样的话鼓励经理们为自己挂上“领导”的标签,它让经理扮演靠得住的实干家,而领导则是全局在胸、运筹帷幄、精明老到的主管。大部分人更希望成为精明老到的主管而不是靠得住的实干家。
经理和领导之间的差别比大多数人想象的要深奥得多, 优秀经理与优秀领导之间最重要的区别在于两者关注的焦点不同。优秀经理是向内看的,他们关注公司内部,深入了解每个人,了解每个员工在风格、目标、需求和动机等方面的差异。 而优秀领导正好相反,他们是向外看的,他们看外部竞争,看未来,看不同的前进路径,他们关注宏观格局,寻找各种联系和空隙,然后在阻力最弱的地方出奇制胜,他们必定有远见卓识、善于战略思维和行动,如果表演得出色,这无疑是一个至关重要的角色。
优秀经理不是一些等着天降领导重任的小主管们,而优秀领导也不是一些见多识广的经理。经理与领导的核心活动是完全不同的。对一个人来讲,完全有这种可能:他是一位很出色的经理,却是一名很糟糕的领导。不过,对一个人来说,同样存在另一种可能:他当领导很出色却当不好经理。当然,也有少数才华出众的人,当领导或经理都能干得很出色。 如果混淆这两个角色,要求每个经理都成为领导,或者把“领导”简单定义为“经理”的高级形式,那么,至关重要的“催化剂”作用就会被低估、误解,继而无法发挥,如此,公司就会垮台。
2.文章内容:
软件团队中,所有人的工作被集成在一个软件产品中,互相依赖,产品功能受到用户赞扬或批评,都不能简单地完全对应于某一个人的工作。
我的疑惑:
既然软件产品是团队中每一个人共同劳动的成果,那么应当如何来正确衡量个人的绩效呢?
我的思考:
绩效衡量是指从质量和数量方面评估某种组织实体(例如:组织,过程,团队或个人)达到它们使命、目的、目标,行动步骤或达到希望标准的程度。在企业绩效管理中,绩效衡量扮演着一个举足轻重的角色,使用得当它可以成为大幅度提高组织绩效的助推器,使用不当则会变成组织变革和绩效提升的拦路虎。有效地使用绩效衡量方法可以对企业运营状况进行及时的反馈,根据这些反馈我们可以判断企业是否在向自己的组织目标迈进、员工是否需要培训、流程该如何优化重组等等。
看了书上的内容,我明白了单靠工作量、资历、效率、队友评估、犯错数量等指标来衡量一个人的工作绩效,那是远远不够的。经过上网查阅资料后,我了了解到企业管理绩效衡量指标有以下几类:
(1)战略管理评价:主要反映企业所制定战略规划的科学性,战略规划是否符合企业实际,员工对战略规划的认知程度,战略规划的保障措施及其执行力,以及战略规划的实施效果等方面的情况。
(2)发展创新评价:主要反映企业在经营管理创新、工艺革新、技术改造、新产品开发、品牌培育、市场拓展、专利申请及核心技术研发等方面的措施及成效。
(3)经营决策评价:主要反映企业在决策管理、决策程序、决策方法、决策执行、决策监督、责任追究等方面采取的措施及实施效果,重点反映企业是否存在重大经营决策失误。
(4)风险控制评价:主要反映企业在财务风险、市场风险、技术风险、管理风险、信用风险和道德风险等方面的管理与控制措施及效果,包括风险控制标准、风险评估程序、风险防范与化解措施等。
(5)基础管理评价:主要反映企业在制度建设、内部控制、重大事项管理、信息化建设、标准化管理等方面的情况,包括财务管理、对外投资、采购与销售、存货管理、质量管理、安全管理、法律事务等。
(6)人力资源评价:主要反映企业人才结构、人才培养、人才引进、人才储备、人事调配、员工绩效管理、分配与激励、企业文化建设、员工工作热情等方面的情况。
(7)行业影响评价:主要反映企业主营业务的市场占有率、对国民经济及区域经济的影响与带动力、主要产品的市场认可程度、是否具有核心竞争能力以及产业引导能力等方面的情况。
(8)社会贡献评价:主要反映企业在资源节约、环境保护、吸纳就业、工资福利、安全生产、上缴税收、商业诚信、和谐社会建设等方面的贡献程度和社会责任的履行情况。
所以,衡量一个人的工作绩效,应当从多方面来考虑,更何况,软件产品还是多人劳动的结果,这就更不能轻易马虎。所以,我认为,衡量一个人的工作绩效,应该综合以下方面来考虑:总体有效性、生产率、效率、利润、质量、事故、增长、旷工、人员调整、工作满意度、动机、士气、控制、冲突/融合、适应性/创新性、计划与目标设定、目标一致、组织目标内部化。
3.文章内容:
绝大部分工程师都在某一个企业工作,工程师的成长也和企业的兴衰有很大关系。企业兴旺,工程师也是与有荣焉,很多人觉得是自己的功劳,理所应当提薪升职;企业衰落,很多工程师未必觉得是自己的问题(我的代码很好的,都是经理、市场、老大的问题!);企业最后要裁员,很多人为了一些补偿和企业产生纠纷。
我的疑惑:
如何正确看待个人与企业的关系?个人应当对企业的成败负有怎样的责任?
我的思考:
企业的发展和员工个人成长是相辅相成的,也是一种相互依存的关系。没有企业的发展,就不会给员工提供好的发展环境,一个企业给我们提供了资源,提供了方针政策的方向,我们个人在企业方针政策的带领下发挥我们自己的能力。同时,企业要更好的发展,也离不开我们个人的发展,因为我们个人做得越好,企业也做得越强越大。
企业组织行为通常只是依据财务或经济术语来加以界定:赚钱、股值上涨、积累或增加财富、有效使用资源或提供商品和服务等。由于目的单一,所有非财务和非经济的东西都被看作是获得目的的手段。但是,在我看来,认识公司的一个更好的方式,就是把公司看作是一个具有多元目的的组织。当然,经济目的是公司的一个基本目的;然而,企业组织也应当有其社会目的和环境目的。关键问题在于,要认识到每个目的都具有天然的价值,以相互关联的方式与其他目的联系在一起。
责任是当代道德的一个关键概念,行为者的责任程度与其自由程度应该是一致的。责任涉及三个部分:责任主体,或者说由谁负责;责任内容,或者说负什么责;所要对之负责的权威,或者说对谁负责。不幸的是,人们想要拥有更多的自由,却不愿意承担更多的责任。但是,行为者的责任程度与其具有的自由程度应该是一致的,然而,自由与责任之间的这种基本联系,经常被人们忽略甚至拒斥,其实,自由仅仅是整个现象的否定方面,它的肯定方面是责任。自由事实上有堕为恣意妄为的危险,除非按照责任而生活。换句话说,自由空间愈大,责任也就愈大。不论是在公司还是在军队,高层领导比其下属都具有更大的自由空间,因此也要承担更大的责任,但这并不意味着下属就没有任何责任。
总之,个人与企业有着密切相关的联系,个人对企业的成败也负有一定的责任,个人应当与企业同甘共苦,共同进退。这不仅仅是一个道德的要求,同时,这也是一个职业的基本要求。