资深软件开发人员分享他们在多年从业当中学习到的,关于如何成功推进专业编程工作的种种真知灼见。
如果大家属于刚刚涉足专业软件开发世界的新人,各位可能会以为自己完全能够凭借着多年来在计算机科学及编程领域获得的教育及/或培训顺利玩转一切。不过在这一行业浸淫多年的老鸟开发者则希望提醒大家,单凭科班灌输的知识还远远不够,我们还需要从实践当中了解到更多极具指导性的宝贵财富。
为了掌握这些真知灼见,我与多位经验丰富的资深开发人员进行了沟通——他们至少在软件技术领域拥有十年乃至更长的从业经历(有几位甚至已经从业数十年)。提到他们希望自己在刚刚毕业并初次涉足编程行业时能够了解到哪些箴言,他们都有着自己的答案。无论大家是刚步出校门的应届生还是已经在编程领域有些心得的从业者,下面这些来自老鸟们的建议相信都能在未来的发展道路上帮助各位找到正确方向。
当然,软件开发工作当中的重要组成部分之一正是编程语言本身。不过正如各位前辈所分享的心得所言,开发人员同样需要了解堆栈之下所发生的一切。
“很多语言会以抽象形式将系统级别的运作机制剥离出去,而这种抽象性确实非常重要,因为它允许开发人员在大部分时间内保持更高的生产效率。”Acquia公司技术支持工程师Pete Bull指出。“不过当大家遇到障碍或者说非常严重的错误时,则需要对引擎盖之下运作的一切拥有相当程度的理解。我们需要有能力调试某项进程,并查看系统调用以真正掌握特定代码片段与系统其余部分之间的交互活动,”他在采访邮件当中写道。
同样的,Platform.sh公司客户满意度副总裁Robert Douglass告诉我们,“当我刚开始上手编程工作时,计算机本身还蕴含着大量我无法理解甚至闻所未闻的奥秘。文件系统、网络以及数据如何驻留在内存当中,这就是三个典型的实例。这部分知识的缺失,意味着我根本无法真正从编程角度出发了解开发项目中的某些目标。”
作为一位开发人员,大家很可能会把大量时间用在使用IDE或者代码编辑器身上。不过需要提醒大家,如果了解如何在命令行上实现同样的操作,那么各位的日常生活绝对会变得更加轻松。
“有时候,大家会发现自己只能使用一台配置一切就绪,但可用工具非常有限的设备,”一位已经拥有二十年从业经历的资深程序员告诉我们。“要像熟悉呼吸那样熟练掌握shell,包括find、comm、diff、vi/vm、sed以及awk等等。有时候利用正确的合作行编写小型脚本来查找必须马上进行修改的文件将非常重要——因为生产体系很可能已经受到了影响、而造成URL指向未知文件的那位技术人员还在斐济度假呢。”
作为一位开发者,Bull最初使用的是微软工具,但随后逐步转移到了Linux阵营。他表示“我已经学习到大量与命令行相关的专业知识,并意识到Linux系统之上提供的这些功能的重要地位。现在我能够轻松地重新调用几年前自己编写完成的代码,或者拿出几天或者几周时间对grep + awk作出进一步改进。”
要想显著节约宝贵时间,非常重要的一点就是利用相关工具追踪各类bug。Novartis公司生物信息学开发人员Dave Varon对于调试器的重要意义作出了强调,并解释了其如何帮助我们获得远超过初始学习成本的收益。“学习使用调试器,快快快!”他在采访当中指出。“拿出一、两天时间好好钻研配置一番。在此之后,如果发现结果与预期不符,那么马上调试:设置断点、贯穿代码,特别是第三方代码。这不仅能够帮助我们大大降低问题出现机率,同时也能够让大家在其间学习到很多原本只能通过阅读他人代码掌握的知识。”
一部分开发人员认为单元测试——具体来讲,就是编写测试以验证小型代码单元是否起到了其应有的作用——非常关键。来自Strategic Power Systems公司的数据库开发人员Richard Handloff就是其中之一。“我认为我能给新人们提供的最好建议,就是学习如何编写出优秀的测试机制,并在项目开发初期就制定出一套可行的测试方案,”他在采访邮件当中写道。
时至今日,每位从业者都清楚地意识到技术正在快速发展转变。这种现象不仅影响着我们心爱的客户的实际体验,同时也改变着底层系统、语言乃至程序员们日常工作所使用的各类工具。
Milestone Made公司创始人兼移动开发者Adam Wulf建议称,新晋程序员们应当准备好——而且抢先一步——应对技术变革。“就目前来讲,我认为大家应该以四年为周期就学习全新技术堆栈作好规划,”他表示。“良好的基础知识当然能够始终发挥作用,不过我们每天所使用的工具乃至技术方案每过四年就会发生颠覆性的变更。”
“项目不应再利用单一框架以单一语言编写而成,”一位不愿透露姓名的开发者建议道。“大家千万不要在某个项目当中只使用一种开发方式,因此请尽快适应在不同项目之间进行语言/技术转换的实际需求,”他在采访邮件当中写道。
尽管常规概念下的程序员都会戴着耳机在自己的小世界里埋头工作,但不可否认的是,我们仍然需要同他人并肩协作。Sinclair Digital Ventures公司CTO Ben Miller着重强调了作为团队成员角色工作对于实现职业生涯成功的重要意义。“大型项目往往是由众多活动组件构建而成,如果我们无法顺利完成协作,那么组件的合并将成为一项不可能实现的任务。”他在采访邮件当中指出。“在尝试对某种算法进行优化之前,请先与团队进行沟通并确保任何能够帮助团队成员减轻工作压力的任务分配规划都已经部署到位。编程是一项团队竞技项目,千万别忽视了这一点!”
Varon还着重强调了人际交往能力的重要性,表示“如果大家无法自行完成API或者调试的审查工作,请借力于他人。我们自认为编写出了一段堪称杰作的代码,并不意味着它就一定出色或者没有进一步提升的空间。跟在大学里一样,同处一室的其他同伴也面临着同样的问题,而且每个人都有可能找到了解决问题的最佳答案。与同事们建立起融洽的合作关系,有时候甚至单纯向对方描述问题就足以帮助我们找到解决灵感。”
另一位不愿透露姓名的受方者也表达了类似的想法,即成为团队中一员对于顺利完成任务所起到的积极作用。“即使当前的工作比较繁重,我们也应当尽可能帮助其他成员解决各类难题,这将让大家的职业生涯走得更加顺畅,”他表示。不过在这种情况下,他也提醒大家“但请注意,要保证有理有节的帮助强度,否则我们很可能身陷其中而耽误了自己的份内职责。”
Miller在这里提出了一项有趣的建议,而且乍看起来似乎难以理解。他在采访中告诉我,“在工作之外编写代码更易于实现职业生涯提升。找到最简单的问题解决办法并对代码进行免费的弹性设置与维护,那么客户自然会提供更多工作供我们完成。他们甚至会邀请我们以教师的身份指导其内部开发人员,”他解释道。“简而言之,过分担心当下这份工作是否稳定反而会阻碍职业生涯的健康发展。”
原文标题:7 things every new programmer should know