让你变成优秀程序员的几个小习惯

做者Jeff Standen,有着21+年经验的软件开发者。

首先开发spike解决方案——这是我早期敏捷/极限编程所养成的习惯之一。spike解决方案是一次性原型,能够帮助你在投入大量时间和精力以前验证你是否走对路。html

区别就在于原型,由于你遵循这样一个规则,在你完成研究以后,你最终会扔掉“spike”代码。因此容许你偷工减料,迅速行动,由于它不会出如今产品或代码审查中。前端

此方法有助于迅速发现设计的哪些部位尚不明确,而没必要过早地尝试架构或设计决策。linux

致力于小而连贯代码块的版本控制——经过相似CVS/Subversion,每次提交都直接发送到服务器。作部分文件的提交并不简单。git

随着Git的出现,只提交较大文件的若干行代码变得很容易,而且能够在push到远程代码仓库以前先本地rebase/merge提交。web

有一次,我在工做于更大功能的时候,采用了小型增量提交,个人工做效率直线上升。这样作可以清空个人大脑以便于面对更重要的事情。算法

常常写代码——最近,我正工做于:一个基于Web的企业协做和自动化平台(PHP / MySQL),一个基于云的实时指标聚合器和使用循环哈希(Node.js/ Redis)的API,一个面向iOS app商店(Swift/ SpriteKit)的棋盘游戏,专门的基于URL的cronjob可替代基于web的SaaS服务(JAVA),等等。数据库

用过大量框架和语言有助于个人抽象和算法思惟。编程

我从工具,如Eclipse RCP、Tapestry和Hibernate中学到了不少伟大的经验教训,并用到个人PHP项目里。尤为是在2000年初,在有Java特征的企业生态系统用于PHP存在以前。我从Unity3d/C#学到了不少关于网络和面向消息的架构。vim

若是我只坚持单一平台和社区的话,就永远不会知道这些概念。后端

编写简单的代码——我之前习惯于写复杂的代码以做为对本身的挑战。而如今的挑战是要编写优雅且简单的代码——到一种每一个人都以为他们也能作到的地步(即便他们不能)。简单代码一般来自于若干次复杂代码的迭代。

引用Antoine de Saint Exupéry的话就是:“不是没有什么可添加,而是没有什么可消减的时候,才算是达到了完美。”

这也使得咱们在长时间休止以后返回项目,以及鼓励其余人参与进来变得容易多了。

最后优化——咱们很容易掉入试图比用户或计算机更聪明,而且预优化各类边缘状况的陷阱。关注帕累托法则(80%的效果来自于20%的工做)。写代码,运行代码,当必要的时候专一于最大的瓶颈。这也支持保持代码库的简单。

说“不要首先优化代码”并不意味着“编写粗糙的代码”。代码老是应该精益和优雅,没有必要多此一举,不要将一成天的时间用在挤压剩下的10%,但其实已经可以工做良好的一些东西上。不但工做效率会降低,并且还会引进更多复杂性,解决方案变得不那么可概括,等等。

着眼于“最重要的事情优先”——老是有一些项目领域比其余的更有趣或更具挑战性。工做于那些有趣的东西老是比工做于那些必要的东西更有诱惑。

在攻克重要部分时,将有趣部分做为一种调剂,也就是说,二者都作一点也是能够。

所以,光从这一点上说,将大的问题分解成小问题的理念是不言自明的。每一个人都懂。因此,我会经过计分若干“quick wins”来开启个人一天,这能让我更有冲劲和更专一(“quick wins”能够是任何东西,包括有趣又小型的挑战),而后我会首先冲向“最重要的事情”。

了解全栈——当我刚开始干这一行的时候,没有什么比等别人作完他们那部分东西,而后我才能继续我那部分工做更糟糕的了(设计师,后端人员,前端人员,数据库人员,服务器人员,等等)。

因而,当我2000年创办本身的软件开发公司的时候,我作了一个明智的决定,那就是涉猎全栈。我知道我不可能擅长全部东西,也不多是最后惟一对全部一切负责的人,但我想要作终端到终端的原型,由于我没有耐心看过程。

每当我须要的东西触碰到我不懂的领域时,我会研究它。因而乎,我学会了服务器管理,数据库管理,设计,前端/后端开发,云架构等。

经过了解其余领域是作什么的,我才能写出包含它们须要的代码。

固然,其中的一些要点彷佛并非所谓的“小习惯”,但我向你保证,它们是小变化历经20年时间致使的结果。重要的行为变化并无意义,更多的是关于我是如何频繁地练习这门技术(在过去10年时间中每一年大概4000-5000个小时)。

因此,个人作法更像是去回答这个问题:“什么样的小习惯会致使更糟糕的软件和低效的生产力?”,而后反过来。

 

做者Ed Prentice,软件工程师

时间是宝贵的,因此要尽量地节省时间。尽量自动化。一旦时间成为一种商品,那么你能够实现下一个伟大的创新。

使用功能强大的IDE(如vim),并将其配置能为你作尽量多的事情。力争单个命令Build/Test/Deploy/Run。

若是你发现本身常作某件事情,那么可让它们在一个按键下发生,或者一次点击下发生。或者更好的是,让它们自动发生。

了解键盘快捷键和UNIX命令行。几乎全部的IDE均可以让你运行复杂的编译命令,甚至任意的终端命令——不但强大,而且能够为你节省大量的时间。

提问题,而后提更多的问题。若是有什么你不明白的事情发生了,那就问为何。而后走开,研究替代方案,并提出来。一直问问题直到你能够详细地给下一个问为何的开发人员解释。我时常感到奇怪为何会有这么多开发人员不知道为何,仅仅是由于以为“它老是/曾是这样”。

经过提供更好的替代解决方案挑战现状——而且制定步骤实现。若是你的测试不完整,或天天/每周运行一次——那么成为本地的Continuous Integration大师——目的是为了有利于你的团队,并实现它。一旦你使用它而且它能够帮助你更好工做的话,那么让你的团队也使用它。

不要只是挑战别人,挑战本身。历来没有写过web应用程序?那么写一个。从未用过Python?用Python劫持无人飞行器。

拥有一些东西。创造一些东西。没有必是非要作技术项目,能够是一个事件,例如聚会或编程马拉松,也能够是一个游戏,一个网站,一个博客。

教一些东西。Java,公开演讲,写做,下棋,vim,网球。

成为一个杰出的人。拿到一个垃圾类/组件?修复好它。编写代码的正确途径。不在代码中走捷径。作出明智的决策,向你周围的人说明为何你要作这个决定的利弊。老是改善代码。制定不须要花费1小时的待办事项表?Just Do It。

浏览你熟悉的Stack Exchange的话题——例如你喜欢的语言。当你发现什么新的东西的时候,尽快末位淘汰相关知识。知道C语言?什么是分支预测?这篇文章会告诉你——你要作的就是学习。

浏览你不熟悉的Stack Exchange的话题——好好学习,每天向上。

学会沟通。书面文字,呈现展现,解决问题,小却激烈的小项目,大型团队,小型团队。

文档化你的全部过程。你能够回头查阅你为何作这些事情,以及依赖原先的解决方案去解决碰到的类似问题。这还有助于捕捉你可能会忘记的思惟过程和关键的信息片断。我常常经过日志来回顾前几天的工做。

在你写以前文档化你的代码。使用系统图,类层次结构,流程图表,以展现说明你的代码将如何工做。若是有人提出建议——是的,他们会提出来的——那么你能够进行修改,这比已经写好了代码再去修改要容易得多。这是另外一个我不多看到有人会作但却有着最负面影响的事情。

特定化。为新的东西制做图表,向你们展现。收集尽量多的细节。确保每一个人赞成这个图表。若是有人提出了建议,那就补充/添加更正到图表。保持图表更新。

知道潜意思的偏见和男性特权。了解你是哪一种MBTI和人格类型,而且更重要的是,要知道如何与其余性格类型更好地互动。了解情商。每一个人都是不同的,你须要知道如何与他们进行最有效和最有建设性的交互。

按期为团队作一些事情。带饼干。教魔术。培育一点文化,并鼓励其余人也这样作。赞美其余人的贡献。一支有凝聚力的团队是很难被击败的。

学习如何与人合做。我我的很是喜欢《The Pragmatic Programmer》的“stone snop”。

理解和使用别人的代码。若是你正在实现本身的XML解析器或或csv阅读器或git hook,那么你就是在从新发明轮子。

一旦你写了代码,而且它是有效的,经过测试的,那么回过头去整理一下吧。从新运行测试。再整理。每一个类都应该有单一的职责,每一个函数都应该只作一件事情。在大多数状况下,函数应该小于20行代码的长度。使用自文档的函数名和变量名。花时间整理你的代码之后将会10倍地回报给你和你的团队。

参与其中。承担责任。若是事情有不对的地方,那就解决它。若是最后期限临近了又想出了一个解决方案,那让其余人尽快知道。任何人均可以作到这一点,即便是最初级的开发人员。这要求对项目的蓝图,方向和截止期限有着大局观的认识——参与进来。保存好天天的工做内容!

和团队分享学到的经验教训(在适当的时候)。指出Java中finally块内部抛出异常的时候发生了什么?和你们一块儿分享。

相关文章
相关标签/搜索