程序员修炼之道的提示们(1)

1. 关心你的技艺. 没错, 开发软件是一个工程, 但是个人的技艺并不会就此埋没在其中

2. 思考你的工作. 设法理解你面临的每个问题的内在本质; 首先抓住事实, 而不是照搬别人的说法.

3. 提供各种选择. 不找蹩脚的借口. 要为自己的过错负责, 而不是找一个蹩脚的借口, 那无法改变事实, 不要说做不到, 而要说能够做什么来挽回.

4. 不要容忍破窗户. 低劣的设计, 错误的决策, 或是糟糕的代码, 如果没有足够的时间修理, 就用木板把它们钉起来--把出问题的代码放进注释, 或是显示 "未实现" 的消息, 或是用虚设的数据加以替代, 把情势保持在控制之下.

5. 做变化的催化剂. 有时你很清楚应该做什么, 甚至清楚应该怎样去做, 可是一旦是一群人来做这个事, 情况就麻烦了, 人人都有自己的小算盘, 而这就是你发挥作用的时候了, 自己先开始做, 然后表示如果增加...会更好, 带动整个群体.

6. 记住大图景. 又是因为想要追求一些细节而导致陷入了无尽的拖延, 在钻牛角尖中忘记自己的本意, 因此要时刻提醒自己, 这个项目的本源是什么.

7. 使质量成为需求问题. 开发软件时, 不仅要清楚用户要什么, 还要关注用户要的东西需要有多好. 无视质量而一味的增加新特性, 到后来不得不削减预算或是延迟工期可不是有素养的做法.

8. 定期为你的知识投资. 这是一个动荡的行业, 多样化的技能是你保持先进的秘诀, 你要做的是:
8.1. 每年至少学习一种新语言
8.2. 每季度阅读一本技术书籍
8.3. 也要阅读非技术书籍
8.4 实验不同的环境, 只在 windows 下工作, 就试试 Linux, 只用 IDE, 就试试使用 makefile 和 编辑器.
8.5 多参加论坛, 尤其是那些技术问答的论坛

9. 批判的思考你读到的和听到的. 小心一个陷阱, 就是 web 排名靠前的答案不一定就是好答案, 摆在显著位置的书不一定就是好书.

10. 怎么说和说什么同样重要.
说话前要了解你的听众:
  10.1.1 你想让他们学到什么?
  10.1.2 他们对你讲的什么感兴趣?
  10.1.3 他们多富有经验?
  10.1.4 他们想要多少细节?
  10.1.5 你想要谁拥有这些信息?

发电子邮件的注意事项:
  10.2.1 发送之前校对
  10.2.2 让格式保持简单, 考虑收邮件的人查看时的情况
  10.2.3 尽量使用纯文本, 而不是富文本
  10.2.4 如果是引用别人的文件, 一定要注明出处, 并在征文中引用, 而不是当做附件.
  10.2.5 不要冷嘲热讽, 除非你想让别人也攻击你.
  10.2.6 发送之前要检查收件人名单
  10.2.7 将电子邮件加以组织并存档

11. 代码的 DRY--Donnot Repeat Yourself
代码中的重复有四类:
  11.1 强加的重复. 似乎无法选择--环境似乎要求重复
  11.2 无意的重复 开发者就没意识到自己在重复
  11.3 无耐性的重复, 开发者的偷懒, 他们重复只是因为复制粘贴更简单.
  11.4 开发者之间重复. 团队之内的几个人重复了同样的信息
对于强加的重复:
人们常说, 好代码有许多注释, 人们也说, 糟糕的代码才需要许多注释, 没错, 人们就是如此多变, 那到底要不要注释? DRY 法则说, 高级说明才需要注释, 低级的知识可以直接的体现在代码中. 否则, 每一次的改变都意味着注释的改变 ,而不可信任的注释比没有注释的代码还要糟糕.

无意的重复

考察以下代码:

class Line
{
public:
    Point start;
    Point end;
    double length;
};

乍一看上去还是挺合理的, 线段都有长度和端点, 但是你真的觉得知道两点的坐标会计算不出线段长度吗? 所以应该是:

class Line
{
public:
    Point start;
    Point end;
    double length() {return start.DistanceTo(end);}
};

在开发过程中, 你可能因为性能的原因而违反 DRY 原则, 其解决方法是使影响局部化, 对 DRY 的违反保持在越小的范围越好. 如:

class Line
{
private:
    bool _changed;
    double _length;
    Point _start;
    Point _end;
public:
    void Start(Point p){_start = p; changed = true;}
    void End  (Point p){_end = p; changed = true;}
    void Start() const {return _start;}
    void End()   const {return _end;}
    double Length()
    {
        if(_changed)
        {
            length = _start.DistanceTo(_end);
            changed = false;
        }
        return _length;
    }
};

无耐性的重复
每个项目都有时间压力, 这可能就使你想要拷贝之前的代码并做出一些改动. 这并是不是一个坏习惯取决于你代码的重用性. 如果你的对自己的代码不够有信心, 那么就要慎重考虑了.

开发者之间的重复
解决这个问题的方法似乎应该是鼓励开发者之间进行主动的交流, 设置论坛让讨(si)论(bi)更加容易.

12. 让复用变得容易. 些易于使且易于复用的代码, 这样的代码在以后做项目时就比临时写出的代码更容易.

13. 正交: 消除无关事物之间的影响. 如果你设计的组件是高内聚的, 那么你将得到两个好处:
  13.1 提高生产率
    13.1.1 改动得以局部化, 所以开发时间和测试时间都会得以降低. 比编写单个的大模块代码相比, 编写多个相对较小 的, 自足的组件会更加容易
    12.1.2 促进复用: 如果你的组件具有明确而具体的, 良好定义的责任, 就可以用其最初实现者未曾想过的方式把他们与新的组件 组合起来
    12.1.3 如果是对正交的组件进行组合, 那么假定某个组件做 M 件事情, 另一个组件做 N 件事情, 那么结果就能做 M * N 件事情.

  12.2 降低风险
    12.2.1 有问题的代码区被隔离开来, 如果每个模块有毛病, 它不太可能把问题扩散到系统的其余部分, 替换也较为容 易.
    12.2.2 系统更加健壮: 对特定区域的每一个小改动其影响都将局限在该区域中.
    12.2.3 不会被特定的供应商, 产品或是平台绑在一起, 因为与这些第三方组件的接口都将被隔离在全部开发的较小部分中.  

  如下技术有助于维持正交性:
    1. 让你的代码解耦. 高内聚, 低耦合, 如果你想要改变对象的状态, 就让这个对象替你去做, 这样代码就会保持与其他代码间的隔离.
    2. 避免使用全局数据. 当你代码引用全局数据时, 就意味着与其他引用全局数据的代码绑在了一起所以要将代码尽量模块化.
    3. 避免些相似的函数. 你可能会遇到重复的结构, 这就需要设计模式来帮助你了.

时间: 2024-12-02 22:30:46

程序员修炼之道的提示们(1)的相关文章

《程序员修炼之道》之注重实效

十月这一个月以来,读了关于程序员修炼之道的第二站,注重实效,其中有一句话让我印象深刻. 系统中的每一个知识都必须具有单一,无歧义,权威的表示. 通过这本书,我了解到我们程序员对我们所创建的应用进行维护时,我们必须找到并改变事情的表示,在我们开发的规范,过程和程序中很容易重复和表达知识,然而,这样会很容易让我们的代码失效,并且通过dry我了解到了,它不仅仅存在于我们的程序,更存在于我们的生活,我们在编写代码的时候,不是所有代码都需要加注释的,也不是所有的代码都不加注释,而是择优,选择你认为的高级代

Java程序员修炼之道之预告片

从去年(2013)大概9月份开始,到上个月结束,我在深圳招聘一个Java程序员,要求会写Java的,英文能沟通的.我的要求很简单: 一个只实现了功能的函数,重构一下,让其可支持后期扩展,用多态的方式和注册表法(<代码大全2>里面提到了)重构就可以了 对该函数写单元测试,知道怎么写,知道使用Mock工具(Mockito. Jmock. EasyMock随便哪种都行),能正确的对测试方法进行组织 就是这么简单的要求,公司的HR MM陆陆续续给我找了几十个候选人,在北京的.在上海的.在印度的.在珠三

《程序员修炼之道》笔记(一)

这几天开始看<程序员修炼之道>,也许不少人看了书的标题,第一时间会觉得这是鸡汤一类的书.但至少以我自己的感受来看,这是很棒的书,现代人文主义不是提倡自我意识嘛,自己感觉好的就是好的.况且人家也是经过了时间和口碑的双重考验的,真心值得好好阅读. 作者在再版的序中写道: 写完<程序员修炼之道>至今已有十年.在这十年中,软件产业发生了翻天覆地的变化.--从表面上看,软件世界似乎陷入了疯狂的状态.但如果你深入繁杂表象的背后,会发现变化其实并不大.1999年的那些通用开发原则,在2009年同

程序员修炼之道_从小工到专家_读书分享

最近央视给我们连续分享了<大国工匠>,很是羡慕,嫉妒,恨.要知道我们程序员也是一名工匠,哈哈.最近用两天多的时间读了一本和工匠有关的书籍<程序员修炼之道-从小工到专家>这本书,现在分享给大家,因本人能力有限,拙劣之处请包涵. 从这本书的名字说起,这本书现在的名字体现不出来书中的主题内容,书的原名为<The Pragmatic Programmer>翻译为<注重实效的程序员>,看到这个题目想必大家对书的主题有个大概印象.这本书在编码问题,软件架构和设计,项目管

Java程序员修炼之道 之 Logging(1/3) - Logback 配置

写在前面的话: 作为<Java程序员修炼之道>博文的第一个主题Logging,我计划中按照如下三篇来写: Logback的简单介绍和配置 在Java代码中如何使用SLF4J来写日志以及写日志的要点 作为一个程序员,在日常工作中如何分析和挖掘Log. PS:默认生成的目录不对,仔细检查过了,我的h1,h2,h3,h4用的都没错. 1. 缘起 写代码中的日志是一个除了用代码实现功能之外最基础最基础的一个技能了,是一个必须掌握的技能.但是目前为止,关于如何日志的文章和书籍还是不多. 1.1 写日志的

程序员修炼之道阅读笔记之二

在<程序员修炼之道>一书中,Dave和Andy将告诉我们怎样以一种我们能够遵循的方式编程.他们何以能这样聪明?他们不也是和其他程序员一样,专注于各种细节而已吗?答案是他们在做某件事情时,会把注意力投注在他们在做的事情上——然后他们会试着把它做得更好. 设想你在参加一个会议.或许你在想,这个会议没完没了,你还不如去写程序.而Dave和Andy会想,他们为什么在开会,他们想知道是否可以通过另外的方式取代会议,并决定是否可使某样事情自动化,以使开会的工作推后.然后他们就会这样去做. 这就是Dave和

《程序员修炼之道》读书笔记

<程序员修炼之道>读书笔记 提供多种选择,不要找接口 出了问题后,要提出各种解决方案的选择,而不是找借口:不要说事情做不到,要说明接下来做什么来挽回局面: 不要容忍破窗户 我们看到过整洁.运行良好的系统,一旦窗户开始破裂,就相当迅速的恶化: 不要留着破窗户不修:发现一个bug就修复一个,如果没有足够的时间进行恰当的修理,就用木板先订起来:或许你可以先把代码注释起来,或是显示"未实现"的消息:采取某种行动防止进一步的损坏,并说明情形在你的控制之下: 投资知识资产 我们喜欢把程

Java程序员修炼之道 之 Logging(1/3) - Logback 配置(转)

转自紫风乱写:http://www.blogjava.net/justfly/archive/2014/08/10/416768.html,建议大家去原处学习 写在前面的话: 作为<Java程序员修炼之道>博文的第一个主题Logging,我计划中按照如下三篇来写: Logback的简单介绍和配置 在Java代码中如何使用SLF4J来写日志以及写日志的要点 作为一个程序员,在日常工作中如何分析和挖掘Log. 1. 缘起 写代码中的日志是一个除了用代码实现功能之外最基础最基础的一个技能了,是一个必

《程序员修炼之道》读书笔记②

概述 花了几天时间看完了程序员修炼之道,有很多感悟,记录于此,供自己开发时参考,相信对其他人也有用. 值得一提的是,这本书写的非常好,很多大牛在走了很多弯路之后再读这本书都很感慨没有早些读. <程序员修炼之道>读书笔记① 弯曲,或折断 解耦与得墨忒耳法则 1.函数的得墨忒耳法则规定,某个对象的任何方法都应该只调用属于以下情形的方法:它自身:传入该方法的任何参数:它创建的任何对象:任何直接持有的组件对象. 2.委托服从得墨忒耳法则,从而减少了耦合. 元程序设计 1.元数据是关于数据的数据:要用元