1 x& g7 \. f) T3 Z$ y
1.提醒自己还有多少内容需要学习 学习的第一步在于了解自己还有哪些不足之处。虽然这样的结论听起来非常直观,但经验丰富的程序员能够更为精确地判断填补不足需要投入的具体时间。很多计算科学毕业生会傲慢地认为“我什么都懂”,并希望把自己已经掌握的一切展示给新同事们。但事实上,“我知道自己在做什么”才是最重要的,这样的态度能够帮助大家更好地学习新知识。 2.不要执着于证明自己是对的 为了真正成为一名卓越——而不只是合格——的程序员,大家需要从实践中积累经验。不过需要注意的是,经验也有可能让我们一次又一次重复糟糕的行为并养成负面习惯。我们都遇到过拥有八年经验的老程序员……但有些人只不过是在每年重复自己的习惯,而且一重复就是八次。为了避免此类问题,大家应该审视自身并自问“我要如何做得更好?” 新手软件开发人员(以及老鸟们)都应该抱着欣赏的态度看待自己的代码。他们需要编写测试以证明自己的代码能够切实生效,而不仅仅是避免其出错。真正杰出的程序员实际上乐于接受自己的错误——因为他们知道,即使自己没有发现,用户们最终也会将其指出。 3. “代码能跑”并不是终极目标,而只是起点 是的,我们开发工作的第一步总是编写出符合质量规范要求的软件。普通程序员都能做好这项工作,但他们之所以普通,是因为达成这项目标后他们就开始转向其它任务。 需要强调的是,这种小成即安的心态就像是想让一张随拍成为一件艺术品。出色的程序员都很清楚,第一个迭代版本仅仅只是起步:它能够确切起效,那么恭喜各位!但这并不是终点,接下来我们要让它变得更好。 这一流程中的重要组成部分在于定义“更好”的确切含义。是否需要进一步提高其运行速度?易于编写说明文档?更具复用性?改进可靠性?具体答案取决于应用程序自身,不过这个流程应当被始终保持下去。 4. 三次编写成就卓越作品 合格的程序员编写出“能跑”的软件。卓越的程序员则编写出真正优秀的软件成果。而优秀的成果几乎不可能在首次编写时出现。这种杰作通常需要进行三次编写: 1.第一次,我们编写软件以证明解决方案可行性。其他人可能没有意识到这只能算是概念验证型方案,但我们自己应该清楚地了解这一点。 2.第二次,保证其确切起效。 3.第三次,保证一切完全符合预期。 不过着眼于最优秀的开发人员,这些步骤似乎表现得并不明显。他们做的每一项工作似乎都才华满载,但事实上,这类摇滚明星级别的开发者根本不会在第一与第二版本阶段展示自己的软件开发成果。淘汰代码并重新开始能够让我们的个人工作流程真正变得“更好”。 如果不出意外,那么“编写三次”的方式能够帮助大家了解如何找到最理想的解决途径。另外,这也能够防止我们陷入思维惯性。 5.阅读代码——阅读大量代码 大家可能希望我会在这里提点具体的建议,很明显最常见但也最有价值的建议就是提升编程技能。不过很多朋友也许还没有发现,阅读他人的代码其实非常重要。 在阅读他人的代码时,我们会了解到其他开发者是如何处理编程难题的。不过请别单纯从字面上理解这项提议,大家应当更多地将其视为一种教训以及挑战。为了更好地发挥其作用,我们需要回答以下几个问题: · 我会如何编写编写这部分代码?我们该如何以不同方式实现同样的效果,又是否准确理解了其他人的解决思路? · 我学到了什么?我该如何将这项技术应用到我过去已经编写的代码当中?(‘我从没想到要在这里使用递归下降……’) · 我该如何改进代码?如果存在合适的开源项目,而大家又想到了改善其质量的办法,请立刻着手进行! · 基于相关作者的风格进行代码编写。这种作法能够帮助大家准确把握其他编写者的设计思路,并借此提升自己的移情能力。 这些步骤需要以认真的态度逐步推进。编写自己的答案,具体形式可以是撰写个人日志、博文、代码审查报告或者在社区论坛上发布帖子。向朋友解释某个现实问题能够帮助我们整理出解决方案,将其写下并分享分析结论,这能让我们更好地理解自己如何以既定方式重现他人代码。这正是我之前提到的自省心态的一部分,使得各位能够冷静地判断自己的长处与短处。 警告:即使阅读了大量代码,大家仍然未必能够成为出色的程序员,就像是那样阅读过大量杰出文学作品但却自身水平依旧低下的作家。很多珍惜生命员会将开源项目或者其它软件视为“答案来源”,甚至倾向于直接复制/粘贴其中的代码以解决类似的问题。这么干只会让各位成为更为拙劣的程序员,因为我们这只是在盲目接受其他人的智慧,却未对其加以检验。(另外,这种免费午餐式的作法会导致我们意识不到新bug的引入。) 6.编写代码,而不仅仅满足于现有工作 着手推进个人编程项目有着诸多优势。首先,这能帮助大家学习现有工作所接触不到的工具与技术,并使大家在未来的职业发展中更具竞争力。无论大家是在为开源项目做贡献还是参加当地社区组织的无偿工作,编写更多代码都能够帮助我们积累起技术水平与自信心。(另外,大家的个人项目也能够向潜在雇主切实证明,各位一直保持学习状态且永不自满。) 出于兴趣编写代码的另一大优势在于迫使各位自己寻求答案。我们无法将最困难的部分留给其他人,那样我们往往会在尚未进行充分思考前就向技术高手求助。 额外提示: 大家最好不要选择那些自己已经非常熟悉的项目。经历失败非常重要!不过在实际工作中失败却非常要命,特别是在限定了严格的时间进度的前提下——这也是参与个人项目的重要理由所在。 7.尽可能以一对一方式同其他开发人员协作 这有助于让我们静下心来倾听他人意见。这可能意味着进行组队编程,或者参与编程马拉松,抑或是加入某个编程用户群组(例如VermontCoders Connection)。当为开源项目做贡献时,大家应当高度关注来自用户以及其他开发者的反馈意见,也许这些批评观点中包含着极有价值的共同点。 大家可能会找到一位值得信任、能够切实指导我们工作,甚至足以点拨我们完善职业规划的好伙伴。千万不要因为懒惰而错失这宝贵的机遇。 8.学习技术而非工具 编程语言、工具与方法总是在不断变化。有鉴于此,尽可能多地涉猎不同语言与框架就变得非常重要。大家应该将着眼于放在编程基础身上,因为基础知识永远不会改变; 换言之,更多重视结构而非编程。如果大家认为只有一种正确方式完成某项任务,那么不妨亲自进行实践。教条主义会损害我们学习新鲜事物的能力,并导致各位在适应变化时显得比较迟钝。 * B/ k X7 P) G/ [0 N* N
# L$ k1 V" J2 @- s9 c
|