读《程序员修炼之道:从小工到专家 》马维达 译
The Pragmatic Programmer:From Journeyman to Master

《The Pragmatic Programmer》我觉得强调了一个少有的观点,注重实效,对于追求理想主义,自由主义的程序员来说这是很少见的,但读完之后发现它的确是程序员该有的精神。


什么是实效?

“
这正是注重实效(pragmatism)登场的地方。你不应该局限于任何特定的技术,而是应该拥有足够广博的背景和经验基础,
以让你能在特定情况下选择好的解决方案。你的背景源自对计算机科学的基本原理的理解,而你的经验来自广泛的实际项目。
理论与实践的结合使你强大起来。
”

来自作者序言


注重实效的程序员的特征
“
如果你是一个注重实效的程序员,你就会具有下列特征中的许多特征:

	早期的采纳者/快速的改编者。你具有技术和技巧上的直觉,你喜爱试验各种事物。给你一样新东西,你很快就能把握
	它,并把它与你的知识的其余部分结合在一起。你的自信出自经验。

	好奇。你喜欢提问。那很漂亮——你是怎么做的?你用那个库时有问题吗?我听说的这个BeOS是什么?符号链接是怎样
	实现的?你是收集小知识的林鼠(pack rat),每一条小知识都可能会影响今后几年里的某项决策。

	批判的思考者。你不会不首先抓住事实而照搬别人的说法。当同事说“因为就该那么做”或者供应商允诺为你的全部问
	题提供解决方案时,你就会嗅到挑战的气息。

	有现实感。你会设法理解你面临的每个问题的内在本质。这样的现实主义给了你良好的感知能力:事情有多困难,需要
	多长时间?让你自己了解某个过程会有困难,或是要用一点时间才能完成,能够给予你坚持不懈的毅力。

	多才多艺。你尽力熟悉广泛的技术和环境,并且努力工作,以与各种新发展并肩前行。尽管你现在的工作也许只要求你
	成为某方面的专才,你却总是能够转向新的领域和新的挑战。

我们把最基本的特征留到了最后。所有注重实效的程序员都具有这些特征。它们基本得足以用提示的方式来陈述:
 
	提示1
 
	Care About Your Craft
	关心你的技艺

   我们觉得,除非你在乎能否漂亮地开发出软件,否则其他事情都是没有意义的。

	提示2
 
	Think! About Your Work
	思考!你的工作
”

来自作者序言

我今年以来,几乎每写一个项目,都会把它放在GitHub上,一则是让别人看见,更重要的是它会刺激我时时去更新自己代码,因为经常会有issue,使用的技术在不断更新也会促使自己更新,并且自己东西放在GitHub会经常晃悠在我面前不得不去更新,这是我所期望看到的状态。持续也是注重实效程序员应该做的,持续地做一些小的改进是你取得长足进步的主要原因之一。

该书的作者Andrew Hunt 和David Thomas说,注重实效能让成为一个更为有效、更为多产的程序员。


知识

知识一直在变,知识没有边界,需要不断的学习。作者给我们设定一些目标。

“
关于何时以及增加什么到你的知识资产中,现在你已经拥有了一些指导方针,那么什么是获得智力资本、从而为你的资产
提供资金的最佳方式呢?这里有一些建议。
 
	每年至少学习一种新语言。不同语言以不同方式解决相同的问题。通过学习若干不同的方法,可以帮助你拓宽你的思
	维,并避免墨守成规。此外,现在学习许多语言已容易了许多,感谢可从网上自由获取的软件财富(参见267页)。
       
	每季度阅读一本技术书籍。书店里摆满了许多书籍,讨论与你当前的项目有关的有趣话题。一旦你养成习惯,就一个
	月读一本书。在你掌握了你正在使用的技术之后,扩宽范围,阅读一些与你的项目无关的书籍。
       
	也要阅读非技术书籍。记住计算机是由人——你在设法满足其需要的人——使用的,这十分重要。不要忘了等式中人这一
	边。
       
	上课。在本地的学院或大学、或是将要来临的下一次会展上寻找有趣的课程。
       
	参加本地用户组织。不要只是去听讲,而要主动参与。与世隔绝对你的职业生涯来说可能是致命的;打听一下你们公司
	以外的人都在做什么。
       
	试验不同的环境。如果你只在Windows上工作,就在家玩一玩Unix(可自由获取的Linux就正好)。如果你只用过makefile
	和编辑器,就试一试IDE,反之亦然。
       
	跟上潮流。订阅商务杂志和其他期刊(参见262页的推荐刊物)。选择所涵盖的技术与你当前的项目不同的刊物。
       
	上网。想要了解某种新语言或其他技术的各种特性?要了解其他人的相关经验,了解他们使用的特定行话,等等,新闻
	组是一种很好的方式。上网冲浪,查找论文、商业站点,以及其他任何你可以找到的信息来源。
 
持续投入十分重要。一旦你熟悉了某种新语言或新技术,继续前进。学习另一种。
    
是否在某个项目中使用这些技术,或者是否把它们放入你的简历,这并不重要。学习的过程将扩展你的思维,使你向着新的
可能性和新的做事方式拓展。思想的“异花授粉”(cross-pollination)十分重要;设法把你学到的东西应用到你当前的
项目中。即使你的项目没有使用该技术,你或许也能借鉴一些想法。例如,熟悉了面向对象,你就会用不同的方式编写纯C程序。

”

来自 5你的知识资产

搜索引擎搜到的第一个页面并不意味事最佳选择,书店里最显著的那本书不一定是本好书,所以作者强调在获取知识时一个人应该保持一种批判性思维,批判地分析你读到和听到的,不要被供应商、媒体炒作、或教条左右。要依照你自己的看法和你的项目的情况去对信息进行分析。


有人说架构师的工作就是解耦,我想这在一定程度上是正确的,生活不会停步不前,我们需要尽一切努力编写尽可能宽松灵活的代码,要不然你的代码你的作品将马上过时。创建灵活代码的一个关键概念就是解除模型(model)和视图(view)的耦合,我想说MVC(Model-View-Controller)是一个很伟大的发明。


有一个概念,不要靠巧合编程。

“
假定Fred接受了一项编程任务。他敲入一些代码,进行试验。代码好像能工作。他又敲入一些代码,进行试验,代码好像还能工
作。在进行了几周这样的编码之后,程序突然停止了工作,Fred花了数小时设法修正它,却仍然不知道原因何在。他可能会花上
大量时间四处检查这段代码,却仍然无法修正它。不管他做什么,代码好像就是不能正确工作。

Fred不知道代码为什么失败,因为他一开始就不知道它为什么能工作。

”

来自 31靠巧合编程


程序员就像一个工匠,需要用到各种工具,工具就是手的延伸。君子性非异也,善假于物也。这是作者强调的观点。

我仅仅说一下我有限的工具。

在所有的工具中,编辑器是最像手的,我经历过Word,印象笔记,Xcode,Atom,比较了emacs,vim等,最终选用了sublime text,word太复杂,印象笔记在我看来经过网络的东西都是不安全的,xcode根本不是编辑器,atom根sublime最像,但是太慢了,emacs,vim对于我来说不会用,最终选用了利于工程管理,简单,扩展性强的sublime text。

Markdown同样是一个好的工具。

homebrew则是mac平台的强大的包管理工具,安装软件的神器。

翻墙工具是必备的,一直用红杏。

Git的工具,SourceTree。

Xcode ,主力Mac平台IDE。

最后的推荐只能说是狗尾续貂,希望你成为更好的程序员。

转载请附原文链接https://github.com/coderyi/blog/blob/master/articles/2015/0820_pragmatic_programmer.md